コード例 #1
0
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 );
}
コード例 #2
0
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;
}
コード例 #3
0
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);
}
コード例 #4
0
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;
}
コード例 #5
0
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];
	}*/
}
コード例 #6
0
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;
		}
	}
}