File include/fg2/fg2.h changed (mode: 100755) (index d5d18e8..3b04ebc) |
... |
... |
Mesh loadOBJ( std::string filepath ){ |
682 |
682 |
printf( "Faces: %lu\n", obj_f.size() ); |
printf( "Faces: %lu\n", obj_f.size() ); |
683 |
683 |
} |
} |
684 |
684 |
|
|
685 |
|
// group vertex attributes by texture coordinates |
|
686 |
|
std::vector<Vertex> verts( obj_vt.size() ); |
|
|
685 |
|
std::vector<Vertex> verts; |
687 |
686 |
std::vector<Index> inds; |
std::vector<Index> inds; |
688 |
687 |
|
|
|
688 |
|
// Create a vertex for each index. Inefficient but effective. |
|
689 |
|
// https://community.khronos.org/t/obj-texture-coordinates-arent-mapped-correctly/69926 |
|
690 |
|
Index idx = 0; |
689 |
691 |
for( obdex f : obj_f ){ |
for( obdex f : obj_f ){ |
690 |
|
Index a = f.vt1 - 1, b = f.vt2 - 1, c = f.vt3 - 1; |
|
691 |
|
verts[ a ] = { |
|
692 |
|
{ obj_v[ f.v1 - 1 ].x, obj_v[ f.v1 - 1 ].y, obj_v[ f.v1 - 1 ].z }, |
|
693 |
|
{ obj_vn[ f.vn1 - 1 ].x, obj_vn[ f.vn1 - 1 ].y, obj_vn[ f.vn1 - 1 ].z }, |
|
694 |
|
{ 0.0f, 0.0f, 0.0f }, |
|
695 |
|
{ obj_vt[ a ].u, obj_vt[ a ].v } |
|
696 |
|
}; |
|
697 |
|
verts[ b ] = { |
|
698 |
|
{ obj_v[ f.v2 - 1 ].x, obj_v[ f.v2 - 1 ].y, obj_v[ f.v2 - 1 ].z }, |
|
699 |
|
{ obj_vn[ f.vn2 - 1 ].x, obj_vn[ f.vn2 - 1 ].y, obj_vn[ f.vn2 - 1 ].z }, |
|
700 |
|
{ 0.0f, 0.0f, 0.0f }, |
|
701 |
|
{ obj_vt[ b ].u, obj_vt[ b ].v } |
|
702 |
|
}; |
|
703 |
|
verts[ c ] = { |
|
704 |
|
{ obj_v[ f.v3 - 1 ].x, obj_v[ f.v3 - 1 ].y, obj_v[ f.v3 - 1 ].z }, |
|
705 |
|
{ obj_vn[ f.vn3 - 1 ].x, obj_vn[ f.vn3 - 1 ].y, obj_vn[ f.vn3 - 1 ].z }, |
|
706 |
|
{ 0.0f, 0.0f, 0.0f }, |
|
707 |
|
{ obj_vt[ c ].u, obj_vt[ c ].v } |
|
708 |
|
}; |
|
709 |
|
Index i[3] = { a, b, c }; |
|
710 |
|
inds.insert( std::end( inds ), std::begin( i ), std::end( i ) ); |
|
|
692 |
|
const int lookup_v[] = { f.v1, f.v2, f.v3 }; |
|
693 |
|
const int lookup_vt[] = { f.vt1, f.vt2, f.vt3 }; |
|
694 |
|
const int lookup_vn[] = { f.vn1, f.vn2, f.vn3 }; |
|
695 |
|
for( int i = 0; i < 3; i++ ){ |
|
696 |
|
int v = lookup_v[i] - 1; |
|
697 |
|
int vt = lookup_vt[i] - 1; |
|
698 |
|
int vn = lookup_vn[i] - 1; |
|
699 |
|
verts.push_back( { |
|
700 |
|
{ obj_v[v].x, obj_v[v].y, obj_v[v].z }, |
|
701 |
|
{ obj_vn[vn].x, obj_vn[vn].y, obj_vn[vn].z }, |
|
702 |
|
{ 0.0f, 0.0f, 0.0f }, |
|
703 |
|
{ obj_vt[vt].u, obj_vt[vt].v } |
|
704 |
|
} ); |
|
705 |
|
inds.push_back( idx ); |
|
706 |
|
idx++; |
|
707 |
|
} |
711 |
708 |
} |
} |
712 |
709 |
|
|
713 |
710 |
normalizeVertices( verts ); |
normalizeVertices( verts ); |
File include/fg3/fg3.h changed (mode: 100644) (index 78dbb01..07f2399) |
... |
... |
Mesh loadOBJ( std::string filepath ){ |
872 |
872 |
_VERBOUT_ << "Vertex normals: " << obj_vn.size() << std::endl; |
_VERBOUT_ << "Vertex normals: " << obj_vn.size() << std::endl; |
873 |
873 |
_VERBOUT_ << "Faces: " << obj_f.size() << std::endl; |
_VERBOUT_ << "Faces: " << obj_f.size() << std::endl; |
874 |
874 |
|
|
875 |
|
// group vertex attributes by texture coordinates |
|
876 |
|
std::vector<Vertex> verts( obj_vt.size() ); |
|
|
875 |
|
std::vector<Vertex> verts; |
877 |
876 |
std::vector<Index> inds; |
std::vector<Index> inds; |
878 |
877 |
|
|
|
878 |
|
// Create a vertex for each index. Inefficient but effective. |
|
879 |
|
// https://community.khronos.org/t/obj-texture-coordinates-arent-mapped-correctly/69926 |
|
880 |
|
Index idx = 0; |
879 |
881 |
for( obdex f : obj_f ){ |
for( obdex f : obj_f ){ |
880 |
|
Index a = f.vt1 - 1, b = f.vt2 - 1, c = f.vt3 - 1; |
|
881 |
|
verts[ a ] = { |
|
882 |
|
{ obj_v[ f.v1 - 1 ].x, obj_v[ f.v1 - 1 ].y, obj_v[ f.v1 - 1 ].z }, |
|
883 |
|
{ obj_vn[ f.vn1 - 1 ].x, obj_vn[ f.vn1 - 1 ].y, obj_vn[ f.vn1 - 1 ].z }, |
|
884 |
|
{ 0.0f, 0.0f, 0.0f }, |
|
885 |
|
{ obj_vt[ a ].u, obj_vt[ a ].v } |
|
886 |
|
}; |
|
887 |
|
verts[ b ] = { |
|
888 |
|
{ obj_v[ f.v2 - 1 ].x, obj_v[ f.v2 - 1 ].y, obj_v[ f.v2 - 1 ].z }, |
|
889 |
|
{ obj_vn[ f.vn2 - 1 ].x, obj_vn[ f.vn2 - 1 ].y, obj_vn[ f.vn2 - 1 ].z }, |
|
890 |
|
{ 0.0f, 0.0f, 0.0f }, |
|
891 |
|
{ obj_vt[ b ].u, obj_vt[ b ].v } |
|
892 |
|
}; |
|
893 |
|
verts[ c ] = { |
|
894 |
|
{ obj_v[ f.v3 - 1 ].x, obj_v[ f.v3 - 1 ].y, obj_v[ f.v3 - 1 ].z }, |
|
895 |
|
{ obj_vn[ f.vn3 - 1 ].x, obj_vn[ f.vn3 - 1 ].y, obj_vn[ f.vn3 - 1 ].z }, |
|
896 |
|
{ 0.0f, 0.0f, 0.0f }, |
|
897 |
|
{ obj_vt[ c ].u, obj_vt[ c ].v } |
|
898 |
|
}; |
|
899 |
|
Index i[3] = { a, b, c }; |
|
900 |
|
inds.insert( std::end( inds ), std::begin( i ), std::end( i ) ); |
|
|
882 |
|
const int lookup_v[] = { f.v1, f.v2, f.v3 }; |
|
883 |
|
const int lookup_vt[] = { f.vt1, f.vt2, f.vt3 }; |
|
884 |
|
const int lookup_vn[] = { f.vn1, f.vn2, f.vn3 }; |
|
885 |
|
for( int i = 0; i < 3; i++ ){ |
|
886 |
|
int v = lookup_v[i] - 1; |
|
887 |
|
int vt = lookup_vt[i] - 1; |
|
888 |
|
int vn = lookup_vn[i] - 1; |
|
889 |
|
verts.push_back( { |
|
890 |
|
{ obj_v[v].x, obj_v[v].y, obj_v[v].z }, |
|
891 |
|
{ obj_vn[vn].x, obj_vn[vn].y, obj_vn[vn].z }, |
|
892 |
|
{ 0.0f, 0.0f, 0.0f }, |
|
893 |
|
{ obj_vt[vt].u, obj_vt[vt].v } |
|
894 |
|
} ); |
|
895 |
|
inds.push_back( idx ); |
|
896 |
|
idx++; |
|
897 |
|
} |
901 |
898 |
} |
} |
902 |
899 |
|
|
903 |
900 |
normalizeVertices( verts ); |
normalizeVertices( verts ); |