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