updated COLLADA 'physics snapshot' export

This commit is contained in:
ejcoumans
2006-07-26 07:25:07 +00:00
parent 44ff483ad6
commit 750af5c197

View File

@@ -142,11 +142,7 @@ SimdTransform startTransforms[maxNumObjects];
//quick test to export new position into a COLLADA .dae file
#ifndef USE_FCOLLADA
domTranslateRef translateRef[maxNumObjects];
domRotate_Array* rotateArray[maxNumObjects];
domMatrixRef matrixRef[maxNumObjects];
domNodeRef colladadomNodes[maxNumObjects];
#endif //USE_FCOLLADA
DefaultMotionState ms[maxNumObjects];
@@ -930,10 +926,7 @@ int main(int argc,char** argv)
for (int i=0;i<maxNumObjects;i++)
{
translateRef[i] = 0;
rotateArray[i] = 0;
//rotateRef[i] = 0;
matrixRef[i] = 0;
colladadomNodes[i] = 0;
}
}
@@ -1030,7 +1023,7 @@ int main(int argc,char** argv)
printf("No Triangles or Polygons found int Geometry %s \n", lib->getId() );
} else
{
printf("Found mesh geometry: numTriangleGroups:%i numPolygonGroups:%i\n",numTriangleGroups,numPolygonGroups);
printf("Found mesh geometry (%s): numTriangleGroups:%i numPolygonGroups:%i\n",lib->getId(),numTriangleGroups,numPolygonGroups);
}
@@ -1042,6 +1035,7 @@ int main(int argc,char** argv)
// Find out how many groups we need to allocate space for
int numTriangleGroups = (int)convexMeshElement->getTriangles_array().getCount();
int numPolygonGroups = (int)convexMeshElement->getPolygons_array().getCount();
int totalGroups = numTriangleGroups + numPolygonGroups;
if (totalGroups == 0)
{
@@ -1115,13 +1109,13 @@ int main(int argc,char** argv)
printf("mass = %f, isDynamics %i\n",mass,isDynamics);
if (bodyName)
if (bodyName && model)
{
//try to find the rigid body
for (int r=0;r<model->getRigid_body_array().getCount();r++)
{
domRigid_bodyRef rigidBodyRef = model->getRigid_body_array()[r];
if (!strcmp(rigidBodyRef->getName(),bodyName))
if (rigidBodyRef->getSid() && !strcmp(rigidBodyRef->getSid(),bodyName))
{
const domRigid_body::domTechnique_commonRef techniqueRef = rigidBodyRef->getTechnique_common();
@@ -1437,12 +1431,15 @@ int main(int argc,char** argv)
//////////////////////
}
if (colShape)
{
//The 'target' points to a graphics element/node, which contains the start (world) transform
daeElementRef elem = rigidbodyRef->getTarget().getElement();
if (elem)
{
//The 'target' points to a graphics element/node, which contains the start (world) transform
daeElementRef elem = rigidbodyRef->getTarget().getElement();
if (elem)
{
domNodeRef node = *(domNodeRef*)&elem;
colladadomNodes[numObjects] = node;
//find transform of the node that this rigidbody maps to
@@ -1461,10 +1458,7 @@ if (elem)
}
if (node->getRotate_array().getCount())
{
rotateArray[numObjects] = &node->getRotate_array();
}
for (i=0;i<node->getRotate_array().getCount();i++)
{
@@ -1477,8 +1471,8 @@ if (elem)
for (i=0;i<node->getTranslate_array().getCount();i++)
{
translateRef[numObjects] = node->getTranslate_array()[i];
domFloat3 fl3 = translateRef[numObjects]->getValue();
domTranslateRef translateRef = node->getTranslate_array()[i];
domFloat3 fl3 = translateRef->getValue();
startTransform.getOrigin() += SimdVector3(fl3.get(0),fl3.get(1),fl3.get(2));
}
@@ -1489,11 +1483,10 @@ if (elem)
startScale = SimdVector3(fl3.get(0),fl3.get(1),fl3.get(2));
}
}
}
if (colShape)
{
CreatePhysicsObject(isDynamics,mass,startTransform,colShape);
}
@@ -1851,11 +1844,25 @@ void clientKeyboard(unsigned char key, int x, int y)
{
for (int i=0;i<numObjects;i++)
{
if (translateRef[i])
assert(colladadomNodes[i]);
if (!colladadomNodes[i]->getTranslate_array().getCount())
{
domTranslate* transl = (domTranslate*) colladadomNodes[i]->createAndPlace("translate");
transl->getValue().append(0.);
transl->getValue().append(0.);
transl->getValue().append(0.);
}
while (colladadomNodes[i]->getTranslate_array().getCount() > 1)
{
colladadomNodes[i]->removeFromParent(colladadomNodes[i]->getTranslate_array().get(1));
//colladadomNodes[i]->getTranslate_array().removeIndex(1);
}
{
float np[3];
domFloat3 newPos = translateRef[i]->getValue();
domFloat3 newPos = colladadomNodes[i]->getTranslate_array().get(0)->getValue();
physObjects[i]->GetMotionState()->getWorldPosition(
np[0],
np[1],
@@ -1863,22 +1870,28 @@ void clientKeyboard(unsigned char key, int x, int y)
newPos.set(0,np[0]);
newPos.set(1,np[1]);
newPos.set(2,np[2]);
translateRef[i]->setValue(newPos);
colladadomNodes[i]->getTranslate_array().get(0)->setValue(newPos);
}
domRotate_Array* ptr = rotateArray[i];
if (ptr)
if (!colladadomNodes[i]->getRotate_array().getCount())
{
//it is not easy to just clear/remove values, so we reset the rotation for all, except the first one
//make all zero-rotations, except for first
for (int i=0;i<ptr->getCount();i++)
{
ptr->get(i)->getValue().set(0,1);
ptr->get(i)->getValue().set(1,0);
ptr->get(i)->getValue().set(2,0);
ptr->get(i)->getValue().set(3,0);
domRotate* rot = (domRotate*)colladadomNodes[i]->createAndPlace("rotate");
rot->getValue().append(1.0);
rot->getValue().append(0.0);
rot->getValue().append(0.0);
rot->getValue().append(0.0);
}
while (colladadomNodes[i]->getRotate_array().getCount()>1)
{
colladadomNodes[i]->removeFromParent(colladadomNodes[i]->getRotate_array().get(1));
//colladadomNodes[i]->getRotate_array().removeIndex(1);
}
{
float quatIma0,quatIma1,quatIma2,quatReal;
SimdQuaternion quat = physObjects[i]->GetRigidBody()->getCenterOfMassTransform().getRotation();
@@ -1890,21 +1903,21 @@ void clientKeyboard(unsigned char key, int x, int y)
axis = SimdVector3(1.f,0.f,0.f);
else
axis /= SimdSqrt(len);
ptr->get(0)->getValue().set(0,axis[0]);
ptr->get(0)->getValue().set(1,axis[1]);
ptr->get(0)->getValue().set(2,axis[2]);
ptr->get(0)->getValue().set(3,quat.getAngle()*SIMD_DEGS_PER_RAD);
colladadomNodes[i]->getRotate_array().get(0)->getValue().set(0,axis[0]);
colladadomNodes[i]->getRotate_array().get(0)->getValue().set(1,axis[1]);
colladadomNodes[i]->getRotate_array().get(0)->getValue().set(2,axis[2]);
colladadomNodes[i]->getRotate_array().get(0)->getValue().set(3,quat.getAngle()*SIMD_DEGS_PER_RAD);
}
if (matrixRef[i])
{
//not yet
//printf
while (colladadomNodes[i]->getMatrix_array().getCount())
{
colladadomNodes[i]->removeFromParent(colladadomNodes[i]->getMatrix_array().get(0));
//colladadomNodes[i]->getMatrix_array().removeIndex(0);
}
}
char saveName[550];
static int saveCount=1;
sprintf(saveName,"%s%i.dae\0",getLastFileName(),saveCount++);
sprintf(saveName,"%s%i",getLastFileName(),saveCount++);
char* name = &saveName[0];
if (name[0] == '/')
{