diff dmq3d.c @ 245:eed8eed58f82

Changes in the 3d loader.
author Matti Hamalainen <ccr@tnsp.org>
date Tue, 09 Oct 2012 17:46:40 +0300
parents a9d500e5698d
children 3bf8ebf09a6a
line wrap: on
line diff
--- a/dmq3d.c	Tue Oct 09 17:22:52 2012 +0300
+++ b/dmq3d.c	Tue Oct 09 17:46:40 2012 +0300
@@ -189,7 +189,10 @@
             t = &v;
         }
         else
-            t = &p;
+        {
+            dm_vector_add_r(&v, &p, pt);
+            t = &v;
+        }
 
         if (dmAdd3DLineSpriteModelVertex(model, t, &indices[vertex]) != DMERR_OK)
             goto error;
@@ -279,12 +282,13 @@
 }
 
 
-int dmRead3DLineSpriteModel(DMResource *f, DM3DLineSpriteModel *model)
+int dmRead3DLineSpriteModel(DMResource *f, DM3DLineSpriteModel **model)
 {
     DMVector pt;
     char line[512];
 
-    memset(model, 0, sizeof(*model));
+    if ((*model = dmMalloc0(sizeof(DM3DLineSpriteModel))) == NULL)
+        return DMERR_MALLOC;
 
     while (dmfgets(line, sizeof(line), f) != NULL)
     {
@@ -296,7 +300,7 @@
                 break;
             
             case 'B':
-                if (!dmReadBitmap(start, model))
+                if (!dmReadBitmap(start, *model))
                     return DMERR_INVALID_DATA;
                 break;
             
@@ -308,17 +312,17 @@
                 break;
 
             case 'L':
-                if (!dmReadLineSegments(start, model, FALSE, &pt))
+                if (!dmReadLineSegments(start, *model, FALSE, &pt))
                     return DMERR_INVALID_DATA;
                 break;
 
             case 'R':
-                if (!dmReadLineSegments(start, model, TRUE, &pt))
+                if (!dmReadLineSegments(start, *model, TRUE, &pt))
                     return DMERR_INVALID_DATA;
                 break;
             
             case 'S':
-                if (!dmReadSprite(start, model))
+                if (!dmReadSprite(start, *model))
                     return DMERR_INVALID_DATA;
                 break;
             
@@ -326,6 +330,22 @@
                 break;
         }
     }
+    return DMERR_OK;
 
-    return DMERR_OK;
+
+void dmFree3DLineSpriteModel(DM3DLineSpriteModel *model)
+{
+    int i;
+    for (i = 0; i < model->nbitmaps; i++)
+    {
+        if (model->bitmaps[i].img != NULL)
+            SDL_FreeSurface(model->bitmaps[i].img);
+    }
+
+    dmFree(model->bitmaps);
+    dmFree(model->vertices);
+    dmFree(model->lines);
+    dmFree(model->sprites);
+    dmFree(model);
 }
+}