mirror of
https://forgejo.xatacraft.ru/Sunshine/mkxp-sunshine.git
synced 2026-08-19 13:29:54 +00:00
CRT shader, some pictures center and picture names debug
This commit is contained in:
parent
b9a98e2630
commit
9e29de6cae
7 changed files with 177 additions and 18 deletions
|
|
@ -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
|
||||
|
|
|
|||
|
|
@ -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
|
||||
|
|
|
|||
|
|
@ -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
124
shader/crt.frag
Normal 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)
|
||||
);
|
||||
}
|
||||
|
|
@ -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);
|
||||
|
||||
|
|
|
|||
|
|
@ -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) \
|
||||
|
|
|
|||
|
|
@ -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:
|
||||
|
|
|
|||
Loading…
Reference in a new issue