2 #include "ent_portal.h"
4 #include "pointcloud.h"
6 static void ent_portal_pointcloud_load_thread(void *_
){
9 vg_strnull( &path
, path_buf
, 4096 );
10 addon_get_content_folder( global_portal
.display_world
, &path
);
11 vg_strcat( &path
, "/preview.bin" );
13 vg_linear_clear(vg_mem
.scratch
);
16 void *data
= vg_file_read( vg_mem
.scratch
, path_buf
, &size
);
18 if( size
< sizeof(pointcloud_buffer
) ){
19 vg_async_call( pointcloud_clear_async
, NULL
, 0 );
23 vg_async_item
*call
= vg_async_alloc(size
);
24 pointcloud_buffer
*pcbuf
= call
->payload
;
25 memcpy( pcbuf
, data
, size
);
27 u32 point_count
= (size
-sizeof(pointcloud_buffer
)) /
28 sizeof(struct pointcloud_vert
);
29 pcbuf
->max
= point_count
;
30 pcbuf
->count
= point_count
;
31 pcbuf
->op
= k_pointcloud_op_clear
;
33 vg_async_dispatch( call
, async_pointcloud_sub
);
34 vg_async_call( pointcloud_async_end
, NULL
, 0 );
37 vg_async_call( pointcloud_clear_async
, NULL
, 0 );
42 * Set new world to be loaded into portal
44 static void ent_portal_set_world( addon_reg
*reg
){
45 global_portal
.display_world
= reg
;
46 global_portal
.dirty
= 1;
51 static void ent_portal_preupdate(void){
52 if( global_portal
.dirty
&& vg_loader_availible() ){
53 global_portal
.dirty
= 0;
54 vg_loader_start( ent_portal_pointcloud_load_thread
, NULL
);
58 static void ent_portal_render(void){
59 if( !global_portal
.active
)
64 mdl_transform_m4x3( &mark_display
->transform
, mmdl
);
65 m4x3_rotate_y( mmdl
, vg
.time
* 0.2 );
67 m3x3_identity( mmdl
);
68 m3x3_diagonal( mmdl
, 20.0f
);
69 v3_copy( global_portal
.display_co
, mmdl
[3] );
73 glBlendFunc(GL_ONE
, GL_ONE
);
74 glDisable(GL_DEPTH_TEST
);
75 pointcloud_render( &skaterift
.cam
, mmdl
);
77 glEnable(GL_DEPTH_TEST
);