chaos pt 1
[carveJwlIkooP6JGAAIwe30JlM.git] / ent_portal.c
diff --git a/ent_portal.c b/ent_portal.c
new file mode 100644 (file)
index 0000000..7d8c22f
--- /dev/null
@@ -0,0 +1,80 @@
+#if 0
+#include "ent_portal.h"
+#include "addon.h"
+#include "pointcloud.h"
+
+static void ent_portal_pointcloud_load_thread(void *_){
+   char path_buf[4096];
+   vg_str path;
+   vg_strnull( &path, path_buf, 4096 );
+   addon_get_content_folder( global_portal.display_world, &path );
+   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 );
+   }
+}
+
+/*
+ * Set new world to be loaded into portal 
+ */
+static void ent_portal_set_world( addon_reg *reg ){
+   global_portal.display_world = reg;
+   global_portal.dirty = 1;
+}
+
+/* VG Events */
+
+static void ent_portal_preupdate(void){
+   if( global_portal.dirty && vg_loader_availible() ){
+      global_portal.dirty = 0;
+      vg_loader_start( ent_portal_pointcloud_load_thread, NULL );
+   }
+}
+
+static void ent_portal_render(void){
+   if( !global_portal.active ) 
+      return;
+
+   m4x3f mmdl;
+#if 0
+   mdl_transform_m4x3( &mark_display->transform, mmdl );
+   m4x3_rotate_y( mmdl, vg.time * 0.2 );
+#endif
+   m3x3_identity( mmdl );
+   m3x3_diagonal( mmdl, 20.0f );
+   v3_copy( global_portal.display_co, mmdl[3] );
+   mmdl[3][1] += 2.0f;
+
+   glEnable(GL_BLEND);
+   glBlendFunc(GL_ONE, GL_ONE);
+   glDisable(GL_DEPTH_TEST);
+   pointcloud_render( &skaterift.cam, mmdl );
+   glDisable(GL_BLEND);
+   glEnable(GL_DEPTH_TEST);
+}
+
+#endif