From 329ab4546c51f954deb5e0bab1d56fd584b40fe2 Mon Sep 17 00:00:00 2001 From: Leo Yang Date: Mon, 20 Apr 2020 21:58:44 -0400 Subject: [PATCH] Added sample-meshing --- sample-meshing/.eslintrc.js | 28 +++++++ sample-meshing/.gitignore | 5 ++ sample-meshing/app.package | 5 ++ sample-meshing/manifest.xml | 19 +++++ sample-meshing/package.json | 24 ++++++ sample-meshing/res/.placeholder | 0 sample-meshing/rollup.config.js | 16 ++++ sample-meshing/src/app.js | 132 ++++++++++++++++++++++++++++++++ sample-meshing/src/main.js | 12 +++ sample-meshing/tsconfig.json | 7 ++ 10 files changed, 248 insertions(+) create mode 100644 sample-meshing/.eslintrc.js create mode 100644 sample-meshing/.gitignore create mode 100644 sample-meshing/app.package create mode 100644 sample-meshing/manifest.xml create mode 100644 sample-meshing/package.json create mode 100644 sample-meshing/res/.placeholder create mode 100644 sample-meshing/rollup.config.js create mode 100644 sample-meshing/src/app.js create mode 100644 sample-meshing/src/main.js create mode 100644 sample-meshing/tsconfig.json diff --git a/sample-meshing/.eslintrc.js b/sample-meshing/.eslintrc.js new file mode 100644 index 0000000..9ad0889 --- /dev/null +++ b/sample-meshing/.eslintrc.js @@ -0,0 +1,28 @@ +// ESLint config for MagicScript Apps +module.exports = { + env: { + "es6": true + }, + globals: { + // These globals are provided by the vm itself. + "print": true, + "globalThis": true, + // The following globals are provided by `magic-script-polyfills` + "setTimeout": true, + "clearTimeout": true, + "setInterval": true, + "clearInterval": true, + "setImmediate": true, + "clearImmediate": true, + "fetch": true, + "Headers": true, + "Request": true, + "Response": true, + + }, + parserOptions: { + "ecmaVersion": 2018, + "sourceType": "module" + }, + extends: "semistandard", +}; \ No newline at end of file diff --git a/sample-meshing/.gitignore b/sample-meshing/.gitignore new file mode 100644 index 0000000..1965231 --- /dev/null +++ b/sample-meshing/.gitignore @@ -0,0 +1,5 @@ +/.out/ +/node_modules/ +/bin/ +!/bin/index.js +/digest.sha512.signed diff --git a/sample-meshing/app.package b/sample-meshing/app.package new file mode 100644 index 0000000..abce100 --- /dev/null +++ b/sample-meshing/app.package @@ -0,0 +1,5 @@ +DATAS = "digest.sha512.signed" : "." \ + "res/" : "res/" \ + "bin/" : "bin/" +OPTIONS = package/minApiLevel/2 +USES = mxs_lumin_runtime diff --git a/sample-meshing/manifest.xml b/sample-meshing/manifest.xml new file mode 100644 index 0000000..5f32975 --- /dev/null +++ b/sample-meshing/manifest.xml @@ -0,0 +1,19 @@ + + + + + + + + + + + diff --git a/sample-meshing/package.json b/sample-meshing/package.json new file mode 100644 index 0000000..ef32782 --- /dev/null +++ b/sample-meshing/package.json @@ -0,0 +1,24 @@ +{ + "scripts": { + "build": "rollup -c", + "start": "magic-script run" + }, + "private": true, + "devDependencies": { + "eslint-config-semistandard": "^13.0.0", + "eslint-config-standard": "^12.0.0", + "eslint-plugin-import": "^2.16.0", + "eslint-plugin-node": "^8.0.1", + "eslint-plugin-promise": "^4.0.1", + "eslint-plugin-standard": "^4.0.0", + "magic-script-typings": "^1.6.0", + "rollup": "^1.1.2", + "rollup-plugin-commonjs": "^9.3.4", + "rollup-plugin-node-resolve": "^4.0.0", + "semistandard": "^13.0.1" + }, + "dependencies": { + "magic-script-polyfills": "^2.6.2", + "gl-matrix": "^3.0.0" + } +} diff --git a/sample-meshing/res/.placeholder b/sample-meshing/res/.placeholder new file mode 100644 index 0000000..e69de29 diff --git a/sample-meshing/rollup.config.js b/sample-meshing/rollup.config.js new file mode 100644 index 0000000..6b4aebb --- /dev/null +++ b/sample-meshing/rollup.config.js @@ -0,0 +1,16 @@ +// Rollup config for consuming some npm modules in MagicScript + +import resolve from 'rollup-plugin-node-resolve'; +import commonjs from 'rollup-plugin-commonjs'; +import polyfill from 'magic-script-polyfills/rollup-plugin-node.js' + +export default { + external: ['uv', 'lumin', 'ssl', 'png', 'jpeg', 'gl', 'egl'], + input: 'src/main.js', + preserveModules: true, + output: { + dir: 'bin', + format: 'es' + }, + plugins: [polyfill(), resolve(), commonjs()] +}; diff --git a/sample-meshing/src/app.js b/sample-meshing/src/app.js new file mode 100644 index 0000000..4ec3451 --- /dev/null +++ b/sample-meshing/src/app.js @@ -0,0 +1,132 @@ +/* eslint-disable space-before-function-paren */ +import { + GestureInputEventData, + ImmersiveApp, + KeyInputEventData, + WorldMeshBlockEventData, + densemesh, + input, + ui +} from 'lumin'; + +import { + quat, + vec3 +} from 'gl-matrix'; + +export class App extends ImmersiveApp { + onAppStart () { + this.stopping = false; + + this.prism = this.requestNewPrism([100, 100, 100]); + this.selectPrism(this.prism, true); + + this.positionPrism(this.prism, [0, 0, 0]); + this.orientPrism(this.prism, quat.invert([], this.prism.getRotation())); + ui.Cursor.SetEnabled(this.prism, false); + + this.headposInfo = this.prism.retainHeadposeUpdates(); + this.prism.setPhysicsEnabled(true); + this.prism.setPhysicsPaused(false); + this.prism.setPhysicsWorldMeshEnabled(true); + this.meshMap = {}; + + this.meshing = this.requestWorldMeshBlockUpdates(this.prism); + } + + eventListener(event) { + if (event instanceof GestureInputEventData && event.getGesture() === input.GestureType.TriggerDown) { + if (this.meshing) { + this.meshing = !this.stopWorldMeshBlockUpdates(this.prism); + } else { + this.meshing = this.requestWorldMeshBlockUpdates(this.prism); + } + if (!this.meshing) { + this.clearAll(); + } + console.log(`meshing=${this.meshing}`); + return true; + } + + if (event instanceof WorldMeshBlockEventData && this.meshing) { + this.handleWorldMeshEvent(event); + return true; + } + + if (event instanceof KeyInputEventData && event.keyCode() === input.KeyCodes.AKEYCODE_EX_HOME_TAP) { + this.stopping = true; + return true; + } + + return super.eventListener(event); + } + + updateLoop(delta) { + if (this.stopping) { + return false; + } + return super.updateLoop(delta); + } + + /** + * + * @param {WorldMeshBlockEventData} event + */ + handleWorldMeshEvent(event) { + switch (event.getUpdateType()) { + case densemesh.MeshBlockUpdate.kNew: + this.meshBlock(event.getData()); + break; + case densemesh.MeshBlockUpdate.kChanged: + this.meshBlock(event.getData()); + break; + case densemesh.MeshBlockUpdate.kDeleted: + this.clearBlock(event.getBlockId()); + break; + default: + break; + } + } + + clearBlock(blockId) { + let node = this.meshMap[blockId]; + if (node) { + this.prism.deleteNode(node); + delete this.meshMap[blockId]; + } + } + + /** + * + * @param {WorldMeshBlockData} block + */ + meshBlock(block) { + if (block.isValid()) { + let id = block.getId(); + this.clearBlock(id); + let node = this.prism.createLineNode(); + this.meshMap[id] = node; + + let vecs = block.getVertices(); + let indices = block.getIndices(); + let normals = block.getNormals(); + let offset = 0.03; + let count = indices.length; + for (let i = 0; i < count; i += 3) { + node.addPoints(vec3.scaleAndAdd([], vecs[indices[i]], normals[indices[i + 1]], offset)); + node.addPoints(vec3.scaleAndAdd([], vecs[indices[i + 1]], normals[indices[i + 1]], offset)); + node.addPoints(vec3.scaleAndAdd([], vecs[indices[i + 2]], normals[indices[i + 2]], offset)); + node.addPoints(vec3.scaleAndAdd([], vecs[indices[i]], normals[indices[i]], offset)); + node.addLineBreak(); + } + this.prism.getRootNode().addChild(node); + } + } + + clearAll() { + for (let blockId in this.meshMap) { + this.prism.deleteNode(this.meshMap[blockId]); + } + this.meshMap = {}; + } +} diff --git a/sample-meshing/src/main.js b/sample-meshing/src/main.js new file mode 100644 index 0000000..f813f95 --- /dev/null +++ b/sample-meshing/src/main.js @@ -0,0 +1,12 @@ +// Add support for things like setTimeout, setInterval and fetch. +// Simply importing this sets all these as global definitions. +// They are declared in the .eslintrc so your editor won't complain. +import 'magic-script-polyfills'; + +// Load main app logic from the app class. +import { App } from './app.js'; + +// Launch our app! +// The 0.5 value is the number of seconds to call `updateLoop` in an interval if +// there are no other events waking the event loop. +export default new App(0.5); diff --git a/sample-meshing/tsconfig.json b/sample-meshing/tsconfig.json new file mode 100644 index 0000000..e9146a8 --- /dev/null +++ b/sample-meshing/tsconfig.json @@ -0,0 +1,7 @@ +{ + "compilerOptions": { + "allowJs": true, + "noEmit": true, + "typeRoots" : ["./node_modules/magic-script-typings", "./node_modules/@types"] + } +}