From f40b1bee2eadb233f5a5574577ca34c58f711337 Mon Sep 17 00:00:00 2001 From: Rob Kelly Date: Sun, 16 Mar 2025 18:55:44 -0600 Subject: [PATCH] CanvasItem retro shader --- levels/ghost_ship/ghost_ship.tscn | 5 +- levels/sandbox/sandbox.tscn | 71 +++++------ src/shaders/canvas_retro.gdshader | 168 ++++++++++++++++++++++++++ src/shaders/canvas_retro.gdshader.uid | 1 + src/ui/post_processing.tscn | 20 +++ 5 files changed, 229 insertions(+), 36 deletions(-) create mode 100644 src/shaders/canvas_retro.gdshader create mode 100644 src/shaders/canvas_retro.gdshader.uid create mode 100644 src/ui/post_processing.tscn diff --git a/levels/ghost_ship/ghost_ship.tscn b/levels/ghost_ship/ghost_ship.tscn index 5327f78..3dfd10a 100644 --- a/levels/ghost_ship/ghost_ship.tscn +++ b/levels/ghost_ship/ghost_ship.tscn @@ -1,8 +1,9 @@ -[gd_scene load_steps=4 format=3 uid="uid://bov4ok76woyc"] +[gd_scene load_steps=5 format=3 uid="uid://bov4ok76woyc"] [ext_resource type="PackedScene" uid="uid://crydi5cjgfwe5" path="res://levels/ghost_ship/ghost_ship_level.tscn" id="1_aj2m7"] [ext_resource type="Environment" uid="uid://bkvij3ljl5ox3" path="res://levels/ghost_ship/environment_3.tres" id="1_wwgrl"] [ext_resource type="PackedScene" uid="uid://bwe2jdmvinhqd" path="res://src/player/player.tscn" id="2_0ef5p"] +[ext_resource type="PackedScene" uid="uid://d1kacn4b60ucy" path="res://src/ui/post_processing.tscn" id="3_o7mxe"] [node name="GhostShip" type="Node3D"] @@ -53,5 +54,7 @@ visible = false light_energy = 1.6 omni_range = 10.0 +[node name="PostProcessing" parent="." instance=ExtResource("3_o7mxe")] + [node name="Player" parent="." instance=ExtResource("2_0ef5p")] transform = Transform3D(-1, 0, -8.74228e-08, 0, 1, 0, 8.74228e-08, 0, -1, 0, 1, 0) diff --git a/levels/sandbox/sandbox.tscn b/levels/sandbox/sandbox.tscn index 083aed6..772c27d 100644 --- a/levels/sandbox/sandbox.tscn +++ b/levels/sandbox/sandbox.tscn @@ -1,33 +1,18 @@ -[gd_scene load_steps=45 format=4 uid="uid://16ds4fvv72xk"] +[gd_scene load_steps=47 format=4 uid="uid://16ds4fvv72xk"] [ext_resource type="PackedScene" uid="uid://c2omlx4ptrc01" path="res://src/world/gunk_body/gunk_body.tscn" id="1_a67lu"] +[ext_resource type="Environment" uid="uid://bkvij3ljl5ox3" path="res://levels/ghost_ship/environment_3.tres" id="1_fk1xc"] [ext_resource type="PackedScene" uid="uid://bwe2jdmvinhqd" path="res://src/player/player.tscn" id="1_h436a"] [ext_resource type="Texture2D" uid="uid://8cm835h4gxwe" path="res://assets/debug_mask.png" id="2_2roq2"] [ext_resource type="Shader" uid="uid://ckxc0ngd37rtk" path="res://src/shaders/gunk.gdshader" id="5_rdjtm"] [ext_resource type="FastNoiseLite" uid="uid://cnlvdtx68giv6" path="res://assets/materials/gunk_noise.tres" id="6_l64ek"] [ext_resource type="ArrayMesh" uid="uid://cqd0a7ousx01n" path="res://assets/level/hallway/hallway_1.mesh" id="7_fk1xc"] +[ext_resource type="Material" uid="uid://byyjoruj8mwe0" path="res://levels/sandbox/debug_gunk_mat.tres" id="7_sh2xs"] [ext_resource type="ArrayMesh" uid="uid://5jt7xxr05lw3" path="res://assets/level/hallway/hallway_2.mesh" id="8_hrvvi"] [ext_resource type="ArrayMesh" uid="uid://o6k7ebet848p" path="res://assets/level/hallway/hallway_3.mesh" id="9_2roq2"] [ext_resource type="PackedScene" uid="uid://b6eg8t04rkh0c" path="res://src/props/wall_switch/wall_switch.tscn" id="9_p27ol"] [ext_resource type="PackedScene" uid="uid://2yqi5u5eo025" path="res://src/world/gunk_node/grunk_nodule.tscn" id="10_2roq2"] - -[sub_resource type="ProceduralSkyMaterial" id="ProceduralSkyMaterial_cj8bk"] - -[sub_resource type="Sky" id="Sky_hrvvi"] -sky_material = SubResource("ProceduralSkyMaterial_cj8bk") - -[sub_resource type="Environment" id="Environment_cc548"] -background_mode = 1 -sky = SubResource("Sky_hrvvi") -ambient_light_source = 2 -ambient_light_color = Color(1, 1, 1, 1) -ambient_light_energy = 0.06 -tonemap_mode = 3 -glow_enabled = true -glow_bloom = 0.1 -fog_enabled = true -fog_light_color = Color(0, 0, 0, 1) -fog_density = 0.2 +[ext_resource type="PackedScene" uid="uid://d1kacn4b60ucy" path="res://src/ui/post_processing.tscn" id="11_6fwow"] [sub_resource type="PlaneMesh" id="PlaneMesh_4afx3"] size = Vector2(50, 50) @@ -113,7 +98,26 @@ shadow_mesh = SubResource("ArrayMesh_24j8i") [sub_resource type="ConcavePolygonShape3D" id="ConcavePolygonShape3D_nxc47"] data = PackedVector3Array(0.7236, -0.4472, 0.5257, 0, -1, 0, -0.2764, -0.4472, 0.8506, 0, -1, 0, 0.7236, -0.4472, 0.5257, 0.7236, -0.4472, -0.5257, -0.2764, -0.4472, 0.8506, 0, -1, 0, -0.8944, -0.4472, 0, -0.8944, -0.4472, 0, 0, -1, 0, -0.2764, -0.4472, -0.8506, -0.2764, -0.4472, -0.8506, 0, -1, 0, 0.7236, -0.4472, -0.5257, 0.7236, -0.4472, -0.5257, 0.7236, -0.4472, 0.5257, 0.8944, 0.4472, 0, 0.7236, -0.4472, 0.5257, -0.2764, -0.4472, 0.8506, 0.2764, 0.4472, 0.8506, -0.2764, -0.4472, 0.8506, -0.8944, -0.4472, 0, -0.7236, 0.4472, 0.5257, -0.8944, -0.4472, 0, -0.2764, -0.4472, -0.8506, -0.7236, 0.4472, -0.5257, -0.2764, -0.4472, -0.8506, 0.7236, -0.4472, -0.5257, 0.2764, 0.4472, -0.8506, 0.8944, 0.4472, 0, 0.7236, -0.4472, 0.5257, 0.2764, 0.4472, 0.8506, 0.2764, 0.4472, 0.8506, -0.2764, -0.4472, 0.8506, -0.7236, 0.4472, 0.5257, -0.7236, 0.4472, 0.5257, -0.8944, -0.4472, 0, -0.7236, 0.4472, -0.5257, -0.7236, 0.4472, -0.5257, -0.2764, -0.4472, -0.8506, 0.2764, 0.4472, -0.8506, 0.2764, 0.4472, -0.8506, 0.7236, -0.4472, -0.5257, 0.8944, 0.4472, 0, 0.8944, 0.4472, 0, 0.2764, 0.4472, 0.8506, 0, 1, 0, 0.2764, 0.4472, 0.8506, -0.7236, 0.4472, 0.5257, 0, 1, 0, -0.7236, 0.4472, 0.5257, -0.7236, 0.4472, -0.5257, 0, 1, 0, -0.7236, 0.4472, -0.5257, 0.2764, 0.4472, -0.8506, 0, 1, 0, 0.2764, 0.4472, -0.8506, 0.8944, 0.4472, 0, 0, 1, 0) -[sub_resource type="ShaderMaterial" id="ShaderMaterial_2roq2"] +[sub_resource type="CompressedTexture2D" id="CompressedTexture2D_rp2qp"] +load_path = "res://.godot/imported/debug_mask.png-fd2bc783338ed9439fe81a4eef9d86da.s3tc.ctex" + +[sub_resource type="NoiseTexture3D" id="NoiseTexture3D_if0c2"] +width = 256 +height = 256 +depth = 32 +seamless = true +seamless_blend_skirt = 0.5 +noise = ExtResource("6_l64ek") + +[sub_resource type="NoiseTexture3D" id="NoiseTexture3D_2pd8h"] +width = 256 +height = 256 +depth = 32 +seamless = true +seamless_blend_skirt = 0.5 +noise = ExtResource("6_l64ek") + +[sub_resource type="ShaderMaterial" id="ShaderMaterial_2218n"] resource_local_to_scene = true render_priority = 0 shader = ExtResource("5_rdjtm") @@ -125,20 +129,17 @@ shader_parameter/time_pixellation = 30.0 shader_parameter/roughness = 0.15 shader_parameter/specular_contribution = 0.8 shader_parameter/emission_strength = 0.02 -shader_parameter/uv_scale = Vector2(8, 8) +shader_parameter/uv_scale = Vector2(4, 4) shader_parameter/time_scale = 0.2 shader_parameter/edge_bleed = 0.25 -shader_parameter/gunk_mask = SubResource("CompressedTexture2D_hrvvi") -shader_parameter/gunk_noise = SubResource("NoiseTexture3D_2roq2") -shader_parameter/gunk_normal_map = SubResource("NoiseTexture3D_fk1xc") +shader_parameter/gunk_mask = SubResource("CompressedTexture2D_rp2qp") +shader_parameter/gunk_noise = SubResource("NoiseTexture3D_if0c2") +shader_parameter/gunk_normal_map = SubResource("NoiseTexture3D_2pd8h") shader_parameter/jitter_magnitude = 0.0 shader_parameter/jitter_time_scale = 0.1 shader_parameter/vertex_inflation = 0.0 shader_parameter/inflation_pixellation = 10.0 -[sub_resource type="StandardMaterial3D" id="StandardMaterial3D_2h3rs"] -albedo_color = Color(1, 0.403922, 1, 1) - [sub_resource type="ArrayMesh" id="ArrayMesh_tquao"] _surfaces = [{ "aabb": AABB(-1.36719, -0.984375, -0.851562, 2.73438, 1.96875, 1.70312), @@ -162,7 +163,7 @@ _surfaces = [{ "index_count": 2904, "index_data": PackedByteArray("OwE8AT0BAQA9AQAAPQE+AQAAAAA+AQIAPQE8AT4BsgA9AQEAsgA7AT0BBwCyAAEAPgG3AAIAAgC3AAQAPAG2AD4BPgG2ALcABgCyAAcACAAGAAcABgA/AbIAPwE7AbIAQAEGAAgABQBAAQgAQQE/AQYAQAFBAQYAtABAAQUAAwC0AAUAQgFBAUABtABCAUABtQC0AAMABAC1AAMAtwC1AAQAtQBDAbQAQwFCAbQAtwBEAbUARAFDAbUAtgBEAbcAQgFDAWkAQwFEAUUBaQBDAUUBRQFEAWgARAG2AGgARQGzAGkAaACzAEUBRgFCAWkAaQCzAEYBQQFCAUYBaAC2AEcBRwGzAGgAtgA8AUcBSAFBAUYBRgGzAEgBPwFBAUgBRwE8AUkBSQGzAEcBPAE7AUkBZwBIAbMAZwA/AUgBZwCzAEkBOwE/AWcASQE7AWcASgG4AEsBuAAJAAoAuQAJALgASgG5ALgAuQAPAAkAuAAKAEwBSwG4AEwBTAEKAAsADgAPALkADgARAA8ATQG5AEoBTQEOALkATAELAL4AvgALAA0AawBMAb4ASwFMAWsAvgANAL0AvQANAAwAawC+AE4BTgG+AL0AawBPAUsBTgFQAWsAawBQAU8BvQAMALsAuwAMABAATgG9ALwAvAC9ALsATgFRAVABvABRAU4BTwFQAboAUAFRAboASwFPAVIBUgFPAboASwFSAUoBSgFSAWoAagBSAboASgFqAE0BvABsAFEBUQFsALoAUwFsALwAvAC7AFMBbABUAboAUwFUAWwAagC6AFUBVAFVAboATQFqAFUBVgFVAVQBTQFVAVYBVgFUAVMBVgEOAE0BUwG7AFcBUwFXAVYBVgFXAQ4AuwAQAFcBVwERAA4AVwEQABEAWAG/AFkBWQG/AFoBWgG/ABwAlABZAVoBWgEcAJQAWwFZAZQAHAC/AFwBWAFdAb8AvwBdAVwBXAFdAcQAXgFdAVgBxABuAFwBXQHGAMQAXgHGAF0BxADGAG4AWAE/AF4BxwDGAF4BWQHAAFgBwAA/AFgBXgFtAMcAPwBtAF4BxwBfAcYAxgBfAW4AYAFfAccAxwBtAGABbgBfAWEBYAFiAV8BXwFiAWEBYwFuAGEBXAFuAGQBZAFuAGMBZAEcAFwBxQAcAGQBYwHFAGQBQQDFAGMBYQFlAWMBYQFiAWUBZgFBAGMBYwFlAWYBZwFBAGYBZgFxAGcBcABxAGYBZgFlAXAAcABGAHEAZQFiAQABcABlAQABcgBGAHAAcgBoAUYAaQFoAXIAaQFzAGgBagFzAGkBagEvAHMAaQFyAAIBAgFqAWkBBAEvAGoBAgEEAWoBBAF1AC8AcgBwAGsBAgFyAGsBawFwAP8AcAAAAf8AawFRAAIBAgFRAAMBawF0AFEA/wB0AGsBUQB0AHcAAwFSAAIBbAEEAQIBAgFSAGwBbQEEAWwBbAFSAG0BCAEEAW0BCAF1AAQBCAEJAXUAbQFSAG4BCgEJAQgBbwEIAW0BbgFvAW0BCgEIAW8BbgFSAHYAdgBvAW4BCgELAQkBdgBSAC4AcAEKAW8BdgBwAW8BDAELAQoBDAEKAXABDAFUAAsBLgB4AHYAcQF4AC4ABwF4AHEBBgF4AAcBdgB4AFMAUwBwAXYABQF4AAYBdwAFAQYBeAD9AFMABQH9AHgAdwB0AAUBdAD9AAUBUwANAXABDQEMAXABUwD9AHIBcgENAVMAcgFzAQ0BcwF7AA0BMQBzAXIB/QAxAHIBegAMAQ0BDQF7AHoAegBUAAwBewBVAHoAegBVAFQAVQAwAFQAdAFVAHsAdQFVAHQBeQAxAP0AdAB5AP0A/gB5AHQA/wD+AHQAeQD8ADEARQD+AP8AAAFFAP8A/gB2AXkAdgH8AHkAdwF2Af4ARQB3Af4A/AD7ADEAMQD7AHgB/AB2AfkAdgF3AfoA+QB2AfoAeQH8APkA+wD8AHkB+wDuAHgBeAHuAH0AegH7AHkB7gD7AHoB+QB7AXkB7gCBAH0AfQCBAHwBNgDuAHoBgQDuADYAeQF8AHoBeQF7AXwAgQDsAHwBfAHsAH0B7ACBAH4BfgGBADYA7ADrAH0BfQHrAFAA7QDsAH4B6wDsAO0AfgF/Ae0A6wDqAFAAUADqAB0A6gDoAB0ATwDrAO0A6gDrAE8A7QB/AU8A5wDoAOoA6gBPAOcA5wCCAOgA5gCCAOcA5gCAAYIA5wDpAOYA5wBPAOkAgwCAAeYAgwDkAIAB5gDpAIEB5gCBAYMAggGBAekA6QBPAIIBgwCBAU4A5QDkAIMAgwBOAOUA5QCDAeQAhQCDAeUAhQATAIMB5QCEAYUA5QBOAIQBhQFOAIEBhQGBAYIBhAFOAIYBhwFOAIUBhgFOAIcBggGIAYUBhQHvAIcBhQGIAe8AhwHvAIkBhwGJAYYBiAEkAO8A7wAkACIA7wAiAIkBiAElACQAiQEiACMAigElAIgBggGKAYgBigEhACUAiQEjAPAAhgGJAfAA8AAjABgAhgHwAJoAmgCEAYYB8AAYAIsBmgDwAIsBiwEYABcAjAGEAZoAhQCEAYwBmgCLAY0BjQGMAZoAiwEXAI4BjQGLAY4BjgEXABYAhQCMAeMAhgCMAY0B4wCMAYYA4wATAIUAjwGGAI0BjQGOAY8BjgEWAPEAjwGOAfEA8QAWABQA8QAUAJABkAEUABUAjwHxAJEBkQHxAJAB8gCGAI8BkQHyAI8BkgGGAPIA4wCGAJIBkAEVAJMBkwEVABsAkQGQAfMA8wCQAZMBlAHyAJEB8wCUAZEBlQHyAJQBkgHyAJUBkwEbAJYBlgEbAB8A8wCTAR4AHgCTAZYBkwCUAfMAHgCTAPMAlwGUAZMAlQGUAZcB9ACTAB4AlgEfAJgBmAEfACAAHgCWAZkBmQGWAZgBmQGZAB4AHgCZAPQAmQGYAZoBmQGaAZkAmAEgAJsBmgGYAZsBmwEgACEAmwEhAIoBnAGbAYoBmgGbAZwBnAGKAYIBggFPAJwBnAGdAZoBTwCdAZwBmQCaAZ0BTwCeAZ0BTwB/AZ4BnQGeAZ8BnwGZAJ0BngF/AaABnwGeAaEBoQGeAaABoQGgASoAKgCgASwAKQChASoAoAGiASwAoAF/AaIBLACiASsAowGhASkAowGfAaEBKACjASkApAGfAaMBpAGZAJ8BpQGjASgApQGkAaMBJwClASgApAEmAJkAJgCkAaUBpgGlAScApgEmAKUBMgCmAScAmQAmAPUApwGmATIAMwCnATIAfgAmAKYBpwF+AKYB+ACnATMAqAEmAH4A9QAmAKgBNAD4ADMAqQF+AKcB+ACpAacBqAF+AKoBqgF+AKkBqwH4ADQANQCrATQArAGpAfgAqwGsAfgAqgGpAfoA+gCpAawB+gCsAfkA+QCsAXsBewGsAasB+gB3AaoBrQF7AasBrQGrATUAfAB7Aa0BNwCtATUAdwGuAaoBqgGuAagBrgF3AUUArgF/AKgBRQB/AK4B9wCtATcA9wB8AK0BOAD3ADcArwF8APcAegF8AK8BsAH3ADgAsAGvAfcAegGvATYALQCwATgA9gCwAS0AKwD2AC0AogH2ACsAsQGvAbABNgCvAbEB9gCxAbABsQGyATYAsgGxAfYAogGyAfYANgCyAX4BfwGyAaIBsgF/AX4BwgBbAbMBswFbAZQAlAC0AbMBlAAcALQBswG0AdAAHAC1AbQB0QC1ARwA0AC0AZIAkgC0AbUB0QC2AbUBtQG2AZIARAC2AdEAswHQAM8AzwDQAJIAzwDCALMBRAC3AbYBuAG3AUQAjgC3AbgBRwC3AY4ASABHAI4AuQG2AbcBtwFHALkBugG2AbkBkgC2AboBzwCSALsBuwGSALoBuwHNAM8AzQDCAM8AuwG6AbwBvAG6AbkBvQHNALsBvAG9AbsBygDCAM0AzQC9AcoAuQGRALwBuQFHAJEAvgG9AbwBygC9Ab8BvgG/Ab0BQgDCAMoAQgBbAcIAwwBbAUIAwwBZAVsBwAFZAcMAwAHAAFkBQgDBAcMAwwCVAMABwwDBAZUAQgDCAcEBygDCAUIAwQHDAZUAwgHJAMEBwQHJAMMBlQDDAcQBxAHDAckAwAGVAMUBlQDEAcUBwQDAAcUBwADAAcEAxQHEAcYBxwHEAckAxgHEAccBwgHHAckAyAHFAcYBwQDFAcgBxgHHAcgByQHBAMgBygHAAMEAygHBAMkBPwDAAMoByAGWAMkByAHHAZYAlgDKAckBywE/AMoBywHKAZYAxwHLAZYAbQA/AMsByADLAccByABtAMsByADHAcIBygDIAMIBzAHIAMoAzAFtAMgAygC/AcwBbQDMAc0BzAG/Ac4BzQHMAc4BYAFtAM0BvwHMAM4BzADNAc4BzQHLAGABzwHMAL8BzwG/Ab4B0AHNAcwA0AHLAM0BywBiAWABzADRAdAB0AHRAcsAlwDMAM8BzwG+AZcA0gFiAcsAywDRAdIB0wFiAdIBAAFiAdMBgADTAdIBAAHTAdQB1AFFAAAB1AHTAW8AbwDTAYAA1QFFANQB1QF/AEUA1AF/ANUBbwB/ANQBgAB/AG8A0gFAAIAA0QFAANIB9QB/AIAAqAF/APUAQADWAYAAgADWAfUA1wFAANEB2AHWAUAA2AFAANcB1gGYAPUA9QCYAJkA2QHWAdgB2QGYANYB0QHaAdcB2gHRAcwA2gHMAJcAmAD0AJkA1wHaAdsBlwDcAdoB2gHcAdsB1wHbAd0B3QHYAdcB3QHbAd4BDgHYAd0BDgHZAdgB3gHfAd0B3QHfAQ4B2wHgAd4B3AHgAdsB3gHgAd8B4QHZAQ4BDgHfAeEB4QEBAdkBAQGYANkB4gEBAeEB4QHfAeIB4gHjAQEB3wHjAeIB4wHkAQEBAQHkAZgA3wHlAeMB4wEQAeQB4wHlARAB5AEQAZgA3wHmAeUB5QHmARABDwHmAd8B3wHgAQ8BEAHmAecBEAHnAZgA5gEPAecBDwHgAegB5wEPAegB6AHgAdwBmADnAekB5wHoAekB6QH0AJgA6AHcAREB6QHoAREBEQHcAZcA6QHOAPQAEQHOAOkBlwDqAREBEQHqAc4AlwC+AeoBvAHqAb4B6wHqAbwB6wHOAOoBvAGRAOsBQwDOAOsB9ADOANIA0gDOAEMA0gCTAPQA6wHsAUMAkQDsAesBQwDsAdIAlwGTANIA0gDsAe0B0gBNAJcB7QFNANIA7QHsAU0A7AGRAE0AlwFNAJUBTQCRANMAlQFNANUATQDTANUAlQHVAJIBRwDTAJEAkgHVAJAAkgGQAOMA4wCQABMA1QCPAJAA1QDTAI8AkADZABMAkACPANkARwDuAdMA0wDuAY8AiwDuAUcAiwBHAEgA7wGLAEgAjwDuAY0A8AGLAO8BjADwAe8BiwDUAO4B7gHUAI0A8AHUAIsAjQBKAI8A8QHwAYwA1ADwAfEBGgDxAYwAjQDUANYA2wDxARoA2wDUAPEBiADbABoA1gDUAEkA8gHUANsASQDUAPIB2wDzAfIB8gHzAUkA2gDbAIgA2gDzAdsA3ADaAIgASQDzAfQB3QDaANwA9AGJAEkA3gDdANwA9QH0AfMB2gD1AfMB3QD1AdoAiQD0AfUBSQCJABIA3QD2AfUB9gGJAPUBhwDdAN4AhwD2Ad0ATACHAN4AhwDfAPYB4ACHAEwA4ADfAIcA4QDgAEwA4QBMABkA4gDgAOEA4gDfAOAA4QD3AeIAhAD3AeEA+AHfAOIA+AH5Ad8AEwD5AfgBEwDZAPkB+QFLAN8A3wBLAPYB2QBLAPkBSwCJAPYBigCJAEsAigBLANkAEgCJAIoAigD6ARIA2AD6AYoAigD7AdgA2QDXAIoA1wD7AYoAjwDXANkASgD7AdcAjwBKANcApgD8Af0B/QE6AKYA/gE6AP0B/QH8ASYB/gH9Af8BJgH8AScBJwH8AacA/QEmAQAC/wH9AQACqAD+Af8BKAH+AagAKAGoACoBJwGnACkB/wEAAgECqAD/AQICAgL/AQECAwKoAAICKQGnADsABAKoAAMCKgGoAAQCAgJjAAMCYwAEAgMCKgEEAgUCKgEFAqkABgIEAmMABQIEAgYCBwJjAAICAgIBAgcCCAIGAmMABQIGAggCLQFjAAcCCAJjAC0BLgEFAggCLQEuAQgCCQIFAi4BqQAFAgkCrAAuAS0BrAAJAi4BCQIvAakALwFiAKkACgIJAqwACgIvAQkCLQEwAawAMAEKAqwAqwBiAC8BCwIwAS0BLQEHAgsCMgFiAKsAMwFiADIBMgFlADMBCwIHAgwCBwIBAgwCCwI1ATABCwIMAqoAqgA1AQsCDAIBAg0CqgAMAg0CNQE2ATABNgEKAjABqgAxATUBNgE4AQoCCgI4AS8BYAA2ATUBMQFgADUBNgE3ATgBYAA3ATYBOAGtAC8BLwGtAKsAqwCtADIBOAFhAK0ANwFhADgBMgGtAGQArQBhAGQAYAApATcBNwE7AGEAKQE7ADcBNAEpAWAANAFgADEBNAEnASkBZABhAK4AYQA7AK4ArgA7ADkBOwCwADkBrgA6AWQAZAA6ATIBOQGvAK4AOQGwAK8ArwA6Aa4AsAAOAq8ArwAOAjoBDgKxADoBMgE6AWYAOgGxAGYAZgBlADIBsQBlAGYAOQBlALEAKwEnATQBKwEmAScBKwE0AQ8CDwI0ATEBpQAmASsBAAImAaUAEAIrAQ8CpQArARACAAKlABECEQKlABACAQIAAhECDQIBAhECEQIQAg0CLAEQAg8CDQIQAiwBLAEPAhICEgINAiwBEgIPAjEBqgANAhICEgIxAaoAEwIUApwAPAAUAhMCFQIUAjwAnAAUApsAFQIWAhQCmwATAZwAnAATAVYAFAIXApsAFAIWAhcCFQIUARYCEgEUARUCEgEYAhQBEwEVAVYAFgIZAhcCFAEaAhYCFgIaAhkCFAEbAhoCVgAVAT4AHAIbAhQBFAEYAhwCWAAaAhsCHAJYABsCGAIdAhwCGAJZAB0CHgJYABwCHAIdAh4CHwIaAlgAGgIfAhkCHgIgAlgAHQIgAh4CWAAYAR8CIAIYAVgAHQIZASACGQEYASACIQIZAR0CHQJZACECngAYARkBIQKeABkBGgEhAlkAoAAaAVkAIgKeACECIgIhAhoBGwEYAZ4AIgIbAZ4AIwIYARsBGAEjAh8CnwAaAaAAHwIjAiQCGQIfAiQCoAAcAZ8AHQEcAaAAXQAcAR0BoQAaAZ8AnwAcAaEAXgAcAV0AXQAlAl4APQAlAl0AJQIeAV4AHgEcAV4AowAeASUCoQAcAVwAXAAcAR4BowCkAB4BXwCkAKMAXwAfAaQApACiAB4BHgGiAFwAHwGiAKQAPgAfAV8APgCiAB8BWwBcAKIAWwCiAD4AoQBcAFsAPgAhAVsAWwAgAaEAIQEgAVsAIAEaAaEAFQEhAT4AIAEiAhoBIgEiAiABIQEiASABIgEbASICFQFaACEBWgAiASEBIgEjARsBWgAjASIBIwEjAhsBJQFaABUBEwElARUBWgAkASMBJQEkAVoAnQAjAiMBJAGdACMBIwKdACQCJAKdACYCJAImAhkCJwKdACQBnQAnAiYCJQEoAiQBKAInAiQBFwEnAigCJgInAhcBVwAoAiUBVwAlARMBmwBXABMBFwEoAikCKQImAhcBVwApAigCFgFXAJsAFgEpAlcAmwAXAhYBKgImAikCFgEqAikCFwIqAhYBGQImAioCFwIZAioC"), "lods": [0.157855, PackedByteArray("AABnAAIAsgBnAAAAsgAAAAEABwCyAAEABgCyAAcABgBnALIACAAGAAcAaQBnAAYACABpAAYAaQCzAGcAtABpAAgAtAAIAAUAAwC0AAUAaABpALQAaACzAGkAtQC0AAMAtQBoALQABAC1AAMAZwCzALYAtgCzAGgAZwC2AAIAtwBoALUAtwC1AAQAtgBoALcAAgC3AAQAAgC2ALcAagC4AAsAuAAKAAsAuAAJAAoAuQAJALgAagC5ALgAuQAPAAkADgAPALkAagAOALkADgARAA8AbAAOAGoAbAARAA4AbABqALoAbAC7ABEAuwAQABEAuwAMABAAvAC7AGwAvABsALoAvQAMALsAvAC9ALsAvQANAAwAawC8ALoAagBrALoAawC9ALwAagALAGsAvgANAL0AvgALAA0AawC+AL0AawALAL4APwC/AMAAlADAAL8APwDAAMEAwgDAAJQAvwAcAJQAwwDAAMIAwADDAMEAHAC/AMQAxQAcAMQAvwDGAMQAPwDGAL8AxABuAMUAxADGAG4AxQBuAEEAPwDBAJYAxgBvAG4AxwDGAD8AxwBvAMYAbQA/AJYAPwBtAMcAwQDIAJYAyABtAJYAwQCVAMgAwwCVAMEAyACVAMkAwwBCAJUAQgDJAJUAwwDCAEIAygDIAMkAygDJAEIAygBtAMgAQgDCAMoAbQDLAMcAywBvAMcAzABtAMoAywBtAMwAygDCAM0AzABAAMsAzADKAM4AzgDKAM0AzQDCAM8AzwDCAJQAQwDNAM8AzgDNAEMAlADQAM8AlAAcANAAHADRANAAzwDQAJIAkgDQANEAzwCSAEMA0QBEAJIAQwCSAJEAkgBEAJEAQwCRANIA0gDOAEMAkQBEAEcAjgBHAEQASABHAI4ARwDTAJEAiwBHAEgARwCLANMA1ACLAEgAjADUAEgA0gCRAE0ATQCRANMATQCTANIATQDTANUA1QCTAE0A0wCLAI8A1QDTAI8AiwDUAI0AjwCLAI0AjQDUANYAjQBKAI8A1gDUAEkAjwBKANcA1wBKAIoAigBKANgAjwDXANkA2QDXAIoAigDYABIAkACPANkA1QCPAJAAEgCJAIoASQCJABIAigBLANkAigCJAEsASQDaAIkASQDUANsA2wDaAEkA2wDUAIwA2wCMABoAiADbABoA2gDbAIgA3ADaAIgA3QCJANoA3QDaANwA3QBLAIkA3gDdANwAhwDdAN4AhwBLAN0ATACHAN4AhwDfAEsA2QBLAN8A4ACHAEwA4ADfAIcA4QDgAEwA4QBMABkA4gDgAOEA4gDfAOAA4QCEAOIAEwDfAOIAEwDZAN8AkADZABMA4wCQABMA4wATAIUA4wCGAJAAhQCGAOMAhQATAOQAhQDkAOUA5QDkAIMAgwDkAIIA5QBOAIUAgwBOAOUAhQBOAIYAgwCCAOYA5gBOAIMA5gCCAOcA5wCCAOgA5wDpAOYA5gDpAE4A5wDoAOoA6gDoAB0AUADqAB0A6gBPAOcA5wBPAOkA6wDqAFAA6gDrAE8A7ADrAFAATwDrAO0A6wDsAO0ATwAeAOkATwDtAB4AgQDsAFAAfQCBAFAA7ACBADYA7QDsADYA7gCBAH0AgQDuADYAMQDuAH0AHgAhAOkA6QAhAO8AHgAgACEAIQAlAO8AHgAfACAA7wAlACQAHgAbAB8A7wAkACIA7wBOAOkA7wAiACMA7wAjAPAA8ABOAO8A8AAjABgAmgBOAPAA8AAYAJoAmgAYABcAhgBOAJoAmgAXABYAmgAWAPEA8QCGAJoA8QAWABQA8QAUABUA8gCGAPEAkACGAPIAkADyANUA8QAVAPMA8wDyAPEA8wAVABsA1QDyAJMAkwDyAPMA8wAbAB4AHgCTAPMA9ACTAB4A0gCTAPQA9ADOANIAHgCZAPQAmADOAPQAmAD0AJkAJgCZAB4AHgDtACYA9QCYAJkAmQAmAPUAJgDtACoAJgAqACkAKAAmACkAJwAmACgAKgDtAPYAKgD2ACwALAD2ACsAKwD2AC0ALQD2ADgAfgAmACcA9QAmAH4AMgB+ACcA9gD3ADgAOAD3ADcA9gDtADYANgD3APYA9wB8ADcANgB8APcANwB8ADUANQB8ADQAfAD4ADQANAD4ADMAMwD4ADIA+AB+ADIA+QD4AHwA+QB8ADYA+gB+APgA+gD4APkANgD7APkA7gD7ADYA+wD8APkA+wDuADEA/AD7ADEA/AB5APkA+QB5APoAeQD8ADEAeQAxAP0AeQD+APoA/gBFAPoA+gBFAH4A/gB5AHQAdAB5AP0ARQD+AP8A/wD+AHQARQB/AH4AfgB/APUAAAFFAP8AfwBFAAAB9QB/AIAAbwB/AAABgAB/AG8AbgBvAAABgABvAMsAbgAAAUEAgACYAPUAywBAAIAAQACYAIAAQQAAAXAAcAAAAf8AcQBBAHAAcABGAHEAcgBwAP8AcgBGAHAA/wB0AHIAAQGYAEAAcgB0AFEAAgFGAHIAcgBRAAIBAgFzAEYAUQB0AHcAAgFRAAMBAgEvAHMAAwFSAAIBBAEvAAIBUgAEAQIBBAF1AC8AdwB0AAUBdwAFAQYBdAD9AAUBBQF4AAYBBQH9AHgABgF4AAcBBwF4AC4ACAF1AAQBCAEEAVIACAEJAXUAdgBSAC4ACAFSAHYALgB4AHYACgEJAQgBCgEIAXYACgELAQkBdgB4AFMAUwAKAXYAeAD9AFMADAELAQoBDAEKAVMADAFUAAsBUwD9AA0BDQEMAVMA/QAxAA0BMQB7AA0BegAMAQ0BDQF7AHoAegBUAAwBewBVAHoAegBVAFQAVQAwAFQAlwBAAMwAzADOAJcAQACXAA4BDgEBAUAAlwAPAQ4BDgEQAQEBDwEQAQ4BAQEQAZgAEQEPAZcAlwDOABEBEAEPAREBEQHOAJgAEAERAZgAPACbAJwAEgGbADwAmwATAZwAnAATAVYAEgEUAZsAEwEVAVYAEgFZABQBmwBXABMBVgAVAT4AmwAUARYBFgFXAJsAFAFZAFgAFAEXARYBFwFXABYBGAEUAVgAFAEYARcBWQAZAVgAGQEYAVgAGgEZAVkAoAAaAVkAngAYARkBngAZARoBnwAaAaAAGwEYAZ4AGAGdABcBnQAYARsBFwGdAFcAoAAcAZ8AHQEcAaAAXQAcAR0BXgAcAV0AXQA9AF4APQAeAV4AHgEcAV4AowAeAT0AnwAcAaEAoQAaAZ8AXAAcAR4BoQAcAVwAowCkAB4BXwCkAKMAXwAfAaQApACiAB4BHgGiAFwAHwGiAKQAPgAfAV8APgCiAB8BWwBcAKIAWwCiAD4AoQBcAFsAIAEaAaEAWwAgAaEAIAGeABoBPgAhAVsAIQEgAVsAFQEhAT4AIgGeACABIQEiASABIgEbAZ4AFQFaACEBWgAiASEBIgEjARsBWgAjASIBIwGdABsBJAGdACMBWgAkASMBVwCdACQBJQFaABUBJQEkAVoAJQFXACQBEwElARUBVwAlARMBJgGmACcBJgE6AKYAJwGmAKcAKAE6ACYBJwGnACkBKAEmAagAKAGoACoBKwEmAScBqAAmAaUApQAmASsBKgGoAGMALAGoAKUALAGlACsBLQFjAKgALQGoACwBKgFjAC4BLgFjAC0BKgEuAakALgEvAakALwFiAKkArAAuAS0BrAAvAS4BqgAtASwBLAErAaoALQEwAawAqgAwAS0BqwBiAC8BqgArATEBMgFiAKsAMwFiADIBMgFlADMBKwE0ATEBKwEnATQBNAEnASkBNAFgADEBNAEpAWAAqgAxATUBMQFgADUBqgA1ATABNQE2ATABYAA2ATUBNgGsADABYAApATcBYAA3ATYBNgE4AawANgE3ATgBrAA4AS8BKQE7ADcBKQGnADsANwFhADgBNwE7AGEAOAGtAC8BOAFhAK0ALwGtAKsAqwCtADIBrQBhAGQAMgGtAGQAYQA7AK4AZABhAK4ArgA7ADkBOwCwADkBrgA6AWQAZAA6ATIBOQGvAK4AOQGwAK8ArwA6Aa4AsACxAK8ArwCxADoBMgE6AWYAOgGxAGYAZgBlADIBsQBlAGYAOQBlALEA"), 0.229244, PackedByteArray("AABnAAIAAQBnAAAAZwBoAAIAAgBoAAQABABoAAMAAwBoAAUAaABpAAUAZwBpAGgABQBpAAgABgBnAAEAaQBnAAYACABpAAYABgABAAcACAAGAAcAagAKAAsAagAJAAoAagALAGsAawALAA0AawANAAwAawAMAGwAbABqAGsAbAAMABAAbAAQABEAbAAOAGoAagAOAAkAbAARAA4ADgAPAAkADgARAA8AbQBuAD8AbQBvAG4AbgBvAEEAQQAcAG4AHAA/AG4AQQBvAHAAcQBBAHAAcgBxAHAAcgBzAHEAcgAvAHMAcAB0AHIAUgAvAHIAdQAvAFIAcgBRAFIAcgB0AFEAdQBSAHYAdgBSAC4AUQB0AHcAUwB1AHYALgB4AHYAdwB4AC4AdAB4AHcAdgB4AFMAUwBUAHUAdAB5AHgAegBUAFMAegBVAFQAVQAwAFQAewBVAHoAUwB7AHoAMQB7AFMAeAAxAFMAeQAxAHgARQB5AHQAcABFAHQAbwBFAHAAMQB5AHwAfQAxAHwAeQBFAH4AfwBFAG8ARQB/AH4AgAB/AG8AeQB+ADMAeQAzAHwAMwB+ADIAMgB+ACcAfAAzADQANQB8ADQANwB8ADUAfgAmACcAfgB/ACYAJwAmACgAKAAmACkAJgB/AIAAJgAqACkANgB8ADcANgB9AHwANgA3AC0ALQA3ADgAgQB9ADYAfQCBAFAALQBPADYATwCBADYAUACBAE8ATwAtACsAKgArACwAKgBPACsAJgBPACoAggAdAFAAUABPAIIAggBPAIMAgwATAIIAGQCEABMAEwBMABkAhQATAIMAgwBOAIUAgwBPAE4AhQCGABMAhQBOAIYAEwBLAEwATABLAIcATACHAIgAhwCJAIgAhwBLAIkAiQAaAIgAEwCKAEsAigCJAEsAGgCJAEkASQCJABIAEgCJAIoASQCLABoAigBKABIAGgCLAIwAjQCLAEkAjACLAI4AjQBKAI8AjwBKAIoAjwCLAI0AiwBHAI4ARwCLAI8AjgBHAEQAkACPAIoAkACKABMAEwCGAJAATQCPAJAATQBHAI8AkACGAE0AkQBEAEcATQCRAEcAkgBEAJEAHABEAJIAkwCRAE0ATQCGAJMAQwCSAJEAQwCRAJMAlAAcAJIAPwAcAJQAQgCUAJIAQwBCAJIAlQA/AJQAlQCUAEIAPwCVAJYAlgCVAEIAbQA/AJYAQgBtAJYAlwBCAEMAlwBtAEIAgABtAJcAgABvAG0AlwBAAIAAQACYAIAAlwCYAEAAlwBDAJgAgACYACYAmABDAJkAJgCYAJkAmQBDAJMAJgCZAB4AmQCTAB4AHgBPACYAkwAbAB4AkwAVABsAHgAbAB8AFAAVAJMAHgAfACAAHgAgACEAHgAhAE8AkwCGABQATwAhACQAIQAlACQATwAkACIAIgBOAE8AFACGAJoAhgBOAJoAmgAWABQAmgAXABYAmgAYABcAmgBOABgAGABOACIAIgAjABgAPACbAJwAmwBWAJwAmwA8AFcAmwBXAFYAVwBaAFYAPACdAFcAVwCdAFoAPABYAJ0APABZAFgAnQBYAJ4AWgCdAJ4AnwBYAFkAngBYAJ8AoACfAFkAVgBaAD4AoABcAJ8AoQCeAJ8AWgCeAKEAnwBcAKEAWwBaAKEAPgBaAFsAoQBcAFsAXQBcAKAAWwCiAD4AWwBcAKIAXgBcAF0AXgCiAFwAXQA9AF4AowBeAD0ApACiAF4AowCkAF4APgCiAKQAXwCkAKMAPgCkAF8ApQCmAKcApQA6AKYApQCnAGAAOgClAKgAOgCoAKkAqgCoAKUAqgClAGAAqQCoAGMAYwCoAKoAYwCrAKkAqgCsAGMArACrAGMAqgBgAKwAqwBiAKkAYACnADsAZABiAKsArACtAKsAYACtAKwAqwCtAGQAYABhAK0AYAA7AGEArQBhAGQAZQBiAGQAYQA7AK4AZABhAK4ArgA7AK8AOwCwAK8ArgBmAGQAZgBlAGQArwBmAK4AsACxAK8ArwCxAGYAsQBlAGYAOQBlALEA"), 0.306865, PackedByteArray("AAABAAIAAQADAAIAAgADAAQAAQAGAAMAAwAGAAUABgABAAcABQAGAAgACAAGAAcACQAKAAsACQALAAwADAALAA0ADgAJAAwADgAPAAkADgAMABAADgARAA8ADgAQABEAPwBAAEEAHAA/AEEAQgA/ABwAQAA/AEIAQwBCABwAQABCAEMAHABEAEMAQQBAAEUARQBGAEEAQwBEAEcASABHAEQAGgBHAEgASQBHABoASgBHAEkAGgBLAEkASQBLABIATABLABoAEwASAEsAEwBLAEwAEwBKABIAGQATAEwATQBHAEoATQBDAEcATQBKABMAQwBNAB4AQABDAB4ATQAbAB4ATQAVABsAFAAVAE0ATQATABQAHgAbAB8AEwAWABQAEwAXABYAHgAfACAAEwAYABcAHgAgACEAEwBOABgATgATAB0AGABOACIAIgAjABgAHQBPAE4AIgBOAE8AHgAhAE8AUABPAB0ATwAkACIAIQAlACQATwAhACQAHgBPACYAHgAmAEAAUAA2AE8AMQA2AFAALQBPADYANgA3AC0ANgAxADcALQA3ADgATwAtACsANwAxADUAKgBPACsAKgArACwAJgBPACoANQAxADQAJgAqACkAKAAmACkAJwAmACgAMQAzADQARQAmACcAQAAmAEUAMgBFACcAMwBFADIARQAzADEARQAxAC4AUQBFAC4ARQBRAEYARgBRAFIAUgAvAEYAUwBSAC4ALwBSAFMALgAxAFMAUwBUAC8AUwAxAFQAMQBVAFQAVQAwAFQAVgA8AFcAPABYAFcAVwA+AFYAPABZAFgAVwBYAFoAWgBYAFkAVwBaAD4AWwBaAFkAPgBaAFsAWQBcAFsAXQBcAFkAPgBbAF4AXgBbAFwAXgBcAF0AXwA+AF4AXQA9AF4AXwBeAD0AYABhAGIAYABiAGMAOgBjAGIAYwA6AGAAOgA7AGAAYAA7AGEAYgBhAGQAZQBiAGQAOwBmAGEAYQBmAGQAZgBlAGQAOwA5AGYAOQBlAGYA"), 0.463559, PackedByteArray("AAABAAIAAQADAAIAAgADAAQAAQAFAAMABQABAAYABgABAAcACAAFAAYACAAGAAcACQAKAAsACQALAAwADAALAA0ADgAJAAwADgAPAAkADgAMABAADgARAA8ADgAQABEAEgATABQAEgAUABUAEwAWABQAEwAXABYAEwAYABcAEwASABkAGQASABoAEgAVABsAEgAcABoAEwAdABgAEgAbAB4AHgAcABIAHgAbAB8AHgAfACAAHgAgACEAGAAdACIAIgAjABgAIgAdACQAIQAlACQAIQAmAB4AJgAhACQAHgAnABwAJwAeACYAJwAmACgAKAAmACkAJgAqACkAJgAkACoAKgAkACsAKgArACwAJAAtACsAHAAnAC4ALgAvABwALgAwAC8ALgAxADAAJwAxAC4AMQAnADIAMQAyADMANAAxADMANQAxADQANgAxADUAMQA2AB0AJAAdADYALQAkADYANgA1ADcANgA3AC0ALQA3ADgAOQA6ADsAPAA9AD4A")], -"material": SubResource("StandardMaterial3D_2h3rs"), +"material": ExtResource("7_sh2xs"), "name": "Suzanne", "primitive": 3, "uv_scale": Vector4(0, 0, 0, 0), @@ -378,13 +379,11 @@ data = PackedVector3Array(-1.5, 0, -6, -1.5, 0, 6, -1.5, 3, -6, -1.5, 3, -6, -1. [node name="Sandbox" type="Node3D"] [node name="WorldEnvironment" type="WorldEnvironment" parent="."] -environment = SubResource("Environment_cc548") +environment = ExtResource("1_fk1xc") [node name="OmniLight3D" type="OmniLight3D" parent="."] transform = Transform3D(0.5, 0, -0.866025, 0, 1, 0, 0.866025, 0, 0.5, 0, 2.16, 0) -light_energy = 8.0 shadow_enabled = true -omni_range = 20.0 [node name="Geometry" type="Node3D" parent="."] @@ -414,7 +413,7 @@ shape = SubResource("ConcavePolygonShape3D_nxc47") transform = Transform3D(-0.616239, 0, 0.787559, 0, 1, 0, -0.787559, 0, -0.616239, -2.22512, 1.41158, 2.88581) mask_dim = 128 mesh_instance = NodePath("MeshInstance3D") -source_gunk_material = SubResource("ShaderMaterial_2roq2") +source_gunk_material = SubResource("ShaderMaterial_2218n") [node name="MeshInstance3D" type="MeshInstance3D" parent="Geometry/Monkey"] mesh = SubResource("ArrayMesh_hrvvi") @@ -449,9 +448,6 @@ shape = SubResource("ConcavePolygonShape3D_6ood3") [node name="WallSwitch" parent="Geometry" instance=ExtResource("9_p27ol")] transform = Transform3D(-4.37114e-08, 0, -1, 0, 1, 0, 1, 0, -4.37114e-08, 3.9, 1.50699, 2.45659) -[node name="Player" parent="." instance=ExtResource("1_h436a")] -transform = Transform3D(1, 0, 0, 0, 1, 0, 0, 0, 1, 0, 1, 0) - [node name="LevelTiles" type="Node3D" parent="."] transform = Transform3D(1, 0, 0, 0, 1, 0, 0, 0, 1, 0, 0, 25) @@ -508,3 +504,8 @@ transform = Transform3D(1, 0, 0, 0, 1, 0, 0, 0, 1, -6, 1, -1) [node name="GrunkNodule2" parent="." instance=ExtResource("10_2roq2")] transform = Transform3D(0.4, 0, 0, 0, 0.4, 0, 0, 0, 0.4, -6, 1, 1) + +[node name="PostProcessing" parent="." instance=ExtResource("11_6fwow")] + +[node name="Player" parent="." instance=ExtResource("1_h436a")] +transform = Transform3D(1, 0, 0, 0, 1, 0, 0, 0, 1, 0, 1, 0) diff --git a/src/shaders/canvas_retro.gdshader b/src/shaders/canvas_retro.gdshader new file mode 100644 index 0000000..d1dbc3b --- /dev/null +++ b/src/shaders/canvas_retro.gdshader @@ -0,0 +1,168 @@ +// CanvasItem Retro Post-processing +// Adapted from https://godotshaders.com/shader/retro-post-processing/ + +shader_type canvas_item; + + +// Handles the resolution changes, color depth, and dithering +uniform sampler2D screen_texture : hint_screen_texture, repeat_disable, filter_nearest; + + +group_uniforms resolution_and_colors; +uniform bool change_color_depth = false; +uniform int target_color_depth : hint_range(1, 8) = 5; +uniform bool dithering = false; +uniform bool scale_resolution = false; +uniform int target_resolution_scale = 3; + + +// Handles the LUTish recoloring +group_uniforms gradient_recoloring; +uniform bool enable_recolor = false; +uniform sampler2D to_gradient: hint_default_black; + + +int dithering_pattern(ivec2 fragcoord) { + const int pattern[] = { + -4, +0, -3, +1, + +2, -2, +3, -1, + -3, +1, -4, +0, + +3, -1, +2, -2 + }; + + int x = fragcoord.x % 4; + int y = fragcoord.y % 4; + + return pattern[y * 4 + x]; +} + + +vec3 rgb2hsv(vec3 rgb) { //Converts RGB values to HSV + float r = rgb.r; + float g = rgb.g; + float b = rgb.b; + + + float cmax = max(r,max(g,b)); + float cmin = min(r,min(g,b)); + float delta = cmax - cmin; + + + float h = 0.f; //hue + + + if (delta > 0.f){ + if (cmax == r){ + h = (g-b)/delta; + h = mod(h,6.f); + } else if (cmax == g){ + h = ((b - r) / delta) + 2.f; + } else { + h = ((r-g)/delta) + 4.f; + } + h = h * 60.f; + } + + + float s = 0.f; //saturation + if (cmax > 0.f){ + s = delta / cmax; + } + + + return vec3(h,s,cmax); // Keep original alpha value + + +} + + +vec3 hsv2rgb(vec3 hsv) { //Converts HSV values to RGB + float h = hsv.r; + float s = hsv.g; + float v = hsv.b; + float c = v * s; + //X = C × (1 - |(H / 60°) mod 2 - 1|) + float x = h / 60.f; + x = mod(x,2.f); + x = abs(x - 1.f); + x = c * (1.f - x); + + + float m = v - c; + + + vec3 rgb = vec3(0.f,0.f,0.f); + + + if (h < 60.f) { + rgb = vec3(c,x,0.f); + } else if (h < 120.f){ + rgb = vec3(x,c,0.f); + } else if (h < 180.f){ + rgb = vec3(0.f,c,x); + } else if (h < 240.f){ + rgb = vec3(0.f,x,c); + } else if (h < 300.f){ + rgb = vec3(x,0.f,c); + } else if (h < 360.f){ + rgb = vec3(c,0.f,x); + } + rgb[0] = rgb[0] + m; + rgb[1] = rgb[1] + m; + rgb[2] = rgb[2] + m; + + + return rgb; +} + + +void fragment() { + + vec2 iResolution = 1.0 / SCREEN_PIXEL_SIZE; + vec2 q = FRAGCOORD.xy / iResolution.xy; + ivec2 uv = ivec2(q); + + vec3 color = texture(screen_texture, vec2(q.x,q.y) ).xyz; + + if(scale_resolution){ + uv = ivec2(FRAGCOORD.xy / float(target_resolution_scale)); + color = texelFetch(screen_texture, uv * target_resolution_scale, 0).rgb; + } else { + uv = ivec2(FRAGCOORD.xy); + color = texelFetch(screen_texture, uv, 0).rgb; + } + + if(enable_recolor){ + vec3 hsv = rgb2hsv(color); + float color_pos = (hsv.x / 360.0); + vec3 new_color = texture(to_gradient, vec2((color_pos), 0.5)).rgb; + vec3 new_hsv = rgb2hsv(new_color); + hsv.x = new_hsv.x; + vec3 final_rgb = hsv2rgb(hsv); + + + color.rgb = final_rgb; + } + + + + // Convert from [0.0, 1.0] range to [0, 255] range + ivec3 c = ivec3(round(color * 255.0)); + + // Apply the dithering pattern + if (dithering) { + c += ivec3(dithering_pattern(uv)); + } + + vec3 final_color; + if(change_color_depth){ + // Truncate from 8 bits to color_depth bits + c >>= (8 - target_color_depth); + final_color = vec3(c) / float(1 << target_color_depth); + } else { + final_color = vec3(c) / float(1 << 8); + } + + // Convert back to [0.0, 1.0] range + COLOR.rgb = final_color; +} \ No newline at end of file diff --git a/src/shaders/canvas_retro.gdshader.uid b/src/shaders/canvas_retro.gdshader.uid new file mode 100644 index 0000000..33d09b0 --- /dev/null +++ b/src/shaders/canvas_retro.gdshader.uid @@ -0,0 +1 @@ +uid://bsdv5d3gxmjc diff --git a/src/ui/post_processing.tscn b/src/ui/post_processing.tscn new file mode 100644 index 0000000..3be2ef7 --- /dev/null +++ b/src/ui/post_processing.tscn @@ -0,0 +1,20 @@ +[gd_scene load_steps=3 format=3 uid="uid://d1kacn4b60ucy"] + +[ext_resource type="Shader" uid="uid://bsdv5d3gxmjc" path="res://src/shaders/canvas_retro.gdshader" id="1_mr66v"] + +[sub_resource type="ShaderMaterial" id="ShaderMaterial_ejh2c"] +shader = ExtResource("1_mr66v") +shader_parameter/change_color_depth = true +shader_parameter/target_color_depth = 5 +shader_parameter/dithering = true +shader_parameter/scale_resolution = true +shader_parameter/target_resolution_scale = 3 +shader_parameter/enable_recolor = false + +[node name="PostProcessing" type="ColorRect"] +material = SubResource("ShaderMaterial_ejh2c") +anchors_preset = 15 +anchor_right = 1.0 +anchor_bottom = 1.0 +grow_horizontal = 2 +grow_vertical = 2