void SceneManagerCMPlay::InitSceneGraph() { // root node this->sceneGraph = getNode(); this->sceneGraph->SetGameObject(NULL); // first child node of the scenegraph consists of static nodes / nodes that do not need constantly update this->staticSceneGraph = getNode(); this->staticSceneGraph->SetGameObject(NULL); // second child node of the scenegraph consists of dynamic / moving nodes / nodes that need to be updated with spatial partition for collision detection this->dynamicSceneGraph = getNode(); this->dynamicSceneGraph->SetGameObject(NULL); // add the 2 child to parent node first sceneGraph->AddChildNode(staticSceneGraph); sceneGraph->AddChildNode(dynamicSceneGraph); SceneNode* node; Mesh* drawMesh; //Init player(Body is main node) Player->Init(Vector3(0, 0, 0), Vector3(0, 1, 0), resourceManager.retrieveMesh("WARRIOR_OBJ")); //Temp use all the same mesh drawMesh = resourceManager.retrieveMesh("WARRIOR_OBJ"); //Head of player node = getNode(); node->GetGameObject()->setMesh(drawMesh); node->GetGameObject()->setName("Head"); Player->GetNode()->AddChildNode(node); Player->GetNode()->GetChildNode("Head")->GetGameObject()->setPosition(Vector3(0, 5, 0)); Player->GetNode()->GetChildNode("Head")->GetGameObject()->setHitbox(Vector3(0, 0, 0), 5, 5, 5, "HeadHitbox"); //Left Hand of player node = getNode(); node->GetGameObject()->setMesh(drawMesh); node->GetGameObject()->setName("LeftHand"); Player->GetNode()->AddChildNode(node); Player->GetNode()->GetChildNode("LeftHand")->GetGameObject()->setPosition(Vector3(-5, 0, 0)); Player->GetNode()->GetChildNode("LeftHand")->GetGameObject()->setHitbox(Vector3(0,0,0), 1, 1, 1, "LeftHandHitbox"); //Right Hand of player node = getNode(); node->GetGameObject()->setMesh(drawMesh); node->GetGameObject()->setName("RightHand"); Player->GetNode()->AddChildNode(node); Player->GetNode()->GetChildNode("RightHand")->GetGameObject()->setPosition(Vector3(5, 0, 0)); Player->GetNode()->GetChildNode("RightHand")->GetGameObject()->setHitbox(Vector3(0, 0, 0), 1, 1, 1, "RightHandHitbox"); //Left Leg of player node = getNode(); node->GetGameObject()->setMesh(drawMesh); node->GetGameObject()->setName("LeftLeg"); Player->GetNode()->AddChildNode(node); Player->GetNode()->GetChildNode("LeftLeg")->GetGameObject()->setPosition(Vector3(-3, -5, 0)); Player->GetNode()->GetChildNode("LeftLeg")->GetGameObject()->setHitbox(Vector3(0, 0, 0), 1, 1, 1, "LeftLegHitbox"); //Right Leg of player node = getNode(); node->GetGameObject()->setMesh(drawMesh); node->GetGameObject()->setName("RightLeg"); Player->GetNode()->AddChildNode(node); Player->GetNode()->GetChildNode("RightLeg")->GetGameObject()->setPosition(Vector3(3, -5, 0)); Player->GetNode()->GetChildNode("RightLeg")->GetGameObject()->setHitbox(Vector3(0, 0, 0), 1, 1, 1, "RightLegHitbox"); //Adds the player node dynamicSceneGraph->AddChildNode(Player->GetNode()); node = getNode(); node->GetGameObject()->setMesh(drawMesh); node->GetGameObject()->setName("TestObject"); node->GetGameObject()->setPosition(Vector3(0, 0, 50)); node->GetGameObject()->setHitbox(node->GetGameObject()->getPosition(),20,20,20,"TestObject"); dynamicSceneGraph->AddChildNode(node); // Rmb to init static nodes position first spatialPartitionManager->addNode(sceneGraph, spatialPartitionManager->type); }
void SceneManagerCMPlay::Update(double dt) { SceneManagerGameplay::Update(dt); //FSMApplication(); //spatialPartitionManager->Update(); spatialPartitionManager->removeNode(dynamicSceneGraph); spatialPartitionManager->addNode(dynamicSceneGraph, this->spatialPartitionManager->type); // loop through partitions for (unsigned i = 0; i < spatialPartitionManager->partitions.size(); ++i) { // check if partitions contain more than 1 node ( can further optimize by checking if contains dynamic nodes) if (spatialPartitionManager->partitions[i]->nodes.size() > 0) { for (vector<SceneNode*>::iterator j = spatialPartitionManager->partitions[i]->nodes.begin(); j != spatialPartitionManager->partitions[i]->nodes.end(); ++j) { SceneNode* firstNode = *j; for (vector<SceneNode*>::iterator k = j + 1; k != spatialPartitionManager->partitions[i]->nodes.end(); ++k) { SceneNode* secondNode = *k; string boxName = ""; if (firstNode->getActive() && secondNode->getActive()) { //Only check if both are not player if (firstNode->GetGameObject()->getName() != "Player" && secondNode->GetGameObject()->getName() != "Player" && firstNode->GetGameObject()->getName() != "LeftHand" && secondNode->GetGameObject()->getName() != "LeftHand" && firstNode->GetGameObject()->getName() != "RightHand" && secondNode->GetGameObject()->getName() != "RightHand") { if (check3DCollision(firstNode->GetGameObject()->getHitbox(), secondNode->GetGameObject()->getHitbox(), boxName)) { if (firstNode->GetGameObject()->getName() == "testprojectile") { //projectileManager.RemoveProjectile(firstNode->GetGameObject()); spatialPartitionManager->removeNode(secondNode); dynamicSceneGraph->RemoveChildNode(secondNode); j = spatialPartitionManager->partitions[i]->nodes.begin(); break; } else if (secondNode->GetGameObject()->getName() == "testprojectile") { //projectileManager.RemoveProjectile(firstNode->GetGameObject()); spatialPartitionManager->removeNode(firstNode); dynamicSceneGraph->RemoveChildNode(firstNode); j = spatialPartitionManager->partitions[i]->nodes.begin(); break; } //Every other thing spatialPartitionManager->removeNode(secondNode); dynamicSceneGraph->RemoveChildNode(secondNode); j = spatialPartitionManager->partitions[i]->nodes.begin(); break; } } } } } } } /*Sound testing related keys*/ if (inputManager->getKey("TEST_SOUND")) { resourceManager.setListenerPosition(tpCamera.getPosition(), tpCamera.getTarget()); static int distance = 2; //distance++; //resourceManager.retrieveSoundas2D("MenuFeedback"); resourceManager.retrieveSoundas3D("MenuFeedback", tpCamera.getPosition() + (float)distance); } if (inputManager->getKey("VOLUME_UP")) { resourceManager.IncreaseSoundEngineVolume(); } if (inputManager->getKey("VOLUME_DOWN")) { resourceManager.DecreaseSoundEngineVolume(); } //tpCamera.Update(dt); if (inputManager->getKey("RSelect")) { Vector3 characterPos = dynamicSceneGraph->GetChildNode("Player")->GetGameObject()->getPosition(); testProjectile.setPosition(characterPos); CProjectile* projectile = projectileManager.FetchProjectile(testProjectile, (tpCamera.getTarget() - tpCamera.getPosition()).Normalized(), 20.f); GameObject3D* newProjectile = projectile; SceneNode* node; node = getNode(); node->SetGameObject(newProjectile); dynamicSceneGraph->AddChildNode(node); } projectileManager.Update(dt); if (inputManager->getKey("LockPitch")) { tpCamera.TogglePitchLock(); } if (inputManager->getKey("LockYaw")) { tpCamera.ToggleYawLock(); } const float moveSpeed = 100.f; if (inputManager->getKey("Up")) { Player->SetAngle(tpCamera.GetCamAngle()); if (inputManager->getKey("Left")) { Player->SetAngle(tpCamera.GetCamAngle() - 45.f); } if (inputManager->getKey("Right")) { Player->SetAngle(tpCamera.GetCamAngle() + 45.f); } Player->UpdateMovement(dt); } if (inputManager->getKey("Down")) { Player->SetAngle(tpCamera.GetCamAngle() + 180.f); if (inputManager->getKey("Left")) { Player->SetAngle(tpCamera.GetCamAngle() - 135.f); } if (inputManager->getKey("Right")) { Player->SetAngle(tpCamera.GetCamAngle() + 135.f); } Player->UpdateMovement(dt); } if (inputManager->getKey("Left")) { Player->SetAngle(tpCamera.GetCamAngle() + 90.f); Player->UpdateMovement(dt); } if (inputManager->getKey("Right")) { Player->SetAngle(tpCamera.GetCamAngle() - 90.f); Player->UpdateMovement(dt); } dynamicSceneGraph->GetChildNode("Player")->GetGameObject()->setPosition(Vector3( dynamicSceneGraph->GetChildNode("Player")->GetGameObject()->getPosition().x, dynamicSceneGraph->GetChildNode("Player")->GetGameObject()->getPosition().y, dynamicSceneGraph->GetChildNode("Player")->GetGameObject()->getPosition().z)); dynamicSceneGraph->GetChildNode("Player")->GetGameObject()->setRotation(Player->GetAngle(), 0, 1, 0); tpCamera.UpdatePosition(dynamicSceneGraph->GetChildNode("Player")->GetGameObject()->getPosition(), Vector3(0, 0, 0)); }