diff --git a/Demos/ColladaDemo/ColladaDemo.cpp b/Demos/ColladaDemo/ColladaDemo.cpp index 8baf516f2..b9d44d781 100644 --- a/Demos/ColladaDemo/ColladaDemo.cpp +++ b/Demos/ColladaDemo/ColladaDemo.cpp @@ -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;igetId() ); } 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;rgetRigid_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,63 +1431,62 @@ int main(int argc,char** argv) ////////////////////// } - -//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; - - //find transform of the node that this rigidbody maps to - - int i; - //either load the matrix (worldspace) or incrementally build the transform from 'translate'/'rotate' - for (i=0;igetMatrix_array().getCount();i++) - { - domMatrixRef matrixRef = node->getMatrix_array()[i]; - domFloat4x4 fl16 = matrixRef->getValue(); - SimdVector3 origin(fl16.get(3),fl16.get(7),fl16.get(11)); - startTransform.setOrigin(origin); - SimdMatrix3x3 basis(fl16.get(0),fl16.get(1),fl16.get(2), - fl16.get(4),fl16.get(5),fl16.get(6), - fl16.get(8),fl16.get(9),fl16.get(10)); - startTransform.setBasis(basis); - } - - - if (node->getRotate_array().getCount()) - { - rotateArray[numObjects] = &node->getRotate_array(); - } - - for (i=0;igetRotate_array().getCount();i++) - { - domRotateRef rotateRef = node->getRotate_array()[i]; - domFloat4 fl4 = rotateRef->getValue(); - float angleRad = SIMD_RADS_PER_DEG*fl4.get(3); - SimdQuaternion rotQuat(SimdVector3(fl4.get(0),fl4.get(1),fl4.get(2)),angleRad); - startTransform.getBasis() = startTransform.getBasis() * SimdMatrix3x3(rotQuat); - } - - for (i=0;igetTranslate_array().getCount();i++) - { - translateRef[numObjects] = node->getTranslate_array()[i]; - domFloat3 fl3 = translateRef[numObjects]->getValue(); - startTransform.getOrigin() += SimdVector3(fl3.get(0),fl3.get(1),fl3.get(2)); - } - - for (i=0;igetScale_array().getCount();i++) - { - domScaleRef scaleRef = node->getScale_array()[i]; - domFloat3 fl3 = scaleRef->getValue(); - startScale = SimdVector3(fl3.get(0),fl3.get(1),fl3.get(2)); - } - -} - - if (colShape) { + + //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 + + int i; + //either load the matrix (worldspace) or incrementally build the transform from 'translate'/'rotate' + for (i=0;igetMatrix_array().getCount();i++) + { + domMatrixRef matrixRef = node->getMatrix_array()[i]; + domFloat4x4 fl16 = matrixRef->getValue(); + SimdVector3 origin(fl16.get(3),fl16.get(7),fl16.get(11)); + startTransform.setOrigin(origin); + SimdMatrix3x3 basis(fl16.get(0),fl16.get(1),fl16.get(2), + fl16.get(4),fl16.get(5),fl16.get(6), + fl16.get(8),fl16.get(9),fl16.get(10)); + startTransform.setBasis(basis); + } + + + + + for (i=0;igetRotate_array().getCount();i++) + { + domRotateRef rotateRef = node->getRotate_array()[i]; + domFloat4 fl4 = rotateRef->getValue(); + float angleRad = SIMD_RADS_PER_DEG*fl4.get(3); + SimdQuaternion rotQuat(SimdVector3(fl4.get(0),fl4.get(1),fl4.get(2)),angleRad); + startTransform.getBasis() = startTransform.getBasis() * SimdMatrix3x3(rotQuat); + } + + for (i=0;igetTranslate_array().getCount();i++) + { + domTranslateRef translateRef = node->getTranslate_array()[i]; + domFloat3 fl3 = translateRef->getValue(); + startTransform.getOrigin() += SimdVector3(fl3.get(0),fl3.get(1),fl3.get(2)); + } + + for (i=0;igetScale_array().getCount();i++) + { + domScaleRef scaleRef = node->getScale_array()[i]; + domFloat3 fl3 = scaleRef->getValue(); + startScale = SimdVector3(fl3.get(0),fl3.get(1),fl3.get(2)); + } + + } + + + CreatePhysicsObject(isDynamics,mass,startTransform,colShape); } @@ -1851,11 +1844,25 @@ void clientKeyboard(unsigned char key, int x, int y) { for (int i=0;igetTranslate_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) - { - //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;igetCount();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); - } + + if (!colladadomNodes[i]->getRotate_array().getCount()) + { + 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] == '/') { @@ -2177,4 +2190,4 @@ char* fixFileName(const char* lpCmdLine) } return cleaned_filename; -} \ No newline at end of file +}