diff options
Diffstat (limited to 'scene/resources/sky_box.cpp')
-rw-r--r-- | scene/resources/sky_box.cpp | 93 |
1 files changed, 74 insertions, 19 deletions
diff --git a/scene/resources/sky_box.cpp b/scene/resources/sky_box.cpp index 5750960845..9af8c42110 100644 --- a/scene/resources/sky_box.cpp +++ b/scene/resources/sky_box.cpp @@ -3,7 +3,7 @@ /*************************************************************************/ /* This file is part of: */ /* GODOT ENGINE */ -/* http://www.godotengine.org */ +/* https://godotengine.org */ /*************************************************************************/ /* Copyright (c) 2007-2017 Juan Linietsky, Ariel Manzur. */ /* Copyright (c) 2014-2017 Godot Engine contributors (cf. AUTHORS.md) */ @@ -49,14 +49,14 @@ void Sky::_bind_methods() { ADD_PROPERTY(PropertyInfo(Variant::INT, "radiance_size", PROPERTY_HINT_ENUM, "32,64,128,256,512,1024,2048"), "set_radiance_size", "get_radiance_size"); - BIND_CONSTANT(RADIANCE_SIZE_32); - BIND_CONSTANT(RADIANCE_SIZE_64); - BIND_CONSTANT(RADIANCE_SIZE_128); - BIND_CONSTANT(RADIANCE_SIZE_256); - BIND_CONSTANT(RADIANCE_SIZE_512); - BIND_CONSTANT(RADIANCE_SIZE_1024); - BIND_CONSTANT(RADIANCE_SIZE_2048); - BIND_CONSTANT(RADIANCE_SIZE_MAX); + BIND_ENUM_CONSTANT(RADIANCE_SIZE_32); + BIND_ENUM_CONSTANT(RADIANCE_SIZE_64); + BIND_ENUM_CONSTANT(RADIANCE_SIZE_128); + BIND_ENUM_CONSTANT(RADIANCE_SIZE_256); + BIND_ENUM_CONSTANT(RADIANCE_SIZE_512); + BIND_ENUM_CONSTANT(RADIANCE_SIZE_1024); + BIND_ENUM_CONSTANT(RADIANCE_SIZE_2048); + BIND_ENUM_CONSTANT(RADIANCE_SIZE_MAX); } Sky::Sky() { @@ -128,7 +128,7 @@ void ProceduralSky::_radiance_changed() { VS::get_singleton()->sky_set_texture(sky, texture, size[get_radiance_size()]); } -void ProceduralSky::_update_sky() { +Ref<Image> ProceduralSky::_generate_sky() { update_queued = false; @@ -215,9 +215,7 @@ void ProceduralSky::_update_sky() { image.instance(); image->create(w, h, false, Image::FORMAT_RGBE9995, imgdata); - VS::get_singleton()->texture_allocate(texture, w, h, Image::FORMAT_RGBE9995, VS::TEXTURE_FLAG_FILTER | VS::TEXTURE_FLAG_REPEAT); - VS::get_singleton()->texture_set_data(texture, image); - _radiance_changed(); + return image; } void ProceduralSky::set_sky_top_color(const Color &p_sky_top) { @@ -385,6 +383,33 @@ RID ProceduralSky::get_rid() const { return sky; } +void ProceduralSky::_update_sky() { + + bool use_thread = true; + if (first_time) { + use_thread = false; + first_time = false; + } +#ifdef NO_THREADS + use_thread = false; +#endif + if (use_thread) { + + if (!sky_thread) { + sky_thread = Thread::create(_thread_function, this); + regen_queued = false; + } else { + regen_queued = true; + } + + } else { + Ref<Image> image = _generate_sky(); + VS::get_singleton()->texture_allocate(texture, image->get_width(), image->get_height(), Image::FORMAT_RGBE9995, VS::TEXTURE_FLAG_FILTER | VS::TEXTURE_FLAG_REPEAT); + VS::get_singleton()->texture_set_data(texture, image); + _radiance_changed(); + } +} + void ProceduralSky::_queue_update() { if (update_queued) @@ -394,6 +419,26 @@ void ProceduralSky::_queue_update() { call_deferred("_update_sky"); } +void ProceduralSky::_thread_done(const Ref<Image> &image) { + + VS::get_singleton()->texture_allocate(texture, image->get_width(), image->get_height(), Image::FORMAT_RGBE9995, VS::TEXTURE_FLAG_FILTER | VS::TEXTURE_FLAG_REPEAT); + VS::get_singleton()->texture_set_data(texture, image); + _radiance_changed(); + Thread::wait_to_finish(sky_thread); + memdelete(sky_thread); + sky_thread = NULL; + if (regen_queued) { + sky_thread = Thread::create(_thread_function, this); + regen_queued = false; + } +} + +void ProceduralSky::_thread_function(void *p_ud) { + + ProceduralSky *psky = (ProceduralSky *)p_ud; + psky->call_deferred("_thread_done", psky->_generate_sky()); +} + void ProceduralSky::_bind_methods() { ClassDB::bind_method(D_METHOD("_update_sky"), &ProceduralSky::_update_sky); @@ -446,6 +491,8 @@ void ProceduralSky::_bind_methods() { ClassDB::bind_method(D_METHOD("set_texture_size", "size"), &ProceduralSky::set_texture_size); ClassDB::bind_method(D_METHOD("get_texture_size"), &ProceduralSky::get_texture_size); + ClassDB::bind_method(D_METHOD("_thread_done", "image"), &ProceduralSky::_thread_done); + ADD_GROUP("Sky", "sky_"); ADD_PROPERTY(PropertyInfo(Variant::COLOR, "sky_top_color"), "set_sky_top_color", "get_sky_top_color"); ADD_PROPERTY(PropertyInfo(Variant::COLOR, "sky_horizon_color"), "set_sky_horizon_color", "get_sky_horizon_color"); @@ -470,12 +517,12 @@ void ProceduralSky::_bind_methods() { ADD_GROUP("Texture", "texture_"); ADD_PROPERTY(PropertyInfo(Variant::INT, "texture_size", PROPERTY_HINT_ENUM, "256,512,1024,2048,4096"), "set_texture_size", "get_texture_size"); - BIND_CONSTANT(TEXTURE_SIZE_256); - BIND_CONSTANT(TEXTURE_SIZE_512); - BIND_CONSTANT(TEXTURE_SIZE_1024); - BIND_CONSTANT(TEXTURE_SIZE_2048); - BIND_CONSTANT(TEXTURE_SIZE_4096); - BIND_CONSTANT(TEXTURE_SIZE_MAX); + BIND_ENUM_CONSTANT(TEXTURE_SIZE_256); + BIND_ENUM_CONSTANT(TEXTURE_SIZE_512); + BIND_ENUM_CONSTANT(TEXTURE_SIZE_1024); + BIND_ENUM_CONSTANT(TEXTURE_SIZE_2048); + BIND_ENUM_CONSTANT(TEXTURE_SIZE_4096); + BIND_ENUM_CONSTANT(TEXTURE_SIZE_MAX); } ProceduralSky::ProceduralSky() { @@ -503,12 +550,20 @@ ProceduralSky::ProceduralSky() { sun_energy = 16; texture_size = TEXTURE_SIZE_1024; + sky_thread = NULL; + regen_queued = false; + first_time = true; _queue_update(); } ProceduralSky::~ProceduralSky() { + if (sky_thread) { + Thread::wait_to_finish(sky_thread); + memdelete(sky_thread); + sky_thread = NULL; + } VS::get_singleton()->free(sky); VS::get_singleton()->free(texture); } |