[dali_2.3.24] Merge branch 'devel/master'
[platform/core/uifw/dali-toolkit.git] / automated-tests / src / dali-scene3d / utc-Dali-MeshDefinition.cpp
index 377e68d..ba67d42 100644 (file)
@@ -1,5 +1,5 @@
 /*
- * Copyright (c) 2022 Samsung Electronics Co., Ltd.
+ * Copyright (c) 2023 Samsung Electronics Co., Ltd.
  *
  * Licensed under the Apache License, Version 2.0 (the "License");
  * you may not use this file except in compliance with the License.
@@ -17,7 +17,8 @@
 
 #include <vector>
 
-#include "dali-scene3d/public-api/loader/mesh-definition.h"
+#include <dali-scene3d/public-api/loader/buffer-definition.h>
+#include <dali-scene3d/public-api/loader/mesh-definition.h>
 #include <dali-test-suite-utils.h>
 
 using namespace Dali;
@@ -27,14 +28,14 @@ int UtcDaliMeshDefinitionBlobApplyMinMaxBothMinMaxApplied(void)
 {
   using Container = std::vector<float>;
 
-  Container buffer = { 4.0f, 6.0f, 8.0f, 10.0f, 12.0f };
-  Container minValues = { 5.0f };
-  Container maxValues = { 10.0f };
-  Container result = {5.0f, 6.0f, 8.0f, 10.0f, 10.0f};
+  Container buffer    = {4.0f, 6.0f, 8.0f, 10.0f, 12.0f};
+  Container minValues = {5.0f};
+  Container maxValues = {10.0f};
+  Container result    = {5.0f, 6.0f, 8.0f, 10.0f, 10.0f};
 
   MeshDefinition::Blob::ApplyMinMax(minValues, maxValues, 5, buffer.data());
 
-  for( auto i = 0u; i < result.size(); ++i)
+  for(auto i = 0u; i < result.size(); ++i)
   {
     DALI_TEST_EQUALS(buffer[i], result[i], TEST_LOCATION);
   }
@@ -46,14 +47,14 @@ int UtcDaliMeshDefinitionBlobApplyMinMaxOnlyMin(void)
 {
   using Container = std::vector<float>;
 
-  Container buffer = { 4.0f, 6.0f, 8.0f, 10.0f, 12.0f };
-  Container minValues = { 5.0f };
+  Container buffer    = {4.0f, 6.0f, 8.0f, 10.0f, 12.0f};
+  Container minValues = {5.0f};
   Container maxValues = {};
-  Container result = {5.0f, 6.0f, 8.0f, 10.0f, 12.0f};
+  Container result    = {5.0f, 6.0f, 8.0f, 10.0f, 12.0f};
 
   MeshDefinition::Blob::ApplyMinMax(minValues, maxValues, 5, buffer.data());
 
-  for( auto i = 0u; i < result.size(); ++i)
+  for(auto i = 0u; i < result.size(); ++i)
   {
     DALI_TEST_EQUALS(buffer[i], result[i], TEST_LOCATION);
   }
@@ -65,14 +66,14 @@ int UtcDaliMeshDefinitionBlobApplyMinMaxOnlyMax(void)
 {
   using Container = std::vector<float>;
 
-  Container buffer = { 4.0f, 6.0f, 8.0f, 10.0f, 12.0f };
-  Container minValues = { };
-  Container maxValues = { 10.0f };
-  Container result = {4.0f, 6.0f, 8.0f, 10.0f, 10.0f};
+  Container buffer    = {4.0f, 6.0f, 8.0f, 10.0f, 12.0f};
+  Container minValues = {};
+  Container maxValues = {10.0f};
+  Container result    = {4.0f, 6.0f, 8.0f, 10.0f, 10.0f};
 
   MeshDefinition::Blob::ApplyMinMax(minValues, maxValues, 5, buffer.data());
 
-  for( auto i = 0u; i < result.size(); ++i)
+  for(auto i = 0u; i < result.size(); ++i)
   {
     DALI_TEST_EQUALS(buffer[i], result[i], TEST_LOCATION);
   }
@@ -84,14 +85,14 @@ int UtcDaliMeshDefinitionBlobApplyMinMaxBothEmpty(void)
 {
   using Container = std::vector<float>;
 
-  Container buffer = { 4.0f, 6.0f, 8.0f, 10.0f, 12.0f };
+  Container buffer = {4.0f, 6.0f, 8.0f, 10.0f, 12.0f};
   Container minValues;
   Container maxValues;
   Container result = {4.0f, 6.0f, 8.0f, 10.0f, 12.0f};
 
   MeshDefinition::Blob::ApplyMinMax(minValues, maxValues, 5, buffer.data());
 
-  for( auto i = 0u; i < result.size(); ++i)
+  for(auto i = 0u; i < result.size(); ++i)
   {
     DALI_TEST_EQUALS(buffer[i], result[i], TEST_LOCATION);
   }
@@ -99,3 +100,76 @@ int UtcDaliMeshDefinitionBlobApplyMinMaxBothEmpty(void)
   END_TEST;
 }
 
+int UtcDaliMeshDefinitionByteSkinWeight(void)
+{
+  float data8[8] = {0.003922, 0.062745, 0.250980, 0.098039, 0.937255, 0.749020, 0.741176, 0.937255};
+
+  BufferDefinition bufferDefinition;
+  bufferDefinition.mUri        = "data:application/base64,ARBAGe+/ve+/vT9hc2RmYXNkZmFzZGZhc2RmYXNkZmE=";
+  bufferDefinition.mByteLength = 32;
+  BufferDefinition::Vector buffers;
+  buffers.push_back(std::move(bufferDefinition));
+
+  MeshDefinition meshDefinition;
+  meshDefinition.mFlags = MeshDefinition::U16_JOINT_IDS | MeshDefinition::U8_WEIGHT;
+  MeshDefinition::SparseBlob sparseBlob;
+  meshDefinition.mPositions =
+    MeshDefinition::Accessor{
+      std::move(MeshDefinition::Blob{0, 12, 0, (uint16_t)12, std::vector<float>(), std::vector<float>()}), std::move(sparseBlob), 0};
+  meshDefinition.mJoints.push_back(
+    MeshDefinition::Accessor{
+      std::move(MeshDefinition::Blob{0, 16, 0, (uint16_t)16, std::vector<float>(), std::vector<float>()}), std::move(sparseBlob), 0});
+  meshDefinition.mWeights.push_back(
+    MeshDefinition::Accessor{
+      std::move(MeshDefinition::Blob{0, 8, 0, (uint16_t)8, std::vector<float>(), std::vector<float>()}), std::move(sparseBlob), 0});
+
+  MeshDefinition::RawData rawData = meshDefinition.LoadRaw("", buffers);
+
+  DALI_TEST_EQUALS(rawData.mAttribs.size(), 4, TEST_LOCATION);
+  DALI_TEST_EQUALS(rawData.mAttribs[3].mName, "aWeights0", TEST_LOCATION);
+  DALI_TEST_EQUALS(rawData.mAttribs[3].mNumElements, 2, TEST_LOCATION);
+  float* value = reinterpret_cast<float*>(rawData.mAttribs[3].mData.data());
+  for(uint32_t i = 0; i < rawData.mAttribs[3].mNumElements * 4; ++i)
+  {
+    DALI_TEST_EQUALS(*value, data8[i], TEST_LOCATION);
+    value++;
+  }
+  END_TEST;
+}
+
+int UtcDaliMeshDefinitionShortSkinWeight(void)
+{
+  float data8[8] = {0.062516, 0.098634, 0.749752, 0.936492, 0.741207, 0.379873, 0.392386, 0.380468};
+
+  BufferDefinition bufferDefinition;
+  bufferDefinition.mUri        = "data:application/base64,ARBAGe+/ve+/vT9hc2RmYXNkZmFzZGZhc2RmYXNkZmE=";
+  bufferDefinition.mByteLength = 32;
+  BufferDefinition::Vector buffers;
+  buffers.push_back(std::move(bufferDefinition));
+
+  MeshDefinition meshDefinition;
+  meshDefinition.mFlags = MeshDefinition::U16_JOINT_IDS | MeshDefinition::U16_WEIGHT;
+  MeshDefinition::SparseBlob sparseBlob;
+  meshDefinition.mPositions =
+    MeshDefinition::Accessor{
+      std::move(MeshDefinition::Blob{0, 12, 0, (uint16_t)12, std::vector<float>(), std::vector<float>()}), std::move(sparseBlob), 0};
+  meshDefinition.mJoints.push_back(
+    MeshDefinition::Accessor{
+      std::move(MeshDefinition::Blob{0, 16, 0, (uint16_t)16, std::vector<float>(), std::vector<float>()}), std::move(sparseBlob), 0});
+  meshDefinition.mWeights.push_back(
+    MeshDefinition::Accessor{
+      std::move(MeshDefinition::Blob{0, 16, 0, (uint16_t)16, std::vector<float>(), std::vector<float>()}), std::move(sparseBlob), 0});
+
+  MeshDefinition::RawData rawData = meshDefinition.LoadRaw("", buffers);
+
+  DALI_TEST_EQUALS(rawData.mAttribs.size(), 4, TEST_LOCATION);
+  DALI_TEST_EQUALS(rawData.mAttribs[3].mName, "aWeights0", TEST_LOCATION);
+  DALI_TEST_EQUALS(rawData.mAttribs[3].mNumElements, 2, TEST_LOCATION);
+  float* value = reinterpret_cast<float*>(rawData.mAttribs[3].mData.data());
+  for(uint32_t i = 0; i < rawData.mAttribs[3].mNumElements * 4; ++i)
+  {
+    DALI_TEST_EQUALS(*value, data8[i], TEST_LOCATION);
+    value++;
+  }
+  END_TEST;
+}