@triforge/modifier-core 0.1.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.
Files changed (81) hide show
  1. package/dist/core/BaseModifier.d.ts +29 -0
  2. package/dist/core/BaseModifier.d.ts.map +1 -0
  3. package/dist/core/BaseModifier.js +16 -0
  4. package/dist/core/BaseModifier.js.map +1 -0
  5. package/dist/core/ModifierStack.d.ts +40 -0
  6. package/dist/core/ModifierStack.d.ts.map +1 -0
  7. package/dist/core/ModifierStack.js +71 -0
  8. package/dist/core/ModifierStack.js.map +1 -0
  9. package/dist/index.d.ts +34 -0
  10. package/dist/index.d.ts.map +1 -0
  11. package/dist/index.js +23 -0
  12. package/dist/index.js.map +1 -0
  13. package/dist/modifiers/deform/BendModifier.d.ts +25 -0
  14. package/dist/modifiers/deform/BendModifier.d.ts.map +1 -0
  15. package/dist/modifiers/deform/BendModifier.js +83 -0
  16. package/dist/modifiers/deform/BendModifier.js.map +1 -0
  17. package/dist/modifiers/deform/DisplacementModifier.d.ts +38 -0
  18. package/dist/modifiers/deform/DisplacementModifier.d.ts.map +1 -0
  19. package/dist/modifiers/deform/DisplacementModifier.js +58 -0
  20. package/dist/modifiers/deform/DisplacementModifier.js.map +1 -0
  21. package/dist/modifiers/deform/ShrinkwrapModifier.d.ts +24 -0
  22. package/dist/modifiers/deform/ShrinkwrapModifier.d.ts.map +1 -0
  23. package/dist/modifiers/deform/ShrinkwrapModifier.js +122 -0
  24. package/dist/modifiers/deform/ShrinkwrapModifier.js.map +1 -0
  25. package/dist/modifiers/deform/TwistModifier.d.ts +24 -0
  26. package/dist/modifiers/deform/TwistModifier.d.ts.map +1 -0
  27. package/dist/modifiers/deform/TwistModifier.js +76 -0
  28. package/dist/modifiers/deform/TwistModifier.js.map +1 -0
  29. package/dist/modifiers/deform/WarpModifier.d.ts +33 -0
  30. package/dist/modifiers/deform/WarpModifier.d.ts.map +1 -0
  31. package/dist/modifiers/deform/WarpModifier.js +61 -0
  32. package/dist/modifiers/deform/WarpModifier.js.map +1 -0
  33. package/dist/modifiers/generate/ArrayModifier.d.ts +22 -0
  34. package/dist/modifiers/generate/ArrayModifier.d.ts.map +1 -0
  35. package/dist/modifiers/generate/ArrayModifier.js +65 -0
  36. package/dist/modifiers/generate/ArrayModifier.js.map +1 -0
  37. package/dist/modifiers/generate/BevelModifier.d.ts +31 -0
  38. package/dist/modifiers/generate/BevelModifier.d.ts.map +1 -0
  39. package/dist/modifiers/generate/BevelModifier.js +234 -0
  40. package/dist/modifiers/generate/BevelModifier.js.map +1 -0
  41. package/dist/modifiers/generate/BooleanModifier.d.ts +37 -0
  42. package/dist/modifiers/generate/BooleanModifier.d.ts.map +1 -0
  43. package/dist/modifiers/generate/BooleanModifier.js +71 -0
  44. package/dist/modifiers/generate/BooleanModifier.js.map +1 -0
  45. package/dist/modifiers/generate/ExtrudeModifier.d.ts +25 -0
  46. package/dist/modifiers/generate/ExtrudeModifier.d.ts.map +1 -0
  47. package/dist/modifiers/generate/ExtrudeModifier.js +96 -0
  48. package/dist/modifiers/generate/ExtrudeModifier.js.map +1 -0
  49. package/dist/modifiers/generate/MirrorModifier.d.ts +35 -0
  50. package/dist/modifiers/generate/MirrorModifier.d.ts.map +1 -0
  51. package/dist/modifiers/generate/MirrorModifier.js +122 -0
  52. package/dist/modifiers/generate/MirrorModifier.js.map +1 -0
  53. package/dist/modifiers/generate/OceanModifier.d.ts +64 -0
  54. package/dist/modifiers/generate/OceanModifier.d.ts.map +1 -0
  55. package/dist/modifiers/generate/OceanModifier.js +279 -0
  56. package/dist/modifiers/generate/OceanModifier.js.map +1 -0
  57. package/dist/modifiers/generate/SolidifyModifier.d.ts +21 -0
  58. package/dist/modifiers/generate/SolidifyModifier.d.ts.map +1 -0
  59. package/dist/modifiers/generate/SolidifyModifier.js +92 -0
  60. package/dist/modifiers/generate/SolidifyModifier.js.map +1 -0
  61. package/dist/modifiers/generate/SubdivisionModifier.d.ts +27 -0
  62. package/dist/modifiers/generate/SubdivisionModifier.d.ts.map +1 -0
  63. package/dist/modifiers/generate/SubdivisionModifier.js +181 -0
  64. package/dist/modifiers/generate/SubdivisionModifier.js.map +1 -0
  65. package/dist/modifiers/generate/WireframeModifier.d.ts +21 -0
  66. package/dist/modifiers/generate/WireframeModifier.d.ts.map +1 -0
  67. package/dist/modifiers/generate/WireframeModifier.js +139 -0
  68. package/dist/modifiers/generate/WireframeModifier.js.map +1 -0
  69. package/dist/modifiers/transform/NormalRecalculateModifier.d.ts +18 -0
  70. package/dist/modifiers/transform/NormalRecalculateModifier.d.ts.map +1 -0
  71. package/dist/modifiers/transform/NormalRecalculateModifier.js +24 -0
  72. package/dist/modifiers/transform/NormalRecalculateModifier.js.map +1 -0
  73. package/dist/modifiers/transform/UVProjectionModifier.d.ts +35 -0
  74. package/dist/modifiers/transform/UVProjectionModifier.d.ts.map +1 -0
  75. package/dist/modifiers/transform/UVProjectionModifier.js +88 -0
  76. package/dist/modifiers/transform/UVProjectionModifier.js.map +1 -0
  77. package/dist/utils/noise.d.ts +3 -0
  78. package/dist/utils/noise.d.ts.map +1 -0
  79. package/dist/utils/noise.js +17 -0
  80. package/dist/utils/noise.js.map +1 -0
  81. package/package.json +47 -0
@@ -0,0 +1 @@
1
+ {"version":3,"file":"ShrinkwrapModifier.js","sourceRoot":"","sources":["../../../src/modifiers/deform/ShrinkwrapModifier.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,24 @@
1
+ import { BufferGeometry } from 'three';
2
+ import { BaseModifier } from '../../core/BaseModifier.js';
3
+ export type TwistAxis = 'x' | 'y' | 'z';
4
+ export interface TwistModifierOptions {
5
+ angle?: number;
6
+ axis?: TwistAxis;
7
+ }
8
+ /**
9
+ * Twist Modifier — Blender "Simple Deform" (Twist mode) equivalent.
10
+ * Rotates vertices around an axis by an amount proportional to their position along that axis.
11
+ * Vertices at one end are unrotated; vertices at the other end are rotated by `angle` radians.
12
+ *
13
+ * parameters.angle: total twist in radians (Math.PI * 2 = one full revolution)
14
+ */
15
+ export declare class TwistModifier extends BaseModifier {
16
+ get name(): string;
17
+ parameters: Record<string, number>;
18
+ axis: TwistAxis;
19
+ constructor(options?: TwistModifierOptions);
20
+ apply(geometry: BufferGeometry): BufferGeometry;
21
+ private _axisVal;
22
+ private _rotate;
23
+ }
24
+ //# sourceMappingURL=TwistModifier.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"TwistModifier.d.ts","sourceRoot":"","sources":["../../../src/modifiers/deform/TwistModifier.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,cAAc,EAAmB,MAAM,OAAO,CAAA;AACvD,OAAO,EAAE,YAAY,EAAE,MAAM,4BAA4B,CAAA;AAEzD,MAAM,MAAM,SAAS,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,CAAA;AAEvC,MAAM,WAAW,oBAAoB;IACnC,KAAK,CAAC,EAAE,MAAM,CAAA;IACd,IAAI,CAAC,EAAG,SAAS,CAAA;CAClB;AAED;;;;;;GAMG;AACH,qBAAa,aAAc,SAAQ,YAAY;IAC7C,IAAI,IAAI,WAAqB;IAE7B,UAAU,EAAE,MAAM,CAAC,MAAM,EAAE,MAAM,CAAC,CAAA;IAClC,IAAI,EAAE,SAAS,CAAA;gBAEH,OAAO,GAAE,oBAAyB;IAM9C,KAAK,CAAC,QAAQ,EAAE,cAAc,GAAG,cAAc;IA0C/C,OAAO,CAAC,QAAQ;IAMhB,OAAO,CAAC,OAAO;CAKhB"}
@@ -0,0 +1,76 @@
1
+ import { BufferGeometry, BufferAttribute } from 'three';
2
+ import { BaseModifier } from '../../core/BaseModifier.js';
3
+ /**
4
+ * Twist Modifier — Blender "Simple Deform" (Twist mode) equivalent.
5
+ * Rotates vertices around an axis by an amount proportional to their position along that axis.
6
+ * Vertices at one end are unrotated; vertices at the other end are rotated by `angle` radians.
7
+ *
8
+ * parameters.angle: total twist in radians (Math.PI * 2 = one full revolution)
9
+ */
10
+ export class TwistModifier extends BaseModifier {
11
+ get name() { return 'Twist'; }
12
+ constructor(options = {}) {
13
+ super();
14
+ this.parameters = { angle: options.angle ?? Math.PI };
15
+ this.axis = options.axis ?? 'y';
16
+ }
17
+ apply(geometry) {
18
+ const angle = this.parameters.angle;
19
+ const srcPos = geometry.getAttribute('position');
20
+ const srcNorm = geometry.getAttribute('normal');
21
+ const srcUv = geometry.getAttribute('uv');
22
+ const srcIdx = geometry.getIndex();
23
+ const vCount = srcPos.count;
24
+ // Find axis extent for normalizing twist amount
25
+ let min = Infinity, max = -Infinity;
26
+ for (let v = 0; v < vCount; v++) {
27
+ const val = this._axisVal(srcPos, v);
28
+ if (val < min)
29
+ min = val;
30
+ if (val > max)
31
+ max = val;
32
+ }
33
+ const range = max - min || 1;
34
+ const outPos = new Float32Array(vCount * 3);
35
+ const outNorm = srcNorm ? new Float32Array(vCount * 3) : null;
36
+ for (let v = 0; v < vCount; v++) {
37
+ const t = (this._axisVal(srcPos, v) - min) / range;
38
+ const a = t * angle;
39
+ const cos = Math.cos(a), sin = Math.sin(a);
40
+ const [px, py, pz] = this._rotate(srcPos.getX(v), srcPos.getY(v), srcPos.getZ(v), cos, sin);
41
+ outPos[v * 3] = px;
42
+ outPos[v * 3 + 1] = py;
43
+ outPos[v * 3 + 2] = pz;
44
+ if (srcNorm && outNorm) {
45
+ const [nx, ny, nz] = this._rotate(srcNorm.getX(v), srcNorm.getY(v), srcNorm.getZ(v), cos, sin);
46
+ outNorm[v * 3] = nx;
47
+ outNorm[v * 3 + 1] = ny;
48
+ outNorm[v * 3 + 2] = nz;
49
+ }
50
+ }
51
+ const result = new BufferGeometry();
52
+ result.setAttribute('position', new BufferAttribute(outPos, 3));
53
+ if (outNorm)
54
+ result.setAttribute('normal', new BufferAttribute(outNorm, 3));
55
+ if (srcUv)
56
+ result.setAttribute('uv', srcUv.clone());
57
+ if (srcIdx)
58
+ result.setIndex(srcIdx.clone());
59
+ return result;
60
+ }
61
+ _axisVal(pos, v) {
62
+ if (this.axis === 'x')
63
+ return pos.getX(v);
64
+ if (this.axis === 'z')
65
+ return pos.getZ(v);
66
+ return pos.getY(v);
67
+ }
68
+ _rotate(x, y, z, cos, sin) {
69
+ if (this.axis === 'y')
70
+ return [x * cos - z * sin, y, x * sin + z * cos];
71
+ if (this.axis === 'x')
72
+ return [x, y * cos - z * sin, y * sin + z * cos];
73
+ return [x * cos - y * sin, x * sin + y * cos, z];
74
+ }
75
+ }
76
+ //# sourceMappingURL=TwistModifier.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"TwistModifier.js","sourceRoot":"","sources":["../../../src/modifiers/deform/TwistModifier.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,cAAc,EAAE,eAAe,EAAE,MAAM,OAAO,CAAA;AACvD,OAAO,EAAE,YAAY,EAAE,MAAM,4BAA4B,CAAA;AASzD;;;;;;GAMG;AACH,MAAM,OAAO,aAAc,SAAQ,YAAY;IAC7C,IAAI,IAAI,KAAK,OAAO,OAAO,CAAA,CAAC,CAAC;IAK7B,YAAY,UAAgC,EAAE;QAC5C,KAAK,EAAE,CAAA;QACP,IAAI,CAAC,UAAU,GAAG,EAAE,KAAK,EAAE,OAAO,CAAC,KAAK,IAAI,IAAI,CAAC,EAAE,EAAE,CAAA;QACrD,IAAI,CAAC,IAAI,GAAS,OAAO,CAAC,IAAI,IAAI,GAAG,CAAA;IACvC,CAAC;IAED,KAAK,CAAC,QAAwB;QAC5B,MAAM,KAAK,GAAK,IAAI,CAAC,UAAU,CAAC,KAAK,CAAA;QACrC,MAAM,MAAM,GAAI,QAAQ,CAAC,YAAY,CAAC,UAAU,CAAC,CAAA;QACjD,MAAM,OAAO,GAAG,QAAQ,CAAC,YAAY,CAAC,QAAQ,CAAC,CAAA;QAC/C,MAAM,KAAK,GAAK,QAAQ,CAAC,YAAY,CAAC,IAAI,CAAC,CAAA;QAC3C,MAAM,MAAM,GAAI,QAAQ,CAAC,QAAQ,EAAE,CAAA;QACnC,MAAM,MAAM,GAAI,MAAM,CAAC,KAAK,CAAA;QAE5B,gDAAgD;QAChD,IAAI,GAAG,GAAG,QAAQ,EAAE,GAAG,GAAG,CAAC,QAAQ,CAAA;QACnC,KAAK,IAAI,CAAC,GAAG,CAAC,EAAE,CAAC,GAAG,MAAM,EAAE,CAAC,EAAE,EAAE,CAAC;YAChC,MAAM,GAAG,GAAG,IAAI,CAAC,QAAQ,CAAC,MAAM,EAAE,CAAC,CAAC,CAAA;YACpC,IAAI,GAAG,GAAG,GAAG;gBAAE,GAAG,GAAG,GAAG,CAAA;YACxB,IAAI,GAAG,GAAG,GAAG;gBAAE,GAAG,GAAG,GAAG,CAAA;QAC1B,CAAC;QACD,MAAM,KAAK,GAAG,GAAG,GAAG,GAAG,IAAI,CAAC,CAAA;QAE5B,MAAM,MAAM,GAAI,IAAI,YAAY,CAAC,MAAM,GAAG,CAAC,CAAC,CAAA;QAC5C,MAAM,OAAO,GAAG,OAAO,CAAC,CAAC,CAAC,IAAI,YAAY,CAAC,MAAM,GAAG,CAAC,CAAC,CAAC,CAAC,CAAC,IAAI,CAAA;QAE7D,KAAK,IAAI,CAAC,GAAG,CAAC,EAAE,CAAC,GAAG,MAAM,EAAE,CAAC,EAAE,EAAE,CAAC;YAChC,MAAM,CAAC,GAAK,CAAC,IAAI,CAAC,QAAQ,CAAC,MAAM,EAAE,CAAC,CAAC,GAAG,GAAG,CAAC,GAAG,KAAK,CAAA;YACpD,MAAM,CAAC,GAAK,CAAC,GAAG,KAAK,CAAA;YACrB,MAAM,GAAG,GAAG,IAAI,CAAC,GAAG,CAAC,CAAC,CAAC,EAAE,GAAG,GAAG,IAAI,CAAC,GAAG,CAAC,CAAC,CAAC,CAAA;YAE1C,MAAM,CAAC,EAAE,EAAE,EAAE,EAAE,EAAE,CAAC,GAAG,IAAI,CAAC,OAAO,CAAC,MAAM,CAAC,IAAI,CAAC,CAAC,CAAC,EAAE,MAAM,CAAC,IAAI,CAAC,CAAC,CAAC,EAAE,MAAM,CAAC,IAAI,CAAC,CAAC,CAAC,EAAE,GAAG,EAAE,GAAG,CAAC,CAAA;YAC3F,MAAM,CAAC,CAAC,GAAC,CAAC,CAAC,GAAG,EAAE,CAAC;YAAC,MAAM,CAAC,CAAC,GAAC,CAAC,GAAC,CAAC,CAAC,GAAG,EAAE,CAAC;YAAC,MAAM,CAAC,CAAC,GAAC,CAAC,GAAC,CAAC,CAAC,GAAG,EAAE,CAAA;YAExD,IAAI,OAAO,IAAI,OAAO,EAAE,CAAC;gBACvB,MAAM,CAAC,EAAE,EAAE,EAAE,EAAE,EAAE,CAAC,GAAG,IAAI,CAAC,OAAO,CAAC,OAAO,CAAC,IAAI,CAAC,CAAC,CAAC,EAAE,OAAO,CAAC,IAAI,CAAC,CAAC,CAAC,EAAE,OAAO,CAAC,IAAI,CAAC,CAAC,CAAC,EAAE,GAAG,EAAE,GAAG,CAAC,CAAA;gBAC9F,OAAO,CAAC,CAAC,GAAC,CAAC,CAAC,GAAG,EAAE,CAAC;gBAAC,OAAO,CAAC,CAAC,GAAC,CAAC,GAAC,CAAC,CAAC,GAAG,EAAE,CAAC;gBAAC,OAAO,CAAC,CAAC,GAAC,CAAC,GAAC,CAAC,CAAC,GAAG,EAAE,CAAA;YAC7D,CAAC;QACH,CAAC;QAED,MAAM,MAAM,GAAG,IAAI,cAAc,EAAE,CAAA;QACnC,MAAM,CAAC,YAAY,CAAC,UAAU,EAAE,IAAI,eAAe,CAAC,MAAM,EAAE,CAAC,CAAC,CAAC,CAAA;QAC/D,IAAI,OAAO;YAAE,MAAM,CAAC,YAAY,CAAC,QAAQ,EAAE,IAAI,eAAe,CAAC,OAAO,EAAE,CAAC,CAAC,CAAC,CAAA;QAC3E,IAAI,KAAK;YAAI,MAAM,CAAC,YAAY,CAAC,IAAI,EAAE,KAAK,CAAC,KAAK,EAAE,CAAC,CAAA;QACrD,IAAI,MAAM;YAAG,MAAM,CAAC,QAAQ,CAAC,MAAM,CAAC,KAAK,EAAE,CAAC,CAAA;QAC5C,OAAO,MAAM,CAAA;IACf,CAAC;IAEO,QAAQ,CAAC,GAA+C,EAAE,CAAS;QACzE,IAAI,IAAI,CAAC,IAAI,KAAK,GAAG;YAAE,OAAO,GAAG,CAAC,IAAI,CAAC,CAAC,CAAC,CAAA;QACzC,IAAI,IAAI,CAAC,IAAI,KAAK,GAAG;YAAE,OAAO,GAAG,CAAC,IAAI,CAAC,CAAC,CAAC,CAAA;QACzC,OAAO,GAAG,CAAC,IAAI,CAAC,CAAC,CAAC,CAAA;IACpB,CAAC;IAEO,OAAO,CAAC,CAAS,EAAE,CAAS,EAAE,CAAS,EAAE,GAAW,EAAE,GAAW;QACvE,IAAI,IAAI,CAAC,IAAI,KAAK,GAAG;YAAE,OAAO,CAAC,CAAC,GAAC,GAAG,GAAG,CAAC,GAAC,GAAG,EAAE,CAAC,EAAE,CAAC,GAAC,GAAG,GAAG,CAAC,GAAC,GAAG,CAAC,CAAA;QAC/D,IAAI,IAAI,CAAC,IAAI,KAAK,GAAG;YAAE,OAAO,CAAC,CAAC,EAAE,CAAC,GAAC,GAAG,GAAG,CAAC,GAAC,GAAG,EAAE,CAAC,GAAC,GAAG,GAAG,CAAC,GAAC,GAAG,CAAC,CAAA;QAC/D,OAAO,CAAC,CAAC,GAAC,GAAG,GAAG,CAAC,GAAC,GAAG,EAAE,CAAC,GAAC,GAAG,GAAG,CAAC,GAAC,GAAG,EAAE,CAAC,CAAC,CAAA;IAC1C,CAAC;CACF"}
@@ -0,0 +1,33 @@
1
+ import { BufferGeometry } from 'three';
2
+ import { BaseModifier } from '../../core/BaseModifier.js';
3
+ export interface WarpModifierOptions {
4
+ /** Center of the warp influence (source point). */
5
+ fromX?: number;
6
+ fromY?: number;
7
+ fromZ?: number;
8
+ /** Target point — vertices near fromPoint are pulled toward this. */
9
+ toX?: number;
10
+ toY?: number;
11
+ toZ?: number;
12
+ /** Radius of influence — vertices outside this radius are unaffected. */
13
+ radius?: number;
14
+ /** Warp strength [0, 1]. */
15
+ strength?: number;
16
+ }
17
+ /**
18
+ * Warp Modifier — Blender "Warp" modifier equivalent.
19
+ * Pulls vertices near a source point toward a target point.
20
+ * Influence falls off smoothly beyond the radius.
21
+ *
22
+ * parameters.fromX/Y/Z: source point
23
+ * parameters.toX/Y/Z: target point
24
+ * parameters.radius: influence radius
25
+ * parameters.strength: warp intensity [0, 1]
26
+ */
27
+ export declare class WarpModifier extends BaseModifier {
28
+ get name(): string;
29
+ parameters: Record<string, number>;
30
+ constructor(options?: WarpModifierOptions);
31
+ apply(geometry: BufferGeometry): BufferGeometry;
32
+ }
33
+ //# sourceMappingURL=WarpModifier.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"WarpModifier.d.ts","sourceRoot":"","sources":["../../../src/modifiers/deform/WarpModifier.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,cAAc,EAA4B,MAAM,OAAO,CAAA;AAChE,OAAO,EAAE,YAAY,EAAE,MAAM,4BAA4B,CAAA;AAEzD,MAAM,WAAW,mBAAmB;IAClC,mDAAmD;IACnD,KAAK,CAAC,EAAE,MAAM,CAAC;IAAC,KAAK,CAAC,EAAE,MAAM,CAAC;IAAC,KAAK,CAAC,EAAE,MAAM,CAAA;IAC9C,qEAAqE;IACrE,GAAG,CAAC,EAAI,MAAM,CAAC;IAAC,GAAG,CAAC,EAAI,MAAM,CAAC;IAAC,GAAG,CAAC,EAAI,MAAM,CAAA;IAC9C,yEAAyE;IACzE,MAAM,CAAC,EAAE,MAAM,CAAA;IACf,4BAA4B;IAC5B,QAAQ,CAAC,EAAE,MAAM,CAAA;CAClB;AAED;;;;;;;;;GASG;AACH,qBAAa,YAAa,SAAQ,YAAY;IAC5C,IAAI,IAAI,WAAoB;IAE5B,UAAU,EAAE,MAAM,CAAC,MAAM,EAAE,MAAM,CAAC,CAAA;gBAEtB,OAAO,GAAE,mBAAwB;IAc7C,KAAK,CAAC,QAAQ,EAAE,cAAc,GAAG,cAAc;CAqChD"}
@@ -0,0 +1,61 @@
1
+ import { BufferGeometry, BufferAttribute } from 'three';
2
+ import { BaseModifier } from '../../core/BaseModifier.js';
3
+ /**
4
+ * Warp Modifier — Blender "Warp" modifier equivalent.
5
+ * Pulls vertices near a source point toward a target point.
6
+ * Influence falls off smoothly beyond the radius.
7
+ *
8
+ * parameters.fromX/Y/Z: source point
9
+ * parameters.toX/Y/Z: target point
10
+ * parameters.radius: influence radius
11
+ * parameters.strength: warp intensity [0, 1]
12
+ */
13
+ export class WarpModifier extends BaseModifier {
14
+ get name() { return 'Warp'; }
15
+ constructor(options = {}) {
16
+ super();
17
+ this.parameters = {
18
+ fromX: options.fromX ?? 0,
19
+ fromY: options.fromY ?? 0,
20
+ fromZ: options.fromZ ?? 0,
21
+ toX: options.toX ?? 1,
22
+ toY: options.toY ?? 0,
23
+ toZ: options.toZ ?? 0,
24
+ radius: options.radius ?? 1.0,
25
+ strength: options.strength ?? 1.0,
26
+ };
27
+ }
28
+ apply(geometry) {
29
+ const { fromX, fromY, fromZ, toX, toY, toZ, radius, strength } = this.parameters;
30
+ const srcPos = geometry.getAttribute('position');
31
+ const srcNorm = geometry.getAttribute('normal');
32
+ const srcUv = geometry.getAttribute('uv');
33
+ const srcIdx = geometry.getIndex();
34
+ const vCount = srcPos.count;
35
+ const outPos = new Float32Array(vCount * 3);
36
+ const dx = toX - fromX, dy = toY - fromY, dz = toZ - fromZ;
37
+ for (let v = 0; v < vCount; v++) {
38
+ const px = srcPos.getX(v), py = srcPos.getY(v), pz = srcPos.getZ(v);
39
+ // Distance from vertex to source point
40
+ const ex = px - fromX, ey = py - fromY, ez = pz - fromZ;
41
+ const dist = Math.sqrt(ex * ex + ey * ey + ez * ez);
42
+ // Smooth falloff within radius
43
+ const t = Math.max(0, 1 - dist / Math.max(radius, 1e-6));
44
+ const influence = t * t * (3 - 2 * t) * strength; // smoothstep
45
+ outPos[v * 3] = px + dx * influence;
46
+ outPos[v * 3 + 1] = py + dy * influence;
47
+ outPos[v * 3 + 2] = pz + dz * influence;
48
+ }
49
+ const result = new BufferGeometry();
50
+ result.setAttribute('position', new BufferAttribute(outPos, 3));
51
+ if (srcNorm)
52
+ result.setAttribute('normal', srcNorm.clone());
53
+ if (srcUv)
54
+ result.setAttribute('uv', srcUv.clone());
55
+ if (srcIdx)
56
+ result.setIndex(srcIdx.clone());
57
+ result.computeVertexNormals();
58
+ return result;
59
+ }
60
+ }
61
+ //# sourceMappingURL=WarpModifier.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"WarpModifier.js","sourceRoot":"","sources":["../../../src/modifiers/deform/WarpModifier.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,22 @@
1
+ import { BufferGeometry } from 'three';
2
+ import { BaseModifier } from '../../core/BaseModifier.js';
3
+ export interface ArrayModifierOptions {
4
+ count?: number;
5
+ offsetX?: number;
6
+ offsetY?: number;
7
+ offsetZ?: number;
8
+ }
9
+ /**
10
+ * Array Modifier — Blender "Array" modifier equivalent.
11
+ * Duplicates geometry N times along a fixed offset vector.
12
+ *
13
+ * parameters.count: number of copies (including the original)
14
+ * parameters.offsetX/Y/Z: distance between each copy
15
+ */
16
+ export declare class ArrayModifier extends BaseModifier {
17
+ get name(): string;
18
+ parameters: Record<string, number>;
19
+ constructor(options?: ArrayModifierOptions);
20
+ apply(geometry: BufferGeometry): BufferGeometry;
21
+ }
22
+ //# sourceMappingURL=ArrayModifier.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"ArrayModifier.d.ts","sourceRoot":"","sources":["../../../src/modifiers/generate/ArrayModifier.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,cAAc,EAAmB,MAAM,OAAO,CAAA;AACvD,OAAO,EAAE,YAAY,EAAE,MAAM,4BAA4B,CAAA;AAEzD,MAAM,WAAW,oBAAoB;IACnC,KAAK,CAAC,EAAI,MAAM,CAAA;IAChB,OAAO,CAAC,EAAE,MAAM,CAAA;IAChB,OAAO,CAAC,EAAE,MAAM,CAAA;IAChB,OAAO,CAAC,EAAE,MAAM,CAAA;CACjB;AAED;;;;;;GAMG;AACH,qBAAa,aAAc,SAAQ,YAAY;IAC7C,IAAI,IAAI,WAAqB;IAE7B,UAAU,EAAE,MAAM,CAAC,MAAM,EAAE,MAAM,CAAC,CAAA;gBAEtB,OAAO,GAAE,oBAAyB;IAU9C,KAAK,CAAC,QAAQ,EAAE,cAAc,GAAG,cAAc;CA8ChD"}
@@ -0,0 +1,65 @@
1
+ import { BufferGeometry, BufferAttribute } from 'three';
2
+ import { BaseModifier } from '../../core/BaseModifier.js';
3
+ /**
4
+ * Array Modifier — Blender "Array" modifier equivalent.
5
+ * Duplicates geometry N times along a fixed offset vector.
6
+ *
7
+ * parameters.count: number of copies (including the original)
8
+ * parameters.offsetX/Y/Z: distance between each copy
9
+ */
10
+ export class ArrayModifier extends BaseModifier {
11
+ get name() { return 'Array'; }
12
+ constructor(options = {}) {
13
+ super();
14
+ this.parameters = {
15
+ count: Math.round(options.count ?? 2),
16
+ offsetX: options.offsetX ?? 1.0,
17
+ offsetY: options.offsetY ?? 0.0,
18
+ offsetZ: options.offsetZ ?? 0.0,
19
+ };
20
+ }
21
+ apply(geometry) {
22
+ const count = Math.max(1, Math.round(this.parameters.count));
23
+ const offX = this.parameters.offsetX;
24
+ const offY = this.parameters.offsetY;
25
+ const offZ = this.parameters.offsetZ;
26
+ const srcPos = geometry.getAttribute('position');
27
+ const srcNorm = geometry.getAttribute('normal');
28
+ const srcUv = geometry.getAttribute('uv');
29
+ const srcIdx = geometry.getIndex();
30
+ const vCount = srcPos.count;
31
+ const outPos = [];
32
+ const outNorm = [];
33
+ const outUv = [];
34
+ const outIdx = [];
35
+ for (let i = 0; i < count; i++) {
36
+ const dx = offX * i, dy = offY * i, dz = offZ * i;
37
+ for (let v = 0; v < vCount; v++) {
38
+ outPos.push(srcPos.getX(v) + dx, srcPos.getY(v) + dy, srcPos.getZ(v) + dz);
39
+ if (srcNorm)
40
+ outNorm.push(srcNorm.getX(v), srcNorm.getY(v), srcNorm.getZ(v));
41
+ if (srcUv)
42
+ outUv.push(srcUv.getX(v), srcUv.getY(v));
43
+ }
44
+ const base = i * vCount;
45
+ if (srcIdx) {
46
+ const ia = srcIdx.array;
47
+ for (let t = 0; t < ia.length; t++)
48
+ outIdx.push(ia[t] + base);
49
+ }
50
+ else {
51
+ for (let t = 0; t < vCount; t++)
52
+ outIdx.push(t + base);
53
+ }
54
+ }
55
+ const result = new BufferGeometry();
56
+ result.setAttribute('position', new BufferAttribute(new Float32Array(outPos), 3));
57
+ if (outNorm.length)
58
+ result.setAttribute('normal', new BufferAttribute(new Float32Array(outNorm), 3));
59
+ if (outUv.length)
60
+ result.setAttribute('uv', new BufferAttribute(new Float32Array(outUv), 2));
61
+ result.setIndex(new BufferAttribute(new Uint32Array(outIdx), 1));
62
+ return result;
63
+ }
64
+ }
65
+ //# sourceMappingURL=ArrayModifier.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"ArrayModifier.js","sourceRoot":"","sources":["../../../src/modifiers/generate/ArrayModifier.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,31 @@
1
+ import { BufferGeometry } from 'three';
2
+ import { BaseModifier } from '../../core/BaseModifier.js';
3
+ export interface BevelModifierOptions {
4
+ width?: number;
5
+ segments?: number;
6
+ angleThreshold?: number;
7
+ }
8
+ /**
9
+ * Bevel Modifier — Blender "Bevel" modifier equivalent (chamfer variant).
10
+ * Inserts additional vertices along hard edges (angle > angleThreshold),
11
+ * producing a flat chamfer bevel. segments=1 produces a single new edge loop
12
+ * per side (a chamfer); higher values produce more rounded bevels.
13
+ *
14
+ * parameters.width: chamfer width
15
+ * parameters.segments: edge loops per bevel side (1–4)
16
+ * parameters.angleThreshold: minimum dihedral angle (degrees) to bevel
17
+ *
18
+ * Algorithm:
19
+ * 1. Build per-face normals and an edge→faces adjacency map.
20
+ * 2. Identify "hard" edges where adjacent faces exceed angleThreshold.
21
+ * 3. For each hard edge, split each endpoint vertex into separate copies
22
+ * displaced along the edge direction, forming the chamfer geometry.
23
+ * 4. Rebuild index, compute vertex normals.
24
+ */
25
+ export declare class BevelModifier extends BaseModifier {
26
+ get name(): string;
27
+ parameters: Record<string, number>;
28
+ constructor(options?: BevelModifierOptions);
29
+ apply(geometry: BufferGeometry): BufferGeometry;
30
+ }
31
+ //# sourceMappingURL=BevelModifier.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"BevelModifier.d.ts","sourceRoot":"","sources":["../../../src/modifiers/generate/BevelModifier.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,cAAc,EAA4B,MAAM,OAAO,CAAA;AAChE,OAAO,EAAE,YAAY,EAAE,MAAM,4BAA4B,CAAA;AAEzD,MAAM,WAAW,oBAAoB;IACnC,KAAK,CAAC,EAAW,MAAM,CAAA;IACvB,QAAQ,CAAC,EAAQ,MAAM,CAAA;IACvB,cAAc,CAAC,EAAE,MAAM,CAAA;CACxB;AAED;;;;;;;;;;;;;;;;GAgBG;AACH,qBAAa,aAAc,SAAQ,YAAY;IAC7C,IAAI,IAAI,WAAqB;IAE7B,UAAU,EAAE,MAAM,CAAC,MAAM,EAAE,MAAM,CAAC,CAAA;gBAEtB,OAAO,GAAE,oBAAyB;IAS9C,KAAK,CAAC,QAAQ,EAAE,cAAc,GAAG,cAAc;CA+OhD"}
@@ -0,0 +1,234 @@
1
+ import { BufferGeometry, BufferAttribute, Vector3 } from 'three';
2
+ import { BaseModifier } from '../../core/BaseModifier.js';
3
+ /**
4
+ * Bevel Modifier — Blender "Bevel" modifier equivalent (chamfer variant).
5
+ * Inserts additional vertices along hard edges (angle > angleThreshold),
6
+ * producing a flat chamfer bevel. segments=1 produces a single new edge loop
7
+ * per side (a chamfer); higher values produce more rounded bevels.
8
+ *
9
+ * parameters.width: chamfer width
10
+ * parameters.segments: edge loops per bevel side (1–4)
11
+ * parameters.angleThreshold: minimum dihedral angle (degrees) to bevel
12
+ *
13
+ * Algorithm:
14
+ * 1. Build per-face normals and an edge→faces adjacency map.
15
+ * 2. Identify "hard" edges where adjacent faces exceed angleThreshold.
16
+ * 3. For each hard edge, split each endpoint vertex into separate copies
17
+ * displaced along the edge direction, forming the chamfer geometry.
18
+ * 4. Rebuild index, compute vertex normals.
19
+ */
20
+ export class BevelModifier extends BaseModifier {
21
+ get name() { return 'Bevel'; }
22
+ constructor(options = {}) {
23
+ super();
24
+ this.parameters = {
25
+ width: options.width ?? 0.1,
26
+ segments: Math.round(Math.max(1, Math.min(4, options.segments ?? 1))),
27
+ angleThreshold: options.angleThreshold ?? 30,
28
+ };
29
+ }
30
+ apply(geometry) {
31
+ const width = Math.max(0, this.parameters.width);
32
+ const segments = Math.round(Math.max(1, Math.min(4, this.parameters.segments)));
33
+ const threshold = (this.parameters.angleThreshold * Math.PI) / 180;
34
+ const srcPos = geometry.getAttribute('position');
35
+ const srcUv = geometry.getAttribute('uv');
36
+ const srcIdx = geometry.getIndex();
37
+ const vCount = srcPos.count;
38
+ // ── Flatten to triangle list ───────────────────────────────────────────────
39
+ const tris = [];
40
+ if (srcIdx) {
41
+ const ia = srcIdx.array;
42
+ for (let i = 0; i < ia.length; i += 3)
43
+ tris.push([ia[i], ia[i + 1], ia[i + 2]]);
44
+ }
45
+ else {
46
+ for (let i = 0; i < vCount; i += 3)
47
+ tris.push([i, i + 1, i + 2]);
48
+ }
49
+ const getP = (i) => new Vector3(srcPos.getX(i), srcPos.getY(i), srcPos.getZ(i));
50
+ // ── Position-weld: map each vertex index to a canonical "weld index" ───────
51
+ // Needed because non-welded meshes (e.g. BoxGeometry) duplicate vertices at
52
+ // shared corners — index-based edge keys would miss shared edges entirely.
53
+ const EPS = 1e-5;
54
+ const posKey = (i) => {
55
+ const x = Math.round(srcPos.getX(i) / EPS);
56
+ const y = Math.round(srcPos.getY(i) / EPS);
57
+ const z = Math.round(srcPos.getZ(i) / EPS);
58
+ return `${x},${y},${z}`;
59
+ };
60
+ const posToWeld = new Map();
61
+ const weld = new Array(vCount);
62
+ for (let i = 0; i < vCount; i++) {
63
+ const k = posKey(i);
64
+ if (!posToWeld.has(k))
65
+ posToWeld.set(k, i);
66
+ weld[i] = posToWeld.get(k);
67
+ }
68
+ // ── Per-face normals ───────────────────────────────────────────────────────
69
+ const faceNormals = tris.map(([a, b, c]) => {
70
+ const ab = getP(b).sub(getP(a));
71
+ const ac = getP(c).sub(getP(a));
72
+ return ab.cross(ac).normalize();
73
+ });
74
+ const edgeFaces = new Map(); // edge key → [faceIndex, ...]
75
+ const edgeKey = (a, b) => {
76
+ const wa = weld[a], wb = weld[b];
77
+ return wa < wb ? `${wa}_${wb}` : `${wb}_${wa}`;
78
+ };
79
+ for (let fi = 0; fi < tris.length; fi++) {
80
+ const [a, b, c] = tris[fi];
81
+ for (const [e0, e1] of [[a, b], [b, c], [c, a]]) {
82
+ const key = edgeKey(e0, e1);
83
+ if (!edgeFaces.has(key))
84
+ edgeFaces.set(key, []);
85
+ edgeFaces.get(key).push(fi);
86
+ }
87
+ }
88
+ // ── Identify hard edges ────────────────────────────────────────────────────
89
+ const hardEdges = new Set();
90
+ for (const [key, faces] of edgeFaces.entries()) {
91
+ if (faces.length < 2)
92
+ continue; // boundary edge — skip
93
+ const n0 = faceNormals[faces[0]];
94
+ const n1 = faceNormals[faces[1]];
95
+ const dot = Math.max(-1, Math.min(1, n0.dot(n1)));
96
+ const angle = Math.acos(dot);
97
+ if (angle > threshold)
98
+ hardEdges.add(key);
99
+ }
100
+ if (hardEdges.size === 0) {
101
+ // No hard edges — return a copy
102
+ return geometry.clone();
103
+ }
104
+ // ── Build output as unindexed triangles ───────────────────────────────────
105
+ // Strategy: re-emit all original faces, replacing vertices on hard edges
106
+ // with chamfered versions that pull the face corner inward by `width`.
107
+ // For each triangle face, for each of its 3 edges:
108
+ // If that edge is hard, we need to "pull back" the two vertices of that
109
+ // edge within this face: offset each vertex along the direction toward
110
+ // the opposite vertex of that edge (i.e. the edge tangent direction
111
+ // projected perpendicular to the edge, within the face plane).
112
+ // We build a map: for each (face, vertex) pair that sits on a hard edge,
113
+ // what is the displacement vector?
114
+ // A vertex in a face can be on multiple hard edges → accumulate displacements.
115
+ // Step 1: For each face vertex on a hard edge, compute the inward offset
116
+ // direction: direction from vertex along each hard edge emanating from it.
117
+ const outPos = [];
118
+ const outUv = [];
119
+ const outIdx = [];
120
+ // We will generate the bevel polygons (the chamfer faces between the
121
+ // two pulled-back faces sharing a hard edge) as additional quads.
122
+ // --- Pass 1: For each face, compute per-vertex offsets due to hard edges.
123
+ // displaced[fi][localVi] = accumulated offset Vector3
124
+ const displaced = tris.map(() => [new Vector3(), new Vector3(), new Vector3()]);
125
+ for (const key of hardEdges) {
126
+ const [wva, wvb] = key.split('_').map(Number);
127
+ // Weld indices — use getP with the weld index directly (position is identical)
128
+ const pa = getP(wva), pb = getP(wvb);
129
+ const edgeDir = pb.clone().sub(pa).normalize();
130
+ // For every face containing this edge, offset the two vertices inward
131
+ const faces = edgeFaces.get(key);
132
+ for (const fi of faces) {
133
+ const [ta, tb, tc] = tris[fi];
134
+ for (const [ei, ej] of [[ta, tb], [tb, tc], [tc, ta]]) {
135
+ if (edgeKey(ei, ej) !== key)
136
+ continue;
137
+ // ei and ej are the two endpoints of this hard edge in face fi
138
+ // The "inward" direction for ei: from ei toward ej, projected into the face plane
139
+ const localEiIdx = tris[fi].indexOf(ei);
140
+ const localEjIdx = tris[fi].indexOf(ej);
141
+ // Inward offset direction for ei: along edgeDir toward ej
142
+ const dirItoJ = edgeDir.clone();
143
+ displaced[fi][localEiIdx].addScaledVector(dirItoJ, width);
144
+ // Inward offset direction for ej: along -edgeDir toward ei
145
+ displaced[fi][localEjIdx].addScaledVector(dirItoJ, -width);
146
+ }
147
+ }
148
+ }
149
+ const faceVertices = [];
150
+ for (let fi = 0; fi < tris.length; fi++) {
151
+ const [a, b, c] = tris[fi];
152
+ const verts = [a, b, c];
153
+ const faceVerts = [];
154
+ for (let lv = 0; lv < 3; lv++) {
155
+ const vi = verts[lv];
156
+ const base = getP(vi);
157
+ base.add(displaced[fi][lv]);
158
+ const idx = outPos.length / 3;
159
+ outPos.push(base.x, base.y, base.z);
160
+ if (srcUv)
161
+ outUv.push(srcUv.getX(vi), srcUv.getY(vi));
162
+ else
163
+ outUv.push(0, 0);
164
+ faceVerts.push(idx);
165
+ }
166
+ faceVertices.push(faceVerts);
167
+ // Emit triangle
168
+ const base = outIdx.length;
169
+ outIdx.push(faceVerts[0], faceVerts[1], faceVerts[2]);
170
+ }
171
+ // --- Pass 3: For each hard edge, emit the chamfer polygon connecting the two
172
+ // pulled-back edge positions from adjacent faces.
173
+ for (const key of hardEdges) {
174
+ const faces = edgeFaces.get(key);
175
+ if (faces.length < 2)
176
+ continue;
177
+ const [wva, wvb] = key.split('_').map(Number);
178
+ // Find the local indices of va/vb in each face by matching weld indices
179
+ const getLocalIdx = (fi, wv) => tris[fi].findIndex(v => weld[v] === wv);
180
+ const fi0 = faces[0], fi1 = faces[1];
181
+ const li0a = getLocalIdx(fi0, wva), li0b = getLocalIdx(fi0, wvb);
182
+ const li1a = getLocalIdx(fi1, wva), li1b = getLocalIdx(fi1, wvb);
183
+ const p0a = faceVertices[fi0][li0a]; // face 0, vertex at 'va' end
184
+ const p0b = faceVertices[fi0][li0b]; // face 0, vertex at 'vb' end
185
+ const p1a = faceVertices[fi1][li1a]; // face 1, vertex at 'va' end
186
+ const p1b = faceVertices[fi1][li1b]; // face 1, vertex at 'vb' end
187
+ if (segments === 1) {
188
+ // Single chamfer: one quad = 2 triangles
189
+ // Winding: the chamfer face should face outward (between the two original faces)
190
+ outIdx.push(p0a, p1a, p0b);
191
+ outIdx.push(p1a, p1b, p0b);
192
+ }
193
+ else {
194
+ // Multi-segment bevel: interpolate between the pulled-back positions
195
+ // For each segment, emit a strip row
196
+ const getVec = (idx) => new Vector3(outPos[idx * 3], outPos[idx * 3 + 1], outPos[idx * 3 + 2]);
197
+ const rowCount = segments + 1;
198
+ // Build a grid of rowCount rows, 2 columns (va side, vb side)
199
+ // Row 0 = face0 positions, Row segments = face1 positions
200
+ const grid = []; // grid[row][0=va, 1=vb] → outPos index
201
+ for (let r = 0; r <= segments; r++) {
202
+ const t = r / segments;
203
+ const rowVerts = [];
204
+ for (let side = 0; side < 2; side++) {
205
+ const from = side === 0 ? getVec(p0a) : getVec(p0b);
206
+ const to = side === 0 ? getVec(p1a) : getVec(p1b);
207
+ const px = from.x + (to.x - from.x) * t;
208
+ const py = from.y + (to.y - from.y) * t;
209
+ const pz = from.z + (to.z - from.z) * t;
210
+ const vIdx = outPos.length / 3;
211
+ outPos.push(px, py, pz);
212
+ outUv.push(side === 0 ? 0 : 1, r / segments);
213
+ rowVerts.push(vIdx);
214
+ }
215
+ grid.push(rowVerts);
216
+ }
217
+ // Emit quads between consecutive rows
218
+ for (let r = 0; r < segments; r++) {
219
+ const va0 = grid[r][0], vb0 = grid[r][1];
220
+ const va1 = grid[r + 1][0], vb1 = grid[r + 1][1];
221
+ outIdx.push(va0, va1, vb0);
222
+ outIdx.push(va1, vb1, vb0);
223
+ }
224
+ }
225
+ }
226
+ const result = new BufferGeometry();
227
+ result.setAttribute('position', new BufferAttribute(new Float32Array(outPos), 3));
228
+ result.setAttribute('uv', new BufferAttribute(new Float32Array(outUv), 2));
229
+ result.setIndex(new BufferAttribute(new Uint32Array(outIdx), 1));
230
+ result.computeVertexNormals();
231
+ return result;
232
+ }
233
+ }
234
+ //# sourceMappingURL=BevelModifier.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"BevelModifier.js","sourceRoot":"","sources":["../../../src/modifiers/generate/BevelModifier.ts"],"names":[],"mappings":"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"}