# HG changeset patch # User Matti Hamalainen # Date 1349792527 -10800 # Node ID a9d500e5698d804b9d99afcf03ec1ed376a4aada # Parent 2cbe74477441af295fbd87a6c4efec092af40064 Improve the parser. diff -r 2cbe74477441 -r a9d500e5698d dmq3d.c --- 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;