mission is possible 2
[carveJwlIkooP6JGAAIwe30JlM.git] / pointcloud.h
index 454d9a46b8df9e318801c3a570fffda1852caec9..4775dd747fd2b18affbb708d0ac73648d2188420 100644 (file)
 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{
@@ -94,8 +104,42 @@ static void pointcloud_init(void)
    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 );
@@ -105,8 +149,8 @@ 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 );