ManiaDrive/mania2.c
2025-01-26 18:33:45 +01:00

1059 lines
24 KiB
C
Raw Permalink Blame History

// ManiaDrive Track Editor - CQFD Corp
// http://maniadrive.raydium.org/
char *version="0.40";
char *title="CQFD Corp. Mania2";
// since we play with our own camera and not Raydium's one:
#define RENDER_DEBUG_NO_CLIP
#define NO_ODE_SUPPORT
#include "raydium/index.c"
#include "mania.h"
#define POP_MODE_ELEM 1
#define POP_MODE_BOX 2
#ifdef WIN32
#define MANIA_BINARY "mania_drive.exe"
#else
#define MANIA_BINARY "./mania_drive.static"
#endif
int grid_load(char *filename);
void grid_save(char *filename);
void build_gui_access(raydium_gui_Object *w);
void build_gui_menu(raydium_gui_Object *w);
void grid_generate_obj(void);
void extract_data(char *from, char *to_name, char *to_author, char *to_gold, char *to_author_time, char *message_file);
void grid_init_all(void);
void box_init_all(void);
void grid_generate_obj(void);
void data_init(void);
GLfloat modl_zoom=10;
GLint px=0,py=0;
GLfloat pz=0;
GLint curobj=0;
GLint curbox=0;
GLint curangle=0;
int pop_mode=POP_MODE_ELEM;
signed char view_glue=0;
int n_boxpresets=0;
Box boxpreset[MAX_ELEMS];
char current_track[RAYDIUM_MAX_NAME_LEN];
//////////////////////////////////////////////////////////// gui
void btnExitOk(raydium_gui_Object *w)
{
raydium_parser_db_set("Mania2-CurrentTrack",current_track);
exit(0);
}
void btnExitCancel(raydium_gui_Object *w)
{
raydium_gui_window_delete_name("exit");
}
void btnClearOk(raydium_gui_Object *w)
{
grid_init_all();
box_init_all();
data_init();
grid_generate_obj();
current_track[0]=0;
px=0;
py=0;
pz=0;
raydium_gui_window_delete_name("clear");
}
void btnClearCancel(raydium_gui_Object *w)
{
raydium_gui_window_delete_name("clear");
}
void gui_exit(void)
{
int handle;
if(raydium_gui_window_find("exit")>=0)
{
btnExitCancel(NULL);
return;
}
handle=raydium_gui_window_create("exit",25,45,60,15);
raydium_gui_widget_sizes(0,0,18);
raydium_gui_label_create("lblExit",handle,50,80,"Do you really want to exit ?",0,0,0);
raydium_gui_widget_sizes(15,5,18);
raydium_gui_button_create("btnExitOk",handle,20,15,"OK",btnExitOk);
raydium_gui_button_create("btnExitCancel",handle,50,15,"Cancel",btnExitCancel);
raydium_gui_widget_focus_name("btnExitOk","exit");
}
void btnLoad(raydium_gui_Object *w)
{
char str[RAYDIUM_MAX_NAME_LEN];
raydium_gui_read_name("menu","edtFilename",str);
if(grid_load(str))
build_gui_access(NULL);
}
void btnSave(raydium_gui_Object *w)
{
char str[RAYDIUM_MAX_NAME_LEN];
raydium_gui_read_name("menu","edtFilename",str);
grid_save(str);
build_gui_access(NULL);
}
void btnExit(raydium_gui_Object *w)
{
gui_exit();
}
void btnMetaOk(raydium_gui_Object *w)
{
char d[5][512];
raydium_gui_read_name("menu","edtName",d[0]);
raydium_gui_read_name("menu","edtAuthor",d[1]);
raydium_gui_read_name("menu","edtGold",d[2]);
raydium_gui_read_name("menu","edtAuthorTime",d[3]);
raydium_gui_read_name("menu","edtMsg",d[4]);
sprintf(tdata,"%s;%s;%s;%s;%s",d[0],d[1],d[2],d[3],d[4]);
build_gui_menu(NULL);
}
void btnTest(raydium_gui_Object *w)
{
char str[RAYDIUM_MAX_NAME_LEN*2];
char mni[RAYDIUM_MAX_NAME_LEN];
char *mni_simple="dyn_track.mni";
int ret;
// must protect mni from shell
raydium_file_home_path_cpy(mni_simple,mni);
strcpy(str,current_track);
grid_save(mni);
strcpy(current_track,str);
sprintf(str,"%s --mni \"%s\"",MANIA_BINARY,mni);
ret=system(str);
if(ret!=0)
{
raydium_log("CANNOT TEST MNI TRACK FROM '%s'",mni);
}
build_gui_access(NULL);
}
void build_gui_clear(raydium_gui_Object *w)
{
int handle;
handle=raydium_gui_window_create("clear",25,45,60,15);
raydium_gui_widget_sizes(0,0,18);
raydium_gui_label_create("lblClear",handle,50,80,"Do you really want to clear track ?",0,0,0);
raydium_gui_widget_sizes(15,5,18);
raydium_gui_button_create("btnClearOk",handle,20,15,"OK",btnClearOk);
raydium_gui_button_create("btnClearCancel",handle,50,15,"Cancel",btnClearCancel);
raydium_gui_widget_focus_name("btnClearOk","clear");
}
#undef YDEC
#define YDEC 5.f
void build_gui_help(raydium_gui_Object *w)
{
int handle;
float y;
raydium_gui_window_delete_name("menu");
handle=raydium_gui_window_create("menu",10,25,80,50);
raydium_gui_widget_sizes(0,0,18);
raydium_gui_label_create("lblTitle",handle,50,93,"Key help for Mania2 Track Editor",0.3,0,0);
y=90;
raydium_gui_widget_sizes(0,0,14);
raydium_gui_label_create("lblh0",handle,50,y-=YDEC,"mouse left click : move view",0,0,0);
raydium_gui_label_create("lblh1",handle,50,y-=YDEC,"mouse right click : move view (glue)",0,0,0);
raydium_gui_label_create("lblh2",handle,50,y-=YDEC,"+/- : change zoom",0,0,0);
raydium_gui_label_create("lblh3",handle,50,y-=YDEC,"arrows : move block",0,0,0);
raydium_gui_label_create("lblh4",handle,50,y-=YDEC,"pageUp/pageDown : change block",0,0,0);
raydium_gui_label_create("lbli4",handle,50,y-=YDEC,"home/end : move block up and down (move view to see)",0,0,0);
raydium_gui_label_create("lblh5",handle,50,y-=YDEC,"d : delete block",0,0,0);
raydium_gui_label_create("lblh6",handle,50,y-=YDEC,"tab : rotate block (90<39>)",0,0,0);
raydium_gui_label_create("lblh7",handle,50,y-=YDEC,"space : add block",0,0,0);
raydium_gui_label_create("lblh8",handle,50,y-=YDEC,"enter : switch between blocks and entities",0,0,0);
raydium_gui_label_create("lbli8",handle,50,y-=YDEC,"m : open menu",0,0,0);
raydium_gui_label_create("lblj8",handle,50,y-=YDEC,"shift + T : test track",0,0,0);
raydium_gui_label_create("lblh9",handle,50,y-=YDEC,"esc : quits",0,0,0);
y-=YDEC;
raydium_gui_label_create("lblh10",handle,50,y-=YDEC," entities: ^agreen^0=start, ^cred^0=end, ^9blue^0=checkpoint, ^6yellow^0=turbo",0,0,0);
raydium_gui_widget_sizes(10,3,14);
raydium_gui_button_create("btnOk",handle,45,3,"OK",build_gui_menu);
raydium_gui_widget_focus_name("btnOk","menu");
}
void build_gui_meta(raydium_gui_Object *w)
{
int handle;
char d[5][512];
extract_data(tdata,d[0],d[1],d[2],d[3],d[4]);
raydium_gui_window_delete_name("menu");
handle=raydium_gui_window_create("menu",10,35,80,30);
raydium_gui_widget_sizes(0,0,18);
raydium_gui_label_create("lblTitle",handle,50,93,"Editing track meta informations",0.3,0,0);
raydium_gui_widget_sizes(0,0,14);
raydium_gui_label_create("lblName",handle,15,80,"Track name",0,0,0);
raydium_gui_widget_sizes(50,3,14);
raydium_gui_edit_create("edtName",handle,30,74,d[0]);
raydium_gui_widget_sizes(0,0,14);
raydium_gui_label_create("lblAuthor",handle,15,65,"Track author",0,0,0);
raydium_gui_widget_sizes(30,3,14);
raydium_gui_edit_create("edtAuthor",handle,30,59,d[1]);
raydium_gui_widget_sizes(0,0,14);
raydium_gui_label_create("lblGold",handle,15,50,"Gold time (secs)",0,0,0);
raydium_gui_widget_sizes(20,3,14);
raydium_gui_edit_create("edtGold",handle,30,44,d[2]);
raydium_gui_widget_sizes(0,0,14);
raydium_gui_label_create("lblAuthorTime",handle,15,35,"Author time (secs)",0,0,0);
raydium_gui_widget_sizes(20,3,14);
raydium_gui_edit_create("edtAuthorTime",handle,30,29,d[3]);
raydium_gui_widget_sizes(0,0,14);
raydium_gui_label_create("lblMsg",handle,15,20,"Message file (opt)",0,0,0);
raydium_gui_widget_sizes(20,3,14);
raydium_gui_edit_create("edtMsg",handle,30,14,d[4]);
raydium_gui_widget_sizes(10,3,14);
raydium_gui_button_create("btnLoad",handle,70,14,"OK",btnMetaOk);
raydium_gui_button_create("btnCancel",handle,85,14,"cancel",build_gui_menu);
}
void build_gui_load(raydium_gui_Object *w)
{
int handle;
raydium_gui_window_delete_name("menu");
handle=raydium_gui_window_create("menu",25,50,50,15);
raydium_gui_widget_sizes(0,0,14);
raydium_gui_label_create("lblAction",handle,25,80,"Load MNI : ",0,0,0);
raydium_gui_widget_sizes(25,3,14);
raydium_gui_edit_create("edtFilename",handle,40,70,current_track);
raydium_gui_widget_sizes(10,3,14);
raydium_gui_button_create("btnLoad",handle,20,20,"load",btnLoad);
raydium_gui_button_create("btnCancel",handle,60,20,"cancel",build_gui_menu);
raydium_gui_widget_focus_name("edtFilename","menu");
}
void build_gui_save(raydium_gui_Object *w)
{
int handle;
raydium_gui_window_delete_name("menu");
handle=raydium_gui_window_create("menu",25,50,50,15);
raydium_gui_widget_sizes(0,0,14);
raydium_gui_label_create("lblAction",handle,25,80,"Save MNI : ",0,0,0);
raydium_gui_widget_sizes(25,3,14);
raydium_gui_edit_create("edtFilename",handle,40,70,current_track);
raydium_gui_widget_sizes(10,3,14);
raydium_gui_button_create("btnSave",handle,20,20,"save",btnSave);
raydium_gui_button_create("btnCancel",handle,60,20,"cancel",build_gui_menu);
raydium_gui_widget_focus_name("edtFilename","menu");
}
#undef YDEC
#define YDEC 10.f
void build_gui_menu(raydium_gui_Object *w)
{
int handle;
float y;
raydium_gui_window_delete_name("menu");
handle=raydium_gui_window_create("menu",75,50,25,50);
y=95;
raydium_gui_widget_sizes(20,3.33,14);
raydium_gui_button_create("btnLoad",handle,10,y-=YDEC,"load",build_gui_load);
raydium_gui_button_create("btnSave",handle,10,y-=YDEC,"save",build_gui_save);
raydium_gui_button_create("btnClear",handle,10,y-=YDEC,"clear all",build_gui_clear);
raydium_gui_button_create("btnEdit",handle,10,y-=YDEC,"edit infos",build_gui_meta);
raydium_gui_button_create("btnTest",handle,10,y-=YDEC,"test track",btnTest);
raydium_gui_button_create("btnHelp",handle,10,y-=YDEC,"key help",build_gui_help);
raydium_gui_button_create("btnClose",handle,10,y-=YDEC,"close menu",build_gui_access);
raydium_gui_button_create("btnExit",handle,10,y-=(YDEC*2),"exit",btnExit);
}
void build_gui_access(raydium_gui_Object *w)
{
int handle;
raydium_gui_window_delete_name("menu");
handle=raydium_gui_window_create("menu",85,95,15,5);
raydium_gui_widget_sizes(10,3.33,14);
raydium_gui_button_create("btnMenu",handle,18,15,"menu",build_gui_menu);
}
/////////////////////////////////////////////////////////// end gui
void grid_init_elem(int e)
{
grid[e].state=0;
grid[e].flags=0;
}
void box_init_elem(int e)
{
box[e].state=0;
box[e].type=0;
}
void grid_init_all(void)
{
int i;
for(i=0;i<MAX_ELEMS;i++)
grid_init_elem(i);
raydium_log("Grid ok");
}
void box_init_all(void)
{
int i;
for(i=0;i<MAX_ELEMS;i++)
box_init_elem(i);
raydium_log("Boxes ok");
}
void grid_save(char *filename)
{
FILE *fp;
int i;
fp=raydium_file_fopen(filename,"wt");
if(!fp)
{
raydium_log("cannot open '%s' for writing",filename);
return;
}
fprintf(fp,"d %s\n",tdata);
for(i=0;i<MAX_ELEMS;i++)
if(grid[i].state)
fprintf(fp,"g %f %f %f %i %i %s\n",grid[i].x,
grid[i].y,
grid[i].z,
grid[i].rot,
grid[i].flags,
raydium_object_name[grid[i].obj]);
for(i=0;i<MAX_ELEMS;i++)
if(box[i].state)
fprintf(fp,"b %f %f %f %f %f %f %i\n",box[i].x,
box[i].y,
box[i].z,
box[i].tx,
box[i].ty,
box[i].tz,
box[i].type);
fclose(fp);
strcpy(current_track,filename);
}
int grid_load(char *filename)
{
FILE *fp;
int i,j;
int c;
char name[RAYDIUM_MAX_NAME_LEN];
fp=raydium_file_fopen(filename,"rt");
if(!fp)
{
raydium_log("cannot open '%s' for reading",filename);
return 0;
}
grid_init_all();
box_init_all();
data_init();
i=j=0;
while(1)
{
c=fgetc(fp);
fgetc(fp);
if(c==EOF) break;
if(c=='g')
{
fscanf(fp,"%f %f %f %i %i %s\n",&grid[i].x,
&grid[i].y,
&grid[i].z,
&grid[i].rot,
&grid[i].flags,
name);
grid[i].state=1;
grid[i].obj=raydium_object_find_load(name);
i++;
}
if(c=='b')
{
fscanf(fp,"%f %f %f %f %f %f %i\n",&box[j].x,
&box[j].y,
&box[j].z,
&box[j].tx,
&box[j].ty,
&box[j].tz,
&box[j].type);
box[j].state=1;
j++;
}
if(c=='d')
{
fgets(tdata,4000,fp);
if(tdata[strlen(tdata)-1]=='\n')
tdata[strlen(tdata)-1]=0;
}
if(i==MAX_ELEMS || j==MAX_ELEMS)
{
raydium_log("MAX_ELEMS reached, loading not completed");
break;
}
}
raydium_log("%s: %i grid elements loaded, %i box(es)",filename,i,j);
fclose(fp);
grid_generate_obj();
strcpy(current_track,filename);
px=0;
py=0;
pz=0;
return 1;
}
float xcos(int i)
{
return( (float)cos(i*PI/180) );
}
float xsin(int i)
{
return( (float)sin(i*PI/180) );
}
void rotatez(GLfloat angle, GLint obj)
{
int i;
GLfloat x,y;
for(i=raydium_object_start[obj];i<raydium_object_end[obj];i++)
{
x=raydium_vertex_x[i]-0.5;
y=raydium_vertex_y[i]-0.5;
raydium_vertex_x[i]=x*raydium_trigo_cos(angle) - y*raydium_trigo_sin(angle);
raydium_vertex_y[i]=x*raydium_trigo_sin(angle) + y*raydium_trigo_cos(angle);
raydium_vertex_x[i]+=0.5;
raydium_vertex_y[i]+=0.5;
}
}
int raydium_object_new_empty(char *name)
{
raydium_object_start[raydium_object_index]=raydium_vertex_index;
raydium_object_end[raydium_object_index]=raydium_vertex_index;
strcpy(raydium_object_name[raydium_object_index],name);
return(raydium_object_index++);
}
void grid_generate_obj(void)
{
int obj;
int i,j;
obj=raydium_object_find("mania.tri");
raydium_vertex_index=raydium_object_start[obj];
for(i=0;i<MAX_ELEMS;i++)
if(grid[i].state)
{
rotatez(grid[i].rot,grid[i].obj);
for(j=raydium_object_start[grid[i].obj];j<raydium_object_end[grid[i].obj];j++)
{
raydium_vertex_x[raydium_vertex_index]=raydium_vertex_x[j]+grid[i].x;
raydium_vertex_y[raydium_vertex_index]=raydium_vertex_y[j]+grid[i].y;
raydium_vertex_z[raydium_vertex_index]=raydium_vertex_z[j]+grid[i].z;
raydium_vertex_texture_u[raydium_vertex_index]=raydium_vertex_texture_u[j];
raydium_vertex_texture_v[raydium_vertex_index]=raydium_vertex_texture_v[j];
raydium_vertex_texture[raydium_vertex_index]=raydium_vertex_texture[j];
raydium_vertex_texture_multi[raydium_vertex_index]=raydium_vertex_texture_multi[j];
raydium_vertex_texture_multi_u[raydium_vertex_index]=raydium_vertex_texture_multi_u[j];
raydium_vertex_texture_multi_v[raydium_vertex_index]=raydium_vertex_texture_multi_v[j];
raydium_vertex_index++;
}
rotatez(-grid[i].rot,grid[i].obj);
}
raydium_object_end[obj]=raydium_vertex_index;
}
void data_init(void)
{
sprintf(tdata,"no name;unknown;0;0");
}
void draw_axes(void)
{
GLfloat size=modl_zoom/3;
GLfloat font=modl_zoom/30;
glBegin(GL_LINES);
glVertex3f(0,0,0);
glVertex3f(size,0,0);
glVertex3f(size+font,-font,0);
glVertex3f(size+font+font,font,0);
glVertex3f(size+font,font,0);
glVertex3f(size+font+font,-font,0);
glVertex3f(0,0,0);
glVertex3f(0,size,0);
glVertex3f(0,size+font+(font/2),0);
glVertex3f(0,size+font,0);
glVertex3f(0,size+font+(font/2),0);
glVertex3f(-font/2,size+font+font+(font/2),0);
glVertex3f(0,size+font+(font/2),0);
glVertex3f(font/2,size+font+font+(font/2),0);
glVertex3f(0,0,0);
glVertex3f(0,0,size);
glVertex3f(0,font,size+font-(font/2));
glVertex3f(0,font,size+font+(font/2));
glVertex3f(0,-font,size+font-(font/2));
glVertex3f(0,-font,size+font+(font/2));
glVertex3f(0,font,size+font-(font/2));
glVertex3f(0,-font,size+font+(font/2));
glEnd();
}
void draw_grid(void)
{
GLfloat x;
GLfloat y;
GLfloat z;
glBegin(GL_POINTS);
for(x=-modl_zoom;x<=modl_zoom;x++)
for(y=-modl_zoom;y<=modl_zoom;y++)
for(z=-modl_zoom;z<=modl_zoom;z++)
{
glColor3f(0.5,0.5,0.5);
glVertex3f(x+px,y+py,z);
}
glColor3f(0.7,0.7,0.7);
glEnd();
}
void draw_box(float x,float y,float z,float ox, float oy, float oz, float tx,float ty,float tz,int type)
{
float lx,ly,lz;
char dir='*';
lx=tx*0.5;
ly=ty*0.5;
lz=tz*0.5;
x+=ox;
y+=oy;
z+=oz;
switch(type)
{
case TYPE_CHECKPOINT:
glColor3f(0,0,1);
break;
case TYPE_START_E:
dir='e';
glColor3f(0,1,0);
break;
case TYPE_START_W:
dir='w';
glColor3f(0,1,0);
break;
case TYPE_START_N:
dir='n';
glColor3f(0,1,0);
break;
case TYPE_START_S:
dir='s';
glColor3f(0,1,0);
break;
case TYPE_END:
glColor3f(1,0,0);
break;
case TYPE_LOOP:
glColor3f(1,1,1);
break;
case TYPE_TURBO_E:
dir='e';
glColor3f(1,1,0);
break;
case TYPE_TURBO_W:
dir='w';
glColor3f(1,1,0);
break;
case TYPE_TURBO_N:
dir='n';
glColor3f(1,1,0);
break;
case TYPE_TURBO_S:
dir='s';
glColor3f(1,1,0);
break;
} // end switch
//glColor3f(1,1,1);
glBegin(GL_LINES);
glVertex3f (x,y,z);
switch(dir)
{
case 'e':
glVertex3f (x+1,y,z);
break;
case 'w':
glVertex3f (x-1,y,z);
break;
case 'n':
glVertex3f (x,y+1,z);
break;
case 's':
glVertex3f (x,y-1,z);
break;
}
glEnd();
glBegin(GL_TRIANGLE_STRIP);
glNormal3f (-1,0,0);
glVertex3f (-lx+x,-ly+y,-lz+z);
glVertex3f (-lx+x,-ly+y,lz+z);
glVertex3f (-lx+x,ly+y,-lz+z);
glVertex3f (-lx+x,ly+y,lz+z);
glNormal3f (0,1,0);
glVertex3f (lx+x,ly+y,-lz+z);
glVertex3f (lx+x,ly+y,lz+z);
glNormal3f (1,0,0);
glVertex3f (lx+x,-ly+y,-lz+z);
glVertex3f (lx+x,-ly+y,lz+z);
glNormal3f (0,-1,0);
glVertex3f (-lx+x,-ly+y,-lz+z);
glVertex3f (-lx+x,-ly+y,lz+z);
glEnd();
// top face
glBegin (GL_TRIANGLE_FAN);
glNormal3f (0,0,1);
glVertex3f (-lx+x,-ly+y,lz+z);
glVertex3f (lx+x,-ly+y,lz+z);
glVertex3f (lx+x,ly+y,lz+z);
glVertex3f (-lx+x,ly+y,lz+z);
glEnd();
// bottom face
glBegin (GL_TRIANGLE_FAN);
glNormal3f (0,0,-1);
glVertex3f (-lx+x,-ly+y,-lz+z);
glVertex3f (-lx+x,ly+y,-lz+z);
glVertex3f (lx+x,ly+y,-lz+z);
glVertex3f (lx+x,-ly+y,-lz+z);
glEnd();
}
void draw_selection(void)
{
if(pop_mode==POP_MODE_BOX)
{
draw_box(px,py,pz,
boxpreset[curbox].x,
boxpreset[curbox].y,
boxpreset[curbox].z,
boxpreset[curbox].tx,
boxpreset[curbox].ty,
boxpreset[curbox].tz,
boxpreset[curbox].type);
}
glBegin(GL_LINES);
glColor3f(0,1,0);
glVertex3f(px,py,pz);
glVertex3f(px,py+1,pz);
glVertex3f(px,py+1,pz);
glVertex3f(px+1,py+1,pz);
glVertex3f(px+1,py+1,pz);
glVertex3f(px+1,py,pz);
glVertex3f(px+1,py,pz);
glVertex3f(px,py,pz);
glEnd();
if(pop_mode==POP_MODE_ELEM)
{
glPushMatrix();
glTranslatef(px,py,pz);
rotatez(curangle,curobj);
raydium_object_draw(curobj);
rotatez(-curangle,curobj);
glPopMatrix();
}
}
void add(void)
{
GLint i;
raydium_log("pop !");
for(i=0;i<MAX_ELEMS;i++)
if(!grid[i].state)
{
grid[i].state=1;
grid[i].x=px;
grid[i].y=py;
grid[i].z=pz;
grid[i].flags=0;
grid[i].rot=curangle;
grid[i].obj=curobj;
grid_generate_obj();
return;
}
raydium_log("MAX_ELEMS reached");
}
void add_box(void)
{
GLint i;
float x,y,z;
float tx,ty,tz;
int type;
x=px+boxpreset[curbox].x;
y=py+boxpreset[curbox].y;
z=pz+boxpreset[curbox].z;
tx=boxpreset[curbox].tx;
ty=boxpreset[curbox].ty;
tz=boxpreset[curbox].tz;
type=boxpreset[curbox].type;
raydium_log("pop the box !");
for(i=0;i<MAX_ELEMS;i++)
if(!box[i].state)
{
box[i].state=1;
box[i].x=x;
box[i].y=y;
box[i].z=z;
box[i].tx=tx;
box[i].ty=ty;
box[i].tz=tz;
box[i].type=type;
return;
}
raydium_log("MAX_ELEMS reached for boxes");
}
void del(void)
{
GLint i;
if(pop_mode==POP_MODE_ELEM)
for(i=0;i<MAX_ELEMS;i++)
if( grid[i].state &&
grid[i].x==px &&
grid[i].y==py &&
grid[i].z==pz )
grid[i].state=0;
if(pop_mode==POP_MODE_BOX)
for(i=0;i<MAX_ELEMS;i++)
if( box[i].state &&
box[i].x>=px &&
box[i].x<=px+1 &&
box[i].y>=py &&
box[i].y<=py+1 &&
box[i].z>=pz &&
box[i].z<=pz+1 )
box[i].state=0;
grid_generate_obj();
}
void mouse_n_keys_event(void)
{
static GLfloat rotx,roty;
int window;
if(raydium_key_last==1027) gui_exit();
window=raydium_gui_window_find("menu");
if(raydium_gui_widget_find("btnMenu",window)>=0)
{
if(raydium_key_last==1045) modl_zoom--;
if(raydium_key_last==1043) modl_zoom++;
if(raydium_key_last==1100) del();
if(raydium_key_last==1009) { curangle+=90; raydium_key_last=0; }
if(raydium_key_last==1032 && pop_mode==POP_MODE_ELEM) add();
if(raydium_key_last==1032 && pop_mode==POP_MODE_BOX) add_box();
// if(raydium_key_last==2) export_all();
if(raydium_key_last==101) py++;
if(raydium_key_last==103) py--;
if(raydium_key_last==100) px--;
if(raydium_key_last==102) px++;
if(raydium_key_last==105 && pop_mode==POP_MODE_ELEM) curobj--;
if(raydium_key_last==104 && pop_mode==POP_MODE_ELEM) curobj++;
if(raydium_key_last==105 && pop_mode==POP_MODE_BOX) curbox--;
if(raydium_key_last==104 && pop_mode==POP_MODE_BOX) curbox++;
if(raydium_key_last==106) pz+=0.25;
if(raydium_key_last==107) pz-=0.25;
if(raydium_key_last==1013 && pop_mode==POP_MODE_ELEM) pop_mode=POP_MODE_BOX;
else
if(raydium_key_last==1013 && pop_mode==POP_MODE_BOX) pop_mode=POP_MODE_ELEM;
if(raydium_key_last==1109) build_gui_menu(NULL);
if(raydium_key_last==1084) btnTest(NULL);
if(curobj<0) curobj=0;
if(curbox<0) curbox=0;
if((curobj+1)>=raydium_object_index) curobj=raydium_object_index-2;
if(curbox>=n_boxpresets) curbox=n_boxpresets-1;
curangle%=360;
if(modl_zoom<1) modl_zoom=1;
if(!view_glue)
rotx=roty=0;
if(raydium_mouse_button[1])
{
view_glue=1;
rotx=((float)raydium_mouse_x-((float)raydium_window_tx/(float)2)) * ((float)360/(float)raydium_window_tx);
roty=((float)raydium_mouse_y-((float)raydium_window_ty/(float)2)) * ((float)360/(float)raydium_window_ty);
}
if(raydium_mouse_button[0])
{
view_glue=0;
rotx=((float)raydium_mouse_x-((float)raydium_window_tx/(float)2)) * ((float)360/(float)raydium_window_tx);
roty=((float)raydium_mouse_y-((float)raydium_window_ty/(float)2)) * ((float)360/(float)raydium_window_ty);
}
glRotatef(roty,1,0,0);
glRotatef(rotx,0,1,0);
} // end if "acess menu visible"
glTranslatef(-px,-py,-pz);
}
void update_vars(void)
{
raydium_projection=RAYDIUM_PROJECTION_ORTHO;
raydium_projection_near=-modl_zoom;
raydium_projection_far=modl_zoom;
raydium_projection_left=-modl_zoom;
raydium_projection_right=modl_zoom;
raydium_projection_bottom=-modl_zoom;
raydium_projection_top=modl_zoom;
raydium_window_resize_callback(raydium_window_tx,raydium_window_ty);
}
void display(void)
{
int i;
raydium_clear_frame();
//glLoadIdentity();
update_vars();
mouse_n_keys_event();
glDisable(GL_TEXTURE_2D);
if(!view_glue)
{
draw_grid();
draw_axes();
}
for(i=0;i<MAX_ELEMS;i++)
if(box[i].state)
{
// draw boxes here
draw_box(0,0,0,
box[i].x,box[i].y,box[i].z,
box[i].tx,box[i].ty,box[i].tz,
box[i].type);
}
draw_selection();
glColor3f(1.0,1.0,1.0);
glEnable(GL_TEXTURE_2D);
//glPolygonMode(GL_FRONT_AND_BACK, GL_FILL);
raydium_object_draw_name("mania.tri");
raydium_rendering_finish();
raydium_light_disable();
}
void load_all_in(char *name)
{
char trifile[255]; // eeeerk :)
FILE *fp;
fp=raydium_file_fopen(name,"rt");
if(!fp)
{
printf("Need a %s config file, with all available tri files..\n",name);
exit(1);
}
while(fgets(trifile,255,fp)!=NULL)
{
// if(!strlen(trifile)) continue;
// trifile[strlen(trifile)-1]=0;
raydium_parser_trim(trifile);
if(!strlen(trifile)) continue;
if(trifile[0]=='#') continue;
if(trifile[0]=='*')
{
boxpreset[n_boxpresets].state=1;
sscanf(trifile+2,"%f %f %f %f %f %f %i",
&boxpreset[n_boxpresets].x,
&boxpreset[n_boxpresets].y,
&boxpreset[n_boxpresets].z,
&boxpreset[n_boxpresets].tx,
&boxpreset[n_boxpresets].ty,
&boxpreset[n_boxpresets].tz,
&boxpreset[n_boxpresets].type);
n_boxpresets++;
}
else raydium_object_load(trifile);
}
fclose(fp);
}
char file_exists(char *name)
{
FILE *fp;
fp=fopen(name,"r");
if(fp) { fclose(fp); return 1; }
return 0;
}
int main(int argc, char **argv)
{
char window[256];
sprintf(window,"%s - %s",title,version);
data_init();
current_track[0]=0;
raydium_init_args_name(argc,argv,"mania_drive");
raydium_window_create(700,700,RAYDIUM_RENDERING_WINDOW,window);
raydium_background_color_change(0,0,0,1);
raydium_rendering_displaylists_disable();
raydium_texture_filter=RAYDIUM_TEXTURE_FILTER_TRILINEAR;
// place here all available objets:
load_all_in("mania.cfg");
raydium_object_new_empty("mania.tri");
grid_init_all();
box_init_all();
// stop here (must be LAST object)
raydium_parser_db_get("Mania2-CurrentTrack",current_track,"");
if(file_exists(current_track))
grid_load(current_track);
raydium_mouse_show();
raydium_gui_theme_load("theme-raydium2.gui");
raydium_gui_show();
build_gui_access(NULL);
//build_gui_help(NULL);
raydium_callback(&display);
return(0);
}