llpanelobject.cpp
上传用户:king477883
上传日期:2021-03-01
资源大小:9553k
文件大小:56k
源码类别:

游戏引擎

开发平台:

C++ Builder

  1. /** 
  2.  * @file llpanelobject.cpp
  3.  * @brief Object editing (position, scale, etc.) in the tools floater
  4.  *
  5.  * $LicenseInfo:firstyear=2001&license=viewergpl$
  6.  * 
  7.  * Copyright (c) 2001-2010, Linden Research, Inc.
  8.  * 
  9.  * Second Life Viewer Source Code
  10.  * The source code in this file ("Source Code") is provided by Linden Lab
  11.  * to you under the terms of the GNU General Public License, version 2.0
  12.  * ("GPL"), unless you have obtained a separate licensing agreement
  13.  * ("Other License"), formally executed by you and Linden Lab.  Terms of
  14.  * the GPL can be found in doc/GPL-license.txt in this distribution, or
  15.  * online at http://secondlifegrid.net/programs/open_source/licensing/gplv2
  16.  * 
  17.  * There are special exceptions to the terms and conditions of the GPL as
  18.  * it is applied to this Source Code. View the full text of the exception
  19.  * in the file doc/FLOSS-exception.txt in this software distribution, or
  20.  * online at
  21.  * http://secondlifegrid.net/programs/open_source/licensing/flossexception
  22.  * 
  23.  * By copying, modifying or distributing this software, you acknowledge
  24.  * that you have read and understood your obligations described above,
  25.  * and agree to abide by those obligations.
  26.  * 
  27.  * ALL LINDEN LAB SOURCE CODE IS PROVIDED "AS IS." LINDEN LAB MAKES NO
  28.  * WARRANTIES, EXPRESS, IMPLIED OR OTHERWISE, REGARDING ITS ACCURACY,
  29.  * COMPLETENESS OR PERFORMANCE.
  30.  * $/LicenseInfo$
  31.  */
  32. #include "llviewerprecompiledheaders.h"
  33. // file include
  34. #include "llpanelobject.h"
  35. // linden library includes
  36. #include "lleconomy.h"
  37. #include "llerror.h"
  38. #include "llfontgl.h"
  39. #include "llmaterialtable.h"
  40. #include "llpermissionsflags.h"
  41. #include "llstring.h"
  42. #include "llvolume.h"
  43. #include "material_codes.h"
  44. #include "m3math.h"
  45. // project includes
  46. #include "llagent.h"
  47. #include "llbutton.h"
  48. #include "llcheckboxctrl.h"
  49. #include "llcolorswatch.h"
  50. #include "llcombobox.h"
  51. #include "llfocusmgr.h"
  52. #include "llmanipscale.h"
  53. #include "llpreviewscript.h"
  54. #include "llresmgr.h"
  55. #include "llselectmgr.h"
  56. #include "llspinctrl.h"
  57. #include "lltexturectrl.h"
  58. #include "lltextbox.h"
  59. #include "lltool.h"
  60. #include "lltoolcomp.h"
  61. #include "lltoolmgr.h"
  62. #include "lltrans.h"
  63. #include "llui.h"
  64. #include "llviewerobject.h"
  65. #include "llviewerregion.h"
  66. #include "llviewerwindow.h"
  67. #include "llvovolume.h"
  68. #include "llworld.h"
  69. #include "pipeline.h"
  70. #include "llviewercontrol.h"
  71. #include "lluictrlfactory.h"
  72. //#include "llfirstuse.h"
  73. #include "lldrawpool.h"
  74. //
  75. // Constants
  76. //
  77. enum {
  78. MI_BOX,
  79. MI_CYLINDER,
  80. MI_PRISM,
  81. MI_SPHERE,
  82. MI_TORUS,
  83. MI_TUBE,
  84. MI_RING,
  85. MI_SCULPT,
  86. MI_NONE,
  87. MI_VOLUME_COUNT
  88. };
  89. enum {
  90. MI_HOLE_SAME,
  91. MI_HOLE_CIRCLE,
  92. MI_HOLE_SQUARE,
  93. MI_HOLE_TRIANGLE,
  94. MI_HOLE_COUNT
  95. };
  96. //static const std::string LEGACY_FULLBRIGHT_DESC =LLTrans::getString("Fullbright");
  97. BOOL LLPanelObject::postBuild()
  98. {
  99. setMouseOpaque(FALSE);
  100. std::map<std::string, std::string> material_name_map;
  101. material_name_map["Stone"]= LLTrans::getString("Stone");
  102. material_name_map["Metal"]= LLTrans::getString("Metal");
  103. material_name_map["Glass"]= LLTrans::getString("Glass");
  104. material_name_map["Wood"]= LLTrans::getString("Wood");
  105. material_name_map["Flesh"]= LLTrans::getString("Flesh");
  106. material_name_map["Plastic"]= LLTrans::getString("Plastic");
  107. material_name_map["Rubber"]= LLTrans::getString("Rubber");
  108. material_name_map["Light"]= LLTrans::getString("Light");
  109. LLMaterialTable::basic.initTableTransNames(material_name_map);
  110. //--------------------------------------------------------
  111. // Top
  112. //--------------------------------------------------------
  113. // Lock checkbox
  114. mCheckLock = getChild<LLCheckBoxCtrl>("checkbox locked");
  115. childSetCommitCallback("checkbox locked",onCommitLock,this);
  116. // Physical checkbox
  117. mCheckPhysics = getChild<LLCheckBoxCtrl>("Physical Checkbox Ctrl");
  118. childSetCommitCallback("Physical Checkbox Ctrl",onCommitPhysics,this);
  119. // Temporary checkbox
  120. mCheckTemporary = getChild<LLCheckBoxCtrl>("Temporary Checkbox Ctrl");
  121. childSetCommitCallback("Temporary Checkbox Ctrl",onCommitTemporary,this);
  122. // Phantom checkbox
  123. mCheckPhantom = getChild<LLCheckBoxCtrl>("Phantom Checkbox Ctrl");
  124. childSetCommitCallback("Phantom Checkbox Ctrl",onCommitPhantom,this);
  125. // Position
  126. mLabelPosition = getChild<LLTextBox>("label position");
  127. mCtrlPosX = getChild<LLSpinCtrl>("Pos X");
  128. childSetCommitCallback("Pos X",onCommitPosition,this);
  129. mCtrlPosY = getChild<LLSpinCtrl>("Pos Y");
  130. childSetCommitCallback("Pos Y",onCommitPosition,this);
  131. mCtrlPosZ = getChild<LLSpinCtrl>("Pos Z");
  132. childSetCommitCallback("Pos Z",onCommitPosition,this);
  133. // Scale
  134. mLabelSize = getChild<LLTextBox>("label size");
  135. mCtrlScaleX = getChild<LLSpinCtrl>("Scale X");
  136. childSetCommitCallback("Scale X",onCommitScale,this);
  137. // Scale Y
  138. mCtrlScaleY = getChild<LLSpinCtrl>("Scale Y");
  139. childSetCommitCallback("Scale Y",onCommitScale,this);
  140. // Scale Z
  141. mCtrlScaleZ = getChild<LLSpinCtrl>("Scale Z");
  142. childSetCommitCallback("Scale Z",onCommitScale,this);
  143. // Rotation
  144. mLabelRotation = getChild<LLTextBox>("label rotation");
  145. mCtrlRotX = getChild<LLSpinCtrl>("Rot X");
  146. childSetCommitCallback("Rot X",onCommitRotation,this);
  147. mCtrlRotY = getChild<LLSpinCtrl>("Rot Y");
  148. childSetCommitCallback("Rot Y",onCommitRotation,this);
  149. mCtrlRotZ = getChild<LLSpinCtrl>("Rot Z");
  150. childSetCommitCallback("Rot Z",onCommitRotation,this);
  151. //--------------------------------------------------------
  152. // material type popup
  153. mLabelMaterial = getChild<LLTextBox>("label material");
  154. mComboMaterial = getChild<LLComboBox>("material");
  155. childSetCommitCallback("material",onCommitMaterial,this);
  156. mComboMaterial->removeall();
  157. for (LLMaterialTable::info_list_t::iterator iter = LLMaterialTable::basic.mMaterialInfoList.begin();
  158.  iter != LLMaterialTable::basic.mMaterialInfoList.end(); ++iter)
  159. {
  160. LLMaterialInfo* minfop = *iter;
  161. if (minfop->mMCode != LL_MCODE_LIGHT)
  162. {
  163. mComboMaterial->add(minfop->mName);  
  164. }
  165. }
  166. mComboMaterialItemCount = mComboMaterial->getItemCount();
  167. // Base Type
  168. mLabelBaseType = getChild<LLTextBox>("label basetype");
  169. mComboBaseType = getChild<LLComboBox>("comboBaseType");
  170. childSetCommitCallback("comboBaseType",onCommitParametric,this);
  171. // Cut
  172. mLabelCut = getChild<LLTextBox>("text cut");
  173. mSpinCutBegin = getChild<LLSpinCtrl>("cut begin");
  174. childSetCommitCallback("cut begin",onCommitParametric,this);
  175. mSpinCutBegin->setValidateBeforeCommit( precommitValidate );
  176. mSpinCutEnd = getChild<LLSpinCtrl>("cut end");
  177. childSetCommitCallback("cut end",onCommitParametric,this);
  178. mSpinCutEnd->setValidateBeforeCommit( &precommitValidate );
  179. // Hollow / Skew
  180. mLabelHollow = getChild<LLTextBox>("text hollow");
  181. mLabelSkew = getChild<LLTextBox>("text skew");
  182. mSpinHollow = getChild<LLSpinCtrl>("Scale 1");
  183. childSetCommitCallback("Scale 1",onCommitParametric,this);
  184. mSpinHollow->setValidateBeforeCommit( &precommitValidate );
  185. mSpinSkew = getChild<LLSpinCtrl>("Skew");
  186. childSetCommitCallback("Skew",onCommitParametric,this);
  187. mSpinSkew->setValidateBeforeCommit( &precommitValidate );
  188. mLabelHoleType = getChild<LLTextBox>("Hollow Shape");
  189. // Hole Type
  190. mComboHoleType = getChild<LLComboBox>("hole");
  191. childSetCommitCallback("hole",onCommitParametric,this);
  192. // Twist
  193. mLabelTwist = getChild<LLTextBox>("text twist");
  194. mSpinTwistBegin = getChild<LLSpinCtrl>("Twist Begin");
  195. childSetCommitCallback("Twist Begin",onCommitParametric,this);
  196. mSpinTwistBegin->setValidateBeforeCommit( precommitValidate );
  197. mSpinTwist = getChild<LLSpinCtrl>("Twist End");
  198. childSetCommitCallback("Twist End",onCommitParametric,this);
  199. mSpinTwist->setValidateBeforeCommit( &precommitValidate );
  200. // Scale
  201. mSpinScaleX = getChild<LLSpinCtrl>("Taper Scale X");
  202. childSetCommitCallback("Taper Scale X",onCommitParametric,this);
  203. mSpinScaleX->setValidateBeforeCommit( &precommitValidate );
  204. mSpinScaleY = getChild<LLSpinCtrl>("Taper Scale Y");
  205. childSetCommitCallback("Taper Scale Y",onCommitParametric,this);
  206. mSpinScaleY->setValidateBeforeCommit( &precommitValidate );
  207. // Shear
  208. mLabelShear = getChild<LLTextBox>("text topshear");
  209. mSpinShearX = getChild<LLSpinCtrl>("Shear X");
  210. childSetCommitCallback("Shear X",onCommitParametric,this);
  211. mSpinShearX->setValidateBeforeCommit( &precommitValidate );
  212. mSpinShearY = getChild<LLSpinCtrl>("Shear Y");
  213. childSetCommitCallback("Shear Y",onCommitParametric,this);
  214. mSpinShearY->setValidateBeforeCommit( &precommitValidate );
  215. // Path / Profile
  216. mCtrlPathBegin = getChild<LLSpinCtrl>("Path Limit Begin");
  217. childSetCommitCallback("Path Limit Begin",onCommitParametric,this);
  218. mCtrlPathBegin->setValidateBeforeCommit( &precommitValidate );
  219. mCtrlPathEnd = getChild<LLSpinCtrl>("Path Limit End");
  220. childSetCommitCallback("Path Limit End",onCommitParametric,this);
  221. mCtrlPathEnd->setValidateBeforeCommit( &precommitValidate );
  222. // Taper
  223. mLabelTaper = getChild<LLTextBox>("text taper2");
  224. mSpinTaperX = getChild<LLSpinCtrl>("Taper X");
  225. childSetCommitCallback("Taper X",onCommitParametric,this);
  226. mSpinTaperX->setValidateBeforeCommit( precommitValidate );
  227. mSpinTaperY = getChild<LLSpinCtrl>("Taper Y");
  228. childSetCommitCallback("Taper Y",onCommitParametric,this);
  229. mSpinTaperY->setValidateBeforeCommit( precommitValidate );
  230. // Radius Offset / Revolutions
  231. mLabelRadiusOffset = getChild<LLTextBox>("text radius delta");
  232. mLabelRevolutions = getChild<LLTextBox>("text revolutions");
  233. mSpinRadiusOffset = getChild<LLSpinCtrl>("Radius Offset");
  234. childSetCommitCallback("Radius Offset",onCommitParametric,this);
  235. mSpinRadiusOffset->setValidateBeforeCommit( &precommitValidate );
  236. mSpinRevolutions = getChild<LLSpinCtrl>("Revolutions");
  237. childSetCommitCallback("Revolutions",onCommitParametric,this);
  238. mSpinRevolutions->setValidateBeforeCommit( &precommitValidate );
  239. // Sculpt
  240. mCtrlSculptTexture = getChild<LLTextureCtrl>("sculpt texture control");
  241. if (mCtrlSculptTexture)
  242. {
  243. mCtrlSculptTexture->setDefaultImageAssetID(LLUUID(SCULPT_DEFAULT_TEXTURE));
  244. mCtrlSculptTexture->setCommitCallback( boost::bind(&LLPanelObject::onCommitSculpt, this, _2 ));
  245. mCtrlSculptTexture->setOnCancelCallback( boost::bind(&LLPanelObject::onCancelSculpt, this, _2 ));
  246. mCtrlSculptTexture->setOnSelectCallback( boost::bind(&LLPanelObject::onSelectSculpt, this, _2 ));
  247. mCtrlSculptTexture->setDropCallback( boost::bind(&LLPanelObject::onDropSculpt, this, _2 ));
  248. // Don't allow (no copy) or (no transfer) textures to be selected during immediate mode
  249. mCtrlSculptTexture->setImmediateFilterPermMask(PERM_COPY | PERM_TRANSFER);
  250. // Allow any texture to be used during non-immediate mode.
  251. mCtrlSculptTexture->setNonImmediateFilterPermMask(PERM_NONE);
  252. LLAggregatePermissions texture_perms;
  253. if (LLSelectMgr::getInstance()->selectGetAggregateTexturePermissions(texture_perms))
  254. {
  255. BOOL can_copy =
  256. texture_perms.getValue(PERM_COPY) == LLAggregatePermissions::AP_EMPTY ||
  257. texture_perms.getValue(PERM_COPY) == LLAggregatePermissions::AP_ALL;
  258. BOOL can_transfer =
  259. texture_perms.getValue(PERM_TRANSFER) == LLAggregatePermissions::AP_EMPTY ||
  260. texture_perms.getValue(PERM_TRANSFER) == LLAggregatePermissions::AP_ALL;
  261. mCtrlSculptTexture->setCanApplyImmediately(can_copy && can_transfer);
  262. }
  263. else
  264. {
  265. mCtrlSculptTexture->setCanApplyImmediately(FALSE);
  266. }
  267. }
  268. mLabelSculptType = getChild<LLTextBox>("label sculpt type");
  269. mCtrlSculptType = getChild<LLComboBox>("sculpt type control");
  270. childSetCommitCallback("sculpt type control", onCommitSculptType, this);
  271. mCtrlSculptMirror = getChild<LLCheckBoxCtrl>("sculpt mirror control");
  272. childSetCommitCallback("sculpt mirror control", onCommitSculptType, this);
  273. mCtrlSculptInvert = getChild<LLCheckBoxCtrl>("sculpt invert control");
  274. childSetCommitCallback("sculpt invert control", onCommitSculptType, this);
  275. // Start with everyone disabled
  276. clearCtrls();
  277. return TRUE;
  278. }
  279. LLPanelObject::LLPanelObject()
  280. : LLPanel(),
  281. mComboMaterialItemCount(0),
  282. mIsPhysical(FALSE),
  283. mIsTemporary(FALSE),
  284. mIsPhantom(FALSE),
  285. mCastShadows(TRUE),
  286. mSelectedType(MI_BOX),
  287. mSculptTextureRevert(LLUUID::null),
  288. mSculptTypeRevert(0)
  289. {
  290. }
  291. LLPanelObject::~LLPanelObject()
  292. {
  293. // Children all cleaned up by default view destructor.
  294. }
  295. void LLPanelObject::getState( )
  296. {
  297. LLViewerObject* objectp = LLSelectMgr::getInstance()->getSelection()->getFirstRootObject();
  298. LLViewerObject* root_objectp = objectp;
  299. if(!objectp)
  300. {
  301. objectp = LLSelectMgr::getInstance()->getSelection()->getFirstObject();
  302. // *FIX: shouldn't we just keep the child?
  303. if (objectp)
  304. {
  305. LLViewerObject* parentp = objectp->getRootEdit();
  306. if (parentp)
  307. {
  308. root_objectp = parentp;
  309. }
  310. else
  311. {
  312. root_objectp = objectp;
  313. }
  314. }
  315. }
  316. LLVOVolume *volobjp = NULL;
  317. if ( objectp && (objectp->getPCode() == LL_PCODE_VOLUME))
  318. {
  319. volobjp = (LLVOVolume *)objectp;
  320. }
  321. if( !objectp )
  322. {
  323. //forfeit focus
  324. if (gFocusMgr.childHasKeyboardFocus(this))
  325. {
  326. gFocusMgr.setKeyboardFocus(NULL);
  327. }
  328. // Disable all text input fields
  329. clearCtrls();
  330. return;
  331. }
  332. // can move or rotate only linked group with move permissions, or sub-object with move and modify perms
  333. BOOL enable_move = objectp->permMove() && !objectp->isAttachment() && (objectp->permModify() || !gSavedSettings.getBOOL("EditLinkedParts"));
  334. BOOL enable_scale = objectp->permMove() && objectp->permModify();
  335. BOOL enable_rotate = objectp->permMove() && ( (objectp->permModify() && !objectp->isAttachment()) || !gSavedSettings.getBOOL("EditLinkedParts"));
  336. S32 selected_count = LLSelectMgr::getInstance()->getSelection()->getObjectCount();
  337. BOOL single_volume = (LLSelectMgr::getInstance()->selectionAllPCode( LL_PCODE_VOLUME ))
  338.  && (selected_count == 1);
  339. if (LLSelectMgr::getInstance()->getSelection()->getRootObjectCount() > 1)
  340. {
  341. enable_move = FALSE;
  342. enable_scale = FALSE;
  343. enable_rotate = FALSE;
  344. }
  345. LLVector3 vec;
  346. if (enable_move)
  347. {
  348. vec = objectp->getPositionEdit();
  349. mCtrlPosX->set( vec.mV[VX] );
  350. mCtrlPosY->set( vec.mV[VY] );
  351. mCtrlPosZ->set( vec.mV[VZ] );
  352. }
  353. else
  354. {
  355. mCtrlPosX->clear();
  356. mCtrlPosY->clear();
  357. mCtrlPosZ->clear();
  358. }
  359. mLabelPosition->setEnabled( enable_move );
  360. mCtrlPosX->setEnabled(enable_move);
  361. mCtrlPosY->setEnabled(enable_move);
  362. mCtrlPosZ->setEnabled(enable_move);
  363. if (enable_scale)
  364. {
  365. vec = objectp->getScale();
  366. mCtrlScaleX->set( vec.mV[VX] );
  367. mCtrlScaleY->set( vec.mV[VY] );
  368. mCtrlScaleZ->set( vec.mV[VZ] );
  369. }
  370. else
  371. {
  372. mCtrlScaleX->clear();
  373. mCtrlScaleY->clear();
  374. mCtrlScaleZ->clear();
  375. }
  376. mLabelSize->setEnabled( enable_scale );
  377. mCtrlScaleX->setEnabled( enable_scale );
  378. mCtrlScaleY->setEnabled( enable_scale );
  379. mCtrlScaleZ->setEnabled( enable_scale );
  380. LLQuaternion object_rot = objectp->getRotationEdit();
  381. object_rot.getEulerAngles(&(mCurEulerDegrees.mV[VX]), &(mCurEulerDegrees.mV[VY]), &(mCurEulerDegrees.mV[VZ]));
  382. mCurEulerDegrees *= RAD_TO_DEG;
  383. mCurEulerDegrees.mV[VX] = fmod(llround(mCurEulerDegrees.mV[VX], OBJECT_ROTATION_PRECISION) + 360.f, 360.f);
  384. mCurEulerDegrees.mV[VY] = fmod(llround(mCurEulerDegrees.mV[VY], OBJECT_ROTATION_PRECISION) + 360.f, 360.f);
  385. mCurEulerDegrees.mV[VZ] = fmod(llround(mCurEulerDegrees.mV[VZ], OBJECT_ROTATION_PRECISION) + 360.f, 360.f);
  386. if (enable_rotate)
  387. {
  388. mCtrlRotX->set( mCurEulerDegrees.mV[VX] );
  389. mCtrlRotY->set( mCurEulerDegrees.mV[VY] );
  390. mCtrlRotZ->set( mCurEulerDegrees.mV[VZ] );
  391. }
  392. else
  393. {
  394. mCtrlRotX->clear();
  395. mCtrlRotY->clear();
  396. mCtrlRotZ->clear();
  397. }
  398. mLabelRotation->setEnabled( enable_rotate );
  399. mCtrlRotX->setEnabled( enable_rotate );
  400. mCtrlRotY->setEnabled( enable_rotate );
  401. mCtrlRotZ->setEnabled( enable_rotate );
  402. BOOL owners_identical;
  403. LLUUID owner_id;
  404. std::string owner_name;
  405. owners_identical = LLSelectMgr::getInstance()->selectGetOwner(owner_id, owner_name);
  406. // BUG? Check for all objects being editable?
  407. S32 roots_selected = LLSelectMgr::getInstance()->getSelection()->getRootObjectCount();
  408. BOOL editable = root_objectp->permModify();
  409. // Select Single Message
  410. childSetVisible("select_single", FALSE);
  411. childSetVisible("edit_object", FALSE);
  412. if (!editable || single_volume || selected_count <= 1)
  413. {
  414. childSetVisible("edit_object", TRUE);
  415. childSetEnabled("edit_object", TRUE);
  416. }
  417. else
  418. {
  419. childSetVisible("select_single", TRUE);
  420. childSetEnabled("select_single", TRUE);
  421. }
  422. // Lock checkbox - only modifiable if you own the object.
  423. BOOL self_owned = (gAgent.getID() == owner_id);
  424. mCheckLock->setEnabled( roots_selected > 0 && self_owned );
  425. // More lock and debit checkbox - get the values
  426. BOOL valid;
  427. U32 owner_mask_on;
  428. U32 owner_mask_off;
  429. valid = LLSelectMgr::getInstance()->selectGetPerm(PERM_OWNER, &owner_mask_on, &owner_mask_off);
  430. if(valid)
  431. {
  432. if(owner_mask_on & PERM_MOVE)
  433. {
  434. // owner can move, so not locked
  435. mCheckLock->set(FALSE);
  436. mCheckLock->setTentative(FALSE);
  437. }
  438. else if(owner_mask_off & PERM_MOVE)
  439. {
  440. // owner can't move, so locked
  441. mCheckLock->set(TRUE);
  442. mCheckLock->setTentative(FALSE);
  443. }
  444. else
  445. {
  446. // some locked, some not locked
  447. mCheckLock->set(FALSE);
  448. mCheckLock->setTentative(TRUE);
  449. }
  450. }
  451. BOOL is_flexible = volobjp && volobjp->isFlexible();
  452. // Physics checkbox
  453. mIsPhysical = root_objectp->usePhysics();
  454. mCheckPhysics->set( mIsPhysical );
  455. mCheckPhysics->setEnabled( roots_selected>0 
  456. && (editable || gAgent.isGodlike()) 
  457. && !is_flexible);
  458. mIsTemporary = root_objectp->flagTemporaryOnRez();
  459. mCheckTemporary->set( mIsTemporary );
  460. mCheckTemporary->setEnabled( roots_selected>0 && editable );
  461. mIsPhantom = root_objectp->flagPhantom();
  462. mCheckPhantom->set( mIsPhantom );
  463. mCheckPhantom->setEnabled( roots_selected>0 && editable && !is_flexible );
  464. #if 0 // 1.9.2
  465. mCastShadows = root_objectp->flagCastShadows();
  466. mCheckCastShadows->set( mCastShadows );
  467. mCheckCastShadows->setEnabled( roots_selected==1 && editable );
  468. #endif
  469. // Update material part
  470. // slightly inefficient - materials are unique per object, not per TE
  471. U8 material_code = 0;
  472. struct f : public LLSelectedTEGetFunctor<U8>
  473. {
  474. U8 get(LLViewerObject* object, S32 te)
  475. {
  476. return object->getMaterial();
  477. }
  478. } func;
  479. bool material_same = LLSelectMgr::getInstance()->getSelection()->getSelectedTEValue( &func, material_code );
  480. std::string LEGACY_FULLBRIGHT_DESC = LLTrans::getString("Fullbright");
  481. if (editable && single_volume && material_same)
  482. {
  483. mComboMaterial->setEnabled( TRUE );
  484. mLabelMaterial->setEnabled( TRUE );
  485. if (material_code == LL_MCODE_LIGHT)
  486. {
  487. if (mComboMaterial->getItemCount() == mComboMaterialItemCount)
  488. {
  489. mComboMaterial->add(LEGACY_FULLBRIGHT_DESC);
  490. }
  491. mComboMaterial->setSimple(LEGACY_FULLBRIGHT_DESC);
  492. }
  493. else
  494. {
  495. if (mComboMaterial->getItemCount() != mComboMaterialItemCount)
  496. {
  497. mComboMaterial->remove(LEGACY_FULLBRIGHT_DESC);
  498. }
  499. mComboMaterial->setSimple(std::string(LLMaterialTable::basic.getName(material_code)));
  500. }
  501. }
  502. else
  503. {
  504. mComboMaterial->setEnabled( FALSE );
  505. mLabelMaterial->setEnabled( FALSE );
  506. }
  507. //----------------------------------------------------------------------------
  508. S32 selected_item = MI_BOX;
  509. S32 selected_hole = MI_HOLE_SAME;
  510. BOOL enabled = FALSE;
  511. BOOL hole_enabled = FALSE;
  512. F32 scale_x=1.f, scale_y=1.f;
  513. if( !objectp || !objectp->getVolume() || !editable || !single_volume)
  514. {
  515. // Clear out all geometry fields.
  516. mComboBaseType->clear();
  517. mSpinHollow->clear();
  518. mSpinCutBegin->clear();
  519. mSpinCutEnd->clear();
  520. mCtrlPathBegin->clear();
  521. mCtrlPathEnd->clear();
  522. mSpinScaleX->clear();
  523. mSpinScaleY->clear();
  524. mSpinTwist->clear();
  525. mSpinTwistBegin->clear();
  526. mComboHoleType->clear();
  527. mSpinShearX->clear();
  528. mSpinShearY->clear();
  529. mSpinTaperX->clear();
  530. mSpinTaperY->clear();
  531. mSpinRadiusOffset->clear();
  532. mSpinRevolutions->clear();
  533. mSpinSkew->clear();
  534. mSelectedType = MI_NONE;
  535. }
  536. else
  537. {
  538. // Only allowed to change these parameters for objects
  539. // that you have permissions on AND are not attachments.
  540. enabled = root_objectp->permModify();
  541. const LLVolumeParams &volume_params = objectp->getVolume()->getParams();
  542. // Volume type
  543. U8 path = volume_params.getPathParams().getCurveType();
  544. U8 profile_and_hole = volume_params.getProfileParams().getCurveType();
  545. U8 profile = profile_and_hole & LL_PCODE_PROFILE_MASK;
  546. U8 hole = profile_and_hole & LL_PCODE_HOLE_MASK;
  547. // Scale goes first so we can differentiate between a sphere and a torus,
  548. // which have the same profile and path types.
  549. // Scale
  550. scale_x = volume_params.getRatioX();
  551. scale_y = volume_params.getRatioY();
  552. BOOL linear_path = (path == LL_PCODE_PATH_LINE) || (path == LL_PCODE_PATH_FLEXIBLE);
  553. if ( linear_path && profile == LL_PCODE_PROFILE_CIRCLE )
  554. {
  555. selected_item = MI_CYLINDER;
  556. }
  557. else if ( linear_path && profile == LL_PCODE_PROFILE_SQUARE )
  558. {
  559. selected_item = MI_BOX;
  560. }
  561. else if ( linear_path && profile == LL_PCODE_PROFILE_ISOTRI )
  562. {
  563. selected_item = MI_PRISM;
  564. }
  565. else if ( linear_path && profile == LL_PCODE_PROFILE_EQUALTRI )
  566. {
  567. selected_item = MI_PRISM;
  568. }
  569. else if ( linear_path && profile == LL_PCODE_PROFILE_RIGHTTRI )
  570. {
  571. selected_item = MI_PRISM;
  572. }
  573. else if (path == LL_PCODE_PATH_FLEXIBLE) // shouldn't happen
  574. {
  575. selected_item = MI_CYLINDER; // reasonable default
  576. }
  577. else if ( path == LL_PCODE_PATH_CIRCLE && profile == LL_PCODE_PROFILE_CIRCLE && scale_y > 0.75f)
  578. {
  579. selected_item = MI_SPHERE;
  580. }
  581. else if ( path == LL_PCODE_PATH_CIRCLE && profile == LL_PCODE_PROFILE_CIRCLE && scale_y <= 0.75f)
  582. {
  583. selected_item = MI_TORUS;
  584. }
  585. else if ( path == LL_PCODE_PATH_CIRCLE && profile == LL_PCODE_PROFILE_CIRCLE_HALF)
  586. {
  587. selected_item = MI_SPHERE;
  588. }
  589. else if ( path == LL_PCODE_PATH_CIRCLE2 && profile == LL_PCODE_PROFILE_CIRCLE )
  590. {
  591. // Spirals aren't supported.  Make it into a sphere.  JC
  592. selected_item = MI_SPHERE;
  593. }
  594. else if ( path == LL_PCODE_PATH_CIRCLE && profile == LL_PCODE_PROFILE_EQUALTRI )
  595. {
  596. selected_item = MI_RING;
  597. }
  598. else if ( path == LL_PCODE_PATH_CIRCLE && profile == LL_PCODE_PROFILE_SQUARE && scale_y <= 0.75f)
  599. {
  600. selected_item = MI_TUBE;
  601. }
  602. else
  603. {
  604. llinfos << "Unknown path " << (S32) path << " profile " << (S32) profile << " in getState" << llendl;
  605. selected_item = MI_BOX;
  606. }
  607. if (objectp->getParameterEntryInUse(LLNetworkData::PARAMS_SCULPT))
  608. {
  609. selected_item = MI_SCULPT;
  610. //LLFirstUse::useSculptedPrim();
  611. }
  612. mComboBaseType ->setCurrentByIndex( selected_item );
  613. mSelectedType = selected_item;
  614. // Grab S path
  615. F32 begin_s = volume_params.getBeginS();
  616. F32 end_s = volume_params.getEndS();
  617. // Compute cut and advanced cut from S and T
  618. F32 begin_t = volume_params.getBeginT();
  619. F32 end_t = volume_params.getEndT();
  620. // Hollowness
  621. F32 hollow = volume_params.getHollow();
  622. mSpinHollow->set( 100.f * hollow );
  623. // All hollow objects allow a shape to be selected.
  624. if (hollow > 0.f)
  625. {
  626. switch (hole)
  627. {
  628. case LL_PCODE_HOLE_CIRCLE:
  629. selected_hole = MI_HOLE_CIRCLE;
  630. break;
  631. case LL_PCODE_HOLE_SQUARE:
  632. selected_hole = MI_HOLE_SQUARE;
  633. break;
  634. case LL_PCODE_HOLE_TRIANGLE:
  635. selected_hole = MI_HOLE_TRIANGLE;
  636. break;
  637. case LL_PCODE_HOLE_SAME:
  638. default:
  639. selected_hole = MI_HOLE_SAME;
  640. break;
  641. }
  642. mComboHoleType->setCurrentByIndex( selected_hole );
  643. hole_enabled = enabled;
  644. }
  645. else
  646. {
  647. mComboHoleType->setCurrentByIndex( MI_HOLE_SAME );
  648. hole_enabled = FALSE;
  649. }
  650. // Cut interpretation varies based on base object type
  651. F32 cut_begin, cut_end, adv_cut_begin, adv_cut_end;
  652. if ( selected_item == MI_SPHERE || selected_item == MI_TORUS || 
  653.  selected_item == MI_TUBE   || selected_item == MI_RING )
  654. {
  655. cut_begin = begin_t;
  656. cut_end = end_t;
  657. adv_cut_begin = begin_s;
  658. adv_cut_end = end_s;
  659. }
  660. else
  661. {
  662. cut_begin       = begin_s;
  663. cut_end         = end_s;
  664. adv_cut_begin   = begin_t;
  665. adv_cut_end     = end_t;
  666. }
  667. mSpinCutBegin ->set( cut_begin );
  668. mSpinCutEnd ->set( cut_end );
  669. mCtrlPathBegin ->set( adv_cut_begin );
  670. mCtrlPathEnd ->set( adv_cut_end );
  671. // Twist
  672. F32 twist = volume_params.getTwist();
  673. F32 twist_begin = volume_params.getTwistBegin();
  674. // Check the path type for conversion.
  675. if (path == LL_PCODE_PATH_LINE || path == LL_PCODE_PATH_FLEXIBLE)
  676. {
  677. twist *= OBJECT_TWIST_LINEAR_MAX;
  678. twist_begin *= OBJECT_TWIST_LINEAR_MAX;
  679. }
  680. else
  681. {
  682. twist *= OBJECT_TWIST_MAX;
  683. twist_begin *= OBJECT_TWIST_MAX;
  684. }
  685. mSpinTwist ->set( twist );
  686. mSpinTwistBegin ->set( twist_begin );
  687. // Shear
  688. F32 shear_x = volume_params.getShearX();
  689. F32 shear_y = volume_params.getShearY();
  690. mSpinShearX->set( shear_x );
  691. mSpinShearY->set( shear_y );
  692. // Taper
  693. F32 taper_x = volume_params.getTaperX();
  694. F32 taper_y = volume_params.getTaperY();
  695. mSpinTaperX->set( taper_x );
  696. mSpinTaperY->set( taper_y );
  697. // Radius offset.
  698. F32 radius_offset = volume_params.getRadiusOffset();
  699. // Limit radius offset, based on taper and hole size y.
  700. F32 radius_mag = fabs(radius_offset);
  701. F32 hole_y_mag = fabs(scale_y);
  702. F32 taper_y_mag  = fabs(taper_y);
  703. // Check to see if the taper effects us.
  704. if ( (radius_offset > 0.f && taper_y < 0.f) ||
  705.  (radius_offset < 0.f && taper_y > 0.f) )
  706. {
  707. // The taper does not help increase the radius offset range.
  708. taper_y_mag = 0.f;
  709. }
  710. F32 max_radius_mag = 1.f - hole_y_mag * (1.f - taper_y_mag) / (1.f - hole_y_mag);
  711. // Enforce the maximum magnitude.
  712. if (radius_mag > max_radius_mag)
  713. {
  714. // Check radius offset sign.
  715. if (radius_offset < 0.f)
  716. {
  717. radius_offset = -max_radius_mag;
  718. }
  719. else
  720. {
  721. radius_offset = max_radius_mag;
  722. }
  723. }
  724. mSpinRadiusOffset->set( radius_offset);
  725. // Revolutions
  726. F32 revolutions = volume_params.getRevolutions();
  727. mSpinRevolutions->set( revolutions );
  728. // Skew
  729. F32 skew = volume_params.getSkew();
  730. // Limit skew, based on revolutions hole size x.
  731. F32 skew_mag= fabs(skew);
  732. F32 min_skew_mag = 1.0f - 1.0f / (revolutions * scale_x + 1.0f);
  733. // Discontinuity; A revolution of 1 allows skews below 0.5.
  734. if ( fabs(revolutions - 1.0f) < 0.001)
  735. min_skew_mag = 0.0f;
  736. // Clip skew.
  737. if (skew_mag < min_skew_mag)
  738. {
  739. // Check skew sign.
  740. if (skew < 0.0f)
  741. {
  742. skew = -min_skew_mag;
  743. }
  744. else 
  745. {
  746. skew = min_skew_mag;
  747. }
  748. }
  749. mSpinSkew->set( skew );
  750. }
  751. // Compute control visibility, label names, and twist range.
  752. // Start with defaults.
  753. BOOL cut_visible                = TRUE;
  754. BOOL hollow_visible             = TRUE;
  755. BOOL top_size_x_visible = TRUE;
  756. BOOL top_size_y_visible = TRUE;
  757. BOOL top_shear_x_visible = TRUE;
  758. BOOL top_shear_y_visible = TRUE;
  759. BOOL twist_visible = TRUE;
  760. BOOL advanced_cut_visible = FALSE;
  761. BOOL taper_visible = FALSE;
  762. BOOL skew_visible = FALSE;
  763. BOOL radius_offset_visible = FALSE;
  764. BOOL revolutions_visible = FALSE;
  765. BOOL sculpt_texture_visible     = FALSE;
  766. F32  twist_min = OBJECT_TWIST_LINEAR_MIN;
  767. F32  twist_max = OBJECT_TWIST_LINEAR_MAX;
  768. F32  twist_inc = OBJECT_TWIST_LINEAR_INC;
  769. BOOL advanced_is_dimple = FALSE;
  770. BOOL advanced_is_slice = FALSE;
  771. BOOL size_is_hole = FALSE;
  772. // Tune based on overall volume type
  773. switch (selected_item)
  774. {
  775. case MI_SPHERE:
  776. top_size_x_visible = FALSE;
  777. top_size_y_visible = FALSE;
  778. top_shear_x_visible = FALSE;
  779. top_shear_y_visible = FALSE;
  780. //twist_visible = FALSE;
  781. advanced_cut_visible = TRUE;
  782. advanced_is_dimple = TRUE;
  783. twist_min = OBJECT_TWIST_MIN;
  784. twist_max = OBJECT_TWIST_MAX;
  785. twist_inc = OBJECT_TWIST_INC;
  786. break;
  787. case MI_TORUS:
  788. case MI_TUBE:
  789. case MI_RING:
  790. //top_size_x_visible = FALSE;
  791. //top_size_y_visible = FALSE;
  792.    size_is_hole  = TRUE;
  793. skew_visible = TRUE;
  794. advanced_cut_visible = TRUE;
  795. taper_visible = TRUE;
  796. radius_offset_visible = TRUE;
  797. revolutions_visible = TRUE;
  798. twist_min = OBJECT_TWIST_MIN;
  799. twist_max = OBJECT_TWIST_MAX;
  800. twist_inc = OBJECT_TWIST_INC;
  801. break;
  802. case MI_SCULPT:
  803. cut_visible             = FALSE;
  804. hollow_visible          = FALSE;
  805. twist_visible           = FALSE;
  806. top_size_x_visible      = FALSE;
  807. top_size_y_visible      = FALSE;
  808. top_shear_x_visible     = FALSE;
  809. top_shear_y_visible     = FALSE;
  810. skew_visible            = FALSE;
  811. advanced_cut_visible    = FALSE;
  812. taper_visible           = FALSE;
  813. radius_offset_visible   = FALSE;
  814. revolutions_visible     = FALSE;
  815. sculpt_texture_visible  = TRUE;
  816. break;
  817. case MI_BOX:
  818. advanced_cut_visible = TRUE;
  819. advanced_is_slice = TRUE;
  820. break;
  821. case MI_CYLINDER:
  822. advanced_cut_visible = TRUE;
  823. advanced_is_slice = TRUE;
  824. break;
  825. case MI_PRISM:
  826. advanced_cut_visible = TRUE;
  827. advanced_is_slice = TRUE;
  828. break;
  829. default:
  830. break;
  831. }
  832. // Check if we need to change top size/hole size params.
  833. switch (selected_item)
  834. {
  835. case MI_SPHERE:
  836. case MI_TORUS:
  837. case MI_TUBE:
  838. case MI_RING:
  839. mSpinScaleX->set( scale_x );
  840. mSpinScaleY->set( scale_y );
  841. mSpinScaleX->setMinValue(OBJECT_MIN_HOLE_SIZE);
  842. mSpinScaleX->setMaxValue(OBJECT_MAX_HOLE_SIZE_X);
  843. mSpinScaleY->setMinValue(OBJECT_MIN_HOLE_SIZE);
  844. mSpinScaleY->setMaxValue(OBJECT_MAX_HOLE_SIZE_Y);
  845. break;
  846. default:
  847. if (editable)
  848. {
  849. mSpinScaleX->set( 1.f - scale_x );
  850. mSpinScaleY->set( 1.f - scale_y );
  851. mSpinScaleX->setMinValue(-1.f);
  852. mSpinScaleX->setMaxValue(1.f);
  853. mSpinScaleY->setMinValue(-1.f);
  854. mSpinScaleY->setMaxValue(1.f);
  855. }
  856. break;
  857. }
  858. // Check if we need to limit the hollow based on the hole type.
  859. if (  selected_hole == MI_HOLE_SQUARE && 
  860.   ( selected_item == MI_CYLINDER || selected_item == MI_TORUS ||
  861.     selected_item == MI_PRISM    || selected_item == MI_RING  ||
  862. selected_item == MI_SPHERE ) )
  863. {
  864. mSpinHollow->setMinValue(0.f);
  865. mSpinHollow->setMaxValue(70.f);
  866. }
  867. else 
  868. {
  869. mSpinHollow->setMinValue(0.f);
  870. mSpinHollow->setMaxValue(95.f);
  871. }
  872. // Update field enablement
  873. mLabelBaseType ->setEnabled( enabled );
  874. mComboBaseType ->setEnabled( enabled );
  875. mLabelCut ->setEnabled( enabled );
  876. mSpinCutBegin ->setEnabled( enabled );
  877. mSpinCutEnd ->setEnabled( enabled );
  878. mLabelHollow ->setEnabled( enabled );
  879. mSpinHollow ->setEnabled( enabled );
  880. mLabelHoleType ->setEnabled( hole_enabled );
  881. mComboHoleType ->setEnabled( hole_enabled );
  882. mLabelTwist ->setEnabled( enabled );
  883. mSpinTwist ->setEnabled( enabled );
  884. mSpinTwistBegin ->setEnabled( enabled );
  885. mLabelSkew ->setEnabled( enabled );
  886. mSpinSkew ->setEnabled( enabled );
  887. childSetVisible("scale_hole", FALSE);
  888. childSetVisible("scale_taper", FALSE);
  889. if (top_size_x_visible || top_size_y_visible)
  890. {
  891. if (size_is_hole)
  892. {
  893. childSetVisible("scale_hole", TRUE);
  894. childSetEnabled("scale_hole", enabled);
  895. }
  896. else
  897. {
  898. childSetVisible("scale_taper", TRUE);
  899. childSetEnabled("scale_taper", enabled);
  900. }
  901. }
  902. mSpinScaleX ->setEnabled( enabled );
  903. mSpinScaleY ->setEnabled( enabled );
  904. mLabelShear ->setEnabled( enabled );
  905. mSpinShearX ->setEnabled( enabled );
  906. mSpinShearY ->setEnabled( enabled );
  907. childSetVisible("advanced_cut", FALSE);
  908. childSetVisible("advanced_dimple", FALSE);
  909. childSetVisible("advanced_slice", FALSE);
  910. if (advanced_cut_visible)
  911. {
  912. if (advanced_is_dimple)
  913. {
  914. childSetVisible("advanced_dimple", TRUE);
  915. childSetEnabled("advanced_dimple", enabled);
  916. }
  917. else if (advanced_is_slice)
  918. {
  919. childSetVisible("advanced_slice", TRUE);
  920. childSetEnabled("advanced_slice", enabled);
  921. }
  922. else
  923. {
  924. childSetVisible("advanced_cut", TRUE);
  925. childSetEnabled("advanced_cut", enabled);
  926. }
  927. }
  928. mCtrlPathBegin ->setEnabled( enabled );
  929. mCtrlPathEnd ->setEnabled( enabled );
  930. mLabelTaper ->setEnabled( enabled );
  931. mSpinTaperX ->setEnabled( enabled );
  932. mSpinTaperY ->setEnabled( enabled );
  933. mLabelRadiusOffset->setEnabled( enabled );
  934. mSpinRadiusOffset ->setEnabled( enabled );
  935. mLabelRevolutions->setEnabled( enabled );
  936. mSpinRevolutions ->setEnabled( enabled );
  937. // Update field visibility
  938. mLabelCut ->setVisible( cut_visible );
  939. mSpinCutBegin ->setVisible( cut_visible );
  940. mSpinCutEnd ->setVisible( cut_visible ); 
  941. mLabelHollow ->setVisible( hollow_visible );
  942. mSpinHollow ->setVisible( hollow_visible );
  943. mLabelHoleType ->setVisible( hollow_visible );
  944. mComboHoleType ->setVisible( hollow_visible );
  945. mLabelTwist ->setVisible( twist_visible );
  946. mSpinTwist ->setVisible( twist_visible );
  947. mSpinTwistBegin ->setVisible( twist_visible );
  948. mSpinTwist ->setMinValue(  twist_min );
  949. mSpinTwist ->setMaxValue(  twist_max );
  950. mSpinTwist ->setIncrement( twist_inc );
  951. mSpinTwistBegin ->setMinValue(  twist_min );
  952. mSpinTwistBegin ->setMaxValue(  twist_max );
  953. mSpinTwistBegin ->setIncrement( twist_inc );
  954. mSpinScaleX ->setVisible( top_size_x_visible );
  955. mSpinScaleY ->setVisible( top_size_y_visible );
  956. mLabelSkew ->setVisible( skew_visible );
  957. mSpinSkew ->setVisible( skew_visible );
  958. mLabelShear ->setVisible( top_shear_x_visible || top_shear_y_visible );
  959. mSpinShearX ->setVisible( top_shear_x_visible );
  960. mSpinShearY ->setVisible( top_shear_y_visible );
  961. mCtrlPathBegin ->setVisible( advanced_cut_visible );
  962. mCtrlPathEnd ->setVisible( advanced_cut_visible );
  963. mLabelTaper ->setVisible( taper_visible );
  964. mSpinTaperX ->setVisible( taper_visible );
  965. mSpinTaperY ->setVisible( taper_visible );
  966. mLabelRadiusOffset->setVisible( radius_offset_visible );
  967. mSpinRadiusOffset ->setVisible( radius_offset_visible );
  968. mLabelRevolutions->setVisible( revolutions_visible );
  969. mSpinRevolutions ->setVisible( revolutions_visible );
  970. mCtrlSculptTexture->setVisible(sculpt_texture_visible);
  971. mLabelSculptType->setVisible(sculpt_texture_visible);
  972. mCtrlSculptType->setVisible(sculpt_texture_visible);
  973. mCtrlSculptMirror->setVisible(sculpt_texture_visible);
  974. mCtrlSculptInvert->setVisible(sculpt_texture_visible);
  975. // sculpt texture
  976. if (selected_item == MI_SCULPT)
  977. {
  978.         LLUUID id;
  979. LLSculptParams *sculpt_params = (LLSculptParams *)objectp->getParameterEntry(LLNetworkData::PARAMS_SCULPT);
  980. if (sculpt_params) // if we have a legal sculpt param block for this object:
  981. {
  982. if (mObject != objectp)  // we've just selected a new object, so save for undo
  983. {
  984. mSculptTextureRevert = sculpt_params->getSculptTexture();
  985. mSculptTypeRevert    = sculpt_params->getSculptType();
  986. }
  987. LLTextureCtrl*  mTextureCtrl = getChild<LLTextureCtrl>("sculpt texture control");
  988. if(mTextureCtrl)
  989. {
  990. mTextureCtrl->setTentative(FALSE);
  991. mTextureCtrl->setEnabled(editable);
  992. if (editable)
  993. mTextureCtrl->setImageAssetID(sculpt_params->getSculptTexture());
  994. else
  995. mTextureCtrl->setImageAssetID(LLUUID::null);
  996. }
  997. U8 sculpt_type = sculpt_params->getSculptType();
  998. U8 sculpt_stitching = sculpt_type & LL_SCULPT_TYPE_MASK;
  999. BOOL sculpt_invert = sculpt_type & LL_SCULPT_FLAG_INVERT;
  1000. BOOL sculpt_mirror = sculpt_type & LL_SCULPT_FLAG_MIRROR;
  1001. if (mCtrlSculptType)
  1002. {
  1003. mCtrlSculptType->setCurrentByIndex(sculpt_stitching);
  1004. mCtrlSculptType->setEnabled(editable);
  1005. }
  1006. if (mCtrlSculptMirror)
  1007. {
  1008. mCtrlSculptMirror->set(sculpt_mirror);
  1009. mCtrlSculptMirror->setEnabled(editable);
  1010. }
  1011. if (mCtrlSculptInvert)
  1012. {
  1013. mCtrlSculptInvert->set(sculpt_invert);
  1014. mCtrlSculptInvert->setEnabled(editable);
  1015. }
  1016. if (mLabelSculptType)
  1017. {
  1018. mLabelSculptType->setEnabled(TRUE);
  1019. }
  1020. }
  1021. }
  1022. else
  1023. {
  1024. mSculptTextureRevert = LLUUID::null;
  1025. }
  1026. //----------------------------------------------------------------------------
  1027. mObject = objectp;
  1028. mRootObject = root_objectp;
  1029. }
  1030. // static
  1031. bool LLPanelObject::precommitValidate( const LLSD& data )
  1032. {
  1033. // TODO: Richard will fill this in later.  
  1034. return TRUE; // FALSE means that validation failed and new value should not be commited.
  1035. }
  1036. void LLPanelObject::sendIsPhysical()
  1037. {
  1038. BOOL value = mCheckPhysics->get();
  1039. if( mIsPhysical != value )
  1040. {
  1041. LLSelectMgr::getInstance()->selectionUpdatePhysics(value);
  1042. mIsPhysical = value;
  1043. llinfos << "update physics sent" << llendl;
  1044. }
  1045. else
  1046. {
  1047. llinfos << "update physics not changed" << llendl;
  1048. }
  1049. }
  1050. void LLPanelObject::sendIsTemporary()
  1051. {
  1052. BOOL value = mCheckTemporary->get();
  1053. if( mIsTemporary != value )
  1054. {
  1055. LLSelectMgr::getInstance()->selectionUpdateTemporary(value);
  1056. mIsTemporary = value;
  1057. llinfos << "update temporary sent" << llendl;
  1058. }
  1059. else
  1060. {
  1061. llinfos << "update temporary not changed" << llendl;
  1062. }
  1063. }
  1064. void LLPanelObject::sendIsPhantom()
  1065. {
  1066. BOOL value = mCheckPhantom->get();
  1067. if( mIsPhantom != value )
  1068. {
  1069. LLSelectMgr::getInstance()->selectionUpdatePhantom(value);
  1070. mIsPhantom = value;
  1071. llinfos << "update phantom sent" << llendl;
  1072. }
  1073. else
  1074. {
  1075. llinfos << "update phantom not changed" << llendl;
  1076. }
  1077. }
  1078. void LLPanelObject::sendCastShadows()
  1079. {
  1080. BOOL value = mCheckCastShadows->get();
  1081. if( mCastShadows != value )
  1082. {
  1083. LLSelectMgr::getInstance()->selectionUpdateCastShadows(value);
  1084. mCastShadows = value;
  1085. llinfos << "update cast shadows sent" << llendl;
  1086. }
  1087. else
  1088. {
  1089. llinfos << "update cast shadows not changed" << llendl;
  1090. }
  1091. }
  1092. // static
  1093. void LLPanelObject::onCommitMaterial( LLUICtrl* ctrl, void* userdata )
  1094. {
  1095. //LLPanelObject* self = (LLPanelObject*) userdata;
  1096. LLComboBox* box = (LLComboBox*) ctrl;
  1097. if (box)
  1098. {
  1099. // apply the currently selected material to the object
  1100. const std::string& material_name = box->getSimple();
  1101. std::string LEGACY_FULLBRIGHT_DESC = LLTrans::getString("Fullbright");
  1102. if (material_name != LEGACY_FULLBRIGHT_DESC)
  1103. {
  1104. U8 material_code = LLMaterialTable::basic.getMCode(material_name);
  1105. LLSelectMgr::getInstance()->selectionSetMaterial(material_code);
  1106. }
  1107. }
  1108. }
  1109. // static
  1110. void LLPanelObject::onCommitParametric( LLUICtrl* ctrl, void* userdata )
  1111. {
  1112. LLPanelObject* self = (LLPanelObject*) userdata;
  1113. if (self->mObject.isNull())
  1114. {
  1115. return;
  1116. }
  1117. if (self->mObject->getPCode() != LL_PCODE_VOLUME)
  1118. {
  1119. // Don't allow modification of non-volume objects.
  1120. return;
  1121. }
  1122. LLVolume *volume = self->mObject->getVolume();
  1123. if (!volume)
  1124. {
  1125. return;
  1126. }
  1127. LLVolumeParams volume_params;
  1128. self->getVolumeParams(volume_params);
  1129. // set sculpting
  1130. S32 selected_type = self->mComboBaseType->getCurrentIndex();
  1131. if (selected_type == MI_SCULPT)
  1132. {
  1133. self->mObject->setParameterEntryInUse(LLNetworkData::PARAMS_SCULPT, TRUE, TRUE);
  1134. LLSculptParams *sculpt_params = (LLSculptParams *)self->mObject->getParameterEntry(LLNetworkData::PARAMS_SCULPT);
  1135. if (sculpt_params)
  1136. volume_params.setSculptID(sculpt_params->getSculptTexture(), sculpt_params->getSculptType());
  1137. }
  1138. else
  1139. {
  1140. LLSculptParams *sculpt_params = (LLSculptParams *)self->mObject->getParameterEntry(LLNetworkData::PARAMS_SCULPT);
  1141. if (sculpt_params)
  1142. self->mObject->setParameterEntryInUse(LLNetworkData::PARAMS_SCULPT, FALSE, TRUE);
  1143. }
  1144. // Update the volume, if necessary.
  1145. self->mObject->updateVolume(volume_params);
  1146. // This was added to make sure thate when changes are made, the UI
  1147. // adjusts to present valid options.
  1148. // *FIX: only some changes, ie, hollow or primitive type changes,
  1149. // require a refresh.
  1150. self->refresh();
  1151. }
  1152. void LLPanelObject::getVolumeParams(LLVolumeParams& volume_params)
  1153. {
  1154. // Figure out what type of volume to make
  1155. S32 was_selected_type = mSelectedType;
  1156. S32 selected_type = mComboBaseType->getCurrentIndex();
  1157. U8 profile;
  1158. U8 path;
  1159. switch ( selected_type )
  1160. {
  1161. case MI_CYLINDER:
  1162. profile = LL_PCODE_PROFILE_CIRCLE;
  1163. path = LL_PCODE_PATH_LINE;
  1164. break;
  1165. case MI_BOX:
  1166. profile = LL_PCODE_PROFILE_SQUARE;
  1167. path = LL_PCODE_PATH_LINE;
  1168. break;
  1169. case MI_PRISM:
  1170. profile = LL_PCODE_PROFILE_EQUALTRI;
  1171. path = LL_PCODE_PATH_LINE;
  1172. break;
  1173. case MI_SPHERE:
  1174. profile = LL_PCODE_PROFILE_CIRCLE_HALF;
  1175. path = LL_PCODE_PATH_CIRCLE;
  1176. break;
  1177. case MI_TORUS:
  1178. profile = LL_PCODE_PROFILE_CIRCLE;
  1179. path = LL_PCODE_PATH_CIRCLE;
  1180. break;
  1181. case MI_TUBE:
  1182. profile = LL_PCODE_PROFILE_SQUARE;
  1183. path = LL_PCODE_PATH_CIRCLE;
  1184. break;
  1185. case MI_RING:
  1186. profile = LL_PCODE_PROFILE_EQUALTRI;
  1187. path = LL_PCODE_PATH_CIRCLE;
  1188. break;
  1189. case MI_SCULPT:
  1190. profile = LL_PCODE_PROFILE_CIRCLE;
  1191. path = LL_PCODE_PATH_CIRCLE;
  1192. break;
  1193. default:
  1194. llwarns << "Unknown base type " << selected_type 
  1195. << " in getVolumeParams()" << llendl;
  1196. // assume a box
  1197. selected_type = MI_BOX;
  1198. profile = LL_PCODE_PROFILE_SQUARE;
  1199. path = LL_PCODE_PATH_LINE;
  1200. break;
  1201. }
  1202. if (path == LL_PCODE_PATH_LINE)
  1203. {
  1204. LLVOVolume *volobjp = (LLVOVolume *)(LLViewerObject*)(mObject);
  1205. if (volobjp->isFlexible())
  1206. {
  1207. path = LL_PCODE_PATH_FLEXIBLE;
  1208. }
  1209. }
  1210. S32 selected_hole = mComboHoleType->getCurrentIndex();
  1211. U8 hole;
  1212. switch (selected_hole)
  1213. {
  1214. case MI_HOLE_CIRCLE: 
  1215. hole = LL_PCODE_HOLE_CIRCLE;
  1216. break;
  1217. case MI_HOLE_SQUARE:
  1218. hole = LL_PCODE_HOLE_SQUARE;
  1219. break;
  1220. case MI_HOLE_TRIANGLE:
  1221. hole = LL_PCODE_HOLE_TRIANGLE;
  1222. break;
  1223. case MI_HOLE_SAME:
  1224. default:
  1225. hole = LL_PCODE_HOLE_SAME;
  1226. break;
  1227. }
  1228. volume_params.setType(profile | hole, path);
  1229. mSelectedType = selected_type;
  1230. // Compute cut start/end
  1231. F32 cut_begin = mSpinCutBegin->get();
  1232. F32 cut_end = mSpinCutEnd->get();
  1233. // Make sure at least OBJECT_CUT_INC of the object survives
  1234. if (cut_begin > cut_end - OBJECT_MIN_CUT_INC)
  1235. {
  1236. cut_begin = cut_end - OBJECT_MIN_CUT_INC;
  1237. mSpinCutBegin->set(cut_begin);
  1238. }
  1239. F32 adv_cut_begin = mCtrlPathBegin->get();
  1240. F32 adv_cut_end = mCtrlPathEnd->get();
  1241. // Make sure at least OBJECT_CUT_INC of the object survives
  1242. if (adv_cut_begin > adv_cut_end - OBJECT_MIN_CUT_INC)
  1243. {
  1244. adv_cut_begin = adv_cut_end - OBJECT_MIN_CUT_INC;
  1245. mCtrlPathBegin->set(adv_cut_begin);
  1246. }
  1247. F32 begin_s, end_s;
  1248. F32 begin_t, end_t;
  1249. if (selected_type == MI_SPHERE || selected_type == MI_TORUS || 
  1250. selected_type == MI_TUBE   || selected_type == MI_RING)
  1251. {
  1252. begin_s = adv_cut_begin;
  1253. end_s = adv_cut_end;
  1254. begin_t = cut_begin;
  1255. end_t = cut_end;
  1256. }
  1257. else
  1258. {
  1259. begin_s = cut_begin;
  1260. end_s = cut_end;
  1261. begin_t = adv_cut_begin;
  1262. end_t = adv_cut_end;
  1263. }
  1264. volume_params.setBeginAndEndS(begin_s, end_s);
  1265. volume_params.setBeginAndEndT(begin_t, end_t);
  1266. // Hollowness
  1267. F32 hollow = mSpinHollow->get() / 100.f;
  1268. if (  selected_hole == MI_HOLE_SQUARE && 
  1269. ( selected_type == MI_CYLINDER || selected_type == MI_TORUS ||
  1270.   selected_type == MI_PRISM    || selected_type == MI_RING  ||
  1271.   selected_type == MI_SPHERE ) )
  1272. {
  1273. if (hollow > 0.7f) hollow = 0.7f;
  1274. }
  1275. volume_params.setHollow( hollow );
  1276. // Twist Begin,End
  1277. F32 twist_begin = mSpinTwistBegin->get();
  1278. F32 twist = mSpinTwist->get();
  1279. // Check the path type for twist conversion.
  1280. if (path == LL_PCODE_PATH_LINE || path == LL_PCODE_PATH_FLEXIBLE)
  1281. {
  1282. twist_begin /= OBJECT_TWIST_LINEAR_MAX;
  1283. twist /= OBJECT_TWIST_LINEAR_MAX;
  1284. }
  1285. else
  1286. {
  1287. twist_begin /= OBJECT_TWIST_MAX;
  1288. twist /= OBJECT_TWIST_MAX;
  1289. }
  1290. volume_params.setTwistBegin(twist_begin);
  1291. volume_params.setTwist(twist);
  1292. // Scale X,Y
  1293. F32 scale_x = mSpinScaleX->get();
  1294. F32 scale_y = mSpinScaleY->get();
  1295. if ( was_selected_type == MI_BOX || was_selected_type == MI_CYLINDER || was_selected_type == MI_PRISM)
  1296. {
  1297. scale_x = 1.f - scale_x;
  1298. scale_y = 1.f - scale_y;
  1299. }
  1300. // Skew
  1301. F32 skew = mSpinSkew->get();
  1302. // Taper X,Y
  1303. F32 taper_x = mSpinTaperX->get();
  1304. F32 taper_y = mSpinTaperY->get();
  1305. // Radius offset
  1306. F32 radius_offset = mSpinRadiusOffset->get();
  1307. // Revolutions
  1308. F32 revolutions   = mSpinRevolutions->get();
  1309. if ( selected_type == MI_SPHERE )
  1310. {
  1311. // Snap values to valid sphere parameters.
  1312. scale_x = 1.0f;
  1313. scale_y = 1.0f;
  1314. skew = 0.0f;
  1315. taper_x = 0.0f;
  1316. taper_y = 0.0f;
  1317. radius_offset = 0.0f;
  1318. revolutions = 1.0f;
  1319. }
  1320. else if ( selected_type == MI_TORUS || selected_type == MI_TUBE ||
  1321.   selected_type == MI_RING )
  1322. {
  1323. scale_x = llclamp(
  1324. scale_x,
  1325. OBJECT_MIN_HOLE_SIZE,
  1326. OBJECT_MAX_HOLE_SIZE_X);
  1327. scale_y = llclamp(
  1328. scale_y,
  1329. OBJECT_MIN_HOLE_SIZE,
  1330. OBJECT_MAX_HOLE_SIZE_Y);
  1331. // Limit radius offset, based on taper and hole size y.
  1332. F32 radius_mag = fabs(radius_offset);
  1333. F32 hole_y_mag = fabs(scale_y);
  1334. F32 taper_y_mag  = fabs(taper_y);
  1335. // Check to see if the taper effects us.
  1336. if ( (radius_offset > 0.f && taper_y < 0.f) ||
  1337.  (radius_offset < 0.f && taper_y > 0.f) )
  1338. {
  1339. // The taper does not help increase the radius offset range.
  1340. taper_y_mag = 0.f;
  1341. }
  1342. F32 max_radius_mag = 1.f - hole_y_mag * (1.f - taper_y_mag) / (1.f - hole_y_mag);
  1343. // Enforce the maximum magnitude.
  1344. if (radius_mag > max_radius_mag)
  1345. {
  1346. // Check radius offset sign.
  1347. if (radius_offset < 0.f)
  1348. {
  1349. radius_offset = -max_radius_mag;
  1350. }
  1351. else
  1352. {
  1353. radius_offset = max_radius_mag;
  1354. }
  1355. }
  1356. // Check the skew value against the revolutions.
  1357. F32 skew_mag= fabs(skew);
  1358. F32 min_skew_mag = 1.0f - 1.0f / (revolutions * scale_x + 1.0f);
  1359. // Discontinuity; A revolution of 1 allows skews below 0.5.
  1360. if ( fabs(revolutions - 1.0f) < 0.001)
  1361. min_skew_mag = 0.0f;
  1362. // Clip skew.
  1363. if (skew_mag < min_skew_mag)
  1364. {
  1365. // Check skew sign.
  1366. if (skew < 0.0f)
  1367. {
  1368. skew = -min_skew_mag;
  1369. }
  1370. else 
  1371. {
  1372. skew = min_skew_mag;
  1373. }
  1374. }
  1375. }
  1376. volume_params.setRatio( scale_x, scale_y );
  1377. volume_params.setSkew(skew);
  1378. volume_params.setTaper( taper_x, taper_y );
  1379. volume_params.setRadiusOffset(radius_offset);
  1380. volume_params.setRevolutions(revolutions);
  1381. // Shear X,Y
  1382. F32 shear_x = mSpinShearX->get();
  1383. F32 shear_y = mSpinShearY->get();
  1384. volume_params.setShear( shear_x, shear_y );
  1385. if (selected_type == MI_SCULPT)
  1386. {
  1387. volume_params.setSculptID(LLUUID::null, 0);
  1388. volume_params.setBeginAndEndT   (0, 1);
  1389. volume_params.setBeginAndEndS   (0, 1);
  1390. volume_params.setHollow         (0);
  1391. volume_params.setTwistBegin     (0);
  1392. volume_params.setTwistEnd       (0);
  1393. volume_params.setRatio          (1, 0.5);
  1394. volume_params.setShear          (0, 0);
  1395. volume_params.setTaper          (0, 0);
  1396. volume_params.setRevolutions    (1);
  1397. volume_params.setRadiusOffset   (0);
  1398. volume_params.setSkew           (0);
  1399. }
  1400. }
  1401. // BUG: Make work with multiple objects
  1402. void LLPanelObject::sendRotation(BOOL btn_down)
  1403. {
  1404. if (mObject.isNull()) return;
  1405. LLVector3 new_rot(mCtrlRotX->get(), mCtrlRotY->get(), mCtrlRotZ->get());
  1406. new_rot.mV[VX] = llround(new_rot.mV[VX], OBJECT_ROTATION_PRECISION);
  1407. new_rot.mV[VY] = llround(new_rot.mV[VY], OBJECT_ROTATION_PRECISION);
  1408. new_rot.mV[VZ] = llround(new_rot.mV[VZ], OBJECT_ROTATION_PRECISION);
  1409. // Note: must compare before conversion to radians
  1410. LLVector3 delta = new_rot - mCurEulerDegrees;
  1411. if (delta.magVec() >= 0.0005f)
  1412. {
  1413. mCurEulerDegrees = new_rot;
  1414. new_rot *= DEG_TO_RAD;
  1415. LLQuaternion rotation;
  1416. rotation.setQuat(new_rot.mV[VX], new_rot.mV[VY], new_rot.mV[VZ]);
  1417. if (mRootObject != mObject)
  1418. {
  1419. rotation = rotation * ~mRootObject->getRotationRegion();
  1420. }
  1421. std::vector<LLVector3>& child_positions = mObject->mUnselectedChildrenPositions ;
  1422. std::vector<LLQuaternion> child_rotations;
  1423. if (mObject->isRootEdit())
  1424. {
  1425. mObject->saveUnselectedChildrenRotation(child_rotations) ;
  1426. mObject->saveUnselectedChildrenPosition(child_positions) ;
  1427. }
  1428. mObject->setRotation(rotation);
  1429. LLManip::rebuild(mObject) ;
  1430. // for individually selected roots, we need to counterrotate all the children
  1431. if (mObject->isRootEdit())
  1432. {
  1433. mObject->resetChildrenRotationAndPosition(child_rotations, child_positions) ;
  1434. }
  1435. if(!btn_down)
  1436. {
  1437. child_positions.clear() ;
  1438. LLSelectMgr::getInstance()->sendMultipleUpdate(UPD_ROTATION | UPD_POSITION);
  1439. }
  1440. }
  1441. }
  1442. // BUG: Make work with multiple objects
  1443. void LLPanelObject::sendScale(BOOL btn_down)
  1444. {
  1445. if (mObject.isNull()) return;
  1446. LLVector3 newscale(mCtrlScaleX->get(), mCtrlScaleY->get(), mCtrlScaleZ->get());
  1447. LLVector3 delta = newscale - mObject->getScale();
  1448. if (delta.magVec() >= 0.0005f)
  1449. {
  1450. // scale changed by more than 1/2 millimeter
  1451. // check to see if we aren't scaling the textures
  1452. // (in which case the tex coord's need to be recomputed)
  1453. BOOL dont_stretch_textures = !LLManipScale::getStretchTextures();
  1454. if (dont_stretch_textures)
  1455. {
  1456. LLSelectMgr::getInstance()->saveSelectedObjectTransform(SELECT_ACTION_TYPE_SCALE);
  1457. }
  1458. mObject->setScale(newscale, TRUE);
  1459. if(!btn_down)
  1460. {
  1461. LLSelectMgr::getInstance()->sendMultipleUpdate(UPD_SCALE | UPD_POSITION);
  1462. }
  1463. LLSelectMgr::getInstance()->adjustTexturesByScale(TRUE, !dont_stretch_textures);
  1464. // llinfos << "scale sent" << llendl;
  1465. }
  1466. else
  1467. {
  1468. // llinfos << "scale not changed" << llendl;
  1469. }
  1470. }
  1471. void LLPanelObject::sendPosition(BOOL btn_down)
  1472. {
  1473. if (mObject.isNull()) return;
  1474. LLVector3 newpos(mCtrlPosX->get(), mCtrlPosY->get(), mCtrlPosZ->get());
  1475. LLViewerRegion* regionp = mObject->getRegion();
  1476. // Clamp the Z height
  1477. const F32 height = newpos.mV[VZ];
  1478. const F32 min_height = LLWorld::getInstance()->getMinAllowedZ(mObject);
  1479. const F32 max_height = LLWorld::getInstance()->getRegionMaxHeight();
  1480. if (!mObject->isAttachment())
  1481. {
  1482. if ( height < min_height)
  1483. {
  1484. newpos.mV[VZ] = min_height;
  1485. mCtrlPosZ->set( min_height );
  1486. }
  1487. else if ( height > max_height )
  1488. {
  1489. newpos.mV[VZ] = max_height;
  1490. mCtrlPosZ->set( max_height );
  1491. }
  1492. // Grass is always drawn on the ground, so clamp its position to the ground
  1493. if (mObject->getPCode() == LL_PCODE_LEGACY_GRASS)
  1494. {
  1495. mCtrlPosZ->set(LLWorld::getInstance()->resolveLandHeightAgent(newpos) + 1.f);
  1496. }
  1497. }
  1498. // Make sure new position is in a valid region, so the object
  1499. // won't get dumped by the simulator.
  1500. LLVector3d new_pos_global = regionp->getPosGlobalFromRegion(newpos);
  1501. if ( LLWorld::getInstance()->positionRegionValidGlobal(new_pos_global) )
  1502. {
  1503. // send only if the position is changed, that is, the delta vector is not zero
  1504. LLVector3d old_pos_global = mObject->getPositionGlobal();
  1505. LLVector3d delta = new_pos_global - old_pos_global;
  1506. // moved more than 1/2 millimeter
  1507. if (delta.magVec() >= 0.0005f)
  1508. {
  1509. if (mRootObject != mObject)
  1510. {
  1511. newpos = newpos - mRootObject->getPositionRegion();
  1512. newpos = newpos * ~mRootObject->getRotationRegion();
  1513. mObject->setPositionParent(newpos);
  1514. }
  1515. else
  1516. {
  1517. mObject->setPositionEdit(newpos);
  1518. }
  1519. LLManip::rebuild(mObject) ;
  1520. // for individually selected roots, we need to counter-translate all unselected children
  1521. if (mObject->isRootEdit())
  1522. {
  1523. // only offset by parent's translation
  1524. mObject->resetChildrenPosition(LLVector3(-delta), TRUE) ;
  1525. }
  1526. if(!btn_down)
  1527. {
  1528. LLSelectMgr::getInstance()->sendMultipleUpdate(UPD_POSITION);
  1529. }
  1530. LLSelectMgr::getInstance()->updateSelectionCenter();
  1531. }
  1532. }
  1533. else
  1534. {
  1535. // move failed, so we update the UI with the correct values
  1536. LLVector3 vec = mRootObject->getPositionRegion();
  1537. mCtrlPosX->set(vec.mV[VX]);
  1538. mCtrlPosY->set(vec.mV[VY]);
  1539. mCtrlPosZ->set(vec.mV[VZ]);
  1540. }
  1541. }
  1542. void LLPanelObject::sendSculpt()
  1543. {
  1544. if (mObject.isNull())
  1545. return;
  1546. LLSculptParams sculpt_params;
  1547. if (mCtrlSculptTexture)
  1548. sculpt_params.setSculptTexture(mCtrlSculptTexture->getImageAssetID());
  1549. U8 sculpt_type = 0;
  1550. if (mCtrlSculptType)
  1551. sculpt_type |= mCtrlSculptType->getCurrentIndex();
  1552. if ((mCtrlSculptMirror) && (mCtrlSculptMirror->get()))
  1553. sculpt_type |= LL_SCULPT_FLAG_MIRROR;
  1554. if ((mCtrlSculptInvert) && (mCtrlSculptInvert->get()))
  1555. sculpt_type |= LL_SCULPT_FLAG_INVERT;
  1556. sculpt_params.setSculptType(sculpt_type);
  1557. mObject->setParameterEntry(LLNetworkData::PARAMS_SCULPT, sculpt_params, TRUE);
  1558. }
  1559. void LLPanelObject::refresh()
  1560. {
  1561. getState();
  1562. if (mObject.notNull() && mObject->isDead())
  1563. {
  1564. mObject = NULL;
  1565. }
  1566. if (mRootObject.notNull() && mRootObject->isDead())
  1567. {
  1568. mRootObject = NULL;
  1569. }
  1570. }
  1571. void LLPanelObject::draw()
  1572. {
  1573. const LLColor4 white( 1.0f, 1.0f, 1.0f, 1);
  1574. const LLColor4 red( 1.0f, 0.25f, 0.f, 1);
  1575. const LLColor4 green( 0.f, 1.0f, 0.f, 1);
  1576. const LLColor4 blue( 0.f, 0.5f, 1.0f, 1);
  1577. // Tune the colors of the labels
  1578. LLTool* tool = LLToolMgr::getInstance()->getCurrentTool();
  1579. if (tool == LLToolCompTranslate::getInstance())
  1580. {
  1581. mCtrlPosX ->setLabelColor(red);
  1582. mCtrlPosY ->setLabelColor(green);
  1583. mCtrlPosZ ->setLabelColor(blue);
  1584. mCtrlScaleX ->setLabelColor(white);
  1585. mCtrlScaleY ->setLabelColor(white);
  1586. mCtrlScaleZ ->setLabelColor(white);
  1587. mCtrlRotX ->setLabelColor(white);
  1588. mCtrlRotY ->setLabelColor(white);
  1589. mCtrlRotZ ->setLabelColor(white);
  1590. }
  1591. else if ( tool == LLToolCompScale::getInstance() )
  1592. {
  1593. mCtrlPosX ->setLabelColor(white);
  1594. mCtrlPosY ->setLabelColor(white);
  1595. mCtrlPosZ ->setLabelColor(white);
  1596. mCtrlScaleX ->setLabelColor(red);
  1597. mCtrlScaleY ->setLabelColor(green);
  1598. mCtrlScaleZ ->setLabelColor(blue);
  1599. mCtrlRotX ->setLabelColor(white);
  1600. mCtrlRotY ->setLabelColor(white);
  1601. mCtrlRotZ ->setLabelColor(white);
  1602. }
  1603. else if ( tool == LLToolCompRotate::getInstance() )
  1604. {
  1605. mCtrlPosX ->setLabelColor(white);
  1606. mCtrlPosY ->setLabelColor(white);
  1607. mCtrlPosZ ->setLabelColor(white);
  1608. mCtrlScaleX ->setLabelColor(white);
  1609. mCtrlScaleY ->setLabelColor(white);
  1610. mCtrlScaleZ ->setLabelColor(white);
  1611. mCtrlRotX ->setLabelColor(red);
  1612. mCtrlRotY ->setLabelColor(green);
  1613. mCtrlRotZ ->setLabelColor(blue);
  1614. }
  1615. else
  1616. {
  1617. mCtrlPosX ->setLabelColor(white);
  1618. mCtrlPosY ->setLabelColor(white);
  1619. mCtrlPosZ ->setLabelColor(white);
  1620. mCtrlScaleX ->setLabelColor(white);
  1621. mCtrlScaleY ->setLabelColor(white);
  1622. mCtrlScaleZ ->setLabelColor(white);
  1623. mCtrlRotX ->setLabelColor(white);
  1624. mCtrlRotY ->setLabelColor(white);
  1625. mCtrlRotZ ->setLabelColor(white);
  1626. }
  1627. LLPanel::draw();
  1628. }
  1629. // virtual
  1630. void LLPanelObject::clearCtrls()
  1631. {
  1632. LLPanel::clearCtrls();
  1633. mCheckLock ->set(FALSE);
  1634. mCheckLock ->setEnabled( FALSE );
  1635. mCheckPhysics ->set(FALSE);
  1636. mCheckPhysics ->setEnabled( FALSE );
  1637. mCheckTemporary ->set(FALSE);
  1638. mCheckTemporary ->setEnabled( FALSE );
  1639. mCheckPhantom ->set(FALSE);
  1640. mCheckPhantom ->setEnabled( FALSE );
  1641. #if 0 // 1.9.2
  1642. mCheckCastShadows->set(FALSE);
  1643. mCheckCastShadows->setEnabled( FALSE );
  1644. #endif
  1645. mComboMaterial ->setEnabled( FALSE );
  1646. mLabelMaterial ->setEnabled( FALSE );
  1647. // Disable text labels
  1648. mLabelPosition ->setEnabled( FALSE );
  1649. mLabelSize ->setEnabled( FALSE );
  1650. mLabelRotation ->setEnabled( FALSE );
  1651. mLabelBaseType ->setEnabled( FALSE );
  1652. mLabelCut ->setEnabled( FALSE );
  1653. mLabelHollow ->setEnabled( FALSE );
  1654. mLabelHoleType ->setEnabled( FALSE );
  1655. mLabelTwist ->setEnabled( FALSE );
  1656. mLabelSkew ->setEnabled( FALSE );
  1657. mLabelShear ->setEnabled( FALSE );
  1658. mLabelTaper ->setEnabled( FALSE );
  1659. mLabelRadiusOffset->setEnabled( FALSE );
  1660. mLabelRevolutions->setEnabled( FALSE );
  1661. childSetVisible("select_single", FALSE);
  1662. childSetVisible("edit_object", TRUE);
  1663. childSetEnabled("edit_object", FALSE);
  1664. childSetEnabled("scale_hole", FALSE);
  1665. childSetEnabled("scale_taper", FALSE);
  1666. childSetEnabled("advanced_cut", FALSE);
  1667. childSetEnabled("advanced_dimple", FALSE);
  1668. childSetVisible("advanced_slice", FALSE);
  1669. }
  1670. //
  1671. // Static functions
  1672. //
  1673. // static
  1674. void LLPanelObject::onCommitLock(LLUICtrl *ctrl, void *data)
  1675. {
  1676. // Checkbox will have toggled itself
  1677. LLPanelObject *self = (LLPanelObject *)data;
  1678. if(self->mRootObject.isNull()) return;
  1679. BOOL new_state = self->mCheckLock->get();
  1680. LLSelectMgr::getInstance()->selectionSetObjectPermissions(PERM_OWNER, !new_state, PERM_MOVE | PERM_MODIFY);
  1681. }
  1682. // static
  1683. void LLPanelObject::onCommitPosition( LLUICtrl* ctrl, void* userdata )
  1684. {
  1685. LLPanelObject* self = (LLPanelObject*) userdata;
  1686. BOOL btn_down = ((LLSpinCtrl*)ctrl)->isMouseHeldDown() ;
  1687. self->sendPosition(btn_down);
  1688. }
  1689. // static
  1690. void LLPanelObject::onCommitScale( LLUICtrl* ctrl, void* userdata )
  1691. {
  1692. LLPanelObject* self = (LLPanelObject*) userdata;
  1693. BOOL btn_down = ((LLSpinCtrl*)ctrl)->isMouseHeldDown() ;
  1694. self->sendScale(btn_down);
  1695. }
  1696. // static
  1697. void LLPanelObject::onCommitRotation( LLUICtrl* ctrl, void* userdata )
  1698. {
  1699. LLPanelObject* self = (LLPanelObject*) userdata;
  1700. BOOL btn_down = ((LLSpinCtrl*)ctrl)->isMouseHeldDown() ;
  1701. self->sendRotation(btn_down);
  1702. }
  1703. // static
  1704. void LLPanelObject::onCommitPhysics( LLUICtrl* ctrl, void* userdata )
  1705. {
  1706. LLPanelObject* self = (LLPanelObject*) userdata;
  1707. self->sendIsPhysical();
  1708. }
  1709. // static
  1710. void LLPanelObject::onCommitTemporary( LLUICtrl* ctrl, void* userdata )
  1711. {
  1712. LLPanelObject* self = (LLPanelObject*) userdata;
  1713. self->sendIsTemporary();
  1714. }
  1715. // static
  1716. void LLPanelObject::onCommitPhantom( LLUICtrl* ctrl, void* userdata )
  1717. {
  1718. LLPanelObject* self = (LLPanelObject*) userdata;
  1719. self->sendIsPhantom();
  1720. }
  1721. // static
  1722. void LLPanelObject::onCommitCastShadows( LLUICtrl* ctrl, void* userdata )
  1723. {
  1724. LLPanelObject* self = (LLPanelObject*) userdata;
  1725. self->sendCastShadows();
  1726. }
  1727. void LLPanelObject::onSelectSculpt(const LLSD& data)
  1728. {
  1729.     LLTextureCtrl* mTextureCtrl = getChild<LLTextureCtrl>("sculpt texture control");
  1730. if (mTextureCtrl)
  1731. {
  1732. mSculptTextureRevert = mTextureCtrl->getImageAssetID();
  1733. }
  1734. sendSculpt();
  1735. }
  1736. void LLPanelObject::onCommitSculpt( const LLSD& data )
  1737. {
  1738. sendSculpt();
  1739. }
  1740. BOOL LLPanelObject::onDropSculpt(LLInventoryItem* item)
  1741. {
  1742.     LLTextureCtrl* mTextureCtrl = getChild<LLTextureCtrl>("sculpt texture control");
  1743. if (mTextureCtrl)
  1744. {
  1745. LLUUID asset = item->getAssetUUID();
  1746. mTextureCtrl->setImageAssetID(asset);
  1747. mSculptTextureRevert = asset;
  1748. }
  1749. return TRUE;
  1750. }
  1751. void LLPanelObject::onCancelSculpt(const LLSD& data)
  1752. {
  1753. LLTextureCtrl* mTextureCtrl = getChild<LLTextureCtrl>("sculpt texture control");
  1754. if(!mTextureCtrl)
  1755. return;
  1756. mTextureCtrl->setImageAssetID(mSculptTextureRevert);
  1757. sendSculpt();
  1758. }
  1759. // static
  1760. void LLPanelObject::onCommitSculptType(LLUICtrl *ctrl, void* userdata)
  1761. {
  1762. LLPanelObject* self = (LLPanelObject*) userdata;
  1763. self->sendSculpt();
  1764. }