sdl2-demo: implement painting of zones (untested)

This commit is contained in:
Mikolaj Wielgus 2024-04-04 13:58:29 +00:00
parent 1a624b83b1
commit 36e029012f
2 changed files with 63 additions and 27 deletions

View File

@ -18,6 +18,7 @@ use topola::drawing::graph::{MakePrimitive, PrimitiveIndex};
use topola::drawing::primitive::MakeShape;
use topola::drawing::rules::{Conditions, RulesTrait};
use topola::drawing::seg::FixedSegWeight;
use topola::drawing::zone::MakePolygon;
use topola::drawing::{Drawing, Infringement, LayoutException};
use topola::dsn::design::DsnDesign;
use topola::geometry::shape::{Shape, ShapeTrait};
@ -49,23 +50,26 @@ use topola::math::Circle;
use topola::router::Router;
struct SimpleRules {
net_clearances: HashMap<(i64, i64), f64>,
net_clearances: HashMap<(usize, usize), f64>,
}
impl RulesTrait for SimpleRules {
fn clearance(&self, conditions1: &Conditions, conditions2: &Conditions) -> f64 {
*self
.net_clearances
.get(&(conditions1.maybe_net, conditions2.maybe_net))
.unwrap_or(&10.0)
if let (Some(net1), Some(net2)) = (conditions1.maybe_net, conditions2.maybe_net) {
*self.net_clearances.get(&(net1, net2)).unwrap_or(&10.0)
} else {
10.0
}
}
fn largest_clearance(&self, net: i64) -> f64 {
fn largest_clearance(&self, maybe_net: Option<usize>) -> f64 {
let mut highest_clearance = 0.0;
for ((net1, net2), clearance) in self.net_clearances.iter() {
if *net1 == net || *net2 == net {
highest_clearance = *clearance;
if let Some(net) = maybe_net {
for ((net1, net2), clearance) in self.net_clearances.iter() {
if *net1 == net || *net2 == net {
highest_clearance = *clearance;
}
}
}
@ -74,7 +78,7 @@ impl RulesTrait for SimpleRules {
}
// Clunky enum to work around borrow checker.
enum RouterOrLayout<'a, R: RulesTrait> {
enum RouterOrDrawing<'a, R: RulesTrait> {
Router(&'a mut Router<R>),
Layout(&'a Drawing<R>),
}
@ -129,7 +133,7 @@ impl<'a, R: RulesTrait> RouterObserverTrait<R> for DebugRouterObserver<'a> {
self.renderer,
self.font_context,
self.view,
RouterOrLayout::Layout(tracer.layout.layout()),
RouterOrDrawing::Layout(tracer.layout.drawing()),
None,
Some(tracer.mesh.clone()),
&trace.path,
@ -148,7 +152,7 @@ impl<'a, R: RulesTrait> RouterObserverTrait<R> for DebugRouterObserver<'a> {
self.renderer,
self.font_context,
self.view,
RouterOrLayout::Layout(tracer.layout.layout()),
RouterOrDrawing::Layout(tracer.layout.drawing()),
None,
Some(tracer.mesh.clone()),
&path,
@ -180,7 +184,7 @@ impl<'a, R: RulesTrait> RouterObserverTrait<R> for DebugRouterObserver<'a> {
self.renderer,
self.font_context,
self.view,
RouterOrLayout::Layout(tracer.layout.layout()),
RouterOrDrawing::Layout(tracer.layout.drawing()),
None,
Some(tracer.mesh.clone()),
&trace.path,
@ -271,7 +275,7 @@ fn main() -> Result<(), anyhow::Error> {
&mut renderer,
&font_context,
&mut view,
RouterOrLayout::Layout(router.layout.layout()),
RouterOrDrawing::Layout(router.layout.drawing()),
None,
None,
&[],
@ -295,7 +299,7 @@ fn main() -> Result<(), anyhow::Error> {
&mut renderer,
&font_context,
&mut view,
RouterOrLayout::Layout(router.layout.layout()),
RouterOrDrawing::Layout(router.layout.drawing()),
None,
None,
&[],
@ -318,7 +322,7 @@ fn render_times(
renderer: &mut Renderer<GLDevice>,
font_context: &CanvasFontContext,
view: &mut View,
mut router_or_layout: RouterOrLayout<impl RulesTrait>,
mut router_or_layout: RouterOrDrawing<impl RulesTrait>,
maybe_band: Option<BandIndex>,
mut maybe_mesh: Option<Mesh>,
path: &[VertexIndex],
@ -366,8 +370,8 @@ fn render_times(
let mut painter = Painter::new(&mut canvas);
let layout = match router_or_layout {
RouterOrLayout::Router(ref mut router) => {
let drawing = match router_or_layout {
RouterOrDrawing::Router(ref mut router) => {
let state = event_pump.mouse_state();
if let Some(band) = maybe_band {
@ -388,42 +392,58 @@ fn render_times(
maybe_mesh = None;
}
router.layout.layout()
router.layout.drawing()
}
RouterOrLayout::Layout(layout) => layout,
RouterOrDrawing::Layout(layout) => layout,
};
//let result = panic::catch_unwind(|| {
for node in layout.layer_primitive_nodes(1) {
for node in drawing.layer_primitive_nodes(1) {
let color = if highlighteds.contains(&node) {
ColorU::new(100, 100, 255, 255)
} else {
ColorU::new(52, 52, 200, 255)
};
let shape = node.primitive(layout).shape();
let shape = node.primitive(drawing).shape();
painter.paint_shape(&shape, color, view.zoom);
}
for node in layout.layer_primitive_nodes(0) {
for zone in drawing.layer_zones(1) {
painter.paint_polygon(
&zone.polygon(&drawing),
ColorU::new(52, 52, 200, 255),
view.zoom,
);
}
for node in drawing.layer_primitive_nodes(0) {
let color = if highlighteds.contains(&node) {
ColorU::new(255, 100, 100, 255)
} else {
ColorU::new(200, 52, 52, 255)
};
let shape = node.primitive(layout).shape();
let shape = node.primitive(drawing).shape();
painter.paint_shape(&shape, color, view.zoom);
}
for zone in drawing.layer_zones(0) {
painter.paint_polygon(
&zone.polygon(&drawing),
ColorU::new(200, 52, 52, 255),
view.zoom,
);
}
for ghost in ghosts {
painter.paint_shape(&ghost, ColorU::new(75, 75, 150, 255), view.zoom);
}
if let Some(ref mesh) = maybe_mesh {
for edge in mesh.edge_references() {
let to = edge.source().primitive(layout).shape().center();
let from = edge.target().primitive(layout).shape().center();
let to = edge.source().primitive(drawing).shape().center();
let from = edge.target().primitive(drawing).shape().center();
let color = 'blk: {
if let (Some(source_pos), Some(target_pos)) = (

View File

@ -1,4 +1,4 @@
use geo::Point;
use geo::{CoordsIter, Point, Polygon};
use pathfinder_canvas::{
vec2f, ArcDirection, Canvas, CanvasRenderingContext2D, ColorU, FillRule, Path2D, RectF,
};
@ -67,6 +67,22 @@ impl<'a> Painter<'a> {
.stroke_rect(RectF::new(topleft, bottomright - topleft));
}
pub fn paint_polygon(&mut self, polygon: &Polygon, color: ColorU, zoom: f32) {
let mut path = Path2D::new();
let mut it = polygon.exterior_coords_iter();
if let Some(initial_vertex) = it.next() {
path.move_to(vec2f(initial_vertex.x as f32, initial_vertex.y as f32));
}
for vertex in it {
path.line_to(vec2f(vertex.x as f32, vertex.y as f32));
}
self.canvas.set_line_width(0.0);
self.canvas.fill_path(path, FillRule::Winding);
}
pub fn paint_edge(&mut self, from: Point, to: Point, color: ColorU, zoom: f32) {
let mut path = Path2D::new();
path.move_to(vec2f(from.x() as f32, from.y() as f32));