Exemplo n.º 1
0
    private void DrawSelectionRectangle(Vector2 dragStart, Vector2 curMousePos)
    {
        Color oldColor = Handles.color;

        Handles.color = _drawSettings.selectionColor;

        Vector2 min;
        Vector2 max;

        VecUtil.MinMax(CellToWorld(WorldToCell(dragStart)), CellToWorld(WorldToCell(curMousePos)), out min, out max);

        Vector2 offset = new Vector2(0.5f / _division.x, 0.5f / _division.y);

        EditorUtil.DrawWireRectangleMinMax(min - offset, max + offset);

        Handles.color = oldColor;
    }
Exemplo n.º 2
0
 /// <summary> Rounds the given world coordinate to the world position of the closest cell. </summary>
 private Vector2 GetClosestCellPosition(Vector2 world)
 {
     return(VecUtil.RoundToNearestVector2f(world - _offset, _division));
 }
Exemplo n.º 3
0
    bool LayerMarch(Vector3 startPoint, Vector3 dir, out Vec3i hitIdx, out Vec3i lastIdx, ref float t)
    {
        dir = Vector3.Normalize(dir);

        Vector3 voxelGridSize = new Vector3(voxels.Size.x, voxels.Size.y, voxels.Size.z);

        Vector3 p0   = startPoint;
        float   endT = VecUtil.MinComp(Vector3.Max(
                                           VecUtil.Div(voxelGridSize - p0, dir),
                                           VecUtil.Div(-p0, dir)
                                           ));

        Vector3 dirAbs = VecUtil.Abs(dir);

        // TODO: This is making invalid assumptions about p0
        //Vector3 p0abs = VecUtil.Mul(Vector3.one - VecUtil.Step(0, dir), voxelGridSize)
        //    + VecUtil.Mul(VecUtil.Sign(dir), p0);

        //Vector3 negativeDimensions = Vector3.one - VecUtil.Step(0, dir);
        //Vector3 p0abs = VecUtil.Mul(negativeDimensions, voxelGridSize) - VecUtil.Mul(negativeDimensions, p0)
        //+ VecUtil.Mul(VecUtil.Step(0, dir), p0);

        Vector3 p0abs = p0;

        for (int i = 0; i < 3; ++i)
        {
            if (dir[i] < 0)
            {
                p0abs[i] = voxelGridSize[i] - p0[i];
            }
        }

        //float t = 0;
        //t = 0;
        lastIdx = ToIndex(p0 + dir * (t - kEps));
        int            iterationCount = 0;
        List <Vector3> debugPos       = new List <Vector3>();
        List <Vector3> debugPosAbs    = new List <Vector3>();

        t += kEps;

        while (t <= endT)
        {
            Vec3i idx = ToIndex(p0 + dir * (t + kEps));
            debugPos.Add(p0 + dir * (t + kEps));
            //Vec3i idx = ToIndex(p0 + dir * t);

            debugPosAbs.Add(p0abs + dirAbs * (t + kEps));
            Vector3 pAbs = p0abs + dirAbs * (t + kEps);

            ////////////////
            // DEBUG CODE
            Vec3i delta = idx - lastIdx;
            if (Vec3i.Dot(delta, delta) > 1)
            {
                Debug.LogWarning("Skipped a voxel");
            }

            if (!voxels.IsValid(idx))
            {
                break;
            }

            Color32 c = voxels[idx];
            if (c.a > 0)
            {
                hitIdx = idx;
                return(true);
            }

            lastIdx = idx;

            // Pretend we came in from a positive direction

            //Vector3 pAbs = p0abs + dirAbs * (t);
            Vector3 deltas = VecUtil.Div(Vector3.one - VecUtil.Fract(pAbs), dirAbs);
            //t += Mathf.Max(VecUtil.MinComp(deltas), float.Epsilon);
            //t += Mathf.Max(VecUtil.MinComp(deltas), 0.0005f);
            t += Mathf.Max(VecUtil.MinComp(deltas), kEps) + kEps;

            //Vector3 pAbs = p0abs + dirAbs * t;
            //Vector3 deltas = VecUtil.Div(Vector3.one - VecUtil.Fract(pAbs), dirAbs);
            //t += Mathf.Max(VecUtil.MinComp(deltas), float.Epsilon);

            //Vector3 pAbs = p0abs + dirAbs * t;
            //Vector3 p = p0 + dir * t;
            //Vector3 deltas = VecUtil.Div(VecUtil.Step(0, dir) - VecUtil.Fract(p), dir);
            //t += Mathf.Max(VecUtil.MinComp(deltas), 0.0005f);
            //t += Mathf.Max(VecUtil.MinComp(deltas), float.Epsilon);
            iterationCount++;
        }

        hitIdx = new Vec3i(-1);
        return(false);
    }