Index: kartagony/kartagony.jpg
===================================================================
Cannot display: file marked as a binary type.
svn:mime-type = image/jpeg
Index: kartagony/kartagony.jpg
===================================================================
--- kartagony/kartagony.jpg	(revision 666)
+++ kartagony/kartagony.jpg	(revision 667)

Property changes on: kartagony/kartagony.jpg
___________________________________________________________________
Added: svn:mime-type
## -0,0 +1 ##
+image/jpeg
\ No newline at end of property
Index: kartagony/kart_player.c
===================================================================
--- kartagony/kart_player.c	(revision 666)
+++ kartagony/kart_player.c	(revision 667)
@@ -0,0 +1,14 @@
+// Kartagony - Player structures
+
+#define MAX_PLAYERS	32
+
+
+typedef struct Player
+{
+int uid;
+int team;
+    
+} Player;
+
+
+#error NOT USED !
\ No newline at end of file

Property changes on: kartagony/kart_player.c
___________________________________________________________________
Added: svn:eol-style
## -0,0 +1 ##
+native
\ No newline at end of property
Index: kartagony/kartagony.c
===================================================================
--- kartagony/kartagony.c	(revision 666)
+++ kartagony/kartagony.c	(revision 667)
@@ -0,0 +1,427 @@
+// Kartagony - CQFD Corp.
+// Initial release: 2004/Apr/17
+// License: GPL - GNU General Public License, see "raydium/gpl.txt" file.
+
+char *version="version 0.2";
+
+#include "raydium/index.c"
+
+GLfloat sun[]={1.0,0.9,0.5,1.0};
+GLfloat amb[]={1.0,0.0,0.0,1.0};
+
+GLfloat frame_time;
+GLfloat invin_time;
+GLfloat bonusroll_time;
+GLfloat boost_time;
+GLfloat weight_time;
+GLfloat oil_time;
+GLfloat replace_time;
+GLfloat smoke_time;
+int bonus_to_delete;
+int have_bonus;
+char in_game;
+char game_over;
+
+void blow_touched(int elem, dReal force, dReal max_force);
+void rocket_del(int rocket);
+
+#include "kart_conf.c"
+#include "kart_obj.c"
+#include "kart_menu.c"
+#include "kart_sound.c"
+#include "kart_ode.c"
+#include "kart_net.c"
+#include "kart_bonus.c"
+
+void blow_touched(int elem, dReal force, dReal max_force)
+{
+if(invin_time>0) return;
+game_state.scores[menu_team]--;
+raydium_network_propag_refresh(NET_GAME_STATE_BASE+menu_team);
+invin_time=INVINCIBLE_TIME;
+}
+
+
+void explo(char type, dReal radius, dReal force_or_propag, dReal *pos)
+{
+int g1,g2;
+//int i;
+//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);
+g1=raydium_particle_generator_load("explosion.prt","explo");
+g2=raydium_particle_generator_load("explosmoke.prt","explo_smoke");
+
+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 touch_mine(int mine, int kart)
+{
+dReal *pos;
+
+pos=raydium_ode_element_pos_get(mine);
+
+if(raydium_ode_network_element_isdistant(mine))
+	delete_request(mine);
+    else
+	raydium_ode_element_delete(mine,1);
+}
+
+
+void touch_oil(int oil, int kart)
+{
+oil_time=OIL_TIME;
+
+if(raydium_ode_network_element_isdistant(oil))
+	delete_request(oil);
+    else
+	raydium_ode_element_delete(oil,1);
+}
+
+
+void touch_bonus(int bonus, int kart)
+{
+get_bonus();
+
+if(raydium_ode_network_element_isdistant(bonus))
+	delete_request(bonus);
+    else
+//	raydium_ode_element_delete(bonus,1);
+	bonus_to_delete=bonus;
+}
+
+void rocket_del(int rocket)
+{
+if(raydium_ode_network_element_isdistant(rocket))
+	delete_request(rocket);
+    else
+	raydium_ode_element_delete(rocket,1);
+}
+
+char is_kart(int elem)
+{
+int tag;
+
+tag=raydium_ode_element_tag_get(elem);
+if(tag>=TAG_KART && tag<TAG_KART_END)
+    return 1;
+return 0;
+}
+
+char collide(int e1, int e2, dContact *c)
+{
+
+if( raydium_ode_element_tag_get(e1)==TAG_ROCKET &&
+    !raydium_ode_network_element_isdistant(e1) )
+	rocket_del(e1);
+if( raydium_ode_element_tag_get(e2)==TAG_ROCKET &&
+    !raydium_ode_network_element_isdistant(e2) )
+	rocket_del(e2);
+
+if( raydium_ode_element_tag_get(e1)==TAG_MINE &&
+    is_kart(e2) &&
+    !raydium_ode_network_element_isdistant(e2) )
+	    {
+	    touch_mine(e1,e2);
+	    return 0;
+	    }
+
+if( raydium_ode_element_tag_get(e2)==TAG_MINE &&
+    is_kart(e1) &&
+    !raydium_ode_network_element_isdistant(e1) )
+	    {
+	    touch_mine(e2,e1);
+	    return 0;
+	    }
+
+if( raydium_ode_element_tag_get(e1)==TAG_BONUS &&
+    is_kart(e2) &&
+    !have_bonus &&
+    !raydium_ode_network_element_isdistant(e2) )
+	    {
+	    touch_bonus(e1,e2);
+	    return 0;
+	    }
+
+if( raydium_ode_element_tag_get(e2)==TAG_BONUS &&
+    is_kart(e1) &&
+    !have_bonus &&
+    !raydium_ode_network_element_isdistant(e1) )
+	    {
+	    touch_bonus(e2,e1);
+	    return 0;
+	    }
+
+if( raydium_ode_element_tag_get(e1)==TAG_OIL &&
+    is_kart(e2) &&
+    !raydium_ode_network_element_isdistant(e2) )
+	    {
+	    touch_oil(e1,e2);
+	    return 0;
+	    }
+
+if( raydium_ode_element_tag_get(e2)==TAG_OIL &&
+    is_kart(e1) &&
+    !raydium_ode_network_element_isdistant(e1) )
+	    {
+	    touch_oil(e2,e1);
+	    return 0;
+	    }
+
+return 1;
+}
+
+void frame_step(GLfloat step)
+{
+// update timers here
+frame_time=step;
+if(invin_time>0) invin_time-=step;
+bonusroll_time-=step;
+boost_time-=step;
+weight_time-=step;
+oil_time-=step;
+if(raydium_key[GLUT_KEY_HOME])
+    replace_time+=step;
+else
+    replace_time=0;
+}
+
+void start_game(void)
+{
+int i;
+FILE *fp;
+
+if(menu_networked_game)
+    {
+    if(!raydium_network_client_connect_to(menu_server_ip))
+	{
+	menu_main(0);
+	return;
+	}
+    }
+
+fp=fopen("server.last","wt");
+if(fp)
+    {
+    fputs(menu_server_ip,fp);
+    fclose(fp);
+    }
+
+for(i=0;i<4;i++)
+    game_state.scores[i]=DEFAULT_SCORE;
+
+create_kart();
+invin_time=0;
+have_bonus=0;
+boost_time=0;
+weight_time=0;
+oil_time=0;
+replace_time=0;
+in_game=1;
+smoke_time=0;
+game_over=0;
+drop_bonus(0);
+}
+
+
+char draw_element_before(int elem)
+{
+int team;
+
+if(is_kart(elem))
+    {
+    team=raydium_ode_element_tag_get(elem)-TAG_KART;
+    raydium_rendering_rgb_force(TEAM_COL(team));
+    }
+
+return 1; // draw element
+}
+
+void draw_element_after(int elem)
+{
+raydium_rendering_rgb_normal();
+}
+
+
+void draw_game(void)
+{
+dReal speed,direct,accel,slip;
+int i;
+
+if(raydium_key_last==1027)
+    exit(0); // too "hard"
+
+if(raydium_ode_object_find("KART")<0)
+    {
+    in_game=0;
+    raydium_camera_look_at(0.1,0.1,0,0,1,0);
+    raydium_osd_color_ega('f');
+    raydium_osd_draw_name("BOXfront.tga",0,100,100,0);
+    }
+else
+    {
+    in_game=1;
+    
+    raydium_joy_key_emul();
+
+    if(game_over)
+	{
+	raydium_joy_x=raydium_joy_y=raydium_key_last=0;
+	}
+        
+    if(raydium_key_last==1032)
+	bonus_fire();
+
+    if(replace_time>REPLACE_TIME)
+	{
+	create_kart();
+	replace_time=0;
+	}
+
+    speed=direct=0;
+    accel=0.03;
+
+    if(oil_time>0)
+	slip=RAYDIUM_ODE_SLIP_ICE;
+    else
+	slip=RAYDIUM_ODE_SLIP_DEFAULT;
+
+    raydium_ode_element_slip_name("kart_pneu_ag",slip);
+    raydium_ode_element_slip_name("kart_pneu_ad",slip);
+    raydium_ode_element_slip_name("kart_pneu_rg",slip);
+    raydium_ode_element_slip_name("kart_pneu_rd",slip);
+    
+    if(raydium_joy_y>0.3 || raydium_key[GLUT_KEY_INSERT]) // "insert" is a hack
+	{
+        speed=raydium_joy_y*25;
+	if(boost_time>0) 
+	    {
+	    speed*=2;
+	    accel*=2;
+	    }
+
+	if(weight_time>0) 
+	    {
+	    speed/=2;
+	    accel/=2;
+	    }
+	raydium_ode_motor_power_max_name("kart_moteur",accel);
+	raydium_ode_motor_power_max_name("kart_frein",0);
+	}
+    else
+	{
+	raydium_ode_motor_power_max_name("kart_moteur",0);
+	raydium_ode_motor_power_max_name("kart_frein",0.1 * -raydium_joy_y);
+	}
+
+    direct=raydium_joy_x*0.3;
+    
+    if(raydium_key[GLUT_KEY_END])
+	raydium_ode_element_camera_inboard_name("kart_corps",-0.15,0,0.07,-2,0,0);
+    else
+	raydium_ode_element_camera_inboard_name("kart_corps",0,0,0.15,2,0,0);
+
+    raydium_ode_motor_speed_name("kart_moteur",-speed);
+    raydium_ode_motor_angle_name("kart_direction",direct);
+    speed=raydium_ode_motor_speed_get_name("kart_moteur",1);
+    speed*=0.1; // wheel radius
+    speed/=2;
+    speed+=0.5; // lower speed
+    speed=raydium_trigo_abs(speed);
+    if(speed>2) speed=2;
+    raydium_sound_SetSourcePitch(sounds[SOUND_ENGINE],speed);
+    raydium_ode_element_sound_update_name("kart_corps",sounds[SOUND_ENGINE]);
+    
+    raydium_ode_draw_all(0);
+    //raydium_ode_draw_all(1);
+    manage_bonus();
+    
+    // Here, we test scores <=0 !
+    for(i=0;i<4;i++)
+	{
+	raydium_osd_color_change(TEAM_COL(i));
+	if(game_state.scores[i]<=0)
+	    {
+	    raydium_osd_printf(30,60-(i*5),30,0.5,"font2.tga","%s looses !",teams[i].name);
+	    game_over=1;
+	    }
+	}	
+    }
+raydium_ode_network_element_send_iterative(RAYDIUM_ODE_NETWORK_OPTIMAL);
+}
+
+void display(void)
+{
+int i;
+
+raydium_background_color_change(sun[0],sun[1],sun[2],sun[3]);
+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_clear_frame();
+glLoadIdentity();
+
+draw_game();
+
+if(menu) MenuItem_draw();
+
+for(i=0;i<4;i++)
+    {
+    raydium_osd_color_change(TEAM_COL(i));
+    raydium_osd_printf(2,90-(i*5),20,0.5,"font2.tga","%s: %i",teams[i].name,game_state.scores[i]);
+    }    
+
+raydium_osd_printf(90,2,20,0.4,"font2.tga","^c%i FPS",raydium_render_fps);
+//raydium_osd_network_stat_draw(5,5,10);
+raydium_osd_logo("logo.tga");
+raydium_rendering_finish();
+}
+
+int main(int argc, char **argv)
+{
+raydium_init_args(argc,argv);
+raydium_window_create(800,600,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_fog_disable();
+raydium_light_on(0);
+memcpy(raydium_light_color[0],sun,raydium_internal_size_vector_float_4);
+raydium_light_intensity[0]=1000000;
+raydium_light_update_all(0);
+
+memcpy(raydium_light_color[1],amb,raydium_internal_size_vector_float_4);
+raydium_light_intensity[1]=10000;
+raydium_light_update_all(1);
+raydium_window_view_update();
+
+strcpy(raydium_console_config_texture,"logo_console.tga");
+raydium_osd_cursor_set("BOXcursor.tga",4,4);
+raydium_sky_box_cache();
+
+conf_init();
+bonus_init();
+sound_init();
+menu_main(0);
+net_init();
+
+raydium_timecall_add(frame_step,-1);
+raydium_ode_ground_set_name("laby1.tri");
+raydium_ode_CollideCallback=collide;
+raydium_ode_ExplosionCallback=explo;
+raydium_ode_BeforeElementDrawCallback=draw_element_before;
+raydium_ode_AfterElementDrawCallback=draw_element_after;
+
+//raydium_ode_element_slip_name("ground",RAYDIUM_ODE_SLIP_ICE/5.f);
+
+raydium_callback(&display);
+return 0;
+}
+

Property changes on: kartagony/kartagony.c
___________________________________________________________________
Added: svn:eol-style
## -0,0 +1 ##
+native
\ No newline at end of property
Index: kartagony/kart_menu.c
===================================================================
--- kartagony/kart_menu.c	(revision 666)
+++ kartagony/kart_menu.c	(revision 667)
@@ -0,0 +1,489 @@
+// Kartogony - Menu Items
+
+typedef struct MenuItem
+{
+char state;
+char text[RAYDIUM_MAX_NAME_LEN];
+char texture[RAYDIUM_MAX_NAME_LEN];
+void *OnClick; //event
+int  param;
+float px;
+float py;
+float sizex;
+float sizey;
+float text_size;
+float colors[9]; // 3 each, off, on, current
+} MenuItem;
+
+#define MAX_MENU_ITEMS 20
+MenuItem menus[MAX_MENU_ITEMS];
+char menu;
+char menu_server_ip[RAYDIUM_MAX_NAME_LEN];
+char menu_networked_game;;
+int  menu_team;
+
+void MenuItem_init(MenuItem *e)
+{
+e->state=0;
+e->OnClick=NULL;
+}
+
+void MenuItem_colors(MenuItem *e, float off_r, float off_g, float off_b, float on_r, float on_g, float on_b)
+{
+float f[9];
+f[0]=off_r;
+f[1]=off_g;
+f[2]=off_b;
+f[3]=on_r;
+f[4]=on_g;
+f[5]=on_b;
+// current color
+f[6]=off_r;
+f[7]=off_g;
+f[8]=off_b;
+memcpy(e->colors,f,sizeof(float)*9);
+}
+
+void MenuItem_init_all(void)
+{
+int i;
+for(i=0;i<MAX_MENU_ITEMS;i++)
+    MenuItem_init(&menus[i]);
+}
+
+void MenuItem_draw(void)
+{
+int i;
+void (*f)(int);
+float dec;
+
+float mx;
+float my;
+float inc;
+
+mx=(raydium_mouse_x/(raydium_window_tx+0.1))*100;
+my=100-(raydium_mouse_y/(raydium_window_ty+0.1))*100;
+inc=frame_time*4;
+
+for(i=0;i<MAX_MENU_ITEMS;i++)
+    if(menus[i].state)
+	{
+	f=menus[i].OnClick;
+	
+	if(mx>menus[i].px-(menus[i].sizex/2) && mx<menus[i].px+(menus[i].sizex/2) &&
+	   my>menus[i].py-(menus[i].sizey/2) && my<menus[i].py+(menus[i].sizey/2) )
+	   {
+	   // selected
+	   if(menus[i].colors[3]>menus[i].colors[0] && menus[i].colors[6]<menus[i].colors[3])
+		menus[i].colors[6]+=inc;
+	   if(menus[i].colors[0]>menus[i].colors[3] && menus[i].colors[6]>menus[i].colors[3])
+		menus[i].colors[6]-=inc;
+
+	   if(menus[i].colors[4]>menus[i].colors[1] && menus[i].colors[7]<menus[i].colors[4])
+		menus[i].colors[7]+=inc;
+	   if(menus[i].colors[1]>menus[i].colors[4] && menus[i].colors[7]>menus[i].colors[4])
+		menus[i].colors[7]-=inc;
+
+	   if(menus[i].colors[5]>menus[i].colors[2] && menus[i].colors[8]<menus[i].colors[5])
+		menus[i].colors[8]+=inc;
+	   if(menus[i].colors[2]>menus[i].colors[5] && menus[i].colors[8]>menus[i].colors[5])
+		menus[i].colors[8]-=inc;	   
+	   if(raydium_mouse_click==1 && f) 
+	    { 
+	    f(menus[i].param); 
+	    raydium_mouse_click=0;
+//	    return;
+	    }
+	   }
+	   else
+	   {
+	   // not selected
+	   if(menus[i].colors[3]>menus[i].colors[0] && menus[i].colors[6]>menus[i].colors[0])
+		menus[i].colors[6]-=inc;
+	   if(menus[i].colors[0]>menus[i].colors[3] && menus[i].colors[6]<menus[i].colors[0])
+		menus[i].colors[6]+=inc;
+
+	   if(menus[i].colors[4]>menus[i].colors[1] && menus[i].colors[7]>menus[i].colors[1])
+		menus[i].colors[7]-=inc;
+	   if(menus[i].colors[1]>menus[i].colors[4] && menus[i].colors[7]<menus[i].colors[1])
+		menus[i].colors[7]+=inc;
+
+	   if(menus[i].colors[5]>menus[i].colors[2] && menus[i].colors[8]>menus[i].colors[2])
+		menus[i].colors[8]-=inc;
+	   if(menus[i].colors[2]>menus[i].colors[5] && menus[i].colors[8]<menus[i].colors[2])
+		menus[i].colors[8]+=inc;	   
+
+	   }
+	   
+	raydium_osd_color_rgba(menus[i].colors[6],menus[i].colors[7],menus[i].colors[8],1);
+	raydium_osd_draw_name(menus[i].texture,
+			      menus[i].px-(menus[i].sizex/2),
+			      menus[i].py-(menus[i].sizey/2),
+			      menus[i].px+(menus[i].sizex/2),
+			      menus[i].py+(menus[i].sizey/2));
+	dec=strlen(menus[i].text)-2;
+	dec*=(menus[i].text_size/26);
+	raydium_osd_printf(menus[i].px-dec,menus[i].py,menus[i].text_size,0.5,"font2.tga","%s",menus[i].text);
+	}
+}
+
+
+
+/////////////////
+void menu_color(int);
+void menu_ip(int);
+void menu_main(int);
+void menu_game(int);
+void start_game(void);
+///
+
+void menu_number(int num)
+{
+int i;
+i=strlen(menu_server_ip);
+
+if(num==27)
+    {
+    if(i==0) return;
+    menu_server_ip[i-1]=0;
+    }
+else
+    if(i<15)
+    {
+    menu_server_ip[i]=num;
+    menu_server_ip[i+1]=0;
+    }
+sprintf(menus[13].text,"^f%s",menu_server_ip);
+}
+
+void menu_main(int dummy)
+{
+menu_networked_game=0;
+menu=1;
+
+MenuItem_init_all();
+
+// Training
+menus[0].state=1;
+strcpy(menus[0].text,"^fTraining");
+strcpy(menus[0].texture,"aqua.tga");
+menus[0].OnClick=menu_color;
+menus[0].px=50;
+menus[0].py=80;
+menus[0].sizex=30;
+menus[0].sizey=10;
+menus[0].text_size=20;
+MenuItem_colors(&menus[0],0.9,0.2,0.2, 0.2,0.2,0.9);
+
+// Play
+menus[1].state=1;
+strcpy(menus[1].text,"^fNetwork Play");
+strcpy(menus[1].texture,"aqua.tga");
+menus[1].OnClick=menu_ip;
+menus[1].px=50;
+menus[1].py=60;
+menus[1].sizex=30;
+menus[1].sizey=10;
+menus[1].text_size=20;
+MenuItem_colors(&menus[1],0.9,0.2,0.2,0.2,0.2,0.9);
+
+// Quit
+menus[2].state=1;
+strcpy(menus[2].text,"^fQuit");
+strcpy(menus[2].texture,"aqua.tga");
+menus[2].OnClick=exit;
+menus[2].param=0;
+menus[2].px=50;
+menus[2].py=20;
+menus[2].sizex=30;
+menus[2].sizey=10;
+menus[2].text_size=20;
+MenuItem_colors(&menus[2],0.9,0.9,0.9,0.1,0.1,0.1);
+
+}
+
+
+void menu_color(int dummy)
+{
+menu=1;
+
+MenuItem_init_all();
+
+menus[0].state=1;
+strcpy(menus[0].text,"^fRed Team");
+strcpy(menus[0].texture,"aqua.tga");
+menus[0].OnClick=menu_game;
+menus[0].param=0;
+menus[0].px=50;
+menus[0].py=90;
+menus[0].sizex=30;
+menus[0].sizey=10;
+menus[0].text_size=20;
+MenuItem_colors(&menus[0], TEAM_COL2(0), TEAM_COL(0));
+
+menus[1].state=1;
+strcpy(menus[1].text,"^fGreen Team");
+strcpy(menus[1].texture,"aqua.tga");
+menus[1].OnClick=menu_game;
+menus[1].param=1;
+menus[1].px=50;
+menus[1].py=70;
+menus[1].sizex=30;
+menus[1].sizey=10;
+menus[1].text_size=20;
+MenuItem_colors(&menus[1], TEAM_COL2(1), TEAM_COL(1));
+
+menus[2].state=1;
+strcpy(menus[2].text,"^fBlue Team");
+strcpy(menus[2].texture,"aqua.tga");
+menus[2].OnClick=menu_game;
+menus[2].param=2;
+menus[2].px=50;
+menus[2].py=50;
+menus[2].sizex=30;
+menus[2].sizey=10;
+menus[2].text_size=20;
+MenuItem_colors(&menus[2], TEAM_COL2(2), TEAM_COL(2));
+
+menus[3].state=1;
+strcpy(menus[3].text,"^fYellow Team");
+strcpy(menus[3].texture,"aqua.tga");
+menus[3].OnClick=menu_game;
+menus[3].param=3;
+menus[3].px=50;
+menus[3].py=30;
+menus[3].sizex=30;
+menus[3].sizey=10;
+menus[3].text_size=20;
+MenuItem_colors(&menus[3], TEAM_COL2(3), TEAM_COL(3));
+
+menus[4].state=1;
+strcpy(menus[4].text,"^fBACK");
+strcpy(menus[4].texture,"aqua.tga");
+menus[4].OnClick=menu_main;
+menus[4].px=50;
+menus[4].py=10;
+menus[4].sizex=30;
+menus[4].sizey=10;
+menus[4].text_size=25;
+MenuItem_colors(&menus[4],0.1,0.1,0.1, 0.9,0.9,0.9);
+}
+
+void menu_ip(int dummy)
+{
+FILE *fp;
+menu_networked_game=1;
+menu=1;
+
+
+menu_server_ip[0]=0;
+fp=fopen("server.last","rt");
+if(fp)
+    {
+    fgets(menu_server_ip,128,fp);
+    if(strlen(menu_server_ip) && menu_server_ip[strlen(menu_server_ip)-1]=='\n')
+	menu_server_ip[strlen(menu_server_ip)-1]=0;
+    fclose(fp);
+    }
+
+menu_team=dummy;
+
+MenuItem_init_all();
+
+menus[0].state=1;
+strcpy(menus[0].text,"^fServer IP");
+strcpy(menus[0].texture,"aqua.tga");
+menus[0].px=50;
+menus[0].py=90;
+menus[0].sizex=30;
+menus[0].sizey=10;
+menus[0].text_size=20;
+MenuItem_colors(&menus[0],0.6,0.2,0.2, 0.9,0.2,0.2);
+
+menus[1].state=1;
+strcpy(menus[1].text,"^fBACK");
+strcpy(menus[1].texture,"aqua.tga");
+menus[1].OnClick=menu_main;
+menus[1].px=50;
+menus[1].py=10;
+menus[1].sizex=30;
+menus[1].sizey=10;
+menus[1].text_size=25;
+MenuItem_colors(&menus[1],0.1,0.1,0.1, 0.2,0.9,0.2);
+
+menus[2].state=1;
+strcpy(menus[2].text,"^f7");
+strcpy(menus[2].texture,"aquab.tga");
+menus[2].OnClick=menu_number;
+menus[2].param='7';
+menus[2].px=40;
+menus[2].py=75;
+menus[2].sizex=10;
+menus[2].sizey=10;
+menus[2].text_size=20;
+MenuItem_colors(&menus[2],0.9,0.2,0.2, 0.2,0.9,0.2);
+
+menus[3].state=1;
+strcpy(menus[3].text,"^f8");
+strcpy(menus[3].texture,"aquab.tga");
+menus[3].OnClick=menu_number;
+menus[3].param='8';
+menus[3].px=50;
+menus[3].py=75;
+menus[3].sizex=10;
+menus[3].sizey=10;
+menus[3].text_size=20;
+MenuItem_colors(&menus[3],0.9,0.2,0.2, 0.2,0.9,0.2);
+
+menus[4].state=1;
+strcpy(menus[4].text,"^f9");
+strcpy(menus[4].texture,"aquab.tga");
+menus[4].OnClick=menu_number;
+menus[4].param='9';
+menus[4].px=60;
+menus[4].py=75;
+menus[4].sizex=10;
+menus[4].sizey=10;
+menus[4].text_size=20;
+MenuItem_colors(&menus[4],0.9,0.2,0.2, 0.2,0.9,0.2);
+
+menus[5].state=1;
+strcpy(menus[5].text,"^f4");
+strcpy(menus[5].texture,"aquab.tga");
+menus[5].OnClick=menu_number;
+menus[5].param='4';
+menus[5].px=40;
+menus[5].py=65;
+menus[5].sizex=10;
+menus[5].sizey=10;
+menus[5].text_size=20;
+MenuItem_colors(&menus[5],0.9,0.2,0.2, 0.2,0.9,0.2);
+
+menus[6].state=1;
+strcpy(menus[6].text,"^f5");
+strcpy(menus[6].texture,"aquab.tga");
+menus[6].OnClick=menu_number;
+menus[6].param='5';
+menus[6].px=50;
+menus[6].py=65;
+menus[6].sizex=10;
+menus[6].sizey=10;
+menus[6].text_size=20;
+MenuItem_colors(&menus[6],0.9,0.2,0.2, 0.2,0.9,0.2);
+
+menus[7].state=1;
+strcpy(menus[7].text,"^f6");
+strcpy(menus[7].texture,"aquab.tga");
+menus[7].OnClick=menu_number;
+menus[7].param='6';
+menus[7].px=60;
+menus[7].py=65;
+menus[7].sizex=10;
+menus[7].sizey=10;
+menus[7].text_size=20;
+MenuItem_colors(&menus[7],0.9,0.2,0.2, 0.2,0.9,0.2);
+
+menus[8].state=1;
+strcpy(menus[8].text,"^f1");
+strcpy(menus[8].texture,"aquab.tga");
+menus[8].OnClick=menu_number;
+menus[8].param='1';
+menus[8].px=40;
+menus[8].py=55;
+menus[8].sizex=10;
+menus[8].sizey=10;
+menus[8].text_size=20;
+MenuItem_colors(&menus[8],0.9,0.2,0.2, 0.2,0.9,0.2);
+
+menus[9].state=1;
+strcpy(menus[9].text,"^f2");
+strcpy(menus[9].texture,"aquab.tga");
+menus[9].OnClick=menu_number;
+menus[9].param='2';
+menus[9].px=50;
+menus[9].py=55;
+menus[9].sizex=10;
+menus[9].sizey=10;
+menus[9].text_size=20;
+MenuItem_colors(&menus[9],0.9,0.2,0.2, 0.2,0.9,0.2);
+
+menus[10].state=1;
+strcpy(menus[10].text,"^f3");
+strcpy(menus[10].texture,"aquab.tga");
+menus[10].OnClick=menu_number;
+menus[10].param='3';
+menus[10].px=60;
+menus[10].py=55;
+menus[10].sizex=10;
+menus[10].sizey=10;
+menus[10].text_size=20;
+MenuItem_colors(&menus[10],0.9,0.2,0.2, 0.2,0.9,0.2);
+
+menus[11].state=1;
+strcpy(menus[11].text,"^f0");
+strcpy(menus[11].texture,"aquab.tga");
+menus[11].OnClick=menu_number;
+menus[11].param='0';
+menus[11].px=40;
+menus[11].py=45;
+menus[11].sizex=10;
+menus[11].sizey=10;
+menus[11].text_size=20;
+MenuItem_colors(&menus[11],0.9,0.2,0.2, 0.2,0.9,0.2);
+
+
+menus[12].state=1;
+strcpy(menus[12].text,"^f.");
+strcpy(menus[12].texture,"aquab.tga");
+menus[12].OnClick=menu_number;
+menus[12].param='.';
+menus[12].px=60;
+menus[12].py=45;
+menus[12].sizex=10;
+menus[12].sizey=10;
+menus[12].text_size=20;
+MenuItem_colors(&menus[12],0.9,0.2,0.2, 0.2,0.9,0.2);
+
+// Displays IP address
+menus[13].state=1;
+sprintf(menus[13].text,"^f%s",menu_server_ip);
+strcpy(menus[13].texture,"aqua.tga");
+menus[13].px=30;
+menus[13].py=30;
+menus[13].sizex=40;
+menus[13].sizey=10;
+menus[13].text_size=20;
+MenuItem_colors(&menus[13],0.9,0.2,0.2, 0.9,0.2,0.2);
+
+menus[14].state=1;
+strcpy(menus[14].text,"^fdel");
+strcpy(menus[14].texture,"aquab.tga");
+menus[14].OnClick=menu_number;
+menus[14].param=27;
+menus[14].px=50;
+menus[14].py=45;
+menus[14].sizex=10;
+menus[14].sizey=10;
+menus[14].text_size=20;
+MenuItem_colors(&menus[14],0.9,0.2,0.2, 0.2,0.9,0.2);
+
+menus[15].state=1;
+strcpy(menus[15].text,"^fConnect");
+strcpy(menus[15].texture,"aqua.tga");
+menus[15].OnClick=menu_color;
+menus[15].param=dummy;
+menus[15].px=70;
+menus[15].py=30;
+menus[15].sizex=30;
+menus[15].sizey=10;
+menus[15].text_size=20;
+MenuItem_colors(&menus[15],0.9,0.2,0.2, 0.2,0.2,0.9);
+
+}
+
+void menu_game(int team)
+{
+menu_team=team;
+menu=0;
+start_game();
+}

Property changes on: kartagony/kart_menu.c
___________________________________________________________________
Added: svn:eol-style
## -0,0 +1 ##
+native
\ No newline at end of property
Index: kartagony/kart_conf.c
===================================================================
--- kartagony/kart_conf.c	(revision 666)
+++ kartagony/kart_conf.c	(revision 667)
@@ -0,0 +1,55 @@
+// Kartagony - configuration defines
+
+#define DEFAULT_SCORE 		3
+#define BONUSBLINK_FACT		5
+#define JUMP_FORCE		700
+#define ROCKET_SPEED		70
+#define WHEELS_BREAK		0
+
+// all following vars defined in seconds :
+#define INVINCIBLE_TIME		3
+#define BOOST_TIME		5
+#define WEIGHT_TIME		5
+#define OIL_TIME		5
+#define SMOKE_TIME		5
+#define BONUS_TTL		20
+#define BONUSROLL_TIME		4
+#define BONUSBLINK_TIME		2
+#define REPLACE_TIME		3
+
+typedef struct Team
+{
+GLfloat color[3];
+char name[16];
+} Team;
+
+Team teams[4];
+
+#define TEAM_COL(n)  teams[n].color[0],teams[n].color[1],teams[n].color[2]
+#define TEAM_COL2(n) teams[n].color[0]-0.2,teams[n].color[1]-0.2,teams[n].color[2]-0.2
+
+void conf_init(void)
+{
+strcpy(teams[0].name,"Red Team");
+strcpy(teams[1].name,"Green Team");
+strcpy(teams[2].name,"Blue Team");
+strcpy(teams[3].name,"Yellow Team");
+
+teams[0].color[0]=0.9;
+teams[0].color[1]=0.2;
+teams[0].color[2]=0.2;
+
+teams[1].color[0]=0.2;
+teams[1].color[1]=0.9;
+teams[1].color[2]=0.2;
+
+teams[2].color[0]=0.2;
+teams[2].color[1]=0.2;
+teams[2].color[2]=0.9;
+
+teams[3].color[0]=0.9;
+teams[3].color[1]=0.9;
+teams[3].color[2]=0.2;
+
+in_game=0;
+}

Property changes on: kartagony/kart_conf.c
___________________________________________________________________
Added: svn:eol-style
## -0,0 +1 ##
+native
\ No newline at end of property
Index: kartagony/kart_net.c
===================================================================
--- kartagony/kart_net.c	(revision 666)
+++ kartagony/kart_net.c	(revision 667)
@@ -0,0 +1,54 @@
+// Kartagony - network things :)
+
+#define NET_GAME_STATE_T1		(RAYDIUM_NETWORK_PACKET_BASE+1)
+#define NET_GAME_STATE_T2		(RAYDIUM_NETWORK_PACKET_BASE+2)
+#define NET_GAME_STATE_T3		(RAYDIUM_NETWORK_PACKET_BASE+3)
+#define NET_GAME_STATE_T4		(RAYDIUM_NETWORK_PACKET_BASE+4)
+#define NET_GAME_STATE_BASE		NET_GAME_STATE_T1
+
+#define NET_DEL_REQ			(RAYDIUM_NETWORK_PACKET_BASE+5)
+
+
+
+typedef struct GameState
+    {
+    short scores[4];
+    } GameState;
+    
+GameState game_state;
+
+
+void delete_request(int elem)
+{
+char buff[RAYDIUM_NETWORK_PACKET_SIZE];
+int nid;
+
+nid=raydium_ode_element[elem].nid;
+
+memcpy(buff+RAYDIUM_NETWORK_PACKET_OFFSET,&nid,sizeof(int));
+raydium_network_write(NULL,raydium_network_uid,NET_DEL_REQ,buff);
+}
+
+void delete_request_callback(int type, char *buff)
+{
+int nid;
+int elem;
+
+memcpy(&nid,buff+RAYDIUM_NETWORK_PACKET_OFFSET,sizeof(int));
+
+// let's look if this element is one of ours
+elem=raydium_network_nid_element_find(nid);
+
+if(elem>=0 && !raydium_ode_element[elem].distant)
+    raydium_ode_element_delete(elem,1);
+}
+
+void net_init(void)
+{
+raydium_network_propag_add(NET_GAME_STATE_T1,&game_state.scores[0],sizeof(short));
+raydium_network_propag_add(NET_GAME_STATE_T2,&game_state.scores[1],sizeof(short));
+raydium_network_propag_add(NET_GAME_STATE_T3,&game_state.scores[2],sizeof(short));
+raydium_network_propag_add(NET_GAME_STATE_T4,&game_state.scores[3],sizeof(short));
+
+raydium_network_netcall_add(delete_request_callback,NET_DEL_REQ,1);
+}

Property changes on: kartagony/kart_net.c
___________________________________________________________________
Added: svn:eol-style
## -0,0 +1 ##
+native
\ No newline at end of property
Index: kartagony/kart_bonus.c
===================================================================
--- kartagony/kart_bonus.c	(revision 666)
+++ kartagony/kart_bonus.c	(revision 667)
@@ -0,0 +1,273 @@
+// Kartagony - Bonus management
+
+#define MAX_BONUS	7
+
+typedef struct Bonus
+{
+    int  id;
+    char icon[RAYDIUM_MAX_NAME_LEN];
+    char auto_fire;
+    int  priority;
+} Bonus;
+
+Bonus bonus[MAX_BONUS];
+
+
+void bonus_init(void)
+{
+int i;
+
+bonus_to_delete=-1;
+
+strcpy(bonus[0].icon,"BOXhud_boost.tga");
+bonus[0].auto_fire=0;
+bonus[0].priority=6;
+
+strcpy(bonus[1].icon,"BOXhud_oil.tga");
+bonus[1].auto_fire=0;
+bonus[1].priority=6;
+
+strcpy(bonus[2].icon,"BOXhud_jump.tga");
+bonus[2].auto_fire=0;
+bonus[2].priority=6;
+
+strcpy(bonus[3].icon,"BOXhud_life.tga");
+bonus[3].auto_fire=1;
+bonus[3].priority=1;
+
+strcpy(bonus[4].icon,"BOXhud_rocket.tga");
+bonus[4].auto_fire=0;
+bonus[4].priority=4;
+
+strcpy(bonus[5].icon,"BOXhud_weight.tga");
+bonus[5].auto_fire=1;
+bonus[5].priority=4;
+
+strcpy(bonus[6].icon,"BOXhud_mine.tga");
+bonus[6].auto_fire=0;
+bonus[6].priority=6;
+
+/*
+strcpy(bonus[7].icon,"BOXhud_smoke.tga");
+bonus[7].auto_fire=1;
+bonus[7].priority=4;
+*/
+
+for(i=0;i<MAX_BONUS;i++)
+    {
+    bonus[i].id=i;
+    raydium_texture_find_by_name(bonus[i].icon); // force loading
+    }
+}
+
+int explo_OnDelete(int explo)
+{
+dReal *pos;
+pos=raydium_ode_element_pos_get(explo);
+raydium_ode_explosion_blow(1,80,pos);
+return 1;
+}
+
+
+void drop_mine(void)
+{
+char name[RAYDIUM_MAX_NAME_LEN];
+int from;
+dReal *pos;
+
+raydium_ode_name_auto("mine",name);
+from=raydium_ode_object_find("KART");
+raydium_ode_object_box_add(name,from,0.05,RAYDIUM_ODE_AUTODETECT,0,0,RAYDIUM_ODE_STANDARD,TAG_MINE,"mine.tri");
+raydium_ode_element_moveto_name(name,"GLOBAL",1);
+pos=raydium_ode_element_pos_get_name("kart_corps");
+raydium_ode_element_move_name(name,pos);
+raydium_ode_element_OnDelete_name(name,explo_OnDelete);
+}
+
+void drop_oil(void)
+{
+char name[RAYDIUM_MAX_NAME_LEN];
+int from;
+dReal *pos;
+
+raydium_ode_name_auto("oil",name);
+from=raydium_ode_object_find("KART");
+raydium_ode_object_box_add(name,from,1,RAYDIUM_ODE_AUTODETECT,0,0,RAYDIUM_ODE_STANDARD,TAG_OIL,"oil.tri");
+raydium_ode_element_moveto_name(name,"GLOBAL",1);
+pos=raydium_ode_element_pos_get_name("kart_corps");
+raydium_ode_element_move_name(name,pos);
+}
+
+
+int drop_bonus(int dummy)
+{
+// get AABB from ground
+dReal aabb[6];
+dReal pos[3];
+dReal *get;
+char name[64];
+int a,i,tag;
+
+printf("****************\n");
+
+if(!in_game) return 1;
+
+// get "world" (all karts) AABB
+memset(aabb,0,sizeof(dReal)*6);
+for(i=0;i<RAYDIUM_ODE_MAX_ELEMENTS;i++)
+    if(raydium_ode_element_isvalid(i))
+	{	
+	tag=raydium_ode_element_tag_get(i);
+	if(!(tag>=TAG_KART && tag<TAG_KART_END))
+	    continue;
+	
+	get=raydium_ode_element_pos_get(i);
+//	raydium_log("%s: %f %f %f",raydium_ode_element[i].name,get[0],get[1],get[2]);
+	if(get[0]<aabb[0]) aabb[0]=get[0];
+	if(get[0]>aabb[1]) aabb[1]=get[0];
+
+	if(get[1]<aabb[2]) aabb[2]=get[1];
+	if(get[1]>aabb[3]) aabb[3]=get[1];
+
+	if(get[2]<aabb[4]) aabb[4]=get[2];
+	if(get[2]>aabb[5]) aabb[5]=get[2];
+	}
+
+//raydium_log("%f %f | %f %f | %f %f",aabb[0],aabb[1],aabb[2],aabb[3],aabb[4],aabb[5]);
+pos[0]=raydium_random_f(aabb[0],aabb[1]);
+pos[1]=raydium_random_f(aabb[2],aabb[3]);
+pos[2]=aabb[5]+5;
+//raydium_log("%f %f %f",pos[0],pos[1],pos[2]);
+//raydium_log("---");
+
+a=raydium_ode_object_find("GLOBAL");
+raydium_ode_name_auto("bonus",name);
+raydium_ode_object_sphere_add(name,a,0.1,RAYDIUM_ODE_AUTODETECT,RAYDIUM_ODE_STANDARD,TAG_BONUS,"bonus.tri");
+raydium_ode_element_ttl_set_name(name,raydium_ode_get_physics_freq()*BONUS_TTL);
+raydium_ode_element_OnDelete_name(name,drop_bonus);
+raydium_ode_element_move_name(name,pos);
+//printf("Bonus at: %f %f %f\n",pos[0],pos[1],pos[2]);
+return 1; // confirm delete
+}
+
+void get_bonus(void)
+{
+have_bonus=-1;
+bonusroll_time=BONUSROLL_TIME;
+}
+
+
+void bonus_fire(void)
+{
+
+if(have_bonus<=0) return;
+
+if(have_bonus==1) // boost
+    boost_time=BOOST_TIME;    
+
+if(have_bonus==2) // oil
+    drop_oil();
+
+if(have_bonus==3) // jump
+    raydium_ode_launcher_name_3f("kart_corps","kart_corps",0,0,0,JUMP_FORCE);    
+
+if(have_bonus==4) // life
+    {
+    game_state.scores[menu_team]++;
+    raydium_network_propag_refresh(NET_GAME_STATE_BASE+menu_team);
+    }
+
+if(have_bonus==5) // rocket
+    {
+    // launch projectile
+    int a;
+    char name[255];
+    a=raydium_ode_object_find("KART");
+    raydium_ode_name_auto("rocket",name);
+    raydium_ode_object_box_add(name,a,0.1,RAYDIUM_ODE_AUTODETECT,0,0,RAYDIUM_ODE_STANDARD,TAG_ROCKET,"rocket.tri");
+    if(raydium_key[GLUT_KEY_END])
+	raydium_ode_launcher_simple_name_3f(name,"kart_corps",0,-90,0,ROCKET_SPEED);
+    else
+	raydium_ode_launcher_simple_name_3f(name,"kart_corps",0,90,0,ROCKET_SPEED);
+    //raydium_ode_element_rotate_direction_name(name,0);
+    raydium_ode_element_gravity_name(name,0);
+    raydium_ode_element_OnDelete_name(name,explo_OnDelete);
+    raydium_ode_element_ttl_set_name(name,raydium_ode_get_physics_freq()*10); // 10 seconds
+//    raydium_sound_SourcePlay(son_rl);
+//    raydium_ode_element_sound_update_name("tank_tour",son_rl);
+    }
+
+if(have_bonus==6) // weight
+    weight_time=WEIGHT_TIME;    
+
+if(have_bonus==7) // mine
+    drop_mine();    
+
+have_bonus=0;
+}
+
+
+void draw_bonus(int n,float fact)
+{
+    raydium_osd_color_ega('f');
+    raydium_osd_draw_name(bonus[n].icon,50-(5*fact),90-(5*fact),50+(5*fact),90+(5*fact));
+}
+
+void manage_bonus(void)
+{
+
+// quiet a hack, I admit :)
+if(bonus_to_delete!=-1)
+    {
+    raydium_ode_element_delete(bonus_to_delete,1);
+    bonus_to_delete=-1;
+    }
+
+// we must "take" a bonus ?
+if(have_bonus==-1 && bonusroll_time<=0)
+    {
+    int *tableau;
+    int total=0;
+    int i,j,k;
+
+    for(i=0;i<MAX_BONUS;i++)
+	total+=bonus[i].priority;
+    
+    tableau=malloc(total*sizeof(int));
+
+    for(i=0,k=0;i<MAX_BONUS;i++)
+	for(j=0;j<bonus[i].priority;j++,k++)
+	    tableau[k]=i;
+    
+    // must moderate random
+    have_bonus=raydium_random_0_x(total);
+    have_bonus=tableau[have_bonus]+1;
+//    have_bonus=5;
+    free(tableau);
+    }
+
+if(have_bonus==-1)
+    draw_bonus( ((int)(bonusroll_time*10)) % MAX_BONUS ,1);
+
+if(have_bonus>0) 
+    {
+    static float s=1;
+    static char fact=BONUSBLINK_FACT;
+
+    s+=frame_time*fact;
+    if(s>2) fact=-BONUSBLINK_FACT;
+    if(s<1) fact= BONUSBLINK_FACT;
+
+    if(bonusroll_time<-BONUSBLINK_TIME) 
+	{
+	s=1;
+	if(bonus[have_bonus-1].auto_fire)
+	    {
+	    bonus_fire();
+	    return;
+	    }
+	}
+    
+    draw_bonus(have_bonus-1,s);
+    }
+}

Property changes on: kartagony/kart_bonus.c
___________________________________________________________________
Added: svn:eol-style
## -0,0 +1 ##
+native
\ No newline at end of property
Index: kartagony/kart_ode.c
===================================================================
--- kartagony/kart_ode.c	(revision 666)
+++ kartagony/kart_ode.c	(revision 667)
@@ -0,0 +1,78 @@
+// Kartagony - ODE kart creation code
+
+void create_kart(void)
+{
+int a;
+
+#define BREAK_FORCE	150
+#define ROTFRICTION	0.0005
+#define SUSP		0.9,0.1
+
+#define WHEEL_H		-0.05
+#define WHEEL_FX	0.20
+#define WHEEL_FY	0.12
+
+a=raydium_ode_object_delete_name("KART");
+    
+  a=raydium_ode_object_create("KART");
+    raydium_ode_object_box_add("kart_corps",a,1,RAYDIUM_ODE_AUTODETECT,0,0,RAYDIUM_ODE_STANDARD,TAG_KART+menu_team,"kart_batcox.tri");
+    raydium_ode_element_slip_name("kart_corps",RAYDIUM_ODE_SLIP_ICE);
+
+    raydium_ode_element_OnBlow_name("kart_corps",blow_touched);
+
+    raydium_ode_object_sphere_add("kart_pneu_ag",a,0.5,RAYDIUM_ODE_AUTODETECT,RAYDIUM_ODE_STANDARD,TAG_KART+menu_team,"kart_batcox_wheel.tri");
+    raydium_ode_element_rotfriction_name("kart_pneu_ag",ROTFRICTION);
+    raydium_ode_element_move_name_3f("kart_pneu_ag",WHEEL_FX,WHEEL_FY,WHEEL_H);
+    raydium_ode_joint_attach_hinge2_name("kart_suspet_ag","kart_corps","kart_pneu_ag",RAYDIUM_ODE_JOINT_SUSP_DEFAULT_AXES);
+    if(WHEELS_BREAK)
+	raydium_ode_joint_break_force_name("kart_suspet_ag",BREAK_FORCE);
+    raydium_ode_joint_suspension_name("kart_suspet_ag",SUSP);
+
+    raydium_ode_object_sphere_add("kart_pneu_ad",a,0.5,RAYDIUM_ODE_AUTODETECT,RAYDIUM_ODE_STANDARD,TAG_KART+menu_team,"kart_batcox_wheel.tri");
+    raydium_ode_element_rotfriction_name("kart_pneu_ad",ROTFRICTION);
+    raydium_ode_element_move_name_3f("kart_pneu_ad",WHEEL_FX,-WHEEL_FY,WHEEL_H);
+    raydium_ode_joint_attach_hinge2_name("kart_suspet_ad","kart_corps","kart_pneu_ad",RAYDIUM_ODE_JOINT_SUSP_DEFAULT_AXES);
+    if(WHEELS_BREAK)
+	raydium_ode_joint_break_force_name("kart_suspet_ad",BREAK_FORCE);
+    raydium_ode_joint_suspension_name("kart_suspet_ad",SUSP);
+
+    raydium_ode_object_sphere_add("kart_pneu_rg",a,0.5,RAYDIUM_ODE_AUTODETECT,RAYDIUM_ODE_STANDARD,TAG_KART+menu_team,"kart_batcox_wheel.tri");
+    raydium_ode_element_rotfriction_name("kart_pneu_rg",ROTFRICTION);
+    raydium_ode_element_move_name_3f("kart_pneu_rg",-WHEEL_FX,WHEEL_FY,WHEEL_H);
+    raydium_ode_joint_attach_hinge2_name("kart_suspet_rg","kart_corps","kart_pneu_rg",RAYDIUM_ODE_JOINT_SUSP_DEFAULT_AXES);
+    raydium_ode_joint_hinge2_block_name("kart_suspet_rg",1);
+    if(WHEELS_BREAK)
+	raydium_ode_joint_break_force_name("kart_suspet_rg",BREAK_FORCE);
+    raydium_ode_joint_suspension_name("kart_suspet_rg",SUSP);
+
+    raydium_ode_object_sphere_add("kart_pneu_rd",a,0.5,RAYDIUM_ODE_AUTODETECT,RAYDIUM_ODE_STANDARD,TAG_KART+menu_team,"kart_batcox_wheel.tri");
+    raydium_ode_element_rotfriction_name("kart_pneu_rd",ROTFRICTION);
+    raydium_ode_element_move_name_3f("kart_pneu_rd",-WHEEL_FX,-WHEEL_FY,WHEEL_H);
+    raydium_ode_joint_attach_hinge2_name("kart_suspet_rd","kart_corps","kart_pneu_rd",RAYDIUM_ODE_JOINT_SUSP_DEFAULT_AXES);
+    raydium_ode_joint_hinge2_block_name("kart_suspet_rd",1);
+    if(WHEELS_BREAK)
+	raydium_ode_joint_break_force_name("kart_suspet_rd",BREAK_FORCE);
+    raydium_ode_joint_suspension_name("kart_suspet_rd",SUSP);
+    
+    raydium_ode_motor_create("kart_moteur",a,RAYDIUM_ODE_MOTOR_ENGINE);
+    raydium_ode_motor_attach_name("kart_moteur","kart_suspet_rg",1);
+    raydium_ode_motor_attach_name("kart_moteur","kart_suspet_rd",1);
+//    raydium_ode_motor_power_max_name("kart_moteur",0.03);
+//    raydium_ode_motor_gears_set_name("kart_moteur",gears,6);
+//    raydium_ode_motor_gear_change_name("kart_moteur",gear);
+
+    raydium_ode_motor_create("kart_frein",a,RAYDIUM_ODE_MOTOR_ENGINE);
+    raydium_ode_motor_attach_name("kart_frein","kart_suspet_ag",1);
+    raydium_ode_motor_attach_name("kart_frein","kart_suspet_ad",1);
+    
+    raydium_ode_motor_create("kart_direction",a,RAYDIUM_ODE_MOTOR_ANGULAR);
+    raydium_ode_motor_attach_name("kart_direction","kart_suspet_ag",0);
+    raydium_ode_motor_attach_name("kart_direction","kart_suspet_ad",0);
+    raydium_ode_motor_power_max_name("kart_direction",0.2);
+    
+    dReal pos[3]={0,0,1};
+    raydium_ode_object_move(a,pos);
+    
+    raydium_sound_SourcePlay(sounds[SOUND_ENGINE]);
+}
+

Property changes on: kartagony/kart_ode.c
___________________________________________________________________
Added: svn:eol-style
## -0,0 +1 ##
+native
\ No newline at end of property
Index: kartagony/kart_sound.c
===================================================================
--- kartagony/kart_sound.c	(revision 666)
+++ kartagony/kart_sound.c	(revision 667)
@@ -0,0 +1,17 @@
+// Kartagony - sound management
+
+#define SOUND_MAX  1
+
+#define SOUND_ENGINE 0
+
+int sounds[SOUND_MAX];
+
+void sound_init(void)
+{
+raydium_sound_DefaultReferenceDistance=4.f;
+
+//sounds[SOUND_ENGINE]=raydium_sound_LoadWav("scooter2.wav");
+sounds[SOUND_ENGINE]=raydium_sound_LoadWav("scooter2.wav");
+//sounds[SOUND_ENGINE]=raydium_sound_LoadWav("murcielago2.wav");
+raydium_sound_SetSourcePitch(sounds[SOUND_ENGINE],0);
+}

Property changes on: kartagony/kart_sound.c
___________________________________________________________________
Added: svn:eol-style
## -0,0 +1 ##
+native
\ No newline at end of property
Index: kartagony/README.txt
===================================================================
--- kartagony/README.txt	(revision 666)
+++ kartagony/README.txt	(revision 667)
@@ -0,0 +1,9 @@
+Kartagony is a small unreleased, unfinished, multiplayer game, where players 
+drivers small karts and use bonus to kill each others (Team Deathmatch).
+
+The "main" file is kartagony.c (and will include all others).
+
+The game *should* (not tested since a long time) work with the regular
+generic Raydium server (tests.c).
+
+All data *should* be available on official repository, too.

Property changes on: kartagony/README.txt
___________________________________________________________________
Added: svn:eol-style
## -0,0 +1 ##
+native
\ No newline at end of property
Index: kartagony/kart_obj.c
===================================================================
--- kartagony/kart_obj.c	(revision 666)
+++ kartagony/kart_obj.c	(revision 667)
@@ -0,0 +1,11 @@
+// Kartagony - Element tags
+
+#define TAG_KART	1
+//			2
+//			3
+//			4
+#define TAG_KART_END	5
+#define TAG_MINE	20
+#define TAG_OIL		30
+#define TAG_ROCKET	40
+#define TAG_BONUS	50

Property changes on: kartagony/kart_obj.c
___________________________________________________________________
Added: svn:eol-style
## -0,0 +1 ##
+native
\ No newline at end of property
Index: ragdolls/ragdoll2.jpg
===================================================================
Cannot display: file marked as a binary type.
svn:mime-type = image/jpeg
Index: ragdolls/ragdoll2.jpg
===================================================================
--- ragdolls/ragdoll2.jpg	(revision 666)
+++ ragdolls/ragdoll2.jpg	(revision 667)

Property changes on: ragdolls/ragdoll2.jpg
___________________________________________________________________
Added: svn:mime-type
## -0,0 +1 ##
+image/jpeg
\ No newline at end of property
Index: ragdolls/ragdoll2.c
===================================================================
--- ragdolls/ragdoll2.c	(revision 666)
+++ ragdolls/ragdoll2.c	(revision 667)
@@ -0,0 +1,322 @@
+#include "raydium/index.c"
+
+GLfloat cam_angle_x = 0;
+GLfloat cam_angle_y = 90;
+
+GLfloat cam_pos_x = 0;
+GLfloat cam_pos_y = 0;
+GLfloat cam_pos_z = 0;
+
+GLfloat speed = 0.1;
+GLint sensibilite = 3;
+
+GLint lacet = 0;
+
+GLfloat light_color[] = {1.0, 0.9, 0.8, 1.0};
+//    GLfloat back_color[] = {1, 1, 1, 1};
+GLfloat  *back_color=light_color;
+//    GLfloat light_color[] = {0, 0, 0, 1};
+
+
+
+
+
+int create_ragdoll(void)
+{
+#define BONE_BREAK 0
+
+//dReal pos[3];
+int obj;
+int head,body,u_leg,u_leg2,l_leg,l_leg2,u_arm,u_arm2,l_arm,l_arm2;
+int jneck,jfemur,jfemur2,jknee,jknee2,jshoulder,jshoulder2,jelbow,jelbow2;
+int mknees,mtorso,mneck;
+char name[128];
+
+
+//    raydium_ode_object_delete_name("RAGDOLL");
+    raydium_ode_name_auto("RAGDOLL",name);
+    obj=raydium_ode_object_create(name);
+    raydium_ode_name_auto("head",name);
+    head=raydium_ode_object_sphere_add(name,obj,0.1,RAYDIUM_ODE_AUTODETECT,RAYDIUM_ODE_STANDARD,0,"p_head.tri");
+    raydium_ode_element_move_3f(head,5,0,1);
+    
+    raydium_ode_name_auto("body",name);
+    body=raydium_ode_object_box_add(name,obj,0.01,RAYDIUM_ODE_AUTODETECT,0,0,RAYDIUM_ODE_STANDARD,0,"p_body.tri");
+    raydium_ode_element_move_3f(body,5,0,0.66);
+    raydium_ode_name_auto("neck",name);
+    jneck=raydium_ode_joint_attach_hinge(name,body,head,5,0,0.95,RAYDIUM_ODE_JOINT_AXE_X);
+    raydium_ode_joint_hinge_limits(jneck,-1,1);
+    raydium_ode_joint_break_force(jneck,BONE_BREAK);
+//    raydium_ode_joint_delete_callback_name("neck",bone_break);
+
+    raydium_ode_name_auto("u_leg",name);
+    u_leg=raydium_ode_object_box_add(name,obj,0.1,RAYDIUM_ODE_AUTODETECT,0,0,RAYDIUM_ODE_STANDARD,0,"p_u_leg.tri");
+    raydium_ode_element_move_3f(u_leg,4.9,0,0.26);
+    raydium_ode_element_rotate_3f(u_leg,0,-0.2,0);
+    raydium_ode_name_auto("femur",name);
+    jfemur=raydium_ode_joint_attach_hinge(name,body,u_leg,4.9,0,0.42,RAYDIUM_ODE_JOINT_AXE_X);
+    raydium_ode_joint_hinge_limits(jfemur,-1,1);
+    raydium_ode_joint_break_force(jfemur,BONE_BREAK);
+//    raydium_ode_joint_delete_callback_name("femur",bone_break);
+
+    raydium_ode_name_auto("u_leg2",name);
+    u_leg2=raydium_ode_object_box_add(name,obj,0.1,RAYDIUM_ODE_AUTODETECT,0,0,RAYDIUM_ODE_STANDARD,0,"p_u_leg2.tri");
+    raydium_ode_element_move_3f(u_leg2,5.1,0,0.26);
+    raydium_ode_element_rotate_3f(u_leg2,0,0.2,0);
+    raydium_ode_name_auto("femur2",name);
+    jfemur2=raydium_ode_joint_attach_hinge(name,body,u_leg2,5.1,0,0.42,RAYDIUM_ODE_JOINT_AXE_X);
+    raydium_ode_joint_hinge_limits(jfemur2,-1,1);
+    raydium_ode_joint_break_force(jfemur2,BONE_BREAK);
+//    raydium_ode_joint_delete_callback_name("femur2",bone_break);
+
+
+    raydium_ode_name_auto("l_leg",name);
+    l_leg=raydium_ode_object_box_add(name,obj,0.1,RAYDIUM_ODE_AUTODETECT,0,0,RAYDIUM_ODE_STANDARD,0,"p_l_leg.tri");
+    raydium_ode_element_move_3f(l_leg,4.82,-0.02,-0.14);
+    raydium_ode_element_rotate_3f(l_leg,0,-0.1,0);
+    raydium_ode_element_slip(l_leg,RAYDIUM_ODE_SLIP_ICE);
+    raydium_ode_name_auto("knee",name);
+    jknee=raydium_ode_joint_attach_hinge(name,u_leg,l_leg,4.85,0,0.05,RAYDIUM_ODE_JOINT_AXE_X);
+    raydium_ode_joint_hinge_limits(jknee,-2,0);
+    raydium_ode_joint_break_force(jknee,BONE_BREAK);
+//    raydium_ode_joint_delete_callback_name("knee",bone_break);
+
+    raydium_ode_name_auto("u_leg2",name);
+    l_leg2=raydium_ode_object_box_add(name,obj,0.1,RAYDIUM_ODE_AUTODETECT,0,0,RAYDIUM_ODE_STANDARD,0,"p_l_leg2.tri");
+    raydium_ode_element_move_3f(l_leg2,5.18,-0.02,-0.14);
+    raydium_ode_element_rotate_3f(l_leg2,0,0.1,0);
+    raydium_ode_element_slip(l_leg2,RAYDIUM_ODE_SLIP_ICE);
+    raydium_ode_name_auto("knee2",name);
+    jknee2=raydium_ode_joint_attach_hinge(name,u_leg2,l_leg2,5.15,0,0.05,RAYDIUM_ODE_JOINT_AXE_X);
+    raydium_ode_joint_hinge_limits(jknee2,-2,0);
+    raydium_ode_joint_break_force(jknee2,BONE_BREAK);
+//    raydium_ode_joint_delete_callback_name("knee2",bone_break);
+
+    raydium_ode_name_auto("u_arm",name);
+    u_arm=raydium_ode_object_box_add(name,obj,0.1,RAYDIUM_ODE_AUTODETECT,0,0,RAYDIUM_ODE_STANDARD,0,"p_u_arm.tri");
+    raydium_ode_element_move_3f(u_arm,4.83,0,0.73);
+    raydium_ode_element_rotate_3f(u_arm,-0.1,-0.1,0);
+    raydium_ode_name_auto("shoulder",name);
+    jshoulder=raydium_ode_joint_attach_hinge(name,body,u_arm,4.85,0,0.84,RAYDIUM_ODE_JOINT_AXE_X);
+    raydium_ode_joint_break_force(jshoulder,BONE_BREAK);
+//    raydium_ode_joint_delete_callback_name("shoulder",bone_break);
+//    raydium_ode_joint_hinge_limits_name("shoulder",-2,2);
+
+    raydium_ode_name_auto("u_arm2",name);
+    u_arm2=raydium_ode_object_box_add(name,obj,0.1,RAYDIUM_ODE_AUTODETECT,0,0,RAYDIUM_ODE_STANDARD,0,"p_u_arm2.tri");
+    raydium_ode_element_move_3f(u_arm2,5.17,0,0.73);
+    raydium_ode_element_rotate_3f(u_arm2,-0.1,0.1,0);
+    raydium_ode_name_auto("shoulder2",name);
+    jshoulder2=raydium_ode_joint_attach_hinge(name,body,u_arm2,5.15,0,0.84,RAYDIUM_ODE_JOINT_AXE_X);
+    raydium_ode_joint_break_force(jshoulder2,BONE_BREAK);
+//    raydium_ode_joint_delete_callback_name("shoulder2",bone_break);
+//    raydium_ode_joint_hinge_limits_name("shoulder2",-2,2);
+
+    raydium_ode_name_auto("l_arm",name);
+    l_arm=raydium_ode_object_box_add(name,obj,0.1,RAYDIUM_ODE_AUTODETECT,0,0,RAYDIUM_ODE_STANDARD,0,"p_l_arm.tri");
+    raydium_ode_element_move_3f(l_arm,4.80,-0.05,0.45);
+    raydium_ode_element_rotate_3f(l_arm,0.3,0,0);
+    raydium_ode_name_auto("elbow",name);
+    jelbow=raydium_ode_joint_attach_hinge(name,u_arm,l_arm,4.80,0,0.60,RAYDIUM_ODE_JOINT_AXE_X);
+    raydium_ode_joint_hinge_limits(jelbow,0,2);
+    raydium_ode_joint_break_force(jelbow,BONE_BREAK);
+//    raydium_ode_joint_delete_callback_name("elbow",bone_break);
+    
+    raydium_ode_name_auto("l_arm2",name);
+    l_arm2=raydium_ode_object_box_add(name,obj,0.1,RAYDIUM_ODE_AUTODETECT,0,0,RAYDIUM_ODE_STANDARD,0,"p_l_arm2.tri");
+    raydium_ode_element_move_3f(l_arm2,5.20,-0.05,0.45);
+    raydium_ode_element_rotate_3f(l_arm2,0.3,0,0);
+    raydium_ode_name_auto("elbow2",name);
+    jelbow2=raydium_ode_joint_attach_hinge(name,u_arm2,l_arm2,5.20,0,0.60,RAYDIUM_ODE_JOINT_AXE_X);
+    raydium_ode_joint_hinge_limits(jelbow2,0,2);
+    raydium_ode_joint_break_force(jelbow2,BONE_BREAK);
+//    raydium_ode_joint_delete_callback_name("elbow2",bone_break);
+
+
+    raydium_ode_name_auto("knees",name);
+    mknees=raydium_ode_motor_create(name,obj,RAYDIUM_ODE_MOTOR_ANGULAR);
+    raydium_ode_motor_attach(mknees,jknee,0);
+    raydium_ode_motor_attach(mknees,jknee2,0);
+
+    raydium_ode_name_auto("torso",name);
+    mtorso=raydium_ode_motor_create(name,obj,RAYDIUM_ODE_MOTOR_ANGULAR);
+    raydium_ode_motor_attach(mtorso,jfemur,0);
+    raydium_ode_motor_attach(mtorso,jfemur2,0);
+
+    raydium_ode_name_auto("neck",name);
+    mneck=raydium_ode_motor_create(name,obj,RAYDIUM_ODE_MOTOR_ANGULAR);
+    raydium_ode_motor_attach(mneck,jneck,0);
+
+#define MUSCLE_FORCE 0.02
+    raydium_ode_motor_angle(mknees,0);
+    raydium_ode_motor_angle(mtorso,0);
+    raydium_ode_motor_angle(mneck,0);
+    raydium_ode_motor_power_max(mknees,MUSCLE_FORCE);
+    raydium_ode_motor_power_max(mtorso,MUSCLE_FORCE);
+    raydium_ode_motor_power_max(mneck,MUSCLE_FORCE);
+
+//    pos[0]=x;
+//    pos[1]=y;
+//    pos[2]=-0.4;
+//    raydium_ode_object_move(obj,pos);
+
+return obj;
+}
+
+
+void read_world(char *filename)
+{
+FILE *fp;
+int v;
+dReal p[3],r[3];
+char ent[128];
+int id;
+
+fp=raydium_file_fopen(filename,"rt");
+fscanf(fp,"%i\n",&v);
+while(fscanf(fp,"%f %f %f %f %f %f %s\n",&p[0],&p[1],&p[2],&r[0],&r[1],&r[2],ent)!=EOF)
+    {
+    switch(ent[0])
+	{
+	case 'r':
+	    raydium_log("+ ragdoll");
+	    id=create_ragdoll();
+	    raydium_ode_object_move(id,p);
+	    //raydium_ode_object_rotate(id,r);
+	    break;
+	case 'b':
+	    raydium_log("+ crate");
+	    raydium_ode_name_auto("crate",ent);
+	    id=raydium_ode_object_box_add(ent,raydium_ode_object_find("GLOBAL"),0.1,RAYDIUM_ODE_AUTODETECT,0,0,RAYDIUM_ODE_STANDARD,0,"crate.tri");
+	    raydium_ode_element_move(id,p);
+	    //raydium_ode_object_rotate(id,r);
+	    break;
+	case 'g':
+	    raydium_log("+ gaz");
+	    raydium_ode_name_auto("gaz",ent);
+	    id=raydium_ode_object_box_add(ent,raydium_ode_object_find("GLOBAL"),0.1,RAYDIUM_ODE_AUTODETECT,0,0,RAYDIUM_ODE_STANDARD,0,"bombone_gaz.tri");
+	    raydium_ode_element_move(id,p);
+	    //raydium_ode_object_rotate(id,r);
+	    break;
+
+	}
+    }
+
+fclose(fp);
+}
+
+
+void display(void)
+{
+    
+    int delta_x, delta_y;
+    raydium_joy_key_emul();
+
+    cam_pos_z += (raydium_trigo_sin(cam_angle_x+90)*raydium_joy_y*speed*raydium_trigo_sin(90-cam_angle_y));
+    cam_pos_x += (raydium_trigo_cos(cam_angle_x+90)*raydium_joy_y*speed*raydium_trigo_sin(90-cam_angle_y));
+    cam_pos_y += (raydium_trigo_cos(90-cam_angle_y)*speed*raydium_joy_y);
+    
+    cam_pos_x -= (raydium_trigo_cos(cam_angle_x)*raydium_joy_x*speed);
+    cam_pos_z -= (raydium_trigo_sin(cam_angle_x)*raydium_joy_x*speed);
+    
+    if(raydium_key_last==1027)
+	exit(0);
+
+
+    if(raydium_key_last==1)
+	raydium_ode_time_change(10);
+    if(raydium_key_last==2)
+	raydium_ode_time_change(100);
+    if(raydium_key_last==3)
+	{
+	dReal pos[3];
+	char name1[128];
+	char name2[128];
+	int g1,g2;
+	
+	pos[0]=0;
+	pos[1]=0;
+	pos[2]=-0.6;
+	raydium_ode_explosion_blow(4,80,pos);
+                                                                                
+	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);
+	}
+
+//    if(raydium_key_last==1032)
+//	create_ragdoll(0,1);
+
+
+    delta_x = raydium_mouse_x - (raydium_window_tx/2);
+    cam_angle_x += (delta_x*sensibilite*0.1f); 
+
+    delta_y = raydium_mouse_y - (raydium_window_ty/2);
+    cam_angle_y += (delta_y*sensibilite*0.1f); 
+
+    raydium_mouse_move(raydium_window_tx/2, raydium_window_ty/2);
+
+    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_clear_frame();
+    raydium_camera_place(cam_pos_x,cam_pos_y,cam_pos_z,cam_angle_x,cam_angle_y,0);
+    raydium_camera_replace();
+    
+    raydium_ode_draw_all(0);
+//    raydium_ode_draw_all(1);
+
+//    raydium_osd_logo("logo.tga");
+    raydium_rendering_finish();
+    raydium_ode_network_element_send_iterative(RAYDIUM_ODE_NETWORK_OPTIMAL);
+}
+
+
+
+
+int main(int argc, char **argv)
+{
+    char server[128];
+
+    raydium_init_args(argc,argv);
+    
+    // creation de la fenetre et de la scene
+    raydium_window_create(640,480,RAYDIUM_RENDERING_WINDOW,"ragdoll test");
+    raydium_texture_filter=RAYDIUM_TEXTURE_FILTER_TRILINEAR;
+    raydium_projection_near=0.01;
+    raydium_projection_far=2500;
+    raydium_projection_fov=60;
+    raydium_fog_disable();
+    raydium_window_view_update();
+    
+    raydium_light_enable();
+    raydium_light_on(0);
+    memcpy(raydium_light_color[0],light_color,raydium_internal_size_vector_float_4);
+    raydium_light_intensity[0] = 10000000;
+    raydium_light_update_all(0);
+    
+    raydium_shadow_enable();
+    if(raydium_init_cli_option("server",server))
+	if(!raydium_network_client_connect_to(server))
+	    exit(1);
+	     
+//    raydium_osd_cursor_set("BOXcursor.tga",4,4);
+
+    raydium_window_view_update();
+    raydium_background_color_change(back_color[0],back_color[1],back_color[2],back_color[3]);
+
+    raydium_register_variable(&speed, RAYDIUM_REGISTER_FLOAT, "speed");
+
+    raydium_ode_ground_set_name("hangarl.tri");
+    read_world("hangarl.ent");
+    raydium_ode_time_change(0);
+    raydium_callback(&display);
+    return(0);
+}
+// EOF

Property changes on: ragdolls/ragdoll2.c
___________________________________________________________________
Added: svn:eol-style
## -0,0 +1 ##
+native
\ No newline at end of property
Index: ragdolls/ragdoll2f.jpg
===================================================================
Cannot display: file marked as a binary type.
svn:mime-type = image/jpeg
Index: ragdolls/ragdoll2f.jpg
===================================================================
--- ragdolls/ragdoll2f.jpg	(revision 666)
+++ ragdolls/ragdoll2f.jpg	(revision 667)

Property changes on: ragdolls/ragdoll2f.jpg
___________________________________________________________________
Added: svn:mime-type
## -0,0 +1 ##
+image/jpeg
\ No newline at end of property
Index: ragdolls/README.txt
===================================================================
--- ragdolls/README.txt	(revision 666)
+++ ragdolls/README.txt	(revision 667)
@@ -0,0 +1 @@
+Playing with ragdolls. Just for fun :)

Property changes on: ragdolls/README.txt
___________________________________________________________________
Added: svn:eol-style
## -0,0 +1 ##
+native
\ No newline at end of property
Index: ragdolls/ragdoll2f.c
===================================================================
--- ragdolls/ragdoll2f.c	(revision 666)
+++ ragdolls/ragdoll2f.c	(revision 667)
@@ -0,0 +1,318 @@
+#include "raydium/index.c"
+
+GLfloat cam_angle_x = 0;
+GLfloat cam_angle_y = 90;
+
+GLfloat cam_pos_x = 0;
+GLfloat cam_pos_y = 0;
+GLfloat cam_pos_z = 0;
+
+GLfloat speed = 0.1;
+GLint sensibilite = 3;
+
+GLint lacet = 0;
+
+GLfloat light_color[] = {1.0, 0.9, 0.8, 1.0};
+//    GLfloat back_color[] = {1, 1, 1, 1};
+GLfloat  *back_color=light_color;
+//    GLfloat light_color[] = {0, 0, 0, 1};
+
+
+
+
+
+int create_ragdoll(void)
+{
+#define BONE_BREAK 0
+
+//dReal pos[3];
+int obj;
+int head,body,u_leg,u_leg2,l_leg,l_leg2,u_arm,u_arm2,l_arm,l_arm2;
+int jneck,jfemur,jfemur2,jknee,jknee2,jshoulder,jshoulder2,jelbow,jelbow2;
+int mknees,mtorso,mneck;
+char name[128];
+
+
+//    raydium_ode_object_delete_name("RAGDOLL");
+    raydium_ode_name_auto("RAGDOLL",name);
+    obj=raydium_ode_object_create(name);
+    raydium_ode_name_auto("head",name);
+    head=raydium_ode_object_sphere_add(name,obj,0.1,RAYDIUM_ODE_AUTODETECT,RAYDIUM_ODE_STANDARD,0,"p_head.tri");
+    raydium_ode_element_move_3f(head,5,0,1);
+    
+    raydium_ode_name_auto("body",name);
+    body=raydium_ode_object_box_add(name,obj,0.01,RAYDIUM_ODE_AUTODETECT,0,0,RAYDIUM_ODE_STANDARD,0,"p_body.tri");
+    raydium_ode_element_move_3f(body,5,0,0.66);
+    raydium_ode_name_auto("neck",name);
+    jneck=raydium_ode_joint_attach_hinge(name,body,head,5,0,0.95,RAYDIUM_ODE_JOINT_AXE_X);
+    raydium_ode_joint_hinge_limits(jneck,-1,1);
+    raydium_ode_joint_break_force(jneck,BONE_BREAK);
+//    raydium_ode_joint_delete_callback_name("neck",bone_break);
+
+    raydium_ode_name_auto("u_leg",name);
+    u_leg=raydium_ode_object_box_add(name,obj,0.1,RAYDIUM_ODE_AUTODETECT,0,0,RAYDIUM_ODE_STANDARD,0,"p_u_leg.tri");
+    raydium_ode_element_move_3f(u_leg,4.9,0,0.26);
+    raydium_ode_element_rotate_3f(u_leg,0,-0.2,0);
+    raydium_ode_name_auto("femur",name);
+    jfemur=raydium_ode_joint_attach_hinge(name,body,u_leg,4.9,0,0.42,RAYDIUM_ODE_JOINT_AXE_X);
+    raydium_ode_joint_hinge_limits(jfemur,-1,1);
+    raydium_ode_joint_break_force(jfemur,BONE_BREAK);
+//    raydium_ode_joint_delete_callback_name("femur",bone_break);
+
+    raydium_ode_name_auto("u_leg2",name);
+    u_leg2=raydium_ode_object_box_add(name,obj,0.1,RAYDIUM_ODE_AUTODETECT,0,0,RAYDIUM_ODE_STANDARD,0,"p_u_leg2.tri");
+    raydium_ode_element_move_3f(u_leg2,5.1,0,0.26);
+    raydium_ode_element_rotate_3f(u_leg2,0,0.2,0);
+    raydium_ode_name_auto("femur2",name);
+    jfemur2=raydium_ode_joint_attach_hinge(name,body,u_leg2,5.1,0,0.42,RAYDIUM_ODE_JOINT_AXE_X);
+    raydium_ode_joint_hinge_limits(jfemur2,-1,1);
+    raydium_ode_joint_break_force(jfemur2,BONE_BREAK);
+//    raydium_ode_joint_delete_callback_name("femur2",bone_break);
+
+
+    raydium_ode_name_auto("l_leg",name);
+    l_leg=raydium_ode_object_box_add(name,obj,0.1,RAYDIUM_ODE_AUTODETECT,0,0,RAYDIUM_ODE_STANDARD,0,"p_l_leg.tri");
+    raydium_ode_element_move_3f(l_leg,4.82,-0.02,-0.14);
+    raydium_ode_element_rotate_3f(l_leg,0,-0.1,0);
+    raydium_ode_name_auto("knee",name);
+    jknee=raydium_ode_joint_attach_hinge(name,u_leg,l_leg,4.85,0,0.05,RAYDIUM_ODE_JOINT_AXE_X);
+    raydium_ode_joint_hinge_limits(jknee,-2,0);
+    raydium_ode_joint_break_force(jknee,BONE_BREAK);
+//    raydium_ode_joint_delete_callback_name("knee",bone_break);
+
+    raydium_ode_name_auto("u_leg2",name);
+    l_leg2=raydium_ode_object_box_add(name,obj,0.1,RAYDIUM_ODE_AUTODETECT,0,0,RAYDIUM_ODE_STANDARD,0,"p_l_leg2.tri");
+    raydium_ode_element_move_3f(l_leg2,5.18,-0.02,-0.14);
+    raydium_ode_element_rotate_3f(l_leg2,0,0.1,0);
+    raydium_ode_name_auto("knee2",name);
+    jknee2=raydium_ode_joint_attach_hinge(name,u_leg2,l_leg2,5.15,0,0.05,RAYDIUM_ODE_JOINT_AXE_X);
+    raydium_ode_joint_hinge_limits(jknee2,-2,0);
+    raydium_ode_joint_break_force(jknee2,BONE_BREAK);
+//    raydium_ode_joint_delete_callback_name("knee2",bone_break);
+
+    raydium_ode_name_auto("u_arm",name);
+    u_arm=raydium_ode_object_box_add(name,obj,0.1,RAYDIUM_ODE_AUTODETECT,0,0,RAYDIUM_ODE_STANDARD,0,"p_u_arm.tri");
+    raydium_ode_element_move_3f(u_arm,4.83,0,0.73);
+    raydium_ode_element_rotate_3f(u_arm,-0.1,-0.1,0);
+    raydium_ode_name_auto("shoulder",name);
+    jshoulder=raydium_ode_joint_attach_hinge(name,body,u_arm,4.85,0,0.84,RAYDIUM_ODE_JOINT_AXE_X);
+    raydium_ode_joint_break_force(jshoulder,BONE_BREAK);
+//    raydium_ode_joint_delete_callback_name("shoulder",bone_break);
+//    raydium_ode_joint_hinge_limits_name("shoulder",-2,2);
+
+    raydium_ode_name_auto("u_arm2",name);
+    u_arm2=raydium_ode_object_box_add(name,obj,0.1,RAYDIUM_ODE_AUTODETECT,0,0,RAYDIUM_ODE_STANDARD,0,"p_u_arm2.tri");
+    raydium_ode_element_move_3f(u_arm2,5.17,0,0.73);
+    raydium_ode_element_rotate_3f(u_arm2,-0.1,0.1,0);
+    raydium_ode_name_auto("shoulder2",name);
+    jshoulder2=raydium_ode_joint_attach_hinge(name,body,u_arm2,5.15,0,0.84,RAYDIUM_ODE_JOINT_AXE_X);
+    raydium_ode_joint_break_force(jshoulder2,BONE_BREAK);
+//    raydium_ode_joint_delete_callback_name("shoulder2",bone_break);
+//    raydium_ode_joint_hinge_limits_name("shoulder2",-2,2);
+
+    raydium_ode_name_auto("l_arm",name);
+    l_arm=raydium_ode_object_box_add(name,obj,0.1,RAYDIUM_ODE_AUTODETECT,0,0,RAYDIUM_ODE_STANDARD,0,"p_l_arm.tri");
+    raydium_ode_element_move_3f(l_arm,4.80,-0.05,0.45);
+    raydium_ode_element_rotate_3f(l_arm,0.3,0,0);
+    raydium_ode_name_auto("elbow",name);
+    jelbow=raydium_ode_joint_attach_hinge(name,u_arm,l_arm,4.80,0,0.60,RAYDIUM_ODE_JOINT_AXE_X);
+    raydium_ode_joint_hinge_limits(jelbow,0,2);
+    raydium_ode_joint_break_force(jelbow,BONE_BREAK);
+//    raydium_ode_joint_delete_callback_name("elbow",bone_break);
+    
+    raydium_ode_name_auto("l_arm2",name);
+    l_arm2=raydium_ode_object_box_add(name,obj,0.1,RAYDIUM_ODE_AUTODETECT,0,0,RAYDIUM_ODE_STANDARD,0,"p_l_arm2.tri");
+    raydium_ode_element_move_3f(l_arm2,5.20,-0.05,0.45);
+    raydium_ode_element_rotate_3f(l_arm2,0.3,0,0);
+    raydium_ode_name_auto("elbow2",name);
+    jelbow2=raydium_ode_joint_attach_hinge(name,u_arm2,l_arm2,5.20,0,0.60,RAYDIUM_ODE_JOINT_AXE_X);
+    raydium_ode_joint_hinge_limits(jelbow2,0,2);
+    raydium_ode_joint_break_force(jelbow2,BONE_BREAK);
+//    raydium_ode_joint_delete_callback_name("elbow2",bone_break);
+
+
+    raydium_ode_name_auto("knees",name);
+    mknees=raydium_ode_motor_create(name,obj,RAYDIUM_ODE_MOTOR_ANGULAR);
+    raydium_ode_motor_attach(mknees,jknee,0);
+    raydium_ode_motor_attach(mknees,jknee2,0);
+
+    raydium_ode_name_auto("torso",name);
+    mtorso=raydium_ode_motor_create(name,obj,RAYDIUM_ODE_MOTOR_ANGULAR);
+    raydium_ode_motor_attach(mtorso,jfemur,0);
+    raydium_ode_motor_attach(mtorso,jfemur2,0);
+
+    raydium_ode_name_auto("neck",name);
+    mneck=raydium_ode_motor_create(name,obj,RAYDIUM_ODE_MOTOR_ANGULAR);
+    raydium_ode_motor_attach(mneck,jneck,0);
+
+#define MUSCLE_FORCE 0.02
+    raydium_ode_motor_angle(mknees,0);
+    raydium_ode_motor_angle(mtorso,0);
+    raydium_ode_motor_angle(mneck,0);
+    raydium_ode_motor_power_max(mknees,MUSCLE_FORCE);
+    raydium_ode_motor_power_max(mtorso,MUSCLE_FORCE);
+    raydium_ode_motor_power_max(mneck,MUSCLE_FORCE);
+
+//    pos[0]=x;
+//    pos[1]=y;
+//    pos[2]=-0.4;
+//    raydium_ode_object_move(obj,pos);
+
+raydium_ode_element_slip_name("ground",RAYDIUM_ODE_SLIP_ICE);
+
+
+return obj;
+}
+
+
+
+
+void read_world(char *filename)
+{
+FILE *fp;
+int v;
+dReal p[3],r[3];
+char ent[128];
+int id;
+
+fp=raydium_file_fopen(filename,"rt");
+fscanf(fp,"%i\n",&v);
+while(fscanf(fp,"%f %f %f %f %f %f %s\n",&p[0],&p[1],&p[2],&r[0],&r[1],&r[2],ent)!=EOF)
+    {
+    switch(ent[0])
+	{
+	case 'r':
+	    raydium_log("+ ragdoll");
+	    id=create_ragdoll();
+	    raydium_ode_object_move(id,p);
+	    //raydium_ode_object_rotate(id,r);
+	    break;
+	case 'b':
+	    raydium_log("+ crate");
+	    raydium_ode_name_auto("crate",ent);
+	    id=raydium_ode_object_box_add(ent,raydium_ode_object_find("GLOBAL"),0.1,RAYDIUM_ODE_AUTODETECT,0,0,RAYDIUM_ODE_STANDARD,0,"crate.tri");
+	    raydium_ode_element_move(id,p);
+	    //raydium_ode_object_rotate(id,r);
+	    break;
+	case 'g':
+	    raydium_log("+ gaz");
+	    raydium_ode_name_auto("gaz",ent);
+	    id=raydium_ode_object_box_add(ent,raydium_ode_object_find("GLOBAL"),0.1,RAYDIUM_ODE_AUTODETECT,0,0,RAYDIUM_ODE_STANDARD,0,"bombone_gaz.tri");
+	    raydium_ode_element_move(id,p);
+	    //raydium_ode_object_rotate(id,r);
+	    break;
+
+	}
+    }
+
+fclose(fp);
+}
+
+
+void display(void)
+{
+    
+    int delta_x, delta_y;
+    raydium_joy_key_emul();
+
+    cam_pos_z += (raydium_trigo_sin(cam_angle_x+90)*raydium_joy_y*speed*raydium_trigo_sin(90-cam_angle_y));
+    cam_pos_x += (raydium_trigo_cos(cam_angle_x+90)*raydium_joy_y*speed*raydium_trigo_sin(90-cam_angle_y));
+    cam_pos_y += (raydium_trigo_cos(90-cam_angle_y)*speed*raydium_joy_y);
+    
+    cam_pos_x -= (raydium_trigo_cos(cam_angle_x)*raydium_joy_x*speed);
+    cam_pos_z -= (raydium_trigo_sin(cam_angle_x)*raydium_joy_x*speed);
+    
+    if(raydium_key_last==1027)
+	exit(0);
+
+
+    if(raydium_key_last==1)
+	raydium_ode_time_change(10);
+    if(raydium_key_last==2)
+	raydium_ode_time_change(100);
+    if(raydium_key_last==3)
+	{
+	dReal pos[3];
+	char name1[128];
+	char name2[128];
+	int g1,g2;
+	
+	pos[0]=0;
+	pos[1]=0;
+	pos[2]=-0.6;
+	raydium_ode_explosion_blow(4,20,pos);
+                                                                                
+	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);
+	}
+
+//    if(raydium_key_last==1032)
+//	create_ragdoll(0,1);
+
+
+    delta_x = raydium_mouse_x - (raydium_window_tx/2);
+    cam_angle_x += (delta_x*sensibilite*0.1f); 
+
+    delta_y = raydium_mouse_y - (raydium_window_ty/2);
+    cam_angle_y += (delta_y*sensibilite*0.1f); 
+
+    raydium_mouse_move(raydium_window_tx/2, raydium_window_ty/2);
+
+    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_clear_frame();
+    raydium_camera_place(cam_pos_x,cam_pos_y,cam_pos_z,cam_angle_x,cam_angle_y,0);
+    raydium_camera_replace();
+    
+    raydium_ode_draw_all(0);
+//    raydium_ode_draw_all(1);
+
+//    raydium_osd_logo("logo.tga");
+    raydium_rendering_finish();
+}
+
+
+
+
+int main(int argc, char **argv)
+{
+    raydium_init_args(argc,argv);
+    
+    // creation de la fenetre et de la scene
+    raydium_window_create(640,480,RAYDIUM_RENDERING_WINDOW,"ragdoll test");
+    raydium_texture_filter=RAYDIUM_TEXTURE_FILTER_TRILINEAR;
+    raydium_projection_near=0.01;
+    raydium_projection_far=2500;
+    raydium_projection_fov=60;
+    raydium_fog_disable();
+    raydium_window_view_update();
+    
+    raydium_light_enable();
+    raydium_light_on(0);
+    memcpy(raydium_light_color[0],light_color,raydium_internal_size_vector_float_4);
+    raydium_light_intensity[0] = 10000000;
+    raydium_light_update_all(0);
+
+    raydium_shadow_enable();    
+//    raydium_osd_cursor_set("BOXcursor.tga",4,4);
+
+    raydium_window_view_update();
+    raydium_background_color_change(back_color[0],back_color[1],back_color[2],back_color[3]);
+
+    raydium_register_variable(&speed, RAYDIUM_REGISTER_FLOAT, "speed");
+
+    raydium_ode_ground_set_name("fall2.tri");
+    read_world("fall2.ent");
+    raydium_ode_time_change(0);
+    raydium_callback(&display);
+    return(0);
+}
+// EOF

Property changes on: ragdolls/ragdoll2f.c
___________________________________________________________________
Added: svn:eol-style
## -0,0 +1 ##
+native
\ No newline at end of property
Index: shaders/shader_water.jpg
===================================================================
Cannot display: file marked as a binary type.
svn:mime-type = image/jpeg
Index: shaders/shader_water.jpg
===================================================================
--- shaders/shader_water.jpg	(revision 666)
+++ shaders/shader_water.jpg	(revision 667)

Property changes on: shaders/shader_water.jpg
___________________________________________________________________
Added: svn:mime-type
## -0,0 +1 ##
+image/jpeg
\ No newline at end of property
Index: shaders/shader_water.c
===================================================================
--- shaders/shader_water.c	(revision 666)
+++ shaders/shader_water.c	(revision 667)
@@ -0,0 +1,306 @@
+/*
+    Raydium - CQFD Corp.
+    http://raydium.org/
+    Released under both BSD license and Lesser GPL library license.
+    See "license.txt" file.
+*/
+
+#define NO_ODE_SUPPORT
+#include "raydium/index.c"
+
+//#define CAM_FILE "water_cam1.cam"
+#define CAM_FILE "cam.cam"
+
+GLfloat cam_angle_x = 0;
+GLfloat cam_angle_y = 90;
+
+GLfloat cam_pos_x = 0;
+GLfloat cam_pos_y = 0;
+GLfloat cam_pos_z = 0;
+
+GLfloat speed = 0.1;
+GLint sensibilite = 3;
+
+GLint lacet = 0;
+
+GLint water_textures_size;
+GLfloat water_height=-0.5;
+float water_color[4]={0.5f, 0.6f, 0.6f, 1.0f};
+
+const float kNormalMapScale = 0.25f;
+float g_WaterFlow = 0.12f;
+float g_WaterUV = 35.0f;
+
+char model[RAYDIUM_MAX_NAME_LEN];
+
+GLfloat light_color[] = {1.0, 0.9, 0.8, 1.0};
+GLfloat  *back_color=light_color;
+
+void display(void)
+{
+    double plane_reflection[4] = {0.0, 0.0, 1.0, -water_height};
+    static GLfloat secs=0;
+
+    int delta_x, delta_y;
+    raydium_joy_key_emul();
+
+    cam_pos_z += (raydium_trigo_sin(cam_angle_x+90)*raydium_joy_y*speed*raydium_trigo_sin(90-cam_angle_y));
+    cam_pos_x += (raydium_trigo_cos(cam_angle_x+90)*raydium_joy_y*speed*raydium_trigo_sin(90-cam_angle_y));
+    cam_pos_y += (raydium_trigo_cos(90-cam_angle_y)*speed*raydium_joy_y);
+    
+    cam_pos_x -= (raydium_trigo_cos(cam_angle_x)*raydium_joy_x*speed);
+    cam_pos_z -= (raydium_trigo_sin(cam_angle_x)*raydium_joy_x*speed);
+    
+    if(raydium_key_last==1027)
+	exit(0);
+
+//    if(raydium_key_last==1032)
+//        raydium_capture_frame_auto();
+
+    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(); }
+
+    if(raydium_key_last==3)
+	raydium_light_disable();
+    if(raydium_key_last==4)
+	raydium_light_enable();
+
+    
+    delta_x = raydium_mouse_x - (raydium_window_tx/2);
+    cam_angle_x += (delta_x*sensibilite*0.1f); 
+
+    delta_y = raydium_mouse_y - (raydium_window_ty/2);
+    cam_angle_y += (delta_y*sensibilite*0.1f); 
+
+    raydium_mouse_move(raydium_window_tx/2, raydium_window_ty/2);
+    
+    if(raydium_key_last==5)
+        raydium_light_position[0][2]=100;
+    if(raydium_key_last==6)
+        raydium_light_position[0][2]=200;
+    if(raydium_key_last==7)
+        raydium_light_position[0][2]=300;
+    
+    secs+=raydium_frame_time/2;
+
+    raydium_clear_frame();
+    
+    raydium_camera_place(cam_pos_x,cam_pos_y,cam_pos_z,cam_angle_x,cam_angle_y,0);
+//    raydium_camera_smooth_path_to_path(CAM_FILE,secs,CAM_FILE,secs+1,raydium_frame_time*2);
+    raydium_shader_var_4f_name("water","cameraPos",raydium_camera_x,raydium_camera_y,raydium_camera_z,1.0f);
+    raydium_shader_var_4f_name("water","lightPos",raydium_light_position[0][0],raydium_light_position[0][1],raydium_light_position[0][2],1.0f);
+
+/////////////////////////////////////////////
+// create reflection
+glViewport(0,0, water_textures_size, water_textures_size);
+raydium_sky_box_render(raydium_camera_x,raydium_camera_y,raydium_camera_z);// glClear ok ...
+raydium_camera_replace();
+glTranslatef(0.0f, 0.0f, water_height*2.0f);
+glScalef(1.0, 1.0, -1.0);
+glPushMatrix();
+{
+float a,b,c;
+
+a=raydium_light_position[0][0];
+b=raydium_light_position[0][1];
+c=raydium_light_position[0][2];
+raydium_light_position[0][0]*=-1;
+raydium_light_position[0][1]*=-1;
+raydium_light_update_position_all();
+
+glEnable(GL_CLIP_PLANE0);
+glClipPlane(GL_CLIP_PLANE0, plane_reflection);
+raydium_object_draw_name(model);
+raydium_light_position[0][0]=a;
+raydium_light_position[0][1]=b;
+raydium_light_position[0][2]=c;
+}
+raydium_particle_draw_all();
+glDisable(GL_CLIP_PLANE0);
+glPopMatrix();
+glBindTexture(GL_TEXTURE_2D,raydium_texture_find_by_name("reflection"));
+glCopyTexSubImage2D(GL_TEXTURE_2D,0, 0,0, 0,0, water_textures_size, water_textures_size);
+raydium_rendering_internal_restore_render_state();
+
+
+/////////////////////////////////////////////
+// create refraction
+glClear(GL_COLOR_BUFFER_BIT | GL_DEPTH_BUFFER_BIT | GL_STENCIL_BUFFER_BIT);
+glViewport(0,0, water_textures_size, water_textures_size);
+raydium_camera_replace();
+raydium_light_update_position_all();
+
+{
+float zero[]={0,0,0,0};
+glEnable(GL_FOG);
+glFogf(GL_FOG_START,0.1);
+glFogf(GL_FOG_END,2);
+glFogi(GL_FOG_MODE,GL_LINEAR);
+glFogfv(GL_FOG_COLOR,zero);
+raydium_fog_volumetric_enable();
+}
+
+raydium_object_draw_name(model);
+glBindTexture(GL_TEXTURE_2D,raydium_texture_find_by_name("refraction"));
+glCopyTexSubImage2D(GL_TEXTURE_2D,0, 0,0, 0,0, water_textures_size, water_textures_size);
+raydium_fog_volumetric_disable();
+raydium_fog_apply();
+raydium_rendering_internal_restore_render_state();
+
+
+/////////////////////////////////////////////
+// regular rendering
+glViewport(0, 0, raydium_window_tx, raydium_window_ty);
+glClear(GL_COLOR_BUFFER_BIT | GL_DEPTH_BUFFER_BIT | GL_STENCIL_BUFFER_BIT);
+raydium_sky_box_render(raydium_camera_x,raydium_camera_y,raydium_camera_z);
+raydium_camera_replace();
+raydium_object_draw_name(model);
+raydium_rendering_internal_restore_render_state();
+
+
+/////////////////////////////////////////////
+// rendering water
+// prepare texunits
+raydium_rendering_prepare_texture_unit(GL_TEXTURE0_ARB,raydium_texture_find_by_name("reflection"));
+raydium_rendering_prepare_texture_unit(GL_TEXTURE1_ARB,raydium_texture_find_by_name("refraction"));
+raydium_rendering_prepare_texture_unit(GL_TEXTURE2_ARB,raydium_texture_find_by_name("water_nmap_0.tga"));
+raydium_rendering_prepare_texture_unit(GL_TEXTURE3_ARB,raydium_texture_find_by_name("water_dudvmap_0.tga"));
+// activate shader
+raydium_shader_current_name("water");
+// draw quad
+{
+// Create a static variable for the movement of the water
+static float move = 0.0f;
+
+// Use this variable for the normal map and make it slower
+// than the refraction map's speed.  We want the refraction
+// map to be jittery, but not the normal map's waviness.
+float move2 = move * kNormalMapScale;
+
+// Set the refraction map's UV coordinates to our global g_WaterUV
+float refrUV = g_WaterUV;
+
+// Set our normal map's UV scale and shrink it by kNormalMapScale
+float normalUV = g_WaterUV * kNormalMapScale;
+
+float low=-100;
+float high=100;
+
+// Move the water by our global speed
+//printf("%f\n",raydium_frame_time);
+move += (g_WaterFlow*raydium_frame_time);
+        
+glBegin(GL_QUADS);
+
+// The back left vertice for the water
+ glMultiTexCoord2fARB(GL_TEXTURE0_ARB, 0.0f, g_WaterUV);				// Reflection texture				
+ glMultiTexCoord2fARB(GL_TEXTURE1_ARB, 0.0f, refrUV - move);			// Refraction texture
+ glMultiTexCoord2fARB(GL_TEXTURE2_ARB, 0.0f, normalUV + move2);		// Normal map texture
+ glMultiTexCoord2fARB(GL_TEXTURE3_ARB, 0, 0);						// DUDV map texture
+ glMultiTexCoord2fARB(GL_TEXTURE4_ARB, 0, 0);						// Depth texture
+ glVertex3f(low, low, water_height);
+
+// The front left vertice for the water
+ glMultiTexCoord2fARB(GL_TEXTURE0_ARB, 0.0f, 0.0f);					// Reflection texture
+ glMultiTexCoord2fARB(GL_TEXTURE1_ARB, 0.0f, 0.0f - move);			// Refraction texture
+ glMultiTexCoord2fARB(GL_TEXTURE2_ARB, 0.0f, 0.0f + move2);			// Normal map texture
+ glMultiTexCoord2fARB(GL_TEXTURE3_ARB, 0, 0);						// DUDV map texture
+ glMultiTexCoord2fARB(GL_TEXTURE4_ARB, 0, 0);						// Depth texture
+ glVertex3f(low, high, water_height);
+
+// The front right vertice for the water
+ glMultiTexCoord2fARB(GL_TEXTURE0_ARB, g_WaterUV, 0.0f);				// Reflection texture
+ glMultiTexCoord2fARB(GL_TEXTURE1_ARB, refrUV, 0.0f - move);			// Refraction texture
+ glMultiTexCoord2fARB(GL_TEXTURE2_ARB, normalUV, 0.0f + move2);		// Normal map texture
+ glMultiTexCoord2fARB(GL_TEXTURE3_ARB, 0, 0);						// DUDV map texture
+ glMultiTexCoord2fARB(GL_TEXTURE4_ARB, 0, 0);						// Depth texture
+ glVertex3f(high, high, water_height);
+
+// The back right vertice for the water
+ glMultiTexCoord2fARB(GL_TEXTURE0_ARB, g_WaterUV, g_WaterUV);		// Reflection texture
+ glMultiTexCoord2fARB(GL_TEXTURE1_ARB, refrUV, refrUV - move);		// Refraction texture
+ glMultiTexCoord2fARB(GL_TEXTURE2_ARB, normalUV, normalUV + move2);	// Normal map texture
+ glMultiTexCoord2fARB(GL_TEXTURE3_ARB, 0, 0);						// DUDV map texture
+ glMultiTexCoord2fARB(GL_TEXTURE4_ARB, 0, 0);						// Depth texture
+ glVertex3f(high, low, water_height);
+
+glEnd();
+}
+
+raydium_shader_current(-1);
+
+raydium_rendering_prepare_texture_unit(GL_TEXTURE0_ARB,0);
+raydium_rendering_prepare_texture_unit(GL_TEXTURE1_ARB,0);
+raydium_rendering_prepare_texture_unit(GL_TEXTURE2_ARB,0);
+raydium_rendering_prepare_texture_unit(GL_TEXTURE3_ARB,0);
+
+if(raydium_key[GLUT_KEY_F12])
+    {
+    raydium_osd_draw_name("reflection",0,0,20,20);
+    raydium_osd_draw_name("refraction",80,0,100,20);
+    }
+
+
+raydium_rendering_finish();
+}
+
+
+
+
+int main(int argc, char **argv)
+{
+    int tmp;
+    raydium_init_args(argc,argv);
+    
+    // window creation
+    raydium_window_create(800,600,RAYDIUM_RENDERING_WINDOW,"willou.c based water shader effect");
+    raydium_texture_filter=RAYDIUM_TEXTURE_FILTER_TRILINEAR;
+    raydium_projection_near=0.01;
+    raydium_projection_far=2500;
+    raydium_projection_fov=60;
+    raydium_fog_disable();
+    raydium_fog_volumetric_support();
+    raydium_window_view_update();
+    
+    raydium_light_enable();
+    raydium_light_on(0);
+    memcpy(raydium_light_color[0],light_color,raydium_internal_size_vector_float_4);
+    raydium_light_intensity[0] = 10000000;
+    raydium_light_position[0][0]=350;
+    raydium_light_position[0][1]=10;
+    raydium_light_position[0][2]=200;
+    raydium_light_position[0][3]=1.0;
+    raydium_light_update_all(0);
+    
+    raydium_sky_box_cache();
+
+    raydium_window_view_update();
+    raydium_background_color_change(back_color[0],back_color[1],back_color[2],back_color[3]);
+
+    raydium_register_variable(&speed, RAYDIUM_REGISTER_FLOAT, "speed");
+    
+    tmp=1;
+    while(tmp<=raydium_window_tx && 
+           tmp<=raydium_window_ty && 
+           tmp<=raydium_texture_size_max)
+                {
+                tmp*=2;
+                }
+
+    water_textures_size=tmp/2;
+    raydium_texture_load_internal("","reflection",1,water_textures_size,water_textures_size,4,-1);
+    raydium_texture_load_internal("","refraction",1,water_textures_size,water_textures_size,4,-1);
+//    raydium_shader_load("water","water.vert","water_brico.frag");
+    raydium_shader_load("water","water.vert","water.frag");
+    raydium_shader_var_i_name("water","reflection",0);
+    raydium_shader_var_i_name("water","refraction",1);
+    raydium_shader_var_i_name("water","normalMap",2);
+    raydium_shader_var_i_name("water","dudvMap",3);                
+    raydium_shader_var_4f_name("water","waterColor", water_color[0], water_color[1], water_color[2], water_color[3]);
+    strcpy(model,"cocorobix.tri");
+    raydium_init_cli_option("model",model);
+
+    raydium_callback(&display);
+    return(0);
+}
+// EOF

Property changes on: shaders/shader_water.c
___________________________________________________________________
Added: svn:eol-style
## -0,0 +1 ##
+native
\ No newline at end of property
Index: shaders/README.txt
===================================================================
--- shaders/README.txt	(revision 666)
+++ shaders/README.txt	(revision 667)
@@ -0,0 +1,8 @@
+I've a few unreleased tests about shaders that may help other people
+working on this subject. 
+
+For now, I only release a water shader demo, since other tests are 
+heavily based on the official "shader_test.c", and it will only
+duplicate (almost) the same code everywhere. I'll try to clean all this one day.
+
+Xfennec.

Property changes on: shaders/README.txt
___________________________________________________________________
Added: svn:eol-style
## -0,0 +1 ##
+native
\ No newline at end of property
Index: README.txt
===================================================================
--- README.txt	(revision 666)
+++ README.txt	(revision 667)
@@ -0,0 +1,19 @@
+This directory contains various demos and tests that may
+have an interest for other people.
+
+Some of them may compile, and even run, maybe.
+Please note that these files are mostly unmaintained and does NOT represent
+a good/correct/clean way to use Raydium. For this, use "official" demos.
+
+To compile and run an "extra application", you can copy the source file(s)
+with other standard Raydium applications, and use your regular method.
+
+Another (Linux) option is to stay in the standard Raydium applications 
+directory, and execute odyncomp.sh as follows:
+ODYNCOMP_FLAGS="-I./" ./odyncomp.sh contrib/raydium-extra/app/app.c
+
+You may find a README.txt file in somes directories with notes about 
+compilation,  usage or particular dependencies. If not, you can have a look 
+at source file headers.
+
+There's no particular "support" for these files, there're here as-is.

Property changes on: README.txt
___________________________________________________________________
Added: svn:eol-style
## -0,0 +1 ##
+native
\ No newline at end of property
Index: wiimote/wii_test.jpg
===================================================================
Cannot display: file marked as a binary type.
svn:mime-type = image/jpeg
Index: wiimote/wii_test.jpg
===================================================================
--- wiimote/wii_test.jpg	(revision 666)
+++ wiimote/wii_test.jpg	(revision 667)

Property changes on: wiimote/wii_test.jpg
___________________________________________________________________
Added: svn:mime-type
## -0,0 +1 ##
+image/jpeg
\ No newline at end of property
Index: wiimote/wii_test.c
===================================================================
--- wiimote/wii_test.c	(revision 666)
+++ wiimote/wii_test.c	(revision 667)
@@ -0,0 +1,191 @@
+/*
+    Raydium - CQFD Corp.
+    http://raydium.org/
+    Released under both BSD license and Lesser GPL library license.
+    See "license.txt" file.
+*/
+
+// Quick experimentation with wiimotes ...
+// You'll need libwiimote, available at http://libwiimote.sourceforge.net/
+
+// Compilation:
+// # export LIBWII_INCLUDES=/usr/local/include/libcwiimote-0.4.0/libcwiimote/
+// # ./odyncomp.sh wii_test.c
+
+#include "raydium/index.c"
+
+#define SMOOTH_SIZE	10
+#define DEG2RAD (PI/180.0)
+
+#define WII_MAX	4
+#include "wiimote.h"
+#include "wiimote_api.h"
+
+wiimote_t wiimote[WII_MAX];
+int nmotes;
+
+void wiimote_refresh(void)
+{
+int i;
+
+for(i=0;i<nmotes;i++)
+    if(wiimote_is_open(&wiimote[i]))
+	{
+	wiimote[i].mode.acc = 1;
+
+	if (wiimote_update(&wiimote[i]) < 0)
+		wiimote_disconnect(&wiimote[i]);
+	}
+}
+
+
+signed char wiimote_autoconnect(void)
+{
+signed char connected=0;
+int i;
+
+raydium_log("-----------------------------------------");
+raydium_log("Press buttons 1 and 2 of your wiimote ...");
+do {
+    nmotes = wiimote_discover(wiimote, WII_MAX);
+    
+    if(nmotes <= 0)
+	continue;
+
+    raydium_log("found %i wiimote(s) : ",nmotes);
+
+    for (i=0; i<nmotes; i++) 
+	raydium_log("#%i: %s", i+1, wiimote[i].link.r_addr);
+	
+    raydium_log("connecting to first wiimote ...");
+
+    i=0;
+    if (wiimote_connect(&wiimote[i], wiimote[i].link.r_addr) < 0) 
+	{
+	raydium_log("unable to open wiimote: %s", wiimote_get_error());
+	}
+    else
+	{
+	raydium_log("wiimote %i connected",i+1);
+	wiimote[i].led.bits  = 1 << i;
+	connected++;
+	}
+
+}while(!connected);
+
+wiimote_refresh();
+return 1;
+}
+
+
+void create_world(void)
+{
+int a;
+a=raydium_ode_object_find("GLOBAL");
+raydium_ode_object_box_add("box",a,0.1,RAYDIUM_ODE_AUTODETECT,0,0,RAYDIUM_ODE_STATIC,0,"wiimote.tri");
+//raydium_ode_element_material_name("box",0,10);
+}
+
+
+float smooth(float *array, int size, float newval)
+{
+float f,res,total_factor;
+int i;
+
+// 1 - move the oldest value out
+for(i=size-2;i>=0;i--)
+    array[i+1]=array[i];
+
+// 2 - add current value    
+array[0]=newval;
+
+// 3 - do the average
+res=0;
+total_factor=0;
+for(i=0;i<size;i++)
+	{
+	f=size-i;
+	res+=(array[i]*f);
+	total_factor+=f;
+	}
+
+res/=total_factor;
+return res;
+}
+
+void display(void)
+{
+raydium_joy_key_emul();
+
+if(raydium_key_last==1027)
+    exit(0);
+
+while(wiimote_pending(&wiimote[0]))
+    {
+    float rx,ry,rz;
+    static float orx,ory;
+    static float rx_array[SMOOTH_SIZE];
+    static float ry_array[SMOOTH_SIZE];
+
+    wiimote_refresh();
+    rx=wiimote[0].tilt.x;
+    ry=wiimote[0].tilt.y;
+//    rz=wiimote[0].tilt.z;
+    rz=180;
+
+    if(isnan(rx))
+	rx=orx;
+    else
+	orx=rx;
+
+    if(isnan(ry))
+	ry=ory;
+    else
+	ory=ry;
+
+    rx*=DEG2RAD;
+    ry*=DEG2RAD;
+    rz*=DEG2RAD;
+
+    rx=smooth(rx_array,SMOOTH_SIZE,rx);
+    ry=smooth(ry_array,SMOOTH_SIZE,ry);
+
+    raydium_ode_element_rotate_name_3f("box",rx,ry,rz);
+    }
+
+raydium_clear_frame();
+raydium_camera_freemove(RAYDIUM_CAMERA_FREEMOVE_NORMAL);
+raydium_ode_draw_all(0);
+raydium_rendering_finish();
+}
+
+
+int main(int argc, char **argv)
+{
+raydium_init_args(argc,argv);
+
+wiimote_autoconnect();
+
+raydium_window_create(640,480,RAYDIUM_RENDERING_WINDOW,"My app");
+
+raydium_texture_filter_change(RAYDIUM_TEXTURE_FILTER_TRILINEAR);
+raydium_window_view_perspective(60,0.01,2500); // fov 60 + near and far planes
+
+raydium_fog_disable();    
+raydium_light_enable();
+raydium_light_on(0);
+
+raydium_light_conf_7f(0,2,0,1,100,1,1,1); // id, pos, intensity and color (RGB)
+raydium_background_color_change(1,1,1,1);
+
+raydium_sky_box_cache();
+
+raydium_ode_ground_set_name("showroom_l.tri");
+raydium_shadow_enable();
+create_world();
+
+raydium_callback(&display);
+return(0);
+}
+
+// EOF

Property changes on: wiimote/wii_test.c
___________________________________________________________________
Added: svn:eol-style
## -0,0 +1 ##
+native
\ No newline at end of property
Index: wiimote/README.txt
===================================================================
--- wiimote/README.txt	(revision 666)
+++ wiimote/README.txt	(revision 667)
@@ -0,0 +1,6 @@
+This demo show how to use the Nintendo Wiimote with Raydium, with
+a very simple demo where you can move a 3D model of the Wiimote using
+a real one.
+
+Have a look at wii_test.c's header for information about compilation, since
+you'll need to install "libwiimote" and define LIBWII_INCLUDES env var.
\ No newline at end of file

Property changes on: wiimote/README.txt
___________________________________________________________________
Added: svn:eol-style
## -0,0 +1 ##
+native
\ No newline at end of property