From 619a3231968ce5b930ecf7a32c3825d83d24761d Mon Sep 17 00:00:00 2001 From: Sam Gateau Date: Thu, 19 Mar 2015 14:46:50 -0700 Subject: [PATCH] Using Scribe preprocessor @func@ instead of regular glsl function to solve the intel bug with the transform stack --- libraries/gpu/src/gpu/Transform.slh | 70 ++++++++++--------- libraries/render-utils/src/model.slv | 13 ++-- libraries/render-utils/src/model_lightmap.slv | 12 ++-- .../src/model_lightmap_normal_map.slv | 15 ++-- .../render-utils/src/model_normal_map.slv | 15 ++-- libraries/render-utils/src/model_shadow.slv | 5 +- libraries/render-utils/src/skin_model.slv | 11 +-- .../src/skin_model_normal_map.slv | 19 +++-- .../render-utils/src/skin_model_shadow.slv | 5 +- 9 files changed, 90 insertions(+), 75 deletions(-) diff --git a/libraries/gpu/src/gpu/Transform.slh b/libraries/gpu/src/gpu/Transform.slh index 072303a7f9..4988b230cc 100644 --- a/libraries/gpu/src/gpu/Transform.slh +++ b/libraries/gpu/src/gpu/Transform.slh @@ -10,6 +10,7 @@ <@if not GPU_TRANSFORM_STATE_SLH@> <@def GPU_TRANSFORM_STATE_SLH@> +<@func declareStandardTransform()@> struct TransformObject { mat4 _model; mat4 _modelInverse; @@ -23,48 +24,19 @@ struct TransformCamera { vec4 _viewport; }; -vec4 transformModelToClipPos(TransformCamera camera, TransformObject object, vec4 pos) { -<@if GPU_TRANSFORM_PROFILE == GPU_CORE@> - vec4 epos = (object._model * pos) + vec4(-pos.w * camera._viewInverse[3].xyz, 0.0); - return camera._projectionViewUntranslated * epos; - // Equivalent to the following but hoppefully a bit more accurate - //return camera._projection * camera._view * object._model * pos; -<@else@> - return gl_ModelViewProjectionMatrix * pos; -<@endif@> -} - -vec3 transformModelToEyeDir(TransformCamera camera, TransformObject object, vec3 dir) { -<@if GPU_TRANSFORM_PROFILE == GPU_CORE@> - vec3 mr0 = vec3(object._modelInverse[0].x, object._modelInverse[1].x, object._modelInverse[2].x); - vec3 mr1 = vec3(object._modelInverse[0].y, object._modelInverse[1].y, object._modelInverse[2].y); - vec3 mr2 = vec3(object._modelInverse[0].z, object._modelInverse[1].z, object._modelInverse[2].z); - - vec3 mvc0 = vec3(dot(camera._viewInverse[0].xyz, mr0), dot(camera._viewInverse[0].xyz, mr1), dot(camera._viewInverse[0].xyz, mr2)); - vec3 mvc1 = vec3(dot(camera._viewInverse[1].xyz, mr0), dot(camera._viewInverse[1].xyz, mr1), dot(camera._viewInverse[1].xyz, mr2)); - vec3 mvc2 = vec3(dot(camera._viewInverse[2].xyz, mr0), dot(camera._viewInverse[2].xyz, mr1), dot(camera._viewInverse[2].xyz, mr2)); - - vec3 result = vec3(dot(mvc0, dir), dot(mvc1, dir), dot(mvc2, dir)); - - return result; -<@else@> - return gl_NormalMatrix * dir; -<@endif@> -} - <@if GPU_TRANSFORM_PROFILE == GPU_CORE@> uniform transformObjectBuffer { - TransformObject object; + TransformObject _object; }; TransformObject getTransformObject() { - return object; + return _object; } uniform transformCameraBuffer { - TransformCamera camera; + TransformCamera _camera; }; TransformCamera getTransformCamera() { - return camera; + return _camera; } <@else@> @@ -114,6 +86,38 @@ TransformCamera getTransformCamera() { } <@endif@> +<@endfunc@> + +<@func transformModelToClipPos(cameraTransform, objectTransform, modelPos, clipPos)@> +<@if GPU_TRANSFORM_PROFILE == GPU_CORE@> + + { // transformModelToClipPos + vec4 _eyepos = (<$objectTransform$>._model * <$modelPos$>) + vec4(-<$modelPos$>.w * <$cameraTransform$>._viewInverse[3].xyz, 0.0); + <$clipPos$> = <$cameraTransform$>._projectionViewUntranslated * _eyepos; + } +<@else@> + <$clippos$> = gl_ModelViewProjectionMatrix * <$modelPos$>; +<@endif@> +<@endfunc@> + +<@func transformModelToEyeDir(cameraTransform, objectTransform, modelDir, eyeDir)@> +<@if GPU_TRANSFORM_PROFILE == GPU_CORE@> + { // transformModelToEyeDir + vec3 mr0 = vec3(<$objectTransform$>._modelInverse[0].x, <$objectTransform$>._modelInverse[1].x, <$objectTransform$>._modelInverse[2].x); + vec3 mr1 = vec3(<$objectTransform$>._modelInverse[0].y, <$objectTransform$>._modelInverse[1].y, <$objectTransform$>._modelInverse[2].y); + vec3 mr2 = vec3(<$objectTransform$>._modelInverse[0].z, <$objectTransform$>._modelInverse[1].z, <$objectTransform$>._modelInverse[2].z); + + vec3 mvc0 = vec3(dot(<$cameraTransform$>._viewInverse[0].xyz, mr0), dot(<$cameraTransform$>._viewInverse[0].xyz, mr1), dot(<$cameraTransform$>._viewInverse[0].xyz, mr2)); + vec3 mvc1 = vec3(dot(<$cameraTransform$>._viewInverse[1].xyz, mr0), dot(<$cameraTransform$>._viewInverse[1].xyz, mr1), dot(<$cameraTransform$>._viewInverse[1].xyz, mr2)); + vec3 mvc2 = vec3(dot(<$cameraTransform$>._viewInverse[2].xyz, mr0), dot(<$cameraTransform$>._viewInverse[2].xyz, mr1), dot(<$cameraTransform$>._viewInverse[2].xyz, mr2)); + + <$eyeDir$> = vec3(dot(mvc0, <$modelDir$>), dot(mvc1, <$modelDir$>), dot(mvc2, <$modelDir$>)); + } +<@else@> + <$eyeDir$> = gl_NormalMatrix * <$modelDir$>; +<@endif@> +<@endfunc@> <@endif@> diff --git a/libraries/render-utils/src/model.slv b/libraries/render-utils/src/model.slv index 679e826ef3..21c9238273 100755 --- a/libraries/render-utils/src/model.slv +++ b/libraries/render-utils/src/model.slv @@ -12,6 +12,9 @@ // <@include gpu/Transform.slh@> + +<$declareStandardTransform()$> + const int MAX_TEXCOORDS = 2; uniform mat4 texcoordMatrices[MAX_TEXCOORDS]; @@ -28,13 +31,11 @@ void main(void) { // and the texture coordinates gl_TexCoord[0] = texcoordMatrices[0] * vec4(gl_MultiTexCoord0.xy, 0.0, 1.0); - // use standard pipeline transform + // standard transform TransformCamera cam = getTransformCamera(); TransformObject obj = getTransformObject(); + <$transformModelToClipPos(cam, obj, gl_Vertex, gl_Position)$> + <$transformModelToEyeDir(cam, obj, gl_Normal, normal.xyz)$> - gl_Position = transformModelToClipPos(cam, obj, vec4(gl_Vertex.xyz, 1.0)); - - // transform and store the normal for interpolation - normal = vec4(normalize(transformModelToEyeDir(cam, obj, gl_Normal)), 0.0); - + normal = vec4(normalize(normal.xyz), 0.0); } diff --git a/libraries/render-utils/src/model_lightmap.slv b/libraries/render-utils/src/model_lightmap.slv index afe3c73549..f24ba4e53d 100755 --- a/libraries/render-utils/src/model_lightmap.slv +++ b/libraries/render-utils/src/model_lightmap.slv @@ -14,6 +14,8 @@ <@include gpu/Transform.slh@> +<$declareStandardTransform()$> + const int MAX_TEXCOORDS = 2; uniform mat4 texcoordMatrices[MAX_TEXCOORDS]; @@ -35,12 +37,12 @@ void main(void) { // interpolatedTexcoord1 = vec2(texcoordMatrices[1] * vec4(gl_MultiTexCoord0.xy, 0.0, 1.0)).xy; interpolatedTexcoord1 = vec2(texcoordMatrices[1] * vec4(texcoord1.xy, 0.0, 1.0)).xy; - // use standard pipeline transform + // standard transform TransformCamera cam = getTransformCamera(); TransformObject obj = getTransformObject(); - gl_Position = transformModelToClipPos(cam, obj, gl_Vertex); - - // transform and store the normal for interpolation - normal = vec4(normalize(transformModelToEyeDir(cam, obj, gl_Normal)), 0.0); + <$transformModelToClipPos(cam, obj, gl_Vertex, gl_Position)$> + <$transformModelToEyeDir(cam, obj, gl_Normal, normal.xyz)$> + + normal = vec4(normalize(normal.xyz), 0.0); } diff --git a/libraries/render-utils/src/model_lightmap_normal_map.slv b/libraries/render-utils/src/model_lightmap_normal_map.slv index 6e66b28e63..a1413b1530 100755 --- a/libraries/render-utils/src/model_lightmap_normal_map.slv +++ b/libraries/render-utils/src/model_lightmap_normal_map.slv @@ -14,6 +14,8 @@ <@include gpu/Transform.slh@> +<$declareStandardTransform()$> + const int MAX_TEXCOORDS = 2; uniform mat4 texcoordMatrices[MAX_TEXCOORDS]; @@ -44,12 +46,13 @@ void main(void) { gl_TexCoord[0] = texcoordMatrices[0] * vec4(gl_MultiTexCoord0.xy, 0.0, 1.0); interpolatedTexcoord1 = vec2(texcoordMatrices[1] * vec4(texcoord1.xy, 0.0, 1.0)).xy; - // use standard pipeline transform + // standard transform TransformCamera cam = getTransformCamera(); TransformObject obj = getTransformObject(); - gl_Position = transformModelToClipPos(cam, obj, gl_Vertex); - - // transform and store the normal for interpolation - interpolatedNormal = vec4(normalize(transformModelToEyeDir(cam, obj, gl_Normal)), 0.0); - interpolatedTangent = vec4(normalize(transformModelToEyeDir(cam, obj, tangent)), 0.0); + <$transformModelToClipPos(cam, obj, gl_Vertex, gl_Position)$> + <$transformModelToEyeDir(cam, obj, gl_Normal, interpolatedNormal.xyz)$> + <$transformModelToEyeDir(cam, obj, tangent, interpolatedTangent.xyz)$> + + interpolatedNormal = vec4(normalize(interpolatedNormal.xyz), 0.0); + interpolatedTangent = vec4(normalize(interpolatedTangent.xyz), 0.0); } diff --git a/libraries/render-utils/src/model_normal_map.slv b/libraries/render-utils/src/model_normal_map.slv index 4111458464..9983310b52 100755 --- a/libraries/render-utils/src/model_normal_map.slv +++ b/libraries/render-utils/src/model_normal_map.slv @@ -13,6 +13,8 @@ // <@include gpu/Transform.slh@> + +<$declareStandardTransform()$> const int MAX_TEXCOORDS = 2; @@ -38,12 +40,13 @@ void main(void) { // and the texture coordinates gl_TexCoord[0] = texcoordMatrices[0] * vec4(gl_MultiTexCoord0.xy, 0.0, 1.0); - // use standard pipeline transform + // standard transform TransformCamera cam = getTransformCamera(); TransformObject obj = getTransformObject(); - gl_Position = transformModelToClipPos(cam, obj, gl_Vertex); - - // transform and store the normal for interpolation - interpolatedNormal = vec4(normalize(transformModelToEyeDir(cam, obj, gl_Normal)), 0.0); - interpolatedTangent = vec4(normalize(transformModelToEyeDir(cam, obj, tangent)), 0.0); + <$transformModelToClipPos(cam, obj, gl_Vertex, gl_Position)$> + <$transformModelToEyeDir(cam, obj, gl_Normal, interpolatedNormal.xyz)$> + <$transformModelToEyeDir(cam, obj, tangent, interpolatedTangent.xyz)$> + + interpolatedNormal = vec4(normalize(interpolatedNormal.xyz), 0.0); + interpolatedTangent = vec4(normalize(interpolatedTangent.xyz), 0.0); } diff --git a/libraries/render-utils/src/model_shadow.slv b/libraries/render-utils/src/model_shadow.slv index 98f6bf5104..88e597557e 100755 --- a/libraries/render-utils/src/model_shadow.slv +++ b/libraries/render-utils/src/model_shadow.slv @@ -12,10 +12,11 @@ // See the accompanying file LICENSE or http://www.apache.org/licenses/LICENSE-2.0.html // <@include gpu/Transform.slh@> +<$declareStandardTransform()$> void main(void) { - // use standard pipeline transform + // standard transform TransformCamera cam = getTransformCamera(); TransformObject obj = getTransformObject(); - gl_Position = transformModelToClipPos(cam, obj, gl_Vertex); + <$transformModelToClipPos(cam, obj, gl_Vertex, gl_Position)$> } diff --git a/libraries/render-utils/src/skin_model.slv b/libraries/render-utils/src/skin_model.slv index 780b72323c..f65d5a8bdc 100755 --- a/libraries/render-utils/src/skin_model.slv +++ b/libraries/render-utils/src/skin_model.slv @@ -13,6 +13,7 @@ // <@include gpu/Transform.slh@> +<$declareStandardTransform()$> const int MAX_TEXCOORDS = 2; const int MAX_CLUSTERS = 128; @@ -43,11 +44,11 @@ void main(void) { // and the texture coordinates gl_TexCoord[0] = texcoordMatrices[0] * vec4(gl_MultiTexCoord0.xy, 0.0, 1.0); - // use standard pipeline transform + // standard transform TransformCamera cam = getTransformCamera(); TransformObject obj = getTransformObject(); - gl_Position = transformModelToClipPos(cam, obj, position); - - // transform and store the normal for interpolation - normal = vec4(normalize(transformModelToEyeDir(cam, obj, normal.xyz)), 0.0); + <$transformModelToClipPos(cam, obj, position, gl_Position)$> + <$transformModelToEyeDir(cam, obj, normal.xyz, normal.xyz)$> + + normal = vec4(normalize(normal.xyz), 0.0); } diff --git a/libraries/render-utils/src/skin_model_normal_map.slv b/libraries/render-utils/src/skin_model_normal_map.slv index 43ec9c6a9d..6a4170152d 100755 --- a/libraries/render-utils/src/skin_model_normal_map.slv +++ b/libraries/render-utils/src/skin_model_normal_map.slv @@ -13,6 +13,7 @@ // <@include gpu/Transform.slh@> +<$declareStandardTransform()$> const int MAX_TEXCOORDS = 2; const int MAX_CLUSTERS = 128; @@ -44,22 +45,20 @@ void main(void) { interpolatedNormal += clusterMatrix * vec4(gl_Normal, 0.0) * clusterWeight; interpolatedTangent += clusterMatrix * vec4(tangent, 0.0) * clusterWeight; } - // interpolatedNormal = gl_ModelViewMatrix * interpolatedNormal; - // interpolatedTangent = gl_ModelViewMatrix * interpolatedTangent; - + // pass along the diffuse color gl_FrontColor = gl_Color; // and the texture coordinates gl_TexCoord[0] = texcoordMatrices[0] * vec4(gl_MultiTexCoord0.xy, 0.0, 1.0); - gl_Position = gl_ModelViewProjectionMatrix * interpolatedPosition; - - // use standard pipeline transform + // standard transform TransformCamera cam = getTransformCamera(); TransformObject obj = getTransformObject(); - gl_Position = transformModelToClipPos(cam, obj, interpolatedPosition); - - interpolatedNormal = vec4(normalize(transformModelToEyeDir(cam, obj, interpolatedNormal.xyz)), 0.0); - interpolatedTangent = vec4(normalize(transformModelToEyeDir(cam, obj, interpolatedTangent.xyz)), 0.0); + <$transformModelToClipPos(cam, obj, interpolatedPosition, gl_Position)$> + <$transformModelToEyeDir(cam, obj, gl_Normal, interpolatedNormal.xyz)$> + <$transformModelToEyeDir(cam, obj, tangent, interpolatedTangent.xyz)$> + + interpolatedNormal = vec4(normalize(interpolatedNormal.xyz), 0.0); + interpolatedTangent = vec4(normalize(interpolatedTangent.xyz), 0.0); } diff --git a/libraries/render-utils/src/skin_model_shadow.slv b/libraries/render-utils/src/skin_model_shadow.slv index de7f8f4e9f..03b912a981 100755 --- a/libraries/render-utils/src/skin_model_shadow.slv +++ b/libraries/render-utils/src/skin_model_shadow.slv @@ -13,6 +13,7 @@ // <@include gpu/Transform.slh@> +<$declareStandardTransform()$> const int MAX_CLUSTERS = 128; const int INDICES_PER_VERTEX = 4; @@ -30,8 +31,8 @@ void main(void) { position += clusterMatrix * gl_Vertex * clusterWeight; } - // use standard pipeline transform + // standard transform TransformCamera cam = getTransformCamera(); TransformObject obj = getTransformObject(); - gl_Position = transformModelToClipPos(cam, obj, position); + <$transformModelToClipPos(cam, obj, position, gl_Position)$> }