8519ec6ad08aa1b2cf63c41890f31b90f04f7543
[platform/core/uifw/dali-core.git] / dali / public-api / geometry / 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-buffer.h> // Dali::PropertyBuffer
27 #include <dali/public-api/object/property-index-ranges.h> // DEFAULT_DERIVED_HANDLE_PROPERTY_START_INDEX
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 "depth-index",            type STRING
63       GEOMETRY_CENTER,                                      ///< name "geometry-center",        type VECTOR3
64       GEOMETRY_HALF_EXTENTS,                                ///< name "geometry-half-extents",  type VECTOR3
65       REQUIRES_DEPTH_TEST,                                  ///< name "requires-depth-testing", type BOOLEAN
66     };
67   };
68
69   /**
70    * @brief Creates a new Geometry object
71    *
72    * @return An handle to a newly allocated Geometry
73    */
74   static Geometry New();
75
76   /**
77    * @brief Default constructor, creates an empty handle
78    */
79   Geometry();
80
81   /**
82    * @brief Destructor
83    */
84   ~Geometry();
85
86   /**
87    * @brief Copy constructor, creates a new handle to the same object
88    *
89    * @param[in] handle Handle to an object
90    */
91   Geometry( const Geometry& handle );
92
93   /**
94    * @brief Assignment operator, changes this handle to point at the same object
95    *
96    * @param[in] handle Handle to an object
97    * @return Reference to the assigned object
98    */
99   Geometry& operator=( const Geometry& handle );
100
101   /**
102    * @brief Add a PropertyBuffer to be used as source of geometry vertices
103    *
104    * @param[in] vertexBuffer PropertyBuffer to be used as source of geometry vertices
105    * @return Index of the newly added buffer, can be used with RemoveVertexBuffer to remove
106    *         this buffer if no longer required
107    */
108   std::size_t AddVertexBuffer( PropertyBuffer& vertexBuffer );
109
110   /**
111    * @brief Retrieve the number of vertex buffers that have been added to this geometry
112    *
113    * @return Number of vertex buffers that have been added to this geometry
114    */
115   std::size_t GetNumberOfVertexBuffers() const;
116
117   /**
118    * @brief Remove a vertex buffer
119    *
120    * The index must be between 0 and GetNumberOfVertexBuffers()
121    *
122    * @param[in] index Index to the vertex buffer to remove
123    */
124   void RemoveVertexBuffer( std::size_t index );
125
126   /**
127    * @brief Set a PropertyBuffer to be used as a source of indices for the geometry
128    *
129    * This buffer is required to have exactly one component and it must be of the type Property::INTEGER
130    *
131    * By setting this buffer the will case the geometry to be rendered using indices.
132    * To unset call SetIndexBuffer with an empty handle.
133    *
134    * @param[in] indexBuffer PropertyBuffer to be used as a source of indices for the geometry
135    */
136   void SetIndexBuffer( PropertyBuffer& indexBuffer );
137
138   /**
139    * @brief Set the type of primitives this geometry contains
140    *
141    * @param[in] geometryType Type of primitives this geometry contains
142    */
143   void SetGeometryType( GeometryType geometryType );
144
145   /**
146    * @brief Get the type of primitives this geometry contains
147    *
148    * Calling this function sets the property GEOMETRY_TYPE
149    *
150    * @return Type of primitives this geometry contains
151    */
152   GeometryType GetGeometryType() const;
153
154   /**
155    * @brief Set if the geometry requires depth testing
156    *
157    * Should be set to true if this geometry has overlapping triangles in arbitrary order
158    *
159    * Calling this function is equivalent to setting the REQUIRES_DEPTH_TESTING property
160    *
161    * @param[in] requiresDepthTest Specifies if the geometry requires depth testing
162    */
163   void SetRequiresDepthTesting( bool requiresDepthTest );
164
165   /**
166    * @brief Return if the geometry requires depth testing
167    *
168    * @return True if the geometry requires depth testing
169    */
170   bool GetRequiresDepthTesting() const;
171
172 public:
173   /**
174    * @brief The constructor
175    *
176    * @param [in] pointer A pointer to a newly allocated Geometry
177    */
178   explicit DALI_INTERNAL Geometry( Internal::Geometry* pointer );
179 };
180
181 } //namespace Dali
182
183 #endif // DALI_GEOMETRY_H