Mercurial > hg > dmlib
comparison dmq3d.c @ 249:3b028785b843
Various improvements in the .3d parser.
author | Matti Hamalainen <ccr@tnsp.org> |
---|---|
date | Tue, 09 Oct 2012 19:36:19 +0300 |
parents | 3bf8ebf09a6a |
children | 98483680ea0f |
comparison
equal
deleted
inserted
replaced
248:e6303e0c62cb | 249:3b028785b843 |
---|---|
220 error: | 220 error: |
221 dmFree(indices); | 221 dmFree(indices); |
222 return FALSE; | 222 return FALSE; |
223 } | 223 } |
224 | 224 |
225 static BOOL dmReadSprite(char *line, DM3DLineSpriteModel *model) | 225 static BOOL dmReadSprite(char *line, DM3DLineSpriteModel *model, DMVector *pos) |
226 { | 226 { |
227 DMVector pt; | 227 DMVector pt; |
228 DM3DSprite spr; | 228 DM3DSprite spr; |
229 | 229 |
230 line++; | 230 line++; |
238 return FALSE; | 238 return FALSE; |
239 } | 239 } |
240 | 240 |
241 spr.bitmap = atoi(line + 1); | 241 spr.bitmap = atoi(line + 1); |
242 | 242 |
243 dm_vector_add(&pt, pos); | |
243 if (dmAdd3DLineSpriteModelVertex(model, &pt, &spr.v) != DMERR_OK) | 244 if (dmAdd3DLineSpriteModelVertex(model, &pt, &spr.v) != DMERR_OK) |
244 return FALSE; | 245 return FALSE; |
245 | 246 |
246 if (dmAdd3DLineSpriteModelSprite(model, &spr, NULL) != DMERR_OK) | 247 if (dmAdd3DLineSpriteModelSprite(model, &spr, NULL) != DMERR_OK) |
247 return FALSE; | 248 return FALSE; |
280 fprintf(stderr, "loaded '%s': %d: %p\n", rbmp->name, index, rbmp->img); | 281 fprintf(stderr, "loaded '%s': %d: %p\n", rbmp->name, index, rbmp->img); |
281 return TRUE; | 282 return TRUE; |
282 } | 283 } |
283 | 284 |
284 | 285 |
286 static int dmDoRead3DLineSpriteModel(DMResource *f, DM3DLineSpriteModel *model, DMVector *pos) | |
287 { | |
288 char line[512]; | |
289 | |
290 while (dmfgets(line, sizeof(line), f) != NULL) | |
291 { | |
292 char *start = dmSkipWhitespace(line, FALSE); | |
293 switch (*start) | |
294 { | |
295 case 0: | |
296 case '#': | |
297 break; | |
298 | |
299 case 'G': | |
300 { | |
301 int res; | |
302 DMVector pt; | |
303 start++; | |
304 if (!dmReadCoordinate(&start, &pt.x, TRUE)) return DMERR_INVALID_DATA; | |
305 if (!dmReadCoordinate(&start, &pt.y, TRUE)) return DMERR_INVALID_DATA; | |
306 if (!dmReadCoordinate(&start, &pt.z, FALSE)) return DMERR_INVALID_DATA; | |
307 dm_vector_add_r(&pt, pos, &pt); | |
308 if ((res = dmDoRead3DLineSpriteModel(f, model, &pt)) != DMERR_OK) | |
309 return res; | |
310 } | |
311 break; | |
312 | |
313 case 'E': | |
314 return DMERR_OK; | |
315 | |
316 case 'B': | |
317 if (!dmReadBitmap(start, model)) | |
318 return DMERR_INVALID_DATA; | |
319 break; | |
320 | |
321 case 'L': | |
322 if (!dmReadLineSegments(start, model, FALSE, pos)) | |
323 return DMERR_INVALID_DATA; | |
324 break; | |
325 | |
326 case 'R': | |
327 if (!dmReadLineSegments(start, model, TRUE, pos)) | |
328 return DMERR_INVALID_DATA; | |
329 break; | |
330 | |
331 case 'S': | |
332 if (!dmReadSprite(start, model, pos)) | |
333 return DMERR_INVALID_DATA; | |
334 break; | |
335 | |
336 default: | |
337 break; | |
338 } | |
339 } | |
340 return DMERR_OK; | |
341 } | |
342 | |
343 | |
285 int dmRead3DLineSpriteModel(DMResource *f, DM3DLineSpriteModel **model) | 344 int dmRead3DLineSpriteModel(DMResource *f, DM3DLineSpriteModel **model) |
286 { | 345 { |
287 DMVector pt; | 346 DMVector pos; |
288 char line[512]; | |
289 | 347 |
290 if ((*model = dmMalloc0(sizeof(DM3DLineSpriteModel))) == NULL) | 348 if ((*model = dmMalloc0(sizeof(DM3DLineSpriteModel))) == NULL) |
291 return DMERR_MALLOC; | 349 return DMERR_MALLOC; |
292 | 350 |
293 while (dmfgets(line, sizeof(line), f) != NULL) | 351 memset(&pos, 0, sizeof(pos)); |
294 { | 352 |
295 char *start = dmSkipWhitespace(line, FALSE); | 353 return dmDoRead3DLineSpriteModel(f, *model, &pos); |
296 switch (*start) | |
297 { | |
298 case 0: | |
299 case '#': | |
300 break; | |
301 | |
302 case 'B': | |
303 if (!dmReadBitmap(start, *model)) | |
304 return DMERR_INVALID_DATA; | |
305 break; | |
306 | |
307 case 'P': | |
308 start++; | |
309 if (!dmReadCoordinate(&start, &pt.x, TRUE)) return FALSE; | |
310 if (!dmReadCoordinate(&start, &pt.y, TRUE)) return FALSE; | |
311 if (!dmReadCoordinate(&start, &pt.z, FALSE)) return FALSE; | |
312 break; | |
313 | |
314 case 'L': | |
315 if (!dmReadLineSegments(start, *model, FALSE, &pt)) | |
316 return DMERR_INVALID_DATA; | |
317 break; | |
318 | |
319 case 'R': | |
320 if (!dmReadLineSegments(start, *model, TRUE, &pt)) | |
321 return DMERR_INVALID_DATA; | |
322 break; | |
323 | |
324 case 'S': | |
325 if (!dmReadSprite(start, *model)) | |
326 return DMERR_INVALID_DATA; | |
327 break; | |
328 | |
329 default: | |
330 break; | |
331 } | |
332 } | |
333 return DMERR_OK; | |
334 } | 354 } |
335 | 355 |
336 | 356 |
337 void dmFree3DLineSpriteModel(DM3DLineSpriteModel *model) | 357 void dmFree3DLineSpriteModel(DM3DLineSpriteModel *model) |
338 { | 358 { |