Commit Graph

800 Commits

Author SHA1 Message Date
Mikolaj Wielgus 680a813a33 fix(drawing/drawing): Prevent self-intersecting band loops from forming
Fixes https://codeberg.org/topola/topola/issues/205
2025-05-05 22:38:06 +00:00
Mikolaj Wielgus 6175f7aec2 refactor(drawing/drawing): Ignore infringees using filter predicate instead of slice 2025-05-05 22:38:06 +00:00
Ellen Emilia Anna Zscheile 14287ca814 fix(interactor/interaction): fix warnings about unused arguments 2025-05-02 14:32:00 +02:00
Ellen Emilia Anna Zscheile 48efd5d3d9 feat(geometry/geometry): provide lookup of all rails around a core 2025-05-02 14:31:18 +02:00
Ellen Emilia Anna Zscheile 573f49f56f chore(autorouter): fix warnings about unused RemoveBandsExecutionStepper 2025-05-02 01:53:49 +02:00
Ellen Emilia Anna Zscheile 46d3d0e4a0 feat(math): add cached variant of polygonal tangent calculation 2025-05-01 15:28:20 +02:00
Ellen Emilia Anna Zscheile 7799c50829 feat(math): implement search for boundaries of partitions in cyclic partitioned lists.
e.g. find the bounds of false, true in [false, true, true, false, false]
under the condition that the blocks in partitions of a single value are connected,
meaning when considering the list as cyclic, there are at most 2 blocks (for value true, false).
This implements only the binary case.

Exponential search was suggested by Harold Aptroot <@harold@mastodon.gamedev.place>

Example/motivating use case: detecting which parts of the exterior of a Polygon
  face towards a point, and which parts don't, in particular finding the (extremal) points
  contained in the tangents. This use case is implemented in `poly_ext_tangent_points`.

Signed-off-by: Ellen Emilia Anna Zscheile <fogti+devel@ytrizja.de>
2025-05-01 15:28:20 +02:00
Mikolaj Wielgus f7cd817457 feat(autorouter/invoker): Create trait to display debug information on navmesh 2025-05-01 01:59:31 +02:00
Ellen Emilia Anna Zscheile 83d9fce38c fix(geometry/compound): rename CompoundEntryKind -> CompoundEntryLabel 2025-04-30 14:18:22 +02:00
Ellen Emilia Anna Zscheile e74f5e009a fix(layout/poly): merge all the iterations over nodes in 'add_poly_with_nodes_intern' 2025-04-30 14:11:31 +02:00
Ellen Emilia Anna Zscheile 187f06a9ac chore(layout): move most of 'add_poly_with_nodes' method into poly.rs 2025-04-30 14:11:31 +02:00
Ellen Emilia Anna Zscheile 8a66ece14c feat(layout): cache convex hull on polygon initialization 2025-04-30 14:11:31 +02:00
Ellen Emilia Anna Zscheile f416958936 refactor(geometry): use more ergonomic petgraph methods where appropriate 2025-04-30 14:11:31 +02:00
Ellen Emilia Anna Zscheile 861869ab7c refactor(geometry): introduce CompoundEntryKind to suppport entry metadata
example usages would be marking the apex of a polygon explicitly,
or marking the nodes of a polygon which are part of the convex hull

- make ManageCompounds more generic
- removes unnecessary bounds on handles/refs
2025-04-30 14:11:31 +02:00
Mikolaj Wielgus b000f2b7d8 refactor(math): Replace `cw` booleans with `RotationSense` enums
The term "cw" (clockwise) was somewhat cryptic, using a more verbose
term improves readability.
2025-04-29 13:58:49 +02:00
Ellen Emilia Anna Zscheile c2bdeb61e4 fix(interactor): reliably, properly stop activity 2025-04-25 22:21:00 +02:00
Ellen Emilia Anna Zscheile 92e8600452 chore(autorouter): remove unnecessary mutability 2025-04-25 21:37:37 +02:00
Mikolaj Wielgus 368caa268f docs(math): add some function docstrings 2025-04-25 02:16:10 +02:00
Ellen Emilia Anna Zscheile 346477f498 chore(layout): remove unused 'add_poly_fixed_*' methods 2025-04-22 22:51:51 +02:00
Mikolaj Wielgus b736aa2d7d refactor(layout::poly): use `MakeRef<...>` to obtain poly's ref-struct 2025-04-22 21:59:45 +02:00
Mikolaj Wielgus 4bf3611bb7 style: rename `src/geometry/poly.rs` to `src/geometry/polygon.rs` 2025-04-22 20:42:14 +02:00
Ellen Emilia Anna Zscheile f6a196aeca fix(drawing): make update_this_and_outward_bows fail graceful (with temporary fix) 2025-04-17 22:36:10 +00:00
Ellen Emilia Anna Zscheile a56628e250 fix(specctra/design): handle polygon seg between first and last dot properly 2025-04-17 18:51:29 +02:00
Ellen Emilia Anna Zscheile 122ff0122f fix(board): make Poly' apex generation non-lazy
- insert polygon parts before polygon compound
2025-04-17 15:03:14 +02:00
Ellen Emilia Anna Zscheile 77969952ff refactor(geometry/edit): GeometryEdit shouldn't know about PrimitiveIndex 2025-04-08 02:06:57 +00:00
Ellen Emilia Anna Zscheile cdee22d63e feat(geometry/edit): impl ApplyGeometryEdit for GeometryEdit 2025-04-08 02:06:57 +00:00
Ellen Emilia Anna Zscheile e20c9aa3d6 feat(specctra-core/mesadata, layout): make `Layout` clonable
This change also propagates to `SpecctraMesadata`, which is a bit unfortunate,
because the code that needs this will never mutate the mesadata,
wrapping it in an `Arc` would be a possible alternative.
2025-03-31 02:30:26 +02:00
Ellen Emilia Anna Zscheile 22460c75f7 refactor(DrawingException): factor out extraction of ghost+obstacle 2025-03-31 02:27:56 +02:00
Ellen Emilia Anna Zscheile 566949d4c1 refactor(interactor): use enum_dispatch for ActivityStepper 2025-03-31 02:27:06 +02:00
Ellen Emilia Anna Zscheile 822bba8fde refactor(drawing): more aggressive out-factoring in update_this_and_outward_bows 2025-03-29 16:00:24 +01:00
Ellen Emilia Anna Zscheile da6b825ee7 refactor(drawing): deduplicate code in update_this_and_outward_bows 2025-03-29 15:53:19 +01:00
Ellen Emilia Anna Zscheile c01c8046bb chore: cargo fmt 2025-03-25 23:06:04 +01:00
Ellen Emilia Anna Zscheile 670ddbe1f7 chore: apply clippy fixes 2025-03-25 00:17:57 +01:00
Ellen Emilia Anna Zscheile 13f2400c45 refactor(drawing): simplify traits 2025-03-22 04:06:27 +00:00
Ellen Emilia Anna Zscheile a836189086 refactor: simplify interface of NavcordStepper 2025-03-22 04:06:27 +00:00
Ellen Emilia Anna Zscheile da3be763c6 feat(overlay,viewport): generation and rendering of topological navmesh 2025-03-04 02:47:04 +01:00
Ellen Emilia Anna Zscheile 6eb941a137 feat: merge planar-brute-embed into the topola monorepo
- feat: use OrderedPair instead of custon BandName/BandUid (note: changes ordering of BandUid)
- fix(crates): rename planar-brute-embed to planar-incr-embed
2025-02-16 18:31:31 +01:00
Ellen Emilia Anna Zscheile a39546f0c9 fix(RouteStepper): borrowing mixup 2025-02-15 13:46:16 +01:00
Ellen Emilia Anna Zscheile a7c8474153 fix(RouteStepper): proper undo in case of failure
Fixes #116
(hopefully)
2025-02-15 13:36:32 +01:00
Ellen Emilia Anna Zscheile bb86aaed2a minimal backend for `planar-brute-embed` topological navmesh generation (#161)
Reviewed-on: https://codeberg.org/topola/topola/pulls/161
Co-authored-by: Ellen Emilia Anna Zscheile <fogti+devel@ytrizja.de>
Co-committed-by: Ellen Emilia Anna Zscheile <fogti+devel@ytrizja.de>
2025-02-15 00:00:15 +00:00
Ellen Emilia Anna Zscheile 0fde34204f refactor(drawing,geometry): move GetLayer from drawing::graph to geometry 2025-02-10 11:30:54 +01:00
Ellen Emilia Anna Zscheile 61c7b5450f refactor(Retag): only implement trait once, Index should be associated type 2025-02-10 11:29:08 +01:00
Ellen Emilia Anna Zscheile 1e690ace11 refactor(drawing): factor out common {Bend,Dot,Seg}Weight fields 2025-02-10 11:29:08 +01:00
Ellen Emilia Anna Zscheile 2e4b3b52ab chore: cargo fmt 2025-02-10 11:28:19 +01:00
Ellen Emilia Anna Zscheile e1d875ae72 chore: fix most warnings 2025-02-10 11:25:55 +01:00
Ellen Emilia Anna Zscheile 758677970a chore: allow unused_must_use (we didn't yet get around to fix that) 2025-02-10 11:14:13 +01:00
Ellen Emilia Anna Zscheile 67c4933b09 docs(drawing::loose): document how 'prev_loose' works 2025-02-02 23:53:21 +00:00
Ellen Emilia Anna Zscheile 5dab7d9100 refactor(navcord): inline 'binavvertex', 'maybe_cw' helpers 2025-02-02 22:03:12 +00:00
Ellen Emilia Anna Zscheile ba8aa2fe5a refactor(NavcordStepper): struct already stores 'width', don't pass it as argument 2025-02-02 22:03:12 +00:00
Ellen Emilia Anna Zscheile cf36177097 refactor: don't export modules only containing a single item 2025-02-02 22:03:12 +00:00
Ellen Emilia Anna Zscheile 2087e76dfe refactor(drawing::guide): turn Guide into a trait 2025-02-02 22:03:12 +00:00
Ellen Emilia Anna Zscheile bcb0c4ad5c refactor(drawing::collect): turn Collect into a trait 2025-02-02 22:03:12 +00:00
Ellen Emilia Anna Zscheile 90544c12ed refactor(router::navcorder): turn Navcorder into a trait 2025-02-02 22:03:12 +00:00
Ellen Emilia Anna Zscheile 1d11011133 refactor(router::draw): turn Draw into a trait 2025-02-02 22:03:12 +00:00
Ellen Emilia Anna Zscheile 869d63f7c0 fix(navmesh): NavvertexIndex debug output should state what it is 2025-02-02 22:30:37 +01:00
Ellen Emilia Anna Zscheile f2969decd0 feat/debug: make core::fmt::Debug output easier to read 2025-02-02 22:01:25 +01:00
Ellen Emilia Anna Zscheile ea6df23b95 feat(selection): BBox selection should span all currently visible layers
In Via, is_in_layer, `from_layer` and `to_layer` were swapped,
this has been also fixed here.
2025-01-09 18:59:07 +00:00
Ellen Emilia Anna Zscheile 3201df50bd Revert "feat(math): introduce dedicated data type for normalized angles"
This reverts commit b4fe7006b7.

The reverted commit introduced an autorouter regression, observable
in 4x_3rd_order_smd_lc_filters test using egui (see Matrix chat).
2025-01-09 01:05:23 +01:00
Alain Emilia Anna Zscheile 344d892ae0 chore,docs(math): rename 'cross_product' to 'perp_dot_product', add some documentation 2025-01-08 16:19:24 +00:00
Alain Emilia Anna Zscheile b4fe7006b7 feat(math): introduce dedicated data type for normalized angles 2025-01-08 16:19:24 +00:00
Alain Emilia Anna Zscheile 4529ac1ba3 refactor(math): put tangents stuff into separate module 2025-01-08 16:19:24 +00:00
Alain Emilia Anna Zscheile c9b5c39b3d refactor(geometry): reduce unnecessary trait bounds on Geometry impl, and don't use Getter 2025-01-07 21:11:51 +00:00
Alain Emilia Anna Zscheile 17ea07ab7b refactor(geometry): Access*Weight shouldn't take a generic arg; impl automatically 2025-01-07 21:11:51 +00:00
Alain Emilia Anna Zscheile a67f8ea052 refactor(geometry): SetOffset should inherit from GetOffset 2025-01-07 21:11:51 +00:00
Alain Emilia Anna Zscheile 699bd58949 refactor(geometry): merge GetPos and SetPos 2025-01-07 21:11:51 +00:00
Alain Emilia Anna Zscheile 9bb0d34bc8 refactor(layout): Poly & Via only use Drawing (instead of Layout), so only pass that 2025-01-05 22:14:00 +00:00
Alain Emilia Anna Zscheile 0cbd3c398a refactor(drawing,layout): move 'is_node_in_layer' from Layout to Drawing 2025-01-05 22:14:00 +00:00
Alain Emilia Anna Zscheile 59154c380f fix(BboxSelection): make intersection calculations against Polygons more accurate 2025-01-05 22:14:00 +00:00
Alain Emilia Anna Zscheile c7d50fd79f refactor(geometry::poly): PolyShape should be equal to Polygon 2025-01-05 22:14:00 +00:00
Alain Emilia Anna Zscheile fae1f4d7bc refactor(layout,geometry): Layout::node_bbox(...) → AccessShape::bbox(Layout::node_shape(...), 0.0) 2025-01-05 22:14:00 +00:00
Alain Emilia Anna Zscheile 740019e2e5 feat(selection): BboxSelectionKind (completely inside vs. merely intersects) 2025-01-05 22:14:00 +00:00
Mikolaj Wielgus 9664f1a31a fix: get rid of some indeterminism by using B-trees instead of hash maps
I have replaced all instances of `HashMap<...>` with `BTreeMap<...>`,
of `HashSet<...>` with `BTreeSet<...>`, and all the uses of the `Hash`
trait with `Ord`.

I have done a few manual tests and found the behavior to be
deterministic between the GUI application launches. However, undoing an
autoroute command and then manually executing it once again continues to
produce variable results. I suppose this is because of some bug in the
code where edits are applied. Hence, the issue

https://codeberg.org/topola/topola/issues/46

is only partially resolved.
2025-01-04 01:56:00 +01:00
Alain Emilia Anna Zscheile d88ba19e2b feat(graph): make indices serializable 2025-01-03 00:49:00 +01:00
Alain Emilia Anna Zscheile 53b964b865 feat: implement bounding box selection (#139)
Fixes #138

Reviewed-on: https://codeberg.org/topola/topola/pulls/139
Co-authored-by: Alain Emilia Anna Zscheile <fogti+devel@ytrizja.de>
Co-committed-by: Alain Emilia Anna Zscheile <fogti+devel@ytrizja.de>
2025-01-02 22:12:11 +00:00
Mikolaj Wielgus 44c30caafe chore(licensing): add REUSE license headers to `**.{rs,md,toml}` files
I ran the following command in Fish shell:

```
reuse annotate --skip-unrecognised --copyright="Topola contributors" --license="MIT" **.{rs,md,toml}
```

The choice of year 2024 in the copyright statements is intentional.
2024-12-29 22:47:00 +01:00
Mikolaj Wielgus 1567a9a83e style: rename "squeeze through under bands" to "(...) bends"
Everywhere except in translatable strings. I'm not changing these
because I prefer this to be done via Weblate.
2024-12-29 01:43:36 +01:00
Alain Emilia Anna Zscheile 82bf647bc5 doc(router/navmesh): document maybe_cw
Doc Comment content taken from @mikolaj, Topola Matrix Chat.
2024-12-14 19:56:29 +01:00
Alain Emilia Anna Zscheile ba41ff6837 refactor: get rid of unnecessary bounds on struct generics 2024-12-12 16:38:26 +01:00
Alain Emilia Anna Zscheile 8a724dc5d2 chore: fix deprecation warnings about geo::EuclideanDistance 2024-12-12 06:54:37 +00:00
Alain Emilia Anna Zscheile 35b2958c8d chore(geometry): run cargo fmt 2024-12-11 23:31:08 +01:00
Alain Emilia Anna Zscheile 41aeb97c16 fix(geometry/rwr): Fix missing pads due to buggy `add_to_compound`
The origin of this bug was found via git-bisect, commit
d6fe67a373
is buggy, which switches from GeometryWithRtree to RecordingGeometryWithRtree.

In PR #128, it was discovered that `add_to_compound` appears to
be missing the part that actually invokes the function that performs
the underlying action that is supposed to be diffed.

Fixes #127
2024-12-11 23:11:35 +01:00
Alain Emilia Anna Zscheile 9e0bdb5bc7 refactor: various further refactorings (#128)
These optimize out unnecessary code duplication, reserve vector capacity beforehand by leveraging `Iterator`s and avoid unnecessary double-lookups into HashMaps.

Reviewed-on: https://codeberg.org/topola/topola/pulls/128
Co-authored-by: Alain Emilia Anna Zscheile <fogti+devel@ytrizja.de>
Co-committed-by: Alain Emilia Anna Zscheile <fogti+devel@ytrizja.de>
2024-12-11 14:13:21 +00:00
Alain Emilia Anna Zscheile 1fd61f773c feat: improve Selection API (BREAKS HISTORY)
Test command files were rewritten using:

```
for f in tests/**/*.cmd; do jq ".done?.[].Autoroute[0] |= .selectors" "$f" | sponge "$f"; done
```
(compatible with bash/zsh/...)
2024-12-08 16:20:05 +00:00
Alain Emilia Anna Zscheile 5a26c02b4e refactor(ApplyGeometryEdit): make 'apply' take 'GeometryEdit' by reference 2024-12-08 16:20:05 +00:00
Alain Emilia Anna Zscheile 27a4b61c4d refactor(topola): get rid of unnecessary clones and lookups 2024-12-08 16:20:05 +00:00
Mikolaj Wielgus c87224e99a docs(router): add and rewrite some navmesh and navcord docstrings 2024-12-07 05:53:39 +01:00
Alain Emilia Anna Zscheile 0fe23c9c71 build: put `specctra` module into separate crate 2024-12-06 14:38:00 +01:00
Alain Emilia Anna Zscheile 3bd6a927b9 refactor(specctra/mesadata): more idiomatic Option handling 2024-12-04 15:39:41 +00:00
Alain Emilia Anna Zscheile 5b7f4588a0 feat(specctra/mesadata): deduplicate net names 2024-12-04 15:39:41 +00:00
Alain Emilia Anna Zscheile 0b9d3c0a00 fix(specctra/design): invalid references shouldn't panic during serialization 2024-12-04 15:39:41 +00:00
Alain Emilia Anna Zscheile 0a862a7e5f refactor(specctra/structure): get rid of code duplication in Vec<Point> 2024-12-04 15:39:41 +00:00
Alain Emilia Anna Zscheile da72118255 fix(specctra): return error when point fails to parse first f64 2024-12-04 15:39:41 +00:00
Mikolaj Wielgus b8adfec817 fix(geometry): fix bend joint order and correct tangent clockwiseness
Now bends should cease to seemingly randomly invert their order.
2024-12-04 04:45:39 +01:00
Mikolaj Wielgus 2703f662ac fix(autorouter): have band removal and via placement in undo/redo 2024-12-03 23:54:18 +01:00
Mikolaj Wielgus c2daf9fbfe feat(autorouter): use recorded edit applying for undo/redo 2024-12-03 08:35:11 +01:00
Mikolaj Wielgus d17a34c0f6 fix(geometry,router,autorouter): some more fixes for edit recording 2024-12-03 00:39:02 +01:00
Alain Emilia Anna Zscheile 5aae676fb8 refactor(specctra/read): put read_quoted into a separate function again 2024-12-02 22:45:32 +01:00
Alain Emilia Anna Zscheile e493c16053 fix(specctra/read): panic when return_token would override cached token 2024-12-02 22:41:23 +01:00
Alain Emilia Anna Zscheile 9ddc83e72a feat(specctra/read): separate function to discard peeked char
This is useful to get rid of the pattern "self.next_char().unwrap();",
which makes it harder to assess panic safety of parsing code
(which should never panic via its public interface)
2024-12-02 22:41:23 +01:00
Alain Emilia Anna Zscheile 1d0c2cf953 fix(specctra): less (possible) panic!s in read_string 2024-12-02 22:41:23 +01:00