threed-garden
Version:
ThreeD Garden: WebGL 3D Environment Interface for Next.JS React TypeScript Three.JS React-Three Physics, 2D Paper.JS; APIs: Apollo GraphQL, WordPress; CSS: Tailwind, Radix-UI; Libraries: FarmBot 3D; AI: OpenAI, DeepSeek
1,386 lines (1,381 loc) • 378 kB
JavaScript
"use strict"
function addVerticalGuide() {
var e = paper.view.viewToProject(
new paper.Point(
event.pageX - planView.offsetLeft,
event.pageY - planView.offsetTop
)
),
t = new paper.Point(e.x, -100),
o = new paper.Point(e.x, 100),
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() {
var 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.debug("removeVerticalGuide " + e)
}
}
function removeHorizontalGuide() {
try {
selectedGuideId > 0 &&
(horizontalGuides[selectedGuideId].remove(),
delete horizontalGuides[selectedGuideId],
delete plan.horizontalGuides[selectedGuideId])
} catch (e) {
console.debug("removeHorizontalGuide " + e)
}
}
function resizePlanView() {
if ("3dView" != UILayout) {
var 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))
var 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)
var 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)
var 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)
var 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())
var r = new THREE.AmbientLight(16777215, 0.5)
; (model3dScene = new THREE.Scene()), model3dScene.add(r)
var 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)
var 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() {
var e = modalModel3dThreedId
e !== -1 &&
(model3dObjectRef && model3dScene.remove(model3dObjectRef),
new THREE.MTLLoader()
.setCrossOrigin('anonymous')
.setPath(objectsURL + "objects/")
.load(e + ".mtl", function (t) {
; (t.baseUrl = objectsURL + "objects/"),
t.preload(),
new THREE.OBJLoader()
.setMaterials(t)
.setPath(objectsURL + "objects/")
.load(
e + ".obj",
function (t) {
try {
var 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 (var a = 0; a < t.children.length; a++) {
var 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()
var r = "",
s = new XMLHttpRequest()
; (s.onreadystatechange = function () {
if (4 == this.readyState && 200 == this.status) {
var e = this.responseText,
t = e.split("\n")
t.forEach(function (e) {
e.startsWith("#") && (r += e + "\n")
}),
(document.getElementById(
"modalModel3dObjHeader"
).value = r)
}
}),
s.open("GET", objectsURL + "objects/" + 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)
var t = raycaster.intersectObjects(Object.values(clickableObjects), !0),
o = !1
t.forEach(function (e) {
if (!o) {
var t = "threed"
if (e.distance > 1) {
if (parseInt(e.object.parent.name)) {
parseInt(e.object.parent.name)
o = !0
} else if (e.object.name.startsWith("floor")) {
var 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")) {
var 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(),
"threed" === t)
) {
var l = Threed[e.object.parent.name]
setLevel(l.data.level),
(selectedItem = Threed[e.object.parent.name]),
(mouseMode = 0),
selectedItem.bringToFront(),
l.data.toolsRectangleInner && l.data.toolsRectangleInner.remove(),
(l.rotation = 0)
var 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),
(Threed[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),
(modalModel3dThreedId = selectedItem.data.name),
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) {
var 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) {
var t = document.getElementById(e)
t.requestFullscreen
? t.requestFullscreen()
: t.mozRequestFullScreen
? t.mozRequestFullScreen()
: t.webkitRequestFullscreen
? t.webkitRequestFullscreen()
: t.msRequestFullscreen && t.msRequestFullscreen()
}
function openTab(e) {
var 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 && "threed" === selectedItem.data.type
? ((idToCopyPaste = selectedItem.data.id),
(lastPasteX = selectedItem.position.x),
(lastPasteY = selectedItem.position.y))
: console.debug("copy this not supproted")
}
function doPaste() {
if (idToCopyPaste >= 0) {
var e = JSON.parse(JSON.stringify(plan.threed[idToCopyPaste]))
; (lastPasteX += 20),
(lastPasteY += 20),
(e.position.x = lastPasteX),
(e.position.z = lastPasteY),
clickableObjectsCounter++,
(e.id = clickableObjectsCounter),
loadThreed(e, !0, !0)
} else console.debug("nothing to paste")
}
function doUndo() {
if (planHistoryPosition > 0) {
planHistoryPosition--, deselectAll()
var e = JSON.parse(planHistory[planHistoryPosition])
plan.threedAddedKey
? (deleteThreedByKey(plan.threedAddedKey), updatePlan(e))
: plan.threedDirtyKey
? (editThreedByKey(e.threed[plan.threedDirtyKey]), updatePlan(e))
: plan.threedDeletedKey
? (loadThreed(e.threed[plan.threedDeletedKey], !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.debug("nothing to undo"))
}
}
function doRedo() {
if (planHistory.length > planHistoryPosition + 1) {
planHistoryPosition++, deselectAll()
var e = JSON.parse(planHistory[planHistoryPosition])
if (e.threedAddedKey)
loadThreed(e.threed[e.threedAddedKey], !1, !1), updatePlan(e)
else if (e.threedDirtyKey)
editThreedByKey(e.threed[e.threedDirtyKey]), updatePlan(e)
else if (e.threedDeletedKey)
deleteThreedByKey(e.threedDeletedKey), 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])
var 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.debug("nothing to redo"))
}
}
function updatePlan(e) {
; (plan = e),
repointPlan(),
relinkWallReferences(project.activeLayer.data.id),
relinkRoofReferences(project.activeLayer.data.id)
}
function repointPlan() {
Object.keys(plan.threed).forEach(function (e) {
var t = plan.threed[e]
"object" == typeof t &&
(clickableObjects[e]
? ((plan.threed[e].position = clickableObjects[e].position),
(plan.threed[e].scale = clickableObjects[e].scale),
(plan.threed[e].rotation = clickableObjects[e].rotation))
: console.debug("repointing plan : key " + e + " not foiund " + typeof e))
}),
Object.keys(plan.walls).forEach(function (e) {
var t = plan.walls[e]
"object" == typeof t && t && Walls[e] && (t.wallPath = Walls[e])
}),
Object.keys(plan.roofs).forEach(function (e) {
var t = plan.roofs[e]
"object" == typeof t && t && Roofs[e] && (t.roofPath = Roofs[e])
}),
Object.keys(plan.floors).forEach(function (e) {
var t = plan.floors[e]
"object" == typeof t && t && Floors[e] && (t.floorPath = Floors[e])
})
}
function deleteSelectedItem() {
try {
if (!readOnly && selectedItem && selectedItem.data.id)
if ("threed" === selectedItem.data.type) {
var e = selectedItem.data.id
deselectAll(),
deleteThreedByKey(e),
updatePlanHistory(
plan,
null,
null,
e,
null,
null,
null,
null,
null,
null,
null,
null,
null,
null,
null,
null,
null,
null,
null
),
console.debug("deleted threed " + e)
} else if ("wallPath" === selectedItem.data.type) {
var 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.debug("deleted wall " + e)
} else if ("roofPath" === selectedItem.data.type) {
var 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.debug("deleted roof " + e)
} else if ("floor" === selectedItem.data.type) {
var 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) {
var 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.debug("deleted dimension " + e)
} else if ("text" === selectedItem.data.type) {
var 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.debug("deleted text " + e)
} else
console.debug("delete not implemented for : " + selectedItem.data.type)
} catch (e) {
console.debug("deleteSelectedItem : " + e)
}
}
function deleteTextByKey(e) {
if (!readOnly)
try {
Object.keys(Texts).forEach(function (t) {
var 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.debug("deleteTextByKey : " + e)
}
}
function deleteDimensionByKey(e) {
if (!readOnly)
try {
Object.keys(Dimensions).forEach(function (t) {
var 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.debug("deleteDimensionByKey : " + e)
}
}
function deleteWallByKey(e) {
if (!readOnly)
try {
; (wallPath = null),
Object.keys(Walls).forEach(function (t) {
var o = Walls[t]
"object" == typeof o &&
o.data.id.toString() == e.toString() &&
(Walls[t].remove(), delete Walls[t])
}),
Object.keys(wallsRectangles).forEach(function (t) {
var o = wallsRectangles[t]
"object" == typeof o &&
o.data.id.toString() === e.toString() &&
(wallsRectangles[t].remove(), delete wallsRectangles[t])
}),
Object.keys(wallsRectangles3d).forEach(function (t) {
var 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.debug("deleteWallByKey : " + e)
}
}
function deleteRoofByKey(e) {
if (!readOnly)
try {
; (roofPath = null),
Object.keys(Roofs).forEach(function (t) {
var o = Roofs[t]
"object" == typeof o &&
o.data.id.toString() == e.toString() &&
(Roofs[t].remove(), delete Roofs[t])
}),
Object.keys(roofsRectangles).forEach(function (t) {
var o = roofsRectangles[t]
"object" == typeof o &&
o.data.id.toString() === e.toString() &&
(roofsRectangles[t].remove(), delete roofsRectangles[t])
}),
Object.keys(roofsRectangles3d).forEach(function (t) {
var 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.debug("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.debug("deleteThreedByKey : " + e)
}
}
function deleteThreedByKey(e) {
if (!readOnly)
try {
scene.remove(maskObjects[e]),
Object.keys(maskObjects).forEach(function (t) {
var 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) {
var o = clickableObjects[t]
"object" == typeof o &&
o.name.toString() === e.toString() &&
delete clickableObjects[t]
}),
Object.keys(Threed).forEach(function (t) {
var o = Threed[t]
"object" == typeof o &&
o.data.id.toString() == e.toString() &&
(Threed[t].data.toolsRectangleInner &&
Threed[t].data.toolsRectangleInner.remove(),
Threed[t].remove(),
delete Threed[t])
}),
delete plan.threed[e],
deselectAll(),
render()
} catch (e) {
console.debug("deleteThreedByKey : " + e)
}
}
function updatePlanHistory(
e,
t,
o,
a,
n,
l,
i,
r,
s,
d,
c,
u,
p,
m,
g,
y,
f,
h,
v
) {
; (e.threedAddedKey = t),
(e.threedDirtyKey = o),
(e.threedDeletedKey = 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.debug("creating hash : " + e)
}
}
function createThumbForHistory() {
try {
hideMouseIndicators()
var e = 16 / 9,
t = getHeightFromRatio(360, e),
o = getWidthFromRatio(t, e),
a = document.createElement("canvas")
; (a.width = o), (a.height = t)
var n = a.getContext("2d")
n.clearRect(0, 0, o, t), n.drawImage(renderer.domElement, 0, 0, o, t)
var l = a.toDataURL("image/png", 0.1)
; (plan.thumb = l), showMouseIndicators()
} catch (e) {
console.debug("failed to create thumb. " + e)
}
}
function getHeightFromRatio(e, t) {
var o = e / Math.sqrt(Math.pow(t, 2) + 1)
return Math.round(o)
}
function getWidthFromRatio(e, t) {
var o = e / Math.sqrt(1 / (Math.pow(t, 2) + 1))
return Math.round(o)
}
function savePlan() {
try {
createThumbForHistory()
var e = document.createElement("a")
var _ts = new Date(Date.now()).toISOString()
_ts = _ts.replaceAll(':', '-').replaceAll(' ', '-')
; (e.download = "threed-plan-" + _ts + ".threed"),
(e.innerHTML = "Download File"),
(e.href = window.URL.createObjectURL(
new Blob([JSON.stringify(plan)], { type: "text/plain" })
)),
(e.onclick = destroyClickedElement),
(e.style.display = "none"),
document.body.appendChild(e),
e.click()
} catch (e) {
console.dir(e)
}
}
function destroyClickedElement(e) {
document.body.removeChild(e.target)
}
function loadFileAsText(e) {
try {
var t = e.target,
o = new FileReader()
; (o.onload = function () {
var e = o.result
setNewPlan(),
(loadingProgressTxt = "Plan decoding\n" + loadingProgressTxt),
(document.getElementById("modalLoadingDataInfo").innerHTML =
loadingProgressTxt),
drawPlan(JSON.parse(e)),
clearFileInput(document.getElementById("file"))
}),
(loadingProgressTxt = "Loading Saved Plan"),
(document.getElementById("modalLoadingDataInfo").innerHTML =
loadingProgressTxt),
$("#loadingModal").show(),
hideMouseIndicators(),
o.readAsText(t.files[0])
} catch (e) {
console.debug("loadFileAsText : " + e)
}
}
function clearFileInput(e) {
try {
e.value = null
} catch (e) { }
e.value && e.parentNode.replaceChild(e.cloneNode(!0), e)
}
function resetPlan() {
try {
Object.keys(Texts).forEach(function (e) {
var t = Texts[e]
"object" == typeof t && deleteTextByKey(e)
}),
(textIdCounter = 0)
} catch (e) {
console.debug("resetPlan : 1 : " + e)
}
try {
Object.keys(Dimensions).forEach(function (e) {
var t = Dimensions[e]
"object" == typeof t && deleteDimensionByKey(e)
}),
(dimensionIdCounter = 0)
} catch (e) {
console.debug("resetPlan : 2 : " + e)
}
try {
Object.keys(Threed).forEach(function (e) {
var t = Threed[e]
"object" == typeof t &&
(Threed[e].data.toolsRectangleInner &&
Threed[e].data.toolsRectangleInner.remove(),
Threed[e].remove(),
delete Threed[e])
})
} catch (e) {
console.debug("resetPlan : 3 : " + e)
}
try {
Object.keys(Floors).forEach(function (e) {
var t = Floors[e]
"object" == typeof t && (Floors[e].remove(), delete Floors[e])
}),
Object.keys(Floors3d).forEach(function (e) {
var t = Floors3d[e]
"object" == typeof t && (scene.remove(Floors3d[e]), delete Floors3d[e])
}),
(floorIdCounter = 0)
} catch (e) {
console.debug("resetPlan : 4 : " + e)
}
try {
Object.keys(Walls).forEach(function (e) {
var t = Walls[e]
"object" == typeof t && (Walls[e].remove(), delete Walls[e])
})
for (var e in wallsRectangles) wallsRectangles[e].remove()
} catch (e) {
console.debug("resetPlan : 5 : " + e)
}
try {
Object.keys(wallsRectangles3d).forEach(function (e) {
var t = wallsRectangles3d[e]
"object" == typeof t && scene.remove(wallsRectangles3d[e])
})
} catch (e) {
console.debug("resetPlan : 6 : " + e)
}
try {
Object.keys(Roofs).forEach(function (e) {
"object" == typeof Roofs[e] && (Roofs[e].remove(), delete Roofs[e])
})
for (var t in roofsRectangles) roofsRectangles[t].remove()
} catch (e) {
console.debug("resetPlan : 5.1 : " + e)
}
try {
Object.keys(roofsRectangles3d).forEach(function (e) {
"object" == typeof roofsRectangles3d[e] &&
scene.remove(roofsRectangles3d[e])
})
} catch (e) {
console.debug("resetPlan : 6.1 : " + e)
}
try {
Object.keys(maskObjectsApplied).forEach(function (e) {
"object" == typeof maskObjectsApplied[e] &&
scene.remove(maskObjectsApplied[e])
})
} catch (e) {
console.debug("resetPlan : 6.5 : " + e)
}
try {
Object.keys(maskObjectsAppliedRoof).forEach(function (e) {
"object" == typeof maskObjectsAppliedRoof[e] &&
scene.remove(maskObjectsAppliedRoof[e])
})
} catch (e) {
console.debug("resetPlan : 6.6 : " + e)
}
try {
Object.keys(clickableObjects).forEach(function (e) {
var t = clickableObjects[e]
"object" == typeof t &&
"groundLayer" != t.name &&
(scene.remove(clickableObjects[e]), delete clickableObjects[e])
})
} catch (e) {
console.debug("resetPlan : 7 : " + e)
}
try {
Object.keys(maskObjects).forEach(function (e) {
var t = maskObjects[e]
"object" == typeof t &&
(scene.remove(maskObjects[e]), delete maskObjects[e])
}),
(clickableObjectsCounter = 0)
} catch (e) {
console.debug("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.debug("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.debug("resetPlan : 10 : " + e)
}
try {
; (threedToLoadCount = 0),
(loadedThreedCount = 0),
(wallIdCounter = 0),
(wallsRectangles = {}),
(wallsRectangles3d = {}),
(maskObjectsApplied = {}),
(maskObjectsAppliedRoof = {}),
(roofIdCounter = 0),
(roofsRectangles = {}),
(roofsRectangles3d = {}),
(Threed = {}),
(Walls = {}),
(Roofs = {}),
(Floors = {}),
(Floors3d = {}),
(Dimensions = {}),
(Texts = {}),
(plan = {}),
(plan.threed = {}),
(plan.walls = {}),
(plan.roofs = {}),
(plan.levels = {}),
(plan.levels[0] = { id: 0, height: 0 }),
(plan.floors = {}),
(plan.dimensions = {}),
(plan.texts = {}),
(plan.verticalGuides = {}),
(plan.horizontalGuides = {}),
(plan.threedAddedKey = null),
(plan.threedDirtyKey = null),
(plan.threedDeletedKey = 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.debug("resetPlan : 11 : " + e)
}
try {
otherLayerWallsRasters &&
otherLayerWallsRasters.length > 0 &&
(otherLayerWallsRasters.forEach(function (e) {
e.remove()
}),
(otherLayerWallsRasters = [])),
otherLayerThreedRasters &&
otherLayerThreedRasters.length > 0 &&
(otherLayerThreedRasters.forEach(function (e) {
e.remove()
}),
(otherLayerThreedRasters = []))
} catch (e) {
console.debug("resetPlan : 12 : " + e)
}
try {
levelButtons || addNewLevel("0"), setLevel("0")
} catch (e) {
console.debug("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.debug("resetPlan : 14 : " + e)