From 03da3aeab4afcbcba1aad6a858e417428ebc62ba Mon Sep 17 00:00:00 2001 From: Sam Gateau Date: Tue, 17 Mar 2015 16:15:10 -0700 Subject: [PATCH 01/15] Clean up on the GPU Profile defines in order to control features --- libraries/gpu/src/gpu/Config.slh | 6 ++++ libraries/gpu/src/gpu/GLBackendPipeline.cpp | 12 ++++---- libraries/gpu/src/gpu/GLBackendShader.cpp | 6 ++-- libraries/gpu/src/gpu/GLBackendTransform.cpp | 12 +++----- libraries/gpu/src/gpu/GPUConfig.h | 8 +++++ libraries/gpu/src/gpu/Transform.slh | 19 ++---------- libraries/model/src/model/Light.h | 29 +++++++------------ libraries/model/src/model/Light.slh | 19 ++---------- libraries/model/src/model/Material.h | 21 +++++--------- libraries/model/src/model/Material.slh | 26 ++++------------- .../src/DeferredLightingEffect.cpp | 19 ++---------- libraries/render-utils/src/Model.cpp | 14 +++------ libraries/render-utils/src/Shadow.slh | 4 +-- 13 files changed, 64 insertions(+), 131 deletions(-) diff --git a/libraries/gpu/src/gpu/Config.slh b/libraries/gpu/src/gpu/Config.slh index b17bd7b2b8..011f9d96d0 100644 --- a/libraries/gpu/src/gpu/Config.slh +++ b/libraries/gpu/src/gpu/Config.slh @@ -12,10 +12,16 @@ <@def GPU_CONFIG_SLH@> <@if GLPROFILE == PC_GL @> + <@def GPU_FEATURE_PROFILE Core@> + <@def GPU_TRANSFORM_PROFILE Core@> <@def VERSION_HEADER #version 330 compatibility@> <@elif GLPROFILE == MAC_GL @> + <@def GPU_FEATURE_PROFILE Legacy@> + <@def GPU_TRANSFORM_PROFILE Legacy@> <@def VERSION_HEADER #version 120@> <@else@> + <@def GPU_FEATURE_PROFILE Legacy@> + <@def GPU_TRANSFORM_PROFILE Legacy@> <@def VERSION_HEADER #version 120@> <@endif@> diff --git a/libraries/gpu/src/gpu/GLBackendPipeline.cpp b/libraries/gpu/src/gpu/GLBackendPipeline.cpp index eba904ae4f..56df4d0178 100755 --- a/libraries/gpu/src/gpu/GLBackendPipeline.cpp +++ b/libraries/gpu/src/gpu/GLBackendPipeline.cpp @@ -55,19 +55,17 @@ void GLBackend::do_setUniformBuffer(Batch& batch, uint32 paramOffset) { BufferPointer uniformBuffer = batch._buffers.get(batch._params[paramOffset + 2]._uint); GLintptr rangeStart = batch._params[paramOffset + 1]._uint; GLsizeiptr rangeSize = batch._params[paramOffset + 0]._uint; -#if defined(Q_OS_MAC) + +#if (GPU_FEATURE_PROFILE == Core) + GLuint bo = getBufferID(*uniformBuffer); + glBindBufferRange(GL_UNIFORM_BUFFER, slot, bo, rangeStart, rangeSize); +#else GLfloat* data = (GLfloat*) (uniformBuffer->getData() + rangeStart); glUniform4fv(slot, rangeSize / sizeof(GLfloat[4]), data); // NOT working so we ll stick to the uniform float array until we move to core profile // GLuint bo = getBufferID(*uniformBuffer); //glUniformBufferEXT(_shader._program, slot, bo); -#elif defined(Q_OS_WIN) - GLuint bo = getBufferID(*uniformBuffer); - glBindBufferRange(GL_UNIFORM_BUFFER, slot, bo, rangeStart, rangeSize); -#else - GLfloat* data = (GLfloat*) (uniformBuffer->getData() + rangeStart); - glUniform4fv(slot, rangeSize / sizeof(GLfloat[4]), data); #endif CHECK_GL_ERROR(); } diff --git a/libraries/gpu/src/gpu/GLBackendShader.cpp b/libraries/gpu/src/gpu/GLBackendShader.cpp index 9bcc278d8e..0a74ca69ca 100755 --- a/libraries/gpu/src/gpu/GLBackendShader.cpp +++ b/libraries/gpu/src/gpu/GLBackendShader.cpp @@ -88,7 +88,7 @@ void makeBindings(GLBackend::GLShader* shader) { // now assign the ubo binding, then DON't relink! //Check for gpu specific uniform slotBindings -#if defined(Q_OS_WIN) +#if (GPU_TRANSFORM_PROFILE == Core) loc = glGetUniformBlockIndex(glprogram, "transformObjectBuffer"); if (loc >= 0) { glUniformBlockBinding(glprogram, loc, gpu::TRANSFORM_OBJECT_SLOT); @@ -551,7 +551,9 @@ bool isUnusedSlot(GLint binding) { int makeUniformBlockSlots(GLuint glprogram, const Shader::BindingSet& slotBindings, Shader::SlotSet& buffers) { GLint buffersCount = 0; -#if defined(Q_OS_WIN) + +#if (GPU_FEATURE_PROFILE == Core) + glGetProgramiv(glprogram, GL_ACTIVE_UNIFORM_BLOCKS, &buffersCount); // fast exit diff --git a/libraries/gpu/src/gpu/GLBackendTransform.cpp b/libraries/gpu/src/gpu/GLBackendTransform.cpp index 6e928bcf09..ad6d4b2395 100755 --- a/libraries/gpu/src/gpu/GLBackendTransform.cpp +++ b/libraries/gpu/src/gpu/GLBackendTransform.cpp @@ -32,7 +32,7 @@ void GLBackend::do_setProjectionTransform(Batch& batch, uint32 paramOffset) { } void GLBackend::initTransform() { -#if defined(Q_OS_WIN) + #if (GPU_TRANSFORM_PROFILE == Core) glGenBuffers(1, &_transform._transformObjectBuffer); glGenBuffers(1, &_transform._transformCameraBuffer); @@ -49,7 +49,7 @@ void GLBackend::initTransform() { } void GLBackend::killTransform() { -#if defined(Q_OS_WIN) + #if (GPU_TRANSFORM_PROFILE == Core) glDeleteBuffers(1, &_transform._transformObjectBuffer); glDeleteBuffers(1, &_transform._transformCameraBuffer); #else @@ -77,34 +77,30 @@ void GLBackend::updateTransform() { _transform._transformCamera._projectionViewUntranslated = _transform._transformCamera._projection * viewUntranslated; } + #if (GPU_TRANSFORM_PROFILE == Core) if (_transform._invalidView || _transform._invalidProj) { -#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); glBindBuffer(GL_ARRAY_BUFFER, 0); CHECK_GL_ERROR(); -#endif } if (_transform._invalidModel) { -#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); glBindBuffer(GL_ARRAY_BUFFER, 0); CHECK_GL_ERROR(); -#endif } -#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) || defined(Q_OS_LINUX) +#if (GPU_TRANSFORM_PROFILE == Legacy) // Do it again for fixed pipeline until we can get rid of it if (_transform._invalidProj) { if (_transform._lastMode != GL_PROJECTION) { diff --git a/libraries/gpu/src/gpu/GPUConfig.h b/libraries/gpu/src/gpu/GPUConfig.h index 5894d2a91d..9372eb0dbf 100644 --- a/libraries/gpu/src/gpu/GPUConfig.h +++ b/libraries/gpu/src/gpu/GPUConfig.h @@ -18,17 +18,25 @@ #include #include +#define GPU_FEATURE_PROFILE Core +#define GPU_TRANSFORM_PROFILE Core + #elif defined(WIN32) #include #include #include +#define GPU_FEATURE_PROFILE Legacy +#define GPU_TRANSFORM_PROFILE Legacy + #elif defined(ANDROID) #else #include #include +#define GPU_FEATURE_PROFILE Legacy +#define GPU_TRANSFORM_PROFILE Legacy #endif diff --git a/libraries/gpu/src/gpu/Transform.slh b/libraries/gpu/src/gpu/Transform.slh index d3d2629c2e..6779386065 100644 --- a/libraries/gpu/src/gpu/Transform.slh +++ b/libraries/gpu/src/gpu/Transform.slh @@ -24,9 +24,7 @@ struct TransformCamera { }; vec4 transformModelToClipPos(TransformCamera camera, TransformObject object, vec4 pos) { -<@if GLPROFILE == MAC_GL@> - return gl_ModelViewProjectionMatrix * pos; -<@elif GLPROFILE == PC_GL@> +<@if GPU_TRANSFORM_PROFILE == GPUCore@> 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 @@ -37,9 +35,7 @@ vec4 transformModelToClipPos(TransformCamera camera, TransformObject object, vec } vec3 transformModelToEyeDir(TransformCamera camera, TransformObject object, vec3 dir) { -<@if GLPROFILE == MAC_GL@> - return gl_NormalMatrix * dir; -<@elif GLPROFILE == PC_GL@> +<@if GPU_TRANSFORM_PROFILE == GPUCore@> 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); @@ -56,7 +52,7 @@ vec3 transformModelToEyeDir(TransformCamera camera, TransformObject object, vec3 <@endif@> } -<@if GLPROFILE == PC_GL@> +<@if GPU_TRANSFORM_PROFILE == GPUCore@> uniform transformObjectBuffer { TransformObject object; }; @@ -70,16 +66,7 @@ uniform transformCameraBuffer { TransformCamera getTransformCamera() { return camera; } -<@elif GLPROFILE == MAC_GL@> -TransformObject getTransformObject() { - TransformObject object; - return object; -} -TransformCamera getTransformCamera() { - TransformCamera camera; - return camera; -} <@else@> TransformObject getTransformObject() { diff --git a/libraries/model/src/model/Light.h b/libraries/model/src/model/Light.h index 2ef2bf3036..2c76714740 100755 --- a/libraries/model/src/model/Light.h +++ b/libraries/model/src/model/Light.h @@ -252,27 +252,18 @@ public: // Schema to access the attribute values of the light class Schema { public: - Vec4 _position; - Vec3 _direction; - float _spare0; - Color _color; - float _intensity; - Vec4 _attenuation; - Vec4 _spot; - Vec4 _shadow; + Vec4 _position = Vec4(0.0f, 0.0f, 0.0f, 1.0f); + Vec3 _direction = Vec3(0.0f, 0.0f, -1.0f); + float _spare0 = 0.0f; + Color _color = Color(1.0f); + float _intensity = 1.0f; + Vec4 _attenuation = Vec4(1.0f); + Vec4 _spot = Vec4(0.0f, 0.0f, 0.0f, 3.0f); + Vec4 _shadow = Vec4(0.0f); - Vec4 _control; + Vec4 _control = Vec4(0.0f); - Schema() : - _position(0.0f, 0.0f, 0.0f, 1.0f), - _direction(0.0f, 0.0f, -1.0f), - _spare0(0.f), - _color(1.0f), - _intensity(1.0f), - _attenuation(1.0f, 1.0f, 1.0f, 1.0f), - _spot(0.0f, 0.0f, 0.0f, 3.0f), - _control(0.0f) - {} + Schema() {} }; const UniformBufferView& getSchemaBuffer() const { return _schemaBuffer; } diff --git a/libraries/model/src/model/Light.slh b/libraries/model/src/model/Light.slh index fc17e94050..5a65bf7d18 100644 --- a/libraries/model/src/model/Light.slh +++ b/libraries/model/src/model/Light.slh @@ -19,7 +19,6 @@ struct Light { vec4 _spot; vec4 _shadow; - vec4 _control; }; @@ -65,29 +64,15 @@ float getLightShowContour(Light l) { return l._control.w; } -<@if GLPROFILE == PC_GL@> +<@if GPU_FEATURE_PROFILE == Core @> uniform lightBuffer { Light light; }; Light getLight() { return light; } -<@elif GLPROFILE == MAC_GL@> -uniform vec4 lightBuffer[9]; -Light getLight() { - Light light; - light._position = lightBuffer[0]; - light._direction = lightBuffer[1]; - light._color = lightBuffer[2]; - light._attenuation = lightBuffer[3]; - light._spot = lightBuffer[4]; - light._shadow = lightBuffer[5]; - light._control = lightBuffer[6]; - - return light; -} <@else@> -uniform vec4 lightBuffer[9]; +uniform vec4 lightBuffer[7]; Light getLight() { Light light; light._position = lightBuffer[0]; diff --git a/libraries/model/src/model/Material.h b/libraries/model/src/model/Material.h index 2718b1dfa8..865fd6dfb1 100755 --- a/libraries/model/src/model/Material.h +++ b/libraries/model/src/model/Material.h @@ -79,20 +79,15 @@ public: class Schema { public: - Color _diffuse; - float _opacity; - Color _specular; - float _shininess; - Color _emissive; - float _spare0; + Color _diffuse = Color(0.5f); + float _opacity = 1.f; + Color _specular = Color(0.03f); + float _shininess = 0.1f; + Color _emissive = Color(0.0f); + float _spare0 = 0.0f; + glm::vec4 _spareVec4 = glm::vec4(0.0f); // for alignment beauty, Mat size == Mat4x4 - Schema() : - _diffuse(0.5f), - _opacity(1.0f), - _specular(0.03f), - _shininess(0.1f), - _emissive(0.0f) - {} + Schema() {} }; const UniformBufferView& getSchemaBuffer() const { return _schemaBuffer; } diff --git a/libraries/model/src/model/Material.slh b/libraries/model/src/model/Material.slh index 9ea269f214..739b60502e 100644 --- a/libraries/model/src/model/Material.slh +++ b/libraries/model/src/model/Material.slh @@ -14,7 +14,8 @@ struct Material { vec4 _diffuse; vec4 _specular; - + vec4 _emissive; + vec4 _spare; }; float getMaterialOpacity(Material m) { return m._diffuse.a; } @@ -24,36 +25,21 @@ float getMaterialShininess(Material m) { return m._specular.a; } -<@if GLPROFILE == PC_GL@> +<@if GPU_FEATURE_PROFILE == Core@> uniform materialBuffer { Material _mat; }; Material getMaterial() { return _mat; } -<@elif GLPROFILE == MAC_GL@> -uniform vec4 materialBuffer[2]; -Material getMaterial() { - Material mat; - mat._diffuse = materialBuffer[0]; - mat._specular = materialBuffer[1]; - return mat; -} - <@else@> -uniform vec4 materialBuffer[2]; +uniform vec4 materialBuffer[4]; Material getMaterial() { Material mat; mat._diffuse = materialBuffer[0]; mat._specular = materialBuffer[1]; + mat._emissive = materialBuffer[2]; + mat._spare = materialBuffer[3]; return mat; } <@endif@> diff --git a/libraries/render-utils/src/DeferredLightingEffect.cpp b/libraries/render-utils/src/DeferredLightingEffect.cpp index 96ab790cd6..ccfe25297c 100644 --- a/libraries/render-utils/src/DeferredLightingEffect.cpp +++ b/libraries/render-utils/src/DeferredLightingEffect.cpp @@ -494,14 +494,8 @@ void DeferredLightingEffect::loadLightProgram(const char* fragSource, bool limit locations.invViewMat = program.uniformLocation("invViewMat"); GLint loc = -1; -#if defined(Q_OS_MAC) - loc = program.uniformLocation("lightBuffer"); - if (loc >= 0) { - locations.lightBufferUnit = loc; - } else { - locations.lightBufferUnit = -1; - } -#elif defined(Q_OS_WIN) + +#if (GPU_FEATURE_PROFILE == Core) loc = glGetUniformBlockIndex(program.programId(), "lightBuffer"); if (loc >= 0) { glUniformBlockBinding(program.programId(), loc, 0); @@ -518,14 +512,7 @@ void DeferredLightingEffect::loadLightProgram(const char* fragSource, bool limit } #endif -#if defined(Q_OS_MAC) - loc = program.uniformLocation("atmosphereBufferUnit"); - if (loc >= 0) { - locations.atmosphereBufferUnit = loc; - } else { - locations.atmosphereBufferUnit = -1; - } -#elif defined(Q_OS_WIN) +#if (GPU_FEATURE_PROFILE == Core) loc = glGetUniformBlockIndex(program.programId(), "atmosphereBufferUnit"); if (loc >= 0) { glUniformBlockBinding(program.programId(), loc, 1); diff --git a/libraries/render-utils/src/Model.cpp b/libraries/render-utils/src/Model.cpp index be2e7b4aec..d3369572ff 100644 --- a/libraries/render-utils/src/Model.cpp +++ b/libraries/render-utils/src/Model.cpp @@ -199,14 +199,8 @@ void Model::initProgram(ProgramObject& program, Model::Locations& locations, boo } // bindable uniform version -#if defined(Q_OS_MAC) - loc = program.uniformLocation("materialBuffer"); - if (loc >= 0) { - locations.materialBufferUnit = loc; - } else { - locations.materialBufferUnit = -1; - } -#elif defined(Q_OS_WIN) + +#if (GPU_FEATURE_PROFILE == Core) loc = glGetUniformBlockIndex(program.programId(), "materialBuffer"); if (loc >= 0) { glUniformBlockBinding(program.programId(), loc, 1); @@ -223,7 +217,7 @@ void Model::initProgram(ProgramObject& program, Model::Locations& locations, boo } #endif -#if defined(Q_OS_WIN) +#if (GPU_FEATURE_PROFILE == Core) loc = glGetUniformBlockIndex(program.programId(), "transformObjectBuffer"); if (loc >= 0) { glUniformBlockBinding(program.programId(), loc, gpu::TRANSFORM_OBJECT_SLOT); @@ -231,7 +225,7 @@ void Model::initProgram(ProgramObject& program, Model::Locations& locations, boo } #endif -#if defined(Q_OS_WIN) +#if (GPU_FEATURE_PROFILE == Core) loc = glGetUniformBlockIndex(program.programId(), "transformCameraBuffer"); if (loc >= 0) { glUniformBlockBinding(program.programId(), loc, gpu::TRANSFORM_CAMERA_SLOT); diff --git a/libraries/render-utils/src/Shadow.slh b/libraries/render-utils/src/Shadow.slh index d4c19915ff..70c0ac02de 100755 --- a/libraries/render-utils/src/Shadow.slh +++ b/libraries/render-utils/src/Shadow.slh @@ -16,10 +16,8 @@ uniform sampler2DShadow shadowMap; // Fetching it float fetchShadow(vec3 texcoord) { -<@if GLPROFILE == PC_GL @> +<@if GPU_FEATURE_PROFILE == Core @> return texture(shadowMap, texcoord); -<@elif GLPROFILE == MAC_GL@> - return shadow2D(shadowMap, texcoord).r; <@else@> return shadow2D(shadowMap, texcoord).r; <@endif@> From 74ae0c4a8596b54eaf1d65549d12dbb0131cc247 Mon Sep 17 00:00:00 2001 From: Sam Gateau Date: Tue, 17 Mar 2015 16:35:32 -0700 Subject: [PATCH 02/15] set the defines for GPU profile correctly --- libraries/gpu/src/gpu/GPUConfig.h | 8 ++++---- 1 file changed, 4 insertions(+), 4 deletions(-) diff --git a/libraries/gpu/src/gpu/GPUConfig.h b/libraries/gpu/src/gpu/GPUConfig.h index 9372eb0dbf..8308860c82 100644 --- a/libraries/gpu/src/gpu/GPUConfig.h +++ b/libraries/gpu/src/gpu/GPUConfig.h @@ -18,16 +18,16 @@ #include #include -#define GPU_FEATURE_PROFILE Core -#define GPU_TRANSFORM_PROFILE Core +#define GPU_FEATURE_PROFILE Legacy +#define GPU_TRANSFORM_PROFILE Legacy #elif defined(WIN32) #include #include #include -#define GPU_FEATURE_PROFILE Legacy -#define GPU_TRANSFORM_PROFILE Legacy +#define GPU_FEATURE_PROFILE Core +#define GPU_TRANSFORM_PROFILE Core #elif defined(ANDROID) From 5a40fcee172ba5c3683148c55e416448024dfbf1 Mon Sep 17 00:00:00 2001 From: Sam Gateau Date: Tue, 17 Mar 2015 16:51:59 -0700 Subject: [PATCH 03/15] set the defines for GPU profile correctly AGAIN --- libraries/gpu/src/gpu/Config.slh | 12 ++++++------ libraries/gpu/src/gpu/GLBackendPipeline.cpp | 2 +- libraries/gpu/src/gpu/GLBackendShader.cpp | 4 ++-- libraries/gpu/src/gpu/GLBackendTransform.cpp | 8 ++++---- libraries/gpu/src/gpu/GPUConfig.h | 15 +++++++++------ libraries/gpu/src/gpu/Transform.slh | 6 +++--- libraries/model/src/model/Light.slh | 2 +- libraries/model/src/model/Material.slh | 2 +- .../render-utils/src/DeferredLightingEffect.cpp | 4 ++-- libraries/render-utils/src/Model.cpp | 6 +++--- libraries/render-utils/src/Shadow.slh | 2 +- 11 files changed, 33 insertions(+), 30 deletions(-) diff --git a/libraries/gpu/src/gpu/Config.slh b/libraries/gpu/src/gpu/Config.slh index 011f9d96d0..7a51de594a 100644 --- a/libraries/gpu/src/gpu/Config.slh +++ b/libraries/gpu/src/gpu/Config.slh @@ -12,16 +12,16 @@ <@def GPU_CONFIG_SLH@> <@if GLPROFILE == PC_GL @> - <@def GPU_FEATURE_PROFILE Core@> - <@def GPU_TRANSFORM_PROFILE Core@> + <@def GPU_FEATURE_PROFILE GPU_CORE@> + <@def GPU_TRANSFORM_PROFILE GPU_CORE@> <@def VERSION_HEADER #version 330 compatibility@> <@elif GLPROFILE == MAC_GL @> - <@def GPU_FEATURE_PROFILE Legacy@> - <@def GPU_TRANSFORM_PROFILE Legacy@> + <@def GPU_FEATURE_PROFILE GPU_LEGACY@> + <@def GPU_TRANSFORM_PROFILE GPU_LEGACY@> <@def VERSION_HEADER #version 120@> <@else@> - <@def GPU_FEATURE_PROFILE Legacy@> - <@def GPU_TRANSFORM_PROFILE Legacy@> + <@def GPU_FEATURE_PROFILE GPU_LEGACY@> + <@def GPU_TRANSFORM_PROFILE GPU_LEGACY@> <@def VERSION_HEADER #version 120@> <@endif@> diff --git a/libraries/gpu/src/gpu/GLBackendPipeline.cpp b/libraries/gpu/src/gpu/GLBackendPipeline.cpp index 56df4d0178..aee3f009d1 100755 --- a/libraries/gpu/src/gpu/GLBackendPipeline.cpp +++ b/libraries/gpu/src/gpu/GLBackendPipeline.cpp @@ -56,7 +56,7 @@ void GLBackend::do_setUniformBuffer(Batch& batch, uint32 paramOffset) { GLintptr rangeStart = batch._params[paramOffset + 1]._uint; GLsizeiptr rangeSize = batch._params[paramOffset + 0]._uint; -#if (GPU_FEATURE_PROFILE == Core) +#if (GPU_FEATURE_PROFILE == GPU_CORE) GLuint bo = getBufferID(*uniformBuffer); glBindBufferRange(GL_UNIFORM_BUFFER, slot, bo, rangeStart, rangeSize); #else diff --git a/libraries/gpu/src/gpu/GLBackendShader.cpp b/libraries/gpu/src/gpu/GLBackendShader.cpp index 0a74ca69ca..48ae0eb7c9 100755 --- a/libraries/gpu/src/gpu/GLBackendShader.cpp +++ b/libraries/gpu/src/gpu/GLBackendShader.cpp @@ -88,7 +88,7 @@ void makeBindings(GLBackend::GLShader* shader) { // now assign the ubo binding, then DON't relink! //Check for gpu specific uniform slotBindings -#if (GPU_TRANSFORM_PROFILE == Core) +#if (GPU_TRANSFORM_PROFILE == GPU_CORE) loc = glGetUniformBlockIndex(glprogram, "transformObjectBuffer"); if (loc >= 0) { glUniformBlockBinding(glprogram, loc, gpu::TRANSFORM_OBJECT_SLOT); @@ -552,7 +552,7 @@ bool isUnusedSlot(GLint binding) { int makeUniformBlockSlots(GLuint glprogram, const Shader::BindingSet& slotBindings, Shader::SlotSet& buffers) { GLint buffersCount = 0; -#if (GPU_FEATURE_PROFILE == Core) +#if (GPU_FEATURE_PROFILE == GPU_CORE) glGetProgramiv(glprogram, GL_ACTIVE_UNIFORM_BLOCKS, &buffersCount); diff --git a/libraries/gpu/src/gpu/GLBackendTransform.cpp b/libraries/gpu/src/gpu/GLBackendTransform.cpp index ad6d4b2395..f0318a66aa 100755 --- a/libraries/gpu/src/gpu/GLBackendTransform.cpp +++ b/libraries/gpu/src/gpu/GLBackendTransform.cpp @@ -32,7 +32,7 @@ void GLBackend::do_setProjectionTransform(Batch& batch, uint32 paramOffset) { } void GLBackend::initTransform() { - #if (GPU_TRANSFORM_PROFILE == Core) + #if (GPU_TRANSFORM_PROFILE == GPU_CORE) glGenBuffers(1, &_transform._transformObjectBuffer); glGenBuffers(1, &_transform._transformCameraBuffer); @@ -49,7 +49,7 @@ void GLBackend::initTransform() { } void GLBackend::killTransform() { - #if (GPU_TRANSFORM_PROFILE == Core) + #if (GPU_TRANSFORM_PROFILE == GPU_CORE) glDeleteBuffers(1, &_transform._transformObjectBuffer); glDeleteBuffers(1, &_transform._transformCameraBuffer); #else @@ -77,7 +77,7 @@ void GLBackend::updateTransform() { _transform._transformCamera._projectionViewUntranslated = _transform._transformCamera._projection * viewUntranslated; } - #if (GPU_TRANSFORM_PROFILE == Core) + #if (GPU_TRANSFORM_PROFILE == GPU_CORE) if (_transform._invalidView || _transform._invalidProj) { glBindBufferBase(GL_UNIFORM_BUFFER, TRANSFORM_CAMERA_SLOT, 0); glBindBuffer(GL_ARRAY_BUFFER, _transform._transformCameraBuffer); @@ -100,7 +100,7 @@ void GLBackend::updateTransform() { #endif -#if (GPU_TRANSFORM_PROFILE == Legacy) +#if (GPU_TRANSFORM_PROFILE == GPU_LEGACY) // Do it again for fixed pipeline until we can get rid of it if (_transform._invalidProj) { if (_transform._lastMode != GL_PROJECTION) { diff --git a/libraries/gpu/src/gpu/GPUConfig.h b/libraries/gpu/src/gpu/GPUConfig.h index 8308860c82..0b2d93b18d 100644 --- a/libraries/gpu/src/gpu/GPUConfig.h +++ b/libraries/gpu/src/gpu/GPUConfig.h @@ -14,20 +14,23 @@ #define GL_GLEXT_PROTOTYPES 1 +#define GPU_CORE 1 +#define GPU_LEGACY 0 + #if defined(__APPLE__) #include #include -#define GPU_FEATURE_PROFILE Legacy -#define GPU_TRANSFORM_PROFILE Legacy +#define GPU_FEATURE_PROFILE GPU_LEGACY +#define GPU_TRANSFORM_PROFILE GPU_LEGACY #elif defined(WIN32) #include #include #include -#define GPU_FEATURE_PROFILE Core -#define GPU_TRANSFORM_PROFILE Core +#define GPU_FEATURE_PROFILE GPU_CORE +#define GPU_TRANSFORM_PROFILE GPU_CORE #elif defined(ANDROID) @@ -35,8 +38,8 @@ #include #include -#define GPU_FEATURE_PROFILE Legacy -#define GPU_TRANSFORM_PROFILE Legacy +#define GPU_FEATURE_PROFILE GPU_LEGACY +#define GPU_TRANSFORM_PROFILE GPU_LEGACY #endif diff --git a/libraries/gpu/src/gpu/Transform.slh b/libraries/gpu/src/gpu/Transform.slh index 6779386065..355713f9ae 100644 --- a/libraries/gpu/src/gpu/Transform.slh +++ b/libraries/gpu/src/gpu/Transform.slh @@ -24,7 +24,7 @@ struct TransformCamera { }; vec4 transformModelToClipPos(TransformCamera camera, TransformObject object, vec4 pos) { -<@if GPU_TRANSFORM_PROFILE == GPUCore@> +<@if GPU_TRANSFORM_PROFILE == GPU_CORE@> vec4 epos = (object._model * pos) + vec4(-pos.w * camera._viewInverse[3].xyz, 0.0); return camera._projectionViewUntranslated * epos; // Equivalent to the following but hoppefully a bit more accurate @@ -35,7 +35,7 @@ vec4 transformModelToClipPos(TransformCamera camera, TransformObject object, vec } vec3 transformModelToEyeDir(TransformCamera camera, TransformObject object, vec3 dir) { -<@if GPU_TRANSFORM_PROFILE == GPUCore@> +<@if GPU_TRANSFORM_PROFILE == GPU_CORE@> vec3 mr0 = vec3(object._modelInverse[0].x, object._modelInverse[1].x, object._modelInverse[2].x); vec3 mr1 = vec3(object._modelInverse[0].y, object._modelInverse[1].y, object._modelInverse[2].y); vec3 mr2 = vec3(object._modelInverse[0].z, object._modelInverse[1].z, object._modelInverse[2].z); @@ -52,7 +52,7 @@ vec3 transformModelToEyeDir(TransformCamera camera, TransformObject object, vec3 <@endif@> } -<@if GPU_TRANSFORM_PROFILE == GPUCore@> +<@if GPU_TRANSFORM_PROFILE == GPU_CORE@> uniform transformObjectBuffer { TransformObject object; }; diff --git a/libraries/model/src/model/Light.slh b/libraries/model/src/model/Light.slh index 5a65bf7d18..41c6e075cf 100644 --- a/libraries/model/src/model/Light.slh +++ b/libraries/model/src/model/Light.slh @@ -64,7 +64,7 @@ float getLightShowContour(Light l) { return l._control.w; } -<@if GPU_FEATURE_PROFILE == Core @> +<@if GPU_FEATURE_PROFILE == GPU_CORE @> uniform lightBuffer { Light light; }; diff --git a/libraries/model/src/model/Material.slh b/libraries/model/src/model/Material.slh index 739b60502e..6b8eea18a6 100644 --- a/libraries/model/src/model/Material.slh +++ b/libraries/model/src/model/Material.slh @@ -25,7 +25,7 @@ float getMaterialShininess(Material m) { return m._specular.a; } -<@if GPU_FEATURE_PROFILE == Core@> +<@if GPU_FEATURE_PROFILE == GPU_CORE@> uniform materialBuffer { Material _mat; }; diff --git a/libraries/render-utils/src/DeferredLightingEffect.cpp b/libraries/render-utils/src/DeferredLightingEffect.cpp index ccfe25297c..87d187086d 100644 --- a/libraries/render-utils/src/DeferredLightingEffect.cpp +++ b/libraries/render-utils/src/DeferredLightingEffect.cpp @@ -495,7 +495,7 @@ void DeferredLightingEffect::loadLightProgram(const char* fragSource, bool limit GLint loc = -1; -#if (GPU_FEATURE_PROFILE == Core) +#if (GPU_FEATURE_PROFILE == GPU_CORE) loc = glGetUniformBlockIndex(program.programId(), "lightBuffer"); if (loc >= 0) { glUniformBlockBinding(program.programId(), loc, 0); @@ -512,7 +512,7 @@ void DeferredLightingEffect::loadLightProgram(const char* fragSource, bool limit } #endif -#if (GPU_FEATURE_PROFILE == Core) +#if (GPU_FEATURE_PROFILE == GPU_CORE) loc = glGetUniformBlockIndex(program.programId(), "atmosphereBufferUnit"); if (loc >= 0) { glUniformBlockBinding(program.programId(), loc, 1); diff --git a/libraries/render-utils/src/Model.cpp b/libraries/render-utils/src/Model.cpp index d3369572ff..73abd46480 100644 --- a/libraries/render-utils/src/Model.cpp +++ b/libraries/render-utils/src/Model.cpp @@ -200,7 +200,7 @@ void Model::initProgram(ProgramObject& program, Model::Locations& locations, boo // bindable uniform version -#if (GPU_FEATURE_PROFILE == Core) +#if (GPU_FEATURE_PROFILE == GPU_CORE) loc = glGetUniformBlockIndex(program.programId(), "materialBuffer"); if (loc >= 0) { glUniformBlockBinding(program.programId(), loc, 1); @@ -217,7 +217,7 @@ void Model::initProgram(ProgramObject& program, Model::Locations& locations, boo } #endif -#if (GPU_FEATURE_PROFILE == Core) +#if (GPU_FEATURE_PROFILE == GPU_CORE) loc = glGetUniformBlockIndex(program.programId(), "transformObjectBuffer"); if (loc >= 0) { glUniformBlockBinding(program.programId(), loc, gpu::TRANSFORM_OBJECT_SLOT); @@ -225,7 +225,7 @@ void Model::initProgram(ProgramObject& program, Model::Locations& locations, boo } #endif -#if (GPU_FEATURE_PROFILE == Core) +#if (GPU_FEATURE_PROFILE == GPU_CORE) loc = glGetUniformBlockIndex(program.programId(), "transformCameraBuffer"); if (loc >= 0) { glUniformBlockBinding(program.programId(), loc, gpu::TRANSFORM_CAMERA_SLOT); diff --git a/libraries/render-utils/src/Shadow.slh b/libraries/render-utils/src/Shadow.slh index 70c0ac02de..2e75e2764c 100755 --- a/libraries/render-utils/src/Shadow.slh +++ b/libraries/render-utils/src/Shadow.slh @@ -16,7 +16,7 @@ uniform sampler2DShadow shadowMap; // Fetching it float fetchShadow(vec3 texcoord) { -<@if GPU_FEATURE_PROFILE == Core @> +<@if GPU_FEATURE_PROFILE == GPU_CORE @> return texture(shadowMap, texcoord); <@else@> return shadow2D(shadowMap, texcoord).r; From 0bd78be7f40d39233399914f5b33d1ae38aa8761 Mon Sep 17 00:00:00 2001 From: Sam Gateau Date: Wed, 18 Mar 2015 15:57:01 -0700 Subject: [PATCH 04/15] Transition model shaders to gpu:Shader --- libraries/gpu/src/gpu/Batch.h | 5 +- libraries/gpu/src/gpu/GLBackendShader.cpp | 26 +- libraries/gpu/src/gpu/Shader.h | 38 +- libraries/gpu/src/gpu/Transform.slh | 37 +- .../src/DeferredLightingEffect.cpp | 8 +- libraries/render-utils/src/Model.cpp | 537 ++++++++++++------ libraries/render-utils/src/Model.h | 80 ++- 7 files changed, 507 insertions(+), 224 deletions(-) diff --git a/libraries/gpu/src/gpu/Batch.h b/libraries/gpu/src/gpu/Batch.h index 84358b7ae1..3468e75738 100644 --- a/libraries/gpu/src/gpu/Batch.h +++ b/libraries/gpu/src/gpu/Batch.h @@ -56,8 +56,11 @@ enum Primitive { }; enum ReservedSlot { - TRANSFORM_OBJECT_SLOT = 6, +/* TRANSFORM_OBJECT_SLOT = 6, TRANSFORM_CAMERA_SLOT = 7, + */ + TRANSFORM_OBJECT_SLOT = 1, + TRANSFORM_CAMERA_SLOT = 2, }; class Batch { diff --git a/libraries/gpu/src/gpu/GLBackendShader.cpp b/libraries/gpu/src/gpu/GLBackendShader.cpp index 48ae0eb7c9..0fe1eb07f3 100755 --- a/libraries/gpu/src/gpu/GLBackendShader.cpp +++ b/libraries/gpu/src/gpu/GLBackendShader.cpp @@ -41,6 +41,12 @@ void makeBindings(GLBackend::GLShader* shader) { glBindAttribLocation(glprogram, gpu::Stream::POSITION, "position"); } + //Check for gpu specific attribute slotBindings + loc = glGetAttribLocation(glprogram, "gl_Vertex"); + if (loc >= 0) { + glBindAttribLocation(glprogram, gpu::Stream::POSITION, "position"); + } + loc = glGetAttribLocation(glprogram, "normal"); if (loc >= 0) { glBindAttribLocation(glprogram, gpu::Stream::NORMAL, "normal"); @@ -520,18 +526,32 @@ int makeUniformSlots(GLuint glprogram, const Shader::BindingSet& slotBindings, S // The uniform as a standard var type if (location != INVALID_UNIFORM_LOCATION) { + // Let's make sure the name doesn't contains an array element + std::string sname(name); + auto foundBracket = sname.find_first_of('['); + if (foundBracket != std::string::npos) { + // std::string arrayname = sname.substr(0, foundBracket); + + if (sname[foundBracket + 1] == '0') { + sname = sname.substr(0, foundBracket); + } else { + // skip this uniform since it's not the first element of an array + continue; + } + } + if (elementResource._resource == Resource::BUFFER) { - uniforms.insert(Shader::Slot(name, location, elementResource._element, elementResource._resource)); + uniforms.insert(Shader::Slot(sname, location, elementResource._element, elementResource._resource)); } else { // For texture/Sampler, the location is the actual binding value GLint binding = -1; glGetUniformiv(glprogram, location, &binding); - auto requestedBinding = slotBindings.find(std::string(name)); + auto requestedBinding = slotBindings.find(std::string(sname)); if (requestedBinding != slotBindings.end()) { if (binding != (*requestedBinding)._location) { binding = (*requestedBinding)._location; - glUniform1i(location, binding); + glProgramUniform1i(glprogram, location, binding); } } diff --git a/libraries/gpu/src/gpu/Shader.h b/libraries/gpu/src/gpu/Shader.h index 9a5bec313b..535faff64c 100755 --- a/libraries/gpu/src/gpu/Shader.h +++ b/libraries/gpu/src/gpu/Shader.h @@ -41,31 +41,51 @@ public: Language _lang = GLSL; }; + static const uint32 INVALID_LOCATION = -1; + class Slot { public: - std::string _name; - uint32 _location; - Element _element; - uint16 _resourceType; + std::string _name = (""); + int32 _location = INVALID_LOCATION; + Element _element = Element(); + uint16 _resourceType = Resource::BUFFER; - Slot(const std::string& name, uint16 location, const Element& element, uint16 resourceType = Resource::BUFFER) : + Slot(const Slot&& s) : _name(s._name), _location(s._location), _element(s._element), _resourceType(s._resourceType) {} + // Slot& operator&&(const Slot&& s) : _name(s._name), _location(s._location), _element(s._element), _resourceType(s._resourceType) {} + Slot(const std::string& name, int32 location, const Element& element, uint16 resourceType = Resource::BUFFER) : _name(name), _location(location), _element(element), _resourceType(resourceType) {} - + Slot(const std::string& name) : _name(name) {} }; class Binding { public: std::string _name; - uint32 _location; - Binding(const std::string&& name, uint32 loc = 0) : _name(name), _location(loc) {} + int32 _location; + Binding(const std::string&& name, int32 loc = INVALID_LOCATION) : _name(name), _location(loc) {} }; template class Less { public: bool operator() (const T& x, const T& y) const { return x._name < y._name; } }; - typedef std::set> SlotSet; + + class SlotSet : public std::set> { + public: + const Slot&& findSlot(const std::string& name) const { + auto key = Slot(name); + auto found = static_cast>*>(this)->find(key); + if (found != end()) { + return std::move((*found)); + } + return std::move(key); + } + int32 findLocation(const std::string& name) const { + return findSlot(name)._location; + } + protected: + }; + typedef std::set> BindingSet; diff --git a/libraries/gpu/src/gpu/Transform.slh b/libraries/gpu/src/gpu/Transform.slh index 355713f9ae..93ea0ce9f6 100644 --- a/libraries/gpu/src/gpu/Transform.slh +++ b/libraries/gpu/src/gpu/Transform.slh @@ -28,7 +28,7 @@ vec4 transformModelToClipPos(TransformCamera camera, TransformObject object, vec 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; + //return camera._projection * camera._view * object._model * pos; <@else@> return gl_ModelViewProjectionMatrix * pos; <@endif@> @@ -68,14 +68,47 @@ TransformCamera getTransformCamera() { } <@else@> - +uniform vec4 transformObjectBuffer[7]; TransformObject getTransformObject() { TransformObject object; + object._model[0] = transformObjectBuffer[0]; + object._model[1] = transformObjectBuffer[1]; + object._model[2] = transformObjectBuffer[2]; + object._model[3] = transformObjectBuffer[3]; + + object._modelInverse[0] = transformObjectBuffer[4]; + object._modelInverse[1] = transformObjectBuffer[5]; + object._modelInverse[2] = transformObjectBuffer[6]; + object._modelInverse[3] = transformObjectBuffer[7]; + return object; } +uniform vec4 transformCameraBuffer[17]; TransformCamera getTransformCamera() { TransformCamera camera; + camera._view[0] = transformCameraBuffer[0]; + camera._view[1] = transformCameraBuffer[1]; + camera._view[2] = transformCameraBuffer[2]; + camera._view[3] = transformCameraBuffer[3]; + + camera._viewInverse[0] = transformCameraBuffer[4]; + camera._viewInverse[1] = transformCameraBuffer[5]; + camera._viewInverse[2] = transformCameraBuffer[6]; + camera._viewInverse[3] = transformCameraBuffer[7]; + + camera._projectionViewUntranslated[0] = transformCameraBuffer[8]; + camera._projectionViewUntranslated[1] = transformCameraBuffer[9]; + camera._projectionViewUntranslated[2] = transformCameraBuffer[10]; + camera._projectionViewUntranslated[3] = transformCameraBuffer[11]; + + camera._projection[0] = transformCameraBuffer[12]; + camera._projection[1] = transformCameraBuffer[13]; + camera._projection[2] = transformCameraBuffer[14]; + camera._projection[3] = transformCameraBuffer[15]; + + camera._viewport = transformCameraBuffer[16]; + return camera; } diff --git a/libraries/render-utils/src/DeferredLightingEffect.cpp b/libraries/render-utils/src/DeferredLightingEffect.cpp index 87d187086d..5b1ad44c69 100644 --- a/libraries/render-utils/src/DeferredLightingEffect.cpp +++ b/libraries/render-utils/src/DeferredLightingEffect.cpp @@ -498,8 +498,8 @@ void DeferredLightingEffect::loadLightProgram(const char* fragSource, bool limit #if (GPU_FEATURE_PROFILE == GPU_CORE) loc = glGetUniformBlockIndex(program.programId(), "lightBuffer"); if (loc >= 0) { - glUniformBlockBinding(program.programId(), loc, 0); - locations.lightBufferUnit = 0; + glUniformBlockBinding(program.programId(), loc, 3); + locations.lightBufferUnit = 3; } else { locations.lightBufferUnit = -1; } @@ -515,8 +515,8 @@ void DeferredLightingEffect::loadLightProgram(const char* fragSource, bool limit #if (GPU_FEATURE_PROFILE == GPU_CORE) loc = glGetUniformBlockIndex(program.programId(), "atmosphereBufferUnit"); if (loc >= 0) { - glUniformBlockBinding(program.programId(), loc, 1); - locations.atmosphereBufferUnit = 1; + glUniformBlockBinding(program.programId(), loc, 4); + locations.atmosphereBufferUnit = 4; } else { locations.atmosphereBufferUnit = -1; } diff --git a/libraries/render-utils/src/Model.cpp b/libraries/render-utils/src/Model.cpp index 73abd46480..17702895d9 100644 --- a/libraries/render-utils/src/Model.cpp +++ b/libraries/render-utils/src/Model.cpp @@ -93,27 +93,66 @@ Model::Model(QObject* parent) : Model::~Model() { deleteGeometry(); } +/* +ProgramObject Model::_POprogram; +ProgramObject Model::_POnormalMapProgram; +ProgramObject Model::_POspecularMapProgram; +ProgramObject Model::_POnormalSpecularMapProgram; +ProgramObject Model::_POtranslucentProgram; -ProgramObject Model::_program; -ProgramObject Model::_normalMapProgram; -ProgramObject Model::_specularMapProgram; -ProgramObject Model::_normalSpecularMapProgram; -ProgramObject Model::_translucentProgram; +ProgramObject Model::_POlightmapProgram; +ProgramObject Model::_POlightmapNormalMapProgram; +ProgramObject Model::_POlightmapSpecularMapProgram; +ProgramObject Model::_POlightmapNormalSpecularMapProgram; -ProgramObject Model::_lightmapProgram; -ProgramObject Model::_lightmapNormalMapProgram; -ProgramObject Model::_lightmapSpecularMapProgram; -ProgramObject Model::_lightmapNormalSpecularMapProgram; +ProgramObject Model::_POshadowProgram; -ProgramObject Model::_shadowProgram; +ProgramObject Model::_POskinProgram; +ProgramObject Model::_POskinNormalMapProgram; +ProgramObject Model::_POskinSpecularMapProgram; +ProgramObject Model::_POskinNormalSpecularMapProgram; +ProgramObject Model::_POskinTranslucentProgram; -ProgramObject Model::_skinProgram; -ProgramObject Model::_skinNormalMapProgram; -ProgramObject Model::_skinSpecularMapProgram; -ProgramObject Model::_skinNormalSpecularMapProgram; -ProgramObject Model::_skinTranslucentProgram; +ProgramObject Model::_POskinShadowProgram; -ProgramObject Model::_skinShadowProgram; +Model::Locations Model::_POlocations; +Model::Locations Model::_POnormalMapLocations; +Model::Locations Model::_POspecularMapLocations; +Model::Locations Model::_POnormalSpecularMapLocations; +Model::Locations Model::_POtranslucentLocations; + +Model::Locations Model::_POlightmapLocations; +Model::Locations Model::_POlightmapNormalMapLocations; +Model::Locations Model::_POlightmapSpecularMapLocations; +Model::Locations Model::_POlightmapNormalSpecularMapLocations; + +Model::SkinLocations Model::_POskinLocations; +Model::SkinLocations Model::_POskinNormalMapLocations; +Model::SkinLocations Model::_POskinSpecularMapLocations; +Model::SkinLocations Model::_POskinNormalSpecularMapLocations; +Model::SkinLocations Model::_POskinShadowLocations; +Model::SkinLocations Model::_POskinTranslucentLocations; +*/ +gpu::ShaderPointer Model::_program; +gpu::ShaderPointer Model::_normalMapProgram; +gpu::ShaderPointer Model::_specularMapProgram; +gpu::ShaderPointer Model::_normalSpecularMapProgram; +gpu::ShaderPointer Model::_translucentProgram; + +gpu::ShaderPointer Model::_lightmapProgram; +gpu::ShaderPointer Model::_lightmapNormalMapProgram; +gpu::ShaderPointer Model::_lightmapSpecularMapProgram; +gpu::ShaderPointer Model::_lightmapNormalSpecularMapProgram; + +gpu::ShaderPointer Model::_shadowProgram; + +gpu::ShaderPointer Model::_skinProgram; +gpu::ShaderPointer Model::_skinNormalMapProgram; +gpu::ShaderPointer Model::_skinSpecularMapProgram; +gpu::ShaderPointer Model::_skinNormalSpecularMapProgram; +gpu::ShaderPointer Model::_skinTranslucentProgram; + +gpu::ShaderPointer Model::_skinShadowProgram; Model::Locations Model::_locations; Model::Locations Model::_normalMapLocations; @@ -135,6 +174,8 @@ Model::SkinLocations Model::_skinTranslucentLocations; AbstractViewStateInterface* Model::_viewState = NULL; +const GLint MATERIAL_GPU_SLOT = 3; + void Model::setScale(const glm::vec3& scale) { setScaleInternal(scale); // if anyone sets scale manually, then we are no longer scaled to fit @@ -165,6 +206,33 @@ void Model::setOffset(const glm::vec3& offset) { _snappedToRegistrationPoint = false; } +void Model::initProgram(gpu::ShaderPointer& program, Model::Locations& locations) { + locations.alphaThreshold = program->getUniforms().findLocation("alphaThreshold"); + locations.texcoordMatrices = program->getUniforms().findLocation("texcoordMatrices"); + locations.emissiveParams = program->getUniforms().findLocation("emissiveParams"); + locations.glowIntensity = program->getUniforms().findLocation("glowIntensity"); + + locations.specularTextureUnit = program->getTextures().findLocation("specularMap"); + locations.emissiveTextureUnit = program->getTextures().findLocation("emissiveMap"); + +#if (GPU_FEATURE_PROFILE == GPU_CORE) + locations.materialBufferUnit = program->getBuffers().findLocation("materialBuffer"); +#else + locations.materialBuffer = program->getUniforms().findLocation("materialBuffer"); +#endif + +} + +void Model::initSkinProgram(gpu::ShaderPointer& program, Model::SkinLocations& locations) { + + initProgram(program, locations); + + locations.clusterMatrices = program->getUniforms().findLocation("clusterMatrices"); + + locations.clusterIndices = program->getInputs().findLocation("clusterIndices");; + locations.clusterWeights = program->getInputs().findLocation("clusterWeights");; +} +/* void Model::initProgram(ProgramObject& program, Model::Locations& locations, bool link) { if (link) { program.bindAttributeLocation("tangent", gpu::Stream::TANGENT); @@ -203,8 +271,8 @@ void Model::initProgram(ProgramObject& program, Model::Locations& locations, boo #if (GPU_FEATURE_PROFILE == GPU_CORE) loc = glGetUniformBlockIndex(program.programId(), "materialBuffer"); if (loc >= 0) { - glUniformBlockBinding(program.programId(), loc, 1); - locations.materialBufferUnit = 1; + glUniformBlockBinding(program.programId(), loc, MATERIAL_GPU_SLOT); + locations.materialBufferUnit = MATERIAL_GPU_SLOT; } else { locations.materialBufferUnit = -1; } @@ -239,8 +307,8 @@ void Model::initProgram(ProgramObject& program, Model::Locations& locations, boo } program.release(); -} - +}*/ +/* void Model::initSkinProgram(ProgramObject& program, Model::SkinLocations& locations) { program.bindAttributeLocation("tangent", gpu::Stream::TANGENT); program.bindAttributeLocation("texcoord1", gpu::Stream::TEXCOORD1); @@ -257,7 +325,7 @@ void Model::initSkinProgram(ProgramObject& program, Model::SkinLocations& locati locations.clusterWeights = program.attributeLocation("clusterWeights"); program.release(); -} +}*/ QVector Model::createJointStates(const FBXGeometry& geometry) { QVector jointStates; @@ -292,10 +360,11 @@ void Model::initJointTransforms() { } void Model::init() { - if (!_program.isLinked()) { -/* //Work in progress not used yet + if (_program.isNull()) { + // if (!_program.isLinked()) { + //Work in progress not used yet gpu::Shader::BindingSet slotBindings; - slotBindings.insert(gpu::Shader::Binding(std::string("materialBuffer"), 1)); + slotBindings.insert(gpu::Shader::Binding(std::string("materialBuffer"), MATERIAL_GPU_SLOT)); slotBindings.insert(gpu::Shader::Binding(std::string("diffuseMap"), 0)); slotBindings.insert(gpu::Shader::Binding(std::string("normalMap"), 1)); slotBindings.insert(gpu::Shader::Binding(std::string("specularMap"), 2)); @@ -327,124 +396,142 @@ void Model::init() { bool makeResult = false; // Programs - auto program = gpu::ShaderPointer(gpu::Shader::createProgram(modelVertex, modelPixel)); - makeResult = gpu::Shader::makeProgram(*program, slotBindings); - - auto normalMapProgram = gpu::ShaderPointer(gpu::Shader::createProgram(modelNormalMapVertex, modelNormalMapPixel)); - makeResult = gpu::Shader::makeProgram(*normalMapProgram, slotBindings); - - auto specularMapProgram = gpu::ShaderPointer(gpu::Shader::createProgram(modelVertex, modelSpecularMapPixel)); - makeResult = gpu::Shader::makeProgram(*specularMapProgram, slotBindings); - - auto normalSpecularMapProgram = gpu::ShaderPointer(gpu::Shader::createProgram(modelNormalMapVertex, modelNormalSpecularMapPixel)); - makeResult = gpu::Shader::makeProgram(*normalSpecularMapProgram, slotBindings); - - auto translucentProgram = gpu::ShaderPointer(gpu::Shader::createProgram(modelVertex, modelTranslucentPixel)); - makeResult = gpu::Shader::makeProgram(*translucentProgram, slotBindings); - - auto shadowProgram = gpu::ShaderPointer(gpu::Shader::createProgram(modelShadowVertex, modelShadowPixel)); - makeResult = gpu::Shader::makeProgram(*shadowProgram, slotBindings); - - auto lightmapProgram = gpu::ShaderPointer(gpu::Shader::createProgram(modelLightmapVertex, modelLightmapPixel)); - makeResult = gpu::Shader::makeProgram(*lightmapProgram, slotBindings); - - auto lightmapNormalMapProgram = gpu::ShaderPointer(gpu::Shader::createProgram(modelLightmapNormalMapVertex, modelLightmapNormalMapPixel)); - makeResult = gpu::Shader::makeProgram(*lightmapNormalMapProgram, slotBindings); - - auto lightmapSpecularMapProgram = gpu::ShaderPointer(gpu::Shader::createProgram(modelLightmapVertex, modelLightmapSpecularMapPixel)); - makeResult = gpu::Shader::makeProgram(*lightmapSpecularMapProgram, slotBindings); - - auto lightmapNormalSpecularMapProgram = gpu::ShaderPointer(gpu::Shader::createProgram(modelLightmapNormalMapVertex, modelLightmapNormalSpecularMapPixel)); - makeResult = gpu::Shader::makeProgram(*lightmapNormalSpecularMapProgram, slotBindings); - - auto skinProgram = gpu::ShaderPointer(gpu::Shader::createProgram(skinModelVertex, modelPixel)); - makeResult = gpu::Shader::makeProgram(*skinProgram, slotBindings); - - auto skinNormalMapProgram = gpu::ShaderPointer(gpu::Shader::createProgram(skinModelNormalMapVertex, modelNormalMapPixel)); - makeResult = gpu::Shader::makeProgram(*skinNormalMapProgram, slotBindings); - - auto skinSpecularMapProgram = gpu::ShaderPointer(gpu::Shader::createProgram(skinModelVertex, modelSpecularMapPixel)); - makeResult = gpu::Shader::makeProgram(*skinSpecularMapProgram, slotBindings); - - auto skinNormalSpecularMapProgram = gpu::ShaderPointer(gpu::Shader::createProgram(skinModelNormalMapVertex, modelNormalSpecularMapPixel)); - makeResult = gpu::Shader::makeProgram(*skinNormalSpecularMapProgram, slotBindings); - - auto skinShadowProgram = gpu::ShaderPointer(gpu::Shader::createProgram(skinModelShadowVertex, modelShadowPixel)); - makeResult = gpu::Shader::makeProgram(*skinShadowProgram, slotBindings); - - auto skinTranslucentProgram = gpu::ShaderPointer(gpu::Shader::createProgram(skinModelVertex, modelTranslucentPixel)); - makeResult = gpu::Shader::makeProgram(*skinTranslucentProgram, slotBindings); -*/ - - _program.addShaderFromSourceCode(QGLShader::Vertex, model_vert); - _program.addShaderFromSourceCode(QGLShader::Fragment, model_frag); + _program = gpu::ShaderPointer(gpu::Shader::createProgram(modelVertex, modelPixel)); + makeResult = gpu::Shader::makeProgram(*_program, slotBindings); initProgram(_program, _locations); + + _normalMapProgram = gpu::ShaderPointer(gpu::Shader::createProgram(modelNormalMapVertex, modelNormalMapPixel)); + makeResult = gpu::Shader::makeProgram(*_normalMapProgram, slotBindings); + initProgram(_normalMapProgram, _normalMapLocations); + + _specularMapProgram = gpu::ShaderPointer(gpu::Shader::createProgram(modelVertex, modelSpecularMapPixel)); + makeResult = gpu::Shader::makeProgram(*_specularMapProgram, slotBindings); + initProgram(_specularMapProgram, _specularMapLocations); + + _normalSpecularMapProgram = gpu::ShaderPointer(gpu::Shader::createProgram(modelNormalMapVertex, modelNormalSpecularMapPixel)); + makeResult = gpu::Shader::makeProgram(*_normalSpecularMapProgram, slotBindings); + initProgram(_normalSpecularMapProgram, _normalSpecularMapLocations); + + _translucentProgram = gpu::ShaderPointer(gpu::Shader::createProgram(modelVertex, modelTranslucentPixel)); + makeResult = gpu::Shader::makeProgram(*_translucentProgram, slotBindings); + initProgram(_translucentProgram, _translucentLocations); + + _shadowProgram = gpu::ShaderPointer(gpu::Shader::createProgram(modelShadowVertex, modelShadowPixel)); + makeResult = gpu::Shader::makeProgram(*_shadowProgram, slotBindings); + Model::Locations tempShadowLoc; + initProgram(_shadowProgram, tempShadowLoc); + + _lightmapProgram = gpu::ShaderPointer(gpu::Shader::createProgram(modelLightmapVertex, modelLightmapPixel)); + makeResult = gpu::Shader::makeProgram(*_lightmapProgram, slotBindings); + initProgram(_lightmapProgram, _lightmapLocations); + + _lightmapNormalMapProgram = gpu::ShaderPointer(gpu::Shader::createProgram(modelLightmapNormalMapVertex, modelLightmapNormalMapPixel)); + makeResult = gpu::Shader::makeProgram(*_lightmapNormalMapProgram, slotBindings); + initProgram(_lightmapNormalMapProgram, _lightmapNormalMapLocations); + + _lightmapSpecularMapProgram = gpu::ShaderPointer(gpu::Shader::createProgram(modelLightmapVertex, modelLightmapSpecularMapPixel)); + makeResult = gpu::Shader::makeProgram(*_lightmapSpecularMapProgram, slotBindings); + initProgram(_lightmapSpecularMapProgram, _lightmapSpecularMapLocations); + + _lightmapNormalSpecularMapProgram = gpu::ShaderPointer(gpu::Shader::createProgram(modelLightmapNormalMapVertex, modelLightmapNormalSpecularMapPixel)); + makeResult = gpu::Shader::makeProgram(*_lightmapNormalSpecularMapProgram, slotBindings); + initProgram(_lightmapNormalSpecularMapProgram, _lightmapNormalSpecularMapLocations); + + _skinProgram = gpu::ShaderPointer(gpu::Shader::createProgram(skinModelVertex, modelPixel)); + makeResult = gpu::Shader::makeProgram(*_skinProgram, slotBindings); + initSkinProgram(_skinProgram, _skinLocations); + + _skinNormalMapProgram = gpu::ShaderPointer(gpu::Shader::createProgram(skinModelNormalMapVertex, modelNormalMapPixel)); + makeResult = gpu::Shader::makeProgram(*_skinNormalMapProgram, slotBindings); + initSkinProgram(_skinNormalMapProgram, _skinNormalMapLocations); + + _skinSpecularMapProgram = gpu::ShaderPointer(gpu::Shader::createProgram(skinModelVertex, modelSpecularMapPixel)); + makeResult = gpu::Shader::makeProgram(*_skinSpecularMapProgram, slotBindings); + initSkinProgram(_skinSpecularMapProgram, _skinSpecularMapLocations); + + _skinNormalSpecularMapProgram = gpu::ShaderPointer(gpu::Shader::createProgram(skinModelNormalMapVertex, modelNormalSpecularMapPixel)); + makeResult = gpu::Shader::makeProgram(*_skinNormalSpecularMapProgram, slotBindings); + initSkinProgram(_skinNormalSpecularMapProgram, _skinNormalSpecularMapLocations); + + _skinShadowProgram = gpu::ShaderPointer(gpu::Shader::createProgram(skinModelShadowVertex, modelShadowPixel)); + makeResult = gpu::Shader::makeProgram(*_skinShadowProgram, slotBindings); + initSkinProgram(_skinShadowProgram, _skinShadowLocations); + + _skinTranslucentProgram = gpu::ShaderPointer(gpu::Shader::createProgram(skinModelVertex, modelTranslucentPixel)); + makeResult = gpu::Shader::makeProgram(*_skinTranslucentProgram, slotBindings); + initSkinProgram(_skinTranslucentProgram, _skinTranslucentLocations); + + /* + _POprogram.addShaderFromSourceCode(QGLShader::Vertex, model_vert); + _POprogram.addShaderFromSourceCode(QGLShader::Fragment, model_frag); + initProgram(_POprogram, _POlocations); - _normalMapProgram.addShaderFromSourceCode(QGLShader::Vertex, model_normal_map_vert); - _normalMapProgram.addShaderFromSourceCode(QGLShader::Fragment, model_normal_map_frag); - initProgram(_normalMapProgram, _normalMapLocations); + _POnormalMapProgram.addShaderFromSourceCode(QGLShader::Vertex, model_normal_map_vert); + _POnormalMapProgram.addShaderFromSourceCode(QGLShader::Fragment, model_normal_map_frag); + initProgram(_POnormalMapProgram, _POnormalMapLocations); - _specularMapProgram.addShaderFromSourceCode(QGLShader::Vertex, model_vert); - _specularMapProgram.addShaderFromSourceCode(QGLShader::Fragment, model_specular_map_frag); - initProgram(_specularMapProgram, _specularMapLocations); + _POspecularMapProgram.addShaderFromSourceCode(QGLShader::Vertex, model_vert); + _POspecularMapProgram.addShaderFromSourceCode(QGLShader::Fragment, model_specular_map_frag); + initProgram(_POspecularMapProgram, _POspecularMapLocations); - _normalSpecularMapProgram.addShaderFromSourceCode(QGLShader::Vertex, model_normal_map_vert); - _normalSpecularMapProgram.addShaderFromSourceCode(QGLShader::Fragment, model_normal_specular_map_frag); - initProgram(_normalSpecularMapProgram, _normalSpecularMapLocations); + _POnormalSpecularMapProgram.addShaderFromSourceCode(QGLShader::Vertex, model_normal_map_vert); + _POnormalSpecularMapProgram.addShaderFromSourceCode(QGLShader::Fragment, model_normal_specular_map_frag); + initProgram(_POnormalSpecularMapProgram, _POnormalSpecularMapLocations); - _translucentProgram.addShaderFromSourceCode(QGLShader::Vertex, model_vert); - _translucentProgram.addShaderFromSourceCode(QGLShader::Fragment, model_translucent_frag); - initProgram(_translucentProgram, _translucentLocations); + _POtranslucentProgram.addShaderFromSourceCode(QGLShader::Vertex, model_vert); + _POtranslucentProgram.addShaderFromSourceCode(QGLShader::Fragment, model_translucent_frag); + initProgram(_POtranslucentProgram, _POtranslucentLocations); // Lightmap - _lightmapProgram.addShaderFromSourceCode(QGLShader::Vertex, model_lightmap_vert); - _lightmapProgram.addShaderFromSourceCode(QGLShader::Fragment, model_lightmap_frag); - initProgram(_lightmapProgram, _lightmapLocations); + _POlightmapProgram.addShaderFromSourceCode(QGLShader::Vertex, model_lightmap_vert); + _POlightmapProgram.addShaderFromSourceCode(QGLShader::Fragment, model_lightmap_frag); + initProgram(_POlightmapProgram, _POlightmapLocations); - _lightmapNormalMapProgram.addShaderFromSourceCode(QGLShader::Vertex, model_lightmap_normal_map_vert); - _lightmapNormalMapProgram.addShaderFromSourceCode(QGLShader::Fragment, model_lightmap_normal_map_frag); - initProgram(_lightmapNormalMapProgram, _lightmapNormalMapLocations); + _POlightmapNormalMapProgram.addShaderFromSourceCode(QGLShader::Vertex, model_lightmap_normal_map_vert); + _POlightmapNormalMapProgram.addShaderFromSourceCode(QGLShader::Fragment, model_lightmap_normal_map_frag); + initProgram(_POlightmapNormalMapProgramddd, _POlightmapNormalMapLocations); - _lightmapSpecularMapProgram.addShaderFromSourceCode(QGLShader::Vertex, model_lightmap_vert); - _lightmapSpecularMapProgram.addShaderFromSourceCode(QGLShader::Fragment, model_lightmap_specular_map_frag); - initProgram(_lightmapSpecularMapProgram, _lightmapSpecularMapLocations); + _POlightmapSpecularMapProgram.addShaderFromSourceCode(QGLShader::Vertex, model_lightmap_vert); + _POlightmapSpecularMapProgram.addShaderFromSourceCode(QGLShader::Fragment, model_lightmap_specular_map_frag); + initProgram(_POlightmapSpecularMapProgram, _POlightmapSpecularMapLocations); - _lightmapNormalSpecularMapProgram.addShaderFromSourceCode(QGLShader::Vertex, model_lightmap_normal_map_vert); - _lightmapNormalSpecularMapProgram.addShaderFromSourceCode(QGLShader::Fragment, model_lightmap_normal_specular_map_frag); - initProgram(_lightmapNormalSpecularMapProgram, _lightmapNormalSpecularMapLocations); + _POlightmapNormalSpecularMapProgram.addShaderFromSourceCode(QGLShader::Vertex, model_lightmap_normal_map_vert); + _POlightmapNormalSpecularMapProgram.addShaderFromSourceCode(QGLShader::Fragment, model_lightmap_normal_specular_map_frag); + initProgram(_POlightmapNormalSpecularMapProgram, _POlightmapNormalSpecularMapLocations); // end lightmap - _shadowProgram.addShaderFromSourceCode(QGLShader::Vertex, model_shadow_vert); - _shadowProgram.addShaderFromSourceCode(QGLShader::Fragment, model_shadow_frag); + _POshadowProgram.addShaderFromSourceCode(QGLShader::Vertex, model_shadow_vert); + _POshadowProgram.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); + initProgram(_POshadowProgram, tempLoc); - _skinProgram.addShaderFromSourceCode(QGLShader::Vertex, skin_model_vert); - _skinProgram.addShaderFromSourceCode(QGLShader::Fragment, model_frag); - initSkinProgram(_skinProgram, _skinLocations); + _POskinProgram.addShaderFromSourceCode(QGLShader::Vertex, skin_model_vert); + _POskinProgram.addShaderFromSourceCode(QGLShader::Fragment, model_frag); + initSkinProgram(_POskinProgram, _POskinLocations); - _skinNormalMapProgram.addShaderFromSourceCode(QGLShader::Vertex, skin_model_normal_map_vert); - _skinNormalMapProgram.addShaderFromSourceCode(QGLShader::Fragment, model_normal_map_frag); - initSkinProgram(_skinNormalMapProgram, _skinNormalMapLocations); + _POskinNormalMapProgram.addShaderFromSourceCode(QGLShader::Vertex, skin_model_normal_map_vert); + _POskinNormalMapProgram.addShaderFromSourceCode(QGLShader::Fragment, model_normal_map_frag); + initSkinProgram(_POskinNormalMapProgram, _PaOskinNormalMapLocations); - _skinSpecularMapProgram.addShaderFromSourceCode(QGLShader::Vertex, model_vert); - _skinSpecularMapProgram.addShaderFromSourceCode(QGLShader::Fragment, model_specular_map_frag); - initSkinProgram(_skinSpecularMapProgram, _skinSpecularMapLocations); + _POskinSpecularMapProgram.addShaderFromSourceCode(QGLShader::Vertex, model_vert); + _POskinSpecularMapProgram.addShaderFromSourceCode(QGLShader::Fragment, model_specular_map_frag); + initSkinProgram(_POskinSpecularMapProgram, _POskinSpecularMapLocations); - _skinNormalSpecularMapProgram.addShaderFromSourceCode(QGLShader::Vertex, skin_model_normal_map_vert); - _skinNormalSpecularMapProgram.addShaderFromSourceCode(QGLShader::Fragment, model_normal_specular_map_frag); - initSkinProgram(_skinNormalSpecularMapProgram, _skinNormalSpecularMapLocations); + _POskinNormalSpecularMapProgram.addShaderFromSourceCode(QGLShader::Vertex, skin_model_normal_map_vert); + _POskinNormalSpecularMapProgram.addShaderFromSourceCode(QGLShader::Fragment, model_normal_specular_map_frag); + initSkinProgram(_POskinNormalSpecularMapProgram, _POskinNormalSpecularMapLocations); - _skinShadowProgram.addShaderFromSourceCode(QGLShader::Vertex, skin_model_shadow_vert); - _skinShadowProgram.addShaderFromSourceCode(QGLShader::Fragment, model_shadow_frag); - initSkinProgram(_skinShadowProgram, _skinShadowLocations); + _POskinShadowProgram.addShaderFromSourceCode(QGLShader::Vertex, skin_model_shadow_vert); + _POskinShadowProgram.addShaderFromSourceCode(QGLShader::Fragment, model_shadow_frag); + initSkinProgram(_POskinShadowProgram, _POskinShadowLocations); - _skinTranslucentProgram.addShaderFromSourceCode(QGLShader::Vertex, skin_model_vert); - _skinTranslucentProgram.addShaderFromSourceCode(QGLShader::Fragment, model_translucent_frag); - initSkinProgram(_skinTranslucentProgram, _skinTranslucentLocations); + _POskinTranslucentProgram.addShaderFromSourceCode(QGLShader::Vertex, skin_model_vert); + _POskinTranslucentProgram.addShaderFromSourceCode(QGLShader::Fragment, model_translucent_frag); + initSkinProgram(_POskinTranslucentProgram, _POskinTranslucentLocations); + */ } } @@ -2302,83 +2389,165 @@ QVector* Model::pickMeshList(bool translucent, float alphaThreshold, bool h void Model::pickPrograms(gpu::Batch& batch, RenderMode mode, bool translucent, float alphaThreshold, bool hasLightmap, bool hasTangents, bool hasSpecular, bool isSkinned, RenderArgs* args, Locations*& locations, SkinLocations*& skinLocations) { - - ProgramObject* program = &_program; - locations = &_locations; - ProgramObject* skinProgram = &_skinProgram; - skinLocations = &_skinLocations; - if (mode == SHADOW_RENDER_MODE) { - program = &_shadowProgram; - skinProgram = &_skinShadowProgram; - skinLocations = &_skinShadowLocations; - } else if (translucent && alphaThreshold == 0.0f) { - program = &_translucentProgram; - locations = &_translucentLocations; - skinProgram = &_skinTranslucentProgram; - skinLocations = &_skinTranslucentLocations; +/* if (false) + { + ProgramObject* program = &_POprogram; + locations = &_POlocations; + ProgramObject* skinProgram = &_POskinProgram; + skinLocations = &_POskinLocations; + if (mode == SHADOW_RENDER_MODE) { + program = &_POshadowProgram; + skinProgram = &_POskinShadowProgram; + skinLocations = &_POskinShadowLocations; + } else if (translucent && alphaThreshold == 0.0f) { + program = &_POtranslucentProgram; + locations = &_POtranslucentLocations; + skinProgram = &_POskinTranslucentProgram; + skinLocations = &_POskinTranslucentLocations; - } else if (hasLightmap) { - if (hasTangents) { - if (hasSpecular) { - program = &_lightmapNormalSpecularMapProgram; - locations = &_lightmapNormalSpecularMapLocations; + } else if (hasLightmap) { + if (hasTangents) { + if (hasSpecular) { + program = &_POlightmapNormalSpecularMapProgram; + locations = &_POlightmapNormalSpecularMapLocations; + skinProgram = NULL; + skinLocations = NULL; + } else { + program = &_POlightmapNormalMapProgram; + locations = &_POlightmapNormalMapLocations; + skinProgram = NULL; + skinLocations = NULL; + } + } else if (hasSpecular) { + program = &_POlightmapSpecularMapProgram; + locations = &_POlightmapSpecularMapLocations; skinProgram = NULL; skinLocations = NULL; } else { - program = &_lightmapNormalMapProgram; - locations = &_lightmapNormalMapLocations; + program = &_POlightmapProgram; + locations = &_POlightmapLocations; skinProgram = NULL; skinLocations = NULL; } - } else if (hasSpecular) { - program = &_lightmapSpecularMapProgram; - locations = &_lightmapSpecularMapLocations; - skinProgram = NULL; - skinLocations = NULL; } else { - program = &_lightmapProgram; - locations = &_lightmapLocations; - skinProgram = NULL; - skinLocations = NULL; - } - } else { - if (hasTangents) { - if (hasSpecular) { - program = &_normalSpecularMapProgram; - locations = &_normalSpecularMapLocations; - skinProgram = &_skinNormalSpecularMapProgram; - skinLocations = &_skinNormalSpecularMapLocations; - } else { - program = &_normalMapProgram; - locations = &_normalMapLocations; - skinProgram = &_skinNormalMapProgram; - skinLocations = &_skinNormalMapLocations; + if (hasTangents) { + if (hasSpecular) { + program = &_POnormalSpecularMapProgram; + locations = &_POnormalSpecularMapLocations; + skinProgram = &_POskinNormalSpecularMapProgram; + skinLocations = &_POskinNormalSpecularMapLocations; + } else { + program = &_POnormalMapProgram; + locations = &_POnormalMapLocations; + skinProgram = &_POskinNormalMapProgram; + skinLocations = &_POskinNormalMapLocations; + } + } else if (hasSpecular) { + program = &_POspecularMapProgram; + locations = &_POspecularMapLocations; + skinProgram = &_POskinSpecularMapProgram; + skinLocations = &_POskinSpecularMapLocations; } - } else if (hasSpecular) { - program = &_specularMapProgram; - locations = &_specularMapLocations; - skinProgram = &_skinSpecularMapProgram; - skinLocations = &_skinSpecularMapLocations; + } + + ProgramObject* activeProgram = program; + Locations* activeLocations = locations; + + if (isSkinned) { + activeProgram = skinProgram; + activeLocations = skinLocations; + locations = skinLocations; + } + // This code replace the "bind()" on the QGLProgram + if (!activeProgram->isLinked()) { + activeProgram->link(); } - } - ProgramObject* activeProgram = program; - Locations* activeLocations = locations; - - if (isSkinned) { - activeProgram = skinProgram; - activeLocations = skinLocations; - locations = skinLocations; - } - // This code replace the "bind()" on the QGLProgram - if (!activeProgram->isLinked()) { - activeProgram->link(); - } + GLBATCH(glUseProgram)(activeProgram->programId()); - GLBATCH(glUseProgram)(activeProgram->programId()); - if ((activeLocations->alphaThreshold > -1) && (mode != SHADOW_RENDER_MODE)) { - GLBATCH(glUniform1f)(activeLocations->alphaThreshold, alphaThreshold); + if ((activeLocations->alphaThreshold > -1) && (mode != SHADOW_RENDER_MODE)) { + GLBATCH(glUniform1f)(activeLocations->alphaThreshold, alphaThreshold); + } + + } + else */ + { + gpu::ShaderPointer program = _program; + locations = &_locations; + gpu::ShaderPointer skinProgram = _skinProgram; + skinLocations = &_skinLocations; + if (mode == SHADOW_RENDER_MODE) { + program = _shadowProgram; + skinProgram = _skinShadowProgram; + skinLocations = &_skinShadowLocations; + } else if (translucent && alphaThreshold == 0.0f) { + program = _translucentProgram; + locations = &_translucentLocations; + skinProgram = _skinTranslucentProgram; + skinLocations = &_skinTranslucentLocations; + + } else if (hasLightmap) { + if (hasTangents) { + if (hasSpecular) { + program = _lightmapNormalSpecularMapProgram; + locations = &_lightmapNormalSpecularMapLocations; + skinProgram.reset(nullptr); + skinLocations = NULL; + } else { + program = _lightmapNormalMapProgram; + locations = &_lightmapNormalMapLocations; + skinProgram.reset(nullptr); + skinLocations = NULL; + } + } else if (hasSpecular) { + program = _lightmapSpecularMapProgram; + locations = &_lightmapSpecularMapLocations; + skinProgram.reset(nullptr); + skinLocations = NULL; + } else { + program = _lightmapProgram; + locations = &_lightmapLocations; + skinProgram.reset(nullptr); + skinLocations = NULL; + } + } else { + if (hasTangents) { + if (hasSpecular) { + program = _normalSpecularMapProgram; + locations = &_normalSpecularMapLocations; + skinProgram = _skinNormalSpecularMapProgram; + skinLocations = &_skinNormalSpecularMapLocations; + } else { + program = _normalMapProgram; + locations = &_normalMapLocations; + skinProgram = _skinNormalMapProgram; + skinLocations = &_skinNormalMapLocations; + } + } else if (hasSpecular) { + program = _specularMapProgram; + locations = &_specularMapLocations; + skinProgram = _skinSpecularMapProgram; + skinLocations = &_skinSpecularMapLocations; + } + } + + gpu::ShaderPointer activeProgram = program; + Locations* activeLocations = locations; + + if (isSkinned) { + activeProgram = skinProgram; + activeLocations = skinLocations; + locations = skinLocations; + } + + GLuint glprogram = gpu::GLBackend::getShaderID(activeProgram); + GLBATCH(glUseProgram)(glprogram); + + + if ((activeLocations->alphaThreshold > -1) && (mode != SHADOW_RENDER_MODE)) { + GLBATCH(glUniform1f)(activeLocations->alphaThreshold, alphaThreshold); + } } } diff --git a/libraries/render-utils/src/Model.h b/libraries/render-utils/src/Model.h index 453d721962..7a7af85a8e 100644 --- a/libraries/render-utils/src/Model.h +++ b/libraries/render-utils/src/Model.h @@ -309,31 +309,49 @@ private: int _blendNumber; int _appliedBlendNumber; + /* + static ProgramObject _POprogram; + static ProgramObject _POnormalMapProgram; + static ProgramObject _POspecularMapProgram; + static ProgramObject _POnormalSpecularMapProgram; + static ProgramObject _POtranslucentProgram; - static ProgramObject _program; - static ProgramObject _normalMapProgram; - static ProgramObject _specularMapProgram; - static ProgramObject _normalSpecularMapProgram; - static ProgramObject _translucentProgram; + static ProgramObject _POlightmapProgram; + static ProgramObject _POlightmapNormalMapProgram; + static ProgramObject _POlightmapSpecularMapProgram; + static ProgramObject _POlightmapNormalSpecularMapProgram; - static ProgramObject _lightmapProgram; - static ProgramObject _lightmapNormalMapProgram; - static ProgramObject _lightmapSpecularMapProgram; - static ProgramObject _lightmapNormalSpecularMapProgram; - - static ProgramObject _shadowProgram; + static ProgramObject _POshadowProgram; - static ProgramObject _skinProgram; - static ProgramObject _skinNormalMapProgram; - static ProgramObject _skinSpecularMapProgram; - static ProgramObject _skinNormalSpecularMapProgram; - static ProgramObject _skinTranslucentProgram; + static ProgramObject _POskinProgram; + static ProgramObject _POskinNormalMapProgram; + static ProgramObject _POskinSpecularMapProgram; + static ProgramObject _POskinNormalSpecularMapProgram; + static ProgramObject _POskinTranslucentProgram; - static ProgramObject _skinShadowProgram; + static ProgramObject _POskinShadowProgram; + */ + static gpu::ShaderPointer _program; + static gpu::ShaderPointer _normalMapProgram; + static gpu::ShaderPointer _specularMapProgram; + static gpu::ShaderPointer _normalSpecularMapProgram; + static gpu::ShaderPointer _translucentProgram; - static int _normalMapTangentLocation; - static int _normalSpecularMapTangentLocation; + static gpu::ShaderPointer _lightmapProgram; + static gpu::ShaderPointer _lightmapNormalMapProgram; + static gpu::ShaderPointer _lightmapSpecularMapProgram; + static gpu::ShaderPointer _lightmapNormalSpecularMapProgram; + + static gpu::ShaderPointer _shadowProgram; + static gpu::ShaderPointer _skinProgram; + static gpu::ShaderPointer _skinNormalMapProgram; + static gpu::ShaderPointer _skinSpecularMapProgram; + static gpu::ShaderPointer _skinNormalSpecularMapProgram; + static gpu::ShaderPointer _skinTranslucentProgram; + + static gpu::ShaderPointer _skinShadowProgram; + class Locations { public: int tangent; @@ -356,8 +374,20 @@ private: static Locations _lightmapNormalMapLocations; static Locations _lightmapSpecularMapLocations; static Locations _lightmapNormalSpecularMapLocations; - +/* + static Locations _POlocations; + static Locations _POnormalMapLocations; + static Locations _POspecularMapLocations; + static Locations _POnormalSpecularMapLocations; + static Locations _POtranslucentLocations; + + static Locations _POlightmapLocations; + static Locations _POlightmapNormalMapLocations; + static Locations _POlightmapSpecularMapLocations; + static Locations _POlightmapNormalSpecularMapLocations; +*/ static void initProgram(ProgramObject& program, Locations& locations, bool link = true); + static void initProgram(gpu::ShaderPointer& program, Locations& locations); class SkinLocations : public Locations { public: @@ -372,8 +402,16 @@ private: static SkinLocations _skinNormalSpecularMapLocations; static SkinLocations _skinShadowLocations; static SkinLocations _skinTranslucentLocations; - +/* + static SkinLocations _POskinLocations; + static SkinLocations _POskinNormalMapLocations; + static SkinLocations _POskinSpecularMapLocations; + static SkinLocations _POskinNormalSpecularMapLocations; + static SkinLocations _POskinShadowLocations; + static SkinLocations _POskinTranslucentLocations; +*/ static void initSkinProgram(ProgramObject& program, SkinLocations& locations); + static void initSkinProgram(gpu::ShaderPointer& program, SkinLocations& locations); QVector _calculatedMeshBoxes; // world coordinate AABoxes for all sub mesh boxes bool _calculatedMeshBoxesValid; From b5eb4a7f5b6fcdbae350c304eb25ffc0a973103b Mon Sep 17 00:00:00 2001 From: Sam Gateau Date: Wed, 18 Mar 2015 16:12:47 -0700 Subject: [PATCH 05/15] Since glProgramUniform is not supported on MAc we need a workaround... --- libraries/gpu/src/gpu/GLBackendShader.cpp | 13 +++++++++++++ 1 file changed, 13 insertions(+) diff --git a/libraries/gpu/src/gpu/GLBackendShader.cpp b/libraries/gpu/src/gpu/GLBackendShader.cpp index 0fe1eb07f3..8391a1a7f9 100755 --- a/libraries/gpu/src/gpu/GLBackendShader.cpp +++ b/libraries/gpu/src/gpu/GLBackendShader.cpp @@ -509,6 +509,11 @@ ElementResource getFormatFromGLUniform(GLenum gltype) { int makeUniformSlots(GLuint glprogram, const Shader::BindingSet& slotBindings, Shader::SlotSet& uniforms, Shader::SlotSet& textures, Shader::SlotSet& samplers) { GLint uniformsCount = 0; +#if (GPU_FEATURE_PROFILE == GPU_LEGACY) + GLuint currentProgram = glGetIntegerv(GL_CURRENT_PROGRAM); + glUseProgram(glprogram); +#endif + glGetProgramiv(glprogram, GL_ACTIVE_UNIFORMS, &uniformsCount); for (int i = 0; i < uniformsCount; i++) { @@ -551,7 +556,11 @@ int makeUniformSlots(GLuint glprogram, const Shader::BindingSet& slotBindings, S if (requestedBinding != slotBindings.end()) { if (binding != (*requestedBinding)._location) { binding = (*requestedBinding)._location; +#if (GPU_FEATURE_PROFILE == GPU_LEGACY) + glUniform1i(location, binding); +#else glProgramUniform1i(glprogram, location, binding); +#endif } } @@ -561,6 +570,10 @@ int makeUniformSlots(GLuint glprogram, const Shader::BindingSet& slotBindings, S } } +#if (GPU_FEATURE_PROFILE == GPU_LEGACY) + glUseProgram(currentProgram); +#endif + return uniformsCount; } From 414315b6e066c498fa8a736eda9dad6a91afaa5c Mon Sep 17 00:00:00 2001 From: Sam Gateau Date: Wed, 18 Mar 2015 16:15:06 -0700 Subject: [PATCH 06/15] Since glProgramUniform is not supported on MAc we need a workaround... --- libraries/gpu/src/gpu/GLBackendShader.cpp | 3 ++- 1 file changed, 2 insertions(+), 1 deletion(-) diff --git a/libraries/gpu/src/gpu/GLBackendShader.cpp b/libraries/gpu/src/gpu/GLBackendShader.cpp index 8391a1a7f9..3d9255faef 100755 --- a/libraries/gpu/src/gpu/GLBackendShader.cpp +++ b/libraries/gpu/src/gpu/GLBackendShader.cpp @@ -510,7 +510,8 @@ int makeUniformSlots(GLuint glprogram, const Shader::BindingSet& slotBindings, S GLint uniformsCount = 0; #if (GPU_FEATURE_PROFILE == GPU_LEGACY) - GLuint currentProgram = glGetIntegerv(GL_CURRENT_PROGRAM); + GLuint currentProgram = 0; + glGetIntegerv(GL_CURRENT_PROGRAM, ¤tProgram); glUseProgram(glprogram); #endif From 0f22d648024312e77e565bbdde58b99f54609335 Mon Sep 17 00:00:00 2001 From: samcake Date: Wed, 18 Mar 2015 16:28:42 -0700 Subject: [PATCH 07/15] compilation on MacOSX --- libraries/gpu/src/gpu/GLBackendShader.cpp | 2 +- libraries/gpu/src/gpu/Shader.h | 9 +- libraries/render-utils/src/Model.cpp | 176 +++++++++++----------- 3 files changed, 97 insertions(+), 90 deletions(-) diff --git a/libraries/gpu/src/gpu/GLBackendShader.cpp b/libraries/gpu/src/gpu/GLBackendShader.cpp index 3d9255faef..bcfdc4f36c 100755 --- a/libraries/gpu/src/gpu/GLBackendShader.cpp +++ b/libraries/gpu/src/gpu/GLBackendShader.cpp @@ -510,7 +510,7 @@ int makeUniformSlots(GLuint glprogram, const Shader::BindingSet& slotBindings, S GLint uniformsCount = 0; #if (GPU_FEATURE_PROFILE == GPU_LEGACY) - GLuint currentProgram = 0; + GLint currentProgram = 0; glGetIntegerv(GL_CURRENT_PROGRAM, ¤tProgram); glUseProgram(glprogram); #endif diff --git a/libraries/gpu/src/gpu/Shader.h b/libraries/gpu/src/gpu/Shader.h index 535faff64c..d88c2d5a87 100755 --- a/libraries/gpu/src/gpu/Shader.h +++ b/libraries/gpu/src/gpu/Shader.h @@ -51,11 +51,18 @@ public: Element _element = Element(); uint16 _resourceType = Resource::BUFFER; + Slot(const Slot& s) : _name(s._name), _location(s._location), _element(s._element), _resourceType(s._resourceType) {} Slot(const Slot&& s) : _name(s._name), _location(s._location), _element(s._element), _resourceType(s._resourceType) {} - // Slot& operator&&(const Slot&& s) : _name(s._name), _location(s._location), _element(s._element), _resourceType(s._resourceType) {} Slot(const std::string& name, int32 location, const Element& element, uint16 resourceType = Resource::BUFFER) : _name(name), _location(location), _element(element), _resourceType(resourceType) {} Slot(const std::string& name) : _name(name) {} + + Slot& operator= (const Slot& s) { + _name = s._name; + _location = s._location; + _element = s._element; + _resourceType = s._resourceType; + return (*this); } }; class Binding { diff --git a/libraries/render-utils/src/Model.cpp b/libraries/render-utils/src/Model.cpp index 0be68395ca..47cb2d56f8 100644 --- a/libraries/render-utils/src/Model.cpp +++ b/libraries/render-utils/src/Model.cpp @@ -36,13 +36,13 @@ #include "Model.h" #include "model_vert.h" -#include "model_shadow_vert.h" -#include "model_normal_map_vert.h" -#include "model_lightmap_vert.h" -#include "model_lightmap_normal_map_vert.h" -#include "skin_model_vert.h" -#include "skin_model_shadow_vert.h" -#include "skin_model_normal_map_vert.h" +#include "model_shadow_vert.h" +#include "model_normal_map_vert.h" +#include "model_lightmap_vert.h" +#include "model_lightmap_normal_map_vert.h" +#include "skin_model_vert.h" +#include "skin_model_shadow_vert.h" +#include "skin_model_normal_map_vert.h" #include "model_frag.h" #include "model_shadow_frag.h" @@ -218,7 +218,7 @@ void Model::initProgram(gpu::ShaderPointer& program, Model::Locations& locations #if (GPU_FEATURE_PROFILE == GPU_CORE) locations.materialBufferUnit = program->getBuffers().findLocation("materialBuffer"); #else - locations.materialBuffer = program->getUniforms().findLocation("materialBuffer"); + locations.materialBufferUnit = program->getUniforms().findLocation("materialBuffer"); #endif } @@ -397,11 +397,11 @@ void Model::init() { // Programs _program = gpu::ShaderPointer(gpu::Shader::createProgram(modelVertex, modelPixel)); - makeResult = gpu::Shader::makeProgram(*_program, slotBindings); + makeResult = gpu::Shader::makeProgram(*_program, slotBindings); initProgram(_program, _locations); _normalMapProgram = gpu::ShaderPointer(gpu::Shader::createProgram(modelNormalMapVertex, modelNormalMapPixel)); - makeResult = gpu::Shader::makeProgram(*_normalMapProgram, slotBindings); + makeResult = gpu::Shader::makeProgram(*_normalMapProgram, slotBindings); initProgram(_normalMapProgram, _normalMapLocations); _specularMapProgram = gpu::ShaderPointer(gpu::Shader::createProgram(modelVertex, modelSpecularMapPixel)); @@ -413,122 +413,122 @@ void Model::init() { initProgram(_normalSpecularMapProgram, _normalSpecularMapLocations); _translucentProgram = gpu::ShaderPointer(gpu::Shader::createProgram(modelVertex, modelTranslucentPixel)); - makeResult = gpu::Shader::makeProgram(*_translucentProgram, slotBindings); + makeResult = gpu::Shader::makeProgram(*_translucentProgram, slotBindings); initProgram(_translucentProgram, _translucentLocations); _shadowProgram = gpu::ShaderPointer(gpu::Shader::createProgram(modelShadowVertex, modelShadowPixel)); makeResult = gpu::Shader::makeProgram(*_shadowProgram, slotBindings); - Model::Locations tempShadowLoc; + Model::Locations tempShadowLoc; initProgram(_shadowProgram, tempShadowLoc); _lightmapProgram = gpu::ShaderPointer(gpu::Shader::createProgram(modelLightmapVertex, modelLightmapPixel)); - makeResult = gpu::Shader::makeProgram(*_lightmapProgram, slotBindings); + makeResult = gpu::Shader::makeProgram(*_lightmapProgram, slotBindings); initProgram(_lightmapProgram, _lightmapLocations); _lightmapNormalMapProgram = gpu::ShaderPointer(gpu::Shader::createProgram(modelLightmapNormalMapVertex, modelLightmapNormalMapPixel)); - makeResult = gpu::Shader::makeProgram(*_lightmapNormalMapProgram, slotBindings); - initProgram(_lightmapNormalMapProgram, _lightmapNormalMapLocations); + makeResult = gpu::Shader::makeProgram(*_lightmapNormalMapProgram, slotBindings); + initProgram(_lightmapNormalMapProgram, _lightmapNormalMapLocations); _lightmapSpecularMapProgram = gpu::ShaderPointer(gpu::Shader::createProgram(modelLightmapVertex, modelLightmapSpecularMapPixel)); makeResult = gpu::Shader::makeProgram(*_lightmapSpecularMapProgram, slotBindings); - initProgram(_lightmapSpecularMapProgram, _lightmapSpecularMapLocations); + initProgram(_lightmapSpecularMapProgram, _lightmapSpecularMapLocations); _lightmapNormalSpecularMapProgram = gpu::ShaderPointer(gpu::Shader::createProgram(modelLightmapNormalMapVertex, modelLightmapNormalSpecularMapPixel)); makeResult = gpu::Shader::makeProgram(*_lightmapNormalSpecularMapProgram, slotBindings); - initProgram(_lightmapNormalSpecularMapProgram, _lightmapNormalSpecularMapLocations); + initProgram(_lightmapNormalSpecularMapProgram, _lightmapNormalSpecularMapLocations); _skinProgram = gpu::ShaderPointer(gpu::Shader::createProgram(skinModelVertex, modelPixel)); - makeResult = gpu::Shader::makeProgram(*_skinProgram, slotBindings); - initSkinProgram(_skinProgram, _skinLocations); + makeResult = gpu::Shader::makeProgram(*_skinProgram, slotBindings); + initSkinProgram(_skinProgram, _skinLocations); _skinNormalMapProgram = gpu::ShaderPointer(gpu::Shader::createProgram(skinModelNormalMapVertex, modelNormalMapPixel)); - makeResult = gpu::Shader::makeProgram(*_skinNormalMapProgram, slotBindings); - initSkinProgram(_skinNormalMapProgram, _skinNormalMapLocations); + makeResult = gpu::Shader::makeProgram(*_skinNormalMapProgram, slotBindings); + initSkinProgram(_skinNormalMapProgram, _skinNormalMapLocations); _skinSpecularMapProgram = gpu::ShaderPointer(gpu::Shader::createProgram(skinModelVertex, modelSpecularMapPixel)); makeResult = gpu::Shader::makeProgram(*_skinSpecularMapProgram, slotBindings); - initSkinProgram(_skinSpecularMapProgram, _skinSpecularMapLocations); + initSkinProgram(_skinSpecularMapProgram, _skinSpecularMapLocations); _skinNormalSpecularMapProgram = gpu::ShaderPointer(gpu::Shader::createProgram(skinModelNormalMapVertex, modelNormalSpecularMapPixel)); makeResult = gpu::Shader::makeProgram(*_skinNormalSpecularMapProgram, slotBindings); - initSkinProgram(_skinNormalSpecularMapProgram, _skinNormalSpecularMapLocations); + initSkinProgram(_skinNormalSpecularMapProgram, _skinNormalSpecularMapLocations); _skinShadowProgram = gpu::ShaderPointer(gpu::Shader::createProgram(skinModelShadowVertex, modelShadowPixel)); makeResult = gpu::Shader::makeProgram(*_skinShadowProgram, slotBindings); - initSkinProgram(_skinShadowProgram, _skinShadowLocations); + initSkinProgram(_skinShadowProgram, _skinShadowLocations); _skinTranslucentProgram = gpu::ShaderPointer(gpu::Shader::createProgram(skinModelVertex, modelTranslucentPixel)); makeResult = gpu::Shader::makeProgram(*_skinTranslucentProgram, slotBindings); - initSkinProgram(_skinTranslucentProgram, _skinTranslucentLocations); + initSkinProgram(_skinTranslucentProgram, _skinTranslucentLocations); /* _POprogram.addShaderFromSourceCode(QGLShader::Vertex, model_vert); _POprogram.addShaderFromSourceCode(QGLShader::Fragment, model_frag); initProgram(_POprogram, _POlocations); - _POnormalMapProgram.addShaderFromSourceCode(QGLShader::Vertex, model_normal_map_vert); - _POnormalMapProgram.addShaderFromSourceCode(QGLShader::Fragment, model_normal_map_frag); - initProgram(_POnormalMapProgram, _POnormalMapLocations); - - _POspecularMapProgram.addShaderFromSourceCode(QGLShader::Vertex, model_vert); - _POspecularMapProgram.addShaderFromSourceCode(QGLShader::Fragment, model_specular_map_frag); - initProgram(_POspecularMapProgram, _POspecularMapLocations); - - _POnormalSpecularMapProgram.addShaderFromSourceCode(QGLShader::Vertex, model_normal_map_vert); - _POnormalSpecularMapProgram.addShaderFromSourceCode(QGLShader::Fragment, model_normal_specular_map_frag); - initProgram(_POnormalSpecularMapProgram, _POnormalSpecularMapLocations); - - _POtranslucentProgram.addShaderFromSourceCode(QGLShader::Vertex, model_vert); - _POtranslucentProgram.addShaderFromSourceCode(QGLShader::Fragment, model_translucent_frag); - initProgram(_POtranslucentProgram, _POtranslucentLocations); - - // Lightmap - _POlightmapProgram.addShaderFromSourceCode(QGLShader::Vertex, model_lightmap_vert); - _POlightmapProgram.addShaderFromSourceCode(QGLShader::Fragment, model_lightmap_frag); - initProgram(_POlightmapProgram, _POlightmapLocations); - - _POlightmapNormalMapProgram.addShaderFromSourceCode(QGLShader::Vertex, model_lightmap_normal_map_vert); - _POlightmapNormalMapProgram.addShaderFromSourceCode(QGLShader::Fragment, model_lightmap_normal_map_frag); - initProgram(_POlightmapNormalMapProgramddd, _POlightmapNormalMapLocations); - - _POlightmapSpecularMapProgram.addShaderFromSourceCode(QGLShader::Vertex, model_lightmap_vert); - _POlightmapSpecularMapProgram.addShaderFromSourceCode(QGLShader::Fragment, model_lightmap_specular_map_frag); - initProgram(_POlightmapSpecularMapProgram, _POlightmapSpecularMapLocations); - - _POlightmapNormalSpecularMapProgram.addShaderFromSourceCode(QGLShader::Vertex, model_lightmap_normal_map_vert); - _POlightmapNormalSpecularMapProgram.addShaderFromSourceCode(QGLShader::Fragment, model_lightmap_normal_specular_map_frag); - initProgram(_POlightmapNormalSpecularMapProgram, _POlightmapNormalSpecularMapLocations); - // end lightmap - - - _POshadowProgram.addShaderFromSourceCode(QGLShader::Vertex, model_shadow_vert); - _POshadowProgram.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(_POshadowProgram, tempLoc); - - _POskinProgram.addShaderFromSourceCode(QGLShader::Vertex, skin_model_vert); - _POskinProgram.addShaderFromSourceCode(QGLShader::Fragment, model_frag); - initSkinProgram(_POskinProgram, _POskinLocations); - - _POskinNormalMapProgram.addShaderFromSourceCode(QGLShader::Vertex, skin_model_normal_map_vert); - _POskinNormalMapProgram.addShaderFromSourceCode(QGLShader::Fragment, model_normal_map_frag); - initSkinProgram(_POskinNormalMapProgram, _PaOskinNormalMapLocations); - - _POskinSpecularMapProgram.addShaderFromSourceCode(QGLShader::Vertex, model_vert); - _POskinSpecularMapProgram.addShaderFromSourceCode(QGLShader::Fragment, model_specular_map_frag); - initSkinProgram(_POskinSpecularMapProgram, _POskinSpecularMapLocations); - - _POskinNormalSpecularMapProgram.addShaderFromSourceCode(QGLShader::Vertex, skin_model_normal_map_vert); - _POskinNormalSpecularMapProgram.addShaderFromSourceCode(QGLShader::Fragment, model_normal_specular_map_frag); - initSkinProgram(_POskinNormalSpecularMapProgram, _POskinNormalSpecularMapLocations); - - _POskinShadowProgram.addShaderFromSourceCode(QGLShader::Vertex, skin_model_shadow_vert); - _POskinShadowProgram.addShaderFromSourceCode(QGLShader::Fragment, model_shadow_frag); - initSkinProgram(_POskinShadowProgram, _POskinShadowLocations); - - - _POskinTranslucentProgram.addShaderFromSourceCode(QGLShader::Vertex, skin_model_vert); + _POnormalMapProgram.addShaderFromSourceCode(QGLShader::Vertex, model_normal_map_vert); + _POnormalMapProgram.addShaderFromSourceCode(QGLShader::Fragment, model_normal_map_frag); + initProgram(_POnormalMapProgram, _POnormalMapLocations); + + _POspecularMapProgram.addShaderFromSourceCode(QGLShader::Vertex, model_vert); + _POspecularMapProgram.addShaderFromSourceCode(QGLShader::Fragment, model_specular_map_frag); + initProgram(_POspecularMapProgram, _POspecularMapLocations); + + _POnormalSpecularMapProgram.addShaderFromSourceCode(QGLShader::Vertex, model_normal_map_vert); + _POnormalSpecularMapProgram.addShaderFromSourceCode(QGLShader::Fragment, model_normal_specular_map_frag); + initProgram(_POnormalSpecularMapProgram, _POnormalSpecularMapLocations); + + _POtranslucentProgram.addShaderFromSourceCode(QGLShader::Vertex, model_vert); + _POtranslucentProgram.addShaderFromSourceCode(QGLShader::Fragment, model_translucent_frag); + initProgram(_POtranslucentProgram, _POtranslucentLocations); + + // Lightmap + _POlightmapProgram.addShaderFromSourceCode(QGLShader::Vertex, model_lightmap_vert); + _POlightmapProgram.addShaderFromSourceCode(QGLShader::Fragment, model_lightmap_frag); + initProgram(_POlightmapProgram, _POlightmapLocations); + + _POlightmapNormalMapProgram.addShaderFromSourceCode(QGLShader::Vertex, model_lightmap_normal_map_vert); + _POlightmapNormalMapProgram.addShaderFromSourceCode(QGLShader::Fragment, model_lightmap_normal_map_frag); + initProgram(_POlightmapNormalMapProgramddd, _POlightmapNormalMapLocations); + + _POlightmapSpecularMapProgram.addShaderFromSourceCode(QGLShader::Vertex, model_lightmap_vert); + _POlightmapSpecularMapProgram.addShaderFromSourceCode(QGLShader::Fragment, model_lightmap_specular_map_frag); + initProgram(_POlightmapSpecularMapProgram, _POlightmapSpecularMapLocations); + + _POlightmapNormalSpecularMapProgram.addShaderFromSourceCode(QGLShader::Vertex, model_lightmap_normal_map_vert); + _POlightmapNormalSpecularMapProgram.addShaderFromSourceCode(QGLShader::Fragment, model_lightmap_normal_specular_map_frag); + initProgram(_POlightmapNormalSpecularMapProgram, _POlightmapNormalSpecularMapLocations); + // end lightmap + + + _POshadowProgram.addShaderFromSourceCode(QGLShader::Vertex, model_shadow_vert); + _POshadowProgram.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(_POshadowProgram, tempLoc); + + _POskinProgram.addShaderFromSourceCode(QGLShader::Vertex, skin_model_vert); + _POskinProgram.addShaderFromSourceCode(QGLShader::Fragment, model_frag); + initSkinProgram(_POskinProgram, _POskinLocations); + + _POskinNormalMapProgram.addShaderFromSourceCode(QGLShader::Vertex, skin_model_normal_map_vert); + _POskinNormalMapProgram.addShaderFromSourceCode(QGLShader::Fragment, model_normal_map_frag); + initSkinProgram(_POskinNormalMapProgram, _PaOskinNormalMapLocations); + + _POskinSpecularMapProgram.addShaderFromSourceCode(QGLShader::Vertex, model_vert); + _POskinSpecularMapProgram.addShaderFromSourceCode(QGLShader::Fragment, model_specular_map_frag); + initSkinProgram(_POskinSpecularMapProgram, _POskinSpecularMapLocations); + + _POskinNormalSpecularMapProgram.addShaderFromSourceCode(QGLShader::Vertex, skin_model_normal_map_vert); + _POskinNormalSpecularMapProgram.addShaderFromSourceCode(QGLShader::Fragment, model_normal_specular_map_frag); + initSkinProgram(_POskinNormalSpecularMapProgram, _POskinNormalSpecularMapLocations); + + _POskinShadowProgram.addShaderFromSourceCode(QGLShader::Vertex, skin_model_shadow_vert); + _POskinShadowProgram.addShaderFromSourceCode(QGLShader::Fragment, model_shadow_frag); + initSkinProgram(_POskinShadowProgram, _POskinShadowLocations); + + + _POskinTranslucentProgram.addShaderFromSourceCode(QGLShader::Vertex, skin_model_vert); _POskinTranslucentProgram.addShaderFromSourceCode(QGLShader::Fragment, model_translucent_frag); initSkinProgram(_POskinTranslucentProgram, _POskinTranslucentLocations); */ From b33ba64e05018d27d9da45e8c4a21d44ab8f34b9 Mon Sep 17 00:00:00 2001 From: Sam Gateau Date: Wed, 18 Mar 2015 17:20:27 -0700 Subject: [PATCH 08/15] trying to tweek the transform equation to find the intel bug --- libraries/gpu/src/gpu/Transform.slh | 3 ++- libraries/render-utils/src/model.slv | 4 +++- 2 files changed, 5 insertions(+), 2 deletions(-) diff --git a/libraries/gpu/src/gpu/Transform.slh b/libraries/gpu/src/gpu/Transform.slh index 93ea0ce9f6..072303a7f9 100644 --- a/libraries/gpu/src/gpu/Transform.slh +++ b/libraries/gpu/src/gpu/Transform.slh @@ -68,7 +68,8 @@ TransformCamera getTransformCamera() { } <@else@> -uniform vec4 transformObjectBuffer[7]; +uniform vec4 transformObjectBuffer[8]; + TransformObject getTransformObject() { TransformObject object; object._model[0] = transformObjectBuffer[0]; diff --git a/libraries/render-utils/src/model.slv b/libraries/render-utils/src/model.slv index 4f416e8f1f..679e826ef3 100755 --- a/libraries/render-utils/src/model.slv +++ b/libraries/render-utils/src/model.slv @@ -16,6 +16,7 @@ const int MAX_TEXCOORDS = 2; uniform mat4 texcoordMatrices[MAX_TEXCOORDS]; + // the interpolated normal varying vec4 normal; @@ -30,7 +31,8 @@ void main(void) { // use standard pipeline transform TransformCamera cam = getTransformCamera(); TransformObject obj = getTransformObject(); - gl_Position = transformModelToClipPos(cam, obj, gl_Vertex); + + gl_Position = transformModelToClipPos(cam, obj, vec4(gl_Vertex.xyz, 1.0)); // transform and store the normal for interpolation normal = vec4(normalize(transformModelToEyeDir(cam, obj, gl_Normal)), 0.0); From 619a3231968ce5b930ecf7a32c3825d83d24761d Mon Sep 17 00:00:00 2001 From: Sam Gateau Date: Thu, 19 Mar 2015 14:46:50 -0700 Subject: [PATCH 09/15] Using Scribe preprocessor @func@ instead of regular glsl function to solve the intel bug with the transform stack --- libraries/gpu/src/gpu/Transform.slh | 70 ++++++++++--------- libraries/render-utils/src/model.slv | 13 ++-- libraries/render-utils/src/model_lightmap.slv | 12 ++-- .../src/model_lightmap_normal_map.slv | 15 ++-- .../render-utils/src/model_normal_map.slv | 15 ++-- libraries/render-utils/src/model_shadow.slv | 5 +- libraries/render-utils/src/skin_model.slv | 11 +-- .../src/skin_model_normal_map.slv | 19 +++-- .../render-utils/src/skin_model_shadow.slv | 5 +- 9 files changed, 90 insertions(+), 75 deletions(-) diff --git a/libraries/gpu/src/gpu/Transform.slh b/libraries/gpu/src/gpu/Transform.slh index 072303a7f9..4988b230cc 100644 --- a/libraries/gpu/src/gpu/Transform.slh +++ b/libraries/gpu/src/gpu/Transform.slh @@ -10,6 +10,7 @@ <@if not GPU_TRANSFORM_STATE_SLH@> <@def GPU_TRANSFORM_STATE_SLH@> +<@func declareStandardTransform()@> struct TransformObject { mat4 _model; mat4 _modelInverse; @@ -23,48 +24,19 @@ struct TransformCamera { vec4 _viewport; }; -vec4 transformModelToClipPos(TransformCamera camera, TransformObject object, vec4 pos) { -<@if GPU_TRANSFORM_PROFILE == GPU_CORE@> - vec4 epos = (object._model * pos) + vec4(-pos.w * camera._viewInverse[3].xyz, 0.0); - return camera._projectionViewUntranslated * epos; - // Equivalent to the following but hoppefully a bit more accurate - //return camera._projection * camera._view * object._model * pos; -<@else@> - return gl_ModelViewProjectionMatrix * pos; -<@endif@> -} - -vec3 transformModelToEyeDir(TransformCamera camera, TransformObject object, vec3 dir) { -<@if GPU_TRANSFORM_PROFILE == GPU_CORE@> - vec3 mr0 = vec3(object._modelInverse[0].x, object._modelInverse[1].x, object._modelInverse[2].x); - vec3 mr1 = vec3(object._modelInverse[0].y, object._modelInverse[1].y, object._modelInverse[2].y); - vec3 mr2 = vec3(object._modelInverse[0].z, object._modelInverse[1].z, object._modelInverse[2].z); - - vec3 mvc0 = vec3(dot(camera._viewInverse[0].xyz, mr0), dot(camera._viewInverse[0].xyz, mr1), dot(camera._viewInverse[0].xyz, mr2)); - vec3 mvc1 = vec3(dot(camera._viewInverse[1].xyz, mr0), dot(camera._viewInverse[1].xyz, mr1), dot(camera._viewInverse[1].xyz, mr2)); - vec3 mvc2 = vec3(dot(camera._viewInverse[2].xyz, mr0), dot(camera._viewInverse[2].xyz, mr1), dot(camera._viewInverse[2].xyz, mr2)); - - vec3 result = vec3(dot(mvc0, dir), dot(mvc1, dir), dot(mvc2, dir)); - - return result; -<@else@> - return gl_NormalMatrix * dir; -<@endif@> -} - <@if GPU_TRANSFORM_PROFILE == GPU_CORE@> uniform transformObjectBuffer { - TransformObject object; + TransformObject _object; }; TransformObject getTransformObject() { - return object; + return _object; } uniform transformCameraBuffer { - TransformCamera camera; + TransformCamera _camera; }; TransformCamera getTransformCamera() { - return camera; + return _camera; } <@else@> @@ -114,6 +86,38 @@ TransformCamera getTransformCamera() { } <@endif@> +<@endfunc@> + +<@func transformModelToClipPos(cameraTransform, objectTransform, modelPos, clipPos)@> +<@if GPU_TRANSFORM_PROFILE == GPU_CORE@> + + { // transformModelToClipPos + vec4 _eyepos = (<$objectTransform$>._model * <$modelPos$>) + vec4(-<$modelPos$>.w * <$cameraTransform$>._viewInverse[3].xyz, 0.0); + <$clipPos$> = <$cameraTransform$>._projectionViewUntranslated * _eyepos; + } +<@else@> + <$clippos$> = gl_ModelViewProjectionMatrix * <$modelPos$>; +<@endif@> +<@endfunc@> + +<@func transformModelToEyeDir(cameraTransform, objectTransform, modelDir, eyeDir)@> +<@if GPU_TRANSFORM_PROFILE == GPU_CORE@> + { // transformModelToEyeDir + vec3 mr0 = vec3(<$objectTransform$>._modelInverse[0].x, <$objectTransform$>._modelInverse[1].x, <$objectTransform$>._modelInverse[2].x); + vec3 mr1 = vec3(<$objectTransform$>._modelInverse[0].y, <$objectTransform$>._modelInverse[1].y, <$objectTransform$>._modelInverse[2].y); + vec3 mr2 = vec3(<$objectTransform$>._modelInverse[0].z, <$objectTransform$>._modelInverse[1].z, <$objectTransform$>._modelInverse[2].z); + + vec3 mvc0 = vec3(dot(<$cameraTransform$>._viewInverse[0].xyz, mr0), dot(<$cameraTransform$>._viewInverse[0].xyz, mr1), dot(<$cameraTransform$>._viewInverse[0].xyz, mr2)); + vec3 mvc1 = vec3(dot(<$cameraTransform$>._viewInverse[1].xyz, mr0), dot(<$cameraTransform$>._viewInverse[1].xyz, mr1), dot(<$cameraTransform$>._viewInverse[1].xyz, mr2)); + vec3 mvc2 = vec3(dot(<$cameraTransform$>._viewInverse[2].xyz, mr0), dot(<$cameraTransform$>._viewInverse[2].xyz, mr1), dot(<$cameraTransform$>._viewInverse[2].xyz, mr2)); + + <$eyeDir$> = vec3(dot(mvc0, <$modelDir$>), dot(mvc1, <$modelDir$>), dot(mvc2, <$modelDir$>)); + } +<@else@> + <$eyeDir$> = gl_NormalMatrix * <$modelDir$>; +<@endif@> +<@endfunc@> <@endif@> diff --git a/libraries/render-utils/src/model.slv b/libraries/render-utils/src/model.slv index 679e826ef3..21c9238273 100755 --- a/libraries/render-utils/src/model.slv +++ b/libraries/render-utils/src/model.slv @@ -12,6 +12,9 @@ // <@include gpu/Transform.slh@> + +<$declareStandardTransform()$> + const int MAX_TEXCOORDS = 2; uniform mat4 texcoordMatrices[MAX_TEXCOORDS]; @@ -28,13 +31,11 @@ void main(void) { // and the texture coordinates gl_TexCoord[0] = texcoordMatrices[0] * vec4(gl_MultiTexCoord0.xy, 0.0, 1.0); - // use standard pipeline transform + // standard transform TransformCamera cam = getTransformCamera(); TransformObject obj = getTransformObject(); + <$transformModelToClipPos(cam, obj, gl_Vertex, gl_Position)$> + <$transformModelToEyeDir(cam, obj, gl_Normal, normal.xyz)$> - gl_Position = transformModelToClipPos(cam, obj, vec4(gl_Vertex.xyz, 1.0)); - - // transform and store the normal for interpolation - normal = vec4(normalize(transformModelToEyeDir(cam, obj, gl_Normal)), 0.0); - + normal = vec4(normalize(normal.xyz), 0.0); } diff --git a/libraries/render-utils/src/model_lightmap.slv b/libraries/render-utils/src/model_lightmap.slv index afe3c73549..f24ba4e53d 100755 --- a/libraries/render-utils/src/model_lightmap.slv +++ b/libraries/render-utils/src/model_lightmap.slv @@ -14,6 +14,8 @@ <@include gpu/Transform.slh@> +<$declareStandardTransform()$> + const int MAX_TEXCOORDS = 2; uniform mat4 texcoordMatrices[MAX_TEXCOORDS]; @@ -35,12 +37,12 @@ void main(void) { // interpolatedTexcoord1 = vec2(texcoordMatrices[1] * vec4(gl_MultiTexCoord0.xy, 0.0, 1.0)).xy; interpolatedTexcoord1 = vec2(texcoordMatrices[1] * vec4(texcoord1.xy, 0.0, 1.0)).xy; - // use standard pipeline transform + // standard transform TransformCamera cam = getTransformCamera(); TransformObject obj = getTransformObject(); - gl_Position = transformModelToClipPos(cam, obj, gl_Vertex); - - // transform and store the normal for interpolation - normal = vec4(normalize(transformModelToEyeDir(cam, obj, gl_Normal)), 0.0); + <$transformModelToClipPos(cam, obj, gl_Vertex, gl_Position)$> + <$transformModelToEyeDir(cam, obj, gl_Normal, normal.xyz)$> + + normal = vec4(normalize(normal.xyz), 0.0); } diff --git a/libraries/render-utils/src/model_lightmap_normal_map.slv b/libraries/render-utils/src/model_lightmap_normal_map.slv index 6e66b28e63..a1413b1530 100755 --- a/libraries/render-utils/src/model_lightmap_normal_map.slv +++ b/libraries/render-utils/src/model_lightmap_normal_map.slv @@ -14,6 +14,8 @@ <@include gpu/Transform.slh@> +<$declareStandardTransform()$> + const int MAX_TEXCOORDS = 2; uniform mat4 texcoordMatrices[MAX_TEXCOORDS]; @@ -44,12 +46,13 @@ void main(void) { gl_TexCoord[0] = texcoordMatrices[0] * vec4(gl_MultiTexCoord0.xy, 0.0, 1.0); interpolatedTexcoord1 = vec2(texcoordMatrices[1] * vec4(texcoord1.xy, 0.0, 1.0)).xy; - // use standard pipeline transform + // standard transform TransformCamera cam = getTransformCamera(); TransformObject obj = getTransformObject(); - gl_Position = transformModelToClipPos(cam, obj, gl_Vertex); - - // transform and store the normal for interpolation - interpolatedNormal = vec4(normalize(transformModelToEyeDir(cam, obj, gl_Normal)), 0.0); - interpolatedTangent = vec4(normalize(transformModelToEyeDir(cam, obj, tangent)), 0.0); + <$transformModelToClipPos(cam, obj, gl_Vertex, gl_Position)$> + <$transformModelToEyeDir(cam, obj, gl_Normal, interpolatedNormal.xyz)$> + <$transformModelToEyeDir(cam, obj, tangent, interpolatedTangent.xyz)$> + + interpolatedNormal = vec4(normalize(interpolatedNormal.xyz), 0.0); + interpolatedTangent = vec4(normalize(interpolatedTangent.xyz), 0.0); } diff --git a/libraries/render-utils/src/model_normal_map.slv b/libraries/render-utils/src/model_normal_map.slv index 4111458464..9983310b52 100755 --- a/libraries/render-utils/src/model_normal_map.slv +++ b/libraries/render-utils/src/model_normal_map.slv @@ -13,6 +13,8 @@ // <@include gpu/Transform.slh@> + +<$declareStandardTransform()$> const int MAX_TEXCOORDS = 2; @@ -38,12 +40,13 @@ void main(void) { // and the texture coordinates gl_TexCoord[0] = texcoordMatrices[0] * vec4(gl_MultiTexCoord0.xy, 0.0, 1.0); - // use standard pipeline transform + // standard transform TransformCamera cam = getTransformCamera(); TransformObject obj = getTransformObject(); - gl_Position = transformModelToClipPos(cam, obj, gl_Vertex); - - // transform and store the normal for interpolation - interpolatedNormal = vec4(normalize(transformModelToEyeDir(cam, obj, gl_Normal)), 0.0); - interpolatedTangent = vec4(normalize(transformModelToEyeDir(cam, obj, tangent)), 0.0); + <$transformModelToClipPos(cam, obj, gl_Vertex, gl_Position)$> + <$transformModelToEyeDir(cam, obj, gl_Normal, interpolatedNormal.xyz)$> + <$transformModelToEyeDir(cam, obj, tangent, interpolatedTangent.xyz)$> + + interpolatedNormal = vec4(normalize(interpolatedNormal.xyz), 0.0); + interpolatedTangent = vec4(normalize(interpolatedTangent.xyz), 0.0); } diff --git a/libraries/render-utils/src/model_shadow.slv b/libraries/render-utils/src/model_shadow.slv index 98f6bf5104..88e597557e 100755 --- a/libraries/render-utils/src/model_shadow.slv +++ b/libraries/render-utils/src/model_shadow.slv @@ -12,10 +12,11 @@ // See the accompanying file LICENSE or http://www.apache.org/licenses/LICENSE-2.0.html // <@include gpu/Transform.slh@> +<$declareStandardTransform()$> void main(void) { - // use standard pipeline transform + // standard transform TransformCamera cam = getTransformCamera(); TransformObject obj = getTransformObject(); - gl_Position = transformModelToClipPos(cam, obj, gl_Vertex); + <$transformModelToClipPos(cam, obj, gl_Vertex, gl_Position)$> } diff --git a/libraries/render-utils/src/skin_model.slv b/libraries/render-utils/src/skin_model.slv index 780b72323c..f65d5a8bdc 100755 --- a/libraries/render-utils/src/skin_model.slv +++ b/libraries/render-utils/src/skin_model.slv @@ -13,6 +13,7 @@ // <@include gpu/Transform.slh@> +<$declareStandardTransform()$> const int MAX_TEXCOORDS = 2; const int MAX_CLUSTERS = 128; @@ -43,11 +44,11 @@ void main(void) { // and the texture coordinates gl_TexCoord[0] = texcoordMatrices[0] * vec4(gl_MultiTexCoord0.xy, 0.0, 1.0); - // use standard pipeline transform + // standard transform TransformCamera cam = getTransformCamera(); TransformObject obj = getTransformObject(); - gl_Position = transformModelToClipPos(cam, obj, position); - - // transform and store the normal for interpolation - normal = vec4(normalize(transformModelToEyeDir(cam, obj, normal.xyz)), 0.0); + <$transformModelToClipPos(cam, obj, position, gl_Position)$> + <$transformModelToEyeDir(cam, obj, normal.xyz, normal.xyz)$> + + normal = vec4(normalize(normal.xyz), 0.0); } diff --git a/libraries/render-utils/src/skin_model_normal_map.slv b/libraries/render-utils/src/skin_model_normal_map.slv index 43ec9c6a9d..6a4170152d 100755 --- a/libraries/render-utils/src/skin_model_normal_map.slv +++ b/libraries/render-utils/src/skin_model_normal_map.slv @@ -13,6 +13,7 @@ // <@include gpu/Transform.slh@> +<$declareStandardTransform()$> const int MAX_TEXCOORDS = 2; const int MAX_CLUSTERS = 128; @@ -44,22 +45,20 @@ void main(void) { interpolatedNormal += clusterMatrix * vec4(gl_Normal, 0.0) * clusterWeight; interpolatedTangent += clusterMatrix * vec4(tangent, 0.0) * clusterWeight; } - // interpolatedNormal = gl_ModelViewMatrix * interpolatedNormal; - // interpolatedTangent = gl_ModelViewMatrix * interpolatedTangent; - + // pass along the diffuse color gl_FrontColor = gl_Color; // and the texture coordinates gl_TexCoord[0] = texcoordMatrices[0] * vec4(gl_MultiTexCoord0.xy, 0.0, 1.0); - gl_Position = gl_ModelViewProjectionMatrix * interpolatedPosition; - - // use standard pipeline transform + // standard transform TransformCamera cam = getTransformCamera(); TransformObject obj = getTransformObject(); - gl_Position = transformModelToClipPos(cam, obj, interpolatedPosition); - - interpolatedNormal = vec4(normalize(transformModelToEyeDir(cam, obj, interpolatedNormal.xyz)), 0.0); - interpolatedTangent = vec4(normalize(transformModelToEyeDir(cam, obj, interpolatedTangent.xyz)), 0.0); + <$transformModelToClipPos(cam, obj, interpolatedPosition, gl_Position)$> + <$transformModelToEyeDir(cam, obj, gl_Normal, interpolatedNormal.xyz)$> + <$transformModelToEyeDir(cam, obj, tangent, interpolatedTangent.xyz)$> + + interpolatedNormal = vec4(normalize(interpolatedNormal.xyz), 0.0); + interpolatedTangent = vec4(normalize(interpolatedTangent.xyz), 0.0); } diff --git a/libraries/render-utils/src/skin_model_shadow.slv b/libraries/render-utils/src/skin_model_shadow.slv index de7f8f4e9f..03b912a981 100755 --- a/libraries/render-utils/src/skin_model_shadow.slv +++ b/libraries/render-utils/src/skin_model_shadow.slv @@ -13,6 +13,7 @@ // <@include gpu/Transform.slh@> +<$declareStandardTransform()$> const int MAX_CLUSTERS = 128; const int INDICES_PER_VERTEX = 4; @@ -30,8 +31,8 @@ void main(void) { position += clusterMatrix * gl_Vertex * clusterWeight; } - // use standard pipeline transform + // standard transform TransformCamera cam = getTransformCamera(); TransformObject obj = getTransformObject(); - gl_Position = transformModelToClipPos(cam, obj, position); + <$transformModelToClipPos(cam, obj, position, gl_Position)$> } From 65727dd613c9b60d9fcd2f8c5e32ddb92af673f2 Mon Sep 17 00:00:00 2001 From: Sam Gateau Date: Thu, 19 Mar 2015 15:23:50 -0700 Subject: [PATCH 10/15] clean up code --- libraries/render-utils/src/Model.cpp | 412 ++++----------------------- libraries/render-utils/src/Model.h | 42 +-- 2 files changed, 61 insertions(+), 393 deletions(-) diff --git a/libraries/render-utils/src/Model.cpp b/libraries/render-utils/src/Model.cpp index 47cb2d56f8..9fd15e6f27 100644 --- a/libraries/render-utils/src/Model.cpp +++ b/libraries/render-utils/src/Model.cpp @@ -93,46 +93,7 @@ Model::Model(QObject* parent) : Model::~Model() { deleteGeometry(); } -/* -ProgramObject Model::_POprogram; -ProgramObject Model::_POnormalMapProgram; -ProgramObject Model::_POspecularMapProgram; -ProgramObject Model::_POnormalSpecularMapProgram; -ProgramObject Model::_POtranslucentProgram; -ProgramObject Model::_POlightmapProgram; -ProgramObject Model::_POlightmapNormalMapProgram; -ProgramObject Model::_POlightmapSpecularMapProgram; -ProgramObject Model::_POlightmapNormalSpecularMapProgram; - -ProgramObject Model::_POshadowProgram; - -ProgramObject Model::_POskinProgram; -ProgramObject Model::_POskinNormalMapProgram; -ProgramObject Model::_POskinSpecularMapProgram; -ProgramObject Model::_POskinNormalSpecularMapProgram; -ProgramObject Model::_POskinTranslucentProgram; - -ProgramObject Model::_POskinShadowProgram; - -Model::Locations Model::_POlocations; -Model::Locations Model::_POnormalMapLocations; -Model::Locations Model::_POspecularMapLocations; -Model::Locations Model::_POnormalSpecularMapLocations; -Model::Locations Model::_POtranslucentLocations; - -Model::Locations Model::_POlightmapLocations; -Model::Locations Model::_POlightmapNormalMapLocations; -Model::Locations Model::_POlightmapSpecularMapLocations; -Model::Locations Model::_POlightmapNormalSpecularMapLocations; - -Model::SkinLocations Model::_POskinLocations; -Model::SkinLocations Model::_POskinNormalMapLocations; -Model::SkinLocations Model::_POskinSpecularMapLocations; -Model::SkinLocations Model::_POskinNormalSpecularMapLocations; -Model::SkinLocations Model::_POskinShadowLocations; -Model::SkinLocations Model::_POskinTranslucentLocations; -*/ gpu::ShaderPointer Model::_program; gpu::ShaderPointer Model::_normalMapProgram; gpu::ShaderPointer Model::_specularMapProgram; @@ -232,100 +193,6 @@ void Model::initSkinProgram(gpu::ShaderPointer& program, Model::SkinLocations& l locations.clusterIndices = program->getInputs().findLocation("clusterIndices");; locations.clusterWeights = program->getInputs().findLocation("clusterWeights");; } -/* -void Model::initProgram(ProgramObject& program, Model::Locations& locations, bool link) { - if (link) { - program.bindAttributeLocation("tangent", gpu::Stream::TANGENT); - program.bindAttributeLocation("texcoord1", gpu::Stream::TEXCOORD1); - program.link(); - } - program.bind(); - - locations.tangent = program.attributeLocation("tangent"); - - locations.alphaThreshold = program.uniformLocation("alphaThreshold"); - locations.texcoordMatrices = program.uniformLocation("texcoordMatrices"); - locations.emissiveParams = program.uniformLocation("emissiveParams"); - locations.glowIntensity = program.uniformLocation("glowIntensity"); - program.setUniformValue("diffuseMap", 0); - program.setUniformValue("normalMap", 1); - - int loc = program.uniformLocation("specularMap"); - if (loc >= 0) { - program.setUniformValue("specularMap", 2); - locations.specularTextureUnit = 2; - } else { - locations.specularTextureUnit = -1; - } - - loc = program.uniformLocation("emissiveMap"); - if (loc >= 0) { - program.setUniformValue("emissiveMap", 3); - locations.emissiveTextureUnit = 3; - } else { - locations.emissiveTextureUnit = -1; - } - - // bindable uniform version - -#if (GPU_FEATURE_PROFILE == GPU_CORE) - loc = glGetUniformBlockIndex(program.programId(), "materialBuffer"); - if (loc >= 0) { - glUniformBlockBinding(program.programId(), loc, MATERIAL_GPU_SLOT); - locations.materialBufferUnit = MATERIAL_GPU_SLOT; - } else { - locations.materialBufferUnit = -1; - } -#else - loc = program.uniformLocation("materialBuffer"); - if (loc >= 0) { - locations.materialBufferUnit = loc; - } else { - locations.materialBufferUnit = -1; - } -#endif - -#if (GPU_FEATURE_PROFILE == GPU_CORE) - loc = glGetUniformBlockIndex(program.programId(), "transformObjectBuffer"); - if (loc >= 0) { - glUniformBlockBinding(program.programId(), loc, gpu::TRANSFORM_OBJECT_SLOT); - // locations.materialBufferUnit = 1; - } -#endif - -#if (GPU_FEATURE_PROFILE == GPU_CORE) - 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()) { - program.release(); - } - - program.release(); -}*/ -/* -void Model::initSkinProgram(ProgramObject& program, Model::SkinLocations& locations) { - program.bindAttributeLocation("tangent", gpu::Stream::TANGENT); - program.bindAttributeLocation("texcoord1", gpu::Stream::TEXCOORD1); - program.bindAttributeLocation("clusterIndices", gpu::Stream::SKIN_CLUSTER_INDEX); - program.bindAttributeLocation("clusterWeights", gpu::Stream::SKIN_CLUSTER_WEIGHT); - program.link(); - - initProgram(program, locations, false); - - program.bind(); - - locations.clusterMatrices = program.uniformLocation("clusterMatrices"); - locations.clusterIndices = program.attributeLocation("clusterIndices"); - locations.clusterWeights = program.attributeLocation("clusterWeights"); - - program.release(); -}*/ QVector Model::createJointStates(const FBXGeometry& geometry) { QVector jointStates; @@ -361,8 +228,6 @@ void Model::initJointTransforms() { void Model::init() { if (_program.isNull()) { - // if (!_program.isLinked()) { - //Work in progress not used yet gpu::Shader::BindingSet slotBindings; slotBindings.insert(gpu::Shader::Binding(std::string("materialBuffer"), MATERIAL_GPU_SLOT)); slotBindings.insert(gpu::Shader::Binding(std::string("diffuseMap"), 0)); @@ -460,78 +325,6 @@ void Model::init() { _skinTranslucentProgram = gpu::ShaderPointer(gpu::Shader::createProgram(skinModelVertex, modelTranslucentPixel)); makeResult = gpu::Shader::makeProgram(*_skinTranslucentProgram, slotBindings); initSkinProgram(_skinTranslucentProgram, _skinTranslucentLocations); - - /* - _POprogram.addShaderFromSourceCode(QGLShader::Vertex, model_vert); - _POprogram.addShaderFromSourceCode(QGLShader::Fragment, model_frag); - initProgram(_POprogram, _POlocations); - - _POnormalMapProgram.addShaderFromSourceCode(QGLShader::Vertex, model_normal_map_vert); - _POnormalMapProgram.addShaderFromSourceCode(QGLShader::Fragment, model_normal_map_frag); - initProgram(_POnormalMapProgram, _POnormalMapLocations); - - _POspecularMapProgram.addShaderFromSourceCode(QGLShader::Vertex, model_vert); - _POspecularMapProgram.addShaderFromSourceCode(QGLShader::Fragment, model_specular_map_frag); - initProgram(_POspecularMapProgram, _POspecularMapLocations); - - _POnormalSpecularMapProgram.addShaderFromSourceCode(QGLShader::Vertex, model_normal_map_vert); - _POnormalSpecularMapProgram.addShaderFromSourceCode(QGLShader::Fragment, model_normal_specular_map_frag); - initProgram(_POnormalSpecularMapProgram, _POnormalSpecularMapLocations); - - _POtranslucentProgram.addShaderFromSourceCode(QGLShader::Vertex, model_vert); - _POtranslucentProgram.addShaderFromSourceCode(QGLShader::Fragment, model_translucent_frag); - initProgram(_POtranslucentProgram, _POtranslucentLocations); - - // Lightmap - _POlightmapProgram.addShaderFromSourceCode(QGLShader::Vertex, model_lightmap_vert); - _POlightmapProgram.addShaderFromSourceCode(QGLShader::Fragment, model_lightmap_frag); - initProgram(_POlightmapProgram, _POlightmapLocations); - - _POlightmapNormalMapProgram.addShaderFromSourceCode(QGLShader::Vertex, model_lightmap_normal_map_vert); - _POlightmapNormalMapProgram.addShaderFromSourceCode(QGLShader::Fragment, model_lightmap_normal_map_frag); - initProgram(_POlightmapNormalMapProgramddd, _POlightmapNormalMapLocations); - - _POlightmapSpecularMapProgram.addShaderFromSourceCode(QGLShader::Vertex, model_lightmap_vert); - _POlightmapSpecularMapProgram.addShaderFromSourceCode(QGLShader::Fragment, model_lightmap_specular_map_frag); - initProgram(_POlightmapSpecularMapProgram, _POlightmapSpecularMapLocations); - - _POlightmapNormalSpecularMapProgram.addShaderFromSourceCode(QGLShader::Vertex, model_lightmap_normal_map_vert); - _POlightmapNormalSpecularMapProgram.addShaderFromSourceCode(QGLShader::Fragment, model_lightmap_normal_specular_map_frag); - initProgram(_POlightmapNormalSpecularMapProgram, _POlightmapNormalSpecularMapLocations); - // end lightmap - - - _POshadowProgram.addShaderFromSourceCode(QGLShader::Vertex, model_shadow_vert); - _POshadowProgram.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(_POshadowProgram, tempLoc); - - _POskinProgram.addShaderFromSourceCode(QGLShader::Vertex, skin_model_vert); - _POskinProgram.addShaderFromSourceCode(QGLShader::Fragment, model_frag); - initSkinProgram(_POskinProgram, _POskinLocations); - - _POskinNormalMapProgram.addShaderFromSourceCode(QGLShader::Vertex, skin_model_normal_map_vert); - _POskinNormalMapProgram.addShaderFromSourceCode(QGLShader::Fragment, model_normal_map_frag); - initSkinProgram(_POskinNormalMapProgram, _PaOskinNormalMapLocations); - - _POskinSpecularMapProgram.addShaderFromSourceCode(QGLShader::Vertex, model_vert); - _POskinSpecularMapProgram.addShaderFromSourceCode(QGLShader::Fragment, model_specular_map_frag); - initSkinProgram(_POskinSpecularMapProgram, _POskinSpecularMapLocations); - - _POskinNormalSpecularMapProgram.addShaderFromSourceCode(QGLShader::Vertex, skin_model_normal_map_vert); - _POskinNormalSpecularMapProgram.addShaderFromSourceCode(QGLShader::Fragment, model_normal_specular_map_frag); - initSkinProgram(_POskinNormalSpecularMapProgram, _POskinNormalSpecularMapLocations); - - _POskinShadowProgram.addShaderFromSourceCode(QGLShader::Vertex, skin_model_shadow_vert); - _POskinShadowProgram.addShaderFromSourceCode(QGLShader::Fragment, model_shadow_frag); - initSkinProgram(_POskinShadowProgram, _POskinShadowLocations); - - - _POskinTranslucentProgram.addShaderFromSourceCode(QGLShader::Vertex, skin_model_vert); - _POskinTranslucentProgram.addShaderFromSourceCode(QGLShader::Fragment, model_translucent_frag); - initSkinProgram(_POskinTranslucentProgram, _POskinTranslucentLocations); - */ } } @@ -2397,165 +2190,80 @@ QVector* Model::pickMeshList(bool translucent, float alphaThreshold, bool h void Model::pickPrograms(gpu::Batch& batch, RenderMode mode, bool translucent, float alphaThreshold, bool hasLightmap, bool hasTangents, bool hasSpecular, bool isSkinned, RenderArgs* args, Locations*& locations, SkinLocations*& skinLocations) { -/* if (false) - { - ProgramObject* program = &_POprogram; - locations = &_POlocations; - ProgramObject* skinProgram = &_POskinProgram; - skinLocations = &_POskinLocations; - if (mode == SHADOW_RENDER_MODE) { - program = &_POshadowProgram; - skinProgram = &_POskinShadowProgram; - skinLocations = &_POskinShadowLocations; - } else if (translucent && alphaThreshold == 0.0f) { - program = &_POtranslucentProgram; - locations = &_POtranslucentLocations; - skinProgram = &_POskinTranslucentProgram; - skinLocations = &_POskinTranslucentLocations; + gpu::ShaderPointer program = _program; + locations = &_locations; + gpu::ShaderPointer skinProgram = _skinProgram; + skinLocations = &_skinLocations; + if (mode == SHADOW_RENDER_MODE) { + program = _shadowProgram; + skinProgram = _skinShadowProgram; + skinLocations = &_skinShadowLocations; + } else if (translucent && alphaThreshold == 0.0f) { + program = _translucentProgram; + locations = &_translucentLocations; + skinProgram = _skinTranslucentProgram; + skinLocations = &_skinTranslucentLocations; - } else if (hasLightmap) { - if (hasTangents) { - if (hasSpecular) { - program = &_POlightmapNormalSpecularMapProgram; - locations = &_POlightmapNormalSpecularMapLocations; - skinProgram = NULL; - skinLocations = NULL; - } else { - program = &_POlightmapNormalMapProgram; - locations = &_POlightmapNormalMapLocations; - skinProgram = NULL; - skinLocations = NULL; - } - } else if (hasSpecular) { - program = &_POlightmapSpecularMapProgram; - locations = &_POlightmapSpecularMapLocations; - skinProgram = NULL; + } else if (hasLightmap) { + if (hasTangents) { + if (hasSpecular) { + program = _lightmapNormalSpecularMapProgram; + locations = &_lightmapNormalSpecularMapLocations; + skinProgram.reset(nullptr); skinLocations = NULL; } else { - program = &_POlightmapProgram; - locations = &_POlightmapLocations; - skinProgram = NULL; + program = _lightmapNormalMapProgram; + locations = &_lightmapNormalMapLocations; + skinProgram.reset(nullptr); skinLocations = NULL; } + } else if (hasSpecular) { + program = _lightmapSpecularMapProgram; + locations = &_lightmapSpecularMapLocations; + skinProgram.reset(nullptr); + skinLocations = NULL; } else { - if (hasTangents) { - if (hasSpecular) { - program = &_POnormalSpecularMapProgram; - locations = &_POnormalSpecularMapLocations; - skinProgram = &_POskinNormalSpecularMapProgram; - skinLocations = &_POskinNormalSpecularMapLocations; - } else { - program = &_POnormalMapProgram; - locations = &_POnormalMapLocations; - skinProgram = &_POskinNormalMapProgram; - skinLocations = &_POskinNormalMapLocations; - } - } else if (hasSpecular) { - program = &_POspecularMapProgram; - locations = &_POspecularMapLocations; - skinProgram = &_POskinSpecularMapProgram; - skinLocations = &_POskinSpecularMapLocations; + program = _lightmapProgram; + locations = &_lightmapLocations; + skinProgram.reset(nullptr); + skinLocations = NULL; + } + } else { + if (hasTangents) { + if (hasSpecular) { + program = _normalSpecularMapProgram; + locations = &_normalSpecularMapLocations; + skinProgram = _skinNormalSpecularMapProgram; + skinLocations = &_skinNormalSpecularMapLocations; + } else { + program = _normalMapProgram; + locations = &_normalMapLocations; + skinProgram = _skinNormalMapProgram; + skinLocations = &_skinNormalMapLocations; } - } - - ProgramObject* activeProgram = program; - Locations* activeLocations = locations; - - if (isSkinned) { - activeProgram = skinProgram; - activeLocations = skinLocations; - locations = skinLocations; - } - // This code replace the "bind()" on the QGLProgram - if (!activeProgram->isLinked()) { - activeProgram->link(); + } else if (hasSpecular) { + program = _specularMapProgram; + locations = &_specularMapLocations; + skinProgram = _skinSpecularMapProgram; + skinLocations = &_skinSpecularMapLocations; } + } - GLBATCH(glUseProgram)(activeProgram->programId()); - - - if ((activeLocations->alphaThreshold > -1) && (mode != SHADOW_RENDER_MODE)) { - GLBATCH(glUniform1f)(activeLocations->alphaThreshold, alphaThreshold); - } + gpu::ShaderPointer activeProgram = program; + Locations* activeLocations = locations; + if (isSkinned) { + activeProgram = skinProgram; + activeLocations = skinLocations; + locations = skinLocations; } - else */ - { - gpu::ShaderPointer program = _program; - locations = &_locations; - gpu::ShaderPointer skinProgram = _skinProgram; - skinLocations = &_skinLocations; - if (mode == SHADOW_RENDER_MODE) { - program = _shadowProgram; - skinProgram = _skinShadowProgram; - skinLocations = &_skinShadowLocations; - } else if (translucent && alphaThreshold == 0.0f) { - program = _translucentProgram; - locations = &_translucentLocations; - skinProgram = _skinTranslucentProgram; - skinLocations = &_skinTranslucentLocations; - - } else if (hasLightmap) { - if (hasTangents) { - if (hasSpecular) { - program = _lightmapNormalSpecularMapProgram; - locations = &_lightmapNormalSpecularMapLocations; - skinProgram.reset(nullptr); - skinLocations = NULL; - } else { - program = _lightmapNormalMapProgram; - locations = &_lightmapNormalMapLocations; - skinProgram.reset(nullptr); - skinLocations = NULL; - } - } else if (hasSpecular) { - program = _lightmapSpecularMapProgram; - locations = &_lightmapSpecularMapLocations; - skinProgram.reset(nullptr); - skinLocations = NULL; - } else { - program = _lightmapProgram; - locations = &_lightmapLocations; - skinProgram.reset(nullptr); - skinLocations = NULL; - } - } else { - if (hasTangents) { - if (hasSpecular) { - program = _normalSpecularMapProgram; - locations = &_normalSpecularMapLocations; - skinProgram = _skinNormalSpecularMapProgram; - skinLocations = &_skinNormalSpecularMapLocations; - } else { - program = _normalMapProgram; - locations = &_normalMapLocations; - skinProgram = _skinNormalMapProgram; - skinLocations = &_skinNormalMapLocations; - } - } else if (hasSpecular) { - program = _specularMapProgram; - locations = &_specularMapLocations; - skinProgram = _skinSpecularMapProgram; - skinLocations = &_skinSpecularMapLocations; - } - } - gpu::ShaderPointer activeProgram = program; - Locations* activeLocations = locations; - - if (isSkinned) { - activeProgram = skinProgram; - activeLocations = skinLocations; - locations = skinLocations; - } - - GLuint glprogram = gpu::GLBackend::getShaderID(activeProgram); - GLBATCH(glUseProgram)(glprogram); + GLuint glprogram = gpu::GLBackend::getShaderID(activeProgram); + GLBATCH(glUseProgram)(glprogram); - if ((activeLocations->alphaThreshold > -1) && (mode != SHADOW_RENDER_MODE)) { - GLBATCH(glUniform1f)(activeLocations->alphaThreshold, alphaThreshold); - } + if ((activeLocations->alphaThreshold > -1) && (mode != SHADOW_RENDER_MODE)) { + GLBATCH(glUniform1f)(activeLocations->alphaThreshold, alphaThreshold); } } diff --git a/libraries/render-utils/src/Model.h b/libraries/render-utils/src/Model.h index 4004b4dad7..b7861889fb 100644 --- a/libraries/render-utils/src/Model.h +++ b/libraries/render-utils/src/Model.h @@ -315,28 +315,6 @@ private: int _blendNumber; int _appliedBlendNumber; - /* - static ProgramObject _POprogram; - static ProgramObject _POnormalMapProgram; - static ProgramObject _POspecularMapProgram; - static ProgramObject _POnormalSpecularMapProgram; - static ProgramObject _POtranslucentProgram; - - static ProgramObject _POlightmapProgram; - static ProgramObject _POlightmapNormalMapProgram; - static ProgramObject _POlightmapSpecularMapProgram; - static ProgramObject _POlightmapNormalSpecularMapProgram; - - static ProgramObject _POshadowProgram; - - static ProgramObject _POskinProgram; - static ProgramObject _POskinNormalMapProgram; - static ProgramObject _POskinSpecularMapProgram; - static ProgramObject _POskinNormalSpecularMapProgram; - static ProgramObject _POskinTranslucentProgram; - - static ProgramObject _POskinShadowProgram; - */ static gpu::ShaderPointer _program; static gpu::ShaderPointer _normalMapProgram; static gpu::ShaderPointer _specularMapProgram; @@ -380,18 +358,7 @@ private: static Locations _lightmapNormalMapLocations; static Locations _lightmapSpecularMapLocations; static Locations _lightmapNormalSpecularMapLocations; -/* - static Locations _POlocations; - static Locations _POnormalMapLocations; - static Locations _POspecularMapLocations; - static Locations _POnormalSpecularMapLocations; - static Locations _POtranslucentLocations; - static Locations _POlightmapLocations; - static Locations _POlightmapNormalMapLocations; - static Locations _POlightmapSpecularMapLocations; - static Locations _POlightmapNormalSpecularMapLocations; -*/ static void initProgram(ProgramObject& program, Locations& locations, bool link = true); static void initProgram(gpu::ShaderPointer& program, Locations& locations); @@ -408,14 +375,7 @@ private: static SkinLocations _skinNormalSpecularMapLocations; static SkinLocations _skinShadowLocations; static SkinLocations _skinTranslucentLocations; -/* - static SkinLocations _POskinLocations; - static SkinLocations _POskinNormalMapLocations; - static SkinLocations _POskinSpecularMapLocations; - static SkinLocations _POskinNormalSpecularMapLocations; - static SkinLocations _POskinShadowLocations; - static SkinLocations _POskinTranslucentLocations; -*/ + static void initSkinProgram(ProgramObject& program, SkinLocations& locations); static void initSkinProgram(gpu::ShaderPointer& program, SkinLocations& locations); From d2868bcafcd1bc0e0f5c69e572ef54f4da5f7615 Mon Sep 17 00:00:00 2001 From: samcake Date: Thu, 19 Mar 2015 16:00:47 -0700 Subject: [PATCH 11/15] fixing the shader for mac --- 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 4988b230cc..9019ec928c 100644 --- a/libraries/gpu/src/gpu/Transform.slh +++ b/libraries/gpu/src/gpu/Transform.slh @@ -88,7 +88,7 @@ TransformCamera getTransformCamera() { <@endif@> <@endfunc@> - + <@func transformModelToClipPos(cameraTransform, objectTransform, modelPos, clipPos)@> <@if GPU_TRANSFORM_PROFILE == GPU_CORE@> = <$cameraTransform$>._projectionViewUntranslated * _eyepos; } <@else@> - <$clippos$> = gl_ModelViewProjectionMatrix * <$modelPos$>; + <$clipPos$> = gl_ModelViewProjectionMatrix * <$modelPos$>; <@endif@> <@endfunc@> From fdbf4e5288b685bbf7a730a6969600dc571a3ffd Mon Sep 17 00:00:00 2001 From: Sam Gateau Date: Fri, 20 Mar 2015 11:55:00 -0700 Subject: [PATCH 12/15] cleaning code for review --- libraries/gpu/src/gpu/Shader.h | 18 +++++++++--------- libraries/model/src/model/Light.h | 18 +++++++++--------- libraries/model/src/model/Material.h | 14 +++++++------- 3 files changed, 25 insertions(+), 25 deletions(-) diff --git a/libraries/gpu/src/gpu/Shader.h b/libraries/gpu/src/gpu/Shader.h index d88c2d5a87..5ac9b3a173 100755 --- a/libraries/gpu/src/gpu/Shader.h +++ b/libraries/gpu/src/gpu/Shader.h @@ -41,18 +41,18 @@ public: Language _lang = GLSL; }; - static const uint32 INVALID_LOCATION = -1; + static const int32 INVALID_LOCATION = -1; class Slot { public: - std::string _name = (""); - int32 _location = INVALID_LOCATION; - Element _element = Element(); - uint16 _resourceType = Resource::BUFFER; + std::string _name; + int32 _location{INVALID_LOCATION}; + Element _element; + uint16 _resourceType{Resource::BUFFER}; Slot(const Slot& s) : _name(s._name), _location(s._location), _element(s._element), _resourceType(s._resourceType) {} - Slot(const Slot&& s) : _name(s._name), _location(s._location), _element(s._element), _resourceType(s._resourceType) {} + Slot(Slot&& s) : _name(s._name), _location(s._location), _element(s._element), _resourceType(s._resourceType) {} Slot(const std::string& name, int32 location, const Element& element, uint16 resourceType = Resource::BUFFER) : _name(name), _location(location), _element(element), _resourceType(resourceType) {} Slot(const std::string& name) : _name(name) {} @@ -79,13 +79,13 @@ public: class SlotSet : public std::set> { public: - const Slot&& findSlot(const std::string& name) const { + Slot findSlot(const std::string& name) const { auto key = Slot(name); auto found = static_cast>*>(this)->find(key); if (found != end()) { - return std::move((*found)); + return (*found); } - return std::move(key); + return key; } int32 findLocation(const std::string& name) const { return findSlot(name)._location; diff --git a/libraries/model/src/model/Light.h b/libraries/model/src/model/Light.h index 2c76714740..8f6c663668 100755 --- a/libraries/model/src/model/Light.h +++ b/libraries/model/src/model/Light.h @@ -252,16 +252,16 @@ public: // Schema to access the attribute values of the light class Schema { public: - Vec4 _position = Vec4(0.0f, 0.0f, 0.0f, 1.0f); - Vec3 _direction = Vec3(0.0f, 0.0f, -1.0f); - float _spare0 = 0.0f; - Color _color = Color(1.0f); - float _intensity = 1.0f; - Vec4 _attenuation = Vec4(1.0f); - Vec4 _spot = Vec4(0.0f, 0.0f, 0.0f, 3.0f); - Vec4 _shadow = Vec4(0.0f); + Vec4 _position{0.0f, 0.0f, 0.0f, 1.0f}; + Vec3 _direction{0.0f, 0.0f, -1.0f}; + float _spare0{0.0f}; + Color _color{1.0f}; + float _intensity{1.0f}; + Vec4 _attenuation{1.0f}; + Vec4 _spot{0.0f, 0.0f, 0.0f, 3.0f}; + Vec4 _shadow{0.0f}; - Vec4 _control = Vec4(0.0f); + Vec4 _control{0.0f}; Schema() {} }; diff --git a/libraries/model/src/model/Material.h b/libraries/model/src/model/Material.h index 865fd6dfb1..9262f23746 100755 --- a/libraries/model/src/model/Material.h +++ b/libraries/model/src/model/Material.h @@ -79,13 +79,13 @@ public: class Schema { public: - Color _diffuse = Color(0.5f); - float _opacity = 1.f; - Color _specular = Color(0.03f); - float _shininess = 0.1f; - Color _emissive = Color(0.0f); - float _spare0 = 0.0f; - glm::vec4 _spareVec4 = glm::vec4(0.0f); // for alignment beauty, Mat size == Mat4x4 + Color _diffuse{0.5f}; + float _opacity{1.f}; + Color _specular{0.03f}; + float _shininess{0.1f}; + Color _emissive{0.0f}; + float _spare0{0.0f}; + glm::vec4 _spareVec4{0.0f}; // for alignment beauty, Material size == Mat4x4 Schema() {} }; From 50631595815cb778d7cbf65e4fed2281f710f997 Mon Sep 17 00:00:00 2001 From: Sam Gateau Date: Fri, 20 Mar 2015 12:00:16 -0700 Subject: [PATCH 13/15] cleaning code for review --- libraries/gpu/src/gpu/Shader.h | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/libraries/gpu/src/gpu/Shader.h b/libraries/gpu/src/gpu/Shader.h index 5ac9b3a173..c8db7cfd39 100755 --- a/libraries/gpu/src/gpu/Shader.h +++ b/libraries/gpu/src/gpu/Shader.h @@ -69,7 +69,7 @@ public: public: std::string _name; int32 _location; - Binding(const std::string&& name, int32 loc = INVALID_LOCATION) : _name(name), _location(loc) {} + Binding(const std::string& name, int32 loc = INVALID_LOCATION) : _name(name), _location(loc) {} }; template class Less { From 68de91c80aeb23e90e829bce16c9d96d4bb5c0fe Mon Sep 17 00:00:00 2001 From: Sam Gateau Date: Fri, 20 Mar 2015 13:17:32 -0700 Subject: [PATCH 14/15] cleaning code for review --- libraries/render-utils/src/Model.cpp | 8 ++++---- 1 file changed, 4 insertions(+), 4 deletions(-) diff --git a/libraries/render-utils/src/Model.cpp b/libraries/render-utils/src/Model.cpp index 9fd15e6f27..0e0f081ec8 100644 --- a/libraries/render-utils/src/Model.cpp +++ b/libraries/render-utils/src/Model.cpp @@ -2209,23 +2209,23 @@ void Model::pickPrograms(gpu::Batch& batch, RenderMode mode, bool translucent, f if (hasSpecular) { program = _lightmapNormalSpecularMapProgram; locations = &_lightmapNormalSpecularMapLocations; - skinProgram.reset(nullptr); + skinProgram.reset(); skinLocations = NULL; } else { program = _lightmapNormalMapProgram; locations = &_lightmapNormalMapLocations; - skinProgram.reset(nullptr); + skinProgram.reset(); skinLocations = NULL; } } else if (hasSpecular) { program = _lightmapSpecularMapProgram; locations = &_lightmapSpecularMapLocations; - skinProgram.reset(nullptr); + skinProgram.reset(); skinLocations = NULL; } else { program = _lightmapProgram; locations = &_lightmapLocations; - skinProgram.reset(nullptr); + skinProgram.reset(); skinLocations = NULL; } } else { From 07bcd115c210ba58d33db8615fb4db7b3009558b Mon Sep 17 00:00:00 2001 From: Sam Gateau Date: Fri, 20 Mar 2015 13:28:42 -0700 Subject: [PATCH 15/15] trying to remove useless glsl code for Legacy path --- libraries/gpu/src/gpu/Transform.slh | 12 ++++++------ .../render-utils/src/DeferredLightingEffect.cpp | 10 ++++++---- 2 files changed, 12 insertions(+), 10 deletions(-) diff --git a/libraries/gpu/src/gpu/Transform.slh b/libraries/gpu/src/gpu/Transform.slh index 9019ec928c..042964f0f7 100644 --- a/libraries/gpu/src/gpu/Transform.slh +++ b/libraries/gpu/src/gpu/Transform.slh @@ -40,11 +40,11 @@ TransformCamera getTransformCamera() { } <@else@> -uniform vec4 transformObjectBuffer[8]; +//uniform vec4 transformObjectBuffer[8]; TransformObject getTransformObject() { TransformObject object; - object._model[0] = transformObjectBuffer[0]; + /* object._model[0] = transformObjectBuffer[0]; object._model[1] = transformObjectBuffer[1]; object._model[2] = transformObjectBuffer[2]; object._model[3] = transformObjectBuffer[3]; @@ -53,14 +53,14 @@ TransformObject getTransformObject() { object._modelInverse[1] = transformObjectBuffer[5]; object._modelInverse[2] = transformObjectBuffer[6]; object._modelInverse[3] = transformObjectBuffer[7]; - +*/ return object; } -uniform vec4 transformCameraBuffer[17]; +//uniform vec4 transformCameraBuffer[17]; TransformCamera getTransformCamera() { TransformCamera camera; - camera._view[0] = transformCameraBuffer[0]; +/* camera._view[0] = transformCameraBuffer[0]; camera._view[1] = transformCameraBuffer[1]; camera._view[2] = transformCameraBuffer[2]; camera._view[3] = transformCameraBuffer[3]; @@ -81,7 +81,7 @@ TransformCamera getTransformCamera() { camera._projection[3] = transformCameraBuffer[15]; camera._viewport = transformCameraBuffer[16]; - +*/ return camera; } diff --git a/libraries/render-utils/src/DeferredLightingEffect.cpp b/libraries/render-utils/src/DeferredLightingEffect.cpp index 5b1ad44c69..13bf947d71 100644 --- a/libraries/render-utils/src/DeferredLightingEffect.cpp +++ b/libraries/render-utils/src/DeferredLightingEffect.cpp @@ -496,10 +496,11 @@ void DeferredLightingEffect::loadLightProgram(const char* fragSource, bool limit GLint loc = -1; #if (GPU_FEATURE_PROFILE == GPU_CORE) + const GLint LIGHT_GPU_SLOT = 3; loc = glGetUniformBlockIndex(program.programId(), "lightBuffer"); if (loc >= 0) { - glUniformBlockBinding(program.programId(), loc, 3); - locations.lightBufferUnit = 3; + glUniformBlockBinding(program.programId(), loc, LIGHT_GPU_SLOT); + locations.lightBufferUnit = LIGHT_GPU_SLOT; } else { locations.lightBufferUnit = -1; } @@ -513,10 +514,11 @@ void DeferredLightingEffect::loadLightProgram(const char* fragSource, bool limit #endif #if (GPU_FEATURE_PROFILE == GPU_CORE) + const GLint ATMOSPHERE_GPU_SLOT = 4; loc = glGetUniformBlockIndex(program.programId(), "atmosphereBufferUnit"); if (loc >= 0) { - glUniformBlockBinding(program.programId(), loc, 4); - locations.atmosphereBufferUnit = 4; + glUniformBlockBinding(program.programId(), loc, ATMOSPHERE_GPU_SLOT); + locations.atmosphereBufferUnit = ATMOSPHERE_GPU_SLOT; } else { locations.atmosphereBufferUnit = -1; }