Index: object.c
===================================================================
--- object.c	(revision 1091)
+++ object.c	(revision 1092)
@@ -80,6 +80,24 @@
     );*/
 }
 
+void raydium_object_render_cache_free(int obj)
+{
+int i;
+
+for(i=0;i<raydium_object_cache[obj].n_parts;i++)
+    free(raydium_object_cache[obj].parts[i]);
+}
+
+void raydium_object_render_cache_free_all(void)
+{
+#ifdef DEBUG_RENDER_VERTEXARRAY
+int i;
+for(i=0;i<raydium_object_index;i++)
+    raydium_object_render_cache_free(i);
+#endif
+}
+
+
 void raydium_object_render_va_init(signed char simple)
 {
 glEnableClientState(GL_VERTEX_ARRAY);
@@ -198,17 +216,30 @@
 }
 
 
-void raydium_object_draw(GLuint o)
+void raydium_object_dl_init(void)
 {
-#ifndef DEBUG_RENDER_DISABLE_DISPLAYLISTS
-#ifndef DEBUG_RENDER_VERTEXARRAY
-static GLuint dl[RAYDIUM_MAX_OBJECTS];
-static char dl_state[RAYDIUM_MAX_OBJECTS];
-static int first=0;
 int i;
-#endif
-#endif
 
+for(i=0;i<RAYDIUM_MAX_OBJECTS;i++)
+    raydium_object_dl_state[i]=0;
+}
+
+void raydium_object_dl_delete(void)
+{
+int i;
+
+for(i=0;i<RAYDIUM_MAX_OBJECTS;i++)
+    if(raydium_object_dl_state[i])
+        {
+        glDeleteLists(raydium_object_dl[i],1);
+        raydium_object_dl_state[i]=0;
+        }
+}
+
+
+void raydium_object_draw(GLuint o)
+{
+
 if(!raydium_object_isvalid(o))
     {
     raydium_log("object: draw: ERROR: id or name is invalid");
@@ -228,24 +259,20 @@
 
 #ifndef DEBUG_RENDER_DISABLE_DISPLAYLISTS
 #ifndef DEBUG_RENDER_VERTEXARRAY
-if(first)
-    for(i=0;i<RAYDIUM_MAX_OBJECTS;i++)
-        dl_state[i]=-1;
 
-
 if(raydium_render_displaylists_tag && !raydium_shadow_rendering)
 {
- if(!dl_state[o])
+ if(!raydium_object_dl_state[o])
     {
     // build DL
-    dl_state[o]=1;
-    dl[o]=glGenLists(1);
+    raydium_object_dl_state[o]=1;
+    raydium_object_dl[o]=glGenLists(1);
     raydium_log("Object: creating display list for object %s",raydium_object_name[o]);
-    glNewList(dl[o],GL_COMPILE);
+    glNewList(raydium_object_dl[o],GL_COMPILE);
     raydium_rendering_from_to(raydium_object_start[o],raydium_object_end[o]);
     glEndList();
     }
-  glCallList(dl[o]);
+  glCallList(raydium_object_dl[o]);
 }
 else raydium_rendering_from_to(raydium_object_start[o],raydium_object_end[o]);
 #else
gui_label_draw(int w, int window);
+__rayapi void raydium_gui_label_draw(int w, int window);
 /**
 Internal use.
 **/
 
-void raydium_gui_edit_draw(int w, int window);
+__rayapi void raydium_gui_edit_draw(int w, int window);
 /**
 Internal use.
 **/
 
-void raydium_gui_check_draw(int w, int window);
+__rayapi void raydium_gui_check_draw(int w, int window);
 /**
 Internal use.
 **/
 
-void raydium_gui_combo_draw(int w, int window);
+__rayapi void raydium_gui_combo_draw(int w, int window);
 /**
 Internal use.
 **/
 
-void raydium_gui_zone_draw(int w, int window);
+__rayapi void raydium_gui_zone_draw(int w, int window);
 /**
 Internal use.
 **/
 
-void raydium_gui_window_draw(int window);
+__rayapi void raydium_gui_window_draw(int window);
 /**
 Internal use.
 **/
 
-void raydium_gui_draw(void);
+__rayapi void raydium_gui_draw(void);
 /**
 Internal use. GUI drawing callback.
 **/
 
-int raydium_gui_button_read(int window, int widget, char *str);
+__rayapi int raydium_gui_button_read(int window, int widget, char *str);
 /**
 Internal use. Button read accessor (dummy).
 **/
 
-int raydium_gui_label_read(int window, int widget, char *str);
+__rayapi int raydium_gui_label_read(int window, int widget, char *str);
 /**
 Internal use. Label read accessor (dummy).
 **/
 
-int raydium_gui_track_read(int window, int widget, char *str);
+__rayapi int raydium_gui_track_read(int window, int widget, char *str);
 /**
 Internal use. Track read accessor.
 **/
 
-int raydium_gui_edit_read(int window, int widget, char *str);
+__rayapi int raydium_gui_edit_read(int window, int widget, char *str);
 /**
 Internal use. Edit read accessor.
 **/
 
-int raydium_gui_check_read(int window, int widget, char *str);
+__rayapi int raydium_gui_check_read(int window, int widget, char *str);
 /**
 Internal use. Check read accessor.
 **/
 
-int raydium_gui_combo_read(int window, int widget, char *str);
+__rayapi int raydium_gui_combo_read(int window, int widget, char *str);
 /**
 Internal use. Combo read accessor.
 **/
 
-int raydium_gui_zone_read(int window, int widget, char *str);
+__rayapi int raydium_gui_zone_read(int window, int widget, char *str);
 /**
 Internal use. Zone read accessor.
 **/
 
-void raydium_gui_show(void);
+__rayapi void raydium_gui_show(void);
 /**
 Will show current built GUI.
 **/
 
-void raydium_gui_hide(void);
+__rayapi void raydium_gui_hide(void);
 /**
 Will hide current built GUI. This is the default state.
 **/
 
-signed char raydium_gui_isvisible(void);
+__rayapi signed char raydium_gui_isvisible(void);
 /**
 Will return current visibility of GUI.
 **/
 
-void raydium_gui_window_delete(int window);
+__rayapi void raydium_gui_window_delete(int window);
 /**
 Will delete ##window##. No further access to widgets is possible.
 **/
 
-void raydium_gui_window_delete_name(char *window);
+__rayapi void raydium_gui_window_delete_name(char *window);
 /**
 Same as above, but using ##window##'s name.
 **/
 
-void raydium_gui_widget_sizes(GLfloat sizex, GLfloat sizey, GLfloat font_size);
+__rayapi void raydium_gui_widget_sizes(GLfloat sizex, GLfloat sizey, GLfloat font_size);
 /**
 Each widget is created using 3 size: X size, Y size and font size. This
 function will allow you to set all sizes for a widget or a group of widget.
 Unit: percents (screen)
 **/
 
-int raydium_gui_window_create(char *name, GLfloat px, GLfloat py, GLfloat sizex, GLfloat sizey);
+__rayapi int raydium_gui_window_create(char *name, GLfloat px, GLfloat py, GLfloat sizex, GLfloat sizey);
 /**
 Obviously, this function will create a new window. This window will take focus
 and overlap any previous window.
@@ -216,14 +216,14 @@
 Unit: percents (screen)
 **/
 
-int raydium_gui_internal_object_create(char *name, int window, signed char type, GLfloat px, GLfloat py, GLfloat sizex, GLfloat sizey, GLfloat font_size);
+__rayapi int raydium_gui_internal_object_create(char *name, int window, signed char type, GLfloat px, GLfloat py, GLfloat sizex, GLfloat sizey, GLfloat font_size);
 /**
 Internal use.
 Small (and ugly) tip: you can build many widgets with the same name, prefixing
 the name with '*'.
 **/
 
-int raydium_gui_button_create(char *name, int window,  GLfloat px, GLfloat py, char *caption, void *OnClick);
+__rayapi int raydium_gui_button_create(char *name, int window,  GLfloat px, GLfloat py, char *caption, void *OnClick);
 /**
 This function will create a new button, with ##name## and with ##window## for
 parent. 
@@ -236,14 +236,14 @@
 Unit for position (##px## and ##py##): percents (**window**)
 **/
 
-int raydium_gui_button_create_simple(char *name, int window,  GLfloat px, GLfloat py, char *caption);
+__rayapi int raydium_gui_button_create_simple(char *name, int window,  GLfloat px, GLfloat py, char *caption);
 /**
 Same as above, but no OnClick callback function is asked. This type of button 
 is "readable" thru ##raydium_gui_button_clicked()##.
 **/
 
 
-int raydium_gui_label_create(char *name, int window,  GLfloat px, GLfloat py, char *caption, GLfloat r, GLfloat g, GLfloat b);
+__rayapi int raydium_gui_label_create(char *name, int window,  GLfloat px, GLfloat py, char *caption, GLfloat r, GLfloat g, GLfloat b);
 /**
 This function will create a new label, with ##name## and with ##window## for
 parent. 
@@ -252,7 +252,7 @@
 Unit for position (##px## and ##py##): percents (**window**)
 **/
 
-int raydium_gui_track_create(char *name, int window,  GLfloat px, GLfloat py, int min, int max, int current);
+__rayapi int raydium_gui_track_create(char *name, int window,  GLfloat px, GLfloat py, int min, int max, int current);
 /**
 This function will create a new trackbar, with ##name## and with ##window## for
 parent. 
@@ -261,7 +261,7 @@
 Unit for position (##px## and ##py##): percents (**window**)
 **/
 
-int raydium_gui_edit_create(char *name, int window,  GLfloat px, GLfloat py, char *default_text);
+__rayapi int raydium_gui_edit_create(char *name, int window,  GLfloat px, GLfloat py, char *default_text);
 /**
 This function will create a new edit box, with ##name## and with ##window## 
 for parent. 
@@ -273,7 +273,7 @@
 Unit for position (##px## and ##py##): percents (**window**)
 **/
 
-int raydium_gui_check_create(char *name, int window,  GLfloat px, GLfloat py, char *caption, signed char checked);
+__rayapi int raydium_gui_check_create(char *name, int window,  GLfloat px, GLfloat py, char *caption, signed char checked);
 /**
 This function will create a new check box, with ##name## and with ##window## 
 for parent. 
@@ -282,7 +282,7 @@
 Unit for position (##px## and ##py##): percents (**window**)
 **/
 
-int raydium_gui_combo_create(char *name, int window,  GLfloat px, GLfloat py, char *items, int current);
+__rayapi int raydium_gui_combo_create(char *name, int window,  GLfloat px, GLfloat py, char *items, int current);
 /**
 This function will create a new edit box, with ##name## and with ##window## 
 for parent. 
@@ -296,7 +296,7 @@
 Unit for position (##px## and ##py##): percents (**window**)
 **/
 
-int raydium_gui_zone_create(char *name, int window,  GLfloat px, GLfloat py, GLfloat sx, GLfloat sy, int tag, void *OnClick);
+__rayapi int raydium_gui_zone_create(char *name, int window,  GLfloat px, GLfloat py, GLfloat sx, GLfloat sy, int tag, void *OnClick);
 /**
 This function will create a "zone" with ##name## and with ##window## for
 parent. A zone will act like a button, but  will highlight a rectangular area 
@@ -308,7 +308,7 @@
 Unit for position/size (##px##, ##py##, ##sx## and ##sy##): percents (**window**)
 **/
 
-int raydium_gui_read(int window, int widget, char *str);
+__rayapi int raydium_gui_read(int window, int widget, char *str);
 /**
 Use this function to get ##widget##'s state (for ##window##).
 This function will always return this information thru two variable:
@@ -324,19 +324,19 @@
 %%
 **/
 
-int raydium_gui_read_name(char *window, char *widget, char *str);
+__rayapi int raydium_gui_read_name(char *window, char *widget, char *str);
 /**
 Same as above, but ##window## and ##widget## are resolved thru names, and
 not numeric id.
 **/
 
-int raydium_gui_read_widget(raydium_gui_Object *w, char *str);
+__rayapi int raydium_gui_read_widget(raydium_gui_Object *w, char *str);
 /**
 Same as ##raydium_gui_read()##, but using a ##raydium_gui_Object## pointer.
 Useful for button callbacks, for example.
 **/
 
-int raydium_gui_button_clicked(void);
+__rayapi int raydium_gui_button_clicked(void);
 /**
 This function will return the id of the last clicked button,
 or -1 if none were clicked.
@@ -345,18 +345,18 @@
 buttons with RayPHP.
 **/
 
-int raydium_gui_list_id(char *item, char *list);
+__rayapi int raydium_gui_list_id(char *item, char *list);
 /**
 This function will return ##item##'s id in ##list##. Returns -1 if not found.
 Useful for combo index, for example.
 **/
 
-void raydium_gui_widget_focus(int widget, int window);
+__rayapi void raydium_gui_widget_focus(int widget, int window);
 /**
 Sets focus on ##widget## for ##window##.
 **/
 
-void raydium_gui_widget_focus_name(char *widget, char *window);
+__rayapi void raydium_gui_widget_focus_name(char *widget, char *window);
 /**
 Same as above, but using widget and window names
 **/