From e2e61c64b11dc8ec5b30c6f8a730dfdb51faf648 Mon Sep 17 00:00:00 2001 From: Sam Gateau Date: Fri, 13 Feb 2015 01:30:04 -0800 Subject: [PATCH 01/21] Support include path to shaders from the hifi libraries to cmake --- cmake/macros/AutoScribeShader.cmake | 22 ++++++- libraries/gpu/CMakeLists.txt | 2 + .../src => gpu/src/gpu}/Config.slh | 4 +- libraries/gpu/src/gpu/Transform.slh | 60 +++++++++++++++++++ libraries/model/CMakeLists.txt | 2 + .../src => model/src/model}/Light.slh | 4 +- .../src => model/src/model}/Material.slh | 4 +- libraries/render-utils/CMakeLists.txt | 2 +- .../render-utils/src/DeferredGlobalLight.slh | 2 +- libraries/render-utils/src/deferred_light.slv | 2 +- .../src/deferred_light_limited.slv | 2 +- .../src/directional_ambient_light.slf | 2 +- ...onal_ambient_light_cascaded_shadow_map.slf | 2 +- .../directional_ambient_light_shadow_map.slf | 2 +- .../render-utils/src/directional_light.slf | 2 +- .../directional_light_cascaded_shadow_map.slf | 2 +- .../src/directional_light_shadow_map.slf | 2 +- libraries/render-utils/src/model.slf | 4 +- libraries/render-utils/src/model.slv | 3 +- libraries/render-utils/src/model_lightmap.slf | 4 +- libraries/render-utils/src/model_lightmap.slv | 2 +- .../src/model_lightmap_normal_map.slf | 4 +- .../src/model_lightmap_normal_map.slv | 2 +- .../model_lightmap_normal_specular_map.slf | 4 +- .../src/model_lightmap_specular_map.slf | 4 +- .../render-utils/src/model_normal_map.slf | 4 +- .../render-utils/src/model_normal_map.slv | 2 +- .../src/model_normal_specular_map.slf | 4 +- libraries/render-utils/src/model_shadow.slf | 2 +- libraries/render-utils/src/model_shadow.slv | 2 +- .../render-utils/src/model_specular_map.slf | 4 +- .../render-utils/src/model_translucent.slf | 4 +- libraries/render-utils/src/point_light.slf | 4 +- libraries/render-utils/src/sdf_text.slf | 2 +- libraries/render-utils/src/sdf_text.slv | 2 +- libraries/render-utils/src/simple.slf | 2 +- libraries/render-utils/src/simple.slv | 2 +- libraries/render-utils/src/skin_model.slv | 2 +- .../src/skin_model_normal_map.slv | 2 +- .../render-utils/src/skin_model_shadow.slv | 2 +- libraries/render-utils/src/spot_light.slf | 4 +- 41 files changed, 137 insertions(+), 52 deletions(-) rename libraries/{render-utils/src => gpu/src/gpu}/Config.slh (90%) mode change 100755 => 100644 create mode 100644 libraries/gpu/src/gpu/Transform.slh rename libraries/{render-utils/src => model/src/model}/Light.slh (93%) mode change 100755 => 100644 rename libraries/{render-utils/src => model/src/model}/Material.slh (91%) mode change 100755 => 100644 diff --git a/cmake/macros/AutoScribeShader.cmake b/cmake/macros/AutoScribeShader.cmake index 8b221c8c59..51b6b205e8 100755 --- a/cmake/macros/AutoScribeShader.cmake +++ b/cmake/macros/AutoScribeShader.cmake @@ -15,12 +15,21 @@ function(AUTOSCRIBE_SHADER SHADER_FILE) list(APPEND SHADER_INCLUDE_FILES ${includeFile}) endforeach() - #Extract the unique include shader paths foreach(SHADER_INCLUDE ${SHADER_INCLUDE_FILES}) get_filename_component(INCLUDE_DIR ${SHADER_INCLUDE} PATH) list(APPEND SHADER_INCLUDES_PATHS ${INCLUDE_DIR}) endforeach() + + + #Extract the unique include shader paths + set(INCLUDES ${HIFI_LIBRARIES_SHADER_INCLUDE_FILES}) + #message(Hifi for includes ${INCLUDES}) + foreach(EXTRA_SHADER_INCLUDE ${INCLUDES}) + list(APPEND SHADER_INCLUDES_PATHS ${EXTRA_SHADER_INCLUDE}) + endforeach() + list(REMOVE_DUPLICATES SHADER_INCLUDES_PATHS) + #message(ready for includes ${SHADER_INCLUDES_PATHS}) # make the scribe include arguments set(SCRIBE_INCLUDES) @@ -64,6 +73,17 @@ endfunction() macro(AUTOSCRIBE_SHADER_LIB) + + file(RELATIVE_PATH RELATIVE_LIBRARY_DIR_PATH ${CMAKE_CURRENT_SOURCE_DIR} "${HIFI_LIBRARY_DIR}") + foreach(HIFI_LIBRARY ${ARGN}) + #if (NOT TARGET ${HIFI_LIBRARY}) + # file(GLOB_RECURSE HIFI_LIBRARIES_SHADER_INCLUDE_FILES ${RELATIVE_LIBRARY_DIR_PATH}/${HIFI_LIBRARY}/src/) + #endif () + + #file(GLOB_RECURSE HIFI_LIBRARIES_SHADER_INCLUDE_FILES ${HIFI_LIBRARY_DIR}/${HIFI_LIBRARY}/src/*.slh) + list(APPEND HIFI_LIBRARIES_SHADER_INCLUDE_FILES ${HIFI_LIBRARY_DIR}/${HIFI_LIBRARY}/src) + endforeach() + #message(${HIFI_LIBRARIES_SHADER_INCLUDE_FILES}) file(GLOB_RECURSE SHADER_INCLUDE_FILES src/*.slh) file(GLOB_RECURSE SHADER_SOURCE_FILES src/*.slv src/*.slf) diff --git a/libraries/gpu/CMakeLists.txt b/libraries/gpu/CMakeLists.txt index b6bbba1c0f..9965657073 100644 --- a/libraries/gpu/CMakeLists.txt +++ b/libraries/gpu/CMakeLists.txt @@ -1,5 +1,7 @@ set(TARGET_NAME gpu) +AUTOSCRIBE_SHADER_LIB(gpu) + # use setup_hifi_library macro to setup our project and link appropriate Qt modules setup_hifi_library() diff --git a/libraries/render-utils/src/Config.slh b/libraries/gpu/src/gpu/Config.slh old mode 100755 new mode 100644 similarity index 90% rename from libraries/render-utils/src/Config.slh rename to libraries/gpu/src/gpu/Config.slh index b431b671a6..b17bd7b2b8 --- a/libraries/render-utils/src/Config.slh +++ b/libraries/gpu/src/gpu/Config.slh @@ -8,8 +8,8 @@ // Distributed under the Apache License, Version 2.0. // See the accompanying file LICENSE or http://www.apache.org/licenses/LICENSE-2.0.html !> -<@if not CONFIG_SLH@> -<@def CONFIG_SLH@> +<@if not GPU_CONFIG_SLH@> +<@def GPU_CONFIG_SLH@> <@if GLPROFILE == PC_GL @> <@def VERSION_HEADER #version 330 compatibility@> diff --git a/libraries/gpu/src/gpu/Transform.slh b/libraries/gpu/src/gpu/Transform.slh new file mode 100644 index 0000000000..56bea01e02 --- /dev/null +++ b/libraries/gpu/src/gpu/Transform.slh @@ -0,0 +1,60 @@ + +<@if not GPU_TRANSFORM_STATE_SLH@> +<@def GPU_TRANSFORM_STATE_SLH@> + +struct TransformObject { + mat4 _model; + mat4 _modelInverseTranspose; +}; + +struct TransformCamera { + mat4 _view; + mat4 _viewInverseTranspose; + mat4 _proj; + mat4 _projInverseTranspose; + mat4 _viewProj; + mat4 _viewProjInverseTranspose; +}; + +vec4 transform(TransformCamera camera, TransformObject object, vec4 pos) { + return camera._proj * (camera._view * (object._model * pos))); +} + + + +<@if GLPROFILE == PC_GL@> +uniform transformStateBuffer { + TransformState xform; +}; +TransformState getTransformState() { + return xform; +} +<@elif GLPROFILE == MAC_GL@> +uniform vec4 transformStateBuffer[2]; +TransformState getTransformState() { + TransformState xform; + xform._diffuse = transformStateBuffer[0]; + xform._specular = transformStateBuffer[1]; + return xform; +} +<@else@> +uniform vec4 transformStateBuffer[2]; +TransformState getMaterial() { + TransformState xform; + xform._diffuse = transformStateBuffer[0]; + xform._specular = transformStateBuffer[1]; + return xform; +} +<@endif@> + + + +<@endif@> diff --git a/libraries/model/CMakeLists.txt b/libraries/model/CMakeLists.txt index 309f6c3e6d..af3b270287 100755 --- a/libraries/model/CMakeLists.txt +++ b/libraries/model/CMakeLists.txt @@ -1,4 +1,6 @@ set(TARGET_NAME model) + +AUTOSCRIBE_SHADER_LIB(gpu) # use setup_hifi_library macro to setup our project and link appropriate Qt modules setup_hifi_library() diff --git a/libraries/render-utils/src/Light.slh b/libraries/model/src/model/Light.slh old mode 100755 new mode 100644 similarity index 93% rename from libraries/render-utils/src/Light.slh rename to libraries/model/src/model/Light.slh index abb9fb6c2a..fc17e94050 --- a/libraries/render-utils/src/Light.slh +++ b/libraries/model/src/model/Light.slh @@ -8,8 +8,8 @@ // Distributed under the Apache License, Version 2.0. // See the accompanying file LICENSE or http://www.apache.org/licenses/LICENSE-2.0.html !> -<@if not LIGHT_SLH@> -<@def LIGHT_SLH@> +<@if not MODEL_LIGHT_SLH@> +<@def MODEL_LIGHT_SLH@> struct Light { vec4 _position; diff --git a/libraries/render-utils/src/Material.slh b/libraries/model/src/model/Material.slh old mode 100755 new mode 100644 similarity index 91% rename from libraries/render-utils/src/Material.slh rename to libraries/model/src/model/Material.slh index 86c6049ec6..403a4161e8 --- a/libraries/render-utils/src/Material.slh +++ b/libraries/model/src/model/Material.slh @@ -8,8 +8,8 @@ // Distributed under the Apache License, Version 2.0. // See the accompanying file LICENSE or http://www.apache.org/licenses/LICENSE-2.0.html !> -<@if not MATERIAL_SLH@> -<@def MATERIAL_SLH@> +<@if not MODEL_MATERIAL_SLH@> +<@def MODEL_MATERIAL_SLH@> struct Material { vec4 _diffuse; diff --git a/libraries/render-utils/CMakeLists.txt b/libraries/render-utils/CMakeLists.txt index ed2dcce858..188073819e 100644 --- a/libraries/render-utils/CMakeLists.txt +++ b/libraries/render-utils/CMakeLists.txt @@ -1,6 +1,6 @@ set(TARGET_NAME render-utils) -AUTOSCRIBE_SHADER_LIB() +AUTOSCRIBE_SHADER_LIB(gpu model) # pull in the resources.qrc file qt5_add_resources(QT_RESOURCES_FILE "${CMAKE_CURRENT_SOURCE_DIR}/res/fonts/fonts.qrc") diff --git a/libraries/render-utils/src/DeferredGlobalLight.slh b/libraries/render-utils/src/DeferredGlobalLight.slh index 6868b96c24..5aa42cf3aa 100755 --- a/libraries/render-utils/src/DeferredGlobalLight.slh +++ b/libraries/render-utils/src/DeferredGlobalLight.slh @@ -49,7 +49,7 @@ vec4 evalSphericalLight(SphericalHarmonics sh, vec3 direction ) { uniform SphericalHarmonics ambientSphere; // Everything about light -<@include Light.slh@> +<@include model/Light.slh@> // The view Matrix uniform mat4 invViewMat; diff --git a/libraries/render-utils/src/deferred_light.slv b/libraries/render-utils/src/deferred_light.slv index f26539fe69..1427dd0f52 100644 --- a/libraries/render-utils/src/deferred_light.slv +++ b/libraries/render-utils/src/deferred_light.slv @@ -1,4 +1,4 @@ -<@include Config.slh@> +<@include gpu/Config.slh@> <$VERSION_HEADER$> // Generated on <$_SCRIBE_DATE$> // diff --git a/libraries/render-utils/src/deferred_light_limited.slv b/libraries/render-utils/src/deferred_light_limited.slv index fdfb88d806..e3051d43f7 100644 --- a/libraries/render-utils/src/deferred_light_limited.slv +++ b/libraries/render-utils/src/deferred_light_limited.slv @@ -1,4 +1,4 @@ -<@include Config.slh@> +<@include gpu/Config.slh@> <$VERSION_HEADER$> // Generated on <$_SCRIBE_DATE$> // diff --git a/libraries/render-utils/src/directional_ambient_light.slf b/libraries/render-utils/src/directional_ambient_light.slf index 308a8a73a7..114c5615b8 100755 --- a/libraries/render-utils/src/directional_ambient_light.slf +++ b/libraries/render-utils/src/directional_ambient_light.slf @@ -1,4 +1,4 @@ -<@include Config.slh@> +<@include gpu/Config.slh@> <$VERSION_HEADER$> // Generated on <$_SCRIBE_DATE$> // diff --git a/libraries/render-utils/src/directional_ambient_light_cascaded_shadow_map.slf b/libraries/render-utils/src/directional_ambient_light_cascaded_shadow_map.slf index db017cf5ac..d52363a26b 100755 --- a/libraries/render-utils/src/directional_ambient_light_cascaded_shadow_map.slf +++ b/libraries/render-utils/src/directional_ambient_light_cascaded_shadow_map.slf @@ -1,4 +1,4 @@ -<@include Config.slh@> +<@include gpu/Config.slh@> <$VERSION_HEADER$> // Generated on <$_SCRIBE_DATE$> // diff --git a/libraries/render-utils/src/directional_ambient_light_shadow_map.slf b/libraries/render-utils/src/directional_ambient_light_shadow_map.slf index 43d3e91dbe..7f098eac2e 100755 --- a/libraries/render-utils/src/directional_ambient_light_shadow_map.slf +++ b/libraries/render-utils/src/directional_ambient_light_shadow_map.slf @@ -1,4 +1,4 @@ -<@include Config.slh@> +<@include gpu/Config.slh@> <$VERSION_HEADER$> // Generated on <$_SCRIBE_DATE$> // diff --git a/libraries/render-utils/src/directional_light.slf b/libraries/render-utils/src/directional_light.slf index 3e708f849e..0299b2a229 100644 --- a/libraries/render-utils/src/directional_light.slf +++ b/libraries/render-utils/src/directional_light.slf @@ -1,4 +1,4 @@ -<@include Config.slh@> +<@include gpu/Config.slh@> <$VERSION_HEADER$> // Generated on <$_SCRIBE_DATE$> // diff --git a/libraries/render-utils/src/directional_light_cascaded_shadow_map.slf b/libraries/render-utils/src/directional_light_cascaded_shadow_map.slf index 90b3bf1d2b..71464fb916 100644 --- a/libraries/render-utils/src/directional_light_cascaded_shadow_map.slf +++ b/libraries/render-utils/src/directional_light_cascaded_shadow_map.slf @@ -1,4 +1,4 @@ -<@include Config.slh@> +<@include gpu/Config.slh@> <$VERSION_HEADER$> // Generated on <$_SCRIBE_DATE$> // diff --git a/libraries/render-utils/src/directional_light_shadow_map.slf b/libraries/render-utils/src/directional_light_shadow_map.slf index 5029b57020..2c53a02348 100644 --- a/libraries/render-utils/src/directional_light_shadow_map.slf +++ b/libraries/render-utils/src/directional_light_shadow_map.slf @@ -1,4 +1,4 @@ -<@include Config.slh@> +<@include gpu/Config.slh@> <$VERSION_HEADER$> // Generated on <$_SCRIBE_DATE$> // diff --git a/libraries/render-utils/src/model.slf b/libraries/render-utils/src/model.slf index bc6f127a77..be465ed908 100755 --- a/libraries/render-utils/src/model.slf +++ b/libraries/render-utils/src/model.slf @@ -1,4 +1,4 @@ -<@include Config.slh@> +<@include gpu/Config.slh@> <$VERSION_HEADER$> // Generated on <$_SCRIBE_DATE$> // model.frag @@ -13,7 +13,7 @@ <@include DeferredBufferWrite.slh@> -<@include Material.slh@> +<@include model/Material.slh@> // the diffuse texture uniform sampler2D diffuseMap; diff --git a/libraries/render-utils/src/model.slv b/libraries/render-utils/src/model.slv index 1c3b03a304..260dd8f0f9 100755 --- a/libraries/render-utils/src/model.slv +++ b/libraries/render-utils/src/model.slv @@ -1,4 +1,4 @@ -<@include Config.slh@> +<@include gpu/Config.slh@> <$VERSION_HEADER$> // Generated on <$_SCRIBE_DATE$> // model.vert @@ -11,6 +11,7 @@ // See the accompanying file LICENSE or http://www.apache.org/licenses/LICENSE-2.0.html // +<@include gpu/Transform.slh@> const int MAX_TEXCOORDS = 2; uniform mat4 texcoordMatrices[MAX_TEXCOORDS]; diff --git a/libraries/render-utils/src/model_lightmap.slf b/libraries/render-utils/src/model_lightmap.slf index 59836e9737..9db31bf1ad 100755 --- a/libraries/render-utils/src/model_lightmap.slf +++ b/libraries/render-utils/src/model_lightmap.slf @@ -1,4 +1,4 @@ -<@include Config.slh@> +<@include gpu/Config.slh@> <$VERSION_HEADER$> // Generated on <$_SCRIBE_DATE$> // @@ -14,7 +14,7 @@ <@include DeferredBufferWrite.slh@> -<@include Material.slh@> +<@include model/Material.slh@> // the diffuse texture uniform sampler2D diffuseMap; diff --git a/libraries/render-utils/src/model_lightmap.slv b/libraries/render-utils/src/model_lightmap.slv index 1ea5b7b68a..53da84de73 100755 --- a/libraries/render-utils/src/model_lightmap.slv +++ b/libraries/render-utils/src/model_lightmap.slv @@ -1,4 +1,4 @@ -<@include Config.slh@> +<@include gpu/Config.slh@> <$VERSION_HEADER$> // Generated on <$_SCRIBE_DATE$> // diff --git a/libraries/render-utils/src/model_lightmap_normal_map.slf b/libraries/render-utils/src/model_lightmap_normal_map.slf index 6310ab0086..a7b6494ee5 100755 --- a/libraries/render-utils/src/model_lightmap_normal_map.slf +++ b/libraries/render-utils/src/model_lightmap_normal_map.slf @@ -1,4 +1,4 @@ -<@include Config.slh@> +<@include gpu/Config.slh@> <$VERSION_HEADER$> // Generated on <$_SCRIBE_DATE$> // @@ -14,7 +14,7 @@ <@include DeferredBufferWrite.slh@> -<@include Material.slh@> +<@include model/Material.slh@> // the diffuse texture uniform sampler2D diffuseMap; diff --git a/libraries/render-utils/src/model_lightmap_normal_map.slv b/libraries/render-utils/src/model_lightmap_normal_map.slv index 14e1d52779..f4f5e72167 100755 --- a/libraries/render-utils/src/model_lightmap_normal_map.slv +++ b/libraries/render-utils/src/model_lightmap_normal_map.slv @@ -1,4 +1,4 @@ -<@include Config.slh@> +<@include gpu/Config.slh@> <$VERSION_HEADER$> // Generated on <$_SCRIBE_DATE$> // diff --git a/libraries/render-utils/src/model_lightmap_normal_specular_map.slf b/libraries/render-utils/src/model_lightmap_normal_specular_map.slf index ab555ea0c0..e5daae4160 100755 --- a/libraries/render-utils/src/model_lightmap_normal_specular_map.slf +++ b/libraries/render-utils/src/model_lightmap_normal_specular_map.slf @@ -1,4 +1,4 @@ -<@include Config.slh@> +<@include gpu/Config.slh@> <$VERSION_HEADER$> // Generated on <$_SCRIBE_DATE$> // @@ -14,7 +14,7 @@ <@include DeferredBufferWrite.slh@> -<@include Material.slh@> +<@include model/Material.slh@> // the diffuse texture uniform sampler2D diffuseMap; diff --git a/libraries/render-utils/src/model_lightmap_specular_map.slf b/libraries/render-utils/src/model_lightmap_specular_map.slf index 2973882e8a..820ded5cad 100755 --- a/libraries/render-utils/src/model_lightmap_specular_map.slf +++ b/libraries/render-utils/src/model_lightmap_specular_map.slf @@ -1,4 +1,4 @@ -<@include Config.slh@> +<@include gpu/Config.slh@> <$VERSION_HEADER$> // Generated on <$_SCRIBE_DATE$> // @@ -14,7 +14,7 @@ <@include DeferredBufferWrite.slh@> -<@include Material.slh@> +<@include model/Material.slh@> // the diffuse texture uniform sampler2D diffuseMap; diff --git a/libraries/render-utils/src/model_normal_map.slf b/libraries/render-utils/src/model_normal_map.slf index c6baa6f797..5ad0bfb50d 100755 --- a/libraries/render-utils/src/model_normal_map.slf +++ b/libraries/render-utils/src/model_normal_map.slf @@ -1,4 +1,4 @@ -<@include Config.slh@> +<@include gpu/Config.slh@> <$VERSION_HEADER$> // Generated on <$_SCRIBE_DATE$> // @@ -14,7 +14,7 @@ <@include DeferredBufferWrite.slh@> -<@include Material.slh@> +<@include model/Material.slh@> // the diffuse texture uniform sampler2D diffuseMap; diff --git a/libraries/render-utils/src/model_normal_map.slv b/libraries/render-utils/src/model_normal_map.slv index a27cd49171..582f1b1abb 100755 --- a/libraries/render-utils/src/model_normal_map.slv +++ b/libraries/render-utils/src/model_normal_map.slv @@ -1,4 +1,4 @@ -<@include Config.slh@> +<@include gpu/Config.slh@> <$VERSION_HEADER$> // Generated on <$_SCRIBE_DATE$> // diff --git a/libraries/render-utils/src/model_normal_specular_map.slf b/libraries/render-utils/src/model_normal_specular_map.slf index 8e7c9d3293..5c272d0c6b 100755 --- a/libraries/render-utils/src/model_normal_specular_map.slf +++ b/libraries/render-utils/src/model_normal_specular_map.slf @@ -1,4 +1,4 @@ -<@include Config.slh@> +<@include gpu/Config.slh@> <$VERSION_HEADER$> // Generated on <$_SCRIBE_DATE$> // @@ -14,7 +14,7 @@ <@include DeferredBufferWrite.slh@> -<@include Material.slh@> +<@include model/Material.slh@> // the diffuse texture uniform sampler2D diffuseMap; diff --git a/libraries/render-utils/src/model_shadow.slf b/libraries/render-utils/src/model_shadow.slf index 1fbb44140b..e8bdb01f30 100755 --- a/libraries/render-utils/src/model_shadow.slf +++ b/libraries/render-utils/src/model_shadow.slf @@ -1,4 +1,4 @@ -<@include Config.slh@> +<@include gpu/Config.slh@> <$VERSION_HEADER$> // Generated on <$_SCRIBE_DATE$> // diff --git a/libraries/render-utils/src/model_shadow.slv b/libraries/render-utils/src/model_shadow.slv index 6ff8c23f5a..b05a92b155 100755 --- a/libraries/render-utils/src/model_shadow.slv +++ b/libraries/render-utils/src/model_shadow.slv @@ -1,4 +1,4 @@ -<@include Config.slh@> +<@include gpu/Config.slh@> <$VERSION_HEADER$> // Generated on <$_SCRIBE_DATE$> // diff --git a/libraries/render-utils/src/model_specular_map.slf b/libraries/render-utils/src/model_specular_map.slf index bfcc69287d..e50d2c452d 100755 --- a/libraries/render-utils/src/model_specular_map.slf +++ b/libraries/render-utils/src/model_specular_map.slf @@ -1,4 +1,4 @@ -<@include Config.slh@> +<@include gpu/Config.slh@> <$VERSION_HEADER$> // Generated on <$_SCRIBE_DATE$> // @@ -14,7 +14,7 @@ <@include DeferredBufferWrite.slh@> -<@include Material.slh@> +<@include model/Material.slh@> // the diffuse texture uniform sampler2D diffuseMap; diff --git a/libraries/render-utils/src/model_translucent.slf b/libraries/render-utils/src/model_translucent.slf index 4d1bf7bdec..91592e07de 100755 --- a/libraries/render-utils/src/model_translucent.slf +++ b/libraries/render-utils/src/model_translucent.slf @@ -1,4 +1,4 @@ -<@include Config.slh@> +<@include gpu/Config.slh@> <$VERSION_HEADER$> // Generated on <$_SCRIBE_DATE$> // @@ -14,7 +14,7 @@ <@include DeferredBufferWrite.slh@> -<@include Material.slh@> +<@include model/Material.slh@> // the diffuse texture uniform sampler2D diffuseMap; diff --git a/libraries/render-utils/src/point_light.slf b/libraries/render-utils/src/point_light.slf index abe904ecce..78d3d1e458 100644 --- a/libraries/render-utils/src/point_light.slf +++ b/libraries/render-utils/src/point_light.slf @@ -1,4 +1,4 @@ -<@include Config.slh@> +<@include gpu/Config.slh@> <$VERSION_HEADER$> // Generated on <$_SCRIBE_DATE$> // @@ -19,7 +19,7 @@ <@include DeferredLighting.slh@> // Everything about light -<@include Light.slh@> +<@include model/Light.slh@> // The view Matrix uniform mat4 invViewMat; diff --git a/libraries/render-utils/src/sdf_text.slf b/libraries/render-utils/src/sdf_text.slf index 0e89ce4f47..1affbe4c57 100644 --- a/libraries/render-utils/src/sdf_text.slf +++ b/libraries/render-utils/src/sdf_text.slf @@ -1,4 +1,4 @@ -<@include Config.slh@> +<@include gpu/Config.slh@> <$VERSION_HEADER$> // Generated on <$_SCRIBE_DATE$> // sdf_text.frag diff --git a/libraries/render-utils/src/sdf_text.slv b/libraries/render-utils/src/sdf_text.slv index 7fb6dd42e8..27db1c4985 100644 --- a/libraries/render-utils/src/sdf_text.slv +++ b/libraries/render-utils/src/sdf_text.slv @@ -1,4 +1,4 @@ -<@include Config.slh@> +<@include gpu/Config.slh@> <$VERSION_HEADER$> // Generated on <$_SCRIBE_DATE$> // sdf_text.vert diff --git a/libraries/render-utils/src/simple.slf b/libraries/render-utils/src/simple.slf index faa4af4573..3e70674e33 100644 --- a/libraries/render-utils/src/simple.slf +++ b/libraries/render-utils/src/simple.slf @@ -1,4 +1,4 @@ -<@include Config.slh@> +<@include gpu/Config.slh@> <$VERSION_HEADER$> // Generated on <$_SCRIBE_DATE$> // diff --git a/libraries/render-utils/src/simple.slv b/libraries/render-utils/src/simple.slv index e874a6d8a9..61338b440d 100644 --- a/libraries/render-utils/src/simple.slv +++ b/libraries/render-utils/src/simple.slv @@ -1,4 +1,4 @@ -<@include Config.slh@> +<@include gpu/Config.slh@> <$VERSION_HEADER$> // Generated on <$_SCRIBE_DATE$> // diff --git a/libraries/render-utils/src/skin_model.slv b/libraries/render-utils/src/skin_model.slv index 4cef8fddab..737fa85bf0 100755 --- a/libraries/render-utils/src/skin_model.slv +++ b/libraries/render-utils/src/skin_model.slv @@ -1,4 +1,4 @@ -<@include Config.slh@> +<@include gpu/Config.slh@> <$VERSION_HEADER$> // Generated on <$_SCRIBE_DATE$> // diff --git a/libraries/render-utils/src/skin_model_normal_map.slv b/libraries/render-utils/src/skin_model_normal_map.slv index c39f9cc0dd..3db63f9d98 100755 --- a/libraries/render-utils/src/skin_model_normal_map.slv +++ b/libraries/render-utils/src/skin_model_normal_map.slv @@ -1,4 +1,4 @@ -<@include Config.slh@> +<@include gpu/Config.slh@> <$VERSION_HEADER$> // Generated on <$_SCRIBE_DATE$> // diff --git a/libraries/render-utils/src/skin_model_shadow.slv b/libraries/render-utils/src/skin_model_shadow.slv index 9a594ac26c..3625d4006a 100755 --- a/libraries/render-utils/src/skin_model_shadow.slv +++ b/libraries/render-utils/src/skin_model_shadow.slv @@ -1,4 +1,4 @@ -<@include Config.slh@> +<@include gpu/Config.slh@> <$VERSION_HEADER$> // Generated on <$_SCRIBE_DATE$> // diff --git a/libraries/render-utils/src/spot_light.slf b/libraries/render-utils/src/spot_light.slf index 95fabae3ed..e6c3938b71 100644 --- a/libraries/render-utils/src/spot_light.slf +++ b/libraries/render-utils/src/spot_light.slf @@ -1,4 +1,4 @@ -<@include Config.slh@> +<@include gpu/Config.slh@> <$VERSION_HEADER$> // Generated on <$_SCRIBE_DATE$> // @@ -19,7 +19,7 @@ <@include DeferredLighting.slh@> // Everything about light -<@include Light.slh@> +<@include model/Light.slh@> // The view Matrix uniform mat4 invViewMat; From 8944bdd1e54132d3bc04df79290bbf3f29cae5c9 Mon Sep 17 00:00:00 2001 From: Sam Gateau Date: Fri, 13 Feb 2015 02:17:08 -0800 Subject: [PATCH 02/21] COmment out problems --- libraries/gpu/src/gpu/Transform.slh | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/libraries/gpu/src/gpu/Transform.slh b/libraries/gpu/src/gpu/Transform.slh index 56bea01e02..04ed408b03 100644 --- a/libraries/gpu/src/gpu/Transform.slh +++ b/libraries/gpu/src/gpu/Transform.slh @@ -29,7 +29,7 @@ vec4 transform(TransformCamera camera, TransformObject object, vec4 pos) { } - + uniform transformStateBuffer { TransformState xform; @@ -54,7 +54,7 @@ TransformState getMaterial() { return xform; } <@endif@> - +!> <@endif@> From cc3cc4f96f045d73e675a2a7d6db1d3c773f4e09 Mon Sep 17 00:00:00 2001 From: Sam Gateau Date: Mon, 16 Feb 2015 09:31:29 -0800 Subject: [PATCH 03/21] replacing the glTransform pipeline for model rendering --- libraries/gpu/src/gpu/Batch.cpp | 4 +- libraries/gpu/src/gpu/Batch.h | 2 +- libraries/gpu/src/gpu/Config.slh | 17 ++++++ libraries/gpu/src/gpu/Context.h | 15 ++++++ libraries/gpu/src/gpu/Format.h | 7 +++ libraries/gpu/src/gpu/GLBackend.cpp | 77 ++++++++++++++++++++++++++-- libraries/gpu/src/gpu/GLBackend.h | 10 +++- libraries/gpu/src/gpu/Transform.slh | 12 ++--- libraries/octree/src/ViewFrustum.cpp | 7 +++ libraries/octree/src/ViewFrustum.h | 1 + libraries/render-utils/src/Model.cpp | 15 ++++++ libraries/render-utils/src/model.slv | 24 ++++++++- libraries/shared/src/Transform.h | 8 +++ 13 files changed, 185 insertions(+), 14 deletions(-) diff --git a/libraries/gpu/src/gpu/Batch.cpp b/libraries/gpu/src/gpu/Batch.cpp index b15ee4fe29..cd4f4d7d2c 100644 --- a/libraries/gpu/src/gpu/Batch.cpp +++ b/libraries/gpu/src/gpu/Batch.cpp @@ -153,10 +153,10 @@ void Batch::setViewTransform(const Transform& view) { _params.push_back(_transforms.cache(view)); } -void Batch::setProjectionTransform(const Transform& proj) { +void Batch::setProjectionTransform(const Mat4& proj) { ADD_COMMAND(setProjectionTransform); - _params.push_back(_transforms.cache(proj)); + _params.push_back(cacheData(sizeof(Mat4), &proj); } void Batch::setUniformBuffer(uint32 slot, const BufferPointer& buffer, Offset offset, Offset size) { diff --git a/libraries/gpu/src/gpu/Batch.h b/libraries/gpu/src/gpu/Batch.h index 0657eacd6e..b9467f7fdc 100644 --- a/libraries/gpu/src/gpu/Batch.h +++ b/libraries/gpu/src/gpu/Batch.h @@ -89,7 +89,7 @@ public: // with the ModelTransformu to create the equivalent of the glModelViewMatrix void setModelTransform(const Transform& model); void setViewTransform(const Transform& view); - void setProjectionTransform(const Transform& proj); + void setProjectionTransform(const Mat4& proj); // Shader Stage void setUniformBuffer(uint32 slot, const BufferPointer& buffer, Offset offset, Offset size); diff --git a/libraries/gpu/src/gpu/Config.slh b/libraries/gpu/src/gpu/Config.slh index b17bd7b2b8..0ef68c9fd0 100644 --- a/libraries/gpu/src/gpu/Config.slh +++ b/libraries/gpu/src/gpu/Config.slh @@ -13,6 +13,23 @@ <@if GLPROFILE == PC_GL @> <@def VERSION_HEADER #version 330 compatibility@> + +<@func inputPosition name@> +layout(location = 0) in vec3 <$name$>; +<@endfunc@> + +<@func inputNormal name@> +layout(location = 1) in vec3 <$name$>; +<@endfunc@> + +<@func inputTexcoord name@> +layout(location = 4) in vec2 <$name$>; +<@endfunc@> + +<@func inputColor name@> +layout(location = 4) vec3 <$name$>; +<@endfunc@> + <@elif GLPROFILE == MAC_GL @> <@def VERSION_HEADER #version 120@> <@else@> diff --git a/libraries/gpu/src/gpu/Context.h b/libraries/gpu/src/gpu/Context.h index b8cba3ded1..2bbf9ea032 100644 --- a/libraries/gpu/src/gpu/Context.h +++ b/libraries/gpu/src/gpu/Context.h @@ -29,6 +29,21 @@ class Batch; class Backend { public: + class TransformObject { + public: + Mat4 _model; + Mat4 _modelInverse; + Mat4 _modelView; + Mat4 _modelViewInverseTranspose; + }; + + class TransformCamera { + public: + Mat4 _view; + Mat4 _viewInverse; + Mat4 _projection; + }; + template< typename T > static void setGPUObject(const Buffer& buffer, T* bo) { buffer.setGPUObject(reinterpret_cast(bo)); diff --git a/libraries/gpu/src/gpu/Format.h b/libraries/gpu/src/gpu/Format.h index 6274c294ec..cbf90384ce 100644 --- a/libraries/gpu/src/gpu/Format.h +++ b/libraries/gpu/src/gpu/Format.h @@ -11,6 +11,7 @@ #ifndef hifi_gpu_Format_h #define hifi_gpu_Format_h +#include #include namespace gpu { @@ -24,6 +25,12 @@ typedef char int8; typedef uint32 Offset; +typedef glm::mat4 Mat4; +typedef glm::mat3 Mat3; +typedef glm::vec4 Vec4; +typedef glm::vec3 Vec3; +typedef glm::vec2 Vec2; + // Description of a scalar type enum Type { diff --git a/libraries/gpu/src/gpu/GLBackend.cpp b/libraries/gpu/src/gpu/GLBackend.cpp index 34ca47f300..7cc3958497 100644 --- a/libraries/gpu/src/gpu/GLBackend.cpp +++ b/libraries/gpu/src/gpu/GLBackend.cpp @@ -386,18 +386,49 @@ void GLBackend::do_setViewTransform(Batch& batch, uint32 paramOffset) { } void GLBackend::do_setProjectionTransform(Batch& batch, uint32 paramOffset) { - _transform._projection = batch._transforms.get(batch._params[paramOffset]._uint); + memcpy(&_transform._projection, batch.editData(batch._params[paramOffset]._uint), sizeof(Mat4)); _transform._invalidProj = true; } +void GLBackend::initTransform() { +#if defined(Q_OS_MAC) +#elif defined(Q_OS_WIN) + glGenBuffers(1, &_transform._transformObjectBuffer); + glGenBuffers(1, &_transform._transformCameraBuffer); + + glBindBuffer(GL_UNIFORM_BUFFER, _transform._transformObjectBuffer); + glBufferData(GL_UNIFORM_BUFFER, sizeof(_transform._transformObject), (const void*) &_transform._transformObject, GL_DYNAMIC_DRAW); + + glBindBuffer(GL_UNIFORM_BUFFER, _transform._transformCameraBuffer); + glBufferData(GL_UNIFORM_BUFFER, sizeof(_transform._transformCamera), (const void*) &_transform._transformCamera, GL_DYNAMIC_DRAW); + + + glBindBuffer(GL_UNIFORM_BUFFER, 0); +#else +#endif +} + +void GLBackend::killTransform() { +#if defined(Q_OS_MAC) +#elif defined(Q_OS_WIN) + glDeleteBuffers(1, &_transform._transformObjectBuffer); + glDeleteBuffers(1, &_transform._transformCameraBuffer); +#else +#endif +} + void GLBackend::updateTransform() { +#define LEGACY_TRANSFORM_PIPELINE +#ifdef LEGACY_TRANSFORM_PIPELINE if (_transform._invalidProj) { // TODO: implement the projection matrix assignment to gl state - /* if (_transform._lastMode != GL_PROJECTION) { + if (_transform._lastMode != GL_PROJECTION) { glMatrixMode(GL_PROJECTION); _transform._lastMode = GL_PROJECTION; } - CHECK_GL_ERROR();*/ + glLoadMatrixf(reinterpret_cast< const GLfloat* >(&_transform._projection)); + + CHECK_GL_ERROR(); } if (_transform._invalidModel || _transform._invalidView) { @@ -434,6 +465,46 @@ void GLBackend::updateTransform() { _transform._invalidModel = false; _transform._invalidView = false; } +#else + + if (_transform._invalidProj) { + _transform._transformCamera._projection = _transform._projection; + } + + if (_transform._invalidView) { + _transform._view.getInverseMatrix(_transform._transformCamera._view); + _transform._view.getMatrix(_transform._transformCamera._viewInverse); + } + + if (_transform._invalidModel) { + _transform._model.getMatrix(_transform._transformObject._model); + _transform._model.getInverseMatrix(_transform._transformObject._modelInverse); + } + + if (_transform._invalidView || _transform._invalidModel) { + Transform mvx; + Transform::inverseMult(mvx, _transform._view, _transform._model); + mvx.getMatrix(_transform._transformObject._modelView); + mvx.getInverseTransposeMatrix(_transform._transformObject._modelViewInverseTranspose); + } + + if (_transform._invalidView || _transform._invalidProj) { + glBindBuffer(GL_UNIFORM_BUFFER, _transform._transformCameraBuffer); + glBufferSubData(GL_UNIFORM_BUFFER, 0, sizeof(_transform._transformCamera), (const void*) &_transform._transformCamera); + glBindBuffer(GL_UNIFORM_BUFFER, 0); + } + + if (_transform._invalidView || _transform._invalidModel) { + glBindBuffer(GL_UNIFORM_BUFFER, _transform._transformObjectBuffer); + glBufferSubData(GL_UNIFORM_BUFFER, 0, sizeof(_transform._transformObject), (const void*) &_transform._transformObject); + glBindBuffer(GL_UNIFORM_BUFFER, 0); + } + + glBindBufferRange(GL_UNIFORM_BUFFER, 0, _transform._transformCameraBuffer, 0, sizeof(TransformCamera)); + glBindBufferRange(GL_UNIFORM_BUFFER, 1, _transform._transformObjectBuffer, 0, sizeof(TransformObject)); + + _transform._invalidView = _transform._invalidProj = _transform._invalidModel = false; +#endif } void GLBackend::do_setUniformBuffer(Batch& batch, uint32 paramOffset) { diff --git a/libraries/gpu/src/gpu/GLBackend.h b/libraries/gpu/src/gpu/GLBackend.h index e3450ae71a..1c5906525b 100644 --- a/libraries/gpu/src/gpu/GLBackend.h +++ b/libraries/gpu/src/gpu/GLBackend.h @@ -113,11 +113,17 @@ protected: void do_setViewTransform(Batch& batch, uint32 paramOffset); void do_setProjectionTransform(Batch& batch, uint32 paramOffset); + void initTransform(); + void killTransform(); void updateTransform(); struct TransformStageState { + TransformObject _transformObject; + TransformCamera _transformCamera; + GLuint _transformObjectBuffer; + GLuint _transformCameraBuffer; Transform _model; Transform _view; - Transform _projection; + Mat4 _projection; bool _invalidModel; bool _invalidView; bool _invalidProj; @@ -125,6 +131,8 @@ protected: GLenum _lastMode; TransformStageState() : + _transformObjectBuffer(0), + _transformCameraBuffer(0), _model(), _view(), _projection(), diff --git a/libraries/gpu/src/gpu/Transform.slh b/libraries/gpu/src/gpu/Transform.slh index 04ed408b03..1ae422cd08 100644 --- a/libraries/gpu/src/gpu/Transform.slh +++ b/libraries/gpu/src/gpu/Transform.slh @@ -13,19 +13,19 @@ struct TransformObject { mat4 _model; mat4 _modelInverseTranspose; + mat4 _modelView; + mat4 _modelViewInverseTranspose; }; struct TransformCamera { mat4 _view; - mat4 _viewInverseTranspose; - mat4 _proj; - mat4 _projInverseTranspose; - mat4 _viewProj; - mat4 _viewProjInverseTranspose; + mat4 _viewInverse; + mat4 _projection; + }; vec4 transform(TransformCamera camera, TransformObject object, vec4 pos) { - return camera._proj * (camera._view * (object._model * pos))); + return camera._projection * (object._modelView * pos); } diff --git a/libraries/octree/src/ViewFrustum.cpp b/libraries/octree/src/ViewFrustum.cpp index 81ce31d767..8181a1098b 100644 --- a/libraries/octree/src/ViewFrustum.cpp +++ b/libraries/octree/src/ViewFrustum.cpp @@ -866,4 +866,11 @@ float ViewFrustum::distanceToCamera(const glm::vec3& point) const { return distanceToPoint; } +void ViewFrustum::evalProjectionMatrix(glm::mat4& proj) const { + if (isOrthographic()) { + proj = glm::ortho(getWidth() * -0.5, getWidth() * +0.5, getHeight() * -0.5, getHeight() * 0.5); + } else { + proj = glm::perspective(getFieldOfView(), getAspectRatio(), getNearClip(), getFarClip()); + } +} diff --git a/libraries/octree/src/ViewFrustum.h b/libraries/octree/src/ViewFrustum.h index c40bc37652..a74140b94f 100644 --- a/libraries/octree/src/ViewFrustum.h +++ b/libraries/octree/src/ViewFrustum.h @@ -124,6 +124,7 @@ public: float distanceToCamera(const glm::vec3& point) const; + void evalProjectionMatrix(glm::mat4& proj) const; private: // Used for keyhole calculations ViewFrustum::location pointInKeyhole(const glm::vec3& point) const; diff --git a/libraries/render-utils/src/Model.cpp b/libraries/render-utils/src/Model.cpp index f166aecae9..edbce6b814 100644 --- a/libraries/render-utils/src/Model.cpp +++ b/libraries/render-utils/src/Model.cpp @@ -1659,11 +1659,26 @@ void Model::setupBatchTransform(gpu::Batch& batch) { void Model::endScene(RenderMode mode, RenderArgs* args) { PROFILE_RANGE(__FUNCTION__); + RenderArgs::RenderSide renderSide = RenderArgs::MONO; if (args) { renderSide = args->_renderSide; } + if (args) { + glm::mat4 proj; + args->_viewFrustum->evalProjectionMatrix(proj); + gpu::Batch batch; + batch.setProjectionTransform(proj); + ::gpu::GLBackend::renderBatch(batch); + + } + + _viewState->getViewTransform(); + // apply entity translation offset to the viewTransform in one go (it's a preTranslate because viewTransform goes from world to eye space) + _transforms[0].preTranslate(-_translation); + + // Do the rendering batch creation for mono or left eye, not for right eye if (renderSide != RenderArgs::STEREO_RIGHT) { // Let's introduce a gpu::Batch to capture all the calls to the graphics api diff --git a/libraries/render-utils/src/model.slv b/libraries/render-utils/src/model.slv index 260dd8f0f9..1da88a3876 100755 --- a/libraries/render-utils/src/model.slv +++ b/libraries/render-utils/src/model.slv @@ -14,6 +14,11 @@ <@include gpu/Transform.slh@> const int MAX_TEXCOORDS = 2; +<$inputPosition(vin_position)$> +<$inputNormal(vin_normal)$> +<$inputTexcoord(vin_texcoord)$> +<$inputColor(vin_color)$> + uniform mat4 texcoordMatrices[MAX_TEXCOORDS]; // the interpolated normal @@ -30,6 +35,23 @@ void main(void) { gl_TexCoord[0] = texcoordMatrices[0] * vec4(gl_MultiTexCoord0.xy, 0.0, 1.0); // use standard pipeline transform - gl_Position = ftransform(); + gl_Position = gl_ModelViewProjectionMatrix * vec4(vin_position, 1.0); } + + +/* +void main(void) { + // transform and store the normal for interpolation + normal = normalize(gl_ModelViewMatrix * vec4(gl_Normal, 0.0)); + + // 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); + + // use standard pipeline transform + gl_Position = ftransform(); +} +*/ diff --git a/libraries/shared/src/Transform.h b/libraries/shared/src/Transform.h index 346a82a3b0..4f5f441170 100644 --- a/libraries/shared/src/Transform.h +++ b/libraries/shared/src/Transform.h @@ -90,6 +90,7 @@ public: Mat4& getMatrix(Mat4& result) const; Mat4& getInverseMatrix(Mat4& result) const; + Mat4& getInverseTransposeMatrix(Mat4& result) const; Transform& evalInverse(Transform& result) const; @@ -329,6 +330,13 @@ inline Transform::Mat4& Transform::getInverseMatrix(Transform::Mat4& result) con return inverse.getMatrix(result); } +inline Transform::Mat4& Transform::getInverseTransposeMatrix(Transform::Mat4& result) const { + getInverseMatrix(result); + result = glm::transpose(result); + return result; +} + + inline void Transform::evalFromRawMatrix(const Mat4& matrix) { // for now works only in the case of TRS transformation if ((matrix[0][3] == 0) && (matrix[1][3] == 0) && (matrix[2][3] == 0) && (matrix[3][3] == 1.0f)) { From 23354da828b04b6c606a280ba13885a7998ee64c Mon Sep 17 00:00:00 2001 From: Sam Gateau Date: Mon, 16 Feb 2015 22:08:21 -0800 Subject: [PATCH 04/21] replacing the glTransform pipeline for model rendering --- libraries/gpu/src/gpu/Batch.cpp | 2 +- libraries/gpu/src/gpu/GLBackend.cpp | 16 +++++--- libraries/gpu/src/gpu/GLBackend.h | 5 ++- libraries/octree/src/ViewFrustum.cpp | 6 ++- .../render-utils/src/DeferredGlobalLight.slh | 5 ++- libraries/render-utils/src/Model.cpp | 40 ++++++++++--------- libraries/render-utils/src/model.slv | 13 ++---- 7 files changed, 48 insertions(+), 39 deletions(-) diff --git a/libraries/gpu/src/gpu/Batch.cpp b/libraries/gpu/src/gpu/Batch.cpp index cd4f4d7d2c..ddbc76fce6 100644 --- a/libraries/gpu/src/gpu/Batch.cpp +++ b/libraries/gpu/src/gpu/Batch.cpp @@ -156,7 +156,7 @@ void Batch::setViewTransform(const Transform& view) { void Batch::setProjectionTransform(const Mat4& proj) { ADD_COMMAND(setProjectionTransform); - _params.push_back(cacheData(sizeof(Mat4), &proj); + _params.push_back(cacheData(sizeof(Mat4), &proj)); } void Batch::setUniformBuffer(uint32 slot, const BufferPointer& buffer, Offset offset, Offset size) { diff --git a/libraries/gpu/src/gpu/GLBackend.cpp b/libraries/gpu/src/gpu/GLBackend.cpp index 7cc3958497..4473b00341 100644 --- a/libraries/gpu/src/gpu/GLBackend.cpp +++ b/libraries/gpu/src/gpu/GLBackend.cpp @@ -80,21 +80,25 @@ GLBackend::~GLBackend() { } -void GLBackend::renderBatch(Batch& batch) { +void GLBackend::render(Batch& batch) { + uint32 numCommands = batch.getCommands().size(); const Batch::Commands::value_type* command = batch.getCommands().data(); const Batch::CommandOffsets::value_type* offset = batch.getCommandOffsets().data(); - GLBackend backend; - for (unsigned int i = 0; i < numCommands; i++) { CommandCall call = _commandCalls[(*command)]; - (backend.*(call))(batch, *offset); + (this->*(call))(batch, *offset); command++; offset++; } } +void GLBackend::renderBatch(Batch& batch) { + GLBackend backend; + backend.render(batch); +} + void GLBackend::checkGLError() { GLenum error = glGetError(); if (!error) { @@ -416,9 +420,9 @@ void GLBackend::killTransform() { #else #endif } - +#define LEGACY_TRANSFORM_PIPELINE 1 void GLBackend::updateTransform() { -#define LEGACY_TRANSFORM_PIPELINE + #ifdef LEGACY_TRANSFORM_PIPELINE if (_transform._invalidProj) { // TODO: implement the projection matrix assignment to gl state diff --git a/libraries/gpu/src/gpu/GLBackend.h b/libraries/gpu/src/gpu/GLBackend.h index 1c5906525b..249a2fb8f9 100644 --- a/libraries/gpu/src/gpu/GLBackend.h +++ b/libraries/gpu/src/gpu/GLBackend.h @@ -27,10 +27,13 @@ public: GLBackend(); ~GLBackend(); + void render(Batch& batch); + static void renderBatch(Batch& batch); static void checkGLError(); + class GLBuffer { public: @@ -138,7 +141,7 @@ protected: _projection(), _invalidModel(true), _invalidView(true), - _invalidProj(true), + _invalidProj(false), _lastMode(GL_TEXTURE) {} } _transform; diff --git a/libraries/octree/src/ViewFrustum.cpp b/libraries/octree/src/ViewFrustum.cpp index 8181a1098b..61324861e8 100644 --- a/libraries/octree/src/ViewFrustum.cpp +++ b/libraries/octree/src/ViewFrustum.cpp @@ -870,7 +870,11 @@ void ViewFrustum::evalProjectionMatrix(glm::mat4& proj) const { if (isOrthographic()) { proj = glm::ortho(getWidth() * -0.5, getWidth() * +0.5, getHeight() * -0.5, getHeight() * 0.5); } else { - proj = glm::perspective(getFieldOfView(), getAspectRatio(), getNearClip(), getFarClip()); + float left, right, bottom, top, near, far; + glm::vec4 clip0, clip1; + computeOffAxisFrustum(left, right, bottom, top, near, far, clip0, clip1); + proj = glm::perspective(glm::radians(getFieldOfView()), getAspectRatio(), getNearClip(), getFarClip()); + // proj = glm::perspective(getFieldOfView() * 0.5f, getAspectRatio(), getNearClip(), getFarClip()); } } diff --git a/libraries/render-utils/src/DeferredGlobalLight.slh b/libraries/render-utils/src/DeferredGlobalLight.slh index 5aa42cf3aa..6657100e6f 100755 --- a/libraries/render-utils/src/DeferredGlobalLight.slh +++ b/libraries/render-utils/src/DeferredGlobalLight.slh @@ -95,7 +95,10 @@ vec3 evalAmbienSphereGlobalColor(float shadowAttenuation, vec3 position, vec3 no vec3 evalLightmappedColor(float shadowAttenuation, vec3 normal, vec3 diffuse, vec3 lightmap) { Light light = getLight(); - float diffuseDot = dot(normal, getLightDirection(light)); + + vec3 fragNormal = vec3(invViewMat * vec4(normal, 0.0)); + + float diffuseDot = dot(fragNormal, getLightDirection(light)); // need to catch normals perpendicular to the projection plane hence the magic number for the threshold // it should be just 0, but we have innacurracy so we need to overshoot diff --git a/libraries/render-utils/src/Model.cpp b/libraries/render-utils/src/Model.cpp index edbce6b814..05ae810f6c 100644 --- a/libraries/render-utils/src/Model.cpp +++ b/libraries/render-utils/src/Model.cpp @@ -687,6 +687,12 @@ 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); + } + // Capture the view matrix once for the rendering of this model if (_transforms.empty()) { _transforms.push_back(Transform()); @@ -1659,26 +1665,26 @@ void Model::setupBatchTransform(gpu::Batch& batch) { void Model::endScene(RenderMode mode, RenderArgs* args) { PROFILE_RANGE(__FUNCTION__); - + #if defined(ANDROID) + #else + glPushMatrix(); + #endif + RenderArgs::RenderSide renderSide = RenderArgs::MONO; if (args) { renderSide = args->_renderSide; } + gpu::GLBackend backend; + if (args) { glm::mat4 proj; args->_viewFrustum->evalProjectionMatrix(proj); gpu::Batch batch; batch.setProjectionTransform(proj); - ::gpu::GLBackend::renderBatch(batch); - + backend.render(batch); } - _viewState->getViewTransform(); - // apply entity translation offset to the viewTransform in one go (it's a preTranslate because viewTransform goes from world to eye space) - _transforms[0].preTranslate(-_translation); - - // Do the rendering batch creation for mono or left eye, not for right eye if (renderSide != RenderArgs::STEREO_RIGHT) { // Let's introduce a gpu::Batch to capture all the calls to the graphics api @@ -1833,19 +1839,15 @@ void Model::endScene(RenderMode mode, RenderArgs* args) { // Render! { PROFILE_RANGE("render Batch"); - #if defined(ANDROID) - #else - glPushMatrix(); - #endif - - ::gpu::GLBackend::renderBatch(_sceneRenderBatch); - - #if defined(ANDROID) - #else - glPopMatrix(); - #endif + backend.render(_sceneRenderBatch); } + + #if defined(ANDROID) + #else + glPopMatrix(); + #endif + // restore all the default material settings _viewState->setupWorldLight(); diff --git a/libraries/render-utils/src/model.slv b/libraries/render-utils/src/model.slv index 1da88a3876..f3f52ad990 100755 --- a/libraries/render-utils/src/model.slv +++ b/libraries/render-utils/src/model.slv @@ -11,19 +11,14 @@ // See the accompanying file LICENSE or http://www.apache.org/licenses/LICENSE-2.0.html // -<@include gpu/Transform.slh@> +//include gpu/Transform.slh const int MAX_TEXCOORDS = 2; -<$inputPosition(vin_position)$> -<$inputNormal(vin_normal)$> -<$inputTexcoord(vin_texcoord)$> -<$inputColor(vin_color)$> - uniform mat4 texcoordMatrices[MAX_TEXCOORDS]; // the interpolated normal varying vec4 normal; - +/* void main(void) { // transform and store the normal for interpolation normal = normalize(gl_ModelViewMatrix * vec4(gl_Normal, 0.0)); @@ -37,10 +32,9 @@ void main(void) { // use standard pipeline transform gl_Position = gl_ModelViewProjectionMatrix * vec4(vin_position, 1.0); } +*/ - -/* void main(void) { // transform and store the normal for interpolation normal = normalize(gl_ModelViewMatrix * vec4(gl_Normal, 0.0)); @@ -54,4 +48,3 @@ void main(void) { // use standard pipeline transform gl_Position = ftransform(); } -*/ From d8aa0e01381399eb9a547d1b5fc4f63cb4fea8cb Mon Sep 17 00:00:00 2001 From: Sam Gateau Date: Tue, 17 Feb 2015 09:44:03 -0800 Subject: [PATCH 05/21] replacing the glTransform pipeline for model rendering --- libraries/gpu/src/gpu/Config.slh | 3 +- libraries/gpu/src/gpu/Context.h | 2 +- libraries/gpu/src/gpu/GLBackend.cpp | 55 +++++++++++++++++-- libraries/gpu/src/gpu/GLBackendShared.h | 4 +- libraries/gpu/src/gpu/Transform.slh | 21 ++++--- .../render-utils/src/DeferredGlobalLight.slh | 7 ++- libraries/render-utils/src/Model.cpp | 13 +++++ libraries/render-utils/src/model.slv | 13 ++++- 8 files changed, 95 insertions(+), 23 deletions(-) diff --git a/libraries/gpu/src/gpu/Config.slh b/libraries/gpu/src/gpu/Config.slh index 0ef68c9fd0..89be6a4f54 100644 --- a/libraries/gpu/src/gpu/Config.slh +++ b/libraries/gpu/src/gpu/Config.slh @@ -12,7 +12,8 @@ <@def GPU_CONFIG_SLH@> <@if GLPROFILE == PC_GL @> - <@def VERSION_HEADER #version 330 compatibility@> + <@def VERSION_HEADER #version 410 compatibility +#@> <@func inputPosition name@> layout(location = 0) in vec3 <$name$>; diff --git a/libraries/gpu/src/gpu/Context.h b/libraries/gpu/src/gpu/Context.h index 2bbf9ea032..c426a28d90 100644 --- a/libraries/gpu/src/gpu/Context.h +++ b/libraries/gpu/src/gpu/Context.h @@ -39,9 +39,9 @@ public: class TransformCamera { public: + Mat4 _projection; Mat4 _view; Mat4 _viewInverse; - Mat4 _projection; }; template< typename T > diff --git a/libraries/gpu/src/gpu/GLBackend.cpp b/libraries/gpu/src/gpu/GLBackend.cpp index 4473b00341..6b73782798 100644 --- a/libraries/gpu/src/gpu/GLBackend.cpp +++ b/libraries/gpu/src/gpu/GLBackend.cpp @@ -73,11 +73,11 @@ GLBackend::GLBackend() : _input(), _transform() { - + initTransform(); } GLBackend::~GLBackend() { - + killTransform(); } void GLBackend::render(Batch& batch) { @@ -420,7 +420,6 @@ void GLBackend::killTransform() { #else #endif } -#define LEGACY_TRANSFORM_PIPELINE 1 void GLBackend::updateTransform() { #ifdef LEGACY_TRANSFORM_PIPELINE @@ -496,16 +495,62 @@ void GLBackend::updateTransform() { glBindBuffer(GL_UNIFORM_BUFFER, _transform._transformCameraBuffer); glBufferSubData(GL_UNIFORM_BUFFER, 0, sizeof(_transform._transformCamera), (const void*) &_transform._transformCamera); glBindBuffer(GL_UNIFORM_BUFFER, 0); + CHECK_GL_ERROR(); } if (_transform._invalidView || _transform._invalidModel) { glBindBuffer(GL_UNIFORM_BUFFER, _transform._transformObjectBuffer); glBufferSubData(GL_UNIFORM_BUFFER, 0, sizeof(_transform._transformObject), (const void*) &_transform._transformObject); glBindBuffer(GL_UNIFORM_BUFFER, 0); + CHECK_GL_ERROR(); } - glBindBufferRange(GL_UNIFORM_BUFFER, 0, _transform._transformCameraBuffer, 0, sizeof(TransformCamera)); - glBindBufferRange(GL_UNIFORM_BUFFER, 1, _transform._transformObjectBuffer, 0, sizeof(TransformObject)); + glBindBufferRange(GL_UNIFORM_BUFFER, 6, _transform._transformObjectBuffer, 0, sizeof(TransformObject)); + glBindBufferRange(GL_UNIFORM_BUFFER, 7, _transform._transformCameraBuffer, 0, sizeof(TransformCamera)); + CHECK_GL_ERROR(); + + // Do it again for fixed pipeline unitl we can get rid of it + if (_transform._invalidProj) { + if (_transform._lastMode != GL_PROJECTION) { + glMatrixMode(GL_PROJECTION); + _transform._lastMode = GL_PROJECTION; + } + glLoadMatrixf(reinterpret_cast< const GLfloat* >(&_transform._projection)); + + CHECK_GL_ERROR(); + } + + if (_transform._invalidModel || _transform._invalidView) { + if (!_transform._model.isIdentity()) { + if (_transform._lastMode != GL_MODELVIEW) { + glMatrixMode(GL_MODELVIEW); + _transform._lastMode = GL_MODELVIEW; + } + Transform::Mat4 modelView; + if (!_transform._view.isIdentity()) { + Transform mvx; + Transform::inverseMult(mvx, _transform._view, _transform._model); + mvx.getMatrix(modelView); + } else { + _transform._model.getMatrix(modelView); + } + glLoadMatrixf(reinterpret_cast< const GLfloat* >(&modelView)); + } else { + if (!_transform._view.isIdentity()) { + if (_transform._lastMode != GL_MODELVIEW) { + glMatrixMode(GL_MODELVIEW); + _transform._lastMode = GL_MODELVIEW; + } + Transform::Mat4 modelView; + _transform._view.getInverseMatrix(modelView); + glLoadMatrixf(reinterpret_cast< const GLfloat* >(&modelView)); + } else { + // TODO: eventually do something about the matrix when neither view nor model is specified? + // glLoadIdentity(); + } + } + CHECK_GL_ERROR(); + } _transform._invalidView = _transform._invalidProj = _transform._invalidModel = false; #endif diff --git a/libraries/gpu/src/gpu/GLBackendShared.h b/libraries/gpu/src/gpu/GLBackendShared.h index f0f691f708..1853573522 100644 --- a/libraries/gpu/src/gpu/GLBackendShared.h +++ b/libraries/gpu/src/gpu/GLBackendShared.h @@ -49,7 +49,7 @@ static const GLenum _elementTypeToGLType[NUM_TYPES]= { GL_UNSIGNED_BYTE }; -//#define CHECK_GL_ERROR() ::gpu::GLBackend::checkGLError() -#define CHECK_GL_ERROR() +#define CHECK_GL_ERROR() ::gpu::GLBackend::checkGLError() +//#define CHECK_GL_ERROR() #endif diff --git a/libraries/gpu/src/gpu/Transform.slh b/libraries/gpu/src/gpu/Transform.slh index 1ae422cd08..9666a4f258 100644 --- a/libraries/gpu/src/gpu/Transform.slh +++ b/libraries/gpu/src/gpu/Transform.slh @@ -18,10 +18,9 @@ struct TransformObject { }; struct TransformCamera { + mat4 _projection; mat4 _view; mat4 _viewInverse; - mat4 _projection; - }; vec4 transform(TransformCamera camera, TransformObject object, vec4 pos) { @@ -29,13 +28,20 @@ vec4 transform(TransformCamera camera, TransformObject object, vec4 pos) { } - -uniform transformStateBuffer { - TransformState xform; +uniform transformObjectBuffer { + TransformObject object; }; -TransformState getTransformState() { - return xform; +TransformObject getTransformObject() { + return object; +} + +uniform transformCameraBuffer { + TransformCamera camera; +}; +TransformCamera getTransformCamera() { + return camera; } <@elif GLPROFILE == MAC_GL@> uniform vec4 transformStateBuffer[2]; @@ -54,7 +60,6 @@ TransformState getMaterial() { return xform; } <@endif@> -!> <@endif@> diff --git a/libraries/render-utils/src/DeferredGlobalLight.slh b/libraries/render-utils/src/DeferredGlobalLight.slh index 6657100e6f..7f2190d3f1 100755 --- a/libraries/render-utils/src/DeferredGlobalLight.slh +++ b/libraries/render-utils/src/DeferredGlobalLight.slh @@ -96,10 +96,11 @@ vec3 evalLightmappedColor(float shadowAttenuation, vec3 normal, vec3 diffuse, ve Light light = getLight(); - vec3 fragNormal = vec3(invViewMat * vec4(normal, 0.0)); + //vec3 fragNormal = vec3(invViewMat * vec4(normal, 0.0)); + + // float diffuseDot = dot(fragNormal, getLightDirection(light)); + float diffuseDot = dot(normal, getLightDirection(light)); - float diffuseDot = dot(fragNormal, getLightDirection(light)); - // need to catch normals perpendicular to the projection plane hence the magic number for the threshold // it should be just 0, but we have innacurracy so we need to overshoot const float PERPENDICULAR_THRESHOLD = -0.005; diff --git a/libraries/render-utils/src/Model.cpp b/libraries/render-utils/src/Model.cpp index 05ae810f6c..fb64a8410a 100644 --- a/libraries/render-utils/src/Model.cpp +++ b/libraries/render-utils/src/Model.cpp @@ -223,6 +223,19 @@ void Model::initProgram(ProgramObject& program, Model::Locations& locations, boo } #endif + loc = glGetUniformBlockIndex(program.programId(), "transformObjectBuffer"); + if (loc >= 0) { + glUniformBlockBinding(program.programId(), loc, 6); + // locations.materialBufferUnit = 1; + } + + loc = glGetUniformBlockIndex(program.programId(), "transformCameraBuffer"); + if (loc >= 0) { + glUniformBlockBinding(program.programId(), loc, 7); + // locations.materialBufferUnit = 1; + } + + program.link(); if (!program.isLinked()) { program.release(); } diff --git a/libraries/render-utils/src/model.slv b/libraries/render-utils/src/model.slv index f3f52ad990..1191dbed39 100755 --- a/libraries/render-utils/src/model.slv +++ b/libraries/render-utils/src/model.slv @@ -11,14 +11,14 @@ // See the accompanying file LICENSE or http://www.apache.org/licenses/LICENSE-2.0.html // -//include gpu/Transform.slh +<@include gpu/Transform.slh@> const int MAX_TEXCOORDS = 2; uniform mat4 texcoordMatrices[MAX_TEXCOORDS]; // the interpolated normal varying vec4 normal; -/* +/* void main(void) { // transform and store the normal for interpolation normal = normalize(gl_ModelViewMatrix * vec4(gl_Normal, 0.0)); @@ -46,5 +46,12 @@ void main(void) { gl_TexCoord[0] = texcoordMatrices[0] * vec4(gl_MultiTexCoord0.xy, 0.0, 1.0); // use standard pipeline transform - gl_Position = ftransform(); + //gl_Position = ftransform(); + //gl_Position = gl_ModelViewProjectionMatrix * gl_Vertex; + // TransformObject obj = getTransformObject(); + TransformCamera cam = getTransformCamera(); + // gl_Position = transform(cam, obj, gl_Vertex); + + vec4 vPos = gl_ModelViewMatrix * gl_Vertex; + gl_Position = cam._projection * vPos; } From 11060ed2739d915be6d174217964c0c62922dc42 Mon Sep 17 00:00:00 2001 From: Sam Gateau Date: Wed, 18 Feb 2015 16:00:37 -0800 Subject: [PATCH 06/21] trying to tackle the unenderstood transform value not going through corectly? --- libraries/gpu/src/gpu/GLBackend.cpp | 18 ++++++++++-------- libraries/model/src/model/Material.slh | 4 ++-- libraries/render-utils/src/Model.cpp | 4 ++-- libraries/render-utils/src/model.slv | 9 +++++---- 4 files changed, 19 insertions(+), 16 deletions(-) diff --git a/libraries/gpu/src/gpu/GLBackend.cpp b/libraries/gpu/src/gpu/GLBackend.cpp index 6b73782798..680ffe64b0 100644 --- a/libraries/gpu/src/gpu/GLBackend.cpp +++ b/libraries/gpu/src/gpu/GLBackend.cpp @@ -492,21 +492,23 @@ void GLBackend::updateTransform() { } if (_transform._invalidView || _transform._invalidProj) { - glBindBuffer(GL_UNIFORM_BUFFER, _transform._transformCameraBuffer); - glBufferSubData(GL_UNIFORM_BUFFER, 0, sizeof(_transform._transformCamera), (const void*) &_transform._transformCamera); - glBindBuffer(GL_UNIFORM_BUFFER, 0); + glBindBufferBase(GL_UNIFORM_BUFFER, 2, 0); + glBindBuffer(GL_ARRAY_BUFFER, _transform._transformCameraBuffer); + glBufferData(GL_ARRAY_BUFFER, sizeof(_transform._transformCamera), (const void*) &_transform._transformCamera, GL_DYNAMIC_DRAW); + glBindBuffer(GL_ARRAY_BUFFER, 0); CHECK_GL_ERROR(); } if (_transform._invalidView || _transform._invalidModel) { - glBindBuffer(GL_UNIFORM_BUFFER, _transform._transformObjectBuffer); - glBufferSubData(GL_UNIFORM_BUFFER, 0, sizeof(_transform._transformObject), (const void*) &_transform._transformObject); - glBindBuffer(GL_UNIFORM_BUFFER, 0); + glBindBufferBase(GL_UNIFORM_BUFFER, 6, 0); + glBindBuffer(GL_ARRAY_BUFFER, _transform._transformObjectBuffer); + glBufferData(GL_ARRAY_BUFFER, sizeof(_transform._transformObject), (const void*) &_transform._transformObject, GL_DYNAMIC_DRAW); + glBindBuffer(GL_ARRAY_BUFFER, 0); CHECK_GL_ERROR(); } - glBindBufferRange(GL_UNIFORM_BUFFER, 6, _transform._transformObjectBuffer, 0, sizeof(TransformObject)); - glBindBufferRange(GL_UNIFORM_BUFFER, 7, _transform._transformCameraBuffer, 0, sizeof(TransformCamera)); + glBindBufferBase(GL_UNIFORM_BUFFER, 6, _transform._transformObjectBuffer); + glBindBufferBase(GL_UNIFORM_BUFFER, 2, _transform._transformCameraBuffer); CHECK_GL_ERROR(); // Do it again for fixed pipeline unitl we can get rid of it diff --git a/libraries/model/src/model/Material.slh b/libraries/model/src/model/Material.slh index 403a4161e8..9ea269f214 100644 --- a/libraries/model/src/model/Material.slh +++ b/libraries/model/src/model/Material.slh @@ -26,10 +26,10 @@ float getMaterialShininess(Material m) { return m._specular.a; } <@if GLPROFILE == PC_GL@> uniform materialBuffer { - Material mat; + Material _mat; }; Material getMaterial() { - return mat; + return _mat; } <@elif GLPROFILE == MAC_GL@> uniform vec4 materialBuffer[2]; diff --git a/libraries/render-utils/src/Model.cpp b/libraries/render-utils/src/Model.cpp index fb64a8410a..fb26f7f9dc 100644 --- a/libraries/render-utils/src/Model.cpp +++ b/libraries/render-utils/src/Model.cpp @@ -231,11 +231,11 @@ void Model::initProgram(ProgramObject& program, Model::Locations& locations, boo loc = glGetUniformBlockIndex(program.programId(), "transformCameraBuffer"); if (loc >= 0) { - glUniformBlockBinding(program.programId(), loc, 7); + glUniformBlockBinding(program.programId(), loc, 2); // locations.materialBufferUnit = 1; } - program.link(); + //program.link(); if (!program.isLinked()) { program.release(); } diff --git a/libraries/render-utils/src/model.slv b/libraries/render-utils/src/model.slv index 1191dbed39..7f97e429d9 100755 --- a/libraries/render-utils/src/model.slv +++ b/libraries/render-utils/src/model.slv @@ -48,10 +48,11 @@ void main(void) { // use standard pipeline transform //gl_Position = ftransform(); //gl_Position = gl_ModelViewProjectionMatrix * gl_Vertex; - // TransformObject obj = getTransformObject(); - TransformCamera cam = getTransformCamera(); + //gl_Position = gl_ProjectionMatrix * gl_ModelViewMatrix * gl_Vertex; + //TransformCamera cam = getTransformCamera(); + /* TransformObject obj = getTransformObject(); // gl_Position = transform(cam, obj, gl_Vertex); - + */ vec4 vPos = gl_ModelViewMatrix * gl_Vertex; - gl_Position = cam._projection * vPos; + gl_Position = camera._projection * vPos; } From 7e04f8a491f487cf33fd431c41fb3cf9c05bb225 Mon Sep 17 00:00:00 2001 From: Sam Gateau Date: Thu, 19 Feb 2015 09:52:58 -0800 Subject: [PATCH 07/21] Model almost working with Transform --- libraries/gpu/src/gpu/Transform.slh | 7 +++++-- libraries/render-utils/src/model.slv | 16 ++++++++-------- 2 files changed, 13 insertions(+), 10 deletions(-) diff --git a/libraries/gpu/src/gpu/Transform.slh b/libraries/gpu/src/gpu/Transform.slh index 9666a4f258..3b0feb5ba1 100644 --- a/libraries/gpu/src/gpu/Transform.slh +++ b/libraries/gpu/src/gpu/Transform.slh @@ -12,7 +12,7 @@ struct TransformObject { mat4 _model; - mat4 _modelInverseTranspose; + mat4 _modelInverse; mat4 _modelView; mat4 _modelViewInverseTranspose; }; @@ -24,10 +24,13 @@ struct TransformCamera { }; vec4 transform(TransformCamera camera, TransformObject object, vec4 pos) { + return camera._projection * (object._modelView * pos); } - +vec3 transformDir(TransformCamera camera, TransformObject object, vec3 dir) { + return (object._modelViewInverseTranspose * vec4(dir, 0.0)).xyz; +} <@if GLPROFILE == PC_GL@> uniform transformObjectBuffer { diff --git a/libraries/render-utils/src/model.slv b/libraries/render-utils/src/model.slv index 7f97e429d9..42fec40e55 100755 --- a/libraries/render-utils/src/model.slv +++ b/libraries/render-utils/src/model.slv @@ -36,8 +36,6 @@ void main(void) { void main(void) { - // transform and store the normal for interpolation - normal = normalize(gl_ModelViewMatrix * vec4(gl_Normal, 0.0)); // pass along the diffuse color gl_FrontColor = gl_Color; @@ -49,10 +47,12 @@ void main(void) { //gl_Position = ftransform(); //gl_Position = gl_ModelViewProjectionMatrix * gl_Vertex; //gl_Position = gl_ProjectionMatrix * gl_ModelViewMatrix * gl_Vertex; - //TransformCamera cam = getTransformCamera(); - /* TransformObject obj = getTransformObject(); - // gl_Position = transform(cam, obj, gl_Vertex); - */ - vec4 vPos = gl_ModelViewMatrix * gl_Vertex; - gl_Position = camera._projection * vPos; + TransformCamera cam = getTransformCamera(); + TransformObject obj = getTransformObject(); + + gl_Position = transform(cam, obj, gl_Vertex); + + // transform and store the normal for interpolation + normal = vec4(normalize(transformDir(cam, obj, gl_Normal)), 0.0); + } From d08142d37dfa2be09310b40e8db0fc0abda280a4 Mon Sep 17 00:00:00 2001 From: Sam Gateau Date: Thu, 19 Feb 2015 15:12:13 -0800 Subject: [PATCH 08/21] replacing glTRansform by gpu/Transform features --- libraries/gpu/src/gpu/Context.h | 3 +-- libraries/gpu/src/gpu/GLBackend.cpp | 11 ++++---- libraries/gpu/src/gpu/Transform.slh | 25 +++++++++++++++---- libraries/render-utils/src/model.slv | 21 +--------------- libraries/render-utils/src/model_lightmap.slv | 15 +++++++---- .../src/model_lightmap_normal_map.slv | 15 ++++++++--- .../render-utils/src/model_normal_map.slv | 17 ++++++++++--- libraries/render-utils/src/model_shadow.slv | 7 ++++-- libraries/render-utils/src/skin_model.slv | 15 ++++++++--- .../src/skin_model_normal_map.slv | 15 +++++++++-- .../render-utils/src/skin_model_shadow.slv | 9 ++++++- libraries/shared/src/Transform.h | 14 +++++++++++ 12 files changed, 113 insertions(+), 54 deletions(-) diff --git a/libraries/gpu/src/gpu/Context.h b/libraries/gpu/src/gpu/Context.h index c426a28d90..bd5da57504 100644 --- a/libraries/gpu/src/gpu/Context.h +++ b/libraries/gpu/src/gpu/Context.h @@ -33,8 +33,6 @@ public: public: Mat4 _model; Mat4 _modelInverse; - Mat4 _modelView; - Mat4 _modelViewInverseTranspose; }; class TransformCamera { @@ -42,6 +40,7 @@ public: Mat4 _projection; Mat4 _view; Mat4 _viewInverse; + Mat4 _projectionViewUntranslated; }; template< typename T > diff --git a/libraries/gpu/src/gpu/GLBackend.cpp b/libraries/gpu/src/gpu/GLBackend.cpp index 680ffe64b0..f4f73abb45 100644 --- a/libraries/gpu/src/gpu/GLBackend.cpp +++ b/libraries/gpu/src/gpu/GLBackend.cpp @@ -484,11 +484,10 @@ void GLBackend::updateTransform() { _transform._model.getInverseMatrix(_transform._transformObject._modelInverse); } - if (_transform._invalidView || _transform._invalidModel) { - Transform mvx; - Transform::inverseMult(mvx, _transform._view, _transform._model); - mvx.getMatrix(_transform._transformObject._modelView); - mvx.getInverseTransposeMatrix(_transform._transformObject._modelViewInverseTranspose); + if (_transform._invalidView || _transform._invalidProj) { + Mat4 viewUntranslated = _transform._transformCamera._view; + // viewUntranslated[3] = Vec4(0.0f, 0.0f, 0.0f, 1.0f); + _transform._transformCamera._projectionViewUntranslated = _transform._transformCamera._projection * viewUntranslated; } if (_transform._invalidView || _transform._invalidProj) { @@ -499,7 +498,7 @@ void GLBackend::updateTransform() { CHECK_GL_ERROR(); } - if (_transform._invalidView || _transform._invalidModel) { + if (_transform._invalidModel) { glBindBufferBase(GL_UNIFORM_BUFFER, 6, 0); glBindBuffer(GL_ARRAY_BUFFER, _transform._transformObjectBuffer); glBufferData(GL_ARRAY_BUFFER, sizeof(_transform._transformObject), (const void*) &_transform._transformObject, GL_DYNAMIC_DRAW); diff --git a/libraries/gpu/src/gpu/Transform.slh b/libraries/gpu/src/gpu/Transform.slh index 3b0feb5ba1..d2c1390294 100644 --- a/libraries/gpu/src/gpu/Transform.slh +++ b/libraries/gpu/src/gpu/Transform.slh @@ -13,23 +13,38 @@ struct TransformObject { mat4 _model; mat4 _modelInverse; - mat4 _modelView; - mat4 _modelViewInverseTranspose; }; struct TransformCamera { mat4 _projection; mat4 _view; mat4 _viewInverse; + mat4 _projectionViewUntranslated; }; vec4 transform(TransformCamera camera, TransformObject object, vec4 pos) { - - return camera._projection * (object._modelView * 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; } vec3 transformDir(TransformCamera camera, TransformObject object, vec3 dir) { - return (object._modelViewInverseTranspose * vec4(dir, 0.0)).xyz; + 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); + + vec3 mvIc0 = vec3(dot(camera._viewInverse[0].xyz, mIr0), dot(camera._viewInverse[0].xyz, mIr1), dot(camera._viewInverse[0].xyz, mIr2)); + vec3 mvIc1 = vec3(dot(camera._viewInverse[1].xyz, mIr0), dot(camera._viewInverse[1].xyz, mIr1), dot(camera._viewInverse[1].xyz, mIr2)); + vec3 mvIc2 = vec3(dot(camera._viewInverse[2].xyz, mIr0), dot(camera._viewInverse[2].xyz, mIr1), dot(camera._viewInverse[2].xyz, mIr2)); + + vec3 result = vec3(dot(mvIc0, dir), + dot(mvIc1, dir), + dot(mvIc2, dir)); + + return result; } <@if GLPROFILE == PC_GL@> diff --git a/libraries/render-utils/src/model.slv b/libraries/render-utils/src/model.slv index 42fec40e55..5f2bfe5f9d 100755 --- a/libraries/render-utils/src/model.slv +++ b/libraries/render-utils/src/model.slv @@ -18,22 +18,6 @@ uniform mat4 texcoordMatrices[MAX_TEXCOORDS]; // the interpolated normal varying vec4 normal; -/* -void main(void) { - // transform and store the normal for interpolation - normal = normalize(gl_ModelViewMatrix * vec4(gl_Normal, 0.0)); - - // 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); - - // use standard pipeline transform - gl_Position = gl_ModelViewProjectionMatrix * vec4(vin_position, 1.0); -} -*/ - void main(void) { @@ -42,11 +26,8 @@ void main(void) { // and the texture coordinates gl_TexCoord[0] = texcoordMatrices[0] * vec4(gl_MultiTexCoord0.xy, 0.0, 1.0); - + // use standard pipeline transform - //gl_Position = ftransform(); - //gl_Position = gl_ModelViewProjectionMatrix * gl_Vertex; - //gl_Position = gl_ProjectionMatrix * gl_ModelViewMatrix * gl_Vertex; TransformCamera cam = getTransformCamera(); TransformObject obj = getTransformObject(); diff --git a/libraries/render-utils/src/model_lightmap.slv b/libraries/render-utils/src/model_lightmap.slv index 53da84de73..3adca397c2 100755 --- a/libraries/render-utils/src/model_lightmap.slv +++ b/libraries/render-utils/src/model_lightmap.slv @@ -12,6 +12,8 @@ // See the accompanying file LICENSE or http://www.apache.org/licenses/LICENSE-2.0.html // +<@include gpu/Transform.slh@> + const int MAX_TEXCOORDS = 2; uniform mat4 texcoordMatrices[MAX_TEXCOORDS]; @@ -25,9 +27,6 @@ varying vec4 normal; varying vec2 interpolatedTexcoord1; void main(void) { - // transform and store the normal for interpolation - normal = normalize(gl_ModelViewMatrix * vec4(gl_Normal, 0.0)); - // pass along the diffuse color gl_FrontColor = gl_Color; @@ -35,8 +34,14 @@ void main(void) { gl_TexCoord[0] = texcoordMatrices[0] * vec4(gl_MultiTexCoord0.xy, 0.0, 1.0); // 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 - gl_Position = ftransform(); + TransformCamera cam = getTransformCamera(); + TransformObject obj = getTransformObject(); + + gl_Position = transform(cam, obj, gl_Vertex); + + // transform and store the normal for interpolation + normal = vec4(normalize(transformDir(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 f4f5e72167..be86655f75 100755 --- a/libraries/render-utils/src/model_lightmap_normal_map.slv +++ b/libraries/render-utils/src/model_lightmap_normal_map.slv @@ -12,6 +12,8 @@ // See the accompanying file LICENSE or http://www.apache.org/licenses/LICENSE-2.0.html // +<@include gpu/Transform.slh@> + const int MAX_TEXCOORDS = 2; uniform mat4 texcoordMatrices[MAX_TEXCOORDS]; @@ -32,8 +34,8 @@ varying vec2 interpolatedTexcoord1; void main(void) { // transform and store the normal and tangent for interpolation - interpolatedNormal = gl_ModelViewMatrix * vec4(gl_Normal, 0.0); - interpolatedTangent = gl_ModelViewMatrix * vec4(tangent, 0.0); + //interpolatedNormal = gl_ModelViewMatrix * vec4(gl_Normal, 0.0); + //interpolatedTangent = gl_ModelViewMatrix * vec4(tangent, 0.0); // pass along the diffuse color gl_FrontColor = gl_Color; @@ -43,5 +45,12 @@ void main(void) { interpolatedTexcoord1 = vec2(texcoordMatrices[1] * vec4(texcoord1.xy, 0.0, 1.0)).xy; // use standard pipeline transform - gl_Position = ftransform(); + TransformCamera cam = getTransformCamera(); + TransformObject obj = getTransformObject(); + + gl_Position = transform(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); } diff --git a/libraries/render-utils/src/model_normal_map.slv b/libraries/render-utils/src/model_normal_map.slv index 582f1b1abb..dbb87473b8 100755 --- a/libraries/render-utils/src/model_normal_map.slv +++ b/libraries/render-utils/src/model_normal_map.slv @@ -12,6 +12,8 @@ // See the accompanying file LICENSE or http://www.apache.org/licenses/LICENSE-2.0.html // +<@include gpu/Transform.slh@> + const int MAX_TEXCOORDS = 2; uniform mat4 texcoordMatrices[MAX_TEXCOORDS]; @@ -27,8 +29,8 @@ varying vec4 interpolatedTangent; void main(void) { // transform and store the normal and tangent for interpolation - interpolatedNormal = gl_ModelViewMatrix * vec4(gl_Normal, 0.0); - interpolatedTangent = gl_ModelViewMatrix * vec4(tangent, 0.0); + //interpolatedNormal = gl_ModelViewMatrix * vec4(gl_Normal, 0.0); + //interpolatedTangent = gl_ModelViewMatrix * vec4(tangent, 0.0); // pass along the diffuse color gl_FrontColor = gl_Color; @@ -36,6 +38,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 - gl_Position = ftransform(); + // use standard pipeline transform + TransformCamera cam = getTransformCamera(); + TransformObject obj = getTransformObject(); + + gl_Position = transform(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); } diff --git a/libraries/render-utils/src/model_shadow.slv b/libraries/render-utils/src/model_shadow.slv index b05a92b155..5d386d4d4c 100755 --- a/libraries/render-utils/src/model_shadow.slv +++ b/libraries/render-utils/src/model_shadow.slv @@ -11,8 +11,11 @@ // Distributed under the Apache License, Version 2.0. // See the accompanying file LICENSE or http://www.apache.org/licenses/LICENSE-2.0.html // +<@include gpu/Transform.slh@> void main(void) { - // just use standard pipeline transform - gl_Position = ftransform(); + // use standard pipeline transform + TransformCamera cam = getTransformCamera(); + TransformObject obj = getTransformObject(); + gl_Position = transform(cam, obj, gl_Vertex); } diff --git a/libraries/render-utils/src/skin_model.slv b/libraries/render-utils/src/skin_model.slv index 737fa85bf0..08aff5724b 100755 --- a/libraries/render-utils/src/skin_model.slv +++ b/libraries/render-utils/src/skin_model.slv @@ -12,6 +12,8 @@ // See the accompanying file LICENSE or http://www.apache.org/licenses/LICENSE-2.0.html // +<@include gpu/Transform.slh@> + const int MAX_TEXCOORDS = 2; const int MAX_CLUSTERS = 128; const int INDICES_PER_VERTEX = 4; @@ -34,14 +36,19 @@ void main(void) { position += clusterMatrix * gl_Vertex * clusterWeight; normal += clusterMatrix * vec4(gl_Normal, 0.0) * clusterWeight; } - - normal = normalize(gl_ModelViewMatrix * normal); - + // 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 * position; + // use standard pipeline transform + TransformCamera cam = getTransformCamera(); + TransformObject obj = getTransformObject(); + + gl_Position = transform(cam, obj, position); + + // transform and store the normal for interpolation + normal = vec4(normalize(transformDir(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 3db63f9d98..404e9c625d 100755 --- a/libraries/render-utils/src/skin_model_normal_map.slv +++ b/libraries/render-utils/src/skin_model_normal_map.slv @@ -12,6 +12,8 @@ // See the accompanying file LICENSE or http://www.apache.org/licenses/LICENSE-2.0.html // +<@include gpu/Transform.slh@> + const int MAX_TEXCOORDS = 2; const int MAX_CLUSTERS = 128; const int INDICES_PER_VERTEX = 4; @@ -42,8 +44,8 @@ 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; + // interpolatedNormal = gl_ModelViewMatrix * interpolatedNormal; + // interpolatedTangent = gl_ModelViewMatrix * interpolatedTangent; // pass along the diffuse color gl_FrontColor = gl_Color; @@ -52,4 +54,13 @@ void main(void) { gl_TexCoord[0] = texcoordMatrices[0] * vec4(gl_MultiTexCoord0.xy, 0.0, 1.0); gl_Position = gl_ModelViewProjectionMatrix * interpolatedPosition; + + // use standard pipeline transform + TransformCamera cam = getTransformCamera(); + TransformObject obj = getTransformObject(); + + gl_Position = transform(cam, obj, interpolatedPosition); + + interpolatedNormal = vec4(normalize(transformDir(cam, obj, interpolatedNormal.xyz)), 0.0); + interpolatedTangent = vec4(normalize(transformDir(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 3625d4006a..ee21f96f45 100755 --- a/libraries/render-utils/src/skin_model_shadow.slv +++ b/libraries/render-utils/src/skin_model_shadow.slv @@ -12,6 +12,8 @@ // See the accompanying file LICENSE or http://www.apache.org/licenses/LICENSE-2.0.html // +<@include gpu/Transform.slh@> + const int MAX_CLUSTERS = 128; const int INDICES_PER_VERTEX = 4; @@ -27,5 +29,10 @@ void main(void) { float clusterWeight = clusterWeights[i]; position += clusterMatrix * gl_Vertex * clusterWeight; } - gl_Position = gl_ModelViewProjectionMatrix * position; + + // use standard pipeline transform + TransformCamera cam = getTransformCamera(); + TransformObject obj = getTransformObject(); + + gl_Position = transform(cam, obj, position); } diff --git a/libraries/shared/src/Transform.h b/libraries/shared/src/Transform.h index 4f5f441170..ec4513e51c 100644 --- a/libraries/shared/src/Transform.h +++ b/libraries/shared/src/Transform.h @@ -92,6 +92,9 @@ public: Mat4& getInverseMatrix(Mat4& result) const; Mat4& getInverseTransposeMatrix(Mat4& result) const; + Mat4& getRotationScaleMatrix(Mat4& result) const; + Mat4& getRotationScaleMatrixInverse(Mat4& result) const; + Transform& evalInverse(Transform& result) const; static void evalRotationScale(Quat& rotation, Vec3& scale, const Mat3& rotationScaleMatrix); @@ -336,6 +339,17 @@ inline Transform::Mat4& Transform::getInverseTransposeMatrix(Transform::Mat4& re return result; } +inline Transform::Mat4& Transform::getRotationScaleMatrix(Mat4& result) const { + getMatrix(result); + result[3] = Vec4(0.0f, 0.0f, 0.0f, 1.0f); + return result; +} + +inline Transform::Mat4& Transform::getRotationScaleMatrixInverse(Mat4& result) const { + getInverseMatrix(result); + result[3] = Vec4(0.0f, 0.0f, 0.0f, 1.0f); + return result; +} inline void Transform::evalFromRawMatrix(const Mat4& matrix) { // for now works only in the case of TRS transformation From ded78816b52e1efafa0d2bde39de78d4a81181a7 Mon Sep 17 00:00:00 2001 From: Sam Gateau Date: Fri, 20 Feb 2015 11:26:08 -0800 Subject: [PATCH 09/21] Fixing the remaining issue with the avatar rendering path --- libraries/gpu/src/gpu/Context.h | 3 ++- libraries/gpu/src/gpu/GLBackend.cpp | 2 +- libraries/gpu/src/gpu/Transform.slh | 17 ++++++++--------- libraries/render-utils/src/Model.cpp | 9 ++++----- libraries/render-utils/src/model.slv | 5 ++--- libraries/render-utils/src/model_lightmap.slv | 5 ++--- .../src/model_lightmap_normal_map.slv | 7 +++---- libraries/render-utils/src/model_normal_map.slv | 7 +++---- libraries/render-utils/src/model_shadow.slv | 2 +- libraries/render-utils/src/skin_model.slv | 5 ++--- .../render-utils/src/skin_model_normal_map.slv | 7 +++---- .../render-utils/src/skin_model_shadow.slv | 3 +-- 12 files changed, 32 insertions(+), 40 deletions(-) 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); } From 4e2d2bc1881556681d31e96897ac866eead1c7ed Mon Sep 17 00:00:00 2001 From: Sam Gateau Date: Fri, 20 Feb 2015 12:05:06 -0800 Subject: [PATCH 10/21] Fixing the remaining issue with the avatar rendering path --- libraries/gpu/src/gpu/Batch.h | 5 ++ libraries/gpu/src/gpu/GLBackend.cpp | 82 ++++++++-------------------- libraries/render-utils/src/Model.cpp | 4 +- 3 files changed, 30 insertions(+), 61 deletions(-) diff --git a/libraries/gpu/src/gpu/Batch.h b/libraries/gpu/src/gpu/Batch.h index b9467f7fdc..310cd9fe16 100644 --- a/libraries/gpu/src/gpu/Batch.h +++ b/libraries/gpu/src/gpu/Batch.h @@ -53,6 +53,11 @@ enum Primitive { NUM_PRIMITIVES, }; +enum ReservedSlot { + TRANSFORM_OBJECT_SLOT = 6, + TRANSFORM_CAMERA_SLOT = 7, +}; + class Batch { public: typedef Stream::Slot Slot; diff --git a/libraries/gpu/src/gpu/GLBackend.cpp b/libraries/gpu/src/gpu/GLBackend.cpp index 3208b314e9..fd91e0df0c 100644 --- a/libraries/gpu/src/gpu/GLBackend.cpp +++ b/libraries/gpu/src/gpu/GLBackend.cpp @@ -421,55 +421,7 @@ void GLBackend::killTransform() { #endif } void GLBackend::updateTransform() { - -#ifdef LEGACY_TRANSFORM_PIPELINE - if (_transform._invalidProj) { - // TODO: implement the projection matrix assignment to gl state - if (_transform._lastMode != GL_PROJECTION) { - glMatrixMode(GL_PROJECTION); - _transform._lastMode = GL_PROJECTION; - } - glLoadMatrixf(reinterpret_cast< const GLfloat* >(&_transform._projection)); - - CHECK_GL_ERROR(); - } - - if (_transform._invalidModel || _transform._invalidView) { - if (!_transform._model.isIdentity()) { - if (_transform._lastMode != GL_MODELVIEW) { - glMatrixMode(GL_MODELVIEW); - _transform._lastMode = GL_MODELVIEW; - } - Transform::Mat4 modelView; - if (!_transform._view.isIdentity()) { - Transform mvx; - Transform::inverseMult(mvx, _transform._view, _transform._model); - mvx.getMatrix(modelView); - } else { - _transform._model.getMatrix(modelView); - } - glLoadMatrixf(reinterpret_cast< const GLfloat* >(&modelView)); - } else { - if (!_transform._view.isIdentity()) { - if (_transform._lastMode != GL_MODELVIEW) { - glMatrixMode(GL_MODELVIEW); - _transform._lastMode = GL_MODELVIEW; - } - Transform::Mat4 modelView; - _transform._view.getInverseMatrix(modelView); - glLoadMatrixf(reinterpret_cast< const GLfloat* >(&modelView)); - } else { - // TODO: eventually do something about the matrix when neither view nor model is specified? - // glLoadIdentity(); - } - } - CHECK_GL_ERROR(); - - _transform._invalidModel = false; - _transform._invalidView = false; - } -#else - + // Check all the dirty flags and update the state accordingly if (_transform._invalidProj) { _transform._transformCamera._projection = _transform._projection; } @@ -489,28 +441,39 @@ void GLBackend::updateTransform() { viewUntranslated[3] = Vec4(0.0f, 0.0f, 0.0f, 1.0f); _transform._transformCamera._projectionViewUntranslated = _transform._transformCamera._projection * viewUntranslated; } - + if (_transform._invalidView || _transform._invalidProj) { - glBindBufferBase(GL_UNIFORM_BUFFER, 2, 0); - glBindBuffer(GL_ARRAY_BUFFER, _transform._transformCameraBuffer); +#if defined(Q_OS_MAC) +#elif defined(Q_OS_WIN) + glBindBufferBase(GL_UNIFORM_BUFFER, TRANSFORM_CAMERA_SLOT, 0); + glBindBuffer(GL_ARRAY_BUFFER, _transform._transformCameraBuffer); glBufferData(GL_ARRAY_BUFFER, sizeof(_transform._transformCamera), (const void*) &_transform._transformCamera, GL_DYNAMIC_DRAW); glBindBuffer(GL_ARRAY_BUFFER, 0); CHECK_GL_ERROR(); +#endif } if (_transform._invalidModel) { - glBindBufferBase(GL_UNIFORM_BUFFER, 6, 0); +#if defined(Q_OS_MAC) +#elif defined(Q_OS_WIN) + glBindBufferBase(GL_UNIFORM_BUFFER, TRANSFORM_OBJECT_SLOT, 0); glBindBuffer(GL_ARRAY_BUFFER, _transform._transformObjectBuffer); glBufferData(GL_ARRAY_BUFFER, sizeof(_transform._transformObject), (const void*) &_transform._transformObject, GL_DYNAMIC_DRAW); glBindBuffer(GL_ARRAY_BUFFER, 0); CHECK_GL_ERROR(); +#endif } - glBindBufferBase(GL_UNIFORM_BUFFER, 6, _transform._transformObjectBuffer); - glBindBufferBase(GL_UNIFORM_BUFFER, 2, _transform._transformCameraBuffer); - CHECK_GL_ERROR(); +#if defined(Q_OS_MAC) +#elif defined(Q_OS_WIN) + glBindBufferBase(GL_UNIFORM_BUFFER, TRANSFORM_OBJECT_SLOT, _transform._transformObjectBuffer); + glBindBufferBase(GL_UNIFORM_BUFFER, TRANSFORM_CAMERA_SLOT, _transform._transformCameraBuffer); + CHECK_GL_ERROR(); +#endif - // Do it again for fixed pipeline unitl we can get rid of it + +#if defined(Q_OS_MAC) + // Do it again for fixed pipeline until we can get rid of it if (_transform._invalidProj) { if (_transform._lastMode != GL_PROJECTION) { glMatrixMode(GL_PROJECTION); @@ -552,9 +515,10 @@ void GLBackend::updateTransform() { } CHECK_GL_ERROR(); } - - _transform._invalidView = _transform._invalidProj = _transform._invalidModel = false; #endif + + // Flags are clean + _transform._invalidView = _transform._invalidProj = _transform._invalidModel = false; } void GLBackend::do_setUniformBuffer(Batch& batch, uint32 paramOffset) { diff --git a/libraries/render-utils/src/Model.cpp b/libraries/render-utils/src/Model.cpp index f64f58cf14..dd4d1ba9e7 100644 --- a/libraries/render-utils/src/Model.cpp +++ b/libraries/render-utils/src/Model.cpp @@ -225,13 +225,13 @@ void Model::initProgram(ProgramObject& program, Model::Locations& locations, boo loc = glGetUniformBlockIndex(program.programId(), "transformObjectBuffer"); if (loc >= 0) { - glUniformBlockBinding(program.programId(), loc, 6); + glUniformBlockBinding(program.programId(), loc, gpu::TRANSFORM_OBJECT_SLOT); // locations.materialBufferUnit = 1; } loc = glGetUniformBlockIndex(program.programId(), "transformCameraBuffer"); if (loc >= 0) { - glUniformBlockBinding(program.programId(), loc, 2); + glUniformBlockBinding(program.programId(), loc, gpu::TRANSFORM_CAMERA_SLOT); // locations.materialBufferUnit = 1; } From 987562976a5c09c703211440e70b57caebb61434 Mon Sep 17 00:00:00 2001 From: Sam Gateau Date: Fri, 20 Feb 2015 14:46:36 -0800 Subject: [PATCH 11/21] Fixing the remaining issue with the avatar rendering path --- libraries/gpu/src/gpu/Transform.slh | 39 ++++++++++++++++++++--------- 1 file changed, 27 insertions(+), 12 deletions(-) diff --git a/libraries/gpu/src/gpu/Transform.slh b/libraries/gpu/src/gpu/Transform.slh index b433f8282d..6f0154a07d 100644 --- a/libraries/gpu/src/gpu/Transform.slh +++ b/libraries/gpu/src/gpu/Transform.slh @@ -24,13 +24,21 @@ struct TransformCamera { }; vec4 transformModelToClipPos(TransformCamera camera, TransformObject object, vec4 pos) { +<@if GLPROFILE == MAC_GL@> + return gl_ModelViewProjectionMatrix * pos; +<@elif GLPROFILE == PC_GL@> 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; + +<@endif@> } vec3 transformModelToEyeDir(TransformCamera camera, TransformObject object, vec3 dir) { +<@if GLPROFILE == MAC_GL@> + return (gl_NormalMatrix * vec4(dir, 0.0)).xyz; +<@elif GLPROFILE == PC_GL@> 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); @@ -44,6 +52,7 @@ vec3 transformModelToEyeDir(TransformCamera camera, TransformObject object, vec3 dot(mvIc2, dir)); return result; +<@endif@> } <@if GLPROFILE == PC_GL@> @@ -61,21 +70,27 @@ TransformCamera getTransformCamera() { return camera; } <@elif GLPROFILE == MAC_GL@> -uniform vec4 transformStateBuffer[2]; -TransformState getTransformState() { - TransformState xform; - xform._diffuse = transformStateBuffer[0]; - xform._specular = transformStateBuffer[1]; - return xform; +TransformObject getTransformObject() { + TransformObject object; + return object; +} + +TransformCamera getTransformCamera() { + TransformCamera camera; + return camera; } <@else@> -uniform vec4 transformStateBuffer[2]; -TransformState getMaterial() { - TransformState xform; - xform._diffuse = transformStateBuffer[0]; - xform._specular = transformStateBuffer[1]; - return xform; + +TransformObject getTransformObject() { + TransformObject object; + return object; } + +TransformCamera getTransformCamera() { + TransformCamera camera; + return camera; +} + <@endif@> From 05ae1b6fe699e795d9e8c9d59575f84804fc2eef Mon Sep 17 00:00:00 2001 From: dev Date: Fri, 20 Feb 2015 15:20:34 -0800 Subject: [PATCH 12/21] fixing the mac osx code path for Transform --- libraries/gpu/src/gpu/Transform.slh | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/libraries/gpu/src/gpu/Transform.slh b/libraries/gpu/src/gpu/Transform.slh index 6f0154a07d..e9c8a7984a 100644 --- a/libraries/gpu/src/gpu/Transform.slh +++ b/libraries/gpu/src/gpu/Transform.slh @@ -37,7 +37,7 @@ vec4 transformModelToClipPos(TransformCamera camera, TransformObject object, vec vec3 transformModelToEyeDir(TransformCamera camera, TransformObject object, vec3 dir) { <@if GLPROFILE == MAC_GL@> - return (gl_NormalMatrix * vec4(dir, 0.0)).xyz; + return gl_NormalMatrix * dir; <@elif GLPROFILE == PC_GL@> 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); From 90bff36fd3d3d810b1807562955a66054ecaa79a Mon Sep 17 00:00:00 2001 From: Sam Gateau Date: Sun, 22 Feb 2015 18:48:48 -0800 Subject: [PATCH 13/21] trying to ge the shadow to render correctly --- interface/src/avatar/Avatar.cpp | 10 ++++++---- interface/src/avatar/Avatar.h | 2 +- interface/src/avatar/Head.cpp | 6 ++++-- interface/src/avatar/Head.h | 2 +- interface/src/avatar/MyAvatar.cpp | 8 +++++--- interface/src/avatar/MyAvatar.h | 2 +- libraries/gpu/src/gpu/Transform.slh | 18 ++++++++---------- libraries/octree/src/ViewFrustum.cpp | 7 ++++++- libraries/render-utils/src/Model.cpp | 8 +++++--- 9 files changed, 37 insertions(+), 26 deletions(-) diff --git a/interface/src/avatar/Avatar.cpp b/interface/src/avatar/Avatar.cpp index d4c10b2b4a..9806098745 100644 --- a/interface/src/avatar/Avatar.cpp +++ b/interface/src/avatar/Avatar.cpp @@ -366,7 +366,7 @@ void Avatar::render(const glm::vec3& cameraPosition, RenderMode renderMode, bool // render body if (Menu::getInstance()->isOptionChecked(MenuOption::Avatars)) { - renderBody(renderMode, postLighting, glowLevel); + renderBody(frustum, renderMode, postLighting, glowLevel); } if (!postLighting && renderMode != SHADOW_RENDER_MODE) { @@ -472,7 +472,7 @@ glm::quat Avatar::computeRotationFromBodyToWorldUp(float proportion) const { return glm::angleAxis(angle * proportion, axis); } -void Avatar::renderBody(RenderMode renderMode, bool postLighting, float glowLevel) { +void Avatar::renderBody(ViewFrustum* renderFrustum, RenderMode renderMode, bool postLighting, float glowLevel) { Model::RenderMode modelRenderMode = (renderMode == SHADOW_RENDER_MODE) ? Model::SHADOW_RENDER_MODE : Model::DEFAULT_RENDER_MODE; { @@ -489,11 +489,13 @@ void Avatar::renderBody(RenderMode renderMode, bool postLighting, float glowLeve if (postLighting) { getHand()->render(false, modelRenderMode); } else { - _skeletonModel.render(1.0f, modelRenderMode); + RenderArgs args; + args._viewFrustum = renderFrustum; + _skeletonModel.render(1.0f, modelRenderMode, &args); renderAttachments(renderMode); } } - getHead()->render(1.0f, modelRenderMode, postLighting); + getHead()->render(1.0f, renderFrustum, modelRenderMode, postLighting); } bool Avatar::shouldRenderHead(const glm::vec3& cameraPosition, RenderMode renderMode) const { diff --git a/interface/src/avatar/Avatar.h b/interface/src/avatar/Avatar.h index 18e42b7dd7..ee7a2a1736 100644 --- a/interface/src/avatar/Avatar.h +++ b/interface/src/avatar/Avatar.h @@ -223,7 +223,7 @@ protected: float calculateDisplayNameScaleFactor(const glm::vec3& textPosition, bool inHMD); void renderDisplayName(); - virtual void renderBody(RenderMode renderMode, bool postLighting, float glowLevel = 0.0f); + virtual void renderBody(ViewFrustum* renderFrustum, RenderMode renderMode, bool postLighting, float glowLevel = 0.0f); virtual bool shouldRenderHead(const glm::vec3& cameraPosition, RenderMode renderMode) const; void simulateAttachments(float deltaTime); diff --git a/interface/src/avatar/Head.cpp b/interface/src/avatar/Head.cpp index afc1346ad8..49b9c7bbe1 100644 --- a/interface/src/avatar/Head.cpp +++ b/interface/src/avatar/Head.cpp @@ -249,13 +249,15 @@ void Head::relaxLean(float deltaTime) { _deltaLeanForward *= relaxationFactor; } -void Head::render(float alpha, Model::RenderMode mode, bool postLighting) { +void Head::render(float alpha, ViewFrustum* renderFrustum, Model::RenderMode mode, bool postLighting) { if (postLighting) { if (_renderLookatVectors) { renderLookatVectors(_leftEyePosition, _rightEyePosition, getCorrectedLookAtPosition()); } } else { - _faceModel.render(alpha, mode); + RenderArgs args; + args._viewFrustum = renderFrustum; + _faceModel.render(alpha, mode, &args); } } diff --git a/interface/src/avatar/Head.h b/interface/src/avatar/Head.h index 89eea35903..4454f063b4 100644 --- a/interface/src/avatar/Head.h +++ b/interface/src/avatar/Head.h @@ -40,7 +40,7 @@ public: void init(); void reset(); void simulate(float deltaTime, bool isMine, bool billboard = false); - void render(float alpha, Model::RenderMode mode, bool postLighting); + void render(float alpha, ViewFrustum* renderFrustum, Model::RenderMode mode, bool postLighting); void setScale(float scale); void setPosition(glm::vec3 position) { _position = position; } void setAverageLoudness(float averageLoudness) { _averageLoudness = averageLoudness; } diff --git a/interface/src/avatar/MyAvatar.cpp b/interface/src/avatar/MyAvatar.cpp index ba628ea0d4..f029f54b2a 100644 --- a/interface/src/avatar/MyAvatar.cpp +++ b/interface/src/avatar/MyAvatar.cpp @@ -1085,7 +1085,7 @@ void MyAvatar::attach(const QString& modelURL, const QString& jointName, const g Avatar::attach(modelURL, jointName, translation, rotation, scale, allowDuplicates, useSaved); } -void MyAvatar::renderBody(RenderMode renderMode, bool postLighting, float glowLevel) { +void MyAvatar::renderBody(ViewFrustum* renderFrustum, RenderMode renderMode, bool postLighting, float glowLevel) { if (!(_skeletonModel.isRenderable() && getHead()->getFaceModel().isRenderable())) { return; // wait until both models are loaded } @@ -1094,7 +1094,9 @@ void MyAvatar::renderBody(RenderMode renderMode, bool postLighting, float glowLe Model::RenderMode modelRenderMode = (renderMode == SHADOW_RENDER_MODE) ? Model::SHADOW_RENDER_MODE : Model::DEFAULT_RENDER_MODE; if (!postLighting) { - _skeletonModel.render(1.0f, modelRenderMode); + RenderArgs args; + args._viewFrustum = renderFrustum; + _skeletonModel.render(1.0f, modelRenderMode, &args); renderAttachments(renderMode); } @@ -1102,7 +1104,7 @@ void MyAvatar::renderBody(RenderMode renderMode, bool postLighting, float glowLe const Camera *camera = Application::getInstance()->getCamera(); const glm::vec3 cameraPos = camera->getPosition(); if (shouldRenderHead(cameraPos, renderMode)) { - getHead()->render(1.0f, modelRenderMode, postLighting); + getHead()->render(1.0f, renderFrustum, modelRenderMode, postLighting); } if (postLighting) { getHand()->render(true, modelRenderMode); diff --git a/interface/src/avatar/MyAvatar.h b/interface/src/avatar/MyAvatar.h index ae392268f0..63b4cd8a77 100644 --- a/interface/src/avatar/MyAvatar.h +++ b/interface/src/avatar/MyAvatar.h @@ -38,7 +38,7 @@ public: void updateFromTrackers(float deltaTime); void render(const glm::vec3& cameraPosition, RenderMode renderMode = NORMAL_RENDER_MODE, bool postLighting = false); - void renderBody(RenderMode renderMode, bool postLighting, float glowLevel = 0.0f); + void renderBody(ViewFrustum* renderFrustum, RenderMode renderMode, bool postLighting, float glowLevel = 0.0f); bool shouldRenderHead(const glm::vec3& cameraPosition, RenderMode renderMode) const; void renderDebugBodyPoints(); diff --git a/libraries/gpu/src/gpu/Transform.slh b/libraries/gpu/src/gpu/Transform.slh index e9c8a7984a..9578177826 100644 --- a/libraries/gpu/src/gpu/Transform.slh +++ b/libraries/gpu/src/gpu/Transform.slh @@ -39,18 +39,16 @@ vec3 transformModelToEyeDir(TransformCamera camera, TransformObject object, vec3 <@if GLPROFILE == MAC_GL@> return gl_NormalMatrix * dir; <@elif GLPROFILE == PC_GL@> - 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); + 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 mvIc0 = vec3(dot(camera._viewInverse[0].xyz, mIr0), dot(camera._viewInverse[0].xyz, mIr1), dot(camera._viewInverse[0].xyz, mIr2)); - vec3 mvIc1 = vec3(dot(camera._viewInverse[1].xyz, mIr0), dot(camera._viewInverse[1].xyz, mIr1), dot(camera._viewInverse[1].xyz, mIr2)); - vec3 mvIc2 = vec3(dot(camera._viewInverse[2].xyz, mIr0), dot(camera._viewInverse[2].xyz, mIr1), dot(camera._viewInverse[2].xyz, mIr2)); + 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)); - vec3 result = vec3(dot(mvIc0, dir), - dot(mvIc1, dir), - dot(mvIc2, dir)); - return result; <@endif@> } diff --git a/libraries/octree/src/ViewFrustum.cpp b/libraries/octree/src/ViewFrustum.cpp index 61324861e8..f92ba0a742 100644 --- a/libraries/octree/src/ViewFrustum.cpp +++ b/libraries/octree/src/ViewFrustum.cpp @@ -868,7 +868,12 @@ float ViewFrustum::distanceToCamera(const glm::vec3& point) const { void ViewFrustum::evalProjectionMatrix(glm::mat4& proj) const { if (isOrthographic()) { - proj = glm::ortho(getWidth() * -0.5, getWidth() * +0.5, getHeight() * -0.5, getHeight() * 0.5); + float left, right, bottom, top, near, far; + glm::vec4 clip0, clip1; + computeOffAxisFrustum(left, right, bottom, top, near, far, clip0, clip1); + + proj = glm::ortho(left, right, bottom, top); + proj = glm::ortho(-0.5f * getWidth(), +0.5f * getWidth(), -0.5f * getWidth(), +0.5f * getWidth()); } else { float left, right, bottom, top, near, far; glm::vec4 clip0, clip1; diff --git a/libraries/render-utils/src/Model.cpp b/libraries/render-utils/src/Model.cpp index dd4d1ba9e7..f8cd363a5b 100644 --- a/libraries/render-utils/src/Model.cpp +++ b/libraries/render-utils/src/Model.cpp @@ -701,9 +701,11 @@ bool Model::renderCore(float alpha, RenderMode mode, RenderArgs* args) { gpu::Batch& batch = _renderBatch; // Setup the projection matrix - glm::mat4 proj; - _viewState->getCurrentViewFrustum()->evalProjectionMatrix(proj); - batch.setProjectionTransform(proj); + if (args && args->_viewFrustum) { + glm::mat4 proj; + args->_viewFrustum->evalProjectionMatrix(proj); + batch.setProjectionTransform(proj); + } // Capture the view matrix once for the rendering of this model if (_transforms.empty()) { From ffaea071308887993b175b51097d01aeedafff7f Mon Sep 17 00:00:00 2001 From: Sam Gateau Date: Mon, 23 Feb 2015 07:04:14 -0800 Subject: [PATCH 14/21] trying to ge the shadow to render correctly --- libraries/entities-renderer/src/EntityTreeRenderer.cpp | 8 +++++++- libraries/render-utils/src/AbstractViewStateInterface.h | 3 +++ 2 files changed, 10 insertions(+), 1 deletion(-) diff --git a/libraries/entities-renderer/src/EntityTreeRenderer.cpp b/libraries/entities-renderer/src/EntityTreeRenderer.cpp index 975d0f515d..ec048cb6eb 100644 --- a/libraries/entities-renderer/src/EntityTreeRenderer.cpp +++ b/libraries/entities-renderer/src/EntityTreeRenderer.cpp @@ -332,8 +332,14 @@ void EntityTreeRenderer::leaveAllEntities() { void EntityTreeRenderer::render(RenderArgs::RenderMode renderMode, RenderArgs::RenderSide renderSide) { if (_tree) { Model::startScene(renderSide); - RenderArgs args = { this, _viewFrustum, getSizeScale(), getBoundaryLevelAdjust(), renderMode, renderSide, + + ViewFrustum* frustum = (renderMode == RenderArgs::SHADOW_RENDER_MODE) ? + _viewState->getShadowViewFrustum() : _viewState->getCurrentViewFrustum(); + + RenderArgs args = { this, frustum, getSizeScale(), getBoundaryLevelAdjust(), renderMode, renderSide, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0 }; + + _tree->lockForRead(); _tree->recurseTreeWithOperation(renderOperation, &args); diff --git a/libraries/render-utils/src/AbstractViewStateInterface.h b/libraries/render-utils/src/AbstractViewStateInterface.h index 50a75c769a..0d73614e7c 100644 --- a/libraries/render-utils/src/AbstractViewStateInterface.h +++ b/libraries/render-utils/src/AbstractViewStateInterface.h @@ -32,6 +32,9 @@ public: /// gets the current view frustum for rendering the view state virtual ViewFrustum* getCurrentViewFrustum() = 0; + + /// gets the shadow view frustum for rendering the view state + virtual ViewFrustum* getShadowViewFrustum() = 0; virtual bool getShadowsEnabled() = 0; virtual bool getCascadeShadowsEnabled() = 0; From 687c76a6f8ae0aff1cf1554a9d929cee01109035 Mon Sep 17 00:00:00 2001 From: Sam Gateau Date: Mon, 23 Feb 2015 13:12:29 -0800 Subject: [PATCH 15/21] trying to ge the shadow to render correctly --- interface/src/Application.cpp | 6 +++++- libraries/octree/src/ViewFrustum.cpp | 16 ++++++++++------ libraries/render-utils/src/Shadow.slh | 2 ++ .../src/directional_ambient_light_shadow_map.slf | 2 ++ 4 files changed, 19 insertions(+), 7 deletions(-) diff --git a/interface/src/Application.cpp b/interface/src/Application.cpp index 1211df3727..f533765644 100644 --- a/interface/src/Application.cpp +++ b/interface/src/Application.cpp @@ -2564,7 +2564,9 @@ void Application::updateShadowMap() { glm::ortho(minima.x, maxima.x, minima.y, maxima.y, -maxima.z, -minima.z) * glm::mat4_cast(inverseRotation)); // update the shadow view frustum - _shadowViewFrustum.setPosition(rotation * ((minima + maxima) * 0.5f)); + // glm::vec3 shadowFrustumCenter = glm::vec3((minima.x + maxima.x) * 0.5f, (minima.y + maxima.y) * 0.5f, (minima.z + maxima.z) * 0.5f); + glm::vec3 shadowFrustumCenter = rotation * ((minima + maxima) * 0.5f); + _shadowViewFrustum.setPosition(shadowFrustumCenter); _shadowViewFrustum.setOrientation(rotation); _shadowViewFrustum.setOrthographic(true); _shadowViewFrustum.setWidth(maxima.x - minima.x); @@ -2594,8 +2596,10 @@ void Application::updateShadowMap() { // this is what is used for rendering the Entities and avatars Transform viewTransform; viewTransform.setRotation(rotation); + // viewTransform.postTranslate(shadowFrustumCenter); setViewTransform(viewTransform); + glEnable(GL_POLYGON_OFFSET_FILL); glPolygonOffset(1.1f, 4.0f); // magic numbers courtesy http://www.eecs.berkeley.edu/~ravir/6160/papers/shadowmaps.ppt diff --git a/libraries/octree/src/ViewFrustum.cpp b/libraries/octree/src/ViewFrustum.cpp index f92ba0a742..fac017218d 100644 --- a/libraries/octree/src/ViewFrustum.cpp +++ b/libraries/octree/src/ViewFrustum.cpp @@ -577,6 +577,10 @@ void ViewFrustum::computeOffAxisFrustum(float& left, float& right, float& bottom // compute our dimensions the usual way float hheight = _nearClip * tanf(_fieldOfView * 0.5f * RADIANS_PER_DEGREE); float hwidth = _aspectRatio * hheight; + if (isOrthographic()) { + hheight = getHeight(); + hwidth = getWidth(); + } // get our frustum corners in view space glm::mat4 eyeMatrix = glm::mat4_cast(glm::inverse(_eyeOffsetOrientation)) * glm::translate(-_eyeOffsetPosition); @@ -868,18 +872,18 @@ float ViewFrustum::distanceToCamera(const glm::vec3& point) const { void ViewFrustum::evalProjectionMatrix(glm::mat4& proj) const { if (isOrthographic()) { - float left, right, bottom, top, near, far; - glm::vec4 clip0, clip1; - computeOffAxisFrustum(left, right, bottom, top, near, far, clip0, clip1); + glm::vec3 frustumCenter = glm::inverse( _orientation) * _position; - proj = glm::ortho(left, right, bottom, top); - proj = glm::ortho(-0.5f * getWidth(), +0.5f * getWidth(), -0.5f * getWidth(), +0.5f * getWidth()); + proj = glm::ortho(frustumCenter.x -0.5f * getWidth(), + frustumCenter.x +0.5f * getWidth(), + frustumCenter.y -0.5f * getHeight(), + frustumCenter.y +0.5f * getHeight(), + -getFarClip(), -getNearClip()); } else { float left, right, bottom, top, near, far; glm::vec4 clip0, clip1; computeOffAxisFrustum(left, right, bottom, top, near, far, clip0, clip1); proj = glm::perspective(glm::radians(getFieldOfView()), getAspectRatio(), getNearClip(), getFarClip()); - // proj = glm::perspective(getFieldOfView() * 0.5f, getAspectRatio(), getNearClip(), getFarClip()); } } diff --git a/libraries/render-utils/src/Shadow.slh b/libraries/render-utils/src/Shadow.slh index a8d0ce457a..d4c19915ff 100755 --- a/libraries/render-utils/src/Shadow.slh +++ b/libraries/render-utils/src/Shadow.slh @@ -31,6 +31,8 @@ uniform vec3 shadowDistances; // the inverse of the size of the shadow map uniform float shadowScale; +uniform mat4 shadowMatrices[4]; + vec2 samples[8] = vec2[8]( vec2(-2.0, -2.0), vec2(2.0, -2.0), diff --git a/libraries/render-utils/src/directional_ambient_light_shadow_map.slf b/libraries/render-utils/src/directional_ambient_light_shadow_map.slf index 7f098eac2e..3407cb03e3 100755 --- a/libraries/render-utils/src/directional_ambient_light_shadow_map.slf +++ b/libraries/render-utils/src/directional_ambient_light_shadow_map.slf @@ -46,4 +46,6 @@ void main(void) { gl_FragColor = vec4(color, frag.normalVal.a); } + + gl_FragColor = vec4(vec3(shadowAttenuation), 1.0); } From 04a39275efa2562cfa17d034ad6a6344b2950f51 Mon Sep 17 00:00:00 2001 From: Sam Gateau Date: Mon, 23 Feb 2015 16:47:43 -0800 Subject: [PATCH 16/21] Trying to setup correctly the projection matrix for all the different cases... --- interface/src/avatar/Avatar.cpp | 6 +++--- interface/src/avatar/Avatar.h | 2 +- interface/src/avatar/MyAvatar.cpp | 8 ++++---- interface/src/avatar/MyAvatar.h | 2 +- libraries/render-utils/src/DeferredGlobalLight.slh | 7 ++++--- libraries/render-utils/src/Model.cpp | 2 +- 6 files changed, 14 insertions(+), 13 deletions(-) diff --git a/interface/src/avatar/Avatar.cpp b/interface/src/avatar/Avatar.cpp index 9806098745..98db07a25b 100644 --- a/interface/src/avatar/Avatar.cpp +++ b/interface/src/avatar/Avatar.cpp @@ -492,7 +492,7 @@ void Avatar::renderBody(ViewFrustum* renderFrustum, RenderMode renderMode, bool RenderArgs args; args._viewFrustum = renderFrustum; _skeletonModel.render(1.0f, modelRenderMode, &args); - renderAttachments(renderMode); + renderAttachments(renderMode, &args); } } getHead()->render(1.0f, renderFrustum, modelRenderMode, postLighting); @@ -522,11 +522,11 @@ void Avatar::simulateAttachments(float deltaTime) { } } -void Avatar::renderAttachments(RenderMode renderMode) { +void Avatar::renderAttachments(RenderMode renderMode, RenderArgs* args) { Model::RenderMode modelRenderMode = (renderMode == SHADOW_RENDER_MODE) ? Model::SHADOW_RENDER_MODE : Model::DEFAULT_RENDER_MODE; foreach (Model* model, _attachmentModels) { - model->render(1.0f, modelRenderMode); + model->render(1.0f, modelRenderMode, args); } } diff --git a/interface/src/avatar/Avatar.h b/interface/src/avatar/Avatar.h index ee7a2a1736..93b8d811d5 100644 --- a/interface/src/avatar/Avatar.h +++ b/interface/src/avatar/Avatar.h @@ -227,7 +227,7 @@ protected: virtual bool shouldRenderHead(const glm::vec3& cameraPosition, RenderMode renderMode) const; void simulateAttachments(float deltaTime); - virtual void renderAttachments(RenderMode renderMode); + virtual void renderAttachments(RenderMode renderMode, RenderArgs* args); virtual void updateJointMappings(); diff --git a/interface/src/avatar/MyAvatar.cpp b/interface/src/avatar/MyAvatar.cpp index f029f54b2a..c3ecd23a3f 100644 --- a/interface/src/avatar/MyAvatar.cpp +++ b/interface/src/avatar/MyAvatar.cpp @@ -1097,7 +1097,7 @@ void MyAvatar::renderBody(ViewFrustum* renderFrustum, RenderMode renderMode, boo RenderArgs args; args._viewFrustum = renderFrustum; _skeletonModel.render(1.0f, modelRenderMode, &args); - renderAttachments(renderMode); + renderAttachments(renderMode, &args); } // Render head so long as the camera isn't inside it @@ -1902,9 +1902,9 @@ void MyAvatar::onToggleRagdoll() { } } -void MyAvatar::renderAttachments(RenderMode renderMode) { +void MyAvatar::renderAttachments(RenderMode renderMode, RenderArgs* args) { if (Application::getInstance()->getCamera()->getMode() != CAMERA_MODE_FIRST_PERSON || renderMode == MIRROR_RENDER_MODE) { - Avatar::renderAttachments(renderMode); + Avatar::renderAttachments(renderMode, args); return; } const FBXGeometry& geometry = _skeletonModel.getGeometry()->getFBXGeometry(); @@ -1914,7 +1914,7 @@ void MyAvatar::renderAttachments(RenderMode renderMode) { for (int i = 0; i < _attachmentData.size(); i++) { const QString& jointName = _attachmentData.at(i).jointName; if (jointName != headJointName && jointName != "Head") { - _attachmentModels.at(i)->render(1.0f, modelRenderMode); + _attachmentModels.at(i)->render(1.0f, modelRenderMode, args); } } } diff --git a/interface/src/avatar/MyAvatar.h b/interface/src/avatar/MyAvatar.h index 63b4cd8a77..4255f40712 100644 --- a/interface/src/avatar/MyAvatar.h +++ b/interface/src/avatar/MyAvatar.h @@ -187,7 +187,7 @@ signals: void transformChanged(); protected: - virtual void renderAttachments(RenderMode renderMode); + virtual void renderAttachments(RenderMode renderMode, RenderArgs* args); private: float _turningKeyPressTime; diff --git a/libraries/render-utils/src/DeferredGlobalLight.slh b/libraries/render-utils/src/DeferredGlobalLight.slh index 7f2190d3f1..966e69f7ff 100755 --- a/libraries/render-utils/src/DeferredGlobalLight.slh +++ b/libraries/render-utils/src/DeferredGlobalLight.slh @@ -96,15 +96,16 @@ vec3 evalLightmappedColor(float shadowAttenuation, vec3 normal, vec3 diffuse, ve Light light = getLight(); - //vec3 fragNormal = vec3(invViewMat * vec4(normal, 0.0)); + vec3 fragNormal = vec3(invViewMat * vec4(normal, 0.0)); - // float diffuseDot = dot(fragNormal, getLightDirection(light)); - float diffuseDot = dot(normal, getLightDirection(light)); + float diffuseDot = dot(fragNormal, -getLightDirection(light)); + // float diffuseDot = dot(normal, getLightDirection(light)); // need to catch normals perpendicular to the projection plane hence the magic number for the threshold // it should be just 0, but we have innacurracy so we need to overshoot const float PERPENDICULAR_THRESHOLD = -0.005; float facingLight = step(PERPENDICULAR_THRESHOLD, diffuseDot); + //float facingLight = step(PERPENDICULAR_THRESHOLD, diffuseDot); // evaluate the shadow test but only relevant for light facing fragments float lightAttenuation = (1 - facingLight) + facingLight * shadowAttenuation; diff --git a/libraries/render-utils/src/Model.cpp b/libraries/render-utils/src/Model.cpp index f8cd363a5b..c632afa084 100644 --- a/libraries/render-utils/src/Model.cpp +++ b/libraries/render-utils/src/Model.cpp @@ -680,7 +680,7 @@ bool Model::render(float alpha, RenderMode mode, RenderArgs* args) { // render the attachments foreach (Model* attachment, _attachments) { - attachment->render(alpha, mode); + attachment->render(alpha, mode, args); } if (_meshStates.isEmpty()) { return false; From 65a3e3618a0a8697687413a4e67c511ac0493794 Mon Sep 17 00:00:00 2001 From: Sam Gateau Date: Mon, 23 Feb 2015 17:06:46 -0800 Subject: [PATCH 17/21] Trying to setup correctly the projection matrix for all the different cases... --- libraries/gpu/src/gpu/Config.slh | 20 +------------------ .../directional_ambient_light_shadow_map.slf | 2 -- 2 files changed, 1 insertion(+), 21 deletions(-) diff --git a/libraries/gpu/src/gpu/Config.slh b/libraries/gpu/src/gpu/Config.slh index 89be6a4f54..b17bd7b2b8 100644 --- a/libraries/gpu/src/gpu/Config.slh +++ b/libraries/gpu/src/gpu/Config.slh @@ -12,25 +12,7 @@ <@def GPU_CONFIG_SLH@> <@if GLPROFILE == PC_GL @> - <@def VERSION_HEADER #version 410 compatibility -#@> - -<@func inputPosition name@> -layout(location = 0) in vec3 <$name$>; -<@endfunc@> - -<@func inputNormal name@> -layout(location = 1) in vec3 <$name$>; -<@endfunc@> - -<@func inputTexcoord name@> -layout(location = 4) in vec2 <$name$>; -<@endfunc@> - -<@func inputColor name@> -layout(location = 4) vec3 <$name$>; -<@endfunc@> - + <@def VERSION_HEADER #version 330 compatibility@> <@elif GLPROFILE == MAC_GL @> <@def VERSION_HEADER #version 120@> <@else@> diff --git a/libraries/render-utils/src/directional_ambient_light_shadow_map.slf b/libraries/render-utils/src/directional_ambient_light_shadow_map.slf index 3407cb03e3..7f098eac2e 100755 --- a/libraries/render-utils/src/directional_ambient_light_shadow_map.slf +++ b/libraries/render-utils/src/directional_ambient_light_shadow_map.slf @@ -46,6 +46,4 @@ void main(void) { gl_FragColor = vec4(color, frag.normalVal.a); } - - gl_FragColor = vec4(vec3(shadowAttenuation), 1.0); } From 5ab3cbb7ecca4d736ea936f4875c0f96769b1f5b Mon Sep 17 00:00:00 2001 From: Sam Gateau Date: Fri, 27 Feb 2015 17:11:16 -0800 Subject: [PATCH 18/21] Fixed the 2 remianing issues before PR, the shadow program needed to have the binding assigned and the Head of the avatar isn't getting it's BBox evaluated --- interface/src/avatar/FaceModel.cpp | 2 ++ interface/src/avatar/Head.cpp | 1 + libraries/render-utils/src/Model.cpp | 3 +++ libraries/render-utils/src/Model.h | 3 +++ 4 files changed, 9 insertions(+) diff --git a/interface/src/avatar/FaceModel.cpp b/interface/src/avatar/FaceModel.cpp index 3523cb2176..c80772ef49 100644 --- a/interface/src/avatar/FaceModel.cpp +++ b/interface/src/avatar/FaceModel.cpp @@ -39,6 +39,8 @@ void FaceModel::simulate(float deltaTime, bool fullUpdate) { setPupilDilation(_owningHead->getPupilDilation()); setBlendshapeCoefficients(_owningHead->getBlendshapeCoefficients()); + invalidCalculatedMeshBoxes(); + if (isActive()) { setOffset(-_geometry->getFBXGeometry().neckPivot); Model::simulateInternal(deltaTime); diff --git a/interface/src/avatar/Head.cpp b/interface/src/avatar/Head.cpp index 311356daf3..4bfaaae577 100644 --- a/interface/src/avatar/Head.cpp +++ b/interface/src/avatar/Head.cpp @@ -251,6 +251,7 @@ void Head::render(float alpha, ViewFrustum* renderFrustum, Model::RenderMode mod } else { RenderArgs args; args._viewFrustum = renderFrustum; + // _faceModel._calculatedMeshBoxesValid = false; _faceModel.render(alpha, mode, &args); } } diff --git a/libraries/render-utils/src/Model.cpp b/libraries/render-utils/src/Model.cpp index c632afa084..c7e5b71b22 100644 --- a/libraries/render-utils/src/Model.cpp +++ b/libraries/render-utils/src/Model.cpp @@ -336,6 +336,9 @@ void Model::init() { _shadowProgram.addShaderFromSourceCode(QGLShader::Vertex, model_shadow_vert); _shadowProgram.addShaderFromSourceCode(QGLShader::Fragment, model_shadow_frag); + // Shadow program uses the same locations as standard rendering path but we still need to set the bindings + Model::Locations tempLoc; + initProgram(_shadowProgram, tempLoc); _skinProgram.addShaderFromSourceCode(QGLShader::Vertex, skin_model_vert); _skinProgram.addShaderFromSourceCode(QGLShader::Fragment, model_frag); diff --git a/libraries/render-utils/src/Model.h b/libraries/render-utils/src/Model.h index ef96f0e05f..303fa770ad 100644 --- a/libraries/render-utils/src/Model.h +++ b/libraries/render-utils/src/Model.h @@ -269,6 +269,9 @@ protected: /// first free ancestor. float getLimbLength(int jointIndex) const; + /// Allow sub classes to force invalidating the bboxes + void invalidCalculatedMeshBoxes() { _calculatedMeshBoxesValid = false; } + private: friend class AnimationHandle; From f92efa13c8a415190a57ef03e820496c49ecf806 Mon Sep 17 00:00:00 2001 From: Sam Gateau Date: Fri, 27 Feb 2015 17:35:08 -0800 Subject: [PATCH 19/21] fix typo --- interface/src/avatar/Head.cpp | 3 +-- 1 file changed, 1 insertion(+), 2 deletions(-) diff --git a/interface/src/avatar/Head.cpp b/interface/src/avatar/Head.cpp index 4bfaaae577..b90b693139 100644 --- a/interface/src/avatar/Head.cpp +++ b/interface/src/avatar/Head.cpp @@ -251,8 +251,7 @@ void Head::render(float alpha, ViewFrustum* renderFrustum, Model::RenderMode mod } else { RenderArgs args; args._viewFrustum = renderFrustum; - // _faceModel._calculatedMeshBoxesValid = false; - _faceModel.render(alpha, mode, &args); + _faceModel.render(alpha, mode, &args); } } From 598b791aeed5c2139a5b2906d7885fc0df6885c1 Mon Sep 17 00:00:00 2001 From: Sam Gateau Date: Tue, 3 Mar 2015 11:01:47 -0800 Subject: [PATCH 20/21] FIxing the compilation issue for linux --- libraries/render-utils/src/Model.cpp | 4 ++++ 1 file changed, 4 insertions(+) diff --git a/libraries/render-utils/src/Model.cpp b/libraries/render-utils/src/Model.cpp index c7e5b71b22..bbb4dfe8cf 100644 --- a/libraries/render-utils/src/Model.cpp +++ b/libraries/render-utils/src/Model.cpp @@ -223,17 +223,21 @@ void Model::initProgram(ProgramObject& program, Model::Locations& locations, boo } #endif +#if defined(Q_OS_WIN) loc = glGetUniformBlockIndex(program.programId(), "transformObjectBuffer"); if (loc >= 0) { glUniformBlockBinding(program.programId(), loc, gpu::TRANSFORM_OBJECT_SLOT); // locations.materialBufferUnit = 1; } +#endif +#if defined(Q_OS_WIN) loc = glGetUniformBlockIndex(program.programId(), "transformCameraBuffer"); if (loc >= 0) { glUniformBlockBinding(program.programId(), loc, gpu::TRANSFORM_CAMERA_SLOT); // locations.materialBufferUnit = 1; } +#endif //program.link(); if (!program.isLinked()) { From cad21849275b821b33eb4b81635dd5747e5e19ec Mon Sep 17 00:00:00 2001 From: Sam Gateau Date: Tue, 3 Mar 2015 11:09:11 -0800 Subject: [PATCH 21/21] FIxing the compilation issue for linux --- libraries/gpu/src/gpu/GLBackend.cpp | 17 ++++++----------- 1 file changed, 6 insertions(+), 11 deletions(-) diff --git a/libraries/gpu/src/gpu/GLBackend.cpp b/libraries/gpu/src/gpu/GLBackend.cpp index fd91e0df0c..0afc1b1204 100644 --- a/libraries/gpu/src/gpu/GLBackend.cpp +++ b/libraries/gpu/src/gpu/GLBackend.cpp @@ -395,8 +395,7 @@ void GLBackend::do_setProjectionTransform(Batch& batch, uint32 paramOffset) { } void GLBackend::initTransform() { -#if defined(Q_OS_MAC) -#elif defined(Q_OS_WIN) +#if defined(Q_OS_WIN) glGenBuffers(1, &_transform._transformObjectBuffer); glGenBuffers(1, &_transform._transformCameraBuffer); @@ -413,8 +412,7 @@ void GLBackend::initTransform() { } void GLBackend::killTransform() { -#if defined(Q_OS_MAC) -#elif defined(Q_OS_WIN) +#if defined(Q_OS_WIN) glDeleteBuffers(1, &_transform._transformObjectBuffer); glDeleteBuffers(1, &_transform._transformCameraBuffer); #else @@ -443,8 +441,7 @@ void GLBackend::updateTransform() { } if (_transform._invalidView || _transform._invalidProj) { -#if defined(Q_OS_MAC) -#elif defined(Q_OS_WIN) +#if defined(Q_OS_WIN) glBindBufferBase(GL_UNIFORM_BUFFER, TRANSFORM_CAMERA_SLOT, 0); glBindBuffer(GL_ARRAY_BUFFER, _transform._transformCameraBuffer); glBufferData(GL_ARRAY_BUFFER, sizeof(_transform._transformCamera), (const void*) &_transform._transformCamera, GL_DYNAMIC_DRAW); @@ -454,8 +451,7 @@ void GLBackend::updateTransform() { } if (_transform._invalidModel) { -#if defined(Q_OS_MAC) -#elif defined(Q_OS_WIN) +#if defined(Q_OS_WIN) glBindBufferBase(GL_UNIFORM_BUFFER, TRANSFORM_OBJECT_SLOT, 0); glBindBuffer(GL_ARRAY_BUFFER, _transform._transformObjectBuffer); glBufferData(GL_ARRAY_BUFFER, sizeof(_transform._transformObject), (const void*) &_transform._transformObject, GL_DYNAMIC_DRAW); @@ -464,15 +460,14 @@ void GLBackend::updateTransform() { #endif } -#if defined(Q_OS_MAC) -#elif defined(Q_OS_WIN) +#if defined(Q_OS_WIN) glBindBufferBase(GL_UNIFORM_BUFFER, TRANSFORM_OBJECT_SLOT, _transform._transformObjectBuffer); glBindBufferBase(GL_UNIFORM_BUFFER, TRANSFORM_CAMERA_SLOT, _transform._transformCameraBuffer); CHECK_GL_ERROR(); #endif -#if defined(Q_OS_MAC) +#if defined(Q_OS_MAC) || defined(Q_OS_LINUX) // Do it again for fixed pipeline until we can get rid of it if (_transform._invalidProj) { if (_transform._lastMode != GL_PROJECTION) {