4b6ee138f6aa063366d66f039891c02953db5204
[platform/core/uifw/dali-core.git] / dali / internal / event / rendering / geometry-impl.cpp
1 /*
2  * Copyright (c) 2021 Samsung Electronics Co., Ltd.
3  *
4  * Licensed under the Apache License, Version 2.0 (the "License");
5  * you may not use this file except in compliance with the License.
6  * You may obtain a copy of the License at
7  *
8  * http://www.apache.org/licenses/LICENSE-2.0
9  *
10  * Unless required by applicable law or agreed to in writing, software
11  * distributed under the License is distributed on an "AS IS" BASIS,
12  * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
13  * See the License for the specific language governing permissions and
14  * limitations under the License.
15  *
16  */
17
18 // CLASS HEADER
19 #include <dali/internal/event/rendering/geometry-impl.h> // Dali::Internal::Geometry
20
21 // INTERNAL INCLUDES
22 #include <dali/public-api/object/type-registry.h>
23
24 #include <dali/internal/update/manager/update-manager.h>
25
26 namespace Dali
27 {
28 namespace Internal
29 {
30 GeometryPtr Geometry::New()
31 {
32   GeometryPtr geometry(new Geometry());
33   geometry->Initialize();
34   return geometry;
35 }
36
37 uint32_t Geometry::AddVertexBuffer(VertexBuffer& vertexBuffer)
38 {
39   mVertexBuffers.push_back(&vertexBuffer);
40   SceneGraph::AttachVertexBufferMessage(mEventThreadServices.GetUpdateManager(), *mRenderObject, *vertexBuffer.GetRenderObject());
41   return static_cast<uint32_t>(mVertexBuffers.size() - 1u);
42 }
43
44 uint32_t Geometry::GetNumberOfVertexBuffers() const
45 {
46   return static_cast<uint32_t>(mVertexBuffers.size());
47 }
48
49 void Geometry::RemoveVertexBuffer(uint32_t index)
50 {
51   const Render::VertexBuffer& renderVertexBuffer = static_cast<const Render::VertexBuffer&>(*(mVertexBuffers[index]->GetRenderObject()));
52   SceneGraph::RemoveVertexBufferMessage(mEventThreadServices.GetUpdateManager(), *mRenderObject, renderVertexBuffer);
53
54   mVertexBuffers.erase(mVertexBuffers.begin() + index);
55 }
56
57 void Geometry::SetIndexBuffer(const uint16_t* indices, uint32_t count)
58 {
59   Dali::Vector<uint16_t> indexData;
60   if(indices && count)
61   {
62     indexData.Resize(count);
63     std::copy(indices, indices + count, indexData.Begin());
64   }
65
66   SceneGraph::SetIndexBufferMessage(mEventThreadServices.GetUpdateManager(), *mRenderObject, indexData);
67 }
68
69 void Geometry::SetType(Dali::Geometry::Type geometryType)
70 {
71   if(geometryType != mType)
72   {
73     SceneGraph::SetGeometryTypeMessage(mEventThreadServices.GetUpdateManager(), *mRenderObject, geometryType);
74
75     mType = geometryType;
76   }
77 }
78
79 Dali::Geometry::Type Geometry::GetType() const
80 {
81   return mType;
82 }
83
84 const Render::Geometry* Geometry::GetRenderObject() const
85 {
86   return mRenderObject;
87 }
88
89 Geometry::Geometry()
90 : mEventThreadServices(EventThreadServices::Get()),
91   mRenderObject(nullptr),
92   mType(Dali::Geometry::TRIANGLES)
93 {
94 }
95
96 void Geometry::Initialize()
97 {
98   mRenderObject = new Render::Geometry();
99   OwnerPointer<Render::Geometry> transferOwnership(mRenderObject);
100   AddGeometry(mEventThreadServices.GetUpdateManager(), transferOwnership);
101 }
102
103 Geometry::~Geometry()
104 {
105   if(EventThreadServices::IsCoreRunning() && mRenderObject)
106   {
107     RemoveGeometry(mEventThreadServices.GetUpdateManager(), *mRenderObject);
108   }
109 }
110
111 } // namespace Internal
112
113 } // namespace Dali