# HG changeset patch # User Matti Hamalainen # Date 1349794000 -10800 # Node ID eed8eed58f8256bd977cf6ecb29ab64ff026d345 # Parent 00785510b7439394f31d01aa45c79b0461745646 Changes in the 3d loader. diff -r 00785510b743 -r eed8eed58f82 dmq3d.c --- a/dmq3d.c Tue Oct 09 17:22:52 2012 +0300 +++ b/dmq3d.c Tue Oct 09 17:46:40 2012 +0300 @@ -189,7 +189,10 @@ t = &v; } else - t = &p; + { + dm_vector_add_r(&v, &p, pt); + t = &v; + } if (dmAdd3DLineSpriteModelVertex(model, t, &indices[vertex]) != DMERR_OK) goto error; @@ -279,12 +282,13 @@ } -int dmRead3DLineSpriteModel(DMResource *f, DM3DLineSpriteModel *model) +int dmRead3DLineSpriteModel(DMResource *f, DM3DLineSpriteModel **model) { DMVector pt; char line[512]; - memset(model, 0, sizeof(*model)); + if ((*model = dmMalloc0(sizeof(DM3DLineSpriteModel))) == NULL) + return DMERR_MALLOC; while (dmfgets(line, sizeof(line), f) != NULL) { @@ -296,7 +300,7 @@ break; case 'B': - if (!dmReadBitmap(start, model)) + if (!dmReadBitmap(start, *model)) return DMERR_INVALID_DATA; break; @@ -308,17 +312,17 @@ break; case 'L': - if (!dmReadLineSegments(start, model, FALSE, &pt)) + if (!dmReadLineSegments(start, *model, FALSE, &pt)) return DMERR_INVALID_DATA; break; case 'R': - if (!dmReadLineSegments(start, model, TRUE, &pt)) + if (!dmReadLineSegments(start, *model, TRUE, &pt)) return DMERR_INVALID_DATA; break; case 'S': - if (!dmReadSprite(start, model)) + if (!dmReadSprite(start, *model)) return DMERR_INVALID_DATA; break; @@ -326,6 +330,22 @@ break; } } + return DMERR_OK; - return DMERR_OK; + +void dmFree3DLineSpriteModel(DM3DLineSpriteModel *model) +{ + int i; + for (i = 0; i < model->nbitmaps; i++) + { + if (model->bitmaps[i].img != NULL) + SDL_FreeSurface(model->bitmaps[i].img); + } + + dmFree(model->bitmaps); + dmFree(model->vertices); + dmFree(model->lines); + dmFree(model->sprites); + dmFree(model); } +} diff -r 00785510b743 -r eed8eed58f82 dmq3d.h --- a/dmq3d.h Tue Oct 09 17:22:52 2012 +0300 +++ b/dmq3d.h Tue Oct 09 17:46:40 2012 +0300 @@ -56,7 +56,9 @@ int dmAdd3DLineSpriteModelSprite(DM3DLineSpriteModel *model, DM3DSprite *v, int *index); int dmAdd3DLineSpriteModelBitmap(DM3DLineSpriteModel *model, DM3DBitmap *v, int *index); -int dmRead3DLineSpriteModel(DMResource *f, DM3DLineSpriteModel *model); +int dmRead3DLineSpriteModel(DMResource *f, DM3DLineSpriteModel **model); +void dmFree3DLineSpriteModel(DM3DLineSpriteModel *model); + void dmDraw3DLineSpriteModel(SDL_Surface *screen, DM3DLineSpriteModel *model, DMVector *pos, DMMatrix *mat, SDL_Surface *fbmap, Uint32 lcol); diff -r 00785510b743 -r eed8eed58f82 vptest.c --- a/vptest.c Tue Oct 09 17:22:52 2012 +0300 +++ b/vptest.c Tue Oct 09 17:46:40 2012 +0300 @@ -132,7 +132,7 @@ TTF_Font *font = NULL; int mouseX, mouseY, bx, by; BOOL initSDL = FALSE, initTTF = FALSE, exitFlag; - DM3DLineSpriteModel model; + DM3DLineSpriteModel *model; dmVerbosity = 5; if (!dmArgsProcess(argc, argv, optList, optListN, @@ -303,15 +303,15 @@ #if 1 DMVector pos; - pos.x = 40; - pos.y = 10; + pos.x = -100; + pos.y = -100; pos.z = 0; DMMatrix mat; // dm_matrix_rot_a(&mat, f*0.1, 0, (3.1415926535f * 2.0f * ((DMFloat) mouseX + (DMFloat) mouseY) ) / 500.0f); dm_matrix_rot_a(&mat, 0, 0, f*0.1); - dmDraw3DLineSpriteModel(screen, &model, &pos, &mat, fbmap, lcol); + dmDraw3DLineSpriteModel(screen, model, &pos, &mat, fbmap, lcol); #endif