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)