[dali_2.3.21] Merge branch 'devel/master'
[platform/core/uifw/dali-toolkit.git] / automated-tests / src / dali-scene3d / utc-Dali-MeshDefinition.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 #include <vector>
19
20 #include <dali-scene3d/public-api/loader/buffer-definition.h>
21 #include <dali-scene3d/public-api/loader/mesh-definition.h>
22 #include <dali-test-suite-utils.h>
23
24 using namespace Dali;
25 using namespace Dali::Scene3D::Loader;
26
27 int UtcDaliMeshDefinitionBlobApplyMinMaxBothMinMaxApplied(void)
28 {
29   using Container = std::vector<float>;
30
31   Container buffer    = {4.0f, 6.0f, 8.0f, 10.0f, 12.0f};
32   Container minValues = {5.0f};
33   Container maxValues = {10.0f};
34   Container result    = {5.0f, 6.0f, 8.0f, 10.0f, 10.0f};
35
36   MeshDefinition::Blob::ApplyMinMax(minValues, maxValues, 5, buffer.data());
37
38   for(auto i = 0u; i < result.size(); ++i)
39   {
40     DALI_TEST_EQUALS(buffer[i], result[i], TEST_LOCATION);
41   }
42
43   END_TEST;
44 }
45
46 int UtcDaliMeshDefinitionBlobApplyMinMaxOnlyMin(void)
47 {
48   using Container = std::vector<float>;
49
50   Container buffer    = {4.0f, 6.0f, 8.0f, 10.0f, 12.0f};
51   Container minValues = {5.0f};
52   Container maxValues = {};
53   Container result    = {5.0f, 6.0f, 8.0f, 10.0f, 12.0f};
54
55   MeshDefinition::Blob::ApplyMinMax(minValues, maxValues, 5, buffer.data());
56
57   for(auto i = 0u; i < result.size(); ++i)
58   {
59     DALI_TEST_EQUALS(buffer[i], result[i], TEST_LOCATION);
60   }
61
62   END_TEST;
63 }
64
65 int UtcDaliMeshDefinitionBlobApplyMinMaxOnlyMax(void)
66 {
67   using Container = std::vector<float>;
68
69   Container buffer    = {4.0f, 6.0f, 8.0f, 10.0f, 12.0f};
70   Container minValues = {};
71   Container maxValues = {10.0f};
72   Container result    = {4.0f, 6.0f, 8.0f, 10.0f, 10.0f};
73
74   MeshDefinition::Blob::ApplyMinMax(minValues, maxValues, 5, buffer.data());
75
76   for(auto i = 0u; i < result.size(); ++i)
77   {
78     DALI_TEST_EQUALS(buffer[i], result[i], TEST_LOCATION);
79   }
80
81   END_TEST;
82 }
83
84 int UtcDaliMeshDefinitionBlobApplyMinMaxBothEmpty(void)
85 {
86   using Container = std::vector<float>;
87
88   Container buffer = {4.0f, 6.0f, 8.0f, 10.0f, 12.0f};
89   Container minValues;
90   Container maxValues;
91   Container result = {4.0f, 6.0f, 8.0f, 10.0f, 12.0f};
92
93   MeshDefinition::Blob::ApplyMinMax(minValues, maxValues, 5, buffer.data());
94
95   for(auto i = 0u; i < result.size(); ++i)
96   {
97     DALI_TEST_EQUALS(buffer[i], result[i], TEST_LOCATION);
98   }
99
100   END_TEST;
101 }
102
103 int UtcDaliMeshDefinitionByteSkinWeight(void)
104 {
105   float data8[8] = {0.003922, 0.062745, 0.250980, 0.098039, 0.937255, 0.749020, 0.741176, 0.937255};
106
107   BufferDefinition bufferDefinition;
108   bufferDefinition.mUri        = "data:application/base64,ARBAGe+/ve+/vT9hc2RmYXNkZmFzZGZhc2RmYXNkZmE=";
109   bufferDefinition.mByteLength = 32;
110   BufferDefinition::Vector buffers;
111   buffers.push_back(std::move(bufferDefinition));
112
113   MeshDefinition meshDefinition;
114   meshDefinition.mFlags = MeshDefinition::U16_JOINT_IDS | MeshDefinition::U8_WEIGHT;
115   MeshDefinition::SparseBlob sparseBlob;
116   meshDefinition.mPositions =
117     MeshDefinition::Accessor{
118       std::move(MeshDefinition::Blob{0, 12, 0, (uint16_t)12, std::vector<float>(), std::vector<float>()}), std::move(sparseBlob), 0};
119   meshDefinition.mJoints.push_back(
120     MeshDefinition::Accessor{
121       std::move(MeshDefinition::Blob{0, 16, 0, (uint16_t)16, std::vector<float>(), std::vector<float>()}), std::move(sparseBlob), 0});
122   meshDefinition.mWeights.push_back(
123     MeshDefinition::Accessor{
124       std::move(MeshDefinition::Blob{0, 8, 0, (uint16_t)8, std::vector<float>(), std::vector<float>()}), std::move(sparseBlob), 0});
125
126   MeshDefinition::RawData rawData = meshDefinition.LoadRaw("", buffers);
127
128   DALI_TEST_EQUALS(rawData.mAttribs.size(), 4, TEST_LOCATION);
129   DALI_TEST_EQUALS(rawData.mAttribs[3].mName, "aWeights0", TEST_LOCATION);
130   DALI_TEST_EQUALS(rawData.mAttribs[3].mNumElements, 2, TEST_LOCATION);
131   float* value = reinterpret_cast<float*>(rawData.mAttribs[3].mData.data());
132   for(uint32_t i = 0; i < rawData.mAttribs[3].mNumElements * 4; ++i)
133   {
134     DALI_TEST_EQUALS(*value, data8[i], TEST_LOCATION);
135     value++;
136   }
137   END_TEST;
138 }
139
140 int UtcDaliMeshDefinitionShortSkinWeight(void)
141 {
142   float data8[8] = {0.062516, 0.098634, 0.749752, 0.936492, 0.741207, 0.379873, 0.392386, 0.380468};
143
144   BufferDefinition bufferDefinition;
145   bufferDefinition.mUri        = "data:application/base64,ARBAGe+/ve+/vT9hc2RmYXNkZmFzZGZhc2RmYXNkZmE=";
146   bufferDefinition.mByteLength = 32;
147   BufferDefinition::Vector buffers;
148   buffers.push_back(std::move(bufferDefinition));
149
150   MeshDefinition meshDefinition;
151   meshDefinition.mFlags = MeshDefinition::U16_JOINT_IDS | MeshDefinition::U16_WEIGHT;
152   MeshDefinition::SparseBlob sparseBlob;
153   meshDefinition.mPositions =
154     MeshDefinition::Accessor{
155       std::move(MeshDefinition::Blob{0, 12, 0, (uint16_t)12, std::vector<float>(), std::vector<float>()}), std::move(sparseBlob), 0};
156   meshDefinition.mJoints.push_back(
157     MeshDefinition::Accessor{
158       std::move(MeshDefinition::Blob{0, 16, 0, (uint16_t)16, std::vector<float>(), std::vector<float>()}), std::move(sparseBlob), 0});
159   meshDefinition.mWeights.push_back(
160     MeshDefinition::Accessor{
161       std::move(MeshDefinition::Blob{0, 16, 0, (uint16_t)16, std::vector<float>(), std::vector<float>()}), std::move(sparseBlob), 0});
162
163   MeshDefinition::RawData rawData = meshDefinition.LoadRaw("", buffers);
164
165   DALI_TEST_EQUALS(rawData.mAttribs.size(), 4, TEST_LOCATION);
166   DALI_TEST_EQUALS(rawData.mAttribs[3].mName, "aWeights0", TEST_LOCATION);
167   DALI_TEST_EQUALS(rawData.mAttribs[3].mNumElements, 2, TEST_LOCATION);
168   float* value = reinterpret_cast<float*>(rawData.mAttribs[3].mData.data());
169   for(uint32_t i = 0; i < rawData.mAttribs[3].mNumElements * 4; ++i)
170   {
171     DALI_TEST_EQUALS(*value, data8[i], TEST_LOCATION);
172     value++;
173   }
174   END_TEST;
175 }