#define DALI_INTERNAL_RENDERER_H
/*
- * Copyright (c) 2015 Samsung Electronics Co., Ltd.
+ * Copyright (c) 2018 Samsung Electronics Co., Ltd.
*
* Licensed under the Apache License, Version 2.0 (the "License");
* you may not use this file except in compliance with the License.
// INTERNAL INCLUDES
#include <dali/public-api/common/dali-common.h> // DALI_ASSERT_ALWAYS
#include <dali/public-api/common/intrusive-ptr.h> // Dali::IntrusivePtr
-#include <dali/devel-api/rendering/renderer.h> // Dali::Renderer
-#include <dali/internal/event/common/connectable.h> // Dali::Internal::Connectable
+#include <dali/public-api/rendering/renderer.h> // Dali::Renderer
+#include <dali/internal/common/blending-options.h>
#include <dali/internal/event/common/object-connector.h> // Dali::Internal::ObjectConnector
#include <dali/internal/event/common/object-impl.h> // Dali::Internal::Object
-#include <dali/internal/event/rendering/material-impl.h> // Dali::Internal::Material
+#include <dali/internal/event/rendering/texture-set-impl.h> // Dali::Internal::TextureSet
#include <dali/internal/event/rendering/geometry-impl.h> // Dali::Internal::Geometry
+#include <dali/internal/render/renderers/render-renderer.h> // Dali::Render::Renderer::StencilParameters
namespace Dali
{
class Renderer;
}
-
class Renderer;
typedef IntrusivePtr<Renderer> RendererPtr;
/**
- * Renderer is an object that can be used to show content by combining a Geometry with a material.
+ * Renderer is an object that can be used to show content by combining a Geometry with a shader and textures.
*/
class Renderer : public Object
{
Geometry* GetGeometry() const;
/**
- * @copydoc Dali::Renderer::SetMaterial()
+ * @copydoc Dali::Renderer::SetTextures()
+ */
+ void SetTextures( TextureSet& textureSet );
+
+ /**
+ * @copydoc Dali::Renderer::GetTextures()
+ */
+ TextureSet* GetTextures() const;
+
+ /**
+ * @copydoc Dali::Renderer::SetShader()
*/
- void SetMaterial( Material& material );
+ void SetShader( Shader& shader );
/**
- * @copydoc Dali::Renderer::GetMaterial()
+ * @copydoc Dali::Renderer::GetShader()
*/
- Material* GetMaterial() const;
+ Shader* GetShader() const;
/**
* @copydoc Dali::Renderer::SetDepthIndex()
*/
int GetDepthIndex() const;
- /**
- * @brief Get the scene graph object ( the node attachment )
- *
- * @return the scene object
- */
- SceneGraph::Renderer* GetRendererSceneObject();
+ /**
+ * @copydoc Dali::Renderer::SetBlendMode()
+ */
+ void SetBlendMode( BlendMode::Type mode );
+
+ /**
+ * @copydoc Dali::Renderer::GetBlendMode()
+ */
+ BlendMode::Type GetBlendMode() const;
+
+ /**
+ * @copydoc Dali::Renderer::SetBlendFunc()
+ */
+ void SetBlendFunc( BlendFactor::Type srcFactorRgba, BlendFactor::Type destFactorRgba );
+
+ /**
+ * @copydoc Dali::Renderer::SetBlendFunc()
+ */
+ void SetBlendFunc( BlendFactor::Type srcFactorRgb, BlendFactor::Type destFactorRgb,
+ BlendFactor::Type srcFactorAlpha, BlendFactor::Type destFactorAlpha );
+
+ /**
+ * @copydoc Dali::Renderer::GetBlendFunc()
+ */
+ void GetBlendFunc( BlendFactor::Type& srcFactorRgb, BlendFactor::Type& destFactorRgb,
+ BlendFactor::Type& srcFactorAlpha, BlendFactor::Type& destFactorAlpha ) const;
+
+ /**
+ * @copydoc Dali::Renderer::SetBlendEquation()
+ */
+ void SetBlendEquation( BlendEquation::Type equationRgba );
+
+ /**
+ * @copydoc Dali::Renderer::SetBlendEquation()
+ */
+ void SetBlendEquation( BlendEquation::Type equationRgb, BlendEquation::Type equationAlpha );
+
+ /**
+ * @copydoc Dali::Renderer::GetBlendEquation()
+ */
+ void GetBlendEquation( BlendEquation::Type& equationRgb, BlendEquation::Type& equationAlpha ) const;
+
+ /**
+ * @copydoc Dali::Renderer::SetIndexedDrawFirstElement
+ */
+ void SetIndexedDrawFirstElement( size_t firstElement );
+
+ /**
+ * @copydoc Dali::Renderer::SetIndexedDrawElementsCount
+ */
+ void SetIndexedDrawElementsCount( size_t elementsCount );
+
+ /**
+ * @brief Set whether the Pre-multiplied Alpha Blending is required
+ *
+ * @param[in] preMultipled whether alpha is pre-multiplied.
+ */
+ void EnablePreMultipliedAlpha( bool preMultipled );
+
+ /**
+ * @brief Query whether alpha is pre-multiplied.
+ *
+ * @return True is alpha is pre-multiplied, false otherwise.
+ */
+ bool IsPreMultipliedAlphaEnabled() const;
+
+ /**
+ * @brief Get the scene graph object
+ *
+ * @return the scene object
+ */
+ SceneGraph::Renderer* GetRendererSceneObject();
public: // Default property extensions from Object
virtual Property::Value GetDefaultProperty( Property::Index index ) const;
/**
+ * @copydoc Dali::Internal::Object::GetDefaultPropertyCurrentValue()
+ */
+ virtual Property::Value GetDefaultPropertyCurrentValue( Property::Index index ) const;
+
+ /**
+ * @copydoc Dali::Internal::Object::OnNotifyDefaultPropertyAnimation()
+ */
+ virtual void OnNotifyDefaultPropertyAnimation( Animation& animation, Property::Index index, const Property::Value& value, Animation::Type animationType );
+
+ /**
* @copydoc Dali::Internal::Object::GetPropertyOwner()
*/
virtual const SceneGraph::PropertyOwner* GetPropertyOwner() const;
*/
virtual int GetPropertyComponentIndex( Property::Index index ) const;
-public: // Functions from Connectable
+private: // implementation
+
/**
- * @copydoc Dali::Internal::Connectable::OnStage()
+ * @brief Default constructor.
*/
- virtual bool OnStage() const;
+ Renderer();
/**
- * @copydoc Dali::Internal::Connectable::Connect()
+ * @brief Initializes the Renderer.
*/
- virtual void Connect();
+ void Initialize();
/**
- * @copydoc Dali::Internal::Connectable::Disconnect()
+ * @brief Sets the blend color.
+ * @param[in] blendColor The blend color to set.
*/
- virtual void Disconnect();
+ void SetBlendColor( const Vector4& blendColor );
-private: // implementation
- Renderer();
+ /**
+ * @brief Retrieves the blend-color.
+ * @return A const reference to the blend-color
+ */
+ const Vector4& GetBlendColor() const;
- void Initialize();
+ /**
+ * @brief Retrieves the cached event side value of a default property.
+ * @param[in] index The index of the property
+ * @param[out] value Is set with the cached value of the property if found.
+ * @return True if value set, false otherwise.
+ */
+ bool GetCachedPropertyValue( Property::Index index, Property::Value& value ) const;
+
+ /**
+ * @brief Retrieves the current value of a default property from the scene-graph.
+ * @param[in] index The index of the property
+ * @param[out] value Is set with the current scene-graph value of the property
+ * @return True if value set, false otherwise.
+ */
+ bool GetCurrentPropertyValue( Property::Index index, Property::Value& value ) const;
protected:
/**
Renderer& operator=( const Renderer& );
private: // data
- SceneGraph::Renderer* mSceneObject;
- ObjectConnector<Geometry> mGeometryConnector; ///< Connector that holds the geometry used by this renderer
- ObjectConnector<Material> mMaterialConnector; ///< Connector that holds the material used by this renderer
- int mDepthIndex;
- int mOnStageCount;
+ SceneGraph::Renderer* mSceneObject;
+ GeometryPtr mGeometry; ///< Connector that holds the geometry used by this renderer
+ TextureSetPtr mTextureSet; ///< Connector that holds the texture set used by this renderer
+ ShaderPtr mShader; ///< Connector that holds the shader used by this renderer
+
+ int mDepthIndex;
+
+ size_t mIndexedDrawFirstElement; ///< Offset of first element to draw from bound index buffer
+ size_t mIndexedDrawElementCount; ///< Number of elements to draw
+
+ Render::Renderer::StencilParameters mStencilParameters; ///< Struct containing all stencil related options
+ BlendingOptions mBlendingOptions; ///< Local copy of blending options bitmask
+
+ float mOpacity; ///< Local copy of the opacity
+ DepthFunction::Type mDepthFunction:4; ///< Local copy of the depth function
+ FaceCullingMode::Type mFaceCullingMode:3; ///< Local copy of the mode of face culling
+ BlendMode::Type mBlendMode:3; ///< Local copy of the mode of blending
+ DepthWriteMode::Type mDepthWriteMode:3; ///< Local copy of the depth write mode
+ DepthTestMode::Type mDepthTestMode:3; ///< Local copy of the depth test mode
+ bool mPremultipledAlphaEnabled:1; ///< Flag indicating whether the Pre-multiplied Alpha Blending is required
};
} // namespace Internal