summaryrefslogtreecommitdiff
path: root/include
diff options
context:
space:
mode:
authorJason Maskell <[email protected]>2016-05-16 15:00:36 +0200
committerJason Maskell <[email protected]>2016-05-16 15:00:36 +0200
commit3eb017d032e0c542401ea202f7a62b7c7ddcd498 (patch)
tree6470077bdc344f1493778976917f7217a3159707 /include
parentProject now compiles with Cmake. (diff)
downloadwaveworks_archive-3eb017d032e0c542401ea202f7a62b7c7ddcd498.tar.xz
waveworks_archive-3eb017d032e0c542401ea202f7a62b7c7ddcd498.zip
Added the test_d3d11 app to the solution. Not compiling yet, mostly a paranoia commit.
Diffstat (limited to 'include')
-rw-r--r--include/GFSDK_WaveWorks_Attributes.fxh403
-rw-r--r--include/GFSDK_WaveWorks_Common.fxh79
-rw-r--r--include/GFSDK_WaveWorks_D3D_Util.h66
-rw-r--r--include/GFSDK_WaveWorks_Quadtree.fxh178
4 files changed, 676 insertions, 50 deletions
diff --git a/include/GFSDK_WaveWorks_Attributes.fxh b/include/GFSDK_WaveWorks_Attributes.fxh
new file mode 100644
index 0000000..d887f8c
--- /dev/null
+++ b/include/GFSDK_WaveWorks_Attributes.fxh
@@ -0,0 +1,403 @@
+/*
+ * 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.
+ */
+
+#ifndef _GFSDK_WAVEWORKS_ATTRIBUTES_FX
+#define _GFSDK_WAVEWORKS_ATTRIBUTES_FX
+
+/*
+ *
+ *
+ */
+
+#include "GFSDK_WaveWorks_Common.fxh"
+
+/*
+ *
+ *
+ */
+
+#if defined(GFSDK_WAVEWORKS_SM3) || defined(GFSDK_WAVEWORKS_GL)
+ #define GFSDK_WAVEWORKS_BEGIN_ATTR_VS_CBUFFER(Label)
+ #define GFSDK_WAVEWORKS_END_ATTR_VS_CBUFFER
+ #define GFSDK_WAVEWORKS_BEGIN_ATTR_PS_CBUFFER(Label)
+ #define GFSDK_WAVEWORKS_END_ATTR_PS_CBUFFER
+#endif
+
+
+#if defined( GFSDK_WAVEWORKS_USE_TESSELLATION )
+ #define GFSDK_WAVEWORKS_BEGIN_ATTR_DISPLACEMENT_CBUFFER(Label) GFSDK_WAVEWORKS_BEGIN_ATTR_DS_CBUFFER(Label)
+ #define GFSDK_WAVEWORKS_DECLARE_ATTR_DISPLACEMENT_CONSTANT(Type,Label,Regoff) GFSDK_WAVEWORKS_DECLARE_ATTR_DS_CONSTANT(Type,Label,Regoff)
+ #define GFSDK_WAVEWORKS_END_ATTR_DISPLACEMENT_CBUFFER GFSDK_WAVEWORKS_END_ATTR_DS_CBUFFER
+ #define GFSDK_WAVEWORKS_DECLARE_ATTR_DISPLACEMENT_SAMPLER(SampLabel,TexLabel,Regoff) GFSDK_WAVEWORKS_DECLARE_ATTR_DS_SAMPLER(SampLabel,TexLabel,Regoff)
+ #define GFSDK_WAVEWORKS_DECLARE_ATTR_DISPLACEMENT_SAMPLER_TEXTUREARRAY(SampLabel,TexLabel,Regoff) GFSDK_WAVEWORKS_DECLARE_ATTR_DS_SAMPLER_TEXTUREARRAY(SampLabel,TexLabel,Regoff)
+#else
+ #define GFSDK_WAVEWORKS_BEGIN_ATTR_DISPLACEMENT_CBUFFER(Label) GFSDK_WAVEWORKS_BEGIN_ATTR_VS_CBUFFER(Label)
+ #define GFSDK_WAVEWORKS_DECLARE_ATTR_DISPLACEMENT_CONSTANT(Type,Label,Regoff) GFSDK_WAVEWORKS_DECLARE_ATTR_VS_CONSTANT(Type,Label,Regoff)
+ #define GFSDK_WAVEWORKS_END_ATTR_DISPLACEMENT_CBUFFER GFSDK_WAVEWORKS_END_ATTR_VS_CBUFFER
+ #define GFSDK_WAVEWORKS_DECLARE_ATTR_DISPLACEMENT_SAMPLER(SampLabel,TexLabel,Regoff) GFSDK_WAVEWORKS_DECLARE_ATTR_VS_SAMPLER(SampLabel,TexLabel,Regoff)
+ #define GFSDK_WAVEWORKS_DECLARE_ATTR_DISPLACEMENT_SAMPLER_TEXTUREARRAY(SampLabel,TexLabel,Regoff) GFSDK_WAVEWORKS_DECLARE_ATTR_VS_SAMPLER_TEXTUREARRAY(SampLabel,TexLabel,Regoff)
+#endif
+
+GFSDK_WAVEWORKS_BEGIN_ATTR_DISPLACEMENT_CBUFFER(nvsf_attr_vs_buffer)
+GFSDK_WAVEWORKS_DECLARE_ATTR_DISPLACEMENT_CONSTANT(float3, nvsf_g_WorldEye, 0)
+#if defined( GFSDK_WAVEWORKS_GL )
+ GFSDK_WAVEWORKS_DECLARE_ATTR_DISPLACEMENT_CONSTANT(float, nvsf_g_UseTextureArrays, 1)
+#else
+ GFSDK_WAVEWORKS_DECLARE_ATTR_DISPLACEMENT_CONSTANT(float, nvsf_g_Pad1, 1)
+#endif
+GFSDK_WAVEWORKS_DECLARE_ATTR_DISPLACEMENT_CONSTANT(float4, nvsf_g_UVScaleCascade0123, 2)
+GFSDK_WAVEWORKS_END_ATTR_DISPLACEMENT_CBUFFER
+
+GFSDK_WAVEWORKS_DECLARE_ATTR_DISPLACEMENT_SAMPLER(nvsf_g_samplerDisplacementMap0, nvsf_g_textureDisplacementMap0, 0)
+GFSDK_WAVEWORKS_DECLARE_ATTR_DISPLACEMENT_SAMPLER(nvsf_g_samplerDisplacementMap1, nvsf_g_textureDisplacementMap1, 1)
+GFSDK_WAVEWORKS_DECLARE_ATTR_DISPLACEMENT_SAMPLER(nvsf_g_samplerDisplacementMap2, nvsf_g_textureDisplacementMap2, 2)
+GFSDK_WAVEWORKS_DECLARE_ATTR_DISPLACEMENT_SAMPLER(nvsf_g_samplerDisplacementMap3, nvsf_g_textureDisplacementMap3, 3)
+
+#if defined( GFSDK_WAVEWORKS_GL )
+ GFSDK_WAVEWORKS_DECLARE_ATTR_DISPLACEMENT_SAMPLER_TEXTUREARRAY(nvsf_g_samplerDisplacementMapTextureArray, nvsf_g_textureArrayDisplacementMap, 4)
+#endif
+
+GFSDK_WAVEWORKS_BEGIN_ATTR_PS_CBUFFER(nvsf_attr_ps_buffer)
+GFSDK_WAVEWORKS_DECLARE_ATTR_PS_CONSTANT(float, nvsf_g_TexelLength_x2_PS, 0)
+GFSDK_WAVEWORKS_DECLARE_ATTR_PS_CONSTANT(float, nvsf_g_Cascade1Scale_PS, 1)
+GFSDK_WAVEWORKS_DECLARE_ATTR_PS_CONSTANT(float, nvsf_g_Cascade1TexelScale_PS, 2)
+GFSDK_WAVEWORKS_DECLARE_ATTR_PS_CONSTANT(float, nvsf_g_Cascade1UVOffset_PS, 3)
+GFSDK_WAVEWORKS_DECLARE_ATTR_PS_CONSTANT(float, nvsf_g_Cascade2Scale_PS, 4)
+GFSDK_WAVEWORKS_DECLARE_ATTR_PS_CONSTANT(float, nvsf_g_Cascade2TexelScale_PS, 5)
+GFSDK_WAVEWORKS_DECLARE_ATTR_PS_CONSTANT(float, nvsf_g_Cascade2UVOffset_PS, 6)
+GFSDK_WAVEWORKS_DECLARE_ATTR_PS_CONSTANT(float, nvsf_g_Cascade3Scale_PS, 7)
+GFSDK_WAVEWORKS_DECLARE_ATTR_PS_CONSTANT(float, nvsf_g_Cascade3TexelScale_PS, 8)
+GFSDK_WAVEWORKS_DECLARE_ATTR_PS_CONSTANT(float, nvsf_g_Cascade3UVOffset_PS, 9)
+GFSDK_WAVEWORKS_END_ATTR_PS_CBUFFER
+
+GFSDK_WAVEWORKS_DECLARE_ATTR_PS_SAMPLER(nvsf_g_samplerGradientMap0, nvsf_g_textureGradientMap0, 0)
+GFSDK_WAVEWORKS_DECLARE_ATTR_PS_SAMPLER(nvsf_g_samplerGradientMap1, nvsf_g_textureGradientMap1, 1)
+GFSDK_WAVEWORKS_DECLARE_ATTR_PS_SAMPLER(nvsf_g_samplerGradientMap2, nvsf_g_textureGradientMap2, 2)
+GFSDK_WAVEWORKS_DECLARE_ATTR_PS_SAMPLER(nvsf_g_samplerGradientMap3, nvsf_g_textureGradientMap3, 3)
+
+#if defined( GFSDK_WAVEWORKS_GL )
+ GFSDK_WAVEWORKS_DECLARE_ATTR_PS_SAMPLER_TEXTUREARRAY(nvsf_g_samplerGradientMapTextureArray, nvsf_g_textureArrayGradientMap, 4)
+#endif
+
+struct GFSDK_WAVEWORKS_INTERPOLATED_VERTEX_OUTPUT
+{
+ float4 nvsf_tex_coord_cascade01 SEMANTIC(TEXCOORD0);
+ float4 nvsf_tex_coord_cascade23 SEMANTIC(TEXCOORD1);
+ float4 nvsf_blend_factor_cascade0123 SEMANTIC(TEXCOORD2);
+ float3 nvsf_eye_vec SEMANTIC(TEXCOORD3);
+};
+
+struct GFSDK_WAVEWORKS_VERTEX_OUTPUT
+{
+ centroid GFSDK_WAVEWORKS_INTERPOLATED_VERTEX_OUTPUT interp;
+ float3 pos_world;
+ float3 pos_world_undisplaced;
+ float3 world_displacement;
+};
+
+GFSDK_WAVEWORKS_VERTEX_OUTPUT GFSDK_WaveWorks_GetDisplacedVertex(GFSDK_WAVEWORKS_VERTEX_INPUT In)
+{
+ // Get starting position and distance to camera
+ float3 nvsf_pos_world_undisplaced = GFSDK_WaveWorks_GetUndisplacedVertexWorldPosition(In);
+ float nvsf_distance = length(nvsf_g_WorldEye - nvsf_pos_world_undisplaced);
+
+ // UVs
+ float2 nvsf_uv_world_cascade0 = nvsf_pos_world_undisplaced.xy * nvsf_g_UVScaleCascade0123.x;
+ float2 nvsf_uv_world_cascade1 = nvsf_pos_world_undisplaced.xy * nvsf_g_UVScaleCascade0123.y;
+ float2 nvsf_uv_world_cascade2 = nvsf_pos_world_undisplaced.xy * nvsf_g_UVScaleCascade0123.z;
+ float2 nvsf_uv_world_cascade3 = nvsf_pos_world_undisplaced.xy * nvsf_g_UVScaleCascade0123.w;
+
+ // cascade blend factors
+ float4 nvsf_blendfactors;
+ float4 nvsf_cascade_spatial_size = 1.0/nvsf_g_UVScaleCascade0123.xyzw;
+ nvsf_blendfactors.x = 1.0;
+ nvsf_blendfactors.yzw = saturate(0.25*(nvsf_cascade_spatial_size.yzw*24.0-nvsf_distance)/nvsf_cascade_spatial_size.yzw);
+ nvsf_blendfactors.yzw *= nvsf_blendfactors.yzw;
+
+
+ // Displacement map
+ #if defined(GFSDK_WAVEWORKS_GL)
+ float3 nvsf_displacement;
+ if(nvsf_g_UseTextureArrays > 0)
+ {
+ nvsf_displacement = nvsf_blendfactors.x * SampleTex2Dlod(nvsf_g_textureArrayDisplacementMap, nvsf_g_samplerDisplacementMapTextureArray, vec3(nvsf_uv_world_cascade0, 0.0), 0).xyz;
+ nvsf_displacement += nvsf_blendfactors.y==0? float3(0,0,0) : nvsf_blendfactors.y * SampleTex2Dlod(nvsf_g_textureArrayDisplacementMap, nvsf_g_samplerDisplacementMapTextureArray, vec3(nvsf_uv_world_cascade1, 1.0), 0).xyz;
+ nvsf_displacement += nvsf_blendfactors.z==0? float3(0,0,0) : nvsf_blendfactors.z * SampleTex2Dlod(nvsf_g_textureArrayDisplacementMap, nvsf_g_samplerDisplacementMapTextureArray, vec3(nvsf_uv_world_cascade2, 2.0), 0).xyz;
+ nvsf_displacement += nvsf_blendfactors.w==0? float3(0,0,0) : nvsf_blendfactors.w * SampleTex2Dlod(nvsf_g_textureArrayDisplacementMap, nvsf_g_samplerDisplacementMapTextureArray, vec3(nvsf_uv_world_cascade3, 3.0), 0).xyz;
+ }
+ else
+ {
+ nvsf_displacement = nvsf_blendfactors.x * SampleTex2Dlod(nvsf_g_textureDisplacementMap0, nvsf_g_samplerDisplacementMap0, nvsf_uv_world_cascade0, 0).xyz;
+ nvsf_displacement += nvsf_blendfactors.y==0? float3(0,0,0) : nvsf_blendfactors.y * SampleTex2Dlod(nvsf_g_textureDisplacementMap1, nvsf_g_samplerDisplacementMap1, nvsf_uv_world_cascade1, 0).xyz;
+ nvsf_displacement += nvsf_blendfactors.z==0? float3(0,0,0) : nvsf_blendfactors.z * SampleTex2Dlod(nvsf_g_textureDisplacementMap2, nvsf_g_samplerDisplacementMap2, nvsf_uv_world_cascade2, 0).xyz;
+ nvsf_displacement += nvsf_blendfactors.w==0? float3(0,0,0) : nvsf_blendfactors.w * SampleTex2Dlod(nvsf_g_textureDisplacementMap3, nvsf_g_samplerDisplacementMap3, nvsf_uv_world_cascade3, 0).xyz;
+ }
+ #else
+ float3 nvsf_displacement = nvsf_blendfactors.x * SampleTex2Dlod(nvsf_g_textureDisplacementMap0, nvsf_g_samplerDisplacementMap0, nvsf_uv_world_cascade0, 0).xyz;
+ nvsf_displacement += nvsf_blendfactors.y==0? float3(0,0,0) : nvsf_blendfactors.y * SampleTex2Dlod(nvsf_g_textureDisplacementMap1, nvsf_g_samplerDisplacementMap1, nvsf_uv_world_cascade1, 0).xyz;
+ nvsf_displacement += nvsf_blendfactors.z==0? float3(0,0,0) : nvsf_blendfactors.z * SampleTex2Dlod(nvsf_g_textureDisplacementMap2, nvsf_g_samplerDisplacementMap2, nvsf_uv_world_cascade2, 0).xyz;
+ nvsf_displacement += nvsf_blendfactors.w==0? float3(0,0,0) : nvsf_blendfactors.w * SampleTex2Dlod(nvsf_g_textureDisplacementMap3, nvsf_g_samplerDisplacementMap3, nvsf_uv_world_cascade3, 0).xyz;
+ #endif
+
+ float3 nvsf_pos_world = nvsf_pos_world_undisplaced + nvsf_displacement;
+
+ // Output
+ GFSDK_WAVEWORKS_VERTEX_OUTPUT Output;
+ Output.interp.nvsf_eye_vec = nvsf_g_WorldEye - nvsf_pos_world;
+ Output.interp.nvsf_tex_coord_cascade01.xy = nvsf_uv_world_cascade0;
+ Output.interp.nvsf_tex_coord_cascade01.zw = nvsf_uv_world_cascade1;
+ Output.interp.nvsf_tex_coord_cascade23.xy = nvsf_uv_world_cascade2;
+ Output.interp.nvsf_tex_coord_cascade23.zw = nvsf_uv_world_cascade3;
+ Output.interp.nvsf_blend_factor_cascade0123 = nvsf_blendfactors;
+ Output.pos_world = nvsf_pos_world;
+ Output.pos_world_undisplaced = nvsf_pos_world_undisplaced;
+ Output.world_displacement = nvsf_displacement;
+ return Output;
+}
+
+GFSDK_WAVEWORKS_VERTEX_OUTPUT GFSDK_WaveWorks_GetDisplacedVertexAfterTessellation(float4 In0, float4 In1, float4 In2, float3 BarycentricCoords)
+{
+ // Get starting position
+ float3 nvsf_tessellated_ws_position = In0.xyz * BarycentricCoords.x +
+ In1.xyz * BarycentricCoords.y +
+ In2.xyz * BarycentricCoords.z;
+ float3 nvsf_pos_world_undisplaced = nvsf_tessellated_ws_position;
+
+
+ // blend factors for cascades
+ float4 nvsf_blendfactors;
+ float nvsf_distance = length(nvsf_g_WorldEye - nvsf_pos_world_undisplaced);
+ float4 nvsf_cascade_spatial_size = 1.0/nvsf_g_UVScaleCascade0123.xyzw;
+ nvsf_blendfactors.x = 1.0;
+ nvsf_blendfactors.yzw = saturate(0.25*(nvsf_cascade_spatial_size.yzw*24.0-nvsf_distance)/nvsf_cascade_spatial_size.yzw);
+ nvsf_blendfactors.yzw *= nvsf_blendfactors.yzw;
+
+ // UVs
+ float2 nvsf_uv_world_cascade0 = nvsf_pos_world_undisplaced.xy * nvsf_g_UVScaleCascade0123.x;
+ float2 nvsf_uv_world_cascade1 = nvsf_pos_world_undisplaced.xy * nvsf_g_UVScaleCascade0123.y;
+ float2 nvsf_uv_world_cascade2 = nvsf_pos_world_undisplaced.xy * nvsf_g_UVScaleCascade0123.z;
+ float2 nvsf_uv_world_cascade3 = nvsf_pos_world_undisplaced.xy * nvsf_g_UVScaleCascade0123.w;
+
+ // Displacement map
+ #if defined(GFSDK_WAVEWORKS_GL)
+ float3 nvsf_displacement;
+ if(nvsf_g_UseTextureArrays > 0)
+ {
+ nvsf_displacement = nvsf_blendfactors.x * SampleTex2Dlod(nvsf_g_textureArrayDisplacementMap, nvsf_g_samplerDisplacementMapTextureArray, vec3(nvsf_uv_world_cascade0, 0.0), 0).xyz;
+ nvsf_displacement += nvsf_blendfactors.y==0? float3(0,0,0) : nvsf_blendfactors.y * SampleTex2Dlod(nvsf_g_textureArrayDisplacementMap, nvsf_g_samplerDisplacementMapTextureArray, vec3(nvsf_uv_world_cascade1, 1.0), 0).xyz;
+ nvsf_displacement += nvsf_blendfactors.z==0? float3(0,0,0) : nvsf_blendfactors.z * SampleTex2Dlod(nvsf_g_textureArrayDisplacementMap, nvsf_g_samplerDisplacementMapTextureArray, vec3(nvsf_uv_world_cascade2, 2.0), 0).xyz;
+ nvsf_displacement += nvsf_blendfactors.w==0? float3(0,0,0) : nvsf_blendfactors.w * SampleTex2Dlod(nvsf_g_textureArrayDisplacementMap, nvsf_g_samplerDisplacementMapTextureArray, vec3(nvsf_uv_world_cascade3, 3.0), 0).xyz;
+ }
+ else
+ {
+ nvsf_displacement = nvsf_blendfactors.x * SampleTex2Dlod(nvsf_g_textureDisplacementMap0, nvsf_g_samplerDisplacementMap0, nvsf_uv_world_cascade0, 0).xyz;
+ nvsf_displacement += nvsf_blendfactors.y==0? float3(0,0,0) : nvsf_blendfactors.y * SampleTex2Dlod(nvsf_g_textureDisplacementMap1, nvsf_g_samplerDisplacementMap1, nvsf_uv_world_cascade1, 0).xyz;
+ nvsf_displacement += nvsf_blendfactors.z==0? float3(0,0,0) : nvsf_blendfactors.z * SampleTex2Dlod(nvsf_g_textureDisplacementMap2, nvsf_g_samplerDisplacementMap2, nvsf_uv_world_cascade2, 0).xyz;
+ nvsf_displacement += nvsf_blendfactors.w==0? float3(0,0,0) : nvsf_blendfactors.w * SampleTex2Dlod(nvsf_g_textureDisplacementMap3, nvsf_g_samplerDisplacementMap3, nvsf_uv_world_cascade3, 0).xyz;
+ }
+ #else
+ float3 nvsf_displacement = nvsf_blendfactors.x * SampleTex2Dlod(nvsf_g_textureDisplacementMap0, nvsf_g_samplerDisplacementMap0, nvsf_uv_world_cascade0, 0).xyz;
+ nvsf_displacement += nvsf_blendfactors.y==0? float3(0,0,0) : nvsf_blendfactors.y * SampleTex2Dlod(nvsf_g_textureDisplacementMap1, nvsf_g_samplerDisplacementMap1, nvsf_uv_world_cascade1, 0).xyz;
+ nvsf_displacement += nvsf_blendfactors.z==0? float3(0,0,0) : nvsf_blendfactors.z * SampleTex2Dlod(nvsf_g_textureDisplacementMap2, nvsf_g_samplerDisplacementMap2, nvsf_uv_world_cascade2, 0).xyz;
+ nvsf_displacement += nvsf_blendfactors.w==0? float3(0,0,0) : nvsf_blendfactors.w * SampleTex2Dlod(nvsf_g_textureDisplacementMap3, nvsf_g_samplerDisplacementMap3, nvsf_uv_world_cascade3, 0).xyz;
+ #endif
+
+ float3 nvsf_pos_world = nvsf_pos_world_undisplaced + nvsf_displacement;
+
+ // Output
+ GFSDK_WAVEWORKS_VERTEX_OUTPUT Output;
+ Output.interp.nvsf_eye_vec = nvsf_g_WorldEye - nvsf_pos_world;
+ Output.interp.nvsf_tex_coord_cascade01.xy = nvsf_uv_world_cascade0;
+ Output.interp.nvsf_tex_coord_cascade01.zw = nvsf_uv_world_cascade1;
+ Output.interp.nvsf_tex_coord_cascade23.xy = nvsf_uv_world_cascade2;
+ Output.interp.nvsf_tex_coord_cascade23.zw = nvsf_uv_world_cascade3;
+ Output.interp.nvsf_blend_factor_cascade0123 = nvsf_blendfactors;
+ Output.pos_world = nvsf_pos_world;
+ Output.pos_world_undisplaced = nvsf_pos_world_undisplaced;
+ Output.world_displacement = nvsf_displacement;
+ return Output;
+}
+
+GFSDK_WAVEWORKS_VERTEX_OUTPUT GFSDK_WaveWorks_GetDisplacedVertexAfterTessellationQuad(float4 In0, float4 In1, float4 In2, float4 In3, float2 UV)
+{
+ // Get starting position
+ float3 nvsf_tessellated_ws_position = In2.xyz*UV.x*UV.y +
+ In0.xyz*(1.0-UV.x)*UV.y +
+ In1.xyz*(1.0-UV.x)*(1.0-UV.y) +
+ In3.xyz*UV.x*(1.0-UV.y);
+ float3 nvsf_pos_world_undisplaced = nvsf_tessellated_ws_position;
+
+ // blend factors for cascades
+ float4 nvsf_blendfactors;
+ float nvsf_distance = length(nvsf_g_WorldEye - nvsf_pos_world_undisplaced);
+ float4 nvsf_cascade_spatial_size = 1.0/nvsf_g_UVScaleCascade0123.xyzw;
+ nvsf_blendfactors.x = 1.0;
+ nvsf_blendfactors.yzw = saturate(0.25*(nvsf_cascade_spatial_size.yzw*24.0-nvsf_distance)/nvsf_cascade_spatial_size.yzw);
+ nvsf_blendfactors.yzw *= nvsf_blendfactors.yzw;
+
+ // UVs
+ float2 nvsf_uv_world_cascade0 = nvsf_pos_world_undisplaced.xy * nvsf_g_UVScaleCascade0123.x;
+ float2 nvsf_uv_world_cascade1 = nvsf_pos_world_undisplaced.xy * nvsf_g_UVScaleCascade0123.y;
+ float2 nvsf_uv_world_cascade2 = nvsf_pos_world_undisplaced.xy * nvsf_g_UVScaleCascade0123.z;
+ float2 nvsf_uv_world_cascade3 = nvsf_pos_world_undisplaced.xy * nvsf_g_UVScaleCascade0123.w;
+
+ // Displacement map
+ #if defined(GFSDK_WAVEWORKS_GL)
+ float3 nvsf_displacement;
+ if(nvsf_g_UseTextureArrays > 0)
+ {
+ nvsf_displacement = nvsf_blendfactors.x * SampleTex2Dlod(nvsf_g_textureArrayDisplacementMap, nvsf_g_samplerDisplacementMapTextureArray, vec3(nvsf_uv_world_cascade0, 0.0), 0).xyz;
+ nvsf_displacement += nvsf_blendfactors.y==0? float3(0,0,0) : nvsf_blendfactors.y * SampleTex2Dlod(nvsf_g_textureArrayDisplacementMap, nvsf_g_samplerDisplacementMapTextureArray, vec3(nvsf_uv_world_cascade1, 1.0), 0).xyz;
+ nvsf_displacement += nvsf_blendfactors.z==0? float3(0,0,0) : nvsf_blendfactors.z * SampleTex2Dlod(nvsf_g_textureArrayDisplacementMap, nvsf_g_samplerDisplacementMapTextureArray, vec3(nvsf_uv_world_cascade2, 2.0), 0).xyz;
+ nvsf_displacement += nvsf_blendfactors.w==0? float3(0,0,0) : nvsf_blendfactors.w * SampleTex2Dlod(nvsf_g_textureArrayDisplacementMap, nvsf_g_samplerDisplacementMapTextureArray, vec3(nvsf_uv_world_cascade3, 3.0), 0).xyz;
+ }
+ else
+ {
+ nvsf_displacement = nvsf_blendfactors.x * SampleTex2Dlod(nvsf_g_textureDisplacementMap0, nvsf_g_samplerDisplacementMap0, nvsf_uv_world_cascade0, 0).xyz;
+ nvsf_displacement += nvsf_blendfactors.y==0? float3(0,0,0) : nvsf_blendfactors.y * SampleTex2Dlod(nvsf_g_textureDisplacementMap1, nvsf_g_samplerDisplacementMap1, nvsf_uv_world_cascade1, 0).xyz;
+ nvsf_displacement += nvsf_blendfactors.z==0? float3(0,0,0) : nvsf_blendfactors.z * SampleTex2Dlod(nvsf_g_textureDisplacementMap2, nvsf_g_samplerDisplacementMap2, nvsf_uv_world_cascade2, 0).xyz;
+ nvsf_displacement += nvsf_blendfactors.w==0? float3(0,0,0) : nvsf_blendfactors.w * SampleTex2Dlod(nvsf_g_textureDisplacementMap3, nvsf_g_samplerDisplacementMap3, nvsf_uv_world_cascade3, 0).xyz;
+ }
+ #else
+ float3 nvsf_displacement = nvsf_blendfactors.x * SampleTex2Dlod(nvsf_g_textureDisplacementMap0, nvsf_g_samplerDisplacementMap0, nvsf_uv_world_cascade0, 0).xyz;
+ nvsf_displacement += nvsf_blendfactors.y==0? float3(0,0,0) : nvsf_blendfactors.y * SampleTex2Dlod(nvsf_g_textureDisplacementMap1, nvsf_g_samplerDisplacementMap1, nvsf_uv_world_cascade1, 0).xyz;
+ nvsf_displacement += nvsf_blendfactors.z==0? float3(0,0,0) : nvsf_blendfactors.z * SampleTex2Dlod(nvsf_g_textureDisplacementMap2, nvsf_g_samplerDisplacementMap2, nvsf_uv_world_cascade2, 0).xyz;
+ nvsf_displacement += nvsf_blendfactors.w==0? float3(0,0,0) : nvsf_blendfactors.w * SampleTex2Dlod(nvsf_g_textureDisplacementMap3, nvsf_g_samplerDisplacementMap3, nvsf_uv_world_cascade3, 0).xyz;
+ #endif
+
+ float3 nvsf_pos_world = nvsf_pos_world_undisplaced + nvsf_displacement;
+
+ // Output
+ GFSDK_WAVEWORKS_VERTEX_OUTPUT Output;
+ Output.interp.nvsf_eye_vec = nvsf_g_WorldEye - nvsf_pos_world;
+ Output.interp.nvsf_tex_coord_cascade01.xy = nvsf_uv_world_cascade0;
+ Output.interp.nvsf_tex_coord_cascade01.zw = nvsf_uv_world_cascade1;
+ Output.interp.nvsf_tex_coord_cascade23.xy = nvsf_uv_world_cascade2;
+ Output.interp.nvsf_tex_coord_cascade23.zw = nvsf_uv_world_cascade3;
+ Output.interp.nvsf_blend_factor_cascade0123 = nvsf_blendfactors;
+ Output.pos_world = nvsf_pos_world;
+ Output.pos_world_undisplaced = nvsf_pos_world_undisplaced;
+ Output.world_displacement = nvsf_displacement;
+ return Output;
+}
+
+struct GFSDK_WAVEWORKS_SURFACE_ATTRIBUTES
+{
+ float3 normal;
+ float3 eye_dir;
+ float foam_surface_folding;
+ float foam_turbulent_energy;
+ float foam_wave_hats;
+};
+
+GFSDK_WAVEWORKS_SURFACE_ATTRIBUTES GFSDK_WaveWorks_GetSurfaceAttributes(GFSDK_WAVEWORKS_INTERPOLATED_VERTEX_OUTPUT In)
+{
+ // Calculate eye vector.
+ // Beware: 'nvsf_eye_vec' is a large number, 32bit floating point required.
+ float3 nvsf_eye_dir = normalize(In.nvsf_eye_vec);
+
+ // --------------- Water body color
+
+ float4 nvsf_grad_fold0;
+ float4 nvsf_grad_fold1;
+ float4 nvsf_grad_fold2;
+ float4 nvsf_grad_fold3;
+
+ #if defined(GFSDK_WAVEWORKS_GL)
+ float3 nvsf_displacement;
+ if(nvsf_g_UseTextureArrays > 0)
+ {
+ nvsf_grad_fold0 = SampleTex2D(nvsf_g_textureArrayGradientMap, nvsf_g_samplerGradientMapTextureArray, vec3(In.nvsf_tex_coord_cascade01.xy, 0.0));
+ nvsf_grad_fold1 = SampleTex2D(nvsf_g_textureArrayGradientMap, nvsf_g_samplerGradientMapTextureArray, vec3(In.nvsf_tex_coord_cascade01.zw, 1.0));
+ nvsf_grad_fold2 = SampleTex2D(nvsf_g_textureArrayGradientMap, nvsf_g_samplerGradientMapTextureArray, vec3(In.nvsf_tex_coord_cascade23.xy, 2.0));
+ nvsf_grad_fold3 = SampleTex2D(nvsf_g_textureArrayGradientMap, nvsf_g_samplerGradientMapTextureArray, vec3(In.nvsf_tex_coord_cascade23.zw, 3.0));
+ }
+ else
+ {
+ nvsf_grad_fold0 = SampleTex2D(nvsf_g_textureGradientMap0, nvsf_g_samplerGradientMap0, In.nvsf_tex_coord_cascade01.xy);
+ nvsf_grad_fold1 = SampleTex2D(nvsf_g_textureGradientMap1, nvsf_g_samplerGradientMap1, In.nvsf_tex_coord_cascade01.zw);
+ nvsf_grad_fold2 = SampleTex2D(nvsf_g_textureGradientMap2, nvsf_g_samplerGradientMap2, In.nvsf_tex_coord_cascade23.xy);
+ nvsf_grad_fold3 = SampleTex2D(nvsf_g_textureGradientMap3, nvsf_g_samplerGradientMap3, In.nvsf_tex_coord_cascade23.zw);
+ }
+ #else
+
+ nvsf_grad_fold0 = SampleTex2D(nvsf_g_textureGradientMap0, nvsf_g_samplerGradientMap0, In.nvsf_tex_coord_cascade01.xy);
+ nvsf_grad_fold1 = SampleTex2D(nvsf_g_textureGradientMap1, nvsf_g_samplerGradientMap1, In.nvsf_tex_coord_cascade01.zw);
+ nvsf_grad_fold2 = SampleTex2D(nvsf_g_textureGradientMap2, nvsf_g_samplerGradientMap2, In.nvsf_tex_coord_cascade23.xy);
+ nvsf_grad_fold3 = SampleTex2D(nvsf_g_textureGradientMap3, nvsf_g_samplerGradientMap3, In.nvsf_tex_coord_cascade23.zw);
+ #endif
+
+ float2 nvsf_grad;
+ nvsf_grad.xy = nvsf_grad_fold0.xy*In.nvsf_blend_factor_cascade0123.x +
+ nvsf_grad_fold1.xy*In.nvsf_blend_factor_cascade0123.y*nvsf_g_Cascade1TexelScale_PS +
+ nvsf_grad_fold2.xy*In.nvsf_blend_factor_cascade0123.z*nvsf_g_Cascade2TexelScale_PS +
+ nvsf_grad_fold3.xy*In.nvsf_blend_factor_cascade0123.w*nvsf_g_Cascade3TexelScale_PS;
+
+ float nvsf_c2c_scale = 0.25; // larger cascaded cover larger areas, so foamed texels cover larger area, thus, foam intensity on these needs to be scaled down for uniform foam look
+
+ float nvsf_foam_turbulent_energy =
+ // accumulated foam energy with blendfactors
+ 100.0*nvsf_grad_fold0.w *
+ lerp(nvsf_c2c_scale, nvsf_grad_fold1.w, In.nvsf_blend_factor_cascade0123.y)*
+ lerp(nvsf_c2c_scale, nvsf_grad_fold2.w, In.nvsf_blend_factor_cascade0123.z)*
+ lerp(nvsf_c2c_scale, nvsf_grad_fold3.w, In.nvsf_blend_factor_cascade0123.w);
+
+
+ float nvsf_foam_surface_folding =
+ // folding for foam "clumping" on folded areas
+ max(-100,
+ (1.0-nvsf_grad_fold0.z) +
+ (1.0-nvsf_grad_fold1.z) +
+ (1.0-nvsf_grad_fold2.z) +
+ (1.0-nvsf_grad_fold3.z));
+
+ // Calculate normal here.
+ float3 nvsf_normal = normalize(float3(nvsf_grad, nvsf_g_TexelLength_x2_PS));
+
+ float nvsf_hats_c2c_scale = 0.5; // the larger is the wave, the higher is the chance to start breaking at high folding, so folding for smaller cascade s is decreased
+ float nvsf_foam_wave_hats =
+ 10.0*(-0.55 + // this allows hats to appear on breaking places only. Can be tweaked to represent Beaufort scale better
+ (1.0-nvsf_grad_fold0.z) +
+ nvsf_hats_c2c_scale*(1.0-nvsf_grad_fold1.z) +
+ nvsf_hats_c2c_scale*nvsf_hats_c2c_scale*(1.0-nvsf_grad_fold2.z) +
+ nvsf_hats_c2c_scale*nvsf_hats_c2c_scale*nvsf_hats_c2c_scale*(1.0-nvsf_grad_fold3.z));
+
+
+ // Output
+ GFSDK_WAVEWORKS_SURFACE_ATTRIBUTES Output;
+ Output.normal = nvsf_normal;
+ Output.eye_dir = nvsf_eye_dir;
+ Output.foam_surface_folding = nvsf_foam_surface_folding;
+ Output.foam_turbulent_energy = log(1.0 + nvsf_foam_turbulent_energy);
+ Output.foam_wave_hats = nvsf_foam_wave_hats;
+ return Output;
+}
+
+
+#endif /* _GFSDK_WAVEWORKS_ATTRIBUTES_FX */
diff --git a/include/GFSDK_WaveWorks_Common.fxh b/include/GFSDK_WaveWorks_Common.fxh
new file mode 100644
index 0000000..c100c8b
--- /dev/null
+++ b/include/GFSDK_WaveWorks_Common.fxh
@@ -0,0 +1,79 @@
+/*
+ * 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.
+ */
+
+#ifndef _GFSDK_WAVEWORKS_COMMON_FX
+#define _GFSDK_WAVEWORKS_COMMON_FX
+/*
+ *
+ *
+ */
+#if defined(GFSDK_WAVEWORKS_SM4) || defined(GFSDK_WAVEWORKS_SM5)
+ #define SampleTex2D(nvsf_texture,nvsf_sampler,nvsf_coords) nvsf_texture.Sample(nvsf_sampler,nvsf_coords)
+ #define SampleTex2Dlod(nvsf_texture,nvsf_sampler,nvsf_coords,nvsf_lod) nvsf_texture.SampleLevel(nvsf_sampler,nvsf_coords,nvsf_lod)
+ #define BEGIN_CBUFFER(name,slot) cbuffer name : register(b##slot) {
+ #define END_CBUFFER };
+ #define SEMANTIC(x) : x
+#elif defined(GFSDK_WAVEWORKS_SM3)
+ #define SampleTex2D(nvsf_texture,nvsf_sampler,nvsf_coords) tex2D(nvsf_sampler,nvsf_coords)
+ #define SampleTex2Dlod(nvsf_texture,nvsf_sampler,nvsf_coords,nvsf_lod) tex2Dlod(nvsf_sampler,float4(nvsf_coords,0,nvsf_lod))
+ #define BEGIN_CBUFFER(name,slot)
+ #define END_CBUFFER
+ #define SV_Target COLOR
+ #define SV_Position POSITION
+ #define SEMANTIC(x) : x
+#elif defined(GFSDK_WAVEWORKS_GNM)
+ #define SampleTex2D(nvsf_texture,nvsf_sampler,nvsf_coords) nvsf_texture.Sample(nvsf_sampler,nvsf_coords)
+ #define SampleTex2Dlod(nvsf_texture,nvsf_sampler,nvsf_coords,nvsf_lod) nvsf_texture.SampleLOD(nvsf_sampler,nvsf_coords,nvsf_lod)
+ #define BEGIN_CBUFFER(name,slot) ConstantBuffer name : register(b##slot) {
+ #define END_CBUFFER };
+ #define SV_Target S_TARGET_OUTPUT
+ #define SV_Position S_POSITION
+ #define SEMANTIC(x) : x
+#elif defined(GFSDK_WAVEWORKS_GL)
+ #define SampleTex2D(nvsf_texture,nvsf_sampler,nvsf_coords) texture(nvsf_sampler,nvsf_coords)
+ #define SampleTex2Dlod(nvsf_texture,nvsf_sampler,nvsf_coords,nvsf_lod) textureLod(nvsf_sampler,nvsf_coords,nvsf_lod)
+ #define BEGIN_CBUFFER(name,slot)
+ #define END_CBUFFER
+ #define SEMANTIC(x)
+ #define float2 vec2
+ #define float3 vec3
+ #define float4 vec4
+ #define float4x3 mat3x4
+ //vec3 mul(vec4 v, mat3x4 m) { return v * m; }
+ #define mul(v,m) ((v)*(m))
+ #define lerp mix
+ #define saturate(x) clamp(x,0.0,1.0)
+#else
+ #error Shader model not defined (expected GFSDK_WAVEWORKS_SM3, GFSDK_WAVEWORKS_SM4, GFSDK_WAVEWORKS_SM5, GFSDK_WAVEWORKS_GNM or GFSDK_WAVEWORKS_GL)
+#endif
+/*
+ *
+ *
+ */
+#endif /* _GFSDK_WAVEWORKS_COMMON_FX */
diff --git a/include/GFSDK_WaveWorks_D3D_Util.h b/include/GFSDK_WaveWorks_D3D_Util.h
index 2d89bae..622d639 100644
--- a/include/GFSDK_WaveWorks_D3D_Util.h
+++ b/include/GFSDK_WaveWorks_D3D_Util.h
@@ -31,28 +31,30 @@
#include <GFSDK_WaveWorks_Types.h>
+using namespace DirectX;
+
// Convenience functions for converting between DX and NV types when using the WaveWorks API
// This header should be #included *AFTER* d3d and d3dx headers
////////////////////////////////////////////////////////////////////////////////
// Conversion helpers
////////////////////////////////////////////////////////////////////////////////
-__GFSDK_INLINE__ D3DXVECTOR2 NvToDX(const gfsdk_float2& rhs) {
- D3DXVECTOR2 result;
+__GFSDK_INLINE__ XMFLOAT2 NvToDX(const gfsdk_float2& rhs) {
+ XMFLOAT2 result;
result.x = rhs.x;
result.y = rhs.y;
return result;
}
-__GFSDK_INLINE__ gfsdk_float2 NvFromDX(const D3DXVECTOR2& rhs) {
+__GFSDK_INLINE__ gfsdk_float2 NvFromDX(const XMFLOAT2& rhs) {
gfsdk_float2 result;
result.x = rhs.x;
result.y = rhs.y;
return result;
}
-__GFSDK_INLINE__ D3DXVECTOR4 NvToDX(const gfsdk_float4& rhs) {
- D3DXVECTOR4 result;
+__GFSDK_INLINE__ XMFLOAT4 NvToDX(const gfsdk_float4& rhs) {
+ XMFLOAT4 result;
result.x = rhs.x;
result.y = rhs.y;
result.z = rhs.z;
@@ -60,7 +62,7 @@ __GFSDK_INLINE__ D3DXVECTOR4 NvToDX(const gfsdk_float4& rhs) {
return result;
}
-__GFSDK_INLINE__ gfsdk_float4 NvFromDX(const D3DXVECTOR4& rhs) {
+__GFSDK_INLINE__ gfsdk_float4 NvFromDX(const XMFLOAT4& rhs) {
gfsdk_float4 result;
result.x = rhs.x;
result.y = rhs.y;
@@ -69,56 +71,20 @@ __GFSDK_INLINE__ gfsdk_float4 NvFromDX(const D3DXVECTOR4& rhs) {
return result;
}
-__GFSDK_INLINE__ D3DXMATRIX NvToDX(const gfsdk_float4x4& rhs) {
-
- D3DXMATRIX result;
-
- result._11 = rhs._11;
- result._12 = rhs._12;
- result._13 = rhs._13;
- result._14 = rhs._14;
-
- result._21 = rhs._21;
- result._22 = rhs._22;
- result._23 = rhs._23;
- result._24 = rhs._24;
+__GFSDK_INLINE__ XMMATRIX NvToDX(const gfsdk_float4x4& rhs) {
- result._31 = rhs._31;
- result._32 = rhs._32;
- result._33 = rhs._33;
- result._34 = rhs._34;
-
- result._41 = rhs._41;
- result._42 = rhs._42;
- result._43 = rhs._43;
- result._44 = rhs._44;
-
- return result;
+ return XMMATRIX(rhs._11, rhs._12, rhs._13, rhs._14,
+ rhs._21, rhs._22, rhs._23, rhs._24,
+ rhs._31, rhs._32, rhs._33, rhs._34,
+ rhs._41, rhs._42, rhs._43, rhs._44);
}
-__GFSDK_INLINE__ gfsdk_float4x4 NvFromDX(const D3DXMATRIX& rhs) {
+__GFSDK_INLINE__ gfsdk_float4x4 NvFromDX(const XMMATRIX& rhs) {
gfsdk_float4x4 result;
- result._11 = rhs._11;
- result._12 = rhs._12;
- result._13 = rhs._13;
- result._14 = rhs._14;
-
- result._21 = rhs._21;
- result._22 = rhs._22;
- result._23 = rhs._23;
- result._24 = rhs._24;
-
- result._31 = rhs._31;
- result._32 = rhs._32;
- result._33 = rhs._33;
- result._34 = rhs._34;
-
- result._41 = rhs._41;
- result._42 = rhs._42;
- result._43 = rhs._43;
- result._44 = rhs._44;
+ //NOTE: Not happy with using a reinterpret_cast here.
+ XMStoreFloat4x4(reinterpret_cast<XMFLOAT4X4*>(&result), rhs);
return result;
}
diff --git a/include/GFSDK_WaveWorks_Quadtree.fxh b/include/GFSDK_WaveWorks_Quadtree.fxh
new file mode 100644
index 0000000..b06e437
--- /dev/null
+++ b/include/GFSDK_WaveWorks_Quadtree.fxh
@@ -0,0 +1,178 @@
+/*
+ * 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 "GFSDK_WaveWorks_Common.fxh"
+
+/*
+ *
+ *
+ */
+
+#if defined(GFSDK_WAVEWORKS_SM3) || defined(GFSDK_WAVEWORKS_GL)
+ #define GFSDK_WAVEWORKS_BEGIN_GEOM_VS_CBUFFER(Label)
+ #define GFSDK_WAVEWORKS_END_GEOM_VS_CBUFFER
+#endif
+
+#if defined( GFSDK_WAVEWORKS_USE_TESSELLATION )
+ GFSDK_WAVEWORKS_BEGIN_GEOM_HS_CBUFFER(nvsf_eyepos_buffer)
+ GFSDK_WAVEWORKS_DECLARE_GEOM_HS_CONSTANT(float4, nvsf_g_hsWorldEye, 0)
+ GFSDK_WAVEWORKS_DECLARE_GEOM_HS_CONSTANT(float4, nvsf_g_tessellationParams, 1)
+ GFSDK_WAVEWORKS_END_GEOM_HS_CBUFFER
+#endif
+
+GFSDK_WAVEWORKS_BEGIN_GEOM_VS_CBUFFER(nvsf_geom_buffer)
+GFSDK_WAVEWORKS_DECLARE_GEOM_VS_CONSTANT(float4x3, nvsf_g_matLocalWorld, 0)
+GFSDK_WAVEWORKS_DECLARE_GEOM_VS_CONSTANT(float4, nvsf_g_vsEyePos, 3)
+GFSDK_WAVEWORKS_DECLARE_GEOM_VS_CONSTANT(float4, nvsf_g_MorphParam, 4)
+GFSDK_WAVEWORKS_END_GEOM_VS_CBUFFER
+
+
+struct GFSDK_WAVEWORKS_VERTEX_INPUT
+{
+ float4 nvsf_vPos SEMANTIC(POSITION);
+};
+
+#if !defined(GFSDK_WAVEWORKS_USE_TESSELLATION)
+float3 GFSDK_WaveWorks_GetUndisplacedVertexWorldPosition(GFSDK_WAVEWORKS_VERTEX_INPUT In)
+{
+ float2 nvsf_vpos = In.nvsf_vPos.xy;
+
+ // Use multiple levels of geo-morphing to smooth away LOD boundaries
+ float nvsf_geomorph_scale = 0.25f;
+
+ float2 nvsf_geomorph_offset = float2(nvsf_g_MorphParam.w,nvsf_g_MorphParam.w);
+ float2 nvsf_vpos_src = nvsf_vpos;
+ float2 nvsf_vpos_target = nvsf_vpos_src;
+ float nvsf_geomorph_amount = 0.f;
+
+ for(int nvsf_geomorph_level = 0; nvsf_geomorph_level != 4; ++nvsf_geomorph_level) {
+
+ float2 nvsf_intpart;
+ float2 nvsf_rempart = modf(nvsf_geomorph_scale*nvsf_vpos_src.xy,nvsf_intpart);
+
+ float2 nvsf_mirror = float2(1.0f, 1.0f);
+
+ if(nvsf_rempart.x > 0.5f)
+ {
+ nvsf_rempart.x = 1.0f - nvsf_rempart.x;
+ nvsf_mirror.x = -nvsf_mirror.x;
+ }
+ if(nvsf_rempart.y > 0.5f)
+ {
+ nvsf_rempart.y = 1.0f - nvsf_rempart.y;
+ nvsf_mirror.y = -nvsf_mirror.y;
+ }
+
+
+ if(0.25f == nvsf_rempart.x && 0.25f == nvsf_rempart.y) nvsf_vpos_target.xy = nvsf_vpos_src.xy - nvsf_geomorph_offset*nvsf_mirror;
+ else if(0.25f == nvsf_rempart.x) nvsf_vpos_target.x = nvsf_vpos_src.x + nvsf_geomorph_offset.x*nvsf_mirror.x;
+ else if(0.25f == nvsf_rempart.y) nvsf_vpos_target.y = nvsf_vpos_src.y + nvsf_geomorph_offset.y*nvsf_mirror.y;
+
+ float3 nvsf_eyevec = mul(float4(nvsf_vpos_target,0.f,1.f), nvsf_g_matLocalWorld) - nvsf_g_vsEyePos.xyz;
+ float nvsf_d = length(nvsf_eyevec);
+ float nvsf_geomorph_target_level = log2(nvsf_d * nvsf_g_MorphParam.x) + 1.f;
+ nvsf_geomorph_amount = saturate(2.0*(nvsf_geomorph_target_level - float(nvsf_geomorph_level)));
+ if(nvsf_geomorph_amount < 1.f)
+ {
+ break;
+ }
+ else
+ {
+ nvsf_vpos_src = nvsf_vpos_target;
+ nvsf_geomorph_scale *= 0.5f;
+ nvsf_geomorph_offset *= -2.f;
+ }
+ }
+
+ nvsf_vpos.xy = lerp(nvsf_vpos_src, nvsf_vpos_target, nvsf_geomorph_amount);
+ return mul(float4(nvsf_vpos,In.nvsf_vPos.zw), nvsf_g_matLocalWorld);
+}
+#endif
+
+
+#if defined(GFSDK_WAVEWORKS_USE_TESSELLATION)
+float3 GFSDK_WaveWorks_GetUndisplacedVertexWorldPosition(GFSDK_WAVEWORKS_VERTEX_INPUT In)
+{
+ float2 nvsf_vpos = In.nvsf_vPos.xy;
+ // Use multiple levels of geo-morphing to smooth away LOD boundaries
+ float nvsf_geomorph_scale = 0.5f;
+ float nvsf_geomorph_offset = abs(nvsf_g_MorphParam.w);
+ float2 nvsf_vpos_src = nvsf_vpos;
+ float2 nvsf_vpos_target = nvsf_vpos_src;
+ float nvsf_geomorph_amount = 0.f;
+
+ //nvsf_vpos_target.x += 0.25*nvsf_geomorph_offset;
+ //nvsf_vpos_src.x += 0.25*nvsf_geomorph_offset;
+
+ for(int nvsf_geomorph_level = 0; nvsf_geomorph_level != 4; ++nvsf_geomorph_level) {
+
+ float2 nvsf_intpart;
+ float2 nvsf_rempart = modf(nvsf_geomorph_scale*nvsf_vpos_src.xy,nvsf_intpart);
+ if(0.5f == nvsf_rempart.x)
+ {
+ nvsf_vpos_target.x = nvsf_vpos_src.x + nvsf_geomorph_offset;
+ }
+
+ if(0.5f == nvsf_rempart.y)
+ {
+ nvsf_vpos_target.y = nvsf_vpos_src.y + nvsf_geomorph_offset;
+ }
+
+ float3 nvsf_eyevec = mul(float4(nvsf_vpos_target,0.f,1.f), nvsf_g_matLocalWorld) - nvsf_g_vsEyePos.xyz;
+ float nvsf_d = length(nvsf_eyevec);
+ float nvsf_geomorph_target_level = log2(nvsf_d * nvsf_g_MorphParam.x) + 1.f;
+ nvsf_geomorph_amount = saturate(3.0*(nvsf_geomorph_target_level - float(nvsf_geomorph_level)));
+ if(nvsf_geomorph_amount < 1.f) {
+ break;
+ } else {
+ nvsf_vpos_src = nvsf_vpos_target;
+ nvsf_geomorph_scale *= 0.5f;
+ nvsf_geomorph_offset *= 2.f;
+ }
+ }
+ nvsf_vpos.xy = lerp(nvsf_vpos_src, nvsf_vpos_target, nvsf_geomorph_amount);
+ return mul(float4(nvsf_vpos,In.nvsf_vPos.zw), nvsf_g_matLocalWorld);
+}
+
+float GFSDK_WaveWorks_GetEdgeTessellationFactor(float4 vertex1, float4 vertex2)
+{
+ float3 nvsf_edge_center = 0.5*(vertex1.xyz + vertex2.xyz);
+ float nvsf_edge_length = length (vertex1.xyz - vertex2.xyz);
+ float nvsf_edge_distance = length(nvsf_g_hsWorldEye.xyz - nvsf_edge_center.xyz);
+ return nvsf_g_tessellationParams.x * nvsf_edge_length / nvsf_edge_distance;
+}
+
+float GFSDK_WaveWorks_GetVertexTargetTessellatedEdgeLength(float3 vertex)
+{
+ float nvsf_vertex_distance = length(nvsf_g_hsWorldEye.xyz - vertex.xyz);
+ return nvsf_vertex_distance / nvsf_g_tessellationParams.x;
+}
+
+#endif
+