X-Git-Url: https://harrygodden.com/git/?a=blobdiff_plain;f=pointcloud.h;h=427548caa3e164b18ad74f6b5df3e3e864cb8522;hb=137d40d96fe923600d8378b8e138e3c276f27ff4;hp=f29197f6e491bb13e8f1c4caac8446733be3aa1b;hpb=63b5ac44f74599b21c4b9b18398c29b797337bea;p=carveJwlIkooP6JGAAIwe30JlM.git diff --git a/pointcloud.h b/pointcloud.h index f29197f..427548c 100644 --- a/pointcloud.h +++ b/pointcloud.h @@ -14,9 +14,11 @@ struct pointcloud{ f64 anim_start; f32 visibility; enum pointcloud_anim{ - k_pointcloud_anim_opening = 0, - k_pointcloud_anim_hiding = 1, - k_pointcloud_anim_idle = 2 + k_pointcloud_anim_opening, + k_pointcloud_anim_hiding, + k_pointcloud_anim_idle_any, + k_pointcloud_anim_idle_open, + k_pointcloud_anim_idle_closed, } anim; } @@ -44,8 +46,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 ); @@ -73,8 +74,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 ); @@ -96,29 +96,38 @@ 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 ) -{ - if( pointcloud.anim != k_pointcloud_anim_idle ){ - f32 const k_transition = 1.0f; +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( world_instance *world, 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; + 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; + pointcloud.anim = k_pointcloud_anim_idle_open; } else pointcloud.visibility = t; } @@ -143,4 +152,12 @@ static void pointcloud_render( world_instance *world, camera *cam, m4x3f model ) 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; +} + #endif /* POINTCLOUD_H */