improved COLLADA Physics export support, add render meshes, instance physics/visual scene
This commit is contained in:
@@ -1161,6 +1161,8 @@ domPhysics_scene* ColladaConverter::getDefaultPhysicsScene ()
|
|||||||
} else {
|
} else {
|
||||||
physicsScenesLib = (domLibrary_physics_scenes*)m_dom->createAndPlace (COLLADA_ELEMENT_LIBRARY_PHYSICS_SCENES);
|
physicsScenesLib = (domLibrary_physics_scenes*)m_dom->createAndPlace (COLLADA_ELEMENT_LIBRARY_PHYSICS_SCENES);
|
||||||
domPhysics_scene* physicsScene = daeSafeCast<domPhysics_scene>(physicsScenesLib->createAndPlace (COLLADA_ELEMENT_PHYSICS_SCENE));
|
domPhysics_scene* physicsScene = daeSafeCast<domPhysics_scene>(physicsScenesLib->createAndPlace (COLLADA_ELEMENT_PHYSICS_SCENE));
|
||||||
|
physicsScene->setId("Scene-Physics");
|
||||||
|
physicsScene->setName("MyPhysicsScene");
|
||||||
return physicsScene;
|
return physicsScene;
|
||||||
}
|
}
|
||||||
|
|
||||||
@@ -1184,6 +1186,8 @@ domVisual_scene* ColladaConverter::getDefaultVisualScene ()
|
|||||||
} else {
|
} else {
|
||||||
visualScenesLib = (domLibrary_visual_scenes*)m_dom->createAndPlace (COLLADA_ELEMENT_LIBRARY_VISUAL_SCENES);
|
visualScenesLib = (domLibrary_visual_scenes*)m_dom->createAndPlace (COLLADA_ELEMENT_LIBRARY_VISUAL_SCENES);
|
||||||
domVisual_scene* visualScene = daeSafeCast<domVisual_scene>(visualScenesLib->createAndPlace (COLLADA_ELEMENT_VISUAL_SCENE));
|
domVisual_scene* visualScene = daeSafeCast<domVisual_scene>(visualScenesLib->createAndPlace (COLLADA_ELEMENT_VISUAL_SCENE));
|
||||||
|
visualScene->setId("Scene");
|
||||||
|
visualScene->setName("MyScene");
|
||||||
return visualScene;
|
return visualScene;
|
||||||
}
|
}
|
||||||
|
|
||||||
@@ -1191,9 +1195,12 @@ domVisual_scene* ColladaConverter::getDefaultVisualScene ()
|
|||||||
}
|
}
|
||||||
|
|
||||||
|
|
||||||
void ColladaConverter::addConvexHull (btCollisionShape* shape, const char* nodeName)
|
void ColladaConverter::addConvexHull (btCollisionShape* shape, const char* convexNodeName)
|
||||||
{
|
{
|
||||||
btConvexHullShape* hullShape = (btConvexHullShape*)shape;
|
domGeometry* geoConcave = 0;
|
||||||
|
|
||||||
|
{
|
||||||
|
btConvexShape* hullShape = (btConvexShape*)shape;
|
||||||
btShapeHull* triHull = new btShapeHull (hullShape);
|
btShapeHull* triHull = new btShapeHull (hullShape);
|
||||||
if (triHull->buildHull (0.0) == false)
|
if (triHull->buildHull (0.0) == false)
|
||||||
{
|
{
|
||||||
@@ -1203,31 +1210,34 @@ void ColladaConverter::addConvexHull (btCollisionShape* shape, const char* nodeN
|
|||||||
|
|
||||||
domLibrary_geometries* geomLib = getDefaultGeomLib ();
|
domLibrary_geometries* geomLib = getDefaultGeomLib ();
|
||||||
|
|
||||||
domGeometry* geo = findGeometry (nodeName);
|
geoConcave = findGeometry (convexNodeName);
|
||||||
|
|
||||||
/* Already in the dom */
|
/* Already in the dom */
|
||||||
if (geo)
|
if (geoConcave)
|
||||||
return;
|
return;
|
||||||
|
|
||||||
geo = daeSafeCast<domGeometry>( geomLib->createAndPlace( COLLADA_ELEMENT_GEOMETRY ) );
|
geoConcave = daeSafeCast<domGeometry>( geomLib->createAndPlace( COLLADA_ELEMENT_GEOMETRY ) );
|
||||||
if ( geo == NULL )
|
if ( geoConcave == NULL )
|
||||||
{
|
{
|
||||||
printf("Failed to create the geometry element\n");
|
printf("Failed to create the geometry element\n");
|
||||||
return;
|
return;
|
||||||
}
|
}
|
||||||
//set it's id
|
char nodeName[256];
|
||||||
geo->setId( nodeName );
|
sprintf(nodeName,"RenderMesh%s",convexNodeName);
|
||||||
geo->setName ( nodeName);
|
|
||||||
|
|
||||||
domConvex_mesh *convexMesh = daeSafeCast<domConvex_mesh>( geo->createAndPlace( COLLADA_ELEMENT_CONVEX_MESH ) );
|
//set it's id
|
||||||
if ( convexMesh == NULL )
|
geoConcave->setId( nodeName );
|
||||||
|
geoConcave->setName ( nodeName);
|
||||||
|
|
||||||
|
domMesh *mesh = daeSafeCast<domMesh>( geoConcave->createAndPlace( COLLADA_ELEMENT_MESH ) );
|
||||||
|
if ( mesh == NULL )
|
||||||
{
|
{
|
||||||
printf("Failed to create the mesh element\n");
|
printf("Failed to create the mesh element\n");
|
||||||
return;
|
return;
|
||||||
}
|
}
|
||||||
|
|
||||||
//we will need 3 sources for this mesh. positions, normals, and UVs
|
//we will need 3 sources for this mesh. positions, normals, and UVs
|
||||||
domSource *positionSrc = daeSafeCast<domSource>( convexMesh->createAndPlace( COLLADA_ELEMENT_SOURCE ) );
|
domSource *positionSrc = daeSafeCast<domSource>( mesh->createAndPlace( COLLADA_ELEMENT_SOURCE ) );
|
||||||
if (!positionSrc)
|
if (!positionSrc)
|
||||||
{
|
{
|
||||||
printf("Failed to create position source\n");
|
printf("Failed to create position source\n");
|
||||||
@@ -1274,7 +1284,7 @@ void ColladaConverter::addConvexHull (btCollisionShape* shape, const char* nodeN
|
|||||||
param->setName( "Z" );
|
param->setName( "Z" );
|
||||||
param->setType( "float" );
|
param->setType( "float" );
|
||||||
|
|
||||||
domVertices *verts = daeSafeCast<domVertices>( convexMesh->createAndPlace( COLLADA_ELEMENT_VERTICES ) );
|
domVertices *verts = daeSafeCast<domVertices>( mesh->createAndPlace( COLLADA_ELEMENT_VERTICES ) );
|
||||||
srcName = std::string(nodeName) + std::string("-vertices");
|
srcName = std::string(nodeName) + std::string("-vertices");
|
||||||
verts->setId( srcName.c_str() );
|
verts->setId( srcName.c_str() );
|
||||||
domInputLocal *inputLocal = daeSafeCast<domInputLocal>( verts->createAndPlace( COLLADA_ELEMENT_INPUT ) );
|
domInputLocal *inputLocal = daeSafeCast<domInputLocal>( verts->createAndPlace( COLLADA_ELEMENT_INPUT ) );
|
||||||
@@ -1283,7 +1293,7 @@ void ColladaConverter::addConvexHull (btCollisionShape* shape, const char* nodeN
|
|||||||
uri.resolveURI();
|
uri.resolveURI();
|
||||||
inputLocal->setSource( uri );
|
inputLocal->setSource( uri );
|
||||||
|
|
||||||
domTriangles *tris = daeSafeCast<domTriangles>( convexMesh->createAndPlace( COLLADA_ELEMENT_TRIANGLES ) );
|
domTriangles *tris = daeSafeCast<domTriangles>( mesh->createAndPlace( COLLADA_ELEMENT_TRIANGLES ) );
|
||||||
tris->setCount( triHull->numTriangles() );
|
tris->setCount( triHull->numTriangles() );
|
||||||
domInputLocalOffset *ilo = daeSafeCast<domInputLocalOffset>( tris->createAndPlace( COLLADA_ELEMENT_INPUT ) );
|
domInputLocalOffset *ilo = daeSafeCast<domInputLocalOffset>( tris->createAndPlace( COLLADA_ELEMENT_INPUT ) );
|
||||||
ilo->setSemantic( COMMON_PROFILE_INPUT_VERTEX );
|
ilo->setSemantic( COMMON_PROFILE_INPUT_VERTEX );
|
||||||
@@ -1307,6 +1317,46 @@ void ColladaConverter::addConvexHull (btCollisionShape* shape, const char* nodeN
|
|||||||
}
|
}
|
||||||
|
|
||||||
delete triHull;
|
delete triHull;
|
||||||
|
}
|
||||||
|
{
|
||||||
|
domLibrary_geometries* geomLib = getDefaultGeomLib ();
|
||||||
|
domGeometry* geo = daeSafeCast<domGeometry>( geomLib->createAndPlace( COLLADA_ELEMENT_GEOMETRY ) );
|
||||||
|
|
||||||
|
if ( geo == NULL )
|
||||||
|
{
|
||||||
|
printf("Failed to create the geometry element\n");
|
||||||
|
return;
|
||||||
|
}
|
||||||
|
|
||||||
|
//set it's id
|
||||||
|
geo->setId( convexNodeName );
|
||||||
|
geo->setName ( convexNodeName);
|
||||||
|
//<convex_mesh convex_hull_of="Cube_008"/>
|
||||||
|
domConvex_mesh* meshRef = daeSafeCast<domConvex_mesh>( geo->createAndPlace( COLLADA_ELEMENT_CONVEX_MESH ) );
|
||||||
|
|
||||||
|
if ( meshRef == NULL )
|
||||||
|
{
|
||||||
|
printf("Failed to create the mesh element\n");
|
||||||
|
return;
|
||||||
|
}
|
||||||
|
|
||||||
|
daeURI uri;
|
||||||
|
uri.setElement( geoConcave);
|
||||||
|
uri.resolveURI();
|
||||||
|
|
||||||
|
|
||||||
|
meshRef->setConvex_hull_of(uri);
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
|
}
|
||||||
|
|
||||||
|
|
||||||
}
|
}
|
||||||
|
|
||||||
void
|
void
|
||||||
@@ -1457,6 +1507,7 @@ void ColladaConverter::buildShape (btCollisionShape* shape, void* collada_shape,
|
|||||||
{
|
{
|
||||||
case BOX_SHAPE_PROXYTYPE:
|
case BOX_SHAPE_PROXYTYPE:
|
||||||
{
|
{
|
||||||
|
addConvexHull (shape, shapeName);
|
||||||
btBoxShape* bs = (btBoxShape*)shape;
|
btBoxShape* bs = (btBoxShape*)shape;
|
||||||
btVector3 halfe = bs->getHalfExtentsWithMargin();
|
btVector3 halfe = bs->getHalfExtentsWithMargin();
|
||||||
domBox* box = (domBox*)colladaShape->createAndPlace (COLLADA_ELEMENT_BOX);
|
domBox* box = (domBox*)colladaShape->createAndPlace (COLLADA_ELEMENT_BOX);
|
||||||
@@ -1466,6 +1517,7 @@ void ColladaConverter::buildShape (btCollisionShape* shape, void* collada_shape,
|
|||||||
break;
|
break;
|
||||||
case SPHERE_SHAPE_PROXYTYPE:
|
case SPHERE_SHAPE_PROXYTYPE:
|
||||||
{
|
{
|
||||||
|
addConvexHull (shape, shapeName);
|
||||||
btSphereShape* ss = (btSphereShape*)shape;
|
btSphereShape* ss = (btSphereShape*)shape;
|
||||||
domSphere* sphere = (domSphere*)colladaShape->createAndPlace (COLLADA_ELEMENT_SPHERE);
|
domSphere* sphere = (domSphere*)colladaShape->createAndPlace (COLLADA_ELEMENT_SPHERE);
|
||||||
domSphere::domRadius* radius = (domSphere::domRadius*)sphere->createAndPlace (COLLADA_ELEMENT_RADIUS);
|
domSphere::domRadius* radius = (domSphere::domRadius*)sphere->createAndPlace (COLLADA_ELEMENT_RADIUS);
|
||||||
@@ -1478,7 +1530,9 @@ void ColladaConverter::buildShape (btCollisionShape* shape, void* collada_shape,
|
|||||||
domCylinder* cylinder = (domCylinder*)colladaShape->createAndPlace (COLLADA_ELEMENT_CYLINDER);
|
domCylinder* cylinder = (domCylinder*)colladaShape->createAndPlace (COLLADA_ELEMENT_CYLINDER);
|
||||||
domCylinder::domRadius* radius = (domCylinder::domRadius*)cylinder->createAndPlace (COLLADA_ELEMENT_RADIUS);
|
domCylinder::domRadius* radius = (domCylinder::domRadius*)cylinder->createAndPlace (COLLADA_ELEMENT_RADIUS);
|
||||||
domCylinder::domHeight* height = (domCylinder::domHeight*)cylinder->createAndPlace (COLLADA_ELEMENT_HEIGHT);
|
domCylinder::domHeight* height = (domCylinder::domHeight*)cylinder->createAndPlace (COLLADA_ELEMENT_HEIGHT);
|
||||||
radius->setValue (cs->getRadius());
|
domFloat2 radius2;
|
||||||
|
radius2.set2(cs->getRadius(),cs->getRadius());
|
||||||
|
radius->setValue (radius2);
|
||||||
height->setValue (cs->getHalfExtentsWithMargin()[1] * 1.0);
|
height->setValue (cs->getHalfExtentsWithMargin()[1] * 1.0);
|
||||||
}
|
}
|
||||||
break;
|
break;
|
||||||
@@ -1644,6 +1698,21 @@ void ColladaConverter::addNode (btRigidBody* rb, const char* nodeName, const cha
|
|||||||
rotation->getValue().set(3,quat.getAngle()*SIMD_DEGS_PER_RAD);
|
rotation->getValue().set(3,quat.getAngle()*SIMD_DEGS_PER_RAD);
|
||||||
}
|
}
|
||||||
|
|
||||||
|
domInstance_geometryRef gr = daeSafeCast<domInstance_geometry>(node->createAndPlace(COLLADA_ELEMENT_INSTANCE_GEOMETRY));
|
||||||
|
|
||||||
|
char shapeURL[512];
|
||||||
|
snprintf(&shapeURL[0], 512, "#%s", shapeName);
|
||||||
|
gr->setUrl(shapeURL);
|
||||||
|
gr->createAndPlace(COLLADA_ELEMENT_BIND_MATERIAL)->createAndPlace(COLLADA_ELEMENT_TECHNIQUE_COMMON);
|
||||||
|
|
||||||
|
/*<instance_geometry url="#Mesh_001">
|
||||||
|
<bind_material>
|
||||||
|
<technique_common/>
|
||||||
|
</bind_material>
|
||||||
|
</instance_geometry>
|
||||||
|
*/
|
||||||
|
|
||||||
|
|
||||||
}
|
}
|
||||||
|
|
||||||
void ColladaConverter::addConstraint (btTypedConstraint* constraint, const char* constraintName)
|
void ColladaConverter::addConstraint (btTypedConstraint* constraint, const char* constraintName)
|
||||||
@@ -2167,7 +2236,25 @@ void ColladaConverter::syncOrAddRigidBody (btRigidBody* body)
|
|||||||
|
|
||||||
printf("Adding %s to COLLADA DOM.\n", nodeName);
|
printf("Adding %s to COLLADA DOM.\n", nodeName);
|
||||||
|
|
||||||
addNode (body, nodeName, shapeName);
|
switch (shape->getShapeType())
|
||||||
|
{
|
||||||
|
case BOX_SHAPE_PROXYTYPE:
|
||||||
|
case SPHERE_SHAPE_PROXYTYPE:
|
||||||
|
case CYLINDER_SHAPE_PROXYTYPE:
|
||||||
|
case CONVEX_TRIANGLEMESH_SHAPE_PROXYTYPE:
|
||||||
|
case CONVEX_HULL_SHAPE_PROXYTYPE:
|
||||||
|
{
|
||||||
|
char concaveShapeName[256];
|
||||||
|
sprintf(concaveShapeName,"RenderMesh%s",shapeName);
|
||||||
|
addNode (body, nodeName, concaveShapeName);
|
||||||
|
break;
|
||||||
|
}
|
||||||
|
default:
|
||||||
|
{
|
||||||
|
addNode (body, nodeName, shapeName);
|
||||||
|
}
|
||||||
|
};
|
||||||
|
|
||||||
addMaterial (body, nodeName);
|
addMaterial (body, nodeName);
|
||||||
addRigidBody (body, nodeName, shapeName);
|
addRigidBody (body, nodeName, shapeName);
|
||||||
addRigidBodyInstance (body, nodeName);
|
addRigidBodyInstance (body, nodeName);
|
||||||
@@ -2253,6 +2340,27 @@ bool ColladaConverter::save(const char* filename)
|
|||||||
domTargetableFloat3Ref g = daeSafeCast<domTargetableFloat3>(common->createAndPlace (COLLADA_ELEMENT_GRAVITY));
|
domTargetableFloat3Ref g = daeSafeCast<domTargetableFloat3>(common->createAndPlace (COLLADA_ELEMENT_GRAVITY));
|
||||||
btVector3 btG = getGravity ();
|
btVector3 btG = getGravity ();
|
||||||
g->getValue().set3 (btG[0], btG[1], btG[2]);
|
g->getValue().set3 (btG[0], btG[1], btG[2]);
|
||||||
|
|
||||||
|
|
||||||
|
if (!m_dom->getScene())
|
||||||
|
{
|
||||||
|
domCOLLADA::domScene* scene = daeSafeCast<domCOLLADA::domScene>( m_dom->createAndPlace( COLLADA_ELEMENT_SCENE ) );
|
||||||
|
{
|
||||||
|
domInstanceWithExtra* ivs = daeSafeCast<domInstanceWithExtra>( scene->createAndPlace( COLLADA_ELEMENT_INSTANCE_VISUAL_SCENE ) );
|
||||||
|
daeURI uri;
|
||||||
|
uri.setElement( getDefaultVisualScene() );
|
||||||
|
uri.resolveURI();
|
||||||
|
ivs->setUrl( uri );
|
||||||
|
}
|
||||||
|
{
|
||||||
|
domInstanceWithExtra* ips = daeSafeCast<domInstanceWithExtra>( scene->createAndPlace( COLLADA_ELEMENT_INSTANCE_PHYSICS_SCENE ) );
|
||||||
|
daeURI uri;
|
||||||
|
uri.setElement( getDefaultPhysicsScene() );
|
||||||
|
uri.resolveURI();
|
||||||
|
ips->setUrl( uri );
|
||||||
|
}
|
||||||
|
|
||||||
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
/* Dump the scene */
|
/* Dump the scene */
|
||||||
|
|||||||
Reference in New Issue
Block a user