[dali_1.1.21] Merge branch 'devel/master'
[platform/core/uifw/dali-core.git] / dali / devel-api / rendering / geometry.h
1 #ifndef DALI_GEOMETRY_H
2 #define DALI_GEOMETRY_H
3
4 /*
5  * Copyright (c) 2015 Samsung Electronics Co., Ltd.
6  *
7  * Licensed under the Apache License, Version 2.0 (the "License");
8  * you may not use this file except in compliance with the License.
9  * You may obtain a copy of the License at
10  *
11  * http://www.apache.org/licenses/LICENSE-2.0
12  *
13  * Unless required by applicable law or agreed to in writing, software
14  * distributed under the License is distributed on an "AS IS" BASIS,
15  * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
16  * See the License for the specific language governing permissions and
17  * limitations under the License.
18  *
19  */
20
21 // EXTERNAL INCLUDES
22 #include <cstddef> // std::size_t
23
24 // INTERNAL INCLUDES
25 #include <dali/public-api/object/handle.h> // Dali::Handle
26 #include <dali/public-api/object/property-index-ranges.h> // DEFAULT_DERIVED_HANDLE_PROPERTY_START_INDEX
27 #include <dali/devel-api/object/property-buffer.h> // Dali::PropertyBuffer
28
29 namespace Dali
30 {
31
32 namespace Internal DALI_INTERNAL
33 {
34 class Geometry;
35 }
36
37 /**
38  * @brief Geometry is handle to an object that can be used to define a geometric elements.
39  */
40 class DALI_IMPORT_API Geometry : public Handle
41 {
42 public:
43
44   enum GeometryType
45   {
46     POINTS,
47     LINES,
48     LINE_LOOP,
49     LINE_STRIP,
50     TRIANGLES,
51     TRIANGLE_FAN,
52     TRIANGLE_STRIP
53   };
54
55   /**
56    * @brief An enumeration of properties belonging to the Geometry class.
57    */
58   struct Property
59   {
60     enum
61     {
62       GEOMETRY_TYPE = DEFAULT_OBJECT_PROPERTY_START_INDEX,  ///< name "geometryType",             type STRING
63       REQUIRES_DEPTH_TEST,                                  ///< name "requiresDepthTesting",   type BOOLEAN
64     };
65   };
66
67   /**
68    * @brief Creates a new Geometry object
69    *
70    * @return An handle to a newly allocated Geometry
71    */
72   static Geometry New();
73
74   /**
75    * @brief Default constructor, creates an empty handle
76    */
77   Geometry();
78
79   /**
80    * @brief Destructor
81    */
82   ~Geometry();
83
84   /**
85    * @brief Copy constructor, creates a new handle to the same object
86    *
87    * @param[in] handle Handle to an object
88    */
89   Geometry( const Geometry& handle );
90
91   /**
92    * @brief Downcast to a geometry.
93    *
94    * If not the returned handle is left uninitialized.
95    * @param[in] handle to an object
96    * @return geometry handle or an uninitialized handle
97    */
98   static Geometry DownCast( BaseHandle handle );
99
100   /**
101    * @brief Assignment operator, changes this handle to point at the same object
102    *
103    * @param[in] handle Handle to an object
104    * @return Reference to the assigned object
105    */
106   Geometry& operator=( const Geometry& handle );
107
108   /**
109    * @brief Add a PropertyBuffer to be used as source of geometry vertices
110    *
111    * @param[in] vertexBuffer PropertyBuffer to be used as source of geometry vertices
112    * @return Index of the newly added buffer, can be used with RemoveVertexBuffer to remove
113    *         this buffer if no longer required
114    */
115   std::size_t AddVertexBuffer( PropertyBuffer& vertexBuffer );
116
117   /**
118    * @brief Retrieve the number of vertex buffers that have been added to this geometry
119    *
120    * @return Number of vertex buffers that have been added to this geometry
121    */
122   std::size_t GetNumberOfVertexBuffers() const;
123
124   /**
125    * @brief Remove a vertex buffer
126    *
127    * The index must be between 0 and GetNumberOfVertexBuffers()
128    *
129    * @param[in] index Index to the vertex buffer to remove
130    */
131   void RemoveVertexBuffer( std::size_t index );
132
133   /**
134    * @brief Set a PropertyBuffer to be used as a source of indices for the geometry
135    *
136    * This buffer is required to have exactly one component and it must be of the type Property::INTEGER
137    *
138    * By setting this buffer the will case the geometry to be rendered using indices.
139    * To unset call SetIndexBuffer with an empty handle.
140    *
141    * @param[in] indexBuffer PropertyBuffer to be used as a source of indices for the geometry
142    */
143   void SetIndexBuffer( PropertyBuffer& indexBuffer );
144
145   /**
146    * @brief Set the type of primitives this geometry contains
147    *
148    * @param[in] geometryType Type of primitives this geometry contains
149    */
150   void SetGeometryType( GeometryType geometryType );
151
152   /**
153    * @brief Get the type of primitives this geometry contains
154    *
155    * Calling this function sets the property GEOMETRY_TYPE
156    *
157    * @return Type of primitives this geometry contains
158    */
159   GeometryType GetGeometryType() const;
160
161   /**
162    * @brief Set if the geometry requires depth testing
163    *
164    * Should be set to true if this geometry has overlapping triangles in arbitrary order
165    *
166    * Calling this function is equivalent to setting the REQUIRES_DEPTH_TESTING property
167    *
168    * @param[in] requiresDepthTest Specifies if the geometry requires depth testing
169    */
170   void SetRequiresDepthTesting( bool requiresDepthTest );
171
172   /**
173    * @brief Return if the geometry requires depth testing
174    *
175    * @return True if the geometry requires depth testing
176    */
177   bool GetRequiresDepthTesting() const;
178
179 public:
180   /**
181    * @brief The constructor
182    *
183    * @param [in] pointer A pointer to a newly allocated Geometry
184    */
185   explicit DALI_INTERNAL Geometry( Internal::Geometry* pointer );
186 };
187
188 } //namespace Dali
189
190 #endif // DALI_GEOMETRY_H