///////////////////////////////
#include <acknex.h>
#include <default.c>
#define PRAGMA_PATH "tust"
///////////////////////////////
#include "tust.h"
//max units
#define population 21000/12
//step in units of unit_space
var unit_space=16;
typedef struct cluster_unit
{
VECTOR pos;
LPD3DXMESH mesh;
int uid;
}cluster_unit;
//build the model from the cluster models
void build_cluster_units(List* cluster,DynamicModel *model)
{
if(model!=NULL && cluster!=NULL)
{
memset(model,0,sizeof(DynamicModel));
ListItem *it = cluster->first;
for(it = cluster->first; it != NULL; it = it->next)
{
cluster_unit* mycluster=(cluster_unit*)it.data;
dmdl_add_mesh(model,mycluster.mesh,mycluster.pos);
}
list_end_iterate(it);
}
}
//add a unit to the cluster
//the cluster model must be re-build with build_cluster_units
void add_cluster_unit(List *cluster,ENTITY *ent,int uid)
{
cluster_unit *mycluster=malloc(sizeof(cluster_unit));
vec_set(mycluster.pos,ent.x);
mycluster.mesh=ent_getmesh(ent,0,0);
mycluster.uid=uid;
list_add(cluster,(cluster_unit*)mycluster);
sys_free(mycluster);
}
//remove a unit from the cluster
//the cluster model has to be re-build with build_cluster_units after
void remove_cluster_unit(List *cluster,int uid)
{
ListItem *it = cluster->first;
for(it = cluster->first; it != NULL; it = it->next)
{
cluster_unit* mycluster=(cluster_unit*)it.data;
if(mycluster.uid==uid)list_remove(cluster,it.data);
}
list_end_iterate(it);
}
function main()
{
max_entities =50000;
max_particles=50000;
vec_set(screen_size,vector(800,600,0));
vec_set(screen_color,vector(1,1,1)); // dark blue
vec_set(sky_color,vector(1,1,1)); // dark blue
video_window(NULL,NULL,0,"random generator");
level_load("");
random_seed(500);
while(total_frames<1)wait(1);
camera.x=-100;
//camera.z=1000;
//camera.tilt-=90;
def_debug();def_debug();def_move();
////////////////////////////////////////////////
//populate the cluster list with entity data
//position of placement
VECTOR pos;
vec_set(pos,nullvector);
int i;
DynamicModel *model =dmdl_create();
List *cluster=list_create();
for(i=0;i<population;i+=1)
{
ENTITY* cube=ent_create(CUBE_MDL,pos,NULL);
//store cluster_unit in the list
add_cluster_unit(cluster,cube,i);
//remove entity
ptr_remove(cube);
if(pos.x<unit_space * 50)pos.x+=unit_space;
else
{
pos.y+=unit_space;
pos.x=0;
}
}
////////////////////////////////////////////////
//merge and re-build cluster units into single model
build_cluster_units(cluster,model);
//create merged entity
ENTITY *cluster_ent=dmdl_create_instance(model,nullvector,NULL);
////////////////////////////////////////////////
//remove some units from cluster
for(i=0;i<100;i++) remove_cluster_unit(cluster,integer(random(population)) );
////////////////////////////////////////////////
//merge and re-build cluster units into single model
build_cluster_units(cluster,model);
//create merged entity
ENTITY *cluster_ent1=dmdl_create_instance(model,vector(0,-600,0),NULL);
////////////////////////////////////////////////
//remove dynamic model
sys_free(model);
//remove list
sys_free(cluster);
}