added initial Collada 1.4 Physics support

This commit is contained in:
ejcoumans
2006-06-01 03:27:01 +00:00
parent 5299170dca
commit b5d0520c58
11 changed files with 3430 additions and 2683 deletions

View File

@@ -91,6 +91,36 @@ FUStatus FCDGeometry::LoadFromXML(xmlNode* geometryNode)
status.AppendStatus(s->LoadFromXML(child));
break;
}
else if (IsEquivalent(child->name, DAE_CONVEX_MESH_ELEMENT))
{
//several cases can exist here...
//wait for fixed version of FCollada?
//assume <convex_hull_of> and do instantiate?
// Create a new mesh
FCDGeometryMesh* m = CreateMesh();
m->m_convex = true;
FUUri url = ReadNodeUrl(child,"convex_hull_of");
if (!url.prefix.empty())
{
FCDGeometry* entity = GetDocument()->FindGeometry(url.prefix);
if (entity)
{
printf("found convex_mesh%s\n",url.prefix);
//quick hack
this->mesh = entity->GetMesh();
mesh->m_convex = true;
}
}
//status.AppendStatus(m->LoadFromXML(child));
break;
}
else
{
return status.Fail(FS("Unknown child in <geometry> with id: ") + TO_FSTRING(GetDaeId()), child->line);

View File

@@ -15,7 +15,7 @@
#include "FCDocument/FCDEntity.h"
#include "FCDocument/FCDGeometry.h"
#include "FCDocument/FCDGeometryInstance.h"
#include "FCDocument/FCDGeometryMesh.h"
#include "FCDocument/FCDGeometryMesh.h"
#include "FCDocument/FCDGeometryPolygons.h"
#include "FCDocument/FCDMaterialInstance.h"
#include "FUtils/FUDaeParser.h"
@@ -23,38 +23,38 @@
using namespace FUDaeParser;
using namespace FUDaeWriter;
// Parasitic: Write out the instantiation information to the xml node tree
xmlNode* FCDEntityInstance::WriteToXML(xmlNode* parentNode) const
{
xmlNode* instanceNode = NULL;
if (entity != NULL)
{
const char* instanceEntityName;
switch (entity->GetType())
{
case FCDEntity::ANIMATION: instanceEntityName = DAE_INSTANCE_ANIMATION_ELEMENT; break;
case FCDEntity::CAMERA: instanceEntityName = DAE_INSTANCE_CAMERA_ELEMENT; break;
case FCDEntity::CONTROLLER: instanceEntityName = DAE_INSTANCE_CONTROLLER_ELEMENT; break;
case FCDEntity::EFFECT: instanceEntityName = DAE_INSTANCE_EFFECT_ELEMENT; break;
case FCDEntity::GEOMETRY: instanceEntityName = DAE_INSTANCE_GEOMETRY_ELEMENT; break;
case FCDEntity::LIGHT: instanceEntityName = DAE_INSTANCE_LIGHT_ELEMENT; break;
case FCDEntity::MATERIAL: instanceEntityName = DAE_INSTANCE_MATERIAL_ELEMENT; break;
case FCDEntity::PHYSICS_MODEL: instanceEntityName = DAE_INSTANCE_PHYSICS_MODEL_ELEMENT; break;
case FCDEntity::PHYSICS_RIGID_BODY: instanceEntityName = DAE_INSTANCE_RIGID_BODY_ELEMENT; break;
case FCDEntity::PHYSICS_RIGID_CONSTRAINT: instanceEntityName = DAE_INSTANCE_RIGID_CONSTRAINT_ELEMENT; break;
case FCDEntity::SCENE_NODE: instanceEntityName = DAE_INSTANCE_NODE_ELEMENT; break;
case FCDEntity::ANIMATION_CLIP:
case FCDEntity::ENTITY:
case FCDEntity::IMAGE:
case FCDEntity::TEXTURE:
default: instanceEntityName = DAEERR_UNKNOWN_ELEMENT;
}
instanceNode = AddChild(parentNode, instanceEntityName);
AddAttribute(instanceNode, DAE_URL_ATTRIBUTE, string("#") + entity->GetDaeId());
}
return instanceNode;
// Parasitic: Write out the instantiation information to the xml node tree
xmlNode* FCDEntityInstance::WriteToXML(xmlNode* parentNode) const
{
xmlNode* instanceNode = NULL;
if (entity != NULL)
{
const char* instanceEntityName;
switch (entity->GetType())
{
case FCDEntity::ANIMATION: instanceEntityName = DAE_INSTANCE_ANIMATION_ELEMENT; break;
case FCDEntity::CAMERA: instanceEntityName = DAE_INSTANCE_CAMERA_ELEMENT; break;
case FCDEntity::CONTROLLER: instanceEntityName = DAE_INSTANCE_CONTROLLER_ELEMENT; break;
case FCDEntity::EFFECT: instanceEntityName = DAE_INSTANCE_EFFECT_ELEMENT; break;
case FCDEntity::GEOMETRY: instanceEntityName = DAE_INSTANCE_GEOMETRY_ELEMENT; break;
case FCDEntity::LIGHT: instanceEntityName = DAE_INSTANCE_LIGHT_ELEMENT; break;
case FCDEntity::MATERIAL: instanceEntityName = DAE_INSTANCE_MATERIAL_ELEMENT; break;
case FCDEntity::PHYSICS_MODEL: instanceEntityName = DAE_INSTANCE_PHYSICS_MODEL_ELEMENT; break;
case FCDEntity::PHYSICS_RIGID_BODY: instanceEntityName = DAE_INSTANCE_RIGID_BODY_ELEMENT; break;
case FCDEntity::PHYSICS_RIGID_CONSTRAINT: instanceEntityName = DAE_INSTANCE_RIGID_CONSTRAINT_ELEMENT; break;
case FCDEntity::SCENE_NODE: instanceEntityName = DAE_INSTANCE_NODE_ELEMENT; break;
case FCDEntity::ANIMATION_CLIP:
case FCDEntity::ENTITY:
case FCDEntity::IMAGE:
case FCDEntity::TEXTURE:
default: instanceEntityName = DAEERR_UNKNOWN_ELEMENT;
}
instanceNode = AddChild(parentNode, instanceEntityName);
AddAttribute(instanceNode, DAE_URL_ATTRIBUTE, string("#") + entity->GetDaeId());
}
return instanceNode;
}
FCDGeometryInstance::FCDGeometryInstance(FCDocument* document, FCDEntity* entity) : FCDEntityInstance(document, entity)
@@ -150,19 +150,19 @@ FUStatus FCDGeometryInstance::LoadFromXML(xmlNode* instanceNode)
return status;
}
// Write out the instantiation information to the xml node tree
xmlNode* FCDGeometryInstance::WriteToXML(xmlNode* parentNode) const
{
xmlNode* instanceNode = FCDEntityInstance::WriteToXML(parentNode);
if (!materials.empty())
{
xmlNode* bindMaterialNode = AddChild(instanceNode, DAE_BINDMATERIAL_ELEMENT);
xmlNode* techniqueCommonNode = AddChild(bindMaterialNode, DAE_TECHNIQUE_COMMON_ELEMENT);
for (FCDMaterialInstanceList::const_iterator itM = materials.begin(); itM != materials.end(); ++itM)
{
(*itM)->WriteToXML(techniqueCommonNode);
}
}
return instanceNode;
}
// Write out the instantiation information to the xml node tree
xmlNode* FCDGeometryInstance::WriteToXML(xmlNode* parentNode) const
{
xmlNode* instanceNode = FCDEntityInstance::WriteToXML(parentNode);
if (!materials.empty())
{
xmlNode* bindMaterialNode = AddChild(instanceNode, DAE_BINDMATERIAL_ELEMENT);
xmlNode* techniqueCommonNode = AddChild(bindMaterialNode, DAE_TECHNIQUE_COMMON_ELEMENT);
for (FCDMaterialInstanceList::const_iterator itM = materials.begin(); itM != materials.end(); ++itM)
{
(*itM)->WriteToXML(techniqueCommonNode);
}
}
return instanceNode;
}

View File

@@ -23,6 +23,7 @@ using namespace FUDaeWriter;
FCDGeometryMesh::FCDGeometryMesh(FCDocument* document, FCDGeometry* _parent) : FCDObject(document, "FCDGeometryMesh")
{
m_convex = false;
parent = _parent;
faceVertexCount = faceCount = holeCount = 0;
isDoubleSided = true;
@@ -232,7 +233,7 @@ FCDGeometryMesh* FCDGeometryMesh::Clone(FloatList& newPositions, uint32 newPosit
FUStatus FCDGeometryMesh::LoadFromXML(xmlNode* meshNode)
{
FUStatus status;
// Read in the data sources
xmlNodeList sourceDataNodes;
FindChildrenByType(meshNode, DAE_SOURCE_ELEMENT, sourceDataNodes);

View File

@@ -204,6 +204,8 @@ public:
@param parentNode The COLLADA XML parent node in which to insert the geometric mesh.
@return The created \<mesh\> element XML tree node. */
xmlNode* WriteToXML(xmlNode* parentNode) const;
bool m_convex;
};
#endif // _FCD_GEOMETRY_MESH_H_