way better cloud data
[carveJwlIkooP6JGAAIwe30JlM.git] / pointcloud.h
1 #ifndef POINTCLOUD_H
2 #define POINTCLOUD_H
3
4 #include "common.h"
5 #include "world.h"
6 #include "shaders/point_map.h"
7
8 #define POINTCLOUD_POINTS 250000
9
10 struct pointcloud{
11 GLuint vao, vbo;
12 u32 count;
13 v4f control;
14 }
15 static pointcloud = { .control = {0.0f,0.0f,0.0f,1.0f} };
16
17 #pragma pack(push,1)
18 struct pointcloud_vert{
19 i16 pos[4]; /* float[ -1 -> 1 ] */
20 u8 colour[4]; /* float[ 0 -> 1 ] */
21 };
22 #pragma pack(pop)
23
24 typedef struct pointcloud_vert pointcloud_vert;
25 typedef struct pointcloud_buffer pointcloud_buffer;
26
27 struct pointcloud_buffer{
28 u32 max, count;
29 boxf boundary;
30
31 enum pointcloud_op{
32 k_pointcloud_op_clear,
33 k_pointcloud_op_append
34 }
35 op;
36 pointcloud_vert buf[];
37 };
38
39 static void async_pointcloud_sub( void *payload, u32 size )
40 {
41 glBindVertexArray( pointcloud.vao );
42 glBindBuffer( GL_ARRAY_BUFFER, pointcloud.vbo );
43
44 pointcloud_buffer *buf = payload;
45
46 u32 start,end,count;
47 if( buf->op == k_pointcloud_op_append ){
48 start = pointcloud.count;
49 end = pointcloud.count + buf->count;
50 }
51 else{
52 start = 0;
53 end = buf->count;
54 }
55
56 end = VG_MIN(POINTCLOUD_POINTS,end);
57 count = end-start;
58
59 if( count ){
60 u32 size = count * sizeof(pointcloud_vert),
61 offset = start * sizeof(pointcloud_vert);
62
63 glBufferSubData( GL_ARRAY_BUFFER, offset, size, buf->buf );
64 pointcloud.count = end;
65 }
66 }
67
68 static void async_pointcloud_alloc( void *payload, u32 size )
69 {
70 glGenVertexArrays( 1, &pointcloud.vao );
71 glGenBuffers( 1, &pointcloud.vbo );
72 glBindVertexArray( pointcloud.vao );
73
74 size_t stride = sizeof( pointcloud_vert );
75
76 glBindBuffer( GL_ARRAY_BUFFER, pointcloud.vbo );
77 glBufferData( GL_ARRAY_BUFFER, stride * POINTCLOUD_POINTS,
78 NULL, GL_DYNAMIC_DRAW );
79
80 /* 0: coordinates */
81 glVertexAttribPointer( 0, 4, GL_SHORT, GL_TRUE, stride, (void*)0 );
82 glEnableVertexAttribArray( 0 );
83
84 /* 1: colour */
85 glVertexAttribPointer( 1, 4, GL_UNSIGNED_BYTE, GL_TRUE,
86 stride, (void *)offsetof(pointcloud_vert, colour) );
87 glEnableVertexAttribArray( 1 );
88 VG_CHECK_GL_ERR();
89 }
90
91 static void pointcloud_init(void)
92 {
93 vg_async_call( async_pointcloud_alloc, NULL, 0 );
94 shader_point_map_register();
95 }
96
97 static void pointcloud_render( world_instance *world, camera *cam, m4x3f model )
98 {
99 m4x4f upvmprev;
100 m4x3_expand( model, upvmprev );
101 m4x4_mul( cam->mtx_prev.pv, upvmprev, upvmprev );
102
103 shader_point_map_use();
104 shader_point_map_uPv( cam->mtx.pv );
105 shader_point_map_uPvmPrev( upvmprev );
106 shader_point_map_uMdl( model );
107 shader_point_map_uCamera( cam->pos );
108 shader_point_map_uTime( (v2f){ vg.time, sinf(vg.time) } );
109 shader_point_map_uTransform( pointcloud.control );
110
111 glBindVertexArray( pointcloud.vao );
112 glEnable( GL_PROGRAM_POINT_SIZE );
113 glDrawArrays( GL_POINTS, 0, pointcloud.count );
114 }
115
116 #endif /* POINTCLOUD_H */