From 488d97095bdb3678c0d1c1e844373f47e6903c94 Mon Sep 17 00:00:00 2001 From: hgn Date: Sun, 25 Jul 2021 14:10:32 +0100 Subject: [PATCH] Rendering first pass --- fishladder.c | 66 ++++++++++++++++++++++++++++++---- textures/rivertiles_flowm.tga | Bin 262188 -> 1048620 bytes vg/vg_platform.h | 2 +- 3 files changed, 60 insertions(+), 8 deletions(-) diff --git a/fishladder.c b/fishladder.c index bb26185..1f4634b 100644 --- a/fishladder.c +++ b/fishladder.c @@ -3,8 +3,8 @@ //#define VG_STEAM #include "vg/vg.h" -#define CELL_SHEET_X 256 -#define CELL_SHEET_Y 256 +#define CELL_SHEET_X 512 +#define CELL_SHEET_Y 512 SHADER_DEFINE( colour_shader, @@ -46,11 +46,13 @@ SHADER_DEFINE( tilemap_shader, "{" "vec2 world_coord = a_co+a_offset+uOrigin;" "gl_Position = uPv * vec4( world_coord.x, 0.0, world_coord.y, 1.0 );" - "aCoords = (a_co*0.98+0.01 + a_data.xy) * 0.125;" + "aCoords = (a_co*0.98+0.01 + a_data.xy) * 0.0625;" "}", // FRAGMENT "uniform sampler2D uTexTiles;" + "uniform sampler2D uTexRipples;" + "uniform float uTime;" "in vec2 aCoords;" "out vec4 FragColor;" @@ -58,10 +60,14 @@ SHADER_DEFINE( tilemap_shader, "void main()" "{" "vec4 glyph = texture( uTexTiles, aCoords );" - "FragColor = vec4( glyph.xyz, 1.0 );" + "vec4 ripple = texture( uTexRipples, vec2( glyph.x - uTime, glyph.y ));" + "float wstatus = -(fract(uTime)*2.0-1.0);" // -1 := None in, 0.0 := Hold middle, 1.0 := All out + "float dev = step( 0.0, glyph.x+wstatus ) * step( glyph.x+wstatus, 1.0 );" //+ abs(glyph.y-0.5) );" + "vec3 composite = mix( vec3(0.5,0.5,0.5), vec3(0.3,0.6,1.0) + ripple.xyz * 0.1, step( 0.75, glyph.a )*dev ) * glyph.z;" + "FragColor = vec4( composite, 1.0 );" "}" , - UNIFORMS({ "uPv", "uTexTiles", "uOrigin" }) + UNIFORMS({ "uPv", "uTexTiles", "uTexRipples", "uTime", "uOrigin" }) ) mat4 m_projection; @@ -157,6 +163,11 @@ static void map_free(void) map.io = NULL; } +static struct cell *map_tile( int pos[2] ) +{ + return map.cells + pos[1]*map.x + pos[0]; +} + static struct cell *map_tile_at( int pos[2] ) { if( pos[0] >= 0 && pos[0] < map.x && pos[1] >= 0 && pos[1] < map.y ) @@ -242,6 +253,41 @@ static void map_update_visual(void) celldata[i*4+1] = (i & ~0x7) >> 3; } + // Configurations + // DCBA | X Y + // 0001 3 0 + // 0010 + + for( int y = 0; y < map.y; y ++ ) + { + for( int x = 0; x < map.x; x ++ ) + { + struct cell *cur = map.cells + y*map.x + x; + u8 *cellbytes = celldata + (y*map.x+x)*4; + + if( cur->flags & CELL_FLAG_WALKABLE ) + { + struct cell *a, *b, *c, *d; + + a = map_tile_at_cond( (int[2]){ x,y+1 }, CELL_FLAG_WALKABLE ); + b = map_tile_at_cond( (int[2]){ x+1,y }, CELL_FLAG_WALKABLE ); + c = map_tile_at_cond( (int[2]){ x,y-1 }, CELL_FLAG_WALKABLE ); + d = map_tile_at_cond( (int[2]){ x-1,y }, CELL_FLAG_WALKABLE ); + + u32 config = (a?0x1:0x0) | (b?0x2:0x0) | (c?0x4:0x0) | (d?0x8:0x0); + + cellbytes[ 0 ] = config; + cellbytes[ 1 ] = 0; + } + else + { + // TODO: Random background tiles + cellbytes[ 0 ] = 1; + cellbytes[ 1 ] = 0; + } + } + } + glBindBuffer( GL_ARRAY_BUFFER, map.tiles_vbo ); glBufferSubData( GL_ARRAY_BUFFER, 16*sizeof(float) + 1024*2*sizeof(float), map.x*map.y*4, celldata ); } @@ -392,7 +438,7 @@ static int map_tile_availible( int co[2] ) for( int y = vg_max( co[1]-2, 0 ); y < vg_min( map.y, co[1]+3 ); y ++ ) for( int x = vg_max( co[0]-2, 0 ); x < vg_min( map.x, co[0]+3 ); x ++ ) { - struct cell *cell = map_tile_at( (int[2]){ x, y } ); + struct cell *cell = map_tile( (int[2]){ x, y } ); if( cell && (cell->flags & CELL_FLAG_WALKABLE) ) blob |= 0x1 << ((y-(co[1]-2))*5 + x-(co[0]-2)); @@ -767,7 +813,12 @@ void vg_render(void) glActiveTexture( GL_TEXTURE0 ); glBindTexture( GL_TEXTURE_2D, map.tile_texture ); + glUniform1i( SHADER_UNIFORM( tilemap_shader, "uTexRipples" ), 1 ); + glActiveTexture( GL_TEXTURE1 ); + glBindTexture( GL_TEXTURE_2D, map.flow_texture ); + glUniform2f( SHADER_UNIFORM( tilemap_shader, "uOrigin" ), map.origin[0], map.origin[2] ); + glUniform1f( SHADER_UNIFORM( tilemap_shader, "uTime" ), vg_time * 0.5f ); glDrawArraysInstanced( GL_TRIANGLES, 0, 6, map.x*map.y ); } @@ -841,7 +892,8 @@ void vg_start(void) vg_tex2d_repeat(); map.flow_texture = vg_tex2d_rgba( "textures/rivertiles_ripple.tga" ); - + vg_tex2d_nearest(); + vg_tex2d_repeat(); map_load ( diff --git a/textures/rivertiles_flowm.tga b/textures/rivertiles_flowm.tga index 624502d7f85ebb40989d70a1979fe5286124a7b1..57b986f56bcc8ed0664d5c9fa243352cc29f4207 100644 GIT binary patch delta 4910 zcmchZflFP<6~=wFuwcQ0DF)ouwr;WD77G?!u;79P3x+(q z3JMY8+_*PFgh-VrC@3gKh@cQ5fO z-ZL|ADw#KxtPZlW;#ui`@vL}p&cY`bvE%NA@{8Da|HuD-@zkFwO(AO_{#IvdvSvoH+pfC7dLxxi{dNmYxUwbFTdT3J2IcHGc)Z{)FFd~P@s}Ro^7tz+-tqGHJpRVxZ@u`Pm;c`5A2OfnG&B9EEWYg%_H7~zV#y&! zXl^DWV?X;v?0aEwEy-SYGGAXkg8T#I94FHWDfx%UxspG}#CCR=$l~>tx%5R_0v?bxyXeXyrd3*E`vEq?NxwZg8?~Oe_BdxzWkCKdt;Fauc$B zjcQY_9zOrykei)syEXF~{|;+$%yzCV`3kw!$+m&5{14TwH5tORKRZt14N|l+;pEYfIKtvL;yGA z3@xM&+%K$2pBB=uh4hoxCll>W!`=jvH72P~QjSb=Q!BX#9*~J9_q37$tz>|_d#cbj zHf&>{vLulenOvFVrA+RF2Zc4cFOxx;43c+W725KKEe~`nAuBR@GRbG41`ohPGSTFL zOon7KMBW3L=y)(34?t%^R%G&JQpk|WL-4RnGeSbYlV>PReDHya`q4>@%EwQ9yY4JjybqGAT;fJGMOcBMkYE^4M%De5MG+hNGg{}1w$rt z;CY#7GN+Zy%VeIsIhpA6HJrXcWl5UTtEm3yF=X-#yd^%#WU6FR&5+45cts}5ypv_U zlNFh)khd(86;*KjM*-ob$+Dzsnba_3@*KP>6HT6LC95)7CGWXRbX6Fx3ZSwikrkO5 znbb05@&ddjtjP|eJK-NR))(8=vG2jWa_n&hLp(`cv~i# zY{_I>Cfnp~$z)pvRvZa+YXeEs)lULx^GSTFfOkT_6HKng)qC3!V2LhEPiLA&p zY9&o6lbvs(g5B7i(Cm=6Ba>a3?2@;m3f-56`x59@LRMs&WYWw)4fbe{{TNHzBX3V8 z`!d-lZ%-z=TMc(B(5-~5$TZ8OCAE?_-~(Yz-pJ%YCI{rbk%{hM!#xaiCS*mXMJBBb zt>i8EP*{_MDwDR z-+{`yDP2;VOxjZ>@4?5yn!K0Eu}qH1doL6H7BKu404nQq>5|%I(vdRx06r1cp zC;GNC(G{956x84&_*__%k6OvOOwK9&D3f!UoXdpp(uAzYbS3(NhChCB>(96Ubo=+e O`?T@5x9e{GGV6b4CUq+S delta 4624 zcmYk9e|%MA9LIO>8nt%s(QUUh8_Fi7RZEl7q%R2!9s(oi-j4a?Tvt8U%ciEhtLYL;zT|FE|Bse^!Bkj7Ym(wUc!9iBs2Yenl*op^$&j*KE@j&p! z;BbehI^1KNI|OtYXqa_n6nG?fv|KqBbQNg4b>&3xwcyEC90$G;94`-;2D$~5DA6p? zOwb(b=DFaz!1EoRTCY8jD_sD*514Ag#lQ!FOHG&od=!{z!W^Inm}|n7z^8z#O;`YY z4!G8YMZgz;#Xy(1q*CB3zzy;lRe)XxRa&1>HTZ4tW-HzTeh<7&9a?@mZSGg)Uti=kXfMF#2mS5E^QvG=4;vVW>^4RNTh1&rd>>5LM%05 z27MWkX~G=(3eL>sOy51f61a+3ZLTb!dx^CsETXR?icMHbUr%f>p!)*{@1qL(Mxs(a zpK97BVlyFMwk_J@x_hgZW!#-|<#x@uz#Uq)ad%o*?xyS^_FC~i%6{U2Jm4U$i8v(D zVcHSms6@wUt;7jJUQj#b6qj&X{&hM*XNa!mKf(V&J|-S;{q`* zWn3)AOvVf`<}&7pb60cjNN@XL|!80aO5yz z2q#`H`IVs2L=^lA$*%#8C&t3Bmi&6qWMU%xI>~Pa#S?MxnUhG z{C3Ij0nI1o!ta*+0Z=Nj0DiyZ4}+Exi{TGRz8sWEWWXPj{0UGlkpq8R@@GJ+iIwoD zC4U~YmMDO)k^Ci4F;N76QS#S78;DZ)tCGJ7sw67lZ%F1h=cI&B>x$7lsF9kN%G%7Cy3+lUnTz& zbed>~{~`Impe~{l{*T}}y4TJJEci_(%*er18OR*S&$pT9-yR_~vvd;bKRB zK2qHXw-O;NzK94zgdqlTl=vDPjEF!)C@~Z^f`~*!B0|_P3O0s_Mno$y4mN>^LByz| z#8=}Dh*(6d+A)RC+NpfpCm<5k4)GOv8zKpjq{M7axsymnB&(z5!R{qe5GiWMLf9f6 zD2*2}O^GFlM~HNGq^qNr!Lo@gM3&mI0`?@4hsaYqR>7Vn@)7w;cwstGh$vJ?t%JSH zRh4j6C2GfdL^)B$jxx1lBkV19RI#H9JB zg944OnZf8mfyU;c=n?2UgdT++V=f;@pFm$I{3QAfrk_HeYWC^$+vu~Mc7Hv1cHnZ| zd#CB=;qNv3Li!^56mk9%`XlstqA#Ooo9kE5pQQV)cNP6v(|hSUPcMY0w~nXxvU;}b zspaPGjjVo)?t6Bd=(T3wO8?O8JLtRUz87;3{R^}2r+;JiCi)NR;g9g}$Ix#&{rz=! zYhae{J&Cq+v8T{~piqLR2YHgQ!8&AZnDTL)0Pa5Oqq_BkB?Lh&RL*x`Qv0d+WhyZ`_I diff --git a/vg/vg_platform.h b/vg/vg_platform.h index bc610f6..da9a6ad 100644 --- a/vg/vg_platform.h +++ b/vg/vg_platform.h @@ -24,7 +24,7 @@ typedef unsigned int uint; #define MUTEX_TYPE HANDLE #define MUTEX_INITIALIZER NULL #define MUTEX_SETUP(x) (x) = CreateMutex(NULL, FALSE, NULL) - #define MUTEX_CLEANUP(x) (CloseHandle(x)) + #define MUTEX_CLEANUP(x) (CloseHandle(x)) //TODO: Why is this defined but never used? #define MUTEX_LOCK(x) emulate_pthread_mutex_lock(&(x)) #define MUTEX_UNLOCK(x) (ReleaseMutex(x)) -- 2.25.1