// ManiaDrive Track Editor - CQFD Corp
// http://maniadrive.raydium.org/
char *version="0.41";
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 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[6][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]);
raydium_gui_read_name("menu","edtEnt",d[5]);

sprintf(tdata,"%s;%s;%s;%s;%s;%s",d[0],d[1],d[2],d[3],d[4],d[5]);
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("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[6][512];

extract_data(tdata,d[0],d[1],d[2],d[3],d[4],d[5]);

raydium_gui_window_delete_name("menu");
handle=raydium_gui_window_create("menu",10,35,80,40);

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,76,d[0]);

raydium_gui_widget_sizes(0,0,14);
raydium_gui_label_create("lblAuthor",handle,15,70,"Track author",0,0,0);
raydium_gui_widget_sizes(30,3,14);
raydium_gui_edit_create("edtAuthor",handle,30,66,d[1]);

raydium_gui_widget_sizes(0,0,14);
raydium_gui_label_create("lblGold",handle,15,60,"Gold time (secs)",0,0,0);
raydium_gui_widget_sizes(20,3,14);
raydium_gui_edit_create("edtGold",handle,30,56,d[2]);

raydium_gui_widget_sizes(0,0,14);
raydium_gui_label_create("lblAuthorTime",handle,15,50,"Author time (secs)",0,0,0);
raydium_gui_widget_sizes(20,3,14);
raydium_gui_edit_create("edtAuthorTime",handle,30,46,d[3]);

raydium_gui_widget_sizes(0,0,14);
raydium_gui_label_create("lblMsg",handle,15,40,"Message file (opt)",0,0,0);
raydium_gui_widget_sizes(20,3,14);
raydium_gui_edit_create("edtMsg",handle,30,36,d[4]);

raydium_gui_widget_sizes(0,0,14);
raydium_gui_label_create("lblEnt",handle,15,30,"Entities file (opt)",0,0,0);
raydium_gui_widget_sizes(20,3,14);
raydium_gui_edit_create("edtEnt",handle,30,26,d[5]);


raydium_gui_widget_sizes(10,3,14);
raydium_gui_button_create("btnLoad",handle,70,8,"OK",btnMetaOk);
raydium_gui_button_create("btnCancel",handle,85,8,"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_creat