소스 검색

Some GLTF fixes

Panagiotis Christopoulos Charitos 6 년 전
부모
커밋
342937fb70
4개의 변경된 파일85개의 추가작업 그리고 36개의 파일을 삭제
  1. 49 31
      src/anki/importer/GltfImporter.cpp
  2. 6 2
      src/anki/importer/GltfImporter.h
  3. 11 2
      src/anki/importer/GltfImporterMesh.cpp
  4. 19 1
      tools/gltf_importer/Main.cpp

+ 49 - 31
src/anki/importer/GltfImporter.cpp

@@ -122,7 +122,7 @@ static ANKI_USE_RESULT Error getNodeTransform(const cgltf_node& node, Transform&
 	Vec3 scale;
 	getNodeTransform(node, tsl, rot, scale);
 
-	const F32 scaleEpsilon = 0.0001f;
+	const F32 scaleEpsilon = 0.01f;
 	if(absolute(scale[0] - scale[1]) > scaleEpsilon || absolute(scale[0] - scale[2]) > scaleEpsilon)
 	{
 		ANKI_GLTF_LOGE("Expecting uniform scale");
@@ -141,7 +141,6 @@ const char* GltfImporter::XML_HEADER = R"(<?xml version="1.0" encoding="UTF-8" ?
 GltfImporter::GltfImporter(GenericMemoryPoolAllocator<U8> alloc)
 	: m_alloc(alloc)
 {
-	m_hive = m_alloc.newInstance<ThreadHive>(getCpuCoresCount(), m_alloc, true);
 }
 
 GltfImporter::~GltfImporter()
@@ -155,7 +154,8 @@ GltfImporter::~GltfImporter()
 	m_alloc.deleteInstance(m_hive);
 }
 
-Error GltfImporter::init(CString inputFname, CString outDir, CString rpath, CString texrpath, Bool optimizeMeshes)
+Error GltfImporter::init(
+	CString inputFname, CString outDir, CString rpath, CString texrpath, Bool optimizeMeshes, U32 threadCount)
 {
 	m_inputFname.create(inputFname);
 	m_outDir.create(outDir);
@@ -178,6 +178,12 @@ Error GltfImporter::init(CString inputFname, CString outDir, CString rpath, CStr
 		return Error::FUNCTION_FAILED;
 	}
 
+	if(threadCount > 0)
+	{
+		threadCount = min(getCpuCoresCount(), threadCount);
+		m_hive = m_alloc.newInstance<ThreadHive>(threadCount, m_alloc, true);
+	}
+
 	return Error::NONE;
 }
 
@@ -205,7 +211,10 @@ Error GltfImporter::writeAll()
 		}
 	}
 
-	m_hive->waitAllTasks();
+	if(m_hive)
+	{
+		m_hive->waitAllTasks();
+	}
 
 	// Check error
 	const Error threadErr = m_errorInThread.load();
@@ -599,40 +608,49 @@ Error GltfImporter::visitNode(
 			const Bool selfCollision = (it2 = extras.find("collision_mesh")) != extras.getEnd() && *it2 == "self";
 			ctx->m_selfCollision = selfCollision;
 
-			m_hive->submitTask(
-				[](void* userData, U32 threadId, ThreadHive& hive, ThreadHiveSemaphore* signalSemaphore) {
-					Ctx& self = *static_cast<Ctx*>(userData);
+			// Thread task
+			auto callback = [](void* userData, U32 threadId, ThreadHive& hive, ThreadHiveSemaphore* signalSemaphore) {
+				Ctx& self = *static_cast<Ctx*>(userData);
 
-					Error err = self.m_importer->writeMesh(*self.m_mesh);
+				Error err = self.m_importer->writeMesh(*self.m_mesh);
 
-					if(!err)
-					{
-						err = self.m_importer->writeMaterial(*self.m_mtl);
-					}
+				if(!err)
+				{
+					err = self.m_importer->writeMaterial(*self.m_mtl);
+				}
 
-					if(!err)
-					{
-						err = self.m_importer->writeModel(*self.m_mesh, (self.m_skin) ? self.m_skin->name : CString());
-					}
+				if(!err)
+				{
+					err = self.m_importer->writeModel(*self.m_mesh, (self.m_skin) ? self.m_skin->name : CString());
+				}
 
-					if(!err && self.m_skin)
-					{
-						err = self.m_importer->writeSkeleton(*self.m_skin);
-					}
+				if(!err && self.m_skin)
+				{
+					err = self.m_importer->writeSkeleton(*self.m_skin);
+				}
 
-					if(!err && self.m_selfCollision)
-					{
-						err = self.m_importer->writeCollisionMesh(*self.m_mesh);
-					}
+				if(!err && self.m_selfCollision)
+				{
+					err = self.m_importer->writeCollisionMesh(*self.m_mesh);
+				}
+
+				if(err)
+				{
+					self.m_importer->m_errorInThread.store(err._getCode());
+					printf("aaaaaaaaaaaaaaa\n");
+				}
 
-					if(err)
-					{
-						self.m_importer->m_errorInThread.store(err._getCode());
-					}
+				self.m_importer->m_alloc.deleteInstance(&self);
+			};
 
-					self.m_importer->m_alloc.deleteInstance(&self);
-				},
-				ctx);
+			if(m_hive)
+			{
+				m_hive->submitTask(callback, ctx);
+			}
+			else
+			{
+				callback(ctx, 0, *m_hive, nullptr);
+			}
 
 			ANKI_CHECK(writeModelNode(node, parentExtras));
 

+ 6 - 2
src/anki/importer/GltfImporter.h

@@ -30,8 +30,12 @@ public:
 
 	~GltfImporter();
 
-	ANKI_USE_RESULT Error init(
-		CString inputFname, CString outDir, CString rpath, CString texrpath, Bool optimizeMeshes);
+	ANKI_USE_RESULT Error init(CString inputFname,
+		CString outDir,
+		CString rpath,
+		CString texrpath,
+		Bool optimizeMeshes,
+		U32 threadCount = MAX_U32);
 
 	ANKI_USE_RESULT Error writeAll();
 

+ 11 - 2
src/anki/importer/GltfImporterMesh.cpp

@@ -283,7 +283,7 @@ Error GltfImporter::writeMesh(const cgltf_mesh& mesh)
 				visitAccessor<Vec3>(
 					*attrib->data, [&](const Vec3& normal) { submesh.m_verts[count++].m_normal = normal; });
 			}
-			else if(attrib->type == cgltf_attribute_type_texcoord)
+			else if(attrib->type == cgltf_attribute_type_texcoord && CString(attrib->name) == "TEXCOORD_0")
 			{
 				U count = 0;
 				ANKI_CHECK(checkAttribute<Vec2>(*attrib));
@@ -380,6 +380,7 @@ Error GltfImporter::writeMesh(const cgltf_mesh& mesh)
 				else
 				{
 					ANKI_ASSERT(0);
+					idx = 0;
 				}
 
 				submesh.m_indices[i] = idx;
@@ -448,7 +449,15 @@ Error GltfImporter::writeMesh(const cgltf_mesh& mesh)
 				Vec3& b = bitangents[i];
 
 				t.normalize();
-				b.normalize();
+
+				if(b.getLengthSquared() < EPSILON)
+				{
+					b = Vec3(0.0f, 1.0f, 0.0f); // Something random
+				}
+				else
+				{
+					b.normalize();
+				}
 
 				const F32 w = ((n.cross(t)).dot(b) < 0.0f) ? 1.0f : -1.0f;
 				submesh.m_verts[i].m_tangent = Vec4(t, w);

+ 19 - 1
tools/gltf_importer/Main.cpp

@@ -12,6 +12,7 @@ Options:
 -rpath <string>        : Replace all absolute paths of assets with that path
 -texrpath <string>     : Same as rpath but for textures
 -optimize-meshes <0|1> : Optimize meshes. Default is 1
+-j <thread_count>      : Number of threads. Defaults to system's max
 )";
 
 class CmdLineArgs
@@ -23,6 +24,7 @@ public:
 	StringAuto m_rpath = {m_alloc};
 	StringAuto m_texRpath = {m_alloc};
 	Bool m_optimizeMeshes = true;
+	U32 m_threadCount = MAX_U32;
 };
 
 static Error parseCommandLineArgs(int argc, char** argv, CmdLineArgs& info)
@@ -98,6 +100,21 @@ static Error parseCommandLineArgs(int argc, char** argv, CmdLineArgs& info)
 				return Error::USER_DATA;
 			}
 		}
+		else if(strcmp(argv[i], "-j") == 0)
+		{
+			++i;
+
+			if(i < argc)
+			{
+				U32 count = 0;
+				ANKI_CHECK(CString(argv[i]).toNumber(count));
+				info.m_threadCount = count;
+			}
+			else
+			{
+				return Error::USER_DATA;
+			}
+		}
 		else
 		{
 			return Error::USER_DATA;
@@ -132,7 +149,8 @@ int main(int argc, char** argv)
 		   info.m_outDir.toCString(),
 		   info.m_rpath.toCString(),
 		   info.m_texRpath.toCString(),
-		   info.m_optimizeMeshes))
+		   info.m_optimizeMeshes,
+		   info.m_threadCount))
 	{
 		return 1;
 	}