X-Git-Url: https://harrygodden.com/git/?a=blobdiff_plain;f=pointcloud.h;h=89621a4613d800364049de09f3f55f1eaa343174;hb=74b2136d5b41b18e2eec698f1fd11b503aa1100a;hp=454d9a46b8df9e318801c3a570fffda1852caec9;hpb=38e07d851915d4ea3d25eeb28a3ace78fb0d1c12;p=carveJwlIkooP6JGAAIwe30JlM.git diff --git a/pointcloud.h b/pointcloud.h index 454d9a4..89621a4 100644 --- a/pointcloud.h +++ b/pointcloud.h @@ -1,4 +1,5 @@ -#ifndef POINTCLOUD_H +#if 0 +//#ifndef POINTCLOUD_H #define POINTCLOUD_H #include "common.h" @@ -10,9 +11,19 @@ struct pointcloud{ GLuint vao, vbo; u32 count; - v4f control; + + f64 anim_start; + f32 visibility; + enum pointcloud_anim{ + k_pointcloud_anim_opening, + k_pointcloud_anim_hiding, + k_pointcloud_anim_idle_any, + k_pointcloud_anim_idle_open, + k_pointcloud_anim_idle_closed, + } + anim; } -static pointcloud = { .control = {0.0f,0.0f,0.0f,1.0f} }; +static pointcloud; #pragma pack(push,1) struct pointcloud_vert{ @@ -36,8 +47,7 @@ struct pointcloud_buffer{ pointcloud_vert buf[]; }; -static void async_pointcloud_sub( void *payload, u32 size ) -{ +static void async_pointcloud_sub( void *payload, u32 size ){ glBindVertexArray( pointcloud.vao ); glBindBuffer( GL_ARRAY_BUFFER, pointcloud.vbo ); @@ -65,8 +75,7 @@ static void async_pointcloud_sub( void *payload, u32 size ) } } -static void async_pointcloud_alloc( void *payload, u32 size ) -{ +static void async_pointcloud_alloc( void *payload, u32 size ){ glGenVertexArrays( 1, &pointcloud.vao ); glGenBuffers( 1, &pointcloud.vbo ); glBindVertexArray( pointcloud.vao ); @@ -88,14 +97,44 @@ static void async_pointcloud_alloc( void *payload, u32 size ) VG_CHECK_GL_ERR(); } -static void pointcloud_init(void) -{ +static void pointcloud_init(void){ vg_async_call( async_pointcloud_alloc, NULL, 0 ); shader_point_map_register(); } -static void pointcloud_render( world_instance *world, camera *cam, m4x3f model ) -{ +static void pointcloud_animate( enum pointcloud_anim anim ){ + pointcloud.anim = anim; + pointcloud.anim_start = vg.time; +} + +static int pointcloud_idle(void){ + if( pointcloud.anim >= k_pointcloud_anim_idle_any ) return 1; + else return 0; +} + +static void pointcloud_render( camera *cam, m4x3f model ){ + if( pointcloud.anim < k_pointcloud_anim_idle_any ){ + f32 const k_transition = 0.6f; + f32 t = (vg.time - pointcloud.anim_start) / k_transition; + + if( pointcloud.anim == k_pointcloud_anim_hiding ){ + if( t > 1.0f ){ + pointcloud.visibility = 0.0f; + pointcloud.anim = k_pointcloud_anim_idle_closed; + } + else pointcloud.visibility = 1.0f-t; + } + else if( pointcloud.anim == k_pointcloud_anim_opening ){ + if( t > 1.0f ){ + pointcloud.visibility = 1.0f; + pointcloud.anim = k_pointcloud_anim_idle_open; + } + else pointcloud.visibility = t; + } + } + + if( pointcloud.visibility == 0.0f ) return; + m4x4f upvmprev; m4x3_expand( model, upvmprev ); m4x4_mul( cam->mtx_prev.pv, upvmprev, upvmprev ); @@ -105,12 +144,29 @@ static void pointcloud_render( world_instance *world, camera *cam, m4x3f model ) shader_point_map_uPvmPrev( upvmprev ); shader_point_map_uMdl( model ); shader_point_map_uCamera( cam->pos ); - shader_point_map_uTime( (v2f){ vg.time, sinf(vg.time) } ); - shader_point_map_uTransform( pointcloud.control ); + shader_point_map_uAnim( (v4f){ 32, 1.0f-pointcloud.visibility, + 0.0f, vg.time } ); glBindVertexArray( pointcloud.vao ); glEnable( GL_PROGRAM_POINT_SIZE ); glDrawArrays( GL_POINTS, 0, pointcloud.count ); } +static void pointcloud_packvert( pointcloud_vert *vert, v3f pos, v4f colour ){ + for( u32 i=0; i<3; i++ ) + vert->pos[i] = (pos[i]-0.5f) * 32767.0f; + + for( u32 i=0; i<4; i++ ) + vert->colour[i] = colour[i] * 255.0f; +} + +static void pointcloud_async_end(void *_, u32 __){ + pointcloud_animate( k_pointcloud_anim_opening ); +} + +static void pointcloud_clear_async(void *_, u32 __){ + pointcloud.count = 0; + pointcloud_animate( k_pointcloud_anim_opening ); +} + #endif /* POINTCLOUD_H */