Skip to content

Commit 88b4cba

Browse files
author
Kyle Stemen
committed
Progress so far on loading Walnut in JSCAD web package
1 parent 5cb2f65 commit 88b4cba

File tree

10 files changed

+104214
-5484
lines changed

10 files changed

+104214
-5484
lines changed

packages/core/dist/jscad-core.min.js

Lines changed: 1127 additions & 1142 deletions
Some generated files are not rendered by default. Learn more about customizing how changed files appear on GitHub.

packages/core/src/code-evaluation/rebuildGeometryWorker.js

Lines changed: 12 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -1,3 +1,5 @@
1+
const walnut = require('@jscad/modeling').booleans.walnut
2+
const walnutInit = walnut.init
13

24
/**
35
* evaluate script & rebuild solids, in seperate thread/webworker
@@ -8,12 +10,21 @@
810
* @param {Object} options the settings to use when rebuilding the solid
911
*/
1012
const rebuildGeometryWorker = (self) => {
13+
console.log('Going to init')
1114
const rebuildGeometry = require('./rebuildGeometry')
1215
self.onmessage = function (event) {
16+
console.log('onmessage', walnut.walnut)
1317
if (event.data instanceof Object) {
1418
const { data } = event
1519
if (data.cmd === 'generate') {
16-
rebuildGeometry(data, (err, message) => self.postMessage(message))
20+
if (walnut.walnut === null) {
21+
walnutInit(self.location.origin + '/dist/walnut.wasm', () => {
22+
console.log('walnut initialized callback', walnut.walnut != null)
23+
rebuildGeometry(data, (err, message) => self.postMessage(message))
24+
})
25+
} else {
26+
rebuildGeometry(data, (err, message) => self.postMessage(message))
27+
}
1728
}
1829
}
1930
}

packages/modeling/dist/jscad-modeling.min.js

Lines changed: 18375 additions & 1042 deletions
Large diffs are not rendered by default.

packages/modeling/package.json

Lines changed: 4 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -61,5 +61,8 @@
6161
"nyc": "15.1.0",
6262
"uglifyify": "5.0.2"
6363
},
64-
"gitHead": "a90b9bad95a417661c619dc733e62c587dc71a4a"
64+
"gitHead": "a90b9bad95a417661c619dc733e62c587dc71a4a",
65+
"dependencies": {
66+
"@bluelightning32/walnut": "^1.0.0"
67+
}
6568
}

packages/modeling/src/operations/booleans/index.js

Lines changed: 2 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -10,5 +10,6 @@ module.exports = {
1010
intersect: require('./intersect'),
1111
scission: require('./scission'),
1212
subtract: require('./subtract'),
13-
union: require('./union')
13+
union: require('./union'),
14+
walnut: require('./walnut')
1415
}

packages/modeling/src/operations/booleans/intersectGeom3.js

Lines changed: 7 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -4,6 +4,8 @@ const retessellate = require('../modifiers/retessellate')
44

55
const intersectSub = require('./intersectGeom3Sub')
66

7+
const walnut = require('./walnut')
8+
79
/*
810
* Return a new 3D geometry representing space in both the first geometry and
911
* in the subsequent geometries. None of the given geometries are modified.
@@ -12,6 +14,11 @@ const intersectSub = require('./intersectGeom3Sub')
1214
*/
1315
const intersect = (...geometries) => {
1416
geometries = flatten(geometries)
17+
console.log('walnut is', walnut.walnut)
18+
if (walnut.walnut !== null) {
19+
fromWalnut = walnut.intersect(geometries[0], geometries[1])
20+
return fromWalnut
21+
}
1522

1623
let newgeometry = geometries.shift()
1724
geometries.forEach((geometry) => {
Lines changed: 140 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,140 @@
1+
const mat4 = require('../../maths/mat4')
2+
const vec3 = require('../../maths/vec3')
3+
4+
const walnutInit = require('@bluelightning32/walnut')
5+
6+
const PRECISION = -10
7+
8+
console.log('jscad walnut imported')
9+
10+
function init(wasmPath, callback) {
11+
if (module.exports.walnut !== null) {
12+
console.log('walnut already initialized')
13+
callback()
14+
return
15+
}
16+
console.log('walnut init starting')
17+
function findWasm(file, scriptDirectory) {
18+
console.log('findWasm', wasmPath)
19+
return wasmPath
20+
}
21+
22+
const wasmModule = {
23+
'locateFile': findWasm
24+
}
25+
26+
walnutInit(wasmModule).then(function (Module) {
27+
module.exports.walnut = Module
28+
console.log('walnut initialized', Module != null)
29+
callback()
30+
})
31+
}
32+
33+
34+
function w_AllocateFloatVertexArray(vertexCount){
35+
let vertexPointer = module.exports.walnut._AllocateFloatVertexArray(/*max_vertices=*/vertexCount)
36+
let vertices = module.exports.walnut.HEAPF32.subarray(vertexPointer/4, vertexPointer/4 + vertexCount*3)
37+
vertices.vertexPointer = vertexPointer
38+
vertices.vertexCount = vertexCount
39+
vertices.free = ()=> module.exports.walnut._FreeFloatVertexArray(vertexPointer)
40+
return vertices
41+
}
42+
43+
function toWalnut(obj){
44+
if(obj.transforms && !mat4.isIdentity(obj.transforms)) return toWalnutTransformed(obj)
45+
let vertexCount = 0
46+
obj.polygons.forEach(p=>vertexCount += p.length)
47+
let mesh = module.exports.walnut._AllocateMesh(vertexCount)
48+
49+
polyBuffer = w_AllocateFloatVertexArray(4096)
50+
tmpBuffer = module.exports.walnut._AllocateTempVertexBuffer()
51+
52+
obj.polygons.forEach(p=>{
53+
if(p.vertices) p = p.vertices // jscad format
54+
let count = 0
55+
p.forEach(v=>{
56+
polyBuffer.set(v, count)// count is also offset
57+
count += 3
58+
})
59+
module.exports.walnut._AddFloatPolygonToMesh(count/3, polyBuffer.vertexPointer, tmpBuffer, mesh, PRECISION)
60+
})
61+
62+
module.exports.walnut._FreeTempVertexBuffer(tmpBuffer)
63+
polyBuffer.free()
64+
65+
mesh.vertexCount = vertexCount
66+
return mesh
67+
}
68+
69+
// apply transform during conversion to walnut internal model
70+
function toWalnutTransformed(obj){
71+
let { transforms } = obj
72+
let vertexCount = 0
73+
obj.polygons.forEach(p=>vertexCount += p.length)
74+
let mesh = module.exports.walnut._AllocateMesh(vertexCount)
75+
76+
let v = [0,0,0]
77+
obj.polygons.forEach(p=>{
78+
if(p.vertices) p = p.vertices // jscad format
79+
let count = 0
80+
p.forEach(vIn=>{
81+
vec3.transform(v,vIn,transforms)
82+
polyBuffer.set(v, count)// count is also offset
83+
count += 3
84+
})
85+
module.exports.walnut._AddFloatPolygonToMesh(count/3, polyBuffer.vertexPointer, tmpBuffer, mesh, PRECISION)
86+
})
87+
mesh.vertexCount = vertexCount
88+
return mesh
89+
}
90+
91+
function toGeom(mesh){
92+
let triangleCount = module.exports.walnut._GetTriangleCountInMesh(mesh)
93+
let vertexCount = triangleCount * 3
94+
let vertexPointer = module.exports.walnut._AllocateFloatVertexArray(vertexCount)
95+
module.exports.walnut._GetFloatTrianglesFromMesh(mesh, vertexPointer)
96+
97+
let vertices = new Float32Array(vertexCount * 3)
98+
vertices.set(module.exports.walnut.HEAPF32.subarray(vertexPointer/4, vertexPointer/4 + vertexCount*3))
99+
let indices = new Uint16Array(vertexCount * 3)
100+
for (let i = 0; i < vertexCount; ++i) {
101+
indices[i] = i
102+
}
103+
module.exports.walnut._FreeFloatVertexArray(vertexPointer)
104+
return {indices, vertices, type: 'mesh'}
105+
}
106+
107+
function intersect(geom1, geom2){
108+
console.log('intersect', geom1, geom2);
109+
let time = Date.now()
110+
let wMesh1 = toWalnut(geom1)
111+
console.log('Mesh1 transfered to walnut ', Date.now() - time);
112+
time = Date.now()
113+
let wMesh2 = toWalnut(geom2)
114+
console.log('Mesh2 transfered to walnut ', Date.now() - time);
115+
116+
let wResult = module.exports.walnut._AllocateMesh(wMesh1.vertexCount)
117+
118+
let filterSuccess = module.exports.walnut._IntersectMeshes(wMesh1, wMesh2, wResult)
119+
console.log('intersect ', Date.now() - time);
120+
time = Date.now()
121+
122+
let result = toGeom(wResult)
123+
124+
module.exports.walnut._FreeMesh(wMesh1)
125+
module.exports.walnut._FreeMesh(wMesh2)
126+
module.exports.walnut._FreeMesh(wResult)
127+
128+
result.color = geom1.color
129+
result.transforms = Array(16)
130+
mat4.identity(result.transforms)
131+
console.log('filter result', filterSuccess, result)
132+
console.log('toGeom ', Date.now() - time);
133+
return result
134+
}
135+
136+
module.exports = {
137+
init: init,
138+
walnut: null,
139+
intersect: intersect
140+
}

packages/web/dist/jscad-web.min.js

Lines changed: 84546 additions & 3297 deletions
Large diffs are not rendered by default.

packages/web/dist/walnut.wasm

432 KB
Binary file not shown.

packages/web/postInstall.js

Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -72,3 +72,4 @@ const sortExamples = (examples) => {
7272
}
7373

7474
copyAndProcessExamples(examplesSrc)
75+
copydir.sync('node_modules/@jscad/modeling/node_modules/@bluelightning32/walnut/release/walnut.wasm', 'dist/walnut.wasm', { mode: false })

0 commit comments

Comments
 (0)