aboutsummaryrefslogtreecommitdiff
path: root/game/addons/zylann.hterrain/tools/packed_textures/packed_texture_util.gd
diff options
context:
space:
mode:
Diffstat (limited to 'game/addons/zylann.hterrain/tools/packed_textures/packed_texture_util.gd')
-rw-r--r--game/addons/zylann.hterrain/tools/packed_textures/packed_texture_util.gd86
1 files changed, 86 insertions, 0 deletions
diff --git a/game/addons/zylann.hterrain/tools/packed_textures/packed_texture_util.gd b/game/addons/zylann.hterrain/tools/packed_textures/packed_texture_util.gd
new file mode 100644
index 0000000..4032212
--- /dev/null
+++ b/game/addons/zylann.hterrain/tools/packed_textures/packed_texture_util.gd
@@ -0,0 +1,86 @@
+@tool
+
+const HT_Logger = preload("../../util/logger.gd")
+const HT_Errors = preload("../../util/errors.gd")
+const HT_Result = preload("../util/result.gd")
+
+const _transform_params = [
+ "normalmap_flip_y"
+]
+
+
+# sources: {
+# "a": "path_to_image_where_red_channel_will_be_stored_in_alpha.png",
+# "rgb": "path_to_image_where_rgb_channels_will_be_stored.png"
+# "rgba": "path_to_image.png",
+# "rgb": "#hexcolor"
+# }
+static func generate_image(sources: Dictionary, resolution: int, logger) -> HT_Result:
+ var image := Image.create(resolution, resolution, true, Image.FORMAT_RGBA8)
+
+ var flip_normalmap_y := false
+
+ # TODO Accelerate with GDNative
+ for key in sources:
+ if key in _transform_params:
+ continue
+
+ var src_path : String = sources[key]
+
+ logger.debug(str("Processing source \"", src_path, "\""))
+
+ var src_image : Image
+ if src_path.begins_with("#"):
+ # Plain color
+ var col = Color(src_path)
+ src_image = Image.create(resolution, resolution, false, Image.FORMAT_RGBA8)
+ src_image.fill(col)
+
+ else:
+ # File
+ src_image = Image.new()
+ var err := src_image.load(src_path)
+ if err != OK:
+ return HT_Result.new(false, "Could not open file \"{0}\": {1}" \
+ .format([src_path, HT_Errors.get_message(err)])) \
+ .with_value(err)
+ src_image.decompress()
+
+ src_image.resize(image.get_width(), image.get_height())
+
+ # TODO Support more channel configurations
+ if key == "rgb":
+ for y in image.get_height():
+ for x in image.get_width():
+ var dst_col := image.get_pixel(x, y)
+ var a := dst_col.a
+ dst_col = src_image.get_pixel(x, y)
+ dst_col.a = a
+ image.set_pixel(x, y, dst_col)
+
+ elif key == "a":
+ for y in image.get_height():
+ for x in image.get_width():
+ var dst_col := image.get_pixel(x, y)
+ dst_col.a = src_image.get_pixel(x, y).r
+ image.set_pixel(x, y, dst_col)
+
+ elif key == "rgba":
+ # Meh
+ image.blit_rect(src_image,
+ Rect2i(0, 0, image.get_width(), image.get_height()), Vector2i())
+
+ if sources.has("normalmap_flip_y") and sources.normalmap_flip_y:
+ _flip_normalmap_y(image)
+
+ return HT_Result.new(true).with_value(image)
+
+
+static func _flip_normalmap_y(image: Image):
+ for y in image.get_height():
+ for x in image.get_width():
+ var col := image.get_pixel(x, y)
+ col.g = 1.0 - col.g
+ image.set_pixel(x, y, col)
+
+