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 {