diff --git a/NifExport/Coll.cpp b/NifExport/Coll.cpp index 10ace05330b0f56884fc32fb844e102752a9db1c..0ab1167c6753628a689ff2a08e84e0a668f21c55 100755 --- a/NifExport/Coll.cpp +++ b/NifExport/Coll.cpp @@ -242,8 +242,10 @@ bool Exporter::makeCollisionHierarchy(NiNodeRef &parent, INode *node, TimeValue Exporter::Result Exporter::exportCollision(NiNodeRef &parent, INode *node) { // marked as collision? + bool coll = npIsCollision(node); + NiNodeRef newParent; - if (npIsCollision(node)) + if (coll) { /* NiNodeRef n = DynamicCast<NiNode>(CreateBlock("NiNode")); parent->AddChild(DynamicCast<NiAVObject>(n)); @@ -279,7 +281,7 @@ Exporter::Result Exporter::exportCollision(NiNodeRef &parent, INode *node) newParent->SetCollisionObject(DynamicCast<NiCollisionObject>(co)); } else - if (node->IsGroupHead()) + if (isCollisionGroup(node)) { newParent = makeNode(parent, node); } else diff --git a/NifExport/Exporter.h b/NifExport/Exporter.h index 3154d3b0a57327c7e3692a329e01ec953038edc2..a654cf2c3f0bedacaebee5ddd7099c0f1f558867 100755 --- a/NifExport/Exporter.h +++ b/NifExport/Exporter.h @@ -88,6 +88,10 @@ private: BitmapTex *getTexture(Mtl *mtl); void getTextureMatrix(Matrix3 &mat, Mtl *mtl); NiNodeRef makeNode(NiNodeRef &parent, INode *maxNode, bool local=true); + // returns true if the node contains collision objects + bool isCollisionGroup(INode *maxNode, bool root=true); + // returns true if the node contains meshes + bool isMeshGroup(INode *maxNode, bool root=true); /* tristrips */ void strippify(TriStrips &strips, vector<Vector3> &verts, vector<Vector3> &norms, const Triangles &tris); diff --git a/NifExport/Mesh.cpp b/NifExport/Mesh.cpp index 2f7af6f2f6809c88202571043cddfb285867e960..54e9fb973a149de5f86c598f2f2dab29a381de6f 100755 --- a/NifExport/Mesh.cpp +++ b/NifExport/Mesh.cpp @@ -43,28 +43,14 @@ void FPUtility::GetAlphaVal(void) Exporter::Result Exporter::exportMeshes(NiNodeRef &parent, INode *node) { bool coll = npIsCollision(node); - if ((coll && !mExportCollision) || - (node->IsHidden() && !mExportHidden && !coll) || - (mSelectedOnly && !node->Selected())) + if (coll || (node->IsHidden() && !mExportHidden && !coll) || (mSelectedOnly && !node->Selected())) return Skip; NiNodeRef newParent; TimeValue t = 0; ObjectState os = node->EvalWorldState(t); - if (!coll && os.obj && os.obj->SuperClassID()==GEOMOBJECT_CLASS_ID) + if (os.obj && os.obj->SuperClassID()==GEOMOBJECT_CLASS_ID) { -/* newParent = DynamicCast<NiNode>(CreateBlock("NiNode")); - parent->AddChild(DynamicCast<NiAVObject>(newParent)); - - Matrix33 rot; - Vector3 trans; - nodeTransform(rot, trans, node, t); - - newParent->SetLocalRotation(rot); - newParent->SetLocalTranslation(trans); - string name = (char*)node->GetName(); - newParent->SetName(name); -*/ newParent = makeNode(parent, node); Result result; @@ -73,20 +59,10 @@ Exporter::Result Exporter::exportMeshes(NiNodeRef &parent, INode *node) return result; } else - if (node->IsGroupHead()) + if (isMeshGroup(node)) { newParent = makeNode(parent, node); -/* newParent = DynamicCast<NiNode>(CreateBlock("NiNode")); - Matrix33 rot; - Vector3 trans; - nodeTransform(rot, trans, node, t); - newParent->SetLocalRotation(rot); - newParent->SetLocalTranslation(trans); - string name = (char*)node->GetName(); - newParent->SetName(name); - - parent->AddChild(DynamicCast<NiAVObject>(newParent)); -*/ + } else newParent = parent; diff --git a/NifExport/Util.cpp b/NifExport/Util.cpp index 2c072ce2a322886249fbfaca6bf035202d4fe71c..930b0ca58c211383b3c3e0309a4fb0fd7be433b3 100755 --- a/NifExport/Util.cpp +++ b/NifExport/Util.cpp @@ -105,3 +105,50 @@ NiNodeRef Exporter::makeNode(NiNodeRef &parent, INode *maxNode, bool local) parent->AddChild(DynamicCast<NiAVObject>(node)); return node; } + +bool Exporter::isCollisionGroup(INode *maxNode, bool root) +{ + if (root) + { + if (!maxNode->IsGroupHead()) + return false; + } else + { + if (npIsCollision(maxNode)) + return true; + } + + for (int i=0; i<maxNode->NumberOfChildren(); i++) + { + if (isCollisionGroup(maxNode->GetChildNode(i), false)) + return true; + } + + return false; +} + +bool Exporter::isMeshGroup(INode *maxNode, bool root) +{ + if (root) + { + if (!maxNode->IsGroupHead()) + return false; + } else + { + if (!npIsCollision(maxNode)) + { + TimeValue t = 0; + ObjectState os = maxNode->EvalWorldState(t); + if (os.obj->SuperClassID() == GEOMOBJECT_CLASS_ID) + return true; + } + } + + for (int i=0; i<maxNode->NumberOfChildren(); i++) + { + if (isMeshGroup(maxNode->GetChildNode(i), false)) + return true; + } + + return false; +}