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