summaryrefslogtreecommitdiff
path: root/indra/newview/lltoolbrush.cpp
diff options
context:
space:
mode:
Diffstat (limited to 'indra/newview/lltoolbrush.cpp')
-rw-r--r--indra/newview/lltoolbrush.cpp1066
1 files changed, 533 insertions, 533 deletions
diff --git a/indra/newview/lltoolbrush.cpp b/indra/newview/lltoolbrush.cpp
index 0a0bfaf58b..05ec09883d 100644
--- a/indra/newview/lltoolbrush.cpp
+++ b/indra/newview/lltoolbrush.cpp
@@ -1,25 +1,25 @@
-/**
+/**
* @file lltoolbrush.cpp
* @brief Implementation of the toolbrushes
*
* $LicenseInfo:firstyear=2001&license=viewerlgpl$
* Second Life Viewer Source Code
* Copyright (C) 2010, Linden Research, Inc.
- *
+ *
* This library is free software; you can redistribute it and/or
* modify it under the terms of the GNU Lesser General Public
* License as published by the Free Software Foundation;
* version 2.1 of the License only.
- *
+ *
* This library is distributed in the hope that it will be useful,
* but WITHOUT ANY WARRANTY; without even the implied warranty of
* MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU
* Lesser General Public License for more details.
- *
+ *
* You should have received a copy of the GNU Lesser General Public
* License along with this library; if not, write to the Free Software
* Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA
- *
+ *
* Linden Research, Inc., 945 Battery Street, San Francisco, CA 94111 USA
* $/LicenseInfo$
*/
@@ -56,7 +56,7 @@
#include "llglheaders.h"
const std::string REGION_BLOCKS_TERRAFORM_MSG = "This region does not allow terraforming.\n"
- "You will need to buy land in another part of the world to terraform it.";
+ "You will need to buy land in another part of the world to terraform it.";
///============================================================================
@@ -68,13 +68,13 @@ const F32 LAND_BRUSH_SIZE[LAND_BRUSH_SIZE_COUNT] = {1.0f, 2.0f, 4.0f};
enum
{
- E_LAND_LEVEL = 0,
- E_LAND_RAISE = 1,
- E_LAND_LOWER = 2,
- E_LAND_SMOOTH = 3,
- E_LAND_NOISE = 4,
- E_LAND_REVERT = 5,
- E_LAND_INVALID = 6,
+ E_LAND_LEVEL = 0,
+ E_LAND_RAISE = 1,
+ E_LAND_LOWER = 2,
+ E_LAND_SMOOTH = 3,
+ E_LAND_NOISE = 4,
+ E_LAND_REVERT = 5,
+ E_LAND_INVALID = 6,
};
const LLColor4 OVERLAY_COLOR(1.0f, 1.0f, 1.0f, 1.0f);
@@ -84,417 +84,417 @@ const LLColor4 OVERLAY_COLOR(1.0f, 1.0f, 1.0f, 1.0f);
// constructor
LLToolBrushLand::LLToolBrushLand()
-: LLTool(std::string("Land")),
- mStartingZ( 0.0f ),
- mMouseX( 0 ),
- mMouseY(0),
- mGotHover(FALSE),
- mBrushSelected(FALSE)
+: LLTool(std::string("Land")),
+ mStartingZ( 0.0f ),
+ mMouseX( 0 ),
+ mMouseY(0),
+ mGotHover(FALSE),
+ mBrushSelected(FALSE)
{
- mBrushSize = gSavedSettings.getF32("LandBrushSize");
+ mBrushSize = gSavedSettings.getF32("LandBrushSize");
}
U8 LLToolBrushLand::getBrushIndex()
{
- // find the best index for desired size
- // (compatibility with old sims, brush_index is now depricated - DEV-8252)
- U8 index = 0;
- for (U8 i = 0; i < LAND_BRUSH_SIZE_COUNT; i++)
- {
- if (mBrushSize > LAND_BRUSH_SIZE[i])
- {
- index = i;
- }
- }
-
- return index;
+ // find the best index for desired size
+ // (compatibility with old sims, brush_index is now depricated - DEV-8252)
+ U8 index = 0;
+ for (U8 i = 0; i < LAND_BRUSH_SIZE_COUNT; i++)
+ {
+ if (mBrushSize > LAND_BRUSH_SIZE[i])
+ {
+ index = i;
+ }
+ }
+
+ return index;
}
void LLToolBrushLand::modifyLandAtPointGlobal(const LLVector3d &pos_global,
- MASK mask)
+ MASK mask)
{
- S32 radioAction = gSavedSettings.getS32("RadioLandBrushAction");
-
- mLastAffectedRegions.clear();
- determineAffectedRegions(mLastAffectedRegions, pos_global);
- for(region_list_t::iterator iter = mLastAffectedRegions.begin();
- iter != mLastAffectedRegions.end(); ++iter)
- {
- LLViewerRegion* regionp = *iter;
- //BOOL is_changed = FALSE;
- LLVector3 pos_region = regionp->getPosRegionFromGlobal(pos_global);
- LLSurface &land = regionp->getLand();
- char action = E_LAND_LEVEL;
- switch (radioAction)
- {
- case 0:
- // // average toward mStartingZ
- action = E_LAND_LEVEL;
- break;
- case 1:
- action = E_LAND_RAISE;
- break;
- case 2:
- action = E_LAND_LOWER;
- break;
- case 3:
- action = E_LAND_SMOOTH;
- break;
- case 4:
- action = E_LAND_NOISE;
- break;
- case 5:
- action = E_LAND_REVERT;
- break;
- default:
- action = E_LAND_INVALID;
- break;
- }
-
- // Don't send a message to the region if nothing changed.
- //if(!is_changed) continue;
-
- // Now to update the patch information so it will redraw correctly.
- LLSurfacePatch *patchp= land.resolvePatchRegion(pos_region);
- if (patchp)
- {
- patchp->dirtyZ();
- }
-
- // Also force the property lines to update, normals to recompute, etc.
- regionp->forceUpdate();
-
- // tell the simulator what we've done
- F32 seconds = (1.0f / gFPSClamped) * gSavedSettings.getF32("LandBrushForce");
- F32 x_pos = (F32)pos_region.mV[VX];
- F32 y_pos = (F32)pos_region.mV[VY];
- LLMessageSystem* msg = gMessageSystem;
- msg->newMessageFast(_PREHASH_ModifyLand);
- msg->nextBlockFast(_PREHASH_AgentData);
- msg->addUUIDFast(_PREHASH_AgentID, gAgent.getID());
- msg->addUUIDFast(_PREHASH_SessionID, gAgent.getSessionID());
- msg->nextBlockFast(_PREHASH_ModifyBlock);
- msg->addU8Fast(_PREHASH_Action, (U8)action);
- msg->addU8Fast(_PREHASH_BrushSize, getBrushIndex());
- msg->addF32Fast(_PREHASH_Seconds, seconds);
- msg->addF32Fast(_PREHASH_Height, mStartingZ);
- msg->nextBlockFast(_PREHASH_ParcelData);
- msg->addS32Fast(_PREHASH_LocalID, -1);
- msg->addF32Fast(_PREHASH_West, x_pos );
- msg->addF32Fast(_PREHASH_South, y_pos );
- msg->addF32Fast(_PREHASH_East, x_pos );
- msg->addF32Fast(_PREHASH_North, y_pos );
- msg->nextBlock("ModifyBlockExtended");
- msg->addF32("BrushSize", mBrushSize);
- msg->sendMessage(regionp->getHost());
- }
+ S32 radioAction = gSavedSettings.getS32("RadioLandBrushAction");
+
+ mLastAffectedRegions.clear();
+ determineAffectedRegions(mLastAffectedRegions, pos_global);
+ for(region_list_t::iterator iter = mLastAffectedRegions.begin();
+ iter != mLastAffectedRegions.end(); ++iter)
+ {
+ LLViewerRegion* regionp = *iter;
+ //BOOL is_changed = FALSE;
+ LLVector3 pos_region = regionp->getPosRegionFromGlobal(pos_global);
+ LLSurface &land = regionp->getLand();
+ char action = E_LAND_LEVEL;
+ switch (radioAction)
+ {
+ case 0:
+ // // average toward mStartingZ
+ action = E_LAND_LEVEL;
+ break;
+ case 1:
+ action = E_LAND_RAISE;
+ break;
+ case 2:
+ action = E_LAND_LOWER;
+ break;
+ case 3:
+ action = E_LAND_SMOOTH;
+ break;
+ case 4:
+ action = E_LAND_NOISE;
+ break;
+ case 5:
+ action = E_LAND_REVERT;
+ break;
+ default:
+ action = E_LAND_INVALID;
+ break;
+ }
+
+ // Don't send a message to the region if nothing changed.
+ //if(!is_changed) continue;
+
+ // Now to update the patch information so it will redraw correctly.
+ LLSurfacePatch *patchp= land.resolvePatchRegion(pos_region);
+ if (patchp)
+ {
+ patchp->dirtyZ();
+ }
+
+ // Also force the property lines to update, normals to recompute, etc.
+ regionp->forceUpdate();
+
+ // tell the simulator what we've done
+ F32 seconds = (1.0f / gFPSClamped) * gSavedSettings.getF32("LandBrushForce");
+ F32 x_pos = (F32)pos_region.mV[VX];
+ F32 y_pos = (F32)pos_region.mV[VY];
+ LLMessageSystem* msg = gMessageSystem;
+ msg->newMessageFast(_PREHASH_ModifyLand);
+ msg->nextBlockFast(_PREHASH_AgentData);
+ msg->addUUIDFast(_PREHASH_AgentID, gAgent.getID());
+ msg->addUUIDFast(_PREHASH_SessionID, gAgent.getSessionID());
+ msg->nextBlockFast(_PREHASH_ModifyBlock);
+ msg->addU8Fast(_PREHASH_Action, (U8)action);
+ msg->addU8Fast(_PREHASH_BrushSize, getBrushIndex());
+ msg->addF32Fast(_PREHASH_Seconds, seconds);
+ msg->addF32Fast(_PREHASH_Height, mStartingZ);
+ msg->nextBlockFast(_PREHASH_ParcelData);
+ msg->addS32Fast(_PREHASH_LocalID, -1);
+ msg->addF32Fast(_PREHASH_West, x_pos );
+ msg->addF32Fast(_PREHASH_South, y_pos );
+ msg->addF32Fast(_PREHASH_East, x_pos );
+ msg->addF32Fast(_PREHASH_North, y_pos );
+ msg->nextBlock("ModifyBlockExtended");
+ msg->addF32("BrushSize", mBrushSize);
+ msg->sendMessage(regionp->getHost());
+ }
}
void LLToolBrushLand::modifyLandInSelectionGlobal()
{
- if (LLViewerParcelMgr::getInstance()->selectionEmpty())
- {
- return;
- }
-
- if (LLToolMgr::getInstance()->getCurrentTool() == LLToolSelectLand::getInstance())
- {
- // selecting land, don't do anything
- return;
- }
-
- LLVector3d min;
- LLVector3d max;
-
- LLViewerParcelMgr::getInstance()->getSelection(min, max);
-
- S32 radioAction = gSavedSettings.getS32("RadioLandBrushAction");
-
- mLastAffectedRegions.clear();
-
- determineAffectedRegions(mLastAffectedRegions, LLVector3d(min.mdV[VX], min.mdV[VY], 0));
- determineAffectedRegions(mLastAffectedRegions, LLVector3d(min.mdV[VX], max.mdV[VY], 0));
- determineAffectedRegions(mLastAffectedRegions, LLVector3d(max.mdV[VX], min.mdV[VY], 0));
- determineAffectedRegions(mLastAffectedRegions, LLVector3d(max.mdV[VX], max.mdV[VY], 0));
-
- LLRegionPosition mid_point_region((min + max) * 0.5);
- LLViewerRegion* center_region = mid_point_region.getRegion();
- if (center_region)
- {
- LLVector3 pos_region = mid_point_region.getPositionRegion();
- U32 grids = center_region->getLand().mGridsPerEdge;
- S32 i = llclamp( (S32)pos_region.mV[VX], 0, (S32)grids );
- S32 j = llclamp( (S32)pos_region.mV[VY], 0, (S32)grids );
- mStartingZ = center_region->getLand().getZ(i+j*grids);
- }
- else
- {
- mStartingZ = 0.f;
- }
-
- // Stop if our selection include a no-terraform region
- for(region_list_t::iterator iter = mLastAffectedRegions.begin();
- iter != mLastAffectedRegions.end(); ++iter)
- {
- LLViewerRegion* regionp = *iter;
- if (!canTerraformRegion(regionp))
- {
- alertNoTerraformRegion(regionp);
- return;
- }
- }
-
- for(region_list_t::iterator iter = mLastAffectedRegions.begin();
- iter != mLastAffectedRegions.end(); ++iter)
- {
- LLViewerRegion* regionp = *iter;
- //BOOL is_changed = FALSE;
- LLVector3 min_region = regionp->getPosRegionFromGlobal(min);
- LLVector3 max_region = regionp->getPosRegionFromGlobal(max);
-
- min_region.clamp(0.f, regionp->getWidth());
- max_region.clamp(0.f, regionp->getWidth());
- F32 seconds = gSavedSettings.getF32("LandBrushForce");
-
- LLSurface &land = regionp->getLand();
- char action = E_LAND_LEVEL;
- switch (radioAction)
- {
- case 0:
- // // average toward mStartingZ
- action = E_LAND_LEVEL;
- seconds *= 0.25f;
- break;
- case 1:
- action = E_LAND_RAISE;
- seconds *= 0.25f;
- break;
- case 2:
- action = E_LAND_LOWER;
- seconds *= 0.25f;
- break;
- case 3:
- action = E_LAND_SMOOTH;
- seconds *= 5.0f;
- break;
- case 4:
- action = E_LAND_NOISE;
- seconds *= 0.5f;
- break;
- case 5:
- action = E_LAND_REVERT;
- seconds = 0.5f;
- break;
- default:
- //action = E_LAND_INVALID;
- //seconds = 0.0f;
- return;
- break;
- }
-
- // Don't send a message to the region if nothing changed.
- //if(!is_changed) continue;
-
- // Now to update the patch information so it will redraw correctly.
- LLSurfacePatch *patchp= land.resolvePatchRegion(min_region);
- if (patchp)
- {
- patchp->dirtyZ();
- }
-
- // Also force the property lines to update, normals to recompute, etc.
- regionp->forceUpdate();
-
- // tell the simulator what we've done
- LLMessageSystem* msg = gMessageSystem;
- msg->newMessageFast(_PREHASH_ModifyLand);
- msg->nextBlockFast(_PREHASH_AgentData);
- msg->addUUIDFast(_PREHASH_AgentID, gAgent.getID());
- msg->addUUIDFast(_PREHASH_SessionID, gAgent.getSessionID());
- msg->nextBlockFast(_PREHASH_ModifyBlock);
- msg->addU8Fast(_PREHASH_Action, (U8)action);
- msg->addU8Fast(_PREHASH_BrushSize, getBrushIndex());
- msg->addF32Fast(_PREHASH_Seconds, seconds);
- msg->addF32Fast(_PREHASH_Height, mStartingZ);
-
- BOOL parcel_selected = LLViewerParcelMgr::getInstance()->getParcelSelection()->getWholeParcelSelected();
- LLParcel* selected_parcel = LLViewerParcelMgr::getInstance()->getParcelSelection()->getParcel();
-
- if (parcel_selected && selected_parcel)
- {
- msg->nextBlockFast(_PREHASH_ParcelData);
- msg->addS32Fast(_PREHASH_LocalID, selected_parcel->getLocalID());
- msg->addF32Fast(_PREHASH_West, min_region.mV[VX] );
- msg->addF32Fast(_PREHASH_South, min_region.mV[VY] );
- msg->addF32Fast(_PREHASH_East, max_region.mV[VX] );
- msg->addF32Fast(_PREHASH_North, max_region.mV[VY] );
- }
- else
- {
- msg->nextBlockFast(_PREHASH_ParcelData);
- msg->addS32Fast(_PREHASH_LocalID, -1);
- msg->addF32Fast(_PREHASH_West, min_region.mV[VX] );
- msg->addF32Fast(_PREHASH_South, min_region.mV[VY] );
- msg->addF32Fast(_PREHASH_East, max_region.mV[VX] );
- msg->addF32Fast(_PREHASH_North, max_region.mV[VY] );
- }
-
- msg->nextBlock("ModifyBlockExtended");
- msg->addF32("BrushSize", mBrushSize);
-
- msg->sendMessage(regionp->getHost());
- }
+ if (LLViewerParcelMgr::getInstance()->selectionEmpty())
+ {
+ return;
+ }
+
+ if (LLToolMgr::getInstance()->getCurrentTool() == LLToolSelectLand::getInstance())
+ {
+ // selecting land, don't do anything
+ return;
+ }
+
+ LLVector3d min;
+ LLVector3d max;
+
+ LLViewerParcelMgr::getInstance()->getSelection(min, max);
+
+ S32 radioAction = gSavedSettings.getS32("RadioLandBrushAction");
+
+ mLastAffectedRegions.clear();
+
+ determineAffectedRegions(mLastAffectedRegions, LLVector3d(min.mdV[VX], min.mdV[VY], 0));
+ determineAffectedRegions(mLastAffectedRegions, LLVector3d(min.mdV[VX], max.mdV[VY], 0));
+ determineAffectedRegions(mLastAffectedRegions, LLVector3d(max.mdV[VX], min.mdV[VY], 0));
+ determineAffectedRegions(mLastAffectedRegions, LLVector3d(max.mdV[VX], max.mdV[VY], 0));
+
+ LLRegionPosition mid_point_region((min + max) * 0.5);
+ LLViewerRegion* center_region = mid_point_region.getRegion();
+ if (center_region)
+ {
+ LLVector3 pos_region = mid_point_region.getPositionRegion();
+ U32 grids = center_region->getLand().mGridsPerEdge;
+ S32 i = llclamp( (S32)pos_region.mV[VX], 0, (S32)grids );
+ S32 j = llclamp( (S32)pos_region.mV[VY], 0, (S32)grids );
+ mStartingZ = center_region->getLand().getZ(i+j*grids);
+ }
+ else
+ {
+ mStartingZ = 0.f;
+ }
+
+ // Stop if our selection include a no-terraform region
+ for(region_list_t::iterator iter = mLastAffectedRegions.begin();
+ iter != mLastAffectedRegions.end(); ++iter)
+ {
+ LLViewerRegion* regionp = *iter;
+ if (!canTerraformRegion(regionp))
+ {
+ alertNoTerraformRegion(regionp);
+ return;
+ }
+ }
+
+ for(region_list_t::iterator iter = mLastAffectedRegions.begin();
+ iter != mLastAffectedRegions.end(); ++iter)
+ {
+ LLViewerRegion* regionp = *iter;
+ //BOOL is_changed = FALSE;
+ LLVector3 min_region = regionp->getPosRegionFromGlobal(min);
+ LLVector3 max_region = regionp->getPosRegionFromGlobal(max);
+
+ min_region.clamp(0.f, regionp->getWidth());
+ max_region.clamp(0.f, regionp->getWidth());
+ F32 seconds = gSavedSettings.getF32("LandBrushForce");
+
+ LLSurface &land = regionp->getLand();
+ char action = E_LAND_LEVEL;
+ switch (radioAction)
+ {
+ case 0:
+ // // average toward mStartingZ
+ action = E_LAND_LEVEL;
+ seconds *= 0.25f;
+ break;
+ case 1:
+ action = E_LAND_RAISE;
+ seconds *= 0.25f;
+ break;
+ case 2:
+ action = E_LAND_LOWER;
+ seconds *= 0.25f;
+ break;
+ case 3:
+ action = E_LAND_SMOOTH;
+ seconds *= 5.0f;
+ break;
+ case 4:
+ action = E_LAND_NOISE;
+ seconds *= 0.5f;
+ break;
+ case 5:
+ action = E_LAND_REVERT;
+ seconds = 0.5f;
+ break;
+ default:
+ //action = E_LAND_INVALID;
+ //seconds = 0.0f;
+ return;
+ break;
+ }
+
+ // Don't send a message to the region if nothing changed.
+ //if(!is_changed) continue;
+
+ // Now to update the patch information so it will redraw correctly.
+ LLSurfacePatch *patchp= land.resolvePatchRegion(min_region);
+ if (patchp)
+ {
+ patchp->dirtyZ();
+ }
+
+ // Also force the property lines to update, normals to recompute, etc.
+ regionp->forceUpdate();
+
+ // tell the simulator what we've done
+ LLMessageSystem* msg = gMessageSystem;
+ msg->newMessageFast(_PREHASH_ModifyLand);
+ msg->nextBlockFast(_PREHASH_AgentData);
+ msg->addUUIDFast(_PREHASH_AgentID, gAgent.getID());
+ msg->addUUIDFast(_PREHASH_SessionID, gAgent.getSessionID());
+ msg->nextBlockFast(_PREHASH_ModifyBlock);
+ msg->addU8Fast(_PREHASH_Action, (U8)action);
+ msg->addU8Fast(_PREHASH_BrushSize, getBrushIndex());
+ msg->addF32Fast(_PREHASH_Seconds, seconds);
+ msg->addF32Fast(_PREHASH_Height, mStartingZ);
+
+ BOOL parcel_selected = LLViewerParcelMgr::getInstance()->getParcelSelection()->getWholeParcelSelected();
+ LLParcel* selected_parcel = LLViewerParcelMgr::getInstance()->getParcelSelection()->getParcel();
+
+ if (parcel_selected && selected_parcel)
+ {
+ msg->nextBlockFast(_PREHASH_ParcelData);
+ msg->addS32Fast(_PREHASH_LocalID, selected_parcel->getLocalID());
+ msg->addF32Fast(_PREHASH_West, min_region.mV[VX] );
+ msg->addF32Fast(_PREHASH_South, min_region.mV[VY] );
+ msg->addF32Fast(_PREHASH_East, max_region.mV[VX] );
+ msg->addF32Fast(_PREHASH_North, max_region.mV[VY] );
+ }
+ else
+ {
+ msg->nextBlockFast(_PREHASH_ParcelData);
+ msg->addS32Fast(_PREHASH_LocalID, -1);
+ msg->addF32Fast(_PREHASH_West, min_region.mV[VX] );
+ msg->addF32Fast(_PREHASH_South, min_region.mV[VY] );
+ msg->addF32Fast(_PREHASH_East, max_region.mV[VX] );
+ msg->addF32Fast(_PREHASH_North, max_region.mV[VY] );
+ }
+
+ msg->nextBlock("ModifyBlockExtended");
+ msg->addF32("BrushSize", mBrushSize);
+
+ msg->sendMessage(regionp->getHost());
+ }
}
void LLToolBrushLand::brush( void )
{
- LLVector3d spot;
- if( gViewerWindow->mousePointOnLandGlobal( mMouseX, mMouseY, &spot ) )
- {
- // Round to nearest X,Y grid
- spot.mdV[VX] = floor( spot.mdV[VX] + 0.5 );
- spot.mdV[VY] = floor( spot.mdV[VY] + 0.5 );
-
- modifyLandAtPointGlobal(spot, gKeyboard->currentMask(TRUE));
- }
+ LLVector3d spot;
+ if( gViewerWindow->mousePointOnLandGlobal( mMouseX, mMouseY, &spot ) )
+ {
+ // Round to nearest X,Y grid
+ spot.mdV[VX] = floor( spot.mdV[VX] + 0.5 );
+ spot.mdV[VY] = floor( spot.mdV[VY] + 0.5 );
+
+ modifyLandAtPointGlobal(spot, gKeyboard->currentMask(TRUE));
+ }
}
BOOL LLToolBrushLand::handleMouseDown(S32 x, S32 y, MASK mask)
{
- BOOL handled = FALSE;
-
- // Find the z value of the initial click.
- LLVector3d spot;
- if( gViewerWindow->mousePointOnLandGlobal( x, y, &spot ) )
- {
- // Round to nearest X,Y grid
- spot.mdV[VX] = floor( spot.mdV[VX] + 0.5 );
- spot.mdV[VY] = floor( spot.mdV[VY] + 0.5 );
-
- LLRegionPosition region_position( spot );
- LLViewerRegion* regionp = region_position.getRegion();
-
- if (!canTerraformRegion(regionp))
- {
- alertNoTerraformRegion(regionp);
- return TRUE;
- }
-
- if (!canTerraformParcel(regionp))
- {
- alertNoTerraformParcel();
- }
-
- LLVector3 pos_region = region_position.getPositionRegion();
- U32 grids = regionp->getLand().mGridsPerEdge;
- S32 i = llclamp( (S32)pos_region.mV[VX], 0, (S32)grids );
- S32 j = llclamp( (S32)pos_region.mV[VY], 0, (S32)grids );
- mStartingZ = regionp->getLand().getZ(i+j*grids);
- mMouseX = x;
- mMouseY = y;
- gIdleCallbacks.addFunction( &LLToolBrushLand::onIdle, (void*)this );
- setMouseCapture( TRUE );
-
- LLViewerParcelMgr::getInstance()->setSelectionVisible(FALSE);
- handled = TRUE;
- }
-
- return handled;
+ BOOL handled = FALSE;
+
+ // Find the z value of the initial click.
+ LLVector3d spot;
+ if( gViewerWindow->mousePointOnLandGlobal( x, y, &spot ) )
+ {
+ // Round to nearest X,Y grid
+ spot.mdV[VX] = floor( spot.mdV[VX] + 0.5 );
+ spot.mdV[VY] = floor( spot.mdV[VY] + 0.5 );
+
+ LLRegionPosition region_position( spot );
+ LLViewerRegion* regionp = region_position.getRegion();
+
+ if (!canTerraformRegion(regionp))
+ {
+ alertNoTerraformRegion(regionp);
+ return TRUE;
+ }
+
+ if (!canTerraformParcel(regionp))
+ {
+ alertNoTerraformParcel();
+ }
+
+ LLVector3 pos_region = region_position.getPositionRegion();
+ U32 grids = regionp->getLand().mGridsPerEdge;
+ S32 i = llclamp( (S32)pos_region.mV[VX], 0, (S32)grids );
+ S32 j = llclamp( (S32)pos_region.mV[VY], 0, (S32)grids );
+ mStartingZ = regionp->getLand().getZ(i+j*grids);
+ mMouseX = x;
+ mMouseY = y;
+ gIdleCallbacks.addFunction( &LLToolBrushLand::onIdle, (void*)this );
+ setMouseCapture( TRUE );
+
+ LLViewerParcelMgr::getInstance()->setSelectionVisible(FALSE);
+ handled = TRUE;
+ }
+
+ return handled;
}
BOOL LLToolBrushLand::handleHover( S32 x, S32 y, MASK mask )
{
- LL_DEBUGS("UserInput") << "hover handled by LLToolBrushLand ("
- << (hasMouseCapture() ? "active":"inactive")
- << ")" << LL_ENDL;
- mMouseX = x;
- mMouseY = y;
- mGotHover = TRUE;
- gViewerWindow->setCursor(UI_CURSOR_TOOLLAND);
-
- LLVector3d spot;
- if( gViewerWindow->mousePointOnLandGlobal( mMouseX, mMouseY, &spot ) )
- {
-
- spot.mdV[VX] = floor( spot.mdV[VX] + 0.5 );
- spot.mdV[VY] = floor( spot.mdV[VY] + 0.5 );
-
- LLViewerParcelMgr::getInstance()->setHoverParcel(spot);
- }
- return TRUE;
+ LL_DEBUGS("UserInput") << "hover handled by LLToolBrushLand ("
+ << (hasMouseCapture() ? "active":"inactive")
+ << ")" << LL_ENDL;
+ mMouseX = x;
+ mMouseY = y;
+ mGotHover = TRUE;
+ gViewerWindow->setCursor(UI_CURSOR_TOOLLAND);
+
+ LLVector3d spot;
+ if( gViewerWindow->mousePointOnLandGlobal( mMouseX, mMouseY, &spot ) )
+ {
+
+ spot.mdV[VX] = floor( spot.mdV[VX] + 0.5 );
+ spot.mdV[VY] = floor( spot.mdV[VY] + 0.5 );
+
+ LLViewerParcelMgr::getInstance()->setHoverParcel(spot);
+ }
+ return TRUE;
}
BOOL LLToolBrushLand::handleMouseUp(S32 x, S32 y, MASK mask)
{
- BOOL handled = FALSE;
- mLastAffectedRegions.clear();
- if( hasMouseCapture() )
- {
- // Release the mouse
- setMouseCapture( FALSE );
+ BOOL handled = FALSE;
+ mLastAffectedRegions.clear();
+ if( hasMouseCapture() )
+ {
+ // Release the mouse
+ setMouseCapture( FALSE );
- LLViewerParcelMgr::getInstance()->setSelectionVisible(TRUE);
+ LLViewerParcelMgr::getInstance()->setSelectionVisible(TRUE);
- gIdleCallbacks.deleteFunction( &LLToolBrushLand::onIdle, (void*)this );
- handled = TRUE;
- }
+ gIdleCallbacks.deleteFunction( &LLToolBrushLand::onIdle, (void*)this );
+ handled = TRUE;
+ }
- return handled;
+ return handled;
}
void LLToolBrushLand::handleSelect()
{
- gEditMenuHandler = this;
+ gEditMenuHandler = this;
- gFloaterTools->setStatusText("modifyland");
-// if (!mBrushSelected)
- {
- mBrushSelected = TRUE;
- }
+ gFloaterTools->setStatusText("modifyland");
+// if (!mBrushSelected)
+ {
+ mBrushSelected = TRUE;
+ }
}
void LLToolBrushLand::handleDeselect()
{
- if( gEditMenuHandler == this )
- {
- gEditMenuHandler = NULL;
- }
- LLViewerParcelMgr::getInstance()->setSelectionVisible(TRUE);
- mBrushSelected = FALSE;
+ if( gEditMenuHandler == this )
+ {
+ gEditMenuHandler = NULL;
+ }
+ LLViewerParcelMgr::getInstance()->setSelectionVisible(TRUE);
+ mBrushSelected = FALSE;
}
// Draw the area that will be affected.
void LLToolBrushLand::render()
{
- if(mGotHover)
- {
- //LL_INFOS() << "LLToolBrushLand::render()" << LL_ENDL;
- LLVector3d spot;
- if(gViewerWindow->mousePointOnLandGlobal(mMouseX, mMouseY, &spot))
- {
- spot.mdV[VX] = floor( spot.mdV[VX] + 0.5 );
- spot.mdV[VY] = floor( spot.mdV[VY] + 0.5 );
-
- mBrushSize = gSavedSettings.getF32("LandBrushSize");
-
- region_list_t regions;
- determineAffectedRegions(regions, spot);
-
- // Now, for each region, render the overlay
- LLVector3 pos_world = gAgent.getRegion()->getPosRegionFromGlobal(spot);
- for(region_list_t::iterator iter = regions.begin();
- iter != regions.end(); ++iter)
- {
- LLViewerRegion* region = *iter;
- renderOverlay(region->getLand(),
- region->getPosRegionFromGlobal(spot),
- pos_world);
- }
- }
- mGotHover = FALSE;
- }
+ if(mGotHover)
+ {
+ //LL_INFOS() << "LLToolBrushLand::render()" << LL_ENDL;
+ LLVector3d spot;
+ if(gViewerWindow->mousePointOnLandGlobal(mMouseX, mMouseY, &spot))
+ {
+ spot.mdV[VX] = floor( spot.mdV[VX] + 0.5 );
+ spot.mdV[VY] = floor( spot.mdV[VY] + 0.5 );
+
+ mBrushSize = gSavedSettings.getF32("LandBrushSize");
+
+ region_list_t regions;
+ determineAffectedRegions(regions, spot);
+
+ // Now, for each region, render the overlay
+ LLVector3 pos_world = gAgent.getRegion()->getPosRegionFromGlobal(spot);
+ for(region_list_t::iterator iter = regions.begin();
+ iter != regions.end(); ++iter)
+ {
+ LLViewerRegion* region = *iter;
+ renderOverlay(region->getLand(),
+ region->getPosRegionFromGlobal(spot),
+ pos_world);
+ }
+ }
+ mGotHover = FALSE;
+ }
}
/*
@@ -502,214 +502,214 @@ void LLToolBrushLand::render()
* with lengths indicating the current "strength" slider.
* Decorate the tops and bottoms of the lines like this:
*
- * Raise Revert
- * /|\ ___
- * | |
- * | |
+ * Raise Revert
+ * /|\ ___
+ * | |
+ * | |
*
- * Rough Smooth
- * /|\ ___
- * | |
- * | |
- * \|/..........._|_
+ * Rough Smooth
+ * /|\ ___
+ * | |
+ * | |
+ * \|/..........._|_
*
- * Lower Flatten
- * | |
- * | |
- * \|/..........._|_
+ * Lower Flatten
+ * | |
+ * | |
+ * \|/..........._|_
*/
void LLToolBrushLand::renderOverlay(LLSurface& land, const LLVector3& pos_region,
- const LLVector3& pos_world)
+ const LLVector3& pos_world)
{
- gGL.matrixMode(LLRender::MM_MODELVIEW);
- gGL.getTexUnit(0)->unbind(LLTexUnit::TT_TEXTURE);
- LLGLDepthTest mDepthTest(GL_TRUE);
- gGL.pushMatrix();
- gGL.color4fv(OVERLAY_COLOR.mV);
- gGL.translatef(0.0f, 0.0f, 1.0f);
-
- S32 i = (S32) pos_region.mV[VX];
- S32 j = (S32) pos_region.mV[VY];
- S32 half_edge = llfloor(mBrushSize);
- S32 radioAction = gSavedSettings.getS32("RadioLandBrushAction");
- F32 force = gSavedSettings.getF32("LandBrushForce"); // .1 to 100?
-
- gGL.begin(LLRender::LINES);
- for(S32 di = -half_edge; di <= half_edge; di++)
- {
- if((i+di) < 0 || (i+di) >= (S32)land.mGridsPerEdge) continue;
- for(S32 dj = -half_edge; dj <= half_edge; dj++)
- {
- if( (j+dj) < 0 || (j+dj) >= (S32)land.mGridsPerEdge ) continue;
- const F32
- wx = pos_world.mV[VX] + di,
- wy = pos_world.mV[VY] + dj,
- wz = land.getZ((i+di)+(j+dj)*land.mGridsPerEdge),
- norm_dist = sqrt((float)di*di + dj*dj) / half_edge,
- force_scale = sqrt(2.f) - norm_dist, // 1 at center, 0 at corner
- wz2 = wz + .2 + (.2 + force/100) * force_scale, // top vertex
- tic = .075f; // arrowhead size
- // vertical line
- gGL.vertex3f(wx, wy, wz);
- gGL.vertex3f(wx, wy, wz2);
- if(radioAction == E_LAND_RAISE || radioAction == E_LAND_NOISE) // up arrow
- {
- gGL.vertex3f(wx, wy, wz2);
- gGL.vertex3f(wx+tic, wy, wz2-tic);
- gGL.vertex3f(wx, wy, wz2);
- gGL.vertex3f(wx-tic, wy, wz2-tic);
- }
- if(radioAction == E_LAND_LOWER || radioAction == E_LAND_NOISE) // down arrow
- {
- gGL.vertex3f(wx, wy, wz);
- gGL.vertex3f(wx+tic, wy, wz+tic);
- gGL.vertex3f(wx, wy, wz);
- gGL.vertex3f(wx-tic, wy, wz+tic);
- }
- if(radioAction == E_LAND_REVERT || radioAction == E_LAND_SMOOTH) // flat top
- {
- gGL.vertex3f(wx-tic, wy, wz2);
- gGL.vertex3f(wx+tic, wy, wz2);
- }
- if(radioAction == E_LAND_LEVEL || radioAction == E_LAND_SMOOTH) // flat bottom
- {
- gGL.vertex3f(wx-tic, wy, wz);
- gGL.vertex3f(wx+tic, wy, wz);
- }
- }
- }
- gGL.end();
-
- gGL.popMatrix();
+ gGL.matrixMode(LLRender::MM_MODELVIEW);
+ gGL.getTexUnit(0)->unbind(LLTexUnit::TT_TEXTURE);
+ LLGLDepthTest mDepthTest(GL_TRUE);
+ gGL.pushMatrix();
+ gGL.color4fv(OVERLAY_COLOR.mV);
+ gGL.translatef(0.0f, 0.0f, 1.0f);
+
+ S32 i = (S32) pos_region.mV[VX];
+ S32 j = (S32) pos_region.mV[VY];
+ S32 half_edge = llfloor(mBrushSize);
+ S32 radioAction = gSavedSettings.getS32("RadioLandBrushAction");
+ F32 force = gSavedSettings.getF32("LandBrushForce"); // .1 to 100?
+
+ gGL.begin(LLRender::LINES);
+ for(S32 di = -half_edge; di <= half_edge; di++)
+ {
+ if((i+di) < 0 || (i+di) >= (S32)land.mGridsPerEdge) continue;
+ for(S32 dj = -half_edge; dj <= half_edge; dj++)
+ {
+ if( (j+dj) < 0 || (j+dj) >= (S32)land.mGridsPerEdge ) continue;
+ const F32
+ wx = pos_world.mV[VX] + di,
+ wy = pos_world.mV[VY] + dj,
+ wz = land.getZ((i+di)+(j+dj)*land.mGridsPerEdge),
+ norm_dist = sqrt((float)di*di + dj*dj) / half_edge,
+ force_scale = sqrt(2.f) - norm_dist, // 1 at center, 0 at corner
+ wz2 = wz + .2 + (.2 + force/100) * force_scale, // top vertex
+ tic = .075f; // arrowhead size
+ // vertical line
+ gGL.vertex3f(wx, wy, wz);
+ gGL.vertex3f(wx, wy, wz2);
+ if(radioAction == E_LAND_RAISE || radioAction == E_LAND_NOISE) // up arrow
+ {
+ gGL.vertex3f(wx, wy, wz2);
+ gGL.vertex3f(wx+tic, wy, wz2-tic);
+ gGL.vertex3f(wx, wy, wz2);
+ gGL.vertex3f(wx-tic, wy, wz2-tic);
+ }
+ if(radioAction == E_LAND_LOWER || radioAction == E_LAND_NOISE) // down arrow
+ {
+ gGL.vertex3f(wx, wy, wz);
+ gGL.vertex3f(wx+tic, wy, wz+tic);
+ gGL.vertex3f(wx, wy, wz);
+ gGL.vertex3f(wx-tic, wy, wz+tic);
+ }
+ if(radioAction == E_LAND_REVERT || radioAction == E_LAND_SMOOTH) // flat top
+ {
+ gGL.vertex3f(wx-tic, wy, wz2);
+ gGL.vertex3f(wx+tic, wy, wz2);
+ }
+ if(radioAction == E_LAND_LEVEL || radioAction == E_LAND_SMOOTH) // flat bottom
+ {
+ gGL.vertex3f(wx-tic, wy, wz);
+ gGL.vertex3f(wx+tic, wy, wz);
+ }
+ }
+ }
+ gGL.end();
+
+ gGL.popMatrix();
}
void LLToolBrushLand::determineAffectedRegions(region_list_t& regions,
- const LLVector3d& spot ) const
+ const LLVector3d& spot ) const
{
- LLVector3d corner(spot);
- corner.mdV[VX] -= (mBrushSize / 2);
- corner.mdV[VY] -= (mBrushSize / 2);
- LLViewerRegion* region = NULL;
- region = LLWorld::getInstance()->getRegionFromPosGlobal(corner);
- if(region && regions.find(region) == regions.end())
- {
- regions.insert(region);
- }
- corner.mdV[VY] += mBrushSize;
- region = LLWorld::getInstance()->getRegionFromPosGlobal(corner);
- if(region && regions.find(region) == regions.end())
- {
- regions.insert(region);
- }
- corner.mdV[VX] += mBrushSize;
- region = LLWorld::getInstance()->getRegionFromPosGlobal(corner);
- if(region && regions.find(region) == regions.end())
- {
- regions.insert(region);
- }
- corner.mdV[VY] -= mBrushSize;
- region = LLWorld::getInstance()->getRegionFromPosGlobal(corner);
- if(region && regions.find(region) == regions.end())
- {
- regions.insert(region);
- }
+ LLVector3d corner(spot);
+ corner.mdV[VX] -= (mBrushSize / 2);
+ corner.mdV[VY] -= (mBrushSize / 2);
+ LLViewerRegion* region = NULL;
+ region = LLWorld::getInstance()->getRegionFromPosGlobal(corner);
+ if(region && regions.find(region) == regions.end())
+ {
+ regions.insert(region);
+ }
+ corner.mdV[VY] += mBrushSize;
+ region = LLWorld::getInstance()->getRegionFromPosGlobal(corner);
+ if(region && regions.find(region) == regions.end())
+ {
+ regions.insert(region);
+ }
+ corner.mdV[VX] += mBrushSize;
+ region = LLWorld::getInstance()->getRegionFromPosGlobal(corner);
+ if(region && regions.find(region) == regions.end())
+ {
+ regions.insert(region);
+ }
+ corner.mdV[VY] -= mBrushSize;
+ region = LLWorld::getInstance()->getRegionFromPosGlobal(corner);
+ if(region && regions.find(region) == regions.end())
+ {
+ regions.insert(region);
+ }
}
// static
void LLToolBrushLand::onIdle( void* brush_tool )
{
- LLToolBrushLand* self = reinterpret_cast<LLToolBrushLand*>(brush_tool);
-
- if( LLToolMgr::getInstance()->getCurrentTool() == self )
- {
- self->brush();
- }
- else
- {
- gIdleCallbacks.deleteFunction( &LLToolBrushLand::onIdle, self );
- }
+ LLToolBrushLand* self = reinterpret_cast<LLToolBrushLand*>(brush_tool);
+
+ if( LLToolMgr::getInstance()->getCurrentTool() == self )
+ {
+ self->brush();
+ }
+ else
+ {
+ gIdleCallbacks.deleteFunction( &LLToolBrushLand::onIdle, self );
+ }
}
void LLToolBrushLand::onMouseCaptureLost()
{
- gIdleCallbacks.deleteFunction(&LLToolBrushLand::onIdle, this);
+ gIdleCallbacks.deleteFunction(&LLToolBrushLand::onIdle, this);
}
// static
void LLToolBrushLand::undo()
{
- for(region_list_t::iterator iter = mLastAffectedRegions.begin();
- iter != mLastAffectedRegions.end(); ++iter)
- {
- LLViewerRegion* regionp = *iter;
- gMessageSystem->newMessageFast(_PREHASH_UndoLand);
- gMessageSystem->nextBlockFast(_PREHASH_AgentData);
- gMessageSystem->addUUIDFast(_PREHASH_AgentID, gAgent.getID() );
- gMessageSystem->addUUIDFast(_PREHASH_SessionID, gAgent.getSessionID());
- gMessageSystem->sendMessage(regionp->getHost());
- }
+ for(region_list_t::iterator iter = mLastAffectedRegions.begin();
+ iter != mLastAffectedRegions.end(); ++iter)
+ {
+ LLViewerRegion* regionp = *iter;
+ gMessageSystem->newMessageFast(_PREHASH_UndoLand);
+ gMessageSystem->nextBlockFast(_PREHASH_AgentData);
+ gMessageSystem->addUUIDFast(_PREHASH_AgentID, gAgent.getID() );
+ gMessageSystem->addUUIDFast(_PREHASH_SessionID, gAgent.getSessionID());
+ gMessageSystem->sendMessage(regionp->getHost());
+ }
}
// static
/*
void LLToolBrushLand::redo()
{
- for(region_list_t::iterator iter = mLastAffectedRegions.begin();
- iter != mLastAffectedRegions.end(); ++iter)
- {
- LLViewerRegion* regionp = *iter;
- gMessageSystem->newMessageFast(_PREHASH_RedoLand);
- gMessageSystem->nextBlockFast(_PREHASH_AgentData);
- gMessageSystem->addUUIDFast(_PREHASH_AgentID, gAgent.getID() );
- gMessageSystem->addUUIDFast(_PREHASH_SessionID, gAgent.getSessionID());
- gMessageSystem->sendMessage(regionp->getHost());
- }
+ for(region_list_t::iterator iter = mLastAffectedRegions.begin();
+ iter != mLastAffectedRegions.end(); ++iter)
+ {
+ LLViewerRegion* regionp = *iter;
+ gMessageSystem->newMessageFast(_PREHASH_RedoLand);
+ gMessageSystem->nextBlockFast(_PREHASH_AgentData);
+ gMessageSystem->addUUIDFast(_PREHASH_AgentID, gAgent.getID() );
+ gMessageSystem->addUUIDFast(_PREHASH_SessionID, gAgent.getSessionID());
+ gMessageSystem->sendMessage(regionp->getHost());
+ }
}*/
// static
bool LLToolBrushLand::canTerraformRegion(LLViewerRegion* regionp) const
{
- if (!regionp) return false;
- if (regionp->canManageEstate()) return true;
- return !regionp->getRegionFlag(REGION_FLAGS_BLOCK_TERRAFORM);
+ if (!regionp) return false;
+ if (regionp->canManageEstate()) return true;
+ return !regionp->getRegionFlag(REGION_FLAGS_BLOCK_TERRAFORM);
}
// static
bool LLToolBrushLand::canTerraformParcel(LLViewerRegion* regionp) const
{
- LLParcel* selected_parcel = LLViewerParcelMgr::getInstance()->getHoverParcel();
- bool is_terraform_allowed = false;
- if (selected_parcel)
- {
- BOOL owner_release = LLViewerParcelMgr::isParcelOwnedByAgent(selected_parcel, GP_LAND_ALLOW_EDIT_LAND);
- is_terraform_allowed = ( gAgent.canManageEstate() || (selected_parcel->getOwnerID() == regionp->getOwner()) || owner_release);
- }
-
- return is_terraform_allowed;
+ LLParcel* selected_parcel = LLViewerParcelMgr::getInstance()->getHoverParcel();
+ bool is_terraform_allowed = false;
+ if (selected_parcel)
+ {
+ BOOL owner_release = LLViewerParcelMgr::isParcelOwnedByAgent(selected_parcel, GP_LAND_ALLOW_EDIT_LAND);
+ is_terraform_allowed = ( gAgent.canManageEstate() || (selected_parcel->getOwnerID() == regionp->getOwner()) || owner_release);
+ }
+
+ return is_terraform_allowed;
}
// static
void LLToolBrushLand::alertNoTerraformRegion(LLViewerRegion* regionp)
{
- if (!regionp) return;
-
- LLSD args;
- args["REGION"] = regionp->getName();
- LLNotificationsUtil::add("RegionNoTerraforming", args);
+ if (!regionp) return;
+
+ LLSD args;
+ args["REGION"] = regionp->getName();
+ LLNotificationsUtil::add("RegionNoTerraforming", args);
}
// static
void LLToolBrushLand::alertNoTerraformParcel()
{
- LLParcel* selected_parcel = LLViewerParcelMgr::getInstance()->getHoverParcel();
- if (selected_parcel)
- {
- LLSD args;
- args["PARCEL"] = selected_parcel->getName();
- LLNotificationsUtil::add("ParcelNoTerraforming", args);
- }
+ LLParcel* selected_parcel = LLViewerParcelMgr::getInstance()->getHoverParcel();
+ if (selected_parcel)
+ {
+ LLSD args;
+ args["PARCEL"] = selected_parcel->getName();
+ LLNotificationsUtil::add("ParcelNoTerraforming", args);
+ }
}