summaryrefslogtreecommitdiff
path: root/sample/d3d11/terrain.cpp
diff options
context:
space:
mode:
authorJason Maskell <[email protected]>2016-05-12 10:58:15 +0200
committerJason Maskell <[email protected]>2016-05-12 10:58:15 +0200
commit72b21c69e32c73abf3a18b0e962746e64faebba4 (patch)
treecd22b1b298bc865c3ae6037e8eb89a64a94203ea /sample/d3d11/terrain.cpp
parentMerge branch 'master' of https://github.com/NVIDIAGameWorks/WaveWorks (diff)
downloadwaveworks_archive-72b21c69e32c73abf3a18b0e962746e64faebba4.tar.xz
waveworks_archive-72b21c69e32c73abf3a18b0e962746e64faebba4.zip
Restructuring starts. Got some initial CMake problems sorted. Need to extend.
Diffstat (limited to 'sample/d3d11/terrain.cpp')
-rw-r--r--sample/d3d11/terrain.cpp1524
1 files changed, 0 insertions, 1524 deletions
diff --git a/sample/d3d11/terrain.cpp b/sample/d3d11/terrain.cpp
deleted file mode 100644
index c3a9682..0000000
--- a/sample/d3d11/terrain.cpp
+++ /dev/null
@@ -1,1524 +0,0 @@
-// This code contains NVIDIA Confidential Information and is disclosed
-// under the Mutual Non-Disclosure Agreement.
-//
-// Notice
-// ALL NVIDIA DESIGN SPECIFICATIONS AND CODE ("MATERIALS") ARE PROVIDED "AS IS" NVIDIA MAKES
-// NO REPRESENTATIONS, WARRANTIES, EXPRESSED, IMPLIED, STATUTORY, OR OTHERWISE WITH RESPECT TO
-// THE MATERIALS, AND EXPRESSLY DISCLAIMS ANY IMPLIED WARRANTIES OF NONINFRINGEMENT,
-// MERCHANTABILITY, OR FITNESS FOR A PARTICULAR PURPOSE.
-//
-// NVIDIA Corporation assumes no responsibility for the consequences of use of such
-// information or for any infringement of patents or other rights of third parties that may
-// result from its use. No license is granted by implication or otherwise under any patent
-// or patent rights of NVIDIA Corporation. No third party distribution is allowed unless
-// expressly authorized by NVIDIA. Details are subject to change without notice.
-// This code supersedes and replaces all information previously supplied.
-// NVIDIA Corporation products are not authorized for use as critical
-// components in life support devices or systems without express written approval of
-// NVIDIA Corporation.
-//
-// Copyright � 2008- 2013 NVIDIA Corporation. All rights reserved.
-//
-// NVIDIA Corporation and its licensors retain all intellectual property and proprietary
-// rights in and to this software and related documentation and any modifications thereto.
-// Any use, reproduction, disclosure or distribution of this software and related
-// documentation without an express license agreement from NVIDIA Corporation is
-// strictly prohibited.
-//
-
-#include "DXUT.h"
-#include "terrain.h"
-#include <time.h>
-
-#include "ocean_surface.h"
-
-#ifndef PI
-#define PI 3.14159265358979323846f
-#endif
-
-extern OceanSurface *g_pOceanSurf;
-extern GFSDK_WaveWorks_SimulationHandle g_hOceanSimulation;
-extern GFSDK_WaveWorks_SavestateHandle g_hOceanSavestate;
-extern GFSDK_WaveWorks_Quadtree_Stats g_ocean_quadtree_stats;
-
-
-extern D3D11_QUERY_DATA_PIPELINE_STATISTICS g_PipelineQueryData;
-extern ID3D11Query* g_pPipelineQuery;
-extern bool g_QueryStats;
-
-extern float g_GerstnerSteepness;
-extern float g_BaseGerstnerAmplitude;
-extern float g_BaseGerstnerWavelength;
-extern float g_BaseGerstnerSpeed;
-extern float g_GerstnerParallelity;
-extern float g_ShoreTime;
-extern D3DXVECTOR2 g_WindDir;
-extern bool g_Wireframe;
-
-enum { NumMarkersXY = 10, NumMarkers = NumMarkersXY*NumMarkersXY };
-
-extern gfsdk_float2 g_readback_marker_coords[NumMarkers];
-extern gfsdk_float4 g_readback_marker_positions[NumMarkers];
-
-extern D3DXVECTOR3 g_raycast_origins[NumMarkers];
-extern D3DXVECTOR3 g_raycast_directions[NumMarkers];
-extern D3DXVECTOR3 g_raycast_hitpoints[NumMarkers];
-
-int gp_wrap( int a)
-{
- if(a<0) return (a+terrain_gridpoints);
- if(a>=terrain_gridpoints) return (a-terrain_gridpoints);
- return a;
-}
-
-void CTerrain::Initialize(ID3D11Device* device, ID3DX11Effect * effect)
-{
- pEffect = effect;
- pDevice = device;
-
-
- const D3D11_INPUT_ELEMENT_DESC TerrainLayout =
- { "PATCH_PARAMETERS", 0, DXGI_FORMAT_R32G32B32A32_FLOAT, 0, 0, D3D11_INPUT_PER_VERTEX_DATA, 0 };
-
- D3DX11_PASS_DESC passDesc;
- effect->GetTechniqueByName("RenderHeightfield")->GetPassByIndex(0)->GetDesc(&passDesc);
-
- device->CreateInputLayout( &TerrainLayout, 1, passDesc.pIAInputSignature, passDesc.IAInputSignatureSize, &heightfield_inputlayout );
-
- const D3D11_INPUT_ELEMENT_DESC SkyLayout [] =
- {
- { "POSITION", 0, DXGI_FORMAT_R32G32B32A32_FLOAT, 0, 0, D3D11_INPUT_PER_VERTEX_DATA, 0 },
- { "TEXCOORD", 0, DXGI_FORMAT_R32G32_FLOAT, 0, 16, D3D11_INPUT_PER_VERTEX_DATA, 0 }
- };
-
- effect->GetTechniqueByName("RenderSky")->GetPassByIndex(0)->GetDesc(&passDesc);
-
- device->CreateInputLayout( SkyLayout,
- 2,
- passDesc.pIAInputSignature,
- passDesc.IAInputSignatureSize,
- &trianglestrip_inputlayout );
-
- CreateTerrain();
-}
-
-void CTerrain::ReCreateBuffers()
-{
-
- D3D11_TEXTURE2D_DESC tex_desc;
- D3D11_SHADER_RESOURCE_VIEW_DESC textureSRV_desc;
- D3D11_DEPTH_STENCIL_VIEW_DESC DSV_desc;
-
-
-
- SAFE_RELEASE(main_color_resource);
- SAFE_RELEASE(main_color_resourceSRV);
- SAFE_RELEASE(main_color_resourceRTV);
-
- SAFE_RELEASE(main_color_resource_resolved);
- SAFE_RELEASE(main_color_resource_resolvedSRV);
-
- SAFE_RELEASE(main_depth_resource);
- SAFE_RELEASE(main_depth_resourceDSV);
- SAFE_RELEASE(main_depth_resourceSRV);
-
- SAFE_RELEASE(reflection_color_resource);
- SAFE_RELEASE(reflection_color_resourceSRV);
- SAFE_RELEASE(reflection_color_resourceRTV);
- SAFE_RELEASE(refraction_color_resource);
- SAFE_RELEASE(refraction_color_resourceSRV);
- SAFE_RELEASE(refraction_color_resourceRTV);
-
- SAFE_RELEASE(reflection_depth_resource);
- SAFE_RELEASE(reflection_depth_resourceDSV);
- SAFE_RELEASE(refraction_depth_resource);
- SAFE_RELEASE(refraction_depth_resourceSRV);
- SAFE_RELEASE(refraction_depth_resourceRTV);
-
- SAFE_RELEASE(shadowmap_resource);
- SAFE_RELEASE(shadowmap_resourceDSV);
- SAFE_RELEASE(shadowmap_resourceSRV);
-
- // recreating main color buffer
-
- ZeroMemory(&textureSRV_desc,sizeof(textureSRV_desc));
- ZeroMemory(&tex_desc,sizeof(tex_desc));
-
- tex_desc.Width = (UINT)(BackbufferWidth*main_buffer_size_multiplier);
- tex_desc.Height = (UINT)(BackbufferHeight*main_buffer_size_multiplier);
- tex_desc.MipLevels = 1;
- tex_desc.ArraySize = 1;
- tex_desc.Format = DXGI_FORMAT_R8G8B8A8_UNORM;
- tex_desc.SampleDesc.Count = MultiSampleCount;
- tex_desc.SampleDesc.Quality = MultiSampleQuality;
- tex_desc.Usage = D3D11_USAGE_DEFAULT;
- tex_desc.BindFlags = D3D11_BIND_SHADER_RESOURCE | D3D11_BIND_RENDER_TARGET;
- tex_desc.CPUAccessFlags = 0;
- tex_desc.MiscFlags = 0;
-
- textureSRV_desc.Format = DXGI_FORMAT_R8G8B8A8_UNORM;
- textureSRV_desc.ViewDimension = D3D11_SRV_DIMENSION_TEXTURE2DMS;
- textureSRV_desc.Texture2D.MipLevels = tex_desc.MipLevels;
- textureSRV_desc.Texture2D.MostDetailedMip = 0;
-
-
- pDevice->CreateTexture2D ( &tex_desc, NULL, &main_color_resource );
- pDevice->CreateShaderResourceView( main_color_resource, &textureSRV_desc, &main_color_resourceSRV );
- pDevice->CreateRenderTargetView ( main_color_resource, NULL, &main_color_resourceRTV );
-
-
- ZeroMemory(&textureSRV_desc,sizeof(textureSRV_desc));
- ZeroMemory(&tex_desc,sizeof(tex_desc));
-
- tex_desc.Width = (UINT)(BackbufferWidth*main_buffer_size_multiplier);
- tex_desc.Height = (UINT)(BackbufferHeight*main_buffer_size_multiplier);
- tex_desc.MipLevels = 1;
- tex_desc.ArraySize = 1;
- tex_desc.Format = DXGI_FORMAT_R8G8B8A8_UNORM;
- tex_desc.SampleDesc.Count = 1;
- tex_desc.SampleDesc.Quality = 0;
- tex_desc.Usage = D3D11_USAGE_DEFAULT;
- tex_desc.BindFlags = D3D11_BIND_SHADER_RESOURCE | D3D11_BIND_RENDER_TARGET;
- tex_desc.CPUAccessFlags = 0;
- tex_desc.MiscFlags = 0;
-
- textureSRV_desc.Format = DXGI_FORMAT_R8G8B8A8_UNORM;
- textureSRV_desc.ViewDimension = D3D11_SRV_DIMENSION_TEXTURE2D;
- textureSRV_desc.Texture2D.MipLevels = tex_desc.MipLevels;
- textureSRV_desc.Texture2D.MostDetailedMip = 0;
-
- pDevice->CreateTexture2D ( &tex_desc, NULL, &main_color_resource_resolved );
- pDevice->CreateShaderResourceView( main_color_resource_resolved, &textureSRV_desc, &main_color_resource_resolvedSRV );
-
- // recreating main depth buffer
-
- ZeroMemory(&textureSRV_desc,sizeof(textureSRV_desc));
- ZeroMemory(&tex_desc,sizeof(tex_desc));
-
- tex_desc.Width = (UINT)(BackbufferWidth*main_buffer_size_multiplier);
- tex_desc.Height = (UINT)(BackbufferHeight*main_buffer_size_multiplier);
- tex_desc.MipLevels = 1;
- tex_desc.ArraySize = 1;
- tex_desc.Format = DXGI_FORMAT_R32_TYPELESS;
- tex_desc.SampleDesc.Count = MultiSampleCount;
- tex_desc.SampleDesc.Quality = MultiSampleQuality;
- tex_desc.Usage = D3D11_USAGE_DEFAULT;
- tex_desc.BindFlags = D3D11_BIND_DEPTH_STENCIL | D3D11_BIND_SHADER_RESOURCE;
- tex_desc.CPUAccessFlags = 0;
- tex_desc.MiscFlags = 0;
-
- DSV_desc.Format = DXGI_FORMAT_D32_FLOAT;
- DSV_desc.ViewDimension = D3D11_DSV_DIMENSION_TEXTURE2DMS;
- DSV_desc.Flags = 0;
- DSV_desc.Texture2D.MipSlice = 0;
-
- textureSRV_desc.Format = DXGI_FORMAT_R32_FLOAT;
- textureSRV_desc.ViewDimension = D3D11_SRV_DIMENSION_TEXTURE2DMS;
- textureSRV_desc.Texture2D.MipLevels = 1;
- textureSRV_desc.Texture2D.MostDetailedMip = 0;
-
- pDevice->CreateTexture2D( &tex_desc, NULL, &main_depth_resource );
- pDevice->CreateDepthStencilView(main_depth_resource, &DSV_desc, &main_depth_resourceDSV );
- pDevice->CreateShaderResourceView( main_depth_resource, &textureSRV_desc, &main_depth_resourceSRV );
-
- // recreating reflection and refraction color buffers
-
- ZeroMemory(&textureSRV_desc,sizeof(textureSRV_desc));
- ZeroMemory(&tex_desc,sizeof(tex_desc));
-
- tex_desc.Width = (UINT)(BackbufferWidth*reflection_buffer_size_multiplier);
- tex_desc.Height = (UINT)(BackbufferHeight*reflection_buffer_size_multiplier);
- tex_desc.MipLevels = (UINT)max(1,log(max((float)tex_desc.Width,(float)tex_desc.Height))/(float)log(2.0f));
- tex_desc.ArraySize = 1;
- tex_desc.Format = DXGI_FORMAT_R8G8B8A8_UNORM;
- tex_desc.SampleDesc.Count = 1;
- tex_desc.SampleDesc.Quality = 0;
- tex_desc.Usage = D3D11_USAGE_DEFAULT;
- tex_desc.BindFlags = D3D11_BIND_SHADER_RESOURCE | D3D11_BIND_RENDER_TARGET;
- tex_desc.CPUAccessFlags = 0;
- tex_desc.MiscFlags = D3D11_RESOURCE_MISC_GENERATE_MIPS;
-
- textureSRV_desc.Format = DXGI_FORMAT_R8G8B8A8_UNORM;
- textureSRV_desc.ViewDimension = D3D11_SRV_DIMENSION_TEXTURE2D;
- textureSRV_desc.Texture2D.MipLevels = tex_desc.MipLevels;
- textureSRV_desc.Texture2D.MostDetailedMip = 0;
-
- pDevice->CreateTexture2D ( &tex_desc, NULL, &reflection_color_resource );
- pDevice->CreateShaderResourceView( reflection_color_resource, &textureSRV_desc, &reflection_color_resourceSRV );
- pDevice->CreateRenderTargetView ( reflection_color_resource, NULL, &reflection_color_resourceRTV );
-
-
- ZeroMemory(&textureSRV_desc,sizeof(textureSRV_desc));
- ZeroMemory(&tex_desc,sizeof(tex_desc));
-
- tex_desc.Width = (UINT)(BackbufferWidth*refraction_buffer_size_multiplier);
- tex_desc.Height = (UINT)(BackbufferHeight*refraction_buffer_size_multiplier);
- tex_desc.MipLevels = (UINT)max(1,log(max((float)tex_desc.Width,(float)tex_desc.Height))/(float)log(2.0f));
- tex_desc.ArraySize = 1;
- tex_desc.Format = DXGI_FORMAT_R8G8B8A8_UNORM;
- tex_desc.SampleDesc.Count = 1;
- tex_desc.SampleDesc.Quality = 0;
- tex_desc.Usage = D3D11_USAGE_DEFAULT;
- tex_desc.BindFlags = D3D11_BIND_SHADER_RESOURCE | D3D11_BIND_RENDER_TARGET;
- tex_desc.CPUAccessFlags = 0;
- tex_desc.MiscFlags = D3D11_RESOURCE_MISC_GENERATE_MIPS;
-
- textureSRV_desc.Format = DXGI_FORMAT_R8G8B8A8_UNORM;
- textureSRV_desc.ViewDimension = D3D11_SRV_DIMENSION_TEXTURE2D;
- textureSRV_desc.Texture2D.MipLevels = tex_desc.MipLevels;
- textureSRV_desc.Texture2D.MostDetailedMip = 0;
-
- pDevice->CreateTexture2D ( &tex_desc, NULL, &refraction_color_resource );
- pDevice->CreateShaderResourceView( refraction_color_resource, &textureSRV_desc, &refraction_color_resourceSRV );
- pDevice->CreateRenderTargetView ( refraction_color_resource, NULL, &refraction_color_resourceRTV );
-
- ZeroMemory(&textureSRV_desc,sizeof(textureSRV_desc));
- ZeroMemory(&tex_desc,sizeof(tex_desc));
-
- // recreating reflection and refraction depth buffers
-
- tex_desc.Width = (UINT)(BackbufferWidth*reflection_buffer_size_multiplier);
- tex_desc.Height = (UINT)(BackbufferHeight*reflection_buffer_size_multiplier);
- tex_desc.MipLevels = 1;
- tex_desc.ArraySize = 1;
- tex_desc.Format = DXGI_FORMAT_R32_TYPELESS;
- tex_desc.SampleDesc.Count = 1;
- tex_desc.SampleDesc.Quality = 0;
- tex_desc.Usage = D3D11_USAGE_DEFAULT;
- tex_desc.BindFlags = D3D11_BIND_DEPTH_STENCIL | D3D11_BIND_SHADER_RESOURCE;
- tex_desc.CPUAccessFlags = 0;
- tex_desc.MiscFlags = 0;
-
- DSV_desc.Format = DXGI_FORMAT_D32_FLOAT;
- DSV_desc.ViewDimension = D3D11_DSV_DIMENSION_TEXTURE2D;
- DSV_desc.Flags = 0;
- DSV_desc.Texture2D.MipSlice = 0;
-
- pDevice->CreateTexture2D( &tex_desc, NULL, &reflection_depth_resource );
- pDevice->CreateDepthStencilView(reflection_depth_resource, &DSV_desc, &reflection_depth_resourceDSV );
-
-
- tex_desc.Width = (UINT)(BackbufferWidth*refraction_buffer_size_multiplier);
- tex_desc.Height = (UINT)(BackbufferHeight*refraction_buffer_size_multiplier);
- tex_desc.MipLevels = 1;
- tex_desc.ArraySize = 1;
- tex_desc.Format = DXGI_FORMAT_R32_FLOAT;
- tex_desc.SampleDesc.Count = 1;
- tex_desc.SampleDesc.Quality = 0;
- tex_desc.Usage = D3D11_USAGE_DEFAULT;
- tex_desc.BindFlags = D3D11_BIND_SHADER_RESOURCE | D3D11_BIND_RENDER_TARGET;
- tex_desc.CPUAccessFlags = 0;
- tex_desc.MiscFlags = 0;
-
- textureSRV_desc.Format = DXGI_FORMAT_R32_FLOAT;
- textureSRV_desc.ViewDimension = D3D11_SRV_DIMENSION_TEXTURE2D;
- textureSRV_desc.Texture2D.MipLevels = 1;
- textureSRV_desc.Texture2D.MostDetailedMip = 0;
-
- pDevice->CreateTexture2D( &tex_desc, NULL, &refraction_depth_resource );
- pDevice->CreateRenderTargetView (refraction_depth_resource, NULL, &refraction_depth_resourceRTV );
- pDevice->CreateShaderResourceView(refraction_depth_resource, &textureSRV_desc, &refraction_depth_resourceSRV );
-
- // recreating shadowmap resource
- tex_desc.Width = shadowmap_resource_buffer_size_xy;
- tex_desc.Height = shadowmap_resource_buffer_size_xy;
- tex_desc.MipLevels = 1;
- tex_desc.ArraySize = 1;
- tex_desc.Format = DXGI_FORMAT_R32_TYPELESS;
- tex_desc.SampleDesc.Count = 1;
- tex_desc.SampleDesc.Quality = 0;
- tex_desc.Usage = D3D11_USAGE_DEFAULT;
- tex_desc.BindFlags = D3D11_BIND_DEPTH_STENCIL | D3D11_BIND_SHADER_RESOURCE;
- tex_desc.CPUAccessFlags = 0;
- tex_desc.MiscFlags = 0;
-
- DSV_desc.Format = DXGI_FORMAT_D32_FLOAT;
- DSV_desc.ViewDimension = D3D11_DSV_DIMENSION_TEXTURE2D;
- DSV_desc.Flags = 0;
- DSV_desc.Texture2D.MipSlice=0;
-
- textureSRV_desc.Format = DXGI_FORMAT_R32_FLOAT;
- textureSRV_desc.ViewDimension = D3D11_SRV_DIMENSION_TEXTURE2D;
- textureSRV_desc.Texture2D.MipLevels = 1;
- textureSRV_desc.Texture2D.MostDetailedMip = 0;
-
- pDevice->CreateTexture2D( &tex_desc, NULL, &shadowmap_resource);
- pDevice->CreateShaderResourceView( shadowmap_resource, &textureSRV_desc, &shadowmap_resourceSRV );
- pDevice->CreateDepthStencilView(shadowmap_resource, &DSV_desc, &shadowmap_resourceDSV );
-
-}
-
-void CTerrain::DeInitialize()
-{
- SAFE_RELEASE(heightmap_texture);
- SAFE_RELEASE(heightmap_textureSRV);
-
- SAFE_RELEASE(rock_bump_texture);
- SAFE_RELEASE(rock_bump_textureSRV);
-
- SAFE_RELEASE(layerdef_texture);
- SAFE_RELEASE(layerdef_textureSRV);
-
- SAFE_RELEASE(depthmap_texture);
- SAFE_RELEASE(depthmap_textureSRV);
-
- SAFE_RELEASE(sky_texture);
- SAFE_RELEASE(sky_textureSRV);
-
- SAFE_RELEASE(foam_intensity_texture);
- SAFE_RELEASE(foam_intensity_textureSRV);
-
- SAFE_RELEASE(foam_diffuse_texture);
- SAFE_RELEASE(foam_diffuse_textureSRV);
-
- SAFE_RELEASE(main_color_resource);
- SAFE_RELEASE(main_color_resourceSRV);
- SAFE_RELEASE(main_color_resourceRTV);
-
- SAFE_RELEASE(main_color_resource_resolved);
- SAFE_RELEASE(main_color_resource_resolvedSRV);
-
- SAFE_RELEASE(main_depth_resource);
- SAFE_RELEASE(main_depth_resourceDSV);
- SAFE_RELEASE(main_depth_resourceSRV);
-
- SAFE_RELEASE(reflection_color_resource);
- SAFE_RELEASE(reflection_color_resourceSRV);
- SAFE_RELEASE(reflection_color_resourceRTV);
- SAFE_RELEASE(refraction_color_resource);
- SAFE_RELEASE(refraction_color_resourceSRV);
- SAFE_RELEASE(refraction_color_resourceRTV);
-
- SAFE_RELEASE(reflection_depth_resource);
- SAFE_RELEASE(reflection_depth_resourceDSV);
- SAFE_RELEASE(refraction_depth_resource);
- SAFE_RELEASE(refraction_depth_resourceRTV);
- SAFE_RELEASE(refraction_depth_resourceSRV);
-
- SAFE_RELEASE(shadowmap_resource);
- SAFE_RELEASE(shadowmap_resourceDSV);
- SAFE_RELEASE(shadowmap_resourceSRV);
-
- SAFE_RELEASE(sky_vertexbuffer);
- SAFE_RELEASE(trianglestrip_inputlayout);
-
- SAFE_RELEASE(heightfield_vertexbuffer);
- SAFE_RELEASE(heightfield_inputlayout);
-
-}
-void CTerrain::CreateTerrain()
-{
- int i,j,k,l;
- float x,z;
- int ix,iz;
- float * backterrain;
- D3DXVECTOR3 vec1,vec2,vec3;
- int currentstep=terrain_gridpoints;
- float mv,rm;
- float offset=0,yscale=0,maxheight=0,minheight=0;
-
- float *height_linear_array;
- float *patches_rawdata;
- HRESULT result;
- D3D11_SUBRESOURCE_DATA subresource_data;
- D3D11_TEXTURE2D_DESC tex_desc;
- D3D11_SHADER_RESOURCE_VIEW_DESC textureSRV_desc;
-
- backterrain = (float *) malloc((terrain_gridpoints+1)*(terrain_gridpoints+1)*sizeof(float));
- rm=terrain_fractalinitialvalue;
- backterrain[0]=0;
- backterrain[0+terrain_gridpoints*terrain_gridpoints]=0;
- backterrain[terrain_gridpoints]=0;
- backterrain[terrain_gridpoints+terrain_gridpoints*terrain_gridpoints]=0;
- currentstep=terrain_gridpoints;
- srand(3);
-
- // generating fractal terrain using square-diamond method
- while (currentstep>1)
- {
- //square step;
- i=0;
- j=0;
-
-
- while (i<terrain_gridpoints)
- {
- j=0;
- while (j<terrain_gridpoints)
- {
-
- mv=backterrain[i+terrain_gridpoints*j];
- mv+=backterrain[(i+currentstep)+terrain_gridpoints*j];
- mv+=backterrain[(i+currentstep)+terrain_gridpoints*(j+currentstep)];
- mv+=backterrain[i+terrain_gridpoints*(j+currentstep)];
- mv/=4.0;
- backterrain[i+currentstep/2+terrain_gridpoints*(j+currentstep/2)]=(float)(mv+rm*((rand()%1000)/1000.0f-0.5f));
- j+=currentstep;
- }
- i+=currentstep;
- }
-
- //diamond step;
- i=0;
- j=0;
-
- while (i<terrain_gridpoints)
- {
- j=0;
- while (j<terrain_gridpoints)
- {
-
- mv=0;
- mv=backterrain[i+terrain_gridpoints*j];
- mv+=backterrain[(i+currentstep)+terrain_gridpoints*j];
- mv+=backterrain[(i+currentstep/2)+terrain_gridpoints*(j+currentstep/2)];
- mv+=backterrain[i+currentstep/2+terrain_gridpoints*gp_wrap(j-currentstep/2)];
- mv/=4;
- backterrain[i+currentstep/2+terrain_gridpoints*j]=(float)(mv+rm*((rand()%1000)/1000.0f-0.5f));
-
- mv=0;
- mv=backterrain[i+terrain_gridpoints*j];
- mv+=backterrain[i+terrain_gridpoints*(j+currentstep)];
- mv+=backterrain[(i+currentstep/2)+terrain_gridpoints*(j+currentstep/2)];
- mv+=backterrain[gp_wrap(i-currentstep/2)+terrain_gridpoints*(j+currentstep/2)];
- mv/=4;
- backterrain[i+terrain_gridpoints*(j+currentstep/2)]=(float)(mv+rm*((rand()%1000)/1000.0f-0.5f));
-
- mv=0;
- mv=backterrain[i+currentstep+terrain_gridpoints*j];
- mv+=backterrain[i+currentstep+terrain_gridpoints*(j+currentstep)];
- mv+=backterrain[(i+currentstep/2)+terrain_gridpoints*(j+currentstep/2)];
- mv+=backterrain[gp_wrap(i+currentstep/2+currentstep)+terrain_gridpoints*(j+currentstep/2)];
- mv/=4;
- backterrain[i+currentstep+terrain_gridpoints*(j+currentstep/2)]=(float)(mv+rm*((rand()%1000)/1000.0f-0.5f));
-
- mv=0;
- mv=backterrain[i+currentstep+terrain_gridpoints*(j+currentstep)];
- mv+=backterrain[i+terrain_gridpoints*(j+currentstep)];
- mv+=backterrain[(i+currentstep/2)+terrain_gridpoints*(j+currentstep/2)];
- mv+=backterrain[i+currentstep/2+terrain_gridpoints*gp_wrap(j+currentstep/2+currentstep)];
- mv/=4;
- backterrain[i+currentstep/2+terrain_gridpoints*(j+currentstep)]=(float)(mv+rm*((rand()%1000)/1000.0f-0.5f));
- j+=currentstep;
- }
- i+=currentstep;
- }
- //changing current step;
- currentstep/=2;
- rm*=terrain_fractalfactor;
- }
-
- // scaling to minheight..maxheight range
- for (i=0;i<terrain_gridpoints+1;i++)
- for (j=0;j<terrain_gridpoints+1;j++)
- {
- height[i][j]=backterrain[i+terrain_gridpoints*j];
- }
- maxheight=height[0][0];
- minheight=height[0][0];
- for(i=0;i<terrain_gridpoints+1;i++)
- for(j=0;j<terrain_gridpoints+1;j++)
- {
- if(height[i][j]>maxheight) maxheight=height[i][j];
- if(height[i][j]<minheight) minheight=height[i][j];
- }
- offset=minheight-terrain_minheight;
- yscale=(terrain_maxheight-terrain_minheight)/(maxheight-minheight);
-
- for(i=0;i<terrain_gridpoints+1;i++)
- for(j=0;j<terrain_gridpoints+1;j++)
- {
- height[i][j]-=minheight;
- height[i][j]*=yscale;
- height[i][j]+=terrain_minheight;
- }
-
- // moving down edges of heightmap
- for (i=0;i<terrain_gridpoints+1;i++)
- for (j=0;j<terrain_gridpoints+1;j++)
- {
- mv=(float)((i-terrain_gridpoints/2.0f)*(i-terrain_gridpoints/2.0f)+(j-terrain_gridpoints/2.0f)*(j-terrain_gridpoints/2.0f));
- rm=(float)((terrain_gridpoints*0.7f)*(terrain_gridpoints*0.7f)/4.0f);
- height[i][j]-=((mv-rm)/900.0f)*terrain_geometry_scale;
- }
-
-
- // terrain banks
- for(k=0;k<4;k++)
- {
- for(i=0;i<terrain_gridpoints+1;i++)
- for(j=0;j<terrain_gridpoints+1;j++)
- {
- mv=height[i][j];
- if((mv) > 0.02f)
- {
- mv -= 0.02f;
- }
- if(mv < -3.00f)
- {
- mv += 0.5f;
- }
- height[i][j]=mv;
- }
- }
-
- // smoothing
- for(k=0;k<terrain_smoothsteps;k++)
- {
- for(i=0;i<terrain_gridpoints+1;i++)
- for(j=0;j<terrain_gridpoints+1;j++)
- {
-
- vec1.x=2*terrain_geometry_scale;
- vec1.y=terrain_geometry_scale*(height[gp_wrap(i+1)][j]-height[gp_wrap(i-1)][j]);
- vec1.z=0;
- vec2.x=0;
- vec2.y=-terrain_geometry_scale*(height[i][gp_wrap(j+1)]-height[i][gp_wrap(j-1)]);
- vec2.z=-2*terrain_geometry_scale;
-
- D3DXVec3Cross(&vec3,&vec1,&vec2);
- D3DXVec3Normalize(&vec3,&vec3);
-
-
- if(((vec3.y>terrain_rockfactor)||(height[i][j]<1.2f)))
- {
- rm=terrain_smoothfactor1;
- mv=height[i][j]*(1.0f-rm) +rm*0.25f*(height[gp_wrap(i-1)][j]+height[i][gp_wrap(j-1)]+height[gp_wrap(i+1)][j]+height[i][gp_wrap(j+1)]);
- backterrain[i+terrain_gridpoints*j]=mv;
- }
- else
- {
- rm=terrain_smoothfactor2;
- mv=height[i][j]*(1.0f-rm) +rm*0.25f*(height[gp_wrap(i-1)][j]+height[i][gp_wrap(j-1)]+height[gp_wrap(i+1)][j]+height[i][gp_wrap(j+1)]);
- backterrain[i+terrain_gridpoints*j]=mv;
- }
-
- }
- for (i=0;i<terrain_gridpoints+1;i++)
- for (j=0;j<terrain_gridpoints+1;j++)
- {
- height[i][j]=(backterrain[i+terrain_gridpoints*j]);
- }
- }
- for(i=0;i<terrain_gridpoints+1;i++)
- for(j=0;j<terrain_gridpoints+1;j++)
- {
- rm=0.5f;
- mv=height[i][j]*(1.0f-rm) +rm*0.25f*(height[gp_wrap(i-1)][j]+height[i][gp_wrap(j-1)]+height[gp_wrap(i+1)][j]+height[i][gp_wrap(j+1)]);
- backterrain[i+terrain_gridpoints*j]=mv;
- }
- for (i=0;i<terrain_gridpoints+1;i++)
- for (j=0;j<terrain_gridpoints+1;j++)
- {
- height[i][j]=(backterrain[i+terrain_gridpoints*j]);
- }
-
-
- free(backterrain);
-
- //calculating normals
- for (i=0;i<terrain_gridpoints+1;i++)
- for (j=0;j<terrain_gridpoints+1;j++)
- {
- vec1.x=2*terrain_geometry_scale;
- vec1.y=terrain_geometry_scale*(height[gp_wrap(i+1)][j]-height[gp_wrap(i-1)][j]);
- vec1.z=0;
- vec2.x=0;
- vec2.y=-terrain_geometry_scale*(height[i][gp_wrap(j+1)]-height[i][gp_wrap(j-1)]);
- vec2.z=-2*terrain_geometry_scale;
- D3DXVec3Cross(&normal[i][j],&vec1,&vec2);
- D3DXVec3Normalize(&normal[i][j],&normal[i][j]);
- }
-
-
- // buiding layerdef
- byte* temp_layerdef_map_texture_pixels=(byte *)malloc(terrain_layerdef_map_texture_size*terrain_layerdef_map_texture_size*4);
- byte* layerdef_map_texture_pixels=(byte *)malloc(terrain_layerdef_map_texture_size*terrain_layerdef_map_texture_size*4);
- for(i=0;i<terrain_layerdef_map_texture_size;i++)
- for(j=0;j<terrain_layerdef_map_texture_size;j++)
- {
- x=(float)(terrain_gridpoints)*((float)i/(float)terrain_layerdef_map_texture_size);
- z=(float)(terrain_gridpoints)*((float)j/(float)terrain_layerdef_map_texture_size);
- ix=(int)floor(x);
- iz=(int)floor(z);
- rm=bilinear_interpolation(x-ix,z-iz,height[ix][iz],height[ix+1][iz],height[ix+1][iz+1],height[ix][iz+1])*terrain_geometry_scale;
-
- temp_layerdef_map_texture_pixels[(j*terrain_layerdef_map_texture_size+i)*4+0]=0;
- temp_layerdef_map_texture_pixels[(j*terrain_layerdef_map_texture_size+i)*4+1]=0;
- temp_layerdef_map_texture_pixels[(j*terrain_layerdef_map_texture_size+i)*4+2]=0;
- temp_layerdef_map_texture_pixels[(j*terrain_layerdef_map_texture_size+i)*4+3]=0;
-
- if((rm>terrain_height_underwater_start)&&(rm<=terrain_height_underwater_end))
- {
- temp_layerdef_map_texture_pixels[(j*terrain_layerdef_map_texture_size+i)*4+0]=255;
- temp_layerdef_map_texture_pixels[(j*terrain_layerdef_map_texture_size+i)*4+1]=0;
- temp_layerdef_map_texture_pixels[(j*terrain_layerdef_map_texture_size+i)*4+2]=0;
- temp_layerdef_map_texture_pixels[(j*terrain_layerdef_map_texture_size+i)*4+3]=0;
- }
-
- if((rm>terrain_height_sand_start)&&(rm<=terrain_height_sand_end))
- {
- temp_layerdef_map_texture_pixels[(j*terrain_layerdef_map_texture_size+i)*4+0]=0;
- temp_layerdef_map_texture_pixels[(j*terrain_layerdef_map_texture_size+i)*4+1]=255;
- temp_layerdef_map_texture_pixels[(j*terrain_layerdef_map_texture_size+i)*4+2]=0;
- temp_layerdef_map_texture_pixels[(j*terrain_layerdef_map_texture_size+i)*4+3]=0;
- }
-
- if((rm>terrain_height_grass_start)&&(rm<=terrain_height_grass_end))
- {
- temp_layerdef_map_texture_pixels[(j*terrain_layerdef_map_texture_size+i)*4+0]=0;
- temp_layerdef_map_texture_pixels[(j*terrain_layerdef_map_texture_size+i)*4+1]=0;
- temp_layerdef_map_texture_pixels[(j*terrain_layerdef_map_texture_size+i)*4+2]=255;
- temp_layerdef_map_texture_pixels[(j*terrain_layerdef_map_texture_size+i)*4+3]=0;
- }
-
- mv=bilinear_interpolation(x-ix,z-iz,normal[ix][iz][1],normal[ix+1][iz][1],normal[ix+1][iz+1][1],normal[ix][iz+1][1]);
-
- if((mv<terrain_slope_grass_start)&&(rm>terrain_height_sand_end))
- {
- temp_layerdef_map_texture_pixels[(j*terrain_layerdef_map_texture_size+i)*4+0]=0;
- temp_layerdef_map_texture_pixels[(j*terrain_layerdef_map_texture_size+i)*4+1]=0;
- temp_layerdef_map_texture_pixels[(j*terrain_layerdef_map_texture_size+i)*4+2]=0;
- temp_layerdef_map_texture_pixels[(j*terrain_layerdef_map_texture_size+i)*4+3]=0;
- }
-
- if((mv<terrain_slope_rocks_start)&&(rm>terrain_height_rocks_start))
- {
- temp_layerdef_map_texture_pixels[(j*terrain_layerdef_map_texture_size+i)*4+0]=0;
- temp_layerdef_map_texture_pixels[(j*terrain_layerdef_map_texture_size+i)*4+1]=0;
- temp_layerdef_map_texture_pixels[(j*terrain_layerdef_map_texture_size+i)*4+2]=0;
- temp_layerdef_map_texture_pixels[(j*terrain_layerdef_map_texture_size+i)*4+3]=255;
- }
-
- }
- for(i=0;i<terrain_layerdef_map_texture_size;i++)
- for(j=0;j<terrain_layerdef_map_texture_size;j++)
- {
- layerdef_map_texture_pixels[(j*terrain_layerdef_map_texture_size+i)*4+0]=temp_layerdef_map_texture_pixels[(j*terrain_layerdef_map_texture_size+i)*4+0];
- layerdef_map_texture_pixels[(j*terrain_layerdef_map_texture_size+i)*4+1]=temp_layerdef_map_texture_pixels[(j*terrain_layerdef_map_texture_size+i)*4+1];
- layerdef_map_texture_pixels[(j*terrain_layerdef_map_texture_size+i)*4+2]=temp_layerdef_map_texture_pixels[(j*terrain_layerdef_map_texture_size+i)*4+2];
- layerdef_map_texture_pixels[(j*terrain_layerdef_map_texture_size+i)*4+3]=temp_layerdef_map_texture_pixels[(j*terrain_layerdef_map_texture_size+i)*4+3];
- }
-
-
- for(i=2;i<terrain_layerdef_map_texture_size-2;i++)
- for(j=2;j<terrain_layerdef_map_texture_size-2;j++)
- {
- int n1=0;
- int n2=0;
- int n3=0;
- int n4=0;
- for(k=-2;k<3;k++)
- for(l=-2;l<3;l++)
- {
- n1+=temp_layerdef_map_texture_pixels[((j+k)*terrain_layerdef_map_texture_size+i+l)*4+0];
- n2+=temp_layerdef_map_texture_pixels[((j+k)*terrain_layerdef_map_texture_size+i+l)*4+1];
- n3+=temp_layerdef_map_texture_pixels[((j+k)*terrain_layerdef_map_texture_size+i+l)*4+2];
- n4+=temp_layerdef_map_texture_pixels[((j+k)*terrain_layerdef_map_texture_size+i+l)*4+3];
- }
- layerdef_map_texture_pixels[(j*terrain_layerdef_map_texture_size+i)*4+0]=(byte)(n1/25);
- layerdef_map_texture_pixels[(j*terrain_layerdef_map_texture_size+i)*4+1]=(byte)(n2/25);
- layerdef_map_texture_pixels[(j*terrain_layerdef_map_texture_size+i)*4+2]=(byte)(n3/25);
- layerdef_map_texture_pixels[(j*terrain_layerdef_map_texture_size+i)*4+3]=(byte)(n4/25);
- }
-
- // putting the generated data to textures
- subresource_data.pSysMem = layerdef_map_texture_pixels;
- subresource_data.SysMemPitch = terrain_layerdef_map_texture_size*4;
- subresource_data.SysMemSlicePitch = 0;
-
- tex_desc.Width = terrain_layerdef_map_texture_size;
- tex_desc.Height = terrain_layerdef_map_texture_size;
- tex_desc.MipLevels = 1;
- tex_desc.ArraySize = 1;
- tex_desc.Format = DXGI_FORMAT_R8G8B8A8_UNORM;
- tex_desc.SampleDesc.Count = 1;
- tex_desc.SampleDesc.Quality = 0;
- tex_desc.Usage = D3D11_USAGE_DEFAULT;
- tex_desc.BindFlags = D3D11_BIND_SHADER_RESOURCE;
- tex_desc.CPUAccessFlags = 0;
- tex_desc.MiscFlags = 0;
- result=pDevice->CreateTexture2D(&tex_desc,&subresource_data,&layerdef_texture);
-
- ZeroMemory(&textureSRV_desc,sizeof(textureSRV_desc));
- textureSRV_desc.Format=tex_desc.Format;
- textureSRV_desc.ViewDimension=D3D11_SRV_DIMENSION_TEXTURE2D;
- textureSRV_desc.Texture2D.MipLevels=tex_desc.MipLevels;
- textureSRV_desc.Texture2D.MostDetailedMip=0;
- pDevice->CreateShaderResourceView(layerdef_texture,&textureSRV_desc,&layerdef_textureSRV);
-
- free(temp_layerdef_map_texture_pixels);
- free(layerdef_map_texture_pixels);
-
- height_linear_array = new float [terrain_gridpoints*terrain_gridpoints*4];
- patches_rawdata = new float [terrain_numpatches_1d*terrain_numpatches_1d*4];
-
- for(int i=0;i<terrain_gridpoints;i++)
- for(int j=0; j<terrain_gridpoints;j++)
- {
- height_linear_array[(i+j*terrain_gridpoints)*4+0]=normal[i][j].x;
- height_linear_array[(i+j*terrain_gridpoints)*4+1]=normal[i][j].y;
- height_linear_array[(i+j*terrain_gridpoints)*4+2]=normal[i][j].z;
- height_linear_array[(i+j*terrain_gridpoints)*4+3]=height[i][j];
- }
- subresource_data.pSysMem = height_linear_array;
- subresource_data.SysMemPitch = terrain_gridpoints*4*sizeof(float);
- subresource_data.SysMemSlicePitch = 0;
-
- tex_desc.Width = terrain_gridpoints;
- tex_desc.Height = terrain_gridpoints;
- tex_desc.MipLevels = 1;
- tex_desc.ArraySize = 1;
- tex_desc.Format = DXGI_FORMAT_R32G32B32A32_FLOAT;
- tex_desc.SampleDesc.Count = 1;
- tex_desc.SampleDesc.Quality = 0;
- tex_desc.Usage = D3D11_USAGE_DEFAULT;
- tex_desc.BindFlags = D3D11_BIND_SHADER_RESOURCE;
- tex_desc.CPUAccessFlags = 0;
- tex_desc.MiscFlags = 0;
- result=pDevice->CreateTexture2D(&tex_desc,&subresource_data,&heightmap_texture);
-
- free(height_linear_array);
-
- ZeroMemory(&textureSRV_desc,sizeof(textureSRV_desc));
- textureSRV_desc.Format=tex_desc.Format;
- textureSRV_desc.ViewDimension=D3D11_SRV_DIMENSION_TEXTURE2D;
- textureSRV_desc.Texture2D.MipLevels=tex_desc.MipLevels;
- pDevice->CreateShaderResourceView(heightmap_texture,&textureSRV_desc,&heightmap_textureSRV);
-
- //building depthmap
- byte * depth_shadow_map_texture_pixels=(byte *)malloc(terrain_depth_shadow_map_texture_size*terrain_depth_shadow_map_texture_size*4);
- for(i=0;i<terrain_depth_shadow_map_texture_size;i++)
- for(j=0;j<terrain_depth_shadow_map_texture_size;j++)
- {
- x=(float)(terrain_gridpoints)*((float)i/(float)terrain_depth_shadow_map_texture_size);
- z=(float)(terrain_gridpoints)*((float)j/(float)terrain_depth_shadow_map_texture_size);
- ix=(int)floor(x);
- iz=(int)floor(z);
- rm=bilinear_interpolation(x-ix,z-iz,height[ix][iz],height[ix+1][iz],height[ix+1][iz+1],height[ix][iz+1])*terrain_geometry_scale;
-
- if(rm>0)
- {
- depth_shadow_map_texture_pixels[(j*terrain_depth_shadow_map_texture_size+i)*4+0]=0;
- depth_shadow_map_texture_pixels[(j*terrain_depth_shadow_map_texture_size+i)*4+1]=0;
- depth_shadow_map_texture_pixels[(j*terrain_depth_shadow_map_texture_size+i)*4+2]=0;
- }
- else
- {
- float no=(1.0f*255.0f*(rm/(terrain_minheight*terrain_geometry_scale)))-1.0f;
- if(no>255) no=255;
- if(no<0) no=0;
- depth_shadow_map_texture_pixels[(j*terrain_depth_shadow_map_texture_size+i)*4+0]=(byte)no;
-
- no=(10.0f*255.0f*(rm/(terrain_minheight*terrain_geometry_scale)))-80.0f;
- if(no>255) no=255;
- if(no<0) no=0;
- depth_shadow_map_texture_pixels[(j*terrain_depth_shadow_map_texture_size+i)*4+1]=(byte)no;
-
- no=(100.0f*255.0f*(rm/(terrain_minheight*terrain_geometry_scale)))-300.0f;
- if(no>255) no=255;
- if(no<0) no=0;
- depth_shadow_map_texture_pixels[(j*terrain_depth_shadow_map_texture_size+i)*4+2]=(byte)no;
- }
- depth_shadow_map_texture_pixels[(j*terrain_depth_shadow_map_texture_size+i)*4+3]=0;
- }
-
- subresource_data.pSysMem = depth_shadow_map_texture_pixels;
- subresource_data.SysMemPitch = terrain_depth_shadow_map_texture_size*4;
- subresource_data.SysMemSlicePitch = 0;
-
- tex_desc.Width = terrain_depth_shadow_map_texture_size;
- tex_desc.Height = terrain_depth_shadow_map_texture_size;
- tex_desc.MipLevels = 1;
- tex_desc.ArraySize = 1;
- tex_desc.Format = DXGI_FORMAT_R8G8B8A8_UNORM;
- tex_desc.SampleDesc.Count = 1;
- tex_desc.SampleDesc.Quality = 0;
- tex_desc.Usage = D3D11_USAGE_DEFAULT;
- tex_desc.BindFlags = D3D11_BIND_SHADER_RESOURCE;
- tex_desc.CPUAccessFlags = 0;
- tex_desc.MiscFlags = 0;
- result=pDevice->CreateTexture2D(&tex_desc,&subresource_data,&depthmap_texture);
-
- ZeroMemory(&textureSRV_desc,sizeof(textureSRV_desc));
- textureSRV_desc.Format=tex_desc.Format;
- textureSRV_desc.ViewDimension=D3D11_SRV_DIMENSION_TEXTURE2D;
- textureSRV_desc.Texture2D.MipLevels=tex_desc.MipLevels;
- pDevice->CreateShaderResourceView(depthmap_texture,&textureSRV_desc,&depthmap_textureSRV);
-
- free(depth_shadow_map_texture_pixels);
-
- // creating terrain vertex buffer
- for(int i=0;i<terrain_numpatches_1d;i++)
- for(int j=0;j<terrain_numpatches_1d;j++)
- {
- patches_rawdata[(i+j*terrain_numpatches_1d)*4+0]=i*terrain_geometry_scale*terrain_gridpoints/terrain_numpatches_1d;
- patches_rawdata[(i+j*terrain_numpatches_1d)*4+1]=j*terrain_geometry_scale*terrain_gridpoints/terrain_numpatches_1d;
- patches_rawdata[(i+j*terrain_numpatches_1d)*4+2]=terrain_geometry_scale*terrain_gridpoints/terrain_numpatches_1d;
- patches_rawdata[(i+j*terrain_numpatches_1d)*4+3]=terrain_geometry_scale*terrain_gridpoints/terrain_numpatches_1d;
- }
-
- D3D11_BUFFER_DESC buf_desc;
- memset(&buf_desc,0,sizeof(buf_desc));
-
- buf_desc.ByteWidth = terrain_numpatches_1d*terrain_numpatches_1d*4*sizeof(float);
- buf_desc.BindFlags = D3D11_BIND_VERTEX_BUFFER;
- buf_desc.Usage = D3D11_USAGE_DEFAULT;
-
- subresource_data.pSysMem=patches_rawdata;
- subresource_data.SysMemPitch=0;
- subresource_data.SysMemSlicePitch=0;
-
- result=pDevice->CreateBuffer(&buf_desc,&subresource_data,&heightfield_vertexbuffer);
- free (patches_rawdata);
-
- // creating sky vertex buffer
- float *sky_vertexdata;
- int floatnum;
- sky_vertexdata = new float [sky_gridpoints*(sky_gridpoints+2)*2*6];
-
- for(int j=0;j<sky_gridpoints;j++)
- {
-
- i=0;
- floatnum=(j*(sky_gridpoints+2)*2)*6;
- sky_vertexdata[floatnum+0]=terrain_gridpoints*terrain_geometry_scale*0.5f+4000.0f*cos(2.0f*PI*(float)i/(float)sky_gridpoints)*cos(-0.5f*PI+PI*(float)j/(float)sky_gridpoints);
- sky_vertexdata[floatnum+1]=4000.0f*sin(-0.5f*PI+PI*(float)(j)/(float)sky_gridpoints);
- sky_vertexdata[floatnum+2]=terrain_gridpoints*terrain_geometry_scale*0.5f+4000.0f*sin(2.0f*PI*(float)i/(float)sky_gridpoints)*cos(-0.5f*PI+PI*(float)j/(float)sky_gridpoints);
- sky_vertexdata[floatnum+3]=1;
- sky_vertexdata[floatnum+4]=(sky_texture_angle+(float)i/(float)sky_gridpoints);
- sky_vertexdata[floatnum+5]=2.0f-2.0f*(float)(j+0)/(float)sky_gridpoints;
- floatnum+=6;
- for(i=0;i<sky_gridpoints+1;i++)
- {
- sky_vertexdata[floatnum+0]=terrain_gridpoints*terrain_geometry_scale*0.5f+4000.0f*cos(2.0f*PI*(float)i/(float)sky_gridpoints)*cos(-0.5f*PI+PI*(float)j/(float)sky_gridpoints);
- sky_vertexdata[floatnum+1]=4000.0f*sin(-0.5f*PI+PI*(float)(j)/(float)sky_gridpoints);
- sky_vertexdata[floatnum+2]=terrain_gridpoints*terrain_geometry_scale*0.5f+4000.0f*sin(2.0f*PI*(float)i/(float)sky_gridpoints)*cos(-0.5f*PI+PI*(float)j/(float)sky_gridpoints);
- sky_vertexdata[floatnum+3]=1;
- sky_vertexdata[floatnum+4]=(sky_texture_angle+(float)i/(float)sky_gridpoints);
- sky_vertexdata[floatnum+5]=2.0f-2.0f*(float)(j+0)/(float)sky_gridpoints;
- floatnum+=6;
- sky_vertexdata[floatnum+0]=terrain_gridpoints*terrain_geometry_scale*0.5f+4000.0f*cos(2.0f*PI*(float)i/(float)sky_gridpoints)*cos(-0.5f*PI+PI*(float)(j+1)/(float)sky_gridpoints);
- sky_vertexdata[floatnum+1]=4000.0f*sin(-0.5f*PI+PI*(float)(j+1)/(float)sky_gridpoints);
- sky_vertexdata[floatnum+2]=terrain_gridpoints*terrain_geometry_scale*0.5f+4000.0f*sin(2.0f*PI*(float)i/(float)sky_gridpoints)*cos(-0.5f*PI+PI*(float)(j+1)/(float)sky_gridpoints);
- sky_vertexdata[floatnum+3]=1;
- sky_vertexdata[floatnum+4]=(sky_texture_angle+(float)i/(float)sky_gridpoints);
- sky_vertexdata[floatnum+5]=2.0f-2.0f*(float)(j+1)/(float)sky_gridpoints;
- floatnum+=6;
- }
- i=sky_gridpoints;
- sky_vertexdata[floatnum+0]=terrain_gridpoints*terrain_geometry_scale*0.5f+4000.0f*cos(2.0f*PI*(float)i/(float)sky_gridpoints)*cos(-0.5f*PI+PI*(float)(j+1)/(float)sky_gridpoints);
- sky_vertexdata[floatnum+1]=4000.0f*sin(-0.5f*PI+PI*(float)(j+1)/(float)sky_gridpoints);
- sky_vertexdata[floatnum+2]=terrain_gridpoints*terrain_geometry_scale*0.5f+4000.0f*sin(2.0f*PI*(float)i/(float)sky_gridpoints)*cos(-0.5f*PI+PI*(float)(j+1)/(float)sky_gridpoints);
- sky_vertexdata[floatnum+3]=1;
- sky_vertexdata[floatnum+4]=(sky_texture_angle+(float)i/(float)sky_gridpoints);
- sky_vertexdata[floatnum+5]=2.0f-2.0f*(float)(j+1)/(float)sky_gridpoints;
- floatnum+=6;
- }
-
- memset(&buf_desc,0,sizeof(buf_desc));
-
- buf_desc.ByteWidth = sky_gridpoints*(sky_gridpoints+2)*2*6*sizeof(float);
- buf_desc.BindFlags = D3D11_BIND_VERTEX_BUFFER;
- buf_desc.Usage = D3D11_USAGE_DEFAULT;
-
- subresource_data.pSysMem=sky_vertexdata;
- subresource_data.SysMemPitch=0;
- subresource_data.SysMemSlicePitch=0;
-
- result=pDevice->CreateBuffer(&buf_desc,&subresource_data,&sky_vertexbuffer);
-
- free (sky_vertexdata);
-}
-
-void CTerrain::LoadTextures()
-{
- D3D11_TEXTURE2D_DESC tex_desc;
- D3D11_SHADER_RESOURCE_VIEW_DESC textureSRV_desc;
-
- tex_desc.Width = terrain_layerdef_map_texture_size;
- tex_desc.Height = terrain_layerdef_map_texture_size;
- tex_desc.MipLevels = 1;
- tex_desc.ArraySize = 1;
- tex_desc.Format = DXGI_FORMAT_R8G8B8A8_UNORM;
- tex_desc.SampleDesc.Count = 1;
- tex_desc.SampleDesc.Quality = 0;
- tex_desc.Usage = D3D11_USAGE_DEFAULT;
- // Load images
- D3DX11_IMAGE_LOAD_INFO imageLoadInfo;
- D3DX11_IMAGE_INFO imageInfo;
- WCHAR path[MAX_PATH];
-
- DXUTFindDXSDKMediaFileCch(path, MAX_PATH, L"..\\media\\rock_bump6.dds");
- D3DX11GetImageInfoFromFile(path, NULL, &imageInfo, NULL);
- memset(&imageLoadInfo, 0, sizeof(imageLoadInfo));
- imageLoadInfo.Width = imageInfo.Width;
- imageLoadInfo.Height = imageInfo.Height;
- imageLoadInfo.MipLevels = imageInfo.MipLevels;
- imageLoadInfo.Format = imageInfo.Format;
- imageLoadInfo.BindFlags = D3D11_BIND_SHADER_RESOURCE;
- D3DX11CreateTextureFromFile(pDevice, path, &imageLoadInfo, NULL, (ID3D11Resource**)&rock_bump_texture, NULL);
-
- ZeroMemory(&textureSRV_desc,sizeof(textureSRV_desc));
- textureSRV_desc.Format=imageLoadInfo.Format;
- textureSRV_desc.ViewDimension=D3D11_SRV_DIMENSION_TEXTURE2D;
- textureSRV_desc.Texture2D.MipLevels=imageLoadInfo.MipLevels;
- pDevice->CreateShaderResourceView(rock_bump_texture,&textureSRV_desc,&rock_bump_textureSRV);
-
- DXUTFindDXSDKMediaFileCch(path, MAX_PATH, L"..\\media\\SunsetFair.dds");
- D3DX11GetImageInfoFromFile(path, NULL, &imageInfo, NULL);
- memset(&imageLoadInfo, 0, sizeof(imageLoadInfo));
- imageLoadInfo.Width = imageInfo.Width;
- imageLoadInfo.Height = imageInfo.Height;
- imageLoadInfo.MipLevels = imageInfo.MipLevels;
- imageLoadInfo.Format = imageInfo.Format;
- imageLoadInfo.BindFlags = D3D11_BIND_SHADER_RESOURCE;
- D3DX11CreateTextureFromFile(pDevice, path, &imageLoadInfo, NULL, (ID3D11Resource**)&sky_texture, NULL);
-
- ZeroMemory(&textureSRV_desc,sizeof(textureSRV_desc));
- textureSRV_desc.Format=imageLoadInfo.Format;
- textureSRV_desc.ViewDimension=D3D11_SRV_DIMENSION_TEXTURE2D;
- textureSRV_desc.Texture2D.MipLevels=imageLoadInfo.MipLevels;
- pDevice->CreateShaderResourceView(sky_texture,&textureSRV_desc,&sky_textureSRV);
-
-
- DXUTFindDXSDKMediaFileCch(path, MAX_PATH, L"..\\media\\foam_intensity_perlin2.dds");
- D3DX11GetImageInfoFromFile(path, NULL, &imageInfo, NULL);
- memset(&imageLoadInfo, 0, sizeof(imageLoadInfo));
- imageLoadInfo.Width = imageInfo.Width;
- imageLoadInfo.Height = imageInfo.Height;
- imageLoadInfo.MipLevels = imageInfo.MipLevels;
- imageLoadInfo.Format = imageInfo.Format;
- imageLoadInfo.BindFlags = D3D11_BIND_SHADER_RESOURCE;
- D3DX11CreateTextureFromFile(pDevice, path, &imageLoadInfo, NULL, (ID3D11Resource**)&foam_intensity_texture, NULL);
-
- ZeroMemory(&textureSRV_desc,sizeof(textureSRV_desc));
- textureSRV_desc.Format=imageLoadInfo.Format;
- textureSRV_desc.ViewDimension=D3D11_SRV_DIMENSION_TEXTURE2D;
- textureSRV_desc.Texture2D.MipLevels=imageLoadInfo.MipLevels;
- pDevice->CreateShaderResourceView(foam_intensity_texture,&textureSRV_desc,&foam_intensity_textureSRV);
-
-
- DXUTFindDXSDKMediaFileCch(path, MAX_PATH, L"..\\media\\foam.dds");
- D3DX11GetImageInfoFromFile(path, NULL, &imageInfo, NULL);
- memset(&imageLoadInfo, 0, sizeof(imageLoadInfo));
- imageLoadInfo.Width = imageInfo.Width;
- imageLoadInfo.Height = imageInfo.Height;
- imageLoadInfo.MipLevels = imageInfo.MipLevels;
- imageLoadInfo.Format = imageInfo.Format;
- imageLoadInfo.BindFlags = D3D11_BIND_SHADER_RESOURCE;
- D3DX11CreateTextureFromFile(pDevice, path, &imageLoadInfo, NULL, (ID3D11Resource**)&foam_diffuse_texture, NULL);
-
- ZeroMemory(&textureSRV_desc,sizeof(textureSRV_desc));
- textureSRV_desc.Format=imageLoadInfo.Format;
- textureSRV_desc.ViewDimension=D3D11_SRV_DIMENSION_TEXTURE2D;
- textureSRV_desc.Texture2D.MipLevels=imageLoadInfo.MipLevels;
- pDevice->CreateShaderResourceView(foam_diffuse_texture,&textureSRV_desc,&foam_diffuse_textureSRV);
-}
-
-
-void CTerrain::RenderTerrainToHeightField( ID3D11DeviceContext* const pContext, const D3DXMATRIX& worldToViewMatrix, const D3DXMATRIX& viewToProjectionMatrix, const D3DXVECTOR3 eyePositionWS, const D3DXVECTOR3 viewDirectionWS )
-{
- float origin[2]={0,0};
- UINT stride=sizeof(float)*4;
- UINT offset=0;
-
- pEffect->GetVariableByName("g_HeightfieldTexture")->AsShaderResource()->SetResource(heightmap_textureSRV);
- pEffect->GetVariableByName("g_LayerdefTexture")->AsShaderResource()->SetResource(layerdef_textureSRV);
- pEffect->GetVariableByName("g_RockBumpTexture")->AsShaderResource()->SetResource(rock_bump_textureSRV);
- pEffect->GetVariableByName("g_SkyTexture")->AsShaderResource()->SetResource(sky_textureSRV);
- pEffect->GetVariableByName("g_HeightFieldOrigin")->AsVector()->SetFloatVector(origin);
- pEffect->GetVariableByName("g_HeightFieldSize")->AsScalar()->SetFloat(terrain_gridpoints*terrain_geometry_scale);
-
- D3DXMATRIX worldToProjectionMatrix = worldToViewMatrix * viewToProjectionMatrix;
- D3DXMATRIX projectionToWorldMatrix;
- D3DXMatrixInverse(&projectionToWorldMatrix, NULL, &worldToProjectionMatrix);
-
- pEffect->GetVariableByName("g_ModelViewMatrix")->AsMatrix()->SetMatrix( worldToViewMatrix );
- pEffect->GetVariableByName("g_ModelViewProjectionMatrix")->AsMatrix()->SetMatrix( worldToProjectionMatrix );
- pEffect->GetVariableByName("g_ModelViewProjectionMatrixInv")->AsMatrix()->SetMatrix( projectionToWorldMatrix );
- pEffect->GetVariableByName("g_CameraPosition")->AsVector()->SetFloatVector( eyePositionWS );
- pEffect->GetVariableByName("g_CameraDirection")->AsVector()->SetFloatVector( viewDirectionWS );
-
- pEffect->GetVariableByName("g_HalfSpaceCullSign")->AsScalar()->SetFloat(1.0);
- pEffect->GetVariableByName("g_HalfSpaceCullPosition")->AsScalar()->SetFloat(terrain_minheight*20);
-
- // drawing terrain to main buffer
- pEffect->GetVariableByName("g_ApplyFog")->AsScalar()->SetFloat(0.0f);
-
- enum PassPermutation
- {
- kPermutationSolid = 0,
- kPermutationWireframe,
- kPermutationDepthOnly,
- kPermutationDataOnly
- };
-
- pContext->IASetInputLayout(heightfield_inputlayout);
- pContext->IASetPrimitiveTopology(D3D11_PRIMITIVE_TOPOLOGY_1_CONTROL_POINT_PATCHLIST);
- pEffect->GetTechniqueByName("RenderHeightfield")->GetPassByIndex( kPermutationDataOnly )->Apply( 0, pContext );
- stride = sizeof(float) * 4;
- pContext->IASetVertexBuffers( 0, 1, &heightfield_vertexbuffer, &stride,&offset );
- pContext->Draw(terrain_numpatches_1d*terrain_numpatches_1d, 0);
-}
-
-
-void CTerrain::Render(CFirstPersonCamera *cam)
-{
- ID3D11DeviceContext* pContext;
- float origin[2]={0,0};
- UINT stride=sizeof(float)*4;
- UINT offset=0;
- UINT cRT = 1;
-
- pDevice->GetImmediateContext(&pContext);
-
- pEffect->GetVariableByName("g_HeightfieldTexture")->AsShaderResource()->SetResource(heightmap_textureSRV);
- pEffect->GetVariableByName("g_LayerdefTexture")->AsShaderResource()->SetResource(layerdef_textureSRV);
- pEffect->GetVariableByName("g_RockBumpTexture")->AsShaderResource()->SetResource(rock_bump_textureSRV);
- pEffect->GetVariableByName("g_SkyTexture")->AsShaderResource()->SetResource(sky_textureSRV);
- pEffect->GetVariableByName("g_HeightFieldOrigin")->AsVector()->SetFloatVector(origin);
- pEffect->GetVariableByName("g_HeightFieldSize")->AsScalar()->SetFloat(terrain_gridpoints*terrain_geometry_scale);
-
- ID3D11RenderTargetView *colorBuffer = DXUTGetD3D11RenderTargetView();
- ID3D11DepthStencilView *backBuffer = DXUTGetD3D11DepthStencilView();
- D3D11_VIEWPORT currentViewport;
- D3D11_VIEWPORT reflection_Viewport;
- D3D11_VIEWPORT refraction_Viewport;
- D3D11_VIEWPORT shadowmap_resource_viewport;
- D3D11_VIEWPORT water_normalmap_resource_viewport;
- D3D11_VIEWPORT main_Viewport;
-
- float ClearColor[4] = { 0.0f, 0.0f, 0.0f, 1.0f };
- float RefractionClearColor[4] = { 0.5f, 0.5f, 0.5f, 1.0f };
-
- reflection_Viewport.Width=(float)BackbufferWidth*reflection_buffer_size_multiplier;
- reflection_Viewport.Height=(float)BackbufferHeight*reflection_buffer_size_multiplier;
- reflection_Viewport.MaxDepth=1;
- reflection_Viewport.MinDepth=0;
- reflection_Viewport.TopLeftX=0;
- reflection_Viewport.TopLeftY=0;
-
- refraction_Viewport.Width=(float)BackbufferWidth*refraction_buffer_size_multiplier;
- refraction_Viewport.Height=(float)BackbufferHeight*refraction_buffer_size_multiplier;
- refraction_Viewport.MaxDepth=1;
- refraction_Viewport.MinDepth=0;
- refraction_Viewport.TopLeftX=0;
- refraction_Viewport.TopLeftY=0;
-
- main_Viewport.Width=(float)BackbufferWidth*main_buffer_size_multiplier;
- main_Viewport.Height=(float)BackbufferHeight*main_buffer_size_multiplier;
- main_Viewport.MaxDepth=1;
- main_Viewport.MinDepth=0;
- main_Viewport.TopLeftX=0;
- main_Viewport.TopLeftY=0;
-
- shadowmap_resource_viewport.Width=shadowmap_resource_buffer_size_xy;
- shadowmap_resource_viewport.Height=shadowmap_resource_buffer_size_xy;
- shadowmap_resource_viewport.MaxDepth=1;
- shadowmap_resource_viewport.MinDepth=0;
- shadowmap_resource_viewport.TopLeftX=0;
- shadowmap_resource_viewport.TopLeftY=0;
-
- water_normalmap_resource_viewport.Width=water_normalmap_resource_buffer_size_xy;
- water_normalmap_resource_viewport.Height=water_normalmap_resource_buffer_size_xy;
- water_normalmap_resource_viewport.MaxDepth=1;
- water_normalmap_resource_viewport.MinDepth=0;
- water_normalmap_resource_viewport.TopLeftX=0;
- water_normalmap_resource_viewport.TopLeftY=0;
-
-
- //saving scene color buffer and back buffer to constants
- pContext->RSGetViewports( &cRT, &currentViewport);
- pContext->OMGetRenderTargets( 1, &colorBuffer, &backBuffer );
-
-
- // selecting shadowmap_resource rendertarget
- pEffect->GetVariableByName("g_ShadowmapTexture")->AsShaderResource()->SetResource(NULL);
-
- pContext->RSSetViewports(1,&shadowmap_resource_viewport);
- pContext->OMSetRenderTargets( 0, NULL, shadowmap_resourceDSV);
- pContext->ClearDepthStencilView( shadowmap_resourceDSV, D3D11_CLEAR_DEPTH, 1.0, 0 );
-
- //drawing terrain to shadowmap
- SetupLightView(cam);
-
- pEffect->GetVariableByName("g_ShadowmapTexture")->AsShaderResource()->SetResource(NULL);
-
- pEffect->GetVariableByName("g_ApplyFog")->AsScalar()->SetFloat(0.0f);
-
- pContext->IASetInputLayout(heightfield_inputlayout);
- pContext->IASetPrimitiveTopology(D3D11_PRIMITIVE_TOPOLOGY_1_CONTROL_POINT_PATCHLIST);
- pEffect->GetTechniqueByName("RenderHeightfield")->GetPassByIndex(2)->Apply(0, pContext);
- stride=sizeof(float)*4;
- pContext->IASetVertexBuffers(0,1,&heightfield_vertexbuffer,&stride,&offset);
- pContext->Draw(terrain_numpatches_1d*terrain_numpatches_1d, 0);
-
- pEffect->GetTechniqueByName("Default")->GetPassByIndex(0)->Apply(0, pContext);
-
- pEffect->GetVariableByName("g_ShadowmapTexture")->AsShaderResource()->SetResource(shadowmap_resourceSRV);
-
-
- // setting up reflection rendertarget
- pContext->RSSetViewports(1,&reflection_Viewport);
- pContext->OMSetRenderTargets( 1, &reflection_color_resourceRTV, reflection_depth_resourceDSV);
- pContext->ClearRenderTargetView( reflection_color_resourceRTV, RefractionClearColor );
- pContext->ClearDepthStencilView( reflection_depth_resourceDSV, D3D11_CLEAR_DEPTH, 1.0, 0 );
-
- SetupReflectionView(cam);
- // drawing sky to reflection RT
- pEffect->GetTechniqueByName("RenderSky")->GetPassByIndex(0)->Apply(0, pContext);
- pContext->IASetInputLayout(trianglestrip_inputlayout);
- pContext->IASetPrimitiveTopology(D3D11_PRIMITIVE_TOPOLOGY_TRIANGLESTRIP);
- stride=sizeof(float)*6;
- pContext->IASetVertexBuffers(0,1,&sky_vertexbuffer,&stride,&offset);
- pContext->Draw(sky_gridpoints*(sky_gridpoints+2)*2, 0);
-
- // drawing terrain to reflection RT
- pEffect->GetVariableByName("g_ApplyFog")->AsScalar()->SetFloat(0.0f);
- pContext->IASetInputLayout(heightfield_inputlayout);
- pContext->IASetPrimitiveTopology(D3D11_PRIMITIVE_TOPOLOGY_1_CONTROL_POINT_PATCHLIST);
- pEffect->GetTechniqueByName("RenderHeightfield")->GetPassByIndex(0)->Apply(0, pContext);
- stride=sizeof(float)*4;
- pContext->IASetVertexBuffers(0,1,&heightfield_vertexbuffer,&stride,&offset);
- pContext->Draw(terrain_numpatches_1d*terrain_numpatches_1d, 0);
-
-
- pEffect->GetTechniqueByName("Default")->GetPassByIndex(0)->Apply(0, pContext);
-
- // setting up main rendertarget
- pContext->RSSetViewports(1,&main_Viewport);
- pContext->OMSetRenderTargets( 1, &main_color_resourceRTV, main_depth_resourceDSV);
- pContext->ClearRenderTargetView( main_color_resourceRTV, ClearColor );
- pContext->ClearDepthStencilView( main_depth_resourceDSV, D3D11_CLEAR_DEPTH, 1.0, 0 );
- SetupNormalView(cam);
-
- // drawing terrain to main buffer
-
- pEffect->GetVariableByName("g_ApplyFog")->AsScalar()->SetFloat(1.0f);
- pEffect->GetVariableByName("g_FoamIntensityTexture")->AsShaderResource()->SetResource(foam_intensity_textureSRV);
- pEffect->GetVariableByName("g_FoamDiffuseTexture")->AsShaderResource()->SetResource(foam_diffuse_textureSRV);
- D3DXMATRIX topDownMatrix;
- g_pOceanSurf->pDistanceFieldModule->GetWorldToTopDownTextureMatrix( topDownMatrix );
- pEffect->GetVariableByName("g_WorldToTopDownTextureMatrix" )->AsMatrix()->SetMatrix(&topDownMatrix._11);
- pEffect->GetVariableByName("g_Time" )->AsScalar()->SetFloat( g_ShoreTime );
- pEffect->GetVariableByName("g_DataTexture" )->AsShaderResource()->SetResource( g_pOceanSurf->pDistanceFieldModule->GetDataTextureSRV() );
- pEffect->GetVariableByName("g_GerstnerSteepness")->AsScalar()->SetFloat( g_GerstnerSteepness );
- pEffect->GetVariableByName("g_BaseGerstnerAmplitude")->AsScalar()->SetFloat( g_BaseGerstnerAmplitude );
- pEffect->GetVariableByName("g_BaseGerstnerWavelength")->AsScalar()->SetFloat( g_BaseGerstnerWavelength );
- pEffect->GetVariableByName("g_BaseGerstnerSpeed")->AsScalar()->SetFloat( g_BaseGerstnerSpeed );
- pEffect->GetVariableByName("g_BaseGerstnerParallelness")->AsScalar()->SetFloat( g_GerstnerParallelity );
- pEffect->GetVariableByName("g_WindDirection")->AsVector()->SetFloatVector( &g_WindDir.x );
-
- pContext->IASetInputLayout(heightfield_inputlayout);
- pContext->IASetPrimitiveTopology(D3D11_PRIMITIVE_TOPOLOGY_1_CONTROL_POINT_PATCHLIST);
- pEffect->GetTechniqueByName("RenderHeightfield")->GetPassByIndex(0)->Apply(0, pContext);
- stride=sizeof(float)*4;
- pContext->IASetVertexBuffers(0,1,&heightfield_vertexbuffer,&stride,&offset);
- pContext->Draw(terrain_numpatches_1d*terrain_numpatches_1d, 0);
-
-
- // resolving main buffer color to refraction color resource
- pContext->ResolveSubresource(refraction_color_resource,0,main_color_resource,0,DXGI_FORMAT_R8G8B8A8_UNORM);
- pContext->GenerateMips(refraction_color_resourceSRV);
-
- // resolving main buffer depth to refraction depth resource manually
- pContext->RSSetViewports( 1, &main_Viewport );
- pContext->OMSetRenderTargets( 1, &refraction_depth_resourceRTV, NULL);
- pContext->ClearRenderTargetView(refraction_depth_resourceRTV, ClearColor);
-
- pContext->IASetInputLayout(trianglestrip_inputlayout);
- pContext->IASetPrimitiveTopology(D3D11_PRIMITIVE_TOPOLOGY_TRIANGLESTRIP);
-
- switch(MultiSampleCount)
- {
- case 1:
- pEffect->GetVariableByName("g_RefractionDepthTextureMS1")->AsShaderResource()->SetResource(main_depth_resourceSRV);
- pEffect->GetTechniqueByName("RefractionDepthManualResolve")->GetPassByIndex(0)->Apply(0, pContext);
- break;
- case 2:
- pEffect->GetVariableByName("g_RefractionDepthTextureMS2")->AsShaderResource()->SetResource(main_depth_resourceSRV);
- pEffect->GetTechniqueByName("RefractionDepthManualResolve")->GetPassByIndex(1)->Apply(0, pContext);
- break;
- case 4:
- pEffect->GetVariableByName("g_RefractionDepthTextureMS4")->AsShaderResource()->SetResource(main_depth_resourceSRV);
- pEffect->GetTechniqueByName("RefractionDepthManualResolve")->GetPassByIndex(2)->Apply(0, pContext);
- break;
- default:
- pEffect->GetVariableByName("g_RefractionDepthTextureMS1")->AsShaderResource()->SetResource(main_depth_resourceSRV);
- pEffect->GetTechniqueByName("RefractionDepthManualResolve1")->GetPassByIndex(0)->Apply(0, pContext);
- break;
- }
-
-
-
- stride=sizeof(float)*6;
- pContext->IASetVertexBuffers(0,1,&heightfield_vertexbuffer,&stride,&offset);
- pContext->Draw(4, 0); // just need to pass 4 vertices to shader
- pEffect->GetTechniqueByName("Default")->GetPassByIndex(0)->Apply(0, pContext);
-
- // clearing resource bindings
- switch(MultiSampleCount)
- {
- case 1:
- pEffect->GetVariableByName("g_RefractionDepthTextureMS1")->AsShaderResource()->SetResource(NULL);
- pEffect->GetTechniqueByName("RefractionDepthManualResolve")->GetPassByIndex(0)->Apply(0, pContext);
- break;
- case 2:
- pEffect->GetVariableByName("g_RefractionDepthTextureMS2")->AsShaderResource()->SetResource(NULL);
- pEffect->GetTechniqueByName("RefractionDepthManualResolve")->GetPassByIndex(1)->Apply(0, pContext);
- break;
- case 4:
- pEffect->GetVariableByName("g_RefractionDepthTextureMS4")->AsShaderResource()->SetResource(NULL);
- pEffect->GetTechniqueByName("RefractionDepthManualResolve")->GetPassByIndex(2)->Apply(0, pContext);
- break;
- default:
- pEffect->GetVariableByName("g_RefractionDepthTextureMS1")->AsShaderResource()->SetResource(NULL);
- pEffect->GetTechniqueByName("RefractionDepthManualResolve1")->GetPassByIndex(0)->Apply(0, pContext);
- break;
- }
- pEffect->GetTechniqueByName("Default")->GetPassByIndex(0)->Apply(0, pContext);
-
- // getting back to rendering to main buffer
- pContext->RSSetViewports(1,&main_Viewport);
- pContext->OMSetRenderTargets( 1, &main_color_resourceRTV, main_depth_resourceDSV);
-
- // drawing water surface to main buffer
- if(g_QueryStats)
- {
- pContext->Begin(g_pPipelineQuery);
- }
-
- ID3DX11Effect* oceanFX = g_pOceanSurf->m_pOceanFX;
-
- oceanFX->GetVariableByName("g_ReflectionTexture")->AsShaderResource()->SetResource(reflection_color_resourceSRV);
- oceanFX->GetVariableByName("g_RefractionTexture")->AsShaderResource()->SetResource(refraction_color_resourceSRV);
- oceanFX->GetVariableByName("g_RefractionDepthTextureResolved")->AsShaderResource()->SetResource(refraction_depth_resourceSRV);
- oceanFX->GetVariableByName("g_ShadowmapTexture")->AsShaderResource()->SetResource(shadowmap_resourceSRV);
- oceanFX->GetVariableByName("g_FoamIntensityTexture")->AsShaderResource()->SetResource(foam_intensity_textureSRV);
- oceanFX->GetVariableByName("g_FoamDiffuseTexture")->AsShaderResource()->SetResource(foam_diffuse_textureSRV);
-
- const D3DXMATRIX matView = D3DXMATRIX(1,0,0,0,0,0,1,0,0,1,0,0,0,0,0,1) * *cam->GetViewMatrix();
- const D3DXMATRIX matProj = *cam->GetProjMatrix();
- D3DXVECTOR3 cameraPosition = *cam->GetEyePt();
- D3DXVECTOR3 lightPosition = D3DXVECTOR3(14000.0f,6500.0f,4000.0f);
-
- oceanFX->GetVariableByName("g_ModelViewMatrix")->AsMatrix()->SetMatrix(matView);
- oceanFX->GetVariableByName("g_ModelViewProjectionMatrix")->AsMatrix()->SetMatrix(matView*matProj);
- oceanFX->GetVariableByName("g_CameraPosition")->AsVector()->SetFloatVector(cameraPosition);
- oceanFX->GetVariableByName("g_LightPosition")->AsVector()->SetFloatVector(lightPosition);
- oceanFX->GetVariableByName("g_Wireframe")->AsScalar()->SetFloat(g_Wireframe ? 1.0f : 0.0f);
- oceanFX->GetVariableByName("g_WinSize")->AsVector()->SetFloatVector(D3DXVECTOR4(main_Viewport.Width,main_Viewport.Height,0,0));
- g_pOceanSurf->renderShaded(pContext, matView,matProj,g_hOceanSimulation, g_hOceanSavestate, g_WindDir, g_GerstnerSteepness, g_BaseGerstnerAmplitude, g_BaseGerstnerWavelength, g_BaseGerstnerSpeed, g_GerstnerParallelity, g_ShoreTime);
-
- g_pOceanSurf->getQuadTreeStats(g_ocean_quadtree_stats);
-
- if(g_QueryStats)
- {
- pContext->End(g_pPipelineQuery);
- while(S_OK != pContext->GetData(g_pPipelineQuery, &g_PipelineQueryData, sizeof(g_PipelineQueryData), 0));
- }
-
- // clearing resource bindings
- oceanFX->GetVariableByName("g_ReflectionTexture")->AsShaderResource()->SetResource(NULL);
- oceanFX->GetVariableByName("g_RefractionTexture")->AsShaderResource()->SetResource(NULL);
- oceanFX->GetVariableByName("g_RefractionDepthTextureResolved")->AsShaderResource()->SetResource(NULL);
- oceanFX->GetVariableByName("g_ShadowmapTexture")->AsShaderResource()->SetResource(NULL);
- oceanFX->GetTechniqueByName("RenderOceanSurfTech")->GetPassByIndex(0)->Apply(0, pContext);
-
- // drawing readback markers to main buffer
- const UINT vbOffset = 0;
- const UINT vertexStride = sizeof(D3DXVECTOR4);
- pContext->IASetInputLayout(g_pOceanSurf->m_pRayContactLayout);
- pContext->IASetVertexBuffers(0, 1, &g_pOceanSurf->m_pContactVB, &vertexStride, &vbOffset);
- pContext->IASetIndexBuffer(g_pOceanSurf->m_pContactIB, DXGI_FORMAT_R16_UINT, 0);
- pContext->IASetPrimitiveTopology(D3D10_PRIMITIVE_TOPOLOGY_TRIANGLELIST);
- for( int i = 0; i < NumMarkers; i++)
- {
- g_pOceanSurf->m_pOceanFX->GetVariableByName("g_ContactPosition")->AsVector()->SetFloatVector(D3DXVECTOR4(g_readback_marker_positions[i].x,g_readback_marker_positions[i].y,g_readback_marker_positions[i].z,0));
- g_pOceanSurf->m_pRenderRayContactTechnique->GetPassByIndex(0)->Apply(0, pContext);
- pContext->DrawIndexed(12, 0, 0);
- }
-
-
- // drawing raycast contacts to main buffer
- pContext->IASetInputLayout(g_pOceanSurf->m_pRayContactLayout);
- pContext->IASetVertexBuffers(0, 1, &g_pOceanSurf->m_pContactVB, &vertexStride, &vbOffset);
- pContext->IASetIndexBuffer(g_pOceanSurf->m_pContactIB, DXGI_FORMAT_R16_UINT, 0);
- pContext->IASetPrimitiveTopology(D3D10_PRIMITIVE_TOPOLOGY_TRIANGLELIST);
- for( int i = 0; i < NumMarkers; i++)
- {
- g_pOceanSurf->m_pOceanFX->GetVariableByName("g_ContactPosition")->AsVector()->SetFloatVector(D3DXVECTOR4(g_raycast_hitpoints[i].x, g_raycast_hitpoints[i].z, g_raycast_hitpoints[i].y, 0.0f));
- g_pOceanSurf->m_pRenderRayContactTechnique->GetPassByIndex(0)->Apply(0, pContext);
- pContext->DrawIndexed(12, 0, 0);
- }
- // drawing rays to main buffer
- pContext->IASetPrimitiveTopology(D3D10_PRIMITIVE_TOPOLOGY_LINESTRIP);
- for( int i = 0; i < NumMarkers; i++)
- {
- g_pOceanSurf->m_pOceanFX->GetVariableByName("g_OriginPosition")->AsVector()->SetFloatVector(g_raycast_origins[i]);
- g_pOceanSurf->m_pOceanFX->GetVariableByName("g_RayDirection")->AsVector()->SetFloatVector(g_raycast_directions[i]*100.0f);
- g_pOceanSurf->m_pRenderRayContactTechnique->GetPassByIndex(1)->Apply(0, pContext);
- pContext->DrawIndexed(2, 0, 0);
- }
-
- //drawing sky to main buffer
- pEffect->GetTechniqueByName("RenderSky")->GetPassByIndex(0)->Apply(0, pContext);
-
- pContext->IASetInputLayout(trianglestrip_inputlayout);
- pContext->IASetPrimitiveTopology(D3D11_PRIMITIVE_TOPOLOGY_TRIANGLESTRIP);
-
- stride=sizeof(float)*6;
- pContext->IASetVertexBuffers(0,1,&sky_vertexbuffer,&stride,&offset);
- pContext->Draw(sky_gridpoints*(sky_gridpoints+2)*2, 0);
-
- pEffect->GetTechniqueByName("Default")->GetPassByIndex(0)->Apply(0, pContext);
-
- //restoring scene color buffer and back buffer
- pContext->OMSetRenderTargets( 1, &colorBuffer, backBuffer);
- pContext->ClearDepthStencilView(backBuffer, D3D11_CLEAR_DEPTH | D3D11_CLEAR_STENCIL, 1.f, 0);
- pContext->ClearRenderTargetView(colorBuffer, ClearColor);
- pContext->RSSetViewports( 1, &currentViewport );
-
- //resolving main buffer
- pContext->ResolveSubresource(main_color_resource_resolved,0,main_color_resource,0,DXGI_FORMAT_R8G8B8A8_UNORM);
-
- //drawing main buffer to back buffer
- pEffect->GetVariableByName("g_MainTexture")->AsShaderResource()->SetResource(main_color_resource_resolvedSRV);
- pEffect->GetVariableByName("g_MainBufferSizeMultiplier")->AsScalar()->SetFloat(main_buffer_size_multiplier);
-
- pContext->IASetInputLayout(trianglestrip_inputlayout);
- pContext->IASetPrimitiveTopology(D3D11_PRIMITIVE_TOPOLOGY_TRIANGLESTRIP);
- pEffect->GetTechniqueByName("MainToBackBuffer")->GetPassByIndex(0)->Apply(0, pContext);
- stride=sizeof(float)*6;
- pContext->IASetVertexBuffers(0,1,&heightfield_vertexbuffer,&stride,&offset);
- pContext->Draw(4, 0); // just need to pass 4 vertices to shader
- pEffect->GetTechniqueByName("Default")->GetPassByIndex(0)->Apply(0, pContext);
-
- pEffect->GetVariableByName("g_MainTexture")->AsShaderResource()->SetResource(NULL);
-
- SAFE_RELEASE ( colorBuffer );
- SAFE_RELEASE ( backBuffer );
-
- pContext->Release();
-}
-
-float bilinear_interpolation(float fx, float fy, float a, float b, float c, float d)
-{
- float s1,s2,s3,s4;
- s1=fx*fy;
- s2=(1-fx)*fy;
- s3=(1-fx)*(1-fy);
- s4=fx*(1-fy);
- return((a*s3+b*s4+c*s1+d*s2));
-}
-
-void CTerrain::SetupReflectionView(CFirstPersonCamera *cam)
-{
-
- float aspectRatio = BackbufferWidth / BackbufferHeight;
-
- D3DXVECTOR3 EyePoint;
- D3DXVECTOR3 LookAtPoint;
-
- EyePoint =*cam->GetEyePt();
- LookAtPoint =*cam->GetLookAtPt();
- EyePoint.y=-1.0f*EyePoint.y+1.0f;
- LookAtPoint.y=-1.0f*LookAtPoint.y+1.0f;
-
-
- D3DXMATRIX mView;
- D3DXMATRIX mProj;
- D3DXMATRIX mViewProj;
- D3DXMATRIX mViewProjInv;
-
- D3DXMATRIX mWorld;
- mView = *cam->GetViewMatrix();
- mWorld = *cam->GetWorldMatrix();
-
- mWorld._42=-mWorld._42-1.0f;
-
- mWorld._21*=-1.0f;
- mWorld._23*=-1.0f;
-
- mWorld._32*=-1.0f;
-
- D3DXMatrixInverse(&mView, NULL, &mWorld);
- D3DXMatrixPerspectiveFovLH(&mProj,camera_fov * D3DX_PI / 360.0f,aspectRatio,scene_z_near,scene_z_far);
- mViewProj=mView*mProj;
- D3DXMatrixInverse(&mViewProjInv, NULL, &mViewProj);
-
- pEffect->GetVariableByName("g_ModelViewProjectionMatrix")->AsMatrix()->SetMatrix(mViewProj);
- pEffect->GetVariableByName("g_CameraPosition")->AsVector()->SetFloatVector(EyePoint);
- D3DXVECTOR3 direction = LookAtPoint - EyePoint;
- D3DXVECTOR3 normalized_direction = *D3DXVec3Normalize(&normalized_direction,&direction);
- pEffect->GetVariableByName("g_CameraDirection")->AsVector()->SetFloatVector(normalized_direction);
-
- pEffect->GetVariableByName("g_HalfSpaceCullSign")->AsScalar()->SetFloat(1.0f);
- pEffect->GetVariableByName("g_HalfSpaceCullPosition")->AsScalar()->SetFloat(0);
-}
-
-void CTerrain::SetupRefractionView(CFirstPersonCamera *cam)
-{
- pEffect->GetVariableByName("g_HalfSpaceCullSign")->AsScalar()->SetFloat(-1.0f);
- pEffect->GetVariableByName("g_HalfSpaceCullPosition")->AsScalar()->SetFloat(terrain_minheight);
-}
-void CTerrain::SetupLightView(CFirstPersonCamera *cam)
-{
-
- D3DXVECTOR3 EyePoint= D3DXVECTOR3(14000.0f,6500.0f,4000.0f);
- D3DXVECTOR3 LookAtPoint = D3DXVECTOR3(terrain_far_range/2.0f,0.0f,terrain_far_range/2.0f);
- D3DXVECTOR3 lookUp = D3DXVECTOR3(0,1,0);
- D3DXVECTOR3 cameraPosition = *cam->GetEyePt();
-
- float nr, fr;
- nr=sqrt(EyePoint.x*EyePoint.x+EyePoint.y*EyePoint.y+EyePoint.z*EyePoint.z)-terrain_far_range*1.0f;
- fr=sqrt(EyePoint.x*EyePoint.x+EyePoint.y*EyePoint.y+EyePoint.z*EyePoint.z)+terrain_far_range*1.0f;
-
- D3DXMATRIX mView = *D3DXMatrixLookAtLH(&mView,&EyePoint,&LookAtPoint,&lookUp);
- D3DXMATRIX mProjMatrix = *D3DXMatrixOrthoLH(&mProjMatrix,terrain_far_range*1.5,terrain_far_range,nr,fr);
- D3DXMATRIX mViewProj = mView * mProjMatrix;
- D3DXMATRIX mViewProjInv;
- D3DXMatrixInverse(&mViewProjInv, NULL, &mViewProj);
-
- ID3DX11Effect* oceanFX = g_pOceanSurf->m_pOceanFX;
- oceanFX->GetVariableByName("g_LightModelViewProjectionMatrix")->AsMatrix()->SetMatrix(mViewProj);
-
- pEffect->GetVariableByName("g_ModelViewProjectionMatrix")->AsMatrix()->SetMatrix(mViewProj);
- pEffect->GetVariableByName("g_LightModelViewProjectionMatrix")->AsMatrix()->SetMatrix(mViewProj);
- pEffect->GetVariableByName("g_LightModelViewProjectionMatrixInv")->AsMatrix()->SetMatrix(mViewProjInv);
- pEffect->GetVariableByName("g_CameraPosition")->AsVector()->SetFloatVector(cameraPosition);
- D3DXVECTOR3 direction = *cam->GetLookAtPt() - *cam->GetEyePt();
- D3DXVECTOR3 normalized_direction = *D3DXVec3Normalize(&normalized_direction,&direction);
- pEffect->GetVariableByName("g_CameraDirection")->AsVector()->SetFloatVector(normalized_direction);
-
- pEffect->GetVariableByName("g_HalfSpaceCullSign")->AsScalar()->SetFloat(1.0);
- pEffect->GetVariableByName("g_HalfSpaceCullPosition")->AsScalar()->SetFloat(terrain_minheight*2);
-
-}
-
-void CTerrain::SetupNormalView(CFirstPersonCamera *cam)
-{
- D3DXVECTOR3 EyePoint;
- D3DXVECTOR3 LookAtPoint;
-
- EyePoint =*cam->GetEyePt();
- LookAtPoint =*cam->GetLookAtPt();
- D3DXMATRIX mView = *cam->GetViewMatrix();
- D3DXMATRIX mProjMatrix = *cam->GetProjMatrix();
- D3DXMATRIX mViewProj = mView * mProjMatrix;
- D3DXMATRIX mViewProjInv;
- D3DXMatrixInverse(&mViewProjInv, NULL, &mViewProj);
- D3DXVECTOR3 cameraPosition = *cam->GetEyePt();
-
- pEffect->GetVariableByName("g_ModelViewMatrix")->AsMatrix()->SetMatrix(mView);
- pEffect->GetVariableByName("g_ModelViewProjectionMatrix")->AsMatrix()->SetMatrix(mViewProj);
- pEffect->GetVariableByName("g_ModelViewProjectionMatrixInv")->AsMatrix()->SetMatrix(mViewProjInv);
- pEffect->GetVariableByName("g_CameraPosition")->AsVector()->SetFloatVector(cameraPosition);
- D3DXVECTOR3 direction = LookAtPoint - EyePoint;
- D3DXVECTOR3 normalized_direction = *D3DXVec3Normalize(&normalized_direction,&direction);
- pEffect->GetVariableByName("g_CameraDirection")->AsVector()->SetFloatVector(normalized_direction);
- pEffect->GetVariableByName("g_HalfSpaceCullSign")->AsScalar()->SetFloat(1.0);
- pEffect->GetVariableByName("g_HalfSpaceCullPosition")->AsScalar()->SetFloat(terrain_minheight*20);
-
-}