/* * Copyright (c) 2020 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. * You may obtain a copy of the License at * * http://www.apache.org/licenses/LICENSE-2.0 * * Unless required by applicable law or agreed to in writing, software * distributed under the License is distributed on an "AS IS" BASIS, * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. * See the License for the specific language governing permissions and * limitations under the License. * */ #ifndef GLTF_SCENE_H #define GLTF_SCENE_H #include #include #include "pico-json.h" #define GLTF_LOG(...) {DALI_LOG_ERROR( __VA_ARGS__ );} enum class glTFAttributeType { POSITION = 0, NORMAL = 1, TEXCOORD_0 = 2, UNDEFINED, }; struct glTF_Camera { std::string name; // perspective setup float yfov; float zfar; float znear; bool isPerspective; }; struct glTF_BufferView { uint32_t bufferIndex; uint32_t byteLength; uint32_t byteOffset; void* data; }; struct glTF_Accessor { uint32_t bufferView; uint32_t componentType; uint32_t count; uint32_t componentSize; std::string type; }; struct glTF_Mesh { std::string name; std::vector> attributes; uint32_t indices; uint32_t material; }; struct glTF_Texture { std::string uri; std::string name; }; struct glTF_Material { bool doubleSided; std::string name; struct pbrMetallicRoughness { bool enabled {false}; struct baseTextureColor { uint32_t index; uint32_t texCoord; } baseTextureColor; } pbrMetallicRoughness; }; struct glTF_Node { uint32_t index{0u}; std::string name{}; uint32_t meshId { 0xffffffff }; uint32_t cameraId{ 0xffffffff }; glTF_Node* parent { nullptr }; std::vector children {}; // Transform float rotationQuaternion[4] = { 0.0f, 0.0f, 0.0f, 1.0f }; float translation[3] = { 0.0f, 0.0f, 0.0f }; float scale[3] = { 1.0f, 1.0f, 1.0f }; }; using glTF_Buffer = std::vector; /** * Simple glTF parser * * This implementation requires 2 files (it doesn't decode Base64 embedded in json) */ struct glTF { glTF( const std::string& filename ); ~glTF() = default; std::vector GetMeshes() const; std::vector GetCameras(); const std::vector& GetMaterials() const; const std::vector& GetTextures() const; const std::vector& GetNodes() const { return mNodes; } /** * MESH interface */ /** * Returns a copy of attribute buffer * @return */ std::vector GetMeshAttributeBuffer( const glTF_Mesh& mesh, const std::vector& attrTypes ); uint32_t GetMeshAttributeCount( const glTF_Mesh* mesh ) const; const glTF_Mesh* FindMeshByName( const std::string& name ) const; /** * Returns a copy of index buffer * @return */ std::vector GetMeshIndexBuffer( const glTF_Mesh* mesh ) const; const glTF_Node* FindNodeByName( const std::string& name ) const; private: void LoadFromFile( const std::string& filename ); glTF_Buffer LoadFile( const std::string& filename ); bool ParseJSON(); std::vector mMeshes; std::vector mCameras; std::vector mBufferViews; std::vector mAccessors; std::vector mNodes; std::vector mMaterials; std::vector mTextures; glTF_Buffer mBuffer; glTF_Buffer jsonBuffer; // json nodes picojson::value jsonNode; }; #endif //DALI_CMAKE_GLTF_SCENE_H