< Summary

Class:BIWScaleGizmos
Assembly:BuilderInWorld
File(s):/tmp/workspace/unity-renderer/unity-renderer/Assets/Scripts/MainScripts/DCL/Controllers/BuilderMode/Gizmos/BIWScaleGizmos.cs
Covered lines:41
Uncovered lines:19
Coverable lines:60
Total lines:143
Line coverage:68.3% (41 of 60)
Covered branches:0
Total branches:0

Metrics

MethodBranch coverage Crap Score Cyclomatic complexity NPath complexity Sequence coverage
BIWScaleGizmos()0%110100%
Initialize(...)0%110100%
SetSnapFactor(...)0%110100%
TransformEntity(...)0%10.56050%
GetScaleDirection(...)0%44093.33%
GetNewScale(...)0%5.585071.43%
GetScaleRoundedToSnapFactor(...)0%1101000%
SetPreviousAxisValue(...)0%2.062075%
GetHitPointToAxisValue(...)0%3.473062.5%

File(s)

/tmp/workspace/unity-renderer/unity-renderer/Assets/Scripts/MainScripts/DCL/Controllers/BuilderMode/Gizmos/BIWScaleGizmos.cs

#LineLine coverage
 1using System.Collections;
 2using System.Collections.Generic;
 3using UnityEngine;
 4
 5public class BIWScaleGizmos : BIWGizmos
 6{
 7    const float MINIMUN_SCALE_ALLOWED = 0.01f;
 8
 9    [SerializeField] internal BIWGizmosAxis axisProportionalScale = null;
 10
 11    internal Vector2 lastMousePosition;
 12    private Vector2 initialMousePosition;
 13    private Vector3 initialHitPoint;
 14    internal Vector3 lastHitPoint;
 18315    private Dictionary<Transform, Vector3> entitiesOriginalPositions = new Dictionary<Transform, Vector3>();
 16
 17    public override void Initialize(Camera camera, Transform cameraTransform)
 18    {
 7219        base.Initialize(camera, cameraTransform);
 7220        axisProportionalScale.SetGizmo(this);
 7221    }
 22
 823    public override void SetSnapFactor(BIWGizmosController.SnapInfo snapInfo) { snapFactor = snapInfo.scale; }
 24
 25    public override float TransformEntity(Transform entityTransform, BIWGizmosAxis axis, float axisValue)
 26    {
 227        Vector3 scaleDirection = GetScaleDirection(entityTransform, axis);
 28
 29        // In order to avoid to make the scale of each selected entity dependent of the 'entityTransform' parent,
 30        // we temporally move all entities to the same position as 'entityTransform' before calculate the new scale.
 431        foreach (Transform entity in entityTransform)
 32        {
 033            entitiesOriginalPositions.Add(entity, entity.transform.position);
 034            entity.transform.position = entityTransform.position;
 35        }
 36
 237        if (axis == axisProportionalScale)
 38        {
 39            // New scale calculation (for proportional scale gizmo)
 140            entityTransform.localScale = GetNewScale(entityTransform, axisValue, scaleDirection, false);
 141        }
 42        else
 43        {
 44            // New scale calculation (for XYZ-axis scale gizmo)
 245            foreach (var originalEntity in entitiesOriginalPositions)
 46            {
 047                Transform entity = originalEntity.Key;
 048                entity.transform.SetParent(null);
 049                entity.localScale = GetNewScale(entity.transform, axisValue, scaleDirection, true);
 050                entity.SetParent(entityTransform);
 51            }
 52        }
 53
 54        // Once the new scale has been calculated, we restore the original positions of all the selected entities.
 455        foreach (var originalEntity in entitiesOriginalPositions)
 56        {
 057            Transform entity = originalEntity.Key;
 058            Vector3 originalPosition = originalEntity.Value;
 59
 060            entity.position = originalPosition;
 61        }
 62
 263        entitiesOriginalPositions.Clear();
 64
 265        return axisValue;
 66    }
 67
 68    private Vector3 GetScaleDirection(Transform entityTransform, BIWGizmosAxis axis)
 69    {
 270        Vector3 scaleDirection = activeAxis.transform.forward;
 271        if (axis == axisProportionalScale)
 72        {
 173            scaleDirection = Vector3.one;
 174            float inputDirection = (lastMousePosition.x - initialMousePosition.x) + (lastMousePosition.y - initialMouseP
 175            if (inputDirection < 0)
 076                scaleDirection = -Vector3.one;
 77
 178            initialMousePosition = lastMousePosition;
 179            initialHitPoint = lastHitPoint;
 180        }
 181        else if (worldOrientedGizmos)
 82        {
 183            scaleDirection = entityTransform.rotation * activeAxis.transform.forward;
 184            scaleDirection.x = Mathf.Abs(scaleDirection.x);
 185            scaleDirection.y = Mathf.Abs(scaleDirection.y);
 186            scaleDirection.z = Mathf.Abs(scaleDirection.z);
 87        }
 88
 289        return scaleDirection;
 90    }
 91
 92    private Vector3 GetNewScale(Transform entityTransform, float axisValue, Vector3 scaleDirection, bool applyRounding)
 93    {
 194        Vector3 initialEntityScale = entityTransform.localScale;
 195        if (applyRounding && snapFactor > 0)
 096            initialEntityScale = GetScaleRoundedToSnapFactor(entityTransform.localScale, axisValue);
 97
 198        Vector3 newScale = initialEntityScale + scaleDirection * axisValue;
 99
 1100        if (Mathf.Abs(newScale.x) < MINIMUN_SCALE_ALLOWED || Mathf.Abs(newScale.y) < MINIMUN_SCALE_ALLOWED)
 0101            newScale += scaleDirection * MINIMUN_SCALE_ALLOWED;
 102
 1103        return newScale;
 104    }
 105
 106    private Vector3 GetScaleRoundedToSnapFactor(Vector3 scale, float axisValue)
 107    {
 0108        Vector3 activeAxisVector = GetActiveAxisVector();
 109
 0110        scale = new Vector3(
 111            activeAxisVector == Vector3.right ? (axisValue >= 0 ? Mathf.Floor(scale.x / snapFactor) : Mathf.Ceil(scale.x
 112            activeAxisVector == Vector3.up ? (axisValue >= 0 ? Mathf.Floor(scale.y / snapFactor) : Mathf.Ceil(scale.y / 
 113            activeAxisVector == Vector3.back ? (axisValue >= 0 ? Mathf.Floor(scale.z / snapFactor) : Mathf.Ceil(scale.z 
 114
 0115        return scale;
 116    }
 117
 118    internal override void SetPreviousAxisValue(float axisValue, float transformValue)
 119    {
 1120        if (activeAxis == axisProportionalScale)
 0121            previousAxisValue = 0;
 122        else
 1123            previousAxisValue = axisValue;
 1124    }
 125
 126    internal override float GetHitPointToAxisValue(BIWGizmosAxis axis, Vector3 hitPoint, Vector2 mousePosition)
 127    {
 1128        if (axis == axisProportionalScale)
 129        {
 1130            if (startDragging)
 131            {
 0132                initialMousePosition = mousePosition;
 0133                initialHitPoint = hitPoint;
 134            }
 135
 1136            lastMousePosition = mousePosition;
 1137            lastHitPoint = hitPoint;
 1138            return Vector3.Distance(initialHitPoint, hitPoint);
 139        }
 140
 0141        return axis.transform.InverseTransformPoint(hitPoint).z;
 142    }
 143}