From e913a28dff24a331d0ecf3f0600d23a46ce0f307 Mon Sep 17 00:00:00 2001 From: hgn Date: Fri, 24 Nov 2023 05:07:50 +0000 Subject: [PATCH] cell shade character --- ent_skateshop.c | 1 + maps_src/dev_hub/main.mdl | Bin 410280 -> 410280 bytes shaders/model_character_view.fs | 83 +++++++++++++++++++++++++++++++- world_render.c | 11 ++--- 4 files changed, 87 insertions(+), 8 deletions(-) diff --git a/ent_skateshop.c b/ent_skateshop.c index eb30ad4..72bd8fa 100644 --- a/ent_skateshop.c +++ b/ent_skateshop.c @@ -198,6 +198,7 @@ static void skateshop_init_async(void *_data,u32 size){ skaterift.rt_textures[ k_skaterift_rt_server_status ] = global_skateshop.tex_preview_err; + render_server_status_gui(); } /* diff --git a/maps_src/dev_hub/main.mdl b/maps_src/dev_hub/main.mdl index c0b7c7e9eba3d6b02642ebb9fb4ed3a2f37a9fd4..6362bb8e3cb13308fdb2eccf7788a4f445ddc85b 100644 GIT binary patch delta 5844 zcmaLbeT)^=83yoW>B=^`It1E=NM$J6Vn58FR)V|to(Ul!v8~gFT1X-x8K8FpFNXRRk`eG&A2! z>#F0;wRc|JSbu5Rg?IhWQfD9PS{dcX4F^zwHeX=GoxZE}_$Q}69nbLA7i zn6`F2`ay2|!4@`t*6M70qX<_E@<0)&LWy^uZ^-|!<{|daH;ZLCmcC0(w05O^FRX3P zooQ-iU%q2&wzEr>`s>`DpIqIcfTt-n;Rk}3~BG1zeP)Hc@li+1Hosd9Gr z6ZvGtO4j||Fxxri``r8c+>!ShS!v2W^1S}@=@NhIxZIK(+SvWOw`5@kRpOz!`S~|A zvChl+>@C|=8Nczh(%lnV*pdk!WNSRC=+!?cFKl_3UD)xA+@=scuU>0~`UajoU1~hh z#OAJ=kR4m!qxM-KcTf7+o*AxSU;OFpY(=;y%^KrQ$xnNznLSs#B0F?KmBIe@hK|8D zc5d9W4e}*xooUjV3r*~D@nCi?von1?^A2@q2~MXvO#q5J)AZKaW6B@xYhk@N&5*17 zz3L)kZ`wBHci+ojwd7H@ZrcLcRSI^L)4O>F2J4cXI( z`j?FTFxPIhvTvVwF*{C$Dp#&vSnAr+#_DH1-s5apTfeODVy>XSkXGt%?J8METG^{_ z7$r+oth6#`@IQ~2#w=`OjT_<~Q5i~qs+6BoAJ>_Ot7^@a*Uax7t-lb`9-~&0|E;)U zcP&iU94)Y(flu1l#xomVkrgvcZ%@weki=w#02Hg8{)=j(0kTOl(i2)m7Zj1abS$ol z(D3EGq^`3_Gz#x@K_MssX)?vKoyc4Q{S)3B3a_-E+_;gAnlLp zWG2V~1)!KD_VW)YC>SKV75+i8K^`aqRY)STpueKZBFRiw)c6h|D1lC`M@=z74k!S{ zs{E1~Vvsy>(>BN>(U|-L7zqvk?vdzgfJ-lrh<92fxy~ig4#US2om>e>>s32Vl1yf^NTvB#CPy*5ptDPpu0R^B~mH(O=Vt{Or2Z}%ykbXqXv_LK> z1SKHt&uWSZazFtnR^|U?B!qwZ4UjFwU%Ds6J0nm9q#so?Es!h3GeeU63?xE)2kmt= z#T4S}98e&{*Tp2tB>8_;H!w)@qhky4WgaLJ;@ed~dY?L&1#-Ezimw(>0-f65)LBfB z0}4PfSGogD<{zVw5fltA@k?rhJWvFxfb>`$%mTTfkW1{IfVAW4C7B>ch+l31ib;-m zdvA<@HyWhu?FkLPJy0Yx{PsZl33V_FQmfC5NWTy)XMd$F_18HxMr0|*vazFtnR^|Ug4KYAA z$OA>73P?Y#W?CQ@6oL|v_Kuojf*eo)in&HUJN^KLh!2v%CEke*@<0)&0@B}A2eUvf zC6JvGw;xg^;cLM;JlXVnxFHaU>WF?^h delta 5775 zcmZ|Te~=b+9S899A%0|?t%83r66}pMk%Y5EAR><{Li^7^Ue^;3hE`YlK6zxZgmenYwbs=ji4A$oe!cvv(Gz zO*wSqgSEGASjnDTzo{lF!Op_WPoH1;Zlkyo)0KbEt;??{yVB9U4|Fs(FKJ;XJ8#HG z>r^@N;9#xk!|$-IQx_IRinS|E*>dA!C2_^4D~Bf^%11}L3aYYlna&<)o7KHhF|@1lrK7@oC%XUibKoVSxn7O$w--5j-&D<7VQ~Umz7IyDaH_r^HGO)B%x^+!6TePV+ zPl~BBXLxCC^FLOzmuAk()0DkwW#YF!svVtkKhr8Ve?`o$Q)S03Pu8}*vzl#r_w#w0 zwKv`8it&r8qSvS1hWBRG?tFL+yMErZJU^n|d3AS)D{eV$eP->Y#_Nu^vTJXBG+(|} zhNA^Jpb(T$;$6eV(&F(CvA@4ku8C!-`{YDpU)tC6SZ8D0+{Qk8%l3R`n<}?`#;$z# zQ_bw#uPqdd^#ZCKpYfl{vY?GUyXZtdCf=8BZ2sQ4d9SiR?fvh9%~hlC5q9c{ALSLD zD(l?y)qk#RW81&9PC81eSdU*QexaeAo%wO6bfi>yWB=o&*H^7(y>|!s%n?;S{N^)_ zC*NGdDl_g8`*jbb1#kPr#^ux7*?s$ek%wtiIdkQXQq%NicHsR|ewR(EC_jC%dgqi@ zwtVuXe2hbt>4k69mb8A4UEH%xOyh+Ie_*3cKaif^KGkLa-RXRyV7TS zez1yN|APhjh@dOYD%dkhGaqVUznrux-*ilsw+B0mzq-)Q;)y$o;wCHIY0^(FHnWe) z$Mb#Z-RbRVdZ8~*u)5{d_@JmeO>bXtRqb+bD?9PIxnh*tBM;Jg(l+(yUoTBqzLss= zwMeviCRI9Ky|=dTsUI@6YgT?(PEWeL4?3IKmD$DoYDoPn#=Y0rskJd};9$O;gew2K zxVUYj$-LuNYMM^1}7iODo#h{l#My zQ3-|%Q>LA$o1_mlpX&ekjxoo^|6ke4=Tm}ozMEFvRw;ha&We}U9TOEjNY6{G*dmFw z_@GGcbPvjn8ptGxNQdhP9Z5*qo-Qj>!ZmVShvabviI$Re+MoawgOp#7j>|H2kVT@| zvziZzWVwgsMvWvkWP%*%3_%G=oTl0<%OHtN8x)YlGGmZ(M6T%|izG6AP$bLklN&XV z335OoC?Sbusz+rRB(ZfH6o6uo@|?Uf9b|!gP(ZdnEb{WKwIR%H9lv zB*xh!nqg#nyfae_Qu^giog`8$kWUgHp-7e+%EL5}335OoNkk?f^*3^+0kTQrJ_n!} zq#Tz!b&{CR0{J9yQzBXJZ{-jTWP%(}ND`3=NPR(GiUG1o`Sw6DNI4;Q>L3f`gCbe( zi*kqtGC>X~1SKH#q?~DhY)}A-LCWvs6dh!Nd{89I{rzZ2_VjBYlPi0N9ImW01SKH# z4|1jfvbnO%fFz!Qm@At>IVGp)T-i7aw_W^|BuN1(T1AmuGNMF&|R9~6ad&{(BI~>H{RY~m;UR% zdS<_PI^ZwWo33<>it;yk)jG%m`Jn8Vi3vB=Gg{~1Q;T7p=})6$RPx^}KCYwB oyij=h9Zx?yu3^H^mBGQmD;pZljq7VT_lXV9_w9UQ{P@2A0T2o|_y7O^ diff --git a/shaders/model_character_view.fs b/shaders/model_character_view.fs index 6330f9b..49e615c 100644 --- a/shaders/model_character_view.fs +++ b/shaders/model_character_view.fs @@ -11,13 +11,94 @@ in vec3 aWorldCo; #include "motion_vectors_fs.glsl" #include "depth_compare.glsl" +vec3 character_clearskies_lighting( vec3 normal, float shadow, vec3 halfview ) +{ + float fresnel = step(0.5,1.0 - abs(dot(normal,halfview))); + + vec3 reflect_colour = mix( g_daysky_colour.rgb, g_sunset_colour.rgb, + g_sunset_phase ); + + + vec3 sky_reflection = 0.5 * fresnel * reflect_colour; + vec3 light_sun = max(0.0, dot(normal,g_sun_dir.xyz)*0.5+0.5) + * g_sun_colour.rgb * g_day_phase; + + float scaled_shadow = max( shadow, 1.0 - max(g_sun_dir.y,0.0) ); + vec3 ambient = mix( g_ambient_colour.rgb, g_sunset_ambient.rgb, + g_sunset_phase ); + + return ambient + (light_sun + sky_reflection) * shadow; +} + +vec3 character_compute_lighting( vec3 diffuse, vec3 normal, vec3 co, + float light_mask ) +{ + if( g_light_preview == 1 ) + diffuse = vec3(0.75); + + // Lighting + vec3 halfview = uCamera - co; + float fdist = length(halfview); + halfview /= fdist; + + float world_shadow = newlight_compute_sun_shadow( + co, g_sun_dir.xyz * (1.0/(max(g_sun_dir.y,0.0)+0.2)) ); + + vec3 total_light = character_clearskies_lighting( + normal, min( light_mask, world_shadow ), halfview ); + + vec3 cube_coord = (co - g_cube_min.xyz) * g_cube_inv_range.xyz; + cube_coord = floor( cube_coord ); + + if( g_debug_indices == 1 ) + { + return rand33(cube_coord); + } + + if( g_debug_complexity == 1 ) + { + ivec3 coord = ivec3( cube_coord ); + uvec4 index_sample = texelFetch( uLightsIndex, coord, 0 ); + + uint light_count = (index_sample.x & 0x3u) + (index_sample.y & 0x3u); + return vec3( float(light_count)*(1.0/6.0), 0.0, 0.5 ); + } + + // FIXME: this coord should absolutely must be clamped! + + ivec3 coord = ivec3( cube_coord ); + uvec4 index_sample = texelFetch( uLightsIndex, coord, 0 ); + + total_light += + scene_calculate_packed_light_patch( index_sample.x, + halfview, co, normal ) + * light_mask; + total_light += + scene_calculate_packed_light_patch( index_sample.y, + halfview, co, normal ) + * light_mask; + + // Take a section of the sky function to give us a matching fog colour + + vec3 fog_colour = clearskies_ambient( -halfview ); + float sun_theta = dot( -halfview, g_sun_dir.xyz ); + float sun_size = max( 0.0, sun_theta * 0.5 + 0.5 ); + float sun_shape = sun_size * max(g_sun_dir.y,0.0) * 0.5; + + vec3 sun_colour = mix( vec3(1.0), g_sunset_colour.rgb, g_sunset_phase*0.5 ); + sun_colour *= sun_shape; + + fog_colour += sun_colour; + return scene_apply_fog( diffuse * total_light, fog_colour, fdist ); +} + void main(){ depth_compare_dither(); compute_motion_vectors(); vec3 qnorm = aNorm; vec3 diffuse = texture( uTexMain, aUv ).rgb; - vec3 composite = world_compute_lighting( diffuse, qnorm, aWorldCo, 1.0 ); + vec3 composite = character_compute_lighting( diffuse, qnorm, aWorldCo, 1.0 ); float dist = distance( aWorldCo, uCamera ) - 0.08; float opacity = clamp( dist*dist, 0.0, 1.0 ); diff --git a/world_render.c b/world_render.c index 04db5a0..096de9a 100644 --- a/world_render.c +++ b/world_render.c @@ -164,12 +164,6 @@ void world_render_props( world_instance *world, u32 material_id, struct world_pass *pass ){ if( !mdl_arrcount( &world->ent_prop ) ) return; - /* HACK: use the first material for every prop entity */ - ent_prop *first = mdl_arritm( &world->ent_prop, 0 ); - if( !first->submesh_count ) return; - - mdl_submesh *sm = mdl_arritm( &world->meta.submeshs, first->submesh_start ); - if( sm->material_id != material_id ) return; struct world_surface *mat = &world->surfaces[ material_id ]; pass->fn_bind_textures( world, mat ); @@ -179,7 +173,10 @@ void world_render_props( world_instance *world, u32 material_id, if( prop->flags & 0x1 ) continue; for( u32 k=0; ksubmesh_count; k++ ){ - sm = mdl_arritm( &world->meta.submeshs, prop->submesh_start+k ); + mdl_submesh *sm = + mdl_arritm( &world->meta.submeshs, prop->submesh_start+k ); + + if( sm->material_id != material_id ) continue; m4x3f mmdl; mdl_transform_m4x3( &prop->transform, mmdl ); -- 2.25.1