Mercurial > hg > demos > krapula
annotate krapula.c @ 15:e5c517ccc1e5
Joo.
author | Matti Hamalainen <ccr@tnsp.org> |
---|---|
date | Sat, 29 Sep 2012 08:25:18 +0300 |
parents | b2b506e1f42a |
children | 833dad075e3b |
rev | line source |
---|---|
2 | 1 #include "dmlib.h" |
2 #include "dmargs.h" | |
3 #include "dmvecmat.h" | |
4 #include "dmres.h" | |
5 #include "dmimage.h" | |
6 | |
7 #include "jss.h" | |
8 #include "jssmod.h" | |
9 #include "jssmix.h" | |
10 #include "jssplr.h" | |
11 | |
12 #include <math.h> | |
13 | |
14 #define DM_COLORS (256) | |
15 | |
16 | |
17 typedef struct | |
18 { | |
19 int x, y; | |
20 } DMCoords; | |
21 | |
22 | |
23 typedef struct | |
24 { | |
25 int x, y; | |
26 char *filename; | |
27 SDL_Surface *img; | |
28 } DMCredits; | |
29 | |
30 | |
31 typedef struct | |
32 { | |
33 int currFrame, endTime, startTime, totalFrameTime; | |
34 BOOL pauseFlag, exitFlag; | |
35 SDL_Surface *screen; | |
36 SDL_Event event; | |
37 } DMEngineData; | |
38 | |
39 | |
40 typedef struct | |
41 { | |
42 int currFrame, endTime, startTime; | |
43 } DMFrameData; | |
44 | |
45 | |
46 | |
47 | |
48 int optVFlags = SDL_SWSURFACE | SDL_HWPALETTE; | |
49 int optScrWidth = 640, optScrHeight = 480; | |
50 int optBenchmarkLen = 20; | |
51 | |
52 | |
53 DMOptArg optList[] = { | |
54 { 0, '?', "help", "Show this help", OPT_NONE }, | |
55 { 2, 'v', "verbose", "Be more verbose", OPT_NONE }, | |
56 { 3, 'f', "fs", "Fullscreen", OPT_NONE }, | |
57 // { 5, 's', "size", "Screen resolution -s 640x480", OPT_ARGREQ }, | |
58 }; | |
59 | |
60 const int optListN = sizeof(optList) / sizeof(optList[0]); | |
61 | |
62 | |
63 | |
64 void argShowHelp() | |
65 { | |
66 dmPrintBanner(stdout, dmProgName, "[options]"); | |
67 dmArgsPrintHelp(stdout, optList, optListN); | |
68 } | |
69 | |
70 | |
71 BOOL argHandleOpt(const int optN, char *optArg, char *currArg) | |
72 { | |
73 switch (optN) { | |
74 case 0: | |
75 argShowHelp(); | |
76 exit(0); | |
77 break; | |
78 | |
79 case 2: | |
80 dmVerbosity++; | |
81 break; | |
82 | |
83 case 3: | |
84 optVFlags |= SDL_FULLSCREEN; | |
85 break; | |
86 | |
87 case 5: | |
88 { | |
89 int w, h; | |
90 if (sscanf(optArg, "%dx%d", &w, &h) == 2) | |
91 { | |
92 if (w < 320 || h < 200 || w > 1024 || h > 768) | |
93 { | |
94 dmError("Invalid width or height: %d x %d\n", w, h); | |
95 return FALSE; | |
96 } | |
97 optScrWidth = w; | |
98 optScrHeight = h; | |
99 } | |
100 else | |
101 { | |
102 dmError("Invalid size argument '%s'.\n", optArg); | |
103 return FALSE; | |
104 } | |
105 } | |
106 break; | |
107 | |
108 default: | |
109 dmError("Unknown option '%s'.\n", currArg); | |
110 return FALSE; | |
111 } | |
112 | |
113 return TRUE; | |
114 } | |
115 | |
116 | |
117 void dmMakePalette(SDL_Surface *scr) | |
118 { | |
119 SDL_Color pal[DM_COLORS]; | |
120 int n; | |
121 | |
122 for (n = 0; n < 256; n++) | |
123 { | |
124 pal[n].r = n; | |
125 pal[n].g = n; | |
126 pal[n].b = n; | |
127 } | |
128 | |
129 SDL_SetColors(scr, pal, 0, DM_COLORS); | |
130 } | |
131 | |
132 | |
133 BOOL dmInitializeVideo(SDL_Surface **screen) | |
134 { | |
135 *screen = SDL_SetVideoMode(optScrWidth, optScrHeight, 32, optVFlags); // | SDL_RESIZABLE); | |
136 if (*screen == NULL) | |
137 { | |
138 dmError("Can't SDL_SetVideoMode(): %s\n", SDL_GetError()); | |
139 return FALSE; | |
140 } | |
141 | |
142 SDL_ShowCursor(SDL_DISABLE); | |
143 return TRUE; | |
144 } | |
145 | |
146 | |
147 void dmRandom(SDL_Surface *screen, int q) | |
148 { | |
149 Uint8 *pix = screen->pixels; | |
150 int xc, yc; | |
151 | |
152 for (yc = 0; yc < screen->h; yc++) | |
153 { | |
154 Uint8 *dp = pix; | |
155 | |
156 for (xc = 0; xc < screen->w; xc++) | |
157 *dp++ = yc + (xc ^ q) + (yc & q); | |
158 | |
159 pix += screen->pitch; | |
160 } | |
161 } | |
162 | |
163 | |
164 void dmPerlin(SDL_Surface *screen, float f) | |
165 { | |
166 Uint8 *pix = screen->pixels; | |
167 int xc, yc; | |
168 | |
169 for (yc = 0; yc < screen->h; yc++) | |
170 { | |
171 Uint8 *dp = pix; | |
172 | |
173 for (xc = 0; xc < screen->w; xc++) | |
174 { | |
175 *dp++ = 128 + dmPerlinNoise2D(xc, yc, 0.01, 0.1, 3) / 34.0; | |
176 } | |
177 | |
178 pix += screen->pitch; | |
179 } | |
180 } | |
181 | |
182 | |
183 #define QWIDTH 256 | |
184 #define QHEIGHT 160 | |
185 | |
186 typedef Uint8 DMBlockMap[QHEIGHT][QWIDTH]; | |
187 | |
188 | |
189 static DMFloat dmClip(DMFloat a) | |
190 { | |
191 return (a < 0.0f ? 0.0f : (a > 1.0f ? 1.0f : a)); | |
192 } | |
193 | |
194 | |
195 void dmMakeBumpMap(DMBlockMap map, DMFloat q, DMFloat m) | |
196 { | |
197 int x, y; | |
198 for (y = 0; y < QHEIGHT; y++) | |
199 for (x = 0; x < QWIDTH; x++) | |
200 { | |
201 DMFloat f = 0.40f + dmPerlinNoise2D(x, y, 1.1f, q, 2); | |
202 map[y][x] = (int) (dmClip(f) * m); | |
203 } | |
204 } | |
205 | |
206 | |
207 void dmShadowTraceHeightMap(DMBlockMap lightMap, DMBlockMap pheightMap, DMVector *light) | |
208 { | |
209 int i, j; | |
210 | |
211 for (j = 0; j < QHEIGHT; j++) | |
212 for (i = 0; i < QWIDTH; i++) | |
213 { | |
214 DMVector vr, vl, va; | |
215 DMFloat vrayLen, vfactor; | |
216 int vlen; | |
217 BOOL wasHit; | |
218 | |
219 /* Perform shadow occlusion via simplistic raytracing */ | |
220 vr.x = i; | |
221 vr.y = j; | |
222 vr.z = light->z; // - 10.0; | |
223 // vr.z = pheightMap[j][i]; | |
224 | |
225 /* Calculate light vector vector */ | |
226 dm_vector_sub_r(&vl, &vr, light); | |
227 vrayLen = dm_vector_length(&vl); | |
228 | |
229 #if 1 | |
230 dm_vector_copy(&va, &vl); | |
231 dm_vector_normalize(&va); | |
232 dm_vector_scale(&va, 0.6f); | |
233 dm_vector_copy(&vr, light); | |
234 | |
235 vlen = 0; | |
236 wasHit = FALSE; | |
237 do | |
238 { | |
239 float h; | |
240 | |
241 /* If ray is inside the heightmap, get value */ | |
242 if (vr.x >= 0 && vr.y >= 0 && vr.x < QWIDTH && vr.y < QHEIGHT) | |
243 h = pheightMap[(int) vr.y][(int) vr.x]; | |
244 else | |
245 break; | |
246 | |
247 /* Check for hits */ | |
248 if (h > vr.z) | |
249 wasHit = TRUE; | |
250 else | |
251 { | |
252 /* Move forwards */ | |
253 dm_vector_add(&vr, &va); | |
254 vlen++; | |
255 } | |
256 } | |
257 while (!wasHit && vlen <= vrayLen); | |
258 | |
259 /* Check if the ray hit something, e.g. is this point occluded? */ | |
260 if (wasHit && vlen < vrayLen) | |
261 { | |
262 vfactor = vlen * 0.01; | |
263 } | |
264 else | |
265 vfactor = vlen * 0.02; | |
266 #endif | |
267 | |
268 #if 1 | |
269 { | |
270 /* Calculate light's intensity based on the angle it "hits" | |
271 * | |
272 * 1) Calculate the vectors that form the imaginary "plane" | |
273 * 2) Cross-product -> normal vector of the plane | |
274 * 2) Normalize the normal vector | |
275 * 3) Calculate light vector's hit angle by dot product | |
276 */ | |
277 DMVector v1, v2; | |
278 DMFloat c; | |
279 | |
280 v1.x = 2.0f; | |
281 v1.y = 0.0f; | |
282 v1.z = (DMFloat) (pheightMap[j][i] - pheightMap[j][i + 1]); | |
283 | |
284 v2.x = 0.0f; | |
285 v2.y = 2.0f; | |
286 v2.z = (DMFloat) (pheightMap[j][i] - pheightMap[j + 1][i]); | |
287 | |
288 dm_vector_cross(&vr, &v1, &v2); | |
289 dm_vector_normalize(&vr); | |
290 dm_vector_normalize(&vl); | |
291 c = dm_vector_dot(&vl, &vr); | |
292 | |
293 vrayLen = 255 - (vrayLen * 0.1) * vrayLen + (c * 128.0f) + (vfactor * vfactor * 1255); | |
294 } | |
295 #else | |
296 vrayLen = 255 - vrayLen * vrayLen * (vfactor * vfactor); | |
297 if (vrayLen < 0) vrayLen = 0; | |
298 vrayLen += pheightMap[j][i]; | |
299 #endif | |
300 | |
301 /* Clip result */ | |
302 if (vrayLen < 0) | |
303 vrayLen = 0; | |
304 else if (vrayLen > 255.0f) | |
305 vrayLen = 255.0f; | |
306 | |
307 lightMap[j][i] = vrayLen; | |
308 } | |
309 } | |
310 | |
311 | |
312 void dmShadowTraceHeightMap2(DMBlockMap lightMap, DMBlockMap pheightMap, DMVector *light) | |
313 { | |
314 int i, j; | |
315 | |
316 light->z = 150; | |
317 | |
318 for (j = 0; j < QHEIGHT; j++) | |
319 for (i = 0; i < QWIDTH; i++) | |
320 { | |
321 DMVector vr, vl, va; | |
322 DMFloat vrayLen, vfactor; | |
323 int vlen; | |
324 BOOL wasHit; | |
325 | |
326 /* Perform shadow occlusion via simplistic raytracing */ | |
327 vr.x = i; | |
328 vr.y = j; | |
329 vr.z = 200; //light->z; // - 10.0; | |
330 | |
331 /* Calculate light vector vector */ | |
332 dm_vector_sub_r(&vl, &vr, light); | |
333 vrayLen = dm_vector_length(&vl); | |
334 | |
335 #if 1 | |
336 dm_vector_copy(&va, &vl); | |
337 dm_vector_normalize(&va); | |
338 dm_vector_copy(&vr, light); | |
339 | |
340 vlen = 0; | |
341 wasHit = FALSE; | |
342 do | |
343 { | |
344 float h; | |
345 | |
346 /* If ray is inside the heightmap, get value */ | |
347 if (vr.x >= 0 && vr.y >= 0 && vr.x < QWIDTH && vr.y < QHEIGHT) | |
348 h = pheightMap[(int) vr.y][(int) vr.x]; | |
349 else | |
350 break; | |
351 | |
352 /* Check for hits */ | |
353 if (h > vr.z) | |
354 wasHit = TRUE; | |
355 else | |
356 { | |
357 /* Move forwards */ | |
358 dm_vector_add(&vr, &va); | |
359 vlen++; | |
360 } | |
361 } | |
362 while (!wasHit && vlen <= vrayLen); | |
363 | |
364 /* Check if the ray hit something, e.g. is this point occluded? */ | |
365 if (wasHit && vlen < vrayLen) | |
366 { | |
367 vfactor = vlen * 0.05; | |
368 } | |
369 else | |
370 vfactor = vlen * 0.001; | |
371 #endif | |
372 | |
373 #if 0 | |
374 { | |
375 /* Calculate light's intensity based on the angle it "hits" | |
376 * | |
377 * 1) Calculate the vectors that form the imaginary "plane" | |
378 * 2) Cross-product -> normal vector of the plane | |
379 * 2) Normalize the normal vector | |
380 * 3) Calculate light vector's hit angle by dot product | |
381 */ | |
382 DMVector v1, v2; | |
383 DMFloat c; | |
384 | |
385 v1.x = 2.0f; | |
386 v1.y = 0.0f; | |
387 v1.z = (DMFloat) (pheightMap[j][i] - pheightMap[j][i + 1]); | |
388 | |
389 v2.x = 0.0f; | |
390 v2.y = 2.0f; | |
391 v2.z = (DMFloat) (pheightMap[j][i] - pheightMap[j + 1][i]); | |
392 | |
393 dm_vector_cross(&vr, &v1, &v2); | |
394 dm_vector_normalize(&vr); | |
395 dm_vector_normalize(&vl); | |
396 c = dm_vector_dot(&vl, &vr); | |
397 | |
398 vrayLen = 255 - (vrayLen * 0.1) * vrayLen + (c * 128.0f) + (vfactor * vfactor * 1255); | |
399 } | |
400 #else | |
401 vrayLen = 255 - vrayLen * vrayLen * (vfactor * vfactor); | |
402 if (vrayLen < 0) vrayLen = 0; | |
403 vrayLen -= pheightMap[j][i]; | |
404 #endif | |
405 | |
406 /* Clip result */ | |
407 if (vrayLen < 0) | |
408 vrayLen = 0; | |
409 else if (vrayLen > 255.0f) | |
410 vrayLen = 255.0f; | |
411 | |
412 lightMap[j][i] = vrayLen; | |
413 } | |
414 } | |
415 | |
416 | |
8
b3d6670c4324
Use new resource management system.
Matti Hamalainen <ccr@tnsp.org>
parents:
7
diff
changeset
|
417 void engineAudioCallback(void *userdata, Uint8 *stream, int len) |
2 | 418 { |
419 JSSMixer *d = (JSSMixer *) userdata; | |
420 | |
421 if (d != NULL) | |
422 { | |
423 jvmRenderAudio(d, stream, len / jvmGetSampleSize(d)); | |
424 } | |
425 } | |
426 | |
427 #define DEBUG 0 | |
428 | |
429 #define CREDITS_SPEED 1000 | |
430 #define CREDITS_RAND 4 | |
431 | |
432 #define NOSFE_MIN 1 | |
433 #define NOSFE_MAX 269 | |
434 | |
435 static const DMCoords randomCoords[] = | |
436 { | |
437 { -300, -430 }, | |
438 { 700, -550 }, | |
439 { -200, 600 }, | |
440 { 700, 600 } | |
441 }; | |
442 const int nrandomCoords = sizeof(randomCoords) / sizeof(randomCoords[0]); | |
443 | |
444 | |
445 static DMCredits credits[] = | |
446 { | |
447 { 91, 223, "g4014.png", NULL }, | |
448 { 151, 250, "g4026.png", NULL }, | |
449 { 217, 227, "g4020.png", NULL }, | |
450 { 173, 268, "g4032.png", NULL }, | |
451 { 115, 359, "g4038.png", NULL }, | |
452 | |
453 { 437, 130, "g4062.png", NULL }, | |
454 { 457, 102, "g4068.png", NULL }, | |
455 { 450, 210, "g4056.png", NULL }, | |
456 | |
457 { 420, 320, "g4044.png", NULL }, | |
458 { 486, 381, "g4050.png", NULL }, | |
459 }; | |
460 | |
461 const int ncredits = sizeof(credits) / sizeof(credits[0]); | |
462 | |
463 | |
8
b3d6670c4324
Use new resource management system.
Matti Hamalainen <ccr@tnsp.org>
parents:
7
diff
changeset
|
464 |
b3d6670c4324
Use new resource management system.
Matti Hamalainen <ccr@tnsp.org>
parents:
7
diff
changeset
|
465 |
2 | 466 DMEngineData engine; |
467 DMFrameData frame; | |
468 | |
469 int engineGetTick() | |
470 { | |
471 return (frame.startTime - engine.startTime) + DEBUG * 1000; | |
472 } | |
473 | |
474 float engineGetTimeDT() | |
475 { | |
476 return (float) engineGetTick() / 1000.0f; | |
477 } | |
478 | |
479 | |
480 int engineGetTimeDTi() | |
481 { | |
482 return (float) engineGetTick() / 1000; | |
483 } | |
484 | |
485 | |
486 int engineGetTime(int t) | |
487 { | |
488 return engineGetTick() - (1000 * t);; | |
489 } | |
490 | |
491 | |
492 int engineGetDT(int t) | |
493 { | |
494 return engineGetTime(t) / 1000; | |
495 } | |
496 | |
497 | |
498 int dmScaledBlitSurface32to32TransparentX(SDL_Surface *src, const int x0, const int y0, const int dwidth, const int dheight, SDL_Surface *dst); | |
499 | |
500 | |
8
b3d6670c4324
Use new resource management system.
Matti Hamalainen <ccr@tnsp.org>
parents:
7
diff
changeset
|
501 int engineResImageLoad(DMResource *res) |
b3d6670c4324
Use new resource management system.
Matti Hamalainen <ccr@tnsp.org>
parents:
7
diff
changeset
|
502 { |
b3d6670c4324
Use new resource management system.
Matti Hamalainen <ccr@tnsp.org>
parents:
7
diff
changeset
|
503 SDL_Surface *img = dmLoadImage(res); |
b3d6670c4324
Use new resource management system.
Matti Hamalainen <ccr@tnsp.org>
parents:
7
diff
changeset
|
504 if (res != NULL) |
b3d6670c4324
Use new resource management system.
Matti Hamalainen <ccr@tnsp.org>
parents:
7
diff
changeset
|
505 { |
b3d6670c4324
Use new resource management system.
Matti Hamalainen <ccr@tnsp.org>
parents:
7
diff
changeset
|
506 res->rdata = img; |
b3d6670c4324
Use new resource management system.
Matti Hamalainen <ccr@tnsp.org>
parents:
7
diff
changeset
|
507 return DMERR_OK; |
b3d6670c4324
Use new resource management system.
Matti Hamalainen <ccr@tnsp.org>
parents:
7
diff
changeset
|
508 } |
b3d6670c4324
Use new resource management system.
Matti Hamalainen <ccr@tnsp.org>
parents:
7
diff
changeset
|
509 else |
b3d6670c4324
Use new resource management system.
Matti Hamalainen <ccr@tnsp.org>
parents:
7
diff
changeset
|
510 return dmferror(res); |
b3d6670c4324
Use new resource management system.
Matti Hamalainen <ccr@tnsp.org>
parents:
7
diff
changeset
|
511 } |
b3d6670c4324
Use new resource management system.
Matti Hamalainen <ccr@tnsp.org>
parents:
7
diff
changeset
|
512 |
b3d6670c4324
Use new resource management system.
Matti Hamalainen <ccr@tnsp.org>
parents:
7
diff
changeset
|
513 void engineResImageFree(DMResource *res) |
b3d6670c4324
Use new resource management system.
Matti Hamalainen <ccr@tnsp.org>
parents:
7
diff
changeset
|
514 { |
b3d6670c4324
Use new resource management system.
Matti Hamalainen <ccr@tnsp.org>
parents:
7
diff
changeset
|
515 SDL_FreeSurface((SDL_Surface *)res->rdata); |
b3d6670c4324
Use new resource management system.
Matti Hamalainen <ccr@tnsp.org>
parents:
7
diff
changeset
|
516 } |
b3d6670c4324
Use new resource management system.
Matti Hamalainen <ccr@tnsp.org>
parents:
7
diff
changeset
|
517 |
b3d6670c4324
Use new resource management system.
Matti Hamalainen <ccr@tnsp.org>
parents:
7
diff
changeset
|
518 int engineResModuleLoad(DMResource *res) |
b3d6670c4324
Use new resource management system.
Matti Hamalainen <ccr@tnsp.org>
parents:
7
diff
changeset
|
519 { |
b3d6670c4324
Use new resource management system.
Matti Hamalainen <ccr@tnsp.org>
parents:
7
diff
changeset
|
520 return jssLoadXM(res, (JSSModule **) &(res->rdata)); |
b3d6670c4324
Use new resource management system.
Matti Hamalainen <ccr@tnsp.org>
parents:
7
diff
changeset
|
521 } |
b3d6670c4324
Use new resource management system.
Matti Hamalainen <ccr@tnsp.org>
parents:
7
diff
changeset
|
522 |
b3d6670c4324
Use new resource management system.
Matti Hamalainen <ccr@tnsp.org>
parents:
7
diff
changeset
|
523 void engineResModuleFree(DMResource *res) |
b3d6670c4324
Use new resource management system.
Matti Hamalainen <ccr@tnsp.org>
parents:
7
diff
changeset
|
524 { |
b3d6670c4324
Use new resource management system.
Matti Hamalainen <ccr@tnsp.org>
parents:
7
diff
changeset
|
525 jssFreeModule((JSSModule *) res->rdata); |
b3d6670c4324
Use new resource management system.
Matti Hamalainen <ccr@tnsp.org>
parents:
7
diff
changeset
|
526 } |
b3d6670c4324
Use new resource management system.
Matti Hamalainen <ccr@tnsp.org>
parents:
7
diff
changeset
|
527 |
b3d6670c4324
Use new resource management system.
Matti Hamalainen <ccr@tnsp.org>
parents:
7
diff
changeset
|
528 |
b3d6670c4324
Use new resource management system.
Matti Hamalainen <ccr@tnsp.org>
parents:
7
diff
changeset
|
529 static DMResourceDataOps engineResImage = |
b3d6670c4324
Use new resource management system.
Matti Hamalainen <ccr@tnsp.org>
parents:
7
diff
changeset
|
530 { |
b3d6670c4324
Use new resource management system.
Matti Hamalainen <ccr@tnsp.org>
parents:
7
diff
changeset
|
531 engineResImageLoad, |
b3d6670c4324
Use new resource management system.
Matti Hamalainen <ccr@tnsp.org>
parents:
7
diff
changeset
|
532 engineResImageFree |
b3d6670c4324
Use new resource management system.
Matti Hamalainen <ccr@tnsp.org>
parents:
7
diff
changeset
|
533 }; |
b3d6670c4324
Use new resource management system.
Matti Hamalainen <ccr@tnsp.org>
parents:
7
diff
changeset
|
534 |
b3d6670c4324
Use new resource management system.
Matti Hamalainen <ccr@tnsp.org>
parents:
7
diff
changeset
|
535 static DMResourceDataOps engineResModule = |
b3d6670c4324
Use new resource management system.
Matti Hamalainen <ccr@tnsp.org>
parents:
7
diff
changeset
|
536 { |
b3d6670c4324
Use new resource management system.
Matti Hamalainen <ccr@tnsp.org>
parents:
7
diff
changeset
|
537 engineResModuleLoad, |
b3d6670c4324
Use new resource management system.
Matti Hamalainen <ccr@tnsp.org>
parents:
7
diff
changeset
|
538 engineResModuleFree |
b3d6670c4324
Use new resource management system.
Matti Hamalainen <ccr@tnsp.org>
parents:
7
diff
changeset
|
539 }; |
b3d6670c4324
Use new resource management system.
Matti Hamalainen <ccr@tnsp.org>
parents:
7
diff
changeset
|
540 |
b3d6670c4324
Use new resource management system.
Matti Hamalainen <ccr@tnsp.org>
parents:
7
diff
changeset
|
541 |
b3d6670c4324
Use new resource management system.
Matti Hamalainen <ccr@tnsp.org>
parents:
7
diff
changeset
|
542 int engineClassifier(DMResource *res) |
b3d6670c4324
Use new resource management system.
Matti Hamalainen <ccr@tnsp.org>
parents:
7
diff
changeset
|
543 { |
b3d6670c4324
Use new resource management system.
Matti Hamalainen <ccr@tnsp.org>
parents:
7
diff
changeset
|
544 DMResourceDataOps *rops = NULL; |
b3d6670c4324
Use new resource management system.
Matti Hamalainen <ccr@tnsp.org>
parents:
7
diff
changeset
|
545 char *fext; |
b3d6670c4324
Use new resource management system.
Matti Hamalainen <ccr@tnsp.org>
parents:
7
diff
changeset
|
546 |
b3d6670c4324
Use new resource management system.
Matti Hamalainen <ccr@tnsp.org>
parents:
7
diff
changeset
|
547 if (res == NULL) |
b3d6670c4324
Use new resource management system.
Matti Hamalainen <ccr@tnsp.org>
parents:
7
diff
changeset
|
548 return DMERR_NULLPTR; |
b3d6670c4324
Use new resource management system.
Matti Hamalainen <ccr@tnsp.org>
parents:
7
diff
changeset
|
549 |
b3d6670c4324
Use new resource management system.
Matti Hamalainen <ccr@tnsp.org>
parents:
7
diff
changeset
|
550 if ((fext = strrchr(res->filename, '.')) != NULL) |
b3d6670c4324
Use new resource management system.
Matti Hamalainen <ccr@tnsp.org>
parents:
7
diff
changeset
|
551 { |
b3d6670c4324
Use new resource management system.
Matti Hamalainen <ccr@tnsp.org>
parents:
7
diff
changeset
|
552 if (strcasecmp(fext, ".png") == 0 || strcasecmp(fext, ".jpg") == 0) |
b3d6670c4324
Use new resource management system.
Matti Hamalainen <ccr@tnsp.org>
parents:
7
diff
changeset
|
553 rops = &engineResImage; |
b3d6670c4324
Use new resource management system.
Matti Hamalainen <ccr@tnsp.org>
parents:
7
diff
changeset
|
554 else |
b3d6670c4324
Use new resource management system.
Matti Hamalainen <ccr@tnsp.org>
parents:
7
diff
changeset
|
555 if (strcasecmp(fext, ".xm") == 0 || strcasecmp(fext, ".jmod") == 0) |
b3d6670c4324
Use new resource management system.
Matti Hamalainen <ccr@tnsp.org>
parents:
7
diff
changeset
|
556 rops = &engineResModule; |
b3d6670c4324
Use new resource management system.
Matti Hamalainen <ccr@tnsp.org>
parents:
7
diff
changeset
|
557 } |
b3d6670c4324
Use new resource management system.
Matti Hamalainen <ccr@tnsp.org>
parents:
7
diff
changeset
|
558 |
b3d6670c4324
Use new resource management system.
Matti Hamalainen <ccr@tnsp.org>
parents:
7
diff
changeset
|
559 res->rops = rops; |
b3d6670c4324
Use new resource management system.
Matti Hamalainen <ccr@tnsp.org>
parents:
7
diff
changeset
|
560 |
b3d6670c4324
Use new resource management system.
Matti Hamalainen <ccr@tnsp.org>
parents:
7
diff
changeset
|
561 return DMERR_OK; |
b3d6670c4324
Use new resource management system.
Matti Hamalainen <ccr@tnsp.org>
parents:
7
diff
changeset
|
562 } |
b3d6670c4324
Use new resource management system.
Matti Hamalainen <ccr@tnsp.org>
parents:
7
diff
changeset
|
563 |
b3d6670c4324
Use new resource management system.
Matti Hamalainen <ccr@tnsp.org>
parents:
7
diff
changeset
|
564 |
b3d6670c4324
Use new resource management system.
Matti Hamalainen <ccr@tnsp.org>
parents:
7
diff
changeset
|
565 void *engineGetResource(const char *name) |
b3d6670c4324
Use new resource management system.
Matti Hamalainen <ccr@tnsp.org>
parents:
7
diff
changeset
|
566 { |
b3d6670c4324
Use new resource management system.
Matti Hamalainen <ccr@tnsp.org>
parents:
7
diff
changeset
|
567 DMResource *res = dmres_find(name); |
b3d6670c4324
Use new resource management system.
Matti Hamalainen <ccr@tnsp.org>
parents:
7
diff
changeset
|
568 if (res != NULL && res->rdata != NULL) |
b3d6670c4324
Use new resource management system.
Matti Hamalainen <ccr@tnsp.org>
parents:
7
diff
changeset
|
569 return res->rdata; |
b3d6670c4324
Use new resource management system.
Matti Hamalainen <ccr@tnsp.org>
parents:
7
diff
changeset
|
570 else |
b3d6670c4324
Use new resource management system.
Matti Hamalainen <ccr@tnsp.org>
parents:
7
diff
changeset
|
571 { |
b3d6670c4324
Use new resource management system.
Matti Hamalainen <ccr@tnsp.org>
parents:
7
diff
changeset
|
572 dmError("Could not find resource '%s'.\n", name); |
b3d6670c4324
Use new resource management system.
Matti Hamalainen <ccr@tnsp.org>
parents:
7
diff
changeset
|
573 return NULL; |
b3d6670c4324
Use new resource management system.
Matti Hamalainen <ccr@tnsp.org>
parents:
7
diff
changeset
|
574 } |
b3d6670c4324
Use new resource management system.
Matti Hamalainen <ccr@tnsp.org>
parents:
7
diff
changeset
|
575 } |
b3d6670c4324
Use new resource management system.
Matti Hamalainen <ccr@tnsp.org>
parents:
7
diff
changeset
|
576 |
b3d6670c4324
Use new resource management system.
Matti Hamalainen <ccr@tnsp.org>
parents:
7
diff
changeset
|
577 |
b3d6670c4324
Use new resource management system.
Matti Hamalainen <ccr@tnsp.org>
parents:
7
diff
changeset
|
578 #define engineGetResImage(name) (SDL_Surface *) engineGetResource(name) |
b3d6670c4324
Use new resource management system.
Matti Hamalainen <ccr@tnsp.org>
parents:
7
diff
changeset
|
579 #define engineGetResModule(name) (JSSModule *) engineGetResource(name) |
b3d6670c4324
Use new resource management system.
Matti Hamalainen <ccr@tnsp.org>
parents:
7
diff
changeset
|
580 |
2 | 581 |
582 int main(int argc, char *argv[]) | |
583 { | |
584 BOOL initSDL = FALSE; | |
585 JSSModule *mod = NULL; | |
586 JSSMixer *dev = NULL; | |
587 JSSPlayer *plr = NULL; | |
8
b3d6670c4324
Use new resource management system.
Matti Hamalainen <ccr@tnsp.org>
parents:
7
diff
changeset
|
588 int err, i, loaded, total; |
2 | 589 SDL_AudioSpec *a_desired = NULL, *a_obtained = NULL; |
590 | |
591 memset(&frame, 0, sizeof(frame)); | |
592 memset(&engine, 0, sizeof(engine)); | |
593 | |
594 dmInitProg("krapula", "Lauantai Aamun Krapula", "0.2", "(c) 2012 Anciat Prodz & TNSP", "PENIS."); | |
595 if (!dmArgsProcess(argc, argv, optList, optListN, | |
596 argHandleOpt, NULL, FALSE)) | |
597 exit(1); | |
598 | |
599 dmPrint(0, "%s\n", dmProgDesc); | |
600 dmPrint(0, "%s\n", dmProgAuthor); | |
601 dmPrint(0, "TNSP PIERUPASKA engine 2012 'passeli professional' loading.\n"); | |
602 | |
603 // Open packfs | |
8
b3d6670c4324
Use new resource management system.
Matti Hamalainen <ccr@tnsp.org>
parents:
7
diff
changeset
|
604 if ((err = dmres_init("orvellys.dat", NULL, DRF_USE_PACK | DRF_PRELOAD_RES, engineClassifier)) != DMERR_OK) |
2 | 605 { |
8
b3d6670c4324
Use new resource management system.
Matti Hamalainen <ccr@tnsp.org>
parents:
7
diff
changeset
|
606 dmError("Could not initialize resource manager: %d, %s.\n", err, dmErrorStr(err)); |
2 | 607 goto error_exit; |
608 } | |
609 | |
610 jssInit(); | |
611 | |
612 // Initialize SDL components | |
613 if (SDL_Init(SDL_INIT_VIDEO | SDL_INIT_AUDIO | SDL_INIT_TIMER) != 0) | |
614 { | |
615 dmError("Could not initialize SDL: %s\n", SDL_GetError()); | |
616 goto error_exit; | |
617 } | |
618 initSDL = TRUE; | |
619 | |
620 | |
621 // Audio kyrvet | |
622 a_desired = dmMalloc(sizeof(SDL_AudioSpec)); | |
623 a_obtained = dmMalloc(sizeof(SDL_AudioSpec)); | |
624 if (!a_desired || !a_obtained) | |
625 { | |
626 fprintf(stderr, "Could not allocate SDL shit\n"); | |
627 return 3; | |
628 } | |
629 | |
8
b3d6670c4324
Use new resource management system.
Matti Hamalainen <ccr@tnsp.org>
parents:
7
diff
changeset
|
630 a_desired->freq = 44100; |
2 | 631 a_desired->format = AUDIO_S16SYS; |
632 a_desired->channels = 2; | |
633 | |
634 dmMsg(0, "Initializing miniJSS mixer with: %d, %d, %d\n", | |
635 JSS_AUDIO_S16, a_desired->channels, a_desired->freq); | |
636 | |
637 dev = jvmInit(JSS_AUDIO_S16, a_desired->channels, a_desired->freq, JMIX_AUTO); | |
638 if (!dev) | |
639 { | |
640 dmError("jvmInit() returned NULL, voi perkele.\n"); | |
641 goto error_exit; | |
642 } | |
643 | |
644 a_desired->samples = 16*1024; | |
8
b3d6670c4324
Use new resource management system.
Matti Hamalainen <ccr@tnsp.org>
parents:
7
diff
changeset
|
645 a_desired->callback = engineAudioCallback; |
2 | 646 a_desired->userdata = (void *) dev; |
647 | |
648 /* Open the audio device */ | |
649 dmMsg(0, "Trying to init SDL audio with: %d, %d, %d\n", | |
650 a_desired->format, a_desired->channels, a_desired->freq); | |
651 | |
652 if (SDL_OpenAudio(a_desired, a_obtained) < 0) | |
653 { | |
654 dmError("Couldn't open audio: %s\n", SDL_GetError()); | |
655 goto error_exit; | |
656 } | |
657 | |
658 dmMsg(0, "SDL gave us: %d, %d, %d\n", | |
659 a_obtained->format, a_obtained->channels, a_obtained->freq); | |
660 | |
661 if ((a_obtained->format != a_desired->format) || | |
662 (a_obtained->channels != a_desired->channels) || | |
663 (a_obtained->freq != a_desired->freq)) | |
664 { | |
665 dmError("Could not get wanted audio parameters from SDL!\n"); | |
666 goto error_exit; | |
667 } | |
668 | |
669 dmFree(a_desired); | |
670 | |
671 plr = jmpInit(dev); | |
672 if (!plr) | |
673 { | |
674 dmError("jmpInit() returned NULL\n"); | |
675 goto error_exit; | |
676 } | |
677 | |
8
b3d6670c4324
Use new resource management system.
Matti Hamalainen <ccr@tnsp.org>
parents:
7
diff
changeset
|
678 |
2 | 679 // Joo |
680 if (!dmInitializeVideo(&engine.screen)) | |
681 goto error_exit; | |
682 | |
683 SDL_WM_SetCaption(dmProgDesc, dmProgName); | |
684 | |
8
b3d6670c4324
Use new resource management system.
Matti Hamalainen <ccr@tnsp.org>
parents:
7
diff
changeset
|
685 |
b3d6670c4324
Use new resource management system.
Matti Hamalainen <ccr@tnsp.org>
parents:
7
diff
changeset
|
686 // Load resources |
b3d6670c4324
Use new resource management system.
Matti Hamalainen <ccr@tnsp.org>
parents:
7
diff
changeset
|
687 err = dmres_preload(TRUE, &loaded, &total); |
b3d6670c4324
Use new resource management system.
Matti Hamalainen <ccr@tnsp.org>
parents:
7
diff
changeset
|
688 while ((err = dmres_preload(FALSE, &loaded, &total)) == DMERR_PROGRESS) |
b3d6670c4324
Use new resource management system.
Matti Hamalainen <ccr@tnsp.org>
parents:
7
diff
changeset
|
689 { |
9
ca2daec08204
Improve loading progress bar.
Matti Hamalainen <ccr@tnsp.org>
parents:
8
diff
changeset
|
690 // Show a nice progress bar while loading |
8
b3d6670c4324
Use new resource management system.
Matti Hamalainen <ccr@tnsp.org>
parents:
7
diff
changeset
|
691 if (total > 0 && (loaded % 2) == 0) |
b3d6670c4324
Use new resource management system.
Matti Hamalainen <ccr@tnsp.org>
parents:
7
diff
changeset
|
692 { |
9
ca2daec08204
Improve loading progress bar.
Matti Hamalainen <ccr@tnsp.org>
parents:
8
diff
changeset
|
693 int dx = 60, |
ca2daec08204
Improve loading progress bar.
Matti Hamalainen <ccr@tnsp.org>
parents:
8
diff
changeset
|
694 dh = 20, |
ca2daec08204
Improve loading progress bar.
Matti Hamalainen <ccr@tnsp.org>
parents:
8
diff
changeset
|
695 dw = engine.screen->w - (2 * dx), |
ca2daec08204
Improve loading progress bar.
Matti Hamalainen <ccr@tnsp.org>
parents:
8
diff
changeset
|
696 dy = (engine.screen->h - dh) / 2; |
ca2daec08204
Improve loading progress bar.
Matti Hamalainen <ccr@tnsp.org>
parents:
8
diff
changeset
|
697 |
8
b3d6670c4324
Use new resource management system.
Matti Hamalainen <ccr@tnsp.org>
parents:
7
diff
changeset
|
698 if (SDL_MUSTLOCK(engine.screen) != 0 && SDL_LockSurface(engine.screen) != 0) |
b3d6670c4324
Use new resource management system.
Matti Hamalainen <ccr@tnsp.org>
parents:
7
diff
changeset
|
699 { |
b3d6670c4324
Use new resource management system.
Matti Hamalainen <ccr@tnsp.org>
parents:
7
diff
changeset
|
700 dmError("Can't lock surface.\n"); |
b3d6670c4324
Use new resource management system.
Matti Hamalainen <ccr@tnsp.org>
parents:
7
diff
changeset
|
701 goto error_exit; |
b3d6670c4324
Use new resource management system.
Matti Hamalainen <ccr@tnsp.org>
parents:
7
diff
changeset
|
702 } |
b3d6670c4324
Use new resource management system.
Matti Hamalainen <ccr@tnsp.org>
parents:
7
diff
changeset
|
703 |
9
ca2daec08204
Improve loading progress bar.
Matti Hamalainen <ccr@tnsp.org>
parents:
8
diff
changeset
|
704 // Draw the progress bar |
8
b3d6670c4324
Use new resource management system.
Matti Hamalainen <ccr@tnsp.org>
parents:
7
diff
changeset
|
705 dmClearSurface(engine.screen, dmMapRGBA(engine.screen, 0,0,0,0)); |
9
ca2daec08204
Improve loading progress bar.
Matti Hamalainen <ccr@tnsp.org>
parents:
8
diff
changeset
|
706 dmFillRect(engine.screen, dx, dy, dx+dw, dy+dh, dmMapRGB(engine.screen, 255,255,255)); |
ca2daec08204
Improve loading progress bar.
Matti Hamalainen <ccr@tnsp.org>
parents:
8
diff
changeset
|
707 dmFillRect(engine.screen, dx+1, dy+1, dx+dw-1, dy+dh-1, dmMapRGB(engine.screen, 0,0,0)); |
8
b3d6670c4324
Use new resource management system.
Matti Hamalainen <ccr@tnsp.org>
parents:
7
diff
changeset
|
708 |
b3d6670c4324
Use new resource management system.
Matti Hamalainen <ccr@tnsp.org>
parents:
7
diff
changeset
|
709 if (total > 0) |
b3d6670c4324
Use new resource management system.
Matti Hamalainen <ccr@tnsp.org>
parents:
7
diff
changeset
|
710 { |
9
ca2daec08204
Improve loading progress bar.
Matti Hamalainen <ccr@tnsp.org>
parents:
8
diff
changeset
|
711 dmFillRect(engine.screen, |
ca2daec08204
Improve loading progress bar.
Matti Hamalainen <ccr@tnsp.org>
parents:
8
diff
changeset
|
712 dx+3, dy+3, |
ca2daec08204
Improve loading progress bar.
Matti Hamalainen <ccr@tnsp.org>
parents:
8
diff
changeset
|
713 dx + 3 + ((dw - 3) * loaded) / total, |
ca2daec08204
Improve loading progress bar.
Matti Hamalainen <ccr@tnsp.org>
parents:
8
diff
changeset
|
714 dy + dh - 3, |
ca2daec08204
Improve loading progress bar.
Matti Hamalainen <ccr@tnsp.org>
parents:
8
diff
changeset
|
715 dmMapRGB(engine.screen, 200,200,200)); |
8
b3d6670c4324
Use new resource management system.
Matti Hamalainen <ccr@tnsp.org>
parents:
7
diff
changeset
|
716 } |
b3d6670c4324
Use new resource management system.
Matti Hamalainen <ccr@tnsp.org>
parents:
7
diff
changeset
|
717 |
b3d6670c4324
Use new resource management system.
Matti Hamalainen <ccr@tnsp.org>
parents:
7
diff
changeset
|
718 // Flip screen |
b3d6670c4324
Use new resource management system.
Matti Hamalainen <ccr@tnsp.org>
parents:
7
diff
changeset
|
719 if (SDL_MUSTLOCK(engine.screen) != 0) |
b3d6670c4324
Use new resource management system.
Matti Hamalainen <ccr@tnsp.org>
parents:
7
diff
changeset
|
720 SDL_UnlockSurface(engine.screen); |
b3d6670c4324
Use new resource management system.
Matti Hamalainen <ccr@tnsp.org>
parents:
7
diff
changeset
|
721 |
b3d6670c4324
Use new resource management system.
Matti Hamalainen <ccr@tnsp.org>
parents:
7
diff
changeset
|
722 SDL_Flip(engine.screen); |
b3d6670c4324
Use new resource management system.
Matti Hamalainen <ccr@tnsp.org>
parents:
7
diff
changeset
|
723 } |
b3d6670c4324
Use new resource management system.
Matti Hamalainen <ccr@tnsp.org>
parents:
7
diff
changeset
|
724 } |
b3d6670c4324
Use new resource management system.
Matti Hamalainen <ccr@tnsp.org>
parents:
7
diff
changeset
|
725 if (err != DMERR_OK) |
b3d6670c4324
Use new resource management system.
Matti Hamalainen <ccr@tnsp.org>
parents:
7
diff
changeset
|
726 { |
b3d6670c4324
Use new resource management system.
Matti Hamalainen <ccr@tnsp.org>
parents:
7
diff
changeset
|
727 dmError("Error loading resources, %d: %s.\n", |
b3d6670c4324
Use new resource management system.
Matti Hamalainen <ccr@tnsp.org>
parents:
7
diff
changeset
|
728 err, dmErrorStr(err)); |
b3d6670c4324
Use new resource management system.
Matti Hamalainen <ccr@tnsp.org>
parents:
7
diff
changeset
|
729 goto error_exit; |
b3d6670c4324
Use new resource management system.
Matti Hamalainen <ccr@tnsp.org>
parents:
7
diff
changeset
|
730 } |
b3d6670c4324
Use new resource management system.
Matti Hamalainen <ccr@tnsp.org>
parents:
7
diff
changeset
|
731 |
2 | 732 // efut |
733 dmPerlinInit(); | |
8
b3d6670c4324
Use new resource management system.
Matti Hamalainen <ccr@tnsp.org>
parents:
7
diff
changeset
|
734 SDL_Surface *nosfe[NOSFE_MAX - NOSFE_MIN + 1]; |
b3d6670c4324
Use new resource management system.
Matti Hamalainen <ccr@tnsp.org>
parents:
7
diff
changeset
|
735 for (i = 0; i < NOSFE_MAX; i++) |
b3d6670c4324
Use new resource management system.
Matti Hamalainen <ccr@tnsp.org>
parents:
7
diff
changeset
|
736 { |
b3d6670c4324
Use new resource management system.
Matti Hamalainen <ccr@tnsp.org>
parents:
7
diff
changeset
|
737 char fname[64]; |
b3d6670c4324
Use new resource management system.
Matti Hamalainen <ccr@tnsp.org>
parents:
7
diff
changeset
|
738 snprintf(fname, sizeof(fname), "%08d.jpg", NOSFE_MIN + i); |
b3d6670c4324
Use new resource management system.
Matti Hamalainen <ccr@tnsp.org>
parents:
7
diff
changeset
|
739 nosfe[i] = engineGetResImage(fname); |
b3d6670c4324
Use new resource management system.
Matti Hamalainen <ccr@tnsp.org>
parents:
7
diff
changeset
|
740 } |
b3d6670c4324
Use new resource management system.
Matti Hamalainen <ccr@tnsp.org>
parents:
7
diff
changeset
|
741 |
b3d6670c4324
Use new resource management system.
Matti Hamalainen <ccr@tnsp.org>
parents:
7
diff
changeset
|
742 for (i = 0; i < ncredits; i++) |
b3d6670c4324
Use new resource management system.
Matti Hamalainen <ccr@tnsp.org>
parents:
7
diff
changeset
|
743 credits[i].img = engineGetResImage(credits[i].filename); |
2 | 744 |
745 SDL_Surface *bmap = SDL_CreateRGBSurface(SDL_SWSURFACE, QWIDTH, QHEIGHT, 8, 0, 0, 0, 0); | |
746 | |
8
b3d6670c4324
Use new resource management system.
Matti Hamalainen <ccr@tnsp.org>
parents:
7
diff
changeset
|
747 /* Set callback, init module */ |
b3d6670c4324
Use new resource management system.
Matti Hamalainen <ccr@tnsp.org>
parents:
7
diff
changeset
|
748 jvmSetCallback(dev, jmpExec, plr); |
b3d6670c4324
Use new resource management system.
Matti Hamalainen <ccr@tnsp.org>
parents:
7
diff
changeset
|
749 jmpSetModule(plr, engineGetResModule("krapula.xm")); |
b3d6670c4324
Use new resource management system.
Matti Hamalainen <ccr@tnsp.org>
parents:
7
diff
changeset
|
750 jmpPlayOrder(plr, 0); |
b3d6670c4324
Use new resource management system.
Matti Hamalainen <ccr@tnsp.org>
parents:
7
diff
changeset
|
751 jvmSetGlobalVol(dev, 55); |
b3d6670c4324
Use new resource management system.
Matti Hamalainen <ccr@tnsp.org>
parents:
7
diff
changeset
|
752 SDL_PauseAudio(0); |
2 | 753 |
754 | |
755 engine.startTime = SDL_GetTicks(); | |
756 | |
757 while (!engine.exitFlag) | |
758 { | |
759 while (SDL_PollEvent(&engine.event)) | |
760 switch (engine.event.type) | |
761 { | |
762 case SDL_KEYDOWN: | |
763 switch (engine.event.key.keysym.sym) | |
764 { | |
765 case SDLK_ESCAPE: | |
766 engine.exitFlag = TRUE; | |
767 break; | |
768 | |
769 case SDLK_SPACE: | |
770 engine.pauseFlag = !engine.pauseFlag; | |
771 break; | |
772 | |
773 default: | |
774 break; | |
775 } | |
776 | |
777 break; | |
778 | |
779 #if 0 | |
780 case SDL_VIDEORESIZE: | |
781 optScrWidth = engine.event.resize.w; | |
782 optScrHeight = engine.event.resize.h; | |
783 | |
784 if (!dmInitializeVideo(&engine.screen)) | |
785 goto error_exit; | |
786 break; | |
787 #endif | |
788 | |
789 case SDL_VIDEOEXPOSE: | |
790 break; | |
791 | |
792 case SDL_QUIT: | |
793 engine.exitFlag = TRUE; | |
794 break; | |
795 } | |
796 | |
797 // Draw frame | |
798 frame.startTime = SDL_GetTicks(); | |
799 | |
800 if (SDL_MUSTLOCK(engine.screen) != 0 && SDL_LockSurface(engine.screen) != 0) | |
801 { | |
802 dmError("Can't lock surface.\n"); | |
803 goto error_exit; | |
804 } | |
805 | |
806 float t = engineGetTimeDT(); | |
807 | |
808 if (t < 5) | |
809 { | |
8
b3d6670c4324
Use new resource management system.
Matti Hamalainen <ccr@tnsp.org>
parents:
7
diff
changeset
|
810 SDL_Surface *anciat; |
2 | 811 int dt = engineGetTime(0); |
812 static DMLerpContext lerpX, lerpY, lerpD; | |
813 static DMScaledBlitFunc nblit; | |
814 DMVector light; | |
815 static BOOL nollattu = FALSE; | |
816 if (!nollattu) | |
817 { | |
8
b3d6670c4324
Use new resource management system.
Matti Hamalainen <ccr@tnsp.org>
parents:
7
diff
changeset
|
818 anciat = engineGetResImage("anciat.png"); |
2 | 819 nblit = dmGetScaledBlitFunc(bmap->format, engine.screen->format, DMD_NONE); |
820 dmMakePalette(bmap); | |
821 dmLerpInit(&lerpX, 0, QWIDTH, 5000); | |
822 dmLerpInit(&lerpY, QHEIGHT * 0.25, QHEIGHT * 0.75, 5000); | |
823 dmLerpInit(&lerpD, 0.04, 0.08, 5000); | |
824 nollattu = TRUE; | |
825 } | |
826 | |
827 light.x = dmLerpSCurve(&lerpX, dt); | |
828 light.y = dmLerp1(&lerpY, dt); | |
829 light.z = 128; | |
830 | |
831 dmShadowTraceHeightMap2(bmap->pixels, anciat->pixels, &light); | |
832 nblit(bmap, 0, 0, engine.screen->w, engine.screen->h, engine.screen); | |
833 } | |
834 else | |
835 if (t < 10) | |
836 { | |
8
b3d6670c4324
Use new resource management system.
Matti Hamalainen <ccr@tnsp.org>
parents:
7
diff
changeset
|
837 SDL_Surface *logobg, *logolayer1, *logolayer2; |
2 | 838 int dt = engineGetTime(5); |
839 static DMScaledBlitFunc nblit, kblit; | |
840 static DMLerpContext lerpD; | |
841 static BOOL nollattu = FALSE; | |
842 | |
843 if (!nollattu) | |
844 { | |
8
b3d6670c4324
Use new resource management system.
Matti Hamalainen <ccr@tnsp.org>
parents:
7
diff
changeset
|
845 logobg = engineGetResImage("logobg.png"); |
b3d6670c4324
Use new resource management system.
Matti Hamalainen <ccr@tnsp.org>
parents:
7
diff
changeset
|
846 logolayer1 = engineGetResImage("logolayer1.png"); |
b3d6670c4324
Use new resource management system.
Matti Hamalainen <ccr@tnsp.org>
parents:
7
diff
changeset
|
847 logolayer2 = engineGetResImage("logolayer2.png"); |
b3d6670c4324
Use new resource management system.
Matti Hamalainen <ccr@tnsp.org>
parents:
7
diff
changeset
|
848 |
2 | 849 nblit = dmGetScaledBlitFunc(logobg->format, engine.screen->format, DMD_TRANSPARENT); |
850 kblit = dmGetScaledBlitFunc(logobg->format, engine.screen->format, DMD_NONE); | |
851 dmLerpInit(&lerpD, 0.01, 500, 10000); | |
852 nollattu = TRUE; | |
853 } | |
854 | |
855 float q = dmLerpSCurve(&lerpD, dt); | |
856 float t = sin((float) dt / 150.0f); | |
857 int x = t * 25.0f + q, y = t * 35.0f + q*2.0f, | |
858 w = t * 70.0f + q, h = t * 40.0f + q*2.0f; | |
859 | |
860 float t2 = sin((float) dt / 150.0f + 0.2f); | |
861 int x2 = t2 * 25.0f + q, y2 = t * 35.0f + q*2.0f, | |
862 w2 = t2 * 70.0f + q, h2 = t * 40.0f + q*2.0f; | |
863 | |
864 kblit(logobg, 0, 0, engine.screen->w, engine.screen->h, engine.screen); | |
865 nblit(logolayer1, -x, -y, engine.screen->w+w, engine.screen->h+h, engine.screen); | |
866 nblit(logolayer2, -x2, -y2, engine.screen->w+w2, engine.screen->h+h2, engine.screen); | |
867 } | |
868 else | |
869 if (t < 20) | |
870 { | |
8
b3d6670c4324
Use new resource management system.
Matti Hamalainen <ccr@tnsp.org>
parents:
7
diff
changeset
|
871 SDL_Surface *gay, *logobg; |
2 | 872 int dt = engineGetTime(10); |
873 static DMLerpContext lerpX, lerpY, lerpD; | |
874 static DMScaledBlitFunc nblit, kblit; | |
875 static BOOL nollattu = FALSE; | |
876 DMVector light; | |
877 DMBlockMap heightMap; | |
878 | |
879 if (!nollattu) | |
880 { | |
8
b3d6670c4324
Use new resource management system.
Matti Hamalainen <ccr@tnsp.org>
parents:
7
diff
changeset
|
881 gay = engineGetResImage("gay.png"); |
b3d6670c4324
Use new resource management system.
Matti Hamalainen <ccr@tnsp.org>
parents:
7
diff
changeset
|
882 logobg = engineGetResImage("logobg.png"); |
2 | 883 nblit = dmGetScaledBlitFunc(bmap->format, engine.screen->format, DMD_NONE); |
884 kblit = dmGetScaledBlitFunc(logobg->format, engine.screen->format, DMD_TRANSPARENT); | |
885 dmMakePalette(bmap); | |
886 dmLerpInit(&lerpX, QWIDTH, 0, 10000); | |
887 dmLerpInit(&lerpY, QHEIGHT * 0.25, QHEIGHT * 0.75, 10000); | |
888 dmLerpInit(&lerpD, 0.04, 0.08, 10000); | |
889 nollattu = TRUE; | |
890 } | |
891 | |
892 light.x = dmLerpSCurve(&lerpX, dt); | |
893 light.y = QHEIGHT * 0.5 + sin(dmLerp1(&lerpY, dt)) * 0.5; | |
894 light.z = 128; | |
895 | |
896 dmMakeBumpMap(heightMap, dmLerpSCurve(&lerpD, dt), 254); | |
897 | |
898 dmShadowTraceHeightMap(bmap->pixels, heightMap, &light); | |
899 | |
900 nblit(bmap, 0, 0, engine.screen->w, engine.screen->h, engine.screen); | |
901 | |
902 if ((dt / 100) % 10 < 5) | |
903 { | |
904 kblit(gay, 0, 0, engine.screen->w, engine.screen->h, engine.screen); | |
905 } | |
906 } | |
907 else | |
908 if (t < 45) | |
909 { | |
15 | 910 static SDL_Surface *ruutu; |
2 | 911 static int currState, currCredit, creditStartTime; |
912 static DMLerpContext lerpX, lerpY, lerpZ; | |
913 static DMScaledBlitFunc nblit, kblit; | |
914 static BOOL stateChange, nollattu = FALSE; | |
915 int currFrame = engineGetTime(20) * 15 / 1000; | |
916 if (!nollattu) | |
917 { | |
8
b3d6670c4324
Use new resource management system.
Matti Hamalainen <ccr@tnsp.org>
parents:
7
diff
changeset
|
918 ruutu = engineGetResImage("ruutu.png"); |
2 | 919 dmClearSurface(ruutu, dmMapRGBA(ruutu, 0,0,0,0)); |
920 nblit = dmGetScaledBlitFunc(nosfe[0]->format, engine.screen->format, DMD_NONE); | |
921 kblit = dmGetScaledBlitFunc(credits[0].img->format, engine.screen->format, DMD_TRANSPARENT); | |
922 currCredit = -1; | |
923 currState = -1; | |
924 stateChange = TRUE; | |
925 nollattu = TRUE; | |
926 } | |
927 | |
928 float gt = 1.0f + sin(engineGetTime(0) / 250.0f); | |
929 int g1 = gt * 25.0f, g2 = gt * 50.0f; | |
930 | |
931 nblit(nosfe[currFrame % NOSFE_MAX], -g1, -g1, engine.screen->w+g2, engine.screen->h+g2, engine.screen); | |
932 | |
933 if (t >= 30) | |
934 { | |
935 int qtime = engineGetTime(30); | |
936 int creditTime = (engineGetTime(0) - creditStartTime); | |
937 float zscale; | |
938 if ( ( (qtime / (CREDITS_SPEED + 500)) % 2) == 0 && currState == -1) | |
939 stateChange = TRUE; | |
940 | |
941 if (stateChange && currCredit < ncredits) | |
942 { | |
943 // fprintf(stderr, "[%6d] stateChange: st=%d, credit=%d\n", creditTime, currState, currCredit); | |
944 stateChange = FALSE; | |
945 switch (currState) | |
946 { | |
947 case 0: | |
948 { | |
949 int qt = (qtime / 100) % nrandomCoords; | |
950 creditStartTime = engineGetTime(0); | |
951 creditTime = 0; | |
952 dmLerpInit(&lerpX, randomCoords[qt].x, credits[currCredit].x - 50, CREDITS_SPEED); | |
953 dmLerpInit(&lerpY, randomCoords[qt].y, credits[currCredit].y - 50, CREDITS_SPEED); | |
954 dmLerpInit(&lerpZ, 5.0f, 0.0f, CREDITS_SPEED); | |
955 currState = 1; | |
956 } | |
957 break; | |
958 | |
959 case 2: | |
960 if (creditTime >= CREDITS_SPEED) | |
961 creditTime = CREDITS_SPEED - 1; | |
962 | |
963 zscale = dmLerpSCurve(&lerpZ, creditTime); | |
964 dmScaledBlitSurface32to32TransparentX( | |
965 credits[currCredit].img, | |
966 dmLerpSCurve(&lerpX, creditTime) - (zscale * credits[currCredit].img->w), | |
967 dmLerpSCurve(&lerpY, creditTime) - (zscale * credits[currCredit].img->h), | |
968 credits[currCredit].img->w * (1.0f + zscale), | |
969 credits[currCredit].img->h * (1.0f + zscale), | |
970 ruutu); | |
971 | |
972 currState = -1; | |
973 break; | |
974 | |
975 default: | |
976 currCredit++; | |
977 currState = 0; | |
978 stateChange = TRUE; | |
979 break; | |
980 } | |
981 | |
982 // fprintf(stderr, "[%6d] changed: st=%d, credit=%d, chg=%d\n", creditTime, currState, currCredit, stateChange); | |
983 } | |
984 | |
985 | |
986 if (currCredit > 0) | |
987 { | |
988 kblit(ruutu, 0, 0, engine.screen->w, engine.screen->h, engine.screen); | |
989 } | |
990 | |
991 if (currState == 1) | |
992 { | |
993 if (creditTime >= CREDITS_SPEED) | |
994 { | |
995 creditTime = CREDITS_SPEED; | |
996 stateChange = TRUE; | |
997 currState = 2; | |
998 } | |
999 | |
1000 zscale = dmLerpSCurve(&lerpZ, creditTime); | |
1001 kblit(credits[currCredit].img, | |
1002 dmLerpSCurve(&lerpX, creditTime) - (zscale * credits[currCredit].img->w), | |
1003 dmLerpSCurve(&lerpY, creditTime) - (zscale * credits[currCredit].img->h), | |
1004 credits[currCredit].img->w * (1.0f + zscale), | |
1005 credits[currCredit].img->h * (1.0f + zscale), | |
1006 engine.screen); | |
1007 } | |
1008 } | |
14
b2b506e1f42a
Add nice headache white fade synced to beat.
Matti Hamalainen <ccr@tnsp.org>
parents:
9
diff
changeset
|
1009 |
2 | 1010 } |
1011 else | |
1012 if (t < 60) | |
1013 { | |
8
b3d6670c4324
Use new resource management system.
Matti Hamalainen <ccr@tnsp.org>
parents:
7
diff
changeset
|
1014 SDL_Surface *logobg, *greets; |
2 | 1015 int dt = engineGetTime(45); |
1016 static DMScaledBlitFunc nblit, kblit; | |
1017 static DMLerpContext lerpD; | |
1018 static BOOL nollattu = FALSE; | |
1019 | |
1020 if (!nollattu) | |
1021 { | |
8
b3d6670c4324
Use new resource management system.
Matti Hamalainen <ccr@tnsp.org>
parents:
7
diff
changeset
|
1022 logobg = engineGetResImage("logobg.png"); |
b3d6670c4324
Use new resource management system.
Matti Hamalainen <ccr@tnsp.org>
parents:
7
diff
changeset
|
1023 greets = engineGetResImage("greetings.png"); |
2 | 1024 nblit = dmGetScaledBlitFunc(logobg->format, engine.screen->format, DMD_TRANSPARENT); |
1025 kblit = dmGetScaledBlitFunc(logobg->format, engine.screen->format, DMD_NONE); | |
1026 dmLerpInit(&lerpD, 0.01, 500, 10000); | |
1027 nollattu = TRUE; | |
1028 } | |
1029 | |
1030 float q = dmLerpSCurve(&lerpD, dt); | |
15 | 1031 float t = sin((float) dt / 150.0f), |
1032 j = (1.0 + t) * 15; | |
2 | 1033 int x = t * 25.0f + q, y = t * 35.0f + q, |
1034 w = t * 70.0f + q*2.0f, h = t * 40.0f + q*2.0f; | |
1035 | |
15 | 1036 kblit(logobg, -j, -j, engine.screen->w+j*2.0f, engine.screen->h+j*2.0f, engine.screen); |
2 | 1037 nblit(greets, -x, -y, engine.screen->w+w, engine.screen->h+h, engine.screen); |
1038 } | |
1039 else | |
1040 engine.exitFlag = TRUE; | |
1041 | |
15 | 1042 { |
1043 static SDL_Surface *feidi; | |
1044 static int fadeStartTime; | |
1045 static BOOL fadeActive, nollattu = FALSE; | |
1046 static DMLerpContext fadeLerp; | |
1047 BOOL hit; | |
1048 int ch; | |
1049 | |
1050 if (!nollattu) | |
1051 { | |
1052 feidi = engineGetResImage("feidi.png"); | |
1053 dmLerpInit(&fadeLerp, 255, 0, 250); | |
1054 nollattu = TRUE; | |
1055 } | |
1056 | |
1057 JSS_LOCK(plr); | |
1058 for (hit = FALSE, ch = 0; ch < 6; ch++) | |
1059 if (plr->iCExtInstrumentN[ch] == 0) | |
1060 { | |
1061 hit = TRUE; | |
1062 break; | |
1063 } | |
1064 JSS_UNLOCK(plr); | |
1065 | |
1066 if (hit && !fadeActive) | |
1067 { | |
1068 fadeActive = TRUE; | |
1069 fadeStartTime = engineGetTime(0); | |
1070 } | |
1071 if (fadeActive) | |
1072 { | |
1073 int fadeTime = engineGetTime(0) - fadeStartTime; | |
1074 if (fadeTime < 250) | |
1075 { | |
1076 dmScaledBlitSurface32to32TransparentGA(feidi, | |
1077 0, 0, engine.screen->w, engine.screen->h, engine.screen, | |
1078 dmLerpSCurve(&fadeLerp, fadeTime)); | |
1079 } | |
1080 else | |
1081 fadeActive = FALSE; | |
1082 } | |
1083 } | |
1084 | |
2 | 1085 // Flip screen |
1086 if (SDL_MUSTLOCK(engine.screen) != 0) | |
1087 SDL_UnlockSurface(engine.screen); | |
1088 | |
1089 SDL_Flip(engine.screen); | |
1090 SDL_Delay(20); | |
8
b3d6670c4324
Use new resource management system.
Matti Hamalainen <ccr@tnsp.org>
parents:
7
diff
changeset
|
1091 |
b3d6670c4324
Use new resource management system.
Matti Hamalainen <ccr@tnsp.org>
parents:
7
diff
changeset
|
1092 // Get frame time, etc |
2 | 1093 frame.endTime = SDL_GetTicks(); |
1094 engine.currFrame++; | |
1095 engine.totalFrameTime += frame.endTime - frame.startTime; | |
1096 } | |
1097 | |
1098 // Print benchmark results | |
1099 engine.endTime = SDL_GetTicks(); | |
1100 dmMsg(0, "%d frames in %d ms, fps = %1.3f\n", | |
1101 engine.currFrame, engine.endTime - engine.startTime, | |
1102 (float) (engine.currFrame * 1000.0f) / (float) engine.totalFrameTime); | |
1103 | |
1104 | |
1105 error_exit: | |
1106 dmMsg(0, "Shutting down.\n"); | |
1107 SDL_ShowCursor(SDL_ENABLE); | |
1108 SDL_PauseAudio(1); | |
1109 | |
1110 if (engine.screen) | |
1111 SDL_FreeSurface(engine.screen); | |
1112 | |
7
2ff53bcfe366
Try to make sure that the audio shutdown does not hang.
Matti Hamalainen <ccr@tnsp.org>
parents:
2
diff
changeset
|
1113 SDL_LockAudio(); |
2 | 1114 jmpClose(plr); |
1115 jvmClose(dev); | |
1116 jssFreeModule(mod); | |
7
2ff53bcfe366
Try to make sure that the audio shutdown does not hang.
Matti Hamalainen <ccr@tnsp.org>
parents:
2
diff
changeset
|
1117 SDL_UnlockAudio(); |
2 | 1118 |
1119 dmres_close(); | |
1120 | |
1121 if (initSDL) | |
1122 SDL_Quit(); | |
1123 | |
1124 dmPrint(0, "SDL on muuten melko paska kirjasto.\n"); | |
1125 | |
1126 return 0; | |
1127 } |