Fix rendering buffer handling
[mercenary-reloaded.git] / src / mercenary / render.c
index 85498fc..5ac62a9 100644 (file)
@@ -358,7 +358,7 @@ static void gamecolor2gl_index(double *red, double *green, double *blue, uint16_
 #endif
        if (color >= 0x8000) {
 #ifdef DEBUG_COLOR
-               print_error("Use of color index from current palette, but index is not defined as being set!\n");
+               fprintf(stderr, "Use of color index from current palette, but index is not defined as being set!\n");
 #endif
        }
        *red = (double)((color >> 8) & 0xf) / 15.0;
@@ -396,7 +396,7 @@ again:
 #endif
                /* now use that color info parse again (hopefully it does not contain a "pre-defined palette" again and again! */
                if (nesting++ == 8) {
-                       print_error("Color lookup from pre-defined palette is nesting too much, please fix!\n");
+                       print_info("Color lookup from pre-defined palette is nesting too much, please fix!\n");
                        return;
                }
                goto again;
@@ -416,7 +416,7 @@ static int32_t wrap_int28(int32_t value)
 static void store_coord(const char __attribute__((unused)) *what, uint32_t vertex, int32_t x, int32_t y, int32_t z)
 {
        if ((vertex & 3)) {
-               print_error("Vertex %d is not a multiple of four!\n", vertex);
+               print_info("Vertex %d is not a multiple of four!\n", vertex);
                return;
        }
        /* create new vertices item, if there was no vertex before, or if the vertex has different offet */
@@ -449,7 +449,7 @@ static void store_coord(const char __attribute__((unused)) *what, uint32_t verte
                }
                vertex -= 0x200;
        } else {
-               print_error("Vertex %d exceeds maximum vertex number, please fix!\n", vertex);
+               print_info("Vertex %d exceeds maximum vertex number, please fix!\n", vertex);
                return;
        }
        vertex >>= 2;
@@ -468,11 +468,11 @@ static void store_coord(const char __attribute__((unused)) *what, uint32_t verte
 static void store_interior_coord(const char __attribute__((unused)) *what, uint32_t vertex, int32_t x, int32_t y1, int32_t y2, int32_t y3, int32_t y4, int32_t z)
 {
        if ((vertex & 3)) {
-               print_error("Vertex is not a multiple of four!\n");
+               print_info("Vertex is not a multiple of four!\n");
                return;
        }
        if (vertex >= MAX_INTERIOR_VERTEX) {
-               print_error("Vertex %d exceeds maximum vertex number %d!\n", vertex, MAX_INTERIOR_VERTEX);
+               print_info("Vertex %d exceeds maximum vertex number %d!\n", vertex, MAX_INTERIOR_VERTEX);
                return;
        }
        if (!render_item || render_item->type != RENDER_ITEM_VERTICES_INTERIOR)
@@ -1113,7 +1113,7 @@ static void draw_stars_interstellar(void)
        table = REG_A[0];
        count = REG_D[5] + 1;
        if (count > MAX_INTERSTARS) {
-               print_error("Expecting maximum of %d stars here, plese fix!\n", MAX_INTERSTARS);
+               print_info("Expecting maximum of %d stars here, plese fix!\n", MAX_INTERSTARS);
                return;
        }
        for (i = 0; i < count; i++) {
@@ -1317,7 +1317,7 @@ void render_capture_event(int event)
        case STOP_AT_POLY_BUILDING_INTERIOR1to4:
                /* before we come here, we must already passed the break points above, so we know the level to be rendered */
                if (interior_level12 == 0) {
-                       print_error("Interior level is not set, please fix!\n");
+                       print_info("Interior level is not set, please fix!\n");
                        break;
                }
                poly_building_interior1to4(interior_level12);
@@ -1326,7 +1326,7 @@ void render_capture_event(int event)
        case STOP_AT_POLY_BUILDING_INTERIOR5to6:
                /* before we come here, we must already passed the break points above, so we know the level to be rendered */
                if (interior_level12 == 0) {
-                       print_error("Interior level is not set, please fix!\n");
+                       print_info("Interior level is not set, please fix!\n");
                        break;
                }
                poly_building_interior5to6(interior_level12, interior_level34);
@@ -1448,19 +1448,19 @@ static int use_coord(const char __attribute__((unused)) *what, uint32_t vertex,
        render_item_t *ri = NULL;
 
        if ((vertex & 3)) {
-               print_error("Vertex %d is not a multiple of four!\n", vertex);
+               print_info("Vertex %d is not a multiple of four!\n", vertex);
                return -1;
        }
        if (vertex < 0x100) {
                if (!render_item_vertices_0) {
-                       print_error("Vertices item for vertex %d not yet set!\n", vertex);
+                       print_info("Vertices item for vertex %d not yet set!\n", vertex);
                        return -1;
                }
                ri = render_item_vertices_0;
        } else
        if (vertex < 0x200) {
                if (!render_item_vertices_1) {
-                       print_error("Vertices item for vertex %d not yet set!\n", vertex);
+                       print_info("Vertices item for vertex %d not yet set!\n", vertex);
                        return -1;
                }
                ri = render_item_vertices_1;
@@ -1468,13 +1468,13 @@ static int use_coord(const char __attribute__((unused)) *what, uint32_t vertex,
        } else
        if (vertex < 0x300) {
                if (!render_item_vertices_2) {
-                       print_error("Vertices item for vertex %d not yet set!\n", vertex);
+                       print_info("Vertices item for vertex %d not yet set!\n", vertex);
                        return -1;
                }
                ri = render_item_vertices_2;
                vertex -= 0x200;
        } else {
-               print_error("Vertex %d exceeds maximum vertex number %d!\n", vertex, MAX_VERTEX);
+               print_info("Vertex %d exceeds maximum vertex number %d!\n", vertex, MAX_VERTEX);
                return -1;
        }
        vertex >>= 2;
@@ -1498,19 +1498,19 @@ static int use_coord(const char __attribute__((unused)) *what, uint32_t vertex,
 static int use_interior_coord(const char __attribute__((unused)) *what, uint32_t vertex, int level, double *x, double *y, double *z)
 {
        if ((vertex & 3)) {
-               print_error("Vertex is not a multiple of four!\n");
+               print_info("Vertex is not a multiple of four!\n");
                return -1;
        }
        if (vertex >= MAX_INTERIOR_VERTEX) {
-               print_error("Vertex %d exceeds maximum vertex number %d!\n", vertex, MAX_VERTEX);
+               print_info("Vertex %d exceeds maximum vertex number %d!\n", vertex, MAX_VERTEX);
                return -1;
        }
        if (level < 1 || level > 4) {
-               print_error("Level %d is out of range (1..4)!\n", level);
+               print_info("Level %d is out of range (1..4)!\n", level);
                return -1;
        }
        if (!render_item_vertices_interior) {
-               print_error("Vertices item for interior verticies not yet set!\n");
+               print_info("Vertices item for interior verticies not yet set!\n");
                return -1;
        }
        vertex >>= 2;
@@ -2292,7 +2292,7 @@ void render_one_item(render_item_t *render_item)
                break;
        }
        default:
-               print_error("Unknown type, please fix!\n");
+               print_info("Unknown render item type, please fix!\n");
        }
 }
 
@@ -2478,8 +2478,9 @@ static void interpolate_objects(double inter)
 /* always renders NEW! items
  * use inter == 1.0 to render motion to vertices of NEW items
  * use inter 0.0 .. 1.0 to interpolate motion between OLD and NEW items
+ * return 0, if the scene was rendered, returns < 0, if there is no scene
  */
-void render_all_items(double inter)
+int render_all_items(double inter)
 {
        render_item_object_info = NULL;
        render_item_vertices_0 = render_item_vertices_1 = render_item_vertices_2 = NULL;
@@ -2529,21 +2530,15 @@ void render_all_items(double inter)
                interpolate_objects(inter);
        }
 
-       /* add a blank background, if render list is empty */
-       if (!render_list_new) {
-               render_item_t blank;
-               memset(&blank, 0, sizeof(blank));
-               blank.type = RENDER_ITEM_SKY;
-               blank.u.sky.red = 0.5;
-               blank.u.sky.green = 0.5;
-               blank.u.sky.blue = 0.5;
-               render_one_item(&blank);
-               return;
-       }
+       /* return failure, if nothing can be rendered */
+       if (!render_list_new)
+               return -1;
 
        for (render_item = render_list_new; render_item; render_item = render_item->next) {
                render_one_item(render_item);
        }
+
+       return 0;
 }
 
 void render_capture_reset(void)