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