+ vg_release_thread_sync();
+ }
+ else
+ {
+ vg_warn( "Water entity has no submeshes!\n" );
+ }
+}
+
+VG_STATIC void world_pct_audio( mdl_node *pnode )
+{
+ struct world_audio_thing *thing = &world.audio_things[
+ world.audio_things_count ];
+
+ memset( thing, 0, sizeof(struct world_audio_thing) );
+ struct classtype_audio *aud = mdl_get_entdata( world.meta, pnode );
+
+ v3_copy( pnode->co, thing->pos );
+
+ if( aud->flags & AUDIO_FLAG_SPACIAL_3D )
+ thing->volume = aud->volume * pnode->s[0];
+ else
+ thing->volume = aud->volume;
+
+ thing->flags = aud->flags;
+ thing->temp_embedded_clip.path = mdl_pstr( world.meta, aud->pstr_file );
+ thing->temp_embedded_clip.source_mode = k_audio_source_mono;
+
+ audio_clip_load( &thing->temp_embedded_clip, world.audio_vgl );
+ thing->player.name = mdl_pstr( world.meta, pnode->pstr_name );
+ thing->player.enqued = 0;
+
+ pnode->sub_uid = world.audio_things_count;
+ world.audio_things_count ++;
+}
+
+
+VG_STATIC void world_pct_trigger( mdl_node *pnode )
+{
+ struct trigger_zone *trigger = &world.triggers[ world.trigger_count ];
+ struct classtype_trigger *inf = mdl_get_entdata( world.meta, pnode );
+
+ if( inf->target )
+ {
+ mdl_node *target_node = mdl_node_from_id( world.meta, inf->target );
+
+ trigger->target.sub_id = target_node->sub_uid;
+ trigger->target.classtype = target_node->classtype;
+ }
+ else
+ {
+ vg_warn( "Trigger with no target...\n" );
+ return;
+ }
+
+ mdl_node_transform( pnode, trigger->transform );
+ m4x3_invert_full( trigger->transform, trigger->inv_transform );
+
+ world.trigger_count ++;
+}
+
+
+VG_STATIC void world_pct_relay( mdl_node *pnode )
+{
+ struct logic_relay *relay = &world.logic_relays[ world.relay_count ];
+ struct classtype_logic_relay *inf = mdl_get_entdata( world.meta, pnode );
+
+ relay->target_count = 0;
+
+ for( int i=0; i<vg_list_size(relay->targets); i++ )
+ {
+ if( inf->targets[i] )