CRT shader, some pictures center and picture names debug

This commit is contained in:
Issac332 2026-06-10 00:04:26 +03:00
parent b9a98e2630
commit 9e29de6cae
7 changed files with 177 additions and 18 deletions

View file

@ -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

View file

@ -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

View file

@ -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

124
shader/crt.frag Normal file
View file

@ -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)
);
}

View file

@ -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);

View file

@ -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) \

View file

@ -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: