< 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:188
Line coverage:38.2% (26 of 68)
Covered branches:0
Total branches:0

Metrics

MethodBranch coverage Crap Score Cyclomatic complexity NPath complexity Sequence coverage
Init(...)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.Collections;
 2using System.Collections.Generic;
 3using DCL;
 4using DCL.Configuration;
 5using UnityEngine;
 6
 7public interface IBIWRaycastController
 8{
 9    event System.Action<BIWGizmosAxis> OnGizmosAxisPressed;
 10    bool RayCastFloor(out Vector3 position);
 11    Vector3 GetFloorPointAtMouse(Vector3 mousePosition);
 12    bool RaycastToGizmos(Vector3 mousePosition, out RaycastHit hitInfo);
 13    bool Raycast(Vector3 mousePosition, LayerMask mask, out RaycastHit hitInfo, System.Func<RaycastHit[], RaycastHit> hi
 14    Ray GetMouseRay(Vector3 mousePosition);
 15    BIWEntity GetEntityOnPointer();
 16}
 17
 18public class BIWRaycastController : BIWController, IBIWRaycastController
 19{
 20    public event System.Action<BIWGizmosAxis> OnGizmosAxisPressed;
 21
 22    private Camera builderCamera;
 23    private IBIWEntityHandler entityHandler;
 24    private IBIWModeController modeController;
 25
 26    private const float RAYCAST_MAX_DISTANCE = 10000f;
 27
 028    public LayerMask gizmoMask { get; private set; }
 29
 30    public override void Init(BIWContext context)
 31    {
 6132        base.Init(context);
 33
 6134        entityHandler = context.entityHandler;
 6135        modeController = context.modeController;
 6136        gizmoMask = BIWSettings.GIZMOS_LAYER;
 6137        BIWInputWrapper.OnMouseDown += OnMouseDown;
 38
 6139        builderCamera = context.sceneReferences.mainCamera;
 6140    }
 41
 42    public override void Dispose()
 43    {
 6244        base.Dispose();
 6245        BIWInputWrapper.OnMouseDown -= OnMouseDown;
 6246    }
 47
 48    private void OnMouseDown(int buttonId, Vector3 mousePosition)
 49    {
 050        if (buttonId != 0)
 051            return;
 52
 053        CheckGizmosRaycast(mousePosition);
 054    }
 55
 56    public BIWEntity GetEntityOnPointer()
 57    {
 158        Camera camera = Camera.main;
 59
 160        if (camera == null)
 061            return null;
 62
 63        RaycastHit hit;
 164        UnityEngine.Ray ray = camera.ScreenPointToRay(modeController.GetMousePosition());
 165        float distanceToSelect = modeController.GetMaxDistanceToSelectEntities();
 66
 167        if (Physics.Raycast(ray, out hit, distanceToSelect, BIWSettings.COLLIDER_SELECTION_LAYER))
 68        {
 069            string entityID = hit.collider.gameObject.name;
 70
 071            if (sceneToEdit.entities.ContainsKey(entityID))
 72            {
 073                return entityHandler.GetConvertedEntity(sceneToEdit.entities[entityID]);
 74            }
 75        }
 176        return null;
 77    }
 78
 79    public bool RayCastFloor(out Vector3 position)
 80    {
 81        RaycastHit hit;
 82
 283        UnityEngine.Ray ray = GetMouseRay(Input.mousePosition);
 84
 285        if (Physics.Raycast(ray, out hit, RAYCAST_MAX_DISTANCE, BIWSettings.GROUND_LAYER))
 86        {
 287            position = hit.point;
 288            return true;
 89        }
 090        position = Vector3.zero;
 091        return false;
 92    }
 93
 94    public bool Raycast(Vector3 mousePosition, LayerMask mask, out RaycastHit hitInfo, System.Func<RaycastHit[], Raycast
 95    {
 96        RaycastHit[] hits;
 097        hits = Physics.RaycastAll(GetMouseRay(mousePosition), RAYCAST_MAX_DISTANCE, mask);
 098        if (hits.Length > 0)
 99        {
 0100            hitInfo = hitComparer(hits);
 0101            return true;
 102        }
 0103        hitInfo = new RaycastHit();
 0104        return false;
 105    }
 106
 107    public VoxelEntityHit GetCloserUnselectedVoxelEntityOnPointer()
 108    {
 109        RaycastHit[] hits;
 0110        UnityEngine.Ray ray = GetMouseRay(Input.mousePosition);
 111
 0112        float currentDistance = 9999;
 0113        VoxelEntityHit voxelEntityHit = null;
 114
 0115        hits = Physics.RaycastAll(ray, BIWSettings.RAYCAST_MAX_DISTANCE, BIWSettings.COLLIDER_SELECTION_LAYER);
 116
 0117        foreach (RaycastHit hit in hits)
 118        {
 0119            string entityID = hit.collider.gameObject.name;
 120
 0121            if (sceneToEdit.entities.ContainsKey(entityID))
 122            {
 0123                BIWEntity entityToCheck = entityHandler.GetConvertedEntity(sceneToEdit.entities[entityID]);
 124
 0125                if (entityToCheck == null)
 126                    continue;
 127
 0128                if (entityToCheck.isSelected || !entityToCheck.gameObject.CompareTag(BIWSettings.VOXEL_TAG))
 129                    continue;
 130
 0131                Camera camera = Camera.main;
 0132                if (Vector3.Distance(camera.transform.position, entityToCheck.rootEntity.gameObject.transform.position) 
 133                    continue;
 134
 0135                voxelEntityHit = new VoxelEntityHit(entityToCheck, hit);
 0136                currentDistance = Vector3.Distance(camera.transform.position, entityToCheck.rootEntity.gameObject.transf
 137            }
 138        }
 139
 0140        return voxelEntityHit;
 141    }
 142
 143    public Vector3 GetFloorPointAtMouse(Vector3 mousePosition)
 144    {
 145        RaycastHit hit;
 2146        UnityEngine.Ray ray = Camera.main.ScreenPointToRay(mousePosition);
 147
 2148        if (Physics.Raycast(ray, out hit, RAYCAST_MAX_DISTANCE, BIWSettings.GROUND_LAYER))
 2149            return hit.point;
 150
 0151        return Vector3.zero;
 152    }
 153
 4154    public Ray GetMouseRay(Vector3 mousePosition) { return builderCamera.ScreenPointToRay(mousePosition); }
 155
 156    #region Gizmos
 157
 158    private void CheckGizmosRaycast(Vector3 mousePosition)
 159    {
 160        RaycastHit hit;
 0161        if (Raycast(mousePosition, gizmoMask, out hit, CompareSelectionHit))
 162        {
 0163            BIWGizmosAxis gizmosAxis = hit.collider.gameObject.GetComponent<BIWGizmosAxis>();
 0164            if (gizmosAxis != null)
 0165                OnGizmosAxisPressed?.Invoke(gizmosAxis);
 166
 167        }
 0168    }
 169
 2170    public bool RaycastToGizmos(Ray ray, out RaycastHit hitInfo) { return Physics.Raycast(ray, out hitInfo, RAYCAST_MAX_
 171
 2172    public bool RaycastToGizmos(Vector3 mousePosition, out RaycastHit hitInfo) { return RaycastToGizmos(GetMouseRay(mous
 173
 174    private RaycastHit CompareSelectionHit(RaycastHit[] hits)
 175    {
 0176        RaycastHit closestHit = hits[0];
 177
 0178        if (IsGizmoHit(closestHit)) // Gizmos has always priority
 0179            return closestHit;
 180
 181        return closestHit;
 182    }
 183
 0184    private bool IsGizmoHit(RaycastHit hit) { return hit.collider.gameObject.GetComponent<BIWGizmosAxis>() != null; }
 185
 186    #endregion
 187
 188}