diff --git a/libraries/gpu/src/gpu/Context.h b/libraries/gpu/src/gpu/Context.h index bd5da57504..d7162c50d7 100644 --- a/libraries/gpu/src/gpu/Context.h +++ b/libraries/gpu/src/gpu/Context.h @@ -37,10 +37,11 @@ public: class TransformCamera { public: - Mat4 _projection; Mat4 _view; Mat4 _viewInverse; Mat4 _projectionViewUntranslated; + Mat4 _projection; + Vec4 _viewport; }; template< typename T > diff --git a/libraries/gpu/src/gpu/GLBackend.cpp b/libraries/gpu/src/gpu/GLBackend.cpp index f4f73abb45..3208b314e9 100644 --- a/libraries/gpu/src/gpu/GLBackend.cpp +++ b/libraries/gpu/src/gpu/GLBackend.cpp @@ -486,7 +486,7 @@ void GLBackend::updateTransform() { if (_transform._invalidView || _transform._invalidProj) { Mat4 viewUntranslated = _transform._transformCamera._view; - // viewUntranslated[3] = Vec4(0.0f, 0.0f, 0.0f, 1.0f); + viewUntranslated[3] = Vec4(0.0f, 0.0f, 0.0f, 1.0f); _transform._transformCamera._projectionViewUntranslated = _transform._transformCamera._projection * viewUntranslated; } diff --git a/libraries/gpu/src/gpu/Transform.slh b/libraries/gpu/src/gpu/Transform.slh index d2c1390294..b433f8282d 100644 --- a/libraries/gpu/src/gpu/Transform.slh +++ b/libraries/gpu/src/gpu/Transform.slh @@ -16,22 +16,21 @@ struct TransformObject { }; struct TransformCamera { - mat4 _projection; mat4 _view; mat4 _viewInverse; mat4 _projectionViewUntranslated; + mat4 _projection; + vec4 _viewport; }; -vec4 transform(TransformCamera camera, TransformObject object, vec4 pos) { - /* vec4 res = object._model * pos; - res += pos.w * camera._viewInverse[3]; - return camera._projectionViewUntranslated * res; -*/ - return camera._projectionViewUntranslated * object._model * pos; - // return camera._projection * camera._view * object._model * pos; +vec4 transformModelToClipPos(TransformCamera camera, TransformObject object, vec4 pos) { + 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; } -vec3 transformDir(TransformCamera camera, TransformObject object, vec3 dir) { +vec3 transformModelToEyeDir(TransformCamera camera, TransformObject object, vec3 dir) { vec3 mIr0 = vec3(object._modelInverse[0].x, object._modelInverse[1].x, object._modelInverse[2].x); vec3 mIr1 = vec3(object._modelInverse[0].y, object._modelInverse[1].y, object._modelInverse[2].y); vec3 mIr2 = vec3(object._modelInverse[0].z, object._modelInverse[1].z, object._modelInverse[2].z); diff --git a/libraries/render-utils/src/Model.cpp b/libraries/render-utils/src/Model.cpp index fb26f7f9dc..f64f58cf14 100644 --- a/libraries/render-utils/src/Model.cpp +++ b/libraries/render-utils/src/Model.cpp @@ -700,11 +700,10 @@ bool Model::renderCore(float alpha, RenderMode mode, RenderArgs* args) { _renderBatch.clear(); gpu::Batch& batch = _renderBatch; - if (args) { - glm::mat4 proj; - args->_viewFrustum->evalProjectionMatrix(proj); - batch.setProjectionTransform(proj); - } + // Setup the projection matrix + glm::mat4 proj; + _viewState->getCurrentViewFrustum()->evalProjectionMatrix(proj); + batch.setProjectionTransform(proj); // Capture the view matrix once for the rendering of this model if (_transforms.empty()) { diff --git a/libraries/render-utils/src/model.slv b/libraries/render-utils/src/model.slv index 5f2bfe5f9d..4f416e8f1f 100755 --- a/libraries/render-utils/src/model.slv +++ b/libraries/render-utils/src/model.slv @@ -30,10 +30,9 @@ void main(void) { // use standard pipeline transform TransformCamera cam = getTransformCamera(); TransformObject obj = getTransformObject(); - - gl_Position = transform(cam, obj, gl_Vertex); + gl_Position = transformModelToClipPos(cam, obj, gl_Vertex); // transform and store the normal for interpolation - normal = vec4(normalize(transformDir(cam, obj, gl_Normal)), 0.0); + normal = vec4(normalize(transformModelToEyeDir(cam, obj, gl_Normal)), 0.0); } diff --git a/libraries/render-utils/src/model_lightmap.slv b/libraries/render-utils/src/model_lightmap.slv index 3adca397c2..afe3c73549 100755 --- a/libraries/render-utils/src/model_lightmap.slv +++ b/libraries/render-utils/src/model_lightmap.slv @@ -38,10 +38,9 @@ void main(void) { // use standard pipeline transform TransformCamera cam = getTransformCamera(); TransformObject obj = getTransformObject(); - - gl_Position = transform(cam, obj, gl_Vertex); + gl_Position = transformModelToClipPos(cam, obj, gl_Vertex); // transform and store the normal for interpolation - normal = vec4(normalize(transformDir(cam, obj, gl_Normal)), 0.0); + normal = vec4(normalize(transformModelToEyeDir(cam, obj, gl_Normal)), 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 be86655f75..6e66b28e63 100755 --- a/libraries/render-utils/src/model_lightmap_normal_map.slv +++ b/libraries/render-utils/src/model_lightmap_normal_map.slv @@ -47,10 +47,9 @@ void main(void) { // use standard pipeline transform TransformCamera cam = getTransformCamera(); TransformObject obj = getTransformObject(); - - gl_Position = transform(cam, obj, gl_Vertex); + gl_Position = transformModelToClipPos(cam, obj, gl_Vertex); // transform and store the normal for interpolation - interpolatedNormal = vec4(normalize(transformDir(cam, obj, gl_Normal)), 0.0); - interpolatedTangent = vec4(normalize(transformDir(cam, obj, tangent)), 0.0); + interpolatedNormal = vec4(normalize(transformModelToEyeDir(cam, obj, gl_Normal)), 0.0); + interpolatedTangent = vec4(normalize(transformModelToEyeDir(cam, obj, tangent)), 0.0); } diff --git a/libraries/render-utils/src/model_normal_map.slv b/libraries/render-utils/src/model_normal_map.slv index dbb87473b8..4111458464 100755 --- a/libraries/render-utils/src/model_normal_map.slv +++ b/libraries/render-utils/src/model_normal_map.slv @@ -41,10 +41,9 @@ void main(void) { // use standard pipeline transform TransformCamera cam = getTransformCamera(); TransformObject obj = getTransformObject(); - - gl_Position = transform(cam, obj, gl_Vertex); + gl_Position = transformModelToClipPos(cam, obj, gl_Vertex); // transform and store the normal for interpolation - interpolatedNormal = vec4(normalize(transformDir(cam, obj, gl_Normal)), 0.0); - interpolatedTangent = vec4(normalize(transformDir(cam, obj, tangent)), 0.0); + interpolatedNormal = vec4(normalize(transformModelToEyeDir(cam, obj, gl_Normal)), 0.0); + interpolatedTangent = vec4(normalize(transformModelToEyeDir(cam, obj, tangent)), 0.0); } diff --git a/libraries/render-utils/src/model_shadow.slv b/libraries/render-utils/src/model_shadow.slv index 5d386d4d4c..98f6bf5104 100755 --- a/libraries/render-utils/src/model_shadow.slv +++ b/libraries/render-utils/src/model_shadow.slv @@ -17,5 +17,5 @@ void main(void) { // use standard pipeline transform TransformCamera cam = getTransformCamera(); TransformObject obj = getTransformObject(); - gl_Position = transform(cam, obj, gl_Vertex); + gl_Position = transformModelToClipPos(cam, obj, gl_Vertex); } diff --git a/libraries/render-utils/src/skin_model.slv b/libraries/render-utils/src/skin_model.slv index 08aff5724b..780b72323c 100755 --- a/libraries/render-utils/src/skin_model.slv +++ b/libraries/render-utils/src/skin_model.slv @@ -46,9 +46,8 @@ void main(void) { // use standard pipeline transform TransformCamera cam = getTransformCamera(); TransformObject obj = getTransformObject(); - - gl_Position = transform(cam, obj, position); + gl_Position = transformModelToClipPos(cam, obj, position); // transform and store the normal for interpolation - normal = vec4(normalize(transformDir(cam, obj, normal.xyz)), 0.0); + normal = vec4(normalize(transformModelToEyeDir(cam, obj, 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 404e9c625d..43ec9c6a9d 100755 --- a/libraries/render-utils/src/skin_model_normal_map.slv +++ b/libraries/render-utils/src/skin_model_normal_map.slv @@ -58,9 +58,8 @@ void main(void) { // use standard pipeline transform TransformCamera cam = getTransformCamera(); TransformObject obj = getTransformObject(); - - gl_Position = transform(cam, obj, interpolatedPosition); + gl_Position = transformModelToClipPos(cam, obj, interpolatedPosition); - interpolatedNormal = vec4(normalize(transformDir(cam, obj, interpolatedNormal.xyz)), 0.0); - interpolatedTangent = vec4(normalize(transformDir(cam, obj, interpolatedTangent.xyz)), 0.0); + interpolatedNormal = vec4(normalize(transformModelToEyeDir(cam, obj, interpolatedNormal.xyz)), 0.0); + interpolatedTangent = vec4(normalize(transformModelToEyeDir(cam, obj, 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 ee21f96f45..de7f8f4e9f 100755 --- a/libraries/render-utils/src/skin_model_shadow.slv +++ b/libraries/render-utils/src/skin_model_shadow.slv @@ -33,6 +33,5 @@ void main(void) { // use standard pipeline transform TransformCamera cam = getTransformCamera(); TransformObject obj = getTransformObject(); - - gl_Position = transform(cam, obj, position); + gl_Position = transformModelToClipPos(cam, obj, position); }