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