bool CPhysicsManager::AddPhysicController (CPhysicController* controller) { assert(controller != NULL); assert(m_pScene != NULL); assert(m_pControllerManager != NULL); bool isOK = false; NxController* nxController = controller->GetPhXController(); NxCapsuleControllerDesc* nxControllerDesc = controller->GetPhXControllerDesc(); assert(nxControllerDesc!=NULL); assert(nxController==NULL); //Nos aseguramos que no hayan registrado ya un actor en la escena nxController = m_pControllerManager->createController(m_pScene, *nxControllerDesc ); if (m_pControllerManager!= NULL) { controller->CreateController(nxController, m_pScene); nxController->getActor()->userData = controller->GetUserData(); //NxShape*const* shape = nxController->getActor()->getShapes(); //shape[0]->setGroup(controller->); isOK = true; } return isOK; }
/*********************************************************** move character returned collision flags, collection of NxControllerFlag ***********************************************************/ unsigned int PhysXEngine::MoveCharacter(unsigned int characterIndex, const NxVec3& moveVector) { NxU32 collisionFlags; NxController* ctrl = gManager->getController(characterIndex); if(ctrl) ctrl->move(moveVector, COLLIDABLE_MASK, 0.000001f, collisionFlags); return collisionFlags; }
NxU32 MoveCharacter(NxU32 characterIndex, NxScene& scene, const NxVec3& dispVector, NxF32 elapsedTime, NxU32 collisionGroups, NxF32 heightDelta) { gNbPts = 0; #ifndef DEBUG_CCT { // NxF32 sharpness = 0.1f; NxF32 sharpness = 1.0f; NxU32 collisionFlags; NxVec3 d = dispVector*elapsedTime; if(heightDelta!=0.0f) d.y+=heightDelta; NxController* c = gManager->getController(characterIndex); c->move(d, collisionGroups, 0.000001f, collisionFlags, sharpness); return collisionFlags; } #else { NxF32 sharpness = 1.0f; NxU32 collisionFlags; NxVec3 d = dispVector*elapsedTime; if(heightDelta!=0.0f) d.y+=heightDelta; d.y = 0.0f; NxController* c = gManager->getController(characterIndex); c->move(d, collisionGroups, 0.000001f, collisionFlags, sharpness); NxVec3 pos = c->getDebugPosition(); d.x = d.z = 0.0f; d.y = -100.0f; NxU32 collisionFlags2; c->move(d, collisionGroups, 0.001f, collisionFlags2, sharpness); gLimitPos = c->getDebugPosition(); c->setPosition(pos); return collisionFlags; } #endif }
/*********************************************************** Render actors ***********************************************************/ void PhysXEngine::RenderActors() { glEnable(GL_BLEND); glDisable(GL_TEXTURE_2D); glDisable(GL_DEPTH_TEST); glLineWidth(2.0f); // Render all the actors in the scene NxU32 nbActors = gScene->getNbActors(); NxActor** actors = gScene->getActors(); while (nbActors--) { NxActor* actor = *actors++; glPushMatrix(); glScalef(1, 0.5f, 1); NxMat34 pose = actor->getShapes()[0]->getGlobalPose(); //glTranslated(pose.t.x, pose.t.y/2. + 0.5, pose.t.z); float glmat[16]; //4x4 column major matrix for OpenGL. pose.M.getColumnMajorStride4(&(glmat[0])); pose.t.get(&(glmat[12])); //clear the elements we don't need: glmat[3] = glmat[7] = glmat[11] = 0.0f; glmat[15] = 1.0f; glMultMatrixf(&(glmat[0])); NxBoxShape* boxshap = actor->getShapes()[0]->isBox(); if(boxshap) { glColor4f(0.0f,0.0f,1.0f, 1.f); NxVec3 boxDim = boxshap->getDimensions(); glScalef(boxDim.x, boxDim.y, boxDim.z); float _sizeX = 1, _sizeY = 1, _sizeZ = 1; glBegin(GL_LINES); glVertex3f(-_sizeX,-_sizeY,-_sizeZ); glVertex3f(_sizeX,-_sizeY,-_sizeZ); glVertex3f(_sizeX,-_sizeY,-_sizeZ); glVertex3f(_sizeX,-_sizeY,_sizeZ); glVertex3f(_sizeX,-_sizeY,_sizeZ); glVertex3f(-_sizeX,-_sizeY,_sizeZ); glVertex3f(-_sizeX,-_sizeY,_sizeZ); glVertex3f(-_sizeX,-_sizeY,-_sizeZ); glVertex3f(-_sizeX,_sizeY,-_sizeZ); glVertex3f(_sizeX,_sizeY,-_sizeZ); glVertex3f(_sizeX,_sizeY,-_sizeZ); glVertex3f(_sizeX,_sizeY,_sizeZ); glVertex3f(_sizeX,_sizeY,_sizeZ); glVertex3f(-_sizeX,_sizeY,_sizeZ); glVertex3f(-_sizeX,_sizeY,_sizeZ); glVertex3f(-_sizeX,_sizeY,-_sizeZ); glVertex3f(-_sizeX,-_sizeY,-_sizeZ); glVertex3f(-_sizeX,_sizeY,-_sizeZ); glVertex3f(_sizeX,-_sizeY,-_sizeZ); glVertex3f(_sizeX,_sizeY,-_sizeZ); glVertex3f(_sizeX,-_sizeY,_sizeZ); glVertex3f(_sizeX,_sizeY,_sizeZ); glVertex3f(-_sizeX,-_sizeY,_sizeZ); glVertex3f(-_sizeX,_sizeY,_sizeZ); glEnd(); } else { for(int i=1; i<100; ++i) { glColor4f(1.0f,0.0f,0.0f, 1.f); float _sizeX = (float)i, _sizeY = 0, _sizeZ = (float)i; glBegin(GL_LINES); glVertex3f(-_sizeX,-_sizeY,-_sizeZ); glVertex3f(_sizeX,-_sizeY,-_sizeZ); glVertex3f(_sizeX,-_sizeY,-_sizeZ); glVertex3f(_sizeX,-_sizeY,_sizeZ); glVertex3f(_sizeX,-_sizeY,_sizeZ); glVertex3f(-_sizeX,-_sizeY,_sizeZ); glVertex3f(-_sizeX,-_sizeY,_sizeZ); glVertex3f(-_sizeX,-_sizeY,-_sizeZ); glEnd(); } } glPopMatrix(); } for(unsigned int i=0; i<gManager->getNbControllers(); ++i) { NxController* ctrl = gManager->getController(i); NxExtendedVec3 vec = ctrl->getPosition(); glPushMatrix(); glTranslated(vec.x, vec.y, vec.z); glColor4f(1.0f,1.0f,0.0f, 1.f); float _sizeX = 1, _sizeY = 3, _sizeZ = 1; glBegin(GL_LINES); glVertex3f(-_sizeX,-_sizeY,-_sizeZ); glVertex3f(_sizeX,-_sizeY,-_sizeZ); glVertex3f(_sizeX,-_sizeY,-_sizeZ); glVertex3f(_sizeX,-_sizeY,_sizeZ); glVertex3f(_sizeX,-_sizeY,_sizeZ); glVertex3f(-_sizeX,-_sizeY,_sizeZ); glVertex3f(-_sizeX,-_sizeY,_sizeZ); glVertex3f(-_sizeX,-_sizeY,-_sizeZ); glVertex3f(-_sizeX,_sizeY,-_sizeZ); glVertex3f(_sizeX,_sizeY,-_sizeZ); glVertex3f(_sizeX,_sizeY,-_sizeZ); glVertex3f(_sizeX,_sizeY,_sizeZ); glVertex3f(_sizeX,_sizeY,_sizeZ); glVertex3f(-_sizeX,_sizeY,_sizeZ); glVertex3f(-_sizeX,_sizeY,_sizeZ); glVertex3f(-_sizeX,_sizeY,-_sizeZ); glVertex3f(-_sizeX,-_sizeY,-_sizeZ); glVertex3f(-_sizeX,_sizeY,-_sizeZ); glVertex3f(_sizeX,-_sizeY,-_sizeZ); glVertex3f(_sizeX,_sizeY,-_sizeZ); glVertex3f(_sizeX,-_sizeY,_sizeZ); glVertex3f(_sizeX,_sizeY,_sizeZ); glVertex3f(-_sizeX,-_sizeY,_sizeZ); glVertex3f(-_sizeX,_sizeY,_sizeZ); glEnd(); glPopMatrix(); } glEnable(GL_DEPTH_TEST); glEnable(GL_TEXTURE_2D); }