changeset 249:3b028785b843

Various improvements in the .3d parser.
author Matti Hamalainen <ccr@tnsp.org>
date Tue, 09 Oct 2012 19:36:19 +0300
parents e6303e0c62cb
children 3520489320bc
files dmq3d.c
diffstat 1 files changed, 37 insertions(+), 17 deletions(-) [+]
line wrap: on
line diff
--- a/dmq3d.c	Tue Oct 09 17:47:40 2012 +0300
+++ b/dmq3d.c	Tue Oct 09 19:36:19 2012 +0300
@@ -222,7 +222,7 @@
     return FALSE;
 }
 
-static BOOL dmReadSprite(char *line, DM3DLineSpriteModel *model)
+static BOOL dmReadSprite(char *line, DM3DLineSpriteModel *model, DMVector *pos)
 {
     DMVector pt;
     DM3DSprite spr;
@@ -240,6 +240,7 @@
 
     spr.bitmap = atoi(line + 1);
 
+    dm_vector_add(&pt, pos);
     if (dmAdd3DLineSpriteModelVertex(model, &pt, &spr.v) != DMERR_OK)
         return FALSE;
 
@@ -282,14 +283,10 @@
 }
 
 
-int dmRead3DLineSpriteModel(DMResource *f, DM3DLineSpriteModel **model)
+static int dmDoRead3DLineSpriteModel(DMResource *f, DM3DLineSpriteModel *model, DMVector *pos)
 {
-    DMVector pt;
     char line[512];
 
-    if ((*model = dmMalloc0(sizeof(DM3DLineSpriteModel))) == NULL)
-        return DMERR_MALLOC;
-
     while (dmfgets(line, sizeof(line), f) != NULL)
     {
         char *start = dmSkipWhitespace(line, FALSE);
@@ -299,30 +296,40 @@
             case '#':
                 break;
             
-            case 'B':
-                if (!dmReadBitmap(start, *model))
-                    return DMERR_INVALID_DATA;
+            case 'G':
+                {
+                int res;
+                DMVector pt;
+                start++;
+                if (!dmReadCoordinate(&start, &pt.x, TRUE)) return DMERR_INVALID_DATA;
+                if (!dmReadCoordinate(&start, &pt.y, TRUE)) return DMERR_INVALID_DATA;
+                if (!dmReadCoordinate(&start, &pt.z, FALSE)) return DMERR_INVALID_DATA;
+                dm_vector_add_r(&pt, pos, &pt);
+                if ((res = dmDoRead3DLineSpriteModel(f, model, &pt)) != DMERR_OK)
+                    return res;
+                }
                 break;
             
-            case 'P':
-                start++;
-                if (!dmReadCoordinate(&start, &pt.x, TRUE)) return FALSE;
-                if (!dmReadCoordinate(&start, &pt.y, TRUE)) return FALSE;
-                if (!dmReadCoordinate(&start, &pt.z, FALSE)) return FALSE;
+            case 'E':
+                return DMERR_OK;
+
+            case 'B':
+                if (!dmReadBitmap(start, model))
+                    return DMERR_INVALID_DATA;
                 break;
 
             case 'L':
-                if (!dmReadLineSegments(start, *model, FALSE, &pt))
+                if (!dmReadLineSegments(start, model, FALSE, pos))
                     return DMERR_INVALID_DATA;
                 break;
 
             case 'R':
-                if (!dmReadLineSegments(start, *model, TRUE, &pt))
+                if (!dmReadLineSegments(start, model, TRUE, pos))
                     return DMERR_INVALID_DATA;
                 break;
             
             case 'S':
-                if (!dmReadSprite(start, *model))
+                if (!dmReadSprite(start, model, pos))
                     return DMERR_INVALID_DATA;
                 break;
             
@@ -334,6 +341,19 @@
 }
 
 
+int dmRead3DLineSpriteModel(DMResource *f, DM3DLineSpriteModel **model)
+{
+    DMVector pos;
+
+    if ((*model = dmMalloc0(sizeof(DM3DLineSpriteModel))) == NULL)
+        return DMERR_MALLOC;
+
+    memset(&pos, 0, sizeof(pos));
+    
+    return dmDoRead3DLineSpriteModel(f, *model, &pos);
+}
+
+
 void dmFree3DLineSpriteModel(DM3DLineSpriteModel *model)
 {
     int i;