UNPKG

react-garden

Version:

React + TypeScript + ThreeJS app using Material UI on NextJS, Apollo Client, GraphQL + WordPress REST APIs, for ThreeD web development.. a part of the threed.ai code family.

1,377 lines 379 kB
// "use strict" console.log("[MM] HEY HEY HEY -- B3 -- export function x()") export function deselectAll() { try { ; (mouseMode = -1), selectedItem && selectedItem.data && (selectedItem.data.toolsRectangleInner && (selectedItem.data.toolsRectangleInner.visible = !1), selectedItem.data.boxHelper && (selectedItem.data.boxHelper.visible = !1), "dimension" === selectedItem.data.type && ((Dimensions[selectedItem.data.id].text.selected = !1), (Dimensions[selectedItem.data.id].line.selected = !1)), (selectedItem.selected = !1), (selectedItem = null), (toolsGroup.visible = !1), updateObjectPropertiesWindow()), wallHelperPath && (wallHelperPath.visible = !1), roofHelperPath && (roofHelperPath.visible = !1), movePointIcons.forEach(function (e) { e.remove() }), (movePointIcons = []), (offsetMousePoint = new paper.Point(0, 0)) } catch (e) { console.log(e) } } export function setNewPlan() { try { resetPlan(), (planHistory = []), (planHistoryPosition = 0), planHistory.push(JSON.stringify(plan)), setToolMode("pointer"), localStorage.clear() } catch (e) { console.log("setNewPlan : " + e) } } export function resetPlan() { try { Object.keys(Texts).forEach(function (e) { let t = Texts[e] "object" === typeof t && deleteTextByKey(e) }), (textIdCounter = 0) } catch (e) { console.log("resetPlan : 1 : " + e) } try { Object.keys(Dimensions).forEach(function (e) { let t = Dimensions[e] "object" === typeof t && deleteDimensionByKey(e) }), (dimensionIdCounter = 0) } catch (e) { console.log("resetPlan : 2 : " + e) } try { Object.keys(Furniture).forEach(function (e) { let t = Furniture[e] "object" === typeof t && (Furniture[e].data.toolsRectangleInner && Furniture[e].data.toolsRectangleInner.remove(), Furniture[e].remove(), delete Furniture[e]) }) } catch (e) { console.log("resetPlan : 3 : " + e) } try { Object.keys(Floors).forEach(function (e) { let t = Floors[e] "object" === typeof t && (Floors[e].remove(), delete Floors[e]) }), Object.keys(Floors3d).forEach(function (e) { let t = Floors3d[e] "object" === typeof t && (scene.remove(Floors3d[e]), delete Floors3d[e]) }), (floorIdCounter = 0) } catch (e) { console.log("resetPlan : 4 : " + e) } try { Object.keys(Walls).forEach(function (e) { let t = Walls[e] "object" === typeof t && (Walls[e].remove(), delete Walls[e]) }) for (let e in wallsRectangles) wallsRectangles[e].remove() } catch (e) { console.log("resetPlan : 5 : " + e) } try { Object.keys(wallsRectangles3d).forEach(function (e) { let t = wallsRectangles3d[e] "object" === typeof t && scene.remove(wallsRectangles3d[e]) }) } catch (e) { console.log("resetPlan : 6 : " + e) } try { Object.keys(Roofs).forEach(function (e) { "object" === typeof Roofs[e] && (Roofs[e].remove(), delete Roofs[e]) }) for (let t in roofsRectangles) roofsRectangles[t].remove() } catch (e) { console.log("resetPlan : 5.1 : " + e) } try { Object.keys(roofsRectangles3d).forEach(function (e) { "object" === typeof roofsRectangles3d[e] && scene.remove(roofsRectangles3d[e]) }) } catch (e) { console.log("resetPlan : 6.1 : " + e) } try { Object.keys(maskObjectsApplied).forEach(function (e) { "object" === typeof maskObjectsApplied[e] && scene.remove(maskObjectsApplied[e]) }) } catch (e) { console.log("resetPlan : 6.5 : " + e) } try { Object.keys(maskObjectsAppliedRoof).forEach(function (e) { "object" === typeof maskObjectsAppliedRoof[e] && scene.remove(maskObjectsAppliedRoof[e]) }) } catch (e) { console.log("resetPlan : 6.6 : " + e) } try { Object.keys(clickableObjects).forEach(function (e) { let t = clickableObjects[e] "object" === typeof t && "groundLayer" !== t.name && (scene.remove(clickableObjects[e]), delete clickableObjects[e]) }) } catch (e) { console.log("resetPlan : 7 : " + e) } try { Object.keys(maskObjects).forEach(function (e) { let t = maskObjects[e] "object" === typeof t && (scene.remove(maskObjects[e]), delete maskObjects[e]) }), (clickableObjectsCounter = 0) } catch (e) { console.log("resetPlan : 8 : " + e) } try { backgroundRaster && backgroundRaster.data && (backgroundRaster.data.toolsRectangleInner && backgroundRaster.data.toolsRectangleInner.remove(), backgroundRaster.remove(), (backgroundRaster = null), clearFileInput(document.getElementById("backgroundImageFile"))) } catch (e) { console.log("resetPlan : 9 : " + e) } try { Object.keys(verticalGuides).forEach(function (e) { verticalGuides[e].remove(), delete verticalGuides[e] }), Object.keys(horizontalGuides).forEach(function (e) { horizontalGuides[e].remove(), delete horizontalGuides[e] }), (guideCounter = 0) } catch (e) { console.log("resetPlan : 10 : " + e) } try { ; (furnitureToLoadCount = 0), (loadedFurnitureCount = 0), (wallIdCounter = 0), (wallsRectangles = {}), (wallsRectangles3d = {}), (maskObjectsApplied = {}), (maskObjectsAppliedRoof = {}), (roofIdCounter = 0), (roofsRectangles = {}), (roofsRectangles3d = {}), (Furniture = {}), (Walls = {}), (Roofs = {}), (Floors = {}), (Floors3d = {}), (Dimensions = {}), (Texts = {}), (plan = {}), (plan.furniture = {}), (plan.walls = {}), (plan.roofs = {}), (plan.levels = {}), (plan.levels[0] = { id: 0, height: 0 }), (plan.floors = {}), (plan.dimensions = {}), (plan.texts = {}), (plan.verticalGuides = {}), (plan.horizontalGuides = {}), (plan.furnitureAddedKey = null), (plan.furnitureDirtyKey = null), (plan.furnitureDeletedKey = null), (plan.wallAddedKey = null), (plan.wallDirtyKey = null), (plan.wallDeletedKey = null), (plan.roofAddedKey = null), (plan.roofDirtyKey = null), (plan.roofDeletedKey = null), (plan.floorAddedKey = null), (plan.floorDirtyKey = null), (plan.floorDeletedKey = null), (plan.dimensionAddedKey = null), (plan.dimensionEditedKey = null), (plan.dimensionDeletedKey = null), (plan.textAddedKey = null), (plan.textEditedKey = null), (plan.textDeletedKey = null), (plan.wallDiffuse = wallMaterial.color), (plan.wallOpacity = wallMaterial.opacity), (plan.wallSpecular = wallMaterial.specular), (plan.roofDiffuse = roofMaterial.color), (plan.roofOpacity = roofMaterial.opacity), (plan.roofSpecular = roofMaterial.specular), (plan.floorDiffuse = floorMaterial.color), (plan.floorOpacity = floorMaterial.opacity), (plan.floorSpecular = floorMaterial.specular), (plan.groundDiffuse = groundMat.color.getHexString()), (plan.groundOpacity = groundMat.opacity), (plan.groundSpecular = groundMat.specular.getHexString()), (plan.depthWrite = document.getElementById("depthWriteMode").checked), (plan.sortObjects = document.getElementById("sortObjectsMode").checked), (plan.azimuth = azimuth), (plan.inclination = inclination) } catch (e) { console.log("resetPlan : 11 : " + e) } try { otherLayerWallsRasters && otherLayerWallsRasters.length > 0 && (otherLayerWallsRasters.forEach(function (e) { e.remove() }), (otherLayerWallsRasters = [])), otherLayerFurnitureRasters && otherLayerFurnitureRasters.length > 0 && (otherLayerFurnitureRasters.forEach(function (e) { e.remove() }), (otherLayerFurnitureRasters = [])) } catch (e) { console.log("resetPlan : 12 : " + e) } try { levelButtons || addNewLevel("0"), setLevel("0") } catch (e) { console.log("resetPlan : 13 : " + e) } try { Object.keys(levelButtons).forEach(function (e) { "0" !== e.toString() && (levelButtons[e].parentNode.removeChild(levelButtons[e]), delete levelButtons[e], project.layers["level" + e].remove()) }) } catch (e) { console.log("resetPlan : 14 : " + e) } try { project.layers.forEach(function (e) { "0" === !e.data.id && e.remove() }) } catch (e) { console.log("resetPlan : 15 : " + e) } ; (project.activeLayer.name = "level0"), (project.activeLayer.data = { id: "0", height: 0 }) try { ; (floorsGroup = {}), (floorsGroup[0] = new paper.Group()), (roofsGroup = {}), (roofsGroup[0] = new paper.Group()), (wallsGroup = {}), (wallsGroup[0] = new paper.Group()), (dimensionsGroup = {}), (dimensionsGroup[0] = new paper.Group()), (furnitureGroup = {}), (furnitureGroup[0] = new paper.Group()), (textsGroup = {}), (textsGroup[0] = new paper.Group()), (guidesGroup = new paper.Group()), deselectAll(), render() } catch (e) { console.log("resetPlan : 15 : " + e) } } export function doUndo() { if (planHistoryPosition > 0) { planHistoryPosition--, deselectAll() let e = JSON.parse(planHistory[planHistoryPosition]) plan.furnitureAddedKey ? (deleteFurnitureByKey(plan.furnitureAddedKey), updatePlan(e)) : plan.furnitureDirtyKey ? (editFurnitureByKey(e.furniture[plan.furnitureDirtyKey]), updatePlan(e)) : plan.furnitureDeletedKey ? (loadFurniture(e.furniture[plan.furnitureDeletedKey], !1, !1), updatePlan(e)) : plan.wallAddedKey || 0 === plan.wallAddedKey ? (deleteWallByKey(plan.wallAddedKey), updatePlan(e)) : plan.wallDirtyKey || 0 === plan.wallDirtyKey ? (deleteWallByKey(plan.wallDirtyKey), loadWall(e.walls[plan.wallDirtyKey]), updatePlan(e)) : plan.wallDeletedKey || 0 === plan.wallDeletedKey ? (loadWall(e.walls[plan.wallDeletedKey]), updatePlan(e)) : plan.roofAddedKey || 0 === plan.roofAddedKey ? (deleteRoofByKey(plan.roofAddedKey), updatePlan(e)) : plan.roofDirtyKey || 0 === plan.roofDirtyKey ? (deleteRoofByKey(plan.roofDirtyKey), loadRoof(e.roofs[plan.roofDirtyKey]), updatePlan(e)) : plan.roofDeletedKey || 0 === plan.roofDeletedKey ? (loadRoof(e.roofs[plan.roofDeletedKey]), updatePlan(e)) : plan.floorAddedKey ? ("floor" !== toolMode && setToolMode("floor"), setEndDrawingFloors(), deleteFloorByKey(plan.floorAddedKey), updatePlan(e)) : plan.floorDirtyKey ? (setEndDrawingFloors(), deleteFloorByKey(plan.floorDirtyKey), loadFloor(e.floors[plan.floorDirtyKey]), Floors[plan.floorDirtyKey].segments.length > 1 && ("floor" !== toolMode && setToolMode("floor"), (startedDrawingFloor = !0), (floorHelperPath.visible = !0), (floorHelperPath.segments[0].point = Floors[plan.floorDirtyKey].segments[ Floors[plan.floorDirtyKey].segments.length - 1 ].point), (floorHelperPath.segments[1].point = lastMousePoint), (Floors[plan.floorDirtyKey].closed = !1)), updatePlan(e)) : plan.floorDeletedKey ? (loadFloor(e.floors[plan.floorDeletedKey]), 2 === Floors[plan.floorDeletedKey].segments.length && ("floor" !== toolMode && setToolMode("floor"), (floorHelperPath.visible = !0), (floorHelperPath.segments[0].point = Floors[plan.floorDeletedKey].segments[ Floors[plan.floorDeletedKey].segments.length - 1 ].point), (floorHelperPath.segments[1].point = lastMousePoint), (Floors[plan.floorDeletedKey].closed = !1)), updatePlan(e)) : plan.dimensionAddedKey ? (deleteDimensionByKey(plan.dimensionAddedKey), updatePlan(e)) : plan.dimensionEditedKey || (plan.dimensionDeletedKey ? (loadDimension(e.dimensions[plan.dimensionDeletedKey]), updatePlan(e)) : plan.textAddedKey ? (deleteTextByKey(plan.textAddedKey), updatePlan(e)) : plan.textEditedKey ? (deleteTextByKey(plan.textEditedKey), loadText(e.texts[plan.textEditedKey]), updatePlan(e)) : plan.textDeletedKey ? (loadText(e.texts[plan.textDeletedKey]), updatePlan(e)) : console.log("nothing to undo")) } } export function doRedo() { if (planHistory.length > planHistoryPosition + 1) { planHistoryPosition++, deselectAll() let e = JSON.parse(planHistory[planHistoryPosition]) if (e.furnitureAddedKey) loadFurniture(e.furniture[e.furnitureAddedKey], !1, !1), updatePlan(e) else if (e.furnitureDirtyKey) editFurnitureByKey(e.furniture[e.furnitureDirtyKey]), updatePlan(e) else if (e.furnitureDeletedKey) deleteFurnitureByKey(e.furnitureDeletedKey), updatePlan(e) else if (e.wallAddedKey || 0 === e.wallAddedKey) loadWall(e.walls[e.wallAddedKey]), updatePlan(e) else if (e.wallDirtyKey || 0 === e.wallDirtyKey) deleteWallByKey(e.wallDirtyKey), loadWall(e.walls[e.wallDirtyKey]), updatePlan(e) else if (e.wallDeletedKey || 0 === e.wallDeletedKey) deleteWallByKey(e.wallDeletedKey), updatePlan(e) else if (e.roofAddedKey || 0 === e.roofAddedKey) loadRoof(e.roofs[e.roofAddedKey]), updatePlan(e) else if (e.roofDirtyKey || 0 === e.roofDirtyKey) deleteRoofByKey(e.roofDirtyKey), loadRoof(e.roofs[e.roofDirtyKey]), updatePlan(e) else if (e.roofDeletedKey || 0 === e.roofDeletedKey) deleteRoofByKey(e.roofDeletedKey), updatePlan(e) else if (e.floorAddedKey) "floor" !== toolMode && setToolMode("floor"), loadFloor(e.floors[e.floorAddedKey]), (startedDrawingFloor = !0), 2 === Floors[e.floorAddedKey].segments.length && ((floorHelperPath.visible = !0), (floorHelperPath.segments[0].point = Floors[e.floorAddedKey].segments[ Floors[e.floorAddedKey].segments.length - 1 ].point), (floorHelperPath.segments[1].point = lastMousePoint), (Floors[e.floorAddedKey].closed = !1)), updatePlan(e) else if (e.floorDirtyKey) { "floor" !== toolMode && setToolMode("floor"), deleteFloorByKey(e.floorDirtyKey), loadFloor(e.floors[e.floorDirtyKey]) let t planHistory.length > planHistoryPosition + 1 ? ((t = JSON.parse(planHistory[planHistoryPosition + 1])), null === t.floorDirtyKey ? ((startedDrawingFloor = !1), (floorHelperPath.visible = !1)) : ((startedDrawingFloor = !0), (toolMode = "floor"), (floorHelperPath.visible = !0), (floorHelperPath.segments[0].point = Floors[e.floorDirtyKey].segments[ Floors[e.floorDirtyKey].segments.length - 1 ].point), (floorHelperPath.segments[1].point = lastMousePoint), (Floors[e.floorDirtyKey].closed = !1))) : ((startedDrawingFloor = !0), (toolMode = "floor"), (floorHelperPath.visible = !0), (floorHelperPath.segments[0].point = Floors[e.floorDirtyKey].segments[ Floors[e.floorDirtyKey].segments.length - 1 ].point), (floorHelperPath.segments[1].point = lastMousePoint), (Floors[e.floorDirtyKey].closed = !1)), updatePlan(e) } else e.floorDeletedKey ? ("floor" !== toolMode && setToolMode("floor"), deleteFloorByKey(e.floorDeletedKey), updatePlan(e)) : e.dimensionAddedKey ? (loadDimension(e.dimensions[e.dimensionAddedKey]), updatePlan(e)) : e.dimensionEditedKey || (e.dimensionDeletedKey ? (deleteDimensionByKey(e.dimensionDeletedKey), updatePlan(e)) : e.textAddedKey ? (loadText(e.texts[e.textAddedKey]), updatePlan(e)) : e.textEditedKey ? (deleteTextByKey(e.textEditedKey), loadText(e.texts[e.textEditedKey]), updatePlan(e)) : e.textDeletedKey ? (deleteTextByKey(e.textDeletedKey), updatePlan(e)) : console.log("nothing to redo")) } } function addVerticalGuide() { const e = paper.view.viewToProject( new paper.Point( event.pageX - planView.offsetLeft, event.pageY - planView.offsetTop ) ) const t = new paper.Point(e.x, -100) const o = new paper.Point(e.x, 100) const a = new paper.Path.Line(t, o) ; (a.strokeColor = "#00ff88"), (a.strokeWidth = 1), (a.strokeScaling = !1), (a.data.type = "verticalGuide"), (a.data.level = -1), guideCounter++, (a.data.id = guideCounter), (verticalGuides[guideCounter] = a), guidesGroup.addChild(a), (selectedGuideId = guideCounter), redrawGrid(), (draggingNewGuide = !0), (mouseMode = 9), (plan.verticalGuides = verticalGuides) } function addHorizontalGuide() { let e = paper.view.viewToProject( new paper.Point( event.pageX - planView.offsetLeft, event.pageY - planView.offsetTop ) ), t = new paper.Point(-100, e.y), o = new paper.Point(100, e.y), a = new paper.Path.Line(t, o) ; (a.strokeColor = "#00ff88"), (a.strokeWidth = 1), (a.strokeScaling = !1), (a.data.type = "horizontalGuide"), (a.data.level = -1), guideCounter++, (a.data.id = guideCounter), (horizontalGuides[guideCounter] = a), guidesGroup.addChild(a), (selectedGuideId = guideCounter), redrawGrid(), (draggingNewGuide = !0), (mouseMode = 10), (plan.horizontalGuides = horizontalGuides) } function removeVerticalGuide() { try { selectedGuideId > 0 && (verticalGuides[selectedGuideId].remove(), delete verticalGuides[selectedGuideId], delete plan.verticalGuides[selectedGuideId]) } catch (e) { console.log("removeVerticalGuide " + e) } } function removeHorizontalGuide() { try { selectedGuideId > 0 && (horizontalGuides[selectedGuideId].remove(), delete horizontalGuides[selectedGuideId], delete plan.horizontalGuides[selectedGuideId]) } catch (e) { console.log("removeHorizontalGuide " + e) } } function resizePlanView() { if ("3dView" !== UILayout) { let e = planCanvas.parentNode.getBoundingClientRect().width, t = planCanvas.parentNode.getBoundingClientRect().height ; (planCanvas.width = e), (planCanvas.height = t), (rulerBottom.width = e), (rulerLeft.height = t), (rulerBottomCtx.font = "12px Courier"), (rulerBottomCtx.textAlign = "center"), (rulerBottomCtx.fillStyle = "white"), (rulerLeftCtx.font = "12px Courier"), (rulerLeftCtx.textAlign = "right"), (rulerLeftCtx.fillStyle = "white"), (paper.view.viewSize.width = e), (paper.view.viewSize.height = t), redrawGrid() } } function onCanvasResize() { ; (camera.aspect = window.innerWidth / window.innerHeight), camera.updateProjectionMatrix(), renderer.setSize(window.innerWidth, window.innerHeight) } function initThreeJS() { ; (scene = new THREE.Scene()), (scene.background = new THREE.Color(0)) let e = new THREE.PlaneBufferGeometry(100 * groundWidth, 100 * groundLength) ; (groundMat = new THREE.MeshPhongMaterial({ transparent: !0, opacity: 1 })), (groundMat.color = new THREE.Color(2304293)), (groundMat.specular = new THREE.Color(15925148)), (ground = new THREE.Mesh(e, groundMat)), (ground.rotation.x = -Math.PI / 2), (ground.position.y = -2), (ground.name = "groundLayer"), "3dView" === UILayout && (ground.visible = !1), scene.add(ground), (clickableObjectsCounter = 0), (clickableObjects[clickableObjectsCounter] = ground), (renderer = new THREE.WebGLRenderer({ antialias: !0, preserveDrawingBuffer: !0, logarithmicDepthBuffer: !0, canvas: threeCanvas, })), renderer.setClearColor(0), renderer.setPixelRatio(window.devicePixelRatio), (container = document.getElementById("view3d")), renderer.setSize( parseInt(container.clientWidth), parseInt(container.clientHeight) ), (renderer.autoClear = !1), (renderer.sortObjects = !1), (renderer.domElement.ondblclick = onDoubleClick), (camera = new THREE.PerspectiveCamera( 45, container.innerWidth / container.innerHeight, 10, 25e3 )), (camera.position.x = 0), (camera.position.y = 265), (camera.position.z = 1e3), camera.lookAt(new THREE.Vector3(0, 0, 0)), (controls = new THREE.TrackballControls(camera, container)), (controls.rotateSpeed = 4), (controls.zoomSpeed = 5), (controls.panSpeed = 1.5), (controls.noZoom = !1), (controls.noPan = !1), (controls.staticMoving = !0), (controls.dynamicDampingFactor = 0.3), (controls.keys = [65, 83, 68]), controls.addEventListener("change", render), (sky = new THREE.Sky()), sky.scale.setScalar(45e4), scene.add(sky), (sunSphere = new THREE.Mesh( new THREE.SphereBufferGeometry(2e4, 16, 8), new THREE.MeshBasicMaterial({ color: 16777215 }) )), (sunSphere.position.y = -7e5), (sunSphere.visible = !1), scene.add(sunSphere) let t = sky.material.uniforms ; (t.turbidity.value = 14.6), (t.rayleigh.value = 0), (t.luminance.value = 1), (t.mieCoefficient.value = 0.008), (t.mieDirectionalG.value = 0.54), (inclination = 0), (azimuth = 0.33) let o = Math.PI * (inclination - 0.5), a = 2 * Math.PI * (azimuth - 0.5), n = 4e5 ; (sunSphere.position.x = n * Math.cos(a)), (sunSphere.position.y = n * Math.sin(a) * Math.sin(o)), (sunSphere.position.z = n * Math.sin(a) * Math.cos(o)), (sunSphere.visible = !0), t.sunPosition.value.copy(sunSphere.position), (ambientLight = new THREE.AmbientLight(16777215, 0.3)), scene.add(ambientLight), (hemiLight = new THREE.HemisphereLight(16777215, 16777215, 0.2)), hemiLight.color.setHSL(0.6, 1, 0.6), hemiLight.groundColor.setHSL(0.095, 1, 0.75), hemiLight.position.copy(sunSphere.position), scene.add(hemiLight), (dirLight = new THREE.DirectionalLight(16777215, 0.9)), dirLight.color.setHSL(0.1, 1, 0.95), dirLight.position.copy(sunSphere.position), scene.add(dirLight) let l = new THREE.BoxGeometry( defaultWallThickness, defaultWallHeight, defaultWallThickness ), i = new THREE.MeshStandardMaterial({ color: 0, transparent: !0, opacity: 0.25, }) ; (wallHelper3dCube = new THREE.Mesh(l, i)), (wallHelper3dCube.position.y = defaultWallHeight / 2), (wallHelper3dCube.visible = !1), scene.add(wallHelper3dCube), (l = new THREE.BoxGeometry( defaultRoofWidth, defaultRoofThickness, defaultRoofWidth )), (i = new THREE.MeshStandardMaterial({ color: 0, transparent: !0, opacity: 0.25, })), (roofHelper3dCube = new THREE.Mesh(l, i)), (roofHelper3dCube.position.y = defaultRoofThickness / 2), (roofHelper3dCube.visible = !1), scene.add(roofHelper3dCube), window.addEventListener("resize", resizeViews, !1), (model3dViewContainer = document.getElementById("model3dView")), (model3dSceneCamera = new THREE.PerspectiveCamera(60, 2, 1, 1e4)), (model3dSceneCamera.position.x = 0), (model3dSceneCamera.position.y = 50), (model3dSceneCamera.position.z = 200), model3dSceneCamera.lookAt(new THREE.Vector3(0, 0, 0)), (model3dScene = new THREE.Scene()) let r = new THREE.AmbientLight(16777215, 0.5) ; (model3dScene = new THREE.Scene()), model3dScene.add(r) let s = new THREE.HemisphereLight(16777215, 16777215, 0.2) s.color.setHSL(0.6, 1, 0.6), s.groundColor.setHSL(0.095, 1, 0.75), s.position.set(0, 50, 0), model3dScene.add(s) let d = new THREE.DirectionalLight(16777215, 0.9) d.color.setHSL(0.1, 1, 0.95), d.position.set(-3, 1.75, 3), d.position.multiplyScalar(30), model3dScene.add(d), model3dScene.add(model3dSceneCamera), (model3dViewCanvas = document.getElementById("model3dViewCanvas")), (model3dSceneRenderer = new THREE.WebGLRenderer({ canvas: model3dViewCanvas, antialias: !0, alpha: !0, })), model3dSceneRenderer.setPixelRatio(window.devicePixelRatio), model3dSceneRenderer.setSize(1024, 512), model3dSceneRenderer.setClearColor(0, 0), (model3dSceneRenderer.gammaInput = !0), (model3dSceneRenderer.gammaOutput = !0), renderModel3d(), (wallMaterial = new THREE.MeshPhongMaterial()), (wallMaterial.color = new THREE.Color(16777215)), (wallMaterial.specular = new THREE.Color(65280)), (wallMaterial.transparent = !0), (wallMaterial.opacity = 0.5), (wallMaterial.depthWrite = !1), (wallMaterial.side = THREE.DoubleSide), (roofMaterial = new THREE.MeshPhongMaterial()), (roofMaterial.color = new THREE.Color(16777215)), (roofMaterial.specular = new THREE.Color(16711680)), (roofMaterial.transparent = !0), (roofMaterial.opacity = 0.5), (roofMaterial.lights = !0), (roofMaterial.depthWrite = !1), (roofMaterial.side = THREE.DoubleSide), (floorMaterial = new THREE.MeshPhongMaterial()), (floorMaterial.color = new THREE.Color(986895)), (floorMaterial.specular = new THREE.Color(65535)), (floorMaterial.transparent = !0), (floorMaterial.opacity = 0.5), (floorMaterial.depthWrite = !1), (floorMaterial.side = THREE.DoubleSide) } function showModel3dView() { let e = modalModel3dFurnitureId e !== -1 && (model3dObjectRef && model3dScene.remove(model3dObjectRef), new THREE.MTLLoader() .setPath("objects/") .load(e + "/" + e + ".mtl", function (t) { ; (t.baseUrl = "objects/" + e + "/"), t.preload(), new THREE.OBJLoader() .setMaterials(t) .setPath("objects/") .load( e + "/" + e + ".obj", function (t) { try { let o = new THREE.Box3().setFromObject(t) ; (t.userData.width = o.max.x - o.min.x), (t.userData.height = o.max.y - o.min.y), (t.userData.depth = o.max.z - o.min.z) for (let a = 0; a < t.children.length; a++) { let n = o.min.x + (o.max.x - o.min.x) / 2, l = o.min.y + (o.max.y - o.min.y) / 2 - (o.max.y - o.min.y) / 2, i = o.min.z + (o.max.z - o.min.z) / 2 t.children[a].translateX(-n), t.children[a].translateY(-l), t.children[a].translateZ(-i) } ; (t.position.x = 80), (t.position.y = -(t.userData.height / 2)), (t.position.z = 0), model3dScene.add(t), (model3dObjectRef = t), renderModel3d() let r = "", s = new XMLHttpRequest() ; (s.onreadystatechange = function () { if (4 === this.readyState && 200 === this.status) { let e = this.responseText, t = e.split("\n") t.forEach(function (e) { e.startsWith("#") && (r += e + "\n") }), (document.getElementById( "modalModel3dObjHeader" ).value = r) } }), s.open("GET", "objects/" + e + "/" + e + ".obj", !0), s.send() } catch (e) { console.dir(e) } setModalModelDescription(e), $("#model3dModal").show(), hideMouseIndicators(), (model3dViewOpen = !0), (progressBar.style.display = "none") }, onProgress, onError ) })) } function onDoubleClick(e) { if ((e.preventDefault(), 0 === e.button)) { ; (mouse.x = (e.offsetX / renderer.domElement.clientWidth) * 2 - 1), (mouse.y = 2 * -(e.offsetY / renderer.domElement.clientHeight) + 1), raycaster.setFromCamera(mouse, camera) let t = raycaster.intersectObjects(Object.values(clickableObjects), !0), o = !1 t.forEach(function (e) { if (!o) { let t = "furniture" if (e.distance > 1) { if (parseInt(e.object.parent.name)) { parseInt(e.object.parent.name) o = !0 } else if (e.object.name.startsWith("floor")) { let a = parseInt(e.object.name.substring(5)) Floors[a].data.level === project.activeLayer.data.id && ((o = !0), (t = "floor")) } else if (e.object.name.startsWith("roof")) { let n = parseInt(e.object.name.substring(4)) Roofs[n].data.level === project.activeLayer.data.id && ((o = !0), (t = "roof")) } else "groundLayer" === e.object.name && ((o = !0), (t = "ground")) if ( o && ((tween = new TWEEN.Tween(controls.target) .to({ x: e.point.x, y: e.point.y, z: e.point.z }, 500) .onUpdate(render) .start()), deselectAll(), "furniture" === t) ) { let l = Furniture[e.object.parent.name] setLevel(l.data.level), (selectedItem = Furniture[e.object.parent.name]), (mouseMode = 0), selectedItem.bringToFront(), l.data.toolsRectangleInner && l.data.toolsRectangleInner.remove(), (l.rotation = 0) let i = new paper.Path.Rectangle(l.bounds) ; (l.rotation = l.data.angle), (i.data.type = "toolsRectangle"), (i.strokeColor = "#b19064"), (i.strokeWidth = 1), (i.strokeScaling = !1), (i.locked = !0), i.rotate(l.data.angle), (l.data.toolsRectangleInner = i), (i.visible = !0), (Furniture[e.object.parent.name].data.boxHelper.visible = !0), redrawGrid(), (rotateIcon.visible = !0), (resizeIcon.visible = !0), (elevateIcon.visible = !0), (heightIcon.visible = !0), (toolsGroup.position = selectedItem.bounds.center), (toolsGroup.visible = !0), toolsGroup.bringToFront(), rotateIcon.bringToFront(), resizeIcon.bringToFront(), elevateIcon.bringToFront(), heightIcon.bringToFront(), (rotateIcon.data.level = project.activeLayer.data.id), (resizeIcon.data.level = project.activeLayer.data.id), (elevateIcon.data.level = project.activeLayer.data.id), (heightIcon.data.level = project.activeLayer.data.id), (toolsGroup.data.level = project.activeLayer.data.id), (modalModel3dFurnitureId = selectedItem.data.fid), updateObjectPropertiesWindow(), render(), (focusPoint = paper.view.center), (focusPoint.zoom = paper.view.zoom), (tween = new TWEEN.Tween(focusPoint) .to( { x: selectedItem.bounds.center.x, y: selectedItem.bounds.center.y, zoom: 1, }, 500 ) .onUpdate(function () { reFocus() }) .start()) } } } }) } return !1 } function showAbout() { $(".supportEmail").text("support@companyjuice.com"), $("#aboutModal").show(), hideMouseIndicators() } function rotateCompass(e) { let t = "rotate(" + parseInt(e) + "deg)" ; (document.getElementById("compass").style.transform = t), (document.getElementById("compassHdgLbl").innerText = parseInt(e) + "°") } function enableResizeBackgroundTemplate() { deselectAll(), backgroundRaster && ((backgroundRaster.selected = !0), (selectedItem = backgroundRaster), (backgroundRaster.data.toolsRectangleInner.visible = !0), (toolsGroup.position = selectedItem.bounds.center), (toolsGroup.visible = !0), toolsGroup.bringToFront(), (resizeIcon.bounds.width = paper.view.bounds.width / 40), (resizeIcon.bounds.height = paper.view.bounds.height / 15), (resizeIcon.position = backgroundRaster.data.toolsRectangleInner.segments[3].point), (rotateIcon.visible = !1), (resizeIcon.visible = !0), resizeIcon.bringToFront(), (elevateIcon.visible = !1), (heightIcon.visible = !1), (rotateIcon.data.level = project.activeLayer.data.id), (toolsGroup.data.level = project.activeLayer.data.id), setToolMode("background"), redrawGrid()) } function openFullscreen(e) { let t = document.getElementById(e) t.requestFullscreen ? t.requestFullscreen() : t.mozRequestFullScreen ? t.mozRequestFullScreen() : t.webkitRequestFullscreen ? t.webkitRequestFullscreen() : t.msRequestFullscreen && t.msRequestFullscreen() } function openTab(e) { let t, o, a for ( o = document.getElementsByClassName("tabcontent"), t = 0; t < o.length; t++ ) o[t].style.display = "none" for ( a = document.getElementsByClassName("tablinks"), t = 0; t < a.length; t++ ) a[t].className = a[t].className.replace(" active", "") ; (document.getElementById(e + "Content").style.display = "block"), document.getElementById(e).classList.add("active") } function doCopy() { selectedItem && selectedItem.data && "furniture" === selectedItem.data.type ? ((idToCopyPaste = selectedItem.data.id), (lastPasteX = selectedItem.position.x), (lastPasteY = selectedItem.position.y)) : console.log("copy this not supproted") } function doPaste() { if (idToCopyPaste >= 0) { let e = JSON.parse(JSON.stringify(plan.furniture[idToCopyPaste])) ; (lastPasteX += 20), (lastPasteY += 20), (e.position.x = lastPasteX), (e.position.z = lastPasteY), clickableObjectsCounter++, (e.id = clickableObjectsCounter), loadFurniture(e, !0, !0) } else console.log("nothing to paste") } function updatePlan(e) { ; (plan = e), repointPlan(), relinkWallReferences(project.activeLayer.data.id), relinkRoofReferences(project.activeLayer.data.id) } function repointPlan() { Object.keys(plan.furniture).forEach(function (e) { let t = plan.furniture[e] "object" === typeof t && (clickableObjects[e] ? ((plan.furniture[e].position = clickableObjects[e].position), (plan.furniture[e].scale = clickableObjects[e].scale), (plan.furniture[e].rotation = clickableObjects[e].rotation)) : console.log("repointing plan : key " + e + " not foiund " + typeof e)) }), Object.keys(plan.walls).forEach(function (e) { let t = plan.walls[e] "object" === typeof t && t && Walls[e] && (t.wallPath = Walls[e]) }), Object.keys(plan.roofs).forEach(function (e) { let t = plan.roofs[e] "object" === typeof t && t && Roofs[e] && (t.roofPath = Roofs[e]) }), Object.keys(plan.floors).forEach(function (e) { let t = plan.floors[e] "object" === typeof t && t && Floors[e] && (t.floorPath = Floors[e]) }) } function deleteSelectedItem() { try { if (!readOnly && selectedItem && selectedItem.data.id) if ("furniture" === selectedItem.data.type) { let e = selectedItem.data.id deselectAll(), deleteFurnitureByKey(e), updatePlanHistory( plan, null, null, e, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null ), console.log("deleted furniture " + e) } else if ("wallPath" === selectedItem.data.type) { let e = selectedItem.data.id deselectAll(), deleteWallByKey(e), relinkWallReferences(project.activeLayer.data.id), updatePlanHistory( plan, null, null, null, null, null, e, null, null, null, null, null, null, null, null, null, null, null, null ), console.log("deleted wall " + e) } else if ("roofPath" === selectedItem.data.type) { let e = selectedItem.data.id deselectAll(), deleteRoofByKey(e), relinkRoofReferences(project.activeLayer.data.id), updatePlanHistory( plan, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, e ), console.log("deleted roof " + e) } else if ("floor" === selectedItem.data.type) { let e = selectedItem.data.id deselectAll(), deleteFloorByKey(e), updatePlanHistory( plan, null, null, null, null, null, null, null, null, e, null, null, null, null, null, null, null, null, null ) } else if ("dimension" === selectedItem.data.type) { let e = selectedItem.data.id deselectAll(), deleteDimensionByKey(e), updatePlanHistory( plan, null, null, null, null, null, null, null, null, null, null, null, e, null, null, null, null, null, null ), console.log("deleted dimension " + e) } else if ("text" === selectedItem.data.type) { let e = selectedItem.data.id deselectAll(), deleteTextByKey(e), updatePlanHistory( plan, null, null, null, null, null, null, null, null, null, null, null, null, null, null, e, null, null, null ), console.log("deleted text " + e) } else console.log("delete not implemented for : " + selectedItem.data.type) } catch (e) { console.log("deleteSelectedItem : " + e) } } function deleteTextByKey(e) { if (!readOnly) try { Object.keys(Texts).forEach(function (t) { let o = Texts[t] "object" === typeof o && o.data.id.toString() === e.toString() && (Texts[t].remove(), delete Texts[t]) }), delete plan.texts[e] } catch (e) { console.log("deleteTextByKey : " + e) } } function deleteDimensionByKey(e) { if (!readOnly) try { Object.keys(Dimensions).forEach(function (t) { let o = Dimensions[t] "object" === typeof o && o.id.toString() === e.toString() && (Dimensions[t].line.remove(), Dimensions[t].text.remove(), Dimensions[t].dimensionPath.remove(), delete Dimensions[t]) }), delete plan.dimensions[e] } catch (e) { console.log("deleteDimensionByKey : " + e) } } function deleteWallByKey(e) { if (!readOnly) try { ; (wallPath = null), Object.keys(Walls).forEach(function (t) { let o = Walls[t] "object" === typeof o && o.data.id.toString() === e.toString() && (Walls[t].remove(), delete Walls[t]) }), Object.keys(wallsRectangles).forEach(function (t) { let o = wallsRectangles[t] "object" === typeof o && o.data.id.toString() === e.toString() && (wallsRectangles[t].remove(), delete wallsRectangles[t]) }), Object.keys(wallsRectangles3d).forEach(function (t) { let o = wallsRectangles3d[t] "object" === typeof o && o.userData.id.toString() === e.toString() && (scene.remove(wallsRectangles3d[t]), delete wallsRectangles3d[t]) }), Object.keys(maskObjectsApplied).forEach(function (t) { "object" === typeof maskObjectsApplied[t] && maskObjectsApplied[t].userData.id.toString() === e.toString() && (scene.remove(maskObjectsApplied[t]), delete maskObjectsApplied[t]) }), delete plan.walls[e] } catch (e) { console.log("deleteWallByKey : " + e) } } function deleteRoofByKey(e) { if (!readOnly) try { ; (roofPath = null), Object.keys(Roofs).forEach(function (t) { let o = Roofs[t] "object" === typeof o && o.data.id.toString() === e.toString() && (Roofs[t].remove(), delete Roofs[t]) }), Object.keys(roofsRectangles).forEach(function (t) { let o = roofsRectangles[t] "object" === typeof o && o.data.id.toString() === e.toString() && (roofsRectangles[t].remove(), delete roofsRectangles[t]) }), Object.keys(roofsRectangles3d).forEach(function (t) { let o = roofsRectangles3d[t] "object" === typeof o && o.userData.id.toString() === e.toString() && (scene.remove(roofsRectangles3d[t]), delete roofsRectangles3d[t]) }), Object.keys(maskObjectsAppliedRoof).forEach(function (t) { "object" === typeof maskObjectsAppliedRoof[t] && maskObjectsAppliedRoof[t].userData.id.toString() === e.toString() && (scene.remove(maskObjectsAppliedRoof[t]), delete maskObjectsAppliedRoof[t]) }), delete plan.roofs[e] } catch (e) { console.log("deleteRoofByKey : " + e) } } function deleteFloorByKey(e) { if (!readOnly) try { scene.remove(Floors3d[e]), delete Floors3d[e], Floors[e].remove(), delete Floors[e], delete plan.floors[e], deselectAll(), render() } catch (e) { console.log("deleteFurnitureByKey : " + e) } } function deleteFurnitureByKey(e) { if (!readOnly) try { scene.remove(maskObjects[e]), Object.keys(maskObjects).forEach(function (t) { let o = maskObjects[t] "object" === typeof o && o.name.toString() === "mask" + e.toString() && delete maskObjects[t] }), scene.remove(clickableObjects[e]), Object.keys(clickableObjects).forEach(function (t) { let o = clickableObjects[t] "object" === typeof o && o.name.toString() === e.toString() && delete clickableObjects[t] }), Object.keys(Furniture).forEach(function (t) { let o = Furniture[t] "object" === typeof o && o.data.id.toString() === e.toString() && (Furniture[t].data.toolsRectangleInner && Furniture[t].data.toolsRectangleInner.remove(), Furniture[t].remove(), delete Furniture[t]) }), delete plan.furniture[e], deselectAll(), render() } catch (e) { console.log("deleteFurnitureByKey : " + e) } } function updatePlanHistory( e, t, o, a, n, l, i, r, s, d, c, u, p, m, g, y, f, h, v ) { ; (e.furnitureAddedKey = t), (e.furnitureDirtyKey = o), (e.furnitureDeletedKey = a), (e.wallAddedKey = n), (e.wallDirtyKey = l), (e.wallDeletedKey = i), (e.roofAddedKey = f), (e.roofDirtyKey = h), (e.roofDeletedKey = v), (e.floorAddedKey = r), (e.floorDirtyKey = s), (e.floorDeletedKey = d), (e.dimensionAddedKey = c), (e.dimensionEditedKey = u), (e.dimensionDeletedKey = p), (e.textAddedKey = m), (e.textEditedKey = g), (e.textDeletedKey = y), (e.wallDiffuse = wallMaterial.color), (e.wallOpacity = wallMaterial.opacity), (e.wallSpecular = wallMaterial.specular), (e.roofDiffuse = roofMaterial.color), (e.roofOpacity = roofMaterial.opacity), (e.roofSpecular = roofMaterial.specular), (e.floorDiffuse = floorMaterial.color), (e.floorOpacity = floorMaterial.opacity), (e.floorSpecular = floorMaterial.specular), (e.groundDiffuse = groundMat.color.getHexString()), (e.groundOpacity = groundMat.opacity), (e.groundSpecular = groundMat.specular.getHexString()), (e.depthWrite = document.getElementById("depthWriteMode").checked), (e.sortObjects = document.getElementById("sortObjectsMode").checked), (e.compassHdg = document.getElementById("compassHdg").value), (e.azimuth = azimuth), (e.inclination = inclination), planHistoryPosition++, (planHistory.length = planHistoryPosition + 1), (planHistory[planHistoryPosition] = JSON.stringify(e)) try { ; (document.getElementById("shareLinkUrl").value = ""), (document.getElementById("shareLinkUrl3d").value = ""), (document.getElementById("shareLinkUrlPlan").value = ""), localStorage.setItem("plan", JSON.stringify(e)) } catch (e) { console.log("creating hash : " + e) } } function createThumbForHistory() { try