construction a partir des donnees d'un maillage.
49{
51
53 mesh.material_indices.reserve(data.material_indices.size());
54
55 mesh.positions.reserve(data.positions.size());
56 mesh.texcoords.reserve(data.positions.size());
57 mesh.normals.reserve(data.positions.size());
58
59
60 std::vector<int> triangles;
61 triangles.reserve(data.material_indices.size());
62 for(int i= 0; i < (int) data.material_indices.size(); i++)
63 triangles.push_back(i);
64
65 std::sort(triangles.begin(), triangles.end(),
compareMaterial(data.material_indices));
66
67
68 int material_id= data.material_indices[triangles[0]];
69 mesh.material_groups.push_back(
MeshGroup(material_id, 0) );
70
73
74
75 std::map<MeshVertex, int> remap;
76 for(int i= 0; i < (int) triangles.size(); i++)
77 {
78
79 mesh.material_indices.push_back(data.material_indices[triangles[i]]);
80
81
82 if(material_id != data.material_indices[triangles[i]])
83 {
84
85 material_id= data.material_indices[triangles[i]];
86
87 mesh.material_groups.back().count= 3*i - mesh.material_groups.back().first;
88 mesh.material_groups.push_back(
MeshGroup(material_id, 3*i) );
89 }
90
91 for(int k= 0; k < 3; k++)
92 {
93
94 int index= 3*triangles[i] + k;
95 MeshVertex vertex=
MeshVertex(material_id, data.position_indices[index], data.texcoord_indices[index], data.normal_indices[index]);
96
97 auto found= remap.insert( std::make_pair(
vertex, remap.size()) );
98 if(found.second)
99 {
100
101 assert(data.position_indices[index] != -1);
102 mesh.positions.push_back( data.positions[data.position_indices[index]] );
103
104 if(data.texcoord_indices[index] != -1)
105
106 mesh.texcoords.push_back( data.texcoords[data.texcoord_indices[index]] );
108
109 mesh.texcoords.push_back(
vec2() );
110
111 if(data.normal_indices[index] != -1)
112
113 mesh.normals.push_back( data.normals[data.normal_indices[index]] );
115
116 mesh.normals.push_back(
vec3() );
117 }
118
119
120 mesh.indices.push_back(found.first->second);
121 }
122 }
123
124
125 mesh.material_groups.back().count= 3*triangles.size() - mesh.material_groups.back().first;
126
127 printf(
"buffers : %d positions, %d texcoords, %d normals, %d indices, %d groups\n",
128 (int) mesh.positions.size(), (int) mesh.texcoords.size(), (int) mesh.normals.size(), (int) mesh.indices.size(), (int) mesh.material_groups.size());
129
130 return mesh;
131}
void printf(Text &text, const int px, const int py, const char *format,...)
affiche un texte a la position x, y. meme utilisation que printf().
representation d'un objet.
std::vector< MaterialData > materials
ensemble de matieres
representation d'une sequence de triangles associes a la meme matiere
representation de l'indexation complete d'un sommet
vecteur generique, utilitaire.
vecteur generique, utilitaire.
representation de l'indexation complete d'un sommet
bool has_normals(const Hit &hit, const GLTFScene &scene)
verifie la presence des normales par sommet.
bool has_texcoords(const Hit &hit, const GLTFScene &scene)
verifie la presence des coordonnees de texture...