6 #include "shaders/point_map.h"
8 #define POINTCLOUD_POINTS 250000
15 static pointcloud
= { .control
= {0.0f
,0.0f
,0.0f
,1.0f
} };
18 struct pointcloud_vert
{
19 i16 pos
[4]; /* float[ -1 -> 1 ] */
20 u8 colour
[4]; /* float[ 0 -> 1 ] */
24 typedef struct pointcloud_vert pointcloud_vert
;
25 typedef struct pointcloud_buffer pointcloud_buffer
;
27 struct pointcloud_buffer
{
32 k_pointcloud_op_clear
,
33 k_pointcloud_op_append
36 pointcloud_vert buf
[];
39 static void async_pointcloud_sub( void *payload
, u32 size
)
41 glBindVertexArray( pointcloud
.vao
);
42 glBindBuffer( GL_ARRAY_BUFFER
, pointcloud
.vbo
);
44 pointcloud_buffer
*buf
= payload
;
47 if( buf
->op
== k_pointcloud_op_append
){
48 start
= pointcloud
.count
;
49 end
= pointcloud
.count
+ buf
->count
;
56 end
= VG_MIN(POINTCLOUD_POINTS
,end
);
60 u32 size
= count
* sizeof(pointcloud_vert
),
61 offset
= start
* sizeof(pointcloud_vert
);
63 glBufferSubData( GL_ARRAY_BUFFER
, offset
, size
, buf
->buf
);
64 pointcloud
.count
= end
;
68 static void async_pointcloud_alloc( void *payload
, u32 size
)
70 glGenVertexArrays( 1, &pointcloud
.vao
);
71 glGenBuffers( 1, &pointcloud
.vbo
);
72 glBindVertexArray( pointcloud
.vao
);
74 size_t stride
= sizeof( pointcloud_vert
);
76 glBindBuffer( GL_ARRAY_BUFFER
, pointcloud
.vbo
);
77 glBufferData( GL_ARRAY_BUFFER
, stride
* POINTCLOUD_POINTS
,
78 NULL
, GL_DYNAMIC_DRAW
);
81 glVertexAttribPointer( 0, 4, GL_SHORT
, GL_TRUE
, stride
, (void*)0 );
82 glEnableVertexAttribArray( 0 );
85 glVertexAttribPointer( 1, 4, GL_UNSIGNED_BYTE
, GL_TRUE
,
86 stride
, (void *)offsetof(pointcloud_vert
, colour
) );
87 glEnableVertexAttribArray( 1 );
91 static void pointcloud_init(void)
93 vg_async_call( async_pointcloud_alloc
, NULL
, 0 );
94 shader_point_map_register();
97 static void pointcloud_render( world_instance
*world
, camera
*cam
, m4x3f model
)
100 m4x3_expand( model
, upvmprev
);
101 m4x4_mul( cam
->mtx_prev
.pv
, upvmprev
, upvmprev
);
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
);
111 glBindVertexArray( pointcloud
.vao
);
112 glEnable( GL_PROGRAM_POINT_SIZE
);
113 glDrawArrays( GL_POINTS
, 0, pointcloud
.count
);
116 #endif /* POINTCLOUD_H */