#pragma once #include "DirectXFramework.h" #include #include #include "ColorGradient.h" #include "DDSTextureLoader.h" #include "WICTextureLoader.h" #include "SharedMethods.h" #include "SceneNode.h" typedef struct TerrainVertex { XMFLOAT3 Position; XMFLOAT3 Normal; XMFLOAT2 TexCoord; XMFLOAT2 BlendMapTexCoord; } TerrainVertex; class TerrainNode : public SceneNode { public: TerrainNode(wstring name, wstring heightMap, wstring seed, float waterHeight = 150.0f, wstring waterNormalMap = L"Textures\\waterNormals.bmp", int widthX = 1023, int widthZ = 1023, int cellSizeX = 10, int cellSizeZ = 10); void SetAmbientLight(XMFLOAT4 ambientLight); void SetWaterColor(XMFLOAT4 waterColor); void SetDirectionalLight(FXMVECTOR lightVector, XMFLOAT4 lightColor); void SetCameraPosition(XMFLOAT4 cameraPosition); bool Initialise(void); void Render(void); void Shutdown(void); private: int _widthX; int _widthZ; unsigned int _gridRows; unsigned int _gridCols; int _cellSizeX; int _cellSizeZ; bool _usedHeightMap; float _waterHeight; UINT _polygonsCount; UINT _indiciesCount; UINT _vertexCount; float _terrainStartX; float _terrainStartZ; float _terrainEndX; float _terrainEndZ; wstring _heightMap; wstring _seedString; unsigned int _seedHash; vector _terrainVerts; vector _indices; vector _heightValues; XMFLOAT4 _ambientLight; XMFLOAT4 _directionalLightVector; XMFLOAT4 _directionalLightColor; XMFLOAT4 _cameraPosition; ComPtr _device; ComPtr _deviceContext; ComPtr _vertexBuffer; ComPtr _indexBuffer; ComPtr _vertexShaderByteCode = nullptr; ComPtr _pixelShaderByteCode = nullptr; ComPtr _vertexShader; ComPtr _pixelShader; ComPtr _layout; ComPtr _constantBuffer; ComPtr _texturesResourceView; ComPtr _blendMapResourceView; ComPtr _defaultRasteriserState; ComPtr _wireframeRasteriserState; ComPtr _rngNoiseMap; ComPtr _waterNormalMap; wstring _waterNormalMapName; XMFLOAT4 _waterColor; void GenerateTerrainData(); void GenerateBuffers(); void BuildShaders(); void BuildVertexLayout(); void BuildConstantBuffer(); void BuildRendererStates(); void LoadTerrainTextures(); void GenerateBlendMap(); bool LoadHeightMap(wstring heightMapFilename); float GetHeightMapValueAt(int index); void AddNormalToVertex(int row, int col, int vertexIndex, XMVECTOR normal); void BuildExtraMaps(); };