public void OnSceneGUI(SceneView sceneView) { if (selectedNodeList.Count > 0) { for (int i = 0; i < selectedNodeList.Count; i++) { if (!selectedNodeList[i].transform) { UpdateSelection(); break; } } modifiedNodes.Clear(); for (int i = 0; i < selectedNodeList.Count; i++) { var transform = selectedNodeList[i].transform; var node = selectedNodeList[i].node; var curLocalToWorldMatrix = transform.localToWorldMatrix; var oldLocalToWorldMatrix = node.hierarchyItem.LocalToWorldMatrix; if (curLocalToWorldMatrix.m00 != oldLocalToWorldMatrix.m00 || curLocalToWorldMatrix.m01 != oldLocalToWorldMatrix.m01 || curLocalToWorldMatrix.m02 != oldLocalToWorldMatrix.m02 || curLocalToWorldMatrix.m03 != oldLocalToWorldMatrix.m03 || curLocalToWorldMatrix.m10 != oldLocalToWorldMatrix.m10 || curLocalToWorldMatrix.m11 != oldLocalToWorldMatrix.m11 || curLocalToWorldMatrix.m12 != oldLocalToWorldMatrix.m12 || curLocalToWorldMatrix.m13 != oldLocalToWorldMatrix.m13 || curLocalToWorldMatrix.m20 != oldLocalToWorldMatrix.m20 || curLocalToWorldMatrix.m21 != oldLocalToWorldMatrix.m21 || curLocalToWorldMatrix.m22 != oldLocalToWorldMatrix.m22 || curLocalToWorldMatrix.m23 != oldLocalToWorldMatrix.m23 //|| //curLocalToWorldMatrix.m30 != oldLocalToWorldMatrix.m30 || //curLocalToWorldMatrix.m31 != oldLocalToWorldMatrix.m31 || //curLocalToWorldMatrix.m32 != oldLocalToWorldMatrix.m32 || //curLocalToWorldMatrix.m33 != oldLocalToWorldMatrix.m33 ) { node.hierarchyItem.LocalToWorldMatrix = curLocalToWorldMatrix; node.hierarchyItem.WorldToLocalMatrix = transform.worldToLocalMatrix; modifiedNodes.Add(node); } } if (modifiedNodes.Count > 0) { ChiselNodeHierarchyManager.NotifyTransformationChanged(modifiedNodes); } } // Handle selection clicks / marquee selection ChiselRectSelectionManager.Update(sceneView); }
public void CheckForTransformationChanges(SerializedObject serializedObject) { if (Event.current.type == EventType.Layout) { modifiedNodes.Clear(); foreach (var target in serializedObject.targetObjects) { var node = target as ChiselNode; if (!node) { continue; } var transform = node.transform; // TODO: probably not a good idea to use these matrices for this, since it calculates this all the way up the transformation tree var curLocalToWorldMatrix = transform.localToWorldMatrix; var oldLocalToWorldMatrix = node.hierarchyItem.LocalToWorldMatrix; if (curLocalToWorldMatrix.m00 != oldLocalToWorldMatrix.m00 || curLocalToWorldMatrix.m01 != oldLocalToWorldMatrix.m01 || curLocalToWorldMatrix.m02 != oldLocalToWorldMatrix.m02 || curLocalToWorldMatrix.m03 != oldLocalToWorldMatrix.m03 || curLocalToWorldMatrix.m10 != oldLocalToWorldMatrix.m10 || curLocalToWorldMatrix.m11 != oldLocalToWorldMatrix.m11 || curLocalToWorldMatrix.m12 != oldLocalToWorldMatrix.m12 || curLocalToWorldMatrix.m13 != oldLocalToWorldMatrix.m13 || curLocalToWorldMatrix.m20 != oldLocalToWorldMatrix.m20 || curLocalToWorldMatrix.m21 != oldLocalToWorldMatrix.m21 || curLocalToWorldMatrix.m22 != oldLocalToWorldMatrix.m22 || curLocalToWorldMatrix.m23 != oldLocalToWorldMatrix.m23 //|| //curLocalToWorldMatrix.m30 != oldLocalToWorldMatrix.m30 || //curLocalToWorldMatrix.m31 != oldLocalToWorldMatrix.m31 || //curLocalToWorldMatrix.m32 != oldLocalToWorldMatrix.m32 || //curLocalToWorldMatrix.m33 != oldLocalToWorldMatrix.m33 ) { node.hierarchyItem.LocalToWorldMatrix = curLocalToWorldMatrix; node.hierarchyItem.WorldToLocalMatrix = transform.worldToLocalMatrix; modifiedNodes.Add(node); } } if (modifiedNodes.Count > 0) { ChiselNodeHierarchyManager.NotifyTransformationChanged(modifiedNodes); ResetGridBounds(); // TODO: should only do this when rotating, not when moving } } }
private static UnityEditor.UndoPropertyModification[] OnPostprocessModifications(UnityEditor.UndoPropertyModification[] modifications) { // Note: this is not always properly called // - when? can't remember? maybe prefab related? modifiedNodes.Clear(); processedTransforms.Clear(); for (int i = 0; i < modifications.Length; i++) { var currentValue = modifications[i].currentValue; var transform = currentValue.target as Transform; if (object.Equals(null, transform)) { continue; } if (processedTransforms.Contains(transform)) { continue; } var propertyPath = currentValue.propertyPath; if (!propertyPath.StartsWith("m_Local")) { continue; } processedTransforms.Add(transform); s_ChildNodes.Clear(); transform.GetComponentsInChildren <ChiselNode>(false, s_ChildNodes); if (s_ChildNodes.Count == 0) { continue; } if (s_ChildNodes[0] is ChiselModel) { continue; } for (int n = 0; n < s_ChildNodes.Count; n++) { modifiedNodes.Add(s_ChildNodes[n]); } } if (modifiedNodes.Count > 0) { ChiselNodeHierarchyManager.NotifyTransformationChanged(modifiedNodes); } return(modifications); }