< Summary

Class:Builder.Gizmos.DCLBuilderScaleGizmo
Assembly:Builder
File(s):/tmp/workspace/unity-renderer/unity-renderer/Assets/Builder/Scripts/Gizmos/DCLBuilderScaleGizmo.cs
Covered lines:5
Uncovered lines:56
Coverable lines:61
Total lines:153
Line coverage:8.1% (5 of 61)
Covered branches:0
Total branches:0

Metrics

MethodBranch coverage Crap Score Cyclomatic complexity NPath complexity Sequence coverage
DCLBuilderScaleGizmo()0%110100%
Initialize(...)0%110100%
SetSnapFactor(...)0%110100%
TransformEntity(...)0%42600%
GetScaleDirection(...)0%20400%
GetNewScale(...)0%30500%
GetScaleRoundedToSnapFactor(...)0%1101000%
SetPreviousAxisValue(...)0%6200%
GetHitPointToAxisValue(...)0%12300%

File(s)

/tmp/workspace/unity-renderer/unity-renderer/Assets/Builder/Scripts/Gizmos/DCLBuilderScaleGizmo.cs

#LineLine coverage
 1using System.Collections.Generic;
 2using UnityEngine;
 3
 4namespace Builder.Gizmos
 5{
 6    public class DCLBuilderScaleGizmo : DCLBuilderGizmo
 7    {
 8        const float MINIMUN_SCALE_ALLOWED = 0.01f;
 9
 10        [SerializeField] DCLBuilderGizmoAxis axisProportionalScale = null;
 11
 12        private Vector2 lastMousePosition;
 13        private Vector2 initialMousePosition;
 14        private Vector3 initialHitPoint;
 15        private Vector3 lastHitPoint;
 19916        private Dictionary<Transform, Vector3> entitiesOriginalPositions = new Dictionary<Transform, Vector3>();
 17
 18        public override void Initialize(Camera camera, Transform cameraTransform)
 19        {
 120            base.Initialize(camera, cameraTransform);
 121            axisProportionalScale.SetGizmo(this);
 122        }
 23
 424        public override void SetSnapFactor(DCLBuilderGizmoManager.SnapInfo snapInfo) { snapFactor = snapInfo.scale; }
 25
 26        public override float TransformEntity(Transform entityTransform, DCLBuilderGizmoAxis axis, float axisValue)
 27        {
 028            Vector3 scaleDirection = GetScaleDirection(entityTransform, axis);
 29
 30            // In order to avoid to make the scale of each selected entity dependent of the 'entityTransform' parent,
 31            // we temporally move all entities to the same position as 'entityTransform' before calculate the new scale.
 032            foreach (Transform entity in entityTransform)
 33            {
 034                entitiesOriginalPositions.Add(entity, entity.transform.position);
 035                entity.transform.position = entityTransform.position;
 36            }
 37
 038            if (axis == axisProportionalScale)
 39            {
 40                // New scale calculation (for proportional scale gizmo)
 041                entityTransform.localScale = GetNewScale(entityTransform, axisValue, scaleDirection, false);
 042            }
 43            else
 44            {
 45                // New scale calculation (for XYZ-axis scale gizmo)
 046                foreach (var originalEntity in entitiesOriginalPositions)
 47                {
 048                    Transform entity = originalEntity.Key;
 049                    entity.transform.SetParent(null);
 050                    entity.localScale = GetNewScale(entity.transform, axisValue, scaleDirection, true);
 051                    entity.SetParent(entityTransform);
 52                }
 53            }
 54
 55            // Once the new scale has been calculated, we restore the original positions of all the selected entities.
 056            foreach (var originalEntity in entitiesOriginalPositions)
 57            {
 058                Transform entity = originalEntity.Key;
 059                Vector3 originalPosition = originalEntity.Value;
 60
 061                entity.position = originalPosition;
 62            }
 63
 064            entitiesOriginalPositions.Clear();
 65
 066            return axisValue;
 67        }
 68
 69        private Vector3 GetScaleDirection(Transform entityTransform, DCLBuilderGizmoAxis axis)
 70        {
 071            Vector3 scaleDirection = activeAxis.transform.forward;
 072            if (axis == axisProportionalScale)
 73            {
 074                scaleDirection = Vector3.one;
 075                float inputDirection = (lastMousePosition.x - initialMousePosition.x) + (lastMousePosition.y - initialMo
 076                if (inputDirection < 0)
 77                {
 078                    scaleDirection = -Vector3.one;
 79                }
 80
 081                initialMousePosition = lastMousePosition;
 082                initialHitPoint = lastHitPoint;
 083            }
 084            else if (worldOrientedGizmos)
 85            {
 086                scaleDirection = entityTransform.rotation * activeAxis.transform.forward;
 087                scaleDirection.x = Mathf.Abs(scaleDirection.x);
 088                scaleDirection.y = Mathf.Abs(scaleDirection.y);
 089                scaleDirection.z = Mathf.Abs(scaleDirection.z);
 90            }
 91
 092            return scaleDirection;
 93        }
 94
 95        private Vector3 GetNewScale(Transform entityTransform, float axisValue, Vector3 scaleDirection, bool applyRoundi
 96        {
 097            Vector3 initialEntityScale = entityTransform.localScale;
 098            if (applyRounding && snapFactor > 0)
 099                initialEntityScale = GetScaleRoundedToSnapFactor(entityTransform.localScale, axisValue);
 100
 0101            Vector3 newScale = initialEntityScale + scaleDirection * axisValue;
 102
 0103            if (Mathf.Abs(newScale.x) < MINIMUN_SCALE_ALLOWED || Mathf.Abs(newScale.y) < MINIMUN_SCALE_ALLOWED)
 104            {
 0105                newScale += scaleDirection * MINIMUN_SCALE_ALLOWED;
 106            }
 107
 0108            return newScale;
 109        }
 110
 111        private Vector3 GetScaleRoundedToSnapFactor(Vector3 scale, float axisValue)
 112        {
 0113            Vector3 activeAxisVector = GetActiveAxisVector();
 114
 0115            scale = new Vector3(
 116                activeAxisVector == Vector3.right ? (axisValue >= 0 ? Mathf.Floor(scale.x / snapFactor) : Mathf.Ceil(sca
 117                activeAxisVector == Vector3.up ? (axisValue >= 0 ? Mathf.Floor(scale.y / snapFactor) : Mathf.Ceil(scale.
 118                activeAxisVector == Vector3.back ? (axisValue >= 0 ? Mathf.Floor(scale.z / snapFactor) : Mathf.Ceil(scal
 119
 0120            return scale;
 121        }
 122
 123        protected override void SetPreviousAxisValue(float axisValue, float transformValue)
 124        {
 0125            if (activeAxis == axisProportionalScale)
 126            {
 0127                prevAxisValue = 0;
 0128            }
 129            else
 130            {
 0131                prevAxisValue = axisValue;
 132            }
 0133        }
 134
 135        protected override float GetHitPointToAxisValue(DCLBuilderGizmoAxis axis, Vector3 hitPoint, Vector2 mousePositio
 136        {
 0137            if (axis == axisProportionalScale)
 138            {
 0139                if (startDragging)
 140                {
 0141                    initialMousePosition = mousePosition;
 0142                    initialHitPoint = hitPoint;
 143                }
 144
 0145                lastMousePosition = mousePosition;
 0146                lastHitPoint = hitPoint;
 0147                return Vector3.Distance(initialHitPoint, hitPoint);
 148            }
 149
 0150            return axis.transform.InverseTransformPoint(hitPoint).z;
 151        }
 152    }
 153}