Mercurial > hg > dmlib
comparison 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 |
comparison
equal
deleted
inserted
replaced
250:3520489320bc | 251:98483680ea0f |
---|---|
86 return dmAdd3DBitmap(&model->nbitmaps, &model->nbitmapsalloc, | 86 return dmAdd3DBitmap(&model->nbitmaps, &model->nbitmapsalloc, |
87 &model->bitmaps, v, index); | 87 &model->bitmaps, v, index); |
88 } | 88 } |
89 | 89 |
90 | 90 |
91 static inline DMFloat dmPX(DMVector p) | 91 static inline DMFloat dmPX(int cx, DMVector p) |
92 { | 92 { |
93 return 320 + p.x * 250.0f / (p.z + 501.0f); | 93 return cx + (p.x * 250.0f) / p.z; |
94 } | 94 } |
95 | 95 |
96 | 96 |
97 static inline DMFloat dmPY(DMVector p) | 97 static inline DMFloat dmPY(int cy, DMVector p) |
98 { | 98 { |
99 return 200 + p.y * 250.0f / (p.z + 501.0f); | 99 return cy + (p.y * 250.0f) / p.z; |
100 } | 100 } |
101 | 101 |
102 | 102 |
103 void dmDraw3DLineSpriteModel(SDL_Surface *screen, DM3DLineSpriteModel *model, DMVector *pos, DMMatrix *mat, SDL_Surface *fbmap, Uint32 lcol) | 103 void dmDraw3DLineSpriteModel(SDL_Surface *screen, DM3DLineSpriteModel *model, DMVector *pos, DMMatrix *mat, SDL_Surface *fbmap, Uint32 lcol) |
104 { | 104 { |
105 int i; | 105 int i; |
106 int cx = screen->w / 2, cy = screen->h / 2; | |
106 for (i = 0; i < model->nlines; i++) | 107 for (i = 0; i < model->nlines; i++) |
107 { | 108 { |
108 DM3DLine *line = &model->lines[i]; | 109 DM3DLine *line = &model->lines[i]; |
109 DMVector pv[2]; | 110 DMVector pv[2]; |
110 dm_vector_add_r(&pv[0], &model->vertices[line->v1], pos); | 111 dm_vector_add_r(&pv[0], &model->vertices[line->v1], pos); |
111 dm_vector_add_r(&pv[1], &model->vertices[line->v2], pos); | 112 dm_vector_add_r(&pv[1], &model->vertices[line->v2], pos); |
112 dm_vector_mul_by_mat_n(pv, 2, mat); | 113 dm_vector_mul_by_mat_n(pv, 2, mat); |
113 | 114 |
114 if (line->type > 1) | 115 if (line->type > 1) |
115 dmDrawLineSpec(screen, dmPX(pv[0]), dmPY(pv[0]), dmPX(pv[1]), dmPY(pv[1]), lcol, fbmap); | 116 dmDrawLineSpec(screen, dmPX(cx, pv[0]), dmPY(cy, pv[0]), dmPX(cx, pv[1]), dmPY(cy, pv[1]), lcol, fbmap); |
116 else | 117 else |
117 dmDrawLine32(screen, dmPX(pv[0]), dmPY(pv[0]), dmPX(pv[1]), dmPY(pv[1]), lcol); | 118 dmDrawLine32(screen, dmPX(cx, pv[0]), dmPY(cy, pv[0]), dmPX(cx, pv[1]), dmPY(cy, pv[1]), lcol); |
118 } | 119 } |
119 | 120 |
120 for (i = 0; i < model->nsprites; i++) | 121 for (i = 0; i < model->nsprites; i++) |
121 { | 122 { |
122 DM3DSprite *sprite = &model->sprites[i]; | 123 DM3DSprite *sprite = &model->sprites[i]; |
123 DM3DBitmap *bmp = &model->bitmaps[sprite->bitmap]; | 124 DM3DBitmap *bmp = &model->bitmaps[sprite->bitmap]; |
124 DMVector pv, pt; | 125 DMVector pv, pt; |
125 dm_vector_add_r(&pt, &model->vertices[sprite->v], pos); | 126 dm_vector_add_r(&pt, &model->vertices[sprite->v], pos); |
126 dm_vector_mul_by_mat(&pv, &pt, mat); | 127 dm_vector_mul_by_mat(&pv, &pt, mat); |
127 dmUnscaledBlitSurface32to32Transparent(bmp->img, dmPX(pv), dmPY(pv), screen); | 128 dmUnscaledBlitSurface32to32Transparent(bmp->img, dmPX(cx, pv), dmPY(cy, pv), screen); |
128 } | 129 } |
129 } | 130 } |
130 | 131 |
131 | 132 |
132 static char *dmSkipWhitespace(char *line, BOOL invert) | 133 static char *dmSkipWhitespace(char *line, BOOL invert) |
178 line = dmSkipWhitespace(line, TRUE); | 179 line = dmSkipWhitespace(line, TRUE); |
179 DMVector v, p, *t; | 180 DMVector v, p, *t; |
180 dm_vector_copy(&v, pt); | 181 dm_vector_copy(&v, pt); |
181 for (vertex = 0; vertex <= nvertices; vertex++) | 182 for (vertex = 0; vertex <= nvertices; vertex++) |
182 { | 183 { |
183 if (!dmReadCoordinate(&line, &p.x, TRUE)) return FALSE; | 184 if (*line == 'Z') |
184 if (!dmReadCoordinate(&line, &p.y, TRUE)) return FALSE; | 185 { |
185 if (!dmReadCoordinate(&line, &p.z, FALSE)) return FALSE; | 186 indices[vertex] = indices[0]; |
186 if (relative) | 187 line++; |
187 { | |
188 dm_vector_add(&v, &p); | |
189 t = &v; | |
190 } | 188 } |
191 else | 189 else |
192 { | 190 { |
193 dm_vector_add_r(&v, &p, pt); | 191 if (!dmReadCoordinate(&line, &p.x, TRUE)) return FALSE; |
194 t = &v; | 192 if (!dmReadCoordinate(&line, &p.y, TRUE)) return FALSE; |
195 } | 193 if (!dmReadCoordinate(&line, &p.z, FALSE)) return FALSE; |
196 | 194 if (relative) |
197 if (dmAdd3DLineSpriteModelVertex(model, t, &indices[vertex]) != DMERR_OK) | 195 { |
198 goto error; | 196 dm_vector_add(&v, &p); |
197 t = &v; | |
198 } | |
199 else | |
200 { | |
201 dm_vector_add_r(&v, &p, pt); | |
202 t = &v; | |
203 } | |
204 | |
205 if (dmAdd3DLineSpriteModelVertex(model, t, &indices[vertex]) != DMERR_OK) | |
206 goto error; | |
207 } | |
199 | 208 |
200 line = dmSkipWhitespace(line, FALSE); | 209 line = dmSkipWhitespace(line, FALSE); |
201 } | 210 } |
202 | 211 |
203 if (sscanf(line, "%d", &type) != 1) | 212 if (sscanf(line, "%d", &type) != 1) |