Set base_path and filename during export
This commit is contained in:
parent
101442ced9
commit
2970839085
|
@ -267,7 +267,7 @@
|
||||||
</methods>
|
</methods>
|
||||||
<members>
|
<members>
|
||||||
<member name="base_path" type="String" setter="set_base_path" getter="get_base_path" default="""">
|
<member name="base_path" type="String" setter="set_base_path" getter="get_base_path" default="""">
|
||||||
The folder path associated with this GLTF data. This is used to find other files the GLTF file references, like images or binary buffers. This will be set during import when appending from a file.
|
The folder path associated with this GLTF data. This is used to find other files the GLTF file references, like images or binary buffers. This will be set during import when appending from a file, and will be set during export when writing to a file.
|
||||||
</member>
|
</member>
|
||||||
<member name="buffers" type="PackedByteArray[]" setter="set_buffers" getter="get_buffers" default="[]">
|
<member name="buffers" type="PackedByteArray[]" setter="set_buffers" getter="get_buffers" default="[]">
|
||||||
</member>
|
</member>
|
||||||
|
@ -277,7 +277,7 @@
|
||||||
<member name="create_animations" type="bool" setter="set_create_animations" getter="get_create_animations" default="true">
|
<member name="create_animations" type="bool" setter="set_create_animations" getter="get_create_animations" default="true">
|
||||||
</member>
|
</member>
|
||||||
<member name="filename" type="String" setter="set_filename" getter="get_filename" default="""">
|
<member name="filename" type="String" setter="set_filename" getter="get_filename" default="""">
|
||||||
The file name associated with this GLTF data. If it ends with [code].gltf[/code], this is text-based GLTF, otherwise this is binary GLB. This will be set during import when appending from a file.
|
The file name associated with this GLTF data. If it ends with [code].gltf[/code], this is text-based GLTF, otherwise this is binary GLB. This will be set during import when appending from a file, and will be set during export when writing to a file. If writing to a buffer, this will be an empty string.
|
||||||
</member>
|
</member>
|
||||||
<member name="glb_data" type="PackedByteArray" setter="set_glb_data" getter="get_glb_data" default="PackedByteArray()">
|
<member name="glb_data" type="PackedByteArray" setter="set_glb_data" getter="get_glb_data" default="PackedByteArray()">
|
||||||
</member>
|
</member>
|
||||||
|
|
|
@ -110,7 +110,7 @@ static Ref<ImporterMesh> _mesh_to_importer_mesh(Ref<Mesh> p_mesh) {
|
||||||
return importer_mesh;
|
return importer_mesh;
|
||||||
}
|
}
|
||||||
|
|
||||||
Error GLTFDocument::_serialize(Ref<GLTFState> p_state, const String &p_path) {
|
Error GLTFDocument::_serialize(Ref<GLTFState> p_state) {
|
||||||
if (!p_state->buffers.size()) {
|
if (!p_state->buffers.size()) {
|
||||||
p_state->buffers.push_back(Vector<uint8_t>());
|
p_state->buffers.push_back(Vector<uint8_t>());
|
||||||
}
|
}
|
||||||
|
@ -167,7 +167,7 @@ Error GLTFDocument::_serialize(Ref<GLTFState> p_state, const String &p_path) {
|
||||||
}
|
}
|
||||||
|
|
||||||
/* STEP SERIALIZE IMAGES */
|
/* STEP SERIALIZE IMAGES */
|
||||||
err = _serialize_images(p_state, p_path);
|
err = _serialize_images(p_state);
|
||||||
if (err != OK) {
|
if (err != OK) {
|
||||||
return Error::FAILED;
|
return Error::FAILED;
|
||||||
}
|
}
|
||||||
|
@ -3001,7 +3001,7 @@ Error GLTFDocument::_parse_meshes(Ref<GLTFState> p_state) {
|
||||||
return OK;
|
return OK;
|
||||||
}
|
}
|
||||||
|
|
||||||
Error GLTFDocument::_serialize_images(Ref<GLTFState> p_state, const String &p_path) {
|
Error GLTFDocument::_serialize_images(Ref<GLTFState> p_state) {
|
||||||
Array images;
|
Array images;
|
||||||
for (int i = 0; i < p_state->images.size(); i++) {
|
for (int i = 0; i < p_state->images.size(); i++) {
|
||||||
Dictionary image_dict;
|
Dictionary image_dict;
|
||||||
|
@ -3011,7 +3011,22 @@ Error GLTFDocument::_serialize_images(Ref<GLTFState> p_state, const String &p_pa
|
||||||
Ref<Image> image = p_state->images[i]->get_image();
|
Ref<Image> image = p_state->images[i]->get_image();
|
||||||
ERR_CONTINUE(image.is_null());
|
ERR_CONTINUE(image.is_null());
|
||||||
|
|
||||||
if (p_path.to_lower().ends_with("glb") || p_path.is_empty()) {
|
if (p_state->filename.to_lower().ends_with("gltf")) {
|
||||||
|
String img_name = p_state->images[i]->get_name();
|
||||||
|
if (img_name.is_empty()) {
|
||||||
|
img_name = itos(i);
|
||||||
|
}
|
||||||
|
img_name = _gen_unique_name(p_state, img_name);
|
||||||
|
img_name = img_name.pad_zeros(3) + ".png";
|
||||||
|
String relative_texture_dir = "textures";
|
||||||
|
String full_texture_dir = p_state->base_path.path_join(relative_texture_dir);
|
||||||
|
Ref<DirAccess> da = DirAccess::open(p_state->base_path);
|
||||||
|
if (!da->dir_exists(full_texture_dir)) {
|
||||||
|
da->make_dir(full_texture_dir);
|
||||||
|
}
|
||||||
|
image->save_png(full_texture_dir.path_join(img_name));
|
||||||
|
image_dict["uri"] = relative_texture_dir.path_join(img_name).uri_encode();
|
||||||
|
} else {
|
||||||
GLTFBufferViewIndex bvi;
|
GLTFBufferViewIndex bvi;
|
||||||
|
|
||||||
Ref<GLTFBufferView> bv;
|
Ref<GLTFBufferView> bv;
|
||||||
|
@ -3039,23 +3054,6 @@ Error GLTFDocument::_serialize_images(Ref<GLTFState> p_state, const String &p_pa
|
||||||
bvi = p_state->buffer_views.size() - 1;
|
bvi = p_state->buffer_views.size() - 1;
|
||||||
image_dict["bufferView"] = bvi;
|
image_dict["bufferView"] = bvi;
|
||||||
image_dict["mimeType"] = "image/png";
|
image_dict["mimeType"] = "image/png";
|
||||||
} else {
|
|
||||||
ERR_FAIL_COND_V(p_path.is_empty(), ERR_INVALID_PARAMETER);
|
|
||||||
String img_name = p_state->images[i]->get_name();
|
|
||||||
if (img_name.is_empty()) {
|
|
||||||
img_name = itos(i);
|
|
||||||
}
|
|
||||||
img_name = _gen_unique_name(p_state, img_name);
|
|
||||||
img_name = img_name.pad_zeros(3) + ".png";
|
|
||||||
String relative_texture_dir = "textures";
|
|
||||||
String parent_path = p_path.get_base_dir();
|
|
||||||
String full_texture_dir = parent_path + "/" + relative_texture_dir;
|
|
||||||
Ref<DirAccess> da = DirAccess::open(parent_path);
|
|
||||||
if (!da->dir_exists(full_texture_dir)) {
|
|
||||||
da->make_dir(full_texture_dir);
|
|
||||||
}
|
|
||||||
image->save_png(full_texture_dir.path_join(img_name));
|
|
||||||
image_dict["uri"] = relative_texture_dir.path_join(img_name).uri_encode();
|
|
||||||
}
|
}
|
||||||
images.push_back(image_dict);
|
images.push_back(image_dict);
|
||||||
}
|
}
|
||||||
|
@ -7241,7 +7239,10 @@ PackedByteArray GLTFDocument::_serialize_glb_buffer(Ref<GLTFState> p_state, Erro
|
||||||
|
|
||||||
PackedByteArray GLTFDocument::generate_buffer(Ref<GLTFState> p_state) {
|
PackedByteArray GLTFDocument::generate_buffer(Ref<GLTFState> p_state) {
|
||||||
ERR_FAIL_NULL_V(p_state, PackedByteArray());
|
ERR_FAIL_NULL_V(p_state, PackedByteArray());
|
||||||
Error err = _serialize(p_state, "");
|
// For buffers, set the state filename to an empty string, but
|
||||||
|
// don't touch the base path, in case the user set it manually.
|
||||||
|
p_state->filename = "";
|
||||||
|
Error err = _serialize(p_state);
|
||||||
ERR_FAIL_COND_V(err != OK, PackedByteArray());
|
ERR_FAIL_COND_V(err != OK, PackedByteArray());
|
||||||
PackedByteArray bytes = _serialize_glb_buffer(p_state, &err);
|
PackedByteArray bytes = _serialize_glb_buffer(p_state, &err);
|
||||||
return bytes;
|
return bytes;
|
||||||
|
@ -7249,7 +7250,9 @@ PackedByteArray GLTFDocument::generate_buffer(Ref<GLTFState> p_state) {
|
||||||
|
|
||||||
Error GLTFDocument::write_to_filesystem(Ref<GLTFState> p_state, const String &p_path) {
|
Error GLTFDocument::write_to_filesystem(Ref<GLTFState> p_state, const String &p_path) {
|
||||||
ERR_FAIL_NULL_V(p_state, ERR_INVALID_PARAMETER);
|
ERR_FAIL_NULL_V(p_state, ERR_INVALID_PARAMETER);
|
||||||
Error err = _serialize(p_state, p_path);
|
p_state->base_path = p_path.get_base_dir();
|
||||||
|
p_state->filename = p_path.get_file();
|
||||||
|
Error err = _serialize(p_state);
|
||||||
if (err != OK) {
|
if (err != OK) {
|
||||||
return err;
|
return err;
|
||||||
}
|
}
|
||||||
|
|
|
@ -149,7 +149,7 @@ private:
|
||||||
Error _parse_meshes(Ref<GLTFState> p_state);
|
Error _parse_meshes(Ref<GLTFState> p_state);
|
||||||
Error _serialize_textures(Ref<GLTFState> p_state);
|
Error _serialize_textures(Ref<GLTFState> p_state);
|
||||||
Error _serialize_texture_samplers(Ref<GLTFState> p_state);
|
Error _serialize_texture_samplers(Ref<GLTFState> p_state);
|
||||||
Error _serialize_images(Ref<GLTFState> p_state, const String &p_path);
|
Error _serialize_images(Ref<GLTFState> p_state);
|
||||||
Error _serialize_lights(Ref<GLTFState> p_state);
|
Error _serialize_lights(Ref<GLTFState> p_state);
|
||||||
Ref<Image> _parse_image_bytes_into_image(Ref<GLTFState> p_state, const Vector<uint8_t> &p_bytes, const String &p_mime_type, int p_index, String &r_file_extension);
|
Ref<Image> _parse_image_bytes_into_image(Ref<GLTFState> p_state, const Vector<uint8_t> &p_bytes, const String &p_mime_type, int p_index, String &r_file_extension);
|
||||||
void _parse_image_save_image(Ref<GLTFState> p_state, const Vector<uint8_t> &p_bytes, const String &p_file_extension, int p_index, Ref<Image> p_image);
|
void _parse_image_save_image(Ref<GLTFState> p_state, const Vector<uint8_t> &p_bytes, const String &p_file_extension, int p_index, Ref<Image> p_image);
|
||||||
|
@ -366,7 +366,7 @@ public:
|
||||||
GLTFMeshIndex _convert_mesh_to_gltf(Ref<GLTFState> p_state,
|
GLTFMeshIndex _convert_mesh_to_gltf(Ref<GLTFState> p_state,
|
||||||
MeshInstance3D *p_mesh_instance);
|
MeshInstance3D *p_mesh_instance);
|
||||||
void _convert_animation(Ref<GLTFState> p_state, AnimationPlayer *p_animation_player, String p_animation_track_name);
|
void _convert_animation(Ref<GLTFState> p_state, AnimationPlayer *p_animation_player, String p_animation_track_name);
|
||||||
Error _serialize(Ref<GLTFState> p_state, const String &p_path);
|
Error _serialize(Ref<GLTFState> p_state);
|
||||||
Error _parse(Ref<GLTFState> p_state, String p_path, Ref<FileAccess> p_file);
|
Error _parse(Ref<GLTFState> p_state, String p_path, Ref<FileAccess> p_file);
|
||||||
};
|
};
|
||||||
|
|
||||||
|
|
Loading…
Reference in New Issue