+/*
+ * Copyright (C) 2021-2022 Mt.ZERO Software, Harry Godden - All Rights Reserved
+ */
+
#ifndef WORLD_GEN_H
#define WORLD_GEN_H
+/*
+ * FUTURE:
+ * If we have multiple levels, write an unloader
+ */
+
#include "world.h"
static void world_add_all_if_material( m4x3f transform, scene *pscene,
}
}
}
+ else if( pnode->classtype == k_classtype_achievement_box )
+ {
+ world.achievement_zones =
+ buffer_reserve( world.achievement_zones,
+ world.achievement_zones_count,
+ &world.achievement_zones_cap, 1,
+ sizeof(struct achievement_zone) );
+
+ struct achievement_zone *zone = &world.achievement_zones[
+ world.achievement_zones_count ++ ];
+
+
+ struct classtype_achievement_box *box = mdl_get_entdata(mworld,pnode);
+
+ mdl_node_transform( pnode, zone->transform );
+ m4x3_invert_full( zone->transform, zone->inv_transform );
+ vg_strncpy( mdl_pstr(mworld, box->pstr_name), zone->name, 31 );
+ zone->name[31] = 0x00;
+ zone->triggered = 0;
+
+ if( box->trigger )
+ zone->ptarget_delegated = mdl_node_from_id( mworld, box->trigger );
+ else
+ zone->ptarget_delegated = NULL;
+ }
+ else if( pnode->classtype == k_classtype_audio )
+ {
+ world.audio_things =
+ buffer_reserve( world.audio_things,
+ world.audio_things_count,
+ &world.audio_things_cap, 1,
+ sizeof(struct world_audio_thing) );
+
+ 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(mworld,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;
+ const char *fp = mdl_pstr( mworld, aud->pstr_file );
+ char *path2 = vg_alloc( strlen(fp)+1 );
+ strcpy( path2, fp );
+ thing->temp_embedded_clip.path = path2;
+ thing->temp_embedded_clip.source_mode = k_audio_source_compressed;
+ audio_clip_load( &thing->temp_embedded_clip );
+ thing->player.name = "[temp]";
+ thing->player.enqued = 0;
+
+ pnode->sub_uid = world.audio_things_count;
+ world.audio_things_count ++;
+ }
+ }
+
+ /* fixup links */
+ for( int i=0; i<world.achievement_zones_count; i ++ )
+ {
+ struct achievement_zone *ach = &world.achievement_zones[ i ];
+ if( ach->ptarget_delegated )
+ {
+ u32 id = ach->ptarget_delegated->sub_uid;
+ ach->ptarget = &world.audio_things[ id ];
+ }
+ else
+ ach->ptarget = NULL;
+ }
+
+ /* initialize audio if need be */
+ audio_lock();
+ for( int i=0; i<world.audio_things_count; i++ )
+ {
+ struct world_audio_thing *thingy = &world.audio_things[ i ];
+
+ audio_player_init( &thingy->player );
+ audio_player_set_flags( &thingy->player, thingy->flags );
+ audio_player_set_vol( &thingy->player, thingy->volume );
+ audio_player_set_pan( &thingy->player, 0.0f );
+
+ if( thingy->flags & AUDIO_FLAG_SPACIAL_3D )
+ audio_player_set_position( &thingy->player, thingy->pos );
+
+ if( thingy->flags & AUDIO_FLAG_AUTO_START )
+ audio_player_playclip( &thingy->player, &thingy->temp_embedded_clip );
}
+ audio_unlock();
world.instance_cache = buffer_fix( world.instance_cache,
world.instance_cache_count,