// Copyright Amazon.com, Inc. or its affiliates. All Rights Reserved. // SPDX-License-Identifier: Apache-2.0 #include "stdafx.h" #if MAX_VERSION_MAJOR >= 17 #include "frantic\max3d\viewport\particle_shader.hpp" const char* particle_shader_src = "////////////////////////////////\n" "// Per-Object Data //\n" "////////////////////////////////\n" "\n" "cbuffer cbPerObject {\n" " float4x4 World : WORLD;\n" " float4x4 WorldViewProj : WORLDVIEWPROJ;\n" " float4x4 Projection : PROJECTION;\n" " float4x4 WorldView : WORLDVIEW;\n" " float3 Camera : WORLD_CAMERA_POSITION;\n" "}\n" "\n" "////////////////////////////////\n" "// Data Transfer Structures //\n" "////////////////////////////////\n" "\n" "struct VS_IN {\n" " float3 pos : POSITION;\n" " float4 color : COLOR;\n" "};\n" "\n" "struct VS_OUT {\n" " float4 pos : SV_POSITION;\n" " float4 color : COLOR;\n" " float4 size : PSIZE;\n" "};\n" "\n" "///////////////////////////////////////////\n" "// Large Particle Perspective Shaders //\n" "///////////////////////////////////////////\n" "\n" "//Vertex Shader\n" "VS_OUT vs_large_perspec_main( VS_IN IN ) {\n" " VS_OUT Out;\n" " Out.pos = mul( float4( IN.pos, 1 ), WorldView );\n" " Out.size = distance( float4( Camera, 1), mul( float4( IN.pos, 1), World ) );\n" " Out.color = IN.color;\n" " return Out;\n" "}\n" "\n" "//Geometry Shader\n" "[maxvertexcount(4)]\n" "void gs_large_persp( point VS_OUT input[1], inout TriangleStream triStream ) {\n" " VS_OUT Out;\n" " Out.color = input[0].color;\n" " Out.size = 0.0f;\n" " float4 center = input[0].pos;\n" " float change = input[0].size / 1024.0f;\n" " float xChange = change;\n" " float yChange = change;\n" "\n" " Out.pos = mul( float4( center.x - xChange, center.y - yChange, center.z, center.w ), Projection );\n" " triStream.Append( Out );\n" "\n" " Out.pos = mul( float4( center.x + xChange, center.y - yChange, center.z, center.w ), Projection );\n" " triStream.Append( Out );\n" "\n" " Out.pos = mul( float4( center.x - xChange, center.y + yChange, center.z, center.w ), Projection );\n" " triStream.Append( Out );\n" "\n" " Out.pos = mul( float4( center.x + xChange, center.y + yChange, center.z, center.w ), Projection );\n" " triStream.Append( Out );\n" "\n" " triStream.RestartStrip();\n" "}\n" "\n" "///////////////////////////////////////////\n" "// Large Particle Orthographic Shaders //\n" "///////////////////////////////////////////\n" "\n" "//Vertex Shader\n" "VS_OUT vs_large_ortho_main( VS_IN IN ) {\n" " VS_OUT Out;\n" " Out.pos = mul( float4( IN.pos, 1 ), WorldViewProj );\n" " Out.size = 0;\n" " Out.color = IN.color;\n" " return Out;\n" "}\n" "\n" "\n" "//Geometry Shader\n" "[maxvertexcount(4)]\n" "void gs_large_ortho( point VS_OUT input[1], inout TriangleStream triStream ) {\n" " VS_OUT Out;\n" " Out.color = input[0].color;\n" " Out.size = 0.0f;\n" " float4 center = input[0].pos;\n" " float change = 0.006f;\n" " float xChange = change * 0.5f;\n" " float yChange = change;\n" "\n" " Out.pos = float4( center.x - xChange, center.y - yChange, center.z, center.w );\n" " triStream.Append( Out );\n" "\n" " Out.pos = float4( center.x + xChange, center.y - yChange, center.z, center.w );\n" " triStream.Append( Out );\n" "\n" " Out.pos = float4( center.x - xChange, center.y + yChange, center.z, center.w );\n" " triStream.Append( Out );\n" "\n" " Out.pos = float4( center.x + xChange, center.y + yChange, center.z, center.w );\n" " triStream.Append( Out );\n" "\n" " triStream.RestartStrip();\n" "}\n" "\n" "////////////////////////////////\n" "// Small Particle Shaders //\n" "////////////////////////////////\n" "\n" "//Vertex Shader\n" "VS_OUT vs_small_main( VS_IN IN ) {\n" " VS_OUT Out;\n" " Out.pos = mul( float4( IN.pos, 1 ), WorldViewProj );\n" " Out.size = 4.0f;\n" " Out.color = IN.color;\n" " return Out;\n" "}\n" "\n" "////////////////////////////////\n" "// Shared Shaders //\n" "////////////////////////////////\n" "\n" "//Pixel Shader\n" "float4 ps_main( VS_OUT IN ) : SV_TARGET {\n" " return IN.color;\n" "}\n" "\n" "////////////////////////////////\n" "// Techniques //\n" "////////////////////////////////\n" "\n" "technique11 ParticleLargePerspectiveShader {\n" " pass P0 {\n" " SetVertexShader( CompileShader( vs_5_0, vs_large_perspec_main() ) );\n" " SetGeometryShader( CompileShader( gs_5_0, gs_large_persp() ) );\n" " SetPixelShader( CompileShader( ps_5_0, ps_main() ) );\n" " }\n" "}\n" "\n" "technique11 ParticleLargeOrthographicShader {\n" " pass P0 {\n" " SetVertexShader( CompileShader( vs_5_0, vs_large_ortho_main() ) );\n" " SetGeometryShader( CompileShader( gs_5_0, gs_large_ortho() ) );\n" " SetPixelShader( CompileShader( ps_5_0, ps_main() ) );\n" " }\n" "}\n" "\n" "technique11 ParticleSmallShader {\n" " pass P0 {\n" " SetVertexShader( CompileShader( vs_5_0, vs_small_main() ) );\n" " SetGeometryShader( NULL );\n" " SetPixelShader( CompileShader( ps_5_0, ps_main() ) );\n" " }\n" "}\n"; #endif;