|
@@ -795,6 +795,9 @@ Error GLTFDocument::_encode_buffer_views(Ref<GLTFState> state) {
|
|
buffers.push_back(d);
|
|
buffers.push_back(d);
|
|
}
|
|
}
|
|
print_verbose("glTF: Total buffer views: " + itos(state->buffer_views.size()));
|
|
print_verbose("glTF: Total buffer views: " + itos(state->buffer_views.size()));
|
|
|
|
+ if (!buffers.size()) {
|
|
|
|
+ return OK;
|
|
|
|
+ }
|
|
state->json["bufferViews"] = buffers;
|
|
state->json["bufferViews"] = buffers;
|
|
return OK;
|
|
return OK;
|
|
}
|
|
}
|
|
@@ -884,6 +887,9 @@ Error GLTFDocument::_encode_accessors(Ref<GLTFState> state) {
|
|
accessors.push_back(d);
|
|
accessors.push_back(d);
|
|
}
|
|
}
|
|
|
|
|
|
|
|
+ if (!accessors.size()) {
|
|
|
|
+ return OK;
|
|
|
|
+ }
|
|
state->json["accessors"] = accessors;
|
|
state->json["accessors"] = accessors;
|
|
ERR_FAIL_COND_V(!state->json.has("accessors"), ERR_FILE_CORRUPT);
|
|
ERR_FAIL_COND_V(!state->json.has("accessors"), ERR_FILE_CORRUPT);
|
|
print_verbose("glTF: Total accessors: " + itos(state->accessors.size()));
|
|
print_verbose("glTF: Total accessors: " + itos(state->accessors.size()));
|
|
@@ -2112,6 +2118,7 @@ Error GLTFDocument::_serialize_meshes(Ref<GLTFState> state) {
|
|
if (import_mesh.is_null()) {
|
|
if (import_mesh.is_null()) {
|
|
continue;
|
|
continue;
|
|
}
|
|
}
|
|
|
|
+ Array instance_materials = state->meshes.write[gltf_mesh_i]->get_instance_materials();
|
|
Array primitives;
|
|
Array primitives;
|
|
Dictionary gltf_mesh;
|
|
Dictionary gltf_mesh;
|
|
Array target_names;
|
|
Array target_names;
|
|
@@ -2431,7 +2438,14 @@ Error GLTFDocument::_serialize_meshes(Ref<GLTFState> state) {
|
|
}
|
|
}
|
|
}
|
|
}
|
|
|
|
|
|
- Ref<BaseMaterial3D> mat = import_mesh->get_surface_material(surface_i);
|
|
|
|
|
|
+ Variant v;
|
|
|
|
+ if (surface_i < instance_materials.size()) {
|
|
|
|
+ v = instance_materials.get(surface_i);
|
|
|
|
+ }
|
|
|
|
+ Ref<BaseMaterial3D> mat = v;
|
|
|
|
+ if (!mat.is_valid()) {
|
|
|
|
+ mat = import_mesh->get_surface_material(surface_i);
|
|
|
|
+ }
|
|
if (mat.is_valid()) {
|
|
if (mat.is_valid()) {
|
|
Map<Ref<BaseMaterial3D>, GLTFMaterialIndex>::Element *material_cache_i = state->material_cache.find(mat);
|
|
Map<Ref<BaseMaterial3D>, GLTFMaterialIndex>::Element *material_cache_i = state->material_cache.find(mat);
|
|
if (material_cache_i && material_cache_i->get() != -1) {
|
|
if (material_cache_i && material_cache_i->get() != -1) {
|
|
@@ -2475,6 +2489,9 @@ Error GLTFDocument::_serialize_meshes(Ref<GLTFState> state) {
|
|
meshes.push_back(gltf_mesh);
|
|
meshes.push_back(gltf_mesh);
|
|
}
|
|
}
|
|
|
|
|
|
|
|
+ if (!meshes.size()) {
|
|
|
|
+ return OK;
|
|
|
|
+ }
|
|
state->json["meshes"] = meshes;
|
|
state->json["meshes"] = meshes;
|
|
print_verbose("glTF: Total meshes: " + itos(meshes.size()));
|
|
print_verbose("glTF: Total meshes: " + itos(meshes.size()));
|
|
|
|
|
|
@@ -3454,6 +3471,9 @@ Error GLTFDocument::_serialize_materials(Ref<GLTFState> state) {
|
|
}
|
|
}
|
|
materials.push_back(d);
|
|
materials.push_back(d);
|
|
}
|
|
}
|
|
|
|
+ if (!materials.size()) {
|
|
|
|
+ return OK;
|
|
|
|
+ }
|
|
state->json["materials"] = materials;
|
|
state->json["materials"] = materials;
|
|
print_verbose("Total materials: " + itos(state->materials.size()));
|
|
print_verbose("Total materials: " + itos(state->materials.size()));
|
|
|
|
|
|
@@ -4837,6 +4857,9 @@ Error GLTFDocument::_serialize_animations(Ref<GLTFState> state) {
|
|
}
|
|
}
|
|
}
|
|
}
|
|
|
|
|
|
|
|
+ if (!animations.size()) {
|
|
|
|
+ return OK;
|
|
|
|
+ }
|
|
state->json["animations"] = animations;
|
|
state->json["animations"] = animations;
|
|
|
|
|
|
print_verbose("glTF: Total animations '" + itos(state->animations.size()) + "'.");
|
|
print_verbose("glTF: Total animations '" + itos(state->animations.size()) + "'.");
|
|
@@ -5057,6 +5080,18 @@ GLTFMeshIndex GLTFDocument::_convert_mesh_to_gltf(Ref<GLTFState> state, MeshInst
|
|
}
|
|
}
|
|
Ref<GLTFMesh> gltf_mesh;
|
|
Ref<GLTFMesh> gltf_mesh;
|
|
gltf_mesh.instantiate();
|
|
gltf_mesh.instantiate();
|
|
|
|
+ Array instance_materials;
|
|
|
|
+ for (int32_t surface_i = 0; surface_i < current_mesh->get_surface_count(); surface_i++) {
|
|
|
|
+ Ref<Material> mat = current_mesh->get_surface_material(surface_i);
|
|
|
|
+ if (p_mesh_instance->get_surface_override_material(surface_i).is_valid()) {
|
|
|
|
+ mat = p_mesh_instance->get_surface_override_material(surface_i);
|
|
|
|
+ }
|
|
|
|
+ if (p_mesh_instance->get_material_override().is_valid()) {
|
|
|
|
+ mat = p_mesh_instance->get_material_override();
|
|
|
|
+ }
|
|
|
|
+ instance_materials.append(mat);
|
|
|
|
+ }
|
|
|
|
+ gltf_mesh->set_instance_materials(instance_materials);
|
|
gltf_mesh->set_mesh(current_mesh);
|
|
gltf_mesh->set_mesh(current_mesh);
|
|
gltf_mesh->set_blend_weights(blend_weights);
|
|
gltf_mesh->set_blend_weights(blend_weights);
|
|
GLTFMeshIndex mesh_i = state->meshes.size();
|
|
GLTFMeshIndex mesh_i = state->meshes.size();
|