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); */