Mercurial > hg > dmlib
annotate dmq3d.c @ 256:31ce6d32408f
Error out when bezier segments are found.
author | Matti Hamalainen <ccr@tnsp.org> |
---|---|
date | Tue, 09 Oct 2012 23:44:02 +0300 |
parents | 61eb5fb4a5e6 |
children | be2ca95af493 |
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]; |
253
61eb5fb4a5e6
Fix a silly rendering issue.
Matti Hamalainen <ccr@tnsp.org>
parents:
251
diff
changeset
|
111 dm_vector_copy(&pv[0], &model->vertices[line->v1]); |
61eb5fb4a5e6
Fix a silly rendering issue.
Matti Hamalainen <ccr@tnsp.org>
parents:
251
diff
changeset
|
112 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
|
113 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
|
114 dm_vector_add(&pv[0], pos); |
61eb5fb4a5e6
Fix a silly rendering issue.
Matti Hamalainen <ccr@tnsp.org>
parents:
251
diff
changeset
|
115 dm_vector_add(&pv[1], pos); |
241
3bff024a91be
Move 3D line/sprite renderer to separate module.
Matti Hamalainen <ccr@tnsp.org>
parents:
diff
changeset
|
116 |
3bff024a91be
Move 3D line/sprite renderer to separate module.
Matti Hamalainen <ccr@tnsp.org>
parents:
diff
changeset
|
117 if (line->type > 1) |
251
98483680ea0f
Improve converter and adjust parser accordingly.
Matti Hamalainen <ccr@tnsp.org>
parents:
249
diff
changeset
|
118 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
|
119 else |
251
98483680ea0f
Improve converter and adjust parser accordingly.
Matti Hamalainen <ccr@tnsp.org>
parents:
249
diff
changeset
|
120 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
|
121 } |
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 for (i = 0; i < model->nsprites; i++) |
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 DM3DSprite *sprite = &model->sprites[i]; |
3bff024a91be
Move 3D line/sprite renderer to separate module.
Matti Hamalainen <ccr@tnsp.org>
parents:
diff
changeset
|
126 DM3DBitmap *bmp = &model->bitmaps[sprite->bitmap]; |
253
61eb5fb4a5e6
Fix a silly rendering issue.
Matti Hamalainen <ccr@tnsp.org>
parents:
251
diff
changeset
|
127 DMVector pv; |
61eb5fb4a5e6
Fix a silly rendering issue.
Matti Hamalainen <ccr@tnsp.org>
parents:
251
diff
changeset
|
128 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
|
129 dm_vector_add(&pv, pos); |
251
98483680ea0f
Improve converter and adjust parser accordingly.
Matti Hamalainen <ccr@tnsp.org>
parents:
249
diff
changeset
|
130 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
|
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 |
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 static char *dmSkipWhitespace(char *line, BOOL invert) |
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 if (invert) |
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 else |
3bff024a91be
Move 3D line/sprite renderer to separate module.
Matti Hamalainen <ccr@tnsp.org>
parents:
diff
changeset
|
140 for (; *line && isspace(*line); line++); |
3bff024a91be
Move 3D line/sprite renderer to separate module.
Matti Hamalainen <ccr@tnsp.org>
parents:
diff
changeset
|
141 return line; |
3bff024a91be
Move 3D line/sprite renderer to separate module.
Matti Hamalainen <ccr@tnsp.org>
parents:
diff
changeset
|
142 } |
3bff024a91be
Move 3D line/sprite renderer to separate module.
Matti Hamalainen <ccr@tnsp.org>
parents:
diff
changeset
|
143 |
3bff024a91be
Move 3D line/sprite renderer to separate module.
Matti Hamalainen <ccr@tnsp.org>
parents:
diff
changeset
|
144 |
3bff024a91be
Move 3D line/sprite renderer to separate module.
Matti Hamalainen <ccr@tnsp.org>
parents:
diff
changeset
|
145 static char *dmSkipUntil(char *line, char ch) |
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 for (; *line && *line != ch; line++); |
3bff024a91be
Move 3D line/sprite renderer to separate module.
Matti Hamalainen <ccr@tnsp.org>
parents:
diff
changeset
|
148 return line; |
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 |
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 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
|
153 { |
3bff024a91be
Move 3D line/sprite renderer to separate module.
Matti Hamalainen <ccr@tnsp.org>
parents:
diff
changeset
|
154 *line = dmSkipWhitespace(*line, FALSE); |
3bff024a91be
Move 3D line/sprite renderer to separate module.
Matti Hamalainen <ccr@tnsp.org>
parents:
diff
changeset
|
155 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
|
156 if (next) |
3bff024a91be
Move 3D line/sprite renderer to separate module.
Matti Hamalainen <ccr@tnsp.org>
parents:
diff
changeset
|
157 { |
3bff024a91be
Move 3D line/sprite renderer to separate module.
Matti Hamalainen <ccr@tnsp.org>
parents:
diff
changeset
|
158 *line = dmSkipUntil(*line, ','); |
3bff024a91be
Move 3D line/sprite renderer to separate module.
Matti Hamalainen <ccr@tnsp.org>
parents:
diff
changeset
|
159 if (**line != ',') return FALSE; |
3bff024a91be
Move 3D line/sprite renderer to separate module.
Matti Hamalainen <ccr@tnsp.org>
parents:
diff
changeset
|
160 *(*line)++; |
3bff024a91be
Move 3D line/sprite renderer to separate module.
Matti Hamalainen <ccr@tnsp.org>
parents:
diff
changeset
|
161 } |
3bff024a91be
Move 3D line/sprite renderer to separate module.
Matti Hamalainen <ccr@tnsp.org>
parents:
diff
changeset
|
162 else |
3bff024a91be
Move 3D line/sprite renderer to separate module.
Matti Hamalainen <ccr@tnsp.org>
parents:
diff
changeset
|
163 *line = dmSkipWhitespace(*line, 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 return TRUE; |
3bff024a91be
Move 3D line/sprite renderer to separate module.
Matti Hamalainen <ccr@tnsp.org>
parents:
diff
changeset
|
166 } |
3bff024a91be
Move 3D line/sprite renderer to separate module.
Matti Hamalainen <ccr@tnsp.org>
parents:
diff
changeset
|
167 |
243 | 168 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
|
169 { |
3bff024a91be
Move 3D line/sprite renderer to separate module.
Matti Hamalainen <ccr@tnsp.org>
parents:
diff
changeset
|
170 int nvertices, vertex, type; |
3bff024a91be
Move 3D line/sprite renderer to separate module.
Matti Hamalainen <ccr@tnsp.org>
parents:
diff
changeset
|
171 int *indices = NULL; |
3bff024a91be
Move 3D line/sprite renderer to separate module.
Matti Hamalainen <ccr@tnsp.org>
parents:
diff
changeset
|
172 if (sscanf(line+1, "%d", &nvertices) != 1) |
3bff024a91be
Move 3D line/sprite renderer to separate module.
Matti Hamalainen <ccr@tnsp.org>
parents:
diff
changeset
|
173 { |
3bff024a91be
Move 3D line/sprite renderer to separate module.
Matti Hamalainen <ccr@tnsp.org>
parents:
diff
changeset
|
174 dmError("No # of segments @ '%s'\n", line); |
3bff024a91be
Move 3D line/sprite renderer to separate module.
Matti Hamalainen <ccr@tnsp.org>
parents:
diff
changeset
|
175 goto error; |
3bff024a91be
Move 3D line/sprite renderer to separate module.
Matti Hamalainen <ccr@tnsp.org>
parents:
diff
changeset
|
176 } |
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 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
|
179 goto error; |
3bff024a91be
Move 3D line/sprite renderer to separate module.
Matti Hamalainen <ccr@tnsp.org>
parents:
diff
changeset
|
180 |
3bff024a91be
Move 3D line/sprite renderer to separate module.
Matti Hamalainen <ccr@tnsp.org>
parents:
diff
changeset
|
181 line = dmSkipWhitespace(line, TRUE); |
243 | 182 DMVector v, p, *t; |
183 dm_vector_copy(&v, pt); | |
241
3bff024a91be
Move 3D line/sprite renderer to separate module.
Matti Hamalainen <ccr@tnsp.org>
parents:
diff
changeset
|
184 for (vertex = 0; vertex <= nvertices; vertex++) |
3bff024a91be
Move 3D line/sprite renderer to separate module.
Matti Hamalainen <ccr@tnsp.org>
parents:
diff
changeset
|
185 { |
251
98483680ea0f
Improve converter and adjust parser accordingly.
Matti Hamalainen <ccr@tnsp.org>
parents:
249
diff
changeset
|
186 if (*line == 'Z') |
243 | 187 { |
251
98483680ea0f
Improve converter and adjust parser accordingly.
Matti Hamalainen <ccr@tnsp.org>
parents:
249
diff
changeset
|
188 indices[vertex] = indices[0]; |
98483680ea0f
Improve converter and adjust parser accordingly.
Matti Hamalainen <ccr@tnsp.org>
parents:
249
diff
changeset
|
189 line++; |
243 | 190 } |
191 else | |
245 | 192 { |
251
98483680ea0f
Improve converter and adjust parser accordingly.
Matti Hamalainen <ccr@tnsp.org>
parents:
249
diff
changeset
|
193 if (!dmReadCoordinate(&line, &p.x, TRUE)) return FALSE; |
98483680ea0f
Improve converter and adjust parser accordingly.
Matti Hamalainen <ccr@tnsp.org>
parents:
249
diff
changeset
|
194 if (!dmReadCoordinate(&line, &p.y, TRUE)) return FALSE; |
98483680ea0f
Improve converter and adjust parser accordingly.
Matti Hamalainen <ccr@tnsp.org>
parents:
249
diff
changeset
|
195 if (!dmReadCoordinate(&line, &p.z, FALSE)) return FALSE; |
98483680ea0f
Improve converter and adjust parser accordingly.
Matti Hamalainen <ccr@tnsp.org>
parents:
249
diff
changeset
|
196 if (relative) |
98483680ea0f
Improve converter and adjust parser accordingly.
Matti Hamalainen <ccr@tnsp.org>
parents:
249
diff
changeset
|
197 { |
98483680ea0f
Improve converter and adjust parser accordingly.
Matti Hamalainen <ccr@tnsp.org>
parents:
249
diff
changeset
|
198 dm_vector_add(&v, &p); |
98483680ea0f
Improve converter and adjust parser accordingly.
Matti Hamalainen <ccr@tnsp.org>
parents:
249
diff
changeset
|
199 t = &v; |
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 else |
98483680ea0f
Improve converter and adjust parser accordingly.
Matti Hamalainen <ccr@tnsp.org>
parents:
249
diff
changeset
|
202 { |
98483680ea0f
Improve converter and adjust parser accordingly.
Matti Hamalainen <ccr@tnsp.org>
parents:
249
diff
changeset
|
203 dm_vector_add_r(&v, &p, pt); |
98483680ea0f
Improve converter and adjust parser accordingly.
Matti Hamalainen <ccr@tnsp.org>
parents:
249
diff
changeset
|
204 t = &v; |
98483680ea0f
Improve converter and adjust parser accordingly.
Matti Hamalainen <ccr@tnsp.org>
parents:
249
diff
changeset
|
205 } |
98483680ea0f
Improve converter and adjust parser accordingly.
Matti Hamalainen <ccr@tnsp.org>
parents:
249
diff
changeset
|
206 |
98483680ea0f
Improve converter and adjust parser accordingly.
Matti Hamalainen <ccr@tnsp.org>
parents:
249
diff
changeset
|
207 if (dmAdd3DLineSpriteModelVertex(model, t, &indices[vertex]) != DMERR_OK) |
98483680ea0f
Improve converter and adjust parser accordingly.
Matti Hamalainen <ccr@tnsp.org>
parents:
249
diff
changeset
|
208 goto error; |
245 | 209 } |
243 | 210 |
241
3bff024a91be
Move 3D line/sprite renderer to separate module.
Matti Hamalainen <ccr@tnsp.org>
parents:
diff
changeset
|
211 line = dmSkipWhitespace(line, FALSE); |
3bff024a91be
Move 3D line/sprite renderer to separate module.
Matti Hamalainen <ccr@tnsp.org>
parents:
diff
changeset
|
212 } |
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 if (sscanf(line, "%d", &type) != 1) |
3bff024a91be
Move 3D line/sprite renderer to separate module.
Matti Hamalainen <ccr@tnsp.org>
parents:
diff
changeset
|
215 { |
3bff024a91be
Move 3D line/sprite renderer to separate module.
Matti Hamalainen <ccr@tnsp.org>
parents:
diff
changeset
|
216 dmError("No line type @ '%s'\n", line); |
3bff024a91be
Move 3D line/sprite renderer to separate module.
Matti Hamalainen <ccr@tnsp.org>
parents:
diff
changeset
|
217 goto error; |
3bff024a91be
Move 3D line/sprite renderer to separate module.
Matti Hamalainen <ccr@tnsp.org>
parents:
diff
changeset
|
218 } |
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 for (vertex = 1; vertex <= nvertices; vertex++) |
3bff024a91be
Move 3D line/sprite renderer to separate module.
Matti Hamalainen <ccr@tnsp.org>
parents:
diff
changeset
|
221 { |
3bff024a91be
Move 3D line/sprite renderer to separate module.
Matti Hamalainen <ccr@tnsp.org>
parents:
diff
changeset
|
222 DM3DLine line; |
3bff024a91be
Move 3D line/sprite renderer to separate module.
Matti Hamalainen <ccr@tnsp.org>
parents:
diff
changeset
|
223 line.v1 = indices[vertex - 1]; |
3bff024a91be
Move 3D line/sprite renderer to separate module.
Matti Hamalainen <ccr@tnsp.org>
parents:
diff
changeset
|
224 line.v2 = indices[vertex]; |
3bff024a91be
Move 3D line/sprite renderer to separate module.
Matti Hamalainen <ccr@tnsp.org>
parents:
diff
changeset
|
225 line.type = type; |
3bff024a91be
Move 3D line/sprite renderer to separate module.
Matti Hamalainen <ccr@tnsp.org>
parents:
diff
changeset
|
226 if (dmAdd3DLineSpriteModelLine(model, &line, NULL) != DMERR_OK) |
3bff024a91be
Move 3D line/sprite renderer to separate module.
Matti Hamalainen <ccr@tnsp.org>
parents:
diff
changeset
|
227 goto error; |
3bff024a91be
Move 3D line/sprite renderer to separate module.
Matti Hamalainen <ccr@tnsp.org>
parents:
diff
changeset
|
228 } |
3bff024a91be
Move 3D line/sprite renderer to separate module.
Matti Hamalainen <ccr@tnsp.org>
parents:
diff
changeset
|
229 |
3bff024a91be
Move 3D line/sprite renderer to separate module.
Matti Hamalainen <ccr@tnsp.org>
parents:
diff
changeset
|
230 return TRUE; |
3bff024a91be
Move 3D line/sprite renderer to separate module.
Matti Hamalainen <ccr@tnsp.org>
parents:
diff
changeset
|
231 error: |
3bff024a91be
Move 3D line/sprite renderer to separate module.
Matti Hamalainen <ccr@tnsp.org>
parents:
diff
changeset
|
232 dmFree(indices); |
3bff024a91be
Move 3D line/sprite renderer to separate module.
Matti Hamalainen <ccr@tnsp.org>
parents:
diff
changeset
|
233 return FALSE; |
3bff024a91be
Move 3D line/sprite renderer to separate module.
Matti Hamalainen <ccr@tnsp.org>
parents:
diff
changeset
|
234 } |
3bff024a91be
Move 3D line/sprite renderer to separate module.
Matti Hamalainen <ccr@tnsp.org>
parents:
diff
changeset
|
235 |
249
3b028785b843
Various improvements in the .3d parser.
Matti Hamalainen <ccr@tnsp.org>
parents:
246
diff
changeset
|
236 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
|
237 { |
3bff024a91be
Move 3D line/sprite renderer to separate module.
Matti Hamalainen <ccr@tnsp.org>
parents:
diff
changeset
|
238 DMVector pt; |
3bff024a91be
Move 3D line/sprite renderer to separate module.
Matti Hamalainen <ccr@tnsp.org>
parents:
diff
changeset
|
239 DM3DSprite spr; |
3bff024a91be
Move 3D line/sprite renderer to separate module.
Matti Hamalainen <ccr@tnsp.org>
parents:
diff
changeset
|
240 |
3bff024a91be
Move 3D line/sprite renderer to separate module.
Matti Hamalainen <ccr@tnsp.org>
parents:
diff
changeset
|
241 line++; |
3bff024a91be
Move 3D line/sprite renderer to separate module.
Matti Hamalainen <ccr@tnsp.org>
parents:
diff
changeset
|
242 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
|
243 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
|
244 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
|
245 line = dmSkipWhitespace(line, FALSE); |
3bff024a91be
Move 3D line/sprite renderer to separate module.
Matti Hamalainen <ccr@tnsp.org>
parents:
diff
changeset
|
246 if (*line != 'B') |
3bff024a91be
Move 3D line/sprite renderer to separate module.
Matti Hamalainen <ccr@tnsp.org>
parents:
diff
changeset
|
247 { |
3bff024a91be
Move 3D line/sprite renderer to separate module.
Matti Hamalainen <ccr@tnsp.org>
parents:
diff
changeset
|
248 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
|
249 return FALSE; |
3bff024a91be
Move 3D line/sprite renderer to separate module.
Matti Hamalainen <ccr@tnsp.org>
parents:
diff
changeset
|
250 } |
3bff024a91be
Move 3D line/sprite renderer to separate module.
Matti Hamalainen <ccr@tnsp.org>
parents:
diff
changeset
|
251 |
3bff024a91be
Move 3D line/sprite renderer to separate module.
Matti Hamalainen <ccr@tnsp.org>
parents:
diff
changeset
|
252 spr.bitmap = atoi(line + 1); |
3bff024a91be
Move 3D line/sprite renderer to separate module.
Matti Hamalainen <ccr@tnsp.org>
parents:
diff
changeset
|
253 |
249
3b028785b843
Various improvements in the .3d parser.
Matti Hamalainen <ccr@tnsp.org>
parents:
246
diff
changeset
|
254 dm_vector_add(&pt, pos); |
241
3bff024a91be
Move 3D line/sprite renderer to separate module.
Matti Hamalainen <ccr@tnsp.org>
parents:
diff
changeset
|
255 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
|
256 return FALSE; |
3bff024a91be
Move 3D line/sprite renderer to separate module.
Matti Hamalainen <ccr@tnsp.org>
parents:
diff
changeset
|
257 |
3bff024a91be
Move 3D line/sprite renderer to separate module.
Matti Hamalainen <ccr@tnsp.org>
parents:
diff
changeset
|
258 if (dmAdd3DLineSpriteModelSprite(model, &spr, NULL) != DMERR_OK) |
3bff024a91be
Move 3D line/sprite renderer to separate module.
Matti Hamalainen <ccr@tnsp.org>
parents:
diff
changeset
|
259 return FALSE; |
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 return TRUE; |
3bff024a91be
Move 3D line/sprite renderer to separate module.
Matti Hamalainen <ccr@tnsp.org>
parents:
diff
changeset
|
262 } |
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 static BOOL dmReadBitmap(char *line, DM3DLineSpriteModel *model) |
3bff024a91be
Move 3D line/sprite renderer to separate module.
Matti Hamalainen <ccr@tnsp.org>
parents:
diff
changeset
|
265 { |
3bff024a91be
Move 3D line/sprite renderer to separate module.
Matti Hamalainen <ccr@tnsp.org>
parents:
diff
changeset
|
266 DM3DBitmap bmp, *rbmp; |
3bff024a91be
Move 3D line/sprite renderer to separate module.
Matti Hamalainen <ccr@tnsp.org>
parents:
diff
changeset
|
267 int index; |
3bff024a91be
Move 3D line/sprite renderer to separate module.
Matti Hamalainen <ccr@tnsp.org>
parents:
diff
changeset
|
268 |
3bff024a91be
Move 3D line/sprite renderer to separate module.
Matti Hamalainen <ccr@tnsp.org>
parents:
diff
changeset
|
269 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
|
270 bmp.img = NULL; |
3bff024a91be
Move 3D line/sprite renderer to separate module.
Matti Hamalainen <ccr@tnsp.org>
parents:
diff
changeset
|
271 |
3bff024a91be
Move 3D line/sprite renderer to separate module.
Matti Hamalainen <ccr@tnsp.org>
parents:
diff
changeset
|
272 if (dmAdd3DLineSpriteModelBitmap(model, &bmp, &index) != DMERR_OK) |
3bff024a91be
Move 3D line/sprite renderer to separate module.
Matti Hamalainen <ccr@tnsp.org>
parents:
diff
changeset
|
273 return FALSE; |
3bff024a91be
Move 3D line/sprite renderer to separate module.
Matti Hamalainen <ccr@tnsp.org>
parents:
diff
changeset
|
274 |
3bff024a91be
Move 3D line/sprite renderer to separate module.
Matti Hamalainen <ccr@tnsp.org>
parents:
diff
changeset
|
275 rbmp = &(model->bitmaps[index]); |
3bff024a91be
Move 3D line/sprite renderer to separate module.
Matti Hamalainen <ccr@tnsp.org>
parents:
diff
changeset
|
276 if (rbmp->img == NULL) |
3bff024a91be
Move 3D line/sprite renderer to separate module.
Matti Hamalainen <ccr@tnsp.org>
parents:
diff
changeset
|
277 { |
3bff024a91be
Move 3D line/sprite renderer to separate module.
Matti Hamalainen <ccr@tnsp.org>
parents:
diff
changeset
|
278 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
|
279 if (res == NULL) |
3bff024a91be
Move 3D line/sprite renderer to separate module.
Matti Hamalainen <ccr@tnsp.org>
parents:
diff
changeset
|
280 { |
3bff024a91be
Move 3D line/sprite renderer to separate module.
Matti Hamalainen <ccr@tnsp.org>
parents:
diff
changeset
|
281 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
|
282 return FALSE; |
3bff024a91be
Move 3D line/sprite renderer to separate module.
Matti Hamalainen <ccr@tnsp.org>
parents:
diff
changeset
|
283 } |
3bff024a91be
Move 3D line/sprite renderer to separate module.
Matti Hamalainen <ccr@tnsp.org>
parents:
diff
changeset
|
284 rbmp->img = dmLoadImage(res); |
3bff024a91be
Move 3D line/sprite renderer to separate module.
Matti Hamalainen <ccr@tnsp.org>
parents:
diff
changeset
|
285 dmf_close(res); |
3bff024a91be
Move 3D line/sprite renderer to separate module.
Matti Hamalainen <ccr@tnsp.org>
parents:
diff
changeset
|
286 if (rbmp->img == NULL) |
3bff024a91be
Move 3D line/sprite renderer to separate module.
Matti Hamalainen <ccr@tnsp.org>
parents:
diff
changeset
|
287 { |
3bff024a91be
Move 3D line/sprite renderer to separate module.
Matti Hamalainen <ccr@tnsp.org>
parents:
diff
changeset
|
288 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
|
289 return FALSE; |
3bff024a91be
Move 3D line/sprite renderer to separate module.
Matti Hamalainen <ccr@tnsp.org>
parents:
diff
changeset
|
290 } |
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 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
|
293 return TRUE; |
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 |
3bff024a91be
Move 3D line/sprite renderer to separate module.
Matti Hamalainen <ccr@tnsp.org>
parents:
diff
changeset
|
296 |
249
3b028785b843
Various improvements in the .3d parser.
Matti Hamalainen <ccr@tnsp.org>
parents:
246
diff
changeset
|
297 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
|
298 { |
3bff024a91be
Move 3D line/sprite renderer to separate module.
Matti Hamalainen <ccr@tnsp.org>
parents:
diff
changeset
|
299 char line[512]; |
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 while (dmfgets(line, sizeof(line), f) != NULL) |
3bff024a91be
Move 3D line/sprite renderer to separate module.
Matti Hamalainen <ccr@tnsp.org>
parents:
diff
changeset
|
302 { |
3bff024a91be
Move 3D line/sprite renderer to separate module.
Matti Hamalainen <ccr@tnsp.org>
parents:
diff
changeset
|
303 char *start = dmSkipWhitespace(line, FALSE); |
3bff024a91be
Move 3D line/sprite renderer to separate module.
Matti Hamalainen <ccr@tnsp.org>
parents:
diff
changeset
|
304 switch (*start) |
3bff024a91be
Move 3D line/sprite renderer to separate module.
Matti Hamalainen <ccr@tnsp.org>
parents:
diff
changeset
|
305 { |
3bff024a91be
Move 3D line/sprite renderer to separate module.
Matti Hamalainen <ccr@tnsp.org>
parents:
diff
changeset
|
306 case 0: |
3bff024a91be
Move 3D line/sprite renderer to separate module.
Matti Hamalainen <ccr@tnsp.org>
parents:
diff
changeset
|
307 case '#': |
3bff024a91be
Move 3D line/sprite renderer to separate module.
Matti Hamalainen <ccr@tnsp.org>
parents:
diff
changeset
|
308 break; |
3bff024a91be
Move 3D line/sprite renderer to separate module.
Matti Hamalainen <ccr@tnsp.org>
parents:
diff
changeset
|
309 |
249
3b028785b843
Various improvements in the .3d parser.
Matti Hamalainen <ccr@tnsp.org>
parents:
246
diff
changeset
|
310 case 'G': |
3b028785b843
Various improvements in the .3d parser.
Matti Hamalainen <ccr@tnsp.org>
parents:
246
diff
changeset
|
311 { |
3b028785b843
Various improvements in the .3d parser.
Matti Hamalainen <ccr@tnsp.org>
parents:
246
diff
changeset
|
312 int res; |
3b028785b843
Various improvements in the .3d parser.
Matti Hamalainen <ccr@tnsp.org>
parents:
246
diff
changeset
|
313 DMVector pt; |
3b028785b843
Various improvements in the .3d parser.
Matti Hamalainen <ccr@tnsp.org>
parents:
246
diff
changeset
|
314 start++; |
3b028785b843
Various improvements in the .3d parser.
Matti Hamalainen <ccr@tnsp.org>
parents:
246
diff
changeset
|
315 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
|
316 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
|
317 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
|
318 dm_vector_add_r(&pt, pos, &pt); |
3b028785b843
Various improvements in the .3d parser.
Matti Hamalainen <ccr@tnsp.org>
parents:
246
diff
changeset
|
319 if ((res = dmDoRead3DLineSpriteModel(f, model, &pt)) != DMERR_OK) |
3b028785b843
Various improvements in the .3d parser.
Matti Hamalainen <ccr@tnsp.org>
parents:
246
diff
changeset
|
320 return res; |
3b028785b843
Various improvements in the .3d parser.
Matti Hamalainen <ccr@tnsp.org>
parents:
246
diff
changeset
|
321 } |
241
3bff024a91be
Move 3D line/sprite renderer to separate module.
Matti Hamalainen <ccr@tnsp.org>
parents:
diff
changeset
|
322 break; |
3bff024a91be
Move 3D line/sprite renderer to separate module.
Matti Hamalainen <ccr@tnsp.org>
parents:
diff
changeset
|
323 |
249
3b028785b843
Various improvements in the .3d parser.
Matti Hamalainen <ccr@tnsp.org>
parents:
246
diff
changeset
|
324 case 'E': |
3b028785b843
Various improvements in the .3d parser.
Matti Hamalainen <ccr@tnsp.org>
parents:
246
diff
changeset
|
325 return DMERR_OK; |
3b028785b843
Various improvements in the .3d parser.
Matti Hamalainen <ccr@tnsp.org>
parents:
246
diff
changeset
|
326 |
3b028785b843
Various improvements in the .3d parser.
Matti Hamalainen <ccr@tnsp.org>
parents:
246
diff
changeset
|
327 case 'B': |
3b028785b843
Various improvements in the .3d parser.
Matti Hamalainen <ccr@tnsp.org>
parents:
246
diff
changeset
|
328 if (!dmReadBitmap(start, model)) |
3b028785b843
Various improvements in the .3d parser.
Matti Hamalainen <ccr@tnsp.org>
parents:
246
diff
changeset
|
329 return DMERR_INVALID_DATA; |
243 | 330 break; |
331 | |
241
3bff024a91be
Move 3D line/sprite renderer to separate module.
Matti Hamalainen <ccr@tnsp.org>
parents:
diff
changeset
|
332 case 'L': |
249
3b028785b843
Various improvements in the .3d parser.
Matti Hamalainen <ccr@tnsp.org>
parents:
246
diff
changeset
|
333 if (!dmReadLineSegments(start, model, FALSE, pos)) |
243 | 334 return DMERR_INVALID_DATA; |
335 break; | |
336 | |
337 case 'R': | |
249
3b028785b843
Various improvements in the .3d parser.
Matti Hamalainen <ccr@tnsp.org>
parents:
246
diff
changeset
|
338 if (!dmReadLineSegments(start, model, TRUE, pos)) |
241
3bff024a91be
Move 3D line/sprite renderer to separate module.
Matti Hamalainen <ccr@tnsp.org>
parents:
diff
changeset
|
339 return DMERR_INVALID_DATA; |
3bff024a91be
Move 3D line/sprite renderer to separate module.
Matti Hamalainen <ccr@tnsp.org>
parents:
diff
changeset
|
340 break; |
3bff024a91be
Move 3D line/sprite renderer to separate module.
Matti Hamalainen <ccr@tnsp.org>
parents:
diff
changeset
|
341 |
3bff024a91be
Move 3D line/sprite renderer to separate module.
Matti Hamalainen <ccr@tnsp.org>
parents:
diff
changeset
|
342 case 'S': |
249
3b028785b843
Various improvements in the .3d parser.
Matti Hamalainen <ccr@tnsp.org>
parents:
246
diff
changeset
|
343 if (!dmReadSprite(start, model, pos)) |
241
3bff024a91be
Move 3D line/sprite renderer to separate module.
Matti Hamalainen <ccr@tnsp.org>
parents:
diff
changeset
|
344 return DMERR_INVALID_DATA; |
3bff024a91be
Move 3D line/sprite renderer to separate module.
Matti Hamalainen <ccr@tnsp.org>
parents:
diff
changeset
|
345 break; |
3bff024a91be
Move 3D line/sprite renderer to separate module.
Matti Hamalainen <ccr@tnsp.org>
parents:
diff
changeset
|
346 |
3bff024a91be
Move 3D line/sprite renderer to separate module.
Matti Hamalainen <ccr@tnsp.org>
parents:
diff
changeset
|
347 default: |
3bff024a91be
Move 3D line/sprite renderer to separate module.
Matti Hamalainen <ccr@tnsp.org>
parents:
diff
changeset
|
348 break; |
3bff024a91be
Move 3D line/sprite renderer to separate module.
Matti Hamalainen <ccr@tnsp.org>
parents:
diff
changeset
|
349 } |
3bff024a91be
Move 3D line/sprite renderer to separate module.
Matti Hamalainen <ccr@tnsp.org>
parents:
diff
changeset
|
350 } |
245 | 351 return DMERR_OK; |
246 | 352 } |
241
3bff024a91be
Move 3D line/sprite renderer to separate module.
Matti Hamalainen <ccr@tnsp.org>
parents:
diff
changeset
|
353 |
245 | 354 |
249
3b028785b843
Various improvements in the .3d parser.
Matti Hamalainen <ccr@tnsp.org>
parents:
246
diff
changeset
|
355 int dmRead3DLineSpriteModel(DMResource *f, DM3DLineSpriteModel **model) |
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 DMVector pos; |
3b028785b843
Various improvements in the .3d parser.
Matti Hamalainen <ccr@tnsp.org>
parents:
246
diff
changeset
|
358 |
3b028785b843
Various improvements in the .3d parser.
Matti Hamalainen <ccr@tnsp.org>
parents:
246
diff
changeset
|
359 if ((*model = dmMalloc0(sizeof(DM3DLineSpriteModel))) == NULL) |
3b028785b843
Various improvements in the .3d parser.
Matti Hamalainen <ccr@tnsp.org>
parents:
246
diff
changeset
|
360 return DMERR_MALLOC; |
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 memset(&pos, 0, sizeof(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 return dmDoRead3DLineSpriteModel(f, *model, &pos); |
3b028785b843
Various improvements in the .3d parser.
Matti Hamalainen <ccr@tnsp.org>
parents:
246
diff
changeset
|
365 } |
3b028785b843
Various improvements in the .3d parser.
Matti Hamalainen <ccr@tnsp.org>
parents:
246
diff
changeset
|
366 |
3b028785b843
Various improvements in the .3d parser.
Matti Hamalainen <ccr@tnsp.org>
parents:
246
diff
changeset
|
367 |
245 | 368 void dmFree3DLineSpriteModel(DM3DLineSpriteModel *model) |
369 { | |
370 int i; | |
371 for (i = 0; i < model->nbitmaps; i++) | |
372 { | |
373 if (model->bitmaps[i].img != NULL) | |
374 SDL_FreeSurface(model->bitmaps[i].img); | |
375 } | |
376 | |
377 dmFree(model->bitmaps); | |
378 dmFree(model->vertices); | |
379 dmFree(model->lines); | |
380 dmFree(model->sprites); | |
381 dmFree(model); | |
241
3bff024a91be
Move 3D line/sprite renderer to separate module.
Matti Hamalainen <ccr@tnsp.org>
parents:
diff
changeset
|
382 } |