Merge pull request #57660 from V-Sekai/gltf-extension-fixes

This commit is contained in:
Rémi Verschelde 2022-05-20 18:50:53 +02:00 committed by GitHub
commit 410893ad0f
No known key found for this signature in database
GPG Key ID: 4AEE18F83AFDEB23
13 changed files with 241 additions and 179 deletions

View File

@ -7,65 +7,52 @@
<tutorials>
</tutorials>
<methods>
<method name="export_post">
<return type="int" enum="Error" />
<argument index="0" name="document" type="GLTFDocument" />
<method name="_export_node" qualifiers="virtual">
<return type="int" />
<argument index="0" name="state" type="GLTFState" />
<argument index="1" name="gltf_node" type="GLTFNode" />
<argument index="2" name="json" type="Dictionary" />
<argument index="3" name="node" type="Node" />
<description>
</description>
</method>
<method name="export_preflight">
<return type="int" enum="Error" />
<argument index="0" name="document" type="GLTFDocument" />
<argument index="1" name="node" type="Node" />
<method name="_export_post" qualifiers="virtual">
<return type="int" />
<argument index="0" name="state" type="GLTFState" />
<description>
</description>
</method>
<method name="get_export_setting" qualifiers="const">
<return type="Variant" />
<argument index="0" name="key" type="StringName" />
<method name="_export_preflight" qualifiers="virtual">
<return type="int" />
<argument index="0" name="root" type="Node" />
<description>
</description>
</method>
<method name="get_export_setting_keys" qualifiers="const">
<return type="Array" />
<method name="_import_node" qualifiers="virtual">
<return type="int" />
<argument index="0" name="state" type="GLTFState" />
<argument index="1" name="gltf_node" type="GLTFNode" />
<argument index="2" name="json" type="Dictionary" />
<argument index="3" name="node" type="Node" />
<description>
</description>
</method>
<method name="get_import_setting" qualifiers="const">
<return type="Variant" />
<argument index="0" name="key" type="StringName" />
<method name="_import_post" qualifiers="virtual">
<return type="int" />
<argument index="0" name="state" type="GLTFState" />
<argument index="1" name="root" type="Node" />
<description>
</description>
</method>
<method name="get_import_setting_keys" qualifiers="const">
<return type="Array" />
<method name="_import_post_parse" qualifiers="virtual">
<return type="int" />
<argument index="0" name="state" type="GLTFState" />
<description>
</description>
</method>
<method name="import_post">
<return type="int" enum="Error" />
<argument index="0" name="document" type="GLTFDocument" />
<argument index="1" name="node" type="Node" />
<description>
</description>
</method>
<method name="import_preflight">
<return type="int" enum="Error" />
<argument index="0" name="document" type="GLTFDocument" />
<description>
</description>
</method>
<method name="set_export_setting">
<return type="void" />
<argument index="0" name="key" type="StringName" />
<argument index="1" name="value" type="Variant" />
<description>
</description>
</method>
<method name="set_import_setting">
<return type="void" />
<argument index="0" name="key" type="StringName" />
<argument index="1" name="value" type="Variant" />
<method name="_import_preflight" qualifiers="virtual">
<return type="int" />
<argument index="0" name="state" type="GLTFState" />
<description>
</description>
</method>

View File

@ -192,6 +192,8 @@
</method>
</methods>
<members>
<member name="base_path" type="String" setter="set_base_path" getter="get_base_path" default="&quot;&quot;">
</member>
<member name="buffers" type="Array" setter="set_buffers" getter="get_buffers" default="[]">
</member>
<member name="glb_data" type="PackedByteArray" setter="set_glb_data" getter="get_glb_data" default="PackedByteArray()">

View File

@ -35,7 +35,6 @@
#include "../gltf_document.h"
#include "../gltf_state.h"
#include "scene/main/node.h"
#include "scene/resources/animation.h"
uint32_t EditorSceneFormatImporterGLTF::get_import_flags() const {

View File

@ -33,6 +33,9 @@
#ifdef TOOLS_ENABLED
#include "../gltf_document_extension.h"
#include "../gltf_state.h"
#include "editor/import/resource_importer_scene.h"
class Animation;

View File

@ -34,7 +34,6 @@
#include "core/io/resource.h"
#include "gltf_document.h"
#include "gltf_document_extension.h"
struct GLTFAccessor : public Resource {
GDCLASS(GLTFAccessor, Resource);

View File

@ -128,10 +128,10 @@ Error GLTFDocument::_serialize(Ref<GLTFState> state, const String &p_path) {
state->buffers.push_back(Vector<uint8_t>());
}
/* STEP 1 CONVERT MESH INSTANCES */
/* STEP CONVERT MESH INSTANCES */
_convert_mesh_instances(state);
/* STEP 2 SERIALIZE CAMERAS */
/* STEP SERIALIZE CAMERAS */
Error err = _serialize_cameras(state);
if (err != OK) {
return Error::FAILED;
@ -143,37 +143,37 @@ Error GLTFDocument::_serialize(Ref<GLTFState> state, const String &p_path) {
return Error::FAILED;
}
/* STEP 5 SERIALIZE MESHES (we have enough info now) */
/* STEP SERIALIZE MESHES (we have enough info now) */
err = _serialize_meshes(state);
if (err != OK) {
return Error::FAILED;
}
/* STEP 6 SERIALIZE TEXTURES */
/* STEP SERIALIZE TEXTURES */
err = _serialize_materials(state);
if (err != OK) {
return Error::FAILED;
}
/* STEP 7 SERIALIZE ANIMATIONS */
/* STEP SERIALIZE ANIMATIONS */
err = _serialize_animations(state);
if (err != OK) {
return Error::FAILED;
}
/* STEP 8 SERIALIZE ACCESSORS */
/* STEP SERIALIZE ACCESSORS */
err = _encode_accessors(state);
if (err != OK) {
return Error::FAILED;
}
/* STEP 9 SERIALIZE IMAGES */
/* STEP SERIALIZE IMAGES */
err = _serialize_images(state, p_path);
if (err != OK) {
return Error::FAILED;
}
/* STEP 10 SERIALIZE TEXTURES */
/* STEP SERIALIZE TEXTURES */
err = _serialize_textures(state);
if (err != OK) {
return Error::FAILED;
@ -183,42 +183,49 @@ Error GLTFDocument::_serialize(Ref<GLTFState> state, const String &p_path) {
state->buffer_views.write[i]->buffer = 0;
}
/* STEP 11 SERIALIZE BUFFER VIEWS */
/* STEP SERIALIZE BUFFER VIEWS */
err = _encode_buffer_views(state);
if (err != OK) {
return Error::FAILED;
}
/* STEP 12 SERIALIZE NODES */
/* STEP SERIALIZE NODES */
err = _serialize_nodes(state);
if (err != OK) {
return Error::FAILED;
}
/* STEP 13 SERIALIZE SCENE */
/* STEP SERIALIZE SCENE */
err = _serialize_scenes(state);
if (err != OK) {
return Error::FAILED;
}
/* STEP 14 SERIALIZE SCENE */
/* STEP SERIALIZE SCENE */
err = _serialize_lights(state);
if (err != OK) {
return Error::FAILED;
}
/* STEP 15 SERIALIZE EXTENSIONS */
/* STEP SERIALIZE EXTENSIONS */
err = _serialize_extensions(state);
if (err != OK) {
return Error::FAILED;
}
/* STEP 16 SERIALIZE VERSION */
/* STEP SERIALIZE VERSION */
err = _serialize_version(state);
if (err != OK) {
return Error::FAILED;
}
for (int32_t ext_i = 0; ext_i < document_extensions.size(); ext_i++) {
Ref<GLTFDocumentExtension> ext = document_extensions[ext_i];
ERR_CONTINUE(ext.is_null());
err = ext->export_post(state);
ERR_FAIL_COND_V(err != OK, err);
}
return OK;
}
@ -442,6 +449,15 @@ Error GLTFDocument::_serialize_nodes(Ref<GLTFState> state) {
}
node["children"] = children;
}
for (int32_t ext_i = 0; ext_i < document_extensions.size(); ext_i++) {
Ref<GLTFDocumentExtension> ext = document_extensions[ext_i];
ERR_CONTINUE(ext.is_null());
ERR_CONTINUE(!state->scene_nodes.find(i));
Error err = ext->export_node(state, n, state->json, state->scene_nodes[i]);
ERR_CONTINUE(err != OK);
}
nodes.push_back(node);
}
state->json["nodes"] = nodes;
@ -5658,7 +5674,7 @@ void GLTFDocument::_generate_scene_node(Ref<GLTFState> state, Node *scene_parent
if (!current_node) {
current_node = _generate_spatial(state, node_index);
}
scene_parent->add_child(current_node);
scene_parent->add_child(current_node, true);
if (current_node != scene_root) {
current_node->set_owner(scene_root);
}
@ -6642,8 +6658,8 @@ Error GLTFDocument::_parse(Ref<GLTFState> state, String p_path, Ref<FileAccess>
for (int32_t ext_i = 0; ext_i < document_extensions.size(); ext_i++) {
Ref<GLTFDocumentExtension> ext = document_extensions[ext_i];
ERR_CONTINUE(ext.is_null());
err = ext->import_preflight(this);
ERR_FAIL_COND_V(err != OK, FAILED);
err = ext->import_preflight(state);
ERR_FAIL_COND_V(err != OK, err);
}
err = _parse_gltf_state(state, p_path, p_bake_fps);
ERR_FAIL_COND_V(err != OK, err);
@ -6870,12 +6886,10 @@ PackedByteArray GLTFDocument::generate_buffer(Ref<GLTFState> state) {
Error GLTFDocument::write_to_filesystem(Ref<GLTFState> state, const String &p_path) {
ERR_FAIL_NULL_V(state, ERR_INVALID_PARAMETER);
Error err = _serialize(state, p_path);
if (err != OK) {
return err;
}
err = _serialize_file(state, p_path);
if (err != OK) {
return Error::FAILED;
@ -6886,6 +6900,7 @@ Error GLTFDocument::write_to_filesystem(Ref<GLTFState> state, const String &p_pa
Node *GLTFDocument::generate_scene(Ref<GLTFState> state, int32_t p_bake_fps) {
ERR_FAIL_NULL_V(state, nullptr);
ERR_FAIL_INDEX_V(0, state->root_nodes.size(), nullptr);
Error err = OK;
GLTFNodeIndex gltf_root = state->root_nodes.write[0];
Node *gltf_root_node = state->get_scene_node(gltf_root);
Node *root = gltf_root_node->get_parent();
@ -6899,12 +6914,26 @@ Node *GLTFDocument::generate_scene(Ref<GLTFState> state, int32_t p_bake_fps) {
_import_animation(state, ap, i, p_bake_fps);
}
}
for (KeyValue<GLTFNodeIndex, Node *> E : state->scene_nodes) {
ERR_CONTINUE(!E.value);
for (int32_t ext_i = 0; ext_i < document_extensions.size(); ext_i++) {
Ref<GLTFDocumentExtension> ext = document_extensions[ext_i];
ERR_CONTINUE(ext.is_null());
ERR_CONTINUE(!state->json.has("nodes"));
Array nodes = state->json["nodes"];
ERR_CONTINUE(E.key >= nodes.size());
ERR_CONTINUE(E.key < 0);
Dictionary node_json = nodes[E.key];
Ref<GLTFNode> gltf_node = state->nodes[E.key];
err = ext->import_node(state, gltf_node, node_json, E.value);
ERR_CONTINUE(err != OK);
}
}
for (int32_t ext_i = 0; ext_i < document_extensions.size(); ext_i++) {
Ref<GLTFDocumentExtension> ext = document_extensions[ext_i];
ERR_CONTINUE(ext.is_null());
Error err = ext->import_post(this, root);
ERR_FAIL_COND_V(err != OK, nullptr);
err = ext->import_post(state, root);
ERR_CONTINUE(err != OK);
}
ERR_FAIL_NULL_V(root, nullptr);
return root;
@ -6919,13 +6948,23 @@ Error GLTFDocument::append_from_scene(Node *p_node, Ref<GLTFState> state, uint32
if (!state->buffers.size()) {
state->buffers.push_back(Vector<uint8_t>());
}
for (int32_t ext_i = 0; ext_i < document_extensions.size(); ext_i++) {
Ref<GLTFDocumentExtension> ext = document_extensions[ext_i];
ERR_CONTINUE(ext.is_null());
}
/* STEP 1 CONVERT MESH INSTANCES */
_convert_mesh_instances(state);
for (int32_t ext_i = 0; ext_i < document_extensions.size(); ext_i++) {
Ref<GLTFDocumentExtension> ext = document_extensions[ext_i];
ERR_CONTINUE(ext.is_null());
Error err = ext->export_preflight(p_node);
ERR_FAIL_COND_V(err != OK, FAILED);
}
_convert_scene_node(state, p_node, -1, -1);
if (!state->buffers.size()) {
state->buffers.push_back(Vector<uint8_t>());
}
/* STEP 2 CREATE SKINS */
Error err = _serialize_skins(state);
return err;
return OK;
}
Error GLTFDocument::append_from_buffer(PackedByteArray p_bytes, String p_base_path, Ref<GLTFState> state, uint32_t p_flags, int32_t p_bake_fps) {
@ -6938,8 +6977,15 @@ Error GLTFDocument::append_from_buffer(PackedByteArray p_bytes, String p_base_pa
Ref<FileAccessMemory> file_access;
file_access.instantiate();
file_access->open_custom(p_bytes.ptr(), p_bytes.size());
err = _parse(state, p_base_path.get_base_dir(), file_access, p_bake_fps);
ERR_FAIL_COND_V(err != OK, FAILED);
state->base_path = p_base_path.get_base_dir();
err = _parse(state, state->base_path, file_access, p_bake_fps);
ERR_FAIL_COND_V(err != OK, err);
for (int32_t ext_i = 0; ext_i < document_extensions.size(); ext_i++) {
Ref<GLTFDocumentExtension> ext = document_extensions[ext_i];
ERR_CONTINUE(ext.is_null());
err = ext->import_post_parse(state);
ERR_FAIL_COND_V(err != OK, err);
}
return OK;
}
@ -7030,6 +7076,7 @@ Error GLTFDocument::_parse_gltf_state(Ref<GLTFState> state, const String &p_sear
for (int32_t root_i = 0; root_i < state->root_nodes.size(); root_i++) {
_generate_scene_node(state, root, root, state->root_nodes[root_i]);
}
return OK;
}
@ -7049,9 +7096,16 @@ Error GLTFDocument::append_from_file(String p_path, Ref<GLTFState> r_state, uint
if (base_path.is_empty()) {
base_path = p_path.get_base_dir();
}
r_state->base_path = base_path;
err = _parse(r_state, base_path, f, p_bake_fps);
ERR_FAIL_COND_V(err != OK, ERR_PARSE_ERROR);
return err;
ERR_FAIL_COND_V(err != OK, err);
for (int32_t ext_i = 0; ext_i < document_extensions.size(); ext_i++) {
Ref<GLTFDocumentExtension> ext = document_extensions[ext_i];
ERR_CONTINUE(ext.is_null());
err = ext->import_post_parse(r_state);
ERR_FAIL_COND_V(err != OK, err);
}
return OK;
}
Error GLTFDocument::_parse_gltf_extensions(Ref<GLTFState> state) {

View File

@ -33,19 +33,12 @@
#include "gltf_animation.h"
#include "core/error/error_list.h"
#include "core/variant/dictionary.h"
#include "core/variant/variant.h"
#include "gltf_document_extension_convert_importer_mesh.h"
#include "scene/3d/bone_attachment_3d.h"
#include "scene/3d/importer_mesh_instance_3d.h"
#include "scene/3d/light_3d.h"
#include "scene/3d/mesh_instance_3d.h"
#include "scene/3d/node_3d.h"
#include "scene/3d/skeleton_3d.h"
#include "scene/animation/animation_player.h"
#include "scene/resources/material.h"
#include "scene/resources/texture.h"
#include "modules/modules_enabled.gen.h" // For csg, gridmap.

View File

@ -30,59 +30,79 @@
#include "gltf_document_extension.h"
#include "gltf_document.h"
void GLTFDocumentExtension::_bind_methods() {
// Import
ClassDB::bind_method(D_METHOD("get_import_setting_keys"),
&GLTFDocumentExtension::get_import_setting_keys);
ClassDB::bind_method(D_METHOD("import_preflight", "document"),
&GLTFDocumentExtension::import_preflight);
ClassDB::bind_method(D_METHOD("get_import_setting", "key"),
&GLTFDocumentExtension::get_import_setting);
ClassDB::bind_method(D_METHOD("set_import_setting", "key", "value"),
&GLTFDocumentExtension::set_import_setting);
ClassDB::bind_method(D_METHOD("import_post", "document", "node"),
&GLTFDocumentExtension::import_post);
// Export
ClassDB::bind_method(D_METHOD("get_export_setting_keys"),
&GLTFDocumentExtension::get_export_setting_keys);
ClassDB::bind_method(D_METHOD("get_export_setting", "key"),
&GLTFDocumentExtension::get_export_setting);
ClassDB::bind_method(D_METHOD("set_export_setting", "key", "value"),
&GLTFDocumentExtension::set_export_setting);
ClassDB::bind_method(D_METHOD("export_preflight", "document", "node"),
&GLTFDocumentExtension::export_preflight);
ClassDB::bind_method(D_METHOD("export_post", "document"),
&GLTFDocumentExtension::export_post);
GDVIRTUAL_BIND(_import_preflight, "state");
GDVIRTUAL_BIND(_import_post_parse, "state");
GDVIRTUAL_BIND(_import_node, "state", "gltf_node", "json", "node");
GDVIRTUAL_BIND(_import_post, "state", "root");
GDVIRTUAL_BIND(_export_preflight, "root");
GDVIRTUAL_BIND(_export_node, "state", "gltf_node", "json", "node");
GDVIRTUAL_BIND(_export_post, "state");
}
Array GLTFDocumentExtension::get_import_setting_keys() const {
return import_settings.keys();
}
Variant GLTFDocumentExtension::get_import_setting(const StringName &p_key) const {
if (!import_settings.has(p_key)) {
return Variant();
Error GLTFDocumentExtension::import_post(Ref<GLTFState> p_state, Node *p_root) {
ERR_FAIL_NULL_V(p_root, ERR_INVALID_PARAMETER);
ERR_FAIL_NULL_V(p_state, ERR_INVALID_PARAMETER);
int err = OK;
if (GDVIRTUAL_CALL(_import_post, p_state, p_root, err)) {
return Error(err);
}
return import_settings[p_key];
return OK;
}
void GLTFDocumentExtension::set_import_setting(const StringName &p_key, Variant p_var) {
import_settings[p_key] = p_var;
}
Array GLTFDocumentExtension::get_export_setting_keys() const {
return import_settings.keys();
}
Variant GLTFDocumentExtension::get_export_setting(const StringName &p_key) const {
if (!import_settings.has(p_key)) {
return Variant();
Error GLTFDocumentExtension::import_preflight(Ref<GLTFState> p_state) {
ERR_FAIL_NULL_V(p_state, ERR_INVALID_PARAMETER);
int err = OK;
if (GDVIRTUAL_CALL(_import_preflight, p_state, err)) {
return Error(err);
}
return import_settings[p_key];
return OK;
}
void GLTFDocumentExtension::set_export_setting(const StringName &p_key, Variant p_var) {
import_settings[p_key] = p_var;
Error GLTFDocumentExtension::import_post_parse(Ref<GLTFState> p_state) {
ERR_FAIL_NULL_V(p_state, ERR_INVALID_PARAMETER);
int err = OK;
if (GDVIRTUAL_CALL(_import_post_parse, p_state, err)) {
return Error(err);
}
return OK;
}
Error GLTFDocumentExtension::export_post(Ref<GLTFState> p_state) {
ERR_FAIL_NULL_V(p_state, ERR_INVALID_PARAMETER);
int err = OK;
if (GDVIRTUAL_CALL(_export_post, p_state, err)) {
return Error(err);
}
return OK;
}
Error GLTFDocumentExtension::export_preflight(Node *p_root) {
ERR_FAIL_NULL_V(p_root, ERR_INVALID_PARAMETER);
int err = OK;
if (GDVIRTUAL_CALL(_export_preflight, p_root, err)) {
return Error(err);
}
return OK;
}
Error GLTFDocumentExtension::import_node(Ref<GLTFState> p_state, Ref<GLTFNode> p_gltf_node, Dictionary &r_dict, Node *p_node) {
ERR_FAIL_NULL_V(p_state, ERR_INVALID_PARAMETER);
ERR_FAIL_NULL_V(p_gltf_node, ERR_INVALID_PARAMETER);
ERR_FAIL_NULL_V(p_node, ERR_INVALID_PARAMETER);
int err = OK;
if (GDVIRTUAL_CALL(_import_node, p_state, p_gltf_node, r_dict, p_node, err)) {
return Error(err);
}
return OK;
}
Error GLTFDocumentExtension::export_node(Ref<GLTFState> p_state, Ref<GLTFNode> p_gltf_node, Dictionary &r_dict, Node *p_node) {
ERR_FAIL_NULL_V(p_state, ERR_INVALID_PARAMETER);
ERR_FAIL_NULL_V(p_gltf_node, ERR_INVALID_PARAMETER);
ERR_FAIL_NULL_V(p_node, ERR_INVALID_PARAMETER);
int err = OK;
if (GDVIRTUAL_CALL(_export_node, p_state, p_gltf_node, r_dict, p_node, err)) {
return Error(err);
}
return OK;
}

View File

@ -31,33 +31,31 @@
#ifndef GLTF_DOCUMENT_EXTENSION_H
#define GLTF_DOCUMENT_EXTENSION_H
#include "core/io/resource.h"
#include "core/variant/dictionary.h"
#include "core/variant/typed_array.h"
#include "core/variant/variant.h"
class GLTFDocument;
#include "gltf_accessor.h"
#include "gltf_node.h"
#include "gltf_state.h"
class GLTFDocumentExtension : public Resource {
GDCLASS(GLTFDocumentExtension, Resource);
Dictionary import_settings;
Dictionary export_settings;
protected:
static void _bind_methods();
public:
virtual Array get_import_setting_keys() const;
virtual Variant get_import_setting(const StringName &p_key) const;
virtual void set_import_setting(const StringName &p_key, Variant p_var);
virtual Error import_preflight(Ref<GLTFDocument> p_document) { return OK; }
virtual Error import_post(Ref<GLTFDocument> p_document, Node *p_node) { return OK; }
public:
virtual Array get_export_setting_keys() const;
virtual Variant get_export_setting(const StringName &p_key) const;
virtual void set_export_setting(const StringName &p_key, Variant p_var);
virtual Error export_preflight(Ref<GLTFDocument> p_document, Node *p_node) { return OK; }
virtual Error export_post(Ref<GLTFDocument> p_document) { return OK; }
virtual Error import_preflight(Ref<GLTFState> p_state);
virtual Error import_post_parse(Ref<GLTFState> p_state);
virtual Error export_post(Ref<GLTFState> p_state);
virtual Error import_post(Ref<GLTFState> p_state, Node *p_node);
virtual Error export_preflight(Node *p_state);
virtual Error import_node(Ref<GLTFState> p_state, Ref<GLTFNode> p_gltf_node, Dictionary &r_json, Node *p_node);
virtual Error export_node(Ref<GLTFState> p_state, Ref<GLTFNode> p_gltf_node, Dictionary &r_json, Node *p_node);
GDVIRTUAL1R(int, _import_preflight, Ref<GLTFState>);
GDVIRTUAL1R(int, _import_post_parse, Ref<GLTFState>);
GDVIRTUAL4R(int, _import_node, Ref<GLTFState>, Ref<GLTFNode>, Dictionary, Node *);
GDVIRTUAL2R(int, _import_post, Ref<GLTFState>, Node *);
GDVIRTUAL1R(int, _export_preflight, Node *);
GDVIRTUAL4R(int, _export_node, Ref<GLTFState>, Ref<GLTFNode>, Dictionary, Node *);
GDVIRTUAL1R(int, _export_post, Ref<GLTFState>);
};
#endif // GLTF_DOCUMENT_EXTENSION_H

View File

@ -29,41 +29,40 @@
/*************************************************************************/
#include "gltf_document_extension_convert_importer_mesh.h"
#include "gltf_state.h"
#include "core/error/error_macros.h"
#include "scene/3d/mesh_instance_3d.h"
#include "scene/resources/importer_mesh.h"
#include <cstddef>
void GLTFDocumentExtensionConvertImporterMesh::_bind_methods() {
}
Error GLTFDocumentExtensionConvertImporterMesh::import_post(Ref<GLTFDocument> p_document, Node *p_node) {
ERR_FAIL_NULL_V(p_document, ERR_INVALID_PARAMETER);
ERR_FAIL_NULL_V(p_node, ERR_INVALID_PARAMETER);
Error GLTFDocumentExtensionConvertImporterMesh::import_post(Ref<GLTFState> p_state, Node *p_root) {
ERR_FAIL_NULL_V(p_root, ERR_INVALID_PARAMETER);
ERR_FAIL_NULL_V(p_state, ERR_INVALID_PARAMETER);
List<Node *> queue;
queue.push_back(p_node);
queue.push_back(p_root);
List<Node *> delete_queue;
while (!queue.is_empty()) {
List<Node *>::Element *E = queue.front();
Node *node = E->get();
{
ImporterMeshInstance3D *mesh_3d = cast_to<ImporterMeshInstance3D>(node);
if (mesh_3d) {
MeshInstance3D *mesh_instance_node_3d = memnew(MeshInstance3D);
Ref<ImporterMesh> mesh = mesh_3d->get_mesh();
if (mesh.is_valid()) {
Ref<ArrayMesh> array_mesh = mesh->get_mesh();
mesh_instance_node_3d->set_name(node->get_name());
mesh_instance_node_3d->set_transform(mesh_3d->get_transform());
mesh_instance_node_3d->set_mesh(array_mesh);
mesh_instance_node_3d->set_skin(mesh_3d->get_skin());
mesh_instance_node_3d->set_skeleton_path(mesh_3d->get_skeleton_path());
node->replace_by(mesh_instance_node_3d);
delete_queue.push_back(node);
} else {
memdelete(mesh_instance_node_3d);
}
ImporterMeshInstance3D *mesh_3d = cast_to<ImporterMeshInstance3D>(node);
if (mesh_3d) {
MeshInstance3D *mesh_instance_node_3d = memnew(MeshInstance3D);
Ref<ImporterMesh> mesh = mesh_3d->get_mesh();
if (mesh.is_valid()) {
Ref<ArrayMesh> array_mesh = mesh->get_mesh();
mesh_instance_node_3d->set_name(node->get_name());
mesh_instance_node_3d->set_transform(mesh_3d->get_transform());
mesh_instance_node_3d->set_mesh(array_mesh);
mesh_instance_node_3d->set_skin(mesh_3d->get_skin());
mesh_instance_node_3d->set_skeleton_path(mesh_3d->get_skeleton_path());
node->replace_by(mesh_instance_node_3d);
delete_queue.push_back(node);
} else {
memdelete(mesh_instance_node_3d);
}
}
int child_count = node->get_child_count();

View File

@ -31,14 +31,10 @@
#ifndef GLTF_EXTENSION_EDITOR_H
#define GLTF_EXTENSION_EDITOR_H
#include "core/io/resource.h"
#include "core/variant/dictionary.h"
#include "gltf_document.h"
#include "gltf_document_extension.h"
#include "scene/3d/importer_mesh_instance_3d.h"
#include "scene/3d/mesh_instance_3d.h"
#include "scene/main/node.h"
#include "scene/resources/importer_mesh.h"
class GLTFDocumentExtension;
@ -50,6 +46,6 @@ protected:
static void _bind_methods();
public:
Error import_post(Ref<GLTFDocument> p_document, Node *p_node) override;
Error import_post(Ref<GLTFState> p_state, Node *p_root) override;
};
#endif // GLTF_EXTENSION_EDITOR_H

View File

@ -57,6 +57,8 @@ void GLTFState::_bind_methods() {
ClassDB::bind_method(D_METHOD("set_materials", "materials"), &GLTFState::set_materials);
ClassDB::bind_method(D_METHOD("get_scene_name"), &GLTFState::get_scene_name);
ClassDB::bind_method(D_METHOD("set_scene_name", "scene_name"), &GLTFState::set_scene_name);
ClassDB::bind_method(D_METHOD("get_base_path"), &GLTFState::get_base_path);
ClassDB::bind_method(D_METHOD("set_base_path", "base_path"), &GLTFState::set_base_path);
ClassDB::bind_method(D_METHOD("get_root_nodes"), &GLTFState::get_root_nodes);
ClassDB::bind_method(D_METHOD("set_root_nodes", "root_nodes"), &GLTFState::set_root_nodes);
ClassDB::bind_method(D_METHOD("get_textures"), &GLTFState::get_textures);
@ -93,6 +95,7 @@ void GLTFState::_bind_methods() {
ADD_PROPERTY(PropertyInfo(Variant::ARRAY, "meshes", PROPERTY_HINT_NONE, "", PROPERTY_USAGE_STORAGE | PROPERTY_USAGE_INTERNAL | PROPERTY_USAGE_EDITOR), "set_meshes", "get_meshes"); // Vector<Ref<GLTFMesh>>
ADD_PROPERTY(PropertyInfo(Variant::ARRAY, "materials", PROPERTY_HINT_NONE, "", PROPERTY_USAGE_STORAGE | PROPERTY_USAGE_INTERNAL | PROPERTY_USAGE_EDITOR), "set_materials", "get_materials"); // Vector<Ref<Material>
ADD_PROPERTY(PropertyInfo(Variant::STRING, "scene_name"), "set_scene_name", "get_scene_name"); // String
ADD_PROPERTY(PropertyInfo(Variant::STRING, "base_path"), "set_base_path", "get_base_path"); // String
ADD_PROPERTY(PropertyInfo(Variant::PACKED_INT32_ARRAY, "root_nodes"), "set_root_nodes", "get_root_nodes"); // Vector<int>
ADD_PROPERTY(PropertyInfo(Variant::ARRAY, "textures", PROPERTY_HINT_NONE, "", PROPERTY_USAGE_STORAGE | PROPERTY_USAGE_INTERNAL | PROPERTY_USAGE_EDITOR), "set_textures", "get_textures"); // Vector<Ref<GLTFTexture>>
ADD_PROPERTY(PropertyInfo(Variant::ARRAY, "images", PROPERTY_HINT_NONE, "", PROPERTY_USAGE_STORAGE | PROPERTY_USAGE_INTERNAL | PROPERTY_USAGE_EDITOR), "set_images", "get_images"); // Vector<Ref<Texture>
@ -313,3 +316,11 @@ void GLTFState::set_discard_meshes_and_materials(bool p_discard_meshes_and_mater
bool GLTFState::get_discard_meshes_and_materials() {
return discard_meshes_and_materials;
}
String GLTFState::get_base_path() {
return base_path;
}
void GLTFState::set_base_path(String p_base_path) {
base_path = p_base_path;
}

View File

@ -44,10 +44,7 @@
#include "gltf_skin.h"
#include "gltf_texture.h"
#include "core/io/resource.h"
#include "core/templates/pair.h"
#include "core/templates/rb_map.h"
#include "core/templates/vector.h"
#include "scene/animation/animation_player.h"
#include "scene/resources/texture.h"
@ -56,6 +53,7 @@ class GLTFState : public Resource {
friend class GLTFDocument;
String filename;
String base_path;
Dictionary json;
int major_version = 0;
int minor_version = 0;
@ -137,6 +135,9 @@ public:
String get_scene_name();
void set_scene_name(String p_scene_name);
String get_base_path();
void set_base_path(String p_base_path);
Array get_root_nodes();
void set_root_nodes(Array p_root_nodes);