Attempt to improve the stage 1 background. "reeds" did not survive.
This commit is contained in:
parent
1bb68d7477
commit
9669fb6df9
10 changed files with 191 additions and 43 deletions
Binary file not shown.
Before Width: | Height: | Size: 7.2 KiB After Width: | Height: | Size: 16 KiB |
BIN
resources/gfx/stage1/waterplants.png
Normal file
BIN
resources/gfx/stage1/waterplants.png
Normal file
Binary file not shown.
After Width: | Height: | Size: 43 KiB |
|
@ -50,6 +50,7 @@ glsl_files = files(
|
|||
'sprite_youmu_charged_shot.frag.glsl',
|
||||
'sprite_youmu_charged_shot.vert.glsl',
|
||||
'sprite_youmu_myon_shot.frag.glsl',
|
||||
'stage1_water.frag.glsl',
|
||||
'stage6_sky.frag.glsl',
|
||||
'stage6_sky.vert.glsl',
|
||||
'standard.frag.glsl',
|
||||
|
|
53
resources/shader/stage1_water.frag.glsl
Normal file
53
resources/shader/stage1_water.frag.glsl
Normal file
|
@ -0,0 +1,53 @@
|
|||
#version 330 core
|
||||
|
||||
#include "lib/util.glslh"
|
||||
#include "interface/standard.glslh"
|
||||
|
||||
UNIFORM(1) float time;
|
||||
|
||||
// Based on https://www.shadertoy.com/view/Xl2XWz
|
||||
|
||||
float smoothNoise(vec2 p) {
|
||||
vec2 f = fract(p);
|
||||
p -= f;
|
||||
f *= f * (3 - f - f);
|
||||
|
||||
return dot(mat2(fract(sin(vec4(0, 1, 27, 28) + p.x + p.y * 27) * 1e5)) * vec2(1 - f.y, f.y), vec2(1 - f.x, f.x));
|
||||
}
|
||||
|
||||
float fractalNoise(vec2 p) {
|
||||
return
|
||||
smoothNoise(p) * 0.5333 +
|
||||
smoothNoise(p * 2) * 0.2667 +
|
||||
smoothNoise(p * 4) * 0.1333 +
|
||||
smoothNoise(p * 8) * 0.0667;
|
||||
}
|
||||
|
||||
float warpedNoise(vec2 p) {
|
||||
vec2 m = vec2(0.0, -time);
|
||||
float x = fractalNoise(p + m);
|
||||
float y = fractalNoise(p + m.yx + x);
|
||||
float z = fractalNoise(p - m - x);
|
||||
return fractalNoise(p + vec2(x, y) + vec2(y, z) + vec2(z, x) + length(vec3(x, y, z)) * 0.1);
|
||||
}
|
||||
|
||||
void main(void) {
|
||||
vec2 uv = flip_native_to_bottomleft(texCoord - vec2(0, time * 0.2)) * rot(-pi/4);
|
||||
|
||||
float n = warpedNoise(uv * 4);
|
||||
float n2 = warpedNoise(uv * 4 + 0.005);
|
||||
|
||||
float bump = max(n2 - n, 0) / 0.02 * 0.7071;
|
||||
float bump2 = max(n - n2, 0) / 0.02 * 0.7071;
|
||||
|
||||
bump = bump * bump * 0.5 + pow(bump, 4) * 0.5;
|
||||
bump2 = bump2 * bump2 * 0.5 + pow(bump2, 4) * 0.5;
|
||||
|
||||
vec4 cmod = vec4(0.5, 0.8, 0.8, 1.0);
|
||||
|
||||
uv = flip_native_to_bottomleft(texCoord);
|
||||
uv += 0.25 * vec2(bump, bump2);
|
||||
uv = flip_bottomleft_to_native(uv);
|
||||
|
||||
fragColor = mix(cmod * texture(tex, uv), vec4(0.8, 0.8, 1.0, 1.0), (sqrt(bump2) - sqrt(bump) * 0.25) * 0.05);
|
||||
}
|
2
resources/shader/stage1_water.prog
Normal file
2
resources/shader/stage1_water.prog
Normal file
|
@ -0,0 +1,2 @@
|
|||
|
||||
glsl_objects = standard.vert stage1_water.frag
|
|
@ -51,7 +51,7 @@ void r_post_init(void) {
|
|||
NULL);
|
||||
|
||||
BlurInfo blurs[] = {
|
||||
// { "blur5", 5, 1.25, },
|
||||
{ "blur5", 5, 1.25, },
|
||||
// { "blur9", 9, 1.85, },
|
||||
// { "blur13", 13, 2.45, },
|
||||
{ "blur25", 25, 4.25, },
|
||||
|
|
|
@ -806,7 +806,7 @@ static void gl33_clear(ClearBufferFlags flags) {
|
|||
static void gl33_clear_color4(float r, float g, float b, float a) {
|
||||
Color cc = { r, g, b, a };
|
||||
|
||||
if(!memcmp(&R.clear_color, &cc, sizeof(cc))) {
|
||||
if(memcmp(&R.clear_color, &cc, sizeof(cc))) {
|
||||
memcpy(&R.clear_color, &cc, sizeof(cc));
|
||||
glClearColor(r, g, b, a);
|
||||
}
|
||||
|
|
|
@ -161,7 +161,7 @@ static MagicalUniform magical_unfiroms[] = {
|
|||
{ "r_textureMatrix", "mat4", UNIFORM_MAT4 },
|
||||
{ "r_color", "vec4", UNIFORM_VEC4 },
|
||||
};
|
||||
|
||||
static void gl33_commit_uniform(Uniform *uniform);
|
||||
static void gl33_update_uniform(Uniform *uniform, uint count, const void *data, size_t datasize) {
|
||||
if(datasize > uniform->buffer_size) {
|
||||
// might happen when unused array elements get optimized out
|
||||
|
|
|
@ -51,6 +51,8 @@ struct stage1_spells_s stage1_spells = {
|
|||
},
|
||||
};
|
||||
|
||||
static FBPair stage1_bg_fbpair;
|
||||
|
||||
#ifdef SPELL_BENCHMARK
|
||||
AttackInfo stage1_spell_benchmark = {
|
||||
{-1, -1, -1, -1, 127}, AT_SurvivalSpell, "Profiling ~ ベンチマーク", 40, 40000,
|
||||
|
@ -92,8 +94,10 @@ static bool stage1_draw_predicate(EntityInterface *ent) {
|
|||
return false;
|
||||
}
|
||||
|
||||
static void stage1_bg_draw(vec3 pos) {
|
||||
bool cullcap_saved = r_capability_current(RCAP_CULL_FACE);
|
||||
static void stage1_water_draw(vec3 pos) {
|
||||
// don't even ask
|
||||
|
||||
r_state_push();
|
||||
|
||||
r_mat_push();
|
||||
r_mat_translate(0,stage_3d_context.cx[1]+500,0);
|
||||
|
@ -107,28 +111,85 @@ static void stage1_bg_draw(vec3 pos) {
|
|||
r_color4(1, 1, 1, 1);
|
||||
r_mat_pop();
|
||||
|
||||
r_mat_push();
|
||||
r_mat_rotate_deg(30,1,0,0);
|
||||
r_mat_scale(.85,-.85,.85);
|
||||
r_mat_translate(-VIEWPORT_W/2,0,0);
|
||||
r_disable(RCAP_CULL_FACE);
|
||||
r_disable(RCAP_DEPTH_TEST);
|
||||
|
||||
Framebuffer *bg_fb = r_framebuffer_current();
|
||||
FBPair *fbpair = &stage1_bg_fbpair;
|
||||
r_framebuffer(fbpair->back);
|
||||
r_mat_mode(MM_PROJECTION);
|
||||
r_mat_push();
|
||||
set_ortho(VIEWPORT_W, VIEWPORT_H);
|
||||
r_mat_mode(MM_MODELVIEW);
|
||||
r_mat_push();
|
||||
r_mat_identity();
|
||||
r_mat_push();
|
||||
|
||||
float z = 0.75;
|
||||
float zo = -0.05;
|
||||
|
||||
r_mat_translate(VIEWPORT_W * 0.5 * (1 - z), VIEWPORT_H * 0.5 * (1 - z), 0);
|
||||
r_mat_scale(z, z, 1);
|
||||
r_clear_color4(0, 0.08, 0.08, 1);
|
||||
r_clear(CLEAR_ALL);
|
||||
r_shader("sprite_default");
|
||||
|
||||
ent_draw(stage1_draw_predicate);
|
||||
r_shader_standard();
|
||||
|
||||
r_mat_push();
|
||||
r_shader_standard_notex();
|
||||
r_mat_translate(VIEWPORT_W*0.5, VIEWPORT_H*0.5, 0);
|
||||
r_mat_scale(VIEWPORT_W/z, VIEWPORT_H/z, 1);
|
||||
r_color4(0, 0.08, 0.08, 0.8);
|
||||
r_draw_quad();
|
||||
r_mat_pop();
|
||||
|
||||
r_mat_pop();
|
||||
|
||||
fbpair_swap(fbpair);
|
||||
r_framebuffer(fbpair->back);
|
||||
r_shader("blur5");
|
||||
r_uniform_vec2("blur_resolution", VIEWPORT_W, VIEWPORT_H);
|
||||
r_uniform_vec2("blur_direction", 1, 0);
|
||||
draw_framebuffer_tex(fbpair->front, VIEWPORT_W, VIEWPORT_H);
|
||||
fbpair_swap(fbpair);
|
||||
r_framebuffer(fbpair->back);
|
||||
r_uniform_vec2("blur_direction", 0, 1);
|
||||
draw_framebuffer_tex(fbpair->front, VIEWPORT_W, VIEWPORT_H);
|
||||
fbpair_swap(fbpair);
|
||||
|
||||
r_mat_pop();
|
||||
r_mat_mode(MM_PROJECTION);
|
||||
r_mat_pop();
|
||||
r_mat_mode(MM_MODELVIEW);
|
||||
r_framebuffer(bg_fb);
|
||||
|
||||
r_shader_standard();
|
||||
|
||||
r_enable(RCAP_DEPTH_TEST);
|
||||
r_disable(RCAP_DEPTH_WRITE);
|
||||
|
||||
r_shader("stage1_water");
|
||||
r_uniform_float("time", 0.5 * global.frames / (float)FPS);
|
||||
r_texture_ptr(1, r_framebuffer_get_attachment(bg_fb, FRAMEBUFFER_ATTACH_DEPTH));
|
||||
|
||||
r_mat_push();
|
||||
r_mat_translate(0, 70, 0);
|
||||
r_mat_rotate_deg(10,1,0,0);
|
||||
r_mat_scale(.85/(z+zo),-.85/(z+zo),.85);
|
||||
r_mat_translate(-VIEWPORT_W/2,0,0);
|
||||
draw_framebuffer_tex(fbpair->front, VIEWPORT_W, VIEWPORT_H);
|
||||
r_mat_pop();
|
||||
r_capability(RCAP_CULL_FACE, cullcap_saved);
|
||||
|
||||
r_shader_standard_notex();
|
||||
r_mat_push();
|
||||
r_mat_scale(1200,3000,1);
|
||||
r_color4(0, 0.08, 0.08, 0.8);
|
||||
r_color4(0, 0.08, 0.08, 0.08);
|
||||
r_draw_quad();
|
||||
r_color4(1, 1, 1, 1);
|
||||
r_mat_pop();
|
||||
r_enable(RCAP_DEPTH_TEST);
|
||||
|
||||
r_mat_pop();
|
||||
r_shader_standard();
|
||||
r_state_pop();
|
||||
}
|
||||
|
||||
static vec3 **stage1_bg_pos(vec3 p, float maxrange) {
|
||||
|
@ -139,20 +200,22 @@ static vec3 **stage1_bg_pos(vec3 p, float maxrange) {
|
|||
static void stage1_smoke_draw(vec3 pos) {
|
||||
float d = fabsf(pos[1]-stage_3d_context.cx[1]);
|
||||
|
||||
r_state_push();
|
||||
r_shader("sprite_default");
|
||||
r_disable(RCAP_DEPTH_TEST);
|
||||
r_cull(CULL_BACK);
|
||||
r_mat_push();
|
||||
r_mat_translate(pos[0]+200*sin(pos[1]), pos[1], pos[2]+200*sin(pos[1]/25.0));
|
||||
r_mat_rotate_deg(90,-1,0,0);
|
||||
r_mat_scale(3.5,2,1);
|
||||
r_mat_rotate_deg(global.frames,0,0,1);
|
||||
|
||||
float o = ((d-500)*(d-500))/1.5e7;
|
||||
r_color(RGBA_MUL_ALPHA(0.8,0.8,0.8,o));
|
||||
draw_sprite(0,0,"stage1/fog");
|
||||
r_color4(1,1,1,1);
|
||||
|
||||
r_draw_sprite(&(SpriteParams) {
|
||||
.sprite = "stage1/fog",
|
||||
.color = RGBA(0.8 * o, 0.8 * o, 0.8 * o, o * 0.5),
|
||||
});
|
||||
r_mat_pop();
|
||||
r_enable(RCAP_DEPTH_TEST);
|
||||
r_state_pop();
|
||||
}
|
||||
|
||||
static vec3 **stage1_smoke_pos(vec3 p, float maxrange) {
|
||||
|
@ -184,40 +247,71 @@ static void stage1_update(void) {
|
|||
update_stage3d(&stage_3d_context);
|
||||
}
|
||||
|
||||
static void stage1_reed_draw(vec3 pos) {
|
||||
bool depthwrite_saved = r_capability_current(RCAP_DEPTH_WRITE);
|
||||
DepthTestFunc depthfunc_saved = r_depth_func_current();
|
||||
static inline uint32_t floathash(float f) {
|
||||
return (union { uint32_t i; float f; }){ .f = f }.i;
|
||||
}
|
||||
|
||||
static void stage1_waterplants_draw(vec3 pos) {
|
||||
r_state_push();
|
||||
|
||||
// stateless pseudo-random fuckery
|
||||
int tile = floathash(pos[1] * 3124312) & 1;
|
||||
float offs = 200 * sin(2*M_PI*remainder(3214.322211333 * floathash(pos[1]), M_E));
|
||||
float d = -55+50*sin(pos[1]/25.0);
|
||||
r_mat_push();
|
||||
r_mat_translate(pos[0]+200*sin(pos[1]), pos[1], d);
|
||||
r_mat_rotate_deg(90,1,0,0);
|
||||
r_mat_scale(80,80,80);
|
||||
r_color4(0.0,0.05,0.05,1);
|
||||
r_draw_model("reeds");
|
||||
r_mat_translate(0,-d/80,0);
|
||||
r_mat_scale(1,-1,1);
|
||||
r_mat_translate(0,d/80,0);
|
||||
r_mat_translate(pos[0]+offs, pos[1], d);
|
||||
r_mat_rotate(2*M_PI*sin(32.234*pos[1]) + global.frames / 800.0, 0, 0, 1);
|
||||
|
||||
Sprite spr = { 0 };
|
||||
spr.w = spr.h = 1;
|
||||
spr.tex = get_tex("stage1/waterplants");
|
||||
spr.tex_area.w = spr.tex->w * 0.5;
|
||||
spr.tex_area.h = spr.tex->h;
|
||||
spr.tex_area.x = spr.tex_area.w * tile;
|
||||
|
||||
float a = 0.8;
|
||||
float s = 160 * (1 + 2 * psin(13.12993*pos[1]));
|
||||
r_mat_scale(s, s, 1);
|
||||
r_depth_func(DEPTH_GREATER);
|
||||
r_disable(RCAP_DEPTH_WRITE);
|
||||
r_color(RGBA_MUL_ALPHA(0.0,0.05,0.05,0.5));
|
||||
r_draw_model("reeds");
|
||||
r_color4(1,1,1,1);
|
||||
r_cull(CULL_FRONT);
|
||||
r_mat_mode(MM_TEXTURE);
|
||||
r_mat_push();
|
||||
r_mat_scale(0.5, 1, 1);
|
||||
r_mat_translate(tile, 0, 0);
|
||||
r_draw_sprite(&(SpriteParams) {
|
||||
.sprite_ptr = &spr,
|
||||
.shader = "sprite_default",
|
||||
.flip.x = floathash(pos[1] * 231544.213) & 1,
|
||||
.flip.y = floathash(pos[1] * 941233.513) & 1,
|
||||
.color = RGBA(0.5*a, 0.4*a, 0.5*a, 0.5*a),
|
||||
});
|
||||
r_mat_pop();
|
||||
|
||||
r_capability(RCAP_DEPTH_WRITE, depthwrite_saved);
|
||||
r_depth_func(depthfunc_saved);
|
||||
r_mat_mode(MM_MODELVIEW);
|
||||
r_mat_pop();
|
||||
r_state_pop();
|
||||
}
|
||||
|
||||
static void stage1_start(void) {
|
||||
init_stage3d(&stage_3d_context);
|
||||
add_model(&stage_3d_context, stage1_bg_draw, stage1_bg_pos);
|
||||
add_model(&stage_3d_context, stage1_water_draw, stage1_bg_pos);
|
||||
add_model(&stage_3d_context, stage1_waterplants_draw, stage1_smoke_pos);
|
||||
add_model(&stage_3d_context, stage1_smoke_draw, stage1_smoke_pos);
|
||||
add_model(&stage_3d_context, stage1_reed_draw, stage1_smoke_pos);
|
||||
|
||||
stage_3d_context.crot[0] = 60;
|
||||
stage_3d_context.cx[2] = 700;
|
||||
stage_3d_context.cv[1] = 4;
|
||||
|
||||
FBAttachmentConfig cfg = { 0 };
|
||||
cfg.attachment = FRAMEBUFFER_ATTACH_COLOR0;
|
||||
cfg.tex_params.filter.min = TEX_FILTER_LINEAR;
|
||||
cfg.tex_params.filter.mag = TEX_FILTER_LINEAR;
|
||||
cfg.tex_params.type = TEX_TYPE_RGB;
|
||||
cfg.tex_params.wrap.s = TEX_WRAP_CLAMP;
|
||||
cfg.tex_params.wrap.t = TEX_WRAP_CLAMP;
|
||||
|
||||
stage1_bg_fbpair.front = stage_add_background_framebuffer(0.5, 1, &cfg);
|
||||
stage1_bg_fbpair.back = stage_add_background_framebuffer(0.5, 1, &cfg);
|
||||
}
|
||||
|
||||
static void stage1_preload(void) {
|
||||
|
@ -226,11 +320,9 @@ static void stage1_preload(void) {
|
|||
"stage1/cirnobg",
|
||||
"stage1/fog",
|
||||
"stage1/snowlayer",
|
||||
"stage1/waterplants",
|
||||
"dialog/cirno",
|
||||
NULL);
|
||||
preload_resources(RES_MODEL, RESF_DEFAULT,
|
||||
"reeds",
|
||||
NULL);
|
||||
preload_resources(RES_SHADER_PROGRAM, RESF_DEFAULT,
|
||||
"zbuf_fog",
|
||||
"lasers/linear",
|
||||
|
|
Loading…
Reference in a new issue