Added function to set a collider mesh on the ModelNode and signal to Model
[platform/core/uifw/dali-csharp-binder.git] / dali-csharp-binder / dali-scene3d / model-node-wrap.cpp
1 /*
2  * Copyright (c) 2023 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 // EXTERNAL INCLUDES
19 #include <dali-scene3d/public-api/model-components/model-node.h>
20 #include <dali-scene3d/public-api/algorithm/navigation-mesh.h>
21 #include <dali-scene3d/public-api/loader/navigation-mesh-factory.h>
22
23 // INTERNAL INCLUDES
24 #include <dali-csharp-binder/common/common.h>
25
26 #ifdef __cplusplus
27 extern "C" {
28 #endif
29
30 SWIGEXPORT void* SWIGSTDCALL CSharp_Dali_Model_Node_New_SWIG_0()
31 {
32   Dali::Scene3D::ModelNode result;
33   {
34     try
35     {
36       result = Dali::Scene3D::ModelNode::New();
37     }
38     CALL_CATCH_EXCEPTION(0);
39   }
40
41   return new Dali::Scene3D::ModelNode((const Dali::Scene3D::ModelNode&)result);
42 }
43
44 SWIGEXPORT void* SWIGSTDCALL CSharp_Dali_new_Model_Node_SWIG_0()
45 {
46   Dali::Scene3D::ModelNode* result = 0;
47
48   {
49     try
50     {
51       result = (Dali::Scene3D::ModelNode*)new Dali::Scene3D::ModelNode();
52     }
53     CALL_CATCH_EXCEPTION(0);
54   }
55
56   return (void*)result;
57 }
58
59 SWIGEXPORT void* SWIGSTDCALL CSharp_Dali_new_Model_Node_SWIG_1(void* csModel)
60 {
61   Dali::Scene3D::ModelNode* model  = (Dali::Scene3D::ModelNode*)csModel;
62   Dali::Scene3D::ModelNode* result = 0;
63
64   if(!model)
65   {
66     SWIG_CSharpSetPendingExceptionArgument(SWIG_CSharpArgumentNullException, "Dali::Scene3D::ModelNode const & type is null", 0);
67     return 0;
68   }
69   {
70     try
71     {
72       result = (Dali::Scene3D::ModelNode*)new Dali::Scene3D::ModelNode((Dali::Scene3D::ModelNode const&)*model);
73     }
74     CALL_CATCH_EXCEPTION(0);
75   }
76
77   return (void*)result;
78 }
79
80 SWIGEXPORT void SWIGSTDCALL CSharp_Dali_delete_Model_Node(void* csModel)
81 {
82   Dali::Scene3D::ModelNode* model = (Dali::Scene3D::ModelNode*)csModel;
83   {
84     try
85     {
86       delete model;
87     }
88     CALL_CATCH_EXCEPTION();
89   }
90 }
91
92 SWIGEXPORT void* SWIGSTDCALL CSharp_Dali_Model_Node_Assign(void* csDestination, void* csSource)
93 {
94   Dali::Scene3D::ModelNode* destination = (Dali::Scene3D::ModelNode*)csDestination;
95   Dali::Scene3D::ModelNode* source      = (Dali::Scene3D::ModelNode*)csSource;
96   Dali::Scene3D::ModelNode* result      = 0;
97
98   if(!source)
99   {
100     SWIG_CSharpSetPendingExceptionArgument(SWIG_CSharpArgumentNullException, "Dali::Scene3D::ModelNode const & type is null", 0);
101     return 0;
102   }
103   {
104     try
105     {
106       result = (Dali::Scene3D::ModelNode*)&(destination)->operator=((Dali::Scene3D::ModelNode const&)*source);
107     }
108     CALL_CATCH_EXCEPTION(0);
109   }
110
111   return (void*)result;
112 }
113
114 SWIGEXPORT void* SWIGSTDCALL CSharp_Dali_Model_Node_DownCast(void* csHandle)
115 {
116   Dali::BaseHandle*    handle = (Dali::BaseHandle*)csHandle;
117   Dali::Scene3D::ModelNode result;
118
119   if(!handle)
120   {
121     SWIG_CSharpSetPendingExceptionArgument(SWIG_CSharpArgumentNullException, "Attempt to dereference null Dali::Scene3D::ModelNode", 0);
122     return 0;
123   }
124   {
125     try
126     {
127       result = Dali::Scene3D::ModelNode::DownCast(*handle);
128     }
129     CALL_CATCH_EXCEPTION(0);
130   }
131
132   return new Dali::Scene3D::ModelNode((const Dali::Scene3D::ModelNode&)result);
133 }
134
135 SWIGEXPORT unsigned int SWIGSTDCALL CSharp_Dali_Model_Node_GetModelPrimitiveCount(void* csModelNode)
136 {
137   Dali::Scene3D::ModelNode* modelNode = (Dali::Scene3D::ModelNode*)csModelNode;
138
139   if(!modelNode)
140   {
141     SWIG_CSharpSetPendingExceptionArgument(SWIG_CSharpArgumentNullException, "Attempt to dereference null Dali::Scene3D::ModelNode", 0);
142     return 0;
143   }
144   {
145     try
146     {
147       return modelNode->GetModelPrimitiveCount();
148     }
149     CALL_CATCH_EXCEPTION(0);
150   }
151 }
152
153 SWIGEXPORT void SWIGSTDCALL CSharp_Dali_Model_Node_AddModelPrimitive(void* csModelNode, void* csModelPrimitive)
154 {
155   Dali::Scene3D::ModelNode* modelNode = (Dali::Scene3D::ModelNode*)csModelNode;
156   Dali::Scene3D::ModelPrimitive* modelPrimitive = (Dali::Scene3D::ModelPrimitive*)csModelPrimitive;
157
158   if(!modelNode)
159   {
160     SWIG_CSharpSetPendingExceptionArgument(SWIG_CSharpArgumentNullException, "Attempt to dereference null Dali::Scene3D::ModelNode", 0);
161     return;
162   }
163   if(!modelPrimitive)
164   {
165     SWIG_CSharpSetPendingExceptionArgument(SWIG_CSharpArgumentNullException, "Attempt to dereference null Dali::Scene3D::ModelPrimitive", 0);
166     return;
167   }
168   {
169     try
170     {
171       modelNode->AddModelPrimitive(*modelPrimitive);
172     }
173     CALL_CATCH_EXCEPTION();
174   }
175 }
176
177 SWIGEXPORT void SWIGSTDCALL CSharp_Dali_Model_Node_RemoveModelPrimitive1(void* csModelNode, void* csModelPrimitive)
178 {
179   Dali::Scene3D::ModelNode* modelNode = (Dali::Scene3D::ModelNode*)csModelNode;
180   Dali::Scene3D::ModelPrimitive* modelPrimitive = (Dali::Scene3D::ModelPrimitive*)csModelPrimitive;
181
182   if(!modelNode)
183   {
184     SWIG_CSharpSetPendingExceptionArgument(SWIG_CSharpArgumentNullException, "Attempt to dereference null Dali::Scene3D::ModelNode", 0);
185     return;
186   }
187   if(!modelPrimitive)
188   {
189     SWIG_CSharpSetPendingExceptionArgument(SWIG_CSharpArgumentNullException, "Attempt to dereference null Dali::Scene3D::ModelPrimitive", 0);
190     return;
191   }
192   {
193     try
194     {
195       modelNode->RemoveModelPrimitive(*modelPrimitive);
196     }
197     CALL_CATCH_EXCEPTION();
198   }
199 }
200
201 SWIGEXPORT void SWIGSTDCALL CSharp_Dali_Model_Node_RemoveModelPrimitive2(void* csModelNode, unsigned int index)
202 {
203   Dali::Scene3D::ModelNode* modelNode = (Dali::Scene3D::ModelNode*)csModelNode;
204
205   if(!modelNode)
206   {
207     SWIG_CSharpSetPendingExceptionArgument(SWIG_CSharpArgumentNullException, "Attempt to dereference null Dali::Scene3D::ModelNode", 0);
208     return;
209   }
210   {
211     try
212     {
213       modelNode->RemoveModelPrimitive(index);
214     }
215     CALL_CATCH_EXCEPTION();
216   }
217 }
218
219 SWIGEXPORT void* SWIGSTDCALL CSharp_Dali_Model_Node_GetModelPrimitive(void* csModelNode, unsigned int index)
220 {
221   Dali::Scene3D::ModelNode* modelNode = (Dali::Scene3D::ModelNode*)csModelNode;
222   Dali::Scene3D::ModelPrimitive       result;
223
224   if(!modelNode)
225   {
226     SWIG_CSharpSetPendingExceptionArgument(SWIG_CSharpArgumentNullException, "Attempt to dereference null Dali::Scene3D::ModelNode", 0);
227     return nullptr;
228   }
229   {
230     try
231     {
232       result = modelNode->GetModelPrimitive(index);
233     }
234     CALL_CATCH_EXCEPTION(nullptr);
235   }
236   return new Dali::Scene3D::ModelPrimitive((const Dali::Scene3D::ModelPrimitive&)result);
237 }
238
239 SWIGEXPORT void* SWIGSTDCALL CSharp_Dali_Model_Node_FindChildModelNodeByName(void* csModelNode, char* nodeName)
240 {
241   Dali::Scene3D::ModelNode* modelNode = (Dali::Scene3D::ModelNode*)csModelNode;
242   Dali::Scene3D::ModelNode result;
243
244   if(!modelNode)
245   {
246     SWIG_CSharpSetPendingExceptionArgument(SWIG_CSharpArgumentNullException, "Attempt to dereference null Dali::Scene3D::ModelNode", 0);
247     return nullptr;
248   }
249   {
250     try
251     {
252       result = modelNode->FindChildModelNodeByName(nodeName);
253     }
254     CALL_CATCH_EXCEPTION(nullptr);
255   }
256   return new Dali::Scene3D::ModelNode((const Dali::Scene3D::ModelNode&)result);
257 }
258
259 SWIGEXPORT unsigned int SWIGSTDCALL CSharp_Dali_Model_Node_GetChildModelNodeCount(void* csModelNode)
260 {
261   Dali::Scene3D::ModelNode* modelNode = (Dali::Scene3D::ModelNode*)csModelNode;
262
263   if(!modelNode)
264   {
265     SWIG_CSharpSetPendingExceptionArgument(SWIG_CSharpArgumentNullException, "Attempt to dereference null Dali::Scene3D::ModelNode", 0);
266     return 0;
267   }
268   {
269     try
270     {
271       return modelNode->GetChildCount();
272     }
273     CALL_CATCH_EXCEPTION(0);
274   }
275 }
276
277 SWIGEXPORT void* SWIGSTDCALL CSharp_Dali_Model_Node_GetChildModelNodeAt(void* csModelNode, uint32_t index)
278 {
279   Dali::Scene3D::ModelNode* modelNode = (Dali::Scene3D::ModelNode*)csModelNode;
280   Dali::Scene3D::ModelNode result;
281
282   if(!modelNode)
283   {
284     SWIG_CSharpSetPendingExceptionArgument(SWIG_CSharpArgumentNullException, "Attempt to dereference null Dali::Scene3D::ModelNode", 0);
285     return nullptr;
286   }
287   {
288     try
289     {
290       Dali::Actor actor = modelNode->GetChildAt(index);
291       result = Dali::Scene3D::ModelNode::DownCast(actor);
292     }
293     CALL_CATCH_EXCEPTION(nullptr);
294   }
295   return new Dali::Scene3D::ModelNode((const Dali::Scene3D::ModelNode&)result);
296 }
297
298 SWIGEXPORT void SWIGSTDCALL CSharp_Dali_ModelNode_SetColliderMesh(void *modelNodePtr, void* vertexPtr, void* normalPtr, unsigned long vertexCount, void* indexPtr, unsigned long indexCount) {
299   Dali::Scene3D::ModelNode *modelNode = (Dali::Scene3D::ModelNode *) modelNodePtr;
300   auto vertices = reinterpret_cast<Dali::Vector3*>(vertexPtr);
301   auto normals = reinterpret_cast<Dali::Vector3*>(normalPtr);
302   auto indices = reinterpret_cast<uint32_t*>(indexPtr);
303
304   try {
305     auto colliderMesh = Dali::Scene3D::Loader::NavigationMeshFactory::CreateFromVertexFaceList(vertices, normals, vertexCount, indices, indexCount);
306     modelNode->SetColliderMesh(std::move(colliderMesh));
307   } CALL_CATCH_EXCEPTION();
308 }
309
310 #ifdef __cplusplus
311 }
312 #endif