[dali_2.3.44] Merge branch 'devel/master'
[platform/core/uifw/dali-core.git] / dali / internal / event / rendering / geometry-impl.cpp
1 /*
2  * Copyright (c) 2024 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   Render::Geometry::Uint16ContainerType indexData;
60   if(indices && count)
61   {
62     indexData.ResizeUninitialized(count);
63     std::copy(indices, indices + count, indexData.Begin());
64   }
65
66   SceneGraph::SetIndexBufferMessage(mEventThreadServices.GetUpdateManager(), *mRenderObject, indexData);
67 }
68
69 void Geometry::SetIndexBuffer(const uint32_t* indices, uint32_t count)
70 {
71   Render::Geometry::Uint32ContainerType indexData;
72   if(indices && count)
73   {
74     indexData.ResizeUninitialized(count);
75     std::copy(indices, indices + count, indexData.Begin());
76   }
77
78   SceneGraph::SetIndexBufferMessage(mEventThreadServices.GetUpdateManager(), *mRenderObject, indexData);
79 }
80
81 void Geometry::SetType(Dali::Geometry::Type geometryType)
82 {
83   if(geometryType != mType)
84   {
85     SceneGraph::SetGeometryTypeMessage(mEventThreadServices.GetUpdateManager(), *mRenderObject, geometryType);
86
87     mType = geometryType;
88   }
89 }
90
91 Dali::Geometry::Type Geometry::GetType() const
92 {
93   return mType;
94 }
95
96 const Render::Geometry* Geometry::GetRenderObject() const
97 {
98   return mRenderObject;
99 }
100
101 Geometry::Geometry()
102 : mEventThreadServices(EventThreadServices::Get()),
103   mRenderObject(nullptr),
104   mType(Dali::Geometry::TRIANGLES)
105 {
106 }
107
108 void Geometry::Initialize()
109 {
110   mRenderObject = new Render::Geometry();
111   OwnerPointer<Render::Geometry> transferOwnership(mRenderObject);
112   AddGeometry(mEventThreadServices.GetUpdateManager(), transferOwnership);
113 }
114
115 Geometry::~Geometry()
116 {
117   if(DALI_UNLIKELY(!Dali::Stage::IsCoreThread()))
118   {
119     DALI_LOG_ERROR("~Geometry[%p] called from non-UI thread! something unknown issue will be happened!\n", this);
120   }
121
122   if(DALI_LIKELY(EventThreadServices::IsCoreRunning() && mRenderObject))
123   {
124     RemoveGeometry(mEventThreadServices.GetUpdateManager(), *mRenderObject);
125   }
126 }
127
128 } // namespace Internal
129
130 } // namespace Dali