void CAStarProcess::Init() { //ScriptMInstance->RunCode( "init()" ); CPhysicsManager* l_PM = PhysXMInstance; m_pAStarScene = new CAStar(); m_pAStarScene->Init(); CPhysicUserData* userData = new CPhysicUserData( "CharacterController" ); userData->SetPaint( true ); userData->SetColor( colWHITE ); m_vPUD.push_back( userData ); Math::Vect3f l_Pos = CameraMInstance->GetCurrentCamera()->GetPosition(); m_PhysicController = new CPhysicController( 0.5f, 2, 0.2f, 0.5f, 0.5f, ECG_PLAYER, userData, l_Pos ); l_PM->AddPhysicController( m_PhysicController ); CPhysicUserData* l_PUD = new CPhysicUserData( "Plane" ); l_PUD->SetPaint( true ); l_PUD->SetColor( colWHITE ); m_vPUD.push_back( l_PUD ); CPhysicActor* l_pPhysicActor = new CPhysicActor( l_PUD ); l_pPhysicActor->AddBoxShape( Math::Vect3f( 1000, 0.0f, 1000 ), Math::Vect3f( 0, -0.5f, 0 ) ); m_vPA.push_back( l_pPhysicActor ); l_PM->AddPhysicActor( l_pPhysicActor ); m_PointInicial = Math::Vect3f( 6, 0, -6 ); m_PointFinal = Math::Vect3f( 6, 0, 6 ); m_Path = m_pAStarScene->GetPath( m_PointInicial, m_PointFinal ); }
CInstanceMesh* CRenderableObjectsLayersManager::AddDynamic( const CXMLTreeNode& atts ) { CInstanceMesh* l_InstanceMesh = new CInstanceMesh( atts ); if(!l_InstanceMesh->IsOk()) { LOG_WARNING_APPLICATION("The instance mesh %s, is not correct, it would not be rendererd", l_InstanceMesh->GetName().c_str()); CHECKED_DELETE(l_InstanceMesh); return NULL; } // User data CPhysicUserData * lData = new CPhysicUserData(l_InstanceMesh->GetName()); lData->SetGroup(ECG_DYNAMIC_OBJECTS); // Phyx actor CPhysicActor* l_MeshActor = new CPhysicActor(lData); l_MeshActor->SetCollisionGroup(ECG_DYNAMIC_OBJECTS); // Obtain a box from the static mesh aabb CStaticMesh* l_StaticMesh = l_InstanceMesh->GetStaticMesh(); Math::AABB3f l_AABB = l_StaticMesh->GetAABB(); Math::Vect3f l_Pos = l_InstanceMesh->GetTransform() * l_AABB.GetCenter(); l_MeshActor->AddBoxShape(Vect3f(l_AABB.GetWidth() * 0.5f, l_AABB.GetHeight() * 0.5f, l_AABB.GetDepth() * 0.5f), l_Pos); l_MeshActor->CreateBody(1.0f); l_InstanceMesh->SetActor(l_MeshActor); l_InstanceMesh->SetType("dynamic"); PhysXMInstance->AddPhysicActor(l_MeshActor, false); return l_InstanceMesh; }
void CZombie::InicializaController() { CPhysicUserData *userdata = new CPhysicUserData(GetInstance()->GetName()); userdata->SetColor(colGREEN); userdata->SetPaint(true); GetInstance()->SetPosition(Vect3f(GetInstance()->GetPosition().x,GetInstance()->GetPosition().y + 1.0f,GetInstance()->GetPosition().z)); // m_pPhysicController = new CPhysicController(0.5f,2.0f,2.0f,0.1f,2.0f,1,userdata,GetInstance()->GetPosition()); m_pPhysicController = new CPhysicController(0.5f, 1.3f, 40.0f, 0.01f, 0.3f, PX_MSK_ENEMY_CONTROLLER, userdata, GetInstance()->GetPosition()); CORE->GetPhysicsManager()->AddPhysicController(m_pPhysicController); }
CPhysicActor* CTriggerManager::GeneraTrigger(const std::string& _name, CTrigger* _trigger, bool _esPunyo = false) { //genera el PhysicActor CPhysicUserData *userdata = new CPhysicUserData(_name); if(!userdata) { std::string msg_error = "CTriggerManager::GeneraTrigger->Error al intentar generar un userdata para triggers: " + _name; LOGGER->AddNewLog(ELL_ERROR, msg_error.c_str()); throw CException(__FILE__, __LINE__, msg_error); return false; } userdata->Init(); userdata->SetName(_name); userdata->SetPaint(true); CPhysicActor* aTrigger = new CPhysicActor(userdata); ////guarda el userdata para luego borrarlo correctamente m_vUserDatas.push_back(userdata); //calculamos la matriz con la rotación _trigger->CalculateMatriz44f(); Mat44f l_RotationTrigger = _trigger->GetMatrizTrigger(); //se le asigna el rol de trigger y se posiciona aTrigger->CreateBoxTrigger(_trigger->GetDimensions(),PX_CG_TRIGGER); aTrigger->SetGlobalPosition(_trigger->GetPosition()); //se añade el trigger en el vector y en el mapa AddResource(_name, _trigger); //lo añadimos al manager if(!CORE->GetPhysicsManager()->AddPhysicActor(aTrigger)) { //Guardar el mensaje de error en el LOGGER std::string msg_error = "CTriggerManager::Load->Error al intentar generar un trigger en physics: " + _name; //msg_error.append(m_File_name.c_str()); LOGGER->AddNewLog(ELL_ERROR, msg_error.c_str()); throw CException(__FILE__, __LINE__, msg_error); return 0; } aTrigger->SetMat44(l_RotationTrigger); if(!_esPunyo) { m_vTriggerActors.push_back(aTrigger); } std::string msg_info = "CTriggerManager::Load->Se ha generado el trigger: " + _name; LOGGER->AddNewLog(ELL_INFORMATION, msg_info.c_str()); return aTrigger; }
void CPhysicsManager::OverlapSphereActorGrenade (float radiusSphere, const Vect3f& posSphere, std::vector<CPhysicUserData*> impactObjects, float _fPower) { assert(m_pScene); NxSphere worldSphere(NxVec3(posSphere.x,posSphere.y,posSphere.z), radiusSphere); NxU32 nbShapes = m_pScene->getNbDynamicShapes(); NxShape** shapes = new NxShape* [nbShapes]; for (NxU32 i = 0; i < nbShapes; i++) { shapes[i] = NULL; } //NX_DYNAMIC_SHAPES m_pScene->overlapSphereShapes(worldSphere, NX_DYNAMIC_SHAPES, nbShapes, shapes, NULL); for (NxU32 i = 0; i < nbShapes; i++) { if( shapes[i] != NULL ) { NxActor* actor = &shapes[i]->getActor(); CPhysicUserData* physicObject = (CPhysicUserData*)actor->userData; //Si está petando aquí quiere decir que se ha registrado un objeto físico sin proporcionarle ID assert(physicObject); //Antes de meterlo comprobamos que no exista ya (un objeto fisico puede estar compuesto por varias shapes) std::vector<CPhysicUserData*>::iterator it(impactObjects.begin()); std::vector<CPhysicUserData*>::iterator itEnd(impactObjects.end()); bool find = false; while (it!=itEnd) { CPhysicUserData* id = *it; if( id == physicObject) find = true; ++it; } if(!find) { impactObjects.push_back(physicObject); physicObject->SetColor(colRED); ApplyExplosion(actor,posSphere,radiusSphere,_fPower); } } //delete &shapes[i]; } delete shapes; /*for (NxU32 i = 0; i < nbShapes; i++) { delete &shapes[i]; }*/ }
void CPhysicsManager::DrawActor (NxActor* actor, CRenderManager* render) { CPhysicUserData* physicUserData = NULL; physicUserData =(CPhysicUserData*)actor->userData; //Si está petando aquí quiere decir que se ha registrado un objeto físico sin proporcionarle UserData assert(physicUserData); if( !physicUserData->GetPaint()) { return; } NxShape*const* shapes = actor->getShapes(); NxU32 nShapes = actor->getNbShapes(); nShapes = actor->getNbShapes(); while (nShapes--) { switch(shapes[nShapes]->getType()) { case NX_SHAPE_PLANE: { CColor color = physicUserData->GetColor(); float distance = shapes[nShapes]->isPlane()->getPlane().d; NxVec3 normal = shapes[nShapes]->isPlane()->getPlane().normal; Vect3f n(normal.x,normal.y,normal.z); render->DrawPlane(100.f, n, distance,color,40,40); } break; case NX_SHAPE_BOX: { NxF32 m_aux[16]; shapes[nShapes]->getGlobalPose().getColumnMajor44(m_aux); Mat44f m( m_aux[0], m_aux[4], m_aux[8], m_aux[12], m_aux[1], m_aux[5], m_aux[9], m_aux[13], m_aux[2], m_aux[6], m_aux[10], m_aux[14], m_aux[3], m_aux[7], m_aux[11], m_aux[15]); render->SetTransform(m); NxVec3 boxDim = shapes[nShapes]->isBox()->getDimensions(); CColor color = physicUserData->GetColor(); render->DrawCube(Vect3f(boxDim.x*2,boxDim.y*2,boxDim.z*2), color); //render->DrawCube(boxDim.y*2,color); } break; case NX_SHAPE_SPHERE: { NxF32 m_aux[16]; shapes[nShapes]->getGlobalPose().getColumnMajor44(m_aux); Mat44f m( m_aux[0], m_aux[4], m_aux[8], m_aux[12], m_aux[1], m_aux[5], m_aux[9], m_aux[13], m_aux[2], m_aux[6], m_aux[10], m_aux[14], m_aux[3], m_aux[7], m_aux[11], m_aux[15]); render->SetTransform(m); NxReal radius = shapes[nShapes]->isSphere()->getRadius(); CColor color = physicUserData->GetColor(); render->DrawSphere(radius,MAX_ARISTAS,color); } break; case NX_SHAPE_CAPSULE: { NxF32 m_aux[16]; shapes[nShapes]->getGlobalPose().getColumnMajor44(m_aux); Mat44f m( m_aux[0], m_aux[4], m_aux[8], m_aux[12], m_aux[1], m_aux[5], m_aux[9], m_aux[13], m_aux[2], m_aux[6], m_aux[10], m_aux[14], m_aux[3], m_aux[7], m_aux[11], m_aux[15]); Mat44f translation, total; translation.SetIdentity(); render->SetTransform(m); const NxReal & radius = shapes[nShapes]->isCapsule()->getRadius(); const NxReal & height = shapes[nShapes]->isCapsule()->getHeight(); CColor color = physicUserData->GetColor(); translation.Translate(Vect3f(0.f, (height*0.5f), 0.f)); total = m * translation; render->SetTransform(total); render->DrawSphere(radius,MAX_ARISTAS,color); translation.Translate( Vect3f(0.f, -(height*0.5f), 0.f )); total = m * translation; render->SetTransform(total); render->DrawSphere(radius, MAX_ARISTAS, color); } break; case NX_SHAPE_CONVEX: break; case NX_SHAPE_MESH: { NxShape* mesh = shapes[nShapes]; NxTriangleMeshDesc meshDesc; mesh->isTriangleMesh()->getTriangleMesh().saveToDesc(meshDesc); typedef NxVec3 Point; typedef struct _Triangle { NxU32 p0; NxU32 p1; NxU32 p2; } Triangle; NxU32 nbVerts = meshDesc.numVertices; NxU32 nbTriangles = meshDesc.numTriangles; Point* points = (Point *)meshDesc.points; Triangle* triangles = (Triangle *)meshDesc.triangles; CColor color = physicUserData->GetColor(); NxF32 m_aux[16]; mesh->getGlobalPose().getColumnMajor44(m_aux); Mat44f m( m_aux[0], m_aux[4], m_aux[8], m_aux[12], m_aux[1], m_aux[5], m_aux[9], m_aux[13], m_aux[2], m_aux[6], m_aux[10], m_aux[14], m_aux[3], m_aux[7], m_aux[11], m_aux[15]); render->SetTransform(m); Vect3f a,b,c; while(nbTriangles--) { a = Vect3f(points[triangles->p0].x, points[triangles->p0].y,points[triangles->p0].z); b = Vect3f(points[triangles->p1].x, points[triangles->p1].y,points[triangles->p1].z); c = Vect3f(points[triangles->p2].x, points[triangles->p2].y,points[triangles->p2].z); render->DrawLine(a, b, color); render->DrawLine(b, c, color); render->DrawLine(c, a, color); triangles++; } } break; case NX_SHAPE_WHEEL: { //TODO... } break; default: { //TODO... } break; } } }