//---------------------------------------------------------------------------- Node* Game::LoadAndInitializeScene() { Importer importer("Data/Scene/"); Node* pScene = importer.LoadSceneFromXml("Scene.xml", mspPhysicsWorld); if (!pScene) { return NULL; } NodeCamera* pCameraNode = pScene->FindChild<NodeCamera>(); WIRE_ASSERT(pCameraNode /* No Camera in scene.xml */); mspSceneCamera = pCameraNode->Get(); mSortingCuller.SetCamera(mspSceneCamera); // The maximum number of objects that are going to be culled is the // number of objects we imported. If we don't set the size of the set now, // the culler will dynamically increase it during runtime. This is not // a big deal, however it is better to avoid memory allocations during the // render loop. UInt renderObjectCount = importer.GetStatistics()->RenderObjectCount; mSortingCuller.SetMaxQuantity(renderObjectCount); // Create and configure probe robot controller SpatialPtr spRedHealthBar = mspGUI->FindChild("RedHealthBar"); WIRE_ASSERT(spRedHealthBar /* No RedHealthBar in GUI.xml */); Node* pProbeRobotSpatial = DynamicCast<Node>(pScene->FindChild("Probe Robot")); WIRE_ASSERT(pProbeRobotSpatial /* No Probe Robot in Scene.xml */); // Detach red energy/health bar and attach it robot probe as a billboard NodeBillboard* pBillboard = WIRE_NEW NodeBillboard; pProbeRobotSpatial->AttachChild(pBillboard); Node* pParent = DynamicCast<Node>(spRedHealthBar->GetParent()); WIRE_ASSERT(pParent); pParent->DetachChild(spRedHealthBar); pBillboard->AttachChild(spRedHealthBar); Spatial* pPlayerSpatial = pScene->FindChild("Player"); WIRE_ASSERT(pPlayerSpatial /* No Player in Scene.xml */); mspProbeRobot = WIRE_NEW ProbeRobot(mspPhysicsWorld, pPlayerSpatial, spRedHealthBar); pProbeRobotSpatial->AttachController(mspProbeRobot); // Create and configure player controller mspPlayer = WIRE_NEW Player(mspSceneCamera, mspPhysicsWorld); pPlayerSpatial->AttachController(mspPlayer); Spatial* pPlatform = pScene->FindChild("Platform"); WIRE_ASSERT(pPlatform /* Platform object missing in scene */); pPlatform->AttachController(WIRE_NEW Elevator(mspPhysicsWorld)); pScene->Bind(GetRenderer()); pScene->WarmUpRendering(GetRenderer()); return pScene; }
//---------------------------------------------------------------------------- Node* Game::LoadAndInitializeLoading() { Importer importer("Data/Logo/"); Node* pRoot = importer.LoadSceneFromXml("logo.xml"); if (!pRoot) { return NULL; } NodeCamera* pCameraNode = pRoot->FindChild<NodeCamera>(); WIRE_ASSERT(pCameraNode /* No Camera in logo.xml */); mspLogoCamera = pCameraNode->Get(); // center 512x256 logo on screen pRoot->Local.SetTranslate(Vector3F((GetWidthF()-512.0F) * 0.5F, (GetHeightF() - 256.0F) * 0.5F, 0)); pRoot->Bind(GetRenderer()); return pRoot; }
//---------------------------------------------------------------------------- Node* Game::LoadAndInitializeGUI() { Importer importer("Data/GUI/"); Node* pRoot = importer.LoadSceneFromXml("GUI.xml"); if (!pRoot) { return NULL; } NodeCamera* pCameraNode = pRoot->FindChild<NodeCamera>(); WIRE_ASSERT(pCameraNode /* No Camera in GUI.xml */); mspGUICamera = pCameraNode->Get(); mspCrosshair = pRoot->FindChild("Crosshair"); WIRE_ASSERT(mspCrosshair /* No Crosshair in GUI.xml */); pRoot->Bind(GetRenderer()); return pRoot; }
//---------------------------------------------------------------------------- void NodeCamera::Draw(TArray<NodeCamera*>& rNodeCameras, Spatial* pRoot, Culler& rCuller, Renderer* pRenderer) { WIRE_ASSERT(pRenderer && pRoot); if (!pRenderer || !pRoot) { return; } const UInt maxCameraCount = 64; if (rNodeCameras.GetQuantity() >= 64) { WIRE_ASSERT(false); return; } // cull all skyboxes attached to cameras in the scene Spatial::CullingMode tempCullingModes[maxCameraCount]; for (UInt i = 0; i < rNodeCameras.GetQuantity(); i++) { NodeCamera* pNodeCamera = rNodeCameras[i]; WIRE_ASSERT(pNodeCamera); Node* pSkybox = pNodeCamera->mspSkybox; if (pSkybox && pNodeCamera->IsEnabled()) { tempCullingModes[i] = pSkybox->Culling; pSkybox->Culling = Spatial::CULL_ALWAYS; } } for (UInt i = 0; i < rNodeCameras.GetQuantity(); i++) { NodeCamera* pNodeCamera = rNodeCameras[i]; WIRE_ASSERT(pNodeCamera && pNodeCamera->Get()); if (!pNodeCamera->IsEnabled()) { continue; } Camera* pCamera = pNodeCamera->Get(); rCuller.SetCamera(pCamera); rCuller.ComputeVisibleSet(pRoot); Float left; Float right; Float top; Float bottom; pCamera->GetViewport(left, right, top, bottom); UInt width = pRenderer->GetWidth(); UInt height = pRenderer->GetHeight(); Vector4F rect; rect.X() = MathF::Round(left*width); rect.Y() = MathF::Round((1.0F-top)*height); rect.Z() = MathF::Round((right-left)*width); rect.W() = MathF::Round((top-bottom)*height); ColorRGBA clearColor = pRenderer->GetClearColor(); switch (rNodeCameras[i]->mClearFlag) { case CF_ALL: pRenderer->SetClearColor(pNodeCamera->GetClearColor()); pRenderer->ClearBuffers(true, true, rect); pRenderer->SetClearColor(clearColor); break; case CF_Z_ONLY: pRenderer->ClearBuffers(false, true, rect); break; case CF_NONE: break; default: WIRE_ASSERT(false); } pRenderer->SetCamera(pCamera); pRenderer->Draw(rCuller.GetVisibleSets()); Node* pSkybox = pNodeCamera->mspSkybox; if (pSkybox) { pSkybox->Culling = Spatial::CULL_NEVER; rCuller.ComputeVisibleSet(pSkybox); pRenderer->Draw(rCuller.GetVisibleSets()); pSkybox->Culling = Spatial::CULL_ALWAYS; } } // restore culling mode of all skyboxes attached to cameras in the scene for (UInt i = 0; i < rNodeCameras.GetQuantity(); i++) { NodeCamera* pNodeCamera = rNodeCameras[i]; WIRE_ASSERT(pNodeCamera); Node* pSkybox = pNodeCamera->mspSkybox; if (pSkybox && pNodeCamera->IsEnabled()) { pSkybox->Culling = tempCullingModes[i]; } } }