@blorkfield/overlay-core 0.11.1 → 0.11.2

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
package/dist/index.cjs CHANGED
@@ -513,6 +513,17 @@ function createBodyFromVertices(id, x, y, vertices, renderOptions) {
513
513
  render: renderOptions
514
514
  });
515
515
  import_matter_js2.default.Body.setPosition(body, { x, y });
516
+ if (!body.parts.every((part) => part.vertices && part.vertices.length >= 3)) {
517
+ logger.warn(LOG_PREFIX2, `fromVertices produced degenerate parts, falling back to circle`, { id });
518
+ return import_matter_js2.default.Bodies.circle(x, y, DEFAULT_RADIUS, {
519
+ restitution: 0.3,
520
+ friction: 0.1,
521
+ frictionAir: 0.01,
522
+ density: 5e-3,
523
+ label: `entity:${id}`,
524
+ render: renderOptions
525
+ });
526
+ }
516
527
  return body;
517
528
  }
518
529
  function createBoundariesWithFloorConfig(bounds, floorConfig) {
@@ -704,11 +715,26 @@ async function createBoxObstacleWithInfo(id, config, isStatic = true) {
704
715
  }
705
716
  }
706
717
  });
707
- const spriteOffsetX = (config.x - body.position.x) / scaledWidth;
708
- const spriteOffsetY = (config.y - body.position.y) / scaledHeight;
709
- if (body.render.sprite) {
710
- body.render.sprite.xOffset = 0.5 + spriteOffsetX;
711
- body.render.sprite.yOffset = 0.5 + spriteOffsetY;
718
+ if (!body.parts.every((part) => part.vertices && part.vertices.length >= 3)) {
719
+ logger.warn(LOG_PREFIX2, `fromVertices produced degenerate obstacle, falling back to rectangle`, { id });
720
+ body = import_matter_js2.default.Bodies.rectangle(config.x, config.y, scaledWidth, scaledHeight, {
721
+ isStatic,
722
+ label: `obstacle:${id}`,
723
+ render: {
724
+ sprite: {
725
+ texture: config.imageUrl,
726
+ xScale: spriteScale,
727
+ yScale: spriteScale
728
+ }
729
+ }
730
+ });
731
+ } else {
732
+ const spriteOffsetX = (config.x - body.position.x) / scaledWidth;
733
+ const spriteOffsetY = (config.y - body.position.y) / scaledHeight;
734
+ if (body.render.sprite) {
735
+ body.render.sprite.xOffset = 0.5 + spriteOffsetX;
736
+ body.render.sprite.yOffset = 0.5 + spriteOffsetY;
737
+ }
712
738
  }
713
739
  } else {
714
740
  body = import_matter_js2.default.Bodies.rectangle(config.x, config.y, scaledWidth, scaledHeight, {
@@ -757,6 +783,10 @@ async function createObstacleAsync(id, config, isStatic = true) {
757
783
  }
758
784
  });
759
785
  import_matter_js2.default.Body.setPosition(body, { x: config.x, y: config.y });
786
+ if (!body.parts.every((part) => part.vertices && part.vertices.length >= 3)) {
787
+ logger.warn(LOG_PREFIX2, `Image obstacle fromVertices degenerate, falling back to rectangle`, { id });
788
+ return createObstacle(id, config, isStatic);
789
+ }
760
790
  return body;
761
791
  }
762
792
  logger.warn(LOG_PREFIX2, `Image obstacle shape extraction failed, falling back to rectangle`, { id });
@@ -3473,13 +3503,20 @@ var OverlayScene = class {
3473
3503
  x: currentX + v.x,
3474
3504
  y: currentY + v.y
3475
3505
  }));
3476
- const body = import_matter_js5.default.Bodies.fromVertices(glyphCenterX, glyphCenterY, [worldVertices], {
3506
+ let body = import_matter_js5.default.Bodies.fromVertices(glyphCenterX, glyphCenterY, [worldVertices], {
3477
3507
  isStatic,
3478
3508
  label: `obstacle:${id}`,
3479
3509
  render: {
3480
3510
  visible: false
3481
3511
  }
3482
3512
  });
3513
+ if (!body.parts.every((part) => part.vertices && part.vertices.length >= 3)) {
3514
+ body = import_matter_js5.default.Bodies.rectangle(glyphCenterX, glyphCenterY, Math.max(glyphWidth, 1), Math.max(Math.abs(glyphHeight), 1), {
3515
+ isStatic,
3516
+ label: `obstacle:${id}`,
3517
+ render: { visible: false }
3518
+ });
3519
+ }
3483
3520
  const offsetX = currentX - body.position.x;
3484
3521
  const offsetY = currentY - body.position.y;
3485
3522
  let pressureThreshold;