| // Copyright 2017 The Chromium Authors. All rights reserved. |
| // Use of this source code is governed by a BSD-style license that can be |
| // found in the LICENSE file. |
| |
| #ifndef CHROME_BROWSER_VR_GLTF_PARSER_H_ |
| #define CHROME_BROWSER_VR_GLTF_PARSER_H_ |
| |
| #include <memory> |
| #include <string> |
| #include <unordered_map> |
| |
| #include "base/files/file_path.h" |
| #include "base/values.h" |
| #include "chrome/browser/vr/gltf_asset.h" |
| |
| namespace vr { |
| |
| // Parser for glTF 1.0 specification |
| // https://github.com/KhronosGroup/glTF/tree/master/specification/1.0 |
| // Supported objects are limited to: buffers, bufferViews, accessors, |
| // meshes (limited), nodes (limited), scenes (limited). |
| // Non-supported objects include: materials, techniques, skins, shaders, |
| // programs, animations, cameras, images, textures, extensions. |
| // This parser is not intended to be used on user or third-party data, |
| // but only on thoroughly tested Chromium resource files. |
| // TODO(acondor): Implement glTF 2.0 parser. gltf::Asset is mostly version |
| // agnostic. |
| class GltfParser { |
| public: |
| GltfParser(); |
| ~GltfParser(); |
| // Note: If your glTF references external files, this function will perform |
| // IO, and a base path must be specified. |
| std::unique_ptr<gltf::Asset> Parse( |
| const base::DictionaryValue& dict, |
| std::vector<std::unique_ptr<gltf::Buffer>>* buffers, |
| const base::FilePath& path = base::FilePath()); |
| // Note: This function will perform IO. |
| std::unique_ptr<gltf::Asset> Parse( |
| const base::FilePath& gltf_path, |
| std::vector<std::unique_ptr<gltf::Buffer>>* buffers); |
| |
| private: |
| bool ParseInternal(const base::DictionaryValue& dict, |
| std::vector<std::unique_ptr<gltf::Buffer>>* buffers); |
| bool SetBuffers(const base::DictionaryValue& dict, |
| std::vector<std::unique_ptr<gltf::Buffer>>* buffers); |
| bool SetBufferViews(const base::DictionaryValue& dict); |
| bool SetAccessors(const base::DictionaryValue& dict); |
| bool SetMeshes(const base::DictionaryValue& dict); |
| bool SetNodes(const base::DictionaryValue& dict); |
| bool SetScenes(const base::DictionaryValue& dict); |
| std::unique_ptr<gltf::Mesh::Primitive> ProcessPrimitive( |
| const base::DictionaryValue& dict); |
| std::unique_ptr<gltf::Buffer> ProcessUri(const std::string& uri_str); |
| void Clear(); |
| |
| std::unique_ptr<gltf::Asset> asset_; |
| base::FilePath path_; |
| std::unordered_map<std::string, std::size_t> buffer_ids_; |
| std::unordered_map<std::string, std::size_t> buffer_view_ids_; |
| std::unordered_map<std::string, std::size_t> accessor_ids_; |
| std::unordered_map<std::string, std::size_t> node_ids_; |
| std::unordered_map<std::string, std::size_t> mesh_ids_; |
| std::unordered_map<std::string, std::size_t> scene_ids_; |
| |
| DISALLOW_COPY_AND_ASSIGN(GltfParser); |
| }; |
| |
| class BinaryGltfParser { |
| public: |
| // Note: If your glTF references external files, this function will perform |
| // IO, and a base path must be specified. |
| static std::unique_ptr<gltf::Asset> Parse( |
| base::StringPiece glb_content, |
| std::vector<std::unique_ptr<gltf::Buffer>>* buffers, |
| const base::FilePath& path = base::FilePath()); |
| }; |
| |
| } // namespace vr |
| |
| #endif // CHROME_BROWSER_VR_GLTF_PARSER_H_ |