llviewerwindow.h
上传用户:king477883
上传日期:2021-03-01
资源大小:9553k
文件大小:19k
源码类别:

游戏引擎

开发平台:

C++ Builder

  1. /** 
  2.  * @file llviewerwindow.h
  3.  * @brief Description of the LLViewerWindow class.
  4.  *
  5.  * $LicenseInfo:firstyear=2001&license=viewergpl$
  6.  * 
  7.  * Copyright (c) 2001-2010, 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 "v3dmath.h"
  43. #include "v2math.h"
  44. #include "llwindowcallbacks.h"
  45. #include "lltimer.h"
  46. #include "llstat.h"
  47. #include "llmousehandler.h"
  48. #include "llcursortypes.h"
  49. #include "llhandle.h"
  50. #include "llimage.h"
  51. #include <boost/function.hpp>
  52. #include <boost/signals2.hpp>
  53. #include <boost/scoped_ptr.hpp>
  54. class LLView;
  55. class LLViewerObject;
  56. class LLUUID;
  57. class LLProgressView;
  58. class LLTool;
  59. class LLVelocityBar;
  60. class LLPanel;
  61. class LLImageRaw;
  62. class LLHUDIcon;
  63. class LLWindow;
  64. class LLRootView;
  65. class LLViewerWindowListener;
  66. #define PICK_HALF_WIDTH 5
  67. #define PICK_DIAMETER (2 * PICK_HALF_WIDTH + 1)
  68. class LLPickInfo
  69. {
  70. public:
  71. typedef enum
  72. {
  73. PICK_OBJECT,
  74. PICK_FLORA,
  75. PICK_LAND,
  76. PICK_ICON,
  77. PICK_PARCEL_WALL,
  78. PICK_INVALID
  79. } EPickType;
  80. public:
  81. LLPickInfo();
  82. LLPickInfo(const LLCoordGL& mouse_pos, 
  83. MASK keyboard_mask, 
  84. BOOL pick_transparent, 
  85. BOOL pick_surface_info,
  86. void (*pick_callback)(const LLPickInfo& pick_info));
  87. void fetchResults();
  88. LLPointer<LLViewerObject> getObject() const;
  89. LLUUID getObjectID() const { return mObjectID; }
  90. bool isValid() const { return mPickType != PICK_INVALID; }
  91. static bool isFlora(LLViewerObject* object);
  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. S32 mObjectFace;
  102. LLHUDIcon* mHUDIcon;
  103. LLVector3       mIntersection;
  104. LLVector2 mUVCoords;
  105. LLVector2       mSTCoords;
  106. LLCoordScreen mXYCoords;
  107. LLVector3 mNormal;
  108. LLVector3 mBinormal;
  109. BOOL mPickTransparent;
  110. void     getSurfaceInfo();
  111. private:
  112. void updateXYCoords();
  113. BOOL mWantSurfaceInfo;   // do we populate mUVCoord, mNormal, mBinormal?
  114. };
  115. static const U32 MAX_SNAPSHOT_IMAGE_SIZE = 6 * 1024; // max snapshot image size 6144 * 6144
  116. class LLViewerWindow : public LLWindowCallbacks
  117. {
  118. public:
  119. //
  120. // CREATORS
  121. //
  122. LLViewerWindow(const std::string& title, const std::string& name, S32 x, S32 y, S32 width, S32 height, BOOL fullscreen, BOOL ignore_pixel_depth);
  123. virtual ~LLViewerWindow();
  124. void shutdownViews();
  125. void shutdownGL();
  126. void initGLDefaults();
  127. void initBase();
  128. void adjustRectanglesForFirstUse(const LLRect& window);
  129. void            adjustControlRectanglesForFirstUse(const LLRect& window);
  130. void initWorldUI();
  131. BOOL handleAnyMouseClick(LLWindow *window,  LLCoordGL pos, MASK mask, LLMouseHandler::EClickType clicktype, BOOL down);
  132. //
  133. // LLWindowCallback interface implementation
  134. //
  135. /*virtual*/ BOOL handleTranslatedKeyDown(KEY key,  MASK mask, BOOL repeated);
  136. /*virtual*/ BOOL handleTranslatedKeyUp(KEY key,  MASK mask);
  137. /*virtual*/ void handleScanKey(KEY key, BOOL key_down, BOOL key_up, BOOL key_level);
  138. /*virtual*/ BOOL handleUnicodeChar(llwchar uni_char, MASK mask); // NOT going to handle extended 
  139. /*virtual*/ BOOL handleMouseDown(LLWindow *window,  LLCoordGL pos, MASK mask);
  140. /*virtual*/ BOOL handleMouseUp(LLWindow *window,  LLCoordGL pos, MASK mask);
  141. /*virtual*/ BOOL handleCloseRequest(LLWindow *window);
  142. /*virtual*/ void handleQuit(LLWindow *window);
  143. /*virtual*/ BOOL handleRightMouseDown(LLWindow *window,  LLCoordGL pos, MASK mask);
  144. /*virtual*/ BOOL handleRightMouseUp(LLWindow *window,  LLCoordGL pos, MASK mask);
  145. /*virtual*/ BOOL handleMiddleMouseDown(LLWindow *window,  LLCoordGL pos, MASK mask);
  146. /*virtual*/ BOOL handleMiddleMouseUp(LLWindow *window,  LLCoordGL pos, MASK mask);
  147. /*virtual*/ LLWindowCallbacks::DragNDropResult handleDragNDrop(LLWindow *window, LLCoordGL pos, MASK mask, LLWindowCallbacks::DragNDropAction action, std::string data);
  148. void handleMouseMove(LLWindow *window,  LLCoordGL pos, MASK mask);
  149. /*virtual*/ void handleMouseLeave(LLWindow *window);
  150. /*virtual*/ void handleResize(LLWindow *window,  S32 x,  S32 y);
  151. /*virtual*/ void handleFocus(LLWindow *window);
  152. /*virtual*/ void handleFocusLost(LLWindow *window);
  153. /*virtual*/ BOOL handleActivate(LLWindow *window, BOOL activated);
  154. /*virtual*/ BOOL handleActivateApp(LLWindow *window, BOOL activating);
  155. /*virtual*/ void handleMenuSelect(LLWindow *window,  S32 menu_item);
  156. /*virtual*/ BOOL handlePaint(LLWindow *window,  S32 x,  S32 y,  S32 width,  S32 height);
  157. /*virtual*/ void handleScrollWheel(LLWindow *window,  S32 clicks);
  158. /*virtual*/ BOOL handleDoubleClick(LLWindow *window,  LLCoordGL pos, MASK mask);
  159. /*virtual*/ void handleWindowBlock(LLWindow *window);
  160. /*virtual*/ void handleWindowUnblock(LLWindow *window);
  161. /*virtual*/ void handleDataCopy(LLWindow *window, S32 data_type, void *data);
  162. /*virtual*/ BOOL handleTimerEvent(LLWindow *window);
  163. /*virtual*/ BOOL handleDeviceChange(LLWindow *window);
  164. /*virtual*/ void handlePingWatchdog(LLWindow *window, const char * msg);
  165. /*virtual*/ void handlePauseWatchdog(LLWindow *window);
  166. /*virtual*/ void handleResumeWatchdog(LLWindow *window);
  167. /*virtual*/ std::string translateString(const char* tag);
  168. /*virtual*/ std::string translateString(const char* tag,
  169. const std::map<std::string, std::string>& args);
  170. // signal on bottom tray width changed
  171. typedef boost::function<void (void)> bottom_tray_callback_t;
  172. typedef boost::signals2::signal<void (void)> bottom_tray_signal_t;
  173. bottom_tray_signal_t mOnBottomTrayWidthChanged;
  174. boost::signals2::connection setOnBottomTrayWidthChanged(bottom_tray_callback_t cb) { return mOnBottomTrayWidthChanged.connect(cb); }
  175. // signal on update of WorldView rect
  176. typedef boost::function<void (LLRect old_world_rect, LLRect new_world_rect)> world_rect_callback_t;
  177. typedef boost::signals2::signal<void (LLRect old_world_rect, LLRect new_world_rect)> world_rect_signal_t;
  178. world_rect_signal_t mOnWorldViewRectUpdated;
  179. boost::signals2::connection setOnWorldViewRectUpdated(world_rect_callback_t cb) { return mOnWorldViewRectUpdated.connect(cb); }
  180. //
  181. // ACCESSORS
  182. //
  183. LLRootView* getRootView() const;
  184. // 3D world area in scaled pixels (via UI scale), use for most UI computations
  185. LLRect getWorldViewRectScaled() const;
  186. S32 getWorldViewHeightScaled() const;
  187. S32 getWorldViewWidthScaled() const;
  188. // 3D world area, in raw unscaled pixels
  189. LLRect getWorldViewRectRaw() const { return mWorldViewRectRaw; }
  190. S32  getWorldViewHeightRaw() const;
  191. S32  getWorldViewWidthRaw() const;
  192. // Window in scaled pixels (via UI scale), use for most UI computations
  193. LLRect getWindowRectScaled() const { return mWindowRectScaled; }
  194. S32 getWindowHeightScaled() const;
  195. S32 getWindowWidthScaled() const;
  196. // Window in raw pixels as seen on screen.
  197. LLRect getWindowRectRaw() const { return mWindowRectRaw; }
  198. S32 getWindowHeightRaw() const;
  199. S32 getWindowWidthRaw() const;
  200. LLWindow* getWindow() const { return mWindow; }
  201. void* getPlatformWindow() const;
  202. void* getMediaWindow()  const;
  203. void focusClient() const;
  204. LLCoordGL getLastMouse() const { return mLastMousePoint; }
  205. S32 getLastMouseX() const { return mLastMousePoint.mX; }
  206. S32 getLastMouseY() const { return mLastMousePoint.mY; }
  207. LLCoordGL getCurrentMouse() const { return mCurrentMousePoint; }
  208. S32 getCurrentMouseX() const { return mCurrentMousePoint.mX; }
  209. S32 getCurrentMouseY() const { return mCurrentMousePoint.mY; }
  210. S32 getCurrentMouseDX() const { return mCurrentMouseDelta.mX; }
  211. S32 getCurrentMouseDY() const { return mCurrentMouseDelta.mY; }
  212. LLCoordGL getCurrentMouseDelta() const { return mCurrentMouseDelta; }
  213. LLStat * getMouseVelocityStat() { return &mMouseVelocityStat; }
  214. BOOL getLeftMouseDown() const { return mLeftMouseDown; }
  215. BOOL getMiddleMouseDown() const { return mMiddleMouseDown; }
  216. BOOL getRightMouseDown() const { return mRightMouseDown; }
  217. const LLPickInfo& getLastPick() const { return mLastPick; }
  218. void setup2DViewport(S32 x_offset = 0, S32 y_offset = 0);
  219. void setup3DViewport(S32 x_offset = 0, S32 y_offset = 0);
  220. void setup3DRender();
  221. void setup2DRender();
  222. LLVector3 mouseDirectionGlobal(const S32 x, const S32 y) const;
  223. LLVector3 mouseDirectionCamera(const S32 x, const S32 y) const;
  224. LLVector3       mousePointHUD(const S32 x, const S32 y) const;
  225. // Is window of our application frontmost?
  226. BOOL getActive() const { return mActive; }
  227. void getTargetWindow(BOOL& fullscreen, S32& width, S32& height) const;
  228. // The 'target' is where the user wants the window to be. It may not be
  229. // there yet, because we may be supressing fullscreen prior to login.
  230. const std::string& getInitAlert() { return mInitAlert; }
  231. //
  232. // MANIPULATORS
  233. //
  234. void saveLastMouse(const LLCoordGL &point);
  235. void setCursor( ECursorType c );
  236. void showCursor();
  237. void hideCursor();
  238. BOOL            getCursorHidden() { return mCursorHidden; }
  239. void moveCursorToCenter(); // move to center of window
  240. void setShowProgress(const BOOL show);
  241. BOOL getShowProgress() const;
  242. void moveProgressViewToFront();
  243. void setProgressString(const std::string& string);
  244. void setProgressPercent(const F32 percent);
  245. void setProgressMessage(const std::string& msg);
  246. void setProgressCancelButtonVisible( BOOL b, const std::string& label = LLStringUtil::null );
  247. LLProgressView *getProgressView() const;
  248. void updateObjectUnderCursor();
  249. void updateUI(); // Once per frame, update UI based on mouse position, calls following update* functions
  250. void updateLayout();
  251. void updateMouseDelta();
  252. void updateKeyboardFocus();
  253. void updateWorldViewRect(bool use_full_window=false);
  254. LLView* getNonSideTrayView() { return mNonSideTrayView.get(); }
  255. LLView* getFloaterViewHolder() { return mFloaterViewHolder.get(); }
  256. BOOL handleKey(KEY key, MASK mask);
  257. void handleScrollWheel (S32 clicks);
  258. // Hide normal UI when a logon fails, re-show everything when logon is attempted again
  259. void setNormalControlsVisible( BOOL visible );
  260. void setMenuBackgroundColor(bool god_mode = false, bool dev_grid = false);
  261. void reshape(S32 width, S32 height);
  262. void sendShapeToSim();
  263. void draw();
  264. void updateDebugText();
  265. void drawDebugText();
  266. static void loadUserImage(void **cb_data, const LLUUID &uuid);
  267. static void movieSize(S32 new_width, S32 new_height);
  268. // snapshot functionality.
  269. // perhaps some of this should move to llfloatershapshot?  -MG
  270. typedef enum
  271. {
  272. SNAPSHOT_TYPE_COLOR,
  273. SNAPSHOT_TYPE_DEPTH,
  274. SNAPSHOT_TYPE_OBJECT_ID
  275. } ESnapshotType;
  276. BOOL saveSnapshot(const std::string&  filename, S32 image_width, S32 image_height, BOOL show_ui = TRUE, BOOL do_rebuild = FALSE, ESnapshotType type = SNAPSHOT_TYPE_COLOR);
  277. BOOL rawSnapshot(LLImageRaw *raw, S32 image_width, S32 image_height, BOOL keep_window_aspect = TRUE, BOOL is_texture = FALSE,
  278. BOOL show_ui = TRUE, BOOL do_rebuild = FALSE, ESnapshotType type = SNAPSHOT_TYPE_COLOR, S32 max_size = MAX_SNAPSHOT_IMAGE_SIZE );
  279. BOOL thumbnailSnapshot(LLImageRaw *raw, S32 preview_width, S32 preview_height, BOOL show_ui, BOOL do_rebuild, ESnapshotType type) ;
  280. BOOL isSnapshotLocSet() const { return ! sSnapshotDir.empty(); }
  281. void resetSnapshotLoc() const { sSnapshotDir.clear(); }
  282. BOOL     saveImageNumbered(LLImageFormatted *image);
  283. // Reset the directory where snapshots are saved.
  284. // Client will open directory picker on next snapshot save.
  285. void resetSnapshotLoc();
  286. void playSnapshotAnimAndSound();
  287. // draws selection boxes around selected objects, must call displayObjects first
  288. void renderSelections( BOOL for_gl_pick, BOOL pick_parcel_walls, BOOL for_hud );
  289. void performPick();
  290. void returnEmptyPicks();
  291. void pickAsync(S32 x, S32 y_from_bot, MASK mask, void (*callback)(const LLPickInfo& pick_info), BOOL pick_transparent = FALSE);
  292. LLPickInfo pickImmediate(S32 x, S32 y, BOOL pick_transparent);
  293. LLHUDIcon* cursorIntersectIcon(S32 mouse_x, S32 mouse_y, F32 depth,
  294.    LLVector3* intersection);
  295. LLViewerObject* cursorIntersect(S32 mouse_x = -1, S32 mouse_y = -1, F32 depth = 512.f,
  296. LLViewerObject *this_object = NULL,
  297. S32 this_face = -1,
  298. BOOL pick_transparent = FALSE,
  299. S32* face_hit = NULL,
  300. LLVector3 *intersection = NULL,
  301. LLVector2 *uv = NULL,
  302. LLVector3 *normal = NULL,
  303. LLVector3 *binormal = NULL);
  304. // Returns a pointer to the last object hit
  305. //LLViewerObject *getObject();
  306. //LLViewerObject  *lastNonFloraObjectHit();
  307. //const LLVector3d& getObjectOffset();
  308. //const LLVector3d& lastNonFloraObjectHitOffset();
  309. // mousePointOnLand() returns true if found point
  310. BOOL mousePointOnLandGlobal(const S32 x, const S32 y, LLVector3d *land_pos_global);
  311. BOOL mousePointOnPlaneGlobal(LLVector3d& point, const S32 x, const S32 y, const LLVector3d &plane_point, const LLVector3 &plane_normal);
  312. LLVector3d clickPointInWorldGlobal(const S32 x, const S32 y_from_bot, LLViewerObject* clicked_object) const;
  313. BOOL clickPointOnSurfaceGlobal(const S32 x, const S32 y, LLViewerObject *objectp, LLVector3d &point_global) const;
  314. // Prints window implementation details
  315. void dumpState();
  316. // Request display setting changes
  317. void toggleFullscreen(BOOL show_progress);
  318. // handle shutting down GL and bringing it back up
  319. void requestResolutionUpdate(bool fullscreen_checked);
  320. void requestResolutionUpdate(); // doesn't affect fullscreen
  321. BOOL checkSettings();
  322. void restartDisplay(BOOL show_progress_bar);
  323. BOOL changeDisplaySettings(BOOL fullscreen, LLCoordScreen size, BOOL disable_vsync, BOOL show_progress_bar);
  324. BOOL getIgnoreDestroyWindow() { return mIgnoreActivate; }
  325. F32 getDisplayAspectRatio() const;
  326. F32 getWorldViewAspectRatio() const;
  327. const LLVector2& getDisplayScale() const { return mDisplayScale; }
  328. void calcDisplayScale();
  329. static LLRect  calcScaledRect(const LLRect & rect, const LLVector2& display_scale);
  330. private:
  331. bool                    shouldShowToolTipFor(LLMouseHandler *mh);
  332. static bool onAlert(const LLSD& notify);
  333. void switchToolByMask(MASK mask);
  334. void destroyWindow();
  335. void drawMouselookInstructions();
  336. void stopGL(BOOL save_state = TRUE);
  337. void restoreGL(const std::string& progress_message = LLStringUtil::null);
  338. void initFonts(F32 zoom_factor = 1.f);
  339. void schedulePick(LLPickInfo& pick_info);
  340. S32 getChatConsoleBottomPad(); // Vertical padding for child console rect, varied by bottom clutter
  341. LLRect getChatConsoleRect(); // Get optimal cosole rect.
  342. public:
  343. LLWindow* mWindow; // graphical window object
  344. protected:
  345. BOOL mActive;
  346. BOOL mWantFullscreen;
  347. BOOL mShowFullscreenProgress;
  348. LLRect mWindowRectRaw; // whole window, including UI
  349. LLRect mWindowRectScaled; // whole window, scaled by UI size
  350. LLRect mWorldViewRectRaw; // area of screen for 3D world
  351. LLRect mWorldViewRectScaled; // area of screen for 3D world scaled by UI size
  352. LLRootView* mRootView; // a view of size mWindowRectRaw, containing all child views
  353. LLVector2 mDisplayScale;
  354. LLCoordGL mCurrentMousePoint; // last mouse position in GL coords
  355. LLCoordGL mLastMousePoint; // Mouse point at last frame.
  356. LLCoordGL mCurrentMouseDelta; //amount mouse moved this frame
  357. LLStat mMouseVelocityStat;
  358. BOOL mLeftMouseDown;
  359. BOOL mMiddleMouseDown;
  360. BOOL mRightMouseDown;
  361. LLProgressView *mProgressView;
  362. LLFrameTimer mToolTipFadeTimer;
  363. LLPanel* mToolTip;
  364. std::string mLastToolTipMessage;
  365. LLRect mToolTipStickyRect; // Once a tool tip is shown, it will stay visible until the mouse leaves this rect.
  366. BOOL mMouseInWindow; // True if the mouse is over our window or if we have captured the mouse.
  367. BOOL mFocusCycleMode;
  368. typedef std::set<LLHandle<LLView> > view_handle_set_t;
  369. view_handle_set_t mMouseHoverViews;
  370. // Variables used for tool override switching based on modifier keys.  JC
  371. MASK mLastMask; // used to detect changes in modifier mask
  372. LLTool* mToolStored; // the tool we're overriding
  373. BOOL mHideCursorPermanent; // true during drags, mouselook
  374. BOOL            mCursorHidden;
  375. LLPickInfo mLastPick;
  376. std::vector<LLPickInfo> mPicks;
  377. LLRect mPickScreenRegion; // area of frame buffer for rendering pick frames (generally follows mouse to avoid going offscreen)
  378. LLTimer         mPickTimer;        // timer for scheduling n picks per second
  379. std::string mOverlayTitle; // Used for special titles such as "Second Life - Special E3 2003 Beta"
  380. BOOL mIgnoreActivate;
  381. std::string mInitAlert; // Window / GL initialization requires an alert
  382. LLHandle<LLView> mWorldViewPlaceholder; // widget that spans the portion of screen dedicated to rendering the 3d world
  383. LLHandle<LLView> mNonSideTrayView; // parent of world view + bottom bar, etc...everything but the side tray
  384. LLHandle<LLView> mFloaterViewHolder; // container for floater_view
  385. class LLDebugText* mDebugText; // Internal class for debug text
  386. bool mResDirty;
  387. bool mStatesDirty;
  388. bool mIsFullscreenChecked; // Did the user check the fullscreen checkbox in the display settings
  389. U32 mCurrResolutionIndex;
  390.     boost::scoped_ptr<LLViewerWindowListener> mViewerWindowListener;
  391. protected:
  392. static std::string sSnapshotBaseName;
  393. static std::string sSnapshotDir;
  394. static std::string sMovieBaseName;
  395. private:
  396. // Object temporarily hovered over while dragging
  397. LLPointer<LLViewerObject> mDragHoveredObject;
  398. };
  399. void toggle_flying(void*);
  400. void toggle_first_person();
  401. void toggle_build(void*);
  402. void reset_viewer_state_on_sim(void);
  403. void update_saved_window_size(const std::string& control,S32 delta_width, S32 delta_height);
  404. //
  405. // Globals
  406. //
  407. extern LLViewerWindow* gViewerWindow;
  408. extern LLFrameTimer gAwayTimer; // tracks time before setting the avatar away state to true
  409. extern LLFrameTimer gAwayTriggerTimer; // how long the avatar has been away
  410. extern LLViewerObject*  gDebugRaycastObject;
  411. extern LLVector3        gDebugRaycastIntersection;
  412. extern LLVector2        gDebugRaycastTexCoord;
  413. extern LLVector3        gDebugRaycastNormal;
  414. extern LLVector3        gDebugRaycastBinormal;
  415. extern S32 gDebugRaycastFaceHit;
  416. extern S32 CHAT_BAR_HEIGHT; 
  417. extern BOOL gDisplayCameraPos;
  418. extern BOOL gDisplayWindInfo;
  419. extern BOOL gDisplayFOV;
  420. extern BOOL gDisplayBadge;
  421. #endif