From c16f95624c142beec1572baa24f262e8a661f3fb Mon Sep 17 00:00:00 2001 From: hgn Date: Tue, 8 Aug 2023 18:58:51 +0100 Subject: [PATCH] cool font shader and entity bvh fix --- blender_export.py | 14 ++++++++ highscores.c | 38 +++++++++++---------- maps_src/mp_spawn/main.mdl | Bin 13231504 -> 13228824 bytes shaders/model_font.h | 2 +- shaders/model_font.vs | 2 +- shaders/scene_font.fs | 44 +++++++++++++++++++----- shaders/scene_font.h | 68 +++++++++++++++++++++++++++++-------- world_entity.c | 25 ++++++++++++++ world_render.c | 40 ++++++++++++++++++++-- 9 files changed, 189 insertions(+), 44 deletions(-) diff --git a/blender_export.py b/blender_export.py index 52f674f..8d4c12f 100644 --- a/blender_export.py +++ b/blender_export.py @@ -4260,6 +4260,20 @@ def cv_draw():#{ data = obj.SR_data.ent_unlock[0] if data.target: cv_draw_arrow( obj.location, data.target.location, (0,1.0,0.0) ) + cc1 = (0.4,0.3,0.2) + info_cu = Vector((1.2,0.01,0.72))*0.5 + info_co = Vector((0.0,0.0,0.72))*0.5 + cv_draw_ucube( obj.matrix_world, cc1, info_cu, info_co) + + vs = [Vector((-0.2,0.0,0.10)),Vector((-0.2,0.0,0.62)),\ + Vector(( 0.2,0.0,0.62)),Vector((-0.2,0.0,0.30)),\ + Vector(( 0.1,0.0,0.30))] + for v in range(len(vs)):#{ + vs[v] = obj.matrix_world @ vs[v] + #} + + cv_view_verts += [vs[0],vs[1],vs[1],vs[2],vs[3],vs[4]] + cv_view_colours += [cc1,cc1,cc1,cc1,cc1,cc1] #} elif ent_type == 'ent_audio':#{ if obj.SR_data.ent_audio[0].flag_3d: diff --git a/highscores.c b/highscores.c index 77ffc41..6593b9a 100644 --- a/highscores.c +++ b/highscores.c @@ -402,26 +402,30 @@ VG_STATIC int highscore_intr( char *buf, int value, int len, char alt ) /* Print integer into buffer with max length len * retuns the number of digits written to buf */ -VG_STATIC int highscore_intl( char *buf, int value, int len ) -{ - char temp[32]; +VG_STATIC int highscore_intl( char *buf, int value, int len ){ + if( value ){ + char temp[32]; + int i=0; + while(value){ + if( i>=len ) + break; + + temp[ i ++ ] = '0' + (value % 10); + value /= 10; + } - int i=0; - while(value){ - if( i>=len ) - break; + if( i>len ) + i = len; - temp[ i ++ ] = '0' + (value % 10); - value /= 10; - } - - if( i>len ) - i = len; - - for( int j=0; j#hlrsUzO``A{YQ*-W-40E?)wwu@2nGEBEKo}U4GUAL0 z`N_Fy2^mtZdqstsO|7VrPA%%OsTe~V@Oeni%#X{=L5CSeO)FS8S!fI0 zg@I0=VHg_(rI}l%la71lrDkQLUVN5eIFwJOnwVfr&P_lAj`(v7)1R_3H`%pT>M8T| zzTe6)1OZ!+21-mcCP|6X;m}6c$UJ>R+q%P{Xp&M2GBdIg(=8c{`$dM4(;S)G*wps! ztO?ev{M>|j^U@M6X@!><#v507DV7m(vkLN)<1(|7uuL(X^h=qi48;SP=eQWG;Q=oj zCJ33*8(EN?`(zE6)oGiU>)VNCs!}X1Gbt_6y3nBy_t#FhVI63a^AvVhZH@DY*NGp- za3XZRaZsPb*@Tg*LkZo4>J?O#s74UljOq`lN;jND=ugH$3XdGZ6ysf|Qb*%p#k;xP zxv4ZKbFiWcHEEzs8i`tqHMUBM(XdQAwv28;`)_EkMAmlNg4)JB!esj}%$M{YYTO3G ze2<0D)cR(L9H&B>jILeKLF)=!XyL*W^u{8W+8KqFENfePbJ0GQwWC{#I#_va!Qy}k zG_|>mwW0T#1sZcfNjD!aV>zlhA+Urt;4G(6Ck1r4c~YQd$Cb4FlQOQ4w8N?IDN2u? zP|{E3i)V%2|OfZc)4O-mjiZ-q4#~!V6OY6Vd zwCr`tUhtrgF7%-TE^1XbdgLhR%!~Y=TKb^Hjn@4o&t7U>-~Q*$N=xb#wBGD7q>3(W z=PkE%qYf99^gG0V>Jjf}nO4vxExmlvk1j^3ZTF+6Fa0^o$uhP}hnD?`>N?zLXS-m|@wEqp@OqHS-yc72lrfCiTJqQWNgZ9JljVqW+t=isav$+{;6$9dD%k(yV#3A>zTh zP2<&Zhr-=KDy4pRZ9{kz#Zu{mexye~)_N_cO`rRF5bRFrf6Ufe+E_~tQ8#CmwWfR; zb)klAFAqCwU12SyJuZ!6FZJ@^taos-wmMo%2PvxPXRY;>?(gVotvOpu7qkwfL0ww* zXZlT-8_n)|p1mVoEwAe;sq11v1~y_{mu=^ZiZk4&I`{oc_@&~;L0k&gqt0nLdrx+; z=orDp1}XRlEsY_VxZlu#)N`Je5}CbanbA!adsYO_E(fN3~o@jnE3BS z&3l}`6T4lQTEhhfp9p=q(WSAF|8~7iWBG$VeAb;8_{TW#z)z2vx}%2ZAM4En>?*?> zg_;^Jk@XiH_i`iDLzd*Fhe+MBpV2LKITH~$I)GpOT(em&7+bi}m~vGMw@|~rD0toC z;uJ$1_BP6fXYobi%3EBDEF|DNSwsJ6ukyDhJD7W$%#7FS4gO88=6xP*;bQzm-A97& z9WH>Ci&O7#@AxXFERJpTT~f%$i&vdVHLLh?xqUXMi2 z4obJke8$AXez|F|!^D@}EIO9A{B2AA58_5ONs)0kCal*V6IgFjI_CCgrMgP3i64LVD8g3tdWS;&S+vGT{DlGPfiC-n0^d@nvi=Y`u0$D#XY9N^?SLCc6VSYs( z!pDeJ&k?f?dsj>zN<TR2Lx3h2~-3}uNn8v?8l2BPH2Vc;40gZSHB9X?@lJ1S9oyS#*qxtl z;4&VYT~z*t9Y6Oyn)A@aFIjQmS^47GU~)mJ*b!i8WL6jQ(kjPenCI;HHu29@{f{8VRsr$A}d(NvRFHQ}Bu+iR?OYX%zXNOyTs& zx)IXrTPduJL9dDDKDSgCiC1IDuQIk!yb?>YWD0x3THS)#CVsaNHHSpAH-wrwBrtf> z+?`=>Hkt@N6aGcnZ)T6kYQt(l6-P!7xf%W6Uen_%ZNsDHeQ*9aai3wD zXpAFYvFtrzY69L(eYt~vn{5_|T*; z6&&Z10Pa`k9s1LvVJ@~qNLTGF{>0WQeQ!ft%p7U>X6I!6`cKtO8kfuZxy$D8ZmSn+Qt(8& z8TI3iJTmd0iC0rdx{UMq+Qe@YqUMv>VV94X_~_J=N2TdK>%ZU&^(%(K%w2QFT=TIF z!j<_XkQ+OHi*AD8n2tTLTri}Q07ZcB+9TWImhgLp0<;GAozWWB+jlkN-&#Y;sB7l5 zuy>DL@b%I~o;2~7g!Xh&qG(NaX)N9|iq8|0Ge{}t)j5jS3HLJa81}+jM%=BxSYsq6 zmec%tOSfAL&LUZ%-H#$xRg)4KU>M*Je5gvOJ4eKJ-UnUd#E1vEjk-JOM zT{z1_3k7m{wBqR;#CEy7V*tL-8b5i@uhvx~k7kQRqedR6#(vxqj_A`}Dsl$7+hpgb z|5f&}<1S$W6_~&~;Y2fJRcq)t>x};I&sqDeEaKtyWyfYL5)F93HS$1qcS+3}IoN>$ z`hYzsK?QxGA2@&`IDs>`fGhL|H*g0J@B}ps059-{f#3taFbD>NA86n?@CPjnfuRrp z&%-bn4uKE^!SDi%fRPXaqhK_I!Wb9};~)%lpa&kp!2l639wtB}ya*Fv5=@4d;ANNs zQ(+oRhZ!&vUV&HPHHd=0K{Uj`>o5yq;SHD#b07}lApzz>A|ydF%!3q2g*2EC>5u_N z$b>A&h8)O+JjjOvSO5#55Ej9kPy~zNEm#63D2Ao543@(RSP8431Xjb_um(z@4A#Or zcn8YGnl%+|3&iY@^*#>Ow{6x3m6S)W2MQZtBWwZzHp9E{cX$sfVGC@9_hB1+03X6f zupO#k2UNqyuoHH{ZrB4guvaXP+~;#!%nsY{AQOE??!L+is<8d)l4AXSH~{~ETBw71 oI0zyfg2V7nI08qZ0UE&!$Dj$C;W(Utlkf?gg41HLzQv*X56uaie*gdg delta 6211 zcmZ{o30PF+{>RT5IA>;LM%i>&L_kCaMYKRfn3)&GB{W5|o8T@AD#|8;fha>FYNiDq z<&fd}mn5zxiaMGwsAx#Jprzt3!;)zlub6a(afU(%QWH~Vq$Xq~ zWhN)2P}_o%5>K|dWDosl@{DLk3>q*9B&B7|Sd@|Qb{e&#PZq;CplAV9Hy2^3m_9Mf zgkG$NEPj~~!FuR(mUToK0}ZuI$WBZ~4%X*1ba{9y092QfJa--fTc4Pt4AV;}VKp+h zvqBXDRi0xQJE&;p)^rx2%|-LlGfKq)=))Gg8>(Xc$dI%z2wf3189Y;f z`SuoyQvJe0GI{Gd@s`^$3TO+Am+NI^MKyQF_C1DoVk|2P`F3pIDC#)^wtY|r$c4)( zy}Kk!RU#K;slB_bLsbQBoLmS-^+Qx?Kc~rs$*H}SO_Fw*urJk52uf41g~E+gKjrU| z{39w?a*H}z*e(oC^HT<*R*n!ygap)1p_bvpFh2|HP#e5~XKrJ}BWjMMnK{-=SeT^= zKe#5$So&SCu~}h=KKiHhdTO zg(ZCdCx%TU;|ZcChT38JI#YiCR&_L2|EBTI8MU!*_K>JRz#faR_V>@@f%P=K#x2C^ zDD19RX@{1x#sTVAjkm`BE86{DUet{9NraX#WQIjlSg6C^v6)r}JC1P{OqPwTLg-#E zvPxkOKD!7bj)|;;aO0RLq?}X<1;^L2YC(NM6v|Jjgz6J(xo$K+A-X}}9IbCx@#bWG zTX<3s9yh84$5U%r7h&@$k#!XYe=Z6^O)8<~^R;XbA*oShHNq2ox(ORki>yb@fF_N7 zfLG(j=o$YcMq_?&BN9aSIygDOP}j^pvHamZ%CK!oys+S`-;jc+8}0|A?Z&=ky#Ay5 zIqQ(YO5zgGW^oN@Gtl=|bhdLKIl<|iCa^qJX1wstE5;#vE@KHjYln``%9>5q(YdC` zBCUe&S@#eZD#o)dY7~~<_3=ZEGq=;F_sq|qgpyw?i|T%>EYj2WJMi=Ezb&e;FwAQI z-BQDI_9Omg$f74t3|UW}SVrRAYA@RsB@92SRo_KZo#`rRxyfjYMU&%Q~lJX-71|(q@%#?3`A8&&H;!5Pe=FsLnqx?FK0k9yj+9cAnP?F&Fv> z_hIpqji0kMwywD|_M;0bVRf@sec#5$)oSzge@VMrTlBf`yloGwH08gf8e#hd!rm8- zr)#jse!mc+eqa;d!y145MXmBbol@b!Vi(~|vqC7psMXp|JPfSoI4$j&XH!~*M`*pM zHN^&c8T(E!8Y`yWimpB4M>?SnMw=be+KozF>4)_>9^}vvus7G}{7KlbP9IuQrLEs% z_^~#AKl@f4zqoY2aa3l(FsvoPF3{amg>%o&#wIRe(}{*1rN*ks8N%OMFV8;Eb2fVW z%XSTg;!0!ChD}uO9tyqOMlX{V5-a?)FhD7jG%CUO>i~BLY*qSgtdvTHRCa+@)IN_q%Ty(9H<=cN`jlC+0ZcBfjUt5kEL?K^o$H8-hrhtyke z{7Ng#yQF1*7D_G+V}HS?rm*eOs#!k?JPyoZhWEpDb?;&=rdp?$~S0 ztv$Ihobsu{tnbY^cqsEqbII6O<1EGEI~?z3PS$aegVcsUnk+ja7m(5Bua0(ji>Fh# z6qT=HvSn6wE}3dtUsrn9-c5{8<#g(b0h27stX$GhSyopp?#t%f%tunWj{?+1b$)g3 zO(t?Ht6Qye|Z#Ea%-8lZsx`ktOYlsHo(kl-j=*kglKBNiy@iO3u~Oe%Yc0gT?B5h*;LZsaRgD zXyAr$dB40jxJ2A{52Ns?ft%{D9%0yG$vKry{%s#<=}?F{chHpp$4@P?;B=CE{2IEF zuoxq9^$z#COcnIKtgc7wo8-YL$9ijOF>Ofg@XXirJ2iudC244VvA9s=+{D~A&Oyy} zY0@)4Ig?r5-o{4t3>MO=N)i zY&X7W@y9HK|)veAk|Ql}4h=T++L!gsCmw!%LSN&#BC^J8S{_TlRd$5&>O0l&H! zB!_r6K1Kc0`SKszCL1VG@ z!~7_m|ApmNUks0wW>yi&m#eGh`qo`KVndu5I(?7{0%qGU8#mVPN4DEQ5~C z_Bx+pr`}cmo}p^~YsBe&M@b>(jN_ve>sBaSu{B@by>GStP=!CDhcPLcK zuVn(SQ^%aSYL(};28T+UYv`N&H5t3u+o+b*XgsTnMl=xq*}?bG9HfYcW&z* z9X64cLz=qIftZ92Z=CgsZpjG~Non`Q5_H;z4h@~eJE&IP4AJ|a$|rAy)ku4C-Xz|Y zyBqhbv{J<~xU0tX+pZ70l1CQn{H=S`e0maJ%c_4_b3Z*O!TO)>vcoo^6BJ*xFwx!ub#=f+SSf{ zL;Ras9fp-^PsT07u;>}2>zGjn@qQy#_??;j0#*6}C;gc(O=ORDgR~EF60mI!^elUHUZhw|K5JRi zAt|H&1ANyV-7zDd?3-}A)Bki5=1D#NqE6c1kEq>6UoZWLQzmj{>H5z0wR89s)mKTb zmV(`3Br9j2GzEv}@EOXUEn&n^_X?4=SSvO=Uf9Xw|H^!Uy$GK3$wmW4LYbh(QG0oPCk~t@I-~TTxWCsjP;hssh4Da8kum(L?T_BrQ^_i+FP#jRM~Eq zjszb?!2Rj&GV3Gdno-ZrX>r;L`9OPm%81qZoV(Z*i9KX{m~;dw!x_U?t-7^B4irEM zx&Q~D0&36|bOVmS2{;26;0n5f9zX-!fIIL2o}ef20=oU>2AS5L*|y&@H_L%=r>F1#dh~Qe6I^gPMg2M~;G_$3T2G!FqwDobTYKH$Zm24Wt(hiUb{cgXs z13#Kd4Pm|Tv#Z(^UL#xSPdr8svu0HKIQXRv(7PRa&*L5UkD8z=4YBBAtqqhejeNnL zj_4gU5Q+xYSBKZwJ&n&W*Ow1`-rj^X>5x9l==p?RaOkkNe63wmH*!^yp=rK%O)bvT z*+CsQE+-axJ>P&7|0L|AU$8GAv;T*K^=6CSW)=D->iZ?mCwaHNG$0nUGwQ%ghm_ug zQTrm_#Jc{l&$rqa5ZId=9o9PyGG+X1sh{Va7BZUY8+CMxxAm9C)`Q(Di+y}Zeoe}Y zQDHv~_Om|rIA&|#_=h*Su*Uv{Zqi#d9d6R-t(vX9S9ot?3YNdP(x^k{)tjxu?8M$= zY5GeOBCWmBYG^|HZ8}gE^{e5F4_{0O9VRzmPdmJSi|JX9v+h1Ltj>M00eTnsSS+fc zcY(GIv`>Fvhz)+Zedj%*t^M*74-BR#`ST-WKKN&epW~{Q$n`(~8^A_T3Pex_J_MV< zN1z;R23x>ZunlYnJHY>eouC4I40eG^@Cm2_{{*|i9`LETC33INea?E3B5qGEb>ZY# zNJ=qbXoZWv60h`MYZs}Mp`;JJ5T}>H6qWeS{5>w_>U(=1a$Tto_world, bound, (boxf){{-1.0f,-1.0f,-1.0f},{ 1.0f, 1.0f, 1.0f}} ); } + else if( type == k_ent_unlock ){ + ent_unlock *unlock = mdl_arritm( &world->ent_unlock, index ); + + boxf box = {{-1.2f*0.5f,-0.72f*0.5f,-0.01f*0.5f}, + { 1.2f*0.5f, 0.72f*0.5f, 0.01f*0.5f}}; + m4x3f transform; + mdl_transform_m4x3( &unlock->transform, transform ); + m4x3_expand_aabb_aabb( transform, bound, box ); + } + else{ + vg_fatal_error( "Programming error\n" ); + } } VG_STATIC float entity_bh_centroid( void *user, u32 item_index, int axis ){ @@ -415,6 +427,15 @@ VG_STATIC void entity_bh_debug( void *user, u32 item_index ){ (boxf){{-1.0f,-1.0f,-1.0f},{ 1.0f, 1.0f, 1.0f}}, 0xf000ff00 ); } + else if( type == k_ent_unlock ){ + ent_unlock *unlock = mdl_arritm( &world->ent_unlock, index ); + + boxf box = {{-1.2f*0.5f,-0.72f*0.5f,-0.01f*0.5f}, + { 1.2f*0.5f, 0.72f*0.5f, 0.01f*0.5f}}; + m4x3f transform; + mdl_transform_m4x3( &unlock->transform, transform ); + vg_line_boxf_transformed( transform, box, 0xf0ff0000 ); + } else{ vg_fatal_error( "Programming error\n" ); } @@ -440,6 +461,10 @@ VG_STATIC void entity_bh_closest( void *user, u32 item_index, v3f point, ent_volume *volume = mdl_arritm( &world->ent_volume, index ); v3_copy( volume->to_world[3], closest ); } + else if( type == k_ent_unlock ){ + ent_unlock *unlock = mdl_arritm( &world->ent_unlock, index ); + v3_copy( unlock->transform.co, closest ); + } else{ vg_fatal_error( "Programming error\n" ); } diff --git a/world_render.c b/world_render.c index fc2d34f..55d13d4 100644 --- a/world_render.c +++ b/world_render.c @@ -418,7 +418,7 @@ void world_render_challenges( world_instance *world, struct world_pass *pass, /* sort lists */ const f32 radius = 40.0f; bh_iter it; - bh_iter_init_range( 0, &it, pos, radius ); + bh_iter_init_range( 0, &it, pos, radius+10.0f ); i32 idx; u32 challenge_list[ 32 ], @@ -452,7 +452,7 @@ void world_render_challenges( world_instance *world, struct world_pass *pass, if( challenge->flags & k_ent_challenge_hidden ) continue; f32 dist = v3_dist( challenge->transform.co, pos ) * (1.0f/radius), - scale = vg_smoothstepf( vg_clampf( 10.0f-dist*10.0f, 0.0f,1.0f ) ); + scale = vg_smoothstepf( vg_clampf( 5.0f-dist*5.0f, 0.0f,1.0f ) ); v3_fill( challenge->transform.s, scale ); @@ -479,6 +479,7 @@ void world_render_challenges( world_instance *world, struct world_pass *pass, shader_scene_font_uTexGarbage(0); shader_scene_font_uTexMain(1); shader_scene_font_uPv( skaterift.cam.mtx.pv ); + shader_scene_font_uTime( vg.time ); /* TODO: Code dupe... */ world_link_lighting_ub( world, _shader_scene_font.id ); @@ -498,11 +499,44 @@ void world_render_challenges( world_instance *world, struct world_pass *pass, mesh_bind( &gui.font.mesh ); + char buf[32]; + u32 count = 0; + + for( u32 i=0; ient_unlock); i++ ){ + ent_unlock *unlock = mdl_arritm( &world->ent_unlock, i ); + vg_line_point( unlock->transform.co, 0.2f, VG__GREEN ); + if( unlock->status ) count ++; + } + + int c=0; + c+=highscore_intl( buf+c, count, 3 ); + buf[c++] = '/'; + c+=highscore_intl( buf+c, mdl_arrcount(&world->ent_unlock), 3 ); + buf[c++] = '\0'; + + f32 w = font3d_string_width( &gui.font, 1, buf ); + m4x3f mlocal; + m3x3_identity( mlocal ); + mlocal[3][0] = -w*0.5f; + for( u32 i=0; ient_unlock, index ); m4x3f mmdl; mdl_transform_m4x3( &unlock->transform, mmdl ); + m4x3_mul( mmdl, mlocal, mmdl ); + + vg_line_point( unlock->transform.co, 0.25f, VG__RED ); + + f32 dist = v3_dist( unlock->transform.co, pos ) * (1.0f/radius), + scale = vg_smoothstepf( vg_clampf( 10.0f-dist*10.0f, 0.0f,1.0f ) ), + colour = 0.0f; + + if( unlock->status ) + colour = 1.0f; + + shader_scene_font_uOpacity( scale ); + shader_scene_font_uColourize( colour ); struct font3d_render render = { .font = &gui.font, @@ -510,7 +544,7 @@ void world_render_challenges( world_instance *world, struct world_pass *pass, .shader = k_font_shader_world }; - font3d_begin( "Test!", &skaterift.cam, mmdl, &render ); + font3d_begin( buf, &skaterift.cam, mmdl, &render ); font3d_draw( &render ); } } -- 2.25.1