@adatechnology/game-shapes 0.1.0 → 0.2.1

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/README.md CHANGED
@@ -140,6 +140,11 @@ A `lod` rule `{ distance, detail, minSize?, minSegments? }` regenerates the tree
140
140
  static body. Instance a node when the same geometry repeats tens of times or is placed at run time; merge when copies are few or coloured per
141
141
  vertex.
142
142
 
143
+ ## Generators by instance
144
+
145
+ `createShapes({ packs, patch, remove })` makes a set of generators of its own. `packs` is a list of objects `{ [name]: ShapeGenerator }` (`[{ 'my.stones': stones }]`); later packs replace earlier ones with the same name.
146
+ `patch` replaces a generator by name, `remove` lists names to take out. `shapes.generate` looks custom nodes up in that set only. For a pool use `createShapePool({ generators: shapes.record(), isolatedGenerators: true })`: its jobs then run in the calling thread and never see the global registry.
147
+
143
148
  ## Português
144
149
 
145
150
  Gerador único de 3D do kit: forma em JSON vira buffers por material, puro, por semente, pronto para worker e cache. Os geradores são portes linha a
@@ -1431,8 +1431,8 @@ function mesh(p) {
1431
1431
  groups: []
1432
1432
  };
1433
1433
  }
1434
- function make(kind, p) {
1435
- switch (kind) {
1434
+ function make(p) {
1435
+ switch (p.kind) {
1436
1436
  case "box": {
1437
1437
  const size = p.size ?? [1, 1, 1];
1438
1438
  const segments = p.segments ?? [1, 1, 1];
@@ -1461,7 +1461,7 @@ function make(kind, p) {
1461
1461
  case "mesh":
1462
1462
  return mesh(p);
1463
1463
  default:
1464
- throw new Error(`game-shapes: unknown primitive kind "${String(kind)}"`);
1464
+ throw new Error(`game-shapes: unknown primitive kind "${String(p.kind)}"`);
1465
1465
  }
1466
1466
  }
1467
1467
  var templates = /* @__PURE__ */ new Map();
@@ -1479,7 +1479,7 @@ function clearTemplateCache() {
1479
1479
  var templateCacheStats = () => ({ size: templates.size, ...stats });
1480
1480
  function buildPrimitive(node, options = {}) {
1481
1481
  const parameters = primitiveParameters(node, options);
1482
- if (node.kind === "mesh" || templateLimit === 0) return make(node.kind, parameters);
1482
+ if (node.kind === "mesh" || templateLimit === 0) return make({ ...node, ...parameters });
1483
1483
  const key = `${node.kind}:${canonicalJson(parameters)}`;
1484
1484
  const cached = templates.get(key);
1485
1485
  if (cached) {
@@ -1489,7 +1489,7 @@ function buildPrimitive(node, options = {}) {
1489
1489
  return cached;
1490
1490
  }
1491
1491
  stats.misses++;
1492
- const built = make(node.kind, parameters);
1492
+ const built = make({ ...node, ...parameters });
1493
1493
  templates.set(key, built);
1494
1494
  if (templates.size > templateLimit) templates.delete(templates.keys().next().value);
1495
1495
  return built;
@@ -1520,14 +1520,23 @@ function mulberry32(seed) {
1520
1520
  var streamFor = (seed, generator, path) => mulberry32(parseInt(hash64(`${String(seed)}\0${generator}\0${path}`).slice(0, 8), 16));
1521
1521
 
1522
1522
  // src/registry.ts
1523
- var generators = /* @__PURE__ */ new Map();
1524
- function registerGenerator(name, generator) {
1525
- if (!/^[a-zA-Z][\w.:-]*$/.test(name)) throw new Error(`game-shapes: generator name "${name}" must start with a letter and use letters, digits, ".", ":", "-" or "_"`);
1526
- generators.set(name, generator);
1527
- }
1528
- var unregisterGenerator = (name) => generators.delete(name);
1529
- var getGenerator = (name) => generators.get(name);
1530
- var listGenerators = () => [...generators.keys()].sort();
1523
+ var GENERATOR_NAME = /^[a-zA-Z][\w.:-]*$/;
1524
+ var generatorsOver = (generators) => ({
1525
+ register(name, generator) {
1526
+ if (!GENERATOR_NAME.test(name)) throw new Error(`game-shapes: generator name "${name}" must start with a letter and use letters, digits, ".", ":", "-" or "_"`);
1527
+ generators.set(name, generator);
1528
+ },
1529
+ unregister: (name) => generators.delete(name),
1530
+ get: (name) => generators.get(name),
1531
+ list: () => [...generators.keys()].sort(),
1532
+ record: () => Object.fromEntries(generators)
1533
+ });
1534
+ var defaultGenerators;
1535
+ var defaultShapeGenerators = () => defaultGenerators ?? (defaultGenerators = generatorsOver(/* @__PURE__ */ new Map()));
1536
+ var registerGenerator = (name, generator) => defaultShapeGenerators().register(name, generator);
1537
+ var unregisterGenerator = (name) => defaultShapeGenerators().unregister(name);
1538
+ var getGenerator = (name) => defaultShapeGenerators().get(name);
1539
+ var listGenerators = () => defaultShapeGenerators().list();
1531
1540
 
1532
1541
  // schema/shape.schema.json
1533
1542
  var shape_schema_default = {
@@ -2573,7 +2582,7 @@ var radiusOf = (t, world) => {
2573
2582
  return r * Math.max(sx, sy, sz);
2574
2583
  };
2575
2584
  function expandCustom(node, settings, detail, path) {
2576
- const generator = settings.generators?.[node.generator] ?? getGenerator(node.generator);
2585
+ const generator = settings.generators?.[node.generator] ?? (settings.isolatedGenerators ? void 0 : getGenerator(node.generator));
2577
2586
  if (!generator) throw new Error(`game-shapes: no generator "${node.generator}" (register it with registerGenerator, in the worker too) at ${path}`);
2578
2587
  const generated = generator(node.params, { random: streamFor(settings.seed, node.generator, path), seed: settings.seed, detail, path });
2579
2588
  const { kind: _kind, generator: _generator, params: _params, ...common } = node;
@@ -2781,6 +2790,7 @@ function generate(schema, options = {}) {
2781
2790
  ...options.materialAlias ? { alias: options.materialAlias } : {},
2782
2791
  seed: options.seed ?? 0,
2783
2792
  ...options.generators ? { generators: options.generators } : {},
2793
+ ...options.isolatedGenerators ? { isolatedGenerators: true } : {},
2784
2794
  ...options.instancing ? { autoMin: Math.max(2, options.instancing.minCount) } : {}
2785
2795
  };
2786
2796
  const specs = [{ distance: 0, detail: 1, index: 0 }, ...(schema.lod ?? []).map((rule, index) => ({ ...rule, index: index + 1 }))];
@@ -2952,6 +2962,8 @@ export {
2952
2962
  clonePrimitive,
2953
2963
  mulberry32,
2954
2964
  streamFor,
2965
+ generatorsOver,
2966
+ defaultShapeGenerators,
2955
2967
  registerGenerator,
2956
2968
  unregisterGenerator,
2957
2969
  getGenerator,
@@ -2969,4 +2981,4 @@ export {
2969
2981
  byteSizeOf,
2970
2982
  installShapeWorker
2971
2983
  };
2972
- //# sourceMappingURL=chunk-R4RY23RH.js.map
2984
+ //# sourceMappingURL=chunk-M5N2SHNL.js.map