6 #include "shaders/point_map.h"
8 #define POINTCLOUD_POINTS 250000
17 k_pointcloud_anim_opening
= 0,
18 k_pointcloud_anim_hiding
= 1,
19 k_pointcloud_anim_idle
= 2
26 struct pointcloud_vert
{
27 i16 pos
[4]; /* float[ -1 -> 1 ] */
28 u8 colour
[4]; /* float[ 0 -> 1 ] */
32 typedef struct pointcloud_vert pointcloud_vert
;
33 typedef struct pointcloud_buffer pointcloud_buffer
;
35 struct pointcloud_buffer
{
40 k_pointcloud_op_clear
,
41 k_pointcloud_op_append
44 pointcloud_vert buf
[];
47 static void async_pointcloud_sub( void *payload
, u32 size
)
49 glBindVertexArray( pointcloud
.vao
);
50 glBindBuffer( GL_ARRAY_BUFFER
, pointcloud
.vbo
);
52 pointcloud_buffer
*buf
= payload
;
55 if( buf
->op
== k_pointcloud_op_append
){
56 start
= pointcloud
.count
;
57 end
= pointcloud
.count
+ buf
->count
;
64 end
= VG_MIN(POINTCLOUD_POINTS
,end
);
68 u32 size
= count
* sizeof(pointcloud_vert
),
69 offset
= start
* sizeof(pointcloud_vert
);
71 glBufferSubData( GL_ARRAY_BUFFER
, offset
, size
, buf
->buf
);
72 pointcloud
.count
= end
;
76 static void async_pointcloud_alloc( void *payload
, u32 size
)
78 glGenVertexArrays( 1, &pointcloud
.vao
);
79 glGenBuffers( 1, &pointcloud
.vbo
);
80 glBindVertexArray( pointcloud
.vao
);
82 size_t stride
= sizeof( pointcloud_vert
);
84 glBindBuffer( GL_ARRAY_BUFFER
, pointcloud
.vbo
);
85 glBufferData( GL_ARRAY_BUFFER
, stride
* POINTCLOUD_POINTS
,
86 NULL
, GL_DYNAMIC_DRAW
);
89 glVertexAttribPointer( 0, 4, GL_SHORT
, GL_TRUE
, stride
, (void*)0 );
90 glEnableVertexAttribArray( 0 );
93 glVertexAttribPointer( 1, 4, GL_UNSIGNED_BYTE
, GL_TRUE
,
94 stride
, (void *)offsetof(pointcloud_vert
, colour
) );
95 glEnableVertexAttribArray( 1 );
99 static void pointcloud_init(void)
101 vg_async_call( async_pointcloud_alloc
, NULL
, 0 );
102 shader_point_map_register();
105 static void pointcloud_render( world_instance
*world
, camera
*cam
, m4x3f model
)
107 if( pointcloud
.anim
!= k_pointcloud_anim_idle
){
108 f32
const k_transition
= 1.0f
;
109 f32 t
= (vg
.time
- pointcloud
.anim_start
) / k_transition
;
111 if( pointcloud
.anim
== k_pointcloud_anim_hiding
){
113 pointcloud
.visibility
= 0.0f
;
114 pointcloud
.anim
= k_pointcloud_anim_idle
;
116 else pointcloud
.visibility
= 1.0f
-t
;
118 else if( pointcloud
.anim
== k_pointcloud_anim_opening
){
120 pointcloud
.visibility
= 1.0f
;
121 pointcloud
.anim
= k_pointcloud_anim_idle
;
123 else pointcloud
.visibility
= t
;
127 if( pointcloud
.visibility
== 0.0f
) return;
130 m4x3_expand( model
, upvmprev
);
131 m4x4_mul( cam
->mtx_prev
.pv
, upvmprev
, upvmprev
);
133 shader_point_map_use();
134 shader_point_map_uPv( cam
->mtx
.pv
);
135 shader_point_map_uPvmPrev( upvmprev
);
136 shader_point_map_uMdl( model
);
137 shader_point_map_uCamera( cam
->pos
);
138 shader_point_map_uAnim( (v4f
){ 32, 1.0f
-pointcloud
.visibility
,
141 glBindVertexArray( pointcloud
.vao
);
142 glEnable( GL_PROGRAM_POINT_SIZE
);
143 glDrawArrays( GL_POINTS
, 0, pointcloud
.count
);
146 #endif /* POINTCLOUD_H */