forgecad 0.6.3 → 0.8.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/README.md +3 -12
- package/dist/assets/{AdminPage-CeqCUUgu.js → AdminPage-D4bocK4E.js} +250 -151
- package/dist/assets/{BlogPage-P_AJP0v9.js → BlogPage-CJEXL_zJ.js} +94 -70
- package/dist/assets/{DocsPage-CKRV2iq2.js → DocsPage-D3A_g8V3.js} +329 -163
- package/dist/assets/{EditorApp-CnC2k4cW.css → EditorApp-BWYUSpUN.css} +590 -136
- package/dist/assets/EditorApp-Cihhqcsq.js +11692 -0
- package/dist/assets/{EmbedViewer-DBlzmQ5i.js → EmbedViewer-kWjKaC_t.js} +2 -4
- package/dist/assets/LandingPageProofDriven-Bg2IUc3l.css +856 -0
- package/dist/assets/LandingPageProofDriven-DXkKlyhI.js +601 -0
- package/dist/assets/PricingPage-BsU5vzEx.js +232 -0
- package/dist/assets/{SettingsPage-BqCh9JcC.js → SettingsPage-PqvpAKIs.js} +129 -5
- package/dist/assets/{evalWorker-Ql-aKwLA.js → evalWorker-C-hzNUMy.js} +8949 -3161
- package/dist/assets/{Viewport-CoB46f5R.js → index-Pz321YAt.js} +38382 -7501
- package/dist/assets/{index-2hfs_ub0.css → index-ay13WNfa.css} +726 -53
- package/dist/assets/{javascript-DCxGoE5Y.js → javascript-DAl8Gmyo.js} +1 -1
- package/dist/assets/{manifold-CqNMHHKO.js → manifold-BcbjWLIo.js} +4 -3
- package/dist/assets/{manifold-Cce9wRFz.js → manifold-DBckbFgx.js} +1 -1
- package/dist/assets/{manifold-D6BeHIOo.js → manifold-O2AAGXyj.js} +1 -1
- package/dist/assets/{reportWorker-sFEFonXf.js → reportWorker-Dxr-5A7w.js} +8760 -3559
- package/dist/assets/{vendor-react-Dt7-aaJH.js → vendor-react-CG3i_wp0.js} +65 -8
- package/dist/docs/index.html +2 -2
- package/dist/docs-raw/CLI.md +341 -718
- package/dist/docs-raw/generated/assembly.md +699 -112
- package/dist/docs-raw/generated/concepts.md +1834 -1346
- package/dist/docs-raw/generated/core.md +1012 -1059
- package/dist/docs-raw/generated/curves.md +759 -116
- package/dist/docs-raw/generated/lib.md +43 -748
- package/dist/docs-raw/generated/output.md +139 -245
- package/dist/docs-raw/generated/sdf.md +208 -0
- package/dist/docs-raw/generated/sheet-metal.md +473 -21
- package/dist/docs-raw/generated/sketch.md +1518 -362
- package/dist/docs-raw/generated/viewport.md +368 -299
- package/dist/docs-raw/generated/wood.md +104 -0
- package/dist/index.html +2 -2
- package/dist/landing/proof-ams-adapter.png +0 -0
- package/dist/landing/proof-bolt-and-nut.png +0 -0
- package/dist/landing/proof-fillet-enclosure.png +0 -0
- package/dist/landing/proof-glasses.png +0 -0
- package/dist/landing/proof-gyroid.png +0 -0
- package/dist/sitemap.xml +6 -6
- package/dist-cli/forgecad.js +12321 -5700
- package/dist-cli/forgecad.js.map +1 -0
- package/dist-cli/solver-46FFSK2U.js +363 -0
- package/dist-cli/solver-46FFSK2U.js.map +1 -0
- package/dist-skill/CONTEXT.md +4890 -6302
- package/dist-skill/SKILL-dev.md +22 -66
- package/dist-skill/SKILL.md +20 -59
- package/dist-skill/docs/API/core/concepts.md +37 -92
- package/dist-skill/docs/CLI.md +341 -718
- package/dist-skill/docs/generated/assembly.md +699 -112
- package/dist-skill/docs/generated/core.md +1012 -1059
- package/dist-skill/docs/generated/curves.md +759 -116
- package/dist-skill/docs/generated/lib.md +43 -748
- package/dist-skill/docs/generated/output.md +139 -245
- package/dist-skill/docs/generated/sdf.md +208 -0
- package/dist-skill/docs/generated/sheet-metal.md +473 -21
- package/dist-skill/docs/generated/sketch.md +1518 -362
- package/dist-skill/docs/generated/viewport.md +368 -299
- package/dist-skill/docs/generated/wood.md +104 -0
- package/dist-skill/docs/guides/coordinate-system.md +11 -17
- package/dist-skill/docs/guides/geometry-conventions.md +13 -70
- package/dist-skill/docs/guides/joint-design.md +78 -0
- package/dist-skill/docs/guides/modeling-recipes.md +22 -195
- package/dist-skill/docs/guides/positioning.md +88 -147
- package/dist-skill/docs-dev/API/core/concepts.md +78 -0
- package/dist-skill/docs-dev/CLI.md +488 -0
- package/dist-skill/{docs → docs-dev}/blueprint-first.md +5 -0
- package/dist-skill/{docs → docs-dev}/coding-best-practices.md +6 -8
- package/dist-skill/{docs → docs-dev}/coding.md +2 -4
- package/dist-skill/docs-dev/component-model.md +164 -0
- package/dist-skill/docs-dev/generated/assembly.md +779 -0
- package/dist-skill/docs-dev/generated/core.md +1676 -0
- package/dist-skill/docs-dev/generated/curves.md +855 -0
- package/dist-skill/docs-dev/generated/lib.md +55 -0
- package/dist-skill/docs-dev/generated/output.md +234 -0
- package/dist-skill/docs-dev/generated/sdf.md +208 -0
- package/dist-skill/docs-dev/generated/sheet-metal.md +506 -0
- package/dist-skill/docs-dev/generated/sketch.md +1753 -0
- package/dist-skill/docs-dev/generated/viewport.md +513 -0
- package/dist-skill/docs-dev/generated/wood.md +104 -0
- package/dist-skill/docs-dev/guides/coordinate-system.md +46 -0
- package/dist-skill/docs-dev/guides/geometry-conventions.md +52 -0
- package/dist-skill/docs-dev/guides/joint-design.md +78 -0
- package/dist-skill/docs-dev/guides/modeling-recipes.md +77 -0
- package/dist-skill/docs-dev/guides/positioning.md +151 -0
- package/dist-skill/{docs → docs-dev}/guides/skill-maintenance.md +21 -10
- package/dist-skill/{docs → docs-dev}/internals/compiler.md +5 -6
- package/dist-skill/{docs → docs-dev}/internals/constraint-solver-quality.md +0 -1
- package/dist-skill/{docs → docs-dev}/internals/constraint-solver.md +0 -1
- package/dist-skill/{docs → docs-dev}/internals/sketch-2d-pipeline.md +2 -3
- package/examples/api/attachTo-basics.forge.js +8 -8
- package/examples/api/bill-of-materials.forge.js +9 -9
- package/examples/api/bolt-pattern.forge.js +5 -5
- package/examples/api/boolean-operations.forge.js +5 -5
- package/examples/api/bounding-box-visualizer.forge.js +3 -3
- package/examples/api/clone-duplicate.forge.js +2 -2
- package/examples/api/colors-union-vs-array.forge.js +6 -6
- package/examples/api/connector-assembly.forge.js +8 -6
- package/examples/api/connector-basics.forge.js +7 -7
- package/examples/api/constrained-sketch-mechanical.forge.js +4 -4
- package/examples/api/elbow-test.forge.js +3 -3
- package/examples/api/extrude-options.forge.js +8 -14
- package/examples/api/feature-created-faces.forge.js +6 -10
- package/examples/api/fillet-showcase.forge.js +2 -2
- package/examples/api/folded-service-panel-cover.forge.js +2 -2
- package/examples/api/gears-tier1.forge.js +5 -5
- package/examples/api/group-test.forge.js +3 -3
- package/examples/api/group-vs-union.forge.js +1 -1
- package/examples/api/highlight-debug.forge.js +4 -0
- package/examples/api/js-module-pillars.js +1 -1
- package/examples/api/js-module-scene.js +2 -2
- package/examples/api/mesh-import-slats.forge.js +4 -4
- package/examples/api/patterns.forge.js +3 -3
- package/examples/api/pointAlong-orientation.forge.js +3 -3
- package/examples/api/profile-2020-b-slot6.forge.js +4 -5
- package/examples/api/route-perimeter-flange.forge.js +1 -1
- package/examples/api/sdf-rover-demo.forge.js +10 -10
- package/examples/api/sketch-on-face-demo.forge.js +2 -2
- package/examples/api/sketch-regions.forge.js +4 -4
- package/examples/api/sketch-rounding-strategies.forge.js +1 -1
- package/examples/api/smooth-curve-connections.forge.js +1 -1
- package/examples/api/transition-curves.forge.js +4 -4
- package/examples/api/variable-sweep-pure-sdf-test.forge.js +162 -0
- package/examples/api/variable-sweep-test.forge.js +2 -2
- package/examples/api/wood-joinery.forge.js +60 -0
- package/examples/compiler-corpus/enclosure-shell-cuts.forge.js +3 -3
- package/examples/compiler-corpus/fastener-plate-variants.forge.js +2 -2
- package/examples/constraints/01-fully-constrained-rect.forge.js +2 -2
- package/examples/constraints/02-underconstrained-triangle.forge.js +1 -1
- package/examples/constraints/03-redundant-constraints.forge.js +2 -2
- package/examples/constraints/05-parallel-with-linedistance.forge.js +2 -2
- package/examples/constraints/06-complex-spectrogram.forge.js +1 -1
- package/examples/constraints/07-perpendicular-chain.forge.js +4 -4
- package/examples/constraints/08-symmetric-bracket.forge.js +4 -4
- package/examples/constraints/09-stress-spiral.forge.js +1 -1
- package/examples/constraints/10-stress-honeycomb.forge.js +1 -1
- package/examples/constraints/11-surface-grid.forge.js +2 -2
- package/examples/constraints/12-surface-nested.forge.js +4 -4
- package/examples/constraints/13-surface-complex.forge.js +1 -1
- package/examples/exact-arc-housing.forge.js +12 -0
- package/examples/experiments/drone-arm.forge.js +53 -0
- package/examples/furniture/adjustable-table.forge.js +15 -15
- package/examples/furniture/bathroom.forge.js +26 -26
- package/examples/furniture/chair.forge.js +13 -13
- package/examples/furniture/picture-frame.forge.js +6 -6
- package/examples/furniture/shoe-rack-doors.forge.js +8 -8
- package/examples/furniture/shoe-rack.forge.js +7 -7
- package/examples/furniture/table-lamp.forge.js +8 -8
- package/examples/gcode/lissajous-vase.forge.js +4 -4
- package/examples/gcode/math-surface.forge.js +3 -3
- package/examples/gcode/parametric-vase.forge.js +4 -4
- package/examples/gcode/spiral-tower.forge.js +4 -4
- package/examples/generative/crystal-growth.forge.js +9 -9
- package/examples/generative/frost-spires.forge.js +9 -9
- package/examples/generative/golden-spiral-tower.forge.js +11 -11
- package/examples/generative/molten-forge.forge.js +6 -6
- package/examples/generative/neon-coral.forge.js +7 -7
- package/examples/mechanical/3d-printer.forge.js +37 -37
- package/examples/mechanical/5-finger-robot-hand.forge.js +19 -19
- package/examples/mechanical/airplane-propeller.forge.js +9 -9
- package/examples/mechanical/bolt-and-nut.forge.js +10 -10
- package/examples/mechanical/door-with-hinges.forge.js +7 -7
- package/examples/mechanical/fillet-enclosure.forge.js +15 -11
- package/examples/mechanical/headphone-hanger-v2.forge.js +11 -11
- package/examples/mechanical/robot_hand.forge.js +24 -24
- package/examples/mechanical/robot_hand_2.forge.js +26 -26
- package/examples/nurbs-surface.forge.js +8 -0
- package/examples/nurbs-tube.forge.js +7 -0
- package/examples/products/bottle.forge.js +8 -8
- package/examples/products/chess-set.forge.js +25 -25
- package/examples/products/classical-piano.forge.js +20 -20
- package/examples/products/clock.forge.js +33 -33
- package/examples/products/cup.forge.js +5 -5
- package/examples/products/iphone.forge.js +20 -20
- package/examples/products/laptop.forge.js +24 -24
- package/examples/products/laser-cut-box.forge.js +6 -6
- package/examples/products/laser-cut-tray.forge.js +6 -6
- package/examples/products/liquid-soap-dispenser.forge.js +23 -23
- package/examples/products/origami-fish.forge.js +14 -12
- package/examples/products/spiderman-cake.forge.js +6 -6
- package/examples/shelf/container.forge.js +5 -5
- package/examples/shelf/shelf-unit.forge.js +6 -6
- package/examples/toolbox/bolted-joint.forge.js +7 -7
- package/package.json +9 -4
- package/dist/assets/EditorApp-B-vQvgam.js +0 -9888
- package/dist/assets/LandingPage-C5n9hDXI.js +0 -322
- package/dist/assets/PublishedModelPage-Dt7PCVBj.js +0 -146
- package/dist/assets/__vite-browser-external-CURh0WXD.js +0 -8
- package/dist/assets/deserializeRunResult-BLAFoiE0.js +0 -19365
- package/dist/assets/index-1CYp3zUp.js +0 -1455
- package/dist-skill/docs/API/API.md +0 -1666
- package/dist-skill/docs/API/README.md +0 -37
- package/dist-skill/docs/API/assembly/assembly.md +0 -617
- package/dist-skill/docs/API/core/edge-queries.md +0 -130
- package/dist-skill/docs/API/core/parameters.md +0 -122
- package/dist-skill/docs/API/core/reserved-terms.md +0 -137
- package/dist-skill/docs/API/core/sdf.md +0 -326
- package/dist-skill/docs/API/core/skill-cli.md +0 -194
- package/dist-skill/docs/API/core/skill-guide.md +0 -205
- package/dist-skill/docs/API/core/specs.md +0 -186
- package/dist-skill/docs/API/core/topology.md +0 -372
- package/dist-skill/docs/API/entities.md +0 -268
- package/dist-skill/docs/API/output/bom.md +0 -58
- package/dist-skill/docs/API/output/brep-export.md +0 -87
- package/dist-skill/docs/API/output/dimensions.md +0 -67
- package/dist-skill/docs/API/output/export.md +0 -110
- package/dist-skill/docs/API/output/gcode.md +0 -195
- package/dist-skill/docs/API/runtime/viewport.md +0 -420
- package/dist-skill/docs/API/sheet-metal/sheet-metal.md +0 -185
- package/dist-skill/docs/API/sketch/anchor.md +0 -37
- package/dist-skill/docs/API/sketch/booleans.md +0 -91
- package/dist-skill/docs/API/sketch/core.md +0 -73
- package/dist-skill/docs/API/sketch/extrude.md +0 -62
- package/dist-skill/docs/API/sketch/on-face.md +0 -104
- package/dist-skill/docs/API/sketch/operations.md +0 -78
- package/dist-skill/docs/API/sketch/path.md +0 -75
- package/dist-skill/docs/API/sketch/primitives.md +0 -146
- package/dist-skill/docs/API/sketch/regions.md +0 -80
- package/dist-skill/docs/API/sketch/text.md +0 -108
- package/dist-skill/docs/API/sketch/transforms.md +0 -65
- package/dist-skill/docs/API/toolbox/fasteners.md +0 -129
- package/dist-skill/docs/INDEX.md +0 -94
- package/dist-skill/docs/RELEASING.md +0 -55
- package/dist-skill/docs/cli-monetization.md +0 -111
- package/dist-skill/docs/deployment.md +0 -281
- package/dist-skill/docs/generated/concepts.md +0 -2112
- package/dist-skill/docs/internals/shape-from-slices.md +0 -152
- package/dist-skill/docs/platform/admin.md +0 -45
- package/dist-skill/docs/platform/architecture.md +0 -79
- package/dist-skill/docs/platform/auth.md +0 -110
- package/dist-skill/docs/platform/email.md +0 -67
- package/dist-skill/docs/platform/projects.md +0 -111
- package/dist-skill/docs/platform/sharing.md +0 -90
- package/dist-skill/docs/runbook.md +0 -345
|
@@ -1,11 +1,11 @@
|
|
|
1
1
|
// Full Bathroom — parametric room with fixtures
|
|
2
2
|
// Bathtub, sink, toilet, mirror, shower glass panel, towel rack
|
|
3
3
|
|
|
4
|
-
const roomW =
|
|
5
|
-
const roomD =
|
|
6
|
-
const roomH =
|
|
7
|
-
const wallT =
|
|
8
|
-
const tileH =
|
|
4
|
+
const roomW = Param.number("Room Width", 2400, { min: 1800, max: 3500, unit: "mm" });
|
|
5
|
+
const roomD = Param.number("Room Depth", 2000, { min: 1500, max: 3000, unit: "mm" });
|
|
6
|
+
const roomH = Param.number("Room Height", 2500, { min: 2200, max: 3000, unit: "mm" });
|
|
7
|
+
const wallT = Param.number("Wall Thickness", 80, { min: 50, max: 150, unit: "mm" });
|
|
8
|
+
const tileH = Param.number("Tile Height", 1200, { min: 800, max: 1800, unit: "mm" });
|
|
9
9
|
|
|
10
10
|
// ─── Room shell (floor + 3 walls, front open) ───
|
|
11
11
|
|
|
@@ -21,10 +21,10 @@ const tileStrip = box(roomW - 2 * wallT, 2, tileH)
|
|
|
21
21
|
|
|
22
22
|
// ─── Bathtub (left-back corner) ───
|
|
23
23
|
|
|
24
|
-
const tubL =
|
|
25
|
-
const tubW =
|
|
26
|
-
const tubH =
|
|
27
|
-
const tubWall =
|
|
24
|
+
const tubL = Param.number("Tub Length", 1500, { min: 1200, max: 1800, unit: "mm" });
|
|
25
|
+
const tubW = Param.number("Tub Width", 700, { min: 550, max: 800, unit: "mm" });
|
|
26
|
+
const tubH = Param.number("Tub Height", 500, { min: 400, max: 600, unit: "mm" });
|
|
27
|
+
const tubWall = Param.number("Tub Wall", 40, { min: 25, max: 60, unit: "mm" });
|
|
28
28
|
|
|
29
29
|
const tubX = wallT + 20;
|
|
30
30
|
const tubY = roomD - wallT - tubW - 20;
|
|
@@ -39,7 +39,7 @@ const bathtub = tubOuter.subtract(tubInner).subtract(tubDrain)
|
|
|
39
39
|
|
|
40
40
|
// ─── Shower (above tub) ───
|
|
41
41
|
|
|
42
|
-
const glassH =
|
|
42
|
+
const glassH = Param.number("Glass Height", 1800, { min: 1500, max: 2200, unit: "mm" });
|
|
43
43
|
const glassT = 8;
|
|
44
44
|
|
|
45
45
|
// Glass panel at tub edge
|
|
@@ -51,7 +51,7 @@ const armLen = 250;
|
|
|
51
51
|
const showerArmX = tubX + tubL * 0.6;
|
|
52
52
|
const showerArmZ = wallT + glassH - 150;
|
|
53
53
|
const showerArm = cylinder(armLen, 12)
|
|
54
|
-
.
|
|
54
|
+
.rotateX(90)
|
|
55
55
|
.translate(showerArmX, roomD - wallT, showerArmZ);
|
|
56
56
|
|
|
57
57
|
// Shower head — disc at end of arm
|
|
@@ -62,8 +62,8 @@ const shower = union(showerArm, showerHead);
|
|
|
62
62
|
|
|
63
63
|
// ─── Toilet (right side, against back wall) ───
|
|
64
64
|
|
|
65
|
-
const toiletW =
|
|
66
|
-
const toiletD =
|
|
65
|
+
const toiletW = Param.number("Toilet Width", 380, { min: 340, max: 420, unit: "mm" });
|
|
66
|
+
const toiletD = Param.number("Toilet Depth", 650, { min: 550, max: 750, unit: "mm" });
|
|
67
67
|
const toiletH = 400;
|
|
68
68
|
|
|
69
69
|
const toiletX = roomW - wallT - toiletW - 150;
|
|
@@ -83,11 +83,11 @@ const bowl = bowlOuter.subtract(bowlInner)
|
|
|
83
83
|
const tankW = toiletW * 0.85;
|
|
84
84
|
const tankD = 150;
|
|
85
85
|
const tankH = 320;
|
|
86
|
-
const tank = box(tankW, tankD, tankH
|
|
86
|
+
const tank = box(tankW, tankD, tankH)
|
|
87
87
|
.translate(toiletCX, toiletY + toiletD - tankD / 2 - 10, wallT + toiletH / 2 + tankH / 2 - 80);
|
|
88
88
|
|
|
89
89
|
// Lid — flat slab on top of tank
|
|
90
|
-
const lid = box(tankW + 10, tankD + 10, 15
|
|
90
|
+
const lid = box(tankW + 10, tankD + 10, 15)
|
|
91
91
|
.translate(toiletCX, toiletY + toiletD - tankD / 2 - 10, wallT + toiletH / 2 + tankH - 80 + 7);
|
|
92
92
|
|
|
93
93
|
// Seat — flat ring on top of bowl
|
|
@@ -100,7 +100,7 @@ const toilet = union(bowl, tank, lid, seat);
|
|
|
100
100
|
|
|
101
101
|
// ─── Sink (right wall, facing into room) ───
|
|
102
102
|
|
|
103
|
-
const sinkW =
|
|
103
|
+
const sinkW = Param.number("Sink Width", 550, { min: 400, max: 700, unit: "mm" });
|
|
104
104
|
const sinkD = 420;
|
|
105
105
|
const sinkH = 160;
|
|
106
106
|
const sinkZ = 850;
|
|
@@ -109,14 +109,14 @@ const sinkZ = 850;
|
|
|
109
109
|
const sinkCX = roomW - wallT - sinkD / 2 - 30;
|
|
110
110
|
const sinkCY = roomD * 0.35;
|
|
111
111
|
|
|
112
|
-
const basinOuter = box(sinkD, sinkW, sinkH
|
|
113
|
-
const basinInner = box(sinkD - 50, sinkW - 50, sinkH - 25
|
|
112
|
+
const basinOuter = box(sinkD, sinkW, sinkH);
|
|
113
|
+
const basinInner = box(sinkD - 50, sinkW - 50, sinkH - 25).translate(0, 0, 12);
|
|
114
114
|
const drain = cylinder(27, 18).translate(0, 0, -sinkH / 2);
|
|
115
115
|
const basin = basinOuter.subtract(basinInner).subtract(drain)
|
|
116
116
|
.translate(sinkCX, sinkCY, wallT + sinkZ + sinkH / 2);
|
|
117
117
|
|
|
118
118
|
// Pedestal
|
|
119
|
-
const pedestal = box(80, 80, sinkZ
|
|
119
|
+
const pedestal = box(80, 80, sinkZ)
|
|
120
120
|
.translate(sinkCX, sinkCY, wallT + sinkZ / 2);
|
|
121
121
|
|
|
122
122
|
// Faucet — vertical stem + curved spout
|
|
@@ -124,20 +124,20 @@ const faucetX = sinkCX + sinkD / 2 - 40;
|
|
|
124
124
|
const faucetZ = wallT + sinkZ + sinkH;
|
|
125
125
|
const faucetStem = cylinder(100, 10)
|
|
126
126
|
.translate(faucetX, sinkCY, faucetZ);
|
|
127
|
-
const faucetSpout = box(80, 16, 16
|
|
127
|
+
const faucetSpout = box(80, 16, 16)
|
|
128
128
|
.translate(faucetX - 40, sinkCY, faucetZ + 100);
|
|
129
129
|
// Handles
|
|
130
|
-
const handleL = box(30, 8, 8
|
|
130
|
+
const handleL = box(30, 8, 8)
|
|
131
131
|
.translate(faucetX, sinkCY - 30, faucetZ + 50);
|
|
132
|
-
const handleR = box(30, 8, 8
|
|
132
|
+
const handleR = box(30, 8, 8)
|
|
133
133
|
.translate(faucetX, sinkCY + 30, faucetZ + 50);
|
|
134
134
|
|
|
135
135
|
const sink = union(basin, pedestal, faucetStem, faucetSpout, handleL, handleR);
|
|
136
136
|
|
|
137
137
|
// ─── Mirror (on right wall, above sink) ───
|
|
138
138
|
|
|
139
|
-
const mirrorW =
|
|
140
|
-
const mirrorH =
|
|
139
|
+
const mirrorW = Param.number("Mirror Width", 600, { min: 400, max: 900, unit: "mm" });
|
|
140
|
+
const mirrorH = Param.number("Mirror Height", 800, { min: 500, max: 1200, unit: "mm" });
|
|
141
141
|
const mirrorT = 5;
|
|
142
142
|
const frameW = 15;
|
|
143
143
|
|
|
@@ -167,7 +167,7 @@ const bracketL = box(70, bracketSize, bracketSize)
|
|
|
167
167
|
const bracketR = box(70, bracketSize, bracketSize)
|
|
168
168
|
.translate(wallT, rackY + rackLen / 2 - bracketSize, wallT + rackZ);
|
|
169
169
|
const towelBar = cylinder(rackLen - bracketSize * 2, barR)
|
|
170
|
-
.
|
|
170
|
+
.rotateX(-90)
|
|
171
171
|
.translate(wallT + 50, rackY - rackLen / 2 + bracketSize, wallT + rackZ + bracketSize / 2);
|
|
172
172
|
|
|
173
173
|
const towelRack = union(bracketL, bracketR, towelBar);
|
|
@@ -177,7 +177,7 @@ const towelRack = union(bracketL, bracketR, towelBar);
|
|
|
177
177
|
const matW = 700;
|
|
178
178
|
const matD = 450;
|
|
179
179
|
const matH = 8;
|
|
180
|
-
const bathMat = box(matW, matD, matH
|
|
180
|
+
const bathMat = box(matW, matD, matH)
|
|
181
181
|
.translate(tubX + tubL / 2, tubY - matD / 2 - 30, wallT + matH / 2);
|
|
182
182
|
|
|
183
183
|
// ─── Assemble ───
|
|
@@ -1,20 +1,20 @@
|
|
|
1
1
|
// Four-Legged Chair — parametric dining chair
|
|
2
2
|
|
|
3
|
-
const seatW =
|
|
4
|
-
const seatD =
|
|
5
|
-
const seatT =
|
|
6
|
-
const seatH =
|
|
3
|
+
const seatW = Param.number("Seat Width", 45, { min: 30, max: 60, unit: "mm" });
|
|
4
|
+
const seatD = Param.number("Seat Depth", 42, { min: 30, max: 55, unit: "mm" });
|
|
5
|
+
const seatT = Param.number("Seat Thickness", 3, { min: 2, max: 6, unit: "mm" });
|
|
6
|
+
const seatH = Param.number("Seat Height", 45, { min: 35, max: 55, unit: "mm" });
|
|
7
7
|
|
|
8
|
-
const legW =
|
|
9
|
-
const legInset =
|
|
8
|
+
const legW = Param.number("Leg Width", 4, { min: 2, max: 8, unit: "mm" });
|
|
9
|
+
const legInset = Param.number("Leg Inset", 3, { min: 0, max: 10, unit: "mm" });
|
|
10
10
|
|
|
11
|
-
const backH =
|
|
12
|
-
const backT =
|
|
13
|
-
const backTilt =
|
|
11
|
+
const backH = Param.number("Back Height", 40, { min: 25, max: 60, unit: "mm" });
|
|
12
|
+
const backT = Param.number("Back Thickness", 3, { min: 2, max: 6, unit: "mm" });
|
|
13
|
+
const backTilt = Param.number("Back Tilt", 5, { min: 0, max: 15, unit: "°" });
|
|
14
14
|
|
|
15
|
-
const stretcher =
|
|
16
|
-
const stretcherH =
|
|
17
|
-
const stretcherW =
|
|
15
|
+
const stretcher = Param.number("Stretchers", 1, { min: 0, max: 1, step: 1 });
|
|
16
|
+
const stretcherH = Param.number("Stretcher Height", 12, { min: 5, max: 30, unit: "mm" });
|
|
17
|
+
const stretcherW = Param.number("Stretcher Width", 2, { min: 1, max: 4, unit: "mm" });
|
|
18
18
|
|
|
19
19
|
// --- Seat ---
|
|
20
20
|
const seat = box(seatW, seatD, seatT).translate(0, 0, seatH);
|
|
@@ -37,7 +37,7 @@ const legs = union(
|
|
|
37
37
|
// Tilted slightly backward — rotate around X then position at back edge
|
|
38
38
|
const backPanel = box(seatW, backT, backH)
|
|
39
39
|
.translate(-seatW / 2, -backT / 2, 0) // center for rotation
|
|
40
|
-
.
|
|
40
|
+
.rotateX(-backTilt)
|
|
41
41
|
.translate(seatW / 2, seatD - legInset - legW / 2, seatH + seatT);
|
|
42
42
|
|
|
43
43
|
// --- Stretchers (side rails between legs) ---
|
|
@@ -1,11 +1,11 @@
|
|
|
1
1
|
// Picture Frame — parametric wall frame with optional mat border
|
|
2
2
|
|
|
3
|
-
const frameW =
|
|
4
|
-
const frameH =
|
|
5
|
-
const border =
|
|
6
|
-
const depth =
|
|
7
|
-
const mat =
|
|
8
|
-
const matDepth =
|
|
3
|
+
const frameW = Param.number("Frame Width", 120, { min: 60, max: 250, unit: "mm" });
|
|
4
|
+
const frameH = Param.number("Frame Height", 160, { min: 80, max: 300, unit: "mm" });
|
|
5
|
+
const border = Param.number("Border Width", 12, { min: 5, max: 30, unit: "mm" });
|
|
6
|
+
const depth = Param.number("Frame Depth", 8, { min: 3, max: 20, unit: "mm" });
|
|
7
|
+
const mat = Param.number("Mat Width", 8, { min: 0, max: 20, unit: "mm" });
|
|
8
|
+
const matDepth = Param.number("Mat Depth", 2, { min: 1, max: 5, unit: "mm" });
|
|
9
9
|
|
|
10
10
|
// Outer frame
|
|
11
11
|
const outer = box(frameW, frameH, depth);
|
|
@@ -3,17 +3,17 @@
|
|
|
3
3
|
// 4 doors (2 per shelf level), hinged at the outer edges.
|
|
4
4
|
// Each pair shares one angle slider for synchronized open/close.
|
|
5
5
|
|
|
6
|
-
const width =
|
|
7
|
-
const depth =
|
|
8
|
-
const totalH =
|
|
6
|
+
const width = Param.number("Width", 800, { min: 500, max: 1200, unit: "mm" });
|
|
7
|
+
const depth = Param.number("Depth", 350, { min: 250, max: 500, unit: "mm" });
|
|
8
|
+
const totalH = Param.number("Total Height", 500, { min: 350, max: 650, unit: "mm" });
|
|
9
9
|
|
|
10
|
-
const boardT =
|
|
10
|
+
const boardT = Param.number("Board Thickness", 18, { min: 12, max: 25, unit: "mm" });
|
|
11
11
|
|
|
12
|
-
const seatPad =
|
|
13
|
-
const seatOverhang =
|
|
12
|
+
const seatPad = Param.number("Seat Padding", 30, { min: 15, max: 60, unit: "mm" });
|
|
13
|
+
const seatOverhang = Param.number("Seat Overhang", 10, { min: 0, max: 30, unit: "mm" });
|
|
14
14
|
|
|
15
|
-
const doorT =
|
|
16
|
-
const doorGap =
|
|
15
|
+
const doorT = Param.number("Door Thickness", 8, { min: 4, max: 15, unit: "mm" });
|
|
16
|
+
const doorGap = Param.number("Door Gap", 2, { min: 1, max: 5, unit: "mm" });
|
|
17
17
|
|
|
18
18
|
// Derived
|
|
19
19
|
const innerW = width - 2 * boardT;
|
|
@@ -3,16 +3,16 @@
|
|
|
3
3
|
// Structure: two side panels, bottom board, 2 shelves, top board,
|
|
4
4
|
// back panel for rigidity, and a cushion on top for sitting.
|
|
5
5
|
|
|
6
|
-
const width =
|
|
7
|
-
const depth =
|
|
8
|
-
const totalH =
|
|
6
|
+
const width = Param.number("Width", 800, { min: 500, max: 1200, unit: "mm" });
|
|
7
|
+
const depth = Param.number("Depth", 350, { min: 250, max: 500, unit: "mm" });
|
|
8
|
+
const totalH = Param.number("Total Height", 500, { min: 350, max: 650, unit: "mm" });
|
|
9
9
|
|
|
10
|
-
const boardT =
|
|
10
|
+
const boardT = Param.number("Board Thickness", 18, { min: 12, max: 25, unit: "mm" });
|
|
11
11
|
|
|
12
|
-
const seatPad =
|
|
13
|
-
const seatOverhang =
|
|
12
|
+
const seatPad = Param.number("Seat Padding", 30, { min: 15, max: 60, unit: "mm" });
|
|
13
|
+
const seatOverhang = Param.number("Seat Overhang", 10, { min: 0, max: 30, unit: "mm" });
|
|
14
14
|
|
|
15
|
-
const divider =
|
|
15
|
+
const divider = Param.number("Center Divider", 1, { min: 0, max: 1, step: 1 });
|
|
16
16
|
|
|
17
17
|
// Derived
|
|
18
18
|
const innerW = width - 2 * boardT;
|
|
@@ -1,13 +1,13 @@
|
|
|
1
1
|
// Table Lamp — base + stem + shade (multi-file: imports shade profile)
|
|
2
2
|
|
|
3
|
-
const baseR =
|
|
4
|
-
const baseH =
|
|
5
|
-
const stemR =
|
|
6
|
-
const stemH =
|
|
7
|
-
const shadeTopR =
|
|
8
|
-
const shadeBottomR =
|
|
9
|
-
const shadeH =
|
|
10
|
-
const shadeWall =
|
|
3
|
+
const baseR = Param.number("Base Radius", 25, { min: 15, max: 40, unit: "mm" });
|
|
4
|
+
const baseH = Param.number("Base Height", 6, { min: 3, max: 12, unit: "mm" });
|
|
5
|
+
const stemR = Param.number("Stem Radius", 4, { min: 2, max: 8, unit: "mm" });
|
|
6
|
+
const stemH = Param.number("Stem Height", 60, { min: 30, max: 100, unit: "mm" });
|
|
7
|
+
const shadeTopR = Param.number("Shade Top Radius", 15, { min: 8, max: 30, unit: "mm" });
|
|
8
|
+
const shadeBottomR = Param.number("Shade Bottom Radius", 30, { min: 15, max: 50, unit: "mm" });
|
|
9
|
+
const shadeH = Param.number("Shade Height", 35, { min: 20, max: 60, unit: "mm" });
|
|
10
|
+
const shadeWall = Param.number("Shade Wall", 1.5, { min: 0.5, max: 4, unit: "mm" });
|
|
11
11
|
|
|
12
12
|
// --- Base: flat cylinder ---
|
|
13
13
|
const base = cylinder(baseH, baseR);
|
|
@@ -5,10 +5,10 @@
|
|
|
5
5
|
* Creates beautiful organic-looking walls with a continuously changing profile.
|
|
6
6
|
*/
|
|
7
7
|
|
|
8
|
-
const a =
|
|
9
|
-
const b =
|
|
10
|
-
const baseRadius =
|
|
11
|
-
const height =
|
|
8
|
+
const a = Param.number('a', 3, 1, 7); // X frequency
|
|
9
|
+
const b = Param.number('b', 2, 1, 7); // Y frequency
|
|
10
|
+
const baseRadius = Param.number('radius', 25, 10, 50);
|
|
11
|
+
const height = Param.number('height', 100, 30, 200);
|
|
12
12
|
const layerHeight = 0.2;
|
|
13
13
|
|
|
14
14
|
const g = gcode({ nozzle: 0.4, layerHeight, printSpeed: 1800 });
|
|
@@ -7,9 +7,9 @@
|
|
|
7
7
|
* The surface function creates an undulating bowl shape.
|
|
8
8
|
*/
|
|
9
9
|
|
|
10
|
-
const outerRadius =
|
|
11
|
-
const amplitude =
|
|
12
|
-
const waves =
|
|
10
|
+
const outerRadius = Param.number('radius', 40, 15, 60);
|
|
11
|
+
const amplitude = Param.number('amplitude', 8, 1, 20);
|
|
12
|
+
const waves = Param.number('waves', 4, 1, 8);
|
|
13
13
|
const layerHeight = 0.3;
|
|
14
14
|
const lineSpacing = 0.6; // spacing between concentric passes
|
|
15
15
|
|
|
@@ -7,10 +7,10 @@
|
|
|
7
7
|
* Try tweaking: amplitude, frequency, baseRadius, height, layerHeight.
|
|
8
8
|
*/
|
|
9
9
|
|
|
10
|
-
const amplitude =
|
|
11
|
-
const frequency =
|
|
12
|
-
const baseRadius =
|
|
13
|
-
const height =
|
|
10
|
+
const amplitude = Param.number('amplitude', 8, 1, 20);
|
|
11
|
+
const frequency = Param.number('frequency', 6, 1, 20);
|
|
12
|
+
const baseRadius = Param.number('radius', 25, 10, 60);
|
|
13
|
+
const height = Param.number('height', 80, 20, 200);
|
|
14
14
|
const layerHeight = 0.2;
|
|
15
15
|
const nozzle = 0.4;
|
|
16
16
|
|
|
@@ -5,10 +5,10 @@
|
|
|
5
5
|
* Each layer is a hexagon that twists slightly more than the last.
|
|
6
6
|
*/
|
|
7
7
|
|
|
8
|
-
const sides =
|
|
9
|
-
const radius =
|
|
10
|
-
const height =
|
|
11
|
-
const twistDeg =
|
|
8
|
+
const sides = Param.number('sides', 6, 3, 12);
|
|
9
|
+
const radius = Param.number('radius', 20, 10, 40);
|
|
10
|
+
const height = Param.number('height', 60, 20, 120);
|
|
11
|
+
const twistDeg = Param.number('twist', 90, 0, 360);
|
|
12
12
|
const layerHeight = 0.2;
|
|
13
13
|
|
|
14
14
|
const g = gcode({ nozzle: 0.4, layerHeight, printSpeed: 1800 });
|
|
@@ -36,9 +36,9 @@ scene({
|
|
|
36
36
|
fog: { color: '#0a0612', near: 350, far: 900 },
|
|
37
37
|
|
|
38
38
|
postProcessing: {
|
|
39
|
-
bloom: { intensity:
|
|
39
|
+
bloom: { intensity: Param.number('bloom', 1.2, 0, 3), threshold: 0.6, radius: 0.5 },
|
|
40
40
|
vignette: { darkness: 0.7, offset: 0.3 },
|
|
41
|
-
toneMappingExposure:
|
|
41
|
+
toneMappingExposure: Param.number('exposure', 1.3, 0.5, 3),
|
|
42
42
|
},
|
|
43
43
|
|
|
44
44
|
capture: {
|
|
@@ -50,11 +50,11 @@ scene({
|
|
|
50
50
|
// ---------------------------------------------------------------------------
|
|
51
51
|
// Parameters
|
|
52
52
|
// ---------------------------------------------------------------------------
|
|
53
|
-
const seed =
|
|
54
|
-
const crystalCount =
|
|
55
|
-
const maxHeight =
|
|
56
|
-
const baseRadius =
|
|
57
|
-
const taperFactor =
|
|
53
|
+
const seed = Param.number('seed', 42, 0, 100);
|
|
54
|
+
const crystalCount = Param.number('crystals', 12, 3, 24);
|
|
55
|
+
const maxHeight = Param.number('maxHeight', 120, 40, 200);
|
|
56
|
+
const baseRadius = Param.number('baseRadius', 80, 30, 150);
|
|
57
|
+
const taperFactor = Param.number('taper', 0.3, 0.1, 0.8);
|
|
58
58
|
|
|
59
59
|
// ---------------------------------------------------------------------------
|
|
60
60
|
// PRNG
|
|
@@ -103,7 +103,7 @@ const mainW = rand(14, 20);
|
|
|
103
103
|
crystals.push({
|
|
104
104
|
name: 'Main Crystal',
|
|
105
105
|
shape: crystal(mainH, mainW)
|
|
106
|
-
.
|
|
106
|
+
.rotateZ(rand(0, 360))
|
|
107
107
|
.translate(rand(-5, 5), rand(-5, 5), 0),
|
|
108
108
|
color: '#a855f7',
|
|
109
109
|
});
|
|
@@ -118,7 +118,7 @@ for (let i = 0; i < crystalCount - 1; i++) {
|
|
|
118
118
|
crystals.push({
|
|
119
119
|
name: `Crystal ${i + 2}`,
|
|
120
120
|
shape: crystal(h, w)
|
|
121
|
-
.
|
|
121
|
+
.rotateX(rand(-8, 8)).rotateY(rand(-12, 12)).rotateZ(rand(0, 360))
|
|
122
122
|
.translate(Math.cos(angle) * dist, Math.sin(angle) * dist, 0),
|
|
123
123
|
color: pickColor(),
|
|
124
124
|
});
|
|
@@ -32,10 +32,10 @@ scene({
|
|
|
32
32
|
fog: { color: '#0a1628', near: 200, far: 550 },
|
|
33
33
|
|
|
34
34
|
postProcessing: {
|
|
35
|
-
bloom: { intensity:
|
|
35
|
+
bloom: { intensity: Param.number('bloom', 1.2, 0, 4), threshold: 0.5, radius: 0.6 },
|
|
36
36
|
vignette: { darkness: 0.7, offset: 0.3 },
|
|
37
37
|
grain: { intensity: 0.04 },
|
|
38
|
-
toneMappingExposure:
|
|
38
|
+
toneMappingExposure: Param.number('exposure', 1.4, 0.5, 3),
|
|
39
39
|
},
|
|
40
40
|
|
|
41
41
|
capture: {
|
|
@@ -47,10 +47,10 @@ scene({
|
|
|
47
47
|
// ---------------------------------------------------------------------------
|
|
48
48
|
// Parameters
|
|
49
49
|
// ---------------------------------------------------------------------------
|
|
50
|
-
const seed =
|
|
51
|
-
const spireCount =
|
|
52
|
-
const maxHeight =
|
|
53
|
-
const spread =
|
|
50
|
+
const seed = Param.number('seed', 23, 0, 100);
|
|
51
|
+
const spireCount = Param.number('spires', 14, 4, 30);
|
|
52
|
+
const maxHeight = Param.number('maxHeight', 100, 40, 160);
|
|
53
|
+
const spread = Param.number('spread', 55, 20, 100);
|
|
54
54
|
|
|
55
55
|
// ---------------------------------------------------------------------------
|
|
56
56
|
// PRNG
|
|
@@ -127,7 +127,7 @@ for (let i = 0; i < spireCount; i++) {
|
|
|
127
127
|
shape: ngon(6, r)
|
|
128
128
|
.extrude(h)
|
|
129
129
|
.translate(px, py, 0)
|
|
130
|
-
.
|
|
130
|
+
.rotateZ(rand(0, 60))
|
|
131
131
|
.material({
|
|
132
132
|
opacity: rand(0.4, 0.75),
|
|
133
133
|
metalness: 0.0,
|
|
@@ -145,7 +145,7 @@ for (let i = 0; i < spireCount; i++) {
|
|
|
145
145
|
shape: ngon(6, r * 0.4)
|
|
146
146
|
.extrude(h * 0.7)
|
|
147
147
|
.translate(px, py, h * 0.1)
|
|
148
|
-
.
|
|
148
|
+
.rotateZ(rand(0, 60))
|
|
149
149
|
.material({
|
|
150
150
|
emissive: pick(glowColors),
|
|
151
151
|
emissiveIntensity: rand(1, 3),
|
|
@@ -183,7 +183,7 @@ for (let i = 0; i < 10; i++) {
|
|
|
183
183
|
shape: ngon(6, size)
|
|
184
184
|
.extrude(size * rand(0.3, 0.8))
|
|
185
185
|
.translate(Math.cos(angle) * dist, Math.sin(angle) * dist, 0)
|
|
186
|
-
.
|
|
186
|
+
.rotateX(rand(-15, 15)).rotateY(rand(-15, 15)).rotateZ(rand(0, 60))
|
|
187
187
|
.material({
|
|
188
188
|
opacity: rand(0.4, 0.7),
|
|
189
189
|
metalness: 0.0,
|
|
@@ -4,7 +4,7 @@
|
|
|
4
4
|
* A spiraling tower of boxes arranged in a golden-ratio pattern,
|
|
5
5
|
* like a computational sunflower reaching for the sky.
|
|
6
6
|
*
|
|
7
|
-
* Demonstrates: scene(),
|
|
7
|
+
* Demonstrates: scene(), Param.number() integration, dramatic lighting,
|
|
8
8
|
* bloom post-processing, and fog depth.
|
|
9
9
|
*/
|
|
10
10
|
|
|
@@ -31,9 +31,9 @@ scene({
|
|
|
31
31
|
fog: { color: '#050510', near: 300, far: 800 },
|
|
32
32
|
|
|
33
33
|
postProcessing: {
|
|
34
|
-
bloom: { intensity:
|
|
34
|
+
bloom: { intensity: Param.number('bloom', 0.8, 0, 3), threshold: 0.7, radius: 0.6 },
|
|
35
35
|
vignette: { darkness: 0.6, offset: 0.4 },
|
|
36
|
-
toneMappingExposure:
|
|
36
|
+
toneMappingExposure: Param.number('exposure', 1.4, 0.5, 3),
|
|
37
37
|
},
|
|
38
38
|
|
|
39
39
|
capture: {
|
|
@@ -45,11 +45,11 @@ scene({
|
|
|
45
45
|
// ---------------------------------------------------------------------------
|
|
46
46
|
// Parameters
|
|
47
47
|
// ---------------------------------------------------------------------------
|
|
48
|
-
const count =
|
|
49
|
-
const towerHeight =
|
|
50
|
-
const spiralTightness =
|
|
51
|
-
const maxRadius =
|
|
52
|
-
const elementScale =
|
|
48
|
+
const count = Param.number('elements', 120, 20, 300);
|
|
49
|
+
const towerHeight = Param.number('height', 200, 50, 400);
|
|
50
|
+
const spiralTightness = Param.number('tightness', 2.5, 0.5, 6);
|
|
51
|
+
const maxRadius = Param.number('radius', 60, 20, 120);
|
|
52
|
+
const elementScale = Param.number('scale', 1.0, 0.3, 2.0);
|
|
53
53
|
|
|
54
54
|
// ---------------------------------------------------------------------------
|
|
55
55
|
// Golden Ratio Spiral
|
|
@@ -91,15 +91,15 @@ for (let i = 0; i < count; i++) {
|
|
|
91
91
|
const lum = 45 + t * 15; // slightly brighter at top
|
|
92
92
|
const r255 = hslToHex(hue, sat, lum);
|
|
93
93
|
|
|
94
|
-
const element = box(s, s * 0.6, s * 1.2
|
|
95
|
-
.
|
|
94
|
+
const element = box(s, s * 0.6, s * 1.2)
|
|
95
|
+
.rotateZ(facingDeg)
|
|
96
96
|
.translate(Math.cos(angle) * r, Math.sin(angle) * r, z);
|
|
97
97
|
|
|
98
98
|
shapes.push({ name: `Petal ${i + 1}`, shape: element, color: r255 });
|
|
99
99
|
}
|
|
100
100
|
|
|
101
101
|
// Central spine
|
|
102
|
-
const spine = box(6, 6, towerHeight * 0.9
|
|
102
|
+
const spine = box(6, 6, towerHeight * 0.9)
|
|
103
103
|
.translate(0, 0, towerHeight * 0.45);
|
|
104
104
|
shapes.push({ name: 'Spine', shape: spine, color: '#1a1a2e' });
|
|
105
105
|
|
|
@@ -32,10 +32,10 @@ scene({
|
|
|
32
32
|
fog: { color: '#0a0000', near: 200, far: 500 },
|
|
33
33
|
|
|
34
34
|
postProcessing: {
|
|
35
|
-
bloom: { intensity:
|
|
35
|
+
bloom: { intensity: Param.number('bloom', 2.0, 0, 5), threshold: 0.3, radius: 0.8 },
|
|
36
36
|
vignette: { darkness: 0.9, offset: 0.2 },
|
|
37
37
|
grain: { intensity: 0.06 },
|
|
38
|
-
toneMappingExposure:
|
|
38
|
+
toneMappingExposure: Param.number('exposure', 1.8, 0.5, 4),
|
|
39
39
|
},
|
|
40
40
|
|
|
41
41
|
capture: {
|
|
@@ -48,10 +48,10 @@ scene({
|
|
|
48
48
|
// ---------------------------------------------------------------------------
|
|
49
49
|
// Parameters
|
|
50
50
|
// ---------------------------------------------------------------------------
|
|
51
|
-
const seed =
|
|
52
|
-
const pillarCount =
|
|
53
|
-
const maxHeight =
|
|
54
|
-
const baseRadius =
|
|
51
|
+
const seed = Param.number('seed', 42, 0, 100);
|
|
52
|
+
const pillarCount = Param.number('pillars', 18, 5, 40);
|
|
53
|
+
const maxHeight = Param.number('maxHeight', 90, 30, 150);
|
|
54
|
+
const baseRadius = Param.number('baseRadius', 50, 20, 100);
|
|
55
55
|
|
|
56
56
|
// ---------------------------------------------------------------------------
|
|
57
57
|
// PRNG
|
|
@@ -32,10 +32,10 @@ scene({
|
|
|
32
32
|
fog: { color: '#000814', near: 250, far: 600 },
|
|
33
33
|
|
|
34
34
|
postProcessing: {
|
|
35
|
-
bloom: { intensity:
|
|
35
|
+
bloom: { intensity: Param.number('bloom', 1.5, 0, 4), threshold: 0.5, radius: 0.7 },
|
|
36
36
|
vignette: { darkness: 0.8, offset: 0.25 },
|
|
37
37
|
grain: { intensity: 0.08 },
|
|
38
|
-
toneMappingExposure:
|
|
38
|
+
toneMappingExposure: Param.number('exposure', 1.5, 0.5, 4),
|
|
39
39
|
},
|
|
40
40
|
|
|
41
41
|
capture: {
|
|
@@ -48,11 +48,11 @@ scene({
|
|
|
48
48
|
// ---------------------------------------------------------------------------
|
|
49
49
|
// Parameters
|
|
50
50
|
// ---------------------------------------------------------------------------
|
|
51
|
-
const seed =
|
|
52
|
-
const stalkCount =
|
|
53
|
-
const maxStalkH =
|
|
54
|
-
const clusterSpread =
|
|
55
|
-
const tipScale =
|
|
51
|
+
const seed = Param.number('seed', 7, 0, 100);
|
|
52
|
+
const stalkCount = Param.number('stalks', 25, 5, 60);
|
|
53
|
+
const maxStalkH = Param.number('maxHeight', 80, 30, 150);
|
|
54
|
+
const clusterSpread = Param.number('spread', 60, 20, 120);
|
|
55
|
+
const tipScale = Param.number('tipSize', 1.5, 0.5, 3);
|
|
56
56
|
|
|
57
57
|
// ---------------------------------------------------------------------------
|
|
58
58
|
// PRNG
|