Skip to content

Commit

Permalink
Merge pull request #64864 from aaronfranke/noise-texture-2d
Browse files Browse the repository at this point in the history
  • Loading branch information
akien-mga authored Aug 26, 2022
2 parents ecfff5b + 394d058 commit c54125d
Show file tree
Hide file tree
Showing 6 changed files with 82 additions and 81 deletions.
2 changes: 1 addition & 1 deletion modules/noise/config.py
Original file line number Diff line number Diff line change
Expand Up @@ -10,7 +10,7 @@ def get_doc_classes():
return [
"FastNoiseLite",
"Noise",
"NoiseTexture",
"NoiseTexture2D",
]


Expand Down
Original file line number Diff line number Diff line change
@@ -1,14 +1,14 @@
<?xml version="1.0" encoding="UTF-8" ?>
<class name="NoiseTexture" inherits="Texture2D" version="4.0" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xsi:noNamespaceSchemaLocation="../../../doc/class.xsd">
<class name="NoiseTexture2D" inherits="Texture2D" version="4.0" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xsi:noNamespaceSchemaLocation="../../../doc/class.xsd">
<brief_description>
A texture filled with noise generated by a [Noise] object.
</brief_description>
<description>
Uses [FastNoiseLite] or other libraries to fill the texture data of your desired size.
NoiseTexture can also generate normalmap textures.
NoiseTexture2D can also generate normalmap textures.
The class uses [Thread]s to generate the texture data internally, so [method Texture2D.get_image] may return [code]null[/code] if the generation process has not completed yet. In that case, you need to wait for the texture to be generated before accessing the image and the generated byte data:
[codeblock]
var texture = NoiseTexture.new()
var texture = NoiseTexture2D.new()
texture.noise = FastNoiseLite.new()
await texture.changed
var image = texture.get_image()
Expand Down
4 changes: 2 additions & 2 deletions modules/noise/editor/noise_editor_plugin.cpp
Original file line number Diff line number Diff line change
Expand Up @@ -35,7 +35,7 @@
#include "editor/editor_scale.h"

#include "modules/noise/noise.h"
#include "modules/noise/noise_texture.h"
#include "modules/noise/noise_texture_2d.h"

class NoisePreview : public Control {
GDCLASS(NoisePreview, Control)
Expand Down Expand Up @@ -102,7 +102,7 @@ class NoisePreview : public Control {

void update_preview() {
if (MIN(_preview_texture_size.width, _preview_texture_size.height) > 0) {
Ref<NoiseTexture> tex;
Ref<NoiseTexture2D> tex;
tex.instantiate();
tex->set_width(_preview_texture_size.width);
tex->set_height(_preview_texture_size.height);
Expand Down
130 changes: 65 additions & 65 deletions modules/noise/noise_texture.cpp → modules/noise/noise_texture_2d.cpp
Original file line number Diff line number Diff line change
@@ -1,5 +1,5 @@
/*************************************************************************/
/* noise_texture.cpp */
/* noise_texture_2d.cpp */
/*************************************************************************/
/* This file is part of: */
/* GODOT ENGINE */
Expand Down Expand Up @@ -28,58 +28,58 @@
/* SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE. */
/*************************************************************************/

#include "noise_texture.h"
#include "noise_texture_2d.h"

#include "core/core_string_names.h"
#include "noise.h"

NoiseTexture::NoiseTexture() {
NoiseTexture2D::NoiseTexture2D() {
noise = Ref<Noise>();

_queue_update();
}

NoiseTexture::~NoiseTexture() {
NoiseTexture2D::~NoiseTexture2D() {
if (texture.is_valid()) {
RS::get_singleton()->free(texture);
}
noise_thread.wait_to_finish();
}

void NoiseTexture::_bind_methods() {
ClassDB::bind_method(D_METHOD("_update_texture"), &NoiseTexture::_update_texture);
ClassDB::bind_method(D_METHOD("_generate_texture"), &NoiseTexture::_generate_texture);
ClassDB::bind_method(D_METHOD("_thread_done", "image"), &NoiseTexture::_thread_done);
void NoiseTexture2D::_bind_methods() {
ClassDB::bind_method(D_METHOD("_update_texture"), &NoiseTexture2D::_update_texture);
ClassDB::bind_method(D_METHOD("_generate_texture"), &NoiseTexture2D::_generate_texture);
ClassDB::bind_method(D_METHOD("_thread_done", "image"), &NoiseTexture2D::_thread_done);

ClassDB::bind_method(D_METHOD("set_width", "width"), &NoiseTexture::set_width);
ClassDB::bind_method(D_METHOD("set_height", "height"), &NoiseTexture::set_height);
ClassDB::bind_method(D_METHOD("set_width", "width"), &NoiseTexture2D::set_width);
ClassDB::bind_method(D_METHOD("set_height", "height"), &NoiseTexture2D::set_height);

ClassDB::bind_method(D_METHOD("set_invert", "invert"), &NoiseTexture::set_invert);
ClassDB::bind_method(D_METHOD("get_invert"), &NoiseTexture::get_invert);
ClassDB::bind_method(D_METHOD("set_invert", "invert"), &NoiseTexture2D::set_invert);
ClassDB::bind_method(D_METHOD("get_invert"), &NoiseTexture2D::get_invert);

ClassDB::bind_method(D_METHOD("set_in_3d_space", "enable"), &NoiseTexture::set_in_3d_space);
ClassDB::bind_method(D_METHOD("is_in_3d_space"), &NoiseTexture::is_in_3d_space);
ClassDB::bind_method(D_METHOD("set_in_3d_space", "enable"), &NoiseTexture2D::set_in_3d_space);
ClassDB::bind_method(D_METHOD("is_in_3d_space"), &NoiseTexture2D::is_in_3d_space);

ClassDB::bind_method(D_METHOD("set_generate_mipmaps", "invert"), &NoiseTexture::set_generate_mipmaps);
ClassDB::bind_method(D_METHOD("is_generating_mipmaps"), &NoiseTexture::is_generating_mipmaps);
ClassDB::bind_method(D_METHOD("set_generate_mipmaps", "invert"), &NoiseTexture2D::set_generate_mipmaps);
ClassDB::bind_method(D_METHOD("is_generating_mipmaps"), &NoiseTexture2D::is_generating_mipmaps);

ClassDB::bind_method(D_METHOD("set_seamless", "seamless"), &NoiseTexture::set_seamless);
ClassDB::bind_method(D_METHOD("get_seamless"), &NoiseTexture::get_seamless);
ClassDB::bind_method(D_METHOD("set_seamless", "seamless"), &NoiseTexture2D::set_seamless);
ClassDB::bind_method(D_METHOD("get_seamless"), &NoiseTexture2D::get_seamless);

ClassDB::bind_method(D_METHOD("set_seamless_blend_skirt", "seamless_blend_skirt"), &NoiseTexture::set_seamless_blend_skirt);
ClassDB::bind_method(D_METHOD("get_seamless_blend_skirt"), &NoiseTexture::get_seamless_blend_skirt);
ClassDB::bind_method(D_METHOD("set_seamless_blend_skirt", "seamless_blend_skirt"), &NoiseTexture2D::set_seamless_blend_skirt);
ClassDB::bind_method(D_METHOD("get_seamless_blend_skirt"), &NoiseTexture2D::get_seamless_blend_skirt);

ClassDB::bind_method(D_METHOD("set_as_normal_map", "as_normal_map"), &NoiseTexture::set_as_normal_map);
ClassDB::bind_method(D_METHOD("is_normal_map"), &NoiseTexture::is_normal_map);
ClassDB::bind_method(D_METHOD("set_as_normal_map", "as_normal_map"), &NoiseTexture2D::set_as_normal_map);
ClassDB::bind_method(D_METHOD("is_normal_map"), &NoiseTexture2D::is_normal_map);

ClassDB::bind_method(D_METHOD("set_bump_strength", "bump_strength"), &NoiseTexture::set_bump_strength);
ClassDB::bind_method(D_METHOD("get_bump_strength"), &NoiseTexture::get_bump_strength);
ClassDB::bind_method(D_METHOD("set_bump_strength", "bump_strength"), &NoiseTexture2D::set_bump_strength);
ClassDB::bind_method(D_METHOD("get_bump_strength"), &NoiseTexture2D::get_bump_strength);

ClassDB::bind_method(D_METHOD("set_color_ramp", "gradient"), &NoiseTexture::set_color_ramp);
ClassDB::bind_method(D_METHOD("get_color_ramp"), &NoiseTexture::get_color_ramp);
ClassDB::bind_method(D_METHOD("set_color_ramp", "gradient"), &NoiseTexture2D::set_color_ramp);
ClassDB::bind_method(D_METHOD("get_color_ramp"), &NoiseTexture2D::get_color_ramp);

ClassDB::bind_method(D_METHOD("set_noise", "noise"), &NoiseTexture::set_noise);
ClassDB::bind_method(D_METHOD("get_noise"), &NoiseTexture::get_noise);
ClassDB::bind_method(D_METHOD("set_noise", "noise"), &NoiseTexture2D::set_noise);
ClassDB::bind_method(D_METHOD("get_noise"), &NoiseTexture2D::get_noise);

ADD_PROPERTY(PropertyInfo(Variant::INT, "width", PROPERTY_HINT_RANGE, "1,2048,1,or_greater,suffix:px"), "set_width", "get_width");
ADD_PROPERTY(PropertyInfo(Variant::INT, "height", PROPERTY_HINT_RANGE, "1,2048,1,or_greater,suffix:px"), "set_height", "get_height");
Expand All @@ -94,7 +94,7 @@ void NoiseTexture::_bind_methods() {
ADD_PROPERTY(PropertyInfo(Variant::OBJECT, "noise", PROPERTY_HINT_RESOURCE_TYPE, "Noise"), "set_noise", "get_noise");
}

void NoiseTexture::_validate_property(PropertyInfo &p_property) const {
void NoiseTexture2D::_validate_property(PropertyInfo &p_property) const {
if (p_property.name == "bump_strength") {
if (!as_normal_map) {
p_property.usage = PROPERTY_USAGE_NO_EDITOR;
Expand All @@ -108,7 +108,7 @@ void NoiseTexture::_validate_property(PropertyInfo &p_property) const {
}
}

void NoiseTexture::_set_texture_image(const Ref<Image> &p_image) {
void NoiseTexture2D::_set_texture_image(const Ref<Image> &p_image) {
image = p_image;
if (image.is_valid()) {
if (texture.is_valid()) {
Expand All @@ -121,7 +121,7 @@ void NoiseTexture::_set_texture_image(const Ref<Image> &p_image) {
emit_changed();
}

void NoiseTexture::_thread_done(const Ref<Image> &p_image) {
void NoiseTexture2D::_thread_done(const Ref<Image> &p_image) {
_set_texture_image(p_image);
noise_thread.wait_to_finish();
if (regen_queued) {
Expand All @@ -130,12 +130,12 @@ void NoiseTexture::_thread_done(const Ref<Image> &p_image) {
}
}

void NoiseTexture::_thread_function(void *p_ud) {
NoiseTexture *tex = static_cast<NoiseTexture *>(p_ud);
void NoiseTexture2D::_thread_function(void *p_ud) {
NoiseTexture2D *tex = static_cast<NoiseTexture2D *>(p_ud);
tex->call_deferred(SNAME("_thread_done"), tex->_generate_texture());
}

void NoiseTexture::_queue_update() {
void NoiseTexture2D::_queue_update() {
if (update_queued) {
return;
}
Expand All @@ -144,7 +144,7 @@ void NoiseTexture::_queue_update() {
call_deferred(SNAME("_update_texture"));
}

Ref<Image> NoiseTexture::_generate_texture() {
Ref<Image> NoiseTexture2D::_generate_texture() {
// Prevent memdelete due to unref() on other thread.
Ref<Noise> ref_noise = noise;

Expand Down Expand Up @@ -172,7 +172,7 @@ Ref<Image> NoiseTexture::_generate_texture() {
return image;
}

Ref<Image> NoiseTexture::_modulate_with_gradient(Ref<Image> p_image, Ref<Gradient> p_gradient) {
Ref<Image> NoiseTexture2D::_modulate_with_gradient(Ref<Image> p_image, Ref<Gradient> p_gradient) {
int width = p_image->get_width();
int height = p_image->get_height();

Expand All @@ -191,7 +191,7 @@ Ref<Image> NoiseTexture::_modulate_with_gradient(Ref<Image> p_image, Ref<Gradien
return new_image;
}

void NoiseTexture::_update_texture() {
void NoiseTexture2D::_update_texture() {
bool use_thread = true;
if (first_time) {
use_thread = false;
Expand All @@ -215,25 +215,25 @@ void NoiseTexture::_update_texture() {
update_queued = false;
}

void NoiseTexture::set_noise(Ref<Noise> p_noise) {
void NoiseTexture2D::set_noise(Ref<Noise> p_noise) {
if (p_noise == noise) {
return;
}
if (noise.is_valid()) {
noise->disconnect(CoreStringNames::get_singleton()->changed, callable_mp(this, &NoiseTexture::_queue_update));
noise->disconnect(CoreStringNames::get_singleton()->changed, callable_mp(this, &NoiseTexture2D::_queue_update));
}
noise = p_noise;
if (noise.is_valid()) {
noise->connect(CoreStringNames::get_singleton()->changed, callable_mp(this, &NoiseTexture::_queue_update));
noise->connect(CoreStringNames::get_singleton()->changed, callable_mp(this, &NoiseTexture2D::_queue_update));
}
_queue_update();
}

Ref<Noise> NoiseTexture::get_noise() {
Ref<Noise> NoiseTexture2D::get_noise() {
return noise;
}

void NoiseTexture::set_width(int p_width) {
void NoiseTexture2D::set_width(int p_width) {
ERR_FAIL_COND(p_width <= 0);
if (p_width == size.x) {
return;
Expand All @@ -242,7 +242,7 @@ void NoiseTexture::set_width(int p_width) {
_queue_update();
}

void NoiseTexture::set_height(int p_height) {
void NoiseTexture2D::set_height(int p_height) {
ERR_FAIL_COND(p_height <= 0);
if (p_height == size.y) {
return;
Expand All @@ -251,42 +251,42 @@ void NoiseTexture::set_height(int p_height) {
_queue_update();
}

void NoiseTexture::set_invert(bool p_invert) {
void NoiseTexture2D::set_invert(bool p_invert) {
if (p_invert == invert) {
return;
}
invert = p_invert;
_queue_update();
}

bool NoiseTexture::get_invert() const {
bool NoiseTexture2D::get_invert() const {
return invert;
}

void NoiseTexture::set_in_3d_space(bool p_enable) {
void NoiseTexture2D::set_in_3d_space(bool p_enable) {
if (p_enable == in_3d_space) {
return;
}
in_3d_space = p_enable;
_queue_update();
}
bool NoiseTexture::is_in_3d_space() const {
bool NoiseTexture2D::is_in_3d_space() const {
return in_3d_space;
}

void NoiseTexture::set_generate_mipmaps(bool p_enable) {
void NoiseTexture2D::set_generate_mipmaps(bool p_enable) {
if (p_enable == generate_mipmaps) {
return;
}
generate_mipmaps = p_enable;
_queue_update();
}

bool NoiseTexture::is_generating_mipmaps() const {
bool NoiseTexture2D::is_generating_mipmaps() const {
return generate_mipmaps;
}

void NoiseTexture::set_seamless(bool p_seamless) {
void NoiseTexture2D::set_seamless(bool p_seamless) {
if (p_seamless == seamless) {
return;
}
Expand All @@ -295,11 +295,11 @@ void NoiseTexture::set_seamless(bool p_seamless) {
notify_property_list_changed();
}

bool NoiseTexture::get_seamless() {
bool NoiseTexture2D::get_seamless() {
return seamless;
}

void NoiseTexture::set_seamless_blend_skirt(real_t p_blend_skirt) {
void NoiseTexture2D::set_seamless_blend_skirt(real_t p_blend_skirt) {
ERR_FAIL_COND(p_blend_skirt < 0.05 || p_blend_skirt > 1);

if (p_blend_skirt == seamless_blend_skirt) {
Expand All @@ -308,11 +308,11 @@ void NoiseTexture::set_seamless_blend_skirt(real_t p_blend_skirt) {
seamless_blend_skirt = p_blend_skirt;
_queue_update();
}
real_t NoiseTexture::get_seamless_blend_skirt() {
real_t NoiseTexture2D::get_seamless_blend_skirt() {
return seamless_blend_skirt;
}

void NoiseTexture::set_as_normal_map(bool p_as_normal_map) {
void NoiseTexture2D::set_as_normal_map(bool p_as_normal_map) {
if (p_as_normal_map == as_normal_map) {
return;
}
Expand All @@ -321,11 +321,11 @@ void NoiseTexture::set_as_normal_map(bool p_as_normal_map) {
notify_property_list_changed();
}

bool NoiseTexture::is_normal_map() {
bool NoiseTexture2D::is_normal_map() {
return as_normal_map;
}

void NoiseTexture::set_bump_strength(float p_bump_strength) {
void NoiseTexture2D::set_bump_strength(float p_bump_strength) {
if (p_bump_strength == bump_strength) {
return;
}
Expand All @@ -335,44 +335,44 @@ void NoiseTexture::set_bump_strength(float p_bump_strength) {
}
}

float NoiseTexture::get_bump_strength() {
float NoiseTexture2D::get_bump_strength() {
return bump_strength;
}

void NoiseTexture::set_color_ramp(const Ref<Gradient> &p_gradient) {
void NoiseTexture2D::set_color_ramp(const Ref<Gradient> &p_gradient) {
if (p_gradient == color_ramp) {
return;
}
if (color_ramp.is_valid()) {
color_ramp->disconnect(CoreStringNames::get_singleton()->changed, callable_mp(this, &NoiseTexture::_queue_update));
color_ramp->disconnect(CoreStringNames::get_singleton()->changed, callable_mp(this, &NoiseTexture2D::_queue_update));
}
color_ramp = p_gradient;
if (color_ramp.is_valid()) {
color_ramp->connect(CoreStringNames::get_singleton()->changed, callable_mp(this, &NoiseTexture::_queue_update));
color_ramp->connect(CoreStringNames::get_singleton()->changed, callable_mp(this, &NoiseTexture2D::_queue_update));
}
_queue_update();
}

Ref<Gradient> NoiseTexture::get_color_ramp() const {
Ref<Gradient> NoiseTexture2D::get_color_ramp() const {
return color_ramp;
}

int NoiseTexture::get_width() const {
int NoiseTexture2D::get_width() const {
return size.x;
}

int NoiseTexture::get_height() const {
int NoiseTexture2D::get_height() const {
return size.y;
}

RID NoiseTexture::get_rid() const {
RID NoiseTexture2D::get_rid() const {
if (!texture.is_valid()) {
texture = RS::get_singleton()->texture_2d_placeholder_create();
}

return texture;
}

Ref<Image> NoiseTexture::get_image() const {
Ref<Image> NoiseTexture2D::get_image() const {
return image;
}
Loading

0 comments on commit c54125d

Please sign in to comment.