< Summary

Class:BIWRaycastController
Assembly:BuilderInWorld
File(s):/tmp/workspace/unity-renderer/unity-renderer/Assets/Scripts/MainScripts/DCL/Controllers/BuilderMode/BIWRaycast.cs
Covered lines:26
Uncovered lines:42
Coverable lines:68
Total lines:190
Line coverage:38.2% (26 of 68)
Covered branches:0
Total branches:0

Metrics

MethodBranch coverage Crap Score Cyclomatic complexity NPath complexity Sequence coverage
Initialize(...)0%110100%
Dispose()0%110100%
OnMouseDown(...)0%6200%
GetEntityOnPointer()0%5.024060%
RayCastFloor(...)0%2.152066.67%
Raycast(...)0%6200%
GetCloserUnselectedVoxelEntityOnPointer()0%56700%
GetFloorPointAtMouse(...)0%2.062075%
GetMouseRay(...)0%110100%
CheckGizmosRaycast(...)0%20400%
RaycastToGizmos(...)0%110100%
RaycastToGizmos(...)0%110100%
CompareSelectionHit(...)0%2100%
IsGizmoHit(...)0%2100%

File(s)

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

#LineLine coverage
 1using System;
 2using System.Collections;
 3using System.Collections.Generic;
 4using DCL;
 5using DCL.Configuration;
 6using UnityEngine;
 7
 8public interface IBIWRaycastController : IBIWController
 9{
 10    event System.Action<BIWGizmosAxis> OnGizmosAxisPressed;
 11    bool RayCastFloor(out Vector3 position);
 12    Vector3 GetFloorPointAtMouse(Vector3 mousePosition);
 13    bool RaycastToGizmos(Vector3 mousePosition, out RaycastHit hitInfo);
 14    bool Raycast(Vector3 mousePosition, LayerMask mask, out RaycastHit hitInfo, System.Func<RaycastHit[], RaycastHit> hi
 15    Ray GetMouseRay(Vector3 mousePosition);
 16    BIWEntity GetEntityOnPointer();
 17}
 18
 19public class BIWRaycastController : BIWController, IBIWRaycastController
 20{
 21    public event System.Action<BIWGizmosAxis> OnGizmosAxisPressed;
 22
 23    private Camera builderCamera;
 24    private IBIWEntityHandler entityHandler;
 25    private IBIWModeController modeController;
 26
 27    private const float RAYCAST_MAX_DISTANCE = 10000f;
 28
 029    public LayerMask gizmoMask { get; private set; }
 30
 31    public override void Initialize(BIWContext context)
 32    {
 6033        base.Initialize(context);
 34
 6035        entityHandler = context.entityHandler;
 6036        modeController = context.modeController;
 6037        gizmoMask = BIWSettings.GIZMOS_LAYER;
 6038        BIWInputWrapper.OnMouseDown += OnMouseDown;
 39
 6040        builderCamera = context.sceneReferences.mainCamera;
 6041    }
 42
 43    public override void Dispose()
 44    {
 6045        base.Dispose();
 6046        BIWInputWrapper.OnMouseDown -= OnMouseDown;
 6047    }
 48
 49    private void OnMouseDown(int buttonId, Vector3 mousePosition)
 50    {
 051        if (buttonId != 0)
 052            return;
 53
 054        CheckGizmosRaycast(mousePosition);
 055    }
 56
 57    public BIWEntity GetEntityOnPointer()
 58    {
 159        Camera camera = Camera.main;
 60
 161        if (camera == null)
 062            return null;
 63
 64        RaycastHit hit;
 165        UnityEngine.Ray ray = camera.ScreenPointToRay(modeController.GetMousePosition());
 166        float distanceToSelect = modeController.GetMaxDistanceToSelectEntities();
 67
 168        if (Physics.Raycast(ray, out hit, distanceToSelect, BIWSettings.COLLIDER_SELECTION_LAYER))
 69        {
 070            string entityID = hit.collider.gameObject.name;
 71
 072            if (sceneToEdit.entities.ContainsKey(entityID))
 73            {
 074                return entityHandler.GetConvertedEntity(sceneToEdit.entities[entityID]);
 75            }
 76        }
 77
 178        return null;
 79    }
 80
 81    public bool RayCastFloor(out Vector3 position)
 82    {
 83        RaycastHit hit;
 84
 285        UnityEngine.Ray ray = GetMouseRay(Input.mousePosition);
 86
 287        if (Physics.Raycast(ray, out hit, RAYCAST_MAX_DISTANCE, BIWSettings.GROUND_LAYER))
 88        {
 289            position = hit.point;
 290            return true;
 91        }
 92
 093        position = Vector3.zero;
 094        return false;
 95    }
 96
 97    public bool Raycast(Vector3 mousePosition, LayerMask mask, out RaycastHit hitInfo, System.Func<RaycastHit[], Raycast
 98    {
 99        RaycastHit[] hits;
 0100        hits = Physics.RaycastAll(GetMouseRay(mousePosition), RAYCAST_MAX_DISTANCE, mask);
 0101        if (hits.Length > 0)
 102        {
 0103            hitInfo = hitComparer(hits);
 0104            return true;
 105        }
 106
 0107        hitInfo = new RaycastHit();
 0108        return false;
 109    }
 110
 111    public VoxelEntityHit GetCloserUnselectedVoxelEntityOnPointer()
 112    {
 113        RaycastHit[] hits;
 0114        UnityEngine.Ray ray = GetMouseRay(Input.mousePosition);
 115
 0116        float currentDistance = 9999;
 0117        VoxelEntityHit voxelEntityHit = null;
 118
 0119        hits = Physics.RaycastAll(ray, BIWSettings.RAYCAST_MAX_DISTANCE, BIWSettings.COLLIDER_SELECTION_LAYER);
 120
 0121        foreach (RaycastHit hit in hits)
 122        {
 0123            string entityID = hit.collider.gameObject.name;
 124
 0125            if (sceneToEdit.entities.ContainsKey(entityID))
 126            {
 0127                BIWEntity entityToCheck = entityHandler.GetConvertedEntity(sceneToEdit.entities[entityID]);
 128
 0129                if (entityToCheck == null)
 130                    continue;
 131
 0132                if (entityToCheck.isSelected || !entityToCheck.gameObject.CompareTag(BIWSettings.VOXEL_TAG))
 133                    continue;
 134
 0135                Camera camera = Camera.main;
 0136                if (Vector3.Distance(camera.transform.position, entityToCheck.rootEntity.gameObject.transform.position) 
 137                    continue;
 138
 0139                voxelEntityHit = new VoxelEntityHit(entityToCheck, hit);
 0140                currentDistance = Vector3.Distance(camera.transform.position, entityToCheck.rootEntity.gameObject.transf
 141            }
 142        }
 143
 0144        return voxelEntityHit;
 145    }
 146
 147    public Vector3 GetFloorPointAtMouse(Vector3 mousePosition)
 148    {
 149        RaycastHit hit;
 2150        UnityEngine.Ray ray = Camera.main.ScreenPointToRay(mousePosition);
 151
 2152        if (Physics.Raycast(ray, out hit, RAYCAST_MAX_DISTANCE, BIWSettings.GROUND_LAYER))
 2153            return hit.point;
 154
 0155        return Vector3.zero;
 156    }
 157
 4158    public Ray GetMouseRay(Vector3 mousePosition) { return builderCamera.ScreenPointToRay(mousePosition); }
 159
 160    #region Gizmos
 161
 162    private void CheckGizmosRaycast(Vector3 mousePosition)
 163    {
 164        RaycastHit hit;
 0165        if (Raycast(mousePosition, gizmoMask, out hit, CompareSelectionHit))
 166        {
 0167            BIWGizmosAxis gizmosAxis = hit.collider.gameObject.GetComponent<BIWGizmosAxis>();
 0168            if (gizmosAxis != null)
 0169                OnGizmosAxisPressed?.Invoke(gizmosAxis);
 170        }
 0171    }
 172
 2173    public bool RaycastToGizmos(Ray ray, out RaycastHit hitInfo) { return Physics.Raycast(ray, out hitInfo, RAYCAST_MAX_
 174
 2175    public bool RaycastToGizmos(Vector3 mousePosition, out RaycastHit hitInfo) { return RaycastToGizmos(GetMouseRay(mous
 176
 177    private RaycastHit CompareSelectionHit(RaycastHit[] hits)
 178    {
 0179        RaycastHit closestHit = hits[0];
 180
 0181        if (IsGizmoHit(closestHit)) // Gizmos has always priority
 0182            return closestHit;
 183
 184        return closestHit;
 185    }
 186
 0187    private bool IsGizmoHit(RaycastHit hit) { return hit.collider.gameObject.GetComponent<BIWGizmosAxis>() != null; }
 188
 189    #endregion
 190}