@adatechnology/game-destruction-three 0.8.1 → 0.9.0

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.js CHANGED
@@ -45,6 +45,9 @@ function mixHex(a, b, t) {
45
45
  }
46
46
 
47
47
  // src/fragments.ts
48
+ var SHEET_MAX = 4e-3;
49
+ var SHEET_AIR = 2.5;
50
+ var SHEET_SWAY = 3;
48
51
  var FragmentSystem = class {
49
52
  constructor(THREE, o) {
50
53
  __publicField(this, "THREE", THREE);
@@ -150,7 +153,8 @@ var FragmentSystem = class {
150
153
  asleep: false,
151
154
  rest: 0,
152
155
  fade: 1,
153
- dying: false
156
+ dying: false,
157
+ air: f.shape === "scrap" && sz[2] <= SHEET_MAX ? SHEET_AIR : 0
154
158
  };
155
159
  this.list.push(live);
156
160
  let alive = this.list.reduce((n, l) => n + (l.dying ? 0 : 1), 0);
@@ -234,6 +238,7 @@ var FragmentSystem = class {
234
238
  }
235
239
  } else {
236
240
  f.ang.multiplyScalar(Math.exp(-0.15 * dt));
241
+ if (f.air > 0) this.flutter(f, dt);
237
242
  }
238
243
  if (contact && f.vel.lengthSq() < 4) this.settle(f, dt);
239
244
  const slow = f.vel.lengthSq() < 0.012 && f.ang.lengthSq() < 0.2;
@@ -248,6 +253,14 @@ var FragmentSystem = class {
248
253
  f.still = 0;
249
254
  }
250
255
  }
256
+ /** A sheet in the air: drag slows it to a slow fall, and it sways and turns over as it goes. */
257
+ flutter(f, dt) {
258
+ f.vel.multiplyScalar(Math.exp(-f.air * dt));
259
+ f.vel.x += (this.rng() - 0.5) * SHEET_SWAY * dt;
260
+ f.vel.z += (this.rng() - 0.5) * SHEET_SWAY * dt;
261
+ f.ang.x += (this.rng() - 0.5) * SHEET_SWAY * 4 * dt;
262
+ f.ang.z += (this.rng() - 0.5) * SHEET_SWAY * 4 * dt;
263
+ }
251
264
  /** Tip the fragment towards lying on its flattest face. */
252
265
  settle(f, dt) {
253
266
  const mesh = f.mesh;
@@ -2550,6 +2563,7 @@ var Renderer = class {
2550
2563
  const def = pv ? this.world.materials.get(pv.material) : void 0;
2551
2564
  if (kind === "smoke") return { color: SMOKE_TONES[def?.thermal.smoke ?? "grey"] };
2552
2565
  if (kind === "fibers" || kind === "leaves") {
2566
+ if (def?.visual?.innerColor !== void 0) return { color: def.visual.innerColor };
2553
2567
  const c = pv ? this.visuals.baseColorHex(pv.meshes[0] ?? {}) : -1;
2554
2568
  return c >= 0 ? { color: c } : void 0;
2555
2569
  }
@@ -2698,7 +2712,8 @@ var Renderer = class {
2698
2712
  for (let i = 0; i < ev.fragments.length; i += step) {
2699
2713
  const fr = ev.fragments[i];
2700
2714
  const fdef = this.world.materials.get(fr.material);
2701
- const mat = this.fragments.materialFor(fr.material, fdef === def || !fdef ? color : fallbackColor(fr.material, fdef), transparent || fdef?.visual?.transparent === true, opacity);
2715
+ const tone2 = fr.inner && fdef?.visual?.innerColor !== void 0 ? fdef.visual.innerColor : fdef === def || !fdef ? color : fallbackColor(fr.material, fdef);
2716
+ const mat = this.fragments.materialFor(fr.material, tone2, transparent || fdef?.visual?.transparent === true, opacity);
2702
2717
  this.fragments.spawn(fr, mat, ev.object, maxAlive);
2703
2718
  }
2704
2719
  const up = [0, 1, 0];
@@ -2716,7 +2731,7 @@ var Renderer = class {
2716
2731
  this.vfx.burst("dust", ev.point, up, 5, 0.8, { color: 11901556 });
2717
2732
  break;
2718
2733
  case "tear":
2719
- this.vfx.burst("fibers", ev.point, up, 12 * sizeK, 1.6, { color });
2734
+ this.vfx.burst("fibers", ev.point, up, 12 * sizeK, 1.6, { color: def?.visual?.innerColor ?? color });
2720
2735
  break;
2721
2736
  case "snap":
2722
2737
  this.vfx.burst("chips", ev.point, up, 8 * sizeK, 3);