diff -wru -X x.txt linden-orig\/indra/llmath/xform.h linden\/indra/llmath/xform.h --- linden-orig\/indra/llmath/xform.h 2008-04-07 19:45:36.000000000 -0400 +++ linden\/indra/llmath/xform.h 2008-05-12 23:33:59.991000000 -0400 @@ -35,10 +35,14 @@ #include "m4math.h" #include "llquaternion.h" -const F32 MAX_OBJECT_Z = 768.f; +const F32 MAX_OBJECT_Z = 4096.f; const F32 MIN_OBJECT_Z = -256.f; -const F32 MIN_OBJECT_SCALE = 0.01f; -const F32 MAX_OBJECT_SCALE = 10.f; +const F32 MIN_OBJECT_SCALE = 0.0001f; +const F32 MAX_OBJECT_SCALE = 256.; +// disable editing of the scale for megaprims, since they will have their scale clamped +//*TODO: remove this once the sim supports resizing megaprims +const F32 SCALE_EDITABLE_MAX = 10.f; + class LLXform { diff -wru -X x.txt linden-orig\/indra/newview/llcontroldef.cpp linden\/indra/newview/llcontroldef.cpp --- linden-orig\/indra/newview/llcontroldef.cpp 2008-04-07 19:45:42.000000000 -0400 +++ linden\/indra/newview/llcontroldef.cpp 2008-05-13 14:55:11.074000000 -0400 @@ -1582,6 +1586,13 @@ gSavedSettings.declareBOOL("SaveMinidump", TRUE, "Save minidump for developer debugging on crash"); + // default new object scale + gSavedSettings.declareF32("RezNewScaleX", 0.5f, "Default X dimension scale when creating a new prim"); + gSavedSettings.declareF32("RezNewScaleY", 0.5f, "Default Y dimension scale when creating a new prim"); + gSavedSettings.declareF32("RezNewScaleZ", 0.5f, "Default Z dimension scale when creating a new prim"); + + gSavedSettings.declareBOOL("RezLargePrimsEditable", FALSE, "Enable editing of large prims after they are created (Default: FALSE)"); + // // crash_settings.xml // diff -wru -X x.txt linden-orig\/indra/newview/llfloatertools.cpp linden\/indra/newview/llfloatertools.cpp --- linden-orig\/indra/newview/llfloatertools.cpp 2008-04-07 19:45:42.000000000 -0400 +++ linden\/indra/newview/llfloatertools.cpp 2008-05-12 23:07:42.975000000 -0400 @@ -54,6 +54,7 @@ #include "llpanelvolume.h" #include "llpanelpermissions.h" #include "llselectmgr.h" +#include "llspinctrl.h" #include "llstatusbar.h" #include "lltabcontainer.h" #include "lltextbox.h" @@ -114,6 +115,10 @@ void commit_radio_pan(LLUICtrl *, void*); void commit_grid_mode(LLUICtrl *, void*); void commit_slider_zoom(LLUICtrl *, void*); +void commit_new_x(LLUICtrl *ctrl, void *data); +void commit_new_y(LLUICtrl *ctrl, void *data); +void commit_new_z(LLUICtrl *ctrl, void *data); +void reset_new(void *data); //static @@ -284,6 +289,24 @@ childSetValue("checkbox copy centers",(BOOL)gSavedSettings.getBOOL("CreateToolCopyCenters")); mCheckCopyRotates = LLUICtrlFactory::getCheckBoxByName(this,"checkbox copy rotates"); childSetValue("checkbox copy rotates",(BOOL)gSavedSettings.getBOOL("CreateToolCopyRotates")); + + mLabelNewSize = LLUICtrlFactory::getTextBoxByName(this, "CreateToolNewSizeLabel"); + + mSpinNewX = LLUICtrlFactory::getSpinnerByName(this, "CreateToolNewX"); + childSetValue("CreateToolNewX", (F32)gSavedSettings.getF32("RezNewScaleX")); + childSetCommitCallback("CreateToolNewX", commit_new_x, mSpinNewX); + + mSpinNewY = LLUICtrlFactory::getSpinnerByName(this, "CreateToolNewY"); + childSetValue("CreateToolNewY", (F32)gSavedSettings.getF32("RezNewScaleY")); + childSetCommitCallback("CreateToolNewY", commit_new_y, mSpinNewY); + + mSpinNewZ = LLUICtrlFactory::getSpinnerByName(this, "CreateToolNewZ"); + childSetValue("CreateToolNewZ", (F32)gSavedSettings.getF32("RezNewScaleZ")); + childSetCommitCallback("CreateToolNewZ", commit_new_z, mSpinNewZ); + + mButtonNewReset = LLUICtrlFactory::getButtonByName(this, "CreateToolNewScaleResetButton"); + childSetAction("CreateToolNewScaleResetButton", reset_new, this); + mRadioSelectLand = LLUICtrlFactory::getCheckBoxByName(this,"radio select land"); childSetCommitCallback("radio select land",commit_select_tool, gToolParcel); mRadioDozerFlatten = LLUICtrlFactory::getCheckBoxByName(this,"radio flatten"); @@ -373,6 +396,13 @@ mCheckCopySelection(NULL), mCheckCopyCenters(NULL), mCheckCopyRotates(NULL), + + mLabelNewSize(NULL), + mSpinNewX(NULL), + mSpinNewY(NULL), + mSpinNewZ(NULL), + mButtonNewReset(NULL), + mRadioSelectLand(NULL), mRadioDozerFlatten(NULL), mRadioDozerRaise(NULL), @@ -463,6 +493,10 @@ mTab->enableTabButton(idx_face, all_volume); mTab->enableTabButton(idx_contents, all_volume); + childSetValue("CreateToolNewX", (F32)gSavedSettings.getF32("RezNewScaleX")); + childSetValue("CreateToolNewY", (F32)gSavedSettings.getF32("RezNewScaleY")); + childSetValue("CreateToolNewZ", (F32)gSavedSettings.getF32("RezNewScaleZ")); + mPanelPermissions->refresh(); mPanelObject->refresh(); mPanelVolume->refresh(); @@ -674,6 +708,12 @@ if (mCheckCopyCenters) mCheckCopyCenters ->setVisible( create_visible ); if (mCheckCopyRotates) mCheckCopyRotates ->setVisible( create_visible ); + if (mLabelNewSize) mLabelNewSize ->setVisible( create_visible ); + if (mSpinNewX) mSpinNewX ->setVisible( create_visible ); + if (mSpinNewY) mSpinNewY ->setVisible( create_visible ); + if (mSpinNewZ) mSpinNewZ ->setVisible( create_visible ); + if (mButtonNewReset) mButtonNewReset->setVisible( create_visible ); + if (mCheckCopyCenters) mCheckCopyCenters->setEnabled( mCheckCopySelection->get() ); if (mCheckCopyRotates) mCheckCopyRotates->setEnabled( mCheckCopySelection->get() ); @@ -935,6 +975,40 @@ gSavedSettings.setBOOL("ShowParcelOwners", show_owners); } +void commit_new_x(LLUICtrl *ctrl, void *data) +{ + LLSpinCtrl* spin = (LLSpinCtrl*) data; + gSavedSettings.setF32("RezNewScaleX", spin->get()); +} + +void commit_new_y(LLUICtrl *ctrl, void *data) +{ + LLSpinCtrl* spin = (LLSpinCtrl*) data; + gSavedSettings.setF32("RezNewScaleY", spin->get()); +} + +void commit_new_z(LLUICtrl *ctrl, void *data) +{ + LLSpinCtrl* spin = (LLSpinCtrl*) data; + gSavedSettings.setF32("RezNewScaleZ", spin->get()); +} + +void reset_new(void *data) +{ + const LLVector3 RESET_NEW_SCALE(0.5f, 0.5f, 0.5f); + + gSavedSettings.setF32("RezNewScaleX", RESET_NEW_SCALE.mV[VX]); + gSavedSettings.setF32("RezNewScaleY", RESET_NEW_SCALE.mV[VY]); + gSavedSettings.setF32("RezNewScaleZ", RESET_NEW_SCALE.mV[VZ]); + + LLFloaterTools* tools = (LLFloaterTools *)data; + if (tools) + { + tools->dirty(); + tools->draw(); + } +} + void commit_select_component(LLUICtrl *ctrl, void *data) { LLFloaterTools* floaterp = (LLFloaterTools*)data; diff -wru -X x.txt linden-orig\/indra/newview/llfloatertools.h linden\/indra/newview/llfloatertools.h --- linden-orig\/indra/newview/llfloatertools.h 2008-04-07 19:45:40.000000000 -0400 +++ linden\/indra/newview/llfloatertools.h 2008-05-12 23:07:41.967000000 -0400 @@ -50,6 +50,7 @@ class LLComboBox; class LLParcelSelection; class LLObjectSelection; +class LLSpinCtrl; typedef LLSafeHandle LLObjectSelectionHandle; @@ -157,6 +158,12 @@ LLCheckBoxCtrl *mCheckCopyCenters; LLCheckBoxCtrl *mCheckCopyRotates; + LLTextBox *mLabelNewSize; + LLSpinCtrl *mSpinNewX; + LLSpinCtrl *mSpinNewY; + LLSpinCtrl *mSpinNewZ; + LLButton *mButtonNewReset; + // Land buttons // LLCheckBoxCtrl *mRadioEditLand; LLCheckBoxCtrl *mRadioSelectLand; diff -wru -X x.txt linden-orig\/indra/newview/llmanipscale.cpp linden\/indra/newview/llmanipscale.cpp --- linden-orig\/indra/newview/llmanipscale.cpp 2008-04-07 19:45:42.000000000 -0400 +++ linden\/indra/newview/llmanipscale.cpp 2008-05-13 14:55:07.753000000 -0400 @@ -2056,5 +2056,19 @@ } func; can_scale = mObjectSelection->applyToObjects(&func); } + if (can_scale && (gSavedSettings.getBOOL("RezLargePrimsEditable") == FALSE)) + { + // can't scale megaprims + //*TODO: remove this once the sim supports resizing megaprims + struct f : public LLSelectedObjectFunctor + { + virtual bool apply(LLViewerObject* objectp) + { + // ensure all dimensions of all prims are less than or equal to max editable scale + return (llmax(objectp->getScale().mV[VX], objectp->getScale().mV[VY], objectp->getScale().mV[VZ]) <= SCALE_EDITABLE_MAX); + } + } func; + can_scale = mObjectSelection->applyToObjects(&func); + } return can_scale; } diff -wru -X x.txt linden-orig\/indra/newview/llpanelobject.cpp linden\/indra/newview/llpanelobject.cpp --- linden-orig\/indra/newview/llpanelobject.cpp 2008-04-07 19:45:42.000000000 -0400 +++ linden\/indra/newview/llpanelobject.cpp 2008-05-13 14:55:09.571000000 -0400 @@ -389,12 +393,23 @@ mCtrlScaleX->set( vec.mV[VX] ); mCtrlScaleY->set( vec.mV[VY] ); mCtrlScaleZ->set( vec.mV[VZ] ); + + // can't scale megaprims + //*TODO: remove this once the sim supports resizing megaprims + if ((llmax(vec.mV[VX], vec.mV[VY], vec.mV[VZ]) > SCALE_EDITABLE_MAX) && (gSavedSettings.getBOOL("RezLargePrimsEditable") == FALSE)) + { + enable_scale = FALSE; + } } else { diff -wru -X x.txt linden-orig\/indra/newview/lltoolplacer.cpp linden\/indra/newview/lltoolplacer.cpp --- linden-orig\/indra/newview/lltoolplacer.cpp 2008-04-07 19:45:42.000000000 -0400 +++ linden\/indra/newview/lltoolplacer.cpp 2008-05-12 16:50:48.455000000 -0400 @@ -36,6 +36,7 @@ // linden library headers #include "llprimitive.h" +#include "llmath.h" // viewer headers #include "llbutton.h" @@ -64,8 +65,6 @@ #include "llviewercamera.h" #include "llviewerstats.h" -const LLVector3 DEFAULT_OBJECT_SCALE(0.5f, 0.5f, 0.5f); - //static LLPCode LLToolPlacer::sObjectType = LL_PCODE_CUBE; @@ -182,7 +181,11 @@ // Set params for new object based on its PCode. LLQuaternion rotation; - LLVector3 scale = DEFAULT_OBJECT_SCALE; + // clamp scale values so invalid values are ignored + F32 sx = llclamp(gSavedSettings.getF32("RezNewScaleX"), MIN_OBJECT_SCALE, MAX_OBJECT_SCALE); + F32 sy = llclamp(gSavedSettings.getF32("RezNewScaleY"), MIN_OBJECT_SCALE, MAX_OBJECT_SCALE); + F32 sz = llclamp(gSavedSettings.getF32("RezNewScaleZ"), MIN_OBJECT_SCALE, MAX_OBJECT_SCALE); + LLVector3 scale(sx, sy, sz); U8 material = LL_MCODE_WOOD; BOOL create_selected = FALSE; LLVolumeParams volume_params; diff -wru -X x.txt linden-orig\/indra/newview/llviewermenu.cpp linden\/indra/newview/llviewermenu.cpp --- linden-orig\/indra/newview/llviewermenu.cpp 2008-04-07 19:45:42.000000000 -0400 +++ linden\/indra/newview/llviewermenu.cpp 2008-05-13 16:51:11.799000000 -0400 @@ -1060,6 +1062,12 @@ menu->append(new LLMenuItemCallGL("Compress Image...", &handle_compress_image, NULL, NULL)); + menu->append(new LLMenuItemCheckGL("Allow Large Prim Editing", + &menu_toggle_control, + NULL, + &menu_check_control, + (void*)"RezLargePrimsEditable")); + menu->append(new LLMenuItemCheckGL("Limit Select Distance", &menu_toggle_control, NULL, diff -wru -X x.txt linden-orig\/indra/newview/skins/xui/en-us/floater_tools.xml linden\/indra/newview/skins/xui/en-us/floater_tools.xml --- linden-orig\/indra/newview/skins/xui/en-us/floater_tools.xml 2008-04-07 19:45:42.000000000 -0400 +++ linden\/indra/newview/skins/xui/en-us/floater_tools.xml 2008-05-12 23:34:01.020000000 -0400 @@ -208,6 +208,26 @@ image_unselected="object_grass.tga" label="" label_selected="" left_delta="23" mouse_opaque="true" name="ToolGrass" scale_image="TRUE" width="24" /> +