changeset 243:a9d500e5698d

Improve the parser.
author Matti Hamalainen <ccr@tnsp.org>
date Tue, 09 Oct 2012 17:22:07 +0300
parents 2cbe74477441
children 00785510b743
files dmq3d.c
diffstat 1 files changed, 27 insertions(+), 4 deletions(-) [+]
line wrap: on
line diff
--- a/dmq3d.c	Tue Oct 09 13:03:15 2012 +0300
+++ b/dmq3d.c	Tue Oct 09 17:22:07 2012 +0300
@@ -162,7 +162,7 @@
     return TRUE;
 }
 
-static BOOL dmReadLineSegments(char *line, DM3DLineSpriteModel *model)
+static BOOL dmReadLineSegments(char *line, DM3DLineSpriteModel *model, BOOL relative, const DMVector *pt)
 {
     int nvertices, vertex, type;
     int *indices = NULL;
@@ -176,14 +176,24 @@
         goto error;
     
     line = dmSkipWhitespace(line, TRUE);
+    DMVector v, p, *t;
+    dm_vector_copy(&v, pt);
     for (vertex = 0; vertex <= nvertices; vertex++)
     {
-        DMVector p;
         if (!dmReadCoordinate(&line, &p.x, TRUE)) return FALSE;
         if (!dmReadCoordinate(&line, &p.y, TRUE)) return FALSE;
         if (!dmReadCoordinate(&line, &p.z, FALSE)) return FALSE;
-        if (dmAdd3DLineSpriteModelVertex(model, &p, &indices[vertex]) != DMERR_OK)
+        if (relative)
+        {
+            dm_vector_add(&v, &p);
+            t = &v;
+        }
+        else
+            t = &p;
+
+        if (dmAdd3DLineSpriteModelVertex(model, t, &indices[vertex]) != DMERR_OK)
             goto error;
+
         line = dmSkipWhitespace(line, FALSE);
     }
     
@@ -271,6 +281,7 @@
 
 int dmRead3DLineSpriteModel(DMResource *f, DM3DLineSpriteModel *model)
 {
+    DMVector pt;
     char line[512];
 
     memset(model, 0, sizeof(*model));
@@ -289,8 +300,20 @@
                     return DMERR_INVALID_DATA;
                 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;
+                break;
+
             case 'L':
-                if (!dmReadLineSegments(start, model))
+                if (!dmReadLineSegments(start, model, FALSE, &pt))
+                    return DMERR_INVALID_DATA;
+                break;
+
+            case 'R':
+                if (!dmReadLineSegments(start, model, TRUE, &pt))
                     return DMERR_INVALID_DATA;
                 break;