sdf refactor
This commit is contained in:
parent
c639101942
commit
c4a61f8dd8
|
|
@ -31,14 +31,15 @@
|
|||
</style>
|
||||
</head>
|
||||
<body>
|
||||
<cell-renderer resolution="800" image-smoothing="true"></cell-renderer>
|
||||
<fc-geometry x="100" y="100" width="50" height="50"></fc-geometry>
|
||||
<fc-geometry x="100" y="200" width="50" height="50"></fc-geometry>
|
||||
<fc-geometry x="100" y="300" width="50" height="50"></fc-geometry>
|
||||
<fc-geometry x="300" y="150" width="80" height="40"></fc-geometry>
|
||||
<fc-geometry x="400" y="250" width="60" height="90"></fc-geometry>
|
||||
<fc-geometry x="200" y="400" width="100" height="100"></fc-geometry>
|
||||
<fc-geometry x="500" y="100" width="30" height="70"></fc-geometry>
|
||||
<cell-renderer resolution="800" image-smoothing="true">
|
||||
<fc-geometry x="100" y="100" width="50" height="50"></fc-geometry>
|
||||
<fc-geometry x="100" y="200" width="50" height="50"></fc-geometry>
|
||||
<fc-geometry x="100" y="300" width="50" height="50"></fc-geometry>
|
||||
<fc-geometry x="300" y="150" width="80" height="40"></fc-geometry>
|
||||
<fc-geometry x="400" y="250" width="60" height="90"></fc-geometry>
|
||||
<fc-geometry x="200" y="400" width="100" height="100"></fc-geometry>
|
||||
<fc-geometry x="500" y="100" width="30" height="70"></fc-geometry>
|
||||
</cell-renderer>
|
||||
|
||||
<script type="module">
|
||||
import { FolkGeometry } from '../src/canvas/fc-geometry.ts';
|
||||
|
|
@ -46,16 +47,6 @@
|
|||
|
||||
FolkGeometry.define();
|
||||
CellRenderer.define();
|
||||
|
||||
// Get all geometry elements and create points for the distance field
|
||||
const geometries = document.querySelectorAll('fc-geometry');
|
||||
const renderer = document.querySelector('cell-renderer');
|
||||
|
||||
// Update distance field when geometries move or resize
|
||||
geometries.forEach((geometry) => {
|
||||
geometry.addEventListener('move', (e) => renderer.handleGeometryUpdate(e));
|
||||
geometry.addEventListener('resize', (e) => renderer.handleGeometryUpdate(e));
|
||||
});
|
||||
</script>
|
||||
</body>
|
||||
</html>
|
||||
|
|
|
|||
|
|
@ -3,16 +3,27 @@ import type { Vector2 } from '../utils/Vector2.ts';
|
|||
import { Fields } from './fields.ts';
|
||||
|
||||
export class CellRenderer extends HTMLElement {
|
||||
static tagName = 'cell-renderer';
|
||||
|
||||
static define() {
|
||||
customElements.define(this.tagName, this);
|
||||
}
|
||||
|
||||
static observedAttributes = ['resolution', 'image-smoothing'];
|
||||
|
||||
private canvas: HTMLCanvasElement;
|
||||
private ctx: CanvasRenderingContext2D;
|
||||
private offscreenCtx: CanvasRenderingContext2D;
|
||||
private fields: Fields;
|
||||
private resolution: number;
|
||||
private imageSmoothing: boolean;
|
||||
static tagName = 'cell-renderer';
|
||||
|
||||
// Get all geometry elements and create points for the distance field
|
||||
private geometries = document.querySelectorAll('fc-geometry');
|
||||
|
||||
constructor() {
|
||||
super();
|
||||
|
||||
this.resolution = 2000; // default resolution
|
||||
this.imageSmoothing = true;
|
||||
this.fields = new Fields(this.resolution);
|
||||
|
|
@ -30,12 +41,20 @@ export class CellRenderer extends HTMLElement {
|
|||
this.renderDistanceField();
|
||||
}
|
||||
|
||||
static define() {
|
||||
customElements.define(this.tagName, this);
|
||||
connectedCallback() {
|
||||
// Update distance field when geometries move or resize
|
||||
this.geometries.forEach((geometry) => {
|
||||
geometry.addEventListener('move', this.handleGeometryUpdate);
|
||||
geometry.addEventListener('resize', this.handleGeometryUpdate);
|
||||
});
|
||||
}
|
||||
|
||||
static get observedAttributes() {
|
||||
return ['resolution', 'image-smoothing'];
|
||||
disconnectedCallback() {
|
||||
// Update distance field when geometries move or resize
|
||||
this.geometries.forEach((geometry) => {
|
||||
geometry.removeEventListener('move', this.handleGeometryUpdate);
|
||||
geometry.removeEventListener('resize', this.handleGeometryUpdate);
|
||||
});
|
||||
}
|
||||
|
||||
attributeChangedCallback(name: string, _oldValue: string, newValue: string) {
|
||||
|
|
@ -145,7 +164,7 @@ export class CellRenderer extends HTMLElement {
|
|||
return { ctx, offscreenCtx };
|
||||
}
|
||||
|
||||
handleGeometryUpdate(event: Event) {
|
||||
handleGeometryUpdate = (event: Event) => {
|
||||
const geometry = event.target as HTMLElement;
|
||||
const index = Array.from(document.querySelectorAll('fc-geometry')).indexOf(geometry as FolkGeometry);
|
||||
if (index === -1) return;
|
||||
|
|
@ -163,7 +182,7 @@ export class CellRenderer extends HTMLElement {
|
|||
} else {
|
||||
this.addShape(points, true);
|
||||
}
|
||||
}
|
||||
};
|
||||
|
||||
updateShape(index: number, points: Vector2[], isClosed = true) {
|
||||
// Transform each point from screen coordinates to field coordinates
|
||||
|
|
|
|||
Loading…
Reference in New Issue