llviewerwindow.h 18 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254255256257258259260261262263264265266267268269270271272273274275276277278279280281282283284285286287288289290291292293294295296297298299300301302303304305306307308309310311312313314315316317318319320321322323324325326327328329330331332333334335336337338339340341342343344345346347348349350351352353354355356357358359360361362363364365366367368369370371372373374375376377378379380381382383384385386387388389390391392393394395396397398399400401402403404405406407408409410411412413414415416417418419420421422423424425426427428429430431432433434435436437438439440441442443444445446447448449450451452453454455456457458459460461462463464465466467468469470471472473474475476477478479480481482483484485486487488489490491492493494495496497498499500501502503504505506507508509510511512513514515516517518519520521522523524525526527528529530531532533534535536537538539540541542543544545546547548549550551552553554555556557558559560561562563564565566567568569570571572573574575576577578579580581582583584585586587588589
  1. /**
  2. * @file llviewerwindow.h
  3. * @brief Description of the LLViewerWindow class.
  4. *
  5. * $LicenseInfo:firstyear=2001&license=viewergpl$
  6. *
  7. * Copyright (c) 2001-2009, Linden Research, Inc.
  8. *
  9. * Second Life Viewer Source Code
  10. * The source code in this file ("Source Code") is provided by Linden Lab
  11. * to you under the terms of the GNU General Public License, version 2.0
  12. * ("GPL"), unless you have obtained a separate licensing agreement
  13. * ("Other License"), formally executed by you and Linden Lab. Terms of
  14. * the GPL can be found in doc/GPL-license.txt in this distribution, or
  15. * online at http://secondlifegrid.net/programs/open_source/licensing/gplv2
  16. *
  17. * There are special exceptions to the terms and conditions of the GPL as
  18. * it is applied to this Source Code. View the full text of the exception
  19. * in the file doc/FLOSS-exception.txt in this software distribution, or
  20. * online at
  21. * http://secondlifegrid.net/programs/open_source/licensing/flossexception
  22. *
  23. * By copying, modifying or distributing this software, you acknowledge
  24. * that you have read and understood your obligations described above,
  25. * and agree to abide by those obligations.
  26. *
  27. * ALL LINDEN LAB SOURCE CODE IS PROVIDED "AS IS." LINDEN LAB MAKES NO
  28. * WARRANTIES, EXPRESS, IMPLIED OR OTHERWISE, REGARDING ITS ACCURACY,
  29. * COMPLETENESS OR PERFORMANCE.
  30. * $/LicenseInfo$
  31. */
  32. //
  33. // A note about X,Y coordinates:
  34. //
  35. // X coordinates are in pixels, from the left edge of the window client area
  36. // Y coordinates are in pixels, from the BOTTOM edge of the window client area
  37. //
  38. // The Y coordinates therefore match OpenGL window coords, not Windows(tm) window coords.
  39. // If Y is from the top, the variable will be called "y_from_top"
  40. #ifndef LL_LLVIEWERWINDOW_H
  41. #define LL_LLVIEWERWINDOW_H
  42. #include "llalertdialog.h"
  43. #include "llmousehandler.h"
  44. #include "llnotifications.h"
  45. #include "llrect.h"
  46. #include "llstat.h"
  47. #include "lltimer.h"
  48. #include "llwindow.h"
  49. #include "llvector2.h"
  50. #include "llvector3d.h"
  51. #include "llprogressview.h"
  52. class LLCubeMapArray;
  53. class LLDebugText;
  54. class LLHUDIcon;
  55. class LLImageRaw;
  56. class LLTextBox;
  57. class LLTool;
  58. class LLUUID;
  59. class LLVelocityBar;
  60. class LLView;
  61. class LLViewerObject;
  62. class LLVOPartGroup;
  63. #define PICK_HALF_WIDTH 5
  64. #define PICK_DIAMETER (2 * PICK_HALF_WIDTH + 1)
  65. class LLPickInfo
  66. {
  67. public:
  68. LLPickInfo();
  69. LLPickInfo(const LLCoordGL& mouse_pos,
  70. MASK keyboard_mask,
  71. bool pick_transparent,
  72. bool pick_rigged,
  73. bool pick_particle,
  74. bool pick_surface_info,
  75. void (*pick_callback)(const LLPickInfo&));
  76. void fetchResults();
  77. LLPointer<LLViewerObject> getObject() const;
  78. LL_INLINE LLUUID getObjectID() const { return mObjectID; }
  79. void getSurfaceInfo();
  80. static bool isFlora(LLViewerObject* object);
  81. typedef enum
  82. {
  83. PICK_OBJECT,
  84. PICK_FLORA,
  85. PICK_LAND,
  86. PICK_ICON,
  87. PICK_PARCEL_WALL,
  88. PICK_INVALID
  89. } EPickType;
  90. private:
  91. void updateXYCoords();
  92. public:
  93. LLCoordGL mMousePt;
  94. MASK mKeyMask;
  95. void (*mPickCallback)(const LLPickInfo& pick_info);
  96. EPickType mPickType;
  97. LLCoordGL mPickPt;
  98. LLVector3d mPosGlobal;
  99. LLVector3 mObjectOffset;
  100. LLUUID mObjectID;
  101. LLUUID mParticleOwnerID;
  102. LLUUID mParticleSourceID;
  103. S32 mObjectFace;
  104. S32 mGLTFNodeIndex;
  105. S32 mGLTFPrimIndex;
  106. LLHUDIcon* mHUDIcon;
  107. LLVector3 mIntersection;
  108. LLVector2 mUVCoords;
  109. LLVector2 mSTCoords;
  110. LLCoordScreen mXYCoords;
  111. LLVector3 mNormal;
  112. LLVector4 mTangent;
  113. LLVector3 mBinormal;
  114. bool mPickTransparent;
  115. bool mPickRigged;
  116. bool mPickParticle;
  117. private:
  118. // Do we populate mUVCoord, mNormal, mBinormal ?
  119. bool mWantSurfaceInfo;
  120. };
  121. // Max snapshot image size = square of 6144 * 6144 pixels
  122. constexpr S32 MAX_SNAPSHOT_IMAGE_SIZE = 6 * 1024;
  123. class LLViewerWindow final : public LLWindowCallbacks
  124. {
  125. protected:
  126. LOG_CLASS(LLViewerWindow);
  127. public:
  128. LLViewerWindow(const std::string& title, S32 x, S32 y, U32 width,
  129. U32 height, bool fullscreen);
  130. ~LLViewerWindow() override;
  131. void shutdownViews();
  132. void shutdownGL();
  133. void initGLDefaults();
  134. void initBase();
  135. void adjustRectanglesForFirstUse();
  136. void initWorldUI();
  137. //
  138. // LLWindowCallback interface implementation
  139. //
  140. bool handleTranslatedKeyDown(KEY key, MASK mask, bool repeat) override;
  141. bool handleTranslatedKeyUp(KEY key, MASK mask) override;
  142. void handleScanKey(KEY key, bool down, bool up, bool level) override;
  143. // NOT going to handle extended:
  144. bool handleUnicodeChar(llwchar uni_char, MASK mask) override;
  145. bool handleAnyMouseClick(LLWindow* window, LLCoordGL pos, MASK mask,
  146. LLMouseHandler::EClickType clicktype,
  147. bool down);
  148. bool handleMouseDown(LLWindow* window, LLCoordGL pos, MASK mask) override;
  149. bool handleMouseUp(LLWindow* window, LLCoordGL pos, MASK mask) override;
  150. bool handleRightMouseDown(LLWindow* wn, LLCoordGL pos, MASK mask) override;
  151. bool handleRightMouseUp(LLWindow* wn, LLCoordGL pos, MASK mask) override;
  152. bool handleMiddleMouseDown(LLWindow* w, LLCoordGL pos, MASK mask) override;
  153. bool handleMiddleMouseUp(LLWindow* win, LLCoordGL pos, MASK mask) override;
  154. void handleMouseMove(LLWindow* window, LLCoordGL pos, MASK mask) override;
  155. void handleMouseLeave(LLWindow* window) override;
  156. #if LL_DARWIN
  157. void handleMouseDragged(LLWindow* win, LLCoordGL pos, MASK mask) override;
  158. #endif
  159. bool handleCloseRequest(LLWindow* window) override;
  160. void handleQuit(LLWindow* window) override;
  161. void handleResize(LLWindow* window, S32 x, S32 y) override;
  162. void handleFocus(LLWindow* window) override;
  163. void handleFocusLost(LLWindow* window) override;
  164. bool handleActivate(LLWindow* window, bool activated) override;
  165. bool handleActivateApp(LLWindow* window, bool activating) override;
  166. void handleMenuSelect(LLWindow* window, S32 menu_item) override;
  167. bool handlePaint(LLWindow* w, S32 x, S32 y, S32 wdth, S32 hght) override;
  168. void handleScrollWheel(LLWindow* window, S32 clicks) override;
  169. bool handleDoubleClick(LLWindow* win, LLCoordGL pos, MASK mask) override;
  170. void handleWindowBlock(LLWindow* window) override;
  171. void handleWindowUnblock(LLWindow* window) override;
  172. void handleDataCopy(LLWindow* window, S32 data_type, void* data) override;
  173. #if LL_WINDOWS // Not used for now under Linux and macOS...
  174. bool handleTimerEvent(LLWindow* window) override;
  175. bool handleDeviceChange(LLWindow* window) override;
  176. bool handleDPIChanged(LLWindow* window, F32 ui_scale_factor,
  177. S32 window_width, S32 window_height) override;
  178. #endif
  179. bool handleWindowDidChangeScreen(LLWindow* window) override;
  180. // ACCESSORS
  181. //
  182. LL_INLINE LLView* getRootView() const { return mRootView; }
  183. // Window in raw pixels as seen on screen.
  184. LL_INLINE const LLRect& getWindowRect() const { return mWindowRect; };
  185. LL_INLINE S32 getWindowDisplayHeight() const { return mWindowRect.getHeight(); }
  186. LL_INLINE S32 getWindowDisplayWidth() const { return mWindowRect.getWidth(); }
  187. // Window in scaled pixels (via UI scale), use this for UI elements
  188. // checking size:
  189. LL_INLINE const LLRect& getVirtualWindowRect() const
  190. {
  191. return mVirtualWindowRect;
  192. }
  193. LL_INLINE S32 getWindowHeight() const { return mVirtualWindowRect.getHeight(); }
  194. LL_INLINE S32 getWindowWidth() const { return mVirtualWindowRect.getWidth(); }
  195. LL_INLINE void* getPlatformWindow() const { return gWindowp->getPlatformWindow(); }
  196. LL_INLINE void focusClient() const { return gWindowp->focusClient(); };
  197. LL_INLINE LLCoordGL getLastMouse() const { return mLastMousePoint; }
  198. LL_INLINE S32 getLastMouseX() const { return mLastMousePoint.mX; }
  199. LL_INLINE S32 getLastMouseY() const { return mLastMousePoint.mY; }
  200. LL_INLINE LLCoordGL getCurrentMouse() const { return mCurrentMousePoint; }
  201. LL_INLINE S32 getCurrentMouseX() const { return mCurrentMousePoint.mX; }
  202. LL_INLINE S32 getCurrentMouseY() const { return mCurrentMousePoint.mY; }
  203. LL_INLINE S32 getCurrentMouseDX() const { return mCurrentMouseDelta.mX; }
  204. LL_INLINE S32 getCurrentMouseDY() const { return mCurrentMouseDelta.mY; }
  205. LL_INLINE LLCoordGL getCurrentMouseDelta() const { return mCurrentMouseDelta; }
  206. LL_INLINE bool getLeftMouseDown() const { return mLeftMouseDown; }
  207. LL_INLINE bool getMiddleMouseDown() const { return mMiddleMouseDown; }
  208. LL_INLINE bool getRightMouseDown() const { return mRightMouseDown; }
  209. LL_INLINE static const LLStat& getMouseVelocityStat()
  210. {
  211. return sMouseVelocityStat;
  212. }
  213. LL_INLINE const LLPickInfo& getLastPick() const { return mLastPick; }
  214. LL_INLINE const LLPickInfo& getHoverPick() const { return mHoverPick; }
  215. void setupViewport(S32 x_offset = 0, S32 y_offset = 0);
  216. void setup3DRender();
  217. void setup2DRender();
  218. LLVector3 mouseDirectionGlobal(S32 x, S32 y) const;
  219. LLVector3 mouseDirectionCamera(S32 x, S32 y) const;
  220. LLVector3 mousePointHUD(S32 x, S32 y) const;
  221. // Is window of our application frontmost ?
  222. LL_INLINE bool getActive() const { return mActive; }
  223. // The "target" is the size the user wants the window to be set at, in
  224. // either full screen or windowed modes (set 'full_screen' as appropriate
  225. // to get the corresponding desired size); this is *not* always the current
  226. // window size. HB
  227. static void getTargetWindow(bool full_screen, U32& width, U32& height);
  228. LL_INLINE const std::string& getInitAlert() { return mInitAlert; }
  229. //
  230. // MANIPULATORS
  231. //
  232. void saveLastMouse(const LLCoordGL& point);
  233. void setCursor(ECursorType c);
  234. void showCursor();
  235. void hideCursor();
  236. LL_INLINE bool getCursorHidden() { return mCursorHidden; }
  237. void moveCursorToCenter(); // Move to center of window
  238. void setShowProgress(bool show);
  239. LL_INLINE bool getShowProgress() const { return mProgressView && mProgressView->getVisible(); }
  240. LL_INLINE LLProgressView* getProgressView() const { return mProgressView; }
  241. void moveProgressViewToFront();
  242. void setProgressString(const std::string& string);
  243. void setProgressPercent(F32 percent);
  244. void setProgressMessage(const std::string& msg);
  245. void setProgressCancelButtonVisible(bool show,
  246. const std::string& label =
  247. LLStringUtil::null);
  248. void updateObjectUnderCursor();
  249. // Once per frame, update UI based on mouse position
  250. bool handlePerFrameHover();
  251. bool handleKey(KEY key, MASK mask);
  252. bool handleKeyUp(KEY key, MASK mask);
  253. void handleScrollWheel(S32 clicks);
  254. // Hide normal UI when a logon fails, re-show everything when logon is
  255. // attempted again
  256. void setNormalControlsVisible(bool visible);
  257. void setMenuBackgroundColor();
  258. void reshape(S32 width, S32 height);
  259. void sendShapeToSim();
  260. void draw();
  261. void updateDebugText();
  262. void drawDebugText();
  263. static void loadUserImage(void** cb_data, const LLUUID& uuid);
  264. void resizeWindow(S32 new_width, S32 new_height);
  265. typedef enum : U32
  266. {
  267. SNAPSHOT_TYPE_COLOR,
  268. SNAPSHOT_TYPE_DEPTH
  269. } ESnapshotType;
  270. bool saveSnapshot(const std::string& filename,
  271. S32 image_width, S32 image_height,
  272. bool show_ui = true, bool do_rebuild = false,
  273. U32 type = SNAPSHOT_TYPE_COLOR);
  274. bool rawSnapshot(LLImageRaw* rawp, S32 image_width, S32 image_height,
  275. bool keep_window_aspect = true, bool is_texture = false,
  276. bool show_ui = true, bool do_rebuild = false,
  277. U32 type = SNAPSHOT_TYPE_COLOR,
  278. S32 max_size = MAX_SNAPSHOT_IMAGE_SIZE);
  279. void cubeSnapshot(const LLVector3& origin, LLCubeMapArray* cubemapp,
  280. S32 face, F32 near_clip, bool dynamic_render);
  281. bool thumbnailSnapshot(LLImageRaw* rawp, S32 width, S32 height,
  282. bool show_ui, bool do_rebuild, U32 type);
  283. LL_INLINE bool isSnapshotLocSet() const { return !sSnapshotDir.empty(); }
  284. LL_INLINE const std::string& getSnapshotBaseName() { return sSnapshotBaseName; }
  285. void setSnapshotLoc(std::string filepath);
  286. LL_INLINE void resetSnapshotLoc() const { sSnapshotDir.clear(); }
  287. bool saveImageNumbered(LLImageFormatted* image);
  288. // Reset the directory where snapshots are saved.
  289. // Client will open directory picker on next snapshot save.
  290. void resetSnapshotLoc();
  291. void playSnapshotAnimAndSound();
  292. // Draws selection boxes around selected objects, must call displayObjects
  293. // first
  294. void renderSelections(bool for_gl_pick, bool pick_parcel_walls,
  295. bool for_hud);
  296. void performPick();
  297. void returnEmptyPicks();
  298. void pickAsync(S32 x, S32 y_from_bot, MASK mask,
  299. void (*callback)(const LLPickInfo&),
  300. bool pick_transparent = false, bool pick_rigged = false,
  301. bool pick_particle = false, bool get_surface_info = false);
  302. LLPickInfo pickImmediate(S32 x, S32 y, bool pick_transparent = false);
  303. static void hoverPickCallback(const LLPickInfo& pick_info);
  304. LLHUDIcon* cursorIntersectIcon(S32 mouse_x, S32 mouse_y, F32 depth,
  305. LLVector4a* intersection);
  306. LLViewerObject* cursorIntersect(S32 mouse_x = -1, S32 mouse_y = -1,
  307. F32 depth = 512.f,
  308. LLViewerObject* this_object = NULL,
  309. S32 this_face = -1,
  310. bool pick_transparent = false,
  311. bool pick_rigged = false,
  312. S32* face_hit = NULL,
  313. S32* gltf_node_hit = NULL,
  314. S32* gltf_prim_hit = NULL,
  315. LLVector4a* intersection = NULL,
  316. LLVector2* uv = NULL,
  317. LLVector4a* normal = NULL,
  318. LLVector4a* tangent = NULL,
  319. LLVector4a* start = NULL,
  320. LLVector4a* end = NULL);
  321. bool mousePointOnLandGlobal(S32 x, S32 y, LLVector3d* land_pos_global);
  322. bool mousePointOnPlaneGlobal(LLVector3d& point, S32 x, S32 y,
  323. const LLVector3d& plane_point,
  324. const LLVector3& plane_normal);
  325. LLVector3d clickPointInWorldGlobal(S32 x, S32 y_from_bot,
  326. LLViewerObject* clicked_object) const;
  327. // Prints window implementation details
  328. void dumpState();
  329. // Handle shutting down GL and bringing it back up
  330. void requestResolutionUpdate();
  331. bool checkSettings();
  332. void restartDisplay();
  333. LL_INLINE bool getIgnoreDestroyWindow() { return mIgnoreActivate; }
  334. F32 getDisplayAspectRatio() const;
  335. LL_INLINE const LLVector2& getDisplayScale() const { return mDisplayScale; }
  336. void calcDisplayScale();
  337. LL_INLINE void resetMouselookFadeTimer() { mMouselookTipFadeTimer.reset(); }
  338. public:
  339. // Made these two public instead of private, to allow rebuilding our avatar
  340. void stopGL(bool save_state = true);
  341. void restoreGL(const std::string& progress_message = LLStringUtil::null);
  342. private:
  343. bool changeDisplaySettings(LLCoordScreen size, bool disable_vsync,
  344. bool show_progress_bar);
  345. bool shouldShowToolTipFor(LLMouseHandler* mh);
  346. static bool onAlert(const LLSD& notify);
  347. void switchToolByMask(MASK mask);
  348. void destroyWindow();
  349. void drawMouselookInstructions();
  350. void initFonts(F32 zoom_factor = 1.f);
  351. void schedulePick(LLPickInfo& pick_info);
  352. // Vertical padding for child console rect, varied by bottom clutter:
  353. S32 getChatConsoleBottomPad();
  354. // Get optimal cosole rect:
  355. LLRect getChatConsoleRect();
  356. protected:
  357. // a view of size mWindowRect, containing all child views:
  358. LLView* mRootView;
  359. LLProgressView* mProgressView;
  360. LLTextBox* mToolTip;
  361. LLTool* mToolStored; // The tool we are overriding
  362. // Internal class for debug text
  363. LLDebugText* mDebugText;
  364. U32 mCurrResolutionIndex;
  365. LLVector2 mDisplayScale;
  366. LLVector2 mDisplayScaleDivisor;
  367. LLCoordGL mCurrentMousePoint; // Last mouse position in GL coords
  368. LLCoordGL mLastMousePoint; // Mouse point at last frame.
  369. LLCoordGL mCurrentMouseDelta; // Amount mouse moved this frame
  370. LLRect mWindowRect;
  371. LLRect mVirtualWindowRect;
  372. // Once a tool tip is shown, it will stay visible until the mouse leaves
  373. // this rect;
  374. LLRect mToolTipStickyRect;
  375. // Area of frame buffer for rendering pick frames (generally follows mouse
  376. // to avoid going offscreen):
  377. LLRect mPickScreenRegion;
  378. LLPickInfo mLastPick;
  379. LLPickInfo mHoverPick;
  380. typedef std::vector<LLPickInfo> pick_info_list_t;
  381. pick_info_list_t mPicks;
  382. // Timer for scheduling n picks per second
  383. LLTimer mPickTimer;
  384. // Timer for fading exit mouselook instructions
  385. LLTimer mMouselookTipFadeTimer;
  386. // Window / GL initialization requires an alert
  387. std::string mInitAlert;
  388. // used to detect changes in modifier mask
  389. MASK mLastMask;
  390. #if LL_DARWIN
  391. LLFrameTimer mMouseDownTimer;
  392. bool mAllowMouseDragging;
  393. #endif
  394. bool mLeftMouseDown;
  395. bool mMiddleMouseDown;
  396. bool mRightMouseDown;
  397. bool mActive;
  398. // True after a key press or a mouse button event. False once the mouse
  399. // moves again:
  400. bool mToolTipBlocked;
  401. // True if the mouse is over our window or if we have captured the mouse:
  402. bool mMouseInWindow;
  403. // Sometimes hide the toolbox, despite having a camera tool selected:
  404. bool mSuppressToolbox;
  405. bool mCursorHidden;
  406. bool mIgnoreActivate;
  407. bool mResDirty;
  408. bool mStatesDirty;
  409. // Did the user check the fullscreen checkbox in the display settings:
  410. bool mIsFullscreenChecked;
  411. protected:
  412. static std::string sSnapshotBaseName;
  413. static std::string sSnapshotDir;
  414. static std::string sMovieBaseName;
  415. static LLStat sMouseVelocityStat;
  416. };
  417. class LLBottomPanel final : public LLPanel
  418. {
  419. public:
  420. LLBottomPanel(const LLRect& rect);
  421. ~LLBottomPanel() override;
  422. void setFocusIndicator(LLView* indicator);
  423. LL_INLINE LLView* getFocusIndicator() { return mIndicator; }
  424. void draw() override;
  425. protected:
  426. LLView* mIndicator;
  427. };
  428. // This class is for temporarily changing the window title, when you cannot use
  429. // a notification or draw any UI element while an operation is in progress and
  430. // the user needs to be made aware of it. It is currently only used during
  431. // shaders (re)compilation, in LLViewerShaderMgr::setShaders(). HB
  432. class HBTempWindowTitle
  433. {
  434. public:
  435. // Changes the window title for "<viewer name> - <message>".
  436. HBTempWindowTitle(const std::string& message);
  437. // Changes the window title back to its original string.
  438. ~HBTempWindowTitle();
  439. };
  440. void toggle_flying(void*);
  441. void toggle_first_person();
  442. void toggle_build(void*);
  443. void reset_viewer_state_on_sim();
  444. void update_saved_window_size(const std::string& control,
  445. S32 delta_width, S32 delta_height);
  446. //
  447. // Globals
  448. //
  449. extern LLViewerWindow* gViewerWindowp;
  450. extern LLBottomPanel* gBottomPanelp;
  451. // How long has it been since the mouse last moved ?
  452. extern LLFrameTimer gMouseIdleTimer;
  453. // Tracks time before setting the avatar away state to true
  454. extern LLFrameTimer gAwayTimer;
  455. // How long the avatar has been away
  456. extern LLFrameTimer gAwayTriggerTimer;
  457. extern LLViewerObject* gDebugRaycastObject;
  458. extern LLVector4a gDebugRaycastIntersection;
  459. extern LLVOPartGroup* gDebugRaycastParticle;
  460. extern LLVector4a gDebugRaycastParticleIntersection;
  461. extern LLVector2 gDebugRaycastTexCoord;
  462. extern LLVector4a gDebugRaycastNormal;
  463. extern LLVector4a gDebugRaycastTangent;
  464. extern S32 gDebugRaycastFaceHit;
  465. extern LLVector4a gDebugRaycastStart;
  466. extern LLVector4a gDebugRaycastEnd;
  467. extern bool gDisplayCameraPos;
  468. extern bool gDisplayWindInfo;
  469. extern bool gDisplayFOV;
  470. // Only relevant to PBR mode
  471. extern bool gSnapshotNoPost;
  472. #endif