summaryrefslogtreecommitdiff
path: root/indra/newview/llviewerwindow.h
diff options
context:
space:
mode:
Diffstat (limited to 'indra/newview/llviewerwindow.h')
-rw-r--r--indra/newview/llviewerwindow.h391
1 files changed, 391 insertions, 0 deletions
diff --git a/indra/newview/llviewerwindow.h b/indra/newview/llviewerwindow.h
new file mode 100644
index 0000000000..9c8e78a29d
--- /dev/null
+++ b/indra/newview/llviewerwindow.h
@@ -0,0 +1,391 @@
+/**
+ * @file llviewerwindow.h
+ * @brief Description of the LLViewerWindow class.
+ *
+ * Copyright (c) 2001-$CurrentYear$, Linden Research, Inc.
+ * $License$
+ */
+
+//
+// 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 "linked_lists.h"
+#include "v3dmath.h"
+#include "v2math.h"
+#include "llwindow.h"
+#include "lltimer.h"
+#include "llstat.h"
+#include "llalertdialog.h"
+
+class LLView;
+class LLViewerObject;
+class LLUUID;
+class LLMouseHandler;
+class LLProgressView;
+class LLTool;
+class LLVelocityBar;
+class LLViewerWindow;
+class LLTextBox;
+class LLImageRaw;
+class LLHUDIcon;
+
+class LLViewerWindow : public LLWindowCallbacks
+{
+public:
+ //
+ // CREATORS
+ //
+ LLViewerWindow(char* title, char* name, S32 x, S32 y, S32 width, S32 height, BOOL fullscreen, BOOL ignore_pixel_depth);
+ virtual ~LLViewerWindow();
+
+ void initGLDefaults();
+ void initBase();
+ void adjustRectanglesForFirstUse(const LLRect& full_window);
+ void initWorldUI();
+
+ //
+ // 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*/ 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*/ 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);
+
+
+ //
+ // ACCESSORS
+ //
+ LLView* getRootView() const { return mRootView; }
+ const LLRect& getWindowRect() const { return mWindowRect; };
+ const LLRect& getVirtualWindowRect() const { return mVirtualWindowRect; };
+ S32 getWindowHeight() const;
+ S32 getWindowWidth() const;
+ S32 getWindowDisplayHeight() const;
+ S32 getWindowDisplayWidth() const;
+ LLWindow* getWindow() const { return mWindow; }
+ void* getPlatformWindow() const { return mWindow->getPlatformWindow(); }
+ 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; }
+
+ LLView* getTopView() const;
+ BOOL hasTopView(LLView* view) const;
+
+ void setupViewport(S32 x_offset = 0, S32 y_offset = 0);
+ void setup3DRender();
+ void setup2DRender();
+
+ BOOL isPickPending() { return mPickPending; }
+
+ LLVector3 mouseDirectionGlobal(const S32 x, const S32 y) const;
+ LLVector3 mouseDirectionCamera(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.
+
+ //
+ // MANIPULATORS
+ //
+ void saveLastMouse(const LLCoordGL &point);
+
+ void setCursor( ECursorType c );
+ void showCursor();
+ void hideCursor();
+ void moveCursorToCenter(); // move to center of window
+
+ void setShowProgress(const BOOL show);
+ BOOL getShowProgress() const;
+ void moveProgressViewToFront();
+ void setProgressString(const LLString& string);
+ void setProgressPercent(const F32 percent);
+ void setProgressMessage(const LLString& msg);
+ void setProgressCancelButtonVisible( BOOL b, const LLString& label );
+ 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);
+
+ // Handle the application becoming active (frontmost) or inactive
+ //BOOL handleActivate(BOOL activate);
+
+ void setKeyboardFocus(LLUICtrl* new_focus,void (*on_focus_lost)(LLUICtrl* old_focus)); // new_focus = NULL to release the focus.
+ LLUICtrl* getKeyboardFocus();
+ BOOL hasKeyboardFocus( const LLUICtrl* possible_focus ) const;
+ BOOL childHasKeyboardFocus( const LLView* parent ) const;
+
+ void setMouseCapture(LLMouseHandler* new_captor,void (*on_capture_lost)(LLMouseHandler* old_captor)); // new_captor = NULL to release the mouse.
+ BOOL hasMouseCapture(const LLMouseHandler* possible_captor ) const;
+ LLMouseHandler* getMouseCaptor() const;
+
+ void setTopView(LLView* new_top, void (*on_top_lost)(LLView* old_top)); // set new_top = NULL to release top_view.
+
+ void reshape(S32 width, S32 height);
+ void sendShapeToSim();
+
+ void draw();
+// void drawSelectedObjects();
+
+ static void loadUserImage(void **cb_data, const LLUUID &uuid);
+
+ // Save snapshot like Snapshot 1, 2, 3, etc.
+ static void saveMovieNumbered(void*);
+
+ static void movieSize(S32 new_width, S32 new_height);
+
+ typedef enum e_snapshot_type
+ {
+ SNAPSHOT_TYPE_COLOR,
+ SNAPSHOT_TYPE_DEPTH,
+ SNAPSHOT_TYPE_OBJECT_ID
+ } ESnapshotType;
+
+ BOOL saveSnapshot(const LLString& 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 show_ui = TRUE, BOOL do_rebuild = FALSE, ESnapshotType type = SNAPSHOT_TYPE_COLOR );
+ BOOL saveImageNumbered(LLImageRaw *raw);
+
+ 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 hitObjectOrLandGlobalAsync(S32 x, S32 y_from_bot, MASK mask, void (*callback)(S32 x, S32 y, MASK mask), BOOL pick_transparent = FALSE, BOOL pick_parcel_walls = FALSE);
+ void hitObjectOrLandGlobalImmediate(S32 x, S32 y, void (*callback)(S32 x, S32 y, MASK mask), BOOL pick_transparent);
+
+ void hitUIElementAsync(S32 x, S32 y_from_bot, MASK mask, void (*callback)(S32 x, S32 y, MASK mask));
+ void hitUIElementImmediate(S32 x, S32 y, void (*callback)(S32 x, S32 y, MASK mask));
+
+ LLViewerObject* getObjectUnderCursor(const F32 depth = 16.0f);
+
+ void requestFastFrame(LLView* view);
+ BOOL renderingFastFrame() { return mFastFrameTimer.getStarted() && !firstFastFrame(); }
+ void finishFastFrame() { mFastFrameTimer.stop(); mRenderFullFrame = FALSE; }
+ BOOL firstFastFrame() { return mRenderFullFrame; }
+ void finishFirstFastFrame() { mRenderFullFrame = FALSE; }
+
+ // Returns a pointer to the last object hit
+ LLViewerObject *lastObjectHit();
+ LLViewerObject *lastNonFloraObjectHit();
+
+ const LLVector3d& lastObjectHitOffset();
+ 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
+ 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;
+
+ LLAlertDialog* alertXml(const std::string& xml_filename,
+ LLAlertDialog::alert_callback_t callback = NULL, void* user_data = NULL);
+ LLAlertDialog* alertXml(const std::string& xml_filename, const LLString::format_map_t& args,
+ LLAlertDialog::alert_callback_t callback = NULL, void* user_data = NULL);
+ LLAlertDialog* alertXmlEditText(const std::string& xml_filename, const LLString::format_map_t& args,
+ LLAlertDialog::alert_callback_t callback, void* user_data,
+ LLAlertDialog::alert_text_callback_t text_callback, void *text_data,
+ const LLString::format_map_t& edit_args = LLString::format_map_t(),
+ BOOL draw_asterixes = FALSE);
+
+ static bool alertCallback(S32 modal);
+
+#ifdef SABINRIG
+ //Silly rig stuff
+ void printFeedback(); //RIG STUFF!
+#endif //SABINRIG
+
+private:
+ void switchToolByMask(MASK mask);
+ void destroyWindow();
+ void drawMouselookInstructions();
+ void stopGL(BOOL save_state = TRUE);
+ void restoreGL(const LLString& progress_message = LLString::null);
+ void initFonts(F32 zoom_factor = 1.f);
+
+ void analyzeHit(
+ S32 x, // input
+ S32 y_from_bot, // input
+ LLViewerObject* objectp, // input
+ U32 te_offset, // input
+ LLUUID* hit_object_id_p,// output
+ S32* hit_face_p, // output
+ LLVector3d* hit_pos_p, // output
+ BOOL* hit_land, // output
+ F32* hit_u_coord, // output
+ F32* hit_v_coord); // output
+
+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
+ LLCoordGL mPickPoint;
+ LLCoordGL mPickOffset;
+ MASK mPickMask;
+ BOOL mPickPending;
+ void (*mPickCallback)(S32 x, S32 y, MASK mask);
+
+ LLString mOverlayTitle; // Used for special titles such as "Second Life - Special E3 2003 Beta"
+
+ static char sSnapshotBaseName[LL_MAX_PATH];
+ static char sSnapshotDir[LL_MAX_PATH];
+
+ static char sMovieBaseName[LL_MAX_PATH];
+
+ BOOL mIgnoreActivate;
+ LLFrameTimer mFastFrameTimer;
+ BOOL mRenderFullFrame;
+ U8* mPickBuffer;
+};
+
+class LLBottomPanel : public LLPanel
+{
+public:
+ LLBottomPanel(const LLString& name, const LLRect& rect);
+ void setFocusIndicator(LLView * indicator);
+ LLView * getFocusIndicator() { return mIndicator; }
+ /*virtual*/ void draw();
+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);
+
+//
+// Constants
+//
+
+
+//
+// Globals
+//
+
+extern LLVelocityBar* gVelocityBar;
+extern LLViewerWindow* gViewerWindow;
+extern BOOL gQuietSnapshot;
+
+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 LLVector3d gLastHitPosGlobal;
+extern LLVector3d gLastHitObjectOffset;
+extern LLUUID gLastHitObjectID;
+extern S32 gLastHitObjectFace;
+extern BOOL gLastHitLand;
+extern F32 gLastHitUCoord;
+extern F32 gLastHitVCoord;
+
+
+extern LLVector3d gLastHitNonFloraPosGlobal;
+extern LLVector3d gLastHitNonFloraObjectOffset;
+extern LLUUID gLastHitNonFloraObjectID;
+extern S32 gLastHitNonFloraObjectFace;
+
+extern S32 gLastHitUIElement;
+extern LLHUDIcon* gLastHitHUDIcon;
+extern BOOL gLastHitParcelWall;
+extern BOOL gDebugSelect;
+extern BOOL gPickFaces;
+extern BOOL gPickTransparent;
+
+extern BOOL gDebugFastUIRender;
+extern S32 CHAT_BAR_HEIGHT;
+#endif