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{
shader_point_map_register();
}
+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_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 );
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 );