diff --git a/modules/math/vector.js b/modules/math/vector.js index 626bec75..c8cf55fe 100644 --- a/modules/math/vector.js +++ b/modules/math/vector.js @@ -132,6 +132,12 @@ export default class Vector { toArray() { return [this.x, this.y, this.z]; } + + copyToData(data) { + data[0] = this.x; + data[1] = this.y; + data[2] = this.z; + } static fromData(arr) { return new Vector().set3(arr); diff --git a/web/app/cad/craft/craftEnginePlugin.js b/web/app/cad/craft/craftEnginePlugin.js new file mode 100644 index 00000000..ac75417e --- /dev/null +++ b/web/app/cad/craft/craftEnginePlugin.js @@ -0,0 +1,6 @@ +import defaultCraftEngine from './defaultCraftEngine'; + + +export function activate(ctx) { + ctx.services.craftEngine = defaultCraftEngine +} \ No newline at end of file diff --git a/web/app/cad/craft/defaultCraftEngine.js b/web/app/cad/craft/defaultCraftEngine.js new file mode 100644 index 00000000..8d8681ce --- /dev/null +++ b/web/app/cad/craft/defaultCraftEngine.js @@ -0,0 +1,14 @@ + +export default { + + createBox: params => notImplemented, + createSphere: params => notImplemented, + createCone: params => notImplemented, + createCylinder: params => notImplemented, + createTorus: params => notImplemented, + +} + +function notImplemented() { + throw "engine doesn't support this operation" +} \ No newline at end of file diff --git a/web/app/cad/craft/primitives/box/boxOperation.js b/web/app/cad/craft/primitives/box/boxOperation.js index 3c9e120a..c56cfab1 100644 --- a/web/app/cad/craft/primitives/box/boxOperation.js +++ b/web/app/cad/craft/primitives/box/boxOperation.js @@ -2,14 +2,16 @@ import BoxWizard from './BoxWizard'; import {BoxGeometry} from 'three'; import schema from './boxOpSchema'; import primitivePreviewer from '../primitivePreviewer'; +import CSys from '../../../../math/csys'; +import datumConsumingOperation from '../datumConsumingOperation'; function run(params, services) { - let mDatum = params.datum && services.cadRegistry.findDatum(params.datum); - - return { - outdated: mDatum ? [mDatum] : [], - created: [] - } + return datumConsumingOperation(params, services, csys => services.craftEngine.createBox({ + csys, + width: params.width, + height: params.height, + depth: params.depth + })); } export default { diff --git a/web/app/cad/craft/primitives/cone/coneOperation.js b/web/app/cad/craft/primitives/cone/coneOperation.js index f9446720..05616160 100644 --- a/web/app/cad/craft/primitives/cone/coneOperation.js +++ b/web/app/cad/craft/primitives/cone/coneOperation.js @@ -4,14 +4,15 @@ import ConeWizard from './ConeWizard'; import {IMAGINARY_SURFACE_MATERIAL} from '../../../preview/scenePreviewer'; import CSys from '../../../../math/csys'; import * as SceneGraph from '../../../../../../modules/scene/sceneGraph'; +import datumConsumingOperation from '../datumConsumingOperation'; function run(params, services) { - let mDatum = params.datum && services.cadRegistry.findDatum(params.datum); - - return { - outdated: mDatum ? [mDatum] : [], - created: [] - } + return datumConsumingOperation(params, services, csys => services.craftEngine.createCone({ + csys, + radius: params.radius, + frustum: params.frustum, + height: params.height + })); } function previewer(ctx, initialParams) { diff --git a/web/app/cad/craft/primitives/cylinder/cylinderOperation.js b/web/app/cad/craft/primitives/cylinder/cylinderOperation.js index 096f27f0..a1be3947 100644 --- a/web/app/cad/craft/primitives/cylinder/cylinderOperation.js +++ b/web/app/cad/craft/primitives/cylinder/cylinderOperation.js @@ -2,14 +2,14 @@ import {CylinderGeometry} from 'three'; import schema from './cylinderOpSchema'; import primitivePreviewer from '../primitivePreviewer'; import CylinderWizard from './CylinderWizard'; +import datumConsumingOperation from '../datumConsumingOperation'; function run(params, services) { - let mDatum = params.datum && services.cadRegistry.findDatum(params.datum); - - return { - outdated: mDatum ? [mDatum] : [], - created: [] - } + return datumConsumingOperation(params, services, csys => services.craftEngine.createCylinder({ + csys, + radius: params.radius, + height: params.height + })); } export default { diff --git a/web/app/cad/craft/primitives/datumConsumingOperation.js b/web/app/cad/craft/primitives/datumConsumingOperation.js new file mode 100644 index 00000000..7b1ba2db --- /dev/null +++ b/web/app/cad/craft/primitives/datumConsumingOperation.js @@ -0,0 +1,8 @@ +export default function datumConsumingOperation(params, services, run) { + let mDatum = params.datum && services.cadRegistry.findDatum(params.datum); + let res = run(mDatum.csys); + if (mDatum) { + res.outdated.push(mDatum); + } + return res; +} \ No newline at end of file diff --git a/web/app/cad/craft/primitives/sphere/sphereOperation.js b/web/app/cad/craft/primitives/sphere/sphereOperation.js index 31038616..0e9394bc 100644 --- a/web/app/cad/craft/primitives/sphere/sphereOperation.js +++ b/web/app/cad/craft/primitives/sphere/sphereOperation.js @@ -2,14 +2,13 @@ import {SphereGeometry} from 'three'; import schema from './sphereOpSchema'; import primitivePreviewer from '../primitivePreviewer'; import SphereWizard from './SphereWizard'; +import datumConsumingOperation from '../datumConsumingOperation'; function run(params, services) { - let mDatum = params.datum && services.cadRegistry.findDatum(params.datum); - - return { - outdated: mDatum ? [mDatum] : [], - created: [] - } + return datumConsumingOperation(params, services, csys => services.craftEngine.createSphere({ + csys, + radius: params.radius, + })); } export default { diff --git a/web/app/cad/craft/primitives/torus/torusOperation.js b/web/app/cad/craft/primitives/torus/torusOperation.js index 613f48f0..0d354233 100644 --- a/web/app/cad/craft/primitives/torus/torusOperation.js +++ b/web/app/cad/craft/primitives/torus/torusOperation.js @@ -4,14 +4,14 @@ import TorusWizard from './TorusWizard'; import {IMAGINARY_SURFACE_MATERIAL} from '../../../preview/scenePreviewer'; import CSys from '../../../../math/csys'; import * as SceneGraph from '../../../../../../modules/scene/sceneGraph'; +import datumConsumingOperation from '../datumConsumingOperation'; function run(params, services) { - let mDatum = params.datum && services.cadRegistry.findDatum(params.datum); - - return { - outdated: mDatum ? [mDatum] : [], - created: [] - } + return datumConsumingOperation(params, services, csys => services.craftEngine.createTorus({ + csys, + radius: params.radius, + tube: params.tube + })); } function previewer(ctx, initialParams) { diff --git a/web/app/cad/init/startApplication.js b/web/app/cad/init/startApplication.js index 7feaf96e..1567b087 100644 --- a/web/app/cad/init/startApplication.js +++ b/web/app/cad/init/startApplication.js @@ -41,9 +41,9 @@ export default function startApplication(callback) { UiEntryPointsPlugin, MenuPlugin, KeyboardPlugin, - ExtensionsPlugin, OperationPlugin, CraftPlugin, + ExtensionsPlugin, WizardPlugin, PreviewPlugin, CraftUiPlugin, diff --git a/web/app/math/vec.js b/web/app/math/vec.js index e37ff5a0..573fb423 100644 --- a/web/app/math/vec.js +++ b/web/app/math/vec.js @@ -120,6 +120,25 @@ export function length(v) { return Math.sqrt(lengthSq(v)); } +export function copy(to, from) { + for (let i = 0; i < v.length; i++) { + to[i] = from(v[i]); + } + return to; +} + +export function clone(v) { + return copy(create(v.length), v); +} + +export function create(dim) { + let out = []; + for (let i = 0; i < dim; i++) { + out[i] = 0; + } + return out; +} + const sq = v => v * v; export function distanceSq(v1, v2) {