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
Ignore whitespace changes - Everywhere: Within whitespace: At end of lines:
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
be2ca95af493 Cleanups.
Matti Hamalainen <ccr@tnsp.org>
parents: 253
diff changeset
49 { \
be2ca95af493 Cleanups.
Matti Hamalainen <ccr@tnsp.org>
parents: 253
diff changeset
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
be2ca95af493 Cleanups.
Matti Hamalainen <ccr@tnsp.org>
parents: 253
diff changeset
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
be2ca95af493 Cleanups.
Matti Hamalainen <ccr@tnsp.org>
parents: 253
diff changeset
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
be2ca95af493 Cleanups.
Matti Hamalainen <ccr@tnsp.org>
parents: 253
diff changeset
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
be2ca95af493 Cleanups.
Matti Hamalainen <ccr@tnsp.org>
parents: 253
diff changeset
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
be2ca95af493 Cleanups.
Matti Hamalainen <ccr@tnsp.org>
parents: 253
diff changeset
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
be2ca95af493 Cleanups.
Matti Hamalainen <ccr@tnsp.org>
parents: 253
diff changeset
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
be2ca95af493 Cleanups.
Matti Hamalainen <ccr@tnsp.org>
parents: 253
diff changeset
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
be2ca95af493 Cleanups.
Matti Hamalainen <ccr@tnsp.org>
parents: 253
diff changeset
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
c3f32de11458 Constify.
Matti Hamalainen <ccr@tnsp.org>
parents: 309
diff changeset
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
be2ca95af493 Cleanups.
Matti Hamalainen <ccr@tnsp.org>
parents: 253
diff changeset
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
509d8c72d774 Add Z checks.
Matti Hamalainen <ccr@tnsp.org>
parents: 263
diff changeset
121 if (pv[0].z <= 0 && pv[1].z <= 0)
509d8c72d774 Add Z checks.
Matti Hamalainen <ccr@tnsp.org>
parents: 263
diff changeset
122 continue;
509d8c72d774 Add Z checks.
Matti Hamalainen <ccr@tnsp.org>
parents: 263
diff changeset
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
509d8c72d774 Add Z checks.
Matti Hamalainen <ccr@tnsp.org>
parents: 263
diff changeset
137 if (pv.z <= 0)
509d8c72d774 Add Z checks.
Matti Hamalainen <ccr@tnsp.org>
parents: 263
diff changeset
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
be2ca95af493 Cleanups.
Matti Hamalainen <ccr@tnsp.org>
parents: 253
diff changeset
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
be2ca95af493 Cleanups.
Matti Hamalainen <ccr@tnsp.org>
parents: 253
diff changeset
164 if (sscanf(*line, "%f", value) != 1)
be2ca95af493 Cleanups.
Matti Hamalainen <ccr@tnsp.org>
parents: 253
diff changeset
165 {
be2ca95af493 Cleanups.
Matti Hamalainen <ccr@tnsp.org>
parents: 253
diff changeset
166 dmError("Expected floating point value @ %d:\n%s\n", (*line - orig), orig);
be2ca95af493 Cleanups.
Matti Hamalainen <ccr@tnsp.org>
parents: 253
diff changeset
167 return FALSE;
be2ca95af493 Cleanups.
Matti Hamalainen <ccr@tnsp.org>
parents: 253
diff changeset
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
be2ca95af493 Cleanups.
Matti Hamalainen <ccr@tnsp.org>
parents: 253
diff changeset
172 if (**line != ',')
be2ca95af493 Cleanups.
Matti Hamalainen <ccr@tnsp.org>
parents: 253
diff changeset
173 {
be2ca95af493 Cleanups.
Matti Hamalainen <ccr@tnsp.org>
parents: 253
diff changeset
174 dmError("Expected comma @ %d:\n%s\n", (*line - orig), orig);
be2ca95af493 Cleanups.
Matti Hamalainen <ccr@tnsp.org>
parents: 253
diff changeset
175 return FALSE;
be2ca95af493 Cleanups.
Matti Hamalainen <ccr@tnsp.org>
parents: 253
diff changeset
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
be2ca95af493 Cleanups.
Matti Hamalainen <ccr@tnsp.org>
parents: 253
diff changeset
185
be2ca95af493 Cleanups.
Matti Hamalainen <ccr@tnsp.org>
parents: 253
diff changeset
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
be2ca95af493 Cleanups.
Matti Hamalainen <ccr@tnsp.org>
parents: 253
diff changeset
191 char *ptr = line;
be2ca95af493 Cleanups.
Matti Hamalainen <ccr@tnsp.org>
parents: 253
diff changeset
192
be2ca95af493 Cleanups.
Matti Hamalainen <ccr@tnsp.org>
parents: 253
diff changeset
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
be2ca95af493 Cleanups.
Matti Hamalainen <ccr@tnsp.org>
parents: 253
diff changeset
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
be2ca95af493 Cleanups.
Matti Hamalainen <ccr@tnsp.org>
parents: 253
diff changeset
202 ptr = dmSkipWhitespace(ptr, TRUE);
243
a9d500e5698d Improve the parser.
Matti Hamalainen <ccr@tnsp.org>
parents: 241
diff changeset
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
be2ca95af493 Cleanups.
Matti Hamalainen <ccr@tnsp.org>
parents: 253
diff changeset
206 if (*ptr == 'Z')
243
a9d500e5698d Improve the parser.
Matti Hamalainen <ccr@tnsp.org>
parents: 241
diff changeset
207 {
251
98483680ea0f Improve converter and adjust parser accordingly.
Matti Hamalainen <ccr@tnsp.org>
parents: 249
diff changeset
208 indices[vertex] = indices[0];
259
be2ca95af493 Cleanups.
Matti Hamalainen <ccr@tnsp.org>
parents: 253
diff changeset
209 ptr++;
243
a9d500e5698d Improve the parser.
Matti Hamalainen <ccr@tnsp.org>
parents: 241
diff changeset
210 }
a9d500e5698d Improve the parser.
Matti Hamalainen <ccr@tnsp.org>
parents: 241
diff changeset
211 else
245
eed8eed58f82 Changes in the 3d loader.
Matti Hamalainen <ccr@tnsp.org>
parents: 243
diff changeset
212 {
259
be2ca95af493 Cleanups.
Matti Hamalainen <ccr@tnsp.org>
parents: 253
diff changeset
213 if (!dmReadCoordinate(line, &ptr, &p.x, TRUE)) return FALSE;
be2ca95af493 Cleanups.
Matti Hamalainen <ccr@tnsp.org>
parents: 253
diff changeset
214 if (!dmReadCoordinate(line, &ptr, &p.y, TRUE)) return FALSE;
be2ca95af493 Cleanups.
Matti Hamalainen <ccr@tnsp.org>
parents: 253
diff changeset
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
be2ca95af493 Cleanups.
Matti Hamalainen <ccr@tnsp.org>
parents: 253
diff changeset
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
eed8eed58f82 Changes in the 3d loader.
Matti Hamalainen <ccr@tnsp.org>
parents: 243
diff changeset
229 }
243
a9d500e5698d Improve the parser.
Matti Hamalainen <ccr@tnsp.org>
parents: 241
diff changeset
230
259
be2ca95af493 Cleanups.
Matti Hamalainen <ccr@tnsp.org>
parents: 253
diff changeset
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
be2ca95af493 Cleanups.
Matti Hamalainen <ccr@tnsp.org>
parents: 253
diff changeset
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
be2ca95af493 Cleanups.
Matti Hamalainen <ccr@tnsp.org>
parents: 253
diff changeset
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
be2ca95af493 Cleanups.
Matti Hamalainen <ccr@tnsp.org>
parents: 253
diff changeset
242 DM3DVector vec;
be2ca95af493 Cleanups.
Matti Hamalainen <ccr@tnsp.org>
parents: 253
diff changeset
243 vec.v1 = indices[vertex - 1];
be2ca95af493 Cleanups.
Matti Hamalainen <ccr@tnsp.org>
parents: 253
diff changeset
244 vec.v2 = indices[vertex];
be2ca95af493 Cleanups.
Matti Hamalainen <ccr@tnsp.org>
parents: 253
diff changeset
245 vec.type = type;
be2ca95af493 Cleanups.
Matti Hamalainen <ccr@tnsp.org>
parents: 253
diff changeset
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
be2ca95af493 Cleanups.
Matti Hamalainen <ccr@tnsp.org>
parents: 253
diff changeset
257
be2ca95af493 Cleanups.
Matti Hamalainen <ccr@tnsp.org>
parents: 253
diff changeset
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
Matti Hamalainen <ccr@tnsp.org>
parents: 259
diff changeset
262 char *ptr = line;
241
3bff024a91be Move 3D line/sprite renderer to separate module.
Matti Hamalainen <ccr@tnsp.org>
parents:
diff changeset
263
259
be2ca95af493 Cleanups.
Matti Hamalainen <ccr@tnsp.org>
parents: 253
diff changeset
264 ptr++;
be2ca95af493 Cleanups.
Matti Hamalainen <ccr@tnsp.org>
parents: 253
diff changeset
265 if (!dmReadCoordinate(line, &ptr, &pt.x, TRUE)) return FALSE;
be2ca95af493 Cleanups.
Matti Hamalainen <ccr@tnsp.org>
parents: 253
diff changeset
266 if (!dmReadCoordinate(line, &ptr, &pt.y, TRUE)) return FALSE;
be2ca95af493 Cleanups.
Matti Hamalainen <ccr@tnsp.org>
parents: 253
diff changeset
267 if (!dmReadCoordinate(line, &ptr, &pt.z, FALSE)) return FALSE;
be2ca95af493 Cleanups.
Matti Hamalainen <ccr@tnsp.org>
parents: 253
diff changeset
268 ptr = dmSkipWhitespace(ptr, FALSE);
be2ca95af493 Cleanups.
Matti Hamalainen <ccr@tnsp.org>
parents: 253
diff changeset
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
be2ca95af493 Cleanups.
Matti Hamalainen <ccr@tnsp.org>
parents: 253
diff changeset
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
be2ca95af493 Cleanups.
Matti Hamalainen <ccr@tnsp.org>
parents: 253
diff changeset
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
be2ca95af493 Cleanups.
Matti Hamalainen <ccr@tnsp.org>
parents: 253
diff changeset
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
Matti Hamalainen <ccr@tnsp.org>
parents: 259
diff changeset
291 char *ptr = line;
241
3bff024a91be Move 3D line/sprite renderer to separate module.
Matti Hamalainen <ccr@tnsp.org>
parents:
diff changeset
292
259
be2ca95af493 Cleanups.
Matti Hamalainen <ccr@tnsp.org>
parents: 253
diff changeset
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
be2ca95af493 Cleanups.
Matti Hamalainen <ccr@tnsp.org>
parents: 253
diff changeset
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
be2ca95af493 Cleanups.
Matti Hamalainen <ccr@tnsp.org>
parents: 253
diff changeset
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
be2ca95af493 Cleanups.
Matti Hamalainen <ccr@tnsp.org>
parents: 253
diff changeset
339 if (!dmReadCoordinate(line, &start, &pt.x, TRUE)) return DMERR_INVALID_DATA;
be2ca95af493 Cleanups.
Matti Hamalainen <ccr@tnsp.org>
parents: 253
diff changeset
340 if (!dmReadCoordinate(line, &start, &pt.y, TRUE)) return DMERR_INVALID_DATA;
be2ca95af493 Cleanups.
Matti Hamalainen <ccr@tnsp.org>
parents: 253
diff changeset
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
be2ca95af493 Cleanups.
Matti Hamalainen <ccr@tnsp.org>
parents: 253
diff changeset
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
a9d500e5698d Improve the parser.
Matti Hamalainen <ccr@tnsp.org>
parents: 241
diff changeset
354 break;
a9d500e5698d Improve the parser.
Matti Hamalainen <ccr@tnsp.org>
parents: 241
diff changeset
355
241
3bff024a91be Move 3D line/sprite renderer to separate module.
Matti Hamalainen <ccr@tnsp.org>
parents:
diff changeset
356 case 'L':
259
be2ca95af493 Cleanups.
Matti Hamalainen <ccr@tnsp.org>
parents: 253
diff changeset
357 if (!dmReadVectorSegments(start, model, FALSE, pos))
243
a9d500e5698d Improve the parser.
Matti Hamalainen <ccr@tnsp.org>
parents: 241
diff changeset
358 return DMERR_INVALID_DATA;
a9d500e5698d Improve the parser.
Matti Hamalainen <ccr@tnsp.org>
parents: 241
diff changeset
359 break;
a9d500e5698d Improve the parser.
Matti Hamalainen <ccr@tnsp.org>
parents: 241
diff changeset
360
a9d500e5698d Improve the parser.
Matti Hamalainen <ccr@tnsp.org>
parents: 241
diff changeset
361 case 'R':
259
be2ca95af493 Cleanups.
Matti Hamalainen <ccr@tnsp.org>
parents: 253
diff changeset
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
eed8eed58f82 Changes in the 3d loader.
Matti Hamalainen <ccr@tnsp.org>
parents: 243
diff changeset
375 return DMERR_OK;
246
3bf8ebf09a6a Cleanups.
Matti Hamalainen <ccr@tnsp.org>
parents: 245
diff changeset
376 }
241
3bff024a91be Move 3D line/sprite renderer to separate module.
Matti Hamalainen <ccr@tnsp.org>
parents:
diff changeset
377
245
eed8eed58f82 Changes in the 3d loader.
Matti Hamalainen <ccr@tnsp.org>
parents: 243
diff changeset
378
259
be2ca95af493 Cleanups.
Matti Hamalainen <ccr@tnsp.org>
parents: 253
diff changeset
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
be2ca95af493 Cleanups.
Matti Hamalainen <ccr@tnsp.org>
parents: 253
diff changeset
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
be2ca95af493 Cleanups.
Matti Hamalainen <ccr@tnsp.org>
parents: 253
diff changeset
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
be2ca95af493 Cleanups.
Matti Hamalainen <ccr@tnsp.org>
parents: 253
diff changeset
392 void dmFree3DVectorSpriteModel(DM3DVectorSpriteModel *model)
245
eed8eed58f82 Changes in the 3d loader.
Matti Hamalainen <ccr@tnsp.org>
parents: 243
diff changeset
393 {
eed8eed58f82 Changes in the 3d loader.
Matti Hamalainen <ccr@tnsp.org>
parents: 243
diff changeset
394 int i;
eed8eed58f82 Changes in the 3d loader.
Matti Hamalainen <ccr@tnsp.org>
parents: 243
diff changeset
395 for (i = 0; i < model->nbitmaps; i++)
eed8eed58f82 Changes in the 3d loader.
Matti Hamalainen <ccr@tnsp.org>
parents: 243
diff changeset
396 {
eed8eed58f82 Changes in the 3d loader.
Matti Hamalainen <ccr@tnsp.org>
parents: 243
diff changeset
397 if (model->bitmaps[i].img != NULL)
eed8eed58f82 Changes in the 3d loader.
Matti Hamalainen <ccr@tnsp.org>
parents: 243
diff changeset
398 SDL_FreeSurface(model->bitmaps[i].img);
eed8eed58f82 Changes in the 3d loader.
Matti Hamalainen <ccr@tnsp.org>
parents: 243
diff changeset
399 }
eed8eed58f82 Changes in the 3d loader.
Matti Hamalainen <ccr@tnsp.org>
parents: 243
diff changeset
400
eed8eed58f82 Changes in the 3d loader.
Matti Hamalainen <ccr@tnsp.org>
parents: 243
diff changeset
401 dmFree(model->bitmaps);
eed8eed58f82 Changes in the 3d loader.
Matti Hamalainen <ccr@tnsp.org>
parents: 243
diff changeset
402 dmFree(model->vertices);
eed8eed58f82 Changes in the 3d loader.
Matti Hamalainen <ccr@tnsp.org>
parents: 243
diff changeset
403 dmFree(model->lines);
eed8eed58f82 Changes in the 3d loader.
Matti Hamalainen <ccr@tnsp.org>
parents: 243
diff changeset
404 dmFree(model->sprites);
eed8eed58f82 Changes in the 3d loader.
Matti Hamalainen <ccr@tnsp.org>
parents: 243
diff changeset
405 dmFree(model);
241
3bff024a91be Move 3D line/sprite renderer to separate module.
Matti Hamalainen <ccr@tnsp.org>
parents:
diff changeset
406 }