void COLLADA_Viewer::SixAxis(float flX, float flY, float flZ, float flG) { (void) flG; if (_CrtRender.UsingPhysics()) { static float dampedX = 0.0f; static float dampedY = 0.0f; static float dampedZ = 0.0f; dampedX=(flX + 10.f*dampedX)/11.f; dampedY=(flY + 10.f*dampedY)/11.f; dampedZ=(flZ + 10.f*dampedZ)/11.f; btTransform floorTrans; floorTrans.setIdentity(); btVector3 xAxis(1,0,0); btVector3 zAxis(0,0,1); btQuaternion rotX(zAxis,dampedX*10.f); btQuaternion rotZ(xAxis,-dampedZ*10.f); btQuaternion combinedRot = rotZ*rotX; btMatrix3x3 orn; orn.setRotation(combinedRot); btVector3 up = orn.getColumn(1); CrtVec3f newG = CrtVec3f(up.getX(),up.getY(),up.getZ()); _CrtRender.SetGravity(newG); // printf("new gravity (%f, %f, %f)\n", newG.getX(), newG.getY(), newG.getZ()); } }
bool COLLADA_Viewer::onUpdate() { float tolerrance = 0.15; static float buttonTime = 0; static float cameraTime = 0; bool result = FWGLApplication::onUpdate(); if (mRunning==false) return result; FWTimeVal curTime = FWTime::getCurrentTime(); if ((float)curTime - buttonTime > 0.15) // execute these control base on time elapse, not frame rate { buttonTime = curTime; if(mpPad->getRawBool(FWInput::Channel_Button_Select)) { _CrtRender.SetNextCamera(); return result; } else if(mpPad->getRawBool(FWInput::Channel_Button_L3)) { if (Browser.IsVisible()) Browser.SetVisible(false); else Browser.SetVisible(true); } else if(mpPad->getRawBool(FWInput::Channel_Button_R3)) { if (togglewireframe) { togglewireframe = false; } else { togglewireframe = true; } } else if(mpPad->getRawBool(FWInput::Channel_Button_Square)) { if (togglelighting) { togglelighting = false; } else { togglelighting = true; } } else if(mpPad->getRawBool(FWInput::Channel_Button_Cross)) { mCurrentFile = Browser.GetThumbnail(Browser.GetSelection())->GetDocument(); load_ok = _CrtRender.Load(mCurrentFile, NULL); return result; } else if(mpPad->getRawBool(FWInput::Channel_Button_Up)) { Browser.SelectPrev(); } else if(mpPad->getRawBool(FWInput::Channel_Button_Down)) { Browser.SelectNext(); } } if ((float)curTime - cameraTime > 0.05) // execute these control base on time elapse, not frame rate { cameraTime = curTime; // Get the values from the analog sticks float conditioned_X_0 = mpPad->getRawFloat(FWInput::Channel_XAxis_0); float conditioned_Y_0 = mpPad->getRawFloat(FWInput::Channel_YAxis_0); float conditioned_X_1 = mpPad->getRawFloat(FWInput::Channel_XAxis_1); float conditioned_Y_1 = mpPad->getRawFloat(FWInput::Channel_YAxis_1); if (-tolerrance < conditioned_X_0 && conditioned_X_0 < tolerrance) conditioned_X_0 = 0.0f; if (-tolerrance < conditioned_Y_0 && conditioned_Y_0 < tolerrance) conditioned_Y_0 = 0.0f; if (-tolerrance < conditioned_X_1 && conditioned_X_1 < tolerrance) conditioned_X_1 = 0.0f; if (-tolerrance < conditioned_Y_1 && conditioned_Y_1 < tolerrance) conditioned_Y_1 = 0.0f; conditioned_X_0 = mpInputX0 ? -mpInputX0->getFloatValue() : 0.f; conditioned_Y_0 = mpInputY0 ? -mpInputY0->getFloatValue() : 0.f; conditioned_X_1 = mpInputX1 ? -mpInputX1->getFloatValue() : 0.f; conditioned_Y_1 = mpInputY1 ? -mpInputY1->getFloatValue() : 0.f; float multiplier = 10.0f; if (conditioned_X_0 != 0.0f || conditioned_Y_0 != 0.0f) { _CrtRender.ActiveInstanceCamera->MoveOrbit(conditioned_X_0 * multiplier, conditioned_Y_0 * multiplier); } if (conditioned_X_1 != 0.0f || conditioned_Y_1 != 0.0f) { _CrtRender.ActiveInstanceCamera->SetPanAndTilt(conditioned_X_1 * multiplier, conditioned_Y_1 * multiplier); } } if(mpPad->getRawBool(FWInput::Channel_Button_L2)) { // zoom in _CrtRender.ZoomIn(-0.005f); } else if(mpPad->getRawBool(FWInput::Channel_Button_L1)) { // zoom out _CrtRender.ZoomIn(0.005f); } if (togglewireframe) { glPolygonMode(GL_FRONT_AND_BACK, GL_LINE); } else { glPolygonMode(GL_FRONT_AND_BACK, GL_FILL); } if (togglelighting) { glEnable(GL_LIGHTING); } else { glDisable(GL_LIGHTING); } #if defined SPU_BULLET || !defined (SN_TARGET_PS3) if (mpPad->getRawBool(FWInput::Channel_Button_Triangle)) { float fl_x, fl_y, fl_z, fl_g; fl_x = mpPad->getRawFloat(FWInput::Channel_XAxis_2); fl_y = mpPad->getRawFloat(FWInput::Channel_YAxis_2); fl_z = mpPad->getRawFloat(FWInput::Channel_ZAxis_2); fl_g = mpPad->getRawFloat(FWInput::Channel_Gyro); SixAxis(fl_x, fl_y, fl_z, fl_g); } else { _CrtRender.SetGravity(CrtVec3f(0.0f, -10.0f, 0.0f)); } #endif static const int CONS_PUTS_INTERVAL = 50; if (frames % CONS_PUTS_INTERVAL == 0){ } char title[1024]; const char * selectedfile = Browser.GetThumbnail(Browser.GetSelection())->GetDocument(); sprintf(title, "%s %s", "COLLADA Viewer", mCurrentFile); cellDbgFontPuts(0.1f, 0.1f, 1.0f, 0xffffffff, title); cellDbgFontPuts(0.1f, 0.9f, 1.0f, 0xffffffff, selectedfile); Browser.onUpdate(); return result; }
bool ColladaConverter::convert() { unsigned i; //succesfully loaded file, now convert data if (m_dom->getAsset() && m_dom->getAsset()->getUnit()) { domAsset::domUnitRef unit = m_dom->getAsset()->getUnit(); domFloat meter = unit->getMeter(); printf("asset unit meter=%f\n",meter); // m_unitMeterScaling = meter; } if ( m_dom->getAsset() && m_dom->getAsset()->getUp_axis() ) { domAsset::domUp_axis * up = m_dom->getAsset()->getUp_axis(); switch( up->getValue() ) { case UPAXISTYPE_X_UP: printf(" X is Up Data and Hiearchies must be converted!\n" ); printf(" Conversion to X axis Up isn't currently supported!\n" ); printf(" COLLADA_RT defaulting to Y Up \n" ); setGravity(CrtVec3f(-10,0,0)); setCameraInfo(btVector3(1,0,0),1); break; case UPAXISTYPE_Y_UP: printf(" Y Axis is Up for this file \n" ); printf(" COLLADA_RT set to Y Up \n" ); setGravity(CrtVec3f(0,-10,0)); setCameraInfo(btVector3(0,1,0),0); break; case UPAXISTYPE_Z_UP: printf(" Z Axis is Up for this file \n" ); printf(" All Geometry and Hiearchies must be converted!\n" ); setGravity(CrtVec3f(0,0,-10)); break; default: break; } } //we don't handle visual objects, physics objects are rered as such for (unsigned int s=0;s<m_dom->getLibrary_visual_scenes_array().getCount();s++) { domLibrary_visual_scenesRef scenesRef = m_dom->getLibrary_visual_scenes_array()[s]; for (unsigned int i=0;i<scenesRef->getVisual_scene_array().getCount();i++) { domVisual_sceneRef sceneRef = scenesRef->getVisual_scene_array()[i]; for (unsigned int n=0;n<sceneRef->getNode_array().getCount();n++) { domNodeRef nodeRef = sceneRef->getNode_array()[n]; nodeRef->getRotate_array(); nodeRef->getTranslate_array(); nodeRef->getScale_array(); } } } // Load all the geometry libraries for ( i = 0; i < m_dom->getLibrary_geometries_array().getCount(); i++) { domLibrary_geometriesRef libgeom = m_dom->getLibrary_geometries_array()[i]; printf(" CrtScene::Reading Geometry Library \n" ); for ( unsigned int i = 0; i < libgeom->getGeometry_array().getCount(); i++) { //ReadGeometry( ); domGeometryRef lib = libgeom->getGeometry_array()[i]; domMesh *meshElement = lib->getMesh(); if (meshElement) { // Find out how many groups we need to allocate space for int numTriangleGroups = (int)meshElement->getTriangles_array().getCount(); int numPolygonGroups = (int)meshElement->getPolygons_array().getCount(); int totalGroups = numTriangleGroups + numPolygonGroups; if (totalGroups == 0) { printf("No Triangles or Polygons found int Geometry %s \n", lib->getId() ); } else { //printf("Found mesh geometry (%s): numTriangleGroups:%i numPolygonGroups:%i\n",lib->getId(),numTriangleGroups,numPolygonGroups); } } domConvex_mesh *convexMeshElement = lib->getConvex_mesh(); if (convexMeshElement) { printf("found convexmesh element\n"); // 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) { printf("No Triangles or Polygons found in ConvexMesh Geometry %s \n", lib->getId() ); }else { printf("Found convexmesh geometry: numTriangleGroups:%i numPolygonGroups:%i\n",numTriangleGroups,numPolygonGroups); } }//fi }//for each geometry }//for all geometry libraries //m_dom->getLibrary_physics_models_array() for ( i = 0; i < m_dom->getLibrary_physics_scenes_array().getCount(); i++) { domLibrary_physics_scenesRef physicsScenesRef = m_dom->getLibrary_physics_scenes_array()[i]; for (unsigned int s=0;s<physicsScenesRef->getPhysics_scene_array().getCount();s++) { domPhysics_sceneRef physicsSceneRef = physicsScenesRef->getPhysics_scene_array()[s]; if (physicsSceneRef->getTechnique_common()) { if (physicsSceneRef->getTechnique_common()->getGravity()) { const domFloat3 grav = physicsSceneRef->getTechnique_common()->getGravity()->getValue(); printf("gravity set to %f,%f,%f\n",grav.get(0),grav.get(1),grav.get(2)); setGravity(CrtVec3f((float)grav.get(0),(float)grav.get(1),(float)grav.get(2))); } } for (unsigned int ps=0;ps<physicsSceneRef->getInstance_physics_model_array().getCount();ps++) { domInstance_physics_modelRef instance_physicsModelRef = physicsSceneRef->getInstance_physics_model_array()[ps]; daeElementRef ref = instance_physicsModelRef->getUrl().getElement(); domPhysics_modelRef model = *(domPhysics_modelRef*)&ref; unsigned int p,r; for ( p=0;p<model->getInstance_physics_model_array().getCount();p++) { domInstance_physics_modelRef instancePhysicsModelRef = model->getInstance_physics_model_array()[p]; daeElementRef ref = instancePhysicsModelRef->getUrl().getElement(); domPhysics_modelRef model = *(domPhysics_modelRef*)&ref; //todo: group some shared functionality in following 2 'blocks'. for (r=0;r<instancePhysicsModelRef->getInstance_rigid_body_array().getCount();r++) { domInstance_rigid_bodyRef instRigidbodyRef = instancePhysicsModelRef->getInstance_rigid_body_array()[r]; btScalar mass = 1.f; bool isDynamics = true; btCollisionShape* colShape = 0; btCompoundShape* compoundShape = 0; xsNCName bodyName = instRigidbodyRef->getBody(); domInstance_rigid_body::domTechnique_commonRef techniqueRef = instRigidbodyRef->getTechnique_common(); if (techniqueRef) { if (techniqueRef->getMass()) { mass = (btScalar)techniqueRef->getMass()->getValue(); } if (techniqueRef->getDynamic()) { isDynamics = techniqueRef->getDynamic()->getValue(); } } if (bodyName && model) { //try to find the rigid body for (unsigned int r=0;r<model->getRigid_body_array().getCount();r++) { domRigid_bodyRef rigidBodyRef = model->getRigid_body_array()[r]; if (rigidBodyRef->getSid() && !strcmp(rigidBodyRef->getSid(),bodyName)) { btRigidBodyOutput output; output.m_colShape = colShape; output.m_compoundShape = compoundShape; output.m_mass = 1.f; output.m_isDynamics = true; btRigidBodyInput rbInput; rbInput.m_rigidBodyRef2 = rigidBodyRef; rbInput.m_instanceRigidBodyRef = instRigidbodyRef; ConvertRigidBodyRef( rbInput , output ); mass = output.m_mass; isDynamics = output.m_isDynamics; colShape = output.m_colShape; compoundShape = output.m_compoundShape; } } ////////////////////// } if (compoundShape) colShape = compoundShape; if (colShape) { btRigidBodyInput input; input.m_instanceRigidBodyRef = instRigidbodyRef; input.m_rigidBodyRef2 = 0; input.m_bodyName = (char*)bodyName; PreparePhysicsObject(input, isDynamics,mass,colShape); } } } for (r=0;r<instance_physicsModelRef->getInstance_rigid_body_array().getCount();r++) { domInstance_rigid_bodyRef instRigidbodyRef = instance_physicsModelRef->getInstance_rigid_body_array()[r]; btScalar mass = 1.f; bool isDynamics = true; btCollisionShape* colShape = 0; btCompoundShape* compoundShape = 0; xsNCName bodyName = instRigidbodyRef->getBody(); domInstance_rigid_body::domTechnique_commonRef techniqueRef = instRigidbodyRef->getTechnique_common(); if (techniqueRef) { if (techniqueRef->getMass()) { mass = (btScalar)techniqueRef->getMass()->getValue(); } if (techniqueRef->getDynamic()) { isDynamics = techniqueRef->getDynamic()->getValue(); } } if (bodyName && model) { //try to find the rigid body for (unsigned int r=0;r<model->getRigid_body_array().getCount();r++) { domRigid_bodyRef rigidBodyRef = model->getRigid_body_array()[r]; if (rigidBodyRef->getSid() && !strcmp(rigidBodyRef->getSid(),bodyName)) { btRigidBodyOutput output; output.m_colShape = colShape; output.m_compoundShape = compoundShape; output.m_mass = 1.f; output.m_isDynamics = true; btRigidBodyInput rbInput; rbInput.m_rigidBodyRef2 = rigidBodyRef; rbInput.m_instanceRigidBodyRef = instRigidbodyRef; ConvertRigidBodyRef( rbInput , output ); mass = output.m_mass; isDynamics = output.m_isDynamics; colShape = output.m_colShape; compoundShape = output.m_compoundShape; } } ////////////////////// } if (compoundShape) colShape = compoundShape; if (colShape) { btRigidBodyInput input; input.m_instanceRigidBodyRef = instRigidbodyRef; input.m_rigidBodyRef2 = 0; input.m_bodyName = (char*)bodyName; PreparePhysicsObject(input, isDynamics,mass,colShape); } } //for each instance_rigid_body } //for each physics model //handle constraints for (unsigned int ma=0;ma<physicsSceneRef->getInstance_physics_model_array().getCount();ma++) { domInstance_physics_modelRef instance_physicsModelRef = physicsSceneRef->getInstance_physics_model_array()[ma]; daeElementRef ref = instance_physicsModelRef->getUrl().getElement(); domPhysics_modelRef model = *(domPhysics_modelRef*)&ref; { ConstraintInput cInput; cInput.m_instance_physicsModelRef = instance_physicsModelRef; cInput.m_model = model; prepareConstraints(cInput); } //also don't forget the model's 'instance_physics_models! for ( unsigned int p=0;p<model->getInstance_physics_model_array().getCount();p++) { domInstance_physics_modelRef instancePhysicsModelRef = model->getInstance_physics_model_array()[p]; daeElementRef ref = instancePhysicsModelRef->getUrl().getElement(); domPhysics_modelRef model = *(domPhysics_modelRef*)&ref; ConstraintInput cInput; cInput.m_instance_physicsModelRef = instancePhysicsModelRef; cInput.m_model = model; prepareConstraints(cInput); } } //2nd time, for each physics model } } return true; }