Repository: cyrildiagne/ar-facedoodle Branch: master Commit: 43573ee72664 Files: 14 Total size: 131.6 KB Directory structure: gitextract_hzz635gr/ ├── .gitignore ├── LICENSE ├── README.md ├── index.html ├── package.json ├── src/ │ ├── colorpicker.js │ ├── facemesh.js │ ├── main.js │ ├── refmesh.js │ ├── three.js │ ├── triangulation.js │ └── vendor/ │ └── OBJLoader.js ├── static/ │ └── facemesh.obj └── style/ └── main.scss ================================================ FILE CONTENTS ================================================ ================================================ FILE: .gitignore ================================================ node_modules .DS_Store .cache dist ================================================ FILE: LICENSE ================================================ MIT License Copyright (c) 2020 Cyril Diagne Permission is hereby granted, free of charge, to any person obtaining a copy of this software and associated documentation files (the "Software"), to deal in the Software without restriction, including without limitation the rights to use, copy, modify, merge, publish, distribute, sublicense, and/or sell copies of the Software, and to permit persons to whom the Software is furnished to do so, subject to the following conditions: The above copyright notice and this permission notice shall be included in all copies or substantial portions of the Software. THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE. ================================================ FILE: README.md ================================================ # AR Face Doodle Doodle on your face with AR directly from the web browser thanks to [Tensorflow.js](https://www.tensorflow.org/js), [FaceMesh](https://github.com/tensorflow/tfjs-models/tree/master/facemesh) and [Three.js](https://threejs.org/). ![debug](doc/debug.gif) Demo: [https://cyrildiagne.github.io/ar-facedoodle](https://cyrildiagne.github.io/ar-facedoodle) ## Setup ``` npm install && npm start ``` ## Thanks and acknowledgement - [tensorflow/tfjs-models facemesh](https://github.com/tensorflow/tfjs-models/tree/master/facemesh) For the face detection model - [shawticus/facemesh-threejs](https://github.com/shawticus/facemesh-threejs) For the facemesh OBJ model - [mourner/simplify.js](https://github.com/mourner/simplify-js) For the line smoothing - [mrdoob/three.js](https://github.com/mrdoob/three.js) For the 3D engine ================================================ FILE: index.html ================================================ AR Face Doodle

AR Face Doodle

Doodle on your face with AR directly from the web browser thanks to Tensorflow.js, FaceMesh and Three.js.

Created by Cyril Diagne

Code on Github

================================================ FILE: package.json ================================================ { "name": "ar-facedoodle", "version": "1.0.0", "description": "Doodle on your face using AR", "repository": "https://github.com/cyrildiagne/ar-facedoodle", "scripts": { "start": "parcel index.html --host 0.0.0.0", "deploy": "parcel build index.html --no-source-maps --public-url /ar-facedoodle/ && gh-pages -d dist", "test": "echo \"Error: no test specified\" && exit 1" }, "author": "https://twitter.com/cyrildiagne", "license": "MIT", "eslintConfig": { "extends": [ "prettier-standard" ] }, "prettier": "prettier-config-standard", "sass": { "includePaths": [ "./node_modules" ] }, "babel": { "presets": [ [ "env", { "esmodules": false, "targets": { "browsers": [ "> 3%" ] } } ] ], "plugins": [ [ "@babel/plugin-transform-runtime" ] ] }, "dependencies": { "@material/icon-button": "^6.0.0", "@material/slider": "^6.0.0", "@tensorflow-models/facemesh": "0.0.1", "@tensorflow/tfjs-converter": "^1.7.3", "@tensorflow/tfjs-core": "^1.7.3", "a-color-picker": "^1.2.1", "simplify-js": "^1.2.4", "three": "^0.115.0" }, "devDependencies": { "@babel/core": "^7.9.0", "@babel/plugin-transform-runtime": "^7.9.0", "@babel/preset-env": "^7.9.5", "@babel/runtime": "^7.9.2", "babel-preset-env": "^1.7.0", "eslint": "^6.8.0", "eslint-config-prettier": "^6.11.0", "eslint-config-prettier-standard": "^3.0.1", "eslint-config-standard": "^14.1.1", "eslint-plugin-import": "^2.20.2", "eslint-plugin-node": "^11.1.0", "eslint-plugin-prettier": "^3.1.3", "eslint-plugin-promise": "^4.2.1", "eslint-plugin-standard": "^4.0.1", "gh-pages": "^2.2.0", "node-sass-package-importer": "^5.3.2", "parcel-bundler": "^1.12.4", "parcel-plugin-clean-dist": "0.0.6", "parcel-plugin-static-files-copy": "^2.3.1", "prettier": "^2.0.5", "prettier-config-standard": "^1.0.1", "sass": "^1.26.5" } } ================================================ FILE: src/colorpicker.js ================================================ import * as colorpicker from 'a-color-picker' function init(callback) { const bt = document.getElementById('bt-picker') bt.addEventListener('click', btClicked) colorpicker.from('.picker').on('change', (picker, color) => { if (color === 'rgb(255, 255, 255)') { bt.style.color = 'black' } else { bt.style.color = color } const cursor = document.querySelector('.cursor') cursor.style.backgroundColor = bt.style.color callback(color) }) } function btClicked() { const el = document.querySelector('.picker') el.style.display = 'block' const closeSurface = document.createElement('div') closeSurface.classList = 'close-color' document.body.prepend(closeSurface) closeSurface.addEventListener('click', () => { el.style.display = 'none' closeSurface.remove() }) } export default { init } ================================================ FILE: src/facemesh.js ================================================ import * as facemesh from '@tensorflow-models/facemesh' import * as tf from '@tensorflow/tfjs-core' import { TRIANGULATION } from './triangulation' let model let canvas let ctx const state = { backend: 'webgl' } async function init(video) { await tf.setBackend(state.backend) model = await facemesh.load({ maxFaces: 1 }) } async function update(video, debug = false) { const predictions = await model.estimateFaces(video) if (debug) { drawDebug(video, predictions) } if (predictions.length > 0) { return predictions[0] } } function drawDebug(video, predictions) { if (!ctx) { createDebug() } ctx.drawImage( video, 0, 0, video.videoWidth, video.videoHeight, 0, 0, canvas.width, canvas.height ) if (predictions.length > 0) { predictions.forEach(prediction => { const keypoints = prediction.scaledMesh if (state.triangulateMesh) { for (let i = 0; i < TRIANGULATION.length / 3; i++) { const points = [ TRIANGULATION[i * 3], TRIANGULATION[i * 3 + 1], TRIANGULATION[i * 3 + 2] ].map(index => keypoints[index]) drawPath(ctx, points, true) } } else { for (let i = 0; i < keypoints.length; i++) { const x = keypoints[i][0] const y = keypoints[i][1] ctx.beginPath() ctx.arc(x, y, 1 /* radius */, 0, 2 * Math.PI) ctx.fill() } } }) } } function createDebug(video) { canvas = document.createElement('canvas') canvas.width = video.width canvas.height = video.height ctx = canvas.getContext('2d') ctx.translate(canvas.width, 0) ctx.scale(-1, 1) ctx.fillStyle = '#32EEDB' ctx.strokeStyle = '#32EEDB' ctx.lineWidth = 0.5 return canvas } function drawPath(ctx, points, closePath) { const region = new Path2D() region.moveTo(points[0][0], points[0][1]) for (let i = 1; i < points.length; i++) { const point = points[i] region.lineTo(point[0], point[1]) } if (closePath) { region.closePath() } ctx.stroke(region) } export default { init, update } ================================================ FILE: src/main.js ================================================ import facemesh from './facemesh' import refmesh from './refmesh' import three from './three' import colorpicker from './colorpicker' import { MDCSlider } from '@material/slider/dist/mdc.slider' const useCamera = true let video let threeEl let cursorEl let paused = false let drawing = false async function setupCamera() { video = document.createElement('video') const stream = await navigator.mediaDevices.getUserMedia({ audio: false, video: { facingMode: 'user', width: 640, height: 640 } }) video.srcObject = stream return new Promise(resolve => { video.onloadedmetadata = () => { resolve(video) } }) } async function update() { // Update facemesh. if (useCamera) { const face = await facemesh.update(video) // Update three scene. if (face) { three.update(face.scaledMesh) } } else { three.update(refmesh.debugPoints) } // Call for RAF if scene is not paused. if (!paused) { window.requestAnimationFrame(update) } } function onMouseDown(evt) { drawing = true } function onMouseMove(evt) { const rect = threeEl.getBoundingClientRect() const x = rect.width - (evt.clientX - rect.x) const y = evt.clientY - rect.y cursorEl.style.left = evt.clientX + 'px' cursorEl.style.top = evt.clientY + 'px' if (drawing) { three.draw({ x, y }) } else { const isOver = three.isOverFace({ x, y }) if (isOver) { document.body.classList.add('hover-face') } else { if (document.body.classList.contains('hover-face')) { document.body.classList.remove('hover-face') } } } } function onMouseUp(evt) { three.end() drawing = false document.body.classList.remove('hover-face') } function onTouchStart(evt) { window.addEventListener('touchmove', onTouchMove) } function onTouchMove(evt) { const rect = threeEl.getBoundingClientRect() const x = rect.width - (evt.touches[0].clientX - rect.x) const y = evt.touches[0].clientY - rect.y three.draw({ x, y }) } function onTouchEnd(evt) { three.end() window.removeEventListener('touchmove', onTouchMove) } function play() { paused = false window.requestAnimationFrame(update) document.body.classList.remove('paused') } function pause() { paused = true document.body.classList.add('paused') } async function init() { if (useCamera) { // Initialize camera. console.log('setting up camera...') await setupCamera() video.play() video.width = video.videoWidth video.height = video.videoHeight // Initialize face mesh. console.log('setting up facemesh...') await facemesh.init(video) } // Initialize threejs scene. console.log('setting up threejs...') threeEl = await three.init(video) threeEl.classList.add('three-canvas') threeEl.addEventListener('mousedown', onMouseDown) threeEl.addEventListener('mousemove', onMouseMove) window.addEventListener('mouseup', onMouseUp) threeEl.addEventListener('touchstart', onTouchStart) window.addEventListener('touchend', onTouchEnd) document.querySelector('.container').prepend(threeEl) // Launch update loop. update() window.addEventListener('blur', pause) window.addEventListener('focus', play) // Setup UI. // Color picker colorpicker.init(color => (three.params.color = color)) // Slider. const slider = new MDCSlider(document.querySelector('.mdc-slider')) const thumb = document.querySelector('.mdc-slider__thumb') thumb.style.transform = 'scale(1)' const pin = document.querySelector('.mdc-slider__pin') pin.style.bottom = '10px' slider.listen('MDCSlider:input', () => { const thickness = parseInt(slider.value) thumb.style.transform = `scale(${1 + thickness / 50})` pin.style.bottom = `${10 + thickness}px` three.params.thickness = thickness // Update cursor size. const size = Math.max(2, thickness / 2) cursorEl.style.width = size + 'px' cursorEl.style.height = size + 'px' }) // Undo button. const undoEl = document.getElementById('undo') undoEl.addEventListener('click', () => three.undo()) // Clear button. const clearEl = document.getElementById('clear') clearEl.addEventListener('click', () => three.clear()) // Debug button. const debugEl = document.getElementById('debug') debugEl.addEventListener('click', () => three.setDebug(!three.params.debug)) // Info bt. const infoBt = document.getElementById('bt-info') const infoEl = document.getElementById('info') infoBt.addEventListener('click', () => { infoEl.classList.toggle('show') }) infoEl.addEventListener('click', () => { infoEl.classList.remove('show') }) // Setup cursor. cursorEl = document.createElement('div') cursorEl.classList.add('cursor') document.body.append(cursorEl) // Done. document.body.classList.remove('loading') } window.onload = () => { console.log('init') init() } ================================================ FILE: src/refmesh.js ================================================ const debugPoints = [ [298.1790771484375, 387.03167724609375, -14.120745658874512], [300.2152099609375, 358.21246337890625, -31.661890029907227], [298.96722412109375, 366.7823486328125, -15.867902755737305], [293.5539245605469, 323.68035888671875, -25.673297882080078], [300.63177490234375, 347.752197265625, -34.1967887878418], [300.7069091796875, 333.7161865234375, -32.46065139770508], [300.5322265625, 300.4746398925781, -18.32489585876465], [240.8586883544922, 297.0817565917969, 3.295238494873047], [300.92578125, 275.4305114746094, -15.480683326721191], [301.3796691894531, 261.49365234375, -17.565792083740234], [302.217041015625, 210.05763244628906, -14.386534690856934], [297.95367431640625, 391.622314453125, -13.00723934173584], [297.69073486328125, 394.67401123046875, -10.971356391906738], [297.4516296386719, 395.25830078125, -8.254570960998535], [297.35955810546875, 395.1733093261719, -7.759902477264404], [297.3115234375, 398.7442932128906, -8.650358200073242], [297.1659240722656, 403.46270751953125, -9.953529357910156], [296.94647216796875, 409.1010437011719, -9.312821388244629], [296.3753662109375, 420.02447509765625, -3.8191821575164795], [299.82757568359375, 363.11761474609375, -28.395206451416016], [291.6897888183594, 361.4345703125, -20.3421573638916], [213.03945922851562, 255.58355712890625, 27.743202209472656], [264.42474365234375, 306.226318359375, -1.8822672367095947], [256.2830505371094, 306.6920166015625, -1.6084545850753784], [248.49008178710938, 305.7471923828125, -0.14808014035224915], [237.83763122558594, 300.2297668457031, 4.426307678222656], [271.3021240234375, 303.95501708984375, -0.9919998049736023], [253.87518310546875, 282.31085205078125, -5.48806619644165], [262.4411315917969, 283.13909912109375, -5.154913902282715], [245.84014892578125, 283.3853759765625, -3.5459940433502197], [240.31863403320312, 286.40179443359375, -1.0740599632263184], [231.61756896972656, 305.4979248046875, 7.720613479614258], [266.0926208496094, 437.0557861328125, 4.119032382965088], [237.98028564453125, 294.822509765625, 5.135197639465332], [209.29916381835938, 299.28216552734375, 33.0094108581543], [223.00498962402344, 298.51361083984375, 13.069906234741211], [256.78436279296875, 344.7298278808594, -5.160249710083008], [287.23016357421875, 384.89739990234375, -13.86629581451416], [287.705078125, 393.78631591796875, -10.363572120666504], [275.5537109375, 385.8682861328125, -10.376333236694336], [267.7962646484375, 387.4253845214844, -5.726817607879639], [279.1785583496094, 392.824462890625, -8.098724365234375], [272.4394226074219, 392.031494140625, -3.8566644191741943], [257.9046325683594, 399.8031005859375, 4.221691131591797], [293.3802490234375, 357.6147155761719, -31.34697151184082], [292.6982116699219, 347.45318603515625, -33.692848205566406], [228.14358520507812, 273.68780517578125, -0.22682692110538483], [274.4689025878906, 321.60693359375, -6.838437080383301], [272.694580078125, 351.89569091796875, -17.42055892944336], [272.20538330078125, 346.319580078125, -15.844796180725098], [232.07119750976562, 341.92535400390625, 2.0097591876983643], [293.18707275390625, 334.4962158203125, -30.855125427246094], [247.62579345703125, 263.87725830078125, -10.370193481445312], [236.17752075195312, 266.8315124511719, -5.848870754241943], [220.88687133789062, 237.77780151367188, 15.25772762298584], [283.2908935546875, 273.1679382324219, -14.303738594055176], [269.8764343261719, 286.29296875, -3.0431814193725586], [251.19052124023438, 390.20758056640625, 4.918463230133057], [215.7345733642578, 389.6566162109375, 55.26961898803711], [278.395751953125, 357.6062927246094, -14.705124855041504], [285.4184265136719, 361.23248291015625, -14.602949142456055], [258.7841796875, 389.179443359375, 4.841699600219727], [262.52423095703125, 389.20587158203125, 3.359598159790039], [231.7601776123047, 259.27642822265625, -3.5835821628570557], [271.9053649902344, 355.42230224609375, -13.86953353881836], [262.9801330566406, 265.2060852050781, -13.379878044128418], [261.7451171875, 256.13360595703125, -15.21743106842041], [254.1462860107422, 214.2293701171875, -7.917967319488525], [226.5474090576172, 248.1802978515625, 4.397981643676758], [258.96881103515625, 234.41006469726562, -11.954970359802246], [223.42657470703125, 268.39898681640625, 4.354741096496582], [218.30630493164062, 262.5375061035156, 15.277050971984863], [287.3190612792969, 390.28955078125, -12.718772888183594], [277.6383361816406, 390.25811767578125, -9.428858757019043], [270.2147216796875, 389.89691162109375, -5.206142902374268], [280.3625793457031, 359.31280517578125, -13.175246238708496], [260.6769714355469, 389.10101318359375, 4.097344875335693], [265.0876770019531, 391.9786376953125, 0.5450502038002014], [263.56988525390625, 389.233154296875, 3.215026617050171], [283.59954833984375, 355.99798583984375, -23.133930206298828], [273.831298828125, 391.17767333984375, -2.83559250831604], [280.6111755371094, 392.79827880859375, -5.641749382019043], [288.4439392089844, 394.3298034667969, -7.794321060180664], [285.39361572265625, 419.3924560546875, -3.6910548210144043], [286.5469055175781, 407.94586181640625, -9.087989807128906], [287.1264343261719, 402.10638427734375, -9.677717208862305], [287.7097473144531, 397.5296630859375, -8.232913970947266], [288.3638916015625, 394.4990234375, -7.328562259674072], [273.1569519042969, 391.9190673828125, -2.4163973331451416], [272.00140380859375, 392.863525390625, -3.404341697692871], [270.4002380371094, 395.2790832519531, -4.201334476470947], [268.97186279296875, 398.7427978515625, -3.0564887523651123], [261.5496520996094, 377.6202392578125, -4.561906337738037], [208.38990783691406, 341.843505859375, 60.4583625793457], [299.4404296875, 364.6637268066406, -20.27260971069336], [268.68365478515625, 390.962158203125, 0.9632411003112793], [267.039306640625, 390.95074462890625, 0.3911586403846741], [288.13818359375, 365.7796630859375, -14.559393882751465], [274.23095703125, 360.8743591308594, -8.985363006591797], [286.8714904785156, 363.6372985839844, -14.74904727935791], [265.48736572265625, 326.5911560058594, -4.6448774337768555], [251.76707458496094, 332.0326232910156, -2.822591543197632], [270.4385681152344, 350.0209045410156, -12.240896224975586], [233.85556030273438, 223.589111328125, 2.7089765071868896], [239.39208984375, 238.236572265625, -4.42526912689209], [244.87533569335938, 254.8623809814453, -10.002897262573242], [265.22491455078125, 407.65887451171875, 1.22976553440094], [281.1024475097656, 259.059814453125, -17.505752563476562], [279.076416015625, 234.2976531982422, -15.902700424194336], [276.24664306640625, 210.18637084960938, -13.638851165771484], [241.67332458496094, 303.75128173828125, 2.2142083644866943], [223.1727294921875, 311.6500244140625, 11.184993743896484], [275.61322021484375, 301.571044921875, -0.25392746925354004], [231.55865478515625, 287.89373779296875, 4.009753704071045], [280.60302734375, 315.60076904296875, -9.191849708557129], [278.4223327636719, 349.4830322265625, -23.354150772094727], [214.8749542236328, 317.93212890625, 18.03703498840332], [228.37127685546875, 318.32843017578125, 6.394485950469971], [238.5069580078125, 322.1074523925781, 1.3253782987594604], [253.87966918945312, 321.7847595214844, -1.019113302230835], [265.4759521484375, 318.6402587890625, -2.280043840408325], [274.1865234375, 314.4884338378906, -3.8911330699920654], [292.4798583984375, 302.9285888671875, -16.13489532470703], [214.88638305664062, 337.95330810546875, 17.710662841796875], [225.13983154296875, 285.28155517578125, 6.38761568069458], [295.702392578125, 362.5097351074219, -28.182981491088867], [274.95721435546875, 331.19805908203125, -8.871806144714355], [207.11639404296875, 297.6207275390625, 52.586395263671875], [280.7156677246094, 309.44769287109375, -4.95869255065918], [269.312744140625, 350.0954284667969, -6.121389389038086], [235.44454956054688, 295.1263122558594, 6.259592056274414], [278.01800537109375, 342.5654296875, -21.40158462524414], [210.79800415039062, 365.399658203125, 59.42163848876953], [275.43280029296875, 298.0166015625, 0.9179220199584961], [285.5798645019531, 337.59710693359375, -27.331464767456055], [231.7576141357422, 413.05908203125, 25.253280639648438], [233.0160675048828, 423.8658447265625, 36.63697814941406], [208.47862243652344, 340.7737121582031, 38.883094787597656], [221.52906799316406, 399.97509765625, 31.757829666137695], [213.6818084716797, 279.5225830078125, 25.672266006469727], [264.7817077636719, 447.0621032714844, 8.18415641784668], [296.15985107421875, 364.0947265625, -19.977298736572266], [267.06536865234375, 337.62939453125, -6.465585231781006], [216.49720764160156, 299.90728759765625, 18.837560653686523], [249.13270568847656, 300.2607727050781, 0.03242945671081543], [256.260009765625, 301.32421875, -1.2465742826461792], [263.11810302734375, 393.8223876953125, 1.631466031074524], [215.19541931152344, 357.75103759765625, 20.998371124267578], [279.1003723144531, 459.8443908691406, 10.745009422302246], [255.84317016601562, 446.391845703125, 21.790172576904297], [245.4600830078125, 437.13970947265625, 28.35423469543457], [301.8525695800781, 235.36895751953125, -16.55525016784668], [294.718994140625, 461.6861572265625, 9.564546585083008], [263.12164306640625, 300.96978759765625, -1.3045413494110107], [269.57427978515625, 299.65863037109375, -0.38703393936157227], [273.557373046875, 298.83892822265625, 0.8548519015312195], [219.5872802734375, 282.44073486328125, 12.060924530029297], [268.46490478515625, 291.8851318359375, -1.8388075828552246], [261.52191162109375, 289.46514892578125, -3.1275906562805176], [254.54998779296875, 288.80987548828125, -3.072970151901245], [247.4393310546875, 289.94580078125, -1.6783688068389893], [242.81747436523438, 292.0097351074219, 0.2838176190853119], [208.8702850341797, 274.3497009277344, 41.36160659790039], [244.23309326171875, 298.69769287109375, 1.804038643836975], [298.62164306640625, 373.186767578125, -13.963418006896973], [269.7718811035156, 373.5728759765625, -8.293177604675293], [278.4598693847656, 356.54974365234375, -17.04210090637207], [286.76055908203125, 372.9639587402344, -13.735464096069336], [300.5703430175781, 287.6749267578125, -14.707551002502441], [243.18748474121094, 426.1807556152344, 20.269384384155273], [253.70654296875, 436.7740173339844, 14.615986824035645], [278.7491455078125, 454.0180358886719, 2.783529043197632], [223.41943359375, 409.1480407714844, 46.64860916137695], [273.295654296875, 295.4744873046875, -0.2415575236082077], [286.662353515625, 318.736572265625, -17.20730972290039], [295.2564392089844, 455.72515869140625, 1.9054080247879028], [266.687744140625, 454.40679931640625, 14.910948753356934], [210.3699951171875, 362.27655029296875, 39.50703430175781], [280.1830139160156, 393.1881103515625, -5.211543083190918], [278.9965515136719, 395.3263244628906, -6.268320083618164], [277.913330078125, 399.03558349609375, -7.276910305023193], [277.0343322753906, 404.3016052246094, -6.438044548034668], [274.2063293457031, 414.5286560058594, -1.941462516784668], [266.2420349121094, 390.5473937988281, -0.016497928649187088], [263.9146728515625, 389.5981140136719, -0.122717946767807], [261.697265625, 388.1065979003906, -0.32760918140411377], [254.43064880371094, 383.03460693359375, 0.07330796122550964], [224.68130493164062, 362.9518737792969, 9.443501472473145], [286.69403076171875, 308.6907653808594, -12.258654594421387], [282.09661865234375, 290.51287841796875, -3.41546368598938], [276.9400939941406, 292.6988525390625, -1.3320412635803223], [268.1077880859375, 389.6227722167969, 0.5624357461929321], [223.75128173828125, 386.07598876953125, 19.757707595825195], [289.62872314453125, 289.4853515625, -10.93774127960205], [269.7876281738281, 425.84527587890625, 1.3286749124526978], [300.6136169433594, 322.39208984375, -27.500526428222656], [292.91748046875, 313.90081787109375, -21.51654815673828], [300.5587158203125, 311.93096923828125, -22.738204956054688], [280.29046630859375, 333.8995361328125, -16.479372024536133], [295.7247314453125, 445.8623046875, -2.1188454627990723], [296.0556945800781, 432.5225830078125, -3.0110890865325928], [282.57476806640625, 431.73980712890625, -2.0836141109466553], [251.35142517089844, 405.6207580566406, 7.441960334777832], [262.2080383300781, 357.1605529785156, -4.383188247680664], [259.9346008300781, 417.1344909667969, 4.783696174621582], [242.74911499023438, 355.18365478515625, -2.364675521850586], [253.80038452148438, 366.0096435546875, -2.616335391998291], [235.05438232421875, 370.0333251953125, 3.2513437271118164], [279.8734130859375, 444.51654052734375, -1.0067998170852661], [274.849365234375, 338.7448425292969, -12.030640602111816], [245.11904907226562, 414.4852600097656, 13.113565444946289], [255.70986938476562, 426.4257507324219, 9.530975341796875], [244.17300415039062, 393.1248779296875, 7.200636863708496], [216.7993927001953, 374.4271545410156, 24.227380752563477], [234.30810546875, 396.002685546875, 12.771589279174805], [213.98880004882812, 382.0549011230469, 38.41045379638672], [246.35986328125, 376.63067626953125, 0.888126015663147], [280.9052429199219, 324.9044189453125, -12.69654655456543], [281.0602722167969, 354.3194580078125, -24.474390029907227], [275.0966796875, 355.4166259765625, -17.8099422454834], [285.320556640625, 348.15753173828125, -28.79677391052246], [275.7753601074219, 282.3512268066406, -5.865403652191162], [262.84906005859375, 276.986083984375, -7.439082622528076], [251.5946044921875, 275.62396240234375, -7.277249336242676], [242.0721435546875, 276.72552490234375, -4.872464179992676], [235.13790893554688, 280.58404541015625, -1.1335917711257935], [230.14804077148438, 296.7254333496094, 8.689035415649414], [207.88185119628906, 319.94415283203125, 36.222721099853516], [235.922607421875, 309.73529052734375, 4.900608539581299], [244.2236785888672, 312.7978515625, 1.6990026235580444], [254.93817138671875, 313.5443420410156, -0.43692925572395325], [265.19036865234375, 311.93426513671875, -1.4867429733276367], [273.19464111328125, 308.98016357421875, -1.5398086309432983], [278.6622009277344, 305.7724609375, -1.9914441108703613], [207.6420135498047, 319.61761474609375, 58.40398025512695], [275.00689697265625, 357.35009765625, -14.697525024414062], [286.7452087402344, 327.8433837890625, -21.438478469848633], [287.3891296386719, 355.6502990722656, -28.812564849853516], [291.53106689453125, 360.39251708984375, -25.9072322845459], [287.0721435546875, 356.9381103515625, -25.85338020324707], [277.0426025390625, 360.0472412109375, -12.39292049407959], [293.08709716796875, 361.5616455078125, -27.419021606445312], [293.50030517578125, 363.1676025390625, -20.14118003845215], [278.35089111328125, 298.6317138671875, 0.2076733261346817], [283.0218811035156, 300.48175048828125, -3.057471752166748], [285.76177978515625, 301.8895263671875, -6.940402507781982], [240.08578491210938, 293.5745849609375, 2.3983771800994873], [236.07052612304688, 289.68572998046875, 2.4990200996398926], [307.3732604980469, 324.0601806640625, -25.065885543823242], [356.67523193359375, 299.8014831542969, 7.595158100128174], [306.9847412109375, 361.759521484375, -19.91704750061035], [381.818603515625, 260.7698059082031, 34.44782638549805], [333.31622314453125, 307.80841064453125, 0.8499112725257874], [341.2498779296875, 308.71881103515625, 1.6960941553115845], [348.78326416015625, 308.2080078125, 3.661770820617676], [359.02825927734375, 303.1348876953125, 8.94857120513916], [326.7879638671875, 305.22027587890625, 1.1685311794281006], [345.2674560546875, 284.56524658203125, -2.0088536739349365], [336.768798828125, 285, -2.4163801670074463], [353.04400634765625, 285.9664001464844, 0.45641767978668213], [358.04010009765625, 289.2410583496094, 3.284507989883423], [364.31390380859375, 308.7838134765625, 12.568134307861328], [324.36669921875, 437.7641906738281, 6.122448921203613], [359.4388427734375, 297.6155700683594, 9.600309371948242], [382.962158203125, 303.8727111816406, 39.76386260986328], [372.3107604980469, 302.26690673828125, 18.538833618164062], [339.4228515625, 346.74981689453125, -2.363318920135498], [308.92352294921875, 385.3271789550781, -13.11467456817627], [307.30987548828125, 394.150146484375, -9.700993537902832], [319.6434326171875, 386.7612609863281, -8.919146537780762], [326.3415832519531, 388.61492919921875, -3.6562552452087402], [315.2393798828125, 393.47552490234375, -6.758571624755859], [321.29876708984375, 393.0090026855469, -2.0756425857543945], [333.91412353515625, 401.28338623046875, 6.845234394073486], [306.9276123046875, 357.91748046875, -30.962732315063477], [308.24560546875, 347.8184814453125, -33.25374221801758], [370.2144775390625, 277.15875244140625, 4.948965549468994], [323.48406982421875, 322.86029052734375, -5.0297932624816895], [325.33209228515625, 353.02862548828125, -15.71037483215332], [325.71063232421875, 347.51788330078125, -14.104110717773438], [362.6228332519531, 345.078369140625, 6.643834114074707], [307.93426513671875, 334.89654541015625, -30.296648025512695], [353.20819091796875, 266.5593566894531, -6.758531093597412], [363.6017150878906, 269.9488830566406, -1.3440293073654175], [376.6258544921875, 242.72125244140625, 21.28090476989746], [318.34912109375, 274.029541015625, -13.134204864501953], [329.233642578125, 287.79913330078125, -0.8236775398254395], [341.02166748046875, 391.9947509765625, 8.104843139648438], [369.6722412109375, 392.50140380859375, 61.400611877441406], [319.373779296875, 358.50640869140625, -13.441617965698242], [312.39410400390625, 361.8641357421875, -13.971587181091309], [333.64019775390625, 390.7327880859375, 7.61594820022583], [329.98028564453125, 390.59906005859375, 5.84257173538208], [367.95550537109375, 262.7685852050781, 1.2506029605865479], [325.44000244140625, 356.60809326171875, -12.187370300292969], [338.5452880859375, 267.15838623046875, -10.905488967895508], [340.33306884765625, 258.23284912109375, -12.713081359863281], [348.302978515625, 217.42800903320312, -4.553675651550293], [372.1968078613281, 252.34613037109375, 9.78996753692627], [343.51422119140625, 236.95462036132812, -9.055185317993164], [374.4295654296875, 272.2535705566406, 9.881559371948242], [378.1052551269531, 267.1137390136719, 21.304649353027344], [308.3089599609375, 390.70428466796875, -12.006296157836914], [317.1768798828125, 390.987548828125, -8.017443656921387], [323.79833984375, 391.0067138671875, -3.2889156341552734], [317.25225830078125, 360.08978271484375, -12.160839080810547], [331.86663818359375, 390.61322021484375, 6.680799961090088], [327.66259765625, 393.31414794921875, 2.7461254596710205], [328.9090576171875, 390.6084289550781, 5.631084442138672], [315.3644104003906, 356.60345458984375, -21.98170280456543], [319.64178466796875, 392.15325927734375, -1.1716930866241455], [313.44720458984375, 393.4586486816406, -4.418369770050049], [306.0958251953125, 394.66497802734375, -7.112936019897461], [307.0981750488281, 419.7776184082031, -2.9867327213287354], [307.0517272949219, 408.3765563964844, -8.33465576171875], [306.98052978515625, 402.5163269042969, -8.902058601379395], [306.64788818359375, 397.8790283203125, -7.4810791015625], [306.0570983886719, 394.83721923828125, -6.573723793029785], [320.11328125, 392.8348388671875, -0.750707745552063], [321.2628173828125, 393.8656311035156, -1.6959993839263916], [322.7669982910156, 396.33990478515625, -2.4832804203033447], [323.917724609375, 399.8404541015625, -1.2069100141525269], [333.12835693359375, 379.15460205078125, -2.201312780380249], [378.8597717285156, 345.8829040527344, 67.32080841064453], [324.14459228515625, 392.10662841796875, 3.0477957725524902], [325.8373107910156, 392.2274475097656, 2.5118913650512695], [309.4422607421875, 366.2791748046875, -13.972805976867676], [322.49346923828125, 362.0115661621094, -7.678974151611328], [310.86614990234375, 364.2325134277344, -14.162775993347168], [331.717041015625, 328.252197265625, -2.210709810256958], [344.65142822265625, 334.338623046875, 0.47783684730529785], [326.8472900390625, 351.3416748046875, -10.444955825805664], [366.27752685546875, 227.95407104492188, 7.6168999671936035], [361.3927001953125, 241.8026885986328, -0.1350962221622467], [356.2882080078125, 257.7562255859375, -6.220260143280029], [326.7144775390625, 408.7587585449219, 3.371832847595215], [321.48876953125, 260.19677734375, -16.227548599243164], [324.25311279296875, 235.73077392578125, -14.394697189331055], [327.57879638671875, 212.00201416015625, -11.954652786254883], [355.3073425292969, 306.49041748046875, 6.494428634643555], [371.68927001953125, 315.40301513671875, 16.618350982666016], [322.81280517578125, 302.6331787109375, 1.7007064819335938], [365.780029296875, 291.1285095214844, 8.933826446533203], [318.10748291015625, 316.57489013671875, -7.726454257965088], [320.6505126953125, 350.390625, -21.980348587036133], [378.52520751953125, 322.00885009765625, 24.170019149780273], [366.93524169921875, 321.79217529296875, 11.436684608459473], [357.4869689941406, 325.15869140625, 5.6696953773498535], [342.8868408203125, 324.0008544921875, 2.3119006156921387], [331.87579345703125, 320.30194091796875, 0.25034573674201965], [323.7598876953125, 315.7703857421875, -1.982524037361145], [308.10546875, 303.3229675292969, -15.518848419189453], [377.65325927734375, 341.747314453125, 23.78961944580078], [371.64019775390625, 288.90704345703125, 11.829926490783691], [303.86749267578125, 362.6624755859375, -27.897249221801758], [322.88385009765625, 332.43109130859375, -7.141077995300293], [382.97076416015625, 302.5579528808594, 59.73387145996094], [317.8991394042969, 310.38824462890625, -3.501786231994629], [327.3390197753906, 351.4356689453125, -4.344942569732666], [361.591552734375, 298.120849609375, 10.992892265319824], [320.9140625, 343.58575439453125, -20.00631332397461], [375.4109802246094, 368.93756103515625, 65.99598693847656], [323.0166320800781, 299.0319519042969, 2.9272162914276123], [314.5860290527344, 338.2750244140625, -26.292192459106445], [356.2896728515625, 414.80413818359375, 29.786441802978516], [353.1893615722656, 425.3591613769531, 41.277565002441406], [381.3948974609375, 344.77032470703125, 45.5704231262207], [366.114990234375, 402.3834228515625, 37.07483673095703], [380.6361389160156, 284.1849365234375, 32.13893508911133], [324.7380065917969, 447.59088134765625, 10.31078052520752], [302.6345520019531, 364.2626647949219, -19.767332077026367], [329.860595703125, 339.1981201171875, -4.306419849395752], [377.75982666015625, 303.9954833984375, 24.840557098388672], [348.72662353515625, 302.6435546875, 3.7496886253356934], [341.731201171875, 303.3505859375, 2.0609114170074463], [329.43316650390625, 395.2054443359375, 3.9594509601593018], [375.923828125, 361.1905212402344, 26.88157844543457], [310.0873107910156, 460.0473327636719, 11.899538040161133], [331.9680480957031, 447.0196838378906, 24.759647369384766], [341.5283508300781, 438.0824890136719, 32.1016960144043], [334.96044921875, 302.6367492675781, 1.4755160808563232], [328.69384765625, 300.9761962890625, 2.033987283706665], [324.81878662109375, 299.9778137207031, 3.052812337875366], [376.3876647949219, 286.4664306640625, 17.91488265991211], [330.051025390625, 293.26513671875, 0.6276898980140686], [336.9576416015625, 291.23876953125, -0.24208274483680725], [343.93206787109375, 290.8462829589844, 0.3155216872692108], [350.867919921875, 292.2984619140625, 2.1698615550994873], [355.1660461425781, 294.61590576171875, 4.397724151611328], [383.58807373046875, 279.548583984375, 48.35405349731445], [353.4559326171875, 301.2651062011719, 5.846395969390869], [325.9066467285156, 374.74859619140625, -6.504605293273926], [319.656494140625, 357.40264892578125, -15.848856925964355], [310.1542053222656, 373.465087890625, -12.970613479614258], [345.263427734375, 427.4197998046875, 23.920984268188477], [335.1993408203125, 437.513916015625, 17.505901336669922], [311.4644470214844, 454.2825012207031, 3.926825523376465], [362.0497131347656, 411.3240966796875, 52.155921936035156], [325.20245361328125, 296.5793151855469, 1.9624319076538086], [313.1584167480469, 319.390869140625, -16.205463409423828], [321.92657470703125, 454.7729187011719, 17.1419734954834], [378.24371337890625, 365.84832763671875, 45.87765121459961], [313.75372314453125, 393.8746337890625, -3.938037157058716], [314.8427734375, 396.027587890625, -4.977667808532715], [315.6759948730469, 399.723876953125, -5.9359869956970215], [316.2149658203125, 405.08477783203125, -5.035343170166016], [317.9674072265625, 415.27899169921875, -0.34057602286338806], [326.77056884765625, 391.82421875, 2.174017906188965], [329.22265625, 390.9358825683594, 2.294630527496338], [331.4928283691406, 389.49554443359375, 2.192715644836426], [339.0069580078125, 384.77569580078125, 2.977928876876831], [367.70367431640625, 366.0517578125, 14.414066314697266], [312.97625732421875, 309.38580322265625, -11.222635269165039], [317.3673400878906, 291.33135986328125, -2.129173994064331], [322.009765625, 293.80670166015625, 0.5677414536476135], [324.796142578125, 390.81390380859375, 2.6979939937591553], [366.18212890625, 388.74053955078125, 24.754619598388672], [310.79144287109375, 289.9751892089844, -10.173527717590332], [321.41802978515625, 426.5231628417969, 3.075554847717285], [307.807373046875, 314.2569885253906, -21.006572723388672], [318.476806640625, 334.8522033691406, -15.173004150390625], [309.13702392578125, 432.0695495605469, -1.2716456651687622], [339.7491149902344, 407.15130615234375, 10.460354804992676], [333.603271484375, 358.87530517578125, -2.1252334117889404], [331.00543212890625, 418.21185302734375, 7.167931079864502], [352.12615966796875, 357.6951599121094, 1.217620849609375], [341.0467529296875, 367.9482421875, 0.2293931543827057], [358.05242919921875, 372.63299560546875, 7.3089141845703125], [311.1943054199219, 444.88116455078125, 0.08458244800567627], [322.95361328125, 339.92236328125, -10.42269515991211], [344.79071044921875, 415.96343994140625, 16.583690643310547], [334.338134765625, 427.4009704589844, 12.199787139892578], [347.4801025390625, 395.11376953125, 10.842185020446777], [373.0355224609375, 377.535400390625, 29.82500648498535], [356.07659912109375, 398.1593933105469, 17.007970809936523], [373.7404479980469, 385.13348388671875, 44.442726135253906], [347.0653991699219, 378.772705078125, 4.24334716796875], [317.87005615234375, 325.85968017578125, -11.319250106811523], [317.9876708984375, 355.0179138183594, -23.249361038208008], [322.93359375, 356.45257568359375, -16.41042709350586], [314.8368835449219, 348.8318176269531, -27.80367660522461], [324.2010498046875, 283.498779296875, -4.098787307739258], [337.25775146484375, 278.7808837890625, -4.839216232299805], [348.373779296875, 277.998291015625, -3.796363115310669], [357.41845703125, 279.5406494140625, -0.7076868414878845], [363.39544677734375, 283.70416259765625, 3.515821933746338], [366.15875244140625, 300.0559997558594, 13.776080131530762], [383.0858154296875, 324.3414306640625, 43.073463439941406], [360.28375244140625, 312.86663818359375, 9.544275283813477], [352.3401184082031, 315.5252990722656, 5.716311931610107], [342.1090087890625, 315.728759765625, 2.8683881759643555], [332.3074645996094, 313.54278564453125, 1.0963972806930542], [324.771484375, 310.1976318359375, 0.4078766107559204], [319.69049072265625, 306.7348937988281, -0.4225405752658844], [380.8294677734375, 324.1416931152344, 65.51505279541016], [322.54266357421875, 358.4033508300781, -13.312748908996582], [313.2991943359375, 328.52197265625, -20.393056869506836], [312.4696350097656, 356.1797180175781, -27.984386444091797], [307.6595458984375, 360.6966552734375, -25.45814323425293], [312.2298583984375, 357.42681884765625, -25.0369873046875], [320.1729431152344, 361.0259094238281, -11.240046501159668], [306.3169860839844, 361.8370056152344, -27.032991409301758], [305.1815490722656, 363.4141845703125, -19.843814849853516], [320.2969055175781, 299.5377197265625, 1.8979803323745728], [315.833740234375, 301.26409912109375, -1.7907793521881104], [313.56158447265625, 302.59619140625, -5.894857406616211], [357.62335205078125, 296.29754638671875, 6.705108642578125], [361.6152038574219, 292.66925048828125, 7.069137096405029] ] export default { debugPoints } ================================================ FILE: src/three.js ================================================ import * as THREE from 'three' import { OBJLoader } from './vendor/OBJLoader' import simplify from 'simplify-js' let camera let scene let renderer let videoTexture let baseMesh let raycaster let currPlane const planes = [] const planeWidth = 1024 const planeHeight = 1024 const params = { debug: false, color: '#ffffff', thickness: 20, smooth: 1.5 } async function init(video) { // Initialize camera. const width = video ? video.width : 640 const height = video ? video.height : 640 const ratio = width / height const fov = 50 const near = 1 const far = 5000 camera = new THREE.PerspectiveCamera(fov, ratio, near, far) camera.position.z = height camera.position.x = -width / 2 camera.position.y = -height / 2 // Initialize renderer. renderer = new THREE.WebGLRenderer({ antialias: true, alpha: true }) renderer.setPixelRatio(window.devicePixelRatio) renderer.setSize(width, height) // Initialize scene. scene = new THREE.Scene() if (video) { addVideoSprite(video) } // Init Raycaster. raycaster = new THREE.Raycaster() // addDebugMesh() await addFBXMesh() return renderer.domElement } function alignPlane(plane) { const vertices = baseMesh.geometry.vertices const centroid = new THREE.Vector3() plane.mesh.position.set(0, 0, 0) plane.mesh.lookAt(plane.face.normal) centroid.add(vertices[plane.face.a]) centroid.add(vertices[plane.face.b]) centroid.add(vertices[plane.face.c]) centroid.divideScalar(3) const centroidWithOffset = centroid .clone() .add(plane.face.normal.multiplyScalar(-10)) plane.mesh.position.copy(centroidWithOffset) if (params.debug) { plane.debug.position.copy(plane.mesh.position) plane.debug.rotation.copy(plane.mesh.rotation) } } function update(facemesh) { // Update the video sprite. if (videoTexture) { videoTexture.needsUpdate = true } if (baseMesh) { for (let i = 0; i < facemesh.length; i++) { const [x, y, z] = facemesh[i] baseMesh.geometry.vertices[i].set(x - 640, -y, -z) } baseMesh.geometry.verticesNeedUpdate = true baseMesh.geometry.normalsNeedUpdate = true baseMesh.geometry.computeBoundingSphere() baseMesh.geometry.computeFaceNormals() baseMesh.geometry.computeVertexNormals() } for (const plane of planes) { alignPlane(plane) } // Render. renderer.render(scene, camera) } function addVideoSprite(video) { videoTexture = new THREE.Texture(video) videoTexture.minFilter = THREE.LinearFilter const videoSprite = new THREE.Sprite( new THREE.MeshBasicMaterial({ map: videoTexture, depthWrite: false }) ) const width = video.width const height = video.height videoSprite.center.set(0.5, 0.5) videoSprite.scale.set(width, height, 1) videoSprite.position.copy(camera.position) videoSprite.position.z = 0 scene.add(videoSprite) } function addFBXMesh() { const loader = new OBJLoader() return new Promise((resolve, reject) => { loader.load('facemesh.obj', obj => { obj.traverse(child => { if (child instanceof THREE.Mesh) { const mat = new THREE.MeshNormalMaterial({ side: THREE.DoubleSide }) if (!params.debug) { mat.transparent = true mat.opacity = 0 } baseMesh = new THREE.Mesh(child.geometry, mat) scene.add(baseMesh) resolve() } }) }) }) } function draw(pt) { // Raycase draw point. const x = (pt.x / renderer.domElement.clientWidth) * 2 - 1 const y = -(pt.y / renderer.domElement.clientHeight) * 2 + 1 raycaster.setFromCamera(new THREE.Vector2(x, y), camera) if (currPlane) { const intersects = raycaster.intersectObject(currPlane.mesh) if (intersects.length) { // Add intersection UV to the list of points. let { x, y } = intersects[0].uv x = x * planeWidth y = (1 - y) * planeHeight currPlane.points.push({ x, y }) // Simplify path to smooth out the line. const pts = simplify(currPlane.points, params.smooth) // const pts = currPlane.points // Draw using Quadratic Curve const ctx = currPlane.ctx ctx.clearRect(0, 0, ctx.canvas.width, ctx.canvas.height) // for (let i = 0; i < pts.length - 2; i++) { // ctx.beginPath() // ctx.moveTo(pts[i].x, pts[i].y) // const pct = (i + 1) / pts.length // ctx.lineWidth = Math.sin(pct * Math.PI) * params.thickness // ctx.lineTo(pts[i + 1].x, pts[i + 1].y) // ctx.stroke() // } if (currPlane.points.length < 3) { ctx.arc(x, y, params.thickness / 2, 0, Math.PI * 2, !0) ctx.fill() ctx.closePath() } else { ctx.beginPath() ctx.lineWidth = params.thickness let i = 0 ctx.moveTo(pts[i].x, pts[i].y) for (i; i < pts.length - 2; i++) { const c = { x: (pts[i].x + pts[i + 1].x) / 2, y: (pts[i].y + pts[i + 1].y) / 2 } ctx.quadraticCurveTo(pts[i].x, pts[i].y, c.x, c.y) } ctx.quadraticCurveTo(pts[i].x, pts[i].y, pts[i + 1].x, pts[i + 1].y) ctx.stroke() } currPlane.mesh.material.map.needsUpdate = true } } else { baseMesh.geometry.verticesNeedUpdate = true baseMesh.geometry.normalsNeedUpdate = true baseMesh.geometry.computeBoundingSphere() baseMesh.geometry.computeFaceNormals() baseMesh.geometry.computeVertexNormals() const intersects = raycaster.intersectObject(baseMesh) if (intersects.length) { const face = intersects[0].face const position = intersects[0].point const uv = intersects[0].uv const plane = createDrawingPlane(position, face, uv) planes.push(plane) scene.add(plane.mesh) currPlane = plane } } } function end() { currPlane = null } function undo() { end() if (planes.length) { const plane = planes.pop() scene.remove(plane.mesh) scene.remove(plane.debug) } } function clear() { end() for (const plane of planes) { scene.remove(plane.mesh) scene.remove(plane.debug) } planes.splice(0, planes.length) } function setDebug(value) { params.debug = value if (params.debug) { baseMesh.material.transparent = false baseMesh.material.opacity = 1 for (const plane of planes) { scene.add(plane.debug) } } else { baseMesh.material.transparent = true baseMesh.material.opacity = 0 for (const plane of planes) { scene.remove(plane.debug) } } } function isOverFace(pt) { // Raycase draw point. const x = (pt.x / renderer.domElement.clientWidth) * 2 - 1 const y = -(pt.y / renderer.domElement.clientHeight) * 2 + 1 raycaster.setFromCamera(new THREE.Vector2(x, y), camera) const intersects = raycaster.intersectObject(baseMesh) if (intersects.length) { return true } return false } function createDrawingPlane(position, face, uv) { const width = planeWidth const height = planeHeight // Create Canvas. const canvas = document.createElement('canvas') canvas.width = width canvas.height = height const ctx = canvas.getContext('2d') ctx.strokeStyle = params.color ctx.lineCap = 'round' ctx.lineJoin = 'round' ctx.lineWidth = params.thickness // Create Texture. const texture = new THREE.CanvasTexture(canvas) // Create Mesh. const geom = new THREE.PlaneGeometry(width / 2, height / 2, 1, 1) const mat = new THREE.MeshBasicMaterial({ map: texture, side: THREE.DoubleSide, transparent: true, depthWrite: false }) const mesh = new THREE.Mesh(geom, mat) // Create an object that will contain some debug helpers. const debugObj = new THREE.Object3D() const plane = { mesh, face, ctx, points: [], debug: debugObj } alignPlane(plane) // Add Debug Helper. const helper = new THREE.AxesHelper(50) debugObj.add(helper) // Add Debug Grid. const pgeom = new THREE.PlaneGeometry(30, 30, 3, 3) const pmat = new THREE.MeshBasicMaterial({ color: '#ffffff', wireframe: true }) const debugPlane = new THREE.Mesh(pgeom, pmat) debugObj.add(debugPlane) if (params.debug) { debugObj.lookAt(face.normal) debugObj.position.copy(plane.mesh.position) scene.add(debugObj) } return plane } export default { init, update, draw, end, undo, clear, params, isOverFace, setDebug } ================================================ FILE: src/triangulation.js ================================================ /** * @license * Copyright 2020 Google LLC. All Rights Reserved. * Licensed under the Apache License, Version 2.0 (the "License"); * you may not use this file except in compliance with the License. * You may obtain a copy of the License at * * https://www.apache.org/licenses/LICENSE-2.0 * * Unless required by applicable law or agreed to in writing, software * distributed under the License is distributed on an "AS IS" BASIS, * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. * See the License for the specific language governing permissions and * limitations under the License. * ============================================================================= */ export const TRIANGULATION = [ 127, 34, 139, 11, 0, 37, 232, 231, 120, 72, 37, 39, 128, 121, 47, 232, 121, 128, 104, 69, 67, 175, 171, 148, 157, 154, 155, 118, 50, 101, 73, 39, 40, 9, 151, 108, 48, 115, 131, 194, 204, 211, 74, 40, 185, 80, 42, 183, 40, 92, 186, 230, 229, 118, 202, 212, 214, 83, 18, 17, 76, 61, 146, 160, 29, 30, 56, 157, 173, 106, 204, 194, 135, 214, 192, 203, 165, 98, 21, 71, 68, 51, 45, 4, 144, 24, 23, 77, 146, 91, 205, 50, 187, 201, 200, 18, 91, 106, 182, 90, 91, 181, 85, 84, 17, 206, 203, 36, 148, 171, 140, 92, 40, 39, 193, 189, 244, 159, 158, 28, 247, 246, 161, 236, 3, 196, 54, 68, 104, 193, 168, 8, 117, 228, 31, 189, 193, 55, 98, 97, 99, 126, 47, 100, 166, 79, 218, 155, 154, 26, 209, 49, 131, 135, 136, 150, 47, 126, 217, 223, 52, 53, 45, 51, 134, 211, 170, 140, 67, 69, 108, 43, 106, 91, 230, 119, 120, 226, 130, 247, 63, 53, 52, 238, 20, 242, 46, 70, 156, 78, 62, 96, 46, 53, 63, 143, 34, 227, 173, 155, 133, 123, 117, 111, 44, 125, 19, 236, 134, 51, 216, 206, 205, 154, 153, 22, 39, 37, 167, 200, 201, 208, 36, 142, 100, 57, 212, 202, 20, 60, 99, 28, 158, 157, 35, 226, 113, 160, 159, 27, 204, 202, 210, 113, 225, 46, 43, 202, 204, 62, 76, 77, 137, 123, 116, 41, 38, 72, 203, 129, 142, 64, 98, 240, 49, 102, 64, 41, 73, 74, 212, 216, 207, 42, 74, 184, 169, 170, 211, 170, 149, 176, 105, 66, 69, 122, 6, 168, 123, 147, 187, 96, 77, 90, 65, 55, 107, 89, 90, 180, 101, 100, 120, 63, 105, 104, 93, 137, 227, 15, 86, 85, 129, 102, 49, 14, 87, 86, 55, 8, 9, 100, 47, 121, 145, 23, 22, 88, 89, 179, 6, 122, 196, 88, 95, 96, 138, 172, 136, 215, 58, 172, 115, 48, 219, 42, 80, 81, 195, 3, 51, 43, 146, 61, 171, 175, 199, 81, 82, 38, 53, 46, 225, 144, 163, 110, 246, 33, 7, 52, 65, 66, 229, 228, 117, 34, 127, 234, 107, 108, 69, 109, 108, 151, 48, 64, 235, 62, 78, 191, 129, 209, 126, 111, 35, 143, 163, 161, 246, 117, 123, 50, 222, 65, 52, 19, 125, 141, 221, 55, 65, 3, 195, 197, 25, 7, 33, 220, 237, 44, 70, 71, 139, 122, 193, 245, 247, 130, 33, 71, 21, 162, 153, 158, 159, 170, 169, 150, 188, 174, 196, 216, 186, 92, 144, 160, 161, 2, 97, 167, 141, 125, 241, 164, 167, 37, 72, 38, 12, 145, 159, 160, 38, 82, 13, 63, 68, 71, 226, 35, 111, 158, 153, 154, 101, 50, 205, 206, 92, 165, 209, 198, 217, 165, 167, 97, 220, 115, 218, 133, 112, 243, 239, 238, 241, 214, 135, 169, 190, 173, 133, 171, 208, 32, 125, 44, 237, 86, 87, 178, 85, 86, 179, 84, 85, 180, 83, 84, 181, 201, 83, 182, 137, 93, 132, 76, 62, 183, 61, 76, 184, 57, 61, 185, 212, 57, 186, 214, 207, 187, 34, 143, 156, 79, 239, 237, 123, 137, 177, 44, 1, 4, 201, 194, 32, 64, 102, 129, 213, 215, 138, 59, 166, 219, 242, 99, 97, 2, 94, 141, 75, 59, 235, 24, 110, 228, 25, 130, 226, 23, 24, 229, 22, 23, 230, 26, 22, 231, 112, 26, 232, 189, 190, 243, 221, 56, 190, 28, 56, 221, 27, 28, 222, 29, 27, 223, 30, 29, 224, 247, 30, 225, 238, 79, 20, 166, 59, 75, 60, 75, 240, 147, 177, 215, 20, 79, 166, 187, 147, 213, 112, 233, 244, 233, 128, 245, 128, 114, 188, 114, 217, 174, 131, 115, 220, 217, 198, 236, 198, 131, 134, 177, 132, 58, 143, 35, 124, 110, 163, 7, 228, 110, 25, 356, 389, 368, 11, 302, 267, 452, 350, 349, 302, 303, 269, 357, 343, 277, 452, 453, 357, 333, 332, 297, 175, 152, 377, 384, 398, 382, 347, 348, 330, 303, 304, 270, 9, 336, 337, 278, 279, 360, 418, 262, 431, 304, 408, 409, 310, 415, 407, 270, 409, 410, 450, 348, 347, 422, 430, 434, 313, 314, 17, 306, 307, 375, 387, 388, 260, 286, 414, 398, 335, 406, 418, 364, 367, 416, 423, 358, 327, 251, 284, 298, 281, 5, 4, 373, 374, 253, 307, 320, 321, 425, 427, 411, 421, 313, 18, 321, 405, 406, 320, 404, 405, 315, 16, 17, 426, 425, 266, 377, 400, 369, 322, 391, 269, 417, 465, 464, 386, 257, 258, 466, 260, 388, 456, 399, 419, 284, 332, 333, 417, 285, 8, 346, 340, 261, 413, 441, 285, 327, 460, 328, 355, 371, 329, 392, 439, 438, 382, 341, 256, 429, 420, 360, 364, 394, 379, 277, 343, 437, 443, 444, 283, 275, 440, 363, 431, 262, 369, 297, 338, 337, 273, 375, 321, 450, 451, 349, 446, 342, 467, 293, 334, 282, 458, 461, 462, 276, 353, 383, 308, 324, 325, 276, 300, 293, 372, 345, 447, 382, 398, 362, 352, 345, 340, 274, 1, 19, 456, 248, 281, 436, 427, 425, 381, 256, 252, 269, 391, 393, 200, 199, 428, 266, 330, 329, 287, 273, 422, 250, 462, 328, 258, 286, 384, 265, 353, 342, 387, 259, 257, 424, 431, 430, 342, 353, 276, 273, 335, 424, 292, 325, 307, 366, 447, 345, 271, 303, 302, 423, 266, 371, 294, 455, 460, 279, 278, 294, 271, 272, 304, 432, 434, 427, 272, 407, 408, 394, 430, 431, 395, 369, 400, 334, 333, 299, 351, 417, 168, 352, 280, 411, 325, 319, 320, 295, 296, 336, 319, 403, 404, 330, 348, 349, 293, 298, 333, 323, 454, 447, 15, 16, 315, 358, 429, 279, 14, 15, 316, 285, 336, 9, 329, 349, 350, 374, 380, 252, 318, 402, 403, 6, 197, 419, 318, 319, 325, 367, 364, 365, 435, 367, 397, 344, 438, 439, 272, 271, 311, 195, 5, 281, 273, 287, 291, 396, 428, 199, 311, 271, 268, 283, 444, 445, 373, 254, 339, 263, 466, 249, 282, 334, 296, 449, 347, 346, 264, 447, 454, 336, 296, 299, 338, 10, 151, 278, 439, 455, 292, 407, 415, 358, 371, 355, 340, 345, 372, 390, 249, 466, 346, 347, 280, 442, 443, 282, 19, 94, 370, 441, 442, 295, 248, 419, 197, 263, 255, 359, 440, 275, 274, 300, 383, 368, 351, 412, 465, 263, 467, 466, 301, 368, 389, 380, 374, 386, 395, 378, 379, 412, 351, 419, 436, 426, 322, 373, 390, 388, 2, 164, 393, 370, 462, 461, 164, 0, 267, 302, 11, 12, 374, 373, 387, 268, 12, 13, 293, 300, 301, 446, 261, 340, 385, 384, 381, 330, 266, 425, 426, 423, 391, 429, 355, 437, 391, 327, 326, 440, 457, 438, 341, 382, 362, 459, 457, 461, 434, 430, 394, 414, 463, 362, 396, 369, 262, 354, 461, 457, 316, 403, 402, 315, 404, 403, 314, 405, 404, 313, 406, 405, 421, 418, 406, 366, 401, 361, 306, 408, 407, 291, 409, 408, 287, 410, 409, 432, 436, 410, 434, 416, 411, 264, 368, 383, 309, 438, 457, 352, 376, 401, 274, 275, 4, 421, 428, 262, 294, 327, 358, 433, 416, 367, 289, 455, 439, 462, 370, 326, 2, 326, 370, 305, 460, 455, 254, 449, 448, 255, 261, 446, 253, 450, 449, 252, 451, 450, 256, 452, 451, 341, 453, 452, 413, 464, 463, 441, 413, 414, 258, 442, 441, 257, 443, 442, 259, 444, 443, 260, 445, 444, 467, 342, 445, 459, 458, 250, 289, 392, 290, 290, 328, 460, 376, 433, 435, 250, 290, 392, 411, 416, 433, 341, 463, 464, 453, 464, 465, 357, 465, 412, 343, 412, 399, 360, 363, 440, 437, 399, 456, 420, 456, 363, 401, 435, 288, 372, 383, 353, 339, 255, 249, 448, 261, 255, 133, 243, 190, 133, 155, 112, 33, 246, 247, 33, 130, 25, 398, 384, 286, 362, 398, 414, 362, 463, 341, 263, 359, 467, 263, 249, 255, 466, 467, 260, 75, 60, 166, 238, 239, 79, 162, 127, 139, 72, 11, 37, 121, 232, 120, 73, 72, 39, 114, 128, 47, 233, 232, 128, 103, 104, 67, 152, 175, 148, 173, 157, 155, 119, 118, 101, 74, 73, 40, 107, 9, 108, 49, 48, 131, 32, 194, 211, 184, 74, 185, 191, 80, 183, 185, 40, 186, 119, 230, 118, 210, 202, 214, 84, 83, 17, 77, 76, 146, 161, 160, 30, 190, 56, 173, 182, 106, 194, 138, 135, 192, 129, 203, 98, 54, 21, 68, 5, 51, 4, 145, 144, 23, 90, 77, 91, 207, 205, 187, 83, 201, 18, 181, 91, 182, 180, 90, 181, 16, 85, 17, 205, 206, 36, 176, 148, 140, 165, 92, 39, 245, 193, 244, 27, 159, 28, 30, 247, 161, 174, 236, 196, 103, 54, 104, 55, 193, 8, 111, 117, 31, 221, 189, 55, 240, 98, 99, 142, 126, 100, 219, 166, 218, 112, 155, 26, 198, 209, 131, 169, 135, 150, 114, 47, 217, 224, 223, 53, 220, 45, 134, 32, 211, 140, 109, 67, 108, 146, 43, 91, 231, 230, 120, 113, 226, 247, 105, 63, 52, 241, 238, 242, 124, 46, 156, 95, 78, 96, 70, 46, 63, 116, 143, 227, 116, 123, 111, 1, 44, 19, 3, 236, 51, 207, 216, 205, 26, 154, 22, 165, 39, 167, 199, 200, 208, 101, 36, 100, 43, 57, 202, 242, 20, 99, 56, 28, 157, 124, 35, 113, 29, 160, 27, 211, 204, 210, 124, 113, 46, 106, 43, 204, 96, 62, 77, 227, 137, 116, 73, 41, 72, 36, 203, 142, 235, 64, 240, 48, 49, 64, 42, 41, 74, 214, 212, 207, 183, 42, 184, 210, 169, 211, 140, 170, 176, 104, 105, 69, 193, 122, 168, 50, 123, 187, 89, 96, 90, 66, 65, 107, 179, 89, 180, 119, 101, 120, 68, 63, 104, 234, 93, 227, 16, 15, 85, 209, 129, 49, 15, 14, 86, 107, 55, 9, 120, 100, 121, 153, 145, 22, 178, 88, 179, 197, 6, 196, 89, 88, 96, 135, 138, 136, 138, 215, 172, 218, 115, 219, 41, 42, 81, 5, 195, 51, 57, 43, 61, 208, 171, 199, 41, 81, 38, 224, 53, 225, 24, 144, 110, 105, 52, 66, 118, 229, 117, 227, 34, 234, 66, 107, 69, 10, 109, 151, 219, 48, 235, 183, 62, 191, 142, 129, 126, 116, 111, 143, 7, 163, 246, 118, 117, 50, 223, 222, 52, 94, 19, 141, 222, 221, 65, 196, 3, 197, 45, 220, 44, 156, 70, 139, 188, 122, 245, 139, 71, 162, 145, 153, 159, 149, 170, 150, 122, 188, 196, 206, 216, 92, 163, 144, 161, 164, 2, 167, 242, 141, 241, 0, 164, 37, 11, 72, 12, 144, 145, 160, 12, 38, 13, 70, 63, 71, 31, 226, 111, 157, 158, 154, 36, 101, 205, 203, 206, 165, 126, 209, 217, 98, 165, 97, 237, 220, 218, 237, 239, 241, 210, 214, 169, 140, 171, 32, 241, 125, 237, 179, 86, 178, 180, 85, 179, 181, 84, 180, 182, 83, 181, 194, 201, 182, 177, 137, 132, 184, 76, 183, 185, 61, 184, 186, 57, 185, 216, 212, 186, 192, 214, 187, 139, 34, 156, 218, 79, 237, 147, 123, 177, 45, 44, 4, 208, 201, 32, 98, 64, 129, 192, 213, 138, 235, 59, 219, 141, 242, 97, 97, 2, 141, 240, 75, 235, 229, 24, 228, 31, 25, 226, 230, 23, 229, 231, 22, 230, 232, 26, 231, 233, 112, 232, 244, 189, 243, 189, 221, 190, 222, 28, 221, 223, 27, 222, 224, 29, 223, 225, 30, 224, 113, 247, 225, 99, 60, 240, 213, 147, 215, 60, 20, 166, 192, 187, 213, 243, 112, 244, 244, 233, 245, 245, 128, 188, 188, 114, 174, 134, 131, 220, 174, 217, 236, 236, 198, 134, 215, 177, 58, 156, 143, 124, 25, 110, 7, 31, 228, 25, 264, 356, 368, 0, 11, 267, 451, 452, 349, 267, 302, 269, 350, 357, 277, 350, 452, 357, 299, 333, 297, 396, 175, 377, 381, 384, 382, 280, 347, 330, 269, 303, 270, 151, 9, 337, 344, 278, 360, 424, 418, 431, 270, 304, 409, 272, 310, 407, 322, 270, 410, 449, 450, 347, 432, 422, 434, 18, 313, 17, 291, 306, 375, 259, 387, 260, 424, 335, 418, 434, 364, 416, 391, 423, 327, 301, 251, 298, 275, 281, 4, 254, 373, 253, 375, 307, 321, 280, 425, 411, 200, 421, 18, 335, 321, 406, 321, 320, 405, 314, 315, 17, 423, 426, 266, 396, 377, 369, 270, 322, 269, 413, 417, 464, 385, 386, 258, 248, 456, 419, 298, 284, 333, 168, 417, 8, 448, 346, 261, 417, 413, 285, 326, 327, 328, 277, 355, 329, 309, 392, 438, 381, 382, 256, 279, 429, 360, 365, 364, 379, 355, 277, 437, 282, 443, 283, 281, 275, 363, 395, 431, 369, 299, 297, 337, 335, 273, 321, 348, 450, 349, 359, 446, 467, 283, 293, 282, 250, 458, 462, 300, 276, 383, 292, 308, 325, 283, 276, 293, 264, 372, 447, 346, 352, 340, 354, 274, 19, 363, 456, 281, 426, 436, 425, 380, 381, 252, 267, 269, 393, 421, 200, 428, 371, 266, 329, 432, 287, 422, 290, 250, 328, 385, 258, 384, 446, 265, 342, 386, 387, 257, 422, 424, 430, 445, 342, 276, 422, 273, 424, 306, 292, 307, 352, 366, 345, 268, 271, 302, 358, 423, 371, 327, 294, 460, 331, 279, 294, 303, 271, 304, 436, 432, 427, 304, 272, 408, 395, 394, 431, 378, 395, 400, 296, 334, 299, 6, 351, 168, 376, 352, 411, 307, 325, 320, 285, 295, 336, 320, 319, 404, 329, 330, 349, 334, 293, 333, 366, 323, 447, 316, 15, 315, 331, 358, 279, 317, 14, 316, 8, 285, 9, 277, 329, 350, 253, 374, 252, 319, 318, 403, 351, 6, 419, 324, 318, 325, 397, 367, 365, 288, 435, 397, 278, 344, 439, 310, 272, 311, 248, 195, 281, 375, 273, 291, 175, 396, 199, 312, 311, 268, 276, 283, 445, 390, 373, 339, 295, 282, 296, 448, 449, 346, 356, 264, 454, 337, 336, 299, 337, 338, 151, 294, 278, 455, 308, 292, 415, 429, 358, 355, 265, 340, 372, 388, 390, 466, 352, 346, 280, 295, 442, 282, 354, 19, 370, 285, 441, 295, 195, 248, 197, 457, 440, 274, 301, 300, 368, 417, 351, 465, 251, 301, 389, 385, 380, 386, 394, 395, 379, 399, 412, 419, 410, 436, 322, 387, 373, 388, 326, 2, 393, 354, 370, 461, 393, 164, 267, 268, 302, 12, 386, 374, 387, 312, 268, 13, 298, 293, 301, 265, 446, 340, 380, 385, 381, 280, 330, 425, 322, 426, 391, 420, 429, 437, 393, 391, 326, 344, 440, 438, 458, 459, 461, 364, 434, 394, 428, 396, 262, 274, 354, 457, 317, 316, 402, 316, 315, 403, 315, 314, 404, 314, 313, 405, 313, 421, 406, 323, 366, 361, 292, 306, 407, 306, 291, 408, 291, 287, 409, 287, 432, 410, 427, 434, 411, 372, 264, 383, 459, 309, 457, 366, 352, 401, 1, 274, 4, 418, 421, 262, 331, 294, 358, 435, 433, 367, 392, 289, 439, 328, 462, 326, 94, 2, 370, 289, 305, 455, 339, 254, 448, 359, 255, 446, 254, 253, 449, 253, 252, 450, 252, 256, 451, 256, 341, 452, 414, 413, 463, 286, 441, 414, 286, 258, 441, 258, 257, 442, 257, 259, 443, 259, 260, 444, 260, 467, 445, 309, 459, 250, 305, 289, 290, 305, 290, 460, 401, 376, 435, 309, 250, 392, 376, 411, 433, 453, 341, 464, 357, 453, 465, 343, 357, 412, 437, 343, 399, 344, 360, 440, 420, 437, 456, 360, 420, 363, 361, 401, 288, 265, 372, 353, 390, 339, 249, 339, 448, 255]; ================================================ FILE: src/vendor/OBJLoader.js ================================================ import * as THREE from 'three'; const OBJLoader = function (manager) { this.manager = (manager !== undefined) ? manager : THREE.DefaultLoadingManager; }; OBJLoader.prototype = { constructor: OBJLoader, load: function (url, onLoad, onProgress, onError) { var scope = this; var loader = new THREE.FileLoader(scope.manager); loader.setCrossOrigin(this.crossOrigin); loader.load(url, function (text) { onLoad(scope.parse(text)); }); }, parse: function (text) { function vector(x, y, z) { return new THREE.Vector3(parseFloat(x), parseFloat(y), parseFloat(z)); } function uv(u, v) { return new THREE.Vector2(parseFloat(u), parseFloat(v)); } function face3(a, b, c, normals) { return new THREE.Face3(a, b, c, normals); } var object = new THREE.Object3D(); var geometry, material, mesh; function parseVertexIndex(index) { index = parseInt(index); return index >= 0 ? index - 1 : index + vertices.length; } function parseNormalIndex(index) { index = parseInt(index); return index >= 0 ? index - 1 : index + normals.length; } function parseUVIndex(index) { index = parseInt(index); return index >= 0 ? index - 1 : index + uvs.length; } function add_face(a, b, c, normals_inds) { if (normals_inds === undefined) { geometry.faces.push(face3( vertices[parseVertexIndex(a)] - 1, vertices[parseVertexIndex(b)] - 1, vertices[parseVertexIndex(c)] - 1 )); } else { geometry.faces.push(face3( vertices[parseVertexIndex(a)] - 1, vertices[parseVertexIndex(b)] - 1, vertices[parseVertexIndex(c)] - 1, [ normals[parseNormalIndex(normals_inds[0])].clone(), normals[parseNormalIndex(normals_inds[1])].clone(), normals[parseNormalIndex(normals_inds[2])].clone() ] )); } } function add_uvs(a, b, c) { geometry.faceVertexUvs[0].push([ uvs[parseUVIndex(a)].clone(), uvs[parseUVIndex(b)].clone(), uvs[parseUVIndex(c)].clone() ]); } function handle_face_line(faces, uvs, normals_inds) { if (faces[3] === undefined) { add_face(faces[0], faces[1], faces[2], normals_inds); if (uvs !== undefined && uvs.length > 0) { add_uvs(uvs[0], uvs[1], uvs[2]); } } else { if (normals_inds !== undefined && normals_inds.length > 0) { add_face(faces[0], faces[1], faces[3], [normals_inds[0], normals_inds[1], normals_inds[3]]); add_face(faces[1], faces[2], faces[3], [normals_inds[1], normals_inds[2], normals_inds[3]]); } else { add_face(faces[0], faces[1], faces[3]); add_face(faces[1], faces[2], faces[3]); } if (uvs !== undefined && uvs.length > 0) { add_uvs(uvs[0], uvs[1], uvs[3]); add_uvs(uvs[1], uvs[2], uvs[3]); } } } // create mesh if no objects in text if (/^o /gm.test(text) === false) { geometry = new THREE.Geometry(); material = new THREE.MeshLambertMaterial(); mesh = new THREE.Mesh(geometry, material); object.add(mesh); } var vertices = []; var normals = []; var uvs = []; // v float float float var vertex_pattern = /v( +[\d|\.|\+|\-|e]+)( +[\d|\.|\+|\-|e]+)( +[\d|\.|\+|\-|e]+)/; // vn float float float var normal_pattern = /vn( +[\d|\.|\+|\-|e]+)( +[\d|\.|\+|\-|e]+)( +[\d|\.|\+|\-|e]+)/; // vt float float var uv_pattern = /vt( +[\d|\.|\+|\-|e]+)( +[\d|\.|\+|\-|e]+)/; // f vertex vertex vertex ... var face_pattern1 = /f( +-?\d+)( +-?\d+)( +-?\d+)( +-?\d+)?/; // f vertex/uv vertex/uv vertex/uv ... var face_pattern2 = /f( +(-?\d+)\/(-?\d+))( +(-?\d+)\/(-?\d+))( +(-?\d+)\/(-?\d+))( +(-?\d+)\/(-?\d+))?/; // f vertex/uv/normal vertex/uv/normal vertex/uv/normal ... var face_pattern3 = /f( +(-?\d+)\/(-?\d+)\/(-?\d+))( +(-?\d+)\/(-?\d+)\/(-?\d+))( +(-?\d+)\/(-?\d+)\/(-?\d+))( +(-?\d+)\/(-?\d+)\/(-?\d+))?/; // f vertex//normal vertex//normal vertex//normal ... var face_pattern4 = /f( +(-?\d+)\/\/(-?\d+))( +(-?\d+)\/\/(-?\d+))( +(-?\d+)\/\/(-?\d+))( +(-?\d+)\/\/(-?\d+))?/ // fixes text = text.replace(/\\\r?\n/g, ''); // handles line continuations \ var lines = text.split('\n'); for (var i = 0; i < lines.length; i++) { var line = lines[i]; line = line.trim(); var result; if (line.length === 0 || line.charAt(0) === '#') { continue; } else if ((result = vertex_pattern.exec(line)) !== null) { // ["v 1.0 2.0 3.0", "1.0", "2.0", "3.0"] vertices.push( geometry.vertices.push( vector( result[1], result[2], result[3] ) ) ); } else if ((result = normal_pattern.exec(line)) !== null) { // ["vn 1.0 2.0 3.0", "1.0", "2.0", "3.0"] normals.push( vector( result[1], result[2], result[3] ) ); } else if ((result = uv_pattern.exec(line)) !== null) { // ["vt 0.1 0.2", "0.1", "0.2"] uvs.push( uv( result[1], result[2] ) ); } else if ((result = face_pattern1.exec(line)) !== null) { // ["f 1 2 3", "1", "2", "3", undefined] handle_face_line( [result[1], result[2], result[3], result[4]] ); } else if ((result = face_pattern2.exec(line)) !== null) { // ["f 1/1 2/2 3/3", " 1/1", "1", "1", " 2/2", "2", "2", " 3/3", "3", "3", undefined, undefined, undefined] handle_face_line( [result[2], result[5], result[8], result[11]], //faces [result[3], result[6], result[9], result[12]] //uv ); } else if ((result = face_pattern3.exec(line)) !== null) { // ["f 1/1/1 2/2/2 3/3/3", " 1/1/1", "1", "1", "1", " 2/2/2", "2", "2", "2", " 3/3/3", "3", "3", "3", undefined, undefined, undefined, undefined] handle_face_line( [result[2], result[6], result[10], result[14]], //faces [result[3], result[7], result[11], result[15]], //uv [result[4], result[8], result[12], result[16]] //normal ); } else if ((result = face_pattern4.exec(line)) !== null) { // ["f 1//1 2//2 3//3", " 1//1", "1", "1", " 2//2", "2", "2", " 3//3", "3", "3", undefined, undefined, undefined] handle_face_line( [result[2], result[5], result[8], result[11]], //faces [], //uv [result[3], result[6], result[9], result[12]] //normal ); } else if (/^o /.test(line)) { geometry = new THREE.Geometry(); material = new THREE.MeshLambertMaterial(); mesh = new THREE.Mesh(geometry, material); mesh.name = line.substring(2).trim(); object.add(mesh); } else if (/^g /.test(line)) { // group } else if (/^usemtl /.test(line)) { // material material.name = line.substring(7).trim(); } else if (/^mtllib /.test(line)) { // mtl file } else if (/^s /.test(line)) { // smooth shading } else { // console.log( "THREE.OBJLoader: Unhandled line " + line ); } } var children = object.children; for (var i = 0, l = children.length; i < l; i++) { var geometry = children[i].geometry; geometry.computeFaceNormals(); geometry.computeBoundingSphere(); } return object; } }; export { OBJLoader } ================================================ FILE: static/facemesh.obj ================================================ # Blender v2.82 (sub 7) OBJ File: 'facemesh.blend' # www.blender.org mtllib facemesh.mtl o New_Object_Mesh v -0.391703 -30.513420 2.929656 v -0.327589 -13.526743 20.004915 v -0.277804 -19.081829 4.867016 v 4.676590 7.354108 12.994000 v -0.341671 -7.029040 22.194536 v -0.256098 1.456693 20.194050 v 0.042588 21.398129 5.349126 v 40.740379 22.225311 -17.598557 v 0.153374 35.699390 1.791313 v 0.168240 44.109463 3.275271 v 0.305854 75.679169 -1.215682 v -0.401943 -33.307640 1.980729 v -0.353038 -35.152973 0.271872 v -0.298869 -35.372543 -2.202204 v -0.383511 -43.380497 -4.554055 v -0.380759 -45.765694 -3.531934 v -0.375800 -48.769741 -2.175002 v -0.346630 -52.423962 -2.879055 v -0.210762 -58.960518 -7.838552 v -0.312770 -16.804180 16.935862 v 5.330989 -15.891883 8.959006 v 59.252075 45.024712 -42.973286 v 24.303938 17.272987 -12.049582 v 29.855165 16.900997 -12.405232 v 35.257412 17.248531 -13.901323 v 42.839596 20.181641 -18.603035 v 19.722767 18.600685 -12.644763 v 32.206211 31.506393 -9.249606 v 26.232580 31.091812 -9.459580 v 37.812805 30.680012 -11.180326 v 41.577534 28.681141 -13.608844 v 46.852428 16.752567 -21.682589 v 21.362268 -67.651222 -16.156527 v 42.811665 23.334782 -19.481913 v 61.226650 18.545483 -46.896729 v 52.608521 20.229435 -27.221169 v 29.815342 -5.982173 -7.366467 v 8.356757 -29.271130 2.429451 v 7.673128 -34.688419 -0.667224 v 17.319040 -29.935246 -1.448414 v 22.952820 -31.073929 -7.030187 v 14.271839 -34.198078 -3.557678 v 19.257126 -33.982254 -8.587597 v 28.898727 -41.488403 -17.926575 v 4.481228 -13.266599 19.543421 v 5.145666 -6.912517 21.565374 v 49.791157 35.510239 -14.748238 v 17.507236 8.069736 -6.102351 v 19.160110 -9.840832 5.476562 v 19.476845 -6.456553 3.765532 v 46.812027 -4.392895 -14.950462 v 4.913116 0.883450 18.439407 v 36.728039 41.949772 -4.671053 v 44.525261 39.921650 -9.190274 v 54.554008 56.340248 -31.316057 v 12.168645 36.842499 0.139669 v 21.087973 29.243511 -11.267314 v 33.790276 -33.987850 -18.535112 v 54.908672 -38.197388 -65.231491 v 15.004392 -13.357043 3.031813 v 9.891405 -15.715839 3.393411 v 29.438778 -33.590706 -18.662237 v 26.598118 -33.884201 -17.275576 v 47.538151 44.221828 -11.741336 v 19.731133 -11.971386 2.130724 v 26.163134 41.372887 -1.397717 v 27.206575 46.849468 0.161694 v 32.893444 72.052567 -8.644912 v 50.880817 50.548409 -20.260151 v 29.385611 60.140594 -4.011586 v 52.872715 38.334484 -19.436506 v 55.990223 41.354923 -30.659679 v 8.145041 -32.573151 1.370785 v 15.633457 -32.607052 -2.414984 v 21.087002 -32.570480 -7.420076 v 13.637033 -14.415978 1.735104 v 28.108210 -33.636101 -17.931772 v 24.640327 -37.758896 -14.705924 v 25.614784 -34.105255 -17.126053 v 11.325471 -12.454526 11.281258 v 18.158592 -33.391689 -9.437989 v 13.113791 -34.052814 -5.823841 v 7.035420 -34.890533 -3.074133 v 8.551800 -58.263882 -8.376295 v 8.117520 -51.452351 -3.529671 v 7.789455 -47.792210 -2.989572 v 7.386213 -44.795372 -4.471762 v 6.853819 -42.781071 -5.394631 v 18.273136 -39.374020 -11.351515 v 19.244640 -39.985825 -10.410431 v 20.545877 -41.436604 -9.717621 v 21.599977 -43.478828 -10.892609 v 26.958124 -25.780521 -8.247591 v 60.547493 -8.602262 -71.708138 v -0.285215 -17.898754 9.133472 v 21.623245 -37.560238 -15.056973 v 23.135502 -37.352428 -14.529606 v 7.850791 -18.531700 3.377678 v 18.058542 -15.315192 -2.432274 v 8.811674 -17.204643 3.581658 v 23.701252 5.113960 -8.232275 v 33.219639 1.894928 -9.990783 v 20.717361 -8.753664 0.313672 v 46.270363 65.615051 -19.235329 v 42.495056 57.160217 -11.583475 v 38.723221 47.277775 -5.392136 v 23.616018 -48.102921 -14.802400 v 13.989193 45.362541 2.778713 v 15.796125 60.751297 0.196890 v 18.052998 75.101227 -2.592651 v 40.062183 18.269352 -16.317156 v 52.394577 12.848121 -25.064829 v 16.895411 20.034092 -13.330769 v 47.300411 27.137192 -18.691217 v 13.305011 11.688559 -3.789199 v 15.077642 -8.380561 11.280568 v 57.830547 8.510499 -31.630203 v 48.881886 9.493465 -20.162457 v 42.076454 7.699603 -14.991509 v 31.559713 7.976216 -12.328252 v 23.547586 9.790773 -10.973671 v 17.586954 12.272169 -9.283197 v 5.507946 19.686798 2.973412 v 57.985950 -3.256486 -30.787766 v 51.468445 28.257584 -21.158148 v 2.615532 -16.443922 16.623390 v 17.341846 2.373301 -3.681009 v 62.193714 18.698460 -65.600105 v 13.219665 15.385485 -8.219237 v 21.440145 -8.843401 -5.797756 v 44.598610 23.065853 -20.604412 v 15.345642 -4.180233 9.180137 v 58.650524 -23.054722 -69.897934 v 17.130035 22.092831 -14.694052 v 10.108676 -1.131684 14.953390 v 44.606174 -51.371353 -37.042763 v 42.972649 -59.312057 -46.894756 v 61.575474 -6.646063 -51.200180 v 51.698292 -43.463940 -43.096886 v 58.667263 30.770981 -40.297688 v 21.775030 -74.430191 -19.471718 v 2.047860 -17.615932 8.766379 v 22.778292 -1.483693 -5.986648 v 56.802494 18.945831 -32.953720 v 34.930332 20.698803 -14.234451 v 30.001928 20.254974 -12.861559 v 26.042513 -38.562534 -15.706674 v 57.748531 -15.702432 -33.405308 v 11.330700 -83.466934 -20.814280 v 27.653599 -74.072510 -32.430817 v 34.637005 -67.794334 -39.003334 v 0.205507 60.446140 1.429344 v -0.014131 -84.795830 -19.284725 v 25.309420 20.515541 -12.693746 v 20.985510 21.252903 -13.449100 v 18.346273 21.675690 -14.640030 v 55.035046 29.571712 -26.796894 v 21.985285 25.478378 -12.407498 v 26.717546 26.716942 -11.243027 v 31.416763 27.014359 -11.427041 v 36.261787 26.298676 -12.877275 v 39.443439 25.027885 -14.802340 v 61.567997 33.234631 -55.508896 v 38.344521 21.425240 -16.043129 v -0.283227 -22.835312 2.929769 v 21.176298 -23.167084 -3.703203 v 14.966014 -12.749868 5.310005 v 8.719563 -22.697067 2.334445 v 0.141385 28.649921 1.406427 v 36.684841 -59.936714 -32.159046 v 29.405146 -67.156494 -26.245543 v 11.850958 -79.286079 -13.768339 v 49.464115 -50.303288 -56.441460 v 18.646063 23.506187 -13.736939 v 9.313857 10.031965 4.312936 v -0.097555 -80.672401 -12.514790 v 20.190439 -79.625748 -25.443485 v 60.050102 -20.083969 -51.129978 v 13.062889 -41.298908 -8.026192 v 14.038498 -42.705715 -7.082882 v 14.884039 -45.073914 -6.204046 v 15.523176 -48.324768 -7.105758 v 17.106590 -54.080486 -11.139311 v 23.890659 -33.588512 -13.247632 v 25.679350 -32.855568 -13.317421 v 27.300512 -31.873524 -13.143246 v 31.815681 -29.103104 -13.590711 v 51.562771 -18.112133 -21.991924 v 9.287562 16.009937 -0.840998 v 12.634535 26.710350 -10.365831 v 16.145561 25.423695 -12.643601 v 22.392563 -33.014324 -13.711056 v 51.360542 -33.508823 -31.886326 v 7.569176 27.398006 -2.649560 v 19.395390 -60.430435 -13.869312 v -0.139347 8.253318 14.962630 v 5.130049 13.178600 8.537459 v -0.064695 14.490357 9.914152 v 13.679506 0.902021 4.023934 v -0.163536 -74.222153 -9.167343 v -0.188253 -66.050659 -8.516518 v 10.018951 -65.199104 -9.808981 v 32.436947 -45.148766 -20.809521 v 26.086281 -13.444077 -7.774351 v 26.408873 -53.656773 -17.879459 v 39.426929 -12.648893 -10.321648 v 31.733070 -19.103127 -10.097721 v 44.333290 -22.059017 -16.155952 v 11.475121 -73.021126 -10.628958 v 17.476896 -2.054946 -0.275513 v 36.032677 -51.575695 -25.823637 v 28.587585 -59.943913 -21.882406 v 37.687042 -36.364758 -20.509777 v 56.274845 -26.450497 -36.194405 v 44.015095 -39.248489 -25.576450 v 57.115608 -32.472286 -49.586803 v 36.741611 -25.418667 -13.993815 v 13.194196 6.188581 -0.034378 v 13.161253 -11.368348 12.481596 v 17.433899 -12.019117 6.038604 v 10.260014 -7.518275 16.735033 v 17.056665 31.493172 -8.496260 v 26.042393 34.655415 -7.290590 v 33.912411 35.358974 -7.643402 v 40.502232 34.436863 -10.055379 v 45.147739 31.819832 -13.748941 v 47.974079 21.713245 -22.979763 v 62.015759 6.021857 -49.346500 v 43.870193 14.550788 -18.856926 v 38.080006 13.025960 -15.525772 v 30.738440 12.722532 -13.225120 v 23.718529 13.741654 -12.144513 v 18.308809 15.551921 -11.824625 v 14.674701 17.526020 -11.345362 v 61.414421 5.051208 -70.530090 v 17.480141 -13.170094 3.085974 v 9.293222 4.654150 8.821153 v 8.690671 -12.167177 16.872761 v 5.539879 -15.194092 14.321405 v 8.835292 -13.031940 14.048054 v 16.073324 -14.847165 0.962954 v 4.456174 -15.915439 15.850921 v 3.995910 -17.020542 8.855565 v 15.081600 21.841644 -13.758110 v 11.850179 20.770798 -10.312963 v 9.975327 19.987106 -6.259644 v 41.349754 24.058044 -16.829649 v 44.335926 26.411774 -17.067303 v -4.933437 7.306862 12.832303 v -39.557358 21.427799 -18.723644 v -5.759441 -15.948621 8.835617 v -57.314793 44.416153 -44.996033 v -23.294079 16.695900 -12.755176 v -28.838215 16.277988 -13.266344 v -34.186539 16.668358 -14.919426 v -41.609428 19.427177 -19.805939 v -18.727068 18.134312 -13.225418 v -31.299002 30.783356 -10.185483 v -25.348385 30.484879 -10.168536 v -36.856441 29.900997 -12.256269 v -40.513809 27.823536 -14.816440 v -45.558876 16.160557 -22.991751 v -21.236019 -67.629868 -16.730902 v -41.601208 22.514027 -20.686962 v -59.369560 18.024475 -48.902332 v -51.201389 19.594296 -28.745480 v -29.351946 -6.103733 -8.092149 v -9.023136 -29.247574 2.196111 v -8.299863 -34.651318 -0.867335 v -17.776714 -29.864914 -1.895026 v -23.290581 -30.914558 -7.624582 v -14.749841 -34.116322 -3.974968 v -19.606474 -33.827911 -9.111079 v -28.894905 -41.387436 -18.665972 v -5.139418 -13.319161 19.426989 v -5.754573 -6.967084 21.458084 v -48.604088 34.580875 -16.200335 v -16.972008 7.911997 -6.572989 v -19.245827 -9.834166 4.982230 v -19.427536 -6.457109 3.261186 v -45.907448 -4.648933 -16.173428 v -5.392848 0.844442 18.292828 v -35.897770 41.033051 -5.626067 v -43.502777 39.002102 -10.372753 v -52.859444 55.694847 -33.069000 v -11.712626 36.487724 -0.135837 v -20.154068 28.769238 -11.888829 v -33.750340 -33.838543 -19.396286 v -52.995476 -38.395267 -67.132385 v -15.147238 -13.401670 2.667139 v -10.136940 -15.717710 3.212129 v -29.571869 -33.349567 -19.422304 v -26.721500 -33.648884 -17.976484 v -46.405823 43.231853 -13.084427 v -19.718687 -11.935544 1.668206 v -25.499416 40.664646 -2.005397 v -26.542826 46.144039 -0.487395 v -31.918697 71.576714 -9.592605 v -49.478191 49.791859 -21.817379 v -28.609982 59.584484 -4.746192 v -51.548882 37.470181 -21.014814 v -54.353493 40.577595 -32.446762 v -8.848559 -32.569904 1.171319 v -16.143618 -32.494175 -2.825132 v -21.451145 -32.452530 -8.010982 v -13.756038 -14.412023 1.468066 v -28.247259 -33.416073 -18.662537 v -24.925657 -37.594521 -15.343097 v -25.712385 -33.902946 -17.815462 v -11.635601 -12.579294 10.933297 v -18.424841 -33.263954 -9.926016 v -13.525257 -33.961899 -6.163164 v -7.548410 -34.822258 -3.273077 v -8.887934 -58.224354 -8.552992 v -8.726043 -51.443874 -3.770199 v -8.500104 -47.772083 -3.232642 v -8.093838 -44.760731 -4.711023 v -7.531825 -42.745762 -5.673565 v -18.653446 -39.255287 -11.808201 v -19.659336 -39.873890 -10.931899 v -20.975924 -41.348999 -10.201480 v -21.973021 -43.383892 -11.415076 v -27.028786 -25.677513 -8.922566 v -58.347717 -9.025102 -73.768936 v -21.845783 -37.416756 -15.637444 v -23.421255 -37.196758 -15.131150 v -8.205168 -18.499249 3.217656 v -18.032061 -15.237701 -2.806179 v -9.115054 -17.195915 3.404947 v -23.089077 4.929069 -8.835421 v -32.524120 1.663303 -10.828115 v -20.620441 -8.749314 -0.192320 v -44.947170 64.980270 -20.665092 v -41.374809 56.400486 -12.802796 v -37.841049 46.389095 -6.413615 v -23.704187 -48.030380 -15.416173 v -13.535759 44.974751 2.455831 v -15.222555 60.491947 -0.207817 v -17.316429 74.842575 -3.072198 v -38.906075 17.591454 -17.469841 v -51.064823 12.344380 -26.570110 v -15.926041 19.634270 -13.845269 v -46.071987 26.319286 -20.042429 v -12.865487 11.559813 -4.191400 v -15.312442 -8.435188 10.891084 v -56.346260 8.046040 -33.412514 v -47.710503 9.044941 -21.496042 v -41.096718 7.341463 -16.165649 v -30.735201 7.667091 -13.178363 v -22.789608 9.485648 -11.623262 v -16.894325 12.015253 -9.759981 v -5.335283 19.615028 2.849476 v -56.611397 -3.591827 -32.485126 v -50.163853 27.504608 -22.694008 v -3.226783 -16.490803 16.527092 v -16.998390 2.281179 -4.144701 v -59.907581 18.190147 -67.788582 v -12.623874 15.172495 -8.587569 v -21.196543 -8.799633 -6.304061 v -43.351585 22.224377 -21.879959 v -15.441827 -4.233854 8.769805 v -56.554459 -23.386772 -71.938911 v -16.109531 21.658562 -15.191843 v -10.396348 -1.159737 14.651482 v -43.560661 -51.464420 -38.333099 v -41.675323 -59.341324 -48.293068 v -59.760590 -7.033219 -53.156292 v -50.377552 -43.642754 -44.612595 v -56.921444 30.146595 -42.233101 v -21.522091 -74.374847 -20.106380 v -2.616564 -17.607235 8.713786 v -22.338272 -1.575811 -6.547659 v -55.289814 18.358158 -34.627491 v -33.830372 19.986847 -15.209258 v -28.950985 19.580753 -13.777636 v -26.290773 -38.418682 -16.368961 v -56.389957 -15.956049 -35.047909 v -11.200459 -83.409058 -21.175097 v -26.954569 -73.994064 -33.328976 v -33.665581 -67.766304 -40.120533 v -24.286055 19.882946 -13.391455 v -19.944052 20.702087 -14.109816 v -17.310085 21.193329 -15.181563 v -53.595871 28.873020 -28.484720 v -20.921028 24.998272 -12.996388 v -25.646255 26.143505 -11.976130 v -30.365446 26.372856 -12.309917 v -35.178154 25.561092 -13.895178 v -38.317825 24.216946 -15.916949 v -59.408649 32.684929 -57.656033 v -37.192719 20.707165 -17.111137 v -21.281239 -23.029049 -4.222301 v -15.157898 -12.797924 4.947150 v -9.188842 -22.659161 2.121181 v -35.928844 -59.954929 -33.202618 v -28.896282 -67.064819 -27.091606 v -11.874543 -79.262939 -14.062256 v -47.786060 -50.441795 -58.094799 v -17.613239 23.081791 -14.293269 v -9.215925 9.966502 4.058419 v -19.845755 -79.539818 -26.082466 v -58.342361 -20.394119 -52.992722 v -13.618283 -41.233158 -8.430911 v -14.613350 -42.656502 -7.491632 v -15.431113 -44.992344 -6.601082 v -16.032204 -48.334381 -7.517800 v -17.313938 -54.006523 -11.566554 v -24.116661 -33.394909 -13.839737 v -25.944876 -32.653660 -13.991773 v -27.536654 -31.655899 -13.865972 v -31.810308 -28.984108 -14.376004 v -50.554882 -18.329090 -23.314131 v -8.967526 15.892131 -1.069099 v -11.866599 26.406727 -10.687633 v -15.234859 25.017143 -13.108602 v -22.561583 -32.822556 -14.316895 v -50.284225 -33.662445 -33.268169 v -7.128628 27.253517 -2.826803 v -19.365589 -60.383896 -14.342003 v -5.181956 13.121339 8.383138 v -13.589266 0.841265 3.660518 v -10.197321 -65.154373 -10.120326 v -32.139851 -45.136925 -21.645422 v -25.793055 -13.417929 -8.384905 v -26.202562 -53.596958 -18.505630 v -38.863796 -12.802266 -11.220296 v -31.457006 -19.114738 -10.842288 v -43.704163 -22.207359 -17.165840 v -11.592940 -72.987465 -10.968139 v -17.278479 -2.092864 -0.720745 v -35.489304 -51.596691 -26.788641 v -28.295044 -59.876347 -22.602802 v -37.320599 -36.349304 -21.458643 v -54.925629 -26.692108 -37.785477 v -43.276859 -39.328278 -26.739330 v -55.539810 -32.776176 -51.381760 v -36.444962 -25.407291 -14.843914 v -12.961104 6.102340 -0.409334 v -13.454464 -11.445515 12.137245 v -17.564360 -12.059621 5.621463 v -10.715003 -7.607129 16.467787 v -16.314608 31.070625 -8.948398 v -25.258001 34.013256 -7.938076 v -33.061665 34.584133 -8.522104 v -39.581573 33.594002 -11.170484 v -44.058594 30.950245 -15.031268 v -46.656044 20.958736 -24.395113 v -60.129742 5.542511 -51.383507 v -42.681316 13.975063 -20.151581 v -37.034630 12.552341 -16.581438 v -29.781696 12.260968 -14.082767 v -22.818651 13.323147 -12.786913 v -17.440197 15.195401 -12.294885 v -13.844924 17.229855 -11.733282 v -59.130005 4.626853 -72.719711 v -17.561745 -13.164773 2.671800 v -9.385215 4.565241 8.507298 v -9.200927 -12.269557 16.633667 v -6.023980 -15.282946 14.191987 v -9.226430 -13.143612 13.793691 v -16.131813 -14.792025 0.611744 v -5.001357 -15.981090 15.724745 v -4.461918 -17.033875 8.776276 v -14.132870 21.455196 -14.228653 v -11.076156 20.508572 -10.665399 v -9.422017 19.810177 -6.498888 v -40.188858 23.236755 -17.994774 v -43.177692 25.564831 -18.317093 vt 0.546087 0.168528 vt 0.498263 0.164907 vt 0.498168 0.128287 vt 0.553316 0.133293 vt 0.498184 0.193879 vt 0.543931 0.196208 vt 0.540329 0.228141 vt 0.498096 0.226218 vt 0.535023 0.257739 vt 0.498062 0.255480 vt 0.530307 0.290855 vt 0.497808 0.287865 vt 0.529673 0.305171 vt 0.497756 0.302529 vt 0.530338 0.318594 vt 0.497680 0.316069 vt 0.497626 0.327215 vt 0.529652 0.328153 vt 0.530148 0.386702 vt 0.530697 0.399800 vt 0.497768 0.395548 vt 0.497633 0.384228 vt 0.498252 0.425121 vt 0.533423 0.425093 vt 0.530369 0.441469 vt 0.498398 0.440617 vt 0.505792 0.455007 vt 0.498616 0.455525 vt 0.504333 0.475436 vt 0.498807 0.475445 vt 0.507276 0.483601 vt 0.498834 0.483394 vt 0.508467 0.495095 vt 0.498778 0.495031 vt 0.499093 0.510909 vt 0.510440 0.510869 vt 0.514257 0.532179 vt 0.499103 0.531894 vt 0.499032 0.557867 vt 0.518707 0.555534 vt 0.526518 0.588384 vt 0.499123 0.591527 vt 0.545399 0.630252 vt 0.499290 0.635640 vt 0.560350 0.680967 vt 0.499421 0.673102 vt 0.565865 0.723628 vt 0.499629 0.715845 vt 0.576943 0.797884 vt 0.499715 0.796787 vt 0.592899 0.870759 vt 0.500116 0.875700 vt 0.407680 0.869818 vt 0.423023 0.796796 vt 0.433757 0.721907 vt 0.438873 0.679387 vt 0.453350 0.629551 vt 0.471960 0.588240 vt 0.479525 0.555009 vt 0.483830 0.531985 vt 0.487639 0.510731 vt 0.489331 0.494704 vt 0.490426 0.483461 vt 0.493316 0.475342 vt 0.491395 0.455076 vt 0.467016 0.441744 vt 0.463382 0.425361 vt 0.465330 0.400044 vt 0.465660 0.387008 vt 0.465013 0.318854 vt 0.465664 0.328564 vt 0.465835 0.305345 vt 0.465510 0.290960 vt 0.461360 0.257998 vt 0.456420 0.228306 vt 0.453025 0.196271 vt 0.451024 0.168653 vt 0.443401 0.133284 vt 0.675079 0.852096 vt 0.646003 0.792826 vt 0.760225 0.814904 vt 0.717401 0.773979 vt 0.830747 0.762860 vt 0.772036 0.738348 vt 0.887010 0.698852 vt 0.822261 0.688868 vt 0.941279 0.630144 vt 0.863002 0.630429 vt 0.978435 0.548917 vt 0.886985 0.565455 vt 0.888184 0.503683 vt 0.988333 0.476334 vt 0.883788 0.443324 vt 0.977270 0.408328 vt 0.866882 0.382640 vt 0.948001 0.341249 vt 0.901032 0.276056 vt 0.841509 0.328845 vt 0.836943 0.231680 vt 0.792454 0.288035 vt 0.771086 0.203489 vt 0.744606 0.258325 vt 0.696957 0.223505 vt 0.708345 0.174128 vt 0.647980 0.198625 vt 0.656479 0.155030 vt 0.596399 0.178227 vt 0.602649 0.142874 vt 0.325446 0.850452 vt 0.354382 0.790500 vt 0.239773 0.812694 vt 0.283123 0.771008 vt 0.168659 0.760491 vt 0.228054 0.735392 vt 0.373507 0.727579 vt 0.376186 0.702008 vt 0.317479 0.725787 vt 0.328122 0.702815 vt 0.111383 0.696393 vt 0.177175 0.685603 vt 0.056428 0.627843 vt 0.135586 0.627728 vt 0.018834 0.546744 vt 0.111279 0.563145 vt 0.008510 0.474549 vt 0.109831 0.501427 vt 0.019771 0.406585 vt 0.114204 0.441384 vt 0.048391 0.339677 vt 0.130954 0.380903 vt 0.094921 0.274782 vt 0.155834 0.327033 vt 0.159381 0.230220 vt 0.205225 0.286878 vt 0.225532 0.202359 vt 0.253052 0.257398 vt 0.288474 0.173291 vt 0.300440 0.222976 vt 0.340377 0.154562 vt 0.349193 0.198607 vt 0.394125 0.142805 vt 0.400838 0.178190 vt 0.404750 0.210366 vt 0.359140 0.235998 vt 0.317321 0.269141 vt 0.285656 0.326700 vt 0.239626 0.345585 vt 0.206198 0.371396 vt 0.204261 0.420429 vt 0.204010 0.475882 vt 0.193013 0.527420 vt 0.183036 0.576215 vt 0.204980 0.632477 vt 0.233430 0.678008 vt 0.271577 0.707991 vt 0.290445 0.691467 vt 0.259833 0.669042 vt 0.237591 0.631470 vt 0.217571 0.586887 vt 0.230428 0.552154 vt 0.411913 0.242902 vt 0.373770 0.267210 vt 0.341127 0.302120 vt 0.320128 0.342814 vt 0.259495 0.539761 vt 0.287084 0.482487 vt 0.297585 0.536236 vt 0.343279 0.516102 vt 0.343754 0.544724 vt 0.381567 0.535208 vt 0.376400 0.556680 vt 0.407056 0.549364 vt 0.400157 0.568392 vt 0.425924 0.562888 vt 0.415825 0.581352 vt 0.447125 0.577088 vt 0.431255 0.597840 vt 0.258568 0.574476 vt 0.248092 0.596583 vt 0.278466 0.566233 vt 0.309883 0.563056 vt 0.344199 0.565430 vt 0.373608 0.572780 vt 0.347504 0.583353 vt 0.370625 0.586365 vt 0.366141 0.599611 vt 0.345946 0.597903 vt 0.322773 0.583337 vt 0.298014 0.585156 vt 0.280737 0.591914 vt 0.260510 0.626962 vt 0.279801 0.652748 vt 0.304743 0.666334 vt 0.335625 0.670553 vt 0.369088 0.663914 vt 0.403623 0.644487 vt 0.414329 0.621493 vt 0.415433 0.601659 vt 0.405827 0.590922 vt 0.393697 0.582390 vt 0.322654 0.598596 vt 0.304235 0.600661 vt 0.387845 0.593092 vt 0.396867 0.599054 vt 0.401345 0.605502 vt 0.400072 0.617256 vt 0.385111 0.633837 vt 0.365746 0.646393 vt 0.340429 0.651332 vt 0.314030 0.647709 vt 0.294410 0.637543 vt 0.276117 0.624321 vt 0.267400 0.603810 vt 0.290315 0.602772 vt 0.276895 0.605727 vt 0.289186 0.612442 vt 0.301513 0.618795 vt 0.318539 0.625793 vt 0.341426 0.629243 vt 0.361825 0.626776 vt 0.380348 0.619499 vt 0.391585 0.610826 vt 0.395416 0.605514 vt 0.392307 0.604430 vt 0.383347 0.602973 vt 0.626827 0.730532 vt 0.683138 0.729420 vt 0.729120 0.712026 vt 0.766788 0.681663 vt 0.794629 0.635546 vt 0.816456 0.578760 vt 0.806064 0.529551 vt 0.795180 0.477666 vt 0.794823 0.422091 vt 0.792653 0.373371 vt 0.759465 0.346755 vt 0.712933 0.327262 vt 0.680258 0.269474 vt 0.638095 0.235844 vt 0.592477 0.210382 vt 0.551502 0.577529 vt 0.567532 0.598613 vt 0.584757 0.622870 vt 0.595663 0.646385 vt 0.583478 0.602695 vt 0.623910 0.704882 vt 0.672369 0.706540 vt 0.710338 0.695172 vt 0.740638 0.672935 vt 0.762427 0.634738 vt 0.782298 0.589612 vt 0.769413 0.554361 vt 0.630731 0.666483 vt 0.664526 0.673604 vt 0.695411 0.669706 vt 0.720532 0.656316 vt 0.739762 0.630366 vt 0.751893 0.599827 vt 0.741713 0.576936 vt 0.740587 0.541772 vt 0.721548 0.568565 vt 0.702266 0.537784 vt 0.690114 0.564909 vt 0.655782 0.545856 vt 0.655708 0.567104 vt 0.622888 0.557614 vt 0.626096 0.574165 vt 0.598950 0.569174 vt 0.605795 0.583554 vt 0.582947 0.582110 vt 0.593407 0.591942 vt 0.572717 0.563235 vt 0.591878 0.549787 vt 0.617631 0.535795 vt 0.656242 0.517099 vt 0.597939 0.606991 vt 0.599268 0.618954 vt 0.602667 0.600425 vt 0.612037 0.594685 vt 0.629520 0.588425 vt 0.652712 0.585741 vt 0.677472 0.585601 vt 0.702283 0.587885 vt 0.719650 0.595009 vt 0.732735 0.607327 vt 0.724141 0.627779 vt 0.705794 0.641100 vt 0.686063 0.650882 vt 0.659630 0.654333 vt 0.634171 0.648883 vt 0.614665 0.635966 vt 0.604143 0.607097 vt 0.608124 0.612524 vt 0.607335 0.606133 vt 0.616611 0.604955 vt 0.633933 0.601988 vt 0.654273 0.600545 vt 0.677765 0.601449 vt 0.696182 0.603565 vt 0.710088 0.606036 vt 0.723305 0.609122 vt 0.711128 0.615825 vt 0.698890 0.622135 vt 0.681925 0.628799 vt 0.659011 0.631835 vt 0.638631 0.629091 vt 0.619774 0.621416 vt 0.541776 0.550039 vt 0.564574 0.539998 vt 0.585679 0.526437 vt 0.607250 0.507606 vt 0.635452 0.485422 vt 0.456684 0.549709 vt 0.433887 0.539747 vt 0.412904 0.526252 vt 0.391664 0.507390 vt 0.363598 0.484925 vt 0.260829 0.421329 vt 0.301082 0.410450 vt 0.325922 0.453221 vt 0.333854 0.398342 vt 0.357750 0.428609 vt 0.380936 0.455487 vt 0.399589 0.477284 vt 0.422724 0.507740 vt 0.442560 0.518574 vt 0.463878 0.528208 vt 0.534215 0.528479 vt 0.555864 0.518741 vt 0.575788 0.507766 vt 0.598751 0.476913 vt 0.617628 0.455328 vt 0.712848 0.483873 vt 0.738949 0.422659 vt 0.698436 0.411254 vt 0.673658 0.454145 vt 0.640627 0.428566 vt 0.664438 0.398300 vt 0.677640 0.342844 vt 0.656173 0.302220 vt 0.623605 0.267024 vt 0.585238 0.242723 vt 0.587116 0.418150 vt 0.566956 0.394556 vt 0.595796 0.384579 vt 0.615594 0.403264 vt 0.643007 0.382556 vt 0.658038 0.353469 vt 0.636922 0.319746 vt 0.608904 0.292890 vt 0.574607 0.271581 vt 0.563553 0.299165 vt 0.594068 0.314602 vt 0.621094 0.332727 vt 0.639331 0.352644 vt 0.622679 0.371438 vt 0.561913 0.383072 vt 0.589797 0.377274 vt 0.616716 0.366539 vt 0.633445 0.352878 vt 0.614171 0.336189 vt 0.588962 0.323133 vt 0.561179 0.312735 vt 0.421863 0.271901 vt 0.387526 0.293085 vt 0.359579 0.320071 vt 0.338562 0.354122 vt 0.354039 0.383117 vt 0.381617 0.403754 vt 0.410343 0.418843 vt 0.429607 0.394966 vt 0.400603 0.385323 vt 0.373403 0.372382 vt 0.356655 0.353634 vt 0.374782 0.333239 vt 0.401922 0.315005 vt 0.432275 0.299240 vt 0.434370 0.383683 vt 0.406401 0.377819 vt 0.379288 0.367513 vt 0.362588 0.353802 vt 0.381628 0.336769 vt 0.406957 0.323503 vt 0.434532 0.313196 vt 0.434774 0.323971 vt 0.529913 0.375128 vt 0.497680 0.374389 vt 0.558656 0.374341 vt 0.529908 0.364516 vt 0.558776 0.364158 vt 0.497684 0.364532 vt 0.465900 0.375599 vt 0.465974 0.365006 vt 0.437562 0.374762 vt 0.437534 0.364743 vt 0.369451 0.353316 vt 0.385979 0.363940 vt 0.410445 0.368790 vt 0.412332 0.362938 vt 0.390318 0.359146 vt 0.374080 0.352708 vt 0.387000 0.339697 vt 0.392092 0.343148 vt 0.408807 0.331174 vt 0.410176 0.336901 vt 0.436164 0.332025 vt 0.560697 0.323601 vt 0.586941 0.330631 vt 0.559220 0.331533 vt 0.585683 0.336451 vt 0.608809 0.339120 vt 0.603877 0.342475 vt 0.626726 0.352368 vt 0.622217 0.351840 vt 0.610229 0.362946 vt 0.605878 0.358401 vt 0.585706 0.368118 vt 0.583979 0.362368 vt 0.473063 0.507172 vt 0.476296 0.492164 vt 0.480611 0.482833 vt 0.489265 0.474957 vt 0.485745 0.457207 vt 0.463813 0.446801 vt 0.422222 0.451193 vt 0.438425 0.455897 vt 0.453305 0.498702 vt 0.434399 0.489695 vt 0.423171 0.480597 vt 0.432574 0.471631 vt 0.439934 0.466983 vt 0.440781 0.480412 vt 0.459374 0.487641 vt 0.446372 0.474369 vt 0.466258 0.480852 vt 0.460122 0.451958 vt 0.481205 0.459967 vt 0.447622 0.456140 vt 0.446138 0.462146 vt 0.450344 0.468030 vt 0.468407 0.474935 vt 0.477575 0.477092 vt 0.485519 0.473230 vt 0.525102 0.507282 vt 0.521724 0.492516 vt 0.517304 0.483105 vt 0.508504 0.475062 vt 0.511790 0.457148 vt 0.533774 0.446606 vt 0.575892 0.450669 vt 0.575167 0.480582 vt 0.565709 0.471563 vt 0.563926 0.489733 vt 0.544989 0.498891 vt 0.538832 0.487879 vt 0.557423 0.480480 vt 0.559633 0.455604 vt 0.558198 0.466921 vt 0.551860 0.474490 vt 0.531909 0.481137 vt 0.512344 0.473331 vt 0.520434 0.477399 vt 0.516472 0.460005 vt 0.537633 0.451780 vt 0.550306 0.455966 vt 0.551754 0.462142 vt 0.547644 0.468060 vt 0.529593 0.475315 vn 0.1592 -0.8484 0.5049 vn 0.1504 -0.4451 0.8827 vn 0.1320 -0.0787 0.9881 vn 0.1062 -0.1369 0.9849 vn 0.1121 -0.5852 0.8031 vn 0.1054 -0.1617 0.9812 vn 0.0467 0.4298 0.9017 vn 0.0650 0.4101 0.9097 vn 0.0966 -0.3145 0.9443 vn 0.0612 0.0046 0.9981 vn 0.1271 -0.3372 0.9328 vn 0.1258 -0.9510 0.2825 vn 0.1376 -0.9809 0.1372 vn 0.1265 -0.6940 0.7088 vn 0.1114 -0.3146 0.9427 vn 0.2206 0.2947 0.9298 vn 0.3574 0.5875 0.7260 vn 0.3711 0.5647 0.7372 vn 0.4116 0.5396 0.7345 vn 0.4805 0.4221 0.7687 vn 0.2711 -0.2544 0.9283 vn 0.1029 -0.2459 0.9638 vn 0.0510 0.1351 0.9895 vn 0.0783 0.1741 0.9816 vn -0.1076 0.1750 0.9787 vn -0.0790 0.1357 0.9876 vn -0.1192 -0.2448 0.9622 vn -0.2889 -0.2554 0.9227 vn -0.5062 0.4266 0.7495 vn -0.4382 0.5400 0.7186 vn -0.3989 0.5640 0.7230 vn -0.3814 0.5902 0.7114 vn -0.2461 0.2990 0.9220 vn -0.1292 -0.3152 0.9402 vn -0.1370 -0.6946 0.7062 vn -0.1343 -0.9819 0.1335 vn -0.1375 -0.9499 0.2805 vn -0.1509 -0.3374 0.9292 vn -0.0872 0.0049 0.9962 vn -0.1214 -0.3078 0.9437 vn -0.0934 0.4192 0.9031 vn -0.0729 0.4292 0.9003 vn -0.1348 -0.1620 0.9775 vn -0.1342 -0.5849 0.7999 vn -0.1343 -0.1447 0.9803 vn -0.1639 -0.0780 0.9834 vn -0.1772 -0.4421 0.8793 vn -0.1778 -0.8497 0.4964 vn 0.3544 0.1815 0.9173 vn 0.6057 0.2409 0.7584 vn 0.8361 0.2217 0.5018 vn 0.9411 0.1043 0.3215 vn 0.9758 0.0010 0.2187 vn 0.9921 0.0453 0.1166 vn 1.0000 -0.0022 0.0092 vn 0.9983 -0.0455 -0.0358 vn 0.9911 -0.1247 -0.0456 vn 0.9690 -0.2440 -0.0399 vn 0.9133 -0.4057 0.0359 vn 0.8420 -0.5074 0.1829 vn 0.7936 -0.5195 0.3166 vn 0.7869 -0.5094 0.3482 vn 0.7683 -0.5463 0.3335 vn 0.5616 -0.7118 0.4219 vn -0.3849 0.1857 0.9041 vn -0.6354 0.2407 0.7337 vn -0.8523 0.2182 0.4754 vn -0.2659 0.1914 0.9448 vn -0.2287 -0.3177 0.9202 vn -0.4009 -0.1712 0.9000 vn -0.5090 0.2521 0.8230 vn -0.9492 0.1060 0.2963 vn -0.9811 0.0104 0.1935 vn -0.9944 0.0522 0.0918 vn -0.9999 0.0026 -0.0115 vn -0.9978 -0.0379 -0.0548 vn -0.9907 -0.1194 -0.0651 vn -0.9690 -0.2395 -0.0615 vn -0.9140 -0.4056 0.0117 vn -0.8482 -0.5065 0.1551 vn -0.8051 -0.5200 0.2854 vn -0.7971 -0.5124 0.3194 vn -0.7822 -0.5428 0.3058 vn -0.5796 -0.7096 0.4007 vn -0.6140 -0.3296 0.7172 vn -0.7816 -0.2681 0.5632 vn -0.7631 -0.3361 0.5521 vn -0.7436 -0.4263 0.5150 vn -0.8025 -0.4229 0.4209 vn -0.9067 -0.3425 0.2463 vn -0.9723 -0.1863 0.1413 vn -0.9863 -0.0765 0.1459 vn -0.9840 -0.0104 0.1781 vn -0.9708 0.0645 0.2311 vn -0.9661 0.0317 0.2564 vn -0.9707 0.0182 0.2395 vn -0.9187 0.1774 0.3528 vn -0.7389 0.2691 0.6177 vn -0.5780 0.0057 0.8160 vn -0.7965 -0.0153 0.6044 vn -0.8731 -0.1965 0.4461 vn -0.8200 -0.2264 0.5257 vn -0.8260 0.1482 0.5438 vn -0.4995 -0.0770 0.8629 vn -0.6761 -0.1480 0.7218 vn -0.6752 -0.2218 0.7035 vn -0.5310 -0.3357 0.7780 vn -0.8106 0.0661 0.5819 vn -0.7636 0.1441 0.6294 vn -0.3830 0.2560 0.8875 vn -0.3056 0.4648 0.8310 vn -0.4798 0.5123 0.7123 vn -0.6602 0.5402 0.5218 vn -0.8221 0.4431 0.3574 vn -0.8950 0.2061 0.3956 vn -0.6591 0.1513 0.7367 vn -0.6129 0.3357 0.7153 vn -0.4853 0.3622 0.7958 vn -0.2868 0.2704 0.9190 vn -0.2290 0.2555 0.9393 vn -0.0975 0.1572 0.9827 vn -0.1300 -0.1049 0.9859 vn -0.3167 -0.1383 0.9384 vn -0.5147 -0.0402 0.8564 vn -0.6467 0.0790 0.7586 vn -0.5488 -0.4732 0.6891 vn -0.5653 -0.4839 0.6680 vn -0.4772 -0.4152 0.7745 vn -0.3369 -0.4497 0.8272 vn -0.2117 -0.5799 0.7867 vn -0.2480 -0.7125 0.6564 vn -0.6063 -0.5706 0.5540 vn -0.8825 -0.0290 0.4694 vn -0.7865 0.4085 0.4632 vn -0.5084 0.5485 0.6638 vn -0.3389 0.4168 0.8435 vn -0.2775 0.1254 0.9525 vn -0.4564 0.1374 0.8791 vn -0.0450 0.1285 0.9907 vn -0.2040 0.3841 0.9005 vn -0.5524 0.3957 0.7337 vn -0.6576 -0.2153 0.7220 vn -0.2760 -0.5773 0.7685 vn -0.0622 -0.6385 0.7671 vn -0.0686 -0.4802 0.8745 vn -0.2586 -0.4654 0.8465 vn -0.3774 -0.4503 0.8092 vn -0.5139 -0.5065 0.6924 vn -0.4224 -0.5896 0.6885 vn -0.6527 0.0999 0.7510 vn -0.5491 0.1739 0.8174 vn -0.5956 0.2219 0.7720 vn -0.4719 -0.6799 0.5613 vn -0.4898 -0.5197 0.7000 vn -0.3333 -0.4484 0.8293 vn -0.2331 -0.4421 0.8661 vn -0.0503 -0.4123 0.9096 vn 0.1536 -0.3520 0.9233 vn 0.0195 -0.3819 0.9240 vn -0.2344 -0.4676 0.8523 vn -0.2851 0.5128 0.8098 vn 0.0794 0.5107 0.8561 vn 0.0581 0.2758 0.9594 vn 0.2363 0.1915 0.9526 vn 0.4753 0.2546 0.8422 vn 0.7151 0.2709 0.6444 vn 0.9087 0.1738 0.3796 vn 0.9643 0.0086 0.2647 vn 0.9590 0.0240 0.2822 vn 0.9645 0.0638 0.2565 vn 0.9790 -0.0198 0.2027 vn 0.9821 -0.0835 0.1687 vn 0.9677 -0.1931 0.1623 vn 0.8963 -0.3510 0.2709 vn 0.7862 -0.4264 0.4473 vn 0.7216 -0.4287 0.5436 vn 0.7413 -0.3311 0.5838 vn 0.7614 -0.2592 0.5943 vn 0.5886 -0.3297 0.7381 vn 0.8792 0.2013 0.4319 vn 0.5957 -0.5648 0.5711 vn 0.8611 -0.0306 0.5075 vn 0.2118 -0.3203 0.9233 vn 0.3723 -0.1754 0.9114 vn 0.5474 -0.0003 0.8369 vn 0.7738 -0.0185 0.6332 vn 0.8584 -0.2003 0.4723 vn 0.8034 -0.2336 0.5477 vn 0.8104 0.1478 0.5670 vn 0.1963 -0.5732 0.7955 vn 0.2455 -0.7046 0.6658 vn 0.3133 -0.4442 0.8394 vn 0.4484 -0.4119 0.7933 vn 0.5208 -0.4754 0.7091 vn 0.6405 0.1419 0.7547 vn 0.5986 0.3210 0.7339 vn 0.4627 0.3406 0.8185 vn 0.2585 0.2560 0.9315 vn 0.1993 0.2407 0.9499 vn 0.3052 0.4048 0.8619 vn 0.4758 0.5371 0.6965 vn 0.7622 0.3936 0.5139 vn 0.8071 0.4408 0.3928 vn 0.6382 0.5344 0.5542 vn 0.4546 0.4968 0.7392 vn 0.2794 0.4480 0.8492 vn 0.6294 -0.2057 0.7493 vn 0.5150 0.3808 0.7680 vn 0.1601 0.3594 0.9193 vn 0.1004 -0.1134 0.9885 vn 0.2893 -0.1476 0.9458 vn 0.4858 -0.0519 0.8725 vn 0.6290 0.0802 0.7733 vn 0.6297 0.0931 0.7713 vn 0.3881 -0.5902 0.7078 vn 0.4913 -0.5079 0.7075 vn 0.3569 -0.4416 0.8232 vn 0.2420 -0.4486 0.8603 vn 0.0464 -0.4607 0.8864 vn 0.0546 -0.6233 0.7801 vn 0.2544 -0.5714 0.7803 vn 0.2125 -0.4659 0.8589 vn 0.2478 0.5151 0.8205 vn 0.0064 0.1076 0.9942 vn -0.1243 0.5003 0.8569 vn -0.0834 0.2680 0.9598 vn 0.0599 0.1541 0.9862 vn 0.2573 0.1181 0.9591 vn 0.4288 0.1407 0.8924 vn 0.5239 0.1799 0.8326 vn 0.5676 0.2257 0.7917 vn 0.4596 -0.6779 0.5738 vn 0.4756 -0.5185 0.7106 vn 0.3152 -0.4459 0.8378 vn 0.2175 -0.4382 0.8722 vn 0.0250 -0.4084 0.9124 vn -0.1647 -0.3581 0.9191 vn -0.0337 -0.3830 0.9231 vn 0.7979 0.3795 0.4683 vn 0.8060 0.3592 0.4705 vn 0.7225 0.3202 0.6128 vn 0.4787 0.2742 0.8340 vn 0.2832 0.2287 0.9314 vn -0.8137 0.3822 0.4379 vn -0.8232 0.3651 0.4347 vn -0.7424 0.3336 0.5810 vn -0.5032 0.2868 0.8152 vn -0.3108 0.2384 0.9201 vn -0.8628 -0.0411 0.5038 vn -0.8728 -0.2594 0.4135 vn -0.7521 -0.3516 0.5575 vn -0.6837 -0.1264 0.7187 vn -0.4215 0.1605 0.8925 vn -0.4533 -0.4399 0.7752 vn -0.3691 -0.3215 0.8720 vn -0.2165 -0.1682 0.9617 vn -0.2388 -0.0805 0.9677 vn -0.7395 0.1524 0.6557 vn -0.8064 0.4086 0.4276 vn -0.8332 0.3819 0.4000 vn -0.7762 0.3885 0.4966 vn 0.7580 0.3877 0.5245 vn 0.8209 0.3790 0.4273 vn 0.7957 0.4001 0.4546 vn 0.7195 0.1343 0.6813 vn 0.2120 -0.0869 0.9734 vn 0.3518 0.2421 0.9042 vn 0.7895 0.0569 0.6112 vn 0.7434 0.1351 0.6551 vn 0.8453 -0.0505 0.5319 vn 0.8557 -0.2693 0.4420 vn 0.7267 -0.3588 0.5858 vn 0.6521 -0.1423 0.7447 vn 0.3916 0.1465 0.9084 vn 0.1947 -0.1725 0.9656 vn 0.3465 -0.3258 0.8796 vn 0.4259 -0.4387 0.7913 vn 0.4993 -0.3336 0.7996 vn 0.6488 -0.2216 0.7280 vn 0.6545 -0.1447 0.7421 vn 0.4749 -0.0731 0.8770 vn 0.4211 0.0265 0.9066 vn 0.6181 -0.1828 0.7645 vn 0.2932 -0.5246 0.7993 vn 0.3951 -0.2292 0.8896 vn 0.5854 -0.1167 0.8023 vn 0.5851 -0.1399 0.7988 vn 0.4202 -0.1610 0.8930 vn 0.4992 -0.4452 0.7434 vn 0.6624 -0.2967 0.6879 vn 0.7053 -0.1130 0.6998 vn 0.3068 0.0675 0.9494 vn 0.2298 -0.7798 0.5823 vn 0.5871 -0.4868 0.6469 vn 0.4935 -0.2832 0.8224 vn 0.5170 0.0037 0.8560 vn 0.3726 -0.4019 0.8364 vn 0.5059 -0.6246 0.5949 vn 0.4777 -0.7688 0.4250 vn 0.3670 -0.8512 0.3752 vn 0.5569 0.1365 0.8193 vn 0.7136 0.0843 0.6954 vn 0.5878 -0.1255 0.7992 vn 0.4601 -0.1192 0.8798 vn -0.4488 -0.1728 0.8768 vn -0.6128 -0.1477 0.7763 vn -0.6169 -0.1258 0.7769 vn -0.4294 -0.2348 0.8720 vn -0.3123 -0.5267 0.7906 vn -0.5179 -0.2719 0.8111 vn -0.5405 0.0176 0.8412 vn -0.4487 0.0371 0.8929 vn -0.6420 -0.1600 0.7499 vn -0.6105 -0.4733 0.6351 vn -0.2354 -0.7843 0.5740 vn -0.3440 0.0592 0.9371 vn -0.7349 -0.1318 0.6653 vn -0.6877 -0.3110 0.6560 vn -0.5216 -0.4525 0.7233 vn -0.4030 -0.3938 0.8261 vn -0.5266 -0.6219 0.5795 vn -0.4996 -0.7600 0.4158 vn -0.3883 -0.8450 0.3676 vn -0.5752 0.1442 0.8052 vn -0.7357 0.0811 0.6725 vn -0.6082 -0.1295 0.7832 vn -0.4838 -0.1226 0.8665 vn -0.2372 0.4384 0.8669 vn 0.1167 -0.6891 0.7152 vn 0.3229 -0.7033 0.6333 vn 0.0936 -0.9953 -0.0239 vn 0.0704 -0.9945 0.0775 vn -0.1365 -0.6947 0.7062 vn -0.0785 -0.9947 0.0666 vn -0.0939 -0.9949 -0.0368 vn -0.3481 -0.7098 0.6124 vn -0.3329 -0.8976 0.2891 vn 0.0664 -0.9811 -0.1815 vn -0.4464 -0.7932 0.4142 vn -0.4080 -0.8533 0.3246 vn 0.1318 -0.9886 0.0734 vn 0.2353 -0.9207 -0.3114 vn -0.2768 0.4431 0.8527 vn 0.2193 0.7035 0.6760 vn 0.0902 0.8994 0.4277 vn -0.1194 0.7225 0.6810 vn -0.2025 0.5426 0.8152 vn -0.2524 0.4950 0.8314 vn -0.3030 0.6495 0.6974 vn 0.2180 0.4352 0.8736 vn 0.2457 0.4838 0.8400 vn 0.1883 0.5330 0.8249 vn 0.1049 0.7308 0.6745 vn -0.1011 0.9022 0.4192 vn 0.2961 0.6437 0.7057 vn -0.2231 0.7070 0.6711 vn 0.2605 0.4387 0.8600 vn 0.3329 -0.8909 0.3088 vn -0.1487 -0.9867 0.0654 vn -0.2463 -0.9137 -0.3233 vn -0.0701 -0.9810 -0.1809 vn 0.4332 -0.7917 0.4307 vn 0.4005 -0.8504 0.3412 vn -0.6831 0.5452 0.4860 vn -0.6703 0.2731 0.6901 vn -0.6394 -0.2469 0.7281 vn -0.4956 -0.7139 0.4948 vn -0.3062 -0.9450 0.1150 vn -0.4558 -0.7358 0.5009 vn -0.4922 -0.0087 0.8704 vn -0.5600 0.1232 0.8193 vn -0.4962 -0.7198 0.4855 vn -0.7748 0.5430 0.3239 vn -0.7571 0.5904 0.2797 vn -0.8906 0.4515 0.0542 vn -0.9254 -0.3783 0.0227 vn -0.5223 -0.7818 0.3407 vn -0.9674 -0.0220 0.2524 vn -0.8327 0.2228 0.5069 vn -0.7818 0.2284 0.5802 vn -0.7043 -0.6091 0.3647 vn -0.7700 -0.3222 0.5507 vn -0.7353 -0.2042 0.6462 vn -0.6442 -0.5555 0.5257 vn -0.4021 -0.0337 0.9150 vn -0.0798 -0.8075 0.5844 vn -0.1470 -0.9403 0.3069 vn -0.2999 -0.9221 0.2445 vn -0.4402 -0.8666 0.2351 vn -0.6030 -0.7782 0.1758 vn -0.6342 -0.7704 0.0662 vn 0.6630 0.5433 0.5149 vn 0.6453 0.2654 0.7164 vn 0.6146 -0.2527 0.7473 vn 0.4815 -0.7137 0.5087 vn 0.3027 -0.9450 0.1239 vn 0.4372 -0.7396 0.5117 vn 0.4648 -0.0163 0.8853 vn 0.5321 0.1129 0.8391 vn 0.9194 -0.3909 0.0439 vn 0.8952 0.4395 0.0741 vn 0.7659 0.5390 0.3505 vn 0.7542 0.5836 0.3011 vn 0.7636 0.2149 0.6089 vn 0.8210 0.2045 0.5330 vn 0.9589 -0.0391 0.2810 vn 0.4722 -0.7278 0.4974 vn 0.5036 -0.7861 0.3584 vn 0.6778 -0.6227 0.3909 vn 0.7505 -0.3348 0.5697 vn 0.7110 -0.2067 0.6721 vn 0.5938 -0.7810 0.1932 vn 0.6342 -0.7692 0.0779 vn 0.6263 -0.5602 0.5421 vn 0.3685 -0.0223 0.9294 vn 0.0480 -0.7986 0.6000 vn 0.1241 -0.9399 0.3179 vn 0.2798 -0.9272 0.2490 vn 0.4239 -0.8721 0.2446 vn 0.5364 -0.4849 0.6908 vn -0.7302 -0.4589 0.5062 vn -0.5746 -0.4394 0.6904 vn -0.4590 -0.3504 0.8164 vn -0.2759 -0.2692 0.9227 vn -0.0727 -0.2298 0.9705 vn 0.1782 -0.1917 0.9651 vn 0.3111 -0.2337 0.9212 vn 0.1622 -0.3986 0.9027 vn -0.1807 -0.4112 0.8935 vn -0.3287 -0.2241 0.9175 vn -0.1940 -0.1855 0.9633 vn 0.0374 -0.2249 0.9737 vn 0.2605 -0.2674 0.9277 vn 0.4395 -0.3497 0.8274 vn 0.5655 -0.4365 0.6998 vn 0.7197 -0.4582 0.5216 usemtl None s off f 172/1/1 176/2/1 153/3/1 149/4/1 f 200/5/2 176/2/2 172/1/2 209/6/2 f 200/5/3 209/6/3 202/7/3 201/8/3 f 201/8/4 202/7/4 84/9/4 19/10/4 f 19/10/5 84/9/5 85/11/5 18/12/5 f 18/12/6 85/11/6 86/13/6 17/14/6 f 17/14/7 86/13/7 87/15/7 16/16/7 f 15/17/8 16/16/8 87/15/8 88/18/8 f 73/19/9 38/20/9 1/21/9 12/22/9 f 165/23/10 1/21/10 38/20/10 168/24/10 f 165/23/11 168/24/11 98/25/11 3/26/11 f 3/26/12 98/25/12 142/27/12 95/28/12 f 126/29/13 20/30/13 95/28/13 142/27/13 f 45/31/14 2/32/14 20/30/14 126/29/14 f 46/33/15 5/34/15 2/32/15 45/31/15 f 6/35/16 5/34/16 46/33/16 52/36/16 f 6/35/17 52/36/17 4/37/17 196/38/17 f 198/39/18 196/38/18 4/37/18 197/40/18 f 123/41/19 7/42/19 198/39/19 197/40/19 f 194/43/20 169/44/20 7/42/20 123/41/20 f 194/43/21 56/45/21 9/46/21 169/44/21 f 108/47/22 10/48/22 9/46/22 56/45/22 f 109/49/23 152/50/23 10/48/23 108/47/23 f 110/51/24 11/52/24 152/50/24 109/49/24 f 11/52/25 339/53/25 338/54/25 152/50/25 f 338/54/26 337/55/26 10/48/26 152/50/26 f 337/55/27 286/56/27 9/46/27 10/48/27 f 418/57/28 169/44/28 9/46/28 286/56/28 f 418/57/29 352/58/29 7/42/29 169/44/29 f 352/58/30 420/59/30 198/39/30 7/42/30 f 249/60/31 196/38/31 198/39/31 420/59/31 f 249/60/32 282/61/32 6/35/32 196/38/32 f 276/62/33 5/34/33 6/35/33 282/61/33 f 276/62/34 275/63/34 2/32/34 5/34/34 f 275/63/35 355/64/35 20/30/35 2/32/35 f 371/65/36 95/28/36 20/30/36 355/64/36 f 327/66/37 3/26/37 95/28/37 371/65/37 f 394/67/38 165/23/38 3/26/38 327/66/38 f 268/68/39 1/21/39 165/23/39 394/67/39 f 303/69/40 12/22/40 1/21/40 268/68/40 f 317/70/41 16/16/41 15/17/41 318/71/41 f 317/70/42 316/72/42 17/14/42 16/16/42 f 316/72/43 315/73/43 18/12/43 17/14/43 f 314/74/44 19/10/44 18/12/44 315/73/44 f 422/75/45 201/8/45 19/10/45 314/74/45 f 429/76/46 200/5/46 201/8/46 422/75/46 f 397/77/47 176/2/47 200/5/47 429/76/47 f 378/78/48 153/3/48 176/2/48 397/77/48 f 68/79/49 110/51/49 109/49/49 70/80/49 f 104/81/50 68/79/50 70/80/50 105/82/50 f 55/83/51 104/81/51 105/82/51 69/84/51 f 22/85/52 55/83/52 69/84/52 72/86/52 f 163/87/53 22/85/53 72/86/53 140/88/53 f 128/89/54 163/87/54 140/88/54 35/90/54 f 228/91/55 235/92/55 128/89/55 35/90/55 f 235/92/56 228/91/56 138/93/56 94/94/56 f 94/94/57 138/93/57 178/95/57 133/96/57 f 59/97/58 133/96/58 178/95/58 216/98/58 f 173/99/59 59/97/59 216/98/59 139/100/59 f 137/101/60 173/99/60 139/100/60 136/102/60 f 137/101/61 136/102/61 170/103/61 151/104/61 f 151/104/62 170/103/62 171/105/62 150/106/62 f 150/106/63 171/105/63 141/107/63 177/108/63 f 149/4/64 177/108/64 141/107/64 172/1/64 f 339/53/65 298/109/65 300/110/65 338/54/65 f 298/109/66 333/111/66 334/112/66 300/110/66 f 333/111/67 285/113/67 299/114/67 334/112/67 f 300/110/68 297/115/68 337/55/68 338/54/68 f 297/115/69 296/116/69 286/56/69 337/55/69 f 297/115/70 335/117/70 283/118/70 296/116/70 f 334/112/71 335/117/71 297/115/71 300/110/71 f 285/113/72 252/119/72 302/120/72 299/114/72 f 252/119/73 390/121/73 369/122/73 302/120/73 f 390/121/74 357/123/74 265/124/74 369/122/74 f 455/125/75 448/126/75 265/124/75 357/123/75 f 455/125/76 324/127/76 367/128/76 448/126/76 f 367/128/77 324/127/77 362/129/77 402/130/77 f 362/129/78 289/131/78 436/132/78 402/130/78 f 289/131/79 398/133/79 368/134/79 436/132/79 f 398/133/80 366/135/80 365/136/80 368/134/80 f 365/136/81 366/135/81 380/137/81 395/138/81 f 395/138/82 380/137/82 379/139/82 396/140/82 f 396/140/83 379/139/83 401/141/83 370/142/83 f 378/78/84 397/77/84 370/142/84 401/141/84 f 263/143/85 370/142/85 397/77/85 429/76/85 f 263/143/86 432/144/86 396/140/86 370/142/86 f 432/144/87 431/145/87 395/138/87 396/140/87 f 431/145/88 435/146/88 365/136/88 395/138/88 f 435/146/89 417/147/89 368/134/89 365/136/89 f 417/147/90 434/148/90 436/132/90 368/134/90 f 434/148/91 377/149/91 402/130/91 436/132/91 f 377/149/92 353/150/92 367/128/92 402/130/92 f 346/151/93 448/126/93 367/128/93 353/150/93 f 346/151/94 373/152/94 265/124/94 448/126/94 f 384/153/95 369/122/95 265/124/95 373/152/95 f 301/154/96 302/120/96 369/122/96 384/153/96 f 294/155/97 299/114/97 302/120/97 301/154/97 f 299/114/98 294/155/98 335/117/98 334/112/98 f 284/156/99 283/118/99 335/117/99 294/155/99 f 277/157/100 284/156/100 294/155/100 301/154/100 f 354/158/101 277/157/101 301/154/101 384/153/101 f 266/159/102 354/158/102 384/153/102 373/152/102 f 341/160/103 266/159/103 373/152/103 346/151/103 f 419/161/104 263/143/104 429/76/104 422/75/104 f 419/161/105 425/162/105 432/144/105 263/143/105 f 425/162/106 423/163/106 431/145/106 432/144/106 f 423/163/107 433/164/107 435/146/107 431/145/107 f 347/165/108 341/160/108 346/151/108 353/150/108 f 353/150/109 281/166/109 348/167/109 347/165/109 f 348/167/110 281/166/110 331/168/110 349/169/110 f 331/168/111 330/170/111 350/171/111 349/169/111 f 330/170/112 278/172/112 351/173/112 350/171/112 f 278/172/113 344/174/113 358/175/113 351/173/113 f 413/176/114 466/177/114 358/175/114 344/174/114 f 418/57/115 466/177/115 413/176/115 352/58/115 f 266/159/116 341/160/116 262/178/116 447/179/116 f 262/178/117 341/160/117 347/165/117 449/180/117 f 450/181/118 449/180/118 347/165/118 348/167/118 f 450/181/119 348/167/119 349/169/119 451/182/119 f 452/183/120 451/182/120 349/169/120 350/171/120 f 254/184/121 253/185/121 381/186/121 375/187/121 f 452/183/122 253/185/122 254/184/122 451/182/122 f 255/188/123 450/181/123 451/182/123 254/184/123 f 340/189/124 449/180/124 450/181/124 255/188/124 f 256/190/125 262/178/125 449/180/125 340/189/125 f 343/191/126 354/158/126 266/159/126 447/179/126 f 446/192/127 277/157/127 354/158/127 343/191/127 f 445/193/128 284/156/128 277/157/128 446/192/128 f 444/194/129 283/118/129 284/156/129 445/193/129 f 443/195/130 296/116/130 283/118/130 444/194/130 f 442/196/131 286/56/131 296/116/131 443/195/131 f 442/196/132 414/197/132 418/57/132 286/56/132 f 465/198/133 466/177/133 418/57/133 414/197/133 f 454/199/134 358/175/134 466/177/134 465/198/134 f 454/199/135 453/200/135 351/173/135 358/175/135 f 351/173/136 453/200/136 452/183/136 350/171/136 f 255/188/137 254/184/137 375/187/137 374/201/137 f 374/201/138 391/202/138 340/189/138 255/188/138 f 257/203/139 253/185/139 452/183/139 453/200/139 f 342/204/140 257/203/140 453/200/140 454/199/140 f 464/205/141 342/204/141 454/199/141 465/198/141 f 415/206/142 464/205/142 465/198/142 414/197/142 f 287/207/143 415/206/143 414/197/143 442/196/143 f 259/208/144 287/207/144 442/196/144 443/195/144 f 258/209/145 259/208/145 443/195/145 444/194/145 f 260/210/146 258/209/146 444/194/146 445/193/146 f 261/211/147 260/210/147 445/193/147 446/192/147 f 468/212/148 261/211/148 446/192/148 343/191/148 f 360/213/149 468/212/149 343/191/149 447/179/149 f 447/179/150 262/178/150 256/190/150 360/213/150 f 391/202/151 250/214/151 256/190/151 340/189/151 f 264/215/152 360/213/152 256/190/152 250/214/152 f 467/216/153 468/212/153 360/213/153 264/215/153 f 261/211/154 468/212/154 467/216/154 389/217/154 f 388/218/155 260/210/155 261/211/155 389/217/155 f 387/219/156 258/209/156 260/210/156 388/218/156 f 386/220/157 259/208/157 258/209/157 387/219/157 f 385/221/158 287/207/158 259/208/158 386/220/158 f 399/222/159 415/206/159 287/207/159 385/221/159 f 363/223/160 464/205/160 415/206/160 399/222/160 f 383/224/161 342/204/161 464/205/161 363/223/161 f 382/225/162 257/203/162 342/204/162 383/224/162 f 253/185/163 257/203/163 382/225/163 381/186/163 f 67/226/164 70/80/164 109/49/164 108/47/164 f 67/226/165 106/227/165 105/82/165 70/80/165 f 106/227/166 64/228/166 69/84/166 105/82/166 f 64/228/167 71/229/167 72/86/167 69/84/167 f 71/229/168 157/230/168 140/88/168 72/86/168 f 157/230/169 144/231/169 35/90/169 140/88/169 f 117/232/170 228/91/170 35/90/170 144/231/170 f 124/233/171 138/93/171 228/91/171 117/232/171 f 148/234/172 178/95/172 138/93/172 124/233/172 f 214/235/173 216/98/173 178/95/173 148/234/173 f 193/236/174 139/100/174 216/98/174 214/235/174 f 215/237/175 136/102/175 139/100/175 193/236/175 f 211/238/176 170/103/176 136/102/176 215/237/176 f 212/239/177 171/105/177 170/103/177 211/238/177 f 33/240/178 141/107/178 171/105/178 212/239/178 f 172/1/179 141/107/179 33/240/179 209/6/179 f 194/43/180 123/41/180 189/241/180 246/242/180 f 56/45/181 194/43/181 190/243/181 222/244/181 f 245/245/182 190/243/182 194/43/182 246/242/182 f 66/246/183 67/226/183 108/47/183 56/45/183 f 66/246/184 53/247/184 106/227/184 67/226/184 f 53/247/185 54/248/185 64/228/185 106/227/185 f 54/248/186 47/249/186 71/229/186 64/228/186 f 47/249/187 125/250/187 157/230/187 71/229/187 f 125/250/188 36/251/188 144/231/188 157/230/188 f 36/251/189 112/252/189 117/232/189 144/231/189 f 53/247/190 66/246/190 223/253/190 224/254/190 f 56/45/191 222/244/191 223/253/191 66/246/191 f 224/254/192 225/255/192 54/248/192 53/247/192 f 225/255/193 226/256/193 47/249/193 54/248/193 f 114/257/194 227/258/194 36/251/194 125/250/194 f 227/258/195 32/259/195 112/252/195 36/251/195 f 118/260/196 112/252/196 32/259/196 229/261/196 f 119/262/197 118/260/197 229/261/197 230/263/197 f 120/264/198 119/262/198 230/263/198 231/265/198 f 121/266/199 120/264/199 231/265/199 232/267/199 f 122/268/200 121/266/200 232/267/200 233/269/200 f 129/270/201 122/268/201 233/269/201 234/271/201 f 246/242/202 129/270/202 234/271/202 245/245/202 f 115/272/203 129/270/203 246/242/203 189/241/203 f 48/273/204 122/268/204 129/270/204 115/272/204 f 101/274/205 121/266/205 122/268/205 48/273/205 f 102/275/206 120/264/206 121/266/206 101/274/206 f 190/243/207 245/245/207 244/276/207 191/277/207 f 113/278/208 244/276/208 245/245/208 234/271/208 f 113/278/209 234/271/209 233/269/209 27/279/209 f 23/280/210 232/267/210 231/265/210 24/281/210 f 24/281/211 231/265/211 230/263/211 25/282/211 f 25/282/212 230/263/212 229/261/212 111/283/212 f 111/283/213 229/261/213 32/259/213 26/284/213 f 131/285/214 26/284/214 32/259/214 227/258/214 f 248/286/215 131/285/215 227/258/215 114/257/215 f 248/286/216 114/257/216 226/256/216 31/287/216 f 30/288/217 31/287/217 226/256/217 225/255/217 f 28/289/218 30/288/218 225/255/218 224/254/218 f 29/290/219 28/289/219 224/254/219 223/253/219 f 29/290/220 223/253/220 222/244/220 57/291/220 f 222/244/221 190/243/221 191/277/221 57/291/221 f 191/277/222 244/276/222 134/292/222 174/293/222 f 134/292/223 244/276/223 113/278/223 156/294/223 f 232/267/224 23/280/224 27/279/224 233/269/224 f 156/294/225 113/278/225 27/279/225 155/295/225 f 154/296/226 155/295/226 27/279/226 23/280/226 f 154/296/227 23/280/227 24/281/227 146/297/227 f 146/297/228 24/281/228 25/282/228 145/298/228 f 145/298/229 25/282/229 111/283/229 164/299/229 f 164/299/230 111/283/230 26/284/230 8/300/230 f 8/300/231 26/284/231 131/285/231 34/301/231 f 34/301/232 131/285/232 248/286/232 247/302/232 f 247/302/233 248/286/233 31/287/233 162/303/233 f 162/303/234 31/287/234 30/288/234 161/304/234 f 161/304/235 30/288/235 28/289/235 160/305/235 f 160/305/236 28/289/236 29/290/236 159/306/236 f 159/306/237 29/290/237 57/291/237 158/307/237 f 57/291/238 191/277/238 174/293/238 158/307/238 f 175/308/239 189/241/239 123/41/239 197/40/239 f 175/308/240 218/309/240 115/272/240 189/241/240 f 218/309/241 127/310/241 48/273/241 115/272/241 f 127/310/242 143/311/242 101/274/242 48/273/242 f 143/311/243 37/312/243 102/275/243 101/274/243 f 413/176/244 400/313/244 420/59/244 352/58/244 f 400/313/245 413/176/245 344/174/245 438/314/245 f 356/315/246 438/314/246 344/174/246 278/172/246 f 372/316/247 356/315/247 278/172/247 330/170/247 f 267/317/248 372/316/248 330/170/248 331/168/248 f 412/318/249 281/166/249 353/150/249 377/149/249 f 434/148/250 417/147/250 412/318/250 377/149/250 f 428/319/251 412/318/251 417/147/251 435/146/251 f 426/320/252 281/166/252 412/318/252 428/319/252 f 281/166/253 426/320/253 267/317/253 331/168/253 f 428/319/254 435/146/254 433/164/254 437/321/254 f 437/321/255 427/322/255 426/320/255 428/319/255 f 427/322/256 424/323/256 267/317/256 426/320/256 f 359/324/257 372/316/257 267/317/257 424/323/257 f 430/325/258 356/315/258 372/316/258 359/324/258 f 421/326/259 438/314/259 356/315/259 430/325/259 f 457/327/260 400/313/260 438/314/260 421/326/260 f 420/59/261 400/313/261 457/327/261 249/60/261 f 175/308/262 197/40/262 4/37/262 237/328/262 f 237/328/263 199/329/263 218/309/263 175/308/263 f 199/329/264 210/330/264 127/310/264 218/309/264 f 210/330/265 130/331/265 143/311/265 127/310/265 f 130/331/266 204/332/266 37/312/266 143/311/266 f 51/333/267 119/262/267 120/264/267 102/275/267 f 117/232/268 112/252/268 118/260/268 124/233/268 f 118/260/269 119/262/269 51/333/269 124/233/269 f 51/333/270 188/334/270 148/234/270 124/233/270 f 148/234/271 188/334/271 193/236/271 214/235/271 f 188/334/272 208/335/272 215/237/272 193/236/272 f 206/336/273 208/335/273 188/334/273 51/333/273 f 102/275/274 37/312/274 206/336/274 51/333/274 f 206/336/275 37/312/275 204/332/275 207/337/275 f 217/338/276 208/335/276 206/336/276 207/337/276 f 213/339/277 215/237/277 208/335/277 217/338/277 f 213/339/278 203/340/278 211/238/278 215/237/278 f 203/340/279 205/341/279 212/239/279 211/238/279 f 205/341/280 195/342/280 33/240/280 212/239/280 f 209/6/281 33/240/281 195/342/281 202/7/281 f 166/343/282 168/24/282 38/20/282 40/344/282 f 166/343/283 40/344/283 41/345/283 93/346/283 f 213/339/284 217/338/284 187/347/284 58/348/284 f 58/348/285 44/349/285 203/340/285 213/339/285 f 44/349/286 107/350/286 205/341/286 203/340/286 f 107/350/287 183/351/287 195/342/287 205/341/287 f 202/7/288 195/342/288 183/351/288 84/9/288 f 182/352/289 85/11/289 84/9/289 183/351/289 f 92/353/290 182/352/290 183/351/290 107/350/290 f 147/354/291 92/353/291 107/350/291 44/349/291 f 62/355/292 147/354/292 44/349/292 58/348/292 f 186/356/293 62/355/293 58/348/293 187/347/293 f 93/346/294 41/345/294 186/356/294 187/347/294 f 217/338/295 207/337/295 93/346/295 187/347/295 f 204/332/296 166/343/296 93/346/296 207/337/296 f 40/344/297 38/20/297 73/19/297 74/357/297 f 75/358/298 41/345/298 40/344/298 74/357/298 f 185/359/299 186/356/299 41/345/299 75/358/299 f 77/360/300 62/355/300 186/356/300 185/359/300 f 78/361/301 147/354/301 62/355/301 77/360/301 f 91/362/302 92/353/302 147/354/302 78/361/302 f 181/363/303 182/352/303 92/353/303 91/362/303 f 85/11/304 182/352/304 181/363/304 86/13/304 f 407/364/305 419/161/305 422/75/305 314/74/305 f 407/364/306 336/365/306 425/162/306 419/161/306 f 336/365/307 274/366/307 423/163/307 425/162/307 f 274/366/308 288/367/308 433/164/308 423/163/308 f 288/367/309 411/368/309 437/321/309 433/164/309 f 411/368/310 323/369/310 427/322/310 437/321/310 f 323/369/311 392/370/311 424/323/311 427/322/311 f 394/67/312 392/370/312 270/371/312 268/68/312 f 271/372/313 270/371/313 392/370/313 323/369/313 f 410/373/314 271/372/314 323/369/314 411/368/314 f 292/374/315 410/373/315 411/368/315 288/367/315 f 376/375/316 292/374/316 288/367/316 274/366/316 f 322/376/317 376/375/317 274/366/317 336/365/317 f 406/377/318 322/376/318 336/365/318 407/364/318 f 314/74/319 315/73/319 406/377/319 407/364/319 f 270/371/320 304/378/320 303/69/320 268/68/320 f 304/378/321 270/371/321 271/372/321 305/379/321 f 305/379/322 271/372/322 410/373/322 409/380/322 f 409/380/323 410/373/323 292/374/323 307/381/323 f 307/381/324 292/374/324 376/375/324 308/382/324 f 308/382/325 376/375/325 322/376/325 321/383/325 f 321/383/326 322/376/326 406/377/326 405/384/326 f 315/73/327 316/72/327 405/384/327 406/377/327 f 404/385/328 405/384/328 316/72/328 317/70/328 f 39/386/329 73/19/329 12/22/329 13/387/329 f 39/386/330 42/388/330 74/357/330 73/19/330 f 42/388/331 39/386/331 83/389/331 82/390/331 f 14/391/332 83/389/332 39/386/332 13/387/332 f 12/22/333 303/69/333 269/392/333 13/387/333 f 13/387/334 269/392/334 313/393/334 14/391/334 f 269/392/335 272/394/335 312/395/335 313/393/335 f 303/69/336 304/378/336 272/394/336 269/392/336 f 409/380/337 307/381/337 293/396/337 408/397/337 f 312/395/338 272/394/338 273/398/338 311/399/338 f 305/379/339 273/398/339 272/394/339 304/378/339 f 305/379/340 409/380/340 408/397/340 273/398/340 f 416/400/341 408/397/341 293/396/341 309/401/341 f 311/399/342 273/398/342 408/397/342 416/400/342 f 293/396/343 307/381/343 308/382/343 326/402/343 f 326/402/344 325/403/344 309/401/344 293/396/344 f 326/402/345 320/404/345 319/405/345 325/403/345 f 404/385/346 403/406/346 319/405/346 320/404/346 f 317/70/347 318/71/347 403/406/347 404/385/347 f 321/383/348 405/384/348 404/385/348 320/404/348 f 308/382/349 321/383/349 320/404/349 326/402/349 f 181/363/350 180/407/350 87/15/350 86/13/350 f 90/408/351 180/407/351 181/363/351 91/362/351 f 179/409/352 88/18/352 87/15/352 180/407/352 f 179/409/353 180/407/353 90/408/353 89/410/353 f 90/408/354 97/411/354 96/412/354 89/410/354 f 78/361/355 97/411/355 90/408/355 91/362/355 f 96/412/356 97/411/356 63/413/356 79/414/356 f 78/361/357 77/360/357 63/413/357 97/411/357 f 184/415/358 63/413/358 77/360/358 185/359/358 f 184/415/359 192/416/359 79/414/359 63/413/359 f 184/415/360 43/417/360 81/418/360 192/416/360 f 42/388/361 82/390/361 81/418/361 43/417/361 f 75/358/362 74/357/362 42/388/362 43/417/362 f 185/359/363 75/358/363 43/417/363 184/415/363 f 457/327/364 364/419/364 282/61/364 249/60/364 f 364/419/365 441/420/365 276/62/365 282/61/365 f 441/420/366 458/421/366 275/63/366 276/62/366 f 458/421/367 462/422/367 355/64/367 275/63/367 f 462/422/368 463/423/368 371/65/368 355/64/368 f 463/423/369 329/424/369 327/66/369 371/65/369 f 328/425/370 392/370/370 394/67/370 327/66/370 f 424/323/371 392/370/371 328/425/371 359/324/371 f 328/425/372 327/66/372 329/424/372 461/426/372 f 361/427/373 364/419/373 457/327/373 421/326/373 f 280/428/374 361/427/374 421/326/374 430/325/374 f 332/429/375 280/428/375 430/325/375 359/324/375 f 295/430/376 332/429/376 359/324/376 328/425/376 f 295/430/377 328/425/377 461/426/377 456/431/377 f 279/432/378 280/428/378 332/429/378 295/430/378 f 345/433/379 361/427/379 280/428/379 279/432/379 f 364/419/380 361/427/380 345/433/380 441/420/380 f 279/432/381 295/430/381 456/431/381 440/434/381 f 440/434/382 439/435/382 345/433/382 279/432/382 f 441/420/383 345/433/383 439/435/383 458/421/383 f 291/436/384 329/424/384 463/423/384 251/437/384 f 291/436/385 306/438/385 461/426/385 329/424/385 f 306/438/386 290/439/386 456/431/386 461/426/386 f 290/439/387 393/440/387 440/434/387 456/431/387 f 393/440/388 310/441/388 439/435/388 440/434/388 f 310/441/389 460/442/389 458/421/389 439/435/389 f 460/442/390 459/443/390 462/422/390 458/421/390 f 462/422/391 459/443/391 251/437/391 463/423/391 f 135/444/392 237/328/392 4/37/392 52/36/392 f 135/444/393 52/36/393 46/33/393 221/445/393 f 238/446/394 221/445/394 46/33/394 45/31/394 f 242/447/395 238/446/395 45/31/395 126/29/395 f 242/447/396 126/29/396 142/27/396 243/448/396 f 243/448/397 142/27/397 98/25/397 100/449/397 f 99/450/398 98/25/398 168/24/398 166/343/398 f 204/332/399 130/331/399 99/450/399 166/343/399 f 99/450/400 130/331/400 103/451/400 65/452/400 f 50/453/401 103/451/401 130/331/401 210/330/401 f 135/444/402 132/454/402 199/329/402 237/328/402 f 199/329/403 132/454/403 50/453/403 210/330/403 f 132/454/404 135/444/404 221/445/404 116/455/404 f 116/455/405 49/456/405 50/453/405 132/454/405 f 103/451/406 50/453/406 49/456/406 65/452/406 f 99/450/407 241/457/407 100/449/407 98/25/407 f 241/457/408 99/450/408 65/452/408 236/458/408 f 220/459/409 236/458/409 65/452/409 49/456/409 f 219/460/410 220/459/410 49/456/410 116/455/410 f 221/445/411 238/446/411 219/460/411 116/455/411 f 238/446/412 242/447/412 239/461/412 240/462/412 f 239/461/413 242/447/413 243/448/413 21/463/413 f 21/463/414 243/448/414 100/449/414 61/464/414 f 61/464/415 100/449/415 241/457/415 76/465/415 f 76/465/416 241/457/416 236/458/416 60/466/416 f 60/466/417 236/458/417 220/459/417 167/467/417 f 167/467/418 220/459/418 219/460/418 80/468/418 f 219/460/419 238/446/419 240/462/419 80/468/419 f 125/250/420 47/249/420 226/256/420 114/257/420 f 264/215/421 250/214/421 467/216/421 f 391/202/422 389/217/422 467/216/422 250/214/422 f 391/202/423 374/201/423 388/218/423 389/217/423 f 374/201/424 375/187/424 387/219/424 388/218/424 f 375/187/425 381/186/425 386/220/425 387/219/425 f 385/221/426 386/220/426 381/186/426 382/225/426 f 399/222/427 385/221/427 382/225/427 383/224/427 f 363/223/428 399/222/428 383/224/428 f 134/292/429 156/294/429 174/293/429 f 155/295/430 158/307/430 174/293/430 156/294/430 f 154/296/431 159/306/431 158/307/431 155/295/431 f 146/297/432 160/305/432 159/306/432 154/296/432 f 145/298/433 161/304/433 160/305/433 146/297/433 f 164/299/434 162/303/434 161/304/434 145/298/434 f 8/300/435 247/302/435 162/303/435 164/299/435 f 34/301/436 247/302/436 8/300/436 ================================================ FILE: style/main.scss ================================================ @use "@material/theme" with ( $primary: blue, $secondary: #000000, $background: #fff, ); @use "@material/icon-button"; @use "@material/slider"; @include slider.core-styles; @include icon-button.core-styles; html, body { margin: 0; padding: 0; background: #f5f5f5; width: 100%; height: 100%; overflow: hidden; font-family: 'Poppins', 'Roboto', 'Helvetica', 'Arial', sans-serif; } body.loading::before { content: ' '; display: block; width: 100%; height: 100%; position: absolute; background: url(../assets/spinner.svg) no-repeat center center; } .ui .mdc-icon-button.material-icons-outlined { @include icon-button.icon-size(24px, 24px, 14px); } .container { position: relative; width: 100%; height: 100%; display: flex; justify-content: center; align-items: center; flex-direction: column; opacity: 1; transition: opacity 0.5s; overflow: hidden; } .loading .container { opacity: 0; } .info { display: none; position: absolute; width: 100%; height: 100%; align-items: flex-start; justify-content: center; z-index: 8; } .info.show { display: flex; } .info-content { background: #00000070; padding: 1em; width: 100%; height: 100%; padding-bottom: 3em; color: white; font-size: 28px; padding: 1em 1.5em; max-width: 800px; h1 { margin: 0; line-height: 72px; } a { color: white; } } .alt-bts { position: absolute; top: 0.5em; right: 0.5em; z-index: 9; display: flex; flex-direction: column; > * { margin: 0.5em; } } #bt-info { background: white; border-radius: 5em; box-shadow: 0 0px 1px rgba(0, 0, 0, 0.1), 0 2px 15px rgba(0, 0, 0, 0.05); } /** Canvas **/ .three-canvas { transform: scale(-1, 1); box-shadow: 0 2px 15px rgba(0, 0, 0, 0.15); border-radius: 2em; } .paused .three-canvas { opacity: 0.5; } /** UI **/ .ui { display: flex; align-items: center; justify-content: center; border-radius: 9em; padding: 0 .5em; box-shadow: 0 0px 1px rgba(0, 0, 0, 0.1), 0 2px 15px rgba(0, 0, 0, 0.05); background: white; margin-top: 1.25em; } /** Color picker **/ .picker .a-color-picker { border-radius: 15px; overflow: hidden; box-shadow: 0 2px 15px rgba(0, 0, 0, 0.15); } .color { position: relative; display: inline-block; } .picker { position: absolute; z-index: 3; bottom: 65px; left: -100px; display: none; } .close-color { position: absolute; width: 100%; height: 100%; left: 0; top: 0; z-index: 2; } #bt-picker { border-radius: 1em; } /** Slider **/ .slider { width: 150px; display: inline-block; margin: 0.5em 1em; } .mdc-slider__track-container { position: absolute; top: calc(1em + 5px); width: 100%; height: 10px; overflow: hidden; border-radius: 7em; } .mdc-slider__track-marker-container { display: none; } .mdc-slider--discrete.mdc-slider--active .mdc-slider__pin { transform: rotate(-45deg) scale(1) translate(30px, -30px); } .mdc-slider:not(.mdc-slider--disabled) .mdc-slider__track-container::after { opacity: 0.1; } /** CURSOR **/ $cursorSize : 12px; .cursor { display: none; position: absolute; z-index: 999; width: $cursorSize; height: $cursorSize; border-radius: 75px; background: white; pointer-events: none; opacity: 0.8; transform: translate(-50%, -50%); } .hover-face .container { cursor:none; } .hover-face .cursor { display: block; } /** LAPTOP **/ @media only screen and (max-height: 800px) and (min-width: 600px) { body { display: flex; align-items: center; justify-content: center; } .container { position: relative; width: 640px; height: 640px; border-radius: 2em; } .three-canvas { border-radius: 0; } .ui { position: absolute; bottom: 1em; } } /** MOBILE **/ @media only screen and (max-width: 600px) { .ui { position: absolute; bottom: 1em; } .picker { left: -20px; } }