Fixes to baker, restored xatlas and fixed bake options.

This commit is contained in:
Juan Linietsky 2018-10-04 23:00:02 -03:00
parent a41cf404a9
commit f12cb82e0f
8 changed files with 93 additions and 25 deletions

View File

@ -647,3 +647,5 @@ bool ResourceLoader::timestamp_on_load = false;
SelfList<Resource>::List ResourceLoader::remapped_list;
HashMap<String, Vector<String> > ResourceLoader::translation_remaps;
HashMap<String, String> ResourceLoader::path_remaps;
ResourceLoaderImport ResourceLoader::import = NULL;

View File

@ -77,6 +77,8 @@ public:
typedef void (*ResourceLoadErrorNotify)(void *p_ud, const String &p_text);
typedef void (*DependencyErrorNotify)(void *p_ud, const String &p_loading, const String &p_which, const String &p_type);
typedef Error (*ResourceLoaderImport)(const String &p_path);
class ResourceLoader {
enum {
@ -147,6 +149,8 @@ public:
static void reload_translation_remaps();
static void load_translation_remaps();
static void clear_translation_remaps();
static ResourceLoaderImport import;
};
#endif

View File

@ -1705,6 +1705,17 @@ void EditorFileSystem::reimport_files(const Vector<String> &p_files) {
emit_signal("resources_reimported", p_files);
}
Error EditorFileSystem::_resource_import(const String &p_path) {
Vector<String> files;
files.push_back(p_path);
singleton->update_file(p_path);
singleton->reimport_files(files);
return OK;
}
void EditorFileSystem::_bind_methods() {
ClassDB::bind_method(D_METHOD("get_filesystem"), &EditorFileSystem::get_filesystem);
@ -1744,6 +1755,7 @@ void EditorFileSystem::_update_extensions() {
EditorFileSystem::EditorFileSystem() {
ResourceLoader::import = _resource_import;
reimport_on_missing_imported_files = GLOBAL_DEF("editor/reimport_missing_imported_files", true);
singleton = this;

View File

@ -230,6 +230,8 @@ class EditorFileSystem : public Node {
String _get_global_script_class(const String &p_type, const String &p_path, String *r_extends, String *r_icon_path) const;
static Error _resource_import(const String &p_path);
protected:
void _notification(int p_what);
static void _bind_methods();

View File

@ -1,5 +1,6 @@
def can_build(env, platform):
return (env['tools'] and platform not in ["android", "ios"])
#return (env['tools'] and platform not in ["android", "ios"])
return False
def configure(env):
pass

View File

@ -1,6 +1,6 @@
def can_build(env, platform):
return False #xatlas is buggy
#return (env['tools'] and platform not in ["android", "ios"])
#return False #xatlas is buggy
return (env['tools'] and platform not in ["android", "ios"])
def configure(env):
pass

View File

@ -75,8 +75,9 @@ bool xatlas_mesh_lightmap_unwrap_callback(float p_texel_size, const float *p_ver
xatlas::CharterOptions chart_options;
xatlas::PackerOptions pack_options;
pack_options.method = xatlas::PackMethod::TexelArea;
pack_options.texelArea = 1.0 / p_texel_size;
pack_options.quality = 4;
pack_options.quality = 3;
xatlas::Atlas *atlas = xatlas::Create();
printf("adding mesh..\n");
@ -93,7 +94,10 @@ bool xatlas_mesh_lightmap_unwrap_callback(float p_texel_size, const float *p_ver
float w = *r_size_hint_x;
float h = *r_size_hint_y;
printf("final texsize: %f,%f\n", w, h);
if (w == 0 || h == 0) {
return false; //could not bake
}
const xatlas::OutputMesh *const *output_meshes = xatlas::GetOutputMeshes(atlas);
const xatlas::OutputMesh *output = output_meshes[0];
@ -102,11 +106,17 @@ bool xatlas_mesh_lightmap_unwrap_callback(float p_texel_size, const float *p_ver
*r_uv = (float *)malloc(sizeof(float) * output->vertexCount * 2);
*r_index = (int *)malloc(sizeof(int) * output->indexCount);
float max_x = 0;
float max_y = 0;
for (int i = 0; i < output->vertexCount; i++) {
(*r_vertex)[i] = output->vertexArray[i].xref;
(*r_uv)[i * 2 + 0] = output->vertexArray[i].uv[0];
(*r_uv)[i * 2 + 1] = output->vertexArray[i].uv[1];
(*r_uv)[i * 2 + 0] = output->vertexArray[i].uv[0] / w;
(*r_uv)[i * 2 + 1] = output->vertexArray[i].uv[1] / h;
max_x = MAX(max_x, output->vertexArray[i].uv[0]);
max_y = MAX(max_y, output->vertexArray[i].uv[1]);
}
printf("final texsize: %f,%f - max %f,%f\n", w, h, max_x, max_y);
*r_vertex_count = output->vertexCount;
for (int i = 0; i < output->indexCount; i++) {

View File

@ -29,6 +29,7 @@
/*************************************************************************/
#include "baked_lightmap.h"
#include "core/io/config_file.h"
#include "core/io/resource_saver.h"
#include "core/os/dir_access.h"
#include "core/os/os.h"
@ -526,21 +527,60 @@ BakedLightmap::BakeError BakedLightmap::bake(Node *p_from_node, bool p_create_vi
tex_flags |= Texture::FLAG_CONVERT_TO_LINEAR;
}
Ref<ImageTexture> tex;
String image_path = save_path.plus_file(mesh_name + ".tex");
bool set_path = true;
if (ResourceCache::has(image_path)) {
tex = Ref<Resource>((Resource *)ResourceCache::get(image_path));
set_path = false;
String image_path = save_path.plus_file(mesh_name);
Ref<Texture> texture;
if (ResourceLoader::import) {
bool srgb = false;
if (false && hdr) {
//save hdr
} else {
image_path += ".png";
print_line("image path saving png: " + image_path);
image->save_png(image_path);
srgb = true;
}
if (!FileAccess::exists(image_path + ".import")) {
Ref<ConfigFile> config;
config.instance();
config->set_value("remap", "importer", "texture");
config->set_value("remap", "type", "StreamTexture");
config->set_value("params", "compress/mode", 2);
config->set_value("params", "detect_3d", false);
config->set_value("params", "flags/repeat", false);
config->set_value("params", "flags/filter", true);
config->set_value("params", "flags/mipmaps", false);
config->set_value("params", "flags/srgb", srgb);
config->save(image_path + ".import");
}
ResourceLoader::import(image_path);
texture = ResourceLoader::load(image_path); //if already loaded, it will be updated on refocus?
} else {
image_path += ".text";
Ref<ImageTexture> tex;
bool set_path = true;
if (ResourceCache::has(image_path)) {
tex = Ref<Resource>((Resource *)ResourceCache::get(image_path));
set_path = false;
}
if (!tex.is_valid()) {
tex.instance();
}
tex->create_from_image(image, tex_flags);
err = ResourceSaver::save(image_path, tex, ResourceSaver::FLAG_CHANGE_PATH);
if (set_path) {
tex->set_path(image_path);
}
texture = tex;
}
if (!tex.is_valid()) {
tex.instance();
}
tex->create_from_image(image, tex_flags);
err = ResourceSaver::save(image_path, tex, ResourceSaver::FLAG_CHANGE_PATH);
if (err != OK) {
if (bake_end_function) {
bake_end_function();
@ -548,10 +588,7 @@ BakedLightmap::BakeError BakedLightmap::bake(Node *p_from_node, bool p_create_vi
ERR_FAIL_COND_V(err != OK, BAKE_ERROR_CANT_CREATE_IMAGE);
}
if (set_path) {
tex->set_path(image_path);
}
new_light_data->add_user(E->get().path, tex, E->get().instance_idx);
new_light_data->add_user(E->get().path, texture, E->get().instance_idx);
}
}