# HG changeset patch # User Matti Hamalainen # Date 1349800579 -10800 # Node ID 3b028785b843a65fb7ddb16d8fe492f196e636c3 # Parent e6303e0c62cb05a18a7ce328a36986b61c307e57 Various improvements in the .3d parser. diff -r e6303e0c62cb -r 3b028785b843 dmq3d.c --- 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;