Mercurial > hg > dmlib
annotate dmq3d.c @ 251:98483680ea0f
Improve converter and adjust parser accordingly.
author | Matti Hamalainen <ccr@tnsp.org> |
---|---|
date | Tue, 09 Oct 2012 20:59:30 +0300 |
parents | 3b028785b843 |
children | 61eb5fb4a5e6 |
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) \ |
3bff024a91be
Move 3D line/sprite renderer to separate module.
Matti Hamalainen <ccr@tnsp.org>
parents:
diff
changeset
|
48 return DMERR_MALLOC; \ |
3bff024a91be
Move 3D line/sprite renderer to separate module.
Matti Hamalainen <ccr@tnsp.org>
parents:
diff
changeset
|
49 } \ |
3bff024a91be
Move 3D line/sprite renderer to separate module.
Matti Hamalainen <ccr@tnsp.org>
parents:
diff
changeset
|
50 memcpy((*items) + (*nitems), item, sizeof(TYPE)); \ |
3bff024a91be
Move 3D line/sprite renderer to separate module.
Matti Hamalainen <ccr@tnsp.org>
parents:
diff
changeset
|
51 if (res != NULL) *res = *nitems; \ |
3bff024a91be
Move 3D line/sprite renderer to separate module.
Matti Hamalainen <ccr@tnsp.org>
parents:
diff
changeset
|
52 (*nitems)++; \ |
3bff024a91be
Move 3D line/sprite renderer to separate module.
Matti Hamalainen <ccr@tnsp.org>
parents:
diff
changeset
|
53 return DMERR_OK; \ |
3bff024a91be
Move 3D line/sprite renderer to separate module.
Matti Hamalainen <ccr@tnsp.org>
parents:
diff
changeset
|
54 } |
3bff024a91be
Move 3D line/sprite renderer to separate module.
Matti Hamalainen <ccr@tnsp.org>
parents:
diff
changeset
|
55 |
3bff024a91be
Move 3D line/sprite renderer to separate module.
Matti Hamalainen <ccr@tnsp.org>
parents:
diff
changeset
|
56 DM_FIND_ITEM_FUNC(Vertex, DMVector) |
3bff024a91be
Move 3D line/sprite renderer to separate module.
Matti Hamalainen <ccr@tnsp.org>
parents:
diff
changeset
|
57 DM_FIND_ITEM_FUNC(Line, DM3DLine) |
3bff024a91be
Move 3D line/sprite renderer to separate module.
Matti Hamalainen <ccr@tnsp.org>
parents:
diff
changeset
|
58 DM_FIND_ITEM_FUNC(Sprite, DM3DSprite) |
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_ADD_ITEM_FUNC(Vertex, DMVector) |
3bff024a91be
Move 3D line/sprite renderer to separate module.
Matti Hamalainen <ccr@tnsp.org>
parents:
diff
changeset
|
61 DM_ADD_ITEM_FUNC(Line, DM3DLine) |
3bff024a91be
Move 3D line/sprite renderer to separate module.
Matti Hamalainen <ccr@tnsp.org>
parents:
diff
changeset
|
62 DM_ADD_ITEM_FUNC(Sprite, DM3DSprite) |
3bff024a91be
Move 3D line/sprite renderer to separate module.
Matti Hamalainen <ccr@tnsp.org>
parents:
diff
changeset
|
63 DM_ADD_ITEM_FUNC(Bitmap, DM3DBitmap) |
3bff024a91be
Move 3D line/sprite renderer to separate module.
Matti Hamalainen <ccr@tnsp.org>
parents:
diff
changeset
|
64 |
3bff024a91be
Move 3D line/sprite renderer to separate module.
Matti Hamalainen <ccr@tnsp.org>
parents:
diff
changeset
|
65 |
3bff024a91be
Move 3D line/sprite renderer to separate module.
Matti Hamalainen <ccr@tnsp.org>
parents:
diff
changeset
|
66 int dmAdd3DLineSpriteModelVertex(DM3DLineSpriteModel *model, DMVector *v, int *index) |
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 return dmAdd3DVertex(&model->nvertices, &model->nvertexalloc, |
3bff024a91be
Move 3D line/sprite renderer to separate module.
Matti Hamalainen <ccr@tnsp.org>
parents:
diff
changeset
|
69 &model->vertices, v, index); |
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 |
3bff024a91be
Move 3D line/sprite renderer to separate module.
Matti Hamalainen <ccr@tnsp.org>
parents:
diff
changeset
|
72 int dmAdd3DLineSpriteModelLine(DM3DLineSpriteModel *model, DM3DLine *v, int *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 return dmAdd3DLine(&model->nlines, &model->nlinesalloc, |
3bff024a91be
Move 3D line/sprite renderer to separate module.
Matti Hamalainen <ccr@tnsp.org>
parents:
diff
changeset
|
75 &model->lines, v, index); |
3bff024a91be
Move 3D line/sprite renderer to separate module.
Matti Hamalainen <ccr@tnsp.org>
parents:
diff
changeset
|
76 } |
3bff024a91be
Move 3D line/sprite renderer to separate module.
Matti Hamalainen <ccr@tnsp.org>
parents:
diff
changeset
|
77 |
3bff024a91be
Move 3D line/sprite renderer to separate module.
Matti Hamalainen <ccr@tnsp.org>
parents:
diff
changeset
|
78 int dmAdd3DLineSpriteModelSprite(DM3DLineSpriteModel *model, DM3DSprite *v, int *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 return dmAdd3DSprite(&model->nsprites, &model->nspritesalloc, |
3bff024a91be
Move 3D line/sprite renderer to separate module.
Matti Hamalainen <ccr@tnsp.org>
parents:
diff
changeset
|
81 &model->sprites, v, index); |
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 |
3bff024a91be
Move 3D line/sprite renderer to separate module.
Matti Hamalainen <ccr@tnsp.org>
parents:
diff
changeset
|
84 int dmAdd3DLineSpriteModelBitmap(DM3DLineSpriteModel *model, DM3DBitmap *v, int *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 return dmAdd3DBitmap(&model->nbitmaps, &model->nbitmapsalloc, |
3bff024a91be
Move 3D line/sprite renderer to separate module.
Matti Hamalainen <ccr@tnsp.org>
parents:
diff
changeset
|
87 &model->bitmaps, v, index); |
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 |
3bff024a91be
Move 3D line/sprite renderer to separate module.
Matti Hamalainen <ccr@tnsp.org>
parents:
diff
changeset
|
90 |
251
98483680ea0f
Improve converter and adjust parser accordingly.
Matti Hamalainen <ccr@tnsp.org>
parents:
249
diff
changeset
|
91 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
|
92 { |
251
98483680ea0f
Improve converter and adjust parser accordingly.
Matti Hamalainen <ccr@tnsp.org>
parents:
249
diff
changeset
|
93 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
|
94 } |
3bff024a91be
Move 3D line/sprite renderer to separate module.
Matti Hamalainen <ccr@tnsp.org>
parents:
diff
changeset
|
95 |
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 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
|
98 { |
251
98483680ea0f
Improve converter and adjust parser accordingly.
Matti Hamalainen <ccr@tnsp.org>
parents:
249
diff
changeset
|
99 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
|
100 } |
3bff024a91be
Move 3D line/sprite renderer to separate module.
Matti Hamalainen <ccr@tnsp.org>
parents:
diff
changeset
|
101 |
3bff024a91be
Move 3D line/sprite renderer to separate module.
Matti Hamalainen <ccr@tnsp.org>
parents:
diff
changeset
|
102 |
3bff024a91be
Move 3D line/sprite renderer to separate module.
Matti Hamalainen <ccr@tnsp.org>
parents:
diff
changeset
|
103 void dmDraw3DLineSpriteModel(SDL_Surface *screen, DM3DLineSpriteModel *model, DMVector *pos, DMMatrix *mat, SDL_Surface *fbmap, Uint32 lcol) |
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 int i; |
251
98483680ea0f
Improve converter and adjust parser accordingly.
Matti Hamalainen <ccr@tnsp.org>
parents:
249
diff
changeset
|
106 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
|
107 for (i = 0; i < model->nlines; i++) |
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 DM3DLine *line = &model->lines[i]; |
3bff024a91be
Move 3D line/sprite renderer to separate module.
Matti Hamalainen <ccr@tnsp.org>
parents:
diff
changeset
|
110 DMVector pv[2]; |
3bff024a91be
Move 3D line/sprite renderer to separate module.
Matti Hamalainen <ccr@tnsp.org>
parents:
diff
changeset
|
111 dm_vector_add_r(&pv[0], &model->vertices[line->v1], pos); |
3bff024a91be
Move 3D line/sprite renderer to separate module.
Matti Hamalainen <ccr@tnsp.org>
parents:
diff
changeset
|
112 dm_vector_add_r(&pv[1], &model->vertices[line->v2], pos); |
3bff024a91be
Move 3D line/sprite renderer to separate module.
Matti Hamalainen <ccr@tnsp.org>
parents:
diff
changeset
|
113 dm_vector_mul_by_mat_n(pv, 2, mat); |
3bff024a91be
Move 3D line/sprite renderer to separate module.
Matti Hamalainen <ccr@tnsp.org>
parents:
diff
changeset
|
114 |
3bff024a91be
Move 3D line/sprite renderer to separate module.
Matti Hamalainen <ccr@tnsp.org>
parents:
diff
changeset
|
115 if (line->type > 1) |
251
98483680ea0f
Improve converter and adjust parser accordingly.
Matti Hamalainen <ccr@tnsp.org>
parents:
249
diff
changeset
|
116 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
|
117 else |
251
98483680ea0f
Improve converter and adjust parser accordingly.
Matti Hamalainen <ccr@tnsp.org>
parents:
249
diff
changeset
|
118 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
|
119 } |
3bff024a91be
Move 3D line/sprite renderer to separate module.
Matti Hamalainen <ccr@tnsp.org>
parents:
diff
changeset
|
120 |
3bff024a91be
Move 3D line/sprite renderer to separate module.
Matti Hamalainen <ccr@tnsp.org>
parents:
diff
changeset
|
121 for (i = 0; i < model->nsprites; i++) |
3bff024a91be
Move 3D line/sprite renderer to separate module.
Matti Hamalainen <ccr@tnsp.org>
parents:
diff
changeset
|
122 { |
3bff024a91be
Move 3D line/sprite renderer to separate module.
Matti Hamalainen <ccr@tnsp.org>
parents:
diff
changeset
|
123 DM3DSprite *sprite = &model->sprites[i]; |
3bff024a91be
Move 3D line/sprite renderer to separate module.
Matti Hamalainen <ccr@tnsp.org>
parents:
diff
changeset
|
124 DM3DBitmap *bmp = &model->bitmaps[sprite->bitmap]; |
3bff024a91be
Move 3D line/sprite renderer to separate module.
Matti Hamalainen <ccr@tnsp.org>
parents:
diff
changeset
|
125 DMVector pv, pt; |
3bff024a91be
Move 3D line/sprite renderer to separate module.
Matti Hamalainen <ccr@tnsp.org>
parents:
diff
changeset
|
126 dm_vector_add_r(&pt, &model->vertices[sprite->v], pos); |
3bff024a91be
Move 3D line/sprite renderer to separate module.
Matti Hamalainen <ccr@tnsp.org>
parents:
diff
changeset
|
127 dm_vector_mul_by_mat(&pv, &pt, mat); |
251
98483680ea0f
Improve converter and adjust parser accordingly.
Matti Hamalainen <ccr@tnsp.org>
parents:
249
diff
changeset
|
128 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
|
129 } |
3bff024a91be
Move 3D line/sprite renderer to separate module.
Matti Hamalainen <ccr@tnsp.org>
parents:
diff
changeset
|
130 } |
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 |
3bff024a91be
Move 3D line/sprite renderer to separate module.
Matti Hamalainen <ccr@tnsp.org>
parents:
diff
changeset
|
133 static char *dmSkipWhitespace(char *line, BOOL invert) |
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 if (invert) |
3bff024a91be
Move 3D line/sprite renderer to separate module.
Matti Hamalainen <ccr@tnsp.org>
parents:
diff
changeset
|
136 for (; *line && !isspace(*line); line++); |
3bff024a91be
Move 3D line/sprite renderer to separate module.
Matti Hamalainen <ccr@tnsp.org>
parents:
diff
changeset
|
137 else |
3bff024a91be
Move 3D line/sprite renderer to separate module.
Matti Hamalainen <ccr@tnsp.org>
parents:
diff
changeset
|
138 for (; *line && isspace(*line); line++); |
3bff024a91be
Move 3D line/sprite renderer to separate module.
Matti Hamalainen <ccr@tnsp.org>
parents:
diff
changeset
|
139 return line; |
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 static char *dmSkipUntil(char *line, char ch) |
3bff024a91be
Move 3D line/sprite renderer to separate module.
Matti Hamalainen <ccr@tnsp.org>
parents:
diff
changeset
|
144 { |
3bff024a91be
Move 3D line/sprite renderer to separate module.
Matti Hamalainen <ccr@tnsp.org>
parents:
diff
changeset
|
145 for (; *line && *line != ch; line++); |
3bff024a91be
Move 3D line/sprite renderer to separate module.
Matti Hamalainen <ccr@tnsp.org>
parents:
diff
changeset
|
146 return line; |
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 |
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 static BOOL dmReadCoordinate(char **line, float *value, BOOL next) |
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 *line = dmSkipWhitespace(*line, FALSE); |
3bff024a91be
Move 3D line/sprite renderer to separate module.
Matti Hamalainen <ccr@tnsp.org>
parents:
diff
changeset
|
153 if (sscanf(*line, "%f", value) != 1) return FALSE; |
3bff024a91be
Move 3D line/sprite renderer to separate module.
Matti Hamalainen <ccr@tnsp.org>
parents:
diff
changeset
|
154 if (next) |
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 *line = dmSkipUntil(*line, ','); |
3bff024a91be
Move 3D line/sprite renderer to separate module.
Matti Hamalainen <ccr@tnsp.org>
parents:
diff
changeset
|
157 if (**line != ',') return FALSE; |
3bff024a91be
Move 3D line/sprite renderer to separate module.
Matti Hamalainen <ccr@tnsp.org>
parents:
diff
changeset
|
158 *(*line)++; |
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 else |
3bff024a91be
Move 3D line/sprite renderer to separate module.
Matti Hamalainen <ccr@tnsp.org>
parents:
diff
changeset
|
161 *line = dmSkipWhitespace(*line, TRUE); |
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 return TRUE; |
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 |
243 | 166 static BOOL dmReadLineSegments(char *line, DM3DLineSpriteModel *model, BOOL relative, const DMVector *pt) |
241
3bff024a91be
Move 3D line/sprite renderer to separate module.
Matti Hamalainen <ccr@tnsp.org>
parents:
diff
changeset
|
167 { |
3bff024a91be
Move 3D line/sprite renderer to separate module.
Matti Hamalainen <ccr@tnsp.org>
parents:
diff
changeset
|
168 int nvertices, vertex, type; |
3bff024a91be
Move 3D line/sprite renderer to separate module.
Matti Hamalainen <ccr@tnsp.org>
parents:
diff
changeset
|
169 int *indices = NULL; |
3bff024a91be
Move 3D line/sprite renderer to separate module.
Matti Hamalainen <ccr@tnsp.org>
parents:
diff
changeset
|
170 if (sscanf(line+1, "%d", &nvertices) != 1) |
3bff024a91be
Move 3D line/sprite renderer to separate module.
Matti Hamalainen <ccr@tnsp.org>
parents:
diff
changeset
|
171 { |
3bff024a91be
Move 3D line/sprite renderer to separate module.
Matti Hamalainen <ccr@tnsp.org>
parents:
diff
changeset
|
172 dmError("No # of segments @ '%s'\n", line); |
3bff024a91be
Move 3D line/sprite renderer to separate module.
Matti Hamalainen <ccr@tnsp.org>
parents:
diff
changeset
|
173 goto error; |
3bff024a91be
Move 3D line/sprite renderer to separate module.
Matti Hamalainen <ccr@tnsp.org>
parents:
diff
changeset
|
174 } |
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 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
|
177 goto error; |
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 line = dmSkipWhitespace(line, TRUE); |
243 | 180 DMVector v, p, *t; |
181 dm_vector_copy(&v, pt); | |
241
3bff024a91be
Move 3D line/sprite renderer to separate module.
Matti Hamalainen <ccr@tnsp.org>
parents:
diff
changeset
|
182 for (vertex = 0; vertex <= nvertices; vertex++) |
3bff024a91be
Move 3D line/sprite renderer to separate module.
Matti Hamalainen <ccr@tnsp.org>
parents:
diff
changeset
|
183 { |
251
98483680ea0f
Improve converter and adjust parser accordingly.
Matti Hamalainen <ccr@tnsp.org>
parents:
249
diff
changeset
|
184 if (*line == 'Z') |
243 | 185 { |
251
98483680ea0f
Improve converter and adjust parser accordingly.
Matti Hamalainen <ccr@tnsp.org>
parents:
249
diff
changeset
|
186 indices[vertex] = indices[0]; |
98483680ea0f
Improve converter and adjust parser accordingly.
Matti Hamalainen <ccr@tnsp.org>
parents:
249
diff
changeset
|
187 line++; |
243 | 188 } |
189 else | |
245 | 190 { |
251
98483680ea0f
Improve converter and adjust parser accordingly.
Matti Hamalainen <ccr@tnsp.org>
parents:
249
diff
changeset
|
191 if (!dmReadCoordinate(&line, &p.x, TRUE)) return FALSE; |
98483680ea0f
Improve converter and adjust parser accordingly.
Matti Hamalainen <ccr@tnsp.org>
parents:
249
diff
changeset
|
192 if (!dmReadCoordinate(&line, &p.y, TRUE)) return FALSE; |
98483680ea0f
Improve converter and adjust parser accordingly.
Matti Hamalainen <ccr@tnsp.org>
parents:
249
diff
changeset
|
193 if (!dmReadCoordinate(&line, &p.z, FALSE)) return FALSE; |
98483680ea0f
Improve converter and adjust parser accordingly.
Matti Hamalainen <ccr@tnsp.org>
parents:
249
diff
changeset
|
194 if (relative) |
98483680ea0f
Improve converter and adjust parser accordingly.
Matti Hamalainen <ccr@tnsp.org>
parents:
249
diff
changeset
|
195 { |
98483680ea0f
Improve converter and adjust parser accordingly.
Matti Hamalainen <ccr@tnsp.org>
parents:
249
diff
changeset
|
196 dm_vector_add(&v, &p); |
98483680ea0f
Improve converter and adjust parser accordingly.
Matti Hamalainen <ccr@tnsp.org>
parents:
249
diff
changeset
|
197 t = &v; |
98483680ea0f
Improve converter and adjust parser accordingly.
Matti Hamalainen <ccr@tnsp.org>
parents:
249
diff
changeset
|
198 } |
98483680ea0f
Improve converter and adjust parser accordingly.
Matti Hamalainen <ccr@tnsp.org>
parents:
249
diff
changeset
|
199 else |
98483680ea0f
Improve converter and adjust parser accordingly.
Matti Hamalainen <ccr@tnsp.org>
parents:
249
diff
changeset
|
200 { |
98483680ea0f
Improve converter and adjust parser accordingly.
Matti Hamalainen <ccr@tnsp.org>
parents:
249
diff
changeset
|
201 dm_vector_add_r(&v, &p, pt); |
98483680ea0f
Improve converter and adjust parser accordingly.
Matti Hamalainen <ccr@tnsp.org>
parents:
249
diff
changeset
|
202 t = &v; |
98483680ea0f
Improve converter and adjust parser accordingly.
Matti Hamalainen <ccr@tnsp.org>
parents:
249
diff
changeset
|
203 } |
98483680ea0f
Improve converter and adjust parser accordingly.
Matti Hamalainen <ccr@tnsp.org>
parents:
249
diff
changeset
|
204 |
98483680ea0f
Improve converter and adjust parser accordingly.
Matti Hamalainen <ccr@tnsp.org>
parents:
249
diff
changeset
|
205 if (dmAdd3DLineSpriteModelVertex(model, t, &indices[vertex]) != DMERR_OK) |
98483680ea0f
Improve converter and adjust parser accordingly.
Matti Hamalainen <ccr@tnsp.org>
parents:
249
diff
changeset
|
206 goto error; |
245 | 207 } |
243 | 208 |
241
3bff024a91be
Move 3D line/sprite renderer to separate module.
Matti Hamalainen <ccr@tnsp.org>
parents:
diff
changeset
|
209 line = dmSkipWhitespace(line, FALSE); |
3bff024a91be
Move 3D line/sprite renderer to separate module.
Matti Hamalainen <ccr@tnsp.org>
parents:
diff
changeset
|
210 } |
3bff024a91be
Move 3D line/sprite renderer to separate module.
Matti Hamalainen <ccr@tnsp.org>
parents:
diff
changeset
|
211 |
3bff024a91be
Move 3D line/sprite renderer to separate module.
Matti Hamalainen <ccr@tnsp.org>
parents:
diff
changeset
|
212 if (sscanf(line, "%d", &type) != 1) |
3bff024a91be
Move 3D line/sprite renderer to separate module.
Matti Hamalainen <ccr@tnsp.org>
parents:
diff
changeset
|
213 { |
3bff024a91be
Move 3D line/sprite renderer to separate module.
Matti Hamalainen <ccr@tnsp.org>
parents:
diff
changeset
|
214 dmError("No line type @ '%s'\n", line); |
3bff024a91be
Move 3D line/sprite renderer to separate module.
Matti Hamalainen <ccr@tnsp.org>
parents:
diff
changeset
|
215 goto error; |
3bff024a91be
Move 3D line/sprite renderer to separate module.
Matti Hamalainen <ccr@tnsp.org>
parents:
diff
changeset
|
216 } |
3bff024a91be
Move 3D line/sprite renderer to separate module.
Matti Hamalainen <ccr@tnsp.org>
parents:
diff
changeset
|
217 |
3bff024a91be
Move 3D line/sprite renderer to separate module.
Matti Hamalainen <ccr@tnsp.org>
parents:
diff
changeset
|
218 for (vertex = 1; vertex <= nvertices; vertex++) |
3bff024a91be
Move 3D line/sprite renderer to separate module.
Matti Hamalainen <ccr@tnsp.org>
parents:
diff
changeset
|
219 { |
3bff024a91be
Move 3D line/sprite renderer to separate module.
Matti Hamalainen <ccr@tnsp.org>
parents:
diff
changeset
|
220 DM3DLine line; |
3bff024a91be
Move 3D line/sprite renderer to separate module.
Matti Hamalainen <ccr@tnsp.org>
parents:
diff
changeset
|
221 line.v1 = indices[vertex - 1]; |
3bff024a91be
Move 3D line/sprite renderer to separate module.
Matti Hamalainen <ccr@tnsp.org>
parents:
diff
changeset
|
222 line.v2 = indices[vertex]; |
3bff024a91be
Move 3D line/sprite renderer to separate module.
Matti Hamalainen <ccr@tnsp.org>
parents:
diff
changeset
|
223 line.type = type; |
3bff024a91be
Move 3D line/sprite renderer to separate module.
Matti Hamalainen <ccr@tnsp.org>
parents:
diff
changeset
|
224 if (dmAdd3DLineSpriteModelLine(model, &line, NULL) != DMERR_OK) |
3bff024a91be
Move 3D line/sprite renderer to separate module.
Matti Hamalainen <ccr@tnsp.org>
parents:
diff
changeset
|
225 goto error; |
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 |
3bff024a91be
Move 3D line/sprite renderer to separate module.
Matti Hamalainen <ccr@tnsp.org>
parents:
diff
changeset
|
228 return TRUE; |
3bff024a91be
Move 3D line/sprite renderer to separate module.
Matti Hamalainen <ccr@tnsp.org>
parents:
diff
changeset
|
229 error: |
3bff024a91be
Move 3D line/sprite renderer to separate module.
Matti Hamalainen <ccr@tnsp.org>
parents:
diff
changeset
|
230 dmFree(indices); |
3bff024a91be
Move 3D line/sprite renderer to separate module.
Matti Hamalainen <ccr@tnsp.org>
parents:
diff
changeset
|
231 return FALSE; |
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 |
249
3b028785b843
Various improvements in the .3d parser.
Matti Hamalainen <ccr@tnsp.org>
parents:
246
diff
changeset
|
234 static BOOL dmReadSprite(char *line, DM3DLineSpriteModel *model, DMVector *pos) |
241
3bff024a91be
Move 3D line/sprite renderer to separate module.
Matti Hamalainen <ccr@tnsp.org>
parents:
diff
changeset
|
235 { |
3bff024a91be
Move 3D line/sprite renderer to separate module.
Matti Hamalainen <ccr@tnsp.org>
parents:
diff
changeset
|
236 DMVector pt; |
3bff024a91be
Move 3D line/sprite renderer to separate module.
Matti Hamalainen <ccr@tnsp.org>
parents:
diff
changeset
|
237 DM3DSprite spr; |
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 line++; |
3bff024a91be
Move 3D line/sprite renderer to separate module.
Matti Hamalainen <ccr@tnsp.org>
parents:
diff
changeset
|
240 if (!dmReadCoordinate(&line, &pt.x, TRUE)) return FALSE; |
3bff024a91be
Move 3D line/sprite renderer to separate module.
Matti Hamalainen <ccr@tnsp.org>
parents:
diff
changeset
|
241 if (!dmReadCoordinate(&line, &pt.y, TRUE)) return FALSE; |
3bff024a91be
Move 3D line/sprite renderer to separate module.
Matti Hamalainen <ccr@tnsp.org>
parents:
diff
changeset
|
242 if (!dmReadCoordinate(&line, &pt.z, FALSE)) return FALSE; |
3bff024a91be
Move 3D line/sprite renderer to separate module.
Matti Hamalainen <ccr@tnsp.org>
parents:
diff
changeset
|
243 line = dmSkipWhitespace(line, FALSE); |
3bff024a91be
Move 3D line/sprite renderer to separate module.
Matti Hamalainen <ccr@tnsp.org>
parents:
diff
changeset
|
244 if (*line != 'B') |
3bff024a91be
Move 3D line/sprite renderer to separate module.
Matti Hamalainen <ccr@tnsp.org>
parents:
diff
changeset
|
245 { |
3bff024a91be
Move 3D line/sprite renderer to separate module.
Matti Hamalainen <ccr@tnsp.org>
parents:
diff
changeset
|
246 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
|
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 |
3bff024a91be
Move 3D line/sprite renderer to separate module.
Matti Hamalainen <ccr@tnsp.org>
parents:
diff
changeset
|
250 spr.bitmap = atoi(line + 1); |
3bff024a91be
Move 3D line/sprite renderer to separate module.
Matti Hamalainen <ccr@tnsp.org>
parents:
diff
changeset
|
251 |
249
3b028785b843
Various improvements in the .3d parser.
Matti Hamalainen <ccr@tnsp.org>
parents:
246
diff
changeset
|
252 dm_vector_add(&pt, pos); |
241
3bff024a91be
Move 3D line/sprite renderer to separate module.
Matti Hamalainen <ccr@tnsp.org>
parents:
diff
changeset
|
253 if (dmAdd3DLineSpriteModelVertex(model, &pt, &spr.v) != DMERR_OK) |
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 if (dmAdd3DLineSpriteModelSprite(model, &spr, NULL) != DMERR_OK) |
3bff024a91be
Move 3D line/sprite renderer to separate module.
Matti Hamalainen <ccr@tnsp.org>
parents:
diff
changeset
|
257 return FALSE; |
3bff024a91be
Move 3D line/sprite renderer to separate module.
Matti Hamalainen <ccr@tnsp.org>
parents:
diff
changeset
|
258 |
3bff024a91be
Move 3D line/sprite renderer to separate module.
Matti Hamalainen <ccr@tnsp.org>
parents:
diff
changeset
|
259 return TRUE; |
3bff024a91be
Move 3D line/sprite renderer to separate module.
Matti Hamalainen <ccr@tnsp.org>
parents:
diff
changeset
|
260 } |
3bff024a91be
Move 3D line/sprite renderer to separate module.
Matti Hamalainen <ccr@tnsp.org>
parents:
diff
changeset
|
261 |
3bff024a91be
Move 3D line/sprite renderer to separate module.
Matti Hamalainen <ccr@tnsp.org>
parents:
diff
changeset
|
262 static BOOL dmReadBitmap(char *line, DM3DLineSpriteModel *model) |
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 DM3DBitmap bmp, *rbmp; |
3bff024a91be
Move 3D line/sprite renderer to separate module.
Matti Hamalainen <ccr@tnsp.org>
parents:
diff
changeset
|
265 int index; |
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 strncpy(bmp.name, line + 1, sizeof(bmp.name)); |
3bff024a91be
Move 3D line/sprite renderer to separate module.
Matti Hamalainen <ccr@tnsp.org>
parents:
diff
changeset
|
268 bmp.img = NULL; |
3bff024a91be
Move 3D line/sprite renderer to separate module.
Matti Hamalainen <ccr@tnsp.org>
parents:
diff
changeset
|
269 |
3bff024a91be
Move 3D line/sprite renderer to separate module.
Matti Hamalainen <ccr@tnsp.org>
parents:
diff
changeset
|
270 if (dmAdd3DLineSpriteModelBitmap(model, &bmp, &index) != DMERR_OK) |
3bff024a91be
Move 3D line/sprite renderer to separate module.
Matti Hamalainen <ccr@tnsp.org>
parents:
diff
changeset
|
271 return FALSE; |
3bff024a91be
Move 3D line/sprite renderer to separate module.
Matti Hamalainen <ccr@tnsp.org>
parents:
diff
changeset
|
272 |
3bff024a91be
Move 3D line/sprite renderer to separate module.
Matti Hamalainen <ccr@tnsp.org>
parents:
diff
changeset
|
273 rbmp = &(model->bitmaps[index]); |
3bff024a91be
Move 3D line/sprite renderer to separate module.
Matti Hamalainen <ccr@tnsp.org>
parents:
diff
changeset
|
274 if (rbmp->img == NULL) |
3bff024a91be
Move 3D line/sprite renderer to separate module.
Matti Hamalainen <ccr@tnsp.org>
parents:
diff
changeset
|
275 { |
3bff024a91be
Move 3D line/sprite renderer to separate module.
Matti Hamalainen <ccr@tnsp.org>
parents:
diff
changeset
|
276 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
|
277 if (res == NULL) |
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 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
|
280 return FALSE; |
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 rbmp->img = dmLoadImage(res); |
3bff024a91be
Move 3D line/sprite renderer to separate module.
Matti Hamalainen <ccr@tnsp.org>
parents:
diff
changeset
|
283 dmf_close(res); |
3bff024a91be
Move 3D line/sprite renderer to separate module.
Matti Hamalainen <ccr@tnsp.org>
parents:
diff
changeset
|
284 if (rbmp->img == NULL) |
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 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
|
287 return FALSE; |
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 } |
3bff024a91be
Move 3D line/sprite renderer to separate module.
Matti Hamalainen <ccr@tnsp.org>
parents:
diff
changeset
|
290 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
|
291 return TRUE; |
3bff024a91be
Move 3D line/sprite renderer to separate module.
Matti Hamalainen <ccr@tnsp.org>
parents:
diff
changeset
|
292 } |
3bff024a91be
Move 3D line/sprite renderer to separate module.
Matti Hamalainen <ccr@tnsp.org>
parents:
diff
changeset
|
293 |
3bff024a91be
Move 3D line/sprite renderer to separate module.
Matti Hamalainen <ccr@tnsp.org>
parents:
diff
changeset
|
294 |
249
3b028785b843
Various improvements in the .3d parser.
Matti Hamalainen <ccr@tnsp.org>
parents:
246
diff
changeset
|
295 static int dmDoRead3DLineSpriteModel(DMResource *f, DM3DLineSpriteModel *model, DMVector *pos) |
241
3bff024a91be
Move 3D line/sprite renderer to separate module.
Matti Hamalainen <ccr@tnsp.org>
parents:
diff
changeset
|
296 { |
3bff024a91be
Move 3D line/sprite renderer to separate module.
Matti Hamalainen <ccr@tnsp.org>
parents:
diff
changeset
|
297 char line[512]; |
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 while (dmfgets(line, sizeof(line), f) != NULL) |
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 char *start = dmSkipWhitespace(line, FALSE); |
3bff024a91be
Move 3D line/sprite renderer to separate module.
Matti Hamalainen <ccr@tnsp.org>
parents:
diff
changeset
|
302 switch (*start) |
3bff024a91be
Move 3D line/sprite renderer to separate module.
Matti Hamalainen <ccr@tnsp.org>
parents:
diff
changeset
|
303 { |
3bff024a91be
Move 3D line/sprite renderer to separate module.
Matti Hamalainen <ccr@tnsp.org>
parents:
diff
changeset
|
304 case 0: |
3bff024a91be
Move 3D line/sprite renderer to separate module.
Matti Hamalainen <ccr@tnsp.org>
parents:
diff
changeset
|
305 case '#': |
3bff024a91be
Move 3D line/sprite renderer to separate module.
Matti Hamalainen <ccr@tnsp.org>
parents:
diff
changeset
|
306 break; |
3bff024a91be
Move 3D line/sprite renderer to separate module.
Matti Hamalainen <ccr@tnsp.org>
parents:
diff
changeset
|
307 |
249
3b028785b843
Various improvements in the .3d parser.
Matti Hamalainen <ccr@tnsp.org>
parents:
246
diff
changeset
|
308 case 'G': |
3b028785b843
Various improvements in the .3d parser.
Matti Hamalainen <ccr@tnsp.org>
parents:
246
diff
changeset
|
309 { |
3b028785b843
Various improvements in the .3d parser.
Matti Hamalainen <ccr@tnsp.org>
parents:
246
diff
changeset
|
310 int res; |
3b028785b843
Various improvements in the .3d parser.
Matti Hamalainen <ccr@tnsp.org>
parents:
246
diff
changeset
|
311 DMVector pt; |
3b028785b843
Various improvements in the .3d parser.
Matti Hamalainen <ccr@tnsp.org>
parents:
246
diff
changeset
|
312 start++; |
3b028785b843
Various improvements in the .3d parser.
Matti Hamalainen <ccr@tnsp.org>
parents:
246
diff
changeset
|
313 if (!dmReadCoordinate(&start, &pt.x, TRUE)) return DMERR_INVALID_DATA; |
3b028785b843
Various improvements in the .3d parser.
Matti Hamalainen <ccr@tnsp.org>
parents:
246
diff
changeset
|
314 if (!dmReadCoordinate(&start, &pt.y, TRUE)) return DMERR_INVALID_DATA; |
3b028785b843
Various improvements in the .3d parser.
Matti Hamalainen <ccr@tnsp.org>
parents:
246
diff
changeset
|
315 if (!dmReadCoordinate(&start, &pt.z, FALSE)) return DMERR_INVALID_DATA; |
3b028785b843
Various improvements in the .3d parser.
Matti Hamalainen <ccr@tnsp.org>
parents:
246
diff
changeset
|
316 dm_vector_add_r(&pt, pos, &pt); |
3b028785b843
Various improvements in the .3d parser.
Matti Hamalainen <ccr@tnsp.org>
parents:
246
diff
changeset
|
317 if ((res = dmDoRead3DLineSpriteModel(f, model, &pt)) != DMERR_OK) |
3b028785b843
Various improvements in the .3d parser.
Matti Hamalainen <ccr@tnsp.org>
parents:
246
diff
changeset
|
318 return res; |
3b028785b843
Various improvements in the .3d parser.
Matti Hamalainen <ccr@tnsp.org>
parents:
246
diff
changeset
|
319 } |
241
3bff024a91be
Move 3D line/sprite renderer to separate module.
Matti Hamalainen <ccr@tnsp.org>
parents:
diff
changeset
|
320 break; |
3bff024a91be
Move 3D line/sprite renderer to separate module.
Matti Hamalainen <ccr@tnsp.org>
parents:
diff
changeset
|
321 |
249
3b028785b843
Various improvements in the .3d parser.
Matti Hamalainen <ccr@tnsp.org>
parents:
246
diff
changeset
|
322 case 'E': |
3b028785b843
Various improvements in the .3d parser.
Matti Hamalainen <ccr@tnsp.org>
parents:
246
diff
changeset
|
323 return DMERR_OK; |
3b028785b843
Various improvements in the .3d parser.
Matti Hamalainen <ccr@tnsp.org>
parents:
246
diff
changeset
|
324 |
3b028785b843
Various improvements in the .3d parser.
Matti Hamalainen <ccr@tnsp.org>
parents:
246
diff
changeset
|
325 case 'B': |
3b028785b843
Various improvements in the .3d parser.
Matti Hamalainen <ccr@tnsp.org>
parents:
246
diff
changeset
|
326 if (!dmReadBitmap(start, model)) |
3b028785b843
Various improvements in the .3d parser.
Matti Hamalainen <ccr@tnsp.org>
parents:
246
diff
changeset
|
327 return DMERR_INVALID_DATA; |
243 | 328 break; |
329 | |
241
3bff024a91be
Move 3D line/sprite renderer to separate module.
Matti Hamalainen <ccr@tnsp.org>
parents:
diff
changeset
|
330 case 'L': |
249
3b028785b843
Various improvements in the .3d parser.
Matti Hamalainen <ccr@tnsp.org>
parents:
246
diff
changeset
|
331 if (!dmReadLineSegments(start, model, FALSE, pos)) |
243 | 332 return DMERR_INVALID_DATA; |
333 break; | |
334 | |
335 case 'R': | |
249
3b028785b843
Various improvements in the .3d parser.
Matti Hamalainen <ccr@tnsp.org>
parents:
246
diff
changeset
|
336 if (!dmReadLineSegments(start, model, TRUE, pos)) |
241
3bff024a91be
Move 3D line/sprite renderer to separate module.
Matti Hamalainen <ccr@tnsp.org>
parents:
diff
changeset
|
337 return DMERR_INVALID_DATA; |
3bff024a91be
Move 3D line/sprite renderer to separate module.
Matti Hamalainen <ccr@tnsp.org>
parents:
diff
changeset
|
338 break; |
3bff024a91be
Move 3D line/sprite renderer to separate module.
Matti Hamalainen <ccr@tnsp.org>
parents:
diff
changeset
|
339 |
3bff024a91be
Move 3D line/sprite renderer to separate module.
Matti Hamalainen <ccr@tnsp.org>
parents:
diff
changeset
|
340 case 'S': |
249
3b028785b843
Various improvements in the .3d parser.
Matti Hamalainen <ccr@tnsp.org>
parents:
246
diff
changeset
|
341 if (!dmReadSprite(start, model, pos)) |
241
3bff024a91be
Move 3D line/sprite renderer to separate module.
Matti Hamalainen <ccr@tnsp.org>
parents:
diff
changeset
|
342 return DMERR_INVALID_DATA; |
3bff024a91be
Move 3D line/sprite renderer to separate module.
Matti Hamalainen <ccr@tnsp.org>
parents:
diff
changeset
|
343 break; |
3bff024a91be
Move 3D line/sprite renderer to separate module.
Matti Hamalainen <ccr@tnsp.org>
parents:
diff
changeset
|
344 |
3bff024a91be
Move 3D line/sprite renderer to separate module.
Matti Hamalainen <ccr@tnsp.org>
parents:
diff
changeset
|
345 default: |
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 } |
3bff024a91be
Move 3D line/sprite renderer to separate module.
Matti Hamalainen <ccr@tnsp.org>
parents:
diff
changeset
|
348 } |
245 | 349 return DMERR_OK; |
246 | 350 } |
241
3bff024a91be
Move 3D line/sprite renderer to separate module.
Matti Hamalainen <ccr@tnsp.org>
parents:
diff
changeset
|
351 |
245 | 352 |
249
3b028785b843
Various improvements in the .3d parser.
Matti Hamalainen <ccr@tnsp.org>
parents:
246
diff
changeset
|
353 int dmRead3DLineSpriteModel(DMResource *f, DM3DLineSpriteModel **model) |
3b028785b843
Various improvements in the .3d parser.
Matti Hamalainen <ccr@tnsp.org>
parents:
246
diff
changeset
|
354 { |
3b028785b843
Various improvements in the .3d parser.
Matti Hamalainen <ccr@tnsp.org>
parents:
246
diff
changeset
|
355 DMVector pos; |
3b028785b843
Various improvements in the .3d parser.
Matti Hamalainen <ccr@tnsp.org>
parents:
246
diff
changeset
|
356 |
3b028785b843
Various improvements in the .3d parser.
Matti Hamalainen <ccr@tnsp.org>
parents:
246
diff
changeset
|
357 if ((*model = dmMalloc0(sizeof(DM3DLineSpriteModel))) == NULL) |
3b028785b843
Various improvements in the .3d parser.
Matti Hamalainen <ccr@tnsp.org>
parents:
246
diff
changeset
|
358 return DMERR_MALLOC; |
3b028785b843
Various improvements in the .3d parser.
Matti Hamalainen <ccr@tnsp.org>
parents:
246
diff
changeset
|
359 |
3b028785b843
Various improvements in the .3d parser.
Matti Hamalainen <ccr@tnsp.org>
parents:
246
diff
changeset
|
360 memset(&pos, 0, sizeof(pos)); |
3b028785b843
Various improvements in the .3d parser.
Matti Hamalainen <ccr@tnsp.org>
parents:
246
diff
changeset
|
361 |
3b028785b843
Various improvements in the .3d parser.
Matti Hamalainen <ccr@tnsp.org>
parents:
246
diff
changeset
|
362 return dmDoRead3DLineSpriteModel(f, *model, &pos); |
3b028785b843
Various improvements in the .3d parser.
Matti Hamalainen <ccr@tnsp.org>
parents:
246
diff
changeset
|
363 } |
3b028785b843
Various improvements in the .3d parser.
Matti Hamalainen <ccr@tnsp.org>
parents:
246
diff
changeset
|
364 |
3b028785b843
Various improvements in the .3d parser.
Matti Hamalainen <ccr@tnsp.org>
parents:
246
diff
changeset
|
365 |
245 | 366 void dmFree3DLineSpriteModel(DM3DLineSpriteModel *model) |
367 { | |
368 int i; | |
369 for (i = 0; i < model->nbitmaps; i++) | |
370 { | |
371 if (model->bitmaps[i].img != NULL) | |
372 SDL_FreeSurface(model->bitmaps[i].img); | |
373 } | |
374 | |
375 dmFree(model->bitmaps); | |
376 dmFree(model->vertices); | |
377 dmFree(model->lines); | |
378 dmFree(model->sprites); | |
379 dmFree(model); | |
241
3bff024a91be
Move 3D line/sprite renderer to separate module.
Matti Hamalainen <ccr@tnsp.org>
parents:
diff
changeset
|
380 } |