public override void OnEdit(IChiselHandles handles) { var normal = Vector3.up; var topDirection = Vector3.forward; var lowDirection = Vector3.forward; var originalOuterDiameter = settings.outerDiameter; var originalInnerDiameter = settings.innerDiameter; var originalStartAngle = settings.startAngle; var originalStepHeight = settings.stepHeight; var originalRotation = settings.rotation; var originalHeight = settings.height; var originalOrigin = settings.origin; var cylinderTop = new BrushMeshFactory.ChiselCircleDefinition { diameterX = 1, diameterZ = 1, height = originalOrigin.y + originalHeight }; var cylinderLow = new BrushMeshFactory.ChiselCircleDefinition { diameterX = 1, diameterZ = 1, height = originalOrigin.y }; var originalTopPoint = normal * cylinderTop.height; var originalLowPoint = normal * cylinderLow.height; var originalMidPoint = (originalTopPoint + originalLowPoint) * 0.5f; var outerDiameter = originalOuterDiameter; var innerDiameter = originalInnerDiameter; var topPoint = originalTopPoint; var lowPoint = originalLowPoint; var midPoint = originalMidPoint; var startAngle = originalStartAngle; var rotation = originalRotation; { var currRotation = startAngle + rotation; handles.DoRotatableLineHandle(ref startAngle, lowPoint, outerDiameter * 0.5f, normal, lowDirection, Vector3.Cross(normal, lowDirection)); handles.DoRotatableLineHandle(ref currRotation, topPoint, outerDiameter * 0.5f, normal, topDirection, Vector3.Cross(normal, topDirection)); if (handles.modified) { rotation = currRotation - startAngle; } // TODO: properly show things as backfaced // TODO: temporarily show inner or outer diameter as disabled when resizing one or the other // TODO: FIXME: why aren't there any arrows? handles.DoDirectionHandle(ref topPoint, normal, snappingStep: originalStepHeight); topPoint.y = math.max(lowPoint.y + originalStepHeight, topPoint.y); handles.DoDirectionHandle(ref lowPoint, -normal, snappingStep: originalStepHeight); lowPoint.y = math.min(topPoint.y - originalStepHeight, lowPoint.y); float minOuterDiameter = innerDiameter + ChiselSpiralStairs.kMinStairsDepth; { var outerRadius = outerDiameter * 0.5f; handles.DoRadiusHandle(ref outerRadius, Vector3.up, topPoint, renderDisc: false); handles.DoRadiusHandle(ref outerRadius, Vector3.up, lowPoint, renderDisc: false); outerDiameter = math.max(minOuterDiameter, outerRadius * 2.0f); } float maxInnerDiameter = outerDiameter - ChiselSpiralStairs.kMinStairsDepth; { var innerRadius = innerDiameter * 0.5f; handles.DoRadiusHandle(ref innerRadius, Vector3.up, midPoint, renderDisc: false); innerDiameter = math.min(maxInnerDiameter, innerRadius * 2.0f); } // TODO: somehow put this into a separate renderer cylinderTop.diameterZ = cylinderTop.diameterX = cylinderLow.diameterZ = cylinderLow.diameterX = originalInnerDiameter; BrushMeshFactory.GetConicalFrustumVertices(cylinderLow, cylinderTop, 0, settings.innerSegments, ref s_InnerVertices); cylinderTop.diameterZ = cylinderTop.diameterX = cylinderLow.diameterZ = cylinderLow.diameterX = originalOuterDiameter; BrushMeshFactory.GetConicalFrustumVertices(cylinderLow, cylinderTop, 0, settings.outerSegments, ref s_OuterVertices); var originalColor = handles.color; var color = handles.color; var outlineColor = Color.black; outlineColor.a = color.a; handles.color = outlineColor; { var sides = settings.outerSegments; for (int i = 0, j = sides - 1; i < sides; j = i, i++) { var t0 = s_OuterVertices[i]; var t1 = s_OuterVertices[j]; var b0 = s_OuterVertices[i + sides]; var b1 = s_OuterVertices[j + sides]; handles.DrawLine(t0, b0, thickness: 1.0f); handles.DrawLine(t0, t1, thickness: 1.0f); handles.DrawLine(b0, b1, thickness: 1.0f); } } { var sides = settings.innerSegments; for (int i = 0, j = sides - 1; i < sides; j = i, i++) { var t0 = s_InnerVertices[i]; var t1 = s_InnerVertices[j]; var b0 = s_InnerVertices[i + sides]; var b1 = s_InnerVertices[j + sides]; handles.DrawLine(t0, b0, thickness: 1.0f); handles.DrawLine(t0, t1, thickness: 1.0f); handles.DrawLine(b0, b1, thickness: 1.0f); } } handles.color = originalColor; { var sides = settings.outerSegments; for (int i = 0, j = sides - 1; i < sides; j = i, i++) { var t0 = s_OuterVertices[i]; var t1 = s_OuterVertices[j]; var b0 = s_OuterVertices[i + sides]; var b1 = s_OuterVertices[j + sides]; handles.DrawLine(t0, b0, thickness: 1.0f); handles.DrawLine(t0, t1, thickness: 1.0f); handles.DrawLine(b0, b1, thickness: 1.0f); } } { var sides = settings.innerSegments; for (int i = 0, j = sides - 1; i < sides; j = i, i++) { var t0 = s_InnerVertices[i]; var t1 = s_InnerVertices[j]; var b0 = s_InnerVertices[i + sides]; var b1 = s_InnerVertices[j + sides]; handles.DrawLine(t0, b0, thickness: 1.0f); handles.DrawLine(t0, t1, thickness: 1.0f); handles.DrawLine(b0, b1, thickness: 1.0f); var m0 = (t0 + b0) * 0.5f; var m1 = (t1 + b1) * 0.5f; handles.DrawLine(m0, m1, thickness: 2.0f); } } } if (handles.modified) { settings.outerDiameter = outerDiameter; settings.innerDiameter = innerDiameter; settings.startAngle = startAngle; settings.rotation = rotation; if (topPoint != originalTopPoint) { settings.height = topPoint.y - lowPoint.y; } if (lowPoint != originalLowPoint) { settings.height = topPoint.y - lowPoint.y; var newOrigin = originalOrigin; newOrigin.y += lowPoint.y - originalLowPoint.y; settings.origin = newOrigin; } } }