public static void Detach(Component_ObjectInSpace objectToDetach, DocumentInstance documentforUndoRedo = null, UndoMultiAction undoMultiAction = null) { const string transformOffsetName = "Attach Transform Offset"; var objectInSpace = objectToDetach; //var objectToTransform = CalculateObjectToTransform( objectInSpace ); //if( objectToTransform != null ) // objectInSpace = objectToTransform; var transformOffset = objectInSpace.GetComponent(transformOffsetName) as Component_TransformOffset; if (transformOffset != null) { //change Transform { //undo action if (undoMultiAction != null) { var property = (Metadata.Property)objectInSpace.MetadataGetMemberBySignature("property:Transform"); var undoItem = new UndoActionPropertiesChange.Item(objectInSpace, property, objectInSpace.Transform, new object[0]); undoMultiAction.AddAction(new UndoActionPropertiesChange(new UndoActionPropertiesChange.Item[] { undoItem })); } //remove reference objectInSpace.Transform = new Reference <Transform>(objectInSpace.Transform, ""); } //delete if (undoMultiAction != null) { undoMultiAction.AddAction(new UndoActionComponentCreateDelete(documentforUndoRedo, new Component[] { transformOffset }, false)); } else { transformOffset.Dispose(); } } }
public static Component_TransformOffset Attach(Component_ObjectInSpace attachTo, Component_ObjectInSpace objectToAttach, DocumentInstance documentforUndoRedo = null, UndoMultiAction undoMultiAction = null) { var objectToTransform = CalculateObjectToTransform(objectToAttach); if (objectToTransform != null) { objectToAttach = objectToTransform; } //create _TransformOffset Component_TransformOffset transformOffset; { const string transformOffsetName = "Attach Transform Offset"; transformOffset = objectToAttach.CreateComponent <Component_TransformOffset>(enabled: false); transformOffset.Name = transformOffsetName; transformOffset.Source = ReferenceUtility.MakeReference <Transform>(null, ReferenceUtility.CalculateThisReference(transformOffset, attachTo, "Transform")); try { var f = attachTo.Transform.Value; var s = objectToAttach.Transform.Value; var offset = f.ToMatrix4().GetInverse() * s.ToMatrix4(); offset.Decompose(out Vector3 pos, out Quaternion rot, out Vector3 scl); transformOffset.PositionOffset = pos; transformOffset.RotationOffset = rot; transformOffset.ScaleOffset = scl; //transformOffset.Matrix = offset; //var offset = new Mat4( s.Rotation.ToMat3(), s.Position ) * new Mat4( f.Rotation.ToMat3(), f.Position ).GetInverse(); //var f = first.Transform.Value; //var s = second.Transform.Value; //var offset = new Mat4( s.Rotation.ToMat3(), s.Position ) * new Mat4( f.Rotation.ToMat3(), f.Position ).GetInverse(); ////var offset = second.Transform.Value.ToMat4() * first.Transform.Value.ToMat4().GetInverse(); //offset.Decompose( out Vec3 pos, out Quat rot, out Vec3 scl ); //transformOffset.PositionOffset = pos / f.Scale;// / s.Scale; //transformOffset.RotationOffset = rot; //transformOffset.ScaleOffset = s.Scale / f.Scale; ////transformOffset.ScaleOffset = scl; } catch { } transformOffset.Enabled = true; if (undoMultiAction != null) { undoMultiAction.AddAction(new UndoActionComponentCreateDelete(documentforUndoRedo, new Component[] { transformOffset }, true)); } } //change Transform { //undo action if (undoMultiAction != null) { var property = (Metadata.Property)objectToAttach.MetadataGetMemberBySignature("property:Transform"); var undoItem = new UndoActionPropertiesChange.Item(objectToAttach, property, objectToAttach.Transform, new object[0]); undoMultiAction.AddAction(new UndoActionPropertiesChange(new UndoActionPropertiesChange.Item[] { undoItem })); } //configure reference objectToAttach.Transform = ReferenceUtility.MakeReference <Transform>(null, ReferenceUtility.CalculateThisReference(objectToAttach, transformOffset, "Result")); } return(transformOffset); }