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
OpenMesh
OpenMesh
Commits
781063a3
Commit
781063a3
authored
Jan 05, 2016
by
Martin Schultz
Browse files
* added texCoord3d functions to objloader
* added unittest for texcoords3d * added texcoord3d support to baseimporter
parent
011fdc97
Pipeline
#677
passed with stage
Changes
5
Pipelines
1
Hide whitespace changes
Inline
Side-by-side
src/OpenMesh/Core/IO/importer/BaseImporter.hh
View file @
781063a3
...
...
@@ -106,6 +106,9 @@ public:
// add texture coordinates per face, _vh references the first texcoord
virtual
void
add_face_texcoords
(
FaceHandle
_fh
,
VertexHandle
_vh
,
const
std
::
vector
<
Vec2f
>&
_face_texcoords
)
=
0
;
// add texture 3d coordinates per face, _vh references the first texcoord
virtual
void
add_face_texcoords
(
FaceHandle
_fh
,
VertexHandle
_vh
,
const
std
::
vector
<
Vec3f
>&
_face_texcoords
)
=
0
;
// Set the texture index for a face
virtual
void
set_face_texindex
(
FaceHandle
_fh
,
int
_texId
)
=
0
;
...
...
@@ -133,6 +136,12 @@ public:
// set vertex texture coordinate
virtual
void
set_texcoord
(
HalfedgeHandle
_heh
,
const
Vec2f
&
_texcoord
)
=
0
;
// set 3d vertex texture coordinate
virtual
void
set_texcoord
(
VertexHandle
_vh
,
const
Vec3f
&
_texcoord
)
=
0
;
// set 3d vertex texture coordinate
virtual
void
set_texcoord
(
HalfedgeHandle
_heh
,
const
Vec3f
&
_texcoord
)
=
0
;
// set edge color
virtual
void
set_color
(
EdgeHandle
_eh
,
const
Vec3uc
&
_color
)
=
0
;
...
...
src/OpenMesh/Core/IO/importer/ImporterT.hh
View file @
781063a3
...
...
@@ -90,6 +90,7 @@ public:
typedef
typename
Mesh
::
Normal
Normal
;
typedef
typename
Mesh
::
Color
Color
;
typedef
typename
Mesh
::
TexCoord2D
TexCoord2D
;
typedef
typename
Mesh
::
TexCoord3D
TexCoord3D
;
typedef
std
::
vector
<
VertexHandle
>
VHandles
;
...
...
@@ -217,6 +218,19 @@ public:
mesh_
.
set_texcoord2D
(
_heh
,
vector_cast
<
TexCoord2D
>
(
_texcoord
));
}
virtual
void
set_texcoord
(
VertexHandle
_vh
,
const
Vec3f
&
_texcoord
)
{
if
(
mesh_
.
has_vertex_texcoords3D
())
mesh_
.
set_texcoord3D
(
_vh
,
vector_cast
<
TexCoord3D
>
(
_texcoord
));
}
virtual
void
set_texcoord
(
HalfedgeHandle
_heh
,
const
Vec3f
&
_texcoord
)
{
if
(
mesh_
.
has_halfedge_texcoords3D
())
mesh_
.
set_texcoord3D
(
_heh
,
vector_cast
<
TexCoord3D
>
(
_texcoord
));
}
// edge attributes
virtual
void
set_color
(
EdgeHandle
_eh
,
const
Vec4uc
&
_color
)
...
...
@@ -292,6 +306,23 @@ public:
}
}
virtual
void
add_face_texcoords
(
FaceHandle
_fh
,
VertexHandle
_vh
,
const
std
::
vector
<
Vec3f
>&
_face_texcoords
)
{
// get first halfedge handle
HalfedgeHandle
cur_heh
=
mesh_
.
halfedge_handle
(
_fh
);
HalfedgeHandle
end_heh
=
mesh_
.
prev_halfedge_handle
(
cur_heh
);
// find start heh
while
(
mesh_
.
to_vertex_handle
(
cur_heh
)
!=
_vh
&&
cur_heh
!=
end_heh
)
cur_heh
=
mesh_
.
next_halfedge_handle
(
cur_heh
);
for
(
unsigned
int
i
=
0
;
i
<
_face_texcoords
.
size
();
++
i
)
{
set_texcoord
(
cur_heh
,
_face_texcoords
[
i
]);
cur_heh
=
mesh_
.
next_halfedge_handle
(
cur_heh
);
}
}
virtual
void
set_face_texindex
(
FaceHandle
_fh
,
int
_texId
)
{
if
(
mesh_
.
has_face_texture_index
()
)
{
mesh_
.
set_texture_index
(
_fh
,
_texId
);
...
...
src/OpenMesh/Core/IO/reader/OBJReader.cc
View file @
781063a3
...
...
@@ -290,13 +290,13 @@ read(std::istream& _in, BaseImporter& _bi, Options& _opt)
std
::
string
line
;
std
::
string
keyWrd
;
float
x
,
y
,
z
,
u
,
v
;
float
x
,
y
,
z
,
u
,
v
,
w
;
float
r
,
g
,
b
;
BaseImporter
::
VHandles
vhandles
;
std
::
vector
<
Vec3f
>
normals
;
std
::
vector
<
Vec3f
>
colors
;
std
::
vector
<
Vec
2
f
>
texcoords
;
std
::
vector
<
Vec2f
>
face_texcoords
;
std
::
vector
<
Vec
3
f
>
texcoords
3d
,
face_texcoords3d
;
std
::
vector
<
Vec2f
>
texcoords
,
face_texcoords
;
std
::
vector
<
VertexHandle
>
vertexHandles
;
std
::
string
matname
;
...
...
@@ -406,7 +406,6 @@ read(std::istream& _in, BaseImporter& _bi, Options& _opt)
stream
>>
u
;
stream
>>
v
;
if
(
!
stream
.
fail
()
){
if
(
userOptions
.
vertex_has_texcoord
()
||
userOptions
.
face_has_texcoord
()
)
{
texcoords
.
push_back
(
OpenMesh
::
Vec2f
(
u
,
v
));
...
...
@@ -415,9 +414,20 @@ read(std::istream& _in, BaseImporter& _bi, Options& _opt)
fileOptions
+=
Options
::
FaceTexCoord
;
}
}
else
{
//try to read the w component as it is optional
stream
>>
w
;
if
(
!
stream
.
fail
()
){
if
(
userOptions
.
vertex_has_texcoord
()
||
userOptions
.
face_has_texcoord
()
)
{
texcoords3d
.
push_back
(
OpenMesh
::
Vec3f
(
u
,
v
,
w
));
omerr
()
<<
"Only single 2D texture coordinate per vertex"
// Can be used for both!
fileOptions
+=
Options
::
VertexTexCoord
;
fileOptions
+=
Options
::
FaceTexCoord
;
}
}
}
else
{
omerr
()
<<
"Only single 2D or 3D texture coordinate per vertex"
<<
"allowed!"
<<
std
::
endl
;
return
false
;
}
...
...
@@ -553,6 +563,8 @@ read(std::istream& _in, BaseImporter& _bi, Options& _opt)
if
(
!
texcoords
.
empty
()
&&
(
unsigned
int
)
(
value
-
1
)
<
texcoords
.
size
())
{
// Obj counts from 1 and not zero .. array counts from zero therefore -1
_bi
.
set_texcoord
(
vhandles
.
back
(),
texcoords
[
value
-
1
]);
if
(
!
texcoords3d
.
empty
()
&&
(
unsigned
int
)
(
value
-
1
)
<
texcoords3d
.
size
())
_bi
.
set_texcoord
(
vhandles
.
back
(),
texcoords3d
[
value
-
1
]);
}
else
{
omerr
()
<<
"Error setting Texture coordinates"
<<
std
::
endl
;
}
...
...
@@ -563,6 +575,8 @@ read(std::istream& _in, BaseImporter& _bi, Options& _opt)
if
(
!
texcoords
.
empty
()
&&
(
unsigned
int
)
(
value
-
1
)
<
texcoords
.
size
())
{
face_texcoords
.
push_back
(
texcoords
[
value
-
1
]
);
if
(
!
texcoords3d
.
empty
()
&&
(
unsigned
int
)
(
value
-
1
)
<
texcoords3d
.
size
())
face_texcoords3d
.
push_back
(
texcoords3d
[
value
-
1
]
);
}
else
{
omerr
()
<<
"Error setting Texture coordinates"
<<
std
::
endl
;
}
...
...
@@ -609,7 +623,10 @@ read(std::istream& _in, BaseImporter& _bi, Options& _opt)
fh
=
_bi
.
add_face
(
faceVertices
);
if
(
!
vhandles
.
empty
()
&&
fh
.
is_valid
()
)
{
_bi
.
add_face_texcoords
(
fh
,
vhandles
[
0
],
face_texcoords
);
_bi
.
add_face_texcoords
(
fh
,
vhandles
[
0
],
face_texcoords3d
);
}
if
(
!
matname
.
empty
()
)
{
...
...
src/Unittests/TestFiles/cube-minimal-texCoords3d.obj
0 → 100644
View file @
781063a3
g cube
v 0.0 0.0 0.0
v 0.0 0.0 1.0
v 0.0 1.0 0.0
v 0.0 1.0 1.0
v 1.0 0.0 0.0
v 1.0 0.0 1.0
v 1.0 1.0 0.0
v 1.0 1.0 1.0
vn 0.0 0.0 1.0
vn 0.0 0.0 -1.0
vn 0.0 1.0 0.0
vn 0.0 -1.0 0.0
vn 1.0 0.0 0.0
vn -1.0 0.0 0.0
vt 1.0 1.0 1.0
vt 2.0 2.0 2.0
vt 3.0 3.0 3.0
vt 4.0 4.0 4.0
vt 5.0 5.0 5.0
vt 6.0 6.0 6.0
vt 7.0 7.0 7.0
vt 8.0 8.0 8.0
vt 9.0 9.0 9.0
vt 10.0 10.0 10.0
vt 11.0 11.0 11.0
vt 12.0 12.0 12.0
f 1/1/2 7/1/2 5/1/2
f 1/2/2 3/2/2 7/2/2
f 1/3/6 4/3/6 3/3/6
f 1/4/6 2/4/6 4/4/6
f 3/5/3 8/5/3 7/5/3
f 3/6/3 4/6/3 8/6/3
f 5/7/5 7/7/5 8/7/5
f 5/8/5 8/8/5 6/8/5
f 1/9/4 5/9/4 6/9/4
f 1/10/4 6/10/4 2/10/4
f 2/11/1 6/11/1 8/11/1
f 2/12/1 8/12/1 4/12/1
src/Unittests/unittests_read_write_OBJ.cc
View file @
781063a3
...
...
@@ -202,6 +202,51 @@ TEST_F(OpenMeshReadWriteOBJ, LoadSimpleOBJCheckTexCoords) {
mesh_
.
release_halfedge_texcoords2D
();
}
/*
* Just load a obj file of a cube and checks the 3d halfedge texCoords
*/
TEST_F
(
OpenMeshReadWriteOBJ
,
LoadSimpleOBJCheckTexCoords3d
)
{
mesh_
.
clear
();
mesh_
.
request_halfedge_texcoords3D
();
OpenMesh
::
IO
::
Options
options
;
options
+=
OpenMesh
::
IO
::
Options
::
FaceTexCoord
;
std
::
string
file_name
=
"cube-minimal-texCoords3d.obj"
;
bool
ok
=
OpenMesh
::
IO
::
read_mesh
(
mesh_
,
file_name
,
options
);
EXPECT_TRUE
(
ok
)
<<
file_name
;
EXPECT_EQ
(
1
,
mesh_
.
texcoord3D
(
mesh_
.
halfedge_handle
(
0
))[
0
]
)
<<
"Wrong texCoord at halfedge 0 component 0"
;
EXPECT_EQ
(
1
,
mesh_
.
texcoord3D
(
mesh_
.
halfedge_handle
(
0
))[
1
]
)
<<
"Wrong texCoord at halfedge 0 component 1"
;
EXPECT_EQ
(
1
,
mesh_
.
texcoord3D
(
mesh_
.
halfedge_handle
(
0
))[
2
]
)
<<
"Wrong texCoord at halfedge 0 component 2"
;
EXPECT_EQ
(
3
,
mesh_
.
texcoord3D
(
mesh_
.
halfedge_handle
(
10
))[
0
]
)
<<
"Wrong texCoord at halfedge 1 component 0"
;
EXPECT_EQ
(
3
,
mesh_
.
texcoord3D
(
mesh_
.
halfedge_handle
(
10
))[
1
]
)
<<
"Wrong texCoord at halfedge 1 component 1"
;
EXPECT_EQ
(
3
,
mesh_
.
texcoord3D
(
mesh_
.
halfedge_handle
(
10
))[
2
]
)
<<
"Wrong texCoord at halfedge 1 component 2"
;
EXPECT_EQ
(
6
,
mesh_
.
texcoord3D
(
mesh_
.
halfedge_handle
(
19
))[
0
]
)
<<
"Wrong texCoord at halfedge 4 component 0"
;
EXPECT_EQ
(
6
,
mesh_
.
texcoord3D
(
mesh_
.
halfedge_handle
(
19
))[
1
]
)
<<
"Wrong texCoord at halfedge 4 component 1"
;
EXPECT_EQ
(
6
,
mesh_
.
texcoord3D
(
mesh_
.
halfedge_handle
(
19
))[
2
]
)
<<
"Wrong texCoord at halfedge 4 component 2"
;
EXPECT_EQ
(
7
,
mesh_
.
texcoord3D
(
mesh_
.
halfedge_handle
(
24
))[
0
]
)
<<
"Wrong texCoord at halfedge 7 component 0"
;
EXPECT_EQ
(
7
,
mesh_
.
texcoord3D
(
mesh_
.
halfedge_handle
(
24
))[
1
]
)
<<
"Wrong texCoord at halfedge 7 component 1"
;
EXPECT_EQ
(
7
,
mesh_
.
texcoord3D
(
mesh_
.
halfedge_handle
(
24
))[
2
]
)
<<
"Wrong texCoord at halfedge 7 component 2"
;
EXPECT_EQ
(
9
,
mesh_
.
texcoord3D
(
mesh_
.
halfedge_handle
(
30
))[
0
]
)
<<
"Wrong texCoord at halfedge 9 component 0"
;
EXPECT_EQ
(
9
,
mesh_
.
texcoord3D
(
mesh_
.
halfedge_handle
(
30
))[
1
]
)
<<
"Wrong texCoord at halfedge 9 component 1"
;
EXPECT_EQ
(
9
,
mesh_
.
texcoord3D
(
mesh_
.
halfedge_handle
(
30
))[
2
]
)
<<
"Wrong texCoord at halfedge 9 component 2"
;
EXPECT_EQ
(
12
,
mesh_
.
texcoord3D
(
mesh_
.
halfedge_handle
(
35
))[
0
]
)
<<
"Wrong texCoord at halfedge 11 component 0"
;
EXPECT_EQ
(
12
,
mesh_
.
texcoord3D
(
mesh_
.
halfedge_handle
(
35
))[
1
]
)
<<
"Wrong texCoord at halfedge 11 component 1"
;
EXPECT_EQ
(
12
,
mesh_
.
texcoord3D
(
mesh_
.
halfedge_handle
(
35
))[
2
]
)
<<
"Wrong texCoord at halfedge 11 component 2"
;
mesh_
.
request_halfedge_texcoords3D
();
}
/*
* Just load a obj file of a square with a material
*/
...
...
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