+VG_STATIC void pointcloud_async_end(void *_, u32 __)
+{
+ pointcloud_animate( k_pointcloud_anim_opening );
+ skaterift_end_op();
+}
+
+VG_STATIC void pointcloud_clear_async(void *_, u32 __)
+{
+ pointcloud.count = 0;
+ pointcloud_animate( k_pointcloud_anim_opening );
+ skaterift_end_op();
+}
+
+VG_STATIC void skateshop_preview_loader_thread( void *_data )
+{
+ struct registry_world *reg = _data;
+
+ if( reg->type == k_world_load_type_local ){
+ char path_buf[4096];
+ vg_str path;
+ vg_strnull( &path, path_buf, 4096 );
+ vg_strcat( &path, "maps/" );
+ vg_strcat( &path, reg->foldername );
+ vg_strcat( &path, "/preview.bin" );
+
+ vg_linear_clear(vg_mem.scratch);
+ u32 size;
+
+ void *data = vg_file_read( vg_mem.scratch, path_buf, &size );
+ if( data ){
+ if( size < sizeof(pointcloud_buffer) ){
+ vg_async_call( pointcloud_clear_async, NULL, 0 );
+ return;
+ }
+
+ vg_async_item *call = vg_async_alloc(size);
+ pointcloud_buffer *pcbuf = call->payload;
+ memcpy( pcbuf, data, size );
+
+ u32 point_count = (size-sizeof(pointcloud_buffer)) /
+ sizeof(struct pointcloud_vert);
+ pcbuf->max = point_count;
+ pcbuf->count = point_count;
+ pcbuf->op = k_pointcloud_op_clear;
+
+ vg_async_dispatch( call, async_pointcloud_sub );
+ vg_async_call( pointcloud_async_end, NULL, 0 );
+ }
+ else{
+ vg_async_call( pointcloud_clear_async, NULL, 0 );
+ }
+ }
+ else{
+ vg_async_call( pointcloud_clear_async, NULL, 0 );
+ }
+}
+
+VG_STATIC void skateshop_load_world_preview( struct registry_world *reg )
+{
+ skaterift_begin_op( k_async_op_world_load_preview );
+ vg_loader_start( skateshop_preview_loader_thread, reg );
+}
+