Fix JSCAD download (#528)

This commit was merged in pull request #528.
This commit is contained in:
Kurt Hutten
2021-09-24 17:59:09 +10:00
committed by GitHub
parent d255a78cd1
commit 8170da854d
3 changed files with 49 additions and 46 deletions

View File

@@ -161,8 +161,9 @@ const IdeViewer = ({ Loading }) => {
setImage(state.objectData?.type === 'png' && state.objectData?.data) setImage(state.objectData?.type === 'png' && state.objectData?.data)
setIsDragging(false) setIsDragging(false)
}, [state.objectData?.type, state.objectData?.data]) }, [state.objectData?.type, state.objectData?.data])
const R3FComponent = React.useMemo( const PrimitiveArray = React.useMemo(
() => state.objectData?.type === 'r3f-component' && state.objectData?.data, () =>
state.objectData?.type === 'primitive-array' && state.objectData?.data,
[state.objectData?.type, state.objectData?.data] [state.objectData?.type, state.objectData?.data]
) )
@@ -266,7 +267,10 @@ const IdeViewer = ({ Loading }) => {
{state.objectData?.type === 'geometry' && state.objectData?.data && ( {state.objectData?.type === 'geometry' && state.objectData?.data && (
<Asset geometry={state.objectData?.data} /> <Asset geometry={state.objectData?.data} />
)} )}
{R3FComponent && <R3FComponent />} {PrimitiveArray &&
PrimitiveArray.map((mesh, index) => (
<primitive object={mesh} key={index} />
))}
</Canvas> </Canvas>
</div> </div>
<DelayedPingAnimation isLoading={state.isLoading} /> <DelayedPingAnimation isLoading={state.isLoading} />

View File

@@ -21,7 +21,7 @@ export interface RenderArgs {
} }
} }
export type ArtifactTypes = 'stl' | 'png' | 'geometry' | 'r3f-component' export type ArtifactTypes = 'stl' | 'png' | 'geometry' | 'primitive-array'
export interface HealthyResponse { export interface HealthyResponse {
status: 'healthy' status: 'healthy'

View File

@@ -41,50 +41,49 @@ interface CsgObj {
} }
function CSGArray2R3fComponent(Csgs: CsgObj[]): React.ReactNode { function CSGArray2R3fComponent(Csgs: CsgObj[]): React.ReactNode {
return () => return Csgs.map(({ vertices, indices, color, transforms, type }, index) => {
Csgs.map(({ vertices, indices, color, transforms, type }, index) => { const materialDef = materials[type]
const materialDef = materials[type] if (!materialDef) {
if (!materialDef) { console.error('Can not hangle object type: ' + type, {
console.error('Can not hangle object type: ' + type, { vertices,
vertices, indices,
indices, color,
color, transforms,
transforms, type,
type, })
}) return null
return null }
}
let material = materialDef.def let material = materialDef.def
if (color) { if (color) {
const [r, g, b, opacity] = color const [r, g, b, opacity] = color
material = materialDef.material({ material = materialDef.material({
color: new Color(r, g, b), color: new Color(r, g, b),
flatShading: true, flatShading: true,
opacity: opacity === void 0 ? 1 : opacity, opacity: opacity === void 0 ? 1 : opacity,
transparent: opacity != 1 && opacity !== void 0, transparent: opacity != 1 && opacity !== void 0,
}) })
} }
const geo = new BufferGeometry() const geo = new BufferGeometry()
geo.setAttribute('position', new BufferAttribute(vertices, 3)) geo.setAttribute('position', new BufferAttribute(vertices, 3))
let mesh let mesh
switch (type) { switch (type) {
case 'mesh': case 'mesh':
geo.setIndex(new BufferAttribute(indices, 1)) geo.setIndex(new BufferAttribute(indices, 1))
mesh = new Mesh(geo, material) mesh = new Mesh(geo, material)
break break
case 'line': case 'line':
mesh = new Line(geo, material) mesh = new Line(geo, material)
break break
case 'lines': case 'lines':
mesh = new LineSegments(geo, material) mesh = new LineSegments(geo, material)
break break
} }
if (transforms) mesh.applyMatrix4({ elements: transforms }) if (transforms) mesh.applyMatrix4({ elements: transforms })
return <primitive object={mesh} key={index} /> return mesh
}) })
} }
let scriptWorker let scriptWorker
@@ -146,7 +145,7 @@ export const render: DefaultKernelExport['render'] = async ({
} else { } else {
workerHelper.resolver( workerHelper.resolver(
createHealthyResponse({ createHealthyResponse({
type: 'r3f-component', type: 'primitive-array',
data: CSGArray2R3fComponent(data.entities), data: CSGArray2R3fComponent(data.entities),
consoleMessage: data.scriptStats, consoleMessage: data.scriptStats,
date: new Date(), date: new Date(),