81 GPUSettingsDisplayHeavy oldCfgH = mCfgH;
82 GPUSettingsDisplayLight oldCfgL = mCfgL;
83 GPUSettingsDisplayRenderer oldCfgR = mCfgR;
86 SetInfo(
"Showing next event", 1);
89 SetInfo(
"Exiting", 1);
90 }
else if (
key ==
'r') {
92 SetInfo(
"View reset", 1);
94 mCfgR.camLookOrigin ^= 1;
95 mCfgR.cameraMode = mCfgR.camLookOrigin + 2 * mCfgR.camYUp;
96 SetInfo(
"Camera locked on origin: %s", mCfgR.camLookOrigin ?
"enabled" :
"disabled");
99 mCfgR.cameraMode = mCfgR.camLookOrigin + 2 * mCfgR.camYUp;
100 SetInfo(
"Camera locked on y-axis facing upwards: %s", mCfgR.camYUp ?
"enabled" :
"disabled");
103 if (mCfgR.cameraMode == 4) {
104 mCfgR.cameraMode = 0;
106 mCfgR.camLookOrigin = mCfgR.cameraMode & 1;
107 mCfgR.camYUp = mCfgR.cameraMode & 2;
108 const char* modeText[] = {
"Descent (free movement)",
"Focus locked on origin (y-axis forced upwards)",
"Spectator (y-axis forced upwards)",
"Focus locked on origin (with free rotation)"};
109 SetInfo(
"Camera mode %d: %s", mCfgR.cameraMode, modeText[mCfgR.cameraMode]);
112 }
else if (
key ==
'l') {
113 if (mCfgL.drawSector >= (mCfgL.drawRelatedSectors ? (NSECTORS / 4 - 1) : (NSECTORS - 1))) {
114 mCfgL.drawSector = -1;
115 SetInfo(
"Showing all sectors", 1);
118 SetInfo(
"Showing sector %d", mCfgL.drawSector);
120 }
else if (
key ==
'k') {
121 if (mCfgL.drawSector <= -1) {
122 mCfgL.drawSector = mCfgL.drawRelatedSectors ? (NSECTORS / 4 - 1) : (NSECTORS - 1);
126 if (mCfgL.drawSector == -1) {
127 SetInfo(
"Showing all sectors", 1);
129 SetInfo(
"Showing sector %d", mCfgL.drawSector);
131 }
else if (
key ==
'J') {
132 mCfgL.drawRelatedSectors ^= 1;
133 SetInfo(
"Drawing of related sectors %s", mCfgL.drawRelatedSectors ?
"enabled" :
"disabled");
134 }
else if (
key ==
'L') {
135 if (mCfgL.showCollision >= mNCollissions - 1) {
136 mCfgL.showCollision = -1;
137 SetInfo(
"Showing all collisions", 1);
139 mCfgL.showCollision++;
140 SetInfo(
"Showing collision %d / %d", mCfgL.showCollision, mNCollissions);
142 }
else if (
key ==
'K') {
143 if (mCfgL.showCollision <= -1) {
144 mCfgL.showCollision = mNCollissions - 1;
146 mCfgL.showCollision--;
148 if (mCfgL.showCollision == -1) {
149 SetInfo(
"Showing all collisions", 1);
151 SetInfo(
"Showing collision %d / %d", mCfgL.showCollision, mNCollissions);
153 }
else if (
key ==
'F') {
154 mCfgR.fullScreen ^= 1;
155 SetInfo(
"Toggling full screen (%d)", (int32_t)mCfgR.fullScreen);
156 }
else if (
key ==
'_') {
157 mCfgR.maximized ^= 1;
158 SetInfo(
"Toggling Maximized window (%d)", (int32_t)mCfgR.maximized);
159 }
else if (
key ==
'R') {
160 mCfgR.maxFPSRate ^= 1;
161 SetInfo(
"FPS rate %s", mCfgR.maxFPSRate ?
"not limited" :
"limited");
162 }
else if (
key ==
'H') {
165 SetInfo(
"Info text display - console: %s, onscreen %s", (mPrintInfoText & 2) ?
"enabled" :
"disabled", (mPrintInfoText & 1) ?
"enabled" :
"disabled");
166 }
else if (
key ==
'j') {
167 if (mCfgH.separateExtrapolatedTracks) {
168 mCfgH.splitCETracks ^= 1;
170 mCfgH.separateExtrapolatedTracks ^= 1;
171 SetInfo(
"Seperated display of tracks propagated to adjacent sectors %s / of CE tracks %s", mCfgH.separateExtrapolatedTracks ?
"enabled" :
"disabled", mCfgH.splitCETracks ?
"enabled" :
"disabled");
172 }
else if (
key ==
'c') {
173 if (mCfgH.markClusters == 0) {
174 mCfgH.markClusters = 1;
175 }
else if (mCfgH.markClusters >= 0x20) {
176 mCfgH.markClusters = 0;
178 mCfgH.markClusters <<= 1;
180 SetInfo(
"Cluster flag highlight mask set to %d (%s)", mCfgH.markClusters,
181 mCfgH.markClusters == 0 ?
"off" : mCfgH.markClusters == 1 ?
"split pad" : mCfgH.markClusters == 2 ?
"split time" : mCfgH.markClusters == 4 ?
"edge" : mCfgH.markClusters == 8 ?
"singlePad" : mCfgH.markClusters == 0x10 ?
"reject distance" :
"reject error");
182 }
else if (
key ==
'z') {
183 mCfgH.markFakeClusters ^= 1;
184 SetInfo(
"Marking fake clusters: %s", mCfgH.markFakeClusters ?
"on" :
"off");
185 }
else if (
key ==
'b') {
186 if ((mCfgR.fov += 5) > 175) {
189 SetInfo(
"Set FOV to %f", mCfgR.fov);
190 }
else if (
key == 39) {
192#ifdef GPUCA_DISPLAY_OPENGL_CORE
193 SetInfo(
"OpenGL compat profile not available, using core profile", 1);
195 mCfgR.openGLCore ^= 1;
196 SetInfo(
"Using renderer path for OpenGL %s profile", mCfgR.openGLCore ?
"core" :
"compat");
199 SetInfo(
"OpenGL options only available with OpenGL backend");
201 }
else if (
key ==
'B') {
202 mCfgH.markAdjacentClusters++;
203 if (mCfgH.markAdjacentClusters == 5) {
204 mCfgH.markAdjacentClusters = 7;
206 if (mCfgH.markAdjacentClusters == 9) {
207 mCfgH.markAdjacentClusters = 15;
209 if (mCfgH.markAdjacentClusters == 17) {
210 mCfgH.markAdjacentClusters = 31;
212 if (mCfgH.markAdjacentClusters == 34) {
213 mCfgH.markAdjacentClusters = 0;
215 if (mCfgH.markAdjacentClusters == 33) {
216 SetInfo(
"Marking protected clusters (%d)", mCfgH.markAdjacentClusters);
217 }
else if (mCfgH.markAdjacentClusters == 32) {
218 SetInfo(
"Marking removable clusters (%d)", mCfgH.markAdjacentClusters);
220 SetInfo(
"Marking adjacent clusters (%d): rejected %s, tube %s, looper leg %s, low Pt %s, high incl %s", mCfgH.markAdjacentClusters, (mCfgH.markAdjacentClusters & 1) ?
"yes" :
" no", (mCfgH.markAdjacentClusters & 2) ?
"yes" :
" no", (mCfgH.markAdjacentClusters & 4) ?
"yes" :
" no", (mCfgH.markAdjacentClusters & 8) ?
"yes" :
" no", (mCfgH.markAdjacentClusters & 16) ?
"yes" :
" no");
222 }
else if (
key ==
'C') {
223 mCfgL.colorCollisions ^= 1;
224 SetInfo(
"Color coding of collisions %s", mCfgL.colorCollisions ?
"enabled" :
"disabled");
225 }
else if (
key ==
'N') {
226 mCfgL.colorClusters ^= 1;
227 SetInfo(
"Color coding for seed / trrack attachmend %s", mCfgL.colorClusters ?
"enabled" :
"disabled");
228 }
else if (
key ==
'E') {
229 mCfgL.propagateTracks += 1;
230 if (mCfgL.propagateTracks == 4) {
231 mCfgL.propagateTracks = 0;
233 const char* infoText[] = {
"Hits connected",
"Hits connected and propagated to vertex",
"Reconstructed track propagated inwards and outwards",
"Monte Carlo track"};
234 SetInfo(
"Display of propagated tracks: %s", infoText[mCfgL.propagateTracks]);
235 }
else if (
key ==
'G') {
236 mCfgH.propagateLoopers ^= 1;
237 SetInfo(
"Propagation of loopers %s", mCfgH.propagateLoopers ?
"enabled" :
"disabled");
238 }
else if (
key ==
'v') {
239 mCfgH.hideRejectedClusters ^= 1;
240 SetInfo(
"Rejected clusters are %s", mCfgH.hideRejectedClusters ?
"hidden" :
"shown");
241 }
else if (
key ==
'i') {
242 mCfgH.projectXY ^= 1;
243 SetInfo(
"Projection onto xy plane %s", mCfgH.projectXY ?
"enabled" :
"disabled");
244 }
else if (
key ==
'S') {
245 mCfgL.smoothPoints ^=
true;
246 SetInfo(
"Smoothing of points %s", mCfgL.smoothPoints ?
"enabled" :
"disabled");
247 }
else if (
key ==
'A') {
248 mCfgL.smoothLines ^=
true;
249 SetInfo(
"Smoothing of lines %s", mCfgL.smoothLines ?
"enabled" :
"disabled");
250 }
else if (
key ==
'D') {
251 mCfgL.depthBuffer ^=
true;
252 SetInfo(
"Depth buffer (z-buffer, %u bits) %s", mBackend->DepthBits(), mCfgL.depthBuffer ?
"enabled" :
"disabled");
253 mBackend->setDepthBuffer();
254 }
else if (
key ==
'W') {
255 mCfgR.drawQualityMSAA *= 2;
256 if (mCfgR.drawQualityMSAA < 2) {
257 mCfgR.drawQualityMSAA = 2;
259 if (mCfgR.drawQualityMSAA > 16 || mCfgR.drawQualityMSAA > mBackend->getMaxMSAA()) {
260 mCfgR.drawQualityMSAA = 0;
262 SetInfo(
"Multisampling anti-aliasing factor set to %d", mCfgR.drawQualityMSAA);
263 }
else if (
key ==
'U') {
264 mCfgR.drawQualityDownsampleFSAA++;
265 if (mCfgR.drawQualityDownsampleFSAA == 1) {
266 mCfgR.drawQualityDownsampleFSAA = 2;
268 if (mCfgR.drawQualityDownsampleFSAA == 5) {
269 mCfgR.drawQualityDownsampleFSAA = 0;
271 SetInfo(
"Downsampling anti-aliasing factor set to %d", mCfgR.drawQualityDownsampleFSAA);
272 }
else if (
key ==
'V') {
273 mCfgR.drawQualityVSync ^=
true;
274 SetInfo(
"VSync: %s", mCfgR.drawQualityVSync ?
"enabled" :
"disabled");
275 }
else if (
key ==
'I') {
276 mCfgR.useGLIndirectDraw ^=
true;
277 SetInfo(
"OpenGL Indirect Draw %s", mCfgR.useGLIndirectDraw ?
"enabled" :
"disabled");
278 }
else if (
key ==
';') {
281 SetInfo(
"TPC sector separation: %f %f", mCfgH.xAdd, mCfgH.zAdd);
282 }
else if (
key ==
':') {
285 if (mCfgH.zAdd < 0 || mCfgH.xAdd < 0) {
286 mCfgH.zAdd = mCfgH.xAdd = 0;
288 SetInfo(
"TPC sector separation: %f %f", mCfgH.xAdd, mCfgH.zAdd);
289 }
else if (
key ==
'#') {
290 mCfgL.invertColors ^= 1;
291 }
else if (
key ==
'g') {
293 SetInfo(
"Fast Cluster Search Grid %s", mCfgL.drawGrid ?
"shown" :
"hidden");
294 }
else if (
key ==
'x') {
295 mCfgL.excludeClusters = (mCfgL.excludeClusters + 1) % 3;
296 SetInfo(mCfgL.excludeClusters ?
"Clusters of selected category are excluded from display (%d)" :
"Clusters are shown", mCfgL.excludeClusters);
297 }
else if (
key ==
'.') {
298 mCfgH.hideRejectedTracks ^= 1;
299 SetInfo(
"Rejected tracks are %s", mCfgH.hideRejectedTracks ?
"hidden" :
"shown");
300 }
else if (
key ==
'1') {
301 mCfgL.drawClusters ^= 1;
302 }
else if (
key ==
'2') {
303 mCfgL.drawInitLinks ^= 1;
304 }
else if (
key ==
'3') {
305 mCfgL.drawLinks ^= 1;
306 }
else if (
key ==
'4') {
307 mCfgL.drawSeeds ^= 1;
308 }
else if (
key ==
'5') {
309 mCfgL.drawTracklets ^= 1;
310 }
else if (
key ==
'6') {
311 mCfgL.drawTracks ^= 1;
312 }
else if (
key ==
'7') {
313 mCfgL.drawExtrapolatedTracks ^= 1;
314 }
else if (
key ==
'8') {
315 mCfgL.drawFinal ^= 1;
318 mCfgH.drawTPCTracks ^= 1;
319 SetInfo(
"Track Filter Mask: TPC:%d TRD:%d TOF:%d ITS:%d", (int32_t)mCfgH.drawTPCTracks, (int32_t)mCfgH.drawTRDTracks, (int32_t)mCfgH.drawTOFTracks, (int32_t)mCfgH.drawITSTracks);
322 SetInfo(
"Showing TPC Clusters: %d", (int32_t)mCfgL.drawTPC);
326 mCfgH.drawTRDTracks ^= 1;
327 SetInfo(
"Track Filter Mask: TPC:%d TRD:%d TOF:%d ITS:%d", (int32_t)mCfgH.drawTPCTracks, (int32_t)mCfgH.drawTRDTracks, (int32_t)mCfgH.drawTOFTracks, (int32_t)mCfgH.drawITSTracks);
330 SetInfo(
"Showing TRD Tracklets: %d", (int32_t)mCfgL.drawTRD);
334 mCfgH.drawTOFTracks ^= 1;
335 SetInfo(
"Track Filter Mask: TPC:%d TRD:%d TOF:%d ITS:%d", (int32_t)mCfgH.drawTPCTracks, (int32_t)mCfgH.drawTRDTracks, (int32_t)mCfgH.drawTOFTracks, (int32_t)mCfgH.drawITSTracks);
338 SetInfo(
"Showing TOF Hits: %d", (int32_t)mCfgL.drawTOF);
342 mCfgH.drawITSTracks ^= 1;
343 SetInfo(
"Track Filter Mask: TPC:%d TRD:%d TOF:%d ITS:%d", (int32_t)mCfgH.drawTPCTracks, (int32_t)mCfgH.drawTRDTracks, (int32_t)mCfgH.drawTOFTracks, (int32_t)mCfgH.drawITSTracks);
346 SetInfo(
"Showing ITS Clusters: %d", (int32_t)mCfgL.drawITS);
349 mCfgH.drawTracksAndFilter ^= 1;
350 SetInfo(
"Track filter: %s", mCfgH.drawTracksAndFilter ?
"AND" :
"OR");
351 }
else if (
key ==
't') {
352 static int32_t nScreenshot = 1;
354 snprintf(fname, 32,
"screenshot%d.bmp", nScreenshot++);
355 mRequestScreenshot =
true;
356 mScreenshotFile = fname;
357 SetInfo(
"Taking screenshot (%s)", fname);
358 }
else if (
key ==
'Z') {
359 mCfgR.screenshotScaleFactor += 1;
360 if (mCfgR.screenshotScaleFactor == 5) {
361 mCfgR.screenshotScaleFactor = 1;
363 SetInfo(
"Screenshot scaling factor set to %d", mCfgR.screenshotScaleFactor);
364 }
else if (
key ==
'y' ||
key ==
'T') {
365 if (mAnimateVectors[0].
size() > 1) {
366 if ((mAnimateScreenshot = (
key ==
'T'))) {
370 SetInfo(
"Starting Animation", 1);
372 SetInfo(
"Insufficient Animation points to start Animation", 1);
374 }
else if (
key ==
'>') {
375 mAnimationChangeConfig ^= 1;
376 SetInfo(
"Interpolating visualization settings during Animation %s", mAnimationChangeConfig ?
"enabled" :
"disabled");
377 }
else if (
key ==
'Y') {
379 SetInfo(
"Added Animation point (%d points, %6.2f seconds)", (int32_t)mAnimateVectors[0].
size(), mAnimateVectors[0].back());
380 }
else if (
key ==
'X') {
382 SetInfo(
"Reset Animation points", 1);
383 }
else if (
key ==
'\'') {
384 removeAnimationPoint();
385 SetInfo(
"Removed Animation point", 1);
386 }
else if (
key ==
'M') {
387 mCfgL.animationMode++;
388 if (mCfgL.animationMode == 7) {
389 mCfgL.animationMode = 0;
392 if (mCfgL.animationMode == 6) {
393 SetInfo(
"Animation mode %d - Centered on origin", mCfgL.animationMode);
395 SetInfo(
"Animation mode %d - Position: %s, Direction: %s", mCfgL.animationMode, (mCfgL.animationMode & 2) ?
"Spherical (spherical rotation)" : (mCfgL.animationMode & 4) ?
"Spherical (Euler angles)" :
"Cartesian", (mCfgL.animationMode & 1) ?
"Euler angles" :
"Quaternion");
397 }
else if (
key ==
'u') {
398 mCfgH.trackFilter = (mCfgH.trackFilter + 1) % (mConfig.filterMacros.size() + 1);
399 mUpdateTrackFilter =
true;
400 SetInfo(
"Track filter: %s", mCfgH.trackFilter == 0 ?
"None" : mConfig.filterMacros[mCfgH.trackFilter - 1].c_str());
401 }
else if (
key ==
'o') {
402 FILE* ftmp = fopen(
"glpos.tmp",
"w+b");
404 int32_t retval = fwrite(&mViewMatrix,
sizeof(mViewMatrix), 1, ftmp);
406 GPUError(
"Error writing position to file");
408 GPUInfo(
"Position stored to file");
412 GPUError(
"Error opening file");
414 SetInfo(
"Camera position stored to file", 1);
415 }
else if (
key ==
'p') {
416 FILE* ftmp = fopen(
"glpos.tmp",
"rb");
418 int32_t retval = fread(&mViewMatrix, 1,
sizeof(mViewMatrix), ftmp);
419 if (retval ==
sizeof(mViewMatrix)) {
420 GPUInfo(
"Position read from file");
422 GPUError(
"Error reading position from file");
426 GPUError(
"Error opening file");
428 SetInfo(
"Camera position loaded from file", 1);
429 }
else if (
key ==
'O') {
430 FILE* ftmp = fopen(
"glanimation.tmp",
"w+b");
432 fwrite(&mCfgL,
sizeof(mCfgL), 1, ftmp);
433 int32_t
size = mAnimateVectors[0].size();
434 fwrite(&
size,
sizeof(
size), 1, ftmp);
435 for (int32_t
i = 0;
i < 9;
i++) {
436 fwrite(mAnimateVectors[
i].
data(),
sizeof(mAnimateVectors[
i][0]),
size, ftmp);
438 fwrite(mAnimateConfig.data(),
sizeof(mAnimateConfig[0]),
size, ftmp);
441 GPUError(
"Error opening file");
443 SetInfo(
"Animation path stored to file %s",
"glanimation.tmp");
444 }
else if (
key ==
'P') {
445 FILE* ftmp = fopen(
"glanimation.tmp",
"rb");
447 int32_t retval = fread(&mCfgL,
sizeof(mCfgL), 1, ftmp);
449 retval += fread(&
size,
sizeof(
size), 1, ftmp);
450 for (int32_t
i = 0;
i < 9;
i++) {
451 mAnimateVectors[
i].resize(
size);
452 retval += fread(mAnimateVectors[
i].
data(),
sizeof(mAnimateVectors[
i][0]),
size, ftmp);
454 mAnimateConfig.resize(
size);
455 retval += fread(mAnimateConfig.data(),
sizeof(mAnimateConfig[0]),
size, ftmp);
460 GPUError(
"Error opening file");
462 SetInfo(
"Animation path loaded from file %s",
"glanimation.tmp");
463 }
else if (
key ==
'h') {
464 if (mPrintInfoTextAlways) {
465 mPrintInfoTextAlways =
false;
466 SetInfo(
"Showing help text disabled", 1);
468 mPrintInfoTextAlways =
true;
469 mInfoHelpTimer.
Reset();
470 SetInfo(
"Showing help text until disabled", 1);
473 SetInfo(
"Showing help text", 1);
475 }
else if (
key ==
'q') {
477 SetInfo(
"Stopping GUI", 1);
480 SetInfo(
"Starting GUI", 1);
492 if (memcmp((
void*)&oldCfgH, (
void*)&mCfgH,
sizeof(mCfgH)) != 0) {
493 mUpdateEventData =
true;
495 if (memcmp((
void*)&oldCfgL, (
void*)&mCfgL,
sizeof(mCfgL)) != 0 || memcmp((
void*)&oldCfgR, (
void*)&mCfgR,
sizeof(mCfgR)) != 0) {
496 mUpdateDrawCommands =
true;
498 if (oldCfgR.drawQualityMSAA != mCfgR.drawQualityMSAA || oldCfgR.drawQualityDownsampleFSAA != mCfgR.drawQualityDownsampleFSAA || oldCfgL.depthBuffer != mCfgL.depthBuffer || oldCfgR.screenshotScaleFactor != mCfgR.screenshotScaleFactor) {
499 mUpdateRenderPipeline =
true;
502 if (oldCfgR.drawQualityVSync != mCfgR.drawQualityVSync) {
503 mFrontend->
SetVSync(mCfgR.drawQualityVSync);
504 mBackend->SetVSync(mCfgR.drawQualityVSync);
506 if (oldCfgR.fullScreen != mCfgR.fullScreen) {
509 if (oldCfgR.maximized != mCfgR.maximized) {
512 if (oldCfgR.maxFPSRate != mCfgR.maxFPSRate) {
515 if (oldCfgR.useGLIndirectDraw != mCfgR.useGLIndirectDraw) {
516 mUpdateEventData =
true;