@@ -11,32 +11,49 @@ struct Position {
1111 float x, y, z;
1212};
1313
14- std::vector<Position> positions;
15- std::vector<Position> normals;
16- std::vector<uint32_t > indices;
14+ struct Material {
15+ Position diffuse;
16+ Position specular;
17+ Position emissive;
18+ float shininess;
19+ };
20+
21+ struct Mesh {
22+ std::vector<Position> positions;
23+ std::vector<Position> normals;
24+ std::vector<uint32_t > indices;
25+ Material material;
26+ };
27+
28+ std::vector<Mesh> meshes;
29+ std::vector<Material> materials;
1730
1831void processMesh (aiMesh* mesh, const aiScene* scene) {
32+ Mesh m;
1933 for (unsigned int i = 0 ; i < mesh->mNumVertices ; i++) {
2034 Position position;
2135 position.x = mesh->mVertices [i].x ;
2236 position.y = mesh->mVertices [i].y ;
2337 position.z = mesh->mVertices [i].z ;
24- positions.push_back (position);
38+ m. positions .push_back (position);
2539
2640 Position normal;
2741 normal.x = mesh->mNormals [i].x ;
2842 normal.y = mesh->mNormals [i].y ;
2943 normal.z = mesh->mNormals [i].z ;
30- normals.push_back (normal);
44+ m. normals .push_back (normal);
3145 }
3246
3347 for (unsigned int i = 0 ; i < mesh->mNumFaces ; i++) {
3448 aiFace face = mesh->mFaces [i];
3549 assert (face.mNumIndices == 3 );
3650 for (unsigned int j = 0 ; j < face.mNumIndices ; j++) {
37- indices.push_back (face.mIndices [j]);
51+ m. indices .push_back (face.mIndices [j]);
3852 }
3953 }
54+
55+ m.material = materials[mesh->mMaterialIndex ];
56+ meshes.push_back (m);
4057}
4158
4259void processNode (aiNode* node, const aiScene* scene) {
@@ -62,6 +79,47 @@ char* getFilename(char* filename) {
6279 return lastSlash;
6380}
6481
82+ void processMaterials (const aiScene* scene) {
83+ for (uint32_t i = 0 ; i < scene->mNumMaterials ; i++) {
84+ Material mat;
85+ aiMaterial* material = scene->mMaterials [i];
86+
87+ aiColor3D diffuse (0 .0f , 0 .0f , 0 .0f );
88+ if (AI_SUCCESS != material->Get (AI_MATKEY_COLOR_DIFFUSE, diffuse)) {
89+ // No diffuse color
90+ }
91+ mat.diffuse = {diffuse.r , diffuse.g , diffuse.b };
92+
93+ aiColor3D specular (0 .0f , 0 .0f , 0 .0f );
94+ if (AI_SUCCESS != material->Get (AI_MATKEY_COLOR_SPECULAR, specular)) {
95+ // No specular color
96+ }
97+ mat.specular = {specular.r , specular.g , specular.b };
98+
99+ aiColor3D emissive (0 .0f , 0 .0f , 0 .0f );
100+ if (AI_SUCCESS != material->Get (AI_MATKEY_COLOR_EMISSIVE, emissive)) {
101+ // No emissive color
102+ }
103+ mat.emissive = {emissive.r , emissive.g , emissive.b };
104+
105+ float shininess = 0 .0f ;
106+ if (AI_SUCCESS != material->Get (AI_MATKEY_SHININESS, shininess)) {
107+ // No shininess
108+ }
109+ mat.shininess = shininess;
110+
111+ float shininessStrength = 1 .0f ;
112+ if (AI_SUCCESS != material->Get (AI_MATKEY_SHININESS_STRENGTH, shininessStrength)) {
113+ // No shininessStrength
114+ }
115+ mat.specular .x *= shininessStrength;
116+ mat.specular .y *= shininessStrength;
117+ mat.specular .z *= shininessStrength;
118+
119+ materials.push_back (mat);
120+ }
121+ }
122+
65123int main (int argc, char ** argv) {
66124 if (argc <= 0 ) {
67125 return 1 ;
@@ -72,12 +130,13 @@ int main(int argc, char** argv) {
72130 }
73131
74132 Assimp::Importer importer;
75- const aiScene* scene = importer.ReadFile (argv[argc-1 ], aiProcess_Triangulate | aiProcess_GenNormals | aiProcess_OptimizeMeshes | aiProcess_OptimizeGraph | aiProcess_JoinIdenticalVertices | aiProcess_ImproveCacheLocality);
133+ const aiScene* scene = importer.ReadFile (argv[argc-1 ], aiProcess_PreTransformVertices | aiProcess_Triangulate | aiProcess_GenNormals | aiProcess_OptimizeMeshes | aiProcess_OptimizeGraph | aiProcess_JoinIdenticalVertices | aiProcess_ImproveCacheLocality);
76134 if (!scene || scene->mFlags & AI_SCENE_FLAGS_INCOMPLETE, !scene->mRootNode ) {
77135 std::cout << " Error while loading model with assimp: " << importer.GetErrorString () << std::endl;
78136 return 1 ;
79137 }
80138
139+ processMaterials (scene);
81140 processNode (scene->mRootNode , scene);
82141
83142 std::string filename = std::string (getFilename (argv[argc-1 ]));
@@ -86,21 +145,28 @@ int main(int argc, char** argv) {
86145
87146 std::ofstream output (outputFilename, std::ios::out | std::ios::binary);
88147 std::cout << " Writing bmf file..." << std::endl;
89- uint64_t numVertices = positions.size ();
90- uint64_t numIndices = indices.size ();
91- output.write ((char *)&numVertices, sizeof (uint64_t ));
92- output.write ((char *)&numIndices, sizeof (uint64_t ));
93- for (uint64_t i = 0 ; i < numVertices; i++) {
94- output.write ((char *)&positions[i].x , sizeof (float ));
95- output.write ((char *)&positions[i].y , sizeof (float ));
96- output.write ((char *)&positions[i].z , sizeof (float ));
97-
98- output.write ((char *)&normals[i].x , sizeof (float ));
99- output.write ((char *)&normals[i].y , sizeof (float ));
100- output.write ((char *)&normals[i].z , sizeof (float ));
101- }
102- for (uint64_t i = 0 ; i < numIndices; i++) {
103- output.write ((char *)&indices[i], sizeof (uint32_t ));
148+ uint64_t numMeshes = meshes.size ();
149+ output.write ((char *)&numMeshes, sizeof (uint64_t ));
150+ for (Mesh& mesh : meshes) {
151+ uint64_t numVertices = mesh.positions .size ();
152+ uint64_t numIndices = mesh.indices .size ();
153+ output.write ((char *)&mesh.material , sizeof (Material));
154+
155+ output.write ((char *)&numVertices, sizeof (uint64_t ));
156+ output.write ((char *)&numIndices, sizeof (uint64_t ));
157+ for (uint64_t i = 0 ; i < numVertices; i++) {
158+ output.write ((char *)&mesh.positions [i].x , sizeof (float ));
159+ output.write ((char *)&mesh.positions [i].y , sizeof (float ));
160+ output.write ((char *)&mesh.positions [i].z , sizeof (float ));
161+
162+ output.write ((char *)&mesh.normals [i].x , sizeof (float ));
163+ output.write ((char *)&mesh.normals [i].y , sizeof (float ));
164+ output.write ((char *)&mesh.normals [i].z , sizeof (float ));
165+ }
166+ for (uint64_t i = 0 ; i < numIndices; i++) {
167+ output.write ((char *)&mesh.indices [i], sizeof (uint32_t ));
168+ }
104169 }
170+
105171 output.close ();
106172}
0 commit comments