Mercurial > hg > dmlib
annotate dmq3d.c @ 526:f7df57cafdd9
Add support for Interpaint (unpacked) and Doodle (unpacked) hires formats.
author | Matti Hamalainen <ccr@tnsp.org> |
---|---|
date | Thu, 22 Nov 2012 01:07:45 +0200 |
parents | d5a90ba09dc4 |
children | 3d813c81f33c |
rev | line source |
---|---|
360
d5a90ba09dc4
Fix to match with resource management changes.
Matti Hamalainen <ccr@tnsp.org>
parents:
348
diff
changeset
|
1 #include "dmlib.h" |
241
3bff024a91be
Move 3D line/sprite renderer to separate module.
Matti Hamalainen <ccr@tnsp.org>
parents:
diff
changeset
|
2 #include "dmq3d.h" |
3bff024a91be
Move 3D line/sprite renderer to separate module.
Matti Hamalainen <ccr@tnsp.org>
parents:
diff
changeset
|
3 #include "dmimage.h" |
3bff024a91be
Move 3D line/sprite renderer to separate module.
Matti Hamalainen <ccr@tnsp.org>
parents:
diff
changeset
|
4 |
3bff024a91be
Move 3D line/sprite renderer to separate module.
Matti Hamalainen <ccr@tnsp.org>
parents:
diff
changeset
|
5 |
3bff024a91be
Move 3D line/sprite renderer to separate module.
Matti Hamalainen <ccr@tnsp.org>
parents:
diff
changeset
|
6 #define DM_DRAWLINE_NAME dmDrawLineSpec |
3bff024a91be
Move 3D line/sprite renderer to separate module.
Matti Hamalainen <ccr@tnsp.org>
parents:
diff
changeset
|
7 #define DM_DRAWLINE_DST_BYTES 4 |
3bff024a91be
Move 3D line/sprite renderer to separate module.
Matti Hamalainen <ccr@tnsp.org>
parents:
diff
changeset
|
8 #define DM_DRAWLINE_DST_TYPE DMRGBA32 |
3bff024a91be
Move 3D line/sprite renderer to separate module.
Matti Hamalainen <ccr@tnsp.org>
parents:
diff
changeset
|
9 #define DM_DRAWLINE_ARGS , SDL_Surface *bmp |
3bff024a91be
Move 3D line/sprite renderer to separate module.
Matti Hamalainen <ccr@tnsp.org>
parents:
diff
changeset
|
10 #define DM_DRAWLINE_INIT const int px = bmp->w / 2, py = bmp->h / 2; |
3bff024a91be
Move 3D line/sprite renderer to separate module.
Matti Hamalainen <ccr@tnsp.org>
parents:
diff
changeset
|
11 #define DM_DRAWLINE_INNER \ |
3bff024a91be
Move 3D line/sprite renderer to separate module.
Matti Hamalainen <ccr@tnsp.org>
parents:
diff
changeset
|
12 dmUnscaledBlitSurface32to32Transparent(bmp, x0-px, y0-py, screen); |
3bff024a91be
Move 3D line/sprite renderer to separate module.
Matti Hamalainen <ccr@tnsp.org>
parents:
diff
changeset
|
13 #define DM_DRAWLINE_SPEC |
3bff024a91be
Move 3D line/sprite renderer to separate module.
Matti Hamalainen <ccr@tnsp.org>
parents:
diff
changeset
|
14 #include "dmdrawline.h" |
3bff024a91be
Move 3D line/sprite renderer to separate module.
Matti Hamalainen <ccr@tnsp.org>
parents:
diff
changeset
|
15 |
3bff024a91be
Move 3D line/sprite renderer to separate module.
Matti Hamalainen <ccr@tnsp.org>
parents:
diff
changeset
|
16 |
3bff024a91be
Move 3D line/sprite renderer to separate module.
Matti Hamalainen <ccr@tnsp.org>
parents:
diff
changeset
|
17 static int dmFind3DBitmap(int nitems, DM3DBitmap *items, DM3DBitmap *item) |
3bff024a91be
Move 3D line/sprite renderer to separate module.
Matti Hamalainen <ccr@tnsp.org>
parents:
diff
changeset
|
18 { |
3bff024a91be
Move 3D line/sprite renderer to separate module.
Matti Hamalainen <ccr@tnsp.org>
parents:
diff
changeset
|
19 int i; |
3bff024a91be
Move 3D line/sprite renderer to separate module.
Matti Hamalainen <ccr@tnsp.org>
parents:
diff
changeset
|
20 for (i = 0; i < nitems; i++) |
3bff024a91be
Move 3D line/sprite renderer to separate module.
Matti Hamalainen <ccr@tnsp.org>
parents:
diff
changeset
|
21 if (strcmp(item->name, items[i].name) == 0) |
3bff024a91be
Move 3D line/sprite renderer to separate module.
Matti Hamalainen <ccr@tnsp.org>
parents:
diff
changeset
|
22 return i; |
3bff024a91be
Move 3D line/sprite renderer to separate module.
Matti Hamalainen <ccr@tnsp.org>
parents:
diff
changeset
|
23 return -1; |
3bff024a91be
Move 3D line/sprite renderer to separate module.
Matti Hamalainen <ccr@tnsp.org>
parents:
diff
changeset
|
24 } |
3bff024a91be
Move 3D line/sprite renderer to separate module.
Matti Hamalainen <ccr@tnsp.org>
parents:
diff
changeset
|
25 |
3bff024a91be
Move 3D line/sprite renderer to separate module.
Matti Hamalainen <ccr@tnsp.org>
parents:
diff
changeset
|
26 #define DM_FIND_ITEM_FUNC(NAME, TYPE) \ |
3bff024a91be
Move 3D line/sprite renderer to separate module.
Matti Hamalainen <ccr@tnsp.org>
parents:
diff
changeset
|
27 static int dmFind3D ## NAME (int nitems, TYPE *items, TYPE *item) \ |
3bff024a91be
Move 3D line/sprite renderer to separate module.
Matti Hamalainen <ccr@tnsp.org>
parents:
diff
changeset
|
28 { \ |
3bff024a91be
Move 3D line/sprite renderer to separate module.
Matti Hamalainen <ccr@tnsp.org>
parents:
diff
changeset
|
29 int i; \ |
3bff024a91be
Move 3D line/sprite renderer to separate module.
Matti Hamalainen <ccr@tnsp.org>
parents:
diff
changeset
|
30 for (i = 0; i < nitems; i++) \ |
3bff024a91be
Move 3D line/sprite renderer to separate module.
Matti Hamalainen <ccr@tnsp.org>
parents:
diff
changeset
|
31 if (memcmp(item, items+i, sizeof(TYPE)) == 0) \ |
3bff024a91be
Move 3D line/sprite renderer to separate module.
Matti Hamalainen <ccr@tnsp.org>
parents:
diff
changeset
|
32 return i; \ |
3bff024a91be
Move 3D line/sprite renderer to separate module.
Matti Hamalainen <ccr@tnsp.org>
parents:
diff
changeset
|
33 return -1; \ |
3bff024a91be
Move 3D line/sprite renderer to separate module.
Matti Hamalainen <ccr@tnsp.org>
parents:
diff
changeset
|
34 } |
3bff024a91be
Move 3D line/sprite renderer to separate module.
Matti Hamalainen <ccr@tnsp.org>
parents:
diff
changeset
|
35 |
3bff024a91be
Move 3D line/sprite renderer to separate module.
Matti Hamalainen <ccr@tnsp.org>
parents:
diff
changeset
|
36 #define DM_ADD_ITEM_FUNC(NAME, TYPE) \ |
3bff024a91be
Move 3D line/sprite renderer to separate module.
Matti Hamalainen <ccr@tnsp.org>
parents:
diff
changeset
|
37 static int dmAdd3D ## NAME (int *nitems, int *nalloc, TYPE **items, TYPE *item, int *res) \ |
3bff024a91be
Move 3D line/sprite renderer to separate module.
Matti Hamalainen <ccr@tnsp.org>
parents:
diff
changeset
|
38 { \ |
3bff024a91be
Move 3D line/sprite renderer to separate module.
Matti Hamalainen <ccr@tnsp.org>
parents:
diff
changeset
|
39 int tmp; \ |
3bff024a91be
Move 3D line/sprite renderer to separate module.
Matti Hamalainen <ccr@tnsp.org>
parents:
diff
changeset
|
40 if ((tmp = dmFind3D ## NAME (*nitems, *items, item)) >= 0) \ |
3bff024a91be
Move 3D line/sprite renderer to separate module.
Matti Hamalainen <ccr@tnsp.org>
parents:
diff
changeset
|
41 { \ |
3bff024a91be
Move 3D line/sprite renderer to separate module.
Matti Hamalainen <ccr@tnsp.org>
parents:
diff
changeset
|
42 if (res != NULL) *res = tmp; \ |
3bff024a91be
Move 3D line/sprite renderer to separate module.
Matti Hamalainen <ccr@tnsp.org>
parents:
diff
changeset
|
43 return DMERR_OK; \ |
3bff024a91be
Move 3D line/sprite renderer to separate module.
Matti Hamalainen <ccr@tnsp.org>
parents:
diff
changeset
|
44 } \ |
3bff024a91be
Move 3D line/sprite renderer to separate module.
Matti Hamalainen <ccr@tnsp.org>
parents:
diff
changeset
|
45 if ((*nitems) + 1 >= *nalloc) \ |
3bff024a91be
Move 3D line/sprite renderer to separate module.
Matti Hamalainen <ccr@tnsp.org>
parents:
diff
changeset
|
46 { \ |
3bff024a91be
Move 3D line/sprite renderer to separate module.
Matti Hamalainen <ccr@tnsp.org>
parents:
diff
changeset
|
47 (*nalloc) += 16; \ |
3bff024a91be
Move 3D line/sprite renderer to separate module.
Matti Hamalainen <ccr@tnsp.org>
parents:
diff
changeset
|
48 if ((*items = dmRealloc(*items, *nalloc * sizeof(TYPE))) == NULL) \ |
259 | 49 { \ |
50 dmError("Error allocating memory for " # TYPE ".\n"); \ | |
241
3bff024a91be
Move 3D line/sprite renderer to separate module.
Matti Hamalainen <ccr@tnsp.org>
parents:
diff
changeset
|
51 return DMERR_MALLOC; \ |
259 | 52 } \ |
241
3bff024a91be
Move 3D line/sprite renderer to separate module.
Matti Hamalainen <ccr@tnsp.org>
parents:
diff
changeset
|
53 } \ |
3bff024a91be
Move 3D line/sprite renderer to separate module.
Matti Hamalainen <ccr@tnsp.org>
parents:
diff
changeset
|
54 memcpy((*items) + (*nitems), item, sizeof(TYPE)); \ |
3bff024a91be
Move 3D line/sprite renderer to separate module.
Matti Hamalainen <ccr@tnsp.org>
parents:
diff
changeset
|
55 if (res != NULL) *res = *nitems; \ |
3bff024a91be
Move 3D line/sprite renderer to separate module.
Matti Hamalainen <ccr@tnsp.org>
parents:
diff
changeset
|
56 (*nitems)++; \ |
3bff024a91be
Move 3D line/sprite renderer to separate module.
Matti Hamalainen <ccr@tnsp.org>
parents:
diff
changeset
|
57 return DMERR_OK; \ |
3bff024a91be
Move 3D line/sprite renderer to separate module.
Matti Hamalainen <ccr@tnsp.org>
parents:
diff
changeset
|
58 } |
3bff024a91be
Move 3D line/sprite renderer to separate module.
Matti Hamalainen <ccr@tnsp.org>
parents:
diff
changeset
|
59 |
3bff024a91be
Move 3D line/sprite renderer to separate module.
Matti Hamalainen <ccr@tnsp.org>
parents:
diff
changeset
|
60 DM_FIND_ITEM_FUNC(Vertex, DMVector) |
259 | 61 DM_FIND_ITEM_FUNC(Vector, DM3DVector) |
241
3bff024a91be
Move 3D line/sprite renderer to separate module.
Matti Hamalainen <ccr@tnsp.org>
parents:
diff
changeset
|
62 DM_FIND_ITEM_FUNC(Sprite, DM3DSprite) |
3bff024a91be
Move 3D line/sprite renderer to separate module.
Matti Hamalainen <ccr@tnsp.org>
parents:
diff
changeset
|
63 |
3bff024a91be
Move 3D line/sprite renderer to separate module.
Matti Hamalainen <ccr@tnsp.org>
parents:
diff
changeset
|
64 DM_ADD_ITEM_FUNC(Vertex, DMVector) |
259 | 65 DM_ADD_ITEM_FUNC(Vector, DM3DVector) |
241
3bff024a91be
Move 3D line/sprite renderer to separate module.
Matti Hamalainen <ccr@tnsp.org>
parents:
diff
changeset
|
66 DM_ADD_ITEM_FUNC(Sprite, DM3DSprite) |
3bff024a91be
Move 3D line/sprite renderer to separate module.
Matti Hamalainen <ccr@tnsp.org>
parents:
diff
changeset
|
67 DM_ADD_ITEM_FUNC(Bitmap, DM3DBitmap) |
3bff024a91be
Move 3D line/sprite renderer to separate module.
Matti Hamalainen <ccr@tnsp.org>
parents:
diff
changeset
|
68 |
3bff024a91be
Move 3D line/sprite renderer to separate module.
Matti Hamalainen <ccr@tnsp.org>
parents:
diff
changeset
|
69 |
259 | 70 int dmAdd3DVectorSpriteModelVertex(DM3DVectorSpriteModel *model, DMVector *v, int *index) |
241
3bff024a91be
Move 3D line/sprite renderer to separate module.
Matti Hamalainen <ccr@tnsp.org>
parents:
diff
changeset
|
71 { |
3bff024a91be
Move 3D line/sprite renderer to separate module.
Matti Hamalainen <ccr@tnsp.org>
parents:
diff
changeset
|
72 return dmAdd3DVertex(&model->nvertices, &model->nvertexalloc, |
3bff024a91be
Move 3D line/sprite renderer to separate module.
Matti Hamalainen <ccr@tnsp.org>
parents:
diff
changeset
|
73 &model->vertices, v, index); |
3bff024a91be
Move 3D line/sprite renderer to separate module.
Matti Hamalainen <ccr@tnsp.org>
parents:
diff
changeset
|
74 } |
3bff024a91be
Move 3D line/sprite renderer to separate module.
Matti Hamalainen <ccr@tnsp.org>
parents:
diff
changeset
|
75 |
259 | 76 int dmAdd3DVectorSpriteModelVector(DM3DVectorSpriteModel *model, DM3DVector *v, int *index) |
241
3bff024a91be
Move 3D line/sprite renderer to separate module.
Matti Hamalainen <ccr@tnsp.org>
parents:
diff
changeset
|
77 { |
259 | 78 return dmAdd3DVector(&model->nlines, &model->nlinesalloc, |
241
3bff024a91be
Move 3D line/sprite renderer to separate module.
Matti Hamalainen <ccr@tnsp.org>
parents:
diff
changeset
|
79 &model->lines, v, index); |
3bff024a91be
Move 3D line/sprite renderer to separate module.
Matti Hamalainen <ccr@tnsp.org>
parents:
diff
changeset
|
80 } |
3bff024a91be
Move 3D line/sprite renderer to separate module.
Matti Hamalainen <ccr@tnsp.org>
parents:
diff
changeset
|
81 |
259 | 82 int dmAdd3DVectorSpriteModelSprite(DM3DVectorSpriteModel *model, DM3DSprite *v, int *index) |
241
3bff024a91be
Move 3D line/sprite renderer to separate module.
Matti Hamalainen <ccr@tnsp.org>
parents:
diff
changeset
|
83 { |
3bff024a91be
Move 3D line/sprite renderer to separate module.
Matti Hamalainen <ccr@tnsp.org>
parents:
diff
changeset
|
84 return dmAdd3DSprite(&model->nsprites, &model->nspritesalloc, |
3bff024a91be
Move 3D line/sprite renderer to separate module.
Matti Hamalainen <ccr@tnsp.org>
parents:
diff
changeset
|
85 &model->sprites, v, index); |
3bff024a91be
Move 3D line/sprite renderer to separate module.
Matti Hamalainen <ccr@tnsp.org>
parents:
diff
changeset
|
86 } |
3bff024a91be
Move 3D line/sprite renderer to separate module.
Matti Hamalainen <ccr@tnsp.org>
parents:
diff
changeset
|
87 |
259 | 88 int dmAdd3DVectorSpriteModelBitmap(DM3DVectorSpriteModel *model, DM3DBitmap *v, int *index) |
241
3bff024a91be
Move 3D line/sprite renderer to separate module.
Matti Hamalainen <ccr@tnsp.org>
parents:
diff
changeset
|
89 { |
3bff024a91be
Move 3D line/sprite renderer to separate module.
Matti Hamalainen <ccr@tnsp.org>
parents:
diff
changeset
|
90 return dmAdd3DBitmap(&model->nbitmaps, &model->nbitmapsalloc, |
3bff024a91be
Move 3D line/sprite renderer to separate module.
Matti Hamalainen <ccr@tnsp.org>
parents:
diff
changeset
|
91 &model->bitmaps, v, index); |
3bff024a91be
Move 3D line/sprite renderer to separate module.
Matti Hamalainen <ccr@tnsp.org>
parents:
diff
changeset
|
92 } |
3bff024a91be
Move 3D line/sprite renderer to separate module.
Matti Hamalainen <ccr@tnsp.org>
parents:
diff
changeset
|
93 |
3bff024a91be
Move 3D line/sprite renderer to separate module.
Matti Hamalainen <ccr@tnsp.org>
parents:
diff
changeset
|
94 |
251
98483680ea0f
Improve converter and adjust parser accordingly.
Matti Hamalainen <ccr@tnsp.org>
parents:
249
diff
changeset
|
95 static inline DMFloat dmPX(int cx, DMVector p) |
241
3bff024a91be
Move 3D line/sprite renderer to separate module.
Matti Hamalainen <ccr@tnsp.org>
parents:
diff
changeset
|
96 { |
251
98483680ea0f
Improve converter and adjust parser accordingly.
Matti Hamalainen <ccr@tnsp.org>
parents:
249
diff
changeset
|
97 return cx + (p.x * 250.0f) / p.z; |
241
3bff024a91be
Move 3D line/sprite renderer to separate module.
Matti Hamalainen <ccr@tnsp.org>
parents:
diff
changeset
|
98 } |
3bff024a91be
Move 3D line/sprite renderer to separate module.
Matti Hamalainen <ccr@tnsp.org>
parents:
diff
changeset
|
99 |
3bff024a91be
Move 3D line/sprite renderer to separate module.
Matti Hamalainen <ccr@tnsp.org>
parents:
diff
changeset
|
100 |
251
98483680ea0f
Improve converter and adjust parser accordingly.
Matti Hamalainen <ccr@tnsp.org>
parents:
249
diff
changeset
|
101 static inline DMFloat dmPY(int cy, DMVector p) |
241
3bff024a91be
Move 3D line/sprite renderer to separate module.
Matti Hamalainen <ccr@tnsp.org>
parents:
diff
changeset
|
102 { |
251
98483680ea0f
Improve converter and adjust parser accordingly.
Matti Hamalainen <ccr@tnsp.org>
parents:
249
diff
changeset
|
103 return cy + (p.y * 250.0f) / p.z; |
241
3bff024a91be
Move 3D line/sprite renderer to separate module.
Matti Hamalainen <ccr@tnsp.org>
parents:
diff
changeset
|
104 } |
3bff024a91be
Move 3D line/sprite renderer to separate module.
Matti Hamalainen <ccr@tnsp.org>
parents:
diff
changeset
|
105 |
3bff024a91be
Move 3D line/sprite renderer to separate module.
Matti Hamalainen <ccr@tnsp.org>
parents:
diff
changeset
|
106 |
348 | 107 void dmDraw3DVectorSpriteModel(SDL_Surface *screen, const DM3DVectorSpriteModel *model, const DMVector *pos, const DMMatrix *mat, SDL_Surface *fbmap, const Uint32 lcol) |
241
3bff024a91be
Move 3D line/sprite renderer to separate module.
Matti Hamalainen <ccr@tnsp.org>
parents:
diff
changeset
|
108 { |
3bff024a91be
Move 3D line/sprite renderer to separate module.
Matti Hamalainen <ccr@tnsp.org>
parents:
diff
changeset
|
109 int i; |
251
98483680ea0f
Improve converter and adjust parser accordingly.
Matti Hamalainen <ccr@tnsp.org>
parents:
249
diff
changeset
|
110 int cx = screen->w / 2, cy = screen->h / 2; |
241
3bff024a91be
Move 3D line/sprite renderer to separate module.
Matti Hamalainen <ccr@tnsp.org>
parents:
diff
changeset
|
111 for (i = 0; i < model->nlines; i++) |
3bff024a91be
Move 3D line/sprite renderer to separate module.
Matti Hamalainen <ccr@tnsp.org>
parents:
diff
changeset
|
112 { |
259 | 113 DM3DVector *line = &model->lines[i]; |
241
3bff024a91be
Move 3D line/sprite renderer to separate module.
Matti Hamalainen <ccr@tnsp.org>
parents:
diff
changeset
|
114 DMVector pv[2]; |
253
61eb5fb4a5e6
Fix a silly rendering issue.
Matti Hamalainen <ccr@tnsp.org>
parents:
251
diff
changeset
|
115 dm_vector_copy(&pv[0], &model->vertices[line->v1]); |
61eb5fb4a5e6
Fix a silly rendering issue.
Matti Hamalainen <ccr@tnsp.org>
parents:
251
diff
changeset
|
116 dm_vector_copy(&pv[1], &model->vertices[line->v2]); |
241
3bff024a91be
Move 3D line/sprite renderer to separate module.
Matti Hamalainen <ccr@tnsp.org>
parents:
diff
changeset
|
117 dm_vector_mul_by_mat_n(pv, 2, mat); |
253
61eb5fb4a5e6
Fix a silly rendering issue.
Matti Hamalainen <ccr@tnsp.org>
parents:
251
diff
changeset
|
118 dm_vector_add(&pv[0], pos); |
61eb5fb4a5e6
Fix a silly rendering issue.
Matti Hamalainen <ccr@tnsp.org>
parents:
251
diff
changeset
|
119 dm_vector_add(&pv[1], pos); |
241
3bff024a91be
Move 3D line/sprite renderer to separate module.
Matti Hamalainen <ccr@tnsp.org>
parents:
diff
changeset
|
120 |
267 | 121 if (pv[0].z <= 0 && pv[1].z <= 0) |
122 continue; | |
123 | |
241
3bff024a91be
Move 3D line/sprite renderer to separate module.
Matti Hamalainen <ccr@tnsp.org>
parents:
diff
changeset
|
124 if (line->type > 1) |
251
98483680ea0f
Improve converter and adjust parser accordingly.
Matti Hamalainen <ccr@tnsp.org>
parents:
249
diff
changeset
|
125 dmDrawLineSpec(screen, dmPX(cx, pv[0]), dmPY(cy, pv[0]), dmPX(cx, pv[1]), dmPY(cy, pv[1]), lcol, fbmap); |
241
3bff024a91be
Move 3D line/sprite renderer to separate module.
Matti Hamalainen <ccr@tnsp.org>
parents:
diff
changeset
|
126 else |
251
98483680ea0f
Improve converter and adjust parser accordingly.
Matti Hamalainen <ccr@tnsp.org>
parents:
249
diff
changeset
|
127 dmDrawLine32(screen, dmPX(cx, pv[0]), dmPY(cy, pv[0]), dmPX(cx, pv[1]), dmPY(cy, pv[1]), lcol); |
241
3bff024a91be
Move 3D line/sprite renderer to separate module.
Matti Hamalainen <ccr@tnsp.org>
parents:
diff
changeset
|
128 } |
3bff024a91be
Move 3D line/sprite renderer to separate module.
Matti Hamalainen <ccr@tnsp.org>
parents:
diff
changeset
|
129 |
3bff024a91be
Move 3D line/sprite renderer to separate module.
Matti Hamalainen <ccr@tnsp.org>
parents:
diff
changeset
|
130 for (i = 0; i < model->nsprites; i++) |
3bff024a91be
Move 3D line/sprite renderer to separate module.
Matti Hamalainen <ccr@tnsp.org>
parents:
diff
changeset
|
131 { |
3bff024a91be
Move 3D line/sprite renderer to separate module.
Matti Hamalainen <ccr@tnsp.org>
parents:
diff
changeset
|
132 DM3DSprite *sprite = &model->sprites[i]; |
3bff024a91be
Move 3D line/sprite renderer to separate module.
Matti Hamalainen <ccr@tnsp.org>
parents:
diff
changeset
|
133 DM3DBitmap *bmp = &model->bitmaps[sprite->bitmap]; |
253
61eb5fb4a5e6
Fix a silly rendering issue.
Matti Hamalainen <ccr@tnsp.org>
parents:
251
diff
changeset
|
134 DMVector pv; |
61eb5fb4a5e6
Fix a silly rendering issue.
Matti Hamalainen <ccr@tnsp.org>
parents:
251
diff
changeset
|
135 dm_vector_mul_by_mat(&pv, &model->vertices[sprite->v], mat); |
61eb5fb4a5e6
Fix a silly rendering issue.
Matti Hamalainen <ccr@tnsp.org>
parents:
251
diff
changeset
|
136 dm_vector_add(&pv, pos); |
267 | 137 if (pv.z <= 0) |
138 continue; | |
251
98483680ea0f
Improve converter and adjust parser accordingly.
Matti Hamalainen <ccr@tnsp.org>
parents:
249
diff
changeset
|
139 dmUnscaledBlitSurface32to32Transparent(bmp->img, dmPX(cx, pv), dmPY(cy, pv), screen); |
241
3bff024a91be
Move 3D line/sprite renderer to separate module.
Matti Hamalainen <ccr@tnsp.org>
parents:
diff
changeset
|
140 } |
3bff024a91be
Move 3D line/sprite renderer to separate module.
Matti Hamalainen <ccr@tnsp.org>
parents:
diff
changeset
|
141 } |
3bff024a91be
Move 3D line/sprite renderer to separate module.
Matti Hamalainen <ccr@tnsp.org>
parents:
diff
changeset
|
142 |
3bff024a91be
Move 3D line/sprite renderer to separate module.
Matti Hamalainen <ccr@tnsp.org>
parents:
diff
changeset
|
143 |
3bff024a91be
Move 3D line/sprite renderer to separate module.
Matti Hamalainen <ccr@tnsp.org>
parents:
diff
changeset
|
144 static char *dmSkipWhitespace(char *line, BOOL invert) |
3bff024a91be
Move 3D line/sprite renderer to separate module.
Matti Hamalainen <ccr@tnsp.org>
parents:
diff
changeset
|
145 { |
3bff024a91be
Move 3D line/sprite renderer to separate module.
Matti Hamalainen <ccr@tnsp.org>
parents:
diff
changeset
|
146 if (invert) |
3bff024a91be
Move 3D line/sprite renderer to separate module.
Matti Hamalainen <ccr@tnsp.org>
parents:
diff
changeset
|
147 for (; *line && !isspace(*line); line++); |
3bff024a91be
Move 3D line/sprite renderer to separate module.
Matti Hamalainen <ccr@tnsp.org>
parents:
diff
changeset
|
148 else |
3bff024a91be
Move 3D line/sprite renderer to separate module.
Matti Hamalainen <ccr@tnsp.org>
parents:
diff
changeset
|
149 for (; *line && isspace(*line); line++); |
3bff024a91be
Move 3D line/sprite renderer to separate module.
Matti Hamalainen <ccr@tnsp.org>
parents:
diff
changeset
|
150 return line; |
3bff024a91be
Move 3D line/sprite renderer to separate module.
Matti Hamalainen <ccr@tnsp.org>
parents:
diff
changeset
|
151 } |
3bff024a91be
Move 3D line/sprite renderer to separate module.
Matti Hamalainen <ccr@tnsp.org>
parents:
diff
changeset
|
152 |
3bff024a91be
Move 3D line/sprite renderer to separate module.
Matti Hamalainen <ccr@tnsp.org>
parents:
diff
changeset
|
153 |
3bff024a91be
Move 3D line/sprite renderer to separate module.
Matti Hamalainen <ccr@tnsp.org>
parents:
diff
changeset
|
154 static char *dmSkipUntil(char *line, char ch) |
3bff024a91be
Move 3D line/sprite renderer to separate module.
Matti Hamalainen <ccr@tnsp.org>
parents:
diff
changeset
|
155 { |
3bff024a91be
Move 3D line/sprite renderer to separate module.
Matti Hamalainen <ccr@tnsp.org>
parents:
diff
changeset
|
156 for (; *line && *line != ch; line++); |
3bff024a91be
Move 3D line/sprite renderer to separate module.
Matti Hamalainen <ccr@tnsp.org>
parents:
diff
changeset
|
157 return line; |
3bff024a91be
Move 3D line/sprite renderer to separate module.
Matti Hamalainen <ccr@tnsp.org>
parents:
diff
changeset
|
158 } |
3bff024a91be
Move 3D line/sprite renderer to separate module.
Matti Hamalainen <ccr@tnsp.org>
parents:
diff
changeset
|
159 |
3bff024a91be
Move 3D line/sprite renderer to separate module.
Matti Hamalainen <ccr@tnsp.org>
parents:
diff
changeset
|
160 |
259 | 161 static BOOL dmReadCoordinate(const char *orig, char **line, float *value, BOOL next) |
241
3bff024a91be
Move 3D line/sprite renderer to separate module.
Matti Hamalainen <ccr@tnsp.org>
parents:
diff
changeset
|
162 { |
3bff024a91be
Move 3D line/sprite renderer to separate module.
Matti Hamalainen <ccr@tnsp.org>
parents:
diff
changeset
|
163 *line = dmSkipWhitespace(*line, FALSE); |
259 | 164 if (sscanf(*line, "%f", value) != 1) |
165 { | |
166 dmError("Expected floating point value @ %d:\n%s\n", (*line - orig), orig); | |
167 return FALSE; | |
168 } | |
241
3bff024a91be
Move 3D line/sprite renderer to separate module.
Matti Hamalainen <ccr@tnsp.org>
parents:
diff
changeset
|
169 if (next) |
3bff024a91be
Move 3D line/sprite renderer to separate module.
Matti Hamalainen <ccr@tnsp.org>
parents:
diff
changeset
|
170 { |
3bff024a91be
Move 3D line/sprite renderer to separate module.
Matti Hamalainen <ccr@tnsp.org>
parents:
diff
changeset
|
171 *line = dmSkipUntil(*line, ','); |
259 | 172 if (**line != ',') |
173 { | |
174 dmError("Expected comma @ %d:\n%s\n", (*line - orig), orig); | |
175 return FALSE; | |
176 } | |
241
3bff024a91be
Move 3D line/sprite renderer to separate module.
Matti Hamalainen <ccr@tnsp.org>
parents:
diff
changeset
|
177 *(*line)++; |
3bff024a91be
Move 3D line/sprite renderer to separate module.
Matti Hamalainen <ccr@tnsp.org>
parents:
diff
changeset
|
178 } |
3bff024a91be
Move 3D line/sprite renderer to separate module.
Matti Hamalainen <ccr@tnsp.org>
parents:
diff
changeset
|
179 else |
3bff024a91be
Move 3D line/sprite renderer to separate module.
Matti Hamalainen <ccr@tnsp.org>
parents:
diff
changeset
|
180 *line = dmSkipWhitespace(*line, TRUE); |
3bff024a91be
Move 3D line/sprite renderer to separate module.
Matti Hamalainen <ccr@tnsp.org>
parents:
diff
changeset
|
181 |
3bff024a91be
Move 3D line/sprite renderer to separate module.
Matti Hamalainen <ccr@tnsp.org>
parents:
diff
changeset
|
182 return TRUE; |
3bff024a91be
Move 3D line/sprite renderer to separate module.
Matti Hamalainen <ccr@tnsp.org>
parents:
diff
changeset
|
183 } |
3bff024a91be
Move 3D line/sprite renderer to separate module.
Matti Hamalainen <ccr@tnsp.org>
parents:
diff
changeset
|
184 |
259 | 185 |
186 static BOOL dmReadVectorSegments(char *line, DM3DVectorSpriteModel *model, BOOL relative, const DMVector *pt) | |
241
3bff024a91be
Move 3D line/sprite renderer to separate module.
Matti Hamalainen <ccr@tnsp.org>
parents:
diff
changeset
|
187 { |
263
ddb24754a67c
Cleanups, increase line buffer size.
Matti Hamalainen <ccr@tnsp.org>
parents:
260
diff
changeset
|
188 DMVector v, p, *t; |
241
3bff024a91be
Move 3D line/sprite renderer to separate module.
Matti Hamalainen <ccr@tnsp.org>
parents:
diff
changeset
|
189 int nvertices, vertex, type; |
3bff024a91be
Move 3D line/sprite renderer to separate module.
Matti Hamalainen <ccr@tnsp.org>
parents:
diff
changeset
|
190 int *indices = NULL; |
259 | 191 char *ptr = line; |
192 | |
193 if (sscanf(ptr+1, "%d", &nvertices) != 1) | |
241
3bff024a91be
Move 3D line/sprite renderer to separate module.
Matti Hamalainen <ccr@tnsp.org>
parents:
diff
changeset
|
194 { |
259 | 195 dmError("No # of segments @ '%s'\n", ptr); |
241
3bff024a91be
Move 3D line/sprite renderer to separate module.
Matti Hamalainen <ccr@tnsp.org>
parents:
diff
changeset
|
196 goto error; |
3bff024a91be
Move 3D line/sprite renderer to separate module.
Matti Hamalainen <ccr@tnsp.org>
parents:
diff
changeset
|
197 } |
3bff024a91be
Move 3D line/sprite renderer to separate module.
Matti Hamalainen <ccr@tnsp.org>
parents:
diff
changeset
|
198 |
3bff024a91be
Move 3D line/sprite renderer to separate module.
Matti Hamalainen <ccr@tnsp.org>
parents:
diff
changeset
|
199 if ((indices = dmMalloc(sizeof(int) * (nvertices+1))) == NULL) |
3bff024a91be
Move 3D line/sprite renderer to separate module.
Matti Hamalainen <ccr@tnsp.org>
parents:
diff
changeset
|
200 goto error; |
3bff024a91be
Move 3D line/sprite renderer to separate module.
Matti Hamalainen <ccr@tnsp.org>
parents:
diff
changeset
|
201 |
259 | 202 ptr = dmSkipWhitespace(ptr, TRUE); |
243 | 203 dm_vector_copy(&v, pt); |
241
3bff024a91be
Move 3D line/sprite renderer to separate module.
Matti Hamalainen <ccr@tnsp.org>
parents:
diff
changeset
|
204 for (vertex = 0; vertex <= nvertices; vertex++) |
3bff024a91be
Move 3D line/sprite renderer to separate module.
Matti Hamalainen <ccr@tnsp.org>
parents:
diff
changeset
|
205 { |
259 | 206 if (*ptr == 'Z') |
243 | 207 { |
251
98483680ea0f
Improve converter and adjust parser accordingly.
Matti Hamalainen <ccr@tnsp.org>
parents:
249
diff
changeset
|
208 indices[vertex] = indices[0]; |
259 | 209 ptr++; |
243 | 210 } |
211 else | |
245 | 212 { |
259 | 213 if (!dmReadCoordinate(line, &ptr, &p.x, TRUE)) return FALSE; |
214 if (!dmReadCoordinate(line, &ptr, &p.y, TRUE)) return FALSE; | |
215 if (!dmReadCoordinate(line, &ptr, &p.z, FALSE)) return FALSE; | |
251
98483680ea0f
Improve converter and adjust parser accordingly.
Matti Hamalainen <ccr@tnsp.org>
parents:
249
diff
changeset
|
216 if (relative) |
98483680ea0f
Improve converter and adjust parser accordingly.
Matti Hamalainen <ccr@tnsp.org>
parents:
249
diff
changeset
|
217 { |
98483680ea0f
Improve converter and adjust parser accordingly.
Matti Hamalainen <ccr@tnsp.org>
parents:
249
diff
changeset
|
218 dm_vector_add(&v, &p); |
98483680ea0f
Improve converter and adjust parser accordingly.
Matti Hamalainen <ccr@tnsp.org>
parents:
249
diff
changeset
|
219 t = &v; |
98483680ea0f
Improve converter and adjust parser accordingly.
Matti Hamalainen <ccr@tnsp.org>
parents:
249
diff
changeset
|
220 } |
98483680ea0f
Improve converter and adjust parser accordingly.
Matti Hamalainen <ccr@tnsp.org>
parents:
249
diff
changeset
|
221 else |
98483680ea0f
Improve converter and adjust parser accordingly.
Matti Hamalainen <ccr@tnsp.org>
parents:
249
diff
changeset
|
222 { |
98483680ea0f
Improve converter and adjust parser accordingly.
Matti Hamalainen <ccr@tnsp.org>
parents:
249
diff
changeset
|
223 dm_vector_add_r(&v, &p, pt); |
98483680ea0f
Improve converter and adjust parser accordingly.
Matti Hamalainen <ccr@tnsp.org>
parents:
249
diff
changeset
|
224 t = &v; |
98483680ea0f
Improve converter and adjust parser accordingly.
Matti Hamalainen <ccr@tnsp.org>
parents:
249
diff
changeset
|
225 } |
98483680ea0f
Improve converter and adjust parser accordingly.
Matti Hamalainen <ccr@tnsp.org>
parents:
249
diff
changeset
|
226 |
259 | 227 if (dmAdd3DVectorSpriteModelVertex(model, t, &indices[vertex]) != DMERR_OK) |
251
98483680ea0f
Improve converter and adjust parser accordingly.
Matti Hamalainen <ccr@tnsp.org>
parents:
249
diff
changeset
|
228 goto error; |
245 | 229 } |
243 | 230 |
259 | 231 ptr = dmSkipWhitespace(ptr, FALSE); |
241
3bff024a91be
Move 3D line/sprite renderer to separate module.
Matti Hamalainen <ccr@tnsp.org>
parents:
diff
changeset
|
232 } |
3bff024a91be
Move 3D line/sprite renderer to separate module.
Matti Hamalainen <ccr@tnsp.org>
parents:
diff
changeset
|
233 |
259 | 234 if (sscanf(ptr, "%d", &type) != 1) |
241
3bff024a91be
Move 3D line/sprite renderer to separate module.
Matti Hamalainen <ccr@tnsp.org>
parents:
diff
changeset
|
235 { |
259 | 236 dmError("No line type @ '%s'\n", ptr); |
241
3bff024a91be
Move 3D line/sprite renderer to separate module.
Matti Hamalainen <ccr@tnsp.org>
parents:
diff
changeset
|
237 goto error; |
3bff024a91be
Move 3D line/sprite renderer to separate module.
Matti Hamalainen <ccr@tnsp.org>
parents:
diff
changeset
|
238 } |
3bff024a91be
Move 3D line/sprite renderer to separate module.
Matti Hamalainen <ccr@tnsp.org>
parents:
diff
changeset
|
239 |
3bff024a91be
Move 3D line/sprite renderer to separate module.
Matti Hamalainen <ccr@tnsp.org>
parents:
diff
changeset
|
240 for (vertex = 1; vertex <= nvertices; vertex++) |
3bff024a91be
Move 3D line/sprite renderer to separate module.
Matti Hamalainen <ccr@tnsp.org>
parents:
diff
changeset
|
241 { |
259 | 242 DM3DVector vec; |
243 vec.v1 = indices[vertex - 1]; | |
244 vec.v2 = indices[vertex]; | |
245 vec.type = type; | |
246 if (dmAdd3DVectorSpriteModelVector(model, &vec, NULL) != DMERR_OK) | |
241
3bff024a91be
Move 3D line/sprite renderer to separate module.
Matti Hamalainen <ccr@tnsp.org>
parents:
diff
changeset
|
247 goto error; |
3bff024a91be
Move 3D line/sprite renderer to separate module.
Matti Hamalainen <ccr@tnsp.org>
parents:
diff
changeset
|
248 } |
3bff024a91be
Move 3D line/sprite renderer to separate module.
Matti Hamalainen <ccr@tnsp.org>
parents:
diff
changeset
|
249 |
3bff024a91be
Move 3D line/sprite renderer to separate module.
Matti Hamalainen <ccr@tnsp.org>
parents:
diff
changeset
|
250 return TRUE; |
263
ddb24754a67c
Cleanups, increase line buffer size.
Matti Hamalainen <ccr@tnsp.org>
parents:
260
diff
changeset
|
251 |
241
3bff024a91be
Move 3D line/sprite renderer to separate module.
Matti Hamalainen <ccr@tnsp.org>
parents:
diff
changeset
|
252 error: |
3bff024a91be
Move 3D line/sprite renderer to separate module.
Matti Hamalainen <ccr@tnsp.org>
parents:
diff
changeset
|
253 dmFree(indices); |
3bff024a91be
Move 3D line/sprite renderer to separate module.
Matti Hamalainen <ccr@tnsp.org>
parents:
diff
changeset
|
254 return FALSE; |
3bff024a91be
Move 3D line/sprite renderer to separate module.
Matti Hamalainen <ccr@tnsp.org>
parents:
diff
changeset
|
255 } |
3bff024a91be
Move 3D line/sprite renderer to separate module.
Matti Hamalainen <ccr@tnsp.org>
parents:
diff
changeset
|
256 |
259 | 257 |
258 static BOOL dmReadSprite(char *line, DM3DVectorSpriteModel *model, DMVector *pos) | |
241
3bff024a91be
Move 3D line/sprite renderer to separate module.
Matti Hamalainen <ccr@tnsp.org>
parents:
diff
changeset
|
259 { |
3bff024a91be
Move 3D line/sprite renderer to separate module.
Matti Hamalainen <ccr@tnsp.org>
parents:
diff
changeset
|
260 DMVector pt; |
3bff024a91be
Move 3D line/sprite renderer to separate module.
Matti Hamalainen <ccr@tnsp.org>
parents:
diff
changeset
|
261 DM3DSprite spr; |
260 | 262 char *ptr = line; |
241
3bff024a91be
Move 3D line/sprite renderer to separate module.
Matti Hamalainen <ccr@tnsp.org>
parents:
diff
changeset
|
263 |
259 | 264 ptr++; |
265 if (!dmReadCoordinate(line, &ptr, &pt.x, TRUE)) return FALSE; | |
266 if (!dmReadCoordinate(line, &ptr, &pt.y, TRUE)) return FALSE; | |
267 if (!dmReadCoordinate(line, &ptr, &pt.z, FALSE)) return FALSE; | |
268 ptr = dmSkipWhitespace(ptr, FALSE); | |
269 if (*ptr != 'B') | |
241
3bff024a91be
Move 3D line/sprite renderer to separate module.
Matti Hamalainen <ccr@tnsp.org>
parents:
diff
changeset
|
270 { |
3bff024a91be
Move 3D line/sprite renderer to separate module.
Matti Hamalainen <ccr@tnsp.org>
parents:
diff
changeset
|
271 dmError("No bitmap definition found for sprite.\n"); |
3bff024a91be
Move 3D line/sprite renderer to separate module.
Matti Hamalainen <ccr@tnsp.org>
parents:
diff
changeset
|
272 return FALSE; |
3bff024a91be
Move 3D line/sprite renderer to separate module.
Matti Hamalainen <ccr@tnsp.org>
parents:
diff
changeset
|
273 } |
3bff024a91be
Move 3D line/sprite renderer to separate module.
Matti Hamalainen <ccr@tnsp.org>
parents:
diff
changeset
|
274 |
259 | 275 spr.bitmap = atoi(ptr + 1); |
241
3bff024a91be
Move 3D line/sprite renderer to separate module.
Matti Hamalainen <ccr@tnsp.org>
parents:
diff
changeset
|
276 |
249
3b028785b843
Various improvements in the .3d parser.
Matti Hamalainen <ccr@tnsp.org>
parents:
246
diff
changeset
|
277 dm_vector_add(&pt, pos); |
259 | 278 if (dmAdd3DVectorSpriteModelVertex(model, &pt, &spr.v) != DMERR_OK) |
241
3bff024a91be
Move 3D line/sprite renderer to separate module.
Matti Hamalainen <ccr@tnsp.org>
parents:
diff
changeset
|
279 return FALSE; |
3bff024a91be
Move 3D line/sprite renderer to separate module.
Matti Hamalainen <ccr@tnsp.org>
parents:
diff
changeset
|
280 |
259 | 281 if (dmAdd3DVectorSpriteModelSprite(model, &spr, NULL) != DMERR_OK) |
241
3bff024a91be
Move 3D line/sprite renderer to separate module.
Matti Hamalainen <ccr@tnsp.org>
parents:
diff
changeset
|
282 return FALSE; |
3bff024a91be
Move 3D line/sprite renderer to separate module.
Matti Hamalainen <ccr@tnsp.org>
parents:
diff
changeset
|
283 |
3bff024a91be
Move 3D line/sprite renderer to separate module.
Matti Hamalainen <ccr@tnsp.org>
parents:
diff
changeset
|
284 return TRUE; |
3bff024a91be
Move 3D line/sprite renderer to separate module.
Matti Hamalainen <ccr@tnsp.org>
parents:
diff
changeset
|
285 } |
3bff024a91be
Move 3D line/sprite renderer to separate module.
Matti Hamalainen <ccr@tnsp.org>
parents:
diff
changeset
|
286 |
360
d5a90ba09dc4
Fix to match with resource management changes.
Matti Hamalainen <ccr@tnsp.org>
parents:
348
diff
changeset
|
287 static BOOL dmReadBitmap(char *line, DM3DVectorSpriteModel *model, DMResourceLib *lib) |
241
3bff024a91be
Move 3D line/sprite renderer to separate module.
Matti Hamalainen <ccr@tnsp.org>
parents:
diff
changeset
|
288 { |
3bff024a91be
Move 3D line/sprite renderer to separate module.
Matti Hamalainen <ccr@tnsp.org>
parents:
diff
changeset
|
289 DM3DBitmap bmp, *rbmp; |
3bff024a91be
Move 3D line/sprite renderer to separate module.
Matti Hamalainen <ccr@tnsp.org>
parents:
diff
changeset
|
290 int index; |
260 | 291 char *ptr = line; |
241
3bff024a91be
Move 3D line/sprite renderer to separate module.
Matti Hamalainen <ccr@tnsp.org>
parents:
diff
changeset
|
292 |
259 | 293 strncpy(bmp.name, ptr + 1, sizeof(bmp.name)); |
241
3bff024a91be
Move 3D line/sprite renderer to separate module.
Matti Hamalainen <ccr@tnsp.org>
parents:
diff
changeset
|
294 bmp.img = NULL; |
3bff024a91be
Move 3D line/sprite renderer to separate module.
Matti Hamalainen <ccr@tnsp.org>
parents:
diff
changeset
|
295 |
259 | 296 if (dmAdd3DVectorSpriteModelBitmap(model, &bmp, &index) != DMERR_OK) |
241
3bff024a91be
Move 3D line/sprite renderer to separate module.
Matti Hamalainen <ccr@tnsp.org>
parents:
diff
changeset
|
297 return FALSE; |
3bff024a91be
Move 3D line/sprite renderer to separate module.
Matti Hamalainen <ccr@tnsp.org>
parents:
diff
changeset
|
298 |
3bff024a91be
Move 3D line/sprite renderer to separate module.
Matti Hamalainen <ccr@tnsp.org>
parents:
diff
changeset
|
299 rbmp = &(model->bitmaps[index]); |
3bff024a91be
Move 3D line/sprite renderer to separate module.
Matti Hamalainen <ccr@tnsp.org>
parents:
diff
changeset
|
300 if (rbmp->img == NULL) |
3bff024a91be
Move 3D line/sprite renderer to separate module.
Matti Hamalainen <ccr@tnsp.org>
parents:
diff
changeset
|
301 { |
360
d5a90ba09dc4
Fix to match with resource management changes.
Matti Hamalainen <ccr@tnsp.org>
parents:
348
diff
changeset
|
302 DMResource *res = dmf_open(lib, rbmp->name); |
241
3bff024a91be
Move 3D line/sprite renderer to separate module.
Matti Hamalainen <ccr@tnsp.org>
parents:
diff
changeset
|
303 if (res == NULL) |
3bff024a91be
Move 3D line/sprite renderer to separate module.
Matti Hamalainen <ccr@tnsp.org>
parents:
diff
changeset
|
304 { |
3bff024a91be
Move 3D line/sprite renderer to separate module.
Matti Hamalainen <ccr@tnsp.org>
parents:
diff
changeset
|
305 dmError("Could not open resource file '%s'.\n", rbmp->name); |
3bff024a91be
Move 3D line/sprite renderer to separate module.
Matti Hamalainen <ccr@tnsp.org>
parents:
diff
changeset
|
306 return FALSE; |
3bff024a91be
Move 3D line/sprite renderer to separate module.
Matti Hamalainen <ccr@tnsp.org>
parents:
diff
changeset
|
307 } |
3bff024a91be
Move 3D line/sprite renderer to separate module.
Matti Hamalainen <ccr@tnsp.org>
parents:
diff
changeset
|
308 rbmp->img = dmLoadImage(res); |
3bff024a91be
Move 3D line/sprite renderer to separate module.
Matti Hamalainen <ccr@tnsp.org>
parents:
diff
changeset
|
309 dmf_close(res); |
3bff024a91be
Move 3D line/sprite renderer to separate module.
Matti Hamalainen <ccr@tnsp.org>
parents:
diff
changeset
|
310 if (rbmp->img == NULL) |
3bff024a91be
Move 3D line/sprite renderer to separate module.
Matti Hamalainen <ccr@tnsp.org>
parents:
diff
changeset
|
311 { |
3bff024a91be
Move 3D line/sprite renderer to separate module.
Matti Hamalainen <ccr@tnsp.org>
parents:
diff
changeset
|
312 dmError("Could not load image file '%s'.\n", rbmp->name); |
3bff024a91be
Move 3D line/sprite renderer to separate module.
Matti Hamalainen <ccr@tnsp.org>
parents:
diff
changeset
|
313 return FALSE; |
3bff024a91be
Move 3D line/sprite renderer to separate module.
Matti Hamalainen <ccr@tnsp.org>
parents:
diff
changeset
|
314 } |
3bff024a91be
Move 3D line/sprite renderer to separate module.
Matti Hamalainen <ccr@tnsp.org>
parents:
diff
changeset
|
315 } |
263
ddb24754a67c
Cleanups, increase line buffer size.
Matti Hamalainen <ccr@tnsp.org>
parents:
260
diff
changeset
|
316 |
241
3bff024a91be
Move 3D line/sprite renderer to separate module.
Matti Hamalainen <ccr@tnsp.org>
parents:
diff
changeset
|
317 return TRUE; |
3bff024a91be
Move 3D line/sprite renderer to separate module.
Matti Hamalainen <ccr@tnsp.org>
parents:
diff
changeset
|
318 } |
3bff024a91be
Move 3D line/sprite renderer to separate module.
Matti Hamalainen <ccr@tnsp.org>
parents:
diff
changeset
|
319 |
3bff024a91be
Move 3D line/sprite renderer to separate module.
Matti Hamalainen <ccr@tnsp.org>
parents:
diff
changeset
|
320 |
259 | 321 static int dmDoRead3DVectorSpriteModel(DMResource *f, DM3DVectorSpriteModel *model, DMVector *pos) |
241
3bff024a91be
Move 3D line/sprite renderer to separate module.
Matti Hamalainen <ccr@tnsp.org>
parents:
diff
changeset
|
322 { |
263
ddb24754a67c
Cleanups, increase line buffer size.
Matti Hamalainen <ccr@tnsp.org>
parents:
260
diff
changeset
|
323 char line[8192]; |
241
3bff024a91be
Move 3D line/sprite renderer to separate module.
Matti Hamalainen <ccr@tnsp.org>
parents:
diff
changeset
|
324 |
3bff024a91be
Move 3D line/sprite renderer to separate module.
Matti Hamalainen <ccr@tnsp.org>
parents:
diff
changeset
|
325 while (dmfgets(line, sizeof(line), f) != NULL) |
3bff024a91be
Move 3D line/sprite renderer to separate module.
Matti Hamalainen <ccr@tnsp.org>
parents:
diff
changeset
|
326 { |
3bff024a91be
Move 3D line/sprite renderer to separate module.
Matti Hamalainen <ccr@tnsp.org>
parents:
diff
changeset
|
327 char *start = dmSkipWhitespace(line, FALSE); |
3bff024a91be
Move 3D line/sprite renderer to separate module.
Matti Hamalainen <ccr@tnsp.org>
parents:
diff
changeset
|
328 switch (*start) |
3bff024a91be
Move 3D line/sprite renderer to separate module.
Matti Hamalainen <ccr@tnsp.org>
parents:
diff
changeset
|
329 { |
3bff024a91be
Move 3D line/sprite renderer to separate module.
Matti Hamalainen <ccr@tnsp.org>
parents:
diff
changeset
|
330 case 0: |
3bff024a91be
Move 3D line/sprite renderer to separate module.
Matti Hamalainen <ccr@tnsp.org>
parents:
diff
changeset
|
331 case '#': |
3bff024a91be
Move 3D line/sprite renderer to separate module.
Matti Hamalainen <ccr@tnsp.org>
parents:
diff
changeset
|
332 break; |
3bff024a91be
Move 3D line/sprite renderer to separate module.
Matti Hamalainen <ccr@tnsp.org>
parents:
diff
changeset
|
333 |
249
3b028785b843
Various improvements in the .3d parser.
Matti Hamalainen <ccr@tnsp.org>
parents:
246
diff
changeset
|
334 case 'G': |
3b028785b843
Various improvements in the .3d parser.
Matti Hamalainen <ccr@tnsp.org>
parents:
246
diff
changeset
|
335 { |
3b028785b843
Various improvements in the .3d parser.
Matti Hamalainen <ccr@tnsp.org>
parents:
246
diff
changeset
|
336 int res; |
3b028785b843
Various improvements in the .3d parser.
Matti Hamalainen <ccr@tnsp.org>
parents:
246
diff
changeset
|
337 DMVector pt; |
3b028785b843
Various improvements in the .3d parser.
Matti Hamalainen <ccr@tnsp.org>
parents:
246
diff
changeset
|
338 start++; |
259 | 339 if (!dmReadCoordinate(line, &start, &pt.x, TRUE)) return DMERR_INVALID_DATA; |
340 if (!dmReadCoordinate(line, &start, &pt.y, TRUE)) return DMERR_INVALID_DATA; | |
341 if (!dmReadCoordinate(line, &start, &pt.z, FALSE)) return DMERR_INVALID_DATA; | |
249
3b028785b843
Various improvements in the .3d parser.
Matti Hamalainen <ccr@tnsp.org>
parents:
246
diff
changeset
|
342 dm_vector_add_r(&pt, pos, &pt); |
259 | 343 if ((res = dmDoRead3DVectorSpriteModel(f, model, &pt)) != DMERR_OK) |
249
3b028785b843
Various improvements in the .3d parser.
Matti Hamalainen <ccr@tnsp.org>
parents:
246
diff
changeset
|
344 return res; |
3b028785b843
Various improvements in the .3d parser.
Matti Hamalainen <ccr@tnsp.org>
parents:
246
diff
changeset
|
345 } |
241
3bff024a91be
Move 3D line/sprite renderer to separate module.
Matti Hamalainen <ccr@tnsp.org>
parents:
diff
changeset
|
346 break; |
3bff024a91be
Move 3D line/sprite renderer to separate module.
Matti Hamalainen <ccr@tnsp.org>
parents:
diff
changeset
|
347 |
249
3b028785b843
Various improvements in the .3d parser.
Matti Hamalainen <ccr@tnsp.org>
parents:
246
diff
changeset
|
348 case 'E': |
3b028785b843
Various improvements in the .3d parser.
Matti Hamalainen <ccr@tnsp.org>
parents:
246
diff
changeset
|
349 return DMERR_OK; |
3b028785b843
Various improvements in the .3d parser.
Matti Hamalainen <ccr@tnsp.org>
parents:
246
diff
changeset
|
350 |
3b028785b843
Various improvements in the .3d parser.
Matti Hamalainen <ccr@tnsp.org>
parents:
246
diff
changeset
|
351 case 'B': |
360
d5a90ba09dc4
Fix to match with resource management changes.
Matti Hamalainen <ccr@tnsp.org>
parents:
348
diff
changeset
|
352 if (!dmReadBitmap(start, model, f->lib)) |
249
3b028785b843
Various improvements in the .3d parser.
Matti Hamalainen <ccr@tnsp.org>
parents:
246
diff
changeset
|
353 return DMERR_INVALID_DATA; |
243 | 354 break; |
355 | |
241
3bff024a91be
Move 3D line/sprite renderer to separate module.
Matti Hamalainen <ccr@tnsp.org>
parents:
diff
changeset
|
356 case 'L': |
259 | 357 if (!dmReadVectorSegments(start, model, FALSE, pos)) |
243 | 358 return DMERR_INVALID_DATA; |
359 break; | |
360 | |
361 case 'R': | |
259 | 362 if (!dmReadVectorSegments(start, model, TRUE, pos)) |
241
3bff024a91be
Move 3D line/sprite renderer to separate module.
Matti Hamalainen <ccr@tnsp.org>
parents:
diff
changeset
|
363 return DMERR_INVALID_DATA; |
3bff024a91be
Move 3D line/sprite renderer to separate module.
Matti Hamalainen <ccr@tnsp.org>
parents:
diff
changeset
|
364 break; |
3bff024a91be
Move 3D line/sprite renderer to separate module.
Matti Hamalainen <ccr@tnsp.org>
parents:
diff
changeset
|
365 |
3bff024a91be
Move 3D line/sprite renderer to separate module.
Matti Hamalainen <ccr@tnsp.org>
parents:
diff
changeset
|
366 case 'S': |
249
3b028785b843
Various improvements in the .3d parser.
Matti Hamalainen <ccr@tnsp.org>
parents:
246
diff
changeset
|
367 if (!dmReadSprite(start, model, pos)) |
241
3bff024a91be
Move 3D line/sprite renderer to separate module.
Matti Hamalainen <ccr@tnsp.org>
parents:
diff
changeset
|
368 return DMERR_INVALID_DATA; |
3bff024a91be
Move 3D line/sprite renderer to separate module.
Matti Hamalainen <ccr@tnsp.org>
parents:
diff
changeset
|
369 break; |
3bff024a91be
Move 3D line/sprite renderer to separate module.
Matti Hamalainen <ccr@tnsp.org>
parents:
diff
changeset
|
370 |
3bff024a91be
Move 3D line/sprite renderer to separate module.
Matti Hamalainen <ccr@tnsp.org>
parents:
diff
changeset
|
371 default: |
3bff024a91be
Move 3D line/sprite renderer to separate module.
Matti Hamalainen <ccr@tnsp.org>
parents:
diff
changeset
|
372 break; |
3bff024a91be
Move 3D line/sprite renderer to separate module.
Matti Hamalainen <ccr@tnsp.org>
parents:
diff
changeset
|
373 } |
3bff024a91be
Move 3D line/sprite renderer to separate module.
Matti Hamalainen <ccr@tnsp.org>
parents:
diff
changeset
|
374 } |
245 | 375 return DMERR_OK; |
246 | 376 } |
241
3bff024a91be
Move 3D line/sprite renderer to separate module.
Matti Hamalainen <ccr@tnsp.org>
parents:
diff
changeset
|
377 |
245 | 378 |
259 | 379 int dmRead3DVectorSpriteModel(DMResource *f, DM3DVectorSpriteModel **model) |
249
3b028785b843
Various improvements in the .3d parser.
Matti Hamalainen <ccr@tnsp.org>
parents:
246
diff
changeset
|
380 { |
3b028785b843
Various improvements in the .3d parser.
Matti Hamalainen <ccr@tnsp.org>
parents:
246
diff
changeset
|
381 DMVector pos; |
3b028785b843
Various improvements in the .3d parser.
Matti Hamalainen <ccr@tnsp.org>
parents:
246
diff
changeset
|
382 |
259 | 383 if ((*model = dmMalloc0(sizeof(DM3DVectorSpriteModel))) == NULL) |
249
3b028785b843
Various improvements in the .3d parser.
Matti Hamalainen <ccr@tnsp.org>
parents:
246
diff
changeset
|
384 return DMERR_MALLOC; |
3b028785b843
Various improvements in the .3d parser.
Matti Hamalainen <ccr@tnsp.org>
parents:
246
diff
changeset
|
385 |
3b028785b843
Various improvements in the .3d parser.
Matti Hamalainen <ccr@tnsp.org>
parents:
246
diff
changeset
|
386 memset(&pos, 0, sizeof(pos)); |
3b028785b843
Various improvements in the .3d parser.
Matti Hamalainen <ccr@tnsp.org>
parents:
246
diff
changeset
|
387 |
259 | 388 return dmDoRead3DVectorSpriteModel(f, *model, &pos); |
249
3b028785b843
Various improvements in the .3d parser.
Matti Hamalainen <ccr@tnsp.org>
parents:
246
diff
changeset
|
389 } |
3b028785b843
Various improvements in the .3d parser.
Matti Hamalainen <ccr@tnsp.org>
parents:
246
diff
changeset
|
390 |
3b028785b843
Various improvements in the .3d parser.
Matti Hamalainen <ccr@tnsp.org>
parents:
246
diff
changeset
|
391 |
259 | 392 void dmFree3DVectorSpriteModel(DM3DVectorSpriteModel *model) |
245 | 393 { |
394 int i; | |
395 for (i = 0; i < model->nbitmaps; i++) | |
396 { | |
397 if (model->bitmaps[i].img != NULL) | |
398 SDL_FreeSurface(model->bitmaps[i].img); | |
399 } | |
400 | |
401 dmFree(model->bitmaps); | |
402 dmFree(model->vertices); | |
403 dmFree(model->lines); | |
404 dmFree(model->sprites); | |
405 dmFree(model); | |
241
3bff024a91be
Move 3D line/sprite renderer to separate module.
Matti Hamalainen <ccr@tnsp.org>
parents:
diff
changeset
|
406 } |