예제 #1
0
        public static void Rotate(CompoundPart part, Vector3 eulerAngles, Space space, bool targetSelected)
        {
            bool targetActive = IsTargetActive(part, targetSelected);

            CompoundParts.CModuleLinkedMesh module = part.FindModuleImplementing <CompoundParts.CModuleLinkedMesh>();
            if (targetActive)
            {
                RotateTarget(part, eulerAngles, space);
            }
            else
            {
                part.transform.Rotate(eulerAngles, space);
                part.onEditorEndTweak();
            }
            UpdateEditorGizmo(part, targetActive);
            GameEvents.onEditorPartEvent.Fire(ConstructionEventType.PartRotated, part);

            if (part.symMethod == SymmetryMethod.Mirror)
            {
                RotateMirrorSymmetryCounterparts(part, eulerAngles, space, targetActive);
            }
            else if (part.symMethod == SymmetryMethod.Radial)
            {
                RotateRadialSymmetryCounterparts(part, eulerAngles, space, targetActive);
            }

            EditorLogic.fetch.SetBackup();
        }
예제 #2
0
        private static void RotateRadialSymmetryCounterparts(CompoundPart part, Vector3 eulerAngles, Space space, bool targetActive)
        {
            if (space == Space.World)
            {
                if (targetActive)
                {
                    CompoundParts.CModuleLinkedMesh module = part.FindModuleImplementing <CompoundParts.CModuleLinkedMesh>();
                    eulerAngles = module.targetAnchor.InverseTransformDirection(eulerAngles);
                }
                else
                {
                    eulerAngles = part.transform.InverseTransformDirection(eulerAngles);
                }
            }

            foreach (CompoundPart symmetryCounterpart in part.symmetryCounterparts)
            {
                if (targetActive)
                {
                    RotateTarget(symmetryCounterpart, eulerAngles, Space.Self);
                }
                else
                {
                    symmetryCounterpart.transform.Rotate(eulerAngles, Space.Self);
                    symmetryCounterpart.onEditorEndTweak();
                }

                UpdateEditorGizmo(symmetryCounterpart, targetActive);
                GameEvents.onEditorPartEvent.Fire(ConstructionEventType.PartRotated, symmetryCounterpart);
            }
        }
예제 #3
0
        private static void RotateTarget(CompoundPart part, Vector3 axis, float angle, Space space)
        {
            CompoundParts.CModuleLinkedMesh module = part.FindModuleImplementing <CompoundParts.CModuleLinkedMesh>();
            bool oldTweakingTarget = module.TweakingTarget;

            module.TweakingTarget = true;
            module.targetAnchor.Rotate(axis, angle, space);
            module.targetAnchor.hasChanged = true;
            module.OnTargetUpdate();
            module.TweakingTarget = oldTweakingTarget;
        }
예제 #4
0
        private static void SetTargetPosition(CompoundPart part, Vector3 position)
        {
            CompoundParts.CModuleLinkedMesh module = part.FindModuleImplementing <CompoundParts.CModuleLinkedMesh>();
            bool oldTweakingTarget = module.TweakingTarget;

            module.TweakingTarget          = true;
            module.targetAnchor.position   = position;
            module.targetAnchor.hasChanged = true;
            module.OnTargetUpdate();
            module.TweakingTarget = oldTweakingTarget;
        }
예제 #5
0
        private static void UpdateEditorGizmo(CompoundPart part, bool targetActive)
        {
            if (part == EditorLogic.SelectedPart)
            {
                Vector3    position;
                Quaternion rotation;
                if (targetActive)
                {
                    CompoundParts.CModuleLinkedMesh module = part.FindModuleImplementing <CompoundParts.CModuleLinkedMesh>();
                    position = module.targetAnchor.position;
                    rotation = module.targetAnchor.rotation;
                }
                else
                {
                    position = part.transform.position;
                    rotation = part.transform.rotation;
                }

                var gizmoOffset = HighLogic.FindObjectOfType <EditorGizmos.GizmoOffset>();
                if (gizmoOffset != null)
                {
                    gizmoOffset.transform.position = position;
                    if (gizmoOffset.CoordSpace == Space.Self)
                    {
                        gizmoOffset.transform.rotation = rotation;
                    }
                }

                var gizmoRotate = HighLogic.FindObjectOfType <EditorGizmos.GizmoRotate>();
                if (gizmoRotate != null)
                {
                    gizmoRotate.transform.position = position;
                    if (gizmoRotate.CoordSpace == Space.Self)
                    {
                        gizmoRotate.transform.rotation = rotation;
                    }
                }
            }
        }
예제 #6
0
        private static void RotateMirrorSymmetryCounterparts(CompoundPart part, Vector3 eulerAngles, Space space, bool targetActive)
        {
            if (space == Space.Self)
            {
                if (targetActive)
                {
                    CompoundParts.CModuleLinkedMesh module = part.FindModuleImplementing <CompoundParts.CModuleLinkedMesh>();
                    eulerAngles = module.targetAnchor.TransformDirection(eulerAngles);
                }
                else
                {
                    eulerAngles = part.transform.TransformDirection(eulerAngles);
                }
            }

            eulerAngles = EditorLogic.RootPart.transform.InverseTransformDirection(eulerAngles);
            Quaternion rotation = Quaternion.Euler(eulerAngles);

            rotation.ToAngleAxis(out float angle, out Vector3 axis);
            Vector3 mirrorAxis = new Vector3(-axis.x, axis.y, axis.z);

            mirrorAxis = EditorLogic.RootPart.transform.TransformDirection(mirrorAxis);

            foreach (CompoundPart symmetryCounterpart in part.symmetryCounterparts)
            {
                if (targetActive)
                {
                    RotateTarget(symmetryCounterpart, mirrorAxis, -angle, Space.World);
                }
                else
                {
                    symmetryCounterpart.transform.Rotate(mirrorAxis, -angle, Space.World);
                    symmetryCounterpart.onEditorEndTweak();
                }
                UpdateEditorGizmo(symmetryCounterpart, targetActive);
                GameEvents.onEditorPartEvent.Fire(ConstructionEventType.PartRotated, symmetryCounterpart);
            }
        }