#pragma once #define VC_EXTRALEAN #define WIN32_LEAN_AND_MEAN #include #include #define D3D11_NO_HELPERS #include #include #include #include "Sound.h" #include "Animation.h" #define ATOM_EDIT 0xC018 #define ATOM_STATIC 0xC019 #define WIDTH 1280 #define HEIGHT 720 #define FULLSCREEN struct TEXTURE_2D_SRV_UAV_RTV { ID3D11Texture2D* TEX; ID3D11ShaderResourceView* SRV; ID3D11UnorderedAccessView* UAV; ID3D11RenderTargetView* RTV; }; typedef struct { // DXGI_MODE_DESC BufferDesc; UINT Width; UINT Height; //DXGI_RATIONAL RefreshRate; UINT Numerator; UINT Denominator; DXGI_FORMAT Format; DXGI_MODE_SCANLINE_ORDER ScanlineOrdering; DXGI_MODE_SCALING Scaling; // DXGI_SAMPLE_DESC SampleDesc; UINT Count; UINT Quality; DXGI_USAGE BufferUsage; UINT BufferCount; HWND OutputWindow; BOOL Windowed; DXGI_SWAP_EFFECT SwapEffect; UINT Flags; } HG_DXGI_SWAP_CHAIN_DESC; struct ConstantBufferType { float smoothNoiseColorR; // additive to particle state float smoothNoiseColorG; // additive to particle state float smoothNoiseColorB; // additive to particle state float smoothNoiseColorA; // additive to particle state float colorBlendR; float colorBlendG; float colorBlendB; float colorBlendA; float smoothNoiseDirectionX; float smoothNoiseDirectionY; float smoothNoiseDirectionZ; float demoTime; // USED float emitterDirectionX; // USED float emitterDirectionY; // USED float emitterDirectionZ; // USED float deltaTime; // USED float emitterPositionX; float emitterPositionY; float emitterPositionZ; float emitterRadius; // USED float cameraPositionX; float cameraPositionY; float cameraPositionZ; float emitRate; // USED// = 0.00001f; //delay in seconds between each particle spawn float cameraLookatX; float cameraLookatY; float cameraLookatZ; float lifeTime; // USED// = 3.0f; //particle lifetime in seconds float cameraUpX; float cameraUpY; float cameraUpZ; float gravity; // USED float emitterVelocityX; float emitterVelocityY; float emitterVelocityZ; float emitChaos; float emitterMass; float sdfBlendFactor; float smoothNoiseSize; // additive to particle state float particleMass; // additive to particle state float envelope1; float envelope2; float distort; float note; }; #pragma bss_seg(".bss") static HWND hWnd; static ID3D11Device* device; static ID3D11DeviceContext* context; static IDXGISwapChain* swapChain; static ID3D11Texture2D* backBufferTexture; static ID3D11UnorderedAccessView* backBufferUAV; static ID3D11RenderTargetView* renderTargetView; static ID3D11UnorderedAccessView* particleBuffer1UAV; static ID3D11ShaderResourceView* particleBuffer1SRV; static ID3D11UnorderedAccessView* particleBuffer2UAV; static ID3D11ShaderResourceView* particleBuffer2SRV; static ID3D11Buffer* particleBuffer1; static ID3D11Buffer* particleBuffer2; static ID3D11Texture2D* depthBuffer; static ID3D11Buffer* constantBuffer; static ID3D11Buffer* constantBuffer2; static ID3D11Buffer* constantBuffer3; static ID3D11Buffer* constantBufferTemp; static ID3D11ComputeShader* starInitShader; static ID3D11ComputeShader* event1Shader; static ID3D11ComputeShader* event2Shader; static ID3D11ComputeShader* updateShader; static ID3D11ComputeShader* drawShader; static ID3D11ComputeShader* csNoise; static ID3D11ComputeShader* csFbm; static ID3D11VertexShader* constantBufferVertexShader; static ID3D11GeometryShader* constantBufferGeometryShader; static ID3D11VertexShader* particleVertexShader; static ID3D11GeometryShader* particleGeometryShader; static ID3D11PixelShader* particlePixelShader; static ID3D11InputLayout* particleInputLayout; static ID3D11RenderTargetView* backBufferRtv; static ID3D11DepthStencilState* depthStencilState; static ID3D11DepthStencilView* depthStencilView; static ID3D11BlendState* alphaBlendState; static pD3DCompile d3dCompile; static ID3DBlob* shaderBlob; static void* shaderCode; static SIZE_T shaderSize; static D3D11_MAPPED_SUBRESOURCE mappedResource; static float oldDemoTime; static float demoTime; static int oldEvent; static float zero[8]; static ConstantBufferType* constantBufferData; static UINT indices[] = { -1, 0, 0, 0 }; static ID3D11SamplerState* ppSampler; static ID3D11SamplerState* texSampler; static TEXTURE_2D_SRV_UAV_RTV tex0; static TEXTURE_2D_SRV_UAV_RTV noiseTemp; static TEXTURE_2D_SRV_UAV_RTV noise; static TEXTURE_2D_SRV_UAV_RTV pingPongTex1; static TEXTURE_2D_SRV_UAV_RTV ghostsTex4; static TEXTURE_2D_SRV_UAV_RTV streaksTex4; static TEXTURE_2D_SRV_UAV_RTV lensDirt2; static TEXTURE_2D_SRV_UAV_RTV tmpTex1; static TEXTURE_2D_SRV_UAV_RTV blurTex1; static TEXTURE_2D_SRV_UAV_RTV tmpTex8; static TEXTURE_2D_SRV_UAV_RTV blurTex8; static TEXTURE_2D_SRV_UAV_RTV tmpTex32; static TEXTURE_2D_SRV_UAV_RTV blurTex32; static ID3D11ComputeShader* csDistortChroma; static ID3D11ComputeShader* csRadialBlur; static ID3D11ComputeShader* csCircumferentialBlur; static ID3D11ComputeShader* csStreaks; static ID3D11ComputeShader* csLensDirt; static ID3D11ComputeShader* csBlurH; static ID3D11ComputeShader* csBlurV; static ID3D11ComputeShader* csGhosts; static ID3D11ComputeShader* csMerge; #pragma data_seg(".texDesc") static D3D11_TEXTURE2D_DESC texDesc = { 0, 0, 0, 1, DXGI_FORMAT_R16G16B16A16_FLOAT, { 1, 0 }, D3D11_USAGE_DEFAULT, D3D11_BIND_RENDER_TARGET | D3D11_BIND_SHADER_RESOURCE | D3D11_BIND_UNORDERED_ACCESS, 0, D3D11_RESOURCE_MISC_GENERATE_MIPS }; #pragma data_seg(".ppSamplerDesc") static D3D11_SAMPLER_DESC ppSamplerDesc = { D3D11_FILTER_MIN_MAG_MIP_LINEAR, //D3D11_FILTER_MIN_MAG_MIP_LINEAR, D3D11_FILTER_ANISOTROPIC, D3D11_FILTER_MIN_MAG_MIP_POINT D3D11_TEXTURE_ADDRESS_CLAMP, D3D11_TEXTURE_ADDRESS_CLAMP, D3D11_TEXTURE_ADDRESS_CLAMP, 0.0f, 1, D3D11_COMPARISON_ALWAYS, { 0, 0, 0, 0 }, 0, D3D11_FLOAT32_MAX }; #pragma data_seg(".texSamplerDesc") static D3D11_SAMPLER_DESC texSamplerDesc = { D3D11_FILTER_MIN_MAG_MIP_LINEAR, //D3D11_FILTER_MIN_MAG_MIP_LINEAR, D3D11_FILTER_ANISOTROPIC, D3D11_FILTER_MIN_MAG_MIP_POINT D3D11_TEXTURE_ADDRESS_MIRROR, D3D11_TEXTURE_ADDRESS_MIRROR, D3D11_TEXTURE_ADDRESS_MIRROR, 0.0f, 1, D3D11_COMPARISON_ALWAYS, { 0, 0, 0, 0 }, 0, D3D11_FLOAT32_MAX }; #pragma data_seg(".d3dcompiler") static char* d3dcompiler = "d3dcompiler_47.dll"; #pragma data_seg(".swapChainDesc") #ifdef FULLSCREEN //static HG_DXGI_SWAP_CHAIN_DESC swapChainDesc = { // WIDTH, HEIGHT, 60, 1, DXGI_FORMAT_R8G8B8A8_UNORM, // DXGI_MODE_SCANLINE_ORDER_UNSPECIFIED, DXGI_MODE_SCALING_UNSPECIFIED, // 1, 0, DXGI_USAGE_RENDER_TARGET_OUTPUT | DXGI_USAGE_UNORDERED_ACCESS | DXGI_USAGE_SHADER_INPUT, 2, 0, 0, DXGI_SWAP_EFFECT_FLIP_SEQUENTIAL, 0 //}; static HG_DXGI_SWAP_CHAIN_DESC swapChainDesc = { WIDTH, HEIGHT, 60, 1, DXGI_FORMAT_R16G16B16A16_FLOAT, DXGI_MODE_SCANLINE_ORDER_UNSPECIFIED, DXGI_MODE_SCALING_UNSPECIFIED, 1, 0, DXGI_USAGE_RENDER_TARGET_OUTPUT | DXGI_USAGE_UNORDERED_ACCESS | DXGI_USAGE_SHADER_INPUT, 1, 0, 0, DXGI_SWAP_EFFECT_DISCARD, 0 }; #else //static HG_DXGI_SWAP_CHAIN_DESC swapChainDesc = { // WIDTH, HEIGHT, 60, 1, DXGI_FORMAT_R16G16B16A16_FLOAT, // DXGI_MODE_SCANLINE_ORDER_UNSPECIFIED, DXGI_MODE_SCALING_UNSPECIFIED, // 1, 0, DXGI_USAGE_RENDER_TARGET_OUTPUT | DXGI_USAGE_UNORDERED_ACCESS | DXGI_USAGE_SHADER_INPUT, 1, 0, -1, DXGI_SWAP_EFFECT_DISCARD, 0 //}; static HG_DXGI_SWAP_CHAIN_DESC swapChainDesc = { WIDTH, HEIGHT, 60, 1, DXGI_FORMAT_R8G8B8A8_UNORM, DXGI_MODE_SCANLINE_ORDER_UNSPECIFIED, DXGI_MODE_SCALING_UNSPECIFIED, 1, 0, DXGI_USAGE_RENDER_TARGET_OUTPUT | DXGI_USAGE_UNORDERED_ACCESS | DXGI_USAGE_SHADER_INPUT, 2, 0, -1, DXGI_SWAP_EFFECT_FLIP_SEQUENTIAL, 0 }; #endif #pragma data_seg(".depthBufferDesc") static D3D11_TEXTURE2D_DESC depthBufferDesc = { WIDTH, HEIGHT, 1, 1, DXGI_FORMAT_D32_FLOAT, { 1, 0 }, D3D11_USAGE_DEFAULT, D3D11_BIND_DEPTH_STENCIL, 0, 0 }; #pragma data_seg(".constantBufferDesc") static D3D11_BUFFER_DESC constantBufferDesc = { sizeof(ConstantBufferType), D3D11_USAGE_DYNAMIC, D3D11_BIND_CONSTANT_BUFFER, D3D11_CPU_ACCESS_WRITE, 0, 0 }; #pragma data_seg(".constantBuffer2Desc") static D3D11_BUFFER_DESC constantBuffer2Desc = { 160, D3D11_USAGE_DEFAULT, D3D11_BIND_CONSTANT_BUFFER, 0, 0, 0 }; #pragma data_seg(".constantBufferTempDesc") static D3D11_BUFFER_DESC constantBufferTempDesc = { 160, D3D11_USAGE_DEFAULT, D3D11_BIND_STREAM_OUTPUT, 0, 0, 0 }; #pragma data_seg(".constantBufferSODeclarations") static D3D11_SO_DECLARATION_ENTRY constantBufferSODeclarations[] = { { 0, "_dS", 0, 0, 4, 0 }, { 0, "_cS", 0, 0, 4, 0 }, { 0, "_vS", 0, 0, 4, 0 }, { 0, "_vS", 1, 0, 4, 0 }, { 0, "_vS", 2, 0, 4, 0 }, { 0, "_vS", 3, 0, 4, 0 }, { 0, "_pS", 0, 0, 4, 0 }, { 0, "_pS", 1, 0, 4, 0 }, { 0, "_pS", 2, 0, 4, 0 }, { 0, "_pS", 3, 0, 4, 0 }, }; #pragma data_seg(".particleBufferDesc") static D3D11_BUFFER_DESC particleBufferDesc = { 1024 * 1024 * 64, D3D11_USAGE_DEFAULT, D3D11_BIND_UNORDERED_ACCESS | D3D11_BIND_SHADER_RESOURCE, 0, D3D11_RESOURCE_MISC_BUFFER_STRUCTURED, 64 }; #pragma data_seg(".particleBufferDesc") static D3D11_SHADER_RESOURCE_VIEW_DESC particleSrvDesc = { DXGI_FORMAT_UNKNOWN, D3D11_SRV_DIMENSION_BUFFER, { 0, 1024 * 1024 } }; #pragma data_seg(".particleUavDesc") static D3D11_UNORDERED_ACCESS_VIEW_DESC particleUavDesc = { DXGI_FORMAT_UNKNOWN, D3D11_UAV_DIMENSION_BUFFER, 0, 1024 * 1024, D3D11_BUFFER_UAV_FLAG_APPEND }; #pragma data_seg(".vertexUavDesc") static D3D11_UNORDERED_ACCESS_VIEW_DESC vertexUavDesc = { DXGI_FORMAT_UNKNOWN, D3D11_UAV_DIMENSION_BUFFER, 0, 1024 * 1024, 0 }; #pragma data_seg(".particleInputElementDescs") static D3D11_INPUT_ELEMENT_DESC particleInputElementDescs[] = { { "SV_POSITION", 0, DXGI_FORMAT_R32G32B32A32_FLOAT, 0, 0, D3D11_INPUT_PER_VERTEX_DATA, 0 }, { "LENGTH", 0, DXGI_FORMAT_R32_FLOAT, 0, 16, D3D11_INPUT_PER_VERTEX_DATA, 0 }, { "AGE", 0, DXGI_FORMAT_R32_FLOAT, 0, 20, D3D11_INPUT_PER_VERTEX_DATA, 0 }, }; #pragma data_seg(".backBufferRtvDesc") static D3D11_RENDER_TARGET_VIEW_DESC backBufferRtvDesc = { DXGI_FORMAT_R16G16B16A16_FLOAT,//DXGI_FORMAT_R8G8B8A8_UNORM, D3D11_RTV_DIMENSION_TEXTURE2D, { 0 } }; #pragma data_seg(".depthStencilStateDesc") static D3D11_DEPTH_STENCIL_DESC depthStencilStateDesc = { FALSE, // TRUE D3D11_DEPTH_WRITE_MASK_ALL, D3D11_COMPARISON_LESS, FALSE, 0, 0, {}, {} }; #pragma data_seg(".swapChainViewport") static D3D11_VIEWPORT swapChainViewport = { 0, 0, WIDTH, HEIGHT, 0.0f, 1.0f, }; #pragma data_seg(".depthStencilViewDesc") static D3D11_DEPTH_STENCIL_VIEW_DESC depthStencilViewDesc = { DXGI_FORMAT_D32_FLOAT, D3D11_DSV_DIMENSION_TEXTURE2D, 0, { 0 } }; #pragma data_seg(".alphaBlendDesc") static D3D11_BLEND_DESC alphaBlendDesc = { FALSE, FALSE, { TRUE, D3D11_BLEND_SRC_ALPHA, D3D11_BLEND_INV_SRC_ALPHA, D3D11_BLEND_OP_ADD, D3D11_BLEND_ONE, D3D11_BLEND_ONE, D3D11_BLEND_OP_ADD, D3D11_COLOR_WRITE_ENABLE_ALL, } };