+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;
+