Skip to content
GitLab
Projects
Groups
Snippets
/
Help
Help
Support
Community forum
Keyboard shortcuts
?
Submit feedback
Contribute to GitLab
Sign in
Toggle navigation
Menu
Open sidebar
Philip Trettner
polymesh
Commits
fba09a7e
Commit
fba09a7e
authored
Jan 25, 2021
by
Philip Trettner
Browse files
Merge branch 'jn/develop' into 'develop'
Fix several bugs with the STL reader See merge request
!30
parents
5719ed18
1e6aa0f1
Changes
1
Hide whitespace changes
Inline
Side-by-side
src/polymesh/formats/stl.cc
View file @
fba09a7e
...
...
@@ -70,7 +70,17 @@ bool read_stl(const std::string& filename, Mesh& mesh, vertex_attribute<std::arr
if
(
!
file
.
good
())
return
false
;
return
read_stl
(
file
,
mesh
,
position
,
normals
);
if
(
is_ascii_stl
(
file
))
{
return
read_stl_ascii
(
file
,
mesh
,
position
,
normals
);
}
else
{
// Windows interprets binary files differently from ascii which messes with the parsing.
// Therefore we create a new stream in binary mode.
file
=
std
::
ifstream
(
filename
,
std
::
ios
::
binary
);
return
read_stl_binary
(
file
,
mesh
,
position
,
normals
);
}
}
template
<
class
ScalarT
>
...
...
@@ -99,9 +109,10 @@ bool read_stl_binary(std::istream& input, Mesh& mesh, vertex_attribute<std::arra
// }
uint32_t
n_triangles
;
input
.
read
(
(
char
*
)
&
n_triangles
,
sizeof
(
n_triangles
));
input
.
read
(
reinterpret_cast
<
char
*
>
(
&
n_triangles
)
,
sizeof
(
n_triangles
));
size_t
fs_expect
=
80
+
sizeof
(
n_triangles
)
+
n_triangles
*
(
sizeof
(
std
::
array
<
ScalarT
,
3
>
)
*
4
+
sizeof
(
uint16_t
));
// note: binary stl always stores 32bit floats
size_t
fs_expect
=
80
+
sizeof
(
n_triangles
)
+
n_triangles
*
(
sizeof
(
std
::
array
<
float
,
3
>
)
*
4
+
sizeof
(
uint16_t
));
if
(
fs_expect
!=
fs_real
)
{
std
::
cerr
<<
"Expected file size mismatch: "
<<
fs_expect
<<
" vs "
<<
fs_real
<<
" bytes (file corrupt or wrong format?)"
<<
std
::
endl
;
...
...
@@ -125,12 +136,25 @@ bool read_stl_binary(std::istream& input, Mesh& mesh, vertex_attribute<std::arra
auto
v2
=
mesh
.
vertices
().
add
();
auto
f
=
mesh
.
faces
().
add
(
v0
,
v1
,
v2
);
input
.
read
((
char
*
)
&
f
[
normals
],
sizeof
(
std
::
array
<
ScalarT
,
3
>
));
input
.
read
((
char
*
)
&
position
[
v0
],
sizeof
(
std
::
array
<
ScalarT
,
3
>
));
input
.
read
((
char
*
)
&
position
[
v1
],
sizeof
(
std
::
array
<
ScalarT
,
3
>
));
input
.
read
((
char
*
)
&
position
[
v2
],
sizeof
(
std
::
array
<
ScalarT
,
3
>
));
std
::
array
<
float
,
3
>
n
;
input
.
read
(
reinterpret_cast
<
char
*>
(
&
n
),
sizeof
(
n
));
if
(
normals
)
f
[
normals
]
=
{
n
[
0
],
n
[
1
],
n
[
2
]};
std
::
array
<
float
,
3
>
p0
;
std
::
array
<
float
,
3
>
p1
;
std
::
array
<
float
,
3
>
p2
;
input
.
read
(
reinterpret_cast
<
char
*>
(
&
p0
),
sizeof
(
p0
));
input
.
read
(
reinterpret_cast
<
char
*>
(
&
p1
),
sizeof
(
p1
));
input
.
read
(
reinterpret_cast
<
char
*>
(
&
p2
),
sizeof
(
p2
));
// convert float to ScalarT
position
[
v0
]
=
{
ScalarT
(
p0
[
0
]),
ScalarT
(
p0
[
1
]),
ScalarT
(
p0
[
2
])};
position
[
v1
]
=
{
ScalarT
(
p1
[
0
]),
ScalarT
(
p1
[
1
]),
ScalarT
(
p1
[
2
])};
position
[
v2
]
=
{
ScalarT
(
p2
[
0
]),
ScalarT
(
p2
[
1
]),
ScalarT
(
p2
[
2
])};
uint16_t
attr_cnt
;
input
.
read
(
(
char
*
)
&
attr_cnt
,
sizeof
(
attr_cnt
));
input
.
read
(
reinterpret_cast
<
char
*
>
(
&
attr_cnt
)
,
sizeof
(
attr_cnt
));
}
return
true
;
...
...
Write
Preview
Supports
Markdown
0%
Try again
or
attach a new file
.
Cancel
You are about to add
0
people
to the discussion. Proceed with caution.
Finish editing this message first!
Cancel
Please
register
or
sign in
to comment