diff dmq3d.c @ 251:98483680ea0f

Improve converter and adjust parser accordingly.
author Matti Hamalainen <ccr@tnsp.org>
date Tue, 09 Oct 2012 20:59:30 +0300
parents 3b028785b843
children 61eb5fb4a5e6
line wrap: on
line diff
--- a/dmq3d.c	Tue Oct 09 20:14:23 2012 +0300
+++ b/dmq3d.c	Tue Oct 09 20:59:30 2012 +0300
@@ -88,21 +88,22 @@
 }
 
 
-static inline DMFloat dmPX(DMVector p)
+static inline DMFloat dmPX(int cx, DMVector p)
 {
-    return 320 + p.x * 250.0f / (p.z + 501.0f);
+    return cx + (p.x * 250.0f) / p.z;
 }
 
 
-static inline DMFloat dmPY(DMVector p)
+static inline DMFloat dmPY(int cy, DMVector p)
 {
-    return 200 + p.y * 250.0f / (p.z + 501.0f);
+    return cy + (p.y * 250.0f) / p.z;
 }
 
 
 void dmDraw3DLineSpriteModel(SDL_Surface *screen, DM3DLineSpriteModel *model, DMVector *pos, DMMatrix *mat, SDL_Surface *fbmap, Uint32 lcol)
 {
     int i;
+    int cx = screen->w / 2, cy = screen->h / 2;
     for (i = 0; i < model->nlines; i++)
     {
         DM3DLine *line = &model->lines[i];
@@ -112,9 +113,9 @@
         dm_vector_mul_by_mat_n(pv, 2, mat);
         
         if (line->type > 1)
-            dmDrawLineSpec(screen, dmPX(pv[0]), dmPY(pv[0]), dmPX(pv[1]), dmPY(pv[1]), lcol, fbmap);
+            dmDrawLineSpec(screen, dmPX(cx, pv[0]), dmPY(cy, pv[0]), dmPX(cx, pv[1]), dmPY(cy, pv[1]), lcol, fbmap);
         else
-            dmDrawLine32(screen, dmPX(pv[0]), dmPY(pv[0]), dmPX(pv[1]), dmPY(pv[1]), lcol);
+            dmDrawLine32(screen, dmPX(cx, pv[0]), dmPY(cy, pv[0]), dmPX(cx, pv[1]), dmPY(cy, pv[1]), lcol);
     }
 
     for (i = 0; i < model->nsprites; i++)
@@ -124,7 +125,7 @@
         DMVector pv, pt;
         dm_vector_add_r(&pt, &model->vertices[sprite->v], pos);
         dm_vector_mul_by_mat(&pv, &pt, mat);
-        dmUnscaledBlitSurface32to32Transparent(bmp->img, dmPX(pv), dmPY(pv), screen);
+        dmUnscaledBlitSurface32to32Transparent(bmp->img, dmPX(cx, pv), dmPY(cy, pv), screen);
     }
 }
 
@@ -180,23 +181,31 @@
     dm_vector_copy(&v, pt);
     for (vertex = 0; vertex <= nvertices; vertex++)
     {
-        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 (relative)
+        if (*line == 'Z')
         {
-            dm_vector_add(&v, &p);
-            t = &v;
+            indices[vertex] = indices[0];
+            line++;
         }
         else
         {
-            dm_vector_add_r(&v, &p, pt);
-            t = &v;
+            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 (relative)
+            {
+                dm_vector_add(&v, &p);
+                t = &v;
+            }
+            else
+            {
+                dm_vector_add_r(&v, &p, pt);
+                t = &v;
+            }
+
+            if (dmAdd3DLineSpriteModelVertex(model, t, &indices[vertex]) != DMERR_OK)
+                goto error;
         }
 
-        if (dmAdd3DLineSpriteModelVertex(model, t, &indices[vertex]) != DMERR_OK)
-            goto error;
-
         line = dmSkipWhitespace(line, FALSE);
     }