-#ifndef POINTCLOUD_H
+#if 0
+//#ifndef POINTCLOUD_H
#define POINTCLOUD_H
#include "common.h"
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;
}
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 );
}
}
-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 );
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;
}
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 */