< Summary

Class:BIWScaleGizmos
Assembly:BuilderInWorld
File(s):/tmp/workspace/unity-renderer/unity-renderer/Assets/DCLPlugins/BuilderInWorld/Scripts/Gizmos/BIWScaleGizmos.cs
Covered lines:5
Uncovered lines:53
Coverable lines:58
Total lines:144
Line coverage:8.6% (5 of 58)
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%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/DCLPlugins/BuilderInWorld/Scripts/Gizmos/BIWScaleGizmos.cs

#LineLine coverage
 1using System.Collections;
 2using System.Collections.Generic;
 3using DCL.Builder;
 4using UnityEngine;
 5
 6public class BIWScaleGizmos : BIWGizmos
 7{
 8    const float MINIMUN_SCALE_ALLOWED = 0.01f;
 9
 10    [SerializeField] internal BIWGizmosAxis axisProportionalScale = null;
 11
 12    internal Vector2 lastMousePosition;
 13    private Vector2 initialMousePosition;
 14    private Vector3 initialHitPoint;
 15    internal Vector3 lastHitPoint;
 3316    private Dictionary<Transform, Vector3> entitiesOriginalPositions = new Dictionary<Transform, Vector3>();
 17
 18    public override void Initialize(Camera camera, Transform cameraTransform)
 19    {
 3220        base.Initialize(camera, cameraTransform);
 3221        axisProportionalScale.SetGizmo(this);
 3222    }
 23
 424    public override void SetSnapFactor(SnapInfo snapInfo) { snapFactor = snapInfo.scale; }
 25
 26    public override float TransformEntity(Transform entityTransform, IBIWGizmosAxis 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);
 42        }
 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, IBIWGizmosAxis axis)
 70    {
 071        Vector3 scaleDirection = activeAxis.axisTransform.forward;
 072        if (axis == axisProportionalScale)
 73        {
 074            scaleDirection = Vector3.one;
 075            float inputDirection = (lastMousePosition.x - initialMousePosition.x) + (lastMousePosition.y - initialMouseP
 076            if (inputDirection < 0)
 077                scaleDirection = -Vector3.one;
 78
 079            initialMousePosition = lastMousePosition;
 080            initialHitPoint = lastHitPoint;
 81        }
 082        else if (worldOrientedGizmos)
 83        {
 084            scaleDirection = entityTransform.rotation * activeAxis.axisTransform.forward;
 085            scaleDirection.x = Mathf.Abs(scaleDirection.x);
 086            scaleDirection.y = Mathf.Abs(scaleDirection.y);
 087            scaleDirection.z = Mathf.Abs(scaleDirection.z);
 88        }
 89
 090        return scaleDirection;
 91    }
 92
 93    private Vector3 GetNewScale(Transform entityTransform, float axisValue, Vector3 scaleDirection, bool applyRounding)
 94    {
 095        Vector3 initialEntityScale = entityTransform.localScale;
 096        if (applyRounding && snapFactor > 0)
 097            initialEntityScale = GetScaleRoundedToSnapFactor(entityTransform.localScale, axisValue);
 98
 099        Vector3 newScale = initialEntityScale + scaleDirection * axisValue;
 100
 0101        if (Mathf.Abs(newScale.x) < MINIMUN_SCALE_ALLOWED || Mathf.Abs(newScale.y) < MINIMUN_SCALE_ALLOWED)
 0102            newScale += scaleDirection * MINIMUN_SCALE_ALLOWED;
 103
 0104        return newScale;
 105    }
 106
 107    private Vector3 GetScaleRoundedToSnapFactor(Vector3 scale, float axisValue)
 108    {
 0109        Vector3 activeAxisVector = GetActiveAxisVector();
 110
 0111        scale = new Vector3(
 112            activeAxisVector == Vector3.right ? (axisValue >= 0 ? Mathf.Floor(scale.x / snapFactor) : Mathf.Ceil(scale.x
 113            activeAxisVector == Vector3.up ? (axisValue >= 0 ? Mathf.Floor(scale.y / snapFactor) : Mathf.Ceil(scale.y / 
 114            activeAxisVector == Vector3.back ? (axisValue >= 0 ? Mathf.Floor(scale.z / snapFactor) : Mathf.Ceil(scale.z 
 115
 0116        return scale;
 117    }
 118
 119    internal override void SetPreviousAxisValue(float axisValue, float transformValue)
 120    {
 0121        if (activeAxis == axisProportionalScale)
 0122            previousAxisValue = 0;
 123        else
 0124            previousAxisValue = axisValue;
 0125    }
 126
 127    internal override float GetHitPointToAxisValue(IBIWGizmosAxis axis, Vector3 hitPoint, Vector2 mousePosition)
 128    {
 0129        if (axis == axisProportionalScale)
 130        {
 0131            if (startDragging)
 132            {
 0133                initialMousePosition = mousePosition;
 0134                initialHitPoint = hitPoint;
 135            }
 136
 0137            lastMousePosition = mousePosition;
 0138            lastHitPoint = hitPoint;
 0139            return Vector3.Distance(initialHitPoint, hitPoint);
 140        }
 141
 0142        return axis.axisTransform.InverseTransformPoint(hitPoint).z;
 143    }
 144}