From b79345b4ba7ac5e959d6ee913555e3436ca005f2 Mon Sep 17 00:00:00 2001 From: Richard Underhill Date: Wed, 17 Jun 2015 15:07:49 +0100 Subject: [PATCH] Moves shader creation from Text Atlas Renderer to GlyphManager Change-Id: Id0897b32ef799bf27fe1d3f16927f5d49933d4bb Signed-off-by: Richard Underhill --- .../rendering/atlas/atlas-glyph-manager-impl.cpp | 81 ++++++++++++++++------ .../rendering/atlas/atlas-glyph-manager-impl.h | 25 +++++-- .../text/rendering/atlas/atlas-glyph-manager.cpp | 9 +++ .../text/rendering/atlas/atlas-glyph-manager.h | 14 ++++ .../text/rendering/atlas/text-atlas-renderer.cpp | 78 +++------------------ 5 files changed, 112 insertions(+), 95 deletions(-) diff --git a/dali-toolkit/internal/text/rendering/atlas/atlas-glyph-manager-impl.cpp b/dali-toolkit/internal/text/rendering/atlas/atlas-glyph-manager-impl.cpp index 3c21923..cb90d03 100644 --- a/dali-toolkit/internal/text/rendering/atlas/atlas-glyph-manager-impl.cpp +++ b/dali-toolkit/internal/text/rendering/atlas/atlas-glyph-manager-impl.cpp @@ -21,6 +21,64 @@ #include #include +#define MAKE_SHADER(A)#A + +namespace +{ +const char* VERTEX_SHADER = MAKE_SHADER( +attribute mediump vec2 aPosition; +attribute mediump vec2 aTexCoord; +uniform mediump mat4 uMvpMatrix; +uniform mediump vec3 uSize; +varying mediump vec2 vTexCoord; + +void main() +{ + mediump vec4 position = vec4( aPosition, 0.0, 1.0 ); + position.xyz *= uSize; + gl_Position = uMvpMatrix * position; + vTexCoord = aTexCoord; +} +); + +const char* FRAGMENT_SHADER = MAKE_SHADER( +uniform sampler2D sTexture; +varying mediump vec2 vTexCoord; + +void main() +{ + gl_FragColor = texture2D( sTexture, vTexCoord ); +} +); + +const char* VERTEX_SHADER_SHADOW = MAKE_SHADER( +attribute mediump vec2 aPosition; +attribute mediump vec2 aTexCoord; +uniform mediump vec3 uSize; +varying mediump vec2 vTexCoord; + +void main() +{ + mediump vec4 position = vec4( aPosition, 0.0, 1.0 ); + position.xyz *= uSize; + gl_Position = position; + vTexCoord = aTexCoord; +} +); + +const char* FRAGMENT_SHADER_SHADOW = MAKE_SHADER( +uniform sampler2D sTexture; +uniform lowp vec4 uColor; +varying mediump vec2 vTexCoord; + +void main() +{ + mediump vec4 color = texture2D( sTexture, vTexCoord ); + gl_FragColor = vec4(uColor.rgb, uColor.a*color.r); +} +); +} + namespace Dali { @@ -30,12 +88,11 @@ namespace Toolkit namespace Internal { -//#define DISPLAY_ATLAS - AtlasGlyphManager::AtlasGlyphManager() -: mCount( 0 ) { mAtlasManager = Dali::Toolkit::AtlasManager::New(); + mEffectBufferShader = Shader::New( VERTEX_SHADER, FRAGMENT_SHADER ); + mShadowShader = Shader::New( VERTEX_SHADER_SHADOW, FRAGMENT_SHADER_SHADOW, Dali::Shader::HINT_MODIFIES_GEOMETRY ); } AtlasGlyphManager::~AtlasGlyphManager() @@ -59,24 +116,6 @@ void AtlasGlyphManager::Add( const Text::GlyphInfo& glyph, mAtlasManager.Add( bitmap, slot ); record.mImageId = slot.mImageId; mGlyphRecords.PushBack( record ); - -#ifdef DISPLAY_ATLAS - { - uint32_t atlasCount = mAtlasManager.GetAtlasCount(); - if ( atlasCount > mCount ) - { - for ( uint32_t i = 0; i < atlasCount; ++i ) - { - ImageActor actor = ImageActor::New( mAtlasManager.GetAtlasContainer( i + 1u ) ); - actor.SetParentOrigin( Vector3( 0.5f, 0.25f + ( static_cast< float >( i ) * 0.25f ), 0.5f ) ); - actor.SetAnchorPoint( AnchorPoint::CENTER ); - actor.SetSize( 256.0f, 256.0f ); - Stage::GetCurrent().Add( actor ); - } - } - mCount = atlasCount; - } -#endif } void AtlasGlyphManager::GenerateMeshData( uint32_t imageId, diff --git a/dali-toolkit/internal/text/rendering/atlas/atlas-glyph-manager-impl.h b/dali-toolkit/internal/text/rendering/atlas/atlas-glyph-manager-impl.h index 20abcd2..3b2b8af 100644 --- a/dali-toolkit/internal/text/rendering/atlas/atlas-glyph-manager-impl.h +++ b/dali-toolkit/internal/text/rendering/atlas/atlas-glyph-manager-impl.h @@ -127,12 +127,29 @@ public: */ const Toolkit::AtlasGlyphManager::Metrics& GetMetrics(); + /** + * @copydoc Toolkit::AtlasGlyphManager::GetEffectBufferShader + */ + Shader GetEffectBufferShader() const + { + return mEffectBufferShader; + } + + /** + * @copydoc Toolkit::AtlasGlyphManager::GetGlyphShadowShader + */ + Shader GetGlyphShadowShader() const + { + return mShadowShader; + } + private: - Dali::Toolkit::AtlasManager mAtlasManager; - Vector< GlyphRecord > mGlyphRecords; - uint32_t mCount; - Toolkit::AtlasGlyphManager::Metrics mMetrics; + Dali::Toolkit::AtlasManager mAtlasManager; ///> Atlas Manager created by GlyphManager + Vector< GlyphRecord > mGlyphRecords; ///> Cached glyph information + Toolkit::AtlasGlyphManager::Metrics mMetrics; ///> Metrics to pass back on GlyphManager status + Shader mEffectBufferShader; ///> Shader used to render drop shadow buffer textures + Shader mShadowShader; ///> Shader used to render drop shadow into buffer }; } // namespace Internal diff --git a/dali-toolkit/internal/text/rendering/atlas/atlas-glyph-manager.cpp b/dali-toolkit/internal/text/rendering/atlas/atlas-glyph-manager.cpp index 0c6ab13..7292012 100644 --- a/dali-toolkit/internal/text/rendering/atlas/atlas-glyph-manager.cpp +++ b/dali-toolkit/internal/text/rendering/atlas/atlas-glyph-manager.cpp @@ -133,6 +133,15 @@ const Toolkit::AtlasGlyphManager::Metrics& AtlasGlyphManager::GetMetrics() return GetImplementation(*this).GetMetrics(); } +Shader AtlasGlyphManager::GetEffectBufferShader() const +{ + return GetImplementation(*this).GetEffectBufferShader(); +} + +Shader AtlasGlyphManager::GetGlyphShadowShader() const +{ + return GetImplementation(*this).GetGlyphShadowShader(); +} } // namespace Toolkit diff --git a/dali-toolkit/internal/text/rendering/atlas/atlas-glyph-manager.h b/dali-toolkit/internal/text/rendering/atlas/atlas-glyph-manager.h index 7a516e3..0f8468d 100644 --- a/dali-toolkit/internal/text/rendering/atlas/atlas-glyph-manager.h +++ b/dali-toolkit/internal/text/rendering/atlas/atlas-glyph-manager.h @@ -170,6 +170,20 @@ public: */ const Metrics& GetMetrics(); + /** + * @brief Get Shader used for rendering glyph effect buffers + * + * @return Handle of shader needed + */ + Shader GetEffectBufferShader() const; + + /** + * @brief Get Shader used rendering Glyph Shadows + * + * @return Handle of shader needed + */ + Shader GetGlyphShadowShader() const; + private: explicit DALI_INTERNAL AtlasGlyphManager(Internal::AtlasGlyphManager *impl); diff --git a/dali-toolkit/internal/text/rendering/atlas/text-atlas-renderer.cpp b/dali-toolkit/internal/text/rendering/atlas/text-atlas-renderer.cpp index b1724d0..b72b64a 100644 --- a/dali-toolkit/internal/text/rendering/atlas/text-atlas-renderer.cpp +++ b/dali-toolkit/internal/text/rendering/atlas/text-atlas-renderer.cpp @@ -42,70 +42,13 @@ namespace Debug::Filter* gLogFilter = Debug::Filter::New(Debug::Concise, true, "LOG_TEXT_RENDERING"); #endif - const float ZERO( 0.0f ); - const float HALF( 0.5f ); - const float ONE( 1.0f ); - const float TWO( 2.0f ); - const uint32_t DEFAULT_ATLAS_WIDTH = 512u; - const uint32_t DEFAULT_ATLAS_HEIGHT = 512u; - - #define MAKE_SHADER(A)#A - - const char* VERTEX_SHADER = MAKE_SHADER( - attribute mediump vec2 aPosition; - attribute mediump vec2 aTexCoord; - uniform mediump mat4 uMvpMatrix; - uniform mediump vec3 uSize; - varying mediump vec2 vTexCoord; - - void main() - { - mediump vec4 position = vec4( aPosition, 0.0, 1.0 ); - position.xyz *= uSize; - gl_Position = uMvpMatrix * position; - vTexCoord = aTexCoord; - } - ); - - const char* FRAGMENT_SHADER = MAKE_SHADER( - uniform sampler2D sTexture; - varying mediump vec2 vTexCoord; - - void main() - { - //gl_FragColor = vec4( 1.0 ); - gl_FragColor = texture2D( sTexture, vTexCoord ); - } - ); - - const char* VERTEX_SHADER_SHADOW = MAKE_SHADER( - attribute mediump vec2 aPosition; - attribute mediump vec2 aTexCoord; - uniform mediump vec3 uSize; - varying mediump vec2 vTexCoord; - - void main() - { - mediump vec4 position = vec4( aPosition, 0.0, 1.0 ); - position.xyz *= uSize; - gl_Position = position; - vTexCoord = aTexCoord; - } - ); - - const char* FRAGMENT_SHADER_SHADOW = MAKE_SHADER( - uniform sampler2D sTexture; - uniform lowp vec4 uColor; - varying mediump vec2 vTexCoord; - - void main() - { - mediump vec4 color = texture2D( sTexture, vTexCoord ); - gl_FragColor = vec4(uColor.rgb, uColor.a*color.r); - } - ); +const float ZERO( 0.0f ); +const float HALF( 0.5f ); +const float ONE( 1.0f ); +const float TWO( 2.0f ); +const uint32_t DEFAULT_ATLAS_WIDTH = 512u; +const uint32_t DEFAULT_ATLAS_HEIGHT = 512u; } - struct AtlasRenderer::Impl : public ConnectionTracker { @@ -155,9 +98,6 @@ struct AtlasRenderer::Impl : public ConnectionTracker mQuadVertexFormat[ "aPosition" ] = Property::VECTOR2; mQuadVertexFormat[ "aTexCoord" ] = Property::VECTOR2; mQuadIndexFormat[ "indices" ] = Property::UNSIGNED_INTEGER; - - mShader = Shader::New( VERTEX_SHADER, FRAGMENT_SHADER ); - mShadowShader = Shader::New( VERTEX_SHADER_SHADOW, FRAGMENT_SHADER_SHADOW, Dali::Shader::HINT_MODIFIES_GEOMETRY ); } void AddGlyphs( const std::vector& positions, @@ -663,7 +603,7 @@ struct AtlasRenderer::Impl : public ConnectionTracker quadGeometry.SetIndexBuffer( quadIndices ); Sampler sampler = Sampler::New( meshRecord.mBuffer, "sTexture" ); - Material material = Material::New( mShader ); + Material material = Material::New( mGlyphManager.GetEffectBufferShader() ); material.AddSampler( sampler ); Dali::Renderer renderer = Dali::Renderer::New( quadGeometry, material ); @@ -691,7 +631,7 @@ struct AtlasRenderer::Impl : public ConnectionTracker normGeometry.AddVertexBuffer( normVertices ); normGeometry.SetIndexBuffer( normIndices ); - Material normMaterial = Material::New( mShadowShader ); + Material normMaterial = Material::New( mGlyphManager.GetGlyphShadowShader() ); Sampler normSampler = mGlyphManager.GetSampler( meshRecord.mAtlasId ); normMaterial.AddSampler( normSampler ); Dali::Renderer normRenderer = Dali::Renderer::New( normGeometry, normMaterial ); @@ -737,8 +677,6 @@ struct AtlasRenderer::Impl : public ConnectionTracker AtlasGlyphManager mGlyphManager; ///< Glyph Manager to handle upload and caching Vector< uint32_t > mImageIds; ///< A list of imageIDs used by the renderer TextAbstraction::FontClient mFontClient; ///> The font client used to supply glyph information - Shader mShader; ///> Shader used to render drop shadow buffer textures - Shader mShadowShader; ///> Shader used to render drop shadow into buffer std::vector< MaxBlockSize > mBlockSizes; ///> Maximum size needed to contain a glyph in a block within a new atlas std::vector< uint32_t > mFace; ///> Face indices for a quad Property::Map mQuadVertexFormat; -- 2.7.4