void BulletPhysics::CreateTrigger(WeakGameObjectPtr pGameObject, const Vec3& position, const float dim) { StrongGameObjectPtr pStrongObject = MakeStrongPtr(pGameObject); if (!pStrongObject) { CB_ERROR("Must attach a game object to the trigger"); return; } // create the collision body btBoxShape* boxShape = new btBoxShape(Vec3_to_btVector3(Vec3(dim, dim, dim))); // 0 mass, this trigger is not moveable const btScalar mass = 0; // set the initial position of the trigger from the object Mat4x4 triggerTransform = Mat4x4::Identity; triggerTransform.SetPosition(position); ObjectMotionState* motionState = CB_NEW ObjectMotionState(triggerTransform); // create the rigid body btRigidBody::btRigidBodyConstructionInfo rbInfo(mass, motionState, boxShape, btVector3(0, 0, 0)); btRigidBody* body = new btRigidBody(rbInfo); // add the body to the world m_DynamicsWorld->addRigidBody(body); // mark the body as a trigger so it does not physically collide with object body->setCollisionFlags(body->getCollisionFlags() | btRigidBody::CF_NO_CONTACT_RESPONSE); // update the maps m_ObjectIdToRigidBody[pStrongObject->GetId()] = body; m_RigidBodyToObjectId[body] = pStrongObject->GetId(); }
// // TeapotWarsGame::VOnUpdate - Chapter 19, page 709 // void CometConquestGame::VOnUpdate(float time, float elapsedTime) { int deltaMilliseconds = int(elapsedTime * 1000.0f); m_Lifetime += elapsedTime; unsigned int currentTime = timeGetTime(); BaseGameLogic::VOnUpdate(time, elapsedTime); if (m_bProxy) return; switch(m_State) { case BGS_LoadingGameEnvironment: break; case BGS_MainMenu: break; case BGS_WaitingForPlayers: if (m_ExpectedPlayers + m_ExpectedRemotePlayers == m_HumanPlayersAttached ) { VChangeState(BGS_LoadingGameEnvironment); } break; case BGS_Running: if(currentTime > (m_data.m_lastCometTime + 5000)) { Vec4 at = -g_Right4 * 2.0f; Vec4 atWorld = Mat4x4::g_Identity.Xform(at); int randVertical = m_random.Random(115) + 1 - 60; Vec3 normalDir(atWorld); normalDir.Normalize(); Mat4x4 temp = Mat4x4::g_Identity; temp.SetPosition(Vec3(110,10,randVertical)); CometParams cp; cp.m_Pos = temp.GetPosition() + Vec3(atWorld); cp.m_Radius = 6.0f; cp.m_Color = g_Cyan; cp.m_NormalDir = normalDir; cp.m_Force = 40000.0f; const EvtData_Request_New_Actor cannonBallEvt( &cp ); safeTriggerEvent( cannonBallEvt ); m_data.m_lastCometTime = currentTime; } break; default: assert(0 && _T("Unrecognized state.")); } // look in Chapter 15, page 563 for more on this bit of code if(m_pPhysics) { m_pPhysics->VOnUpdate(elapsedTime); m_pPhysics->VSyncVisibleScene(); } }
// // SkyNode::VPreRender - Chapter 14, page 502 // HRESULT SkyNode::VPreRender(Scene *pScene) { Vec3 cameraPos = m_camera->VGet()->ToWorld().GetPosition(); Mat4x4 mat = m_Props.ToWorld(); mat.SetPosition(cameraPos); VSetTransform(&mat); return SceneNode::VPreRender(pScene); }
HRESULT SkyNode::PreRender(Scene* pScene) { // get the camera position in world space Vec3 cameraPos = m_Camera->Get()->ToWorld().GetPosition(); // get the sky node's world matrix Mat4x4 mat = m_Properties.ToWorld(); // set the matrix's position to the camera position mat.SetPosition(cameraPos); SetTransform(&mat); return SceneNode::PreRender(pScene); }
void PhysicsComponent::SetPosition(float x, float y, float z) { shared_ptr<TransformComponent> pTransformComponent = MakeStrongPtr(m_pOwner->GetComponent<TransformComponent>(TransformComponent::g_Name)); if (pTransformComponent) { Mat4x4 transform = pTransformComponent->GetTransform(); Vec3 position = Vec3(x, y, z); transform.SetPosition(position); KinematicMove(transform); } else GCC_ERROR("Attempting to call RotateY() on actor with no trnasform component"); }
void PhysicsComponent::RotateY(float angleRadians) { shared_ptr<TransformComponent> pTransformComponent = MakeStrongPtr(m_pOwner->GetComponent<TransformComponent>(TransformComponent::g_Name)); if (pTransformComponent) { Mat4x4 transform = pTransformComponent->GetTransform(); Vec3 position = transform.GetPosition(); Mat4x4 rotateY; rotateY.BuildRotationY(angleRadians); rotateY.SetPosition(position); KinematicMove(rotateY); } else GCC_ERROR("Attempting to call RotateY() on actor with no transform component"); }
void WatchMeProcess::VOnUpdate(unsigned long deltaMs) { StrongActorPtr pTarget = MakeStrongPtr(g_pApp->m_pGame->VGetActor(m_target)); StrongActorPtr pMe = MakeStrongPtr(g_pApp->m_pGame->VGetActor(m_me)); shared_ptr<TransformComponent> pTargetTransform = MakeStrongPtr(pTarget->GetComponent<TransformComponent>(TransformComponent::g_Name)); shared_ptr<TransformComponent> pMyTransform = MakeStrongPtr(pMe->GetComponent<TransformComponent>(TransformComponent::g_Name)); if (!pTarget || !pMe || !pTargetTransform || !pMyTransform) { GCC_ERROR("This shouldn't happen"); Fail(); } Vec3 targetPos = pTargetTransform->GetPosition(); Mat4x4 myTransform = pMyTransform->GetTransform(); Vec3 myDir = myTransform.GetDirection(); myDir = Vec3(0.0f, 0.0f, 1.0f); Vec3 myPos = pMyTransform->GetPosition(); Vec3 toTarget = targetPos - myPos; toTarget.Normalize(); float dotProduct = myDir.Dot(toTarget); Vec3 crossProduct = myDir.Cross(toTarget); float angleInRadians = acos(dotProduct); if (crossProduct.y < 0) angleInRadians = -angleInRadians; Mat4x4 rotation; rotation.BuildRotationY(angleInRadians); rotation.SetPosition(myPos); pMyTransform->SetTransform(rotation); }
// create a game object from lua int LuaInternalScriptExports::CreateGameObject(const char* objectArchetype, LuaPlus::LuaObject luaPosition, LuaPlus::LuaObject luaYawPitchRoll) { // lua position must be a table if (!luaPosition.IsTable()) { CB_ERROR("Invalid object passed to CreateGameObject(). Type = " + std::string(luaPosition.TypeName())); return INVALID_GAMEOBJECT_ID; } // lua yawPitchRoll must be a table if (!luaYawPitchRoll.IsTable()) { CB_ERROR("Invalid object passed to CreateGameObject(). Type = " + std::string(luaYawPitchRoll.TypeName())); return INVALID_GAMEOBJECT_ID; } Vec3 position(luaPosition["x"].GetFloat(), luaPosition["y"].GetFloat(), luaPosition["z"].GetFloat()); Vec3 yawPitchRoll(luaYawPitchRoll["x"].GetFloat(), luaYawPitchRoll["y"].GetFloat(), luaYawPitchRoll["z"].GetFloat()); // build the transform for the object Mat4x4 transform; transform.BuildYawPitchRoll(yawPitchRoll.x, yawPitchRoll.y, yawPitchRoll.z); transform.SetPosition(position); // create the object TiXmlElement* overloads = nullptr; StrongGameObjectPtr pObject = g_pApp->m_pGame->CreateGameObject(objectArchetype, overloads, &transform); // fire the new object created event if (pObject) { shared_ptr<Event_NewGameObject> pNewObjectEvent(CB_NEW Event_NewGameObject(pObject->GetId())); IEventManager::Get()->QueueEvent(pNewObjectEvent); return pObject->GetId(); } return INVALID_GAMEOBJECT_ID; }
bool CometConquestEventListener::HandleEvent( IEventData const & event ) { if ( EvtData_Request_Start_Game::sk_EventType == event.VGetEventType() ) { m_CometConquest->VChangeState(BGS_WaitingForPlayers); } else if ( EvtData_Game_State::sk_EventType == event.VGetEventType() ) { const EvtData_Game_State & castEvent = static_cast< const EvtData_Game_State & >( event ); m_CometConquest->VChangeState(castEvent.m_gameState); } else if ( EvtData_Remote_Client::sk_EventType == event.VGetEventType() ) { // This event is always sent from clients to the game server. const EvtData_Remote_Client & castEvent = static_cast< const EvtData_Remote_Client & >( event ); const int sockID = castEvent.m_socketId; const int ipAddress = castEvent.m_ipAddress; // The teapot has already been created - we need to go find it. //ActorMap::iterator i = m_CometConquest->m_ActorList.begin(); //ActorMap::iterator end = m_CometConquest->m_ActorList.end(); //shared_ptr<IActor> actor = shared_ptr<BaseActor>(); //while (i != end) //{ // actor = (*i).second; // if (actor->VGetType() == AT_Ship) // { // shared_ptr<ActorParams> params = actor->VGetParams(); // shared_ptr<ShipParams> teapotParams = boost::static_pointer_cast<ShipParams>(params); // if (teapotParams->m_ViewId == VIEWID_NO_VIEW_ATTACHED) // { // break; // } // } // ++i; //} //if (actor != shared_ptr<BaseActor>()) //{ NetworkGameView *netGameView = GCC_NEW NetworkGameView( sockID ); shared_ptr<IGameView> gameView(netGameView); m_CometConquest->VAddView(gameView, sockID); extern void ListenForCometConquestViewEvents(EventListenerPtr listener); EventListenerPtr listener ( GCC_NEW NetworkEventForwarder( sockID ) ); ListenForCometConquestViewEvents( listener ); //} } else if ( EvtData_Network_Player_Actor_Assignment::sk_EventType == event.VGetEventType() ) { // we're a remote client getting an actor assignment. // the server assigned us a playerId when we first attached (the server's socketId, actually) const EvtData_Network_Player_Actor_Assignment & castEvent = static_cast< const EvtData_Network_Player_Actor_Assignment & >( event ); shared_ptr<IGameView> playersView(GCC_NEW CometConquestGameView(true)); playersView.get()->VOnAttach(castEvent.m_remotePlayerId, castEvent.m_actorId); m_CometConquest->VAddView(playersView, castEvent.m_actorId); } else if ( EvtData_PhysCollision::sk_EventType == event.VGetEventType() ) { const EvtData_PhysCollision & castEvent = static_cast< const EvtData_PhysCollision & >( event ); shared_ptr<IActor> pGameActorA = m_CometConquest->VGetActor(castEvent.m_ActorA); shared_ptr<IActor> pGameActorB = m_CometConquest->VGetActor(castEvent.m_ActorB); if (!pGameActorA || !pGameActorB) return false; int typeA = pGameActorA->VGetType(); int typeB = pGameActorB->VGetType(); //Bullets hitting things if(AT_Bullet == typeA && AT_Ship != typeB && AT_Floor != typeB) { m_CometConquest->VRemoveActor(pGameActorA->VGetID()); } if(AT_Bullet == typeB && AT_Ship != typeA && AT_Floor != typeA) { m_CometConquest->VRemoveActor(pGameActorB->VGetID()); } //Comets hitting boundry wall if(AT_Comet == typeB && AT_BoundryWall == typeA) { m_CometConquest->VRemoveActor(pGameActorB->VGetID()); } if(AT_Comet == typeA && AT_BoundryWall == typeB) { m_CometConquest->VRemoveActor(pGameActorA->VGetID()); } //Ship getting hit by a comet if(AT_Ship == typeA && AT_Comet == typeB) { ShipParams tp; tp.m_StartPosition = static_cast<ShipParams *>(pGameActorA->VGetParams().get())->m_StartPosition; tp.m_Mat = tp.m_StartPosition; tp.m_Length = 2.5; tp.m_ViewId = static_cast<ShipParams *>(pGameActorA->VGetParams().get())->m_ViewId; tp.m_Team = static_cast<ShipParams *>(pGameActorA->VGetParams().get())->m_Team; const EvtData_Request_New_Actor requestShip( &tp ); m_CometConquest->VRemoveActor(pGameActorA->VGetID()); safeTriggerEvent( requestShip ); } if(AT_Ship == typeB && AT_Comet == typeA) { ShipParams tp; tp.m_StartPosition = static_cast<ShipParams *>(pGameActorB->VGetParams().get())->m_StartPosition; tp.m_Mat = tp.m_StartPosition; tp.m_Length = 2.5; tp.m_ViewId = static_cast<ShipParams *>(pGameActorB->VGetParams().get())->m_ViewId; tp.m_Team = static_cast<ShipParams *>(pGameActorB->VGetParams().get())->m_Team; const EvtData_Request_New_Actor requestShip( &tp ); m_CometConquest->VRemoveActor(pGameActorB->VGetID()); safeTriggerEvent( requestShip ); } //Shooting players if(AT_Ship == typeA && AT_Bullet == typeB) { ShipParams tp; tp.m_StartPosition = static_cast<ShipParams *>(pGameActorA->VGetParams().get())->m_StartPosition; tp.m_Mat = tp.m_StartPosition; tp.m_Length = 2.5; //tp.m_Id = pGameActorA->VGetID(); tp.m_ViewId = static_cast<ShipParams *>(pGameActorA->VGetParams().get())->m_ViewId; tp.m_Team = static_cast<ShipParams *>(pGameActorA->VGetParams().get())->m_Team; const EvtData_Request_New_Actor requestShip( &tp ); //m_CometConquest->VRemoveActor(pGameActorB->VGetID()); safeTriggerEvent( requestShip ); m_CometConquest->VRemoveActor(pGameActorA->VGetID()); } if(AT_Ship == typeB && AT_Bullet == typeA) { ShipParams tp; tp.m_StartPosition = static_cast<ShipParams *>(pGameActorB->VGetParams().get())->m_StartPosition; tp.m_Mat = tp.m_StartPosition; tp.m_Length = 2.5; //tp.m_Id = pGameActorB->VGetID(); tp.m_ViewId = static_cast<ShipParams *>(pGameActorB->VGetParams().get())->m_ViewId; const EvtData_Request_New_Actor requestShip( &tp ); safeTriggerEvent( requestShip ); m_CometConquest->VRemoveActor(pGameActorB->VGetID()); } //Shooting Comets if(AT_Bullet == typeA && AT_Comet == typeB) { m_CometConquest->VRemoveActor(pGameActorB->VGetID()); //m_CometConquest->VRemoveActor(pGameActorA->VGetID()); } if(AT_Bullet == typeB && AT_Comet == typeA) { //m_CometConquest->VRemoveActor(pGameActorB->VGetID()); m_CometConquest->VRemoveActor(pGameActorA->VGetID()); } //Goal & Ring if(AT_Ring == typeA && AT_Goal == typeB) { RingParams rp; rp.m_StartPosition == static_cast<RingParams *>(pGameActorA->VGetParams().get())->m_StartPosition; rp.m_Mat = rp.m_StartPosition; const EvtData_Request_New_Actor requestRing (&rp); safeTriggerEvent (requestRing); m_CometConquest->VRemoveActor(pGameActorA->VGetID()); if(0 == static_cast<GoalParams*>(pGameActorB->VGetParams().get())->m_Team) { m_CometConquest->blueTeamScore(); } else { m_CometConquest->redTeamScore(); } } if(AT_Ring == typeB && AT_Goal == typeA) { RingParams rp; rp.m_StartPosition == static_cast<RingParams *>(pGameActorB->VGetParams().get())->m_StartPosition; rp.m_Mat = rp.m_StartPosition; const EvtData_Request_New_Actor requestRing (&rp); safeTriggerEvent (requestRing); m_CometConquest->VRemoveActor(pGameActorB->VGetID()); if(0 == static_cast<GoalParams*>(pGameActorA->VGetParams().get())->m_Team) { m_CometConquest->blueTeamScore(); } else { m_CometConquest->redTeamScore(); } } } else if ( EvtData_Thrust::sk_EventType == event.VGetEventType() ) { const EvtData_Thrust & castEvent = static_cast< const EvtData_Thrust & >( event ); shared_ptr<IActor> pActor = m_CometConquest->VGetActor(castEvent.m_id); if( pActor ) { static const float newtonForce = 1.f; float thrustForce = castEvent.m_throttle * newtonForce; Mat4x4 rotation = pActor->VGetMat(); rotation.SetPosition(Vec3(0,0,0)); Vec3 dir = rotation.Xform(g_Forward); dir.Normalize(); m_CometConquest->m_pPhysics->VApplyForce(dir, thrustForce, castEvent.m_id); } } else if ( EvtData_Steer::sk_EventType == event.VGetEventType() ) { static const float newtonForce = -.25 * 1.8f; const EvtData_Steer & castEvent = static_cast< const EvtData_Steer & >( event ); float steerForce = -castEvent.m_dir * newtonForce; m_CometConquest->m_pPhysics->VApplyTorque(Vec3(0,1,0), steerForce, castEvent.m_id); } else if ( EvtData_Fire_Weapon::sk_EventType == event.VGetEventType() ) { if(!this->m_CometConquest->m_bProxy) { const EvtData_Fire_Weapon & castEvent = static_cast< const EvtData_Fire_Weapon & >( event ); ActorId gunnerId = castEvent.m_id; shared_ptr<IActor> pGunner = m_CometConquest->VGetActor(gunnerId); if (pGunner) { //Calculate depth offset from the controller Vec4 at = g_Forward4 * 3.0f; Vec4 atWorld = pGunner->VGetMat().Xform(at); Vec3 normalDir(atWorld); normalDir.Normalize(); BulletParams sp; sp.m_Pos = pGunner->VGetMat().GetPosition() + Vec3(atWorld) * 3; sp.m_Radius = 0.25; sp.m_Segments = 16; sp.m_Color = g_Cyan; sp.m_NormalDir = normalDir; sp.m_Force = g_WeaponForce; sp.m_TeamFiredBy = static_cast<ShipParams *>(pGunner->VGetParams().get())->m_Team; //Request creation of this actor. const EvtData_Request_New_Actor cannonBallEvt( &sp ); safeTriggerEvent( cannonBallEvt ); return true; } } } else if ( EvtData_Move_Actor::sk_EventType == event.VGetEventType() ) { const EvtData_Move_Actor & castEvent = static_cast< const EvtData_Move_Actor & >( event ); m_CometConquest->VMoveActor(castEvent.m_Id, castEvent.m_Mat); } else if ( EvtData_Request_New_Actor::sk_EventType == event.VGetEventType() ) { const EvtData_Request_New_Actor & castEvent = static_cast< const EvtData_Request_New_Actor & >( event ); ActorParams * pActorParams = NULL; pActorParams = castEvent.m_pActorParams; //Did we get valid actor params? if ( NULL == pActorParams ) { assert( 0 && "Invalid parameters specified for actor!" ); return false; } //Valid params. const ActorId actorID = m_CometConquest->GetNewActorID(); pActorParams->m_Id = actorID; //Package as a new actor event. /* IEventDataPtr actorEvent( IEventDataPtr( GCC_NEW EvtData_New_Actor( actorID, pActorParams ) ) ); const bool bSuccess = safeQueEvent( actorEvent ); */ const EvtData_New_Actor actorEvent( actorID, pActorParams ); const bool bSuccess = safeTriggerEvent( actorEvent ); return bSuccess; } else if ( EvtData_New_Actor::sk_EventType == event.VGetEventType() ) { const EvtData_New_Actor & castEvent = static_cast< const EvtData_New_Actor & >( event ); ActorParams * pActorParams = castEvent.m_pActorParams; if ( NULL == pActorParams ) { assert( 0 && "Received a new actor event with NULL actor parameters!" ); return false; } pActorParams->VCreate(m_CometConquest); if ( false == castEvent.m_id ) { assert( 0 && "Unable to construct desired actor type!" ); return false; } } return false; }
int InternalScriptExports::CreateActor(const char* actorArchetype, LuaPlus::LuaObject luaPosition, LuaPlus::LuaObject luaYawPitchRoll) { if (!luaPosition.IsTable()) { GCC_ERROR("Invalid object passed to CreateActor(); type = " + std::string(luaPosition.TypeName())); return INVALID_ACTOR_ID; } if (!luaYawPitchRoll.IsTable()) { GCC_ERROR("Invalid object passed to CreateActor(); type = " + std::string(luaYawPitchRoll.TypeName())); return INVALID_ACTOR_ID; } Vec3 pos(luaPosition["x"].GetFloat(), luaPosition["y"].GetFloat(), luaPosition["z"].GetFloat()); Vec3 ypr(luaYawPitchRoll["x"].GetFloat(), luaYawPitchRoll["y"].GetFloat(), luaYawPitchRoll["z"].GetFloat()); Mat4x4 initialTransform; initialTransform.BuildYawPitchRoll(ypr.x, ypr.y, ypr.z); initialTransform.SetPosition(pos); TiXmlElement *overloads = NULL; StrongActorPtr pActor = g_pApp->m_pGame->VCreateActor(actorArchetype, overloads, &initialTransform); if (pActor) { shared_ptr<EvtData_New_Actor> pNewActorEvent(GCC_NEW EvtData_New_Actor(pActor->GetId())); IEventManager::Get()->VQueueEvent(pNewActorEvent); return pActor->GetId(); } return INVALID_ACTOR_ID; }