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; }
/// <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)); }
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); }