diff --git a/libraries/entities-renderer/src/RenderableWebEntityItem.cpp b/libraries/entities-renderer/src/RenderableWebEntityItem.cpp index d9b9811015..4ca39a85b0 100644 --- a/libraries/entities-renderer/src/RenderableWebEntityItem.cpp +++ b/libraries/entities-renderer/src/RenderableWebEntityItem.cpp @@ -148,36 +148,23 @@ void RenderableWebEntityItem::render(RenderArgs* args) { currentContext->makeCurrent(currentSurface); PerformanceTimer perfTimer("RenderableWebEntityItem::render"); - assert(getType() == EntityTypes::Web); - glm::vec3 position = getPosition(); - glm::vec3 dimensions = getDimensions(); - glm::vec3 halfDimensions = dimensions / 2.0f; - glm::quat rotation = getRotation(); + Q_ASSERT(getType() == EntityTypes::Web); + static const glm::vec2 texMin(0.0f); + static const glm::vec2 texMax(1.0f); + glm::vec2 topLeft(-0.5f -0.5f); + glm::vec2 bottomRight(0.5f, 0.5f); - glPushMatrix(); - { - glTranslatef(position.x, position.y, position.z); - glm::vec3 axis = glm::axis(rotation); - glRotatef(glm::degrees(glm::angle(rotation)), axis.x, axis.y, axis.z); - - static const glm::vec2 texMin(0); - static const glm::vec2 texMax(1); - glm::vec2 topLeft(-halfDimensions.x, -halfDimensions.y); - glm::vec2 bottomRight(halfDimensions.x, halfDimensions.y); - if (_texture) { - glEnable(GL_TEXTURE_2D); - glBindTexture(GL_TEXTURE_2D, _texture); - glTexParameteri(GL_TEXTURE_2D, GL_TEXTURE_MAG_FILTER, GL_LINEAR); - glTexParameteri(GL_TEXTURE_2D, GL_TEXTURE_MIN_FILTER, GL_LINEAR); - } - DependencyManager::get()->renderQuad( - topLeft, bottomRight, texMin, texMax, glm::vec4(1)); - if (_texture) { - glBindTexture(GL_TEXTURE_2D, 0); - glEnable(GL_TEXTURE_2D); - } + Q_ASSERT(args->_batch); + gpu::Batch& batch = *args->_batch; + batch.setModelTransform(getTransformToCenter()); + if (_texture) { + batch._glBindTexture(GL_TEXTURE_2D, _texture); + batch._glTexParameteri(GL_TEXTURE_2D, GL_TEXTURE_MAG_FILTER, GL_LINEAR); + batch._glTexParameteri(GL_TEXTURE_2D, GL_TEXTURE_MIN_FILTER, GL_LINEAR); } - glPopMatrix(); + DependencyManager::get()->bindSimpleProgram(batch, true); + DependencyManager::get()->renderQuad(batch, topLeft, bottomRight, texMin, texMax, glm::vec4(1.0f)); + DependencyManager::get()->releaseSimpleProgram(batch); } void RenderableWebEntityItem::setSourceUrl(const QString& value) { diff --git a/libraries/entities/src/EntityItem.cpp b/libraries/entities/src/EntityItem.cpp index 4e13e1203e..5cdd77c702 100644 --- a/libraries/entities/src/EntityItem.cpp +++ b/libraries/entities/src/EntityItem.cpp @@ -1014,7 +1014,7 @@ void EntityItem::setTranformToCenter(const Transform& transform) { } void EntityItem::setDimensions(const glm::vec3& value) { - if (value.x == 0.0f || value.y == 0.0f || value.z == 0.0f) { + if (value.x <= 0.0f || value.y <= 0.0f || value.z <= 0.0f) { return; } _transform.setScale(value); diff --git a/libraries/gpu/src/gpu/Batch.h b/libraries/gpu/src/gpu/Batch.h index b369c05646..b91dea6b05 100644 --- a/libraries/gpu/src/gpu/Batch.h +++ b/libraries/gpu/src/gpu/Batch.h @@ -143,7 +143,8 @@ public: void _glBindTexture(GLenum target, GLuint texture); void _glActiveTexture(GLenum texture); - + void _glTexParameteri(GLenum target, GLenum pname, GLint param); + void _glDrawBuffers(GLsizei n, const GLenum* bufs); void _glUseProgram(GLuint program); @@ -201,6 +202,7 @@ public: COMMAND_glBindTexture, COMMAND_glActiveTexture, + COMMAND_glTexParameteri, COMMAND_glDrawBuffers, diff --git a/libraries/gpu/src/gpu/GLBackend.cpp b/libraries/gpu/src/gpu/GLBackend.cpp index a84af10a82..0dde9699f2 100644 --- a/libraries/gpu/src/gpu/GLBackend.cpp +++ b/libraries/gpu/src/gpu/GLBackend.cpp @@ -54,6 +54,7 @@ GLBackend::CommandCall GLBackend::_commandCalls[Batch::NUM_COMMANDS] = (&::gpu::GLBackend::do_glBindTexture), (&::gpu::GLBackend::do_glActiveTexture), + (&::gpu::GLBackend::do_glTexParameteri), (&::gpu::GLBackend::do_glDrawBuffers), @@ -381,6 +382,22 @@ void GLBackend::do_glActiveTexture(Batch& batch, uint32 paramOffset) { (void) CHECK_GL_ERROR(); } +void Batch::_glTexParameteri(GLenum target, GLenum pname, GLint param) { + ADD_COMMAND_GL(glTexParameteri); + + _params.push_back(param); + _params.push_back(pname); + _params.push_back(target); + + DO_IT_NOW(glTexParameteri, 3); +} +void GLBackend::do_glTexParameteri(Batch& batch, uint32 paramOffset) { + glTexParameteri(batch._params[paramOffset + 2]._uint, + batch._params[paramOffset + 1]._uint, + batch._params[paramOffset + 0]._int); + (void) CHECK_GL_ERROR(); +} + void Batch::_glDrawBuffers(GLsizei n, const GLenum* bufs) { ADD_COMMAND_GL(glDrawBuffers); diff --git a/libraries/gpu/src/gpu/GLBackend.h b/libraries/gpu/src/gpu/GLBackend.h index 22266079bc..6c70502458 100644 --- a/libraries/gpu/src/gpu/GLBackend.h +++ b/libraries/gpu/src/gpu/GLBackend.h @@ -358,6 +358,7 @@ protected: void do_glBindTexture(Batch& batch, uint32 paramOffset); void do_glActiveTexture(Batch& batch, uint32 paramOffset); + void do_glTexParameteri(Batch& batch, uint32 paramOffset); void do_glDrawBuffers(Batch& batch, uint32 paramOffset); diff --git a/libraries/render-utils/src/DeferredLightingEffect.cpp b/libraries/render-utils/src/DeferredLightingEffect.cpp index 00c9a13387..202c6c6a02 100644 --- a/libraries/render-utils/src/DeferredLightingEffect.cpp +++ b/libraries/render-utils/src/DeferredLightingEffect.cpp @@ -28,6 +28,7 @@ #include "simple_vert.h" #include "simple_frag.h" +#include "simple_textured_frag.h" #include "deferred_light_vert.h" #include "deferred_light_limited_vert.h" @@ -50,13 +51,16 @@ static const std::string glowIntensityShaderHandle = "glowIntensity"; void DeferredLightingEffect::init(AbstractViewStateInterface* viewState) { - auto vertexShader = gpu::ShaderPointer(gpu::Shader::createVertex(std::string(simple_vert))); - auto pixelShader = gpu::ShaderPointer(gpu::Shader::createPixel(std::string(simple_frag))); + auto VS = gpu::ShaderPointer(gpu::Shader::createVertex(std::string(simple_vert))); + auto PS = gpu::ShaderPointer(gpu::Shader::createPixel(std::string(simple_frag))); + auto PSTextured = gpu::ShaderPointer(gpu::Shader::createPixel(std::string(simple_textured_frag))); + + gpu::ShaderPointer program = gpu::ShaderPointer(gpu::Shader::createProgram(VS, PS)); + gpu::ShaderPointer programTextured = gpu::ShaderPointer(gpu::Shader::createProgram(VS, PSTextured)); + gpu::Shader::BindingSet slotBindings; - slotBindings.insert(gpu::Shader::Binding(glowIntensityShaderHandle, 0)); - - gpu::ShaderPointer program = gpu::ShaderPointer(gpu::Shader::createProgram(vertexShader, pixelShader)); gpu::Shader::makeProgram(*program, slotBindings); + gpu::Shader::makeProgram(*programTextured, slotBindings); gpu::StatePointer state = gpu::StatePointer(new gpu::State()); state->setCullMode(gpu::State::CULL_BACK); @@ -65,6 +69,7 @@ void DeferredLightingEffect::init(AbstractViewStateInterface* viewState) { gpu::State::SRC_ALPHA, gpu::State::BLEND_OP_ADD, gpu::State::INV_SRC_ALPHA, gpu::State::FACTOR_ALPHA, gpu::State::BLEND_OP_ADD, gpu::State::ONE); _simpleProgram = gpu::PipelinePointer(gpu::Pipeline::create(program, state)); + _simpleProgramTextured = gpu::PipelinePointer(gpu::Pipeline::create(programTextured, state)); _viewState = viewState; loadLightProgram(directional_light_frag, false, _directionalLight, _directionalLightLocations); @@ -101,9 +106,14 @@ void DeferredLightingEffect::init(AbstractViewStateInterface* viewState) { lp->setAmbientSpherePreset(gpu::SphericalHarmonics::Preset(_ambientLightMode % gpu::SphericalHarmonics::NUM_PRESET)); } -void DeferredLightingEffect::bindSimpleProgram(gpu::Batch& batch) { +void DeferredLightingEffect::bindSimpleProgram(gpu::Batch& batch, bool textured) { DependencyManager::get()->setPrimaryDrawBuffers(batch, true, true, true); - batch.setPipeline(_simpleProgram); + + if (textured) { + batch.setPipeline(_simpleProgramTextured); + } else { + batch.setPipeline(_simpleProgram); + } } void DeferredLightingEffect::releaseSimpleProgram(gpu::Batch& batch) { diff --git a/libraries/render-utils/src/DeferredLightingEffect.h b/libraries/render-utils/src/DeferredLightingEffect.h index 33728ab15a..58e5e35829 100644 --- a/libraries/render-utils/src/DeferredLightingEffect.h +++ b/libraries/render-utils/src/DeferredLightingEffect.h @@ -34,7 +34,7 @@ public: void init(AbstractViewStateInterface* viewState); /// Sets up the state necessary to render static untextured geometry with the simple program. - void bindSimpleProgram(gpu::Batch& batch); + void bindSimpleProgram(gpu::Batch& batch, bool textured = false); /// Tears down the state necessary to render static untextured geometry with the simple program. void releaseSimpleProgram(gpu::Batch& batch); @@ -100,6 +100,7 @@ private: static void loadLightProgram(const char* fragSource, bool limited, ProgramObject& program, LightLocations& locations); gpu::PipelinePointer _simpleProgram; + gpu::PipelinePointer _simpleProgramTextured; ProgramObject _directionalSkyboxLight; LightLocations _directionalSkyboxLightLocations; diff --git a/libraries/render-utils/src/simple.slf b/libraries/render-utils/src/simple.slf index 4e1a09fb92..bbbb44cc51 100644 --- a/libraries/render-utils/src/simple.slf +++ b/libraries/render-utils/src/simple.slf @@ -17,16 +17,7 @@ // the interpolated normal varying vec4 interpolatedNormal; -// the glow intensity -//uniform float glowIntensity; - void main(void) { - /* // set the diffuse, normal, specular data - gl_FragData[0] = vec4(gl_Color.rgb, glowIntensity); - gl_FragData[1] = normalize(normal) * 0.5 + vec4(0.5, 0.5, 0.5, 1.0); - gl_FragData[2] = vec4(gl_FrontMaterial.specular.rgb, gl_FrontMaterial.shininess / 128.0); - */ - packDeferredFragment( normalize(interpolatedNormal.xyz), glowIntensity, diff --git a/libraries/render-utils/src/simple.slv b/libraries/render-utils/src/simple.slv index 1460058892..380734e70c 100644 --- a/libraries/render-utils/src/simple.slv +++ b/libraries/render-utils/src/simple.slv @@ -20,6 +20,8 @@ varying vec4 interpolatedNormal; void main(void) { + gl_TexCoord[0] = gl_MultiTexCoord0; + // pass along the diffuse color gl_FrontColor = gl_Color; diff --git a/libraries/render-utils/src/simple_textured.slf b/libraries/render-utils/src/simple_textured.slf new file mode 100644 index 0000000000..7444d512e4 --- /dev/null +++ b/libraries/render-utils/src/simple_textured.slf @@ -0,0 +1,32 @@ +<@include gpu/Config.slh@> +<$VERSION_HEADER$> +// Generated on <$_SCRIBE_DATE$> +// +// simple.frag +// fragment shader +// +// Created by Clément Brisset on 5/29/15. +// Copyright 2014 High Fidelity, Inc. +// +// Distributed under the Apache License, Version 2.0. +// See the accompanying file LICENSE or http://www.apache.org/licenses/LICENSE-2.0.html +// + +<@include DeferredBufferWrite.slh@> + +// the diffuse texture +uniform sampler2D originalTexture; + +// the interpolated normal +varying vec4 interpolatedNormal; + +void main(void) { + vec4 texel = texture2D(originalTexture, gl_TexCoord[0].st); + + packDeferredFragment( + normalize(interpolatedNormal.xyz), + glowIntensity * texel.a, + gl_Color.rgb * texel.rgb, + gl_FrontMaterial.specular.rgb, + gl_FrontMaterial.shininess); +} \ No newline at end of file diff --git a/libraries/shared/src/Transform.h b/libraries/shared/src/Transform.h index 5defb6f0f6..f3b5b14385 100644 --- a/libraries/shared/src/Transform.h +++ b/libraries/shared/src/Transform.h @@ -24,13 +24,13 @@ inline bool isValidScale(glm::vec3 scale) { bool result = scale.x != 0.0f && scale.y != 0.0f && scale.z != 0.0f; - // assert(result); + assert(result); return result; } inline bool isValidScale(float scale) { bool result = scale != 0.0f; - // assert(result); + assert(result); return result; }