From 9e29de6caee42ae4503108489f27a38a3f928885 Mon Sep 17 00:00:00 2001 From: Issac332 <119879937+Issac8658@users.noreply.github.com> Date: Wed, 10 Jun 2026 00:04:26 +0300 Subject: [PATCH] CRT shader, some pictures center and picture names debug --- CMakeLists.txt | 3 +- scripts/Desktop_Message.rb | 33 +++++----- scripts/Sprite_Picture.rb | 12 +++- shader/crt.frag | 124 +++++++++++++++++++++++++++++++++++++ src/shader.cpp | 7 +++ src/shader.h | 6 ++ src/sprite.cpp | 10 +++ 7 files changed, 177 insertions(+), 18 deletions(-) create mode 100644 shader/crt.frag diff --git a/CMakeLists.txt b/CMakeLists.txt index f6bb898..0095db7 100644 --- a/CMakeLists.txt +++ b/CMakeLists.txt @@ -49,7 +49,7 @@ else() add_compile_options(/O2 /fp:fast /GL /GF /GA) else() #bruh.... - add_compile_options(-Ofast -flto -funroll-loops -fipa-pta -ftree-vectorize -fstdarg-opt -fomit-frame-pointer -frename-registers) + add_compile_options(-Ofast -funroll-loops -fipa-pta -ftree-vectorize -fstdarg-opt -fomit-frame-pointer -frename-registers) add_link_options(-Wl,-O2) endif() endif() @@ -224,6 +224,7 @@ set(EMBEDDED_INPUT shader/sprite.frag shader/worldMachine.frag shader/water.frag + shader/crt.frag shader/tilemapWater.frag shader/plane.frag shader/gray.frag diff --git a/scripts/Desktop_Message.rb b/scripts/Desktop_Message.rb index 58091ca..b7ab608 100644 --- a/scripts/Desktop_Message.rb +++ b/scripts/Desktop_Message.rb @@ -2,28 +2,31 @@ class Desktop_Message HORIZ_MARGIN = 8 VERT_MARGIN = 8 - HEIGHT = 160 #-------------------------------------------------------------------------- # * Object Initialization #-------------------------------------------------------------------------- def initialize @viewport = Viewport.new(0, 0, Graphics.width, Graphics.height) - @sprite_bg = Sprite.new(@viewport) - @sprite_bg.bitmap = RPG::Cache.picture('cg_desktop_messagebox') #Bitmap.new(640, 480) - @sprite_bg.zoom_x = @sprite_bg.zoom_y = 2 + @sprite_messagebox = Sprite.new(@viewport) + @sprite_messagebox.bitmap = RPG::Cache.picture('cg_desktop_messagebox') #Bitmap.new(640, 480) + @sprite_messagebox.zoom_x = @sprite_messagebox.zoom_y = 2 + @sprite_messagebox.x = (Graphics.width) / 2 - 320 + @sprite_messagebox.y = (Graphics.height) / 2 - 240 + @sprite_messagebox.shader = Shader::CRT + @sprite_text = Sprite.new(@viewport) - @contents = Bitmap.new(Graphics.width, HEIGHT) + @contents = Bitmap.new(Graphics.width, Graphics.height) Language.register_text_sprite(self.class.name + "_contents", @contents) @sprite_text.bitmap = @contents - @sprite_text.y = (Graphics.height - HEIGHT) / 2 - @sprite_bg.z = 0 - @sprite_text.z = 1 + @sprite_text.y = (Graphics.height - Graphics.height) / 2 + @sprite_messagebox.z = 1 + @sprite_text.z = 2 @sprite_text.zoom_x = @sprite_text.zoom_y = 1 @viewport.z = 9999 @viewport.visible = false - @sprite_bg.opacity = 0 + @sprite_messagebox.opacity = 0 @sprite_text.opacity = 0 # Animation flags @@ -38,7 +41,7 @@ class Desktop_Message terminate_message $game_temp.message_window_showing = false @contents.dispose - #@sprite_bg.dispose + #@sprite_messagebox.dispose @sprite_text.dispose @viewport.dispose end @@ -119,7 +122,7 @@ class Desktop_Message # Prepare renderer @contents.clear @contents.font.color = Color.new(44, 37, 54, 255) - y_top = (HEIGHT - widths.length * 24) / 2 + y_top = (Graphics.height - widths.length * 24) / 2 x = (Graphics.width - widths[0]) / 2 y = 0 @@ -156,9 +159,9 @@ class Desktop_Message # Handle fade-out effect if @fade_out @sprite_text.opacity -= 200 - @sprite_bg.opacity -= 200 + @sprite_messagebox.opacity -= 200 if @sprite_text.opacity <= 0 - @sprite_bg.opacity = 0 + @sprite_messagebox.opacity = 0 @fade_out = false @viewport.visible = false $game_temp.message_window_showing = false @@ -169,9 +172,9 @@ class Desktop_Message # Handle fade-in effect if @fade_in @sprite_text.opacity += 200 - @sprite_bg.opacity += 200 + @sprite_messagebox.opacity += 200 if @sprite_text.opacity >= 255 - @sprite_bg.opacity = 255 + @sprite_messagebox.opacity = 255 @fade_in = false $game_temp.message_window_showing = true end diff --git a/scripts/Sprite_Picture.rb b/scripts/Sprite_Picture.rb index 6daf4b3..e3331b5 100644 --- a/scripts/Sprite_Picture.rb +++ b/scripts/Sprite_Picture.rb @@ -39,6 +39,14 @@ class Sprite_Picture < Sprite if @picture_name != "" # Get picture graphic self.bitmap = RPG::Cache.picture(@picture_name) + if Settings[:debug] + self.bitmap.draw_text(0, 0, 500, 20, @picture_name) + end + if @picture_name == "cg_desktop_no_effects" + self.shader = Shader::CRT + else + self.shader = Shader::Sprite + end end end # If file name is empty @@ -58,8 +66,8 @@ class Sprite_Picture < Sprite self.oy = self.bitmap.height / 2 end # Set sprite coordinates - self.x = @picture.x - self.y = @picture.y + self.x = @picture.x == 0 ? Graphics.width / 2 - self.bitmap.width / 2 * @picture.zoom_x / 100.0 : @picture.x + self.y = @picture.y == 0 ? Graphics.height / 2 - self.bitmap.height / 2 * @picture.zoom_y / 100.0 : @picture.y self.z = @picture.number # Set zoom rate, opacity level, and blend method self.zoom_x = @picture.zoom_x / 100.0 diff --git a/shader/crt.frag b/shader/crt.frag new file mode 100644 index 0000000..9144bdb --- /dev/null +++ b/shader/crt.frag @@ -0,0 +1,124 @@ + +uniform sampler2D texture; + +uniform lowp vec4 tone; + +uniform lowp float opacity; +uniform lowp vec4 color; +uniform lowp vec4 modulate; + +uniform float bushDepth; +uniform lowp float bushOpacity; + +uniform float uTime; + +varying vec2 v_texCoord; + +const vec3 lumaF = vec3(.299, .587, .114); + +const bool simple = false; + +const float disort = 0.5; +const float lines_scale = 3.0; +const float lines_fill = 0.075; +const float lines_speed = 0.19; +const float lines_opacity = 0.25; + +const float layers_scale = 0.01; +const float layers_fill = 0.5; +const float layers_opacity = 0.25; + +const float edge_dark_power = 1.0; +const float edge_dark_dist = 0.05; + +const float chromatic_power = 0.0005; + +const vec2 scale = vec2(0.85, 0.8); + +float distance(vec2 v) { + return sqrt(v.x * v.x + v.y * v.y); +} + +void main(){ + // ------- crt -------- + vec2 uv = v_texCoord; + + float layers = 0.0; + vec2 edge_dark = vec2(0); + float edge_dark_res = 0.0; + vec4 frag; + + uv -= 0.5; + uv /= scale; + + float uv_dist = distance(uv); + uv = mix(uv, vec2(0), uv_dist * -disort) / (1.0 + disort / 2.0); + + float lines_uv = (uv.y / lines_scale) - uTime * lines_speed; + float lines = floor(lines_uv + lines_fill) - floor(lines_uv); + lines *= lines_opacity; + + if (!simple) { + float layers_uv = (uv.y / layers_scale); + layers = clamp(sin(layers_uv * 3.1415) - (1.0 - layers_fill), 0.0, 1.0); + layers *= layers_opacity; + + edge_dark = abs(uv) * 2.0; + edge_dark -= 1.0 - edge_dark_dist; + edge_dark /= edge_dark_dist; + edge_dark = clamp(edge_dark, 0.0, 1.0); + edge_dark *= edge_dark_power; + edge_dark_res = edge_dark.x + edge_dark.y; + + uv *= scale; + uv += 0.5; + + vec4 frag1 = texture2D(texture, uv + vec2(-1, 1) * chromatic_power); + vec4 frag2 = texture2D(texture, uv + vec2(1, -1) * chromatic_power); + vec4 frag3 = texture2D(texture, uv); + frag = vec4(frag1.r, frag2.g, frag3.b, (frag1.w + frag2.w + frag3.w) / 3.0); + } + else + { + uv *= scale; + uv += 0.5; + frag = texture2D(texture, uv); + } + + frag += vec4(lines, lines, lines, 0.0) - + vec4(layers, layers, layers, 0.0) - + vec4(edge_dark_res, edge_dark_res, edge_dark_res, 0.0); + + frag.rgb = clamp(frag.rgb, 0.0, 1.0); + + // ------- original shit -------- + + /* Apply gray */ + float luma = dot(frag.rgb, lumaF); + frag.rgb = mix(frag.rgb, vec3(luma), tone.w); + + /* Apply tone */ + frag.rgb += tone.rgb; + + /* Apply opacity */ + frag.a *= opacity; + + /* Apply color */ + frag.rgb = mix(frag.rgb, color.rgb, color.a); + + /* Apply modulation */ + frag *= modulate; + + /* Apply bush alpha by mathematical if */ + lowp float underBush = float(v_texCoord.y < bushDepth); + frag.a *= clamp(bushOpacity + underBush, 0.0, 1.0); + + gl_FragColor = mix( + frag, + vec4(0, 0, 0, 1), + float(uv.x < 0.0) + + float(uv.x > 1.0) + + float(uv.y < 0.0) + + float(uv.y > 1.0) + ); +} diff --git a/src/shader.cpp b/src/shader.cpp index 22f28ec..c4562e3 100644 --- a/src/shader.cpp +++ b/src/shader.cpp @@ -32,6 +32,7 @@ #include "sprite.frag.xxd" #include "worldMachine.frag.xxd" #include "water.frag.xxd" +#include "crt.frag.xxd" #include "tilemapWater.frag.xxd" #include "hue.frag.xxd" #include "trans.frag.xxd" @@ -434,6 +435,12 @@ WaterShader::WaterShader(){ } +CRTShader::CRTShader(){ + INIT_SHADER(sprite, crt, CRTShader); + SpriteShaderBase::SpriteShaderInit(); +} + + PlaneShader::PlaneShader(){ INIT_SHADER(simple, plane, PlaneShader); diff --git a/src/shader.h b/src/shader.h index 1a647e6..02b9fa5 100644 --- a/src/shader.h +++ b/src/shader.h @@ -191,6 +191,11 @@ public: WaterShader(); }; +class CRTShader : public SpriteShaderBase{ +public: + CRTShader(); +}; + class TilemapWaterShader : public ShaderBase{ public: TilemapWaterShader(); @@ -330,6 +335,7 @@ private: X(sprite, SpriteShader, Sprite) \ X(worldMachine, WMShader, WorldMachine) \ X(water, WaterShader, Water) \ + X(crt, CRTShader, CRT) \ X(tilemapWater, TilemapWaterShader, TilemapWater) \ X(plane, PlaneShader, Plane) \ X(gray, GrayShader, Gray) \ diff --git a/src/sprite.cpp b/src/sprite.cpp index 7e345a4..1c30673 100644 --- a/src/sprite.cpp +++ b/src/sprite.cpp @@ -529,6 +529,16 @@ void Sprite::draw(){ base = &shader; + break; + } + case ShaderType::SHADER_crt: + { + CRTShader &shader = shState->shaders().crt; + + defaultSpriteShaderInit(shader); + + base = &shader; + break; } case ShaderType::SHADER_worldMachine: