summaryrefslogtreecommitdiff
path: root/indra/newview/lltoolface.cpp
diff options
context:
space:
mode:
Diffstat (limited to 'indra/newview/lltoolface.cpp')
-rw-r--r--indra/newview/lltoolface.cpp141
1 files changed, 141 insertions, 0 deletions
diff --git a/indra/newview/lltoolface.cpp b/indra/newview/lltoolface.cpp
new file mode 100644
index 0000000000..c35fcb434c
--- /dev/null
+++ b/indra/newview/lltoolface.cpp
@@ -0,0 +1,141 @@
+/**
+ * @file lltoolface.cpp
+ * @brief A tool to manipulate faces
+ *
+ * Copyright (c) 2001-$CurrentYear$, Linden Research, Inc.
+ * $License$
+ */
+
+#include "llviewerprecompiledheaders.h"
+
+// File includes
+#include "lltoolface.h"
+
+// Library includes
+#include "v3math.h"
+
+// Viewer includes
+#include "llagent.h"
+//#include "llbuildview.h"
+#include "llviewercontrol.h"
+#include "llselectmgr.h"
+#include "lltoolview.h"
+#include "llviewerobject.h"
+#include "llviewerwindow.h"
+#include "llfloatertools.h"
+
+// Globals
+LLToolFace *gToolFace = NULL;
+
+//
+// Member functions
+//
+
+LLToolFace::LLToolFace()
+: LLTool("Texture")
+{ }
+
+
+LLToolFace::~LLToolFace()
+{ }
+
+
+BOOL LLToolFace::handleDoubleClick(S32 x, S32 y, MASK mask)
+{
+ if (!gSelectMgr->isEmpty())
+ {
+ // You should already have an object selected from the mousedown.
+ // If so, show its properties
+ //gBuildView->showFacePanel();
+ gFloaterTools->showPanel( LLFloaterTools::PANEL_FACE );
+ //gBuildView->showMore(LLBuildView::PANEL_FACE);
+ return TRUE;
+ }
+ else
+ {
+ // Nothing selected means the first mouse click was probably
+ // bad, so try again.
+ return FALSE;
+ }
+}
+
+
+BOOL LLToolFace::handleMouseDown(S32 x, S32 y, MASK mask)
+{
+ gPickFaces = TRUE;
+ gViewerWindow->hitObjectOrLandGlobalAsync(x, y, mask, pickCallback);
+ return TRUE;
+}
+
+void LLToolFace::pickCallback(S32 x, S32 y, MASK mask)
+{
+ LLViewerObject* hit_obj = gViewerWindow->lastObjectHit();
+ if (hit_obj)
+ {
+ S32 hit_face = gLastHitObjectFace;
+
+ if (hit_obj->isAvatar())
+ {
+ // ...clicked on an avatar, so don't do anything
+ return;
+ }
+
+ // ...clicked on a world object, try to pick the appropriate face
+
+ if (mask & MASK_SHIFT)
+ {
+ // If object not selected, need to inform sim
+ if ( !hit_obj->isSelected() )
+ {
+ // object wasn't selected so add the object and face
+ gSelectMgr->selectObjectOnly(hit_obj, hit_face);
+ }
+ else if (!gSelectMgr->contains(hit_obj, hit_face) )
+ {
+ // object is selected, but not this face, so add it.
+ gSelectMgr->addAsIndividual(hit_obj, hit_face);
+ }
+ else
+ {
+ // object is selected, as is this face, so remove the face.
+ gSelectMgr->remove(hit_obj, hit_face);
+
+ // BUG: If you remove the last face, the simulator won't know about it.
+ }
+ }
+ else
+ {
+ // clicked without modifiers, select only
+ // this face
+ gSelectMgr->deselectAll();
+ gSelectMgr->selectObjectOnly(hit_obj, hit_face);
+ }
+ }
+ else
+ {
+ if (!(mask == MASK_SHIFT))
+ {
+ gSelectMgr->deselectAll();
+ }
+ }
+}
+
+
+void LLToolFace::handleSelect()
+{
+ // From now on, draw faces
+ gSelectMgr->setTEMode(TRUE);
+}
+
+
+void LLToolFace::handleDeselect()
+{
+ // Stop drawing faces
+ gSelectMgr->setTEMode(FALSE);
+}
+
+
+void LLToolFace::render()
+{
+ // for now, do nothing
+}