private void DisconnectInputAssetActor(HEU_SessionBase session)
		{
			if (!_inputAssetConnected)
			{
				return;
			}

			if (_inputNodeType == InputNodeType.PARAMETER)
			{
				HEU_ParameterData paramData = _parentAsset.Parameters.GetParameter(_paramName);
				if(paramData == null)
				{
					Debug.LogErrorFormat("Unable to find parameter with name {0}!", _paramName);
				}
				else if (!session.SetParamStringValue(_nodeID, "", paramData.ParmID, 0))
				{
					Debug.LogErrorFormat("Unable to clear object path parameter for input node!");
				}
			}
			else if(session != null && _nodeID != HEU_Defines.HEU_INVALID_NODE_ID)
			{
				session.DisconnectNodeInput(_nodeID, _inputIndex, false);
			}

			HEU_HoudiniAssetRoot inputAssetRoot = _inputAsset != null ? _inputAsset.GetComponent<HEU_HoudiniAssetRoot>() : null;
			if (inputAssetRoot != null)
			{
				_parentAsset.DisconnectFromUpstream(inputAssetRoot._houdiniAsset);
			}

			// Must clear this and not delete as this points to existing asset node.
			// If _inputObjectType changes to MESH, node with this ID will get deleted. 
			_connectedNodeID = HEU_Defines.HEU_INVALID_NODE_ID;
			_inputAssetConnected = false;
		}
Esempio n. 2
0
		private void DisconnectInputAssetActor(HEU_SessionBase session)
		{
			if (!IsInputAssetConnected())
			{
				return;
			}

			if (session != null)
			{
				//Debug.LogWarningFormat("Disconnecting Node Input for _nodeID={0} with type={1}", _nodeID, _inputNodeType);

				if (_inputNodeType == InputNodeType.PARAMETER)
				{
					HEU_ParameterData paramData = _parentAsset.Parameters.GetParameter(_paramName);
					if (paramData == null)
					{
						Debug.LogErrorFormat("Unable to find parameter with name {0}!", _paramName);
					}
					else if (!session.SetParamStringValue(_nodeID, "", paramData.ParmID, 0))
					{
						Debug.LogErrorFormat("Unable to clear object path parameter for input node!");
					}
				}
				else if (_nodeID != HEU_Defines.HEU_INVALID_NODE_ID)
				{
					session.DisconnectNodeInput(_nodeID, _inputIndex, false);
				}
			}

			ClearConnectedInputAsset();

			// Must clear this and not delete as this points to existing asset node.
			// If _inputObjectType changes to MESH, node with this ID will get deleted. 
			_connectedNodeID = HEU_Defines.HEU_INVALID_NODE_ID;
		}
	public static bool SetChoice(HEU_HoudiniAsset asset, string paramName, int setValue)
	{
	    HEU_ParameterData paramData = asset.Parameters.GetParameter(paramName);
	    if (paramData != null && paramData._parmInfo.choiceCount > 0 && setValue >= 0 && setValue < paramData._choiceIntValues.Length)
	    {
		paramData._intValues[0] = paramData._choiceIntValues[setValue];
		return true;
	    }
	    else
	    {
		Debug.LogWarningFormat("{0}: Set failed. Asset [{0}]'s Parameter [{1}] is not a valid choice!", asset.AssetName, paramName);
		return false;
	    }
	}
	public static bool SetString(HEU_HoudiniAsset asset, string paramName, string setValue)
	{
	    HEU_ParameterData paramData = asset.Parameters.GetParameter(paramName);
	    if (paramData != null && (paramData.IsString() || paramData.IsPathFile()))
	    {
		paramData._stringValues[0] = setValue;
		return true;
	    }
	    else
	    {
		Debug.LogWarningFormat("{0}: Set failed. Asset [{0}]'s Parameter [{1}] is not a valid string!", asset.AssetName, paramName);
		return false;
	    }
	}
	public static bool SetFloats(HEU_HoudiniAsset asset, string paramName, float[] setValues)
	{
	    HEU_ParameterData paramData = asset.Parameters.GetParameter(paramName);
	    if (paramData != null && paramData.IsFloat())
	    {
		paramData._floatValues = setValues;
		return true;
	    }
	    else
	    {
		Debug.LogWarningFormat("{0}: Set failed. Asset [{0}]'s Parameter [{1}] is not a valid float!", asset.AssetName, paramName);
		return false;
	    }
	}
	public static bool SetInt(HEU_HoudiniAsset asset, string paramName, int setValue)
	{
	    HEU_ParameterData paramData = asset.Parameters.GetParameter(paramName);
	    if (paramData != null && paramData.IsInt())
	    {
		paramData._intValues[0] = setValue;
		return true;
	    }
	    else
	    {
		Debug.LogWarningFormat("{0}: Set failed. Asset [{0}]'s Parameter [{1}] is not a valid int!", asset.AssetName, paramName);
		return false;
	    }
	}
	public static bool GetToggle(HEU_HoudiniAsset asset, string paramName, out bool outValue)
	{
	    outValue = false;
	    HEU_ParameterData paramData = asset.Parameters.GetParameter(paramName);
	    if (paramData != null && paramData.IsToggle())
	    {
		outValue = paramData._toggle;
		return true;
	    }
	    else
	    {
		Debug.LogWarningFormat("{0}: Query failed. Asset [{0}]'s Parameter [{1}] is not a valid toggle!", asset.AssetName, paramName);
		return false;
	    }
	}
	public static bool GetInputNode(HEU_HoudiniAsset asset, string paramName, int index, out GameObject obj)
	{
	    obj = null;
	    HEU_ParameterData paramData = asset.Parameters.GetParameter(paramName);
	    if (paramData != null && paramData._paramInputNode != null)
	    {
		obj = paramData._paramInputNode.GetInputEntryGameObject(index);
		return obj != null;
	    }
	    else
	    {
		Debug.LogWarningFormat("{0}: Set failed. Asset [{0}]'s Parameter [{1}] is not a valid input parameter!", asset.AssetName, paramName);
		return false;
	    }
	}
	public static bool GetChoice(HEU_HoudiniAsset asset, string paramName, out int outValue)
	{
	    outValue = 0;
	    HEU_ParameterData paramData = asset.Parameters.GetParameter(paramName);
	    if (paramData != null && paramData._parmInfo.choiceCount > 0)
	    {
		outValue = paramData._intValues[0];
		return true;
	    }
	    else
	    {
		Debug.LogWarningFormat("{0}: Query failed. Asset [{0}]'s Parameter [{1}] is not a valid choice!", asset.AssetName, paramName);
		return false;
	    }
	}
	public static bool GetFloat(HEU_HoudiniAsset asset, string paramName, out float outValue)
	{
	    outValue = 0;
	    HEU_ParameterData paramData = asset.Parameters.GetParameter(paramName);
	    if (paramData != null && paramData.IsFloat())
	    {
		outValue = paramData._floatValues[0];
		return true;
	    }
	    else
	    {
		Debug.LogWarningFormat("{0}: Query failed. Asset [{0}]'s Parameter [{1}] is not a valid float!", asset.AssetName, paramName);
		return false;
	    }
	}
	public static bool GetColor(HEU_HoudiniAsset asset, string paramName, out Color getValue)
	{
	    HEU_ParameterData paramData = asset.Parameters.GetParameter(paramName);
	    if (paramData != null && paramData.IsColor())
	    {
		getValue = paramData._color;
		return true;
	    }
	    else
	    {
		getValue = Color.white;
		Debug.LogWarningFormat("{0}: Query failed. Asset [{0}]'s Parameter [{1}] is not a valid color!", asset.AssetName, paramName);
		return false;
	    }
	}
		public static bool SetInputNode(HEU_HoudiniAsset asset, string paramName, GameObject obj, int index)
		{
			HEU_ParameterData paramData = asset.Parameters.GetParameter(paramName);
			if (paramData != null && paramData._paramInputNode != null)
			{
				if(index < paramData._paramInputNode.NumInputObjects())
				{
					paramData._paramInputNode.InsertInputObject(index, obj);
				}
				else
				{
					paramData._paramInputNode.AddInputObjectAtEnd(obj);
				}
				return true;
			}
			else
			{
				Debug.LogWarningFormat("{0}: Set failed. Asset [{0}]'s Parameter [{1}] is not a valid input parameter!", asset.AssetName, paramName);
				return false;
			}
		}
Esempio n. 13
0
	private void DisconnectConnectedMergeNode(HEU_SessionBase session)
	{
	    if (session != null)
	    {
		//Debug.LogWarningFormat("Disconnecting Node Input for _nodeID={0} with type={1}", _nodeID, _inputNodeType);

		if (_inputNodeType == InputNodeType.PARAMETER)
		{
		    HEU_ParameterData paramData = _parentAsset.Parameters.GetParameter(_paramName);
		    if (paramData == null)
		    {
			Debug.LogErrorFormat("Unable to find parameter with name {0}!", _paramName);
		    }
		    else if (!session.SetParamStringValue(_nodeID, "", paramData.ParmID, 0))
		    {
			Debug.LogErrorFormat("Unable to clear object path parameter for input node!");
		    }
		}
		else if (_nodeID != HEU_Defines.HEU_INVALID_NODE_ID)
		{
		    session.DisconnectNodeInput(_nodeID, _inputIndex, false);
		}
	    }
	}
Esempio n. 14
0
	/// <summary>
	/// Project curve points onto collider or layer.
	/// </summary>
	/// <param name="parentAsset">Parent asset of the curve</param>
	/// <param name="rayDirection">Direction to cast ray</param>
	/// <param name="rayDistance">Maximum ray cast distance</param>
	public void ProjectToColliders(HEU_HoudiniAsset parentAsset, Vector3 rayDirection, float rayDistance)
	{
	    bool bRequiresUpload = false;

	    LayerMask layerMask = Physics.DefaultRaycastLayers;

	    HEU_Curve.CurveDrawCollision collisionType = parentAsset.CurveDrawCollision;
	    if (collisionType == CurveDrawCollision.COLLIDERS)
	    {
		List<Collider> colliders = parentAsset.GetCurveDrawColliders();

		bool bFoundHit = false;
		int numPoints = _points.Count;
		for (int i = 0; i < numPoints; ++i)
		{
		    bFoundHit = false;
		    RaycastHit[] rayHits = Physics.RaycastAll(_points[i], rayDirection, rayDistance, layerMask, QueryTriggerInteraction.Ignore);
		    foreach (RaycastHit hit in rayHits)
		    {
			foreach (Collider collider in colliders)
			{
			    if (hit.collider == collider)
			    {
				_points[i] = hit.point;
				bFoundHit = true;
				bRequiresUpload = true;
				break;
			    }
			}

			if (bFoundHit)
			{
			    break;
			}
		    }
		}


	    }
	    else if (collisionType == CurveDrawCollision.LAYERMASK)
	    {
		layerMask = parentAsset.GetCurveDrawLayerMask();

		int numPoints = _points.Count;
		for (int i = 0; i < numPoints; ++i)
		{
		    RaycastHit hitInfo;
		    if (Physics.Raycast(_points[i], rayDirection, out hitInfo, rayDistance, layerMask, QueryTriggerInteraction.Ignore))
		    {
			_points[i] = hitInfo.point;
			bRequiresUpload = true;
		    }
		}
	    }

	    if (bRequiresUpload)
	    {
		HEU_ParameterData paramData = _parameters.GetParameter(HEU_Defines.CURVE_COORDS_PARAM);
		if (paramData != null)
		{
		    paramData._stringValues[0] = GetPointsString(_points);
		}

		SetEditState(CurveEditState.REQUIRES_GENERATION);
	    }
	}
Esempio n. 15
0
		public void GenerateTransform(HEU_SessionBase session, HEU_Parameters parameters)
		{
			HAPI_TransformEuler transformEuler = new HAPI_TransformEuler(true);

			transformEuler.rstOrder = _rstOrder;
			transformEuler.rotationOrder = _xyzOrder;

			transformEuler.position[0] = 0;
			transformEuler.position[1] = 0;
			transformEuler.position[2] = 0;

			transformEuler.rotationEuler[0] = 0;
			transformEuler.rotationEuler[1] = 0;
			transformEuler.rotationEuler[2] = 0;

			transformEuler.scale[0] = 1;
			transformEuler.scale[1] = 1;
			transformEuler.scale[2] = 1;

			if (_handleParamTranslateBinding != null)
			{
				HEU_ParameterData parmData = parameters.GetParameterWithParmID(_handleParamTranslateBinding._parmID);
				if (parmData != null && !parmData._parmInfo.invisible)
				{
					transformEuler.position[0] = parmData._floatValues[0];
					transformEuler.position[1] = parmData._floatValues[1];
					transformEuler.position[2] = parmData._floatValues[2];
				}
			}

			if(_handleParamRotateBinding != null)
			{
				HEU_ParameterData parmData = parameters.GetParameterWithParmID(_handleParamRotateBinding._parmID);
				if (parmData != null && !parmData._parmInfo.invisible)
				{
					transformEuler.rotationEuler[0] = parmData._floatValues[0];
					transformEuler.rotationEuler[1] = parmData._floatValues[1];
					transformEuler.rotationEuler[2] = parmData._floatValues[2];
				}
			}

			if(_handleParamScaleBinding != null)
			{
				HEU_ParameterData parmData = parameters.GetParameterWithParmID(_handleParamScaleBinding._parmID);
				if (parmData != null && !parmData._parmInfo.invisible)
				{
					transformEuler.scale[0] = parmData._floatValues[0];
					transformEuler.scale[1] = parmData._floatValues[1];
					transformEuler.scale[2] = parmData._floatValues[2];
				}
			}

			if (!session.ConvertTransform(ref transformEuler, HAPI_RSTOrder.HAPI_SRT, HAPI_XYZOrder.HAPI_ZXY, out _convertedTransformEuler))
			{
				return;
			}

			// Convert to left-handed Unity
			_convertedTransformEuler.position[0] = -_convertedTransformEuler.position[0];
			_convertedTransformEuler.rotationEuler[1] = -_convertedTransformEuler.rotationEuler[1];
			_convertedTransformEuler.rotationEuler[2] = -_convertedTransformEuler.rotationEuler[2];

			if (IsSpecialRSTOrder(transformEuler.rstOrder))
			{
				_handlePosition = new Vector3(_convertedTransformEuler.position[0], _convertedTransformEuler.position[1], _convertedTransformEuler.position[2]);
			}
			else if (_handleParamTranslateBinding != null)
			{
				_handlePosition = new Vector3(-transformEuler.position[0], transformEuler.position[1], transformEuler.position[2]);
			}
			else
			{
				_handlePosition = Vector3.zero;
			}

			_handleRotation = Quaternion.Euler(_convertedTransformEuler.rotationEuler[0], _convertedTransformEuler.rotationEuler[1], _convertedTransformEuler.rotationEuler[2]);

			if (_handleParamScaleBinding != null)
			{
				_handleScale = new Vector3(transformEuler.scale[0], transformEuler.scale[1], transformEuler.scale[2]);
			}
			else
			{
				_handleScale = Vector3.one;
			}
		}
Esempio n. 16
0
		//  LOGIC -----------------------------------------------------------------------------------------------------

		public bool SetupHandle(HEU_SessionBase session, HAPI_NodeId assetID, int handleIndex, string handleName, 
			HEU_HandleType handleType, ref HAPI_HandleInfo handleInfo, HEU_Parameters parameters)
		{
			_handleIndex = handleIndex;
			_handleName = handleName;
			_handleType = handleType;

			HAPI_HandleBindingInfo[] handleBindingInfos = new HAPI_HandleBindingInfo[handleInfo.bindingsCount];
			if (!session.GetHandleBindingInfo(assetID, _handleIndex, handleBindingInfos, 0, handleInfo.bindingsCount))
			{
				return false;
			}

			HAPI_ParmId translateParmID = -1;
			HAPI_ParmId rotateParmID = -1;
			HAPI_ParmId scaleParmID = -1;
			HAPI_ParmId rstOrderParmID = -1;
			HAPI_ParmId xyzOrderParmID = -1;

			_rstOrder = HAPI_RSTOrder.HAPI_SRT;
			_xyzOrder = HAPI_XYZOrder.HAPI_XYZ;

			_handleParamTranslateBinding = null;
			_handleParamRotateBinding = null;
			_handleParamScaleBinding = null;

			for (int i = 0; i < handleBindingInfos.Length; ++i)
			{
				string parmName = HEU_SessionManager.GetString(handleBindingInfos[i].handleParmNameSH, session);

				//string assetParmName = HEU_SessionManager.GetString(handleBindingInfos[i].assetParmNameSH, session);
				//Debug.LogFormat("Handle {0} has parm {1} with asset parm {2} with asset parm id {3}", handleName, parmName, assetParmName, handleBindingInfos[i].assetParmId);

				if (parmName.Equals("tx") || parmName.Equals("ty") || parmName.Equals("tz"))
				{
					translateParmID = handleBindingInfos[i].assetParmId;

					if(_handleParamTranslateBinding == null)
					{
						HEU_ParameterData parmData = parameters.GetParameterWithParmID(translateParmID);
						if (parmData != null && !parmData._parmInfo.invisible)
						{
							_handleParamTranslateBinding = new HEU_HandleParamBinding();
							_handleParamTranslateBinding._paramType = HEU_HandleParamBinding.HEU_HandleParamType.TRANSLATE;
							_handleParamTranslateBinding._parmID = parmData.ParmID;
							_handleParamTranslateBinding._paramName = parmData._name;
							_handleParamTranslateBinding._bDisabled = parmData._parmInfo.disabled;
						}
					}

					if(_handleParamTranslateBinding != null)
					{
						if(parmName.Equals("tx"))
						{
							_handleParamTranslateBinding._boundChannels[0] = true;
						}
						else if (parmName.Equals("ty"))
						{
							_handleParamTranslateBinding._boundChannels[1] = true;
						}
						else if (parmName.Equals("tz"))
						{
							_handleParamTranslateBinding._boundChannels[2] = true;
						}
					}
				}

				if (parmName.Equals("rx") || parmName.Equals("ry") || parmName.Equals("rz"))
				{
					rotateParmID = handleBindingInfos[i].assetParmId;

					if(_handleParamRotateBinding == null)
					{
						HEU_ParameterData parmData = parameters.GetParameterWithParmID(rotateParmID);
						if (parmData != null && !parmData._parmInfo.invisible)
						{
							_handleParamRotateBinding = new HEU_HandleParamBinding();
							_handleParamRotateBinding._paramType = HEU_HandleParamBinding.HEU_HandleParamType.ROTATE;
							_handleParamRotateBinding._parmID = parmData.ParmID;
							_handleParamRotateBinding._paramName = parmData._name;
							_handleParamRotateBinding._bDisabled = parmData._parmInfo.disabled;
						}
					}

					if (_handleParamRotateBinding != null)
					{
						if (parmName.Equals("rx"))
						{
							_handleParamRotateBinding._boundChannels[0] = true;
						}
						else if (parmName.Equals("ry"))
						{
							_handleParamRotateBinding._boundChannels[1] = true;
						}
						else if (parmName.Equals("rz"))
						{
							_handleParamRotateBinding._boundChannels[2] = true;
						}
					}
				}

				if (parmName.Equals("sx") || parmName.Equals("sy") || parmName.Equals("sz"))
				{
					scaleParmID = handleBindingInfos[i].assetParmId;

					if (_handleParamScaleBinding == null)
					{
						HEU_ParameterData parmData = parameters.GetParameterWithParmID(scaleParmID);
						if (parmData != null && !parmData._parmInfo.invisible)
						{
							_handleParamScaleBinding = new HEU_HandleParamBinding();
							_handleParamScaleBinding._paramType = HEU_HandleParamBinding.HEU_HandleParamType.SCALE;
							_handleParamScaleBinding._parmID = parmData.ParmID;
							_handleParamScaleBinding._paramName = parmData._name;
							_handleParamScaleBinding._bDisabled = parmData._parmInfo.disabled;
						}
					}

					if (_handleParamScaleBinding != null)
					{
						if (parmName.Equals("sx"))
						{
							_handleParamScaleBinding._boundChannels[0] = true;
						}
						else if (parmName.Equals("sy"))
						{
							_handleParamScaleBinding._boundChannels[1] = true;
						}
						else if (parmName.Equals("sz"))
						{
							_handleParamScaleBinding._boundChannels[2] = true;
						}
					}
				}

				if(parmName.Equals("trs_order"))
				{
					rstOrderParmID = handleBindingInfos[i].assetParmId;
				}

				if (parmName.Equals("xyz_order"))
				{
					xyzOrderParmID = handleBindingInfos[i].assetParmId;
				}
			}

			if (rstOrderParmID >= 0)
			{
				HEU_ParameterData parmData = parameters.GetParameter(rstOrderParmID);
				if (parmData != null)
				{
					_rstOrder = (HAPI_RSTOrder)parmData._intValues[0];
				}
			}

			if (xyzOrderParmID >= 0)
			{
				HEU_ParameterData parmData = parameters.GetParameter(xyzOrderParmID);
				if (parmData != null)
				{
					_xyzOrder = (HAPI_XYZOrder)parmData._intValues[0];
				}
			}

			GenerateTransform(session, parameters);

			return true;
		}
Esempio n. 17
0
	public bool DrawHandles(HEU_HoudiniAsset asset)
	{
	    List<HEU_Handle> handles = CacheHandles();

	    HEU_HandleManipMode manipMode = GetCurrentGlobalManipMode();

	    GUIStyle textStyle = new GUIStyle(EditorStyles.textField);
	    textStyle.contentOffset = new Vector2(1.4f, 1.4f);

	    HEU_Parameters assetParameters = asset.Parameters;
	    SerializedObject serializedParametersObject = new SerializedObject(assetParameters);
	    SerializedProperty parameterListProperty = HEU_EditorUtility.GetSerializedProperty(serializedParametersObject, "_parameterList");

	    bool bChanged = false;

	    Matrix4x4 defaultMatrix = Handles.matrix;

	    foreach (HEU_Handle handle in handles)
	    {
		if (handle.HandleType == HEU_Handle.HEU_HandleType.XFORM)
		{
		    Handles.matrix = asset.transform.localToWorldMatrix;

		    Vector3 handlePosition = handle.HandlePosition;
		    Quaternion handleRotation = handle.HandleRotation;
		    Vector3 handleScale = handle.HandleScale;

		    string handleName = handle.HandleName;

		    if (manipMode == HEU_HandleManipMode.MOVE)
		    {
			if (!handle.HasTranslateHandle())
			{
			    continue;
			}

			bool bDisabled = handle.IsTranslateHandleDisabled();
			if (bDisabled)
			{
			    handleName += " (disabled)";
			}

			GUIContent labelContent = new GUIContent(handleName);
			labelContent.tooltip = handleName;

			Handles.Label(handlePosition, labelContent, textStyle);

			if (bDisabled)
			{
			    bool bLighting = Handles.lighting;
			    Handles.lighting = false;
			    Handles.PositionHandle(handlePosition, handleRotation);
			    Handles.lighting = bLighting;
			    continue;
			}

			Vector3 updatedPosition = Handles.PositionHandle(handlePosition, handleRotation);
			if (updatedPosition != handlePosition)
			{
			    if (!handle.GetUpdatedPosition(asset, ref updatedPosition))
			    {
				continue;
			    }

			    HEU_HandleParamBinding translateBinding = handle.GetTranslateBinding();
			    if (translateBinding != null)
			    {
				HEU_ParameterData paramData = assetParameters.GetParameterWithParmID(translateBinding._parmID);
				if (paramData != null && paramData._unityIndex < parameterListProperty.arraySize)
				{
				    SerializedProperty paramDataProperty = parameterListProperty.GetArrayElementAtIndex(paramData._unityIndex);
				    float[] posFloats = new float[3];
				    posFloats[0] = updatedPosition[0];
				    posFloats[1] = updatedPosition[1];
				    posFloats[2] = updatedPosition[2];
				    bChanged |= UpdateFloatArrayProperty(paramDataProperty, posFloats, translateBinding);
				}
			    }
			}
		    }
		    else if (manipMode == HEU_HandleManipMode.ROTATE)
		    {
			if (!handle.HasRotateHandle())
			{
			    continue;
			}

			bool bDisabled = handle.IsRotateHandleDisabled();
			if (bDisabled)
			{
			    handleName += " (disabled)";
			}

			GUIContent labelContent = new GUIContent(handleName);
			labelContent.tooltip = handleName;

			Handles.Label(handlePosition, labelContent, textStyle);

			if (bDisabled)
			{
			    bool bLighting = Handles.lighting;
			    Handles.lighting = false;
			    Handles.RotationHandle(handleRotation, handlePosition);
			    Handles.lighting = bLighting;
			    continue;
			}

			Quaternion updatedRotation = Handles.RotationHandle(handleRotation, handlePosition);
			if (updatedRotation != handleRotation)
			{
			    if (!handle.GetUpdatedRotation(asset, ref updatedRotation))
			    {
				continue;
			    }

			    HEU_HandleParamBinding rotateBinding = handle.GetRotateBinding();
			    if (rotateBinding != null)
			    {
				HEU_ParameterData paramData = assetParameters.GetParameterWithParmID(rotateBinding._parmID);
				if (paramData != null && paramData._unityIndex < parameterListProperty.arraySize)
				{
				    SerializedProperty paramDataProperty = parameterListProperty.GetArrayElementAtIndex(paramData._unityIndex);
				    float[] rotFloats = new float[3];
				    rotFloats[0] = updatedRotation[0];
				    rotFloats[1] = updatedRotation[1];
				    rotFloats[2] = updatedRotation[2];
				    bChanged |= UpdateFloatArrayProperty(paramDataProperty, rotFloats, rotateBinding);
				}
			    }
			}
		    }
		    else if (manipMode == HEU_HandleManipMode.SCALE)
		    {
			if (!handle.HasScaleHandle())
			{
			    continue;
			}

			bool bDisabled = handle.IsScaleHandleDisabled();
			if (bDisabled)
			{
			    handleName += " (disabled)";
			}

			GUIContent labelContent = new GUIContent(handleName);
			labelContent.tooltip = handleName;

			Handles.Label(handlePosition, labelContent, textStyle);

			if (bDisabled)
			{
			    bool bLighting = Handles.lighting;
			    Handles.lighting = false;
			    Handles.ScaleHandle(handleScale, handlePosition, handleRotation, 1f);
			    Handles.lighting = bLighting;
			    continue;
			}

			Vector3 updatedScale = Handles.ScaleHandle(handleScale, handlePosition, handleRotation, 1f);
			if (updatedScale != handleScale)
			{
			    HEU_HandleParamBinding scaleBinding = handle.GetScaleBinding();
			    if (scaleBinding != null)
			    {
				HEU_ParameterData paramData = assetParameters.GetParameterWithParmID(scaleBinding._parmID);
				if (paramData != null && paramData._unityIndex < parameterListProperty.arraySize)
				{
				    SerializedProperty paramDataProperty = parameterListProperty.GetArrayElementAtIndex(paramData._unityIndex);
				    float[] scaleFloats = new float[3];
				    scaleFloats[0] = updatedScale[0];
				    scaleFloats[1] = updatedScale[1];
				    scaleFloats[2] = updatedScale[2];
				    bChanged |= UpdateFloatArrayProperty(paramDataProperty, scaleFloats, scaleBinding);
				}
			    }
			}
		    }
		}
	    }

	    if (bChanged)
	    {
		serializedParametersObject.ApplyModifiedProperties();
	    }

	    Handles.matrix = defaultMatrix;

	    return bChanged;
	}