Welcome to mirror list, hosted at ThFree Co, Russian Federation.

github.com/mapsme/omim.git - Unnamed repository; edit this file 'description' to name the repository.
summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
-rw-r--r--graphics/defines.cpp3
-rw-r--r--graphics/defines.hpp3
-rw-r--r--graphics/display_list.cpp5
-rw-r--r--graphics/display_list.hpp4
-rw-r--r--graphics/display_list_renderer.cpp13
-rw-r--r--graphics/display_list_renderer.hpp4
-rw-r--r--graphics/geometry_batcher.cpp5
-rw-r--r--graphics/geometry_batcher.hpp2
-rw-r--r--graphics/graphics.pro6
-rw-r--r--graphics/opengl/geometry_renderer.cpp28
-rw-r--r--graphics/opengl/geometry_renderer.hpp17
-rw-r--r--graphics/opengl/program.cpp5
-rw-r--r--graphics/opengl/program.hpp2
-rw-r--r--graphics/opengl/program_manager.cpp15
-rw-r--r--graphics/opengl/program_manager.hpp3
-rw-r--r--graphics/packets_queue.cpp5
-rw-r--r--graphics/packets_queue.hpp6
-rw-r--r--graphics/uniforms_holder.cpp21
-rw-r--r--graphics/uniforms_holder.hpp20
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;
+ };
+}
+