diff options
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.gd | 86 |
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) + + |