Mercurial > hg > dmlib
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;