{"version":3,"sources":["scene/scene.js","tools/index.js","tools/tools.js","lib/wireframedBox.js","scene/index.js","picker/picker.js","picker/index.js","app/app.js","app/index.js","index.js"],"names":["camera","scene","renderer","controls","skinTexture","canvas","drawingCanvas","drawingContext","container","color","Tools","this","props","penMode","isMirrored","onPenSwitch","onMirrorToggle","onUndo","onRedo","onZoomIn","onZoomOut","onDarken","onLighten","onSkinReset","className","onClick","src","alt","style","marginLeft","React","Component","WireframedBox","width","height","Color","vertices","colors","i","j","k","push","toArray","length","geometry","BufferGeometry","setAttribute","Float32BufferAttribute","material","LineBasicMaterial","vertexColors","toneMapped","lineWidth","type","LineSegments","layerCanvas","bodyGroup","THREE","overlayGroup","bodyWireframeGroup","model","showBody","showOverlay","onColorPick","onSaveHistory","Vector4","array","x","y","w","h","FaceMap","face1","face2","size","intersected","localX","localY","convertedMaps","map","item","steve","alex","raycaster","mouse","onClickPosition","onMouseDown","evt","preventDefault","button","getMousePosition","clientX","clientY","fromArray","intersects","getIntersects","children","intersect","find","object","visible","uv","index","face","materialIndex","transformUv","picked","filter","colorPick","rgba","fillPixels","rotation","offset","repeat","erasePixel","isOverlay","drawPixel","enabled","onMouseUp","onMouseMove","dom","rect","getBoundingClientRect","rendererXY","getSize","left","top","point","objects","set","setFromCamera","intersectObjects","CanvasTexture","parentTexture","_canvas","_context2D","_image","createImageData","_data","data","_parentTexture","image","createGrid","parameters","depth","group","gridTop","position","add","gridBottom","gridFront","Math","PI","gridBack","gridLeft","z","gridRight","grid","createLeg","dx","dy","overlay","legSides","clone","addParent","legMaterials","transparent","side","scale","createArm","slim","armSides","armMaterials","armWidth","createHead","headSides","headMaterials","createBody","bodySides","bodyMaterials","animate","domElement","clientWidth","clientHeight","setSize","aspect","updateProjectionMatrix","resizeCanvasToDisplaySize","requestAnimationFrame","update","render","updateSkinLayer","clearRect","drawImage","updateTextures","initSkinLayer","texture","forced","layer","document","createElement","layerContext","getContext","imageSmoothingEnabled","load","prototype","constructor","_xCross","_yCross","indexOf","round","_draw","_x","_y","context","fillStyle","mirrorMap","reflection","findReflection","beginPath","fill","_updateTextures","_w","_h","translate","getImageData","needsUpdate","random","floor","toneColor","TinyColor","darken","toHexString","lighten","Scene","hiddenParts","window","innerWidth","querySelector","antialias","setPixelRatio","devicePixelRatio","setClearColor","OrbitControls","target","mouseButtons","LEFT","ROTATE","MIDDLE","MOUSEWHEEL","DOLLY","RIGHT","minDistance","maxDistance","getElementById","appendChild","addEventListener","display","magFilter","paint","e","offsetX","offsetY","setupCanvasDrawing","rightLeg","name","leftLeg","rightLegO","leftLegO","rightArm","leftArm","rightArmO","leftArmO","rightArmSlim","leftArmSlim","rightArmSlimO","leftArmSlimO","head","headO","body","bodyO","forEach","modelName","initModel","padding","id","_model","includes","hidden","_showBody","_showOverlay","setModel","_color","getPixelXY","imgData","d","getPixel","Picker","state","hex","showModal","imported","triggerImport","inputImport","click","triggerExport","event","link","toDataURL","replace","onPartToggle","onColorChange","onModelChange","onImageImport","onToggleBody","onToggleOverlay","colorInputStyle","background","borderColor","isLight","onSkinChoose","skin","ctx","reader","FileReader","onload","Image","result","pix","pix1","pix2","pix3","pix10","pix11","pix12","pix13","setState","readAsDataURL","onChange","value","maxLength","accept","ref","input","files","loadImage","App","componentDidMount","localStorage","setItem","skinLoad","isValid","setColor","part","concat","toggleParts","setTexture","setTimeout","mode","lastPen","r","g","b","toString","slice","action","v4","history","JSON","parse","stringify","lastAction","historyId","findIndex","splice","shift","zoomIn","zoomOut","confirm","location","reload","dataset","getItem","ReactDOM"],"mappings":"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","file":"static/js/main.93d01cb3.chunk.js","sourcesContent":["import React from \"react\";\r\nimport * as THREE from \"three\";\r\nimport { OrbitControls } from \"three/examples/jsm/controls/OrbitControls\";\r\nimport { WireframedBox } from \"../lib/wireframedBox\";\r\nimport { TinyColor } from \"@ctrl/tinycolor\";\r\nimport \"./scene.css\";\r\n\r\nlet camera, scene, renderer, controls, skinTexture;\r\nlet canvas, drawingCanvas, drawingContext;\r\nlet container;\r\nlet color;\r\nlet layerCanvas = null;\r\nlet bodyGroup = new THREE.Group();\r\nlet overlayGroup = new THREE.Group();\r\nlet bodyWireframeGroup = [];\r\nlet model = \"steve\";\r\nlet penMode = \"pen\";\r\nlet showBody = true;\r\nlet showOverlay = true;\r\nlet isMirrored = false;\r\nlet onColorPick = () => { };\r\nlet onSaveHistory = () => { };\r\nvar i = 0;\r\n\r\nclass Vector4 {\r\n constructor(array) {\r\n this.x = array[0];\r\n this.y = array[1];\r\n this.w = array[2];\r\n this.h = array[3];\r\n }\r\n\r\n intersected(x, y) {\r\n return (\r\n x >= this.x && x < this.x + this.w && y >= this.y && y < this.y + this.h\r\n );\r\n }\r\n\r\n localX(x) {\r\n return x - this.x;\r\n }\r\n\r\n localY(y) {\r\n return y - this.y;\r\n }\r\n}\r\n\r\nclass FaceMap {\r\n constructor([face1, face2, size]) {\r\n this.face1 = new Vector4(face1);\r\n this.face2 = new Vector4(face2);\r\n this.size = size;\r\n }\r\n\r\n intersected(x, y) {\r\n return this.face1.intersected(x, y) || this.face2.intersected(x, y);\r\n }\r\n\r\n findReflection(x, y) {\r\n if (this.face1.intersected(x, y)) {\r\n return {\r\n x: this.face2.x + this.face2.w - this.face1.localX(x) - 1,\r\n y: this.face2.y + this.face1.localY(y),\r\n };\r\n } else if (this.face2.intersected(x, y)) {\r\n return {\r\n x: this.face1.x + this.face1.w - this.face2.localX(x) - 1,\r\n y: this.face1.y + this.face2.localY(y),\r\n };\r\n }\r\n }\r\n}\r\n\r\nconst maps = [\r\n // 4x arms\r\n [[40, 20, 4, 12], [40, 52, 4, 12], 4],\r\n [[44, 20, 4, 12], [36, 52, 4, 12], 4],\r\n [[48, 20, 4, 12], [32, 52, 4, 12], 4],\r\n [[52, 20, 4, 12], [44, 52, 4, 12], 4],\r\n [[44, 16, 4, 4], [36, 48, 4, 4], 4],\r\n [[48, 16, 4, 4], [40, 48, 4, 4], 4],\r\n\r\n // 4x overlays\r\n [[52, 52, 4, 12], [44, 36, 4, 12], 4],\r\n [[56, 52, 4, 12], [40, 36, 4, 12], 4],\r\n [[60, 52, 4, 12], [52, 36, 4, 12], 4],\r\n [[48, 52, 4, 12], [48, 36, 4, 12], 4],\r\n [[44, 32, 4, 4], [52, 48, 4, 4], 4],\r\n [[48, 32, 4, 4], [56, 48, 4, 4], 4],\r\n\r\n // 4x legs\r\n [\r\n [4, 36, 4, 12],\r\n [4, 52, 4, 12],\r\n ],\r\n [\r\n [8, 36, 4, 12],\r\n [0, 52, 4, 12],\r\n ],\r\n [\r\n [12, 36, 4, 12],\r\n [12, 52, 4, 12],\r\n ],\r\n [\r\n [0, 36, 4, 12],\r\n [8, 52, 4, 12],\r\n ],\r\n [\r\n [4, 32, 4, 4],\r\n [4, 48, 4, 4],\r\n ],\r\n [\r\n [8, 32, 4, 4],\r\n [8, 48, 4, 4],\r\n ],\r\n [\r\n [4, 20, 4, 12],\r\n [20, 52, 4, 12],\r\n ],\r\n [\r\n [0, 20, 4, 12],\r\n [24, 52, 4, 12],\r\n ],\r\n [\r\n [12, 20, 4, 12],\r\n [28, 52, 4, 12],\r\n ],\r\n [\r\n [8, 20, 4, 12],\r\n [16, 52, 4, 12],\r\n ],\r\n [\r\n [4, 16, 4, 4],\r\n [20, 48, 4, 4],\r\n ],\r\n [\r\n [8, 16, 4, 4],\r\n [24, 48, 4, 4],\r\n ],\r\n\r\n // 3x arms\r\n [[36, 52, 3, 12], [44, 20, 3, 12], 3],\r\n [[39, 52, 4, 12], [40, 20, 4, 12], 3],\r\n [[43, 52, 3, 12], [51, 20, 3, 12], 3],\r\n [[32, 52, 4, 12], [47, 20, 4, 12], 3],\r\n [[44, 16, 3, 4], [36, 48, 3, 4], 3],\r\n [[47, 16, 3, 4], [39, 48, 3, 4], 3],\r\n\r\n // 3x overlays\r\n [[52, 52, 3, 12], [44, 36, 3, 12], 3],\r\n [[55, 52, 4, 12], [40, 36, 4, 12], 3],\r\n [[59, 52, 3, 12], [51, 36, 3, 12], 3],\r\n [[48, 52, 4, 12], [47, 36, 4, 12], 3],\r\n [[44, 32, 3, 4], [52, 48, 3, 4], 3],\r\n [[47, 32, 3, 4], [55, 48, 3, 4], 3],\r\n];\r\n\r\nconst convertedMaps = maps.map((item) => new FaceMap(item));\r\n\r\nlet steve = [];\r\nlet alex = [];\r\n\r\nconst raycaster = new THREE.Raycaster();\r\nconst mouse = new THREE.Vector2();\r\nconst onClickPosition = new THREE.Vector2();\r\n\r\nfunction init() {\r\n camera = new THREE.PerspectiveCamera(80, 1, 0.1, 1000);\r\n camera.position.set(0, 0, 40);\r\n if (window.innerWidth < 768) {\r\n camera.position.x /= 1.5;\r\n camera.position.y /= 1.5;\r\n camera.position.z /= 1.5;\r\n }\r\n\r\n\r\n scene = new THREE.Scene();\r\n\r\n renderer = new THREE.WebGLRenderer({\r\n canvas: document.querySelector(\"canvas\"),\r\n antialias: true,\r\n });\r\n renderer.setPixelRatio(window.devicePixelRatio);\r\n renderer.setClearColor(0xffffff, 0);\r\n //renderer.setSize( window.innerWidth / 2, window.innerHeight);\r\n\r\n controls = new OrbitControls(camera, renderer.domElement);\r\n controls.target.set(0, 0, 0);\r\n controls.mouseButtons = {\r\n LEFT: THREE.MOUSE.ROTATE,\r\n MIDDLE: THREE.MOUSE.ROTATE,\r\n MOUSEWHEEL: THREE.MOUSE.DOLLY,\r\n RIGHT: THREE.MOUSE.ROTATE,\r\n };\r\n controls.minDistance = 20;\r\n controls.maxDistance = 50;\r\n controls.update();\r\n\r\n container = document.getElementById(\"container\");\r\n container.appendChild(renderer.domElement);\r\n container.addEventListener(\"pointermove\", onMouseMove);\r\n container.addEventListener(\"pointerdown\", onMouseDown);\r\n container.addEventListener(\"pointerup\", onMouseUp);\r\n // window.addEventListener( 'resize', onWindowResize );\r\n}\r\n\r\nfunction onMouseDown(evt) {\r\n evt.preventDefault();\r\n if (evt.button === 0) {\r\n const array = getMousePosition(container, evt.clientX, evt.clientY);\r\n onClickPosition.fromArray(array);\r\n const intersects = getIntersects(onClickPosition, scene.children);\r\n const intersect = intersects.find((item) => item.object.visible && item.uv);\r\n\r\n if (intersect) {\r\n const uv = intersect.uv;\r\n const index = intersect.face.materialIndex;\r\n const map = intersect.object.material[index].map;\r\n map.transformUv(uv);\r\n\r\n if (penMode === \"picker\") {\r\n const colors = intersects\r\n .filter((item) => item.object.visible && item.uv)\r\n .map((item) =>\r\n item.object.material[item.face.materialIndex].map.transformUv(\r\n item.uv\r\n )\r\n )\r\n .map((uv) => canvas.colorPick(uv.x, uv.y))\r\n .filter((rgba) => rgba[3] > 0);\r\n const picked = colors.find((item) => item[3] === 255);\r\n if (picked) onColorPick(picked);\r\n } else if (penMode === \"bucket\") {\r\n canvas.fillPixels(\r\n map.rotation ? map.offset.x - map.repeat.x : map.offset.x,\r\n map.rotation ? map.offset.y - map.repeat.y : map.offset.y,\r\n map.repeat.x,\r\n map.repeat.y\r\n );\r\n } else {\r\n if (penMode === \"eraser\") {\r\n canvas.erasePixel(uv.x, uv.y, intersect.object.isOverlay);\r\n } else {\r\n canvas.drawPixel(uv.x, uv.y);\r\n }\r\n controls.enabled = false;\r\n }\r\n } else {\r\n controls.enabled = true;\r\n }\r\n }\r\n}\r\n\r\nfunction onMouseUp(evt) {\r\n evt.preventDefault();\r\n if (!controls.enabled) {\r\n onSaveHistory();\r\n }\r\n controls.enabled = true;\r\n}\r\n\r\nfunction onMouseMove(evt) {\r\n const array = getMousePosition(container, evt.clientX, evt.clientY);\r\n onClickPosition.fromArray(array);\r\n const intersects = getIntersects(onClickPosition, scene.children);\r\n const intersect = intersects.find((item) => item.object.visible && item.uv);\r\n\r\n if (controls.enabled === false) {\r\n if (intersect) {\r\n const uv = intersect.uv;\r\n const index = intersect.face.materialIndex;\r\n intersect.object.material[index].map.transformUv(uv);\r\n if (penMode === \"eraser\") {\r\n canvas.erasePixel(uv.x, uv.y, intersect.object.isOverlay);\r\n } else {\r\n canvas.drawPixel(uv.x, uv.y);\r\n }\r\n }\r\n }\r\n}\r\n\r\nfunction getMousePosition(dom, x, y) {\r\n const rect = dom.getBoundingClientRect();\r\n let rendererXY = new THREE.Vector2();\r\n renderer.getSize(rendererXY);\r\n return [\r\n (x - rect.left) / rendererXY.width,\r\n (y - rect.top) / rendererXY.height,\r\n ];\r\n}\r\n\r\nfunction getIntersects(point, objects) {\r\n mouse.set(point.x * 2 - 1, -(point.y * 2) + 1);\r\n raycaster.setFromCamera(mouse, camera);\r\n return raycaster.intersectObjects(objects);\r\n}\r\n\r\nfunction CanvasTexture(parentTexture) {\r\n this._canvas = drawingCanvas || null;\r\n this._context2D = drawingContext || null;\r\n this._image = drawingContext.createImageData(\r\n drawingCanvas.width,\r\n drawingCanvas.height\r\n );\r\n this._data = this._image.data;\r\n if (parentTexture) {\r\n this._parentTexture.push(parentTexture);\r\n parentTexture.image = this._canvas;\r\n }\r\n}\r\n\r\nCanvasTexture.prototype = {\r\n constructor: CanvasTexture,\r\n _xCross: -1,\r\n _yCross: -1,\r\n _parentTexture: [],\r\n\r\n addParent: function (parentTexture) {\r\n if (this._parentTexture.indexOf(parentTexture) === -1) {\r\n this._parentTexture.push(parentTexture);\r\n parentTexture.image = this._canvas;\r\n }\r\n },\r\n\r\n drawPixel: function (x, y) {\r\n this._xCross = Math.round(x * this._canvas.width - 0.5);\r\n this._yCross = Math.round(y * this._canvas.height - 0.5);\r\n this._draw();\r\n },\r\n\r\n erasePixel: function (_x, _y, overlay) {\r\n const context = this._context2D;\r\n const x = Math.round(_x * this._canvas.width - 0.5);\r\n const y = Math.round(_y * this._canvas.height - 0.5);\r\n context.fillStyle = \"#ffffff\";\r\n\r\n const size = model === \"steve\" ? 4 : 3;\r\n\r\n if (overlay) {\r\n context.clearRect(x, y, 1, 1);\r\n\r\n if (isMirrored) {\r\n const mirrorMap = convertedMaps.find(\r\n (item) => item.intersected(x, y) && (!item.size || item.size === size)\r\n );\r\n\r\n if (mirrorMap) {\r\n const reflection = mirrorMap.findReflection(x, y);\r\n context.clearRect(reflection.x, reflection.y, 1, 1);\r\n }\r\n }\r\n } else {\r\n context.beginPath();\r\n context.rect(x, y, 1, 1);\r\n context.fill();\r\n\r\n if (isMirrored) {\r\n const mirrorMap = convertedMaps.find(\r\n (item) => item.intersected(x, y) && (!item.size || item.size === size)\r\n );\r\n\r\n if (mirrorMap) {\r\n const reflection = mirrorMap.findReflection(x, y);\r\n context.rect(reflection.x, reflection.y, 1, 1);\r\n context.fill();\r\n }\r\n }\r\n }\r\n\r\n this._updateTextures();\r\n },\r\n\r\n fillPixels: function (x, y, w, h) {\r\n const _w = Math.round(w * this._canvas.width - 0.5);\r\n const _h = Math.round(h * this._canvas.height - 0.5);\r\n const _x = Math.round(x * this._canvas.width - 0.5);\r\n const _y = Math.round(y * this._canvas.height - 0.5);\r\n\r\n const context = this._context2D;\r\n context.fillStyle = color || \"#000000\";\r\n context.translate(0, 64);\r\n context.scale(1, -1);\r\n\r\n context.beginPath();\r\n context.rect(_x, _y, _w, _h);\r\n context.fill();\r\n\r\n context.translate(0, 64);\r\n context.scale(1, -1);\r\n\r\n this._updateTextures();\r\n onSaveHistory();\r\n },\r\n\r\n colorPick: function (x, y) {\r\n const _x = Math.round(x * this._canvas.width - 0.5);\r\n const _y = Math.round(y * this._canvas.height - 0.5);\r\n return this._context2D.getImageData(_x, _y, 1, 1).data;\r\n },\r\n\r\n updateTextures: function () {\r\n this._updateTextures();\r\n },\r\n\r\n _updateTextures: function () {\r\n for (let i = 0; i < this._parentTexture.length; i++) {\r\n this._parentTexture[i].needsUpdate = true;\r\n }\r\n },\r\n\r\n _draw: function () {\r\n const context = this._context2D;\r\n\r\n if (!context) return;\r\n\r\n const x = this._xCross;\r\n const y = this._yCross;\r\n\r\n // Background.\r\n context.drawImage(drawingCanvas, 0, 0);\r\n\r\n // Fill pixel.\r\n\r\n context.fillStyle = color || \"#000000\";\r\n\r\n if (penMode === \"autotone\") {\r\n const max = 10;\r\n const min = -10;\r\n const random = Math.floor(Math.random() * (max - min + 1) + min);\r\n const toneColor =\r\n random < 0\r\n ? new TinyColor(color || \"#000000\").darken(random).toHexString()\r\n : new TinyColor(color || \"#000000\").lighten(random).toHexString();\r\n context.fillStyle = toneColor;\r\n }\r\n\r\n context.beginPath();\r\n context.rect(x, y, 1, 1);\r\n context.fill();\r\n\r\n const size = model === \"steve\" ? 4 : 3;\r\n\r\n if (isMirrored) {\r\n const mirrorMap = convertedMaps.find(\r\n (item) => item.intersected(x, y) && (!item.size || item.size === size)\r\n );\r\n\r\n if (mirrorMap) {\r\n const reflection = mirrorMap.findReflection(x, y);\r\n context.rect(reflection.x, reflection.y, 1, 1);\r\n context.fill();\r\n }\r\n }\r\n\r\n this._updateTextures();\r\n },\r\n};\r\n\r\nfunction setupCanvasDrawing() {\r\n // get canvas and context\r\n drawingCanvas = document.getElementById(\"drawing-canvas\");\r\n drawingContext = drawingCanvas.getContext(\"2d\");\r\n\r\n // hide canvas\r\n drawingCanvas.style.display = \"none\";\r\n\r\n skinTexture = new THREE.CanvasTexture(drawingCanvas);\r\n skinTexture.magFilter = THREE.NearestFilter;\r\n\r\n canvas = new CanvasTexture(skinTexture);\r\n\r\n // set the variable to keep track of when to draw\r\n let paint = false;\r\n drawingCanvas.addEventListener(\"pointerdown\", function (e) {\r\n if (e.button === 0) {\r\n paint = true;\r\n }\r\n if (paint) canvas.drawPixel(e.offsetX / 4 / 64, e.offsetY / 4 / 64);\r\n });\r\n drawingCanvas.addEventListener(\"pointermove\", function (e) {\r\n if (paint) canvas.drawPixel(e.offsetX / 4 / 64, e.offsetY / 4 / 64);\r\n });\r\n window.addEventListener(\"pointerup\", function () {\r\n paint = false;\r\n });\r\n}\r\n\r\n//#region skin init\r\nfunction initModel() {\r\n const rightLeg = createLeg(0, 0, false);\r\n rightLeg.position.set(-2, -10, 0);\r\n rightLeg.name = \"RightLeg\";\r\n\r\n const leftLeg = createLeg(0.25, -0.5, false);\r\n leftLeg.position.set(2, -10, 0);\r\n leftLeg.name = \"LeftLeg\";\r\n\r\n const rightLegO = createLeg(0, -0.25, true);\r\n rightLegO.position.set(-1.975, -10, 0);\r\n rightLegO.name = \"RightLeg\";\r\n\r\n const leftLegO = createLeg(0, -0.5, true);\r\n leftLegO.position.set(1.975, -10, 0);\r\n leftLegO.name = \"LeftLeg\";\r\n\r\n const rightArm = createArm(0.625, 0, false, false);\r\n rightArm.position.set(-6, 2, 0);\r\n rightArm.name = \"RightArm\";\r\n\r\n const leftArm = createArm(0.5, -0.5, false, false);\r\n leftArm.position.set(6, 2, 0);\r\n leftArm.name = \"LeftArm\";\r\n\r\n const rightArmO = createArm(0.625, -0.25, true, false);\r\n rightArmO.position.set(-5.975, 2, 0);\r\n rightArmO.name = \"RightArm\";\r\n\r\n const leftArmO = createArm(0.75, -0.5, true, false);\r\n leftArmO.position.set(5.975, 2, 0);\r\n leftArmO.name = \"LeftArm\";\r\n\r\n const rightArmSlim = createArm(0.625, 0, false, true);\r\n rightArmSlim.position.set(-5.5, 2, 0);\r\n rightArmSlim.name = \"RightArm\";\r\n rightArmSlim.visible = false;\r\n\r\n const leftArmSlim = createArm(0.5, -0.5, false, true);\r\n leftArmSlim.position.set(5.5, 2, 0);\r\n leftArmSlim.name = \"LeftArm\";\r\n leftArmSlim.visible = false;\r\n\r\n const rightArmSlimO = createArm(0.625, -0.25, true, true);\r\n rightArmSlimO.position.set(-5.475, 2, 0);\r\n rightArmSlimO.name = \"RightArm\";\r\n rightArmSlimO.visible = false;\r\n\r\n const leftArmSlimO = createArm(0.75, -0.5, true, true);\r\n leftArmSlimO.position.set(5.475, 2, 0);\r\n leftArmSlimO.name = \"LeftArm\";\r\n leftArmSlimO.visible = false;\r\n\r\n const head = createHead(0, 0, false);\r\n head.position.set(0, 12, 0);\r\n head.name = \"Head\";\r\n\r\n const headO = createHead(0.5, 0, true);\r\n headO.position.set(0, 12, 0);\r\n headO.name = \"Head\";\r\n\r\n const body = createBody(0, 0, false);\r\n body.position.set(0, 2, 0);\r\n body.name = \"Body\";\r\n\r\n const bodyO = createBody(0, -0.25, true);\r\n bodyO.position.set(0, 2, 0);\r\n bodyO.name = \"Body\";\r\n\r\n bodyGroup.add(\r\n rightArm,\r\n leftArm,\r\n body,\r\n head,\r\n rightLeg,\r\n leftLeg,\r\n rightArmSlim,\r\n leftArmSlim\r\n );\r\n overlayGroup.add(\r\n rightArmO,\r\n leftArmO,\r\n bodyO,\r\n headO,\r\n rightLegO,\r\n leftLegO,\r\n rightArmSlimO,\r\n leftArmSlimO\r\n );\r\n overlayGroup.children.forEach((item) => (item.isOverlay = true));\r\n bodyWireframeGroup = [\r\n rightArm.grid,\r\n leftArm.grid,\r\n body.grid,\r\n head.grid,\r\n rightLeg.grid,\r\n leftLeg.grid,\r\n rightArmSlim.grid,\r\n leftArmSlim.grid,\r\n ];\r\n bodyWireframeGroup.map((item) => (item.visible = !showOverlay));\r\n scene.add(bodyGroup, overlayGroup);\r\n\r\n alex = [rightArmSlim, leftArmSlim, rightArmSlimO, leftArmSlimO];\r\n steve = [rightArm, leftArm, rightArmO, leftArmO];\r\n alex.map((item) => (item.modelName = \"alex\"));\r\n steve.map((item) => (item.modelName = \"steve\"));\r\n}\r\n\r\nfunction createGrid(object, color) {\r\n const { width, height, depth } = object.geometry.parameters;\r\n const group = new THREE.Group();\r\n group.visible = true;\r\n\r\n const gridTop = new WireframedBox(width, depth, color);\r\n gridTop.position.set(0, height / 2 + 0.005, 0);\r\n group.add(gridTop);\r\n\r\n const gridBottom = new WireframedBox(width, depth, color);\r\n gridBottom.position.set(0, -(height / 2 + 0.005), 0);\r\n group.add(gridBottom);\r\n\r\n const gridFront = new WireframedBox(width, height, color);\r\n gridFront.position.set(0, 0, depth / 2 + 0.005);\r\n gridFront.rotation.x = Math.PI / 2;\r\n group.add(gridFront);\r\n\r\n const gridBack = new WireframedBox(width, height, color);\r\n gridBack.position.set(0, 0, -(depth / 2 + 0.005));\r\n gridBack.rotation.x = Math.PI / 2;\r\n group.add(gridBack);\r\n\r\n const gridLeft = new WireframedBox(height, depth, color);\r\n gridLeft.position.set(-(width / 2 + 0.005), 0, 0);\r\n gridLeft.rotation.z = Math.PI / 2;\r\n group.add(gridLeft);\r\n\r\n const gridRight = new WireframedBox(height, depth, color);\r\n gridRight.position.set(width / 2 + 0.005, 0, 0);\r\n gridRight.rotation.z = Math.PI / 2;\r\n group.add(gridRight);\r\n\r\n object.grid = group;\r\n object.add(group);\r\n}\r\n\r\nfunction createLeg(dx, dy, overlay) {\r\n var legSides = [];\r\n for (i = 0; i < 6; i++) {\r\n legSides.push(skinTexture.clone());\r\n canvas.addParent(legSides[i]);\r\n }\r\n\r\n legSides[0].repeat.set(0.0625, 0.1875);\r\n legSides[0].offset.set(0.125 + dx, 0.5 + dy);\r\n legSides[1].repeat.set(0.0625, 0.1875);\r\n legSides[1].offset.set(0.0 + dx, 0.5 + dy);\r\n legSides[2].repeat.set(0.0625, 0.0625);\r\n legSides[2].offset.set(0.0625 + dx, 0.6875 + dy);\r\n legSides[3].repeat.set(0.0625, 0.0625);\r\n legSides[3].offset.set(0.125 + dx, 0.6875 + dy);\r\n legSides[4].repeat.set(0.0625, 0.1875);\r\n legSides[4].offset.set(0.0625 + dx, 0.5 + dy);\r\n legSides[5].repeat.set(0.0625, 0.1875);\r\n legSides[5].offset.set(0.1875 + dx, 0.5 + dy);\r\n var legMaterials = [];\r\n for (i = 0; i < 6; i++) {\r\n legMaterials.push(\r\n new THREE.MeshBasicMaterial({\r\n map: legSides[i],\r\n transparent: overlay,\r\n side: THREE.DoubleSide,\r\n })\r\n );\r\n }\r\n const object = new THREE.Mesh(new THREE.BoxGeometry(4, 12, 4), legMaterials);\r\n createGrid(object, 0x666666);\r\n\r\n if (overlay) {\r\n object.scale.x = 4.45 / 4;\r\n object.scale.y = 12.45 / 12;\r\n object.scale.z = 4.45 / 4;\r\n }\r\n\r\n return object;\r\n}\r\n\r\nfunction createArm(dx, dy, overlay, slim) {\r\n var armSides = [];\r\n for (i = 0; i < 6; i++) {\r\n armSides.push(skinTexture.clone());\r\n canvas.addParent(armSides[i]);\r\n }\r\n\r\n // Right\r\n armSides[0].repeat.set(0.0625, 0.1875);\r\n armSides[0].offset.set(0.125 - (slim ? 0.015625 : 0) + dx, 0.5 + dy);\r\n\r\n // Left\r\n armSides[1].repeat.set(0.0625, 0.1875);\r\n armSides[1].offset.set(0.0 + dx, 0.5 + dy);\r\n\r\n // Top\r\n armSides[2].repeat.set(slim ? 0.046875 : 0.0625, 0.0625);\r\n armSides[2].offset.set(0.0625 + dx, 0.6875 + dy);\r\n\r\n // Bottom\r\n armSides[3].repeat.set(slim ? 0.046875 : 0.0625, 0.0625);\r\n armSides[3].offset.set(0.125 - (slim ? 0.015625 : 0) + dx, 0.6875 + dy);\r\n\r\n // Front\r\n armSides[4].repeat.set(slim ? 0.046875 : 0.0625, 0.1875);\r\n armSides[4].offset.set(0.0625 + dx, 0.5 + dy);\r\n\r\n // Back\r\n armSides[5].repeat.set(slim ? 0.046875 : 0.0625, 0.1875);\r\n armSides[5].offset.set(0.1875 - (slim ? 0.015625 : 0) + dx, 0.5 + dy);\r\n\r\n var armMaterials = [];\r\n for (i = 0; i < 6; i++) {\r\n armMaterials.push(\r\n new THREE.MeshBasicMaterial({\r\n map: armSides[i],\r\n transparent: overlay,\r\n side: THREE.DoubleSide,\r\n })\r\n );\r\n }\r\n const armWidth = slim ? 3 : 4;\r\n const object = new THREE.Mesh(\r\n new THREE.BoxGeometry(armWidth, 12, 4),\r\n armMaterials\r\n );\r\n createGrid(object, 0x666666);\r\n\r\n if (overlay) {\r\n object.scale.x = (armWidth + 0.45) / armWidth;\r\n object.scale.y = 12.45 / 12;\r\n object.scale.z = 4.45 / 4;\r\n }\r\n\r\n return object;\r\n}\r\n\r\nfunction createHead(dx, dy, overlay) {\r\n var headSides = [];\r\n\r\n for (i = 0; i < 6; i++) {\r\n headSides.push(skinTexture.clone());\r\n canvas.addParent(headSides[i]);\r\n }\r\n\r\n headSides[0].offset.set(0.25 + dx, 0.75);\r\n headSides[1].offset.set(0 + dx, 0.75);\r\n headSides[2].offset.set(0.125 + dx, 0.875);\r\n headSides[3].offset.set(0.375 + dx, 1);\r\n headSides[3].rotation = Math.PI;\r\n headSides[4].offset.set(0.125 + dx, 0.75);\r\n headSides[5].offset.set(0.375 + dx, 0.75);\r\n var headMaterials = [];\r\n for (i = 0; i < 6; i++) {\r\n headSides[i].repeat.set(0.125, 0.125);\r\n headMaterials.push(\r\n new THREE.MeshBasicMaterial({\r\n map: headSides[i],\r\n transparent: overlay,\r\n side: THREE.DoubleSide,\r\n })\r\n );\r\n }\r\n const object = new THREE.Mesh(new THREE.BoxGeometry(8, 8, 8), headMaterials);\r\n createGrid(object, 0x666666);\r\n\r\n if (overlay) {\r\n object.scale.x = 8.45 / 8;\r\n object.scale.y = 8.45 / 8;\r\n object.scale.z = 8.45 / 8;\r\n }\r\n\r\n return object;\r\n}\r\n\r\nfunction createBody(dx, dy, overlay) {\r\n var bodySides = [];\r\n\r\n for (i = 0; i < 6; i++) {\r\n bodySides.push(skinTexture.clone());\r\n canvas.addParent(bodySides[i]);\r\n }\r\n\r\n bodySides[0].repeat.set(0.0625, 0.1875);\r\n bodySides[0].offset.set(0.4375, 0.5 + dy);\r\n bodySides[1].repeat.set(0.0625, 0.1875);\r\n bodySides[1].offset.set(0.25, 0.5 + dy);\r\n bodySides[2].repeat.set(0.125, 0.0625);\r\n bodySides[2].offset.set(0.3125, 0.6875 + dy);\r\n bodySides[3].repeat.set(0.125, 0.0625);\r\n bodySides[3].offset.set(0.4375, 0.6875 + dy);\r\n bodySides[4].repeat.set(0.125, 0.1875);\r\n bodySides[4].offset.set(0.3125, 0.5 + dy);\r\n bodySides[5].repeat.set(0.125, 0.1875);\r\n bodySides[5].offset.set(0.5, 0.5 + dy);\r\n var bodyMaterials = [];\r\n for (i = 0; i < 6; i++) {\r\n bodyMaterials.push(\r\n new THREE.MeshBasicMaterial({\r\n map: bodySides[i],\r\n transparent: overlay,\r\n side: THREE.DoubleSide,\r\n })\r\n );\r\n }\r\n const object = new THREE.Mesh(new THREE.BoxGeometry(8, 12, 4), bodyMaterials);\r\n createGrid(object, 0x666666);\r\n\r\n if (overlay) {\r\n object.scale.x = 8.45 / 8;\r\n object.scale.y = 12.45 / 12;\r\n object.scale.z = 4.45 / 4;\r\n }\r\n\r\n return object;\r\n}\r\n//#endregion\r\n\r\nfunction resizeCanvasToDisplaySize() {\r\n const canvas = renderer.domElement;\r\n const width = canvas.clientWidth;\r\n const height = canvas.clientHeight;\r\n if (canvas.width !== width || canvas.height !== height) {\r\n // you must pass false here or three.js sadly fights the browser\r\n renderer.setSize(width, height, false);\r\n camera.aspect = width / height;\r\n camera.updateProjectionMatrix();\r\n\r\n // set render target sizes here\r\n }\r\n}\r\n\r\nfunction animate() {\r\n resizeCanvasToDisplaySize();\r\n requestAnimationFrame(animate);\r\n controls.update();\r\n renderer.render(scene, camera);\r\n}\r\n\r\nfunction updateSkinLayer() {\r\n drawingContext.clearRect(0, 0, drawingCanvas.width, drawingCanvas.height);\r\n if (layerCanvas) drawingContext.drawImage(layerCanvas, 0, 0);\r\n canvas.updateTextures();\r\n}\r\n\r\nfunction initSkinLayer(texture, forced = false) {\r\n if (layerCanvas && !forced) return;\r\n\r\n var layer = document.createElement(\"canvas\");\r\n var layerContext = layer.getContext(\"2d\");\r\n layerContext.imageSmoothingEnabled = false;\r\n\r\n var image = new THREE.ImageLoader().load(texture.src, function () {\r\n layerContext.drawImage(image, 0, 0);\r\n updateSkinLayer();\r\n });\r\n\r\n layerCanvas = layer;\r\n}\r\n\r\nclass Scene extends React.Component {\r\n hiddenParts = [];\r\n\r\n componentDidMount() {\r\n init();\r\n setupCanvasDrawing();\r\n initModel();\r\n animate();\r\n }\r\n\r\n render() {\r\n penMode = this.props.penMode;\r\n onColorPick = this.props.onColorPick;\r\n onSaveHistory = this.props.onSaveHistory;\r\n isMirrored = this.props.isMirrored;\r\n initSkinLayer(this.props.texture);\r\n\r\n return (\r\n