@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.
- package/dist/core/BaseModifier.d.ts +29 -0
- package/dist/core/BaseModifier.d.ts.map +1 -0
- package/dist/core/BaseModifier.js +16 -0
- package/dist/core/BaseModifier.js.map +1 -0
- package/dist/core/ModifierStack.d.ts +40 -0
- package/dist/core/ModifierStack.d.ts.map +1 -0
- package/dist/core/ModifierStack.js +71 -0
- package/dist/core/ModifierStack.js.map +1 -0
- package/dist/index.d.ts +34 -0
- package/dist/index.d.ts.map +1 -0
- package/dist/index.js +23 -0
- package/dist/index.js.map +1 -0
- package/dist/modifiers/deform/BendModifier.d.ts +25 -0
- package/dist/modifiers/deform/BendModifier.d.ts.map +1 -0
- package/dist/modifiers/deform/BendModifier.js +83 -0
- package/dist/modifiers/deform/BendModifier.js.map +1 -0
- package/dist/modifiers/deform/DisplacementModifier.d.ts +38 -0
- package/dist/modifiers/deform/DisplacementModifier.d.ts.map +1 -0
- package/dist/modifiers/deform/DisplacementModifier.js +58 -0
- package/dist/modifiers/deform/DisplacementModifier.js.map +1 -0
- package/dist/modifiers/deform/ShrinkwrapModifier.d.ts +24 -0
- package/dist/modifiers/deform/ShrinkwrapModifier.d.ts.map +1 -0
- package/dist/modifiers/deform/ShrinkwrapModifier.js +122 -0
- package/dist/modifiers/deform/ShrinkwrapModifier.js.map +1 -0
- package/dist/modifiers/deform/TwistModifier.d.ts +24 -0
- package/dist/modifiers/deform/TwistModifier.d.ts.map +1 -0
- package/dist/modifiers/deform/TwistModifier.js +76 -0
- package/dist/modifiers/deform/TwistModifier.js.map +1 -0
- package/dist/modifiers/deform/WarpModifier.d.ts +33 -0
- package/dist/modifiers/deform/WarpModifier.d.ts.map +1 -0
- package/dist/modifiers/deform/WarpModifier.js +61 -0
- package/dist/modifiers/deform/WarpModifier.js.map +1 -0
- package/dist/modifiers/generate/ArrayModifier.d.ts +22 -0
- package/dist/modifiers/generate/ArrayModifier.d.ts.map +1 -0
- package/dist/modifiers/generate/ArrayModifier.js +65 -0
- package/dist/modifiers/generate/ArrayModifier.js.map +1 -0
- package/dist/modifiers/generate/BevelModifier.d.ts +31 -0
- package/dist/modifiers/generate/BevelModifier.d.ts.map +1 -0
- package/dist/modifiers/generate/BevelModifier.js +234 -0
- package/dist/modifiers/generate/BevelModifier.js.map +1 -0
- package/dist/modifiers/generate/BooleanModifier.d.ts +37 -0
- package/dist/modifiers/generate/BooleanModifier.d.ts.map +1 -0
- package/dist/modifiers/generate/BooleanModifier.js +71 -0
- package/dist/modifiers/generate/BooleanModifier.js.map +1 -0
- package/dist/modifiers/generate/ExtrudeModifier.d.ts +25 -0
- package/dist/modifiers/generate/ExtrudeModifier.d.ts.map +1 -0
- package/dist/modifiers/generate/ExtrudeModifier.js +96 -0
- package/dist/modifiers/generate/ExtrudeModifier.js.map +1 -0
- package/dist/modifiers/generate/MirrorModifier.d.ts +35 -0
- package/dist/modifiers/generate/MirrorModifier.d.ts.map +1 -0
- package/dist/modifiers/generate/MirrorModifier.js +122 -0
- package/dist/modifiers/generate/MirrorModifier.js.map +1 -0
- package/dist/modifiers/generate/OceanModifier.d.ts +64 -0
- package/dist/modifiers/generate/OceanModifier.d.ts.map +1 -0
- package/dist/modifiers/generate/OceanModifier.js +279 -0
- package/dist/modifiers/generate/OceanModifier.js.map +1 -0
- package/dist/modifiers/generate/SolidifyModifier.d.ts +21 -0
- package/dist/modifiers/generate/SolidifyModifier.d.ts.map +1 -0
- package/dist/modifiers/generate/SolidifyModifier.js +92 -0
- package/dist/modifiers/generate/SolidifyModifier.js.map +1 -0
- package/dist/modifiers/generate/SubdivisionModifier.d.ts +27 -0
- package/dist/modifiers/generate/SubdivisionModifier.d.ts.map +1 -0
- package/dist/modifiers/generate/SubdivisionModifier.js +181 -0
- package/dist/modifiers/generate/SubdivisionModifier.js.map +1 -0
- package/dist/modifiers/generate/WireframeModifier.d.ts +21 -0
- package/dist/modifiers/generate/WireframeModifier.d.ts.map +1 -0
- package/dist/modifiers/generate/WireframeModifier.js +139 -0
- package/dist/modifiers/generate/WireframeModifier.js.map +1 -0
- package/dist/modifiers/transform/NormalRecalculateModifier.d.ts +18 -0
- package/dist/modifiers/transform/NormalRecalculateModifier.d.ts.map +1 -0
- package/dist/modifiers/transform/NormalRecalculateModifier.js +24 -0
- package/dist/modifiers/transform/NormalRecalculateModifier.js.map +1 -0
- package/dist/modifiers/transform/UVProjectionModifier.d.ts +35 -0
- package/dist/modifiers/transform/UVProjectionModifier.d.ts.map +1 -0
- package/dist/modifiers/transform/UVProjectionModifier.js +88 -0
- package/dist/modifiers/transform/UVProjectionModifier.js.map +1 -0
- package/dist/utils/noise.d.ts +3 -0
- package/dist/utils/noise.d.ts.map +1 -0
- package/dist/utils/noise.js +17 -0
- package/dist/utils/noise.js.map +1 -0
- 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":"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"}
|
|
@@ -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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"}
|