diff options
-rw-r--r-- | graphics/defines.cpp | 3 | ||||
-rw-r--r-- | graphics/defines.hpp | 3 | ||||
-rw-r--r-- | graphics/display_list.cpp | 5 | ||||
-rw-r--r-- | graphics/display_list.hpp | 4 | ||||
-rw-r--r-- | graphics/display_list_renderer.cpp | 13 | ||||
-rw-r--r-- | graphics/display_list_renderer.hpp | 4 | ||||
-rw-r--r-- | graphics/geometry_batcher.cpp | 5 | ||||
-rw-r--r-- | graphics/geometry_batcher.hpp | 2 | ||||
-rw-r--r-- | graphics/graphics.pro | 6 | ||||
-rw-r--r-- | graphics/opengl/geometry_renderer.cpp | 28 | ||||
-rw-r--r-- | graphics/opengl/geometry_renderer.hpp | 17 | ||||
-rw-r--r-- | graphics/opengl/program.cpp | 5 | ||||
-rw-r--r-- | graphics/opengl/program.hpp | 2 | ||||
-rw-r--r-- | graphics/opengl/program_manager.cpp | 15 | ||||
-rw-r--r-- | graphics/opengl/program_manager.hpp | 3 | ||||
-rw-r--r-- | graphics/packets_queue.cpp | 5 | ||||
-rw-r--r-- | graphics/packets_queue.hpp | 6 | ||||
-rw-r--r-- | graphics/uniforms_holder.cpp | 21 | ||||
-rw-r--r-- | graphics/uniforms_holder.hpp | 20 |
19 files changed, 153 insertions, 14 deletions
diff --git a/graphics/defines.cpp b/graphics/defines.cpp index ee79844a1d..5da772e65f 100644 --- a/graphics/defines.cpp +++ b/graphics/defines.cpp @@ -90,7 +90,8 @@ namespace graphics {ESemTexCoord0, "TexCoord0"}, {ESemSampler0, "Sampler0"}, {ESemModelView, "ModelView"}, - {ESemProjection, "Projection"} + {ESemProjection, "Projection"}, + {ETransparency, "Transparency"} }; void convert(char const * name, ESemantic & sem) diff --git a/graphics/defines.hpp b/graphics/defines.hpp index b3654399bd..9ec798e7ef 100644 --- a/graphics/defines.hpp +++ b/graphics/defines.hpp @@ -69,7 +69,8 @@ namespace graphics ESemTexCoord0, ESemSampler0, ESemModelView, - ESemProjection + ESemProjection, + ETransparency }; void convert(char const * name, ESemantic & sem); diff --git a/graphics/display_list.cpp b/graphics/display_list.cpp index 96d43d1b74..c813fbe775 100644 --- a/graphics/display_list.cpp +++ b/graphics/display_list.cpp @@ -93,7 +93,8 @@ namespace graphics } void DisplayList::draw(DisplayListRenderer * r, - math::Matrix<double, 3, 3> const & m) + math::Matrix<double, 3, 3> const & m, + UniformsHolder * holder) { math::Matrix<float, 4, 4> mv; @@ -116,6 +117,8 @@ namespace graphics ++it) { (*it)->setRenderContext(r->renderContext()); + if (holder != NULL && (*it)->isNeedAdditionalUniforms()) + (*it)->setAdditionalUniforms(*holder); (*it)->perform(); } diff --git a/graphics/display_list.hpp b/graphics/display_list.hpp index d87fd4a15a..7b9e80a10b 100644 --- a/graphics/display_list.hpp +++ b/graphics/display_list.hpp @@ -1,5 +1,6 @@ #pragma once +#include "uniforms_holder.hpp" #include "defines.hpp" #include "display_list_renderer.hpp" #include "opengl/base_texture.hpp" @@ -54,6 +55,7 @@ namespace graphics void addCheckPoint(); void draw(DisplayListRenderer * r, - math::Matrix<double, 3, 3> const & m); + math::Matrix<double, 3, 3> const & m, + UniformsHolder * holder = NULL); }; } diff --git a/graphics/display_list_renderer.cpp b/graphics/display_list_renderer.cpp index 0f5f3b1bfb..73943b4467 100644 --- a/graphics/display_list_renderer.cpp +++ b/graphics/display_list_renderer.cpp @@ -79,9 +79,10 @@ namespace graphics } void DisplayListRenderer::drawDisplayList(DisplayList * dl, - math::Matrix<double, 3, 3> const & m) + math::Matrix<double, 3, 3> const & m, + UniformsHolder * holder) { - dl->draw(this, m); + dl->draw(this, m, holder); } void DisplayListRenderer::drawGeometry(shared_ptr<gl::BaseTexture> const & texture, @@ -211,6 +212,14 @@ namespace graphics base_t::applyStates(); } + void DisplayListRenderer::applyVarAlfaStates() + { + if (m_displayList) + m_displayList->applyStates(make_shared_ptr(new ApplyStates(ApplyStates::AlfaVaringProgram))); + else + base_t::applyVarAlfaStates(); + } + void DisplayListRenderer::applySharpStates() { if (m_displayList) diff --git a/graphics/display_list_renderer.hpp b/graphics/display_list_renderer.hpp index db32af2c5a..65216453ef 100644 --- a/graphics/display_list_renderer.hpp +++ b/graphics/display_list_renderer.hpp @@ -51,7 +51,8 @@ namespace graphics /// get current display list DisplayList * displayList() const; /// draw display list - void drawDisplayList(DisplayList * dl, math::Matrix<double, 3, 3> const & m); + void drawDisplayList(DisplayList * dl, math::Matrix<double, 3, 3> const & m, + UniformsHolder * holder); /// Interceptable commands /// @{ @@ -82,6 +83,7 @@ namespace graphics void applyBlitStates(); /// apply geometry rendering states void applyStates(); + void applyVarAlfaStates(); /// apply sharp geometry states void applySharpStates(); /// @} diff --git a/graphics/geometry_batcher.cpp b/graphics/geometry_batcher.cpp index d7bcbd7f87..914bc0a3c2 100644 --- a/graphics/geometry_batcher.cpp +++ b/graphics/geometry_batcher.cpp @@ -668,10 +668,11 @@ namespace graphics base_t::setDisplayList(dl); } - void GeometryBatcher::drawDisplayList(DisplayList * dl, math::Matrix<double, 3, 3> const & m) + void GeometryBatcher::drawDisplayList(DisplayList * dl, math::Matrix<double, 3, 3> const & m, + UniformsHolder * holder) { flush(-1); - base_t::drawDisplayList(dl, m); + base_t::drawDisplayList(dl, m, holder); } void GeometryBatcher::uploadResources(shared_ptr<Resource> const * resources, diff --git a/graphics/geometry_batcher.hpp b/graphics/geometry_batcher.hpp index d181c192b9..758c22f90d 100644 --- a/graphics/geometry_batcher.hpp +++ b/graphics/geometry_batcher.hpp @@ -198,7 +198,7 @@ namespace graphics int pipelineID); void setDisplayList(DisplayList * dl); - void drawDisplayList(DisplayList * dl, math::Matrix<double, 3, 3> const & m); + void drawDisplayList(DisplayList * dl, math::Matrix<double, 3, 3> const & m, UniformsHolder * holder = NULL); void uploadResources(shared_ptr<Resource> const * resources, size_t count, diff --git a/graphics/graphics.pro b/graphics/graphics.pro index fa58fe6e38..fa899c8521 100644 --- a/graphics/graphics.pro +++ b/graphics/graphics.pro @@ -75,7 +75,8 @@ SOURCES += \ pipeline_manager.cpp \ geometry_pipeline.cpp \ path_view.cpp \ - circled_symbol.cpp + circled_symbol.cpp \ + uniforms_holder.cpp HEADERS += \ opengl/opengl.hpp \ @@ -146,7 +147,8 @@ HEADERS += \ path_view.hpp \ path.hpp \ depth_constants.hpp \ - circled_symbol.hpp + circled_symbol.hpp \ + uniforms_holder.hpp win32* { SOURCES += opengl/opengl_win32.cpp diff --git a/graphics/opengl/geometry_renderer.cpp b/graphics/opengl/geometry_renderer.cpp index 2fc0c23776..3ffb87938c 100644 --- a/graphics/opengl/geometry_renderer.cpp +++ b/graphics/opengl/geometry_renderer.cpp @@ -152,6 +152,24 @@ namespace graphics processCommand(make_shared_ptr(new UploadData(resources, count, texture))); } + GeometryRenderer::DrawGeometry::DrawGeometry() + : m_alfa(1.0) + { + } + + bool GeometryRenderer::DrawGeometry::isNeedAdditionalUniforms() const + { + gl::RenderContext const * rc = static_cast<gl::RenderContext const *>(renderContext()); + + shared_ptr<Program> const & prg = rc->program(); + return prg->isParamExist(ETransparency); + } + + void GeometryRenderer::DrawGeometry::setAdditionalUniforms(const UniformsHolder & holder) + { + VERIFY(holder.getValue(ETransparency, m_alfa), ()); + } + void GeometryRenderer::DrawGeometry::perform() { if (isDebugging()) @@ -171,6 +189,9 @@ namespace graphics prg->setParam(ESemProjection, rc->matrix(EProjection)); prg->setParam(ESemSampler0, 0); + if (prg->isParamExist(ETransparency)) + prg->setParam(ETransparency, m_alfa); + prg->setStorage(m_storage); prg->setVertexDecl(Vertex::getVertexDecl()); prg->makeCurrent(); @@ -366,6 +387,8 @@ namespace graphics gl::RenderContext * rc = static_cast<gl::RenderContext*>(renderContext()); ProgramManager * pm = rc->programManager(); shared_ptr<Program> prg = pm->getProgram(EVxTextured, EFrgAlphaTest); + if (m_type == AlfaVaringProgram) + prg = pm->getProgram(EVxTextured, EFrgVarAlfa); prg->setParam(ESemModelView, rc->matrix(EModelView)); prg->setParam(ESemProjection, rc->matrix(EProjection)); @@ -379,6 +402,11 @@ namespace graphics processCommand(make_shared_ptr(new ApplyStates())); } + void GeometryRenderer::applyVarAlfaStates() + { + processCommand(make_shared_ptr(new ApplyStates(ApplyStates::AlfaVaringProgram))); + } + void GeometryRenderer::ApplyBlitStates::perform() { if (isDebugging()) diff --git a/graphics/opengl/geometry_renderer.hpp b/graphics/opengl/geometry_renderer.hpp index d8da1669de..9231c8be1e 100644 --- a/graphics/opengl/geometry_renderer.hpp +++ b/graphics/opengl/geometry_renderer.hpp @@ -49,8 +49,14 @@ namespace graphics VertexDecl * m_vertexDecl; shared_ptr<Program> m_program; + DrawGeometry(); + virtual bool isNeedAdditionalUniforms() const; + virtual void setAdditionalUniforms(UniformsHolder const & holder); void perform(); void dump(); + + private: + float m_alfa; }; struct FreeStorage : public Command @@ -95,7 +101,17 @@ namespace graphics struct ApplyStates : public Command { + enum ProgramType + { + DefaultProgram, + AlfaVaringProgram + }; + + ApplyStates(ProgramType type = DefaultProgram) : m_type(type) {} void perform(); + + private: + ProgramType m_type; }; struct ApplyBlitStates : public Command @@ -122,6 +138,7 @@ namespace graphics void applySharpStates(); void applyBlitStates(); + void applyVarAlfaStates(); void applyStates(); }; } diff --git a/graphics/opengl/program.cpp b/graphics/opengl/program.cpp index 0096951f55..4f2d597ae1 100644 --- a/graphics/opengl/program.cpp +++ b/graphics/opengl/program.cpp @@ -94,6 +94,11 @@ namespace graphics OGLCHECK(glDeleteProgramFn(m_handle)); } + bool Program::isParamExist(ESemantic sem) const + { + return m_uniforms.find(sem) != m_uniforms.end(); + } + void Program::setParam(ESemantic sem, float v0) { map<ESemantic, Uniform>::iterator it = m_uniforms.find(sem); diff --git a/graphics/opengl/program.hpp b/graphics/opengl/program.hpp index 76bbcff45a..e749b3ca43 100644 --- a/graphics/opengl/program.hpp +++ b/graphics/opengl/program.hpp @@ -72,7 +72,7 @@ namespace graphics ~Program(); - unsigned getParam(char const * name); + bool isParamExist(ESemantic sem) const; void setParam(ESemantic sem, float v0); void setParam(ESemantic sem, float v0, float v1); diff --git a/graphics/opengl/program_manager.cpp b/graphics/opengl/program_manager.cpp index 5178428a4a..bd9cc2655c 100644 --- a/graphics/opengl/program_manager.cpp +++ b/graphics/opengl/program_manager.cpp @@ -68,8 +68,23 @@ namespace graphics "}\n"; m_frgShaders[EFrgNoAlphaTest].reset(new Shader(noAlphaTestFrgSrc, EFragmentShader)); + static const char uniformAlfaFrgSrc[] = + "uniform sampler2D Sampler0;\n" + "uniform " PRECISION " float Transparency;\n" + "varying " PRECISION " vec2 TexCoordOut0;\n" + "void main(void) {\n" + " " PRECISION " vec4 color = texture2D(Sampler0, TexCoordOut0);\n" + " " PRECISION " float t = color.a;\n" + " if (t > Transparency)\n" + " t = Transparency;\n" + " gl_FragColor = vec4(color.rgb, t);\n" + "}\n"; + + m_frgShaders[EFrgVarAlfa].reset(new Shader(uniformAlfaFrgSrc, EFragmentShader)); + getProgram(EVxTextured, EFrgAlphaTest); getProgram(EVxTextured, EFrgNoAlphaTest); + getProgram(EVxTextured, EFrgVarAlfa); getProgram(EVxSharp, EFrgAlphaTest); getProgram(EVxSharp, EFrgNoAlphaTest); diff --git a/graphics/opengl/program_manager.hpp b/graphics/opengl/program_manager.hpp index 7f341a46a7..5e714a1a24 100644 --- a/graphics/opengl/program_manager.hpp +++ b/graphics/opengl/program_manager.hpp @@ -20,7 +20,8 @@ namespace graphics enum EFrgType { EFrgAlphaTest, - EFrgNoAlphaTest + EFrgNoAlphaTest, + EFrgVarAlfa }; class ProgramManager diff --git a/graphics/packets_queue.cpp b/graphics/packets_queue.cpp index b788f74e43..db068d32c9 100644 --- a/graphics/packets_queue.cpp +++ b/graphics/packets_queue.cpp @@ -23,6 +23,11 @@ namespace graphics return m_ctx; } + const RenderContext *Command::renderContext() const + { + return m_ctx; + } + Command::Command() : m_isDebugging(false) {} diff --git a/graphics/packets_queue.hpp b/graphics/packets_queue.hpp index ed4c6a4455..85a2849b6c 100644 --- a/graphics/packets_queue.hpp +++ b/graphics/packets_queue.hpp @@ -1,5 +1,7 @@ #pragma once +#include "uniforms_holder.hpp" + #include "../base/fence_manager.hpp" #include "../base/threaded_list.hpp" @@ -26,8 +28,12 @@ namespace graphics bool isDebugging() const; void setIsDebugging(bool flag); + virtual bool isNeedAdditionalUniforms() const { return false; } + virtual void setAdditionalUniforms(UniformsHolder const & /*uniforms*/) {} + void setRenderContext(RenderContext * ctx); RenderContext * renderContext(); + RenderContext const * renderContext() const; Command(); diff --git a/graphics/uniforms_holder.cpp b/graphics/uniforms_holder.cpp new file mode 100644 index 0000000000..c965f2948d --- /dev/null +++ b/graphics/uniforms_holder.cpp @@ -0,0 +1,21 @@ +#include "uniforms_holder.hpp" + +#include "../std/utility.hpp" + +namespace graphics +{ + bool UniformsHolder::insertValue(ESemantic sem, float value) + { + return m_singleFloatHolder.insert(make_pair(sem, value)).second; + } + + bool UniformsHolder::getValue(ESemantic sem, float & value) const + { + single_map_t::const_iterator it = m_singleFloatHolder.find(sem); + if (it == m_singleFloatHolder.end()) + return false; + + value = it->second; + return true; + } +} diff --git a/graphics/uniforms_holder.hpp b/graphics/uniforms_holder.hpp new file mode 100644 index 0000000000..fcf7b37d3d --- /dev/null +++ b/graphics/uniforms_holder.hpp @@ -0,0 +1,20 @@ +#pragma once + +#include "defines.hpp" + +#include "../std/map.hpp" + +namespace graphics +{ + class UniformsHolder + { + public: + bool insertValue(ESemantic sem, float value); + bool getValue(ESemantic sem, float & value) const; + + private: + typedef map<ESemantic, float> single_map_t; + single_map_t m_singleFloatHolder; + }; +} + |