Index: init.c
===================================================================
--- init.c	(revision 554)
+++ init.c	(revision 555)
@@ -299,5 +299,165 @@
 #endif
 }
 
+//Still needs a check of void parameters. 
+//Ie. it should returns error when certain parameters are not given in the conf file.
+int raydium_init_load(char *filename)
+{   
+    FILE *fp;
+    int ret;
+    char var[255],val_s[255];
+    float val_f[255];
+    int size;
+    int tmp_width,tmp_height,tmp_windowtype,tmp_filter,tmp_fog,tmp_lighting;
+    float tmp_light0[8],tmp_background[4],tmp_fov,tmp_far,tmp_near;
+    char tmp_title[255];
+    
+    //flags
+    int flag_width,flag_height,flag_title,flag_windowtype,flag_filter,flag_fov,flag_near,flag_far,flag_fog,flag_lighting,flag_light0,flag_background;
+       
+     //initializing flags  
+     flag_width=flag_height=flag_title=flag_windowtype=flag_filter=flag_fov=flag_near=flag_far=flag_fog=flag_lighting=flag_light0=flag_background=0;   
+     //opening the config file   
+    fp=raydium_file_fopen(filename,"rt");
+    if(fp)
+    {    
+        raydium_log("Reading configuration file...");
+        while( (ret=raydium_parser_read(var,val_s,val_f,&size,fp))!=RAYDIUM_PARSER_TYPE_EOF)
+        {        
+            if(strcmp(var,"width")==0)
+                {
+                    tmp_width=atoi(val_s);
+                    raydium_log("Width of the Window: %d",tmp_width);
+                    flag_width=1;
+                }
+            if(strcmp(var,"height")==0)
+                {
+                    tmp_height=atoi(val_s);
+                    raydium_log("Height of the window: %d",tmp_height);
+                    flag_height=1;
+                }
+            if(strcmp(var,"windowtype")==0)
+            {
+                raydium_parser_trim(val_s);
+                if(strcmp(val_s,"fullscreen")==0) tmp_windowtype=RAYDIUM_RENDERING_FULLSCREEN;
+                    else tmp_windowtype=RAYDIUM_RENDERING_WINDOW;
+                raydium_log("Window type: %s",(tmp_windowtype)?"RAYDIUM_RENDERING_FULLSCREEN":"RAYDIUM_RENDERING_WINDOW");
+                flag_windowtype=1;
+            }
+            if(strcmp(var,"title")==0)
+            {
+                raydium_parser_trim(val_s);
+                strcpy(tmp_title,val_s);
+                raydium_log("Window title: \"%s\"",tmp_title);
+                flag_title=1;
+            } 
+            if(strcmp(var,"filter")==0)
+            {
+                raydium_parser_trim(val_s);
+                if(strcmp(val_s,"trilinear")==0)tmp_filter=2;
+                if(strcmp(val_s,"bilinear")==0)tmp_filter=1;
+                if(strcmp(val_s,"none")==0)tmp_filter=0;
+                if(strcmp(val_s,"aniso")==0)tmp_filter=3;
+                raydium_log("Texture filtering type: %d",tmp_filter);
+                flag_filter=1;            
+            }
+            if(strcmp(var,"fov")==0)
+            {
+                tmp_fov=atof(val_s);
+                raydium_log("FOV: %f",tmp_fov);          
+                flag_fov=1;            
+            }
+            if(strcmp(var,"near")==0)
+            {
+                raydium_parser_trim(val_s);
+                tmp_near=atof(val_s);
+                //tmp_near=val_f;
+                raydium_log("Near plane: %f",tmp_near);          
+                flag_near=1;            
+            }
+            if(strcmp(var,"far")==0)
+            {        	
+                raydium_parser_trim(val_s);
+                tmp_far=atof(val_s);
+                raydium_log("Far plane: %f",tmp_far);          
+                flag_far=1;            
+            }
+            if(strcmp(var,"fog")==0)
+            {
+            	raydium_parser_trim(val_s);
+                tmp_fog=((strcmp(val_s,"on")==0) || (strcmp(val_s,"enable")==0))?1:0;
+                raydium_log("Fog: %s",(tmp_fog?"enable":"disable"));          
+                flag_fog=1;            
+            }
+            if(strcmp(var,"lighting")==0)
+            {
+            	raydium_parser_trim(val_s);
+                tmp_lighting=((strcmp(val_s,"on")==0) || (strcmp(val_s,"enable")==0))?1:0;
+                raydium_log("Lighting: %s",(tmp_lighting?"enable":"disable"));          
+                flag_lighting=1;            
+            }
+            if(strcmp(var,"light0")==0)
+            {
+            	raydium_parser_trim(val_s);
+                sscanf(val_s, "%f,%f,%f,%f,%f,%f,%f,%f", &tmp_light0[0], &tmp_light0[1],&tmp_light0[2],&tmp_light0[3],&tmp_light0[4],&tmp_light0[5],&tmp_light0[6],&tmp_light0[7]);
+                raydium_log("Light number 0 values: %f,%f,%f,%f,%f,%f,%f,%f",tmp_light0[0],tmp_light0[1],tmp_light0[2],tmp_light0[3],tmp_light0[4],tmp_light0[5],tmp_light0[6],tmp_light0[7]);          
+                flag_light0=1;            
+            }
+             if(strcmp(var,"background")==0)
+            {
+            	raydium_parser_trim(val_s);
+                sscanf( val_s, "%f,%f,%f,%f", &tmp_background[0], &tmp_background[1],&tmp_background[2],&tmp_background[3]);
+                raydium_log("Background colors: %f,%f,%f,%f,%f,%f,%f,%f",tmp_background[0], tmp_background[1],tmp_background[2],tmp_background[3]);          
+                flag_background=1;            
+            }
+        }
+            
+        //Here, we process all the data achieved and make the raydium calls        
+        
+        if(flag_width && flag_height && flag_windowtype && flag_title)
+            {
+                raydium_window_create(tmp_width,tmp_height,tmp_windowtype,tmp_title);
+            }
+        if(flag_filter)
+            {
+                raydium_texture_filter_change(tmp_filter);
+            }
+    	if (flag_fov && flag_near && flag_far)
+        {
+        	raydium_window_view_perspective(tmp_fov,tmp_near,tmp_far); // fov 60 + near and far planes
+        }          
+        if(flag_fog)
+        {
+        	if(tmp_fog)raydium_fog_enable(); else raydium_fog_disable(); 
+        }
+        if(flag_lighting)
+        {
+        	if(tmp_lighting)raydium_light_enable(); else raydium_light_disable(); 
+        }
+        if(flag_light0 && flag_lighting && tmp_lighting)
+        {
+        	raydium_light_on(0);
+    		raydium_light_conf_7f(tmp_light0[0],tmp_light0[1],tmp_light0[2],tmp_light0[3],tmp_light0[4],tmp_light0[5],tmp_light0[6],tmp_light0[7]); 	
+        }
+        if(flag_background)
+        {
+        	raydium_background_color_change(tmp_background[0], tmp_background[1],tmp_background[2],tmp_background[3]);    	
+        }
+        
+        //This should be configurable???
+        raydium_sky_box_cache();  
+        
+        //ending load of configuration  
+        raydium_log("Configuration from conf file finished.");
+        return 1;
+    }
+    else
+    {
+        //we can not load the configuration. ERROR
+        raydium_log("ERROR loading configuration file.");
+        return 0;
+    }
+}
 
 
+
;
 }
 
-void raydium_ode_element_rotate_direction_name(char *e, char Force0OrVel1)
+void raydium_ode_element_rotate_direction_name(char *e, signed char Force0OrVel1)
 {
 raydium_ode_element_rotate_direction(raydium_ode_element_find(e),Force0OrVel1);
 }
@@ -1765,7 +1765,7 @@
 }
 
 
-void raydium_ode_joint_hinge2_block(int j, char block)
+void raydium_ode_joint_hinge2_block(int j, signed char block)
 {
 // TODO: test if joint is hinge2 type
 if(raydium_ode_joint_isvalid(j))
@@ -1790,7 +1790,7 @@
 
 
 
-void raydium_ode_joint_hinge2_block_name(char *name, char block)
+void raydium_ode_joint_hinge2_block_name(char *name, signed char block)
 {
 raydium_ode_joint_hinge2_block(raydium_ode_joint_find(name),block);
 }
@@ -2072,7 +2072,7 @@
 }
 
 
-char raydium_ode_element_rotq_get(int j, dReal * res)
+signed char raydium_ode_element_rotq_get(int j, dReal * res)
 {
 if(raydium_ode_element_isvalid(j))
     {
@@ -2083,12 +2083,13 @@
 return 0;
 }
 
-char raydium_ode_element_rotq_get_name(char *name, dReal * res)
+signed char raydium_ode_element_rotq_get_name(char *name, dReal * res)
 {
 return raydium_ode_element_rotq_get(raydium_ode_element_find(name),res);
 }
+
 /*
-char raydium_ode_element_rot_get(int e, dReal *rx, dReal *ry, dReal *rz)
+signed char raydium_ode_element_rot_get(int e, dReal *rx, dReal *ry, dReal *rz)
 {
 // From Andrzej Szombierski <qq@kuku.eu.org> (ODE ML)
 // patched by Daniel Monteiro Basso <dmbasso@inf.ufrgs.br> (ODE ML)
@@ -2125,7 +2126,7 @@
 }
 */
 
-char raydium_ode_element_rot_get(int e, dReal *rx, dReal *ry, dReal *rz)
+signed char raydium_ode_element_rot_get(int e, dReal *rx, dReal *ry, dReal *rz)
 {
 // From Andrzej Szombierski <qq@kuku.eu.org> (ODE ML)
 // Original code version: "absolute" angles
@@ -2163,7 +2164,7 @@
 }
 
 
-char raydium_ode_element_rot_get_name(char *e, dReal *rx, dReal *ry, dReal *rz)
+signed char raydium_ode_element_rot_get_name(char *e, dReal *rx, dReal *ry, dReal *rz)
 {
 return raydium_ode_element_rot_get(raydium_ode_element_find(e),rx,ry,rz);
 }
@@ -2209,7 +2210,7 @@
 raydium_ode_element_RelPointPos(raydium_ode_element_find(e),px,py,pz,res);
 }
 
-int raydium_ode_motor_create(char *name, int obj, char type)
+int raydium_ode_motor_create(char *name, int obj, signed char type)
 {
 int i;
 
@@ -2376,7 +2377,7 @@
 }
 
 
-void raydium_ode_motor_rocket_playermovement(int m, char isplayermovement)
+void raydium_ode_motor_rocket_playermovement(int m, signed char isplayermovement)
 {
 if(!raydium_ode_motor_isvalid(m))
     {
@@ -2391,12 +2392,12 @@
 raydium_ode_motor[m].rocket_playermovement=isplayermovement;
 }
 
-void raydium_ode_motor_rocket_playermovement_name(char *m, char isplayermovement)
+void raydium_ode_motor_rocket_playermovement_name(char *m, signed char isplayermovement)
 {
 return raydium_ode_motor_rocket_playermovement(raydium_ode_motor_find(m),isplayermovement);
 }
 
-char raydium_ode_motor_delete(int e)
+signed char raydium_ode_motor_delete(int e)
 {
 if(!raydium_ode_motor_isvalid(e))
     {
@@ -2407,13 +2408,13 @@
 return 1;
 }
 
-char raydium_ode_motor_delete_name(char *name)
+signed char raydium_ode_motor_delete_name(char *name)
 {
 return raydium_ode_motor_delete(raydium_ode_motor_find(name));
 }
 
 
-char raydium_ode_joint_delete(int joint)
+signed char raydium_ode_joint_delete(int joint)
 {
 int i,j;
 void (*f)(int);
@@ -2440,13 +2441,13 @@
 return 1;
 }
 
-char raydium_ode_joint_delete_name(char *name)
+signed char raydium_ode_joint_delete_name(char *name)
 {
 return raydium_ode_joint_delete(raydium_ode_joint_find(name));
 }
 
 
-char raydium_ode_element_delete(int e, char deletejoints)
+signed char raydium_ode_element_delete(int e, signed char deletejoints)
 {
 int i;
 int (*f)(int);
@@ -2540,13 +2541,13 @@
 return 1;
 }
 
-char raydium_ode_element_delete_name(char *name, char deletejoints)
+signed char raydium_ode_element_delete_name(char *name, signed char deletejoints)
 {
 return raydium_ode_element_delete(raydium_ode_element_find(name),deletejoints);
 }
 
 
-char raydium_ode_object_delete(int obj)
+signed char raydium_ode_object_delete(int obj)
 {
 int i;
 //raydium_ode_Element *e;
@@ -2584,12 +2585,12 @@
 return 1;
 }
 
-char raydium_ode_object_delete_name(char *name)
+signed char raydium_ode_object_delete_name(char *name)
 {
 return raydium_ode_object_delete(raydium_ode_object_find(name));
 }
 
-char raydium_ode_explosion_delete(int e)
+signed char raydium_ode_explosion_delete(int e)
 {
 if(!raydium_ode_explosion_isvalid(e))
     {
@@ -2603,7 +2604,7 @@
 }
 
 
-char raydium_ode_element_moveto(int element, int object, char deletejoints)
+signed char raydium_ode_element_moveto(int element, int object, signed char deletejoints)
 {
 int i;
 raydium_ode_Joint *j;
@@ -2643,7 +2644,7 @@
 }
 
 
-char raydium_ode_element_moveto_name(char *element, char *object, char deletejoints)
+signed char raydium_ode_element_moveto_name(char *element, char *object, char signed deletejoints)
 {
 return raydium_ode_element_moveto(raydium_ode_element_find(element),raydium_ode_object_find(object),deletejoints);
 }
@@ -2676,7 +2677,7 @@
     }
 }
 
-char raydium_ode_launcher(int element, int from_element, dReal *rot, dReal force)
+signed char raydium_ode_launcher(int element, int from_element, dReal *rot, dReal force)
 {
 dReal res[3];
 dReal *initial;
@@ -2710,12 +2711,12 @@
 return 1;
 }
 
-char raydium_ode_launcher_name(char *element, char *from_element, dReal *rot, dReal force)
+signed char raydium_ode_launcher_name(char *element, char *from_element, dReal *rot, dReal force)
 {
 return raydium_ode_launcher(raydium_ode_element_find(element),raydium_ode_element_find(from_element),rot,force);
 }
 
-char raydium_ode_launcher_name_3f(char *element, char *from_element, dReal rx, dReal ry, dReal rz, dReal force)
+signed char raydium_ode_launcher_name_3f(char *element, char *from_element, dReal rx, dReal ry, dReal rz, dReal force)
 {
 dReal tmp[3];
 tmp[0]=rx;
@@ -2725,7 +2726,7 @@
 }
 
 
-char raydium_ode_launcher_simple(int element, int from_element, dReal *lrot, dReal force)
+signed char raydium_ode_launcher_simple(int element, int from_element, dReal *lrot, dReal force)
 {
 dReal *pos;
 dQuaternion rot;
@@ -2753,12 +2754,12 @@
 return 1;
 }
 
-char raydium_ode_launcher_simple_name(char *element, char *from_element, dReal *rot, dReal force)
+signed char raydium_ode_launcher_simple_name(char *element, char *from_element, dReal *rot, dReal force)
 {
 return raydium_ode_launcher_simple(raydium_ode_element_find(element),raydium_ode_element_find(from_element),rot,force);
 }
 
-char raydium_ode_launcher_simple_name_3f(char *element, char *from_element, dReal rx, dReal ry, dReal rz, dReal force)
+signed char raydium_ode_launcher_simple_name_3f(char *element, char *from_element, dReal rx, dReal ry, dReal rz, dReal force)
 {
 dReal tmp[3];
 tmp[0]=rx;
@@ -2771,7 +2772,7 @@
 void raydium_ode_explosion_blow(dReal radius, dReal max_force, dReal *pos)
 {
 int i;
-void (*f)(char, dReal, dReal, dReal *);
+void (*f)(signed char, dReal, dReal, dReal *);
 void (*g)(int, dReal, dReal);
 
 if(raydium_network_mode==RAYDIUM_NETWORK_MODE_CLIENT && !raydium_ode_network_explosion_create)
@@ -2841,7 +2842,7 @@
 int raydium_ode_explosion_create(char *name, dReal final_radius, dReal propag, dReal *pos)
 {
 int i;
-void (*f)(char, dReal, dReal, dReal *);
+void (*f)(signed char, dReal, dReal, dReal *);
 
 if(raydium_network_mode==RAYDIUM_NETWORK_MODE_CLIENT && !raydium_ode_network_explosion_create)
 {
@@ -2922,10 +2923,10 @@
 }
 
 
-void raydium_ode_draw_all(char names)
+void raydium_ode_draw_all(signed char names)
 {
 int i,j;
-char (*bef)(int);
+signed char (*bef)(int);
 void (*aft)(int);
 
 bef=raydium_ode_BeforeElementDrawCallback;
@@ -3252,7 +3253,7 @@
 dReal cfm=0;
 dReal slip=0;
 int count=0;
-char (*f)(int,int, dContact *);
+signed char (*f)(int,int, dContact *);
 f=raydium_ode_CollideCallback;
 
 ground_elem_id=raydium_ode_element_find("ground");
@@ -3261,7 +3262,7 @@
 if(dGeomIsSpace (o1) || dGeomIsSpace (o2)) 
     {
     raydium_ode_Object *oo1, *oo2;
-    char (*g)(int,int);
+    signed char (*g)(int,int);
     oo1=dGeomGetData(o1);
     oo2=dGeomGetData(o2);
     g=raydium_ode_ObjectNearCollide;