From 244fb632a388b3152069a5081622651be62938e9 Mon Sep 17 00:00:00 2001 From: Gundalf <gundalf01@users.sourceforge.net> Date: Wed, 28 Jun 2006 18:59:11 +0000 Subject: [PATCH] Fixed groups --- NifExport/Coll.cpp | 6 ++++-- NifExport/Exporter.h | 4 ++++ NifExport/Mesh.cpp | 32 ++++-------------------------- NifExport/Util.cpp | 47 ++++++++++++++++++++++++++++++++++++++++++++ 4 files changed, 59 insertions(+), 30 deletions(-) diff --git a/NifExport/Coll.cpp b/NifExport/Coll.cpp index 10ace05..0ab1167 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 3154d3b..a654cf2 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 2f7af6f..54e9fb9 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 2c072ce..930b0ca 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; +} -- GitLab