diff --git a/libraries/gpu/src/gpu/GLBackend.h b/libraries/gpu/src/gpu/GLBackend.h index bbb2b5a1d2..8a65263df0 100644 --- a/libraries/gpu/src/gpu/GLBackend.h +++ b/libraries/gpu/src/gpu/GLBackend.h @@ -80,7 +80,7 @@ public: class Command { public: - virtual void run() = 0; + virtual void run(GLBackend* backend) = 0; Command() {} virtual ~Command() {}; @@ -88,9 +88,9 @@ public: template class Command1 : public Command { public: - typedef void (*GLFunction)(typename T); + typedef void (GLBackend::*GLFunction)(typename T); - void run() { (_func)(_param); } + void run(GLBackend* backend) { (backend->*(_func))(_param); } Command1(GLFunction func, T param) : _func(func), _param(param) {}; @@ -101,7 +101,7 @@ public: public: typedef void (*GLFunction)(typename T, typename U); - void run() { (_func)(_param0, _param1); } + void run(GLBackend* backend) { (_func)(_param0, _param1); } Command2(GLFunction func, T param0, U param1) : _func(func), _param0(param0), _param1(param1) {}; @@ -114,7 +114,7 @@ public: public: typedef void (*GLFunction)(typename T, typename U, typename V, typename W); - void run() { (_func)(_param0, _param1, _param2, _param3); } + void run(GLBackend* backend) { (_func)(_param0, _param1, _param2, _param3); } Command4(GLFunction func, T param0, U param1, V param2, W param3) : _func(func), @@ -155,6 +155,24 @@ public: uint32 getNumInputBuffers() const { return _input._buffersState.size(); } + + + void do_setStateFillMode(int32 mode); + void do_setStateCullMode(int32 mode); + void do_setStateFrontClockwise(int32 isFrontClockwise); + void do_setStateDepthClipEnable(int32 enable); + void do_setStateScissorEnable(int32 enable); + void do_setStateMultisampleEnable(int32 enable); + void do_setStateAntialiasedLineEnable(int32 enable); + + void do_setStateDepthTest(State::DepthTest test); + + void do_setStateStencilEnable(int32 enable); + + void do_setStateAlphaToCoverageEnable(int32 enable); + + void do_setStateBlendEnable(int32 enable); + protected: // Draw Stage diff --git a/libraries/gpu/src/gpu/GLBackendPipeline.cpp b/libraries/gpu/src/gpu/GLBackendPipeline.cpp index 77ec721276..30bebb3049 100755 --- a/libraries/gpu/src/gpu/GLBackendPipeline.cpp +++ b/libraries/gpu/src/gpu/GLBackendPipeline.cpp @@ -79,6 +79,13 @@ void GLBackend::do_setPipeline(Batch& batch, uint32 paramOffset) { _pipeline._stateCommands = pipelineObject->_state->_commands; _pipeline._invalidState = true; + + // THis should be done on Pipeline::update... + if (_pipeline._invalidProgram) { + glUseProgram(_pipeline._program); + CHECK_GL_ERROR(); + _pipeline._invalidProgram = false; + } } void GLBackend::do_setUniformBuffer(Batch& batch, uint32 paramOffset) { @@ -115,6 +122,7 @@ void GLBackend::do_setUniformTexture(Batch& batch, uint32 paramOffset) { void GLBackend::updatePipeline() { if (_pipeline._invalidProgram) { + // doing it here is aproblem for calls to glUniform.... so will do it on assing... glUseProgram(_pipeline._program); CHECK_GL_ERROR(); _pipeline._invalidProgram = false; @@ -122,7 +130,7 @@ void GLBackend::updatePipeline() { if (_pipeline._invalidState) { for (auto command: _pipeline._stateCommands) { - command->run(); + command->run(this); } CHECK_GL_ERROR(); _pipeline._invalidState = false; diff --git a/libraries/gpu/src/gpu/GLBackendState.cpp b/libraries/gpu/src/gpu/GLBackendState.cpp index 6a93e2c842..9fa515b2c4 100644 --- a/libraries/gpu/src/gpu/GLBackendState.cpp +++ b/libraries/gpu/src/gpu/GLBackendState.cpp @@ -23,6 +23,8 @@ GLBackend::GLState::~GLState() { typedef GLBackend::GLState::Command Command; typedef GLBackend::GLState::CommandPointer CommandPointer; +typedef GLBackend::GLState::Command1 Command1I; +typedef GLBackend::GLState::Command1 Command1DT; typedef GLBackend::GLState::Command1 Command1E; typedef GLBackend::GLState::Command2 Command2E; typedef GLBackend::GLState::Command2 Command2F; @@ -40,27 +42,16 @@ static GLenum GL_COMPARISON_FUNCTIONS[] = { GL_GEQUAL, GL_ALWAYS }; -void glBackend_glPolygonMode(GLenum fillMode) { - glPolygonMode(GL_FRONT_AND_BACK, fillMode); -} - -void generateFillMode(GLBackend::GLState::Commands& commands, State::FillMode fillMode) { - static GLenum GL_FILL_MODES[] = { GL_POINT, GL_LINE, GL_FILL }; - commands.push_back(CommandPointer(new Command1E(glBackend_glPolygonMode, GL_FILL_MODES[fillMode]))); +void generateFillMode(GLBackend::GLState::Commands& commands, State::FillMode fillMode) { + commands.push_back(CommandPointer(new Command1I(&GLBackend::do_setStateFillMode, int32(fillMode)))); } void generateCullMode(GLBackend::GLState::Commands& commands, State::CullMode cullMode) { - static GLenum CULL_MODES[] = { GL_FRONT_AND_BACK, GL_FRONT, GL_BACK }; - if (cullMode == State::CULL_NONE) { - commands.push_back(CommandPointer(new Command1E((Command1E::GLFunction)glDisable, GLenum(GL_CULL_FACE)))); - } else { - commands.push_back(CommandPointer(new Command1E((Command1E::GLFunction)glEnable, GLenum(GL_CULL_FACE)))); - commands.push_back(CommandPointer(new Command1E((Command1E::GLFunction)glCullFace, CULL_MODES[cullMode]))); - } + commands.push_back(CommandPointer(new Command1I(&GLBackend::do_setStateCullMode, int32(cullMode)))); } void generateDepthBias(GLBackend::GLState::Commands& commands, const State& state) { - if ((state.getDepthBias() == 0) && (state.getDepthBiasSlopeScale() == 0.0f)) { + /* if ((state.getDepthBias() == 0) && (state.getDepthBiasSlopeScale() == 0.0f)) { commands.push_back(CommandPointer(new Command1E((Command1E::GLFunction)glDisable, GLenum(GL_POLYGON_OFFSET_FILL)))); commands.push_back(CommandPointer(new Command1E((Command1E::GLFunction)glDisable, GLenum(GL_POLYGON_OFFSET_LINE)))); commands.push_back(CommandPointer(new Command1E((Command1E::GLFunction)glDisable, GLenum(GL_POLYGON_OFFSET_POINT)))); @@ -71,53 +62,39 @@ void generateDepthBias(GLBackend::GLState::Commands& commands, const State& stat commands.push_back(CommandPointer(new Command2F((Command2F::GLFunction)glPolygonOffset, state.getDepthBiasSlopeScale(), state.getDepthBias()))); - } + }*/ } void generateFrontClockwise(GLBackend::GLState::Commands& commands, bool frontClockwise) { - static GLenum GL_FRONT_FACES[] = { GL_CCW, GL_CW }; - commands.push_back(CommandPointer(new Command1E((Command1E::GLFunction)glFrontFace, GL_FRONT_FACES[frontClockwise]))); + commands.push_back(CommandPointer(new Command1I(&GLBackend::do_setStateFrontClockwise, int32(frontClockwise)))); } -#define ADD_ENABLE_DISABLE_COMMAND( NAME ) if (enable) {\ - commands.push_back(CommandPointer(new Command1E((Command1E::GLFunction)glEnable, NAME)));\ - } else {\ - commands.push_back(CommandPointer(new Command1E((Command1E::GLFunction)glDisable, NAME)));\ - } - void generateDepthClipEnable(GLBackend::GLState::Commands& commands, bool enable) { - ADD_ENABLE_DISABLE_COMMAND(GL_DEPTH_CLAMP); + commands.push_back(CommandPointer(new Command1I(&GLBackend::do_setStateDepthClipEnable, int32(enable)))); } void generateScissorEnable(GLBackend::GLState::Commands& commands, bool enable) { - ADD_ENABLE_DISABLE_COMMAND(GL_SCISSOR_TEST); + commands.push_back(CommandPointer(new Command1I(&GLBackend::do_setStateScissorEnable, int32(enable)))); } void generateMultisampleEnable(GLBackend::GLState::Commands& commands, bool enable) { - ADD_ENABLE_DISABLE_COMMAND(GL_MULTISAMPLE); + commands.push_back(CommandPointer(new Command1I(&GLBackend::do_setStateMultisampleEnable, int32(enable)))); } void generateAntialiasedLineEnable(GLBackend::GLState::Commands& commands, bool enable) { - ADD_ENABLE_DISABLE_COMMAND(GL_POINT_SMOOTH); - ADD_ENABLE_DISABLE_COMMAND(GL_LINE_SMOOTH); + commands.push_back(CommandPointer(new Command1I(&GLBackend::do_setStateAntialiasedLineEnable, int32(enable)))); } void generateDepthTest(GLBackend::GLState::Commands& commands, State::DepthTest& test) { - if (!test._enabled) { - commands.push_back(CommandPointer(new Command1E((Command1E::GLFunction)glDisable, GLenum(GL_DEPTH_TEST)))); - } else { - commands.push_back(CommandPointer(new Command1E((Command1E::GLFunction)glEnable, GLenum(GL_DEPTH_TEST)))); - commands.push_back(CommandPointer(new Command1E((Command1E::GLFunction)glDepthMask, test._writeMask))); - commands.push_back(CommandPointer(new Command1E((Command1E::GLFunction)glDepthFunc, GL_COMPARISON_FUNCTIONS[test._function]))); - } + commands.push_back(CommandPointer(new Command1DT(&GLBackend::do_setStateDepthTest, int32(test.getRaw())))); } void generateStencilEnable(GLBackend::GLState::Commands& commands, bool enable) { - ADD_ENABLE_DISABLE_COMMAND(GL_STENCIL_TEST); + commands.push_back(CommandPointer(new Command1I(&GLBackend::do_setStateStencilEnable, int32(enable)))); } void generateStencilWriteMask(GLBackend::GLState::Commands& commands, uint32 mask) { - commands.push_back(CommandPointer(new Command1E((Command1E::GLFunction)glStencilMask, mask))); +// commands.push_back(CommandPointer(new Command1E((Command1E::GLFunction)glStencilMask, mask))); } void generateStencilState(GLBackend::GLState::Commands& commands, const State& state) { @@ -146,11 +123,11 @@ void generateStencilState(GLBackend::GLState::Commands& commands, const State& s } void generateAlphaToCoverageEnable(GLBackend::GLState::Commands& commands, bool enable) { - ADD_ENABLE_DISABLE_COMMAND(GL_SAMPLE_ALPHA_TO_COVERAGE); + commands.push_back(CommandPointer(new Command1I(&GLBackend::do_setStateAlphaToCoverageEnable, int32(enable)))); } void generateBlendEnable(GLBackend::GLState::Commands& commands, bool enable) { - ADD_ENABLE_DISABLE_COMMAND(GL_BLEND); + commands.push_back(CommandPointer(new Command1I(&GLBackend::do_setStateBlendEnable, int32(enable)))); } void generateBlendFunction(GLBackend::GLState::Commands& commands, const State& state) { @@ -209,9 +186,7 @@ GLBackend::GLState* GLBackend::syncGPUObject(const State& state) { // If GPU object already created then good if (object) { - if (object->_stamp == state.getStamp()) { - return object; - } + return object; } // Else allocate and create the GLState @@ -269,7 +244,6 @@ GLBackend::GLState* GLBackend::syncGPUObject(const State& state) { generateAntialiasedLineEnable(object->_commands, bool(field.second._integer)); break; } - case State::DEPTH_TEST: { generateDepthTest(object->_commands, State::DepthTest(field.second._integer)); break; @@ -337,5 +311,105 @@ GLBackend::GLState* GLBackend::syncGPUObject(const State& state) { generateBlendFactor(object->_commands, state.getBlendFactor()); } - return nullptr; + return object; +} + + +void GLBackend::do_setStateFillMode(int32 mode) { + static GLenum GL_FILL_MODES[] = { GL_POINT, GL_LINE, GL_FILL }; + glPolygonMode(GL_FRONT_AND_BACK, GL_FILL_MODES[mode]); + CHECK_GL_ERROR(); +} + +void GLBackend::do_setStateCullMode(int32 mode) { + static GLenum GL_CULL_MODES[] = { GL_FRONT_AND_BACK, GL_FRONT, GL_BACK }; + if (mode == State::CULL_NONE) { + glDisable(GL_CULL_FACE); + glCullFace(GL_FRONT_AND_BACK); + } else { + glEnable(GL_CULL_FACE); + glCullFace(GL_CULL_MODES[mode]); + } +} + +void GLBackend::do_setStateFrontClockwise(int32 isFrontClockwise) { + static GLenum GL_FRONT_FACES[] = { GL_CCW, GL_CW }; + glFrontFace(GL_FRONT_FACES[isFrontClockwise]); +} + +void GLBackend::do_setStateDepthClipEnable(int32 enable) { + if (enable) { + glEnable(GL_DEPTH_CLAMP); + } else { + glDisable(GL_DEPTH_CLAMP); + } + CHECK_GL_ERROR(); +} + +void GLBackend::do_setStateScissorEnable(int32 enable) { + if (enable) { + glEnable(GL_SCISSOR_TEST); + } else { + glDisable(GL_SCISSOR_TEST); + } + CHECK_GL_ERROR(); +} + +void GLBackend::do_setStateMultisampleEnable(int32 enable) { + if (enable) { + glEnable(GL_MULTISAMPLE); + } else { + glDisable(GL_MULTISAMPLE); + } + CHECK_GL_ERROR(); +} + +void GLBackend::do_setStateAntialiasedLineEnable(int32 enable) { + if (enable) { + glEnable(GL_POINT_SMOOTH); + glEnable(GL_LINE_SMOOTH); + } else { + glDisable(GL_POINT_SMOOTH); + glDisable(GL_LINE_SMOOTH); + } + CHECK_GL_ERROR(); +} + +void GLBackend::do_setStateDepthTest(State::DepthTest test) { + if (test._enabled) { + glEnable(GL_DEPTH_TEST); + glDepthMask(test._writeMask); + glDepthFunc(GL_COMPARISON_FUNCTIONS[test._function]); + } else { + glDisable(GL_DEPTH_TEST); + } + CHECK_GL_ERROR(); +} + +void GLBackend::do_setStateStencilEnable(int32 enable) { + if (enable) { + glEnable(GL_STENCIL_TEST); + } else { + glDisable(GL_STENCIL_TEST); + } + CHECK_GL_ERROR(); +} + +void GLBackend::do_setStateAlphaToCoverageEnable(int32 enable) { + if (enable) { + glEnable(GL_SAMPLE_ALPHA_TO_COVERAGE); + } else { + glDisable(GL_SAMPLE_ALPHA_TO_COVERAGE); + } + CHECK_GL_ERROR(); +} + + +void GLBackend::do_setStateBlendEnable(int32 enable) { + if (enable) { + glEnable(GL_BLEND); + } else { + glDisable(GL_BLEND); + } + CHECK_GL_ERROR(); } diff --git a/libraries/gpu/src/gpu/Pipeline.h b/libraries/gpu/src/gpu/Pipeline.h index 189bdc4f00..73e9a29913 100755 --- a/libraries/gpu/src/gpu/Pipeline.h +++ b/libraries/gpu/src/gpu/Pipeline.h @@ -38,7 +38,7 @@ protected: Pipeline& operator=(const Pipeline& pipeline); // deep copy of the sysmem texture // This shouldn't be used by anything else than the Backend class with the proper casting. - mutable GPUObject* _gpuObject = NULL; + mutable GPUObject* _gpuObject = nullptr; void setGPUObject(GPUObject* gpuObject) const { _gpuObject = gpuObject; } GPUObject* getGPUObject() const { return _gpuObject; } friend class Backend; diff --git a/libraries/gpu/src/gpu/State.cpp b/libraries/gpu/src/gpu/State.cpp index 13dd24fbcc..1a0dad3a8c 100755 --- a/libraries/gpu/src/gpu/State.cpp +++ b/libraries/gpu/src/gpu/State.cpp @@ -20,26 +20,22 @@ State::~State() } void State::set(Field field, bool value) { - auto found = _fields[field]; - found._integer = value; + _fields[field]._integer = value; _stamp++; } void State::set(Field field, uint32 value) { - auto found = _fields[field]; - found._unsigned_integer = value; + _fields[field]._unsigned_integer = value; _stamp++; } void State::set(Field field, int32 value) { - auto found = _fields[field]; - found._integer = value; + _fields[field]._integer = value; _stamp++; } void State::set(Field field, float value) { - auto found = _fields[field]; - found._float = value; + _fields[field]._float = value; _stamp++; } @@ -49,4 +45,4 @@ State::Value State::get(Field field) const { return (*found).second; } return Value(); -} \ No newline at end of file +} diff --git a/libraries/gpu/src/gpu/State.h b/libraries/gpu/src/gpu/State.h index c3c73cefa4..deaf8c8271 100755 --- a/libraries/gpu/src/gpu/State.h +++ b/libraries/gpu/src/gpu/State.h @@ -149,11 +149,13 @@ public: class DepthTest { public: + uint8 _function = LESS; + bool _writeMask = true; + bool _enabled = false; + DepthTest(bool enable, bool writeMask, ComparisonFunction func) : _function(func), _writeMask(writeMask), _enabled(enable) {} - uint8 _function = ALWAYS; - bool _writeMask = false; - bool _enabled = false; + int32 getRaw() const { return *(reinterpret_cast(this)); } DepthTest(int32 raw) { *(reinterpret_cast(this)) = raw; } @@ -190,7 +192,7 @@ public: class Value { public: union { - uint32 _unsigned_integer; + uint32 _unsigned_integer = 0; int32 _integer; float _float; }; @@ -207,17 +209,20 @@ public: Value get(Field field) const; void setFillMode(FillMode fill) { set(FILL_MODE, uint32(fill)); } - void setCullMode(CullMode cull) { set(FILL_MODE, uint32(cull)); } FillMode getFillMode() const { return FillMode(get(FILL_MODE)._integer); } + + void setCullMode(CullMode cull) { set(CULL_MODE, uint32(cull)); } CullMode getCullMode() const { return CullMode(get(CULL_MODE)._integer); } + void setFrontClockwise(bool enable) { set(FRONT_CLOCKWISE, enable); } + void setDepthClipEnable(bool enable) { set(DEPTH_CLIP_ENABLE, enable); } + void setDepthBias(float bias) { set(DEPTH_BIAS, bias); } void setDepthBiasSlopeScale(float scale) { set(DEPTH_BIAS_SLOPE_SCALE, scale); } float getDepthBias() const { return get(DEPTH_BIAS)._integer; } float getDepthBiasSlopeScale() const { return get(DEPTH_BIAS_SLOPE_SCALE)._float; } - void setFrontClockwise(bool enable) { set(FRONT_CLOCKWISE, enable); } - void setDepthClipEnable(bool enable) { set(DEPTH_CLIP_ENABLE, enable); } + void setScissorEnable(bool enable) { set(SCISSOR_ENABLE, enable); } void setMultisampleEnable(bool enable) { set(MULTISAMPLE_ENABLE, enable); } void setAntialiasedLineEnable(bool enable) { set(ANTIALISED_LINE_ENABLE, enable); } @@ -278,7 +283,7 @@ protected: Stamp _stamp; // This shouldn't be used by anything else than the Backend class with the proper casting. - mutable GPUObject* _gpuObject = NULL; + mutable GPUObject* _gpuObject = nullptr; void setGPUObject(GPUObject* gpuObject) const { _gpuObject = gpuObject; } GPUObject* getGPUObject() const { return _gpuObject; } friend class Backend; diff --git a/libraries/render-utils/src/Model.cpp b/libraries/render-utils/src/Model.cpp index 7a40b2feed..8bd48c16f8 100644 --- a/libraries/render-utils/src/Model.cpp +++ b/libraries/render-utils/src/Model.cpp @@ -116,26 +116,19 @@ void Model::RenderPipelineLib::addRenderPipeline(Model::RenderKey& key, initLocations(program, *locations); gpu::StatePointer state = gpu::StatePointer(new gpu::State()); + + // Backface on shadow if (key.isShadow()) { state->setCullMode(gpu::State::CULL_FRONT); } else { state->setCullMode(gpu::State::CULL_BACK); } - if (key.isTranslucent()) { - } else { - state->setBlendEnable(false); - } - - /* - GLBATCH(glDisable)(GL_BLEND); - GLBATCH(glEnable)(GL_ALPHA_TEST); - - if (mode == SHADOW_RENDER_MODE) { - GLBATCH(glAlphaFunc)(GL_EQUAL, 0.0f); - } - */ + // Z test depends if transparent or not + state->setDepthTest(true, !key.isTranslucent(), gpu::State::LESS_EQUAL); + // Blend on transparent + state->setBlendEnable(key.isTranslucent()); auto it = insert(value_type(key.getRaw(), RenderPipeline( @@ -285,7 +278,7 @@ void Model::init() { modelVertex, modelTranslucentPixel); _renderPipelineLib.addRenderPipeline( - RenderKey(RenderKey::IS_DEPTH_ONLY), + RenderKey(RenderKey::IS_DEPTH_ONLY | RenderKey::IS_SHADOW), modelShadowVertex, modelShadowPixel); _renderPipelineLib.addRenderPipeline( @@ -320,7 +313,7 @@ void Model::init() { skinModelNormalMapVertex, modelNormalSpecularMapPixel); _renderPipelineLib.addRenderPipeline( - RenderKey(RenderKey::IS_SKINNED | RenderKey::IS_DEPTH_ONLY), + RenderKey(RenderKey::IS_SKINNED | RenderKey::IS_DEPTH_ONLY | RenderKey::IS_SHADOW), skinModelShadowVertex, modelShadowPixel); _renderPipelineLib.addRenderPipeline( @@ -684,7 +677,8 @@ bool Model::renderCore(float alpha, RenderMode mode, RenderArgs* args) { GLBATCH(glDisable)(GL_COLOR_MATERIAL); - if (mode == DIFFUSE_RENDER_MODE || mode == NORMAL_RENDER_MODE) { + // taking care of by the state? + /* if (mode == DIFFUSE_RENDER_MODE || mode == NORMAL_RENDER_MODE) { GLBATCH(glDisable)(GL_CULL_FACE); } else { GLBATCH(glEnable)(GL_CULL_FACE); @@ -692,10 +686,11 @@ bool Model::renderCore(float alpha, RenderMode mode, RenderArgs* args) { GLBATCH(glCullFace)(GL_FRONT); } } - + */ + // render opaque meshes with alpha testing - GLBATCH(glDisable)(GL_BLEND); +// GLBATCH(glDisable)(GL_BLEND); GLBATCH(glEnable)(GL_ALPHA_TEST); if (mode == SHADOW_RENDER_MODE) { @@ -764,10 +759,10 @@ bool Model::renderCore(float alpha, RenderMode mode, RenderArgs* args) { translucentMeshPartsRendered += renderMeshes(batch, mode, true, MOSTLY_OPAQUE_THRESHOLD, false, true, true, true, args); GLBATCH(glDisable)(GL_ALPHA_TEST); - GLBATCH(glEnable)(GL_BLEND); + /* GLBATCH(glEnable)(GL_BLEND); GLBATCH(glDepthMask)(false); GLBATCH(glDepthFunc)(GL_LEQUAL); - + */ //DependencyManager::get()->setPrimaryDrawBuffers(true); { GLenum buffers[1]; @@ -1740,18 +1735,18 @@ void Model::endScene(RenderMode mode, RenderArgs* args) { GLBATCH(glDisable)(GL_COLOR_MATERIAL); - if (mode == DIFFUSE_RENDER_MODE || mode == NORMAL_RENDER_MODE) { + /* if (mode == DIFFUSE_RENDER_MODE || mode == NORMAL_RENDER_MODE) { GLBATCH(glDisable)(GL_CULL_FACE); } else { GLBATCH(glEnable)(GL_CULL_FACE); if (mode == SHADOW_RENDER_MODE) { GLBATCH(glCullFace)(GL_FRONT); } - } + }*/ // render opaque meshes with alpha testing - GLBATCH(glDisable)(GL_BLEND); + // GLBATCH(glDisable)(GL_BLEND); GLBATCH(glEnable)(GL_ALPHA_TEST); if (mode == SHADOW_RENDER_MODE) { @@ -1820,10 +1815,10 @@ void Model::endScene(RenderMode mode, RenderArgs* args) { translucentParts += renderMeshesForModelsInScene(batch, mode, true, MOSTLY_OPAQUE_THRESHOLD, false, true, true, true, args); GLBATCH(glDisable)(GL_ALPHA_TEST); - GLBATCH(glEnable)(GL_BLEND); + /* GLBATCH(glEnable)(GL_BLEND); GLBATCH(glDepthMask)(false); GLBATCH(glDepthFunc)(GL_LEQUAL); - + */ //DependencyManager::get()->setPrimaryDrawBuffers(true); { GLenum buffers[1]; @@ -2262,9 +2257,11 @@ void Model::pickPrograms(gpu::Batch& batch, RenderMode mode, bool translucent, f gpu::ShaderPointer program = (*pipeline).second._pipeline->getProgram(); locations = (*pipeline).second._locations.get(); - GLuint glprogram = gpu::GLBackend::getShaderID(program); - GLBATCH(glUseProgram)(glprogram); + //GLuint glprogram = gpu::GLBackend::getShaderID(program); + //GLBATCH(glUseProgram)(glprogram); + // dare! + batch.setPipeline((*pipeline).second._pipeline); if ((locations->alphaThreshold > -1) && (mode != SHADOW_RENDER_MODE)) { GLBATCH(glUniform1f)(locations->alphaThreshold, alphaThreshold); diff --git a/libraries/render-utils/src/Model.h b/libraries/render-utils/src/Model.h index bce534416c..f771bffbd8 100644 --- a/libraries/render-utils/src/Model.h +++ b/libraries/render-utils/src/Model.h @@ -373,6 +373,9 @@ private: QMap _unsortedMeshesOpaqueLightmapTangents; QMap _unsortedMeshesOpaqueLightmapTangentsSpecular; QMap _unsortedMeshesOpaqueLightmapSpecular; + + typedef std::unordered_map> MeshListMap; + MeshListMap _sortedMeshes; QVector _meshesTranslucent; QVector _meshesTranslucentTangents; @@ -486,7 +489,7 @@ private: RenderKey(RenderMode mode, bool translucent, float alphaThreshold, bool hasLightmap, bool hasTangents, bool hasSpecular, bool isSkinned) : - RenderKey( ((translucent && (alphaThreshold == 0.0f)) ? IS_TRANSLUCENT : 0) + RenderKey( ((translucent && (alphaThreshold == 0.0f) && (mode != SHADOW_RENDER_MODE)) ? IS_TRANSLUCENT : 0) | (hasLightmap && (mode != SHADOW_RENDER_MODE) ? HAS_LIGHTMAP : 0) // Lightmap, tangents and specular don't matter for depthOnly | (hasTangents && (mode != SHADOW_RENDER_MODE) ? HAS_TANGENTS : 0) | (hasSpecular && (mode != SHADOW_RENDER_MODE) ? HAS_SPECULAR : 0)