Patch from 2010-10-20/22. Didn't apply cleanly so I redid it manually and tested/checked it. There was only one difference with imprudence: for some reason Singularity tries to see if the "teleport history" floater is visible while initializing the menu's, something that imprudence doesn't do. For the rest the patch is basically the same. Nevertheless, I left all code exactly as it was in Singularity (the only thing that this commit changes is the intend of the original patch: in debug mode, fail with an assertion when LindenUserDir is called while it is not initialized; and then fix everything to make it work again. Original commit message: The LindenUserDir (~/.imprudence/first_last/) cannot be initialized before the user logged in. However, several singletons (that only can be initialized once) depend on this directory for initialization. Therefore we have to take care not to instantiate those singletons until after the user logged in. With regard to webit, this fixes the browser_profile (cache and cookies) directory that the builtin browser uses.
490 lines
18 KiB
C++
490 lines
18 KiB
C++
/**
|
|
* @file llviewerwindow.h
|
|
* @brief Description of the LLViewerWindow class.
|
|
*
|
|
* $LicenseInfo:firstyear=2001&license=viewergpl$
|
|
*
|
|
* Copyright (c) 2001-2009, Linden Research, Inc.
|
|
*
|
|
* Second Life Viewer Source Code
|
|
* The source code in this file ("Source Code") is provided by Linden Lab
|
|
* to you under the terms of the GNU General Public License, version 2.0
|
|
* ("GPL"), unless you have obtained a separate licensing agreement
|
|
* ("Other License"), formally executed by you and Linden Lab. Terms of
|
|
* the GPL can be found in doc/GPL-license.txt in this distribution, or
|
|
* online at http://secondlifegrid.net/programs/open_source/licensing/gplv2
|
|
*
|
|
* There are special exceptions to the terms and conditions of the GPL as
|
|
* it is applied to this Source Code. View the full text of the exception
|
|
* in the file doc/FLOSS-exception.txt in this software distribution, or
|
|
* online at
|
|
* http://secondlifegrid.net/programs/open_source/licensing/flossexception
|
|
*
|
|
* By copying, modifying or distributing this software, you acknowledge
|
|
* that you have read and understood your obligations described above,
|
|
* and agree to abide by those obligations.
|
|
*
|
|
* ALL LINDEN LAB SOURCE CODE IS PROVIDED "AS IS." LINDEN LAB MAKES NO
|
|
* WARRANTIES, EXPRESS, IMPLIED OR OTHERWISE, REGARDING ITS ACCURACY,
|
|
* COMPLETENESS OR PERFORMANCE.
|
|
* $/LicenseInfo$
|
|
*/
|
|
|
|
//
|
|
// A note about X,Y coordinates:
|
|
//
|
|
// X coordinates are in pixels, from the left edge of the window client area
|
|
// Y coordinates are in pixels, from the BOTTOM edge of the window client area
|
|
//
|
|
// The Y coordinates therefore match OpenGL window coords, not Windows(tm) window coords.
|
|
// If Y is from the top, the variable will be called "y_from_top"
|
|
|
|
#ifndef LL_LLVIEWERWINDOW_H
|
|
#define LL_LLVIEWERWINDOW_H
|
|
|
|
#include "v3dmath.h"
|
|
#include "v2math.h"
|
|
#include "llwindow.h"
|
|
#include "lltimer.h"
|
|
#include "llstat.h"
|
|
#include "llalertdialog.h"
|
|
#include "llnotifications.h"
|
|
|
|
class LLView;
|
|
class LLViewerObject;
|
|
class LLUUID;
|
|
class LLProgressView;
|
|
class LLTool;
|
|
class LLVelocityBar;
|
|
class LLTextBox;
|
|
class LLImageRaw;
|
|
class LLHUDIcon;
|
|
class LLMouseHandler;
|
|
|
|
#define PICK_HALF_WIDTH 5
|
|
#define PICK_DIAMETER (2 * PICK_HALF_WIDTH + 1)
|
|
|
|
class LLPickInfo
|
|
{
|
|
public:
|
|
LLPickInfo();
|
|
LLPickInfo(const LLCoordGL& mouse_pos,
|
|
const LLRect& screen_region,
|
|
MASK keyboard_mask,
|
|
BOOL pick_transparent,
|
|
BOOL pick_surface_info,
|
|
void (*pick_callback)(const LLPickInfo& pick_info));
|
|
~LLPickInfo();
|
|
|
|
void fetchResults();
|
|
LLPointer<LLViewerObject> getObject() const;
|
|
LLUUID getObjectID() const { return mObjectID; }
|
|
void drawPickBuffer() const;
|
|
|
|
static bool isFlora(LLViewerObject* object);
|
|
|
|
typedef enum e_pick_type
|
|
{
|
|
PICK_OBJECT,
|
|
PICK_FLORA,
|
|
PICK_LAND,
|
|
PICK_ICON,
|
|
PICK_PARCEL_WALL,
|
|
PICK_INVALID
|
|
} EPickType;
|
|
|
|
public:
|
|
LLCoordGL mMousePt;
|
|
MASK mKeyMask;
|
|
void (*mPickCallback)(const LLPickInfo& pick_info);
|
|
|
|
EPickType mPickType;
|
|
LLCoordGL mPickPt;
|
|
LLVector3d mPosGlobal;
|
|
LLVector3 mObjectOffset;
|
|
LLUUID mObjectID;
|
|
S32 mObjectFace;
|
|
LLHUDIcon* mHUDIcon;
|
|
LLVector3 mIntersection;
|
|
LLVector2 mUVCoords;
|
|
LLVector2 mSTCoords;
|
|
LLCoordScreen mXYCoords;
|
|
LLVector3 mNormal;
|
|
LLVector3 mBinormal;
|
|
BOOL mPickTransparent;
|
|
LLRect mScreenRegion;
|
|
void getSurfaceInfo();
|
|
|
|
private:
|
|
void updateXYCoords();
|
|
|
|
BOOL mWantSurfaceInfo; // do we populate mUVCoord, mNormal, mBinormal?
|
|
U8 mPickBuffer[PICK_DIAMETER * PICK_DIAMETER * 4];
|
|
F32 mPickDepthBuffer[PICK_DIAMETER * PICK_DIAMETER];
|
|
BOOL mPickParcelWall;
|
|
|
|
};
|
|
|
|
static const U32 MAX_SNAPSHOT_IMAGE_SIZE = 6 * 1024; // max snapshot image size 6144 * 6144
|
|
|
|
class LLViewerWindow : public LLWindowCallbacks
|
|
{
|
|
public:
|
|
//
|
|
// CREATORS
|
|
//
|
|
LLViewerWindow(const std::string& title, const std::string& name, S32 x, S32 y, S32 width, S32 height, BOOL fullscreen, BOOL ignore_pixel_depth);
|
|
virtual ~LLViewerWindow();
|
|
|
|
void shutdownViews();
|
|
void shutdownGL();
|
|
|
|
void initGLDefaults();
|
|
void initBase();
|
|
void adjustRectanglesForFirstUse(const LLRect& window);
|
|
void adjustControlRectanglesForFirstUse(const LLRect& window);
|
|
void initWorldUI();
|
|
void initWorldUI_postLogin();
|
|
|
|
//
|
|
// LLWindowCallback interface implementation
|
|
//
|
|
/*virtual*/ BOOL handleTranslatedKeyDown(KEY key, MASK mask, BOOL repeated);
|
|
/*virtual*/ BOOL handleTranslatedKeyUp(KEY key, MASK mask);
|
|
/*virtual*/ void handleScanKey(KEY key, BOOL key_down, BOOL key_up, BOOL key_level);
|
|
/*virtual*/ BOOL handleUnicodeChar(llwchar uni_char, MASK mask); // NOT going to handle extended
|
|
/*virtual*/ BOOL handleMouseDown(LLWindow *window, LLCoordGL pos, MASK mask);
|
|
/*virtual*/ BOOL handleMouseUp(LLWindow *window, LLCoordGL pos, MASK mask);
|
|
/*virtual*/ BOOL handleCloseRequest(LLWindow *window);
|
|
/*virtual*/ void handleQuit(LLWindow *window);
|
|
/*virtual*/ BOOL handleRightMouseDown(LLWindow *window, LLCoordGL pos, MASK mask);
|
|
/*virtual*/ BOOL handleRightMouseUp(LLWindow *window, LLCoordGL pos, MASK mask);
|
|
/*virtual*/ BOOL handleMiddleMouseDown(LLWindow *window, LLCoordGL pos, MASK mask);
|
|
/*virtual*/ BOOL handleMiddleMouseUp(LLWindow *window, LLCoordGL pos, MASK mask);
|
|
/*virtual*/ void handleMouseMove(LLWindow *window, LLCoordGL pos, MASK mask);
|
|
/*virtual*/ void handleMouseLeave(LLWindow *window);
|
|
/*virtual*/ void handleResize(LLWindow *window, S32 x, S32 y);
|
|
/*virtual*/ void handleFocus(LLWindow *window);
|
|
/*virtual*/ void handleFocusLost(LLWindow *window);
|
|
/*virtual*/ BOOL handleActivate(LLWindow *window, BOOL activated);
|
|
/*virtual*/ BOOL handleActivateApp(LLWindow *window, BOOL activating);
|
|
/*virtual*/ void handleMenuSelect(LLWindow *window, S32 menu_item);
|
|
/*virtual*/ BOOL handlePaint(LLWindow *window, S32 x, S32 y, S32 width, S32 height);
|
|
/*virtual*/ void handleScrollWheel(LLWindow *window, S32 clicks);
|
|
/*virtual*/ BOOL handleDoubleClick(LLWindow *window, LLCoordGL pos, MASK mask);
|
|
/*virtual*/ void handleWindowBlock(LLWindow *window);
|
|
/*virtual*/ void handleWindowUnblock(LLWindow *window);
|
|
/*virtual*/ void handleDataCopy(LLWindow *window, S32 data_type, void *data);
|
|
/*virtual*/ BOOL handleTimerEvent(LLWindow *window);
|
|
/*virtual*/ BOOL handleDeviceChange(LLWindow *window);
|
|
|
|
/*virtual*/ void handlePingWatchdog(LLWindow *window, const char * msg);
|
|
/*virtual*/ void handlePauseWatchdog(LLWindow *window);
|
|
/*virtual*/ void handleResumeWatchdog(LLWindow *window);
|
|
|
|
|
|
//
|
|
// ACCESSORS
|
|
//
|
|
LLView* getRootView() const { return mRootView; }
|
|
|
|
// Window in raw pixels as seen on screen.
|
|
const LLRect& getWindowRect() const { return mWindowRect; };
|
|
S32 getWindowDisplayHeight() const;
|
|
S32 getWindowDisplayWidth() const;
|
|
|
|
// Window in scaled pixels (via UI scale), use this for
|
|
// UI elements checking size.
|
|
const LLRect& getVirtualWindowRect() const { return mVirtualWindowRect; };
|
|
S32 getWindowHeight() const;
|
|
S32 getWindowWidth() const;
|
|
|
|
LLWindow* getWindow() const { return mWindow; }
|
|
void* getPlatformWindow() const { return mWindow->getPlatformWindow(); }
|
|
void* getMediaWindow() const { return mWindow->getMediaWindow(); }
|
|
void focusClient() const { return mWindow->focusClient(); };
|
|
|
|
LLCoordGL getLastMouse() const { return mLastMousePoint; }
|
|
S32 getLastMouseX() const { return mLastMousePoint.mX; }
|
|
S32 getLastMouseY() const { return mLastMousePoint.mY; }
|
|
LLCoordGL getCurrentMouse() const { return mCurrentMousePoint; }
|
|
S32 getCurrentMouseX() const { return mCurrentMousePoint.mX; }
|
|
S32 getCurrentMouseY() const { return mCurrentMousePoint.mY; }
|
|
S32 getCurrentMouseDX() const { return mCurrentMouseDelta.mX; }
|
|
S32 getCurrentMouseDY() const { return mCurrentMouseDelta.mY; }
|
|
LLCoordGL getCurrentMouseDelta() const { return mCurrentMouseDelta; }
|
|
LLStat * getMouseVelocityStat() { return &mMouseVelocityStat; }
|
|
BOOL getLeftMouseDown() const { return mLeftMouseDown; }
|
|
BOOL getRightMouseDown() const { return mRightMouseDown; }
|
|
|
|
const LLPickInfo& getLastPick() const { return mLastPick; }
|
|
const LLPickInfo& getHoverPick() const { return mHoverPick; }
|
|
|
|
void setupViewport(S32 x_offset = 0, S32 y_offset = 0);
|
|
void setup3DRender();
|
|
void setup2DRender();
|
|
|
|
LLVector3 mouseDirectionGlobal(const S32 x, const S32 y) const;
|
|
LLVector3 mouseDirectionCamera(const S32 x, const S32 y) const;
|
|
LLVector3 mousePointHUD(const S32 x, const S32 y) const;
|
|
|
|
|
|
// Is window of our application frontmost?
|
|
BOOL getActive() const { return mActive; }
|
|
|
|
void getTargetWindow(BOOL& fullscreen, S32& width, S32& height) const;
|
|
// The 'target' is where the user wants the window to be. It may not be
|
|
// there yet, because we may be supressing fullscreen prior to login.
|
|
|
|
const std::string& getInitAlert() { return mInitAlert; }
|
|
|
|
//
|
|
// MANIPULATORS
|
|
//
|
|
void saveLastMouse(const LLCoordGL &point);
|
|
|
|
void setCursor( ECursorType c );
|
|
void showCursor();
|
|
void hideCursor();
|
|
BOOL getCursorHidden() { return mCursorHidden; }
|
|
void moveCursorToCenter(); // move to center of window
|
|
|
|
void setShowProgress(const BOOL show);
|
|
BOOL getShowProgress() const;
|
|
void moveProgressViewToFront();
|
|
void setProgressString(const std::string& string);
|
|
void setProgressPercent(const F32 percent);
|
|
void setProgressMessage(const std::string& msg);
|
|
void setProgressCancelButtonVisible( BOOL b, const std::string& label = LLStringUtil::null );
|
|
LLProgressView *getProgressView() const;
|
|
|
|
void updateObjectUnderCursor();
|
|
|
|
BOOL handlePerFrameHover(); // Once per frame, update UI based on mouse position
|
|
|
|
BOOL handleKey(KEY key, MASK mask);
|
|
void handleScrollWheel (S32 clicks);
|
|
|
|
// Hide normal UI when a logon fails, re-show everything when logon is attempted again
|
|
void setNormalControlsVisible( BOOL visible );
|
|
void setMenuBackgroundColor(bool god_mode = false, bool dev_grid = false);
|
|
|
|
void reshape(S32 width, S32 height);
|
|
void sendShapeToSim();
|
|
|
|
void draw();
|
|
void updateDebugText();
|
|
void drawDebugText();
|
|
|
|
static void loadUserImage(void **cb_data, const LLUUID &uuid);
|
|
|
|
static void movieSize(S32 new_width, S32 new_height);
|
|
|
|
// snapshot functionality.
|
|
// perhaps some of this should move to llfloatershapshot? -MG
|
|
typedef enum e_snapshot_type
|
|
{
|
|
SNAPSHOT_TYPE_COLOR,
|
|
SNAPSHOT_TYPE_DEPTH,
|
|
SNAPSHOT_TYPE_OBJECT_ID
|
|
} ESnapshotType;
|
|
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);
|
|
BOOL rawSnapshot(LLImageRaw *raw, S32 image_width, S32 image_height, BOOL keep_window_aspect = TRUE, BOOL is_texture = FALSE,
|
|
BOOL show_ui = TRUE, BOOL do_rebuild = FALSE, ESnapshotType type = SNAPSHOT_TYPE_COLOR, S32 max_size = MAX_SNAPSHOT_IMAGE_SIZE, F32 supersample = 1.f );
|
|
BOOL thumbnailSnapshot(LLImageRaw *raw, S32 preview_width, S32 preview_height, BOOL show_ui, BOOL do_rebuild, ESnapshotType type) ;
|
|
BOOL isSnapshotLocSet() const { return ! sSnapshotDir.empty(); }
|
|
void resetSnapshotLoc() const { sSnapshotDir.clear(); }
|
|
BOOL saveImageNumbered(LLImageFormatted *image);
|
|
|
|
// Reset the directory where snapshots are saved.
|
|
// Client will open directory picker on next snapshot save.
|
|
void resetSnapshotLoc();
|
|
|
|
void playSnapshotAnimAndSound();
|
|
|
|
// draws selection boxes around selected objects, must call displayObjects first
|
|
void renderSelections( BOOL for_gl_pick, BOOL pick_parcel_walls, BOOL for_hud );
|
|
void performPick();
|
|
void returnEmptyPicks();
|
|
|
|
|
|
void pickAsync(S32 x, S32 y_from_bot, MASK mask, void (*callback)(const LLPickInfo& pick_info),
|
|
BOOL pick_transparent = FALSE, BOOL get_surface_info = FALSE);
|
|
LLPickInfo pickImmediate(S32 x, S32 y, BOOL pick_transparent);
|
|
static void hoverPickCallback(const LLPickInfo& pick_info);
|
|
|
|
LLHUDIcon* cursorIntersectIcon(S32 mouse_x, S32 mouse_y, F32 depth,
|
|
LLVector3* intersection);
|
|
|
|
LLViewerObject* cursorIntersect(S32 mouse_x = -1, S32 mouse_y = -1, F32 depth = 512.f,
|
|
LLViewerObject *this_object = NULL,
|
|
S32 this_face = -1,
|
|
BOOL pick_transparent = FALSE,
|
|
S32* face_hit = NULL,
|
|
LLVector3 *intersection = NULL,
|
|
LLVector2 *uv = NULL,
|
|
LLVector3 *normal = NULL,
|
|
LLVector3 *binormal = NULL);
|
|
|
|
|
|
// Returns a pointer to the last object hit
|
|
//LLViewerObject *getObject();
|
|
//LLViewerObject *lastNonFloraObjectHit();
|
|
|
|
//const LLVector3d& getObjectOffset();
|
|
//const LLVector3d& lastNonFloraObjectHitOffset();
|
|
|
|
// mousePointOnLand() returns true if found point
|
|
BOOL mousePointOnLandGlobal(const S32 x, const S32 y, LLVector3d *land_pos_global);
|
|
BOOL mousePointOnPlaneGlobal(LLVector3d& point, const S32 x, const S32 y, const LLVector3d &plane_point, const LLVector3 &plane_normal);
|
|
LLVector3d clickPointInWorldGlobal(const S32 x, const S32 y_from_bot, LLViewerObject* clicked_object) const;
|
|
BOOL clickPointOnSurfaceGlobal(const S32 x, const S32 y, LLViewerObject *objectp, LLVector3d &point_global) const;
|
|
|
|
// Prints window implementation details
|
|
void dumpState();
|
|
|
|
// Request display setting changes
|
|
void toggleFullscreen(BOOL show_progress);
|
|
|
|
// handle shutting down GL and bringing it back up
|
|
void requestResolutionUpdate(bool fullscreen_checked);
|
|
BOOL checkSettings();
|
|
void restartDisplay(BOOL show_progress_bar);
|
|
BOOL changeDisplaySettings(BOOL fullscreen, LLCoordScreen size, BOOL disable_vsync, BOOL show_progress_bar);
|
|
BOOL getIgnoreDestroyWindow() { return mIgnoreActivate; }
|
|
F32 getDisplayAspectRatio() const;
|
|
const LLVector2& getDisplayScale() const { return mDisplayScale; }
|
|
void calcDisplayScale();
|
|
|
|
void drawPickBuffer() const;
|
|
|
|
private:
|
|
bool shouldShowToolTipFor(LLMouseHandler *mh);
|
|
static bool onAlert(const LLSD& notify);
|
|
|
|
void switchToolByMask(MASK mask);
|
|
void destroyWindow();
|
|
void drawMouselookInstructions();
|
|
void stopGL(BOOL save_state = TRUE);
|
|
void restoreGL(const std::string& progress_message = LLStringUtil::null);
|
|
void initFonts(F32 zoom_factor = 1.f);
|
|
void schedulePick(LLPickInfo& pick_info);
|
|
S32 getChatConsoleBottomPad(); // Vertical padding for child console rect, varied by bottom clutter
|
|
LLRect getChatConsoleRect(); // Get optimal cosole rect.
|
|
|
|
public:
|
|
LLWindow* mWindow; // graphical window object
|
|
|
|
protected:
|
|
BOOL mActive;
|
|
BOOL mWantFullscreen;
|
|
BOOL mShowFullscreenProgress;
|
|
LLRect mWindowRect;
|
|
LLRect mVirtualWindowRect;
|
|
LLView* mRootView; // a view of size mWindowRect, containing all child views
|
|
LLVector2 mDisplayScale;
|
|
|
|
LLCoordGL mCurrentMousePoint; // last mouse position in GL coords
|
|
LLCoordGL mLastMousePoint; // Mouse point at last frame.
|
|
LLCoordGL mCurrentMouseDelta; //amount mouse moved this frame
|
|
LLStat mMouseVelocityStat;
|
|
BOOL mLeftMouseDown;
|
|
BOOL mRightMouseDown;
|
|
|
|
LLProgressView *mProgressView;
|
|
|
|
LLTextBox* mToolTip;
|
|
BOOL mToolTipBlocked; // True after a key press or a mouse button event. False once the mouse moves again.
|
|
LLRect mToolTipStickyRect; // Once a tool tip is shown, it will stay visible until the mouse leaves this rect.
|
|
|
|
BOOL mMouseInWindow; // True if the mouse is over our window or if we have captured the mouse.
|
|
BOOL mFocusCycleMode;
|
|
|
|
// Variables used for tool override switching based on modifier keys. JC
|
|
MASK mLastMask; // used to detect changes in modifier mask
|
|
LLTool* mToolStored; // the tool we're overriding
|
|
BOOL mSuppressToolbox; // sometimes hide the toolbox, despite
|
|
// having a camera tool selected
|
|
BOOL mHideCursorPermanent; // true during drags, mouselook
|
|
BOOL mCursorHidden;
|
|
LLPickInfo mLastPick;
|
|
LLPickInfo mHoverPick;
|
|
std::vector<LLPickInfo> mPicks;
|
|
LLRect mPickScreenRegion; // area of frame buffer for rendering pick frames (generally follows mouse to avoid going offscreen)
|
|
LLTimer mPickTimer; // timer for scheduling n picks per second
|
|
|
|
std::string mOverlayTitle; // Used for special titles such as "Second Life - Special E3 2003 Beta"
|
|
|
|
BOOL mIgnoreActivate;
|
|
|
|
std::string mInitAlert; // Window / GL initialization requires an alert
|
|
|
|
class LLDebugText* mDebugText; // Internal class for debug text
|
|
|
|
bool mResDirty;
|
|
bool mStatesDirty;
|
|
bool mIsFullscreenChecked; // Did the user check the fullscreen checkbox in the display settings
|
|
U32 mCurrResolutionIndex;
|
|
|
|
protected:
|
|
static std::string sSnapshotBaseName;
|
|
static std::string sSnapshotDir;
|
|
|
|
static std::string sMovieBaseName;
|
|
};
|
|
|
|
class LLBottomPanel : public LLPanel
|
|
{
|
|
public:
|
|
LLBottomPanel(const LLRect& rect);
|
|
void setFocusIndicator(LLView * indicator);
|
|
LLView * getFocusIndicator() { return mIndicator; }
|
|
/*virtual*/ void draw();
|
|
|
|
static void* createHUD(void* data);
|
|
static void* createOverlayBar(void* data);
|
|
static void* createToolBar(void* data);
|
|
|
|
protected:
|
|
LLView * mIndicator;
|
|
};
|
|
extern LLBottomPanel * gBottomPanel;
|
|
|
|
void toggle_flying(void*);
|
|
void toggle_first_person();
|
|
void toggle_build(void*);
|
|
void reset_viewer_state_on_sim(void);
|
|
void update_saved_window_size(const std::string& control,S32 delta_width, S32 delta_height);
|
|
|
|
|
|
|
|
//
|
|
// Globals
|
|
//
|
|
|
|
extern LLVelocityBar* gVelocityBar;
|
|
extern LLViewerWindow* gViewerWindow;
|
|
|
|
extern LLFrameTimer gMouseIdleTimer; // how long has it been since the mouse last moved?
|
|
extern LLFrameTimer gAwayTimer; // tracks time before setting the avatar away state to true
|
|
extern LLFrameTimer gAwayTriggerTimer; // how long the avatar has been away
|
|
|
|
extern BOOL gDebugSelect;
|
|
|
|
extern BOOL gDebugFastUIRender;
|
|
extern LLViewerObject* gDebugRaycastObject;
|
|
extern LLVector3 gDebugRaycastIntersection;
|
|
extern LLVector2 gDebugRaycastTexCoord;
|
|
extern LLVector3 gDebugRaycastNormal;
|
|
extern LLVector3 gDebugRaycastBinormal;
|
|
extern S32 gDebugRaycastFaceHit;
|
|
|
|
extern S32 CHAT_BAR_HEIGHT;
|
|
|
|
extern BOOL gDisplayCameraPos;
|
|
extern BOOL gDisplayWindInfo;
|
|
extern BOOL gDisplayNearestWater;
|
|
extern BOOL gDisplayFOV;
|
|
|
|
#endif
|