From 041fe20f64ef7aea0586183fa72462370a54e470 Mon Sep 17 00:00:00 2001 From: nevarek Date: Wed, 6 Jan 2021 19:01:21 -0800 Subject: [PATCH] Optimize data format for OpenSimplex images The previous RGBA format included unused RGB data. Using the LA8 format removes the need to store the extra data. The Docs have been updated to reflect the format changes. --- .../doc_classes/OpenSimplexNoise.xml | 4 ++-- modules/opensimplex/open_simplex_noise.cpp | 20 ++++++------------- 2 files changed, 8 insertions(+), 16 deletions(-) diff --git a/modules/opensimplex/doc_classes/OpenSimplexNoise.xml b/modules/opensimplex/doc_classes/OpenSimplexNoise.xml index 9fe4c9c24995..dcda5c2324c5 100644 --- a/modules/opensimplex/doc_classes/OpenSimplexNoise.xml +++ b/modules/opensimplex/doc_classes/OpenSimplexNoise.xml @@ -32,7 +32,7 @@ - Generate a noise image with the requested [code]width[/code] and [code]height[/code], based on the current noise parameters. + Generate a noise image in [constant Image.FORMAT_L8] format with the requested [code]width[/code] and [code]height[/code], based on the current noise parameters. @@ -108,7 +108,7 @@ - Generate a tileable noise image, based on the current noise parameters. Generated seamless images are always square ([code]size[/code] × [code]size[/code]). + Generate a tileable noise image in [constant Image.FORMAT_L8] format, based on the current noise parameters. Generated seamless images are always square ([code]size[/code] × [code]size[/code]). diff --git a/modules/opensimplex/open_simplex_noise.cpp b/modules/opensimplex/open_simplex_noise.cpp index aded4d2a07f7..ece2f7eb6971 100644 --- a/modules/opensimplex/open_simplex_noise.cpp +++ b/modules/opensimplex/open_simplex_noise.cpp @@ -104,7 +104,7 @@ void OpenSimplexNoise::set_lacunarity(float p_lacunarity) { Ref OpenSimplexNoise::get_image(int p_width, int p_height) const { Vector data; - data.resize(p_width * p_height * 4); + data.resize(p_width * p_height); uint8_t *wd8 = data.ptrw(); @@ -112,21 +112,17 @@ Ref OpenSimplexNoise::get_image(int p_width, int p_height) const { for (int j = 0; j < p_width; j++) { float v = get_noise_2d(j, i); v = v * 0.5 + 0.5; // Normalize [0..1] - uint8_t value = uint8_t(CLAMP(v * 255.0, 0, 255)); - wd8[(i * p_width + j) * 4 + 0] = value; - wd8[(i * p_width + j) * 4 + 1] = value; - wd8[(i * p_width + j) * 4 + 2] = value; - wd8[(i * p_width + j) * 4 + 3] = 255; + wd8[(i * p_width + j)] = uint8_t(CLAMP(v * 255.0, 0, 255)); } } - Ref image = memnew(Image(p_width, p_height, false, Image::FORMAT_RGBA8, data)); + Ref image = memnew(Image(p_width, p_height, false, Image::FORMAT_L8, data)); return image; } Ref OpenSimplexNoise::get_seamless_image(int p_size) const { Vector data; - data.resize(p_size * p_size * 4); + data.resize(p_size * p_size); uint8_t *wd8 = data.ptrw(); @@ -147,15 +143,11 @@ Ref OpenSimplexNoise::get_seamless_image(int p_size) const { float v = get_noise_4d(x, y, z, w); v = v * 0.5 + 0.5; // Normalize [0..1] - uint8_t value = uint8_t(CLAMP(v * 255.0, 0, 255)); - wd8[(i * p_size + j) * 4 + 0] = value; - wd8[(i * p_size + j) * 4 + 1] = value; - wd8[(i * p_size + j) * 4 + 2] = value; - wd8[(i * p_size + j) * 4 + 3] = 255; + wd8[(i * p_size + j)] = uint8_t(CLAMP(v * 255.0, 0, 255)); } } - Ref image = memnew(Image(p_size, p_size, false, Image::FORMAT_RGBA8, data)); + Ref image = memnew(Image(p_size, p_size, false, Image::FORMAT_L8, data)); return image; }