adjust walkout anim length & masked anim blending
[carveJwlIkooP6JGAAIwe30JlM.git] / pointcloud.h
index f29197f6e491bb13e8f1c4caac8446733be3aa1b..89621a4613d800364049de09f3f55f1eaa343174 100644 (file)
@@ -1,4 +1,5 @@
-#ifndef POINTCLOUD_H
+#if 0
+//#ifndef POINTCLOUD_H
 #define POINTCLOUD_H
 
 #include "common.h"
@@ -14,9 +15,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 +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 );
 
@@ -73,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 );
@@ -96,29 +97,37 @@ 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( 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,21 @@ 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;
+}
+
+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 */