From e2e61c64b11dc8ec5b30c6f8a730dfdb51faf648 Mon Sep 17 00:00:00 2001 From: Sam Gateau Date: Fri, 13 Feb 2015 01:30:04 -0800 Subject: [PATCH 01/40] 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/40] 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/40] 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/40] 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/40] 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/40] 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/40] 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/40] 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/40] 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/40] 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/40] 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/40] 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/40] 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/40] 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/40] 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/40] 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/40] 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 621df1f66bdefa7406492367d4aa8fc663fcc949 Mon Sep 17 00:00:00 2001 From: Stephen Birarda Date: Thu, 26 Feb 2015 09:50:21 -0800 Subject: [PATCH 18/40] remove win requirement of msbuild for bullet --- BUILD_WIN.md | 6 +----- cmake/externals/bullet/CMakeLists.txt | 13 ++----------- 2 files changed, 3 insertions(+), 16 deletions(-) diff --git a/BUILD_WIN.md b/BUILD_WIN.md index 28d26d9eb4..63648241a4 100644 --- a/BUILD_WIN.md +++ b/BUILD_WIN.md @@ -16,16 +16,12 @@ If using Visual Studio 2013 and building as a Visual Studio 2013 project you nee ####nmake & msbuild -Some of the external projects may require nmake and msbuild to compile and install. If they are not installed at the locations listed below, please ensure that both are in your PATH so CMake can find them when required. +Some of the external projects may require nmake to compile and install. If it is not installed at the location listed below, please ensure that it is in your PATH so CMake can find it when required. We expect nmake.exe to be located at the following path. C:\Program Files (x86)\Microsoft Visual Studio 12.0\VC\bin -We expect msbuild.exe to be located at the following path. - - C:\Program Files (x86)\MSBUILD\12.0\Bin - ###Qt You can use the online installer or the offline installer. If you use the offline installer, be sure to select the "OpenGL" version. diff --git a/cmake/externals/bullet/CMakeLists.txt b/cmake/externals/bullet/CMakeLists.txt index d08ceb11b9..fb5a4ecf8b 100644 --- a/cmake/externals/bullet/CMakeLists.txt +++ b/cmake/externals/bullet/CMakeLists.txt @@ -14,21 +14,12 @@ endif () include(ExternalProject) -if (WIN32) - if (UPPER_CMAKE_BUILD_TYPE MATCHES DEBUG) - set(MSBUILD_CONFIGURATION Debug) - else () - set(MSBUILD_CONFIGURATION Release) - endif () - - find_program(MSBUILD_COMMAND msbuild PATHS "C:/Program Files (x86)/MSBUILD/12.0/Bin") - +if (WIN32) ExternalProject_Add( ${EXTERNAL_NAME} URL https://bullet.googlecode.com/files/bullet-2.82-r2704.zip URL_MD5 f5e8914fc9064ad32e0d62d19d33d977 - CMAKE_ARGS ${PLATFORM_CMAKE_ARGS} -DCMAKE_BUILD_TYPE=${CMAKE_BUILD_TYPE} -DCMAKE_INSTALL_PREFIX:PATH= -DBUILD_EXTRAS=0 -DINSTALL_LIBS=1 -DBUILD_DEMOS=0 -DUSE_GLUT=0 - BUILD_COMMAND ${MSBUILD_COMMAND} ALL_BUILD.vcxproj /p:Configuration=${MSBUILD_CONFIGURATION} + CMAKE_ARGS ${PLATFORM_CMAKE_ARGS} -DCMAKE_INSTALL_PREFIX:PATH= -DBUILD_EXTRAS=0 -DINSTALL_LIBS=1 -DBUILD_DEMOS=0 -DUSE_GLUT=0 LOG_DOWNLOAD 1 LOG_CONFIGURE 1 LOG_BUILD 1 From ea88518a440ced8cae3a051fc41cb19aa5a38e34 Mon Sep 17 00:00:00 2001 From: Stephen Birarda Date: Thu, 26 Feb 2015 09:57:56 -0800 Subject: [PATCH 19/40] handle debug/release for multi-config on WIN32 --- cmake/externals/bullet/CMakeLists.txt | 38 +++++++++++++-------------- 1 file changed, 18 insertions(+), 20 deletions(-) diff --git a/cmake/externals/bullet/CMakeLists.txt b/cmake/externals/bullet/CMakeLists.txt index fb5a4ecf8b..47f4c16f91 100644 --- a/cmake/externals/bullet/CMakeLists.txt +++ b/cmake/externals/bullet/CMakeLists.txt @@ -57,28 +57,26 @@ elseif (WIN32) endif () if (DEFINED BULLET_LIB_EXT) - if (NOT WIN32 OR UPPER_CMAKE_BUILD_TYPE MATCHES RELEASE) - set(_PRESENT_LIB_TYPE RELEASE) - set(_MISSING_LIB_TYPE DEBUG) - else () - set(_PRESENT_LIB_TYPE DEBUG) - set(_MISSING_LIB_TYPE RELEASE) - set(_LIB_NAME_SUFFIX _Debug) - endif () + set(_BULLET_LIB_PAIRS "DYNAMICS_LIBRARY\;BulletDynamics" "COLLISION_LIBRARY\;BulletCollision" "MATH_LIBRARY\;LinearMath" "SOFTBODY_LIBRARY\;BulletSoftBody") - set(${EXTERNAL_NAME_UPPER}_DYNAMICS_LIBRARY_${_PRESENT_LIB_TYPE} ${BULLET_LIB_DIR}/${LIB_PREFIX}BulletDynamics${_LIB_NAME_SUFFIX}.${BULLET_LIB_EXT} CACHE FILEPATH "Bullet dynamics ${_PRESENT_LIB_TYPE} library location") - set(${EXTERNAL_NAME_UPPER}_DYNAMICS_LIBRARY_${_MISSING_LIB_TYPE} "" CACHE FILEPATH "Bullet dynamics ${_MISSING_LIB_TYPE} library location") - - set(${EXTERNAL_NAME_UPPER}_COLLISION_LIBRARY_${_PRESENT_LIB_TYPE} ${BULLET_LIB_DIR}/${LIB_PREFIX}BulletCollision${_LIB_NAME_SUFFIX}.${BULLET_LIB_EXT} CACHE FILEPATH "Bullet collision ${_PRESENT_LIB_TYPE} library location") - set(${EXTERNAL_NAME_UPPER}_COLLISION_LIBRARY_${_MISSING_LIB_TYPE} "" CACHE FILEPATH "Bullet collision ${_MISSING_LIB_TYPE} library location") - - set(${EXTERNAL_NAME_UPPER}_MATH_LIBRARY_${_PRESENT_LIB_TYPE} ${BULLET_LIB_DIR}/${LIB_PREFIX}LinearMath${_LIB_NAME_SUFFIX}.${BULLET_LIB_EXT} CACHE FILEPATH "Bullet math ${_PRESENT_LIB_TYPE} library location") - set(${EXTERNAL_NAME_UPPER}_MATH_LIBRARY_${_MISSING_LIB_TYPE} "" CACHE FILEPATH "Bullet math ${_MISSING_LIB_TYPE} library location") - - set(${EXTERNAL_NAME_UPPER}_SOFTBODY_LIBRARY_${_PRESENT_LIB_TYPE} ${BULLET_LIB_DIR}/${LIB_PREFIX}BulletSoftBody${_LIB_NAME_SUFFIX}.${BULLET_LIB_EXT} CACHE FILEPATH "Bullet softbody ${_PRESENT_LIB_TYPE} library location") - set(${EXTERNAL_NAME_UPPER}_SOFTBODY_LIBRARY_${_MISSING_LIB_TYPE} "" CACHE FILEPATH "Bullet softbody ${_MISSING_LIB_TYPE} library location") + foreach(_LIB_PAIR ${_BULLET_LIB_PAIRS}) + + list(GET _LIB_PAIR 0 _LIB_VAR_NAME) + list(GET _LIB_PAIR 1 _LIB_NAME) + + message(STATUS ${_LIB_VAR_NAME}) + message(STATUS ${_LIB_NAME}) + + set(${EXTERNAL_NAME_UPPER}_${_LIB_VAR_NAME}_RELEASE ${BULLET_LIB_DIR}/${LIB_PREFIX}${_LIB_NAME}.${BULLET_LIB_EXT} CACHE FILEPATH "${_LIB_NAME} release library location") + + if (WIN32) + set(${EXTERNAL_NAME_UPPER}_${_LIB_VAR_NAME}_DEBUG ${BULLET_LIB_DIR}/${LIB_PREFIX}${_LIB_NAME}.${BULLET_LIB_EXT} CACHE FILEPATH "${_LIB_NAME} debug library location") + else () + set(${EXTERNAL_NAME_UPPER}_${_LIB_VAR_NAME}_DEBUG "" CACHE FILEPATH "${_LIB_NAME} debug library location") + endif () + endforeach() endif () -if (DEFINED ${EXTERNAL_NAME_UPPER}_DYNAMICS_LIBRARY_${_PRESENT_LIB_TYPE}) +if (DEFINED ${EXTERNAL_NAME_UPPER}_DYNAMICS_LIBRARY_RELEASE) set(${EXTERNAL_NAME_UPPER}_INCLUDE_DIR ${INSTALL_DIR}/include/bullet CACHE PATH "Path to bullet include directory") endif () \ No newline at end of file From 5a4a3ce6dd99e054c80c37d0ac7571c9610fc0b0 Mon Sep 17 00:00:00 2001 From: Stephen Birarda Date: Thu, 26 Feb 2015 09:59:15 -0800 Subject: [PATCH 20/40] remove message calls to debug bullet vars --- cmake/externals/bullet/CMakeLists.txt | 4 ---- 1 file changed, 4 deletions(-) diff --git a/cmake/externals/bullet/CMakeLists.txt b/cmake/externals/bullet/CMakeLists.txt index 47f4c16f91..587b7a12f1 100644 --- a/cmake/externals/bullet/CMakeLists.txt +++ b/cmake/externals/bullet/CMakeLists.txt @@ -60,13 +60,9 @@ if (DEFINED BULLET_LIB_EXT) set(_BULLET_LIB_PAIRS "DYNAMICS_LIBRARY\;BulletDynamics" "COLLISION_LIBRARY\;BulletCollision" "MATH_LIBRARY\;LinearMath" "SOFTBODY_LIBRARY\;BulletSoftBody") foreach(_LIB_PAIR ${_BULLET_LIB_PAIRS}) - list(GET _LIB_PAIR 0 _LIB_VAR_NAME) list(GET _LIB_PAIR 1 _LIB_NAME) - message(STATUS ${_LIB_VAR_NAME}) - message(STATUS ${_LIB_NAME}) - set(${EXTERNAL_NAME_UPPER}_${_LIB_VAR_NAME}_RELEASE ${BULLET_LIB_DIR}/${LIB_PREFIX}${_LIB_NAME}.${BULLET_LIB_EXT} CACHE FILEPATH "${_LIB_NAME} release library location") if (WIN32) From 21f12c1d6c9d458c9c98376f323ff1581ac32f3b Mon Sep 17 00:00:00 2001 From: David Rowe Date: Thu, 26 Feb 2015 13:50:43 -0800 Subject: [PATCH 21/40] Use cache ID when rendering talk bubble sphere --- interface/src/avatar/Avatar.cpp | 10 ++- interface/src/avatar/Avatar.h | 2 + libraries/render-utils/src/GeometryCache.cpp | 84 +++++++++++++++++--- libraries/render-utils/src/GeometryCache.h | 15 ++-- 4 files changed, 91 insertions(+), 20 deletions(-) diff --git a/interface/src/avatar/Avatar.cpp b/interface/src/avatar/Avatar.cpp index 6dc3d4b339..e5f296399e 100644 --- a/interface/src/avatar/Avatar.cpp +++ b/interface/src/avatar/Avatar.cpp @@ -77,7 +77,8 @@ Avatar::Avatar() : _moving(false), _collisionGroups(0), _initialized(false), - _shouldRenderBillboard(true) + _shouldRenderBillboard(true), + _voiceSphereID(GeometryCache::UNKNOWN_ID) { // we may have been created in the network thread, but we live in the main thread moveToThread(Application::getInstance()->thread()); @@ -439,8 +440,13 @@ void Avatar::render(const glm::vec3& cameraPosition, RenderMode renderMode, bool glPushMatrix(); glTranslatef(_position.x, _position.y, _position.z); glScalef(height, height, height); + + if (_voiceSphereID == GeometryCache::UNKNOWN_ID) { + _voiceSphereID = DependencyManager::get()->allocateID(); + } DependencyManager::get()->renderSphere(sphereRadius, 15, 15, - glm::vec4(SPHERE_COLOR[0], SPHERE_COLOR[1], SPHERE_COLOR[2], 1.0f - angle / MAX_SPHERE_ANGLE)); + glm::vec4(SPHERE_COLOR[0], SPHERE_COLOR[1], SPHERE_COLOR[2], 1.0f - angle / MAX_SPHERE_ANGLE), true, + _voiceSphereID); glPopMatrix(); } diff --git a/interface/src/avatar/Avatar.h b/interface/src/avatar/Avatar.h index 72b7ecf93a..d6977afce6 100644 --- a/interface/src/avatar/Avatar.h +++ b/interface/src/avatar/Avatar.h @@ -243,6 +243,8 @@ private: float getBillboardSize() const; static int _jointConesID; + + int _voiceSphereID; }; #endif // hifi_Avatar_h diff --git a/libraries/render-utils/src/GeometryCache.cpp b/libraries/render-utils/src/GeometryCache.cpp index dffadc730f..317b3bd6b9 100644 --- a/libraries/render-utils/src/GeometryCache.cpp +++ b/libraries/render-utils/src/GeometryCache.cpp @@ -53,18 +53,33 @@ const int NUM_COORDS_PER_VERTEX = 3; const int NUM_BYTES_PER_VERTEX = NUM_COORDS_PER_VERTEX * sizeof(GLfloat); const int NUM_BYTES_PER_INDEX = sizeof(GLushort); -void GeometryCache::renderSphere(float radius, int slices, int stacks, const glm::vec4& color, bool solid) { +void GeometryCache::renderSphere(float radius, int slices, int stacks, const glm::vec4& color, bool solid, int id) { + bool registered = (id != UNKNOWN_ID); Vec2Pair radiusKey(glm::vec2(radius, slices), glm::vec2(stacks, 0)); IntPair slicesStacksKey(slices, stacks); - Vec3Pair colorKey(glm::vec3(color.x, color.y, slices), glm::vec3(color.z, color.y, stacks)); + Vec3Pair colorKey(glm::vec3(color.x, color.y, slices), glm::vec3(color.z, color.w, stacks)); int vertices = slices * (stacks - 1) + 2; int indices = slices * (stacks - 1) * NUM_VERTICES_PER_TRIANGULATED_QUAD; - if (!_sphereVertices.contains(radiusKey)) { + if (registered && (!_registeredSphereVertices.contains(id) || _lastRegisteredSphereVertices[id] != radiusKey) + || !registered && !_sphereVertices.contains(radiusKey)) { + + if (registered && _registeredSphereVertices.contains(id)) { + _registeredSphereVertices[id].clear(); + #ifdef WANT_DEBUG + qDebug() << "renderSphere()... RELEASING REGISTERED VERTICES BUFFER"; + #endif + } + gpu::BufferPointer verticesBuffer(new gpu::Buffer()); - _sphereVertices[radiusKey] = verticesBuffer; + if (registered) { + _registeredSphereVertices[id] = verticesBuffer; + _lastRegisteredSphereVertices[id] = radiusKey; + } else { + _sphereVertices[radiusKey] = verticesBuffer; + } GLfloat* vertexData = new GLfloat[vertices * NUM_COORDS_PER_VERTEX]; GLfloat* vertex = vertexData; @@ -106,10 +121,29 @@ void GeometryCache::renderSphere(float radius, int slices, int stacks, const glm qDebug() << " _sphereVertices.size():" << _sphereVertices.size(); #endif } + #ifdef WANT_DEBUG + else if (registered) { + qDebug() << "renderSphere()... REUSING PREVIOUSLY REGISTERED VERTICES BUFFER"; + } + #endif - if (!_sphereIndices.contains(slicesStacksKey)) { + if (registered && (!_registeredSphereIndices.contains(id) || _lastRegisteredSphereIndices[id] != slicesStacksKey) + || !registered && !_sphereIndices.contains(slicesStacksKey)) { + + if (registered && _registeredSphereIndices.contains(id)) { + _registeredSphereIndices[id].clear(); + #ifdef WANT_DEBUG + qDebug() << "renderSphere()... RELEASING REGISTERED INDICES BUFFER"; + #endif + } + gpu::BufferPointer indicesBuffer(new gpu::Buffer()); - _sphereIndices[slicesStacksKey] = indicesBuffer; + if (registered) { + _registeredSphereIndices[id] = indicesBuffer; + _lastRegisteredSphereIndices[id] = slicesStacksKey; + } else { + _sphereIndices[slicesStacksKey] = indicesBuffer; + } GLushort* indexData = new GLushort[indices]; GLushort* index = indexData; @@ -164,7 +198,7 @@ void GeometryCache::renderSphere(float radius, int slices, int stacks, const glm delete[] indexData; #ifdef WANT_DEBUG - qDebug() << "GeometryCache::renderSphere()... --- CREATING INDEX BUFFER"; + qDebug() << "GeometryCache::renderSphere()... --- CREATING INDICES BUFFER"; qDebug() << " radius:" << radius; qDebug() << " slices:" << slices; qDebug() << " stacks:" << stacks; @@ -173,10 +207,29 @@ void GeometryCache::renderSphere(float radius, int slices, int stacks, const glm qDebug() << " _sphereIndices.size():" << _sphereIndices.size(); #endif } + #ifdef WANT_DEBUG + else if (registered) { + qDebug() << "renderSphere()... REUSING PREVIOUSLY REGISTERED INDICES BUFFER"; + } + #endif + + if (registered && (!_registeredSphereColors.contains(id) || _lastRegisteredSphereColors[id] != colorKey) + || !registered && !_sphereColors.contains(colorKey)) { + + if (registered && _registeredSphereColors.contains(id)) { + _registeredSphereColors[id].clear(); + #ifdef WANT_DEBUG + qDebug() << "renderSphere()... RELEASING REGISTERED COLORS BUFFER"; + #endif + } - if (!_sphereColors.contains(colorKey)) { gpu::BufferPointer colorBuffer(new gpu::Buffer()); - _sphereColors[colorKey] = colorBuffer; + if (registered) { + _registeredSphereColors[id] = colorBuffer; + _lastRegisteredSphereColors[id] = colorKey; + } else { + _sphereColors[colorKey] = colorBuffer; + } int compactColor = ((int(color.x * 255.0f) & 0xFF)) | ((int(color.y * 255.0f) & 0xFF) << 8) | @@ -201,11 +254,16 @@ void GeometryCache::renderSphere(float radius, int slices, int stacks, const glm qDebug() << " stacks:" << stacks; qDebug() << " _sphereColors.size():" << _sphereColors.size(); #endif - } - gpu::BufferPointer verticesBuffer = _sphereVertices[radiusKey]; - gpu::BufferPointer indicesBuffer = _sphereIndices[slicesStacksKey]; - gpu::BufferPointer colorBuffer = _sphereColors[colorKey]; + #ifdef WANT_DEBUG + else if (registered) { + qDebug() << "renderSphere()... REUSING PREVIOUSLY REGISTERED COLORS BUFFER"; + } + #endif + + gpu::BufferPointer verticesBuffer = registered ? _registeredSphereVertices[id] : _sphereVertices[radiusKey]; + gpu::BufferPointer indicesBuffer = registered ? _registeredSphereIndices[id] : _sphereIndices[slicesStacksKey]; + gpu::BufferPointer colorBuffer = registered ? _registeredSphereColors[id] : _sphereColors[colorKey]; const int VERTICES_SLOT = 0; const int NORMALS_SLOT = 1; diff --git a/libraries/render-utils/src/GeometryCache.h b/libraries/render-utils/src/GeometryCache.h index 864c5ff24c..92b6d44b6c 100644 --- a/libraries/render-utils/src/GeometryCache.h +++ b/libraries/render-utils/src/GeometryCache.h @@ -134,10 +134,10 @@ public: void renderCone(float base, float height, int slices, int stacks); - void renderSphere(float radius, int slices, int stacks, const glm::vec3& color, bool solid = true) - { renderSphere(radius, slices, stacks, glm::vec4(color, 1.0f), solid); } + void renderSphere(float radius, int slices, int stacks, const glm::vec3& color, bool solid = true, int id = UNKNOWN_ID) + { renderSphere(radius, slices, stacks, glm::vec4(color, 1.0f), solid, id); } - void renderSphere(float radius, int slices, int stacks, const glm::vec4& color, bool solid = true); + void renderSphere(float radius, int slices, int stacks, const glm::vec4& color, bool solid = true, int id = UNKNOWN_ID); void renderGrid(int xDivisions, int yDivisions, const glm::vec4& color); void renderGrid(int x, int y, int width, int height, int rows, int cols, const glm::vec4& color, int id = UNKNOWN_ID); void renderSolidCube(float size, const glm::vec4& color); @@ -290,10 +290,15 @@ private: QHash _gridColors; QHash _sphereVertices; + QHash _registeredSphereVertices; + QHash _lastRegisteredSphereVertices; QHash _sphereIndices; + QHash _registeredSphereIndices; + QHash _lastRegisteredSphereIndices; QHash _sphereColors; - - + QHash _registeredSphereColors; + QHash _lastRegisteredSphereColors; + QHash > _networkGeometry; }; From 9979bbd8b52eb67e73326532e96f4e4ed723090f Mon Sep 17 00:00:00 2001 From: Stephen Birarda Date: Thu, 26 Feb 2015 15:49:03 -0800 Subject: [PATCH 22/40] actually link debug bullet lib for WIN32 --- cmake/externals/bullet/CMakeLists.txt | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/cmake/externals/bullet/CMakeLists.txt b/cmake/externals/bullet/CMakeLists.txt index 587b7a12f1..e3610997d1 100644 --- a/cmake/externals/bullet/CMakeLists.txt +++ b/cmake/externals/bullet/CMakeLists.txt @@ -66,7 +66,7 @@ if (DEFINED BULLET_LIB_EXT) set(${EXTERNAL_NAME_UPPER}_${_LIB_VAR_NAME}_RELEASE ${BULLET_LIB_DIR}/${LIB_PREFIX}${_LIB_NAME}.${BULLET_LIB_EXT} CACHE FILEPATH "${_LIB_NAME} release library location") if (WIN32) - set(${EXTERNAL_NAME_UPPER}_${_LIB_VAR_NAME}_DEBUG ${BULLET_LIB_DIR}/${LIB_PREFIX}${_LIB_NAME}.${BULLET_LIB_EXT} CACHE FILEPATH "${_LIB_NAME} debug library location") + set(${EXTERNAL_NAME_UPPER}_${_LIB_VAR_NAME}_DEBUG ${BULLET_LIB_DIR}/${LIB_PREFIX}${_LIB_NAME}_Debug.${BULLET_LIB_EXT} CACHE FILEPATH "${_LIB_NAME} debug library location") else () set(${EXTERNAL_NAME_UPPER}_${_LIB_VAR_NAME}_DEBUG "" CACHE FILEPATH "${_LIB_NAME} debug library location") endif () From 43da329eb4734777157123c50046aaf4b6df431d Mon Sep 17 00:00:00 2001 From: Stephen Birarda Date: Thu, 26 Feb 2015 16:14:04 -0800 Subject: [PATCH 23/40] attempt to remove out-of-date warning for tbb --- cmake/externals/tbb/CMakeLists.txt | 2 ++ 1 file changed, 2 insertions(+) diff --git a/cmake/externals/tbb/CMakeLists.txt b/cmake/externals/tbb/CMakeLists.txt index 06da60ac04..8d6eb3924e 100644 --- a/cmake/externals/tbb/CMakeLists.txt +++ b/cmake/externals/tbb/CMakeLists.txt @@ -12,6 +12,7 @@ if (ANDROID) URL_MD5 f09c9abe8ec74e6558c1f89cebbe2893 BUILD_COMMAND ${NDK_BUILD_COMMAND} --directory=jni target=android tbb tbbmalloc arch=arm BUILD_IN_SOURCE 1 + UPDATE_COMMAND "" CONFIGURE_COMMAND "" INSTALL_COMMAND ${CMAKE_COMMAND} -P ${CMAKE_CURRENT_SOURCE_DIR}/AndroidTBBLibCopy.cmake LOG_DOWNLOAD 1 @@ -33,6 +34,7 @@ else () ExternalProject_Add( ${EXTERNAL_NAME} URL ${DOWNLOAD_URL} + UPDATE_COMMAND "" BUILD_COMMAND "" CONFIGURE_COMMAND "" INSTALL_COMMAND "" From eb646383e99318676000d389ad64cf32a5aea55d Mon Sep 17 00:00:00 2001 From: Stephen Birarda Date: Thu, 26 Feb 2015 16:21:15 -0800 Subject: [PATCH 24/40] Revert "attempt to remove out-of-date warning for tbb" This reverts commit 43da329eb4734777157123c50046aaf4b6df431d. --- cmake/externals/tbb/CMakeLists.txt | 2 -- 1 file changed, 2 deletions(-) diff --git a/cmake/externals/tbb/CMakeLists.txt b/cmake/externals/tbb/CMakeLists.txt index 8d6eb3924e..06da60ac04 100644 --- a/cmake/externals/tbb/CMakeLists.txt +++ b/cmake/externals/tbb/CMakeLists.txt @@ -12,7 +12,6 @@ if (ANDROID) URL_MD5 f09c9abe8ec74e6558c1f89cebbe2893 BUILD_COMMAND ${NDK_BUILD_COMMAND} --directory=jni target=android tbb tbbmalloc arch=arm BUILD_IN_SOURCE 1 - UPDATE_COMMAND "" CONFIGURE_COMMAND "" INSTALL_COMMAND ${CMAKE_COMMAND} -P ${CMAKE_CURRENT_SOURCE_DIR}/AndroidTBBLibCopy.cmake LOG_DOWNLOAD 1 @@ -34,7 +33,6 @@ else () ExternalProject_Add( ${EXTERNAL_NAME} URL ${DOWNLOAD_URL} - UPDATE_COMMAND "" BUILD_COMMAND "" CONFIGURE_COMMAND "" INSTALL_COMMAND "" From 95c25086d70d06aa71d815c9ecb3d7b5dc727be4 Mon Sep 17 00:00:00 2001 From: Stephen Birarda Date: Thu, 26 Feb 2015 16:59:37 -0800 Subject: [PATCH 25/40] handle QTTOOLDIR env when looking for qmake --- cmake/externals/qxmpp/CMakeLists.txt | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/cmake/externals/qxmpp/CMakeLists.txt b/cmake/externals/qxmpp/CMakeLists.txt index c8bbdba6ba..9165da115f 100644 --- a/cmake/externals/qxmpp/CMakeLists.txt +++ b/cmake/externals/qxmpp/CMakeLists.txt @@ -1,7 +1,7 @@ set(EXTERNAL_NAME qxmpp) # we need to find qmake inside QT_DIR -find_program(QMAKE_COMMAND NAME qmake PATHS ${QT_DIR}/bin NO_DEFAULT_PATH) +find_program(QMAKE_COMMAND NAME qmake PATHS ${QT_DIR}/bin $ENV{QTTOOLDIR} NO_DEFAULT_PATH) if (NOT QMAKE_COMMAND) message(FATAL_ERROR "Could not find qmake. Qxmpp cannot be compiled without qmake.") From e95c197756001edc92084eadf2ba45ecf773775b Mon Sep 17 00:00:00 2001 From: Stephen Birarda Date: Thu, 26 Feb 2015 17:17:55 -0800 Subject: [PATCH 26/40] fix header in win build guide --- BUILD_WIN.md | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/BUILD_WIN.md b/BUILD_WIN.md index 63648241a4..7a323c9a7a 100644 --- a/BUILD_WIN.md +++ b/BUILD_WIN.md @@ -14,7 +14,7 @@ Or you can start a regular command prompt and then run: If using Visual Studio 2013 and building as a Visual Studio 2013 project you need the Windows 8 SDK which you should already have as part of installing Visual Studio 2013. You should be able to see it at `C:\Program Files (x86)\Windows Kits\8.1\Lib\winv6.3\um\x86`. -####nmake & msbuild +####nmake Some of the external projects may require nmake to compile and install. If it is not installed at the location listed below, please ensure that it is in your PATH so CMake can find it when required. From 38f77190ebab0dcdcc61dfbb4b376af7f914e9da Mon Sep 17 00:00:00 2001 From: Stephen Birarda Date: Thu, 26 Feb 2015 17:20:45 -0800 Subject: [PATCH 27/40] remove PrioVR from build files --- BUILD.md | 2 +- cmake/modules/FindPrioVR.cmake | 24 ------------------------ interface/CMakeLists.txt | 2 +- interface/external/priovr/readme.txt | 16 ---------------- 4 files changed, 2 insertions(+), 42 deletions(-) delete mode 100644 cmake/modules/FindPrioVR.cmake delete mode 100644 interface/external/priovr/readme.txt diff --git a/BUILD.md b/BUILD.md index 98b8cffab1..e598ee500a 100644 --- a/BUILD.md +++ b/BUILD.md @@ -76,5 +76,5 @@ In the examples below the variable $NAME would be replaced by the name of the de ####Devices -You can support external input/output devices such as Oculus Rift, Leap Motion, Faceshift, PrioVR, MIDI, Razr Hydra and more by adding each individual SDK in the visible building path. Refer to the readme file available in each device folder in [interface/external/](interface/external) for the detailed explanation of the requirements to use the device. +You can support external input/output devices such as Oculus Rift, Leap Motion, Faceshift, MIDI, Razr Hydra and more by adding each individual SDK in the visible building path. Refer to the readme file available in each device folder in [interface/external/](interface/external) for the detailed explanation of the requirements to use the device. diff --git a/cmake/modules/FindPrioVR.cmake b/cmake/modules/FindPrioVR.cmake deleted file mode 100644 index 691ba85689..0000000000 --- a/cmake/modules/FindPrioVR.cmake +++ /dev/null @@ -1,24 +0,0 @@ -# Try to find the PrioVR library -# -# You must provide a PRIOVR_ROOT_DIR which contains lib and include directories -# -# Once done this will define -# -# PRIOVR_FOUND - system found PrioVR -# PRIOVR_INCLUDE_DIRS - the PrioVR include directory -# PRIOVR_LIBRARIES - Link this to use PrioVR -# -# Created on 5/12/2014 by Andrzej Kapolka -# Copyright (c) 2014 High Fidelity -# - -find_path(PRIOVR_INCLUDE_DIRS yei_skeletal_api.h ${PRIOVR_ROOT_DIR}/include) - -if (WIN32) - find_library(PRIOVR_LIBRARIES Skeletal_API.lib ${PRIOVR_ROOT_DIR}/lib) -endif (WIN32) - -include(FindPackageHandleStandardArgs) -find_package_handle_standard_args(PrioVR DEFAULT_MSG PRIOVR_INCLUDE_DIRS PRIOVR_LIBRARIES) - -mark_as_advanced(PRIOVR_INCLUDE_DIRS PRIOVR_LIBRARIES) \ No newline at end of file diff --git a/interface/CMakeLists.txt b/interface/CMakeLists.txt index ee41648758..9bc4b393c5 100644 --- a/interface/CMakeLists.txt +++ b/interface/CMakeLists.txt @@ -2,7 +2,7 @@ set(TARGET_NAME interface) project(${TARGET_NAME}) # set a default root dir for each of our optional externals if it was not passed -set(OPTIONAL_EXTERNALS "Faceshift" "LibOVR" "PrioVR" "Sixense" "LeapMotion" "RtMidi" "Qxmpp" "SDL2" "RSSDK") +set(OPTIONAL_EXTERNALS "Faceshift" "LibOVR" "Sixense" "LeapMotion" "RtMidi" "Qxmpp" "SDL2" "RSSDK") foreach(EXTERNAL ${OPTIONAL_EXTERNALS}) string(TOUPPER ${EXTERNAL} ${EXTERNAL}_UPPERCASE) if (NOT ${${EXTERNAL}_UPPERCASE}_ROOT_DIR) diff --git a/interface/external/priovr/readme.txt b/interface/external/priovr/readme.txt deleted file mode 100644 index 202a90cf12..0000000000 --- a/interface/external/priovr/readme.txt +++ /dev/null @@ -1,16 +0,0 @@ - -Instructions for adding the PrioVR driver to Interface -Andrzej Kapolka, May 12, 2014 - -1. Download and install the YEI drivers from https://www.yeitechnology.com/yei-3-space-sensor-software-suite. If using - Window 8+, follow the workaround instructions at http://forum.yeitechnology.com/viewtopic.php?f=3&t=24. - -2. Get the PrioVR skeleton API, open ts_c_api2_priovr2/visual_studio/ThreeSpace_API_2/ThreeSpace_API_2.sln - in Visual Studio, and build it. - -3. Copy ts_c_api2_priovr2/visual_studio/ThreeSpace_API_2/Skeletal_API/yei_skeletal_api.h to interface/external/priovr/include, - ts_c_api2_priovr2/visual_studio/ThreeSpace_API_2/Debug/Skeletal_API.lib to interface/external/priovr/lib, and - ts_c_api2_priovr2/visual_studio/ThreeSpace_API_2/Debug/*.dll to your path. - -4. Delete your build directory, run cmake and build, and you should be all set. - From fc2f6d47bbf3dc55fa011545feb5c65f052da788 Mon Sep 17 00:00:00 2001 From: Stephen Birarda Date: Thu, 26 Feb 2015 17:28:00 -0800 Subject: [PATCH 28/40] remove references to PrioVR in interface code --- interface/src/Application.cpp | 4 - interface/src/Application.h | 4 - interface/src/avatar/MyAvatar.cpp | 14 +- interface/src/avatar/SkeletonModel.cpp | 17 +- interface/src/devices/PrioVR.cpp | 224 ------------------------- interface/src/devices/PrioVR.h | 65 ------- 6 files changed, 2 insertions(+), 326 deletions(-) delete mode 100644 interface/src/devices/PrioVR.cpp delete mode 100644 interface/src/devices/PrioVR.h diff --git a/interface/src/Application.cpp b/interface/src/Application.cpp index 0bdd8f8f53..eed5a39138 100644 --- a/interface/src/Application.cpp +++ b/interface/src/Application.cpp @@ -771,7 +771,6 @@ void Application::paintGL() { { PerformanceTimer perfTimer("renderOverlay"); - // PrioVR will only work if renderOverlay is called, calibration is connected to Application::renderingOverlay() _applicationOverlay.renderOverlay(true); if (Menu::getInstance()->isOptionChecked(MenuOption::UserInterface)) { _applicationOverlay.displayOverlayTexture(); @@ -2071,8 +2070,6 @@ void Application::update(float deltaTime) { updateVisage(); SixenseManager::getInstance().update(deltaTime); JoystickScriptingInterface::getInstance().update(); - _prioVR.update(deltaTime); - } // Dispatch input events @@ -3131,7 +3128,6 @@ void Application::resetSensors() { OculusManager::reset(); - _prioVR.reset(); //_leapmotion.reset(); QScreen* currentScreen = _window->windowHandle()->screen(); diff --git a/interface/src/Application.h b/interface/src/Application.h index 9cd19c8259..2d83f68f6b 100644 --- a/interface/src/Application.h +++ b/interface/src/Application.h @@ -51,7 +51,6 @@ #include "Stars.h" #include "avatar/Avatar.h" #include "avatar/MyAvatar.h" -#include "devices/PrioVR.h" #include "devices/SixenseManager.h" #include "scripting/ControllerScriptingInterface.h" #include "ui/BandwidthDialog.h" @@ -182,7 +181,6 @@ public: MetavoxelSystem* getMetavoxels() { return &_metavoxels; } EntityTreeRenderer* getEntities() { return &_entities; } Environment* getEnvironment() { return &_environment; } - PrioVR* getPrioVR() { return &_prioVR; } QUndoStack* getUndoStack() { return &_undoStack; } MainWindow* getWindow() { return _window; } OctreeQuery& getOctreeQuery() { return _octreeQuery; } @@ -493,8 +491,6 @@ private: MyAvatar* _myAvatar; // TODO: move this and relevant code to AvatarManager (or MyAvatar as the case may be) - PrioVR _prioVR; - Camera _myCamera; // My view onto the world Camera _mirrorCamera; // Cammera for mirror view QRect _mirrorViewRect; diff --git a/interface/src/avatar/MyAvatar.cpp b/interface/src/avatar/MyAvatar.cpp index ba628ea0d4..55355b623d 100644 --- a/interface/src/avatar/MyAvatar.cpp +++ b/interface/src/avatar/MyAvatar.cpp @@ -294,12 +294,7 @@ void MyAvatar::updateFromTrackers(float deltaTime) { return; } - if (Application::getInstance()->getPrioVR()->hasHeadRotation()) { - estimatedRotation = glm::degrees(safeEulerAngles(Application::getInstance()->getPrioVR()->getHeadRotation())); - estimatedRotation.x *= -1.0f; - estimatedRotation.z *= -1.0f; - - } else if (OculusManager::isConnected()) { + if (OculusManager::isConnected()) { estimatedPosition = OculusManager::getRelativePosition(); estimatedPosition.x *= -1.0f; _trackedHeadPosition = estimatedPosition; @@ -349,13 +344,6 @@ void MyAvatar::updateFromTrackers(float deltaTime) { } head->setDeltaRoll(estimatedRotation.z); - // the priovr can give us exact lean - if (Application::getInstance()->getPrioVR()->isActive()) { - glm::vec3 eulers = glm::degrees(safeEulerAngles(Application::getInstance()->getPrioVR()->getTorsoRotation())); - head->setLeanSideways(eulers.z); - head->setLeanForward(eulers.x); - return; - } // Update torso lean distance based on accelerometer data const float TORSO_LENGTH = 0.5f; glm::vec3 relativePosition = estimatedPosition - glm::vec3(0.0f, -TORSO_LENGTH, 0.0f); diff --git a/interface/src/avatar/SkeletonModel.cpp b/interface/src/avatar/SkeletonModel.cpp index 6e207f9703..fa9846fd7d 100644 --- a/interface/src/avatar/SkeletonModel.cpp +++ b/interface/src/avatar/SkeletonModel.cpp @@ -106,21 +106,6 @@ void SkeletonModel::simulate(float deltaTime, bool fullUpdate) { } const FBXGeometry& geometry = _geometry->getFBXGeometry(); - PrioVR* prioVR = Application::getInstance()->getPrioVR(); - if (prioVR->isActive()) { - for (int i = 0; i < prioVR->getJointRotations().size(); i++) { - int humanIKJointIndex = prioVR->getHumanIKJointIndices().at(i); - if (humanIKJointIndex == -1) { - continue; - } - int jointIndex = geometry.humanIKJointIndices.at(humanIKJointIndex); - if (jointIndex != -1) { - JointState& state = _jointStates[jointIndex]; - state.setRotationInBindFrame(prioVR->getJointRotations().at(i), PALM_PRIORITY); - } - } - return; - } // find the left and rightmost active palms int leftPalmIndex, rightPalmIndex; @@ -294,7 +279,7 @@ void SkeletonModel::updateJointState(int index) { } void SkeletonModel::maybeUpdateLeanRotation(const JointState& parentState, JointState& state) { - if (!_owningAvatar->isMyAvatar() || Application::getInstance()->getPrioVR()->isActive()) { + if (!_owningAvatar->isMyAvatar()) { return; } // get the rotation axes in joint space and use them to adjust the rotation diff --git a/interface/src/devices/PrioVR.cpp b/interface/src/devices/PrioVR.cpp deleted file mode 100644 index 428c223eb7..0000000000 --- a/interface/src/devices/PrioVR.cpp +++ /dev/null @@ -1,224 +0,0 @@ -// -// PrioVR.cpp -// interface/src/devices -// -// Created by Andrzej Kapolka on 5/12/14. -// Copyright 2014 High Fidelity, Inc. -// -// Distributed under the Apache License, Version 2.0. -// See the accompanying file LICENSE or http://www.apache.org/licenses/LICENSE-2.0.html -// - -#include -#include - -#include -#include -#include -#include - -#include "Application.h" -#include "PrioVR.h" -#include "scripting/JoystickScriptingInterface.h" - -#ifdef HAVE_PRIOVR -const unsigned int SERIAL_LIST[] = { 0x00000001, 0x00000000, 0x00000008, 0x00000009, 0x0000000A, - 0x0000000C, 0x0000000D, 0x0000000E, 0x00000004, 0x00000005, 0x00000010, 0x00000011 }; -const unsigned char AXIS_LIST[] = { 9, 43, 37, 37, 37, 13, 13, 13, 52, 52, 28, 28 }; -const int LIST_LENGTH = sizeof(SERIAL_LIST) / sizeof(SERIAL_LIST[0]); - -const char* JOINT_NAMES[] = { "Neck", "Spine", "LeftArm", "LeftForeArm", "LeftHand", "RightArm", - "RightForeArm", "RightHand", "LeftUpLeg", "LeftLeg", "RightUpLeg", "RightLeg" }; - -static int indexOfHumanIKJoint(const char* jointName) { - for (int i = 0;; i++) { - QByteArray humanIKJoint = HUMANIK_JOINTS[i]; - if (humanIKJoint.isEmpty()) { - return -1; - } - if (humanIKJoint == jointName) { - return i; - } - } -} - -static void setPalm(float deltaTime, int index) { - MyAvatar* avatar = DependencyManager::get()->getMyAvatar(); - Hand* hand = avatar->getHand(); - PalmData* palm; - bool foundHand = false; - for (size_t j = 0; j < hand->getNumPalms(); j++) { - if (hand->getPalms()[j].getSixenseID() == index) { - palm = &(hand->getPalms()[j]); - foundHand = true; - } - } - if (!foundHand) { - PalmData newPalm(hand); - hand->getPalms().push_back(newPalm); - palm = &(hand->getPalms()[hand->getNumPalms() - 1]); - palm->setSixenseID(index); - } - - palm->setActive(true); - - // Read controller buttons and joystick into the hand - const QString PRIO_JOYSTICK_NAME = "PrioVR"; - Joystick* prioJoystick = JoystickScriptingInterface::getInstance().joystickWithName(PRIO_JOYSTICK_NAME); - if (prioJoystick) { - const QVector axes = prioJoystick->getAxes(); - const QVector buttons = prioJoystick->getButtons(); - - if (axes.size() >= 4 && buttons.size() >= 4) { - if (index == LEFT_HAND_INDEX) { - palm->setControllerButtons(buttons[1] ? BUTTON_FWD : 0); - palm->setTrigger(buttons[0] ? 1.0f : 0.0f); - palm->setJoystick(axes[0], -axes[1]); - - } else { - palm->setControllerButtons(buttons[3] ? BUTTON_FWD : 0); - palm->setTrigger(buttons[2] ? 1.0f : 0.0f); - palm->setJoystick(axes[2], -axes[3]); - } - } - } - - // NOTE: this math is done in the worl-frame with unecessary complexity. - // TODO: transfom this to stay in the model-frame. - glm::vec3 position; - glm::quat rotation; - SkeletonModel* skeletonModel = &DependencyManager::get()->getMyAvatar()->getSkeletonModel(); - int jointIndex; - glm::quat inverseRotation = glm::inverse(DependencyManager::get()->getMyAvatar()->getOrientation()); - if (index == LEFT_HAND_INDEX) { - jointIndex = skeletonModel->getLeftHandJointIndex(); - skeletonModel->getJointRotationInWorldFrame(jointIndex, rotation); - rotation = inverseRotation * rotation * glm::quat(glm::vec3(0.0f, PI_OVER_TWO, 0.0f)); - - } else { - jointIndex = skeletonModel->getRightHandJointIndex(); - skeletonModel->getJointRotationInWorldFrame(jointIndex, rotation); - rotation = inverseRotation * rotation * glm::quat(glm::vec3(0.0f, -PI_OVER_TWO, 0.0f)); - } - skeletonModel->getJointPositionInWorldFrame(jointIndex, position); - position = inverseRotation * (position - skeletonModel->getTranslation()); - - palm->setRawRotation(rotation); - - // Compute current velocity from position change - glm::vec3 rawVelocity; - if (deltaTime > 0.0f) { - rawVelocity = (position - palm->getRawPosition()) / deltaTime; - } else { - rawVelocity = glm::vec3(0.0f); - } - palm->setRawVelocity(rawVelocity); - palm->setRawPosition(position); - - // Store the one fingertip in the palm structure so we can track velocity - const float FINGER_LENGTH = 0.3f; // meters - const glm::vec3 FINGER_VECTOR(0.0f, 0.0f, FINGER_LENGTH); - const glm::vec3 newTipPosition = position + rotation * FINGER_VECTOR; - glm::vec3 oldTipPosition = palm->getTipRawPosition(); - if (deltaTime > 0.0f) { - palm->setTipVelocity((newTipPosition - oldTipPosition) / deltaTime); - } else { - palm->setTipVelocity(glm::vec3(0.0f)); - } - palm->setTipPosition(newTipPosition); -} -#endif - -PrioVR::PrioVR() { -#ifdef HAVE_PRIOVR - char jointsDiscovered[LIST_LENGTH]; - _skeletalDevice = yei_setUpPrioVRSensors(0x00000000, const_cast(SERIAL_LIST), - const_cast(AXIS_LIST), jointsDiscovered, LIST_LENGTH, YEI_TIMESTAMP_SYSTEM); - if (!_skeletalDevice) { - return; - } - _jointRotations.resize(LIST_LENGTH); - _lastJointRotations.resize(LIST_LENGTH); - for (int i = 0; i < LIST_LENGTH; i++) { - _humanIKJointIndices.append(jointsDiscovered[i] ? indexOfHumanIKJoint(JOINT_NAMES[i]) : -1); - } -#endif -} - -PrioVR::~PrioVR() { -#ifdef HAVE_PRIOVR - if (_skeletalDevice) { - yei_stopStreaming(_skeletalDevice); - } -#endif -} - -const int HEAD_ROTATION_INDEX = 0; - -bool PrioVR::hasHeadRotation() const { - return _humanIKJointIndices.size() > HEAD_ROTATION_INDEX && _humanIKJointIndices.at(HEAD_ROTATION_INDEX) != -1; -} - -glm::quat PrioVR::getHeadRotation() const { - return _jointRotations.size() > HEAD_ROTATION_INDEX ? _jointRotations.at(HEAD_ROTATION_INDEX) : glm::quat(); -} - -glm::quat PrioVR::getTorsoRotation() const { - const int TORSO_ROTATION_INDEX = 1; - return _jointRotations.size() > TORSO_ROTATION_INDEX ? _jointRotations.at(TORSO_ROTATION_INDEX) : glm::quat(); -} - -void PrioVR::update(float deltaTime) { -#ifdef HAVE_PRIOVR - if (!_skeletalDevice) { - return; - } - PerformanceTimer perfTimer("PrioVR"); - unsigned int timestamp; - yei_getLastStreamDataAll(_skeletalDevice, (char*)_jointRotations.data(), - _jointRotations.size() * sizeof(glm::quat), ×tamp); - - // convert to our expected coordinate system, average with last rotations to smooth - for (int i = 0; i < _jointRotations.size(); i++) { - _jointRotations[i].y *= -1.0f; - _jointRotations[i].z *= -1.0f; - - glm::quat lastRotation = _lastJointRotations.at(i); - _lastJointRotations[i] = _jointRotations.at(i); - _jointRotations[i] = safeMix(lastRotation, _jointRotations.at(i), 0.5f); - } - - // convert the joysticks into palm data - setPalm(deltaTime, LEFT_HAND_INDEX); - setPalm(deltaTime, RIGHT_HAND_INDEX); -#endif -} - -void PrioVR::reset() { -#ifdef HAVE_PRIOVR - if (!_skeletalDevice) { - return; - } - connect(Application::getInstance(), SIGNAL(renderingOverlay()), SLOT(renderCalibrationCountdown())); - _calibrationCountdownStarted = QDateTime::currentDateTime(); -#endif -} - -void PrioVR::renderCalibrationCountdown() { -#ifdef HAVE_PRIOVR - const int COUNTDOWN_SECONDS = 3; - int secondsRemaining = COUNTDOWN_SECONDS - _calibrationCountdownStarted.secsTo(QDateTime::currentDateTime()); - if (secondsRemaining == 0) { - yei_tareSensors(_skeletalDevice); - Application::getInstance()->disconnect(this); - return; - } - static TextRenderer* textRenderer = TextRenderer::getInstance(MONO_FONT_FAMILY, 18, QFont::Bold, - false, TextRenderer::OUTLINE_EFFECT, 2); - QByteArray text = "Assume T-Pose in " + QByteArray::number(secondsRemaining) + "..."; - auto glCanvas = Application::getInstance()->getGLWidget(); - textRenderer->draw((glCanvas->width() - textRenderer->computeExtent(text.constData()).x) / 2, - glCanvas->height() / 2, - text, glm::vec4(1,1,1,1)); -#endif -} diff --git a/interface/src/devices/PrioVR.h b/interface/src/devices/PrioVR.h deleted file mode 100644 index bb563bf807..0000000000 --- a/interface/src/devices/PrioVR.h +++ /dev/null @@ -1,65 +0,0 @@ -// -// PrioVR.h -// interface/src/devices -// -// Created by Andrzej Kapolka on 5/12/14. -// Copyright 2014 High Fidelity, Inc. -// -// Distributed under the Apache License, Version 2.0. -// See the accompanying file LICENSE or http://www.apache.org/licenses/LICENSE-2.0.html -// - -#ifndef hifi_PrioVR_h -#define hifi_PrioVR_h - -#include -#include -#include - -#include - -#ifdef HAVE_PRIOVR -extern "C" { -#include -} -#endif - -/// Handles interaction with the PrioVR skeleton tracking suit. -class PrioVR : public QObject { - Q_OBJECT - -public: - - PrioVR(); - virtual ~PrioVR(); - - bool isActive() const { return !_jointRotations.isEmpty(); } - - bool hasHeadRotation() const; - - glm::quat getHeadRotation() const; - glm::quat getTorsoRotation() const; - - const QVector& getHumanIKJointIndices() const { return _humanIKJointIndices; } - const QVector& getJointRotations() const { return _jointRotations; } - - void update(float deltaTime); - void reset(); - -private slots: - - void renderCalibrationCountdown(); - -private: -#ifdef HAVE_PRIOVR - YEI_Device_Id _skeletalDevice; -#endif - - QVector _humanIKJointIndices; - QVector _jointRotations; - QVector _lastJointRotations; - - QDateTime _calibrationCountdownStarted; -}; - -#endif // hifi_PrioVR_h From 5ab3cbb7ecca4d736ea936f4875c0f96769b1f5b Mon Sep 17 00:00:00 2001 From: Sam Gateau Date: Fri, 27 Feb 2015 17:11:16 -0800 Subject: [PATCH 29/40] 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 30/40] 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 0638459052b3510367ec96c8b8f50ac2bcc99f95 Mon Sep 17 00:00:00 2001 From: Ryan Huffman Date: Mon, 2 Mar 2015 09:51:41 -0800 Subject: [PATCH 31/40] Add permission-checking to edit entities --- examples/editEntities.js | 46 ++++++++++++++++++++++++++-------------- 1 file changed, 30 insertions(+), 16 deletions(-) diff --git a/examples/editEntities.js b/examples/editEntities.js index ef6472e4b8..f6c376ba74 100644 --- a/examples/editEntities.js +++ b/examples/editEntities.js @@ -81,6 +81,8 @@ var SETTING_INSPECT_TOOL_ENABLED = "inspectToolEnabled"; var SETTING_AUTO_FOCUS_ON_SELECT = "autoFocusOnSelect"; var SETTING_EASE_ON_FOCUS = "cameraEaseOnFocus"; +var INSUFFICIENT_PERMISSIONS_ERROR_MSG = "You do not have the necessary permissions to edit on this domain." + var modelURLs = [ HIFI_PUBLIC_BUCKET + "models/entities/2-Terrain:%20Alder.fbx", HIFI_PUBLIC_BUCKET + "models/entities/2-Terrain:%20Bush1.fbx", @@ -177,25 +179,29 @@ var toolBar = (function () { that.setActive = function(active) { if (active != isActive) { - isActive = active; - if (!isActive) { - entityListTool.setVisible(false); - gridTool.setVisible(false); - grid.setEnabled(false); - propertiesTool.setVisible(false); - selectionManager.clearSelections(); - cameraManager.disable(); + if (active && !Entities.canAdjustLocks()) { + Window.alert(INSUFFICIENT_PERMISSIONS_ERROR_MSG); } else { - hasShownPropertiesTool = false; - cameraManager.enable(); - entityListTool.setVisible(true); - gridTool.setVisible(true); - grid.setEnabled(true); - propertiesTool.setVisible(true); - Window.setFocus(); + isActive = active; + if (!isActive) { + entityListTool.setVisible(false); + gridTool.setVisible(false); + grid.setEnabled(false); + propertiesTool.setVisible(false); + selectionManager.clearSelections(); + cameraManager.disable(); + } else { + hasShownPropertiesTool = false; + cameraManager.enable(); + entityListTool.setVisible(true); + gridTool.setVisible(true); + grid.setEnabled(true); + propertiesTool.setVisible(true); + Window.setFocus(); + } } } - toolBar.selectTool(activeButton, active); + toolBar.selectTool(activeButton, isActive); }; var RESIZE_INTERVAL = 50; @@ -400,6 +406,14 @@ var toolBar = (function () { that.setActive(false); }); + function checkForPermissionToEdit() { + if (isActive && !Entities.canAdjustLocks()) { + that.setActive(false); + } + } + + Script.setInterval(checkForPermissionToEdit, 1000); + that.cleanup = function () { toolBar.cleanup(); }; From 64cb51785605e5b8f23a5ea9f0b956b13d68cfdb Mon Sep 17 00:00:00 2001 From: Ryan Huffman Date: Mon, 2 Mar 2015 10:40:11 -0800 Subject: [PATCH 32/40] Add LimitedNodeList::canAdjustLocksChanged signal --- libraries/networking/src/LimitedNodeList.cpp | 7 +++++++ libraries/networking/src/LimitedNodeList.h | 6 ++++-- 2 files changed, 11 insertions(+), 2 deletions(-) diff --git a/libraries/networking/src/LimitedNodeList.cpp b/libraries/networking/src/LimitedNodeList.cpp index b240f0df9e..aaecd5bc38 100644 --- a/libraries/networking/src/LimitedNodeList.cpp +++ b/libraries/networking/src/LimitedNodeList.cpp @@ -96,6 +96,13 @@ void LimitedNodeList::setSessionUUID(const QUuid& sessionUUID) { } } +void LimitedNodeList::setThisNodeCanAdjustLocks(bool canAdjustLocks) { + if (_thisNodeCanAdjustLocks != canAdjustLocks) { + _thisNodeCanAdjustLocks = canAdjustLocks; + emit canAdjustLocksChanged(canAdjustLocks); + } +} + QUdpSocket& LimitedNodeList::getDTLSSocket() { if (!_dtlsSocket) { // DTLS socket getter called but no DTLS socket exists, create it now diff --git a/libraries/networking/src/LimitedNodeList.h b/libraries/networking/src/LimitedNodeList.h index afc98de169..fe386f5a49 100644 --- a/libraries/networking/src/LimitedNodeList.h +++ b/libraries/networking/src/LimitedNodeList.h @@ -82,8 +82,8 @@ public: const QUuid& getSessionUUID() const { return _sessionUUID; } void setSessionUUID(const QUuid& sessionUUID); - bool getThisNodeCanAdjustLocks() { return _thisNodeCanAdjustLocks; } - void setThisNodeCanAdjustLocks(bool canAdjustLocks) { _thisNodeCanAdjustLocks = canAdjustLocks; } + bool getThisNodeCanAdjustLocks() const { return _thisNodeCanAdjustLocks; } + void setThisNodeCanAdjustLocks(bool canAdjustLocks); void rebindNodeSocket(); QUdpSocket& getNodeSocket() { return _nodeSocket; } @@ -194,6 +194,8 @@ signals: void localSockAddrChanged(const HifiSockAddr& localSockAddr); void publicSockAddrChanged(const HifiSockAddr& publicSockAddr); + void canAdjustLocksChanged(bool canAdjustLocks); + void dataSent(const quint8 channel_type, const int bytes); void dataReceived(const quint8 channel_type, const int bytes); From 9a302eebedbf24fabd09d021c79128894b151ea3 Mon Sep 17 00:00:00 2001 From: Ryan Huffman Date: Mon, 2 Mar 2015 10:40:29 -0800 Subject: [PATCH 33/40] Add Entities.canAdjustLocksChanged --- libraries/entities/src/EntityScriptingInterface.cpp | 2 ++ libraries/entities/src/EntityScriptingInterface.h | 2 ++ 2 files changed, 4 insertions(+) diff --git a/libraries/entities/src/EntityScriptingInterface.cpp b/libraries/entities/src/EntityScriptingInterface.cpp index 0ee2e243f9..10ed98b0fa 100644 --- a/libraries/entities/src/EntityScriptingInterface.cpp +++ b/libraries/entities/src/EntityScriptingInterface.cpp @@ -19,6 +19,8 @@ EntityScriptingInterface::EntityScriptingInterface() : _nextCreatorTokenID(0), _entityTree(NULL) { + auto nodeList = DependencyManager::get(); + connect(nodeList.data(), &NodeList::canAdjustLocksChanged, this, &EntityScriptingInterface::canAdjustLocksChanged); } void EntityScriptingInterface::queueEntityMessage(PacketType packetType, diff --git a/libraries/entities/src/EntityScriptingInterface.h b/libraries/entities/src/EntityScriptingInterface.h index 6b02d6db0a..50b571541d 100644 --- a/libraries/entities/src/EntityScriptingInterface.h +++ b/libraries/entities/src/EntityScriptingInterface.h @@ -111,6 +111,8 @@ public slots: signals: void entityCollisionWithEntity(const EntityItemID& idA, const EntityItemID& idB, const Collision& collision); + void canAdjustLocksChanged(bool canAdjustLocks); + void mousePressOnEntity(const EntityItemID& entityItemID, const MouseEvent& event); void mouseMoveOnEntity(const EntityItemID& entityItemID, const MouseEvent& event); void mouseReleaseOnEntity(const EntityItemID& entityItemID, const MouseEvent& event); From a443157dd75b5b112f295642cf565fcebed14c8a Mon Sep 17 00:00:00 2001 From: Ryan Huffman Date: Mon, 2 Mar 2015 10:40:46 -0800 Subject: [PATCH 34/40] Update ScriptEngine::entityScriptingInterface to be static pointer Statically allocating the EntityScriptingInterface means we can't make sure it is initialized AFTER NodeList has been initialized --- libraries/script-engine/src/ScriptEngine.cpp | 30 +++++++++++++------- libraries/script-engine/src/ScriptEngine.h | 4 +-- 2 files changed, 21 insertions(+), 13 deletions(-) diff --git a/libraries/script-engine/src/ScriptEngine.cpp b/libraries/script-engine/src/ScriptEngine.cpp index 3bdf9a9fa9..944714552a 100644 --- a/libraries/script-engine/src/ScriptEngine.cpp +++ b/libraries/script-engine/src/ScriptEngine.cpp @@ -44,7 +44,7 @@ #include "MIDIEvent.h" -EntityScriptingInterface ScriptEngine::_entityScriptingInterface; +EntityScriptingInterface* ScriptEngine::_entityScriptingInterface; static QScriptValue debugPrint(QScriptContext* context, QScriptEngine* engine){ qDebug() << "script:print()<<" << context->argument(0).toString(); @@ -73,6 +73,13 @@ void inputControllerFromScriptValue(const QScriptValue &object, AbstractInputCon out = qobject_cast(object.toQObject()); } +EntityScriptingInterface* ScriptEngine::getEntityScriptingInterface() { + if (ScriptEngine::_entityScriptingInterface == nullptr) { + ScriptEngine::_entityScriptingInterface = new EntityScriptingInterface(); + } + return ScriptEngine::_entityScriptingInterface; +} + ScriptEngine::ScriptEngine(const QString& scriptContents, const QString& fileNameString, AbstractControllerScriptingInterface* controllerScriptingInterface) : @@ -97,6 +104,7 @@ ScriptEngine::ScriptEngine(const QString& scriptContents, const QString& fileNam _isUserLoaded(false), _arrayBufferClass(new ArrayBufferClass(this)) { + getEntityScriptingInterface(); _allScriptsMutex.lock(); _allKnownScriptEngines.insert(this); _allScriptsMutex.unlock(); @@ -314,7 +322,7 @@ void ScriptEngine::init() { auto sceneScriptingInterface = DependencyManager::set(); - _entityScriptingInterface.init(); + _entityScriptingInterface->init(); // register various meta-types registerMetaTypes(this); @@ -352,7 +360,7 @@ void ScriptEngine::init() { registerGlobalObject("Script", this); registerGlobalObject("Audio", &AudioScriptingInterface::getInstance()); registerGlobalObject("Controller", _controllerScriptingInterface); - registerGlobalObject("Entities", &_entityScriptingInterface); + registerGlobalObject("Entities", _entityScriptingInterface); registerGlobalObject("Quat", &_quatLibrary); registerGlobalObject("Vec3", &_vec3Library); registerGlobalObject("Uuid", &_uuidLibrary); @@ -489,13 +497,13 @@ void ScriptEngine::run() { break; } - if (!_isFinished && _entityScriptingInterface.getEntityPacketSender()->serversExist()) { + if (!_isFinished && _entityScriptingInterface->getEntityPacketSender()->serversExist()) { // release the queue of edit entity messages. - _entityScriptingInterface.getEntityPacketSender()->releaseQueuedMessages(); + _entityScriptingInterface->getEntityPacketSender()->releaseQueuedMessages(); // since we're in non-threaded mode, call process so that the packets are sent - if (!_entityScriptingInterface.getEntityPacketSender()->isThreaded()) { - _entityScriptingInterface.getEntityPacketSender()->process(); + if (!_entityScriptingInterface->getEntityPacketSender()->isThreaded()) { + _entityScriptingInterface->getEntityPacketSender()->process(); } } @@ -622,13 +630,13 @@ void ScriptEngine::run() { // kill the avatar identity timer delete _avatarIdentityTimer; - if (_entityScriptingInterface.getEntityPacketSender()->serversExist()) { + if (_entityScriptingInterface->getEntityPacketSender()->serversExist()) { // release the queue of edit entity messages. - _entityScriptingInterface.getEntityPacketSender()->releaseQueuedMessages(); + _entityScriptingInterface->getEntityPacketSender()->releaseQueuedMessages(); // since we're in non-threaded mode, call process so that the packets are sent - if (!_entityScriptingInterface.getEntityPacketSender()->isThreaded()) { - _entityScriptingInterface.getEntityPacketSender()->process(); + if (!_entityScriptingInterface->getEntityPacketSender()->isThreaded()) { + _entityScriptingInterface->getEntityPacketSender()->process(); } } diff --git a/libraries/script-engine/src/ScriptEngine.h b/libraries/script-engine/src/ScriptEngine.h index 154fdb88e3..7241baae95 100644 --- a/libraries/script-engine/src/ScriptEngine.h +++ b/libraries/script-engine/src/ScriptEngine.h @@ -47,7 +47,7 @@ public: ~ScriptEngine(); /// Access the EntityScriptingInterface in order to initialize it with a custom packet sender and jurisdiction listener - static EntityScriptingInterface* getEntityScriptingInterface() { return &_entityScriptingInterface; } + static EntityScriptingInterface* getEntityScriptingInterface(); ArrayBufferClass* getArrayBufferClass() { return _arrayBufferClass; } @@ -153,7 +153,7 @@ private: QObject* setupTimerWithInterval(const QScriptValue& function, int intervalMS, bool isSingleShot); void stopTimer(QTimer* timer); - static EntityScriptingInterface _entityScriptingInterface; + static EntityScriptingInterface* _entityScriptingInterface; AbstractControllerScriptingInterface* _controllerScriptingInterface; AvatarData* _avatarData; From 26e3b331eefec82fa60d8208185fb5d1705e3bf0 Mon Sep 17 00:00:00 2001 From: Ryan Huffman Date: Mon, 2 Mar 2015 10:42:09 -0800 Subject: [PATCH 35/40] Update editEntities.js lock checking to use event instead of polling --- examples/editEntities.js | 8 +++----- 1 file changed, 3 insertions(+), 5 deletions(-) diff --git a/examples/editEntities.js b/examples/editEntities.js index f6c376ba74..a0f3cdc167 100644 --- a/examples/editEntities.js +++ b/examples/editEntities.js @@ -406,13 +406,11 @@ var toolBar = (function () { that.setActive(false); }); - function checkForPermissionToEdit() { - if (isActive && !Entities.canAdjustLocks()) { + Entities.canAdjustLocksChanged.connect(function(canAdjustLocks) { + if (isActive && !canAdjustLocks) { that.setActive(false); } - } - - Script.setInterval(checkForPermissionToEdit, 1000); + }); that.cleanup = function () { toolBar.cleanup(); From 75a943386bca326e927d4c95e09417410055ad51 Mon Sep 17 00:00:00 2001 From: Ryan Huffman Date: Mon, 2 Mar 2015 10:44:32 -0800 Subject: [PATCH 36/40] Remove nullptr comparison --- libraries/script-engine/src/ScriptEngine.cpp | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/libraries/script-engine/src/ScriptEngine.cpp b/libraries/script-engine/src/ScriptEngine.cpp index 944714552a..d02b88ec3b 100644 --- a/libraries/script-engine/src/ScriptEngine.cpp +++ b/libraries/script-engine/src/ScriptEngine.cpp @@ -74,7 +74,7 @@ void inputControllerFromScriptValue(const QScriptValue &object, AbstractInputCon } EntityScriptingInterface* ScriptEngine::getEntityScriptingInterface() { - if (ScriptEngine::_entityScriptingInterface == nullptr) { + if (!ScriptEngine::_entityScriptingInterface) { ScriptEngine::_entityScriptingInterface = new EntityScriptingInterface(); } return ScriptEngine::_entityScriptingInterface; From 38a361dcf01050d4d65c415059cbbb34b852dd20 Mon Sep 17 00:00:00 2001 From: Ryan Huffman Date: Mon, 2 Mar 2015 11:32:07 -0800 Subject: [PATCH 37/40] Remove class scope on _entityScriptingInterface property references --- libraries/script-engine/src/ScriptEngine.cpp | 6 +++--- 1 file changed, 3 insertions(+), 3 deletions(-) diff --git a/libraries/script-engine/src/ScriptEngine.cpp b/libraries/script-engine/src/ScriptEngine.cpp index d02b88ec3b..53f1bae436 100644 --- a/libraries/script-engine/src/ScriptEngine.cpp +++ b/libraries/script-engine/src/ScriptEngine.cpp @@ -74,10 +74,10 @@ void inputControllerFromScriptValue(const QScriptValue &object, AbstractInputCon } EntityScriptingInterface* ScriptEngine::getEntityScriptingInterface() { - if (!ScriptEngine::_entityScriptingInterface) { - ScriptEngine::_entityScriptingInterface = new EntityScriptingInterface(); + if (!_entityScriptingInterface) { + _entityScriptingInterface = new EntityScriptingInterface(); } - return ScriptEngine::_entityScriptingInterface; + return _entityScriptingInterface; } ScriptEngine::ScriptEngine(const QString& scriptContents, const QString& fileNameString, From b370e025c9c3c3a34c5759d714c42c8d1dd51c57 Mon Sep 17 00:00:00 2001 From: Ryan Huffman Date: Mon, 2 Mar 2015 15:05:31 -0800 Subject: [PATCH 38/40] Move EntityScriptingInterface instance to DependencyManager --- assignment-client/src/Agent.cpp | 12 ++++--- assignment-client/src/AssignmentClient.cpp | 2 ++ interface/src/Application.cpp | 12 ++++--- .../entities/src/EntityScriptingInterface.h | 3 +- libraries/script-engine/src/ScriptEngine.cpp | 32 +++++++------------ libraries/script-engine/src/ScriptEngine.h | 7 ---- 6 files changed, 31 insertions(+), 37 deletions(-) diff --git a/assignment-client/src/Agent.cpp b/assignment-client/src/Agent.cpp index c545262967..d56db7aace 100644 --- a/assignment-client/src/Agent.cpp +++ b/assignment-client/src/Agent.cpp @@ -44,7 +44,7 @@ Agent::Agent(const QByteArray& packet) : // be the parent of the script engine so it gets moved when we do _scriptEngine.setParent(this); - _scriptEngine.getEntityScriptingInterface()->setPacketSender(&_entityEditSender); + DependencyManager::get()->setPacketSender(&_entityEditSender); DependencyManager::set(); DependencyManager::set(); @@ -68,8 +68,8 @@ void Agent::readPendingDatagrams() { // PacketType_JURISDICTION, first byte is the node type... switch (receivedPacket[headerBytes]) { case NodeType::EntityServer: - _scriptEngine.getEntityScriptingInterface()->getJurisdictionListener()-> - queueReceivedPacket(matchedNode, receivedPacket); + DependencyManager::get()->getJurisdictionListener()-> + queueReceivedPacket(matchedNode, receivedPacket); break; } } @@ -211,10 +211,12 @@ void Agent::run() { _scriptEngine.registerGlobalObject("SoundCache", DependencyManager::get().data()); + auto entityScriptingInterface = DependencyManager::get(); + _scriptEngine.registerGlobalObject("EntityViewer", &_entityViewer); - _entityViewer.setJurisdictionListener(_scriptEngine.getEntityScriptingInterface()->getJurisdictionListener()); + _entityViewer.setJurisdictionListener(entityScriptingInterface->getJurisdictionListener()); _entityViewer.init(); - _scriptEngine.getEntityScriptingInterface()->setEntityTree(_entityViewer.getTree()); + entityScriptingInterface->setEntityTree(_entityViewer.getTree()); _scriptEngine.setScriptContents(scriptContents); _scriptEngine.run(); diff --git a/assignment-client/src/AssignmentClient.cpp b/assignment-client/src/AssignmentClient.cpp index 86680d2f03..fba96c4967 100644 --- a/assignment-client/src/AssignmentClient.cpp +++ b/assignment-client/src/AssignmentClient.cpp @@ -18,6 +18,7 @@ #include #include #include +#include #include #include #include @@ -53,6 +54,7 @@ AssignmentClient::AssignmentClient(Assignment::Type requestAssignmentType, QStri DependencyManager::registerInheritance(); auto addressManager = DependencyManager::set(); auto nodeList = DependencyManager::set(NodeType::Unassigned); + auto entityScriptingInterface = DependencyManager::set(); // make up a uuid for this child so the parent can tell us apart. This id will be changed // when the domain server hands over an assignment. diff --git a/interface/src/Application.cpp b/interface/src/Application.cpp index fe41621dc1..5f372cd2bb 100644 --- a/interface/src/Application.cpp +++ b/interface/src/Application.cpp @@ -241,6 +241,7 @@ bool setupEssentials(int& argc, char** argv) { auto dialogsManager = DependencyManager::set(); auto bandwidthRecorder = DependencyManager::set(); auto resouceCacheSharedItems = DependencyManager::set(); + auto entityScriptingInterface = DependencyManager::set(); #if defined(Q_OS_MAC) || defined(Q_OS_WIN) auto speechRecognizer = DependencyManager::set(); #endif @@ -1766,8 +1767,10 @@ void Application::init() { tree->setSimulation(&_physicsEngine); _physicsEngine.init(&_entityEditSender); + auto entityScriptingInterface = DependencyManager::get(); + connect(&_physicsEngine, &EntitySimulation::entityCollisionWithEntity, - ScriptEngine::getEntityScriptingInterface(), &EntityScriptingInterface::entityCollisionWithEntity); + entityScriptingInterface.data(), &EntityScriptingInterface::entityCollisionWithEntity); // connect the _entityCollisionSystem to our EntityTreeRenderer since that's what handles running entity scripts connect(&_physicsEngine, &EntitySimulation::entityCollisionWithEntity, @@ -1775,7 +1778,7 @@ void Application::init() { // connect the _entities (EntityTreeRenderer) to our script engine's EntityScriptingInterface for firing // of events related clicking, hovering over, and entering entities - _entities.connectSignalsToSlots(ScriptEngine::getEntityScriptingInterface()); + _entities.connectSignalsToSlots(entityScriptingInterface.data()); _entityClipboardRenderer.init(); _entityClipboardRenderer.setViewFrustum(getViewFrustum()); @@ -3441,8 +3444,9 @@ void joystickFromScriptValue(const QScriptValue &object, Joystick* &out) { void Application::registerScriptEngineWithApplicationServices(ScriptEngine* scriptEngine) { // setup the packet senders and jurisdiction listeners of the script engine's scripting interfaces so // we can use the same ones from the application. - scriptEngine->getEntityScriptingInterface()->setPacketSender(&_entityEditSender); - scriptEngine->getEntityScriptingInterface()->setEntityTree(_entities.getTree()); + auto entityScriptingInterface = DependencyManager::get(); + entityScriptingInterface->setPacketSender(&_entityEditSender); + entityScriptingInterface->setEntityTree(_entities.getTree()); // AvatarManager has some custom types AvatarManager::registerMetaTypes(scriptEngine); diff --git a/libraries/entities/src/EntityScriptingInterface.h b/libraries/entities/src/EntityScriptingInterface.h index 50b571541d..bac018f2ae 100644 --- a/libraries/entities/src/EntityScriptingInterface.h +++ b/libraries/entities/src/EntityScriptingInterface.h @@ -17,6 +17,7 @@ #include #include +#include #include #include #include @@ -48,7 +49,7 @@ void RayToEntityIntersectionResultFromScriptValue(const QScriptValue& object, Ra /// handles scripting of Entity commands from JS passed to assigned clients -class EntityScriptingInterface : public OctreeScriptingInterface { +class EntityScriptingInterface : public OctreeScriptingInterface, public Dependency { Q_OBJECT public: EntityScriptingInterface(); diff --git a/libraries/script-engine/src/ScriptEngine.cpp b/libraries/script-engine/src/ScriptEngine.cpp index 53f1bae436..df327b9c5c 100644 --- a/libraries/script-engine/src/ScriptEngine.cpp +++ b/libraries/script-engine/src/ScriptEngine.cpp @@ -44,8 +44,6 @@ #include "MIDIEvent.h" -EntityScriptingInterface* ScriptEngine::_entityScriptingInterface; - static QScriptValue debugPrint(QScriptContext* context, QScriptEngine* engine){ qDebug() << "script:print()<<" << context->argument(0).toString(); QString message = context->argument(0).toString() @@ -73,13 +71,6 @@ void inputControllerFromScriptValue(const QScriptValue &object, AbstractInputCon out = qobject_cast(object.toQObject()); } -EntityScriptingInterface* ScriptEngine::getEntityScriptingInterface() { - if (!_entityScriptingInterface) { - _entityScriptingInterface = new EntityScriptingInterface(); - } - return _entityScriptingInterface; -} - ScriptEngine::ScriptEngine(const QString& scriptContents, const QString& fileNameString, AbstractControllerScriptingInterface* controllerScriptingInterface) : @@ -104,7 +95,6 @@ ScriptEngine::ScriptEngine(const QString& scriptContents, const QString& fileNam _isUserLoaded(false), _arrayBufferClass(new ArrayBufferClass(this)) { - getEntityScriptingInterface(); _allScriptsMutex.lock(); _allKnownScriptEngines.insert(this); _allScriptsMutex.unlock(); @@ -322,7 +312,8 @@ void ScriptEngine::init() { auto sceneScriptingInterface = DependencyManager::set(); - _entityScriptingInterface->init(); + auto entityScriptingInterface = DependencyManager::get(); + entityScriptingInterface->init(); // register various meta-types registerMetaTypes(this); @@ -360,7 +351,7 @@ void ScriptEngine::init() { registerGlobalObject("Script", this); registerGlobalObject("Audio", &AudioScriptingInterface::getInstance()); registerGlobalObject("Controller", _controllerScriptingInterface); - registerGlobalObject("Entities", _entityScriptingInterface); + registerGlobalObject("Entities", entityScriptingInterface.data()); registerGlobalObject("Quat", &_quatLibrary); registerGlobalObject("Vec3", &_vec3Library); registerGlobalObject("Uuid", &_uuidLibrary); @@ -478,6 +469,7 @@ void ScriptEngine::run() { int thisFrame = 0; auto nodeList = DependencyManager::get(); + auto entityScriptingInterface = DependencyManager::get(); qint64 lastUpdate = usecTimestampNow(); @@ -497,13 +489,13 @@ void ScriptEngine::run() { break; } - if (!_isFinished && _entityScriptingInterface->getEntityPacketSender()->serversExist()) { + if (!_isFinished && entityScriptingInterface->getEntityPacketSender()->serversExist()) { // release the queue of edit entity messages. - _entityScriptingInterface->getEntityPacketSender()->releaseQueuedMessages(); + entityScriptingInterface->getEntityPacketSender()->releaseQueuedMessages(); // since we're in non-threaded mode, call process so that the packets are sent - if (!_entityScriptingInterface->getEntityPacketSender()->isThreaded()) { - _entityScriptingInterface->getEntityPacketSender()->process(); + if (!entityScriptingInterface->getEntityPacketSender()->isThreaded()) { + entityScriptingInterface->getEntityPacketSender()->process(); } } @@ -630,13 +622,13 @@ void ScriptEngine::run() { // kill the avatar identity timer delete _avatarIdentityTimer; - if (_entityScriptingInterface->getEntityPacketSender()->serversExist()) { + if (entityScriptingInterface->getEntityPacketSender()->serversExist()) { // release the queue of edit entity messages. - _entityScriptingInterface->getEntityPacketSender()->releaseQueuedMessages(); + entityScriptingInterface->getEntityPacketSender()->releaseQueuedMessages(); // since we're in non-threaded mode, call process so that the packets are sent - if (!_entityScriptingInterface->getEntityPacketSender()->isThreaded()) { - _entityScriptingInterface->getEntityPacketSender()->process(); + if (!entityScriptingInterface->getEntityPacketSender()->isThreaded()) { + entityScriptingInterface->getEntityPacketSender()->process(); } } diff --git a/libraries/script-engine/src/ScriptEngine.h b/libraries/script-engine/src/ScriptEngine.h index 7241baae95..84d2527bd0 100644 --- a/libraries/script-engine/src/ScriptEngine.h +++ b/libraries/script-engine/src/ScriptEngine.h @@ -31,8 +31,6 @@ #include "ScriptUUID.h" #include "Vec3.h" -class EntityScriptingInterface; - const QString NO_SCRIPT(""); const unsigned int SCRIPT_DATA_CALLBACK_USECS = floor(((1.0 / 60.0f) * 1000 * 1000) + 0.5); @@ -46,9 +44,6 @@ public: ~ScriptEngine(); - /// Access the EntityScriptingInterface in order to initialize it with a custom packet sender and jurisdiction listener - static EntityScriptingInterface* getEntityScriptingInterface(); - ArrayBufferClass* getArrayBufferClass() { return _arrayBufferClass; } /// sets the script contents, will return false if failed, will fail if script is already running @@ -153,8 +148,6 @@ private: QObject* setupTimerWithInterval(const QScriptValue& function, int intervalMS, bool isSingleShot); void stopTimer(QTimer* timer); - static EntityScriptingInterface* _entityScriptingInterface; - AbstractControllerScriptingInterface* _controllerScriptingInterface; AvatarData* _avatarData; QString _scriptName; From 598b791aeed5c2139a5b2906d7885fc0df6885c1 Mon Sep 17 00:00:00 2001 From: Sam Gateau Date: Tue, 3 Mar 2015 11:01:47 -0800 Subject: [PATCH 39/40] 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 40/40] 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) {