public void OnEdit(IChiselHandles handles) { var baseColor = handles.color; var noZTestcolor = handles.GetStateColor(baseColor, false, true); var zTestcolor = handles.GetStateColor(baseColor, false, false); path.UpgradeIfNecessary(); for (int i = 0; i < path.segments.Length; i++) { var pathPoint = path.segments[i]; var currMatrix = pathPoint.ToMatrix(); handles.color = baseColor; handles.DoShapeHandle(ref shape, currMatrix); if (i == 0) { if (handles.DoDirectionHandle(ref pathPoint.position, -(pathPoint.rotation * Vector3.forward))) { path.segments[i] = pathPoint; path = new ChiselPath(path); } } else if (i == path.segments.Length - 1) { if (handles.DoDirectionHandle(ref pathPoint.position, (pathPoint.rotation * Vector3.forward))) { path.segments[i] = pathPoint; path = new ChiselPath(path); } } // Draw lines between different segments if (i + 1 < path.segments.Length) { var nextPoint = path.segments[i + 1]; var nextMatrix = nextPoint.ToMatrix(); var controlPoints = shape.controlPoints; for (int c = 0; c < controlPoints.Length; c++) { var controlPoint = controlPoints[c].position; var pointA = currMatrix.MultiplyPoint(controlPoint); var pointB = nextMatrix.MultiplyPoint(controlPoint); handles.color = noZTestcolor; handles.DrawLine(pointA, pointB, lineMode: LineMode.NoZTest, thickness: kCapLineThickness, dashSize: kLineDash); handles.color = zTestcolor; handles.DrawLine(pointA, pointB, lineMode: LineMode.ZTest, thickness: kCapLineThickness, dashSize: kLineDash); } { var pointA = currMatrix.MultiplyPoint(Vector3.zero); var pointB = nextMatrix.MultiplyPoint(Vector3.zero); handles.color = zTestcolor; handles.DrawLine(pointA, pointB, lineMode: LineMode.NoZTest, thickness: kCapLineThickness, dashSize: kLineDash); handles.color = zTestcolor; handles.DrawLine(pointA, pointB, lineMode: LineMode.ZTest, thickness: kCapLineThickness, dashSize: kLineDash); } handles.color = baseColor; } // TODO: cannot rotate so far that one path plane intersects with shape on another plane // ... or just fail when it's wrong? } for (int i = 0; i < path.segments.Length; i++) { var pathPoint = path.segments[i]; if (handles.DoPathPointHandle(ref pathPoint)) { var originalSegments = path.segments; var newPath = new ChiselPath(new ChiselPathPoint[originalSegments.Length]); System.Array.Copy(originalSegments, newPath.segments, originalSegments.Length); newPath.segments[i] = pathPoint; path = newPath; } } // TODO: draw curved path }
public void OnEdit(IChiselHandles handles) { handles.DoShapeHandle(ref shape); }
public void OnEdit(IChiselHandles handles) { var baseColor = handles.color; var normal = Vector3.forward; var controlPoints = shape.controlPoints; var shapeVertices = new List <Vector2>(); var shapeSegmentIndices = new List <int>(); BrushMeshFactory.GetPathVertices(this.shape, this.curveSegments, shapeVertices, shapeSegmentIndices); var horzSegments = this.revolveSegments; var horzDegreePerSegment = this.totalAngle / horzSegments; var horzOffset = this.startAngle; var noZTestcolor = handles.GetStateColor(baseColor, false, true); var zTestcolor = handles.GetStateColor(baseColor, false, false); for (int h = 1, pr = 0; h < horzSegments + 1; pr = h, h++) { var hDegree0 = (pr * horzDegreePerSegment) + horzOffset; var hDegree1 = (h * horzDegreePerSegment) + horzOffset; var rotation0 = Quaternion.AngleAxis(hDegree0, normal); var rotation1 = Quaternion.AngleAxis(hDegree1, normal); for (int p0 = controlPoints.Length - 1, p1 = 0; p1 < controlPoints.Length; p0 = p1, p1++) { var point0 = controlPoints[p0].position; //var point1 = controlPoints[p1].position; var vertexA = rotation0 * new Vector3(point0.x, 0, point0.y); var vertexB = rotation1 * new Vector3(point0.x, 0, point0.y); //var vertexC = rotation0 * new Vector3(point1.x, 0, point1.y); handles.color = noZTestcolor; handles.DrawLine(vertexA, vertexB, lineMode: LineMode.NoZTest, thickness: kHorzLineThickness);//, dashSize: kLineDash); handles.color = zTestcolor; handles.DrawLine(vertexA, vertexB, lineMode: LineMode.ZTest, thickness: kHorzLineThickness); //, dashSize: kLineDash); } for (int v0 = shapeVertices.Count - 1, v1 = 0; v1 < shapeVertices.Count; v0 = v1, v1++) { var point0 = shapeVertices[v0]; var point1 = shapeVertices[v1]; var vertexA = rotation0 * new Vector3(point0.x, 0, point0.y); var vertexB = rotation0 * new Vector3(point1.x, 0, point1.y); handles.color = noZTestcolor; handles.DrawLine(vertexA, vertexB, lineMode: LineMode.NoZTest, thickness: kHorzLineThickness, dashSize: kLineDash); handles.color = zTestcolor; handles.DrawLine(vertexA, vertexB, lineMode: LineMode.ZTest, thickness: kHorzLineThickness, dashSize: kLineDash); } } handles.color = baseColor; { // TODO: make this work non grid aligned so we can place it upwards handles.DoShapeHandle(ref shape); handles.DrawLine(normal * 10, normal * -10, dashSize: 4.0f); } }