X-Git-Url: https://harrygodden.com/git/?a=blobdiff_plain;f=pointcloud.h;h=454d9a46b8df9e318801c3a570fffda1852caec9;hb=38e07d851915d4ea3d25eeb28a3ace78fb0d1c12;hp=b303973c6e6c46697ccdcc186b0c7a609e7fb456;hpb=0310bab3c018e23f5516c3e3c3653b844a8106ed;p=carveJwlIkooP6JGAAIwe30JlM.git diff --git a/pointcloud.h b/pointcloud.h index b303973..454d9a4 100644 --- a/pointcloud.h +++ b/pointcloud.h @@ -10,27 +10,59 @@ struct pointcloud{ GLuint vao, vbo; u32 count; - v4f control; } static pointcloud = { .control = {0.0f,0.0f,0.0f,1.0f} }; #pragma pack(push,1) struct pointcloud_vert{ - u16 pos[4]; /* float[ 0 -> 1 ] */ - i8 norm[4]; /* float[ -1 -> 1 ] */ + i16 pos[4]; /* float[ -1 -> 1 ] */ u8 colour[4]; /* float[ 0 -> 1 ] */ }; #pragma pack(pop) +typedef struct pointcloud_vert pointcloud_vert; +typedef struct pointcloud_buffer pointcloud_buffer; + +struct pointcloud_buffer{ + u32 max, count; + boxf boundary; + + enum pointcloud_op{ + k_pointcloud_op_clear, + k_pointcloud_op_append + } + op; + pointcloud_vert buf[]; +}; + static void async_pointcloud_sub( void *payload, u32 size ) { - glBindVertexArray( pointcloud.vao ); glBindBuffer( GL_ARRAY_BUFFER, pointcloud.vbo ); - glBufferSubData( GL_ARRAY_BUFFER, 0, - sizeof(struct pointcloud_vert)*size, payload ); - pointcloud.count = size; + + pointcloud_buffer *buf = payload; + + u32 start,end,count; + if( buf->op == k_pointcloud_op_append ){ + start = pointcloud.count; + end = pointcloud.count + buf->count; + } + else{ + start = 0; + end = buf->count; + } + + end = VG_MIN(POINTCLOUD_POINTS,end); + count = end-start; + + if( count ){ + u32 size = count * sizeof(pointcloud_vert), + offset = start * sizeof(pointcloud_vert); + + glBufferSubData( GL_ARRAY_BUFFER, offset, size, buf->buf ); + pointcloud.count = end; + } } static void async_pointcloud_alloc( void *payload, u32 size ) @@ -39,58 +71,26 @@ static void async_pointcloud_alloc( void *payload, u32 size ) glGenBuffers( 1, &pointcloud.vbo ); glBindVertexArray( pointcloud.vao ); - size_t stride = sizeof( struct pointcloud_vert ); + size_t stride = sizeof( pointcloud_vert ); glBindBuffer( GL_ARRAY_BUFFER, pointcloud.vbo ); glBufferData( GL_ARRAY_BUFFER, stride * POINTCLOUD_POINTS, - payload, GL_DYNAMIC_DRAW ); + NULL, GL_DYNAMIC_DRAW ); /* 0: coordinates */ - glVertexAttribPointer( 0, 4, GL_UNSIGNED_SHORT, GL_TRUE, stride, (void*)0 ); + glVertexAttribPointer( 0, 4, GL_SHORT, GL_TRUE, stride, (void*)0 ); glEnableVertexAttribArray( 0 ); - /* 1: normal */ - glVertexAttribPointer( 1, 4, GL_BYTE, GL_TRUE, - stride, (void *)offsetof(struct pointcloud_vert, norm) ); + /* 1: colour */ + glVertexAttribPointer( 1, 4, GL_UNSIGNED_BYTE, GL_TRUE, + stride, (void *)offsetof(pointcloud_vert, colour) ); glEnableVertexAttribArray( 1 ); - - /* 2: colour */ - glVertexAttribPointer( 2, 4, GL_UNSIGNED_BYTE, GL_TRUE, - stride, (void *)offsetof(struct pointcloud_vert, colour) ); - glEnableVertexAttribArray( 2 ); VG_CHECK_GL_ERR(); - pointcloud.count = size; } static void pointcloud_init(void) { - vg_info( "Generating random test point cloud\n" ); - - vg_rand_seed( 2000 ); - vg_async_item *call = - vg_async_alloc( sizeof(struct pointcloud_vert)*POINTCLOUD_POINTS ); - struct pointcloud_vert *test_data = call->payload; - call->size = POINTCLOUD_POINTS; - - for( u32 i=0; i