|
@@ -113,6 +113,7 @@ bool noHierarchy_ = false;
|
|
|
bool noMaterials_ = false;
|
|
bool noMaterials_ = false;
|
|
|
bool noTextures_ = false;
|
|
bool noTextures_ = false;
|
|
|
bool noMaterialDiffuseColor_ = false;
|
|
bool noMaterialDiffuseColor_ = false;
|
|
|
|
|
+bool noEmptyNodes_ = false;
|
|
|
bool saveMaterialList_ = false;
|
|
bool saveMaterialList_ = false;
|
|
|
bool includeNonSkinningBones_ = false;
|
|
bool includeNonSkinningBones_ = false;
|
|
|
bool verboseLog_ = false;
|
|
bool verboseLog_ = false;
|
|
@@ -144,6 +145,7 @@ void BuildAndSaveAnimations(OutModel* model = 0);
|
|
|
|
|
|
|
|
void ExportScene(const String& outName, bool asPrefab);
|
|
void ExportScene(const String& outName, bool asPrefab);
|
|
|
void CollectSceneModels(OutScene& scene, aiNode* node);
|
|
void CollectSceneModels(OutScene& scene, aiNode* node);
|
|
|
|
|
+void CreateHierarchy(Scene* scene, aiNode* srcNode, HashMap<aiNode*, Node*>& nodeMapping);
|
|
|
Node* CreateSceneNode(Scene* scene, aiNode* srcNode, HashMap<aiNode*, Node*>& nodeMapping);
|
|
Node* CreateSceneNode(Scene* scene, aiNode* srcNode, HashMap<aiNode*, Node*>& nodeMapping);
|
|
|
void BuildAndSaveScene(OutScene& scene, bool asPrefab);
|
|
void BuildAndSaveScene(OutScene& scene, bool asPrefab);
|
|
|
|
|
|
|
@@ -228,6 +230,7 @@ void Run(const Vector<String>& arguments)
|
|
|
"-ns Do not create subdirectories for resources\n"
|
|
"-ns Do not create subdirectories for resources\n"
|
|
|
"-nz Do not create a zone and a directional light (scene mode only)\n"
|
|
"-nz Do not create a zone and a directional light (scene mode only)\n"
|
|
|
"-nf Do not fix infacing normals\n"
|
|
"-nf Do not fix infacing normals\n"
|
|
|
|
|
+ "-ne Do not save empty nodes (scene mode only)\n"
|
|
|
"-p <path> Set path for scene resources. Default is output file path\n"
|
|
"-p <path> Set path for scene resources. Default is output file path\n"
|
|
|
"-r <name> Use the named scene node as root node\n"
|
|
"-r <name> Use the named scene node as root node\n"
|
|
|
"-f <freq> Animation tick frequency to use if unspecified. Default 4800\n"
|
|
"-f <freq> Animation tick frequency to use if unspecified. Default 4800\n"
|
|
@@ -314,6 +317,10 @@ void Run(const Vector<String>& arguments)
|
|
|
noHierarchy_ = true;
|
|
noHierarchy_ = true;
|
|
|
break;
|
|
break;
|
|
|
|
|
|
|
|
|
|
+ case 'e':
|
|
|
|
|
+ noEmptyNodes_ = true;
|
|
|
|
|
+ break;
|
|
|
|
|
+
|
|
|
case 's':
|
|
case 's':
|
|
|
useSubdirs_ = false;
|
|
useSubdirs_ = false;
|
|
|
break;
|
|
break;
|
|
@@ -1258,6 +1265,13 @@ void CollectSceneModels(OutScene& scene, aiNode* node)
|
|
|
CollectSceneModels(scene, node->mChildren[i]);
|
|
CollectSceneModels(scene, node->mChildren[i]);
|
|
|
}
|
|
}
|
|
|
|
|
|
|
|
|
|
+void CreateHierarchy(Scene* scene, aiNode* srcNode, HashMap<aiNode*, Node*>& nodeMapping)
|
|
|
|
|
+{
|
|
|
|
|
+ CreateSceneNode(scene, srcNode, nodeMapping);
|
|
|
|
|
+ for (unsigned i = 0; i < srcNode->mNumChildren; ++i)
|
|
|
|
|
+ CreateHierarchy(scene, srcNode->mChildren[i], nodeMapping);
|
|
|
|
|
+}
|
|
|
|
|
+
|
|
|
Node* CreateSceneNode(Scene* scene, aiNode* srcNode, HashMap<aiNode*, Node*>& nodeMapping)
|
|
Node* CreateSceneNode(Scene* scene, aiNode* srcNode, HashMap<aiNode*, Node*>& nodeMapping)
|
|
|
{
|
|
{
|
|
|
if (nodeMapping.Contains(srcNode))
|
|
if (nodeMapping.Contains(srcNode))
|
|
@@ -1346,10 +1360,20 @@ void BuildAndSaveScene(OutScene& scene, bool asPrefab)
|
|
|
ResourceCache* cache = context_->GetSubsystem<ResourceCache>();
|
|
ResourceCache* cache = context_->GetSubsystem<ResourceCache>();
|
|
|
|
|
|
|
|
HashMap<aiNode*, Node*> nodeMapping;
|
|
HashMap<aiNode*, Node*> nodeMapping;
|
|
|
|
|
+
|
|
|
Node* outRootNode = 0;
|
|
Node* outRootNode = 0;
|
|
|
- if (asPrefab || !noHierarchy_)
|
|
|
|
|
|
|
+ if (asPrefab)
|
|
|
outRootNode = CreateSceneNode(outScene, rootNode_, nodeMapping);
|
|
outRootNode = CreateSceneNode(outScene, rootNode_, nodeMapping);
|
|
|
-
|
|
|
|
|
|
|
+ else
|
|
|
|
|
+ {
|
|
|
|
|
+ // If not saving as a prefab, associate the root node with the scene first to prevent unnecessary creation of a root
|
|
|
|
|
+ nodeMapping[rootNode_] = outScene;
|
|
|
|
|
+ }
|
|
|
|
|
+
|
|
|
|
|
+ // If is allowed to export empty nodes, export the full Assimp node hierarchy first
|
|
|
|
|
+ if (!noHierarchy_ && !noEmptyNodes_)
|
|
|
|
|
+ CreateHierarchy(outScene, rootNode_, nodeMapping);
|
|
|
|
|
+
|
|
|
// Create geometry nodes
|
|
// Create geometry nodes
|
|
|
for (unsigned i = 0; i < scene.nodes_.Size(); ++i)
|
|
for (unsigned i = 0; i < scene.nodes_.Size(); ++i)
|
|
|
{
|
|
{
|