2 * Copyright (c) 2022 Samsung Electronics Co., Ltd.
\r
4 * Licensed under the Apache License, Version 2.0 (the "License");
\r
5 * you may not use this file except in compliance with the License.
\r
6 * You may obtain a copy of the License at
\r
8 * http://www.apache.org/licenses/LICENSE-2.0
\r
10 * Unless required by applicable law or agreed to in writing, software
\r
11 * distributed under the License is distributed on an "AS IS" BASIS,
\r
12 * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
\r
13 * See the License for the specific language governing permissions and
\r
14 * limitations under the License.
\r
18 // INTERNAL INCLUDES
\r
19 #include <dali-scene3d/internal/loader/gltf2-asset.h>
\r
20 #include <dali-scene3d/internal/loader/json-reader.h>
\r
21 #include <dali-scene3d/public-api/loader/load-scene-metadata.h>
\r
22 #include <dali-scene3d/public-api/loader/utils.h>
\r
24 namespace js = json;
\r
25 namespace gt = gltf2;
\r
27 namespace Dali::Scene3D::Loader
\r
38 BOX = Dali::SamplingMode::BOX,
\r
39 NEAREST = Dali::SamplingMode::NEAREST,
\r
40 LINEAR = Dali::SamplingMode::LINEAR,
\r
41 BOX_THEN_NEAREST = Dali::SamplingMode::BOX_THEN_NEAREST,
\r
42 BOX_THEN_LINEAR = Dali::SamplingMode::BOX_THEN_LINEAR,
\r
43 NO_FILTER = Dali::SamplingMode::NO_FILTER,
\r
44 DONT_CARE = Dali::SamplingMode::DONT_CARE
\r
47 static Type FromString(const char* s, size_t len);
\r
50 std::string mImageUri{}; ///< The URI of the image
\r
51 uint16_t mMinWidth{}; ///< The minimum width of the image
\r
52 uint16_t mMinHeight{}; ///< The mimimum height of the image
\r
54 ImageData::SamplingMode::Type mSamplingMode{ImageData::SamplingMode::BOX_THEN_LINEAR}; ///< The sampling mode used to resize the image.
\r
57 const std::map<std::string_view, ImageData::SamplingMode::Type> SAMPLING_MODE_TYPES{
\r
58 ENUM_STRING_MAPPING(ImageData::SamplingMode, BOX),
\r
59 ENUM_STRING_MAPPING(ImageData::SamplingMode, NEAREST),
\r
60 ENUM_STRING_MAPPING(ImageData::SamplingMode, LINEAR),
\r
61 ENUM_STRING_MAPPING(ImageData::SamplingMode, BOX_THEN_NEAREST),
\r
62 ENUM_STRING_MAPPING(ImageData::SamplingMode, BOX_THEN_LINEAR),
\r
63 ENUM_STRING_MAPPING(ImageData::SamplingMode, NO_FILTER),
\r
64 ENUM_STRING_MAPPING(ImageData::SamplingMode, DONT_CARE),
\r
67 ENUM_TYPE_FROM_STRING(ImageData::SamplingMode, SAMPLING_MODE_TYPES)
\r
71 std::vector<ImageData> mImageData;
\r
74 const auto IMAGE_METADATA_READER = std::move(js::Reader<ImageData>()
\r
75 .Register(*js::MakeProperty("uri", js::Read::String, &ImageData::mImageUri))
\r
76 .Register(*js::MakeProperty("minWidth", js::Read::Number, &ImageData::mMinWidth))
\r
77 .Register(*js::MakeProperty("minHeight", js::Read::Number, &ImageData::mMinHeight))
\r
78 .Register(*js::MakeProperty("samplingMode", gt::ReadStringEnum<ImageData::SamplingMode>, &ImageData::mSamplingMode)));
\r
80 const auto METADATA_READER = std::move(js::Reader<MetaData>()
\r
81 .Register(*js::MakeProperty("images", js::Read::Array<ImageData, js::ObjectReader<ImageData>::Read>, &MetaData::mImageData)));
\r
85 void LoadSceneMetadata(const std::string& url, SceneMetadata& sceneMetadata)
\r
87 bool failed = false;
\r
88 auto js = LoadTextFile(url.c_str(), &failed);
\r
94 json::unique_ptr root(json_parse(js.c_str(), js.size()));
\r
97 throw std::runtime_error("Failed to parse " + url);
\r
99 auto& rootObj = js::Cast<json_object_s>(*root);
\r
101 static bool setObjectReaders = true;
\r
102 if(setObjectReaders)
\r
104 js::SetObjectReader(IMAGE_METADATA_READER);
\r
106 setObjectReaders = false;
\r
110 METADATA_READER.Read(rootObj, metaData);
\r
112 sceneMetadata.mImageMetadata.reserve(metaData.mImageData.size() + metaData.mImageData.size());
\r
113 for(auto&& data : metaData.mImageData)
\r
115 if(data.mSamplingMode == ImageData::SamplingMode::INVALID)
\r
117 throw std::runtime_error("Sampling mode type unsupported.");
\r
121 sceneMetadata.mImageMetadata.insert({data.mImageUri, ImageMetadata{ImageDimensions(data.mMinWidth, data.mMinHeight), static_cast<Dali::SamplingMode::Type>(data.mSamplingMode)}});
\r
126 } // namespace Dali::Scene3D::Loader
\r