Esempio n. 1
0
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);
}
Esempio n. 2
0
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));
}