Mercurial > hg > dmlib
comparison tests/efu.c @ 1445:60337b31e427
Cosmetics.
author | Matti Hamalainen <ccr@tnsp.org> |
---|---|
date | Thu, 10 May 2018 04:44:08 +0300 |
parents | 5be4e2eec84f |
children |
comparison
equal
deleted
inserted
replaced
1444:5be4e2eec84f | 1445:60337b31e427 |
---|---|
45 break; | 45 break; |
46 | 46 |
47 case 2: | 47 case 2: |
48 dmVerbosity++; | 48 dmVerbosity++; |
49 break; | 49 break; |
50 | 50 |
51 case 3: | 51 case 3: |
52 optVFlags |= SDL_FULLSCREEN; | 52 optVFlags |= SDL_FULLSCREEN; |
53 break; | 53 break; |
54 | 54 |
55 case 6: | 55 case 6: |
68 return FALSE; | 68 return FALSE; |
69 } | 69 } |
70 optScrWidth = w; | 70 optScrWidth = w; |
71 optScrHeight = h; | 71 optScrHeight = h; |
72 } | 72 } |
73 else | 73 else |
74 { | 74 { |
75 dmErrorMsg("Invalid size argument '%s'.\n", optArg); | 75 dmErrorMsg("Invalid size argument '%s'.\n", optArg); |
76 return FALSE; | 76 return FALSE; |
77 } | 77 } |
78 } | 78 } |
84 | 84 |
85 default: | 85 default: |
86 dmErrorMsg("Unknown option '%s'.\n", currArg); | 86 dmErrorMsg("Unknown option '%s'.\n", currArg); |
87 return FALSE; | 87 return FALSE; |
88 } | 88 } |
89 | 89 |
90 return TRUE; | 90 return TRUE; |
91 } | 91 } |
92 | 92 |
93 | 93 |
94 void DM_MakePalette(SDL_Surface *scr) | 94 void DM_MakePalette(SDL_Surface *scr) |
139 | 139 |
140 void DM_Random(SDL_Surface *screen, int q) | 140 void DM_Random(SDL_Surface *screen, int q) |
141 { | 141 { |
142 Uint8 *pix = screen->pixels; | 142 Uint8 *pix = screen->pixels; |
143 int xc, yc; | 143 int xc, yc; |
144 | 144 |
145 for (yc = 0; yc < screen->h; yc++) | 145 for (yc = 0; yc < screen->h; yc++) |
146 { | 146 { |
147 Uint8 *dp = pix; | 147 Uint8 *dp = pix; |
148 | 148 |
149 for (xc = 0; xc < screen->w; xc++) | 149 for (xc = 0; xc < screen->w; xc++) |
177 int i, j; | 177 int i, j; |
178 | 178 |
179 light->z = 150; | 179 light->z = 150; |
180 | 180 |
181 for (j = 0; j < QHEIGHT; j++) | 181 for (j = 0; j < QHEIGHT; j++) |
182 for (i = 0; i < QWIDTH; i++) | 182 for (i = 0; i < QWIDTH; i++) |
183 { | 183 { |
184 DMVector vr, vl, va; | 184 DMVector vr, vl, va; |
185 DMFloat vrayLen, vfactor; | 185 DMFloat vrayLen, vfactor; |
186 int vlen; | 186 int vlen; |
187 BOOL wasHit; | 187 BOOL wasHit; |
188 | 188 |
189 // Perform shadow occlusion via simplistic raytracing | 189 // Perform shadow occlusion via simplistic raytracing |
190 vr.x = i; | 190 vr.x = i; |
191 vr.y = j; | 191 vr.y = j; |
192 vr.z = 200; //light->z; // - 10.0; | 192 vr.z = 200; //light->z; // - 10.0; |
193 | 193 |
194 // Calculate light vector vector | 194 // Calculate light vector vector |
195 dm_vector_sub_r(&vl, &vr, light); | 195 dm_vector_sub_r(&vl, &vr, light); |
196 vrayLen = dm_vector_length(&vl); | 196 vrayLen = dm_vector_length(&vl); |
197 | 197 |
198 #if 1 | 198 #if 1 |
199 dm_vector_copy(&va, &vl); | 199 dm_vector_copy(&va, &vl); |
200 dm_vector_normalize(&va); | 200 dm_vector_normalize(&va); |
201 dm_vector_copy(&vr, light); | 201 dm_vector_copy(&vr, light); |
202 | 202 |
203 vlen = 0; | 203 vlen = 0; |
204 wasHit = FALSE; | 204 wasHit = FALSE; |
205 do | 205 do |
206 { | |
207 float h; | |
208 | |
209 // If ray is inside the heightmap, get value | |
210 if (vr.x >= 0 && vr.y >= 0 && vr.x < QWIDTH && vr.y < QHEIGHT) | |
211 h = pheightMap[(int) vr.y][(int) vr.x]; | |
212 else | |
213 break; | |
214 | |
215 // Check for hits | |
216 if (h > vr.z) | |
217 wasHit = TRUE; | |
218 else | |
206 { | 219 { |
207 float h; | 220 // Move forwards |
208 | 221 dm_vector_add(&vr, &va); |
209 // If ray is inside the heightmap, get value | 222 vlen++; |
210 if (vr.x >= 0 && vr.y >= 0 && vr.x < QWIDTH && vr.y < QHEIGHT) | |
211 h = pheightMap[(int) vr.y][(int) vr.x]; | |
212 else | |
213 break; | |
214 | |
215 // Check for hits | |
216 if (h > vr.z) | |
217 wasHit = TRUE; | |
218 else | |
219 { | |
220 // Move forwards | |
221 dm_vector_add(&vr, &va); | |
222 vlen++; | |
223 } | |
224 } | 223 } |
225 while (!wasHit && vlen <= vrayLen); | 224 } |
226 | 225 while (!wasHit && vlen <= vrayLen); |
227 // Check if the ray hit something, e.g. is this point occluded? | 226 |
228 if (wasHit && vlen < vrayLen) | 227 // Check if the ray hit something, e.g. is this point occluded? |
229 { | 228 if (wasHit && vlen < vrayLen) |
230 vfactor = vlen * 0.05; | 229 { |
231 } | 230 vfactor = vlen * 0.05; |
232 else | 231 } |
233 vfactor = vlen * 0.001; | 232 else |
233 vfactor = vlen * 0.001; | |
234 #endif | 234 #endif |
235 | 235 |
236 #if 0 | 236 #if 0 |
237 { | 237 { |
238 /* Calculate light's intensity based on the angle it "hits" | 238 /* Calculate light's intensity based on the angle it "hits" |
239 * | 239 * |
240 * 1) Calculate the vectors that form the imaginary "plane" | 240 * 1) Calculate the vectors that form the imaginary "plane" |
241 * 2) Cross-product -> normal vector of the plane | 241 * 2) Cross-product -> normal vector of the plane |
242 * 2) Normalize the normal vector | 242 * 2) Normalize the normal vector |
243 * 3) Calculate light vector's hit angle by dot product | 243 * 3) Calculate light vector's hit angle by dot product |
244 */ | 244 */ |
245 DMVector v1, v2; | 245 DMVector v1, v2; |
246 DMFloat c; | 246 DMFloat c; |
247 | 247 |
248 v1.x = 2.0f; | 248 v1.x = 2.0f; |
249 v1.y = 0.0f; | 249 v1.y = 0.0f; |
250 v1.z = (DMFloat) (pheightMap[j][i] - pheightMap[j][i + 1]); | 250 v1.z = (DMFloat) (pheightMap[j][i] - pheightMap[j][i + 1]); |
251 | 251 |
252 v2.x = 0.0f; | 252 v2.x = 0.0f; |
253 v2.y = 2.0f; | 253 v2.y = 2.0f; |
254 v2.z = (DMFloat) (pheightMap[j][i] - pheightMap[j + 1][i]); | 254 v2.z = (DMFloat) (pheightMap[j][i] - pheightMap[j + 1][i]); |
255 | 255 |
256 dm_vector_cross(&vr, &v1, &v2); | 256 dm_vector_cross(&vr, &v1, &v2); |
257 dm_vector_normalize(&vr); | 257 dm_vector_normalize(&vr); |
258 dm_vector_normalize(&vl); | 258 dm_vector_normalize(&vl); |
259 c = dm_vector_dot(&vl, &vr); | 259 c = dm_vector_dot(&vl, &vr); |
260 | 260 |
261 vrayLen = 255 - (vrayLen * 0.1) * vrayLen + (c * 128.0f) + (vfactor * vfactor * 1255); | 261 vrayLen = 255 - (vrayLen * 0.1) * vrayLen + (c * 128.0f) + (vfactor * vfactor * 1255); |
262 } | 262 } |
263 #else | 263 #else |
264 vrayLen = 255 - vrayLen * vrayLen * (vfactor * vfactor); | 264 vrayLen = 255 - vrayLen * vrayLen * (vfactor * vfactor); |
265 if (vrayLen < 0) vrayLen = 0; | 265 if (vrayLen < 0) vrayLen = 0; |
266 vrayLen -= pheightMap[j][i]; | 266 vrayLen -= pheightMap[j][i]; |
267 | |
267 #endif | 268 #endif |
268 | 269 |
269 // Clip result | 270 // Clip result |
270 if (vrayLen < 0) | 271 if (vrayLen < 0) |
271 vrayLen = 0; | 272 vrayLen = 0; |
272 else if (vrayLen > 255.0f) | 273 else if (vrayLen > 255.0f) |
273 vrayLen = 255.0f; | 274 vrayLen = 255.0f; |
274 | 275 |
275 lightMap[j][i] = vrayLen; | 276 lightMap[j][i] = vrayLen; |
276 } | 277 } |
277 } | 278 } |
278 | 279 |
279 #define Q_KERNEL(x, y, dist, coeff) ( \ | 280 #define Q_KERNEL(x, y, dist, coeff) ( \ |
280 in[(y) - (dist)][(x)] * (coeff) + \ | 281 in[(y) - (dist)][(x)] * (coeff) + \ |
281 in[(y) + (dist)][(x)] * (coeff) + \ | 282 in[(y) + (dist)][(x)] * (coeff) + \ |
314 SDL_Color fontcol={255,155,155,0}; | 315 SDL_Color fontcol={255,155,155,0}; |
315 SDL_Event event; | 316 SDL_Event event; |
316 int mouseX, mouseY, res; | 317 int mouseX, mouseY, res; |
317 BOOL initSDL = FALSE, initTTF = FALSE, exitFlag, showMap = FALSE; | 318 BOOL initSDL = FALSE, initTTF = FALSE, exitFlag, showMap = FALSE; |
318 DMResource *file; | 319 DMResource *file; |
319 | 320 |
320 if (!dmArgsProcess(argc, argv, optList, optListN, | 321 if (!dmArgsProcess(argc, argv, optList, optListN, |
321 argHandleOpt, NULL, OPTH_BAILOUT)) | 322 argHandleOpt, NULL, OPTH_BAILOUT)) |
322 exit(1); | 323 exit(1); |
323 | 324 |
324 if (SDL_Init(SDL_INIT_VIDEO | SDL_INIT_TIMER) != 0) | 325 if (SDL_Init(SDL_INIT_VIDEO | SDL_INIT_TIMER) != 0) |
366 if (screen == NULL) | 367 if (screen == NULL) |
367 { | 368 { |
368 dmErrorMsg("Could not create screen surface.\n"); | 369 dmErrorMsg("Could not create screen surface.\n"); |
369 goto error_exit; | 370 goto error_exit; |
370 } | 371 } |
371 | 372 |
372 dmMsg(0, "Benchmark mode, not opening window.\n"); | 373 dmMsg(0, "Benchmark mode, not opening window.\n"); |
373 } | 374 } |
374 else | 375 else |
375 { | 376 { |
376 if (!DM_InitializeVideo(&screen)) | 377 if (!DM_InitializeVideo(&screen)) |
382 dmPerlinInit(&perlinCtx, 1234); | 383 dmPerlinInit(&perlinCtx, 1234); |
383 | 384 |
384 bmap = SDL_CreateRGBSurface(SDL_SWSURFACE, QWIDTH, QHEIGHT, 8, 0, 0, 0, 0); | 385 bmap = SDL_CreateRGBSurface(SDL_SWSURFACE, QWIDTH, QHEIGHT, 8, 0, 0, 0, 0); |
385 DM_MakePalette(bmap); | 386 DM_MakePalette(bmap); |
386 DM_Random(bmap, 15); | 387 DM_Random(bmap, 15); |
387 | 388 |
388 DMVector light; | 389 DMVector light; |
389 DMBlockMap heightMap; | 390 DMBlockMap heightMap; |
390 light.x = light.y = 128; | 391 light.x = light.y = 128; |
391 light.z = 128; | 392 light.z = 128; |
392 dmMakeBumpMap(heightMap, 0.06, 254); | 393 dmMakeBumpMap(heightMap, 0.06, 254); |
408 { | 409 { |
409 case SDL_KEYDOWN: | 410 case SDL_KEYDOWN: |
410 switch (event.key.keysym.sym) | 411 switch (event.key.keysym.sym) |
411 { | 412 { |
412 case SDLK_ESCAPE: exitFlag = TRUE; break; | 413 case SDLK_ESCAPE: exitFlag = TRUE; break; |
413 | 414 |
414 case SDLK_F1: | 415 case SDLK_F1: |
415 DM_Random(bmap, (SDL_GetTicks() / 10) % 1000); | 416 DM_Random(bmap, (SDL_GetTicks() / 10) % 1000); |
416 break; | 417 break; |
417 | 418 |
418 case SDLK_F5: | 419 case SDLK_F5: |
419 showMap = !showMap; | 420 showMap = !showMap; |
420 break; | 421 break; |
421 | 422 |
422 default: | 423 default: |
423 break; | 424 break; |
424 } | 425 } |
425 | 426 |
426 break; | 427 break; |
427 | 428 |
428 case SDL_VIDEORESIZE: | 429 case SDL_VIDEORESIZE: |
429 optScrWidth = event.resize.w; | 430 optScrWidth = event.resize.w; |
430 optScrHeight = event.resize.h; | 431 optScrHeight = event.resize.h; |
431 | 432 |
432 if (!DM_InitializeVideo(&screen)) | 433 if (!DM_InitializeVideo(&screen)) |
433 goto error_exit; | 434 goto error_exit; |
434 | 435 |
435 break; | 436 break; |
436 | 437 |
437 case SDL_VIDEOEXPOSE: | 438 case SDL_VIDEOEXPOSE: |
438 break; | 439 break; |
439 | 440 |
440 case SDL_QUIT: | 441 case SDL_QUIT: |
441 exit(0); | 442 exit(0); |
455 | 456 |
456 if (showMap) | 457 if (showMap) |
457 memcpy(bmap->pixels, heightMap, QWIDTH * QHEIGHT); | 458 memcpy(bmap->pixels, heightMap, QWIDTH * QHEIGHT); |
458 else | 459 else |
459 dmShadowTraceHeightMap(bmap->pixels, logo->pixels, &light); | 460 dmShadowTraceHeightMap(bmap->pixels, logo->pixels, &light); |
460 | |
461 dmScaledBlitSurfaceAny(bmap, 0, 0, screen->w, screen->h, screen, DMD_NONE); | 461 dmScaledBlitSurfaceAny(bmap, 0, 0, screen->w, screen->h, screen, DMD_NONE); |
462 | 462 |
463 | 463 |
464 | 464 |
465 if (!optBenchmark) | 465 if (!optBenchmark) |
466 { | 466 { |
467 dmDrawTTFText(screen, font, fontcol, 0, 0, "%3.1f FPS", | 467 dmDrawTTFText(screen, font, fontcol, 0, 0, "%3.1f FPS", |
468 (float) (numFrames * 1000.0f) / (float) (endTime - startTime)); | 468 (float) (numFrames * 1000.0f) / (float) (endTime - startTime)); |
469 | 469 |
470 if (SDL_MUSTLOCK(screen) != 0) | 470 if (SDL_MUSTLOCK(screen) != 0) |
471 SDL_UnlockSurface(screen); | 471 SDL_UnlockSurface(screen); |
472 | 472 |