diff --git a/Graphics2/Camera.h b/Graphics2/Camera.h index 10f5f8e..1749e50 100644 --- a/Graphics2/Camera.h +++ b/Graphics2/Camera.h @@ -38,6 +38,7 @@ private: float _moveForwardBack; float _cameraYaw; + float _cameraYawPrev; float _cameraPitch; float _cameraRoll; diff --git a/Graphics2/ControlledMeshNode.cpp b/Graphics2/ControlledMeshNode.cpp index 4e1bc4c..19cd742 100644 --- a/Graphics2/ControlledMeshNode.cpp +++ b/Graphics2/ControlledMeshNode.cpp @@ -7,6 +7,7 @@ ControlledMeshNode::ControlledMeshNode(wstring name, wstring modelName) : MeshNo void ControlledMeshNode::Update(FXMMATRIX& currentWorldTransformation) { ObjectNode::Update(_worldTransformation); + MeshNode::Update(currentWorldTransformation); } bool ControlledMeshNode::Initialise(void) diff --git a/Graphics2/Graphics2.cpp b/Graphics2/Graphics2.cpp index 106f93f..e6902f1 100644 --- a/Graphics2/Graphics2.cpp +++ b/Graphics2/Graphics2.cpp @@ -36,13 +36,23 @@ void Graphics2::CreateSceneGraph() //terrainNode->SetWaterColor(XMFLOAT4(0.0f, 0.0f, 1.0f, 1.0f)); sceneGraph->Add(terrainNode); - shared_ptr plane1Node = make_shared(L"Plane1", L"Models\\Plane\\Bonanza.3DS"); + shared_ptr plane1Node = make_shared(L"Plane1", L"Models\\Plane\\Bonanza.3DS"); plane1Node->SetStartOrientation(XMMatrixRotationAxis(XMVectorSet(0.0f, 0.0f, 1.0f, 0.0f), XM_PI) * XMMatrixRotationAxis(XMVectorSet(1.0f, 0.0f, 0.0f, 0.0f), 0.5f * XM_PI)); plane1Node->SetNodePosition(0.0f, 550.0f, -50.0f); sceneGraph->Add(plane1Node); - //_currentPlayerObject = plane1Node; - //GetCamera()->SetFollowNode(plane1Node, XMFLOAT3(0.0f, 30.0f, -80.0f), false); + shared_ptr boatGraph = make_shared(L"boatGraph"); + boatGraph->SetWorldTransform(XMMatrixScaling(0.1f, 0.1f, 0.1f) * XMMatrixTranslation(-1840.0f, 290.0f, 699.0f)); + + shared_ptr boat1Node = make_shared(L"Boat1", L"Models\\Boat\\Boat.FBX"); + boat1Node->SetStartOrientation(XMMatrixRotationAxis(XMVectorSet(0.0f, 0.0f, 1.0f, 0.0f), XM_PI) * XMMatrixRotationAxis(XMVectorSet(1.0f, 0.0f, 0.0f, 0.0f), 0.5f * XM_PI)); + boat1Node->SetNodePosition(0.0f, 0.0f, 0.0f); + boatGraph->Add(boat1Node); + + sceneGraph->Add(boatGraph); + + _currentPlayerObject = plane1Node; + GetCamera()->SetFollowNode(plane1Node, XMFLOAT3(0.0f, 30.0f, -80.0f), false); SetBackgroundColour(XMFLOAT4(0.29f, 0.38f, 0.72f, 1.0f)); //SetBackgroundColour(XMFLOAT4(SharedMethods::RGBValueToIntensity(0x89), 0, 1, 1)); @@ -52,7 +62,7 @@ void Graphics2::CreateSceneGraph() _currentPropRotation = 0; } -void Graphics2::UpdateSceneGraph() +void Graphics2::GenerateClutter() { SceneGraphPointer sceneGraph = GetSceneGraph(); shared_ptr mainTerrain = dynamic_pointer_cast(sceneGraph->Find(L"MainTerrain")); @@ -60,22 +70,123 @@ void Graphics2::UpdateSceneGraph() if (!_initDone && mainTerrain != nullptr) { vector rngSpawnList; + vector rngBushSpawnList; + vector rngSnowSpawnList; + vector rngDirtSpawnList; TerrainPopNode treeModelA = TerrainPopNode(); - treeModelA.modelName = L"Models\\Tree\\Tree2.fbx"; + treeModelA.modelName = L"Models\\Tree\\Tree1.fbx"; treeModelA.nodeBaseName = L"treeA"; - treeModelA.scaleFactor = 1.0f; + treeModelA.scaleFactor = 0.5f; + + TerrainPopNode treeModelB = TerrainPopNode(); + treeModelB.modelName = L"Models\\Tree\\Tree2.fbx"; + treeModelB.nodeBaseName = L"treeB"; + treeModelB.scaleFactor = 0.5f; rngSpawnList.push_back(treeModelA); + rngSpawnList.push_back(treeModelB); shared_ptr treeGroupA = make_shared(L"TreeGroupA"); - mainTerrain->PopulateTerrain(treeGroupA, rngSpawnList, 10, 10, 400.0f, 550.0f, 0.9f, 1.0f); + mainTerrain->PopulateTerrain(treeGroupA, rngSpawnList, 20, 20, 500.0f, 650.0f, 0.9f, 1.0f); treeGroupA->Initialise(); sceneGraph->Add(treeGroupA); + TerrainPopNode bushModelA = TerrainPopNode(); + bushModelA.modelName = L"Models\\Tree\\Bush1.fbx"; + bushModelA.nodeBaseName = L"bushA"; + bushModelA.scaleFactor = 0.05f; + + TerrainPopNode bushModelB = TerrainPopNode(); + bushModelB.modelName = L"Models\\Tree\\Bush2.fbx"; + bushModelB.nodeBaseName = L"bushB"; + bushModelB.scaleFactor = 0.05f; + + TerrainPopNode grassModelA = TerrainPopNode(); + grassModelA.modelName = L"Models\\Tree\\Grass1.fbx"; + grassModelA.nodeBaseName = L"grassA"; + grassModelA.scaleFactor = 0.005f; + + TerrainPopNode grassModelB = TerrainPopNode(); + grassModelB.modelName = L"Models\\Tree\\Grass2.fbx"; + grassModelB.nodeBaseName = L"grassB"; + grassModelB.scaleFactor = 0.05f; + + TerrainPopNode grassModelC = TerrainPopNode(); + grassModelC.modelName = L"Models\\Tree\\Grass3.fbx"; + grassModelC.nodeBaseName = L"grassC"; + grassModelC.scaleFactor = 0.05f; + + rngBushSpawnList.push_back(bushModelA); + rngBushSpawnList.push_back(bushModelB); + rngBushSpawnList.push_back(grassModelA); + rngBushSpawnList.push_back(grassModelB); + rngBushSpawnList.push_back(grassModelC); + + shared_ptr bushGroupA = make_shared(L"BushGroupA"); + + mainTerrain->PopulateTerrain(bushGroupA, rngBushSpawnList, 7, 7, 500.0f, 650.0f, 0.95f, 1.0f); + bushGroupA->Initialise(); + sceneGraph->Add(bushGroupA); + + TerrainPopNode treeModelSA = TerrainPopNode(); + treeModelSA.modelName = L"Models\\Tree\\Tree3.fbx"; + treeModelSA.nodeBaseName = L"treeSA"; + treeModelSA.scaleFactor = 0.1f; + + rngSnowSpawnList.push_back(treeModelSA); + + shared_ptr treeGroupSA = make_shared(L"TreeGroupSnowA"); + + mainTerrain->PopulateTerrain(treeGroupSA, rngSnowSpawnList, 50, 50, 750.0f, 1000.0f, 0.6f, 1.0f); + treeGroupSA->Initialise(); + sceneGraph->Add(treeGroupSA); + + TerrainPopNode treeModelDA = TerrainPopNode(); + treeModelDA.modelName = L"Models\\Tree\\Tree4.fbx"; + treeModelDA.nodeBaseName = L"treeDA"; + treeModelDA.scaleFactor = 0.05f; + + TerrainPopNode rockModelA = TerrainPopNode(); + rockModelA.modelName = L"Models\\Tree\\Rock1.fbx"; + rockModelA.nodeBaseName = L"rockA"; + rockModelA.scaleFactor = 0.1f; + + TerrainPopNode rockModelB = TerrainPopNode(); + rockModelB.modelName = L"Models\\Tree\\Rock2.fbx"; + rockModelB.nodeBaseName = L"rockB"; + rockModelB.scaleFactor = 0.1f; + + TerrainPopNode rockModelC = TerrainPopNode(); + rockModelC.modelName = L"Models\\Tree\\Rock3.fbx"; + rockModelC.nodeBaseName = L"rockC"; + rockModelC.scaleFactor = 0.1f; + + rngDirtSpawnList.push_back(treeModelDA); + rngDirtSpawnList.push_back(rockModelA); + rngDirtSpawnList.push_back(rockModelB); + rngDirtSpawnList.push_back(rockModelC); + + shared_ptr treeGroupDA = make_shared(L"TreeGroupDirtA"); + + mainTerrain->PopulateTerrain(treeGroupDA, rngDirtSpawnList, 10, 10, 310.0f, 410.0f, 0.9f, 1.0f); + treeGroupDA->Initialise(); + sceneGraph->Add(treeGroupDA); + _initDone = true; } +} + +void Graphics2::UpdateSceneGraph() +{ + SceneGraphPointer sceneGraph = GetSceneGraph(); + shared_ptr mainTerrain = dynamic_pointer_cast(sceneGraph->Find(L"MainTerrain")); + + if (!_initDone && mainTerrain != nullptr) + { + GenerateClutter(); + } GetCurrentControlInputs(); XMVECTOR startCameraPos = GetCamera()->GetCameraPosition(); @@ -165,6 +276,7 @@ void Graphics2::UpdateSceneGraph() } shared_ptr plane1 = dynamic_pointer_cast(sceneGraph->Find(L"Plane1")); + shared_ptr boat1 = dynamic_pointer_cast(sceneGraph->Find(L"Boat1")); if (plane1 != nullptr) { @@ -176,6 +288,12 @@ void Graphics2::UpdateSceneGraph() plane1->Find(L"airscrew")->SetWorldTransform(SharedMethods::RotateFromPoint(0.0f, 15.471f, 14.5f, XMMatrixRotationAxis(XMVectorSet(0.0f, 1.0f, 0.0f, 0.0f), _currentPropRotation * XM_PI / 180.0f))); } + if (boat1 != nullptr) + { + boat1->SetForwardBack(10.0f); + boat1->SetYaw(-1.0f); + } + if (_currentRotation == 360) { _currentRotation = 0; diff --git a/Graphics2/Graphics2.h b/Graphics2/Graphics2.h index 7e80e0a..19eb632 100644 --- a/Graphics2/Graphics2.h +++ b/Graphics2/Graphics2.h @@ -5,6 +5,7 @@ #include "TexturedCubeNode.h" #include "MeshNode.h" #include "SplitMeshNode.h" +#include "ControlledMeshNode.h" #include "ControlledSplitMeshNode.h" #include "HeightMapTerrainNode.h" #include "PerlinTerrainNode.h" @@ -44,5 +45,6 @@ private: void GetCurrentControlInputs(); void ResetCurrentControlInputs(); + void GenerateClutter(); }; diff --git a/Graphics2/MeshRenderer.cpp b/Graphics2/MeshRenderer.cpp index 5127c8f..3a885b4 100644 --- a/Graphics2/MeshRenderer.cpp +++ b/Graphics2/MeshRenderer.cpp @@ -62,10 +62,18 @@ void MeshRenderer::RenderNode(shared_ptr node, bool renderTransparent) _cBuffer.specularCoefficient = material->GetSpecularColour(); _cBuffer.shininess = material->GetShininess(); _cBuffer.opacity = opacity; - // Update the constant buffer + // Update the constant buffer + _texture = material->GetTexture(); + if (_texture == nullptr) + { + _cBuffer.validTexture = 0; + } + else + { + _cBuffer.validTexture = 1; + } _deviceContext->VSSetConstantBuffers(0, 1, _constantBuffer.GetAddressOf()); _deviceContext->UpdateSubresource(_constantBuffer.Get(), 0, 0, &_cBuffer, 0, 0); - _texture = material->GetTexture(); _deviceContext->PSSetShaderResources(0, 1, _texture.GetAddressOf()); _deviceContext->PSSetConstantBuffers(0, 1, _constantBuffer.GetAddressOf()); _deviceContext->IASetPrimitiveTopology(D3D11_PRIMITIVE_TOPOLOGY_TRIANGLELIST); diff --git a/Graphics2/Models/Boat/Boat.FBX b/Graphics2/Models/Boat/Boat.FBX new file mode 100644 index 0000000..f487d88 Binary files /dev/null and b/Graphics2/Models/Boat/Boat.FBX differ diff --git a/Graphics2/Models/Boat/NWW83WKS0AJC0W7C1XP0CFCET.mtl b/Graphics2/Models/Boat/NWW83WKS0AJC0W7C1XP0CFCET.mtl deleted file mode 100644 index 2f7f867..0000000 --- a/Graphics2/Models/Boat/NWW83WKS0AJC0W7C1XP0CFCET.mtl +++ /dev/null @@ -1,27 +0,0 @@ -newmtl mat_0-default-grey.jpg -Ka 0.000000 0.000000 0.000000 -Kd 0.698039 0.698039 0.698039 -Ks 0.000000 0.000000 0.000000 -d 1.000000 -illum 2 -Ns 9.84916 -map_Kd default-grey.jpg - -newmtl mat_1-boat_fishing02.jpg -Ka 0.000000 0.000000 0.000000 -Kd 0.698039 0.698039 0.698039 -Ks 0.000000 0.000000 0.000000 -d 1.000000 -illum 2 -Ns 9.84916 -map_Kd boat_fishing02.jpg - -newmtl mat_2-default-grey.jpg -Ka 0.000000 0.000000 0.000000 -Kd 0.698039 0.698039 0.698039 -Ks 0.000000 0.000000 0.000000 -d 1.000000 -illum 2 -Ns 9.84916 -map_Kd default-grey.jpg - diff --git a/Graphics2/Models/Boat/boat_fishing02.jpeg b/Graphics2/Models/Boat/boat_fishing02.jpeg deleted file mode 100644 index 2907ac1..0000000 Binary files a/Graphics2/Models/Boat/boat_fishing02.jpeg and /dev/null differ diff --git a/Graphics2/Models/Boat/boat_fishing02.jpg b/Graphics2/Models/Boat/boat_fishing02.jpg deleted file mode 100644 index 2907ac1..0000000 Binary files a/Graphics2/Models/Boat/boat_fishing02.jpg and /dev/null differ diff --git a/Graphics2/Models/Boat/textures/boat_ao.bmp b/Graphics2/Models/Boat/textures/boat_ao.bmp new file mode 100644 index 0000000..1ad109e Binary files /dev/null and b/Graphics2/Models/Boat/textures/boat_ao.bmp differ diff --git a/Graphics2/Models/Boat/textures/boat_diffuse.bmp b/Graphics2/Models/Boat/textures/boat_diffuse.bmp new file mode 100644 index 0000000..d852243 Binary files /dev/null and b/Graphics2/Models/Boat/textures/boat_diffuse.bmp differ diff --git a/Graphics2/Models/Boat/textures/boat_gloss.bmp b/Graphics2/Models/Boat/textures/boat_gloss.bmp new file mode 100644 index 0000000..344d446 Binary files /dev/null and b/Graphics2/Models/Boat/textures/boat_gloss.bmp differ diff --git a/Graphics2/Models/Boat/textures/boat_normal.bmp b/Graphics2/Models/Boat/textures/boat_normal.bmp new file mode 100644 index 0000000..a7b262d Binary files /dev/null and b/Graphics2/Models/Boat/textures/boat_normal.bmp differ diff --git a/Graphics2/Models/Boat/textures/boat_specular.bmp b/Graphics2/Models/Boat/textures/boat_specular.bmp new file mode 100644 index 0000000..f80c3eb Binary files /dev/null and b/Graphics2/Models/Boat/textures/boat_specular.bmp differ diff --git a/Graphics2/Models/Tree/Bush1.fbx b/Graphics2/Models/Tree/Bush1.fbx index 7fc1249..569c434 100644 Binary files a/Graphics2/Models/Tree/Bush1.fbx and b/Graphics2/Models/Tree/Bush1.fbx differ diff --git a/Graphics2/Models/Tree/Bush2.fbx b/Graphics2/Models/Tree/Bush2.fbx index f5dc980..8d4e28a 100644 Binary files a/Graphics2/Models/Tree/Bush2.fbx and b/Graphics2/Models/Tree/Bush2.fbx differ diff --git a/Graphics2/Models/Tree/Bush3.fbx b/Graphics2/Models/Tree/Bush3.fbx deleted file mode 100644 index ec0b1ff..0000000 Binary files a/Graphics2/Models/Tree/Bush3.fbx and /dev/null differ diff --git a/Graphics2/Models/Tree/Grass1.fbx b/Graphics2/Models/Tree/Grass1.fbx index a8a1824..8a4cbb1 100644 Binary files a/Graphics2/Models/Tree/Grass1.fbx and b/Graphics2/Models/Tree/Grass1.fbx differ diff --git a/Graphics2/Models/Tree/Grass2.fbx b/Graphics2/Models/Tree/Grass2.fbx index fab2fdc..a855692 100644 Binary files a/Graphics2/Models/Tree/Grass2.fbx and b/Graphics2/Models/Tree/Grass2.fbx differ diff --git a/Graphics2/Models/Tree/Grass3.fbx b/Graphics2/Models/Tree/Grass3.fbx index 6623820..0ec5475 100644 Binary files a/Graphics2/Models/Tree/Grass3.fbx and b/Graphics2/Models/Tree/Grass3.fbx differ diff --git a/Graphics2/Models/Tree/Rock1.fbx b/Graphics2/Models/Tree/Rock1.fbx index 1a2b6d5..c17f7ba 100644 Binary files a/Graphics2/Models/Tree/Rock1.fbx and b/Graphics2/Models/Tree/Rock1.fbx differ diff --git a/Graphics2/Models/Tree/Rock2.fbx b/Graphics2/Models/Tree/Rock2.fbx index 6f251c7..a43a0a4 100644 Binary files a/Graphics2/Models/Tree/Rock2.fbx and b/Graphics2/Models/Tree/Rock2.fbx differ diff --git a/Graphics2/Models/Tree/Rock3.fbx b/Graphics2/Models/Tree/Rock3.fbx index f74240a..cfa3300 100644 Binary files a/Graphics2/Models/Tree/Rock3.fbx and b/Graphics2/Models/Tree/Rock3.fbx differ diff --git a/Graphics2/Models/Tree/Tree1.fbx b/Graphics2/Models/Tree/Tree1.fbx index 9555ae9..78df77a 100644 Binary files a/Graphics2/Models/Tree/Tree1.fbx and b/Graphics2/Models/Tree/Tree1.fbx differ diff --git a/Graphics2/Models/Tree/Tree1Test.fbx b/Graphics2/Models/Tree/Tree1Test.fbx new file mode 100644 index 0000000..ac38616 Binary files /dev/null and b/Graphics2/Models/Tree/Tree1Test.fbx differ diff --git a/Graphics2/Models/Tree/Tree2.fbx b/Graphics2/Models/Tree/Tree2.fbx index 2a5c4dd..dd0fd44 100644 Binary files a/Graphics2/Models/Tree/Tree2.fbx and b/Graphics2/Models/Tree/Tree2.fbx differ diff --git a/Graphics2/Models/Tree/Tree3.fbx b/Graphics2/Models/Tree/Tree3.fbx index 3fb451b..a6debc8 100644 Binary files a/Graphics2/Models/Tree/Tree3.fbx and b/Graphics2/Models/Tree/Tree3.fbx differ diff --git a/Graphics2/Models/Tree/Tree4.fbx b/Graphics2/Models/Tree/Tree4.fbx index f6461f2..28edbf8 100644 Binary files a/Graphics2/Models/Tree/Tree4.fbx and b/Graphics2/Models/Tree/Tree4.fbx differ diff --git a/Graphics2/Models/Tree/TreeTexture.png b/Graphics2/Models/Tree/TreeTexture.png new file mode 100644 index 0000000..b1a7c9c Binary files /dev/null and b/Graphics2/Models/Tree/TreeTexture.png differ diff --git a/Graphics2/ObjectNode.cpp b/Graphics2/ObjectNode.cpp index 4b3087c..8adf09d 100644 --- a/Graphics2/ObjectNode.cpp +++ b/Graphics2/ObjectNode.cpp @@ -99,11 +99,21 @@ void ObjectNode::SetLeftRight(float leftRight) _moveLeftRight = leftRight; } +float ObjectNode::GetLeftRight() const +{ + return _moveLeftRight; +} + void ObjectNode::SetForwardBack(float forwardBack) { _moveForwardBack = forwardBack; } +float ObjectNode::GetForwardBack() const +{ + return _moveForwardBack; +} + XMVECTOR ObjectNode::GetNodePosition(void) { return XMLoadFloat4(&_nodeRootPosition); diff --git a/Graphics2/ObjectNode.h b/Graphics2/ObjectNode.h index 103efc1..225e947 100644 --- a/Graphics2/ObjectNode.h +++ b/Graphics2/ObjectNode.h @@ -22,7 +22,9 @@ public: void SetTotalRoll(float roll); float GetRoll() const; void SetLeftRight(float leftRight); + float GetLeftRight() const; void SetForwardBack(float forwardBack); + float GetForwardBack() const; void SetStartOrientation(FXMMATRIX originalOrientation); protected: diff --git a/Graphics2/SharedMethods.h b/Graphics2/SharedMethods.h index cc83f6d..2fad7e1 100644 --- a/Graphics2/SharedMethods.h +++ b/Graphics2/SharedMethods.h @@ -14,7 +14,8 @@ struct CBUFFER XMFLOAT4 specularCoefficient; float shininess; float opacity; - float padding[2]; + float validTexture; + float padding[1]; }; struct TerrainPopNode diff --git a/Graphics2/SubMeshRenderer.cpp b/Graphics2/SubMeshRenderer.cpp index 4fc2882..cd26908 100644 --- a/Graphics2/SubMeshRenderer.cpp +++ b/Graphics2/SubMeshRenderer.cpp @@ -63,10 +63,18 @@ void SubMeshRenderer::RenderChild(SceneNodePointer node, bool renderTransparent) _cBuffer.specularCoefficient = material->GetSpecularColour(); _cBuffer.shininess = material->GetShininess(); _cBuffer.opacity = opacity; - // Update the constant buffer + // Update the constant buffer + _texture = material->GetTexture(); + if (_texture == nullptr) + { + _cBuffer.validTexture = 0; + } + else + { + _cBuffer.validTexture = 1; + } _deviceContext->VSSetConstantBuffers(0, 1, _constantBuffer.GetAddressOf()); _deviceContext->UpdateSubresource(_constantBuffer.Get(), 0, 0, &_cBuffer, 0, 0); - _texture = material->GetTexture(); _deviceContext->PSSetShaderResources(0, 1, _texture.GetAddressOf()); _deviceContext->PSSetConstantBuffers(0, 1, _constantBuffer.GetAddressOf()); _deviceContext->IASetPrimitiveTopology(D3D11_PRIMITIVE_TOPOLOGY_TRIANGLELIST); diff --git a/Graphics2/TerrainNode.cpp b/Graphics2/TerrainNode.cpp index fb6bb2f..119887c 100644 --- a/Graphics2/TerrainNode.cpp +++ b/Graphics2/TerrainNode.cpp @@ -531,7 +531,7 @@ void TerrainNode::PopulateTerrain(SceneGraphPointer currentSceneGraph, vector