Răsfoiți Sursa

3DS Export: fix texture export.

Alexander Gessler 11 ani în urmă
părinte
comite
026f32733d
1 a modificat fișierele cu 16 adăugiri și 12 ștergeri
  1. 16 12
      code/3DSExporter.cpp

+ 16 - 12
code/3DSExporter.cpp

@@ -181,7 +181,6 @@ Discreet3DSExporter:: Discreet3DSExporter(boost::shared_ptr<IOStream> outfile, c
 : scene(scene)
 , writer(outfile)
 {
-	
 	CollectTrafos(scene->mRootNode, trafos);
 	CollectMeshes(scene->mRootNode, meshes);
 
@@ -191,6 +190,11 @@ Discreet3DSExporter:: Discreet3DSExporter(boost::shared_ptr<IOStream> outfile, c
 		ChunkWriter chunk(writer, Discreet3DS::CHUNK_OBJMESH);
 		WriteMeshes();
 		WriteMaterials();
+
+		{
+			ChunkWriter chunk(writer, Discreet3DS::CHUNK_MASTER_SCALE);
+			writer.PutF4(1.0f);
+		}
 	}
 
 	{
@@ -203,7 +207,6 @@ void Discreet3DSExporter::WriteMaterials()
 {
 	for (unsigned int i = 0; i < scene->mNumMaterials; ++i) {
 		ChunkWriter chunk(writer, Discreet3DS::CHUNK_MAT_MATERIAL);
-
 		const aiMaterial& mat = *scene->mMaterials[i];
 
 		{
@@ -279,10 +282,9 @@ void Discreet3DSExporter::WriteMaterials()
 		int twosided;
 		if (mat.Get(AI_MATKEY_TWOSIDED, twosided) == AI_SUCCESS && twosided != 0) {
 			ChunkWriter chunk(writer, Discreet3DS::CHUNK_MAT_TWO_SIDE);
-			// Intentionally no more data - if the chunk exists, the TWOSIDED
-			// flag is assumed to be set.
+			writer.PutI2(1);
 		}
-
+		
 		WriteTexture(mat, aiTextureType_DIFFUSE, Discreet3DS::CHUNK_MAT_TEXTURE);
 		WriteTexture(mat, aiTextureType_HEIGHT, Discreet3DS::CHUNK_MAT_BUMPMAP);
 		WriteTexture(mat, aiTextureType_OPACITY, Discreet3DS::CHUNK_MAT_OPACMAP);
@@ -297,9 +299,11 @@ void Discreet3DSExporter::WriteMaterials()
 void Discreet3DSExporter::WriteTexture(const aiMaterial& mat, aiTextureType type, uint16_t chunk_flags) 
 {
 	aiString path;
-	aiTextureMapMode map_mode = aiTextureMapMode_Wrap;
+	aiTextureMapMode map_mode[2] = {
+		aiTextureMapMode_Wrap, aiTextureMapMode_Wrap
+	};
 	float blend = 1.0f;
-	if (mat.GetTexture(type, 0, &path, NULL, NULL, &blend, NULL, &map_mode) != AI_SUCCESS || !path.length) {
+	if (mat.GetTexture(type, 0, &path, NULL, NULL, &blend, NULL, map_mode) != AI_SUCCESS || !path.length) {
 		return;
 	}
 
@@ -309,21 +313,21 @@ void Discreet3DSExporter::WriteTexture(const aiMaterial& mat, aiTextureType type
 		return;
 	}
 
-	ChunkWriter(writer, chunk_flags);
+	ChunkWriter chunk(writer, chunk_flags);
 	{
-		ChunkWriter(writer, Discreet3DS::CHUNK_MAPFILE);
+		ChunkWriter chunk(writer, Discreet3DS::CHUNK_MAPFILE);
 		WriteString(path);
 	}
 
 	WritePercentChunk(blend);
 
 	{
-		ChunkWriter(writer, Discreet3DS::CHUNK_MAT_MAP_TILING);
+		ChunkWriter chunk(writer, Discreet3DS::CHUNK_MAT_MAP_TILING);
 		uint16_t val = 0; // WRAP
-		if (map_mode == aiTextureMapMode_Mirror) {
+		if (map_mode[0] == aiTextureMapMode_Mirror) {
 			val = 0x2;
 		}
-		else if (map_mode == aiTextureMapMode_Decal) {
+		else if (map_mode[0] == aiTextureMapMode_Decal) {
 			val = 0x10;
 		}
 		writer.PutU2(val);