Index: test6.c
===================================================================
--- test6.c	(revision 0)
+++ test6.c	(revision 1)
@@ -0,0 +1,850 @@
+/*
+    Xfennec - CQFD Corp.
+    test & integration program for Raydium -
+    CQFD Corp.
+*/
+
+char *version="version 0.6.12";
+
+//#define ODE_MANUAL_CALLBACK
+
+#include "raydium/index.c"
+
+GLfloat sun[]={1.0,0.9,0.8,1.0};
+GLfloat blood[]={1.0,0.0,0.0,0.2};
+GLfloat amb[]={1.0,0.0,0.0,1.0};
+
+
+#define ROCKET_FIABILITY  5
+#define ROCKET_SPEED	 70
+#define RELOAD_TIME	2.5
+#define PLAYER_SPEED    0.2
+#define PLAYER_JUMP	 20
+#define BULLET_SPEED	 50
+#define BULLET_RATE	 50
+
+#define SOUND_MAX_EXPLOS 4
+char wav_boom[SOUND_MAX_EXPLOS][128]={"xf_boom1.wav","xf_boom2.wav","xf_boom3.wav","xf_boom4.wav"};
+int son_boom[SOUND_MAX_EXPLOS];
+
+#define SOUND_MAX_BONGS 5
+char wav_bong[SOUND_MAX_BONGS][128]={"xf_bong1.wav","xf_bong2.wav","xf_bong3.wav","xf_bong4.wav","xf_bong5.wav"};
+int son_bong[SOUND_MAX_BONGS];
+
+int son;
+int son_rl;
+int son_reload;
+int son_paf;
+int son_gun;
+char vue=7;
+GLfloat camx=-20;
+GLfloat camy=50;
+GLfloat camz=40;
+char cam[255];
+char record=-1;
+char draw_debug=-1;
+char mouse_grab=1;
+char is_explosive_tag=29;
+char is_bullet=99;
+dReal cam_angle_h=0;
+dReal cam_angle_v=90;
+int movie_spf=0;
+float life;
+char already_dead;
+float reload_time;
+float paf_time=0;
+float sensivity=1;
+
+dReal ptmp=0;
+
+dReal gears[]={-0.4,0.4,0.6,0.8,0.9,1.0};
+int gear=1;
+
+void create_game(char);
+
+
+//////////////////////// RayODE Callbacks
+
+void boom(char type, dReal radius, dReal force_or_propag, dReal *pos)
+{
+int i;
+int g1,g2;
+char name1[128];
+char name2[128];
+
+i=raydium_random_i(0,SOUND_MAX_EXPLOS-1);
+//raydium_explosion_add(pos[0],pos[1],pos[2],0,0,0,0.6,3,6,0.1);
+raydium_particle_name_auto("explo",name1);
+raydium_particle_name_auto("eplo_smoke",name2);
+g1=raydium_particle_generator_load("explosion.prt",name1);
+g2=raydium_particle_generator_load("explosmoke.prt",name2);
+
+raydium_particle_generator_move(g1,pos);
+raydium_particle_generator_move(g2,pos);
+
+raydium_sound_SourcePlay(son_boom[i]);
+raydium_sound_SetSourcePos(son_boom[i],pos);
+}
+
+void blow_touched(int elem, dReal force, dReal max_force)
+{
+if(raydium_ode_element_player_get(elem))
+    {
+    //raydium_log("touched: %.2f perc. of maximum explosion force (%.2f/%.2f)",force/max_force*100,force,max_force);
+    life-=(force/2);
+    }
+else
+    {
+    // is a rocket !
+    raydium_ode_element_OnBlow(elem,NULL);
+    raydium_ode_element_delete(elem,1);
+    }
+}
+
+int rocket_delete(int explo)
+{
+dReal *pos;
+pos=raydium_ode_element_pos_get(explo);
+raydium_ode_explosion_blow(4,100,pos);
+return 1; // confirm delete
+}
+
+char collide(int e1, int e2, dContact *n)
+{
+char *c1,*c2;
+int explo=-1;
+int player=-1;
+int bullet=-1;
+
+c1=raydium_ode_element_data_get(e1);
+c2=raydium_ode_element_data_get(e2);
+
+
+//if( !raydium_ode_element_isvalid(e1) ||
+//    !raydium_ode_element_isvalid(e2) )
+//    printf("(%i|%i) (%s|%s)\n",e1,e2,raydium_ode_element[e1].name,raydium_ode_element[e2].name);
+//    return 0;
+
+if((c1 && *c1==29))
+    explo=e1;
+if((c2 && *c2==29))
+    explo=e2;
+
+if((c1 && *c1==99))
+    bullet=e1;
+if((c2 && *c2==99))
+    bullet=e2;
+
+if(raydium_ode_element_player_get(e1))
+    player=e1;
+if(raydium_ode_element_player_get(e2))
+    player=e2;
+
+if(player>=0 && n->geom.depth>0.04)
+    {
+    // Based on small tests:
+    life-=(n->geom.depth*100/5);
+    }
+
+if(explo>=0)
+    {
+    raydium_sound_SourceStop(son_rl);
+    if(raydium_random_i(0,ROCKET_FIABILITY)==0)
+     {
+     int i;
+     // no luck, this rocket will never explode ;)
+     raydium_ode_element_data_set(explo,NULL);
+     raydium_ode_element_gravity(explo,1);
+     raydium_ode_element_OnBlow(explo,blow_touched);
+     // play a random "bong"
+     i=raydium_random_i(0,SOUND_MAX_BONGS-1);
+     raydium_sound_SourcePlay(son_bong[i]); 
+     raydium_ode_element_sound_update(explo,son_bong[i]);
+     raydium_particle_generator_enable(raydium_ode_element[explo].particle,0);
+     }
+    else
+     {
+     raydium_ode_element_delete(explo,1);
+     return 1;
+     }
+    }
+
+if(bullet>=0)
+    {
+    // play a sound ?
+    raydium_ode_element_delete(bullet,1);
+    n->surface.soft_erp=0.5;
+    n->surface.soft_cfm=1;
+    return 1; // generate a contact point anyway
+    }
+return 1;
+}
+
+void frame_step(GLfloat step)
+{
+reload_time-=step;
+paf_time+=step;
+}
+
+
+void step(void)
+{
+static int cpt=0;
+if(raydium_mouse_button[1] && cpt>BULLET_RATE)
+    {
+    // fire !
+    int a;
+    char name[255];
+    cpt=0;
+    a=raydium_ode_object_find("PLAYER");
+    raydium_ode_name_auto("bullet",name);
+    strcpy(cam,name);
+    raydium_ode_object_box_add(name,a,0.01,RAYDIUM_ODE_AUTODETECT,0,0,RAYDIUM_ODE_STANDARD,0,"bullet.tri");
+    raydium_ode_launcher_simple_name_3f(name,"player",0,cam_angle_v+5,0,BULLET_SPEED);
+    raydium_ode_element_rotate_direction_name(name,0);
+    raydium_ode_element_data_set_name(name,&is_bullet);
+    raydium_ode_element_gravity_name(name,0);
+//    raydium_ode_element_OnDelete_name(name,rocket_delete);
+    raydium_ode_element_ttl_set_name(name,RAYDIUM_ODE_PHYSICS_FREQ*5); // 5 seconds
+//    raydium_sound_SourcePlay(son_rl);
+//    raydium_ode_element_sound_update_name("player",son_rl);
+//    reload_time=RELOAD_TIME;
+    raydium_sound_SourcePlay(son_gun);
+    raydium_ode_element_sound_update_name("player",son_gun);
+    }
+cpt++;
+}
+
+
+void kill_player(void)
+{
+already_dead=1;
+create_game(0);
+raydium_log("Killed");
+} PHP_v_v(kill_player);
+
+void kill_php(void)
+{
+life=0;
+} PHP_v_v(kill_php);
+
+/////////////////////// Actors creation
+
+void create_game(char alive)
+{
+#define BREAK_FORCE	130
+#define ROTFRICTION	0.0005
+int a;
+    
+    
+if(!alive)
+{
+dQuaternion q;
+dReal pos[3];
+dReal vel[3];
+dReal accum[3];
+
+raydium_ode_element_rotq_get_name("player",q);
+memcpy(pos,raydium_ode_element_pos_get_name("player"),sizeof(dReal)*3);
+// get vel and accums
+memcpy(vel,dBodyGetLinearVel(raydium_ode_element[raydium_ode_element_find("player")].body),sizeof(dReal)*3);
+memcpy(accum,dBodyGetForce(raydium_ode_element[raydium_ode_element_find("player")].body),sizeof(dReal)*3);
+
+raydium_ode_object_delete_name("PLAYER");
+
+a=raydium_ode_object_create("PLAYER");
+raydium_ode_object_box_add("player",a,0.1,RAYDIUM_ODE_AUTODETECT,0,0,RAYDIUM_ODE_STANDARD,0,"lego.tri");
+// raydium_ode_element_material_name("player",RAYDIUM_ODE_MATERIAL_SOFT2);
+raydium_ode_element_move_name("player",pos);
+raydium_ode_element_rotateq_name("player",q);
+dBodySetLinearVel(raydium_ode_element[raydium_ode_element_find("player")].body,vel[0],vel[1],vel[2]);
+dBodySetForce(raydium_ode_element[raydium_ode_element_find("player")].body,accum[0],accum[1],accum[2]);
+dBodySetTorque(raydium_ode_element[raydium_ode_element_find("player")].body,0.1,0.1,0.1);
+
+return;
+}
+
+raydium_ode_object_delete_name("BUGGY");
+    
+  a=raydium_ode_object_create("BUGGY");
+    raydium_ode_object_box_add("buggy_corps",a,1,RAYDIUM_ODE_AUTODETECT,0,0,RAYDIUM_ODE_STANDARD,0,"buggy.tri");
+
+    raydium_ode_object_sphere_add("buggy_pneu_ag",a,0.5,RAYDIUM_ODE_AUTODETECT,RAYDIUM_ODE_STANDARD,0,"buggy_r.tri");
+    raydium_ode_element_rotfriction_name("buggy_pneu_ag",ROTFRICTION);
+    raydium_ode_element_move_name_3f("buggy_pneu_ag",0.42,0.253,-0.280);
+    raydium_ode_joint_attach_hinge2_name("buggy_suspet_ag","buggy_corps","buggy_pneu_ag",RAYDIUM_ODE_JOINT_SUSP_DEFAULT_AXES);
+    raydium_ode_joint_break_force_name("buggy_suspet_ag",BREAK_FORCE);
+
+    raydium_ode_object_sphere_add("buggy_pneu_ad",a,0.5,RAYDIUM_ODE_AUTODETECT,RAYDIUM_ODE_STANDARD,0,"buggy_r.tri");
+    raydium_ode_element_rotfriction_name("buggy_pneu_ad",ROTFRICTION);
+    raydium_ode_element_move_name_3f("buggy_pneu_ad",0.42,-0.253,-0.280);
+    raydium_ode_joint_attach_hinge2_name("buggy_suspet_ad","buggy_corps","buggy_pneu_ad",RAYDIUM_ODE_JOINT_SUSP_DEFAULT_AXES);
+    raydium_ode_joint_break_force_name("buggy_suspet_ad",BREAK_FORCE);
+
+    raydium_ode_object_sphere_add("buggy_pneu_rg",a,0.5,RAYDIUM_ODE_AUTODETECT,RAYDIUM_ODE_STANDARD,0,"buggy_r.tri");
+    raydium_ode_element_rotfriction_name("buggy_pneu_rg",ROTFRICTION);
+    raydium_ode_element_move_name_3f("buggy_pneu_rg",-0.444,0.3,-0.260);
+    raydium_ode_joint_attach_hinge2_name("buggy_suspet_rg","buggy_corps","buggy_pneu_rg",RAYDIUM_ODE_JOINT_SUSP_DEFAULT_AXES);
+    raydium_ode_joint_hinge2_block_name("buggy_suspet_rg",1);
+    raydium_ode_joint_break_force_name("buggy_suspet_rg",BREAK_FORCE);
+
+    raydium_ode_object_sphere_add("buggy_pneu_rd",a,0.5,RAYDIUM_ODE_AUTODETECT,RAYDIUM_ODE_STANDARD,0,"buggy_r.tri");
+    raydium_ode_element_rotfriction_name("buggy_pneu_rd",ROTFRICTION);
+    raydium_ode_element_move_name_3f("buggy_pneu_rd",-0.444,-0.3,-0.260);
+    raydium_ode_joint_attach_hinge2_name("buggy_suspet_rd","buggy_corps","buggy_pneu_rd",RAYDIUM_ODE_JOINT_SUSP_DEFAULT_AXES);
+    raydium_ode_joint_hinge2_block_name("buggy_suspet_rd",1);
+    raydium_ode_joint_break_force_name("buggy_suspet_rd",BREAK_FORCE);
+    
+    raydium_ode_motor_create("buggy_moteur",a,RAYDIUM_ODE_MOTOR_ENGINE);
+    raydium_ode_motor_attach_name("buggy_moteur","buggy_suspet_ag",1);
+    raydium_ode_motor_attach_name("buggy_moteur","buggy_suspet_ad",1);
+    raydium_ode_motor_power_max_name("buggy_moteur",0.05);
+    raydium_ode_motor_gears_set_name("buggy_moteur",gears,6);
+    raydium_ode_motor_gear_change_name("buggy_moteur",gear);
+
+    
+    raydium_ode_motor_create("buggy_direction",a,RAYDIUM_ODE_MOTOR_ANGULAR);
+    raydium_ode_motor_attach_name("buggy_direction","buggy_suspet_ag",0);
+    raydium_ode_motor_attach_name("buggy_direction","buggy_suspet_ad",0);
+    raydium_ode_motor_power_max_name("buggy_direction",0.2);
+    {
+    //dReal pos[3]={2,2,2};
+    //raydium_ode_object_move(a,pos);
+    }
+//    raydium_ode_element_particle_offset_name_3f("buggy_corps","smoke.prt",-0.5,0,0);
+//    raydium_ode_element_particle_offset_name_3f("buggy_corps","dust.prt",-0.5,0,-0.3);
+
+/*
+raydium_ode_object_delete_name("TANK");
+    
+  a=raydium_ode_object_create("TANK");
+    raydium_ode_object_box_add("tank_corps",a,1,RAYDIUM_ODE_AUTODETECT,0,0,RAYDIUM_ODE_STANDARD,0,"t80b.tri");
+    raydium_ode_element_move_name_3f("tank_corps",-2,0,0);
+
+    raydium_ode_object_box_add("tank_tour",a,1,RAYDIUM_ODE_AUTODETECT,0,0,RAYDIUM_ODE_STANDARD,0,"t80t.tri");
+    raydium_ode_element_move_name_3f("tank_tour",-2,0,0.4);
+
+    raydium_ode_joint_attach_hinge_name("pivot","tank_corps","tank_tour",-2,0,0.4,RAYDIUM_ODE_JOINT_AXE_Z);
+    raydium_ode_joint_hinge_limits_name("pivot",-2.5,2.5);
+    raydium_ode_motor_create("pivot_motor",a,RAYDIUM_ODE_MOTOR_ENGINE);
+    raydium_ode_motor_attach_name("pivot_motor","pivot",0);
+    raydium_ode_motor_power_max_name("pivot_motor",0.1);
+
+    raydium_ode_object_box_add("tank_canon",a,1,RAYDIUM_ODE_AUTODETECT,0,0,RAYDIUM_ODE_STANDARD,0,"t80c.tri");
+    raydium_ode_element_move_name_3f("tank_canon",-1,0,0.30);
+
+    raydium_ode_joint_attach_hinge_name("trukatach","tank_tour","tank_canon",-1.8,0,0.3,RAYDIUM_ODE_JOINT_AXE_Y);
+    raydium_ode_joint_hinge_limits_name("trukatach",0,0.5);
+    raydium_ode_motor_create("truk_motor",a,RAYDIUM_ODE_MOTOR_ANGULAR);
+    raydium_ode_motor_attach_name("truk_motor","trukatach",0);
+    raydium_ode_motor_power_max_name("truk_motor",1);
+*/
+
+    life=100;
+    already_dead=0;
+    reload_time=RELOAD_TIME;
+    raydium_ode_object_delete_name("PLAYER");
+    a=raydium_ode_object_create("PLAYER");
+    raydium_ode_object_sphere_add("player",a,0.1,RAYDIUM_ODE_AUTODETECT,RAYDIUM_ODE_STANDARD,0,"lego.tri");
+    raydium_ode_element_material_name("player",RAYDIUM_ODE_MATERIAL_SOFT2);
+    raydium_ode_element_player_set_name("player",1);
+    raydium_ode_motor_create("player_react",a,RAYDIUM_ODE_MOTOR_ROCKET);
+    raydium_ode_motor_rocket_set_name("player_react","player",0,0,0);
+    raydium_ode_motor_rocket_playermovement_name("player_react",1);
+    raydium_ode_element_slip_name("ground",RAYDIUM_ODE_SLIP_ICE/2.f);
+    raydium_ode_element_OnBlow_name("player",blow_touched);
+//    raydium_ode_element_move_name_3f("player",3,3,1);
+#define DEFAULT_RAND_DEC raydium_random_f(-3,3)
+#define DEFAULT_DEC DEFAULT_RAND_DEC,DEFAULT_RAND_DEC,0
+raydium_ode_object_move_name_3f("BUGGY", DEFAULT_DEC);
+raydium_ode_object_move_name_3f("PLAYER",DEFAULT_DEC);
+
+}
+
+void display(void)
+{
+dReal speed;
+dReal direct;
+dReal *tmp;
+
+raydium_joy_key_emul();
+
+if(raydium_key[GLUT_KEY_F1]) { raydium_projection_fov/=(1.04); raydium_window_view_update(); }
+if(raydium_key[GLUT_KEY_F2]) { raydium_projection_fov*=(1.04); raydium_window_view_update(); }
+
+// sets motor speed
+if((vue==4 || vue==5 || vue==6) && life>0)
+{
+speed=0;
+
+// keyboard or joy settings
+if(raydium_joy_y>0) speed=raydium_joy_y*55;
+//if(raydium_joy_z<0) speed=(raydium_joy_z)*-55;
+
+
+direct=raydium_joy_x*0.3; // 0.2 is "perfect" for clio stability
+
+raydium_ode_motor_speed_name("buggy_moteur",-speed);
+raydium_ode_motor_angle_name("buggy_direction",direct);
+
+if( (raydium_key_last==1113 || raydium_joy_click==6) && gear<5)
+ gear++;
+
+if( (raydium_key_last==1119 || raydium_joy_click==5) && gear>0)
+ gear--;
+
+}
+
+if(vue==8 && life>0)
+{
+static dReal angle=0;
+speed=raydium_joy_x;
+angle+=raydium_joy_y*0.01;
+raydium_ode_motor_speed_name("pivot_motor",speed);
+raydium_ode_motor_angle_name("truk_motor",angle);
+
+if(raydium_mouse_click==1 && reload_time<0)
+    {
+    // launch projectile
+    int a;
+    char name[255];
+    a=raydium_ode_object_find("TANK");
+    raydium_ode_name_auto("ob",name);
+    strcpy(cam,name);
+    raydium_ode_object_box_add(name,a,0.02,RAYDIUM_ODE_AUTODETECT,0,0,RAYDIUM_ODE_STANDARD,0,"rocket.tri");
+    raydium_ode_launcher_simple_name_3f(name,"tank_canon",0,90,0,ROCKET_SPEED);
+    raydium_ode_element_rotate_direction_name(name,0);
+    raydium_ode_element_data_set_name(name,&is_explosive_tag);
+//    raydium_ode_element_gravity_name(name,0);
+    raydium_ode_element_OnDelete_name(name,rocket_delete);
+    raydium_ode_element_ttl_set_name(name,RAYDIUM_ODE_PHYSICS_FREQ*10); // 10 seconds
+    raydium_sound_SourcePlay(son_rl);
+    raydium_ode_element_sound_update_name("tank_tour",son_rl);
+    reload_time=RELOAD_TIME;
+    }
+}
+
+if(vue==7 && life>0)
+{
+int dir=5;
+speed=PLAYER_SPEED;
+ptmp=0;
+
+// directions indices:
+// 1    2    3
+//      ^
+// 4 <- 5 -> 6
+//      v
+// 7    8    9
+
+if(raydium_key[GLUT_KEY_LEFT])  dir=4;
+if(raydium_key[GLUT_KEY_RIGHT]) dir=6;
+if(raydium_key[GLUT_KEY_UP]) dir=2;
+if(raydium_key[GLUT_KEY_DOWN]) dir=8;
+
+if(raydium_key[GLUT_KEY_LEFT] && raydium_key[GLUT_KEY_UP]) dir=1;
+if(raydium_key[GLUT_KEY_RIGHT] && raydium_key[GLUT_KEY_UP]) dir=3;
+
+if(raydium_key[GLUT_KEY_LEFT] && raydium_key[GLUT_KEY_DOWN]) dir=7;
+if(raydium_key[GLUT_KEY_RIGHT] && raydium_key[GLUT_KEY_DOWN]) dir=9;
+
+switch(dir)
+    {
+    case 1:
+	ptmp=-45;
+	break;
+    case 2:
+	ptmp=0;
+	break;
+    case 3:
+	ptmp=45;
+	break;
+    case 4:
+	ptmp=-90;
+	break;
+    case 5:
+	speed=0; // stops player
+	break;
+    case 6:
+	ptmp=90;
+	break;
+    case 7:
+	ptmp=-135;
+	break;
+    case 8:
+	ptmp=180;
+	break;
+    case 9:
+	ptmp=135;
+	break;
+    }
+
+raydium_ode_motor_speed_name("player_react",speed);
+raydium_ode_motor_rocket_orientation_name("player_react",0,90,ptmp);
+if(raydium_mouse_click==3 && raydium_ode_element_touched_get_name("player")) raydium_ode_launcher_name_3f("player","player",0,0,0,PLAYER_JUMP);
+if(raydium_mouse_click==1 && reload_time<0)
+    {
+    // launch rocket
+    int a;
+    char name[255];
+    a=raydium_ode_object_find("PLAYER");
+    raydium_ode_name_auto("mav",name);
+    strcpy(cam,name);
+    raydium_ode_object_box_add(name,a,0.1,RAYDIUM_ODE_AUTODETECT,0,0,RAYDIUM_ODE_STANDARD,0,"rocket.tri");
+    raydium_ode_launcher_simple_name_3f(name,"player",0,cam_angle_v+5,0,ROCKET_SPEED);
+    raydium_ode_element_rotate_direction_name(name,0);
+    raydium_ode_element_data_set_name(name,&is_explosive_tag);
+    raydium_ode_element_gravity_name(name,0);
+    raydium_ode_element_OnDelete_name(name,rocket_delete);
+    raydium_ode_element_ttl_set_name(name,RAYDIUM_ODE_PHYSICS_FREQ*10); // 10 seconds
+    raydium_ode_element_particle_name(name,"smoke.prt");
+    raydium_sound_SourcePlay(son_rl);
+    raydium_ode_element_sound_update_name("player",son_rl);
+    reload_time=RELOAD_TIME;
+    }
+
+}
+
+if(life<=0 && !already_dead)
+    kill_player();
+
+if(raydium_mouse_click==1 && life<=0)
+    create_game(1);
+
+
+if(raydium_key_last==1027) exit(0);
+if(raydium_key_last==1114) record*=-1;
+if(raydium_key_last==1116) draw_debug*=-1;
+if(raydium_key_last==1109) mouse_grab*=-1;
+
+if(raydium_key_last==1032)
+    {
+
+    int a;
+    char name[255];
+    a=raydium_ode_object_find("GLOBAL");
+    raydium_ode_name_auto("box",name);
+    raydium_ode_object_box_add(name,a,0.1,RAYDIUM_ODE_AUTODETECT,0,0,RAYDIUM_ODE_STANDARD,0,"crate.tri");
+    raydium_ode_element_move_name_3f(name,raydium_random_neg_pos_1(),raydium_random_neg_pos_1(),2);
+
+    //raydium_php_exec("test.php");
+    }
+
+if(raydium_key_last==1097) { movie_spf=0; raydium_ode_time_change(0); }
+if(raydium_key_last==1122) { movie_spf=3; raydium_ode_time_change(10); }
+if(raydium_key_last==1101) { movie_spf=16; raydium_ode_time_change(100); }
+
+if(raydium_key_last==1109 && 0)  // disabled
+ {
+ int elems[10];
+ elems[0]=raydium_ode_element_find("buggy_corps");
+ elems[1]=raydium_ode_element_find("buggy_pneu_ag");
+ elems[2]=raydium_ode_element_find("buggy_pneu_ad");
+ elems[3]=raydium_ode_element_find("buggy_pneu_rd"); 
+ elems[4]=raydium_ode_element_find("buggy_pneu_rg"); 
+ raydium_ode_element_fix("merged_elem",elems,5,0);
+ }
+
+
+//if(raydium_key_last==1098) 
+
+if(raydium_key_last==5)
+{
+vue=5;
+raydium_projection_near=10;
+raydium_projection_fov=2;
+raydium_window_view_update();
+}
+                                                                                 
+if(raydium_key_last==6)
+{
+vue=6;
+raydium_projection_near=0.05 ;
+raydium_projection_fov=60;
+raydium_window_view_update();
+                                                                                 
+}
+
+if(raydium_key_last==4)
+{
+vue=4;
+raydium_projection_near=0.05;
+raydium_projection_fov=40;
+raydium_window_view_update();
+                                                                                 
+}
+
+if(raydium_key_last==7)
+{
+vue=7;
+raydium_projection_near=0.05;
+raydium_projection_fov=70;
+raydium_window_view_update();
+}
+
+
+if(raydium_key_last==8)
+{
+vue=8;
+raydium_projection_near=0.05;
+raydium_projection_fov=70;
+raydium_window_view_update();
+}
+
+
+if(raydium_key_last==3)
+{
+vue=3;
+raydium_projection_near=0.05;
+raydium_projection_fov=120;
+raydium_window_view_update();
+}
+
+//if(raydium_key_last==1100) 
+//    raydium_ode_element_moveto_name("buggy_pneu_ag","GLOBAL",1);
+
+
+if(mouse_grab==1)
+{
+ float delta_x;
+ float delta_y;
+ float zoomfact=1;
+ zoomfact=raydium_projection_fov/70;
+ delta_x = (raydium_mouse_x - (raydium_window_tx/2.f))*sensivity*zoomfact;
+ delta_y = (raydium_mouse_y - (raydium_window_ty/2.f))*sensivity*zoomfact;
+ cam_angle_h += (delta_x*0.008f); // rads
+ if(life>0)
+  cam_angle_v += (delta_y*0.458f); // degs
+ raydium_mouse_move(raydium_window_tx/2, raydium_window_ty/2);
+ raydium_ode_element_player_angle_name("player",cam_angle_h);
+ if(cam_angle_v<1) cam_angle_v=1;
+ if(cam_angle_v>179) cam_angle_v=179;
+}
+
+
+
+{
+static int reload_done=1;
+if(reload_time<1 && !reload_done)
+    {
+    reload_done=1;
+    raydium_sound_SourcePlay(son_reload);
+    raydium_ode_element_sound_update_name("player",son_reload);
+    }
+if(reload_time>1) reload_done=0;
+}
+
+
+raydium_light_position[0][0]=50;
+raydium_light_position[0][1]=150;
+raydium_light_position[0][2]=200;
+raydium_light_position[0][3]=1.0;
+raydium_light_update_all(0);
+
+
+{
+/*dReal *pos;
+pos=raydium_ode_element_pos_get_name("buggy_corps");
+if(pos)
+    raydium_particle_generator_move_name("smoke",pos);*/
+}
+
+
+raydium_clear_frame();
+glLoadIdentity();
+
+// camera + drawing
+if(raydium_ode_element_find(cam)<0) strcpy(cam,"player");
+tmp=raydium_ode_element_pos_get_name(cam);
+if(vue==5) raydium_camera_look_at(camx,camy,camz,tmp[1],-tmp[2],tmp[0]);
+if(vue==6) raydium_ode_element_camera_inboard_name("buggy_corps",-0.15,0,0.1,2,0,0);
+if(vue==4) raydium_ode_element_camera_inboard_name("buggy_corps",0,0.35,-0.2,2,0,-0.2);
+if(vue==7) raydium_ode_element_camera_inboard_name("player",0,0,0.1, raydium_trigo_sin(cam_angle_v),0,raydium_trigo_cos(cam_angle_v));
+//if(vue==8) raydium_ode_element_camera_inboard_name("tank_tour",0,0,0.1, 1,0,0);
+if(vue==3) raydium_ode_element_camera_inboard_name(cam,0,0,0.1, 1,0,0);
+//if(vue==8) raydium_ode_element_camera_inboard_name("helico",-1,0,1,1,0,0);
+
+raydium_ode_draw_all(0);
+if(draw_debug==1) 
+    {
+    raydium_ode_draw_all(1);
+    raydium_ode_draw_all(2);
+    raydium_osd_network_stat_draw(5,30,20);
+    }
+
+
+speed=raydium_ode_motor_speed_get_name("buggy_moteur",0);
+raydium_osd_printf(2,4,12,0.5,"font2.tga","^fcar speed: %f",speed);
+raydium_joy_ff_autocenter(speed/2.f);
+
+speed=raydium_ode_motor_speed_get_name("buggy_moteur",1);
+if(vue!=7) 
+    {
+    raydium_osd_printf(10,10,30,0.5,"font2.tga","%i",gear);
+    raydium_osd_printf(13,10,15,0.5,"font2.tga","%.1f",speed);
+    }
+
+if(paf_time>0.04 && speed>1 && !raydium_key[GLUT_KEY_UP])
+    {
+    paf_time=0;
+    if(raydium_random_i(0,10)==0) raydium_sound_SourcePlay(son_paf);
+    }
+
+//if(speed<10 && gear>1) gear--;
+//if(speed>45 && gear<5) gear++;
+raydium_ode_motor_gear_change_name("buggy_moteur",gear);
+
+speed*=0.1; // wheel radius
+speed/=4;
+speed+=0.5;
+speed+=(raydium_random_neg_pos_1()/15);
+raydium_sound_SetSourcePitch(son,raydium_trigo_abs(speed));
+raydium_ode_element_sound_update_name("buggy_corps",son);
+raydium_ode_element_sound_update_name("buggy_corps",son_paf);
+
+raydium_osd_printf(2,98,16,0.5,"font2.tga","- %3i FPS - tech demo %s for Raydium %s, CQFD Corp.",raydium_render_fps,version,raydium_version);
+
+{
+char c='2';
+if(life<50) c='e';
+if(life<25) c='c';
+raydium_osd_printf(2,15,20,0.5,"font2.tga","Health: ^%c%.1f %%^f",c,life);
+}
+
+//raydium_osd_printf(2,80,18,0.5,"font2.tga","^f Lag-O-meter: %.2f ms",raydium_netwok_queue_ack_delay/(double)raydium_timecall_clocks_per_sec*1000);
+//raydium_osd_printf(2,80,18,0.5,"font2.tga","AF: %i",raydium_ode_element_ground_texture_get_name("buggy_pneu_ad"));
+{
+//dReal rx,ry,rz;
+//raydium_ode_element_rot_get_name("buggy_corps",&rx,&ry,&rz);
+//raydium_osd_printf(2,80,18,0.5,"font2.tga","^fRot %.2f %.2f %.2f",rx,ry,rz);
+}
+
+if(reload_time>0)
+ raydium_osd_printf(7,20,15,0.5,"font2.tga","^c[RELOADING]^f");
+
+if(life<=0)
+    raydium_osd_printf(10,50,30,0.5,"font2.tga","Push FIRE button to restart game.");
+else
+    if(vue==7) raydium_osd_draw_name("BOXcross.tga",49,49,51,51);
+
+if(life<=0)
+ raydium_osd_mask(blood);
+    
+//raydium_osd_network_stat_draw(5,30,20);
+raydium_osd_logo("logo6.tga");
+memset(raydium_vertex_tag,0,RAYDIUM_MAX_VERTICES);
+raydium_rendering_finish();
+
+//raydium_ode_network_element_send_random(4);
+//raydium_ode_network_element_send_all();
+raydium_ode_network_element_send_iterative(RAYDIUM_ODE_NETWORK_OPTIMAL);
+
+#ifdef ODE_MANUAL_CALLBACK
+{
+int i;
+static int movie_frame=0;
+char movie_str[255];
+for(i=0;i<movie_spf;i++)
+    raydium_ode_callback();
+sprintf(movie_str,"movie/movie%04i.tga",movie_frame);
+if(record==1) raydium_capture_frame(movie_str);
+movie_frame++;
+}
+#endif
+
+}
+
+
+int main(int argc, char **argv)
+{
+char server[128];
+char model[RAYDIUM_MAX_NAME_LEN];
+int i;
+
+raydium_init_args(argc,argv);
+raydium_window_create(640,480,RAYDIUM_RENDERING_WINDOW,version);
+raydium_texture_filter_change(RAYDIUM_TEXTURE_FILTER_TRILINEAR);
+raydium_projection_near=0.05;
+raydium_projection_far=1000;
+raydium_projection_fov=70;
+//raydium_light_disable();
+raydium_fog_disable();
+raydium_light_on(0);
+//raydium_light_on(1);
+memcpy(raydium_light_color[0],sun,raydium_internal_size_vector_float_4);
+//raydium_light_intensity[0]=400;
+raydium_light_intensity[0]=1000000;
+raydium_light_update_all(0);
+
+
+if(raydium_init_cli_option("server",server))
+     if(!raydium_network_client_connect_to(server)) 
+        exit(1);
+
+raydium_sound_DefaultReferenceDistance=4.f;
+
+//son=raydium_sound_LoadWav("../wav/clio/scooter.wav");
+son=raydium_sound_LoadWav("murcielago2.wav");
+raydium_sound_SetSourcePitch(son,0);
+//raydium_sound_SetSourceGain(son,0.05);  // Engine Gain
+raydium_sound_SourcePlay(son);
+
+son_rl=raydium_sound_LoadWav("xf_launch1.wav");
+raydium_sound_SetSourceLoop(son_rl,0);
+
+son_reload=raydium_sound_LoadWav("xf_reload.wav");
+raydium_sound_SetSourceLoop(son_reload,0);
+
+son_paf=raydium_sound_LoadWav("xf_paf.wav");
+raydium_sound_SetSourceLoop(son_paf,0);
+
+son_gun=raydium_sound_LoadWav("xf_gun1.wav");
+raydium_sound_SetSourceLoop(son_gun,0);
+
+for(i=0;i<SOUND_MAX_EXPLOS;i++)
+    {
+    son_boom[i]=raydium_sound_LoadWav(wav_boom[i]);
+    raydium_sound_SetSourceLoop(son_boom[i],0);
+    }
+
+for(i=0;i<SOUND_MAX_BONGS;i++)
+    {
+    son_bong[i]=raydium_sound_LoadWav(wav_bong[i]);
+    raydium_sound_SetSourceLoop(son_bong[i],0);
+    }
+
+//raydium_osd_cursor_set("BOXcursor.tga",4,4);
+strcpy(raydium_console_config_texture,"logo_console.tga");
+raydium_sky_box_cache();
+
+
+strcpy(cam,"invalid_name");
+raydium_register_variable(&sensivity,RAYDIUM_REGISTER_FLOAT,"sensivity");
+raydium_register_variable(&camx,RAYDIUM_REGISTER_FLOAT,"camx");
+raydium_register_variable(&camy,RAYDIUM_REGISTER_FLOAT,"camy");
+raydium_register_variable(&camz,RAYDIUM_REGISTER_FLOAT,"camz");
+raydium_register_variable(cam,RAYDIUM_REGISTER_STR,"cam");
+
+//raydium_register_variable(&ptmp,RAYDIUM_REGISTER_FLOAT,"ptmp");
+raydium_register_variable(&vue,RAYDIUM_REGISTER_INT,"vue");
+raydium_register_function(C2PHP(kill_php),"kill");
+raydium_timecall_add(frame_step,-1);
+
+
+raydium_init_cli_option_default("ground",model,"a.tri");
+raydium_ode_ground_set_name(model);
+
+create_game(1);
+raydium_ode_CollideCallback=collide;
+raydium_ode_ExplosionCallback=boom;
+raydium_ode_StepCallback=step;
+
+//raydium_ode_time_change(0);
+
+raydium_php_exec("test6.php");
+//raydium_sound_load_music("memak5.ogg");
+raydium_sound_load_music("memak5loud.ogg");
+
+raydium_callback(&display);
+return 0;
+}