// 3D Building Designer created by ON THE Z, Inc. // Visit onthez.com to find out about licensing a 3D interactive web app, designer, or configurator for your website users. var e = function(e) { for (var t in dat.controllers) dat.controllers.hasOwnProperty(t) && e(dat.controllers[t]) }, t = function(e) { return e ? this.__li.setAttribute("id", e) : this.__li.removeAttribute("id"), this }, a = function(e) { return e ? this.__li.setAttribute("class", e) : this.__li.removeAttribute("class"), this }; function o(e, t, a) { this.categories = a || !1, this.name = e, this.hex = t, this.id = this.name.replace(/[^a-zA-Z]/gi, ""); a = new THREE.Color(this.hex); this.r = Math.round(255 * a.r), this.g = Math.round(255 * a.g), this.b = Math.round(255 * a.b) } e(function(e) { e.prototype.hasOwnProperty("id") || (e.prototype.id = t) }), e(function(e) { e.prototype.hasOwnProperty("class") || (e.prototype.class = a) }), Detector.webgl || Detector.addGetWebGLMessage(); var r, m, w, h, ee = "", F = [new o("Galvalume", "#888888", ["roof", "wall", "trim", "soffit", "interior", "wainscot", "other"]), new o("Black", "#090606", ["roof", "wall", "trim", "soffit", "interior", "wainscot", "other"]), new o("Charcoal", "#434343", ["roof", "wall", "trim", "soffit", "interior", "wainscot", "other"]), new o("Taupe", "#7a7d6a", ["roof", "wall", "trim", "soffit", "interior", "wainscot", "other"]), new o("Gray", "#a0a298", ["roof", "wall", "trim", "soffit", "interior", "wainscot", "other"]), new o("Alamo", "#e2eae7", ["roof", "wall", "trim", "soffit", "interior", "wainscot", "other"]), new o("Briliant Arctic", "#fcffff", ["roof", "wall", "trim", "soffit", "interior", "wainscot", "other"]), new o("Forest", "#2a492f", ["roof", "wall", "trim", "soffit", "interior", "wainscot", "other"]), new o("Crimson", "#a31116", ["roof", "wall", "trim", "soffit", "interior", "wainscot", "other"]), new o("Rustic", "#701f1c", ["roof", "wall", "trim", "soffit", "interior", "wainscot", "other"]), new o("Burgundy", "#31151e", ["roof", "wall", "trim", "soffit", "interior", "wainscot", "other"]), new o("Gallery", "#153351", ["roof", "wall", "trim", "soffit", "interior", "wainscot", "other"]), new o("Ivory", "#f4e0bd", ["roof", "wall", "trim", "soffit", "interior", "wainscot", "other"]), new o("Light Stone", "#c6c8aa", ["roof", "wall", "trim", "soffit", "interior", "wainscot", "other"]), new o("Tan", "#a08b67", ["roof", "wall", "trim", "soffit", "interior", "wainscot", "other"]), new o("Brown", "#3e291f", ["roof", "wall", "trim", "soffit", "interior", "wainscot", "other"]), new o("Burnished Slate", "#363027", ["roof", "wall", "trim", "soffit", "interior", "wainscot", "other"])]; let R = !1, B = !1, v, ia, M, S, E, W, P, H, k, c, G = !0, te, N, L, C, j, na, z, ra, I, ae, oe, ie, ne, _, re, se, le, he, ce, de, d, p, g, u, b, y, f, pe, sa, la, me, ge, ue, Te, be, q, A, V, U, Q, X, Y, n = [null, null, null, null, null, null], ye = !1, fe = "standard", we = 0, T = null, ve = null, Ee, Pe, ha, pa, ma, ga, ua, Ta, ba, ya, fa, wa, va, De, Me, We, xe, Oe, Re, Be, Se, He, Ne, Le, Ce, je, ze, Ie, Fe, ke, Ge, $e, _e, qe, Ae, Ve, Ue, Qe, Xe, Ye, Ze, Je, Ke, et, tt, at, ot, it, nt, rt, st, lt, ht, ct, dt, pt, mt, gt, ut, Tt, bt = !1, yt = !1, ft = !1, wt = !1, vt = 6, Et = 3 * vt, ca, Pt, Dt, Mt, Wt, xt, Ot, Rt, Bt; var Ea, Z = !1, St = !1, Ht = !1, Nt = !1, Lt = !1, Ct = !1, jt = !1, zt = !1, It = !1, Ft = 0, kt = 0, Gt = 0, $t = 0, _t = 0, qt = 0, At = new THREE.Color(11573622), Vt = new THREE.Color(11508086), Ut = new THREE.Color(7895160), Qt = new THREE.Color(4861486); let Xt = window.location.href, Yt = new URL(Xt), Zt = document.currentScript.getAttribute("data-version"), Jt = Yt.pathname.replace(/\/+$/, ""), D = "", Kt = Yt.searchParams.get("id"), ea = Yt.searchParams.get("dt"), ta = (Z = null !== Kt && null !== ea, r = document.currentScript.hasAttribute("data-status") ? document.currentScript.getAttribute("data-status") : "live", document.currentScript.hasAttribute("data-ref") && (m = document.currentScript.getAttribute("data-ref")), w = !!document.currentScript.hasAttribute("data-color-visualizer") && document.currentScript.getAttribute("data-color-visualizer"), document.currentScript.getAttribute("data-company-name")), aa = document.currentScript.getAttribute("data-tool-name"), oa = (!Z && w && (Z = !0), "US"), Pa = (document.currentScript.hasAttribute("data-localization") && (oa = document.currentScript.getAttribute("data-localization")), { US: { Color: "Color", color: "color", Colors: "Colors", colors: "colors" }, CA: { Color: "Colour", color: "colour", Colors: "Colours", colors: "colours" } }), Da = { 1234: { object: "directions-1234.lwo" }, ABCD: { object: "directions-abcd.lwo", N: { name: "End Wall B", short: "EWB", abbr: "B" }, S: { name: "End Wall D", short: "EWD", abbr: "D" }, E: { name: "Side Wall C", short: "SWC", abbr: "C" }, W: { name: "Side Wall A", short: "SWA", abbr: "A" }, NE: { name: "Corner BC", short: "BC", abbr: "BC" }, NW: { name: "Corner AB", short: "AB", abbr: "AB" }, SE: { name: "Corner CD", short: "CD", abbr: "CD" }, SW: { name: "Corner AD", short: "AD", abbr: "AD" } }, "Front Back Left Right": { object: "directions-frontBackLeftRight.lwo" }, "Front End Wall": { object: "directions-frontEndWall.lwo", N: { name: "Front End Wall", short: "Front", abbr: "F" }, S: { name: "Back End Wall", short: "Back", abbr: "B" }, E: { name: "Left Side Wall", short: "Left", abbr: "L" }, W: { name: "Right Side Wall", short: "Right", abbr: "R" }, NE: { name: "Front Left Corner", short: "Front Left", abbr: "FL" }, NW: { name: "Front Right Corner", short: "Front Right", abbr: "FR" }, SE: { name: "Back Left Corner", short: "Back Left", abbr: "BL" }, SW: { name: "Back Right Corner", short: "Back Right", abbr: "BR" } }, "Front Side Wall": { object: "directions-frontSideWall.lwo", N: { name: "Right End Wall", short: "Right", abbr: "R" }, S: { name: "Left End Wall", short: "Left", abbr: "L" }, E: { name: "Front Side Wall", short: "Front", abbr: "F" }, W: { name: "Back Side Wall", short: "Back", abbr: "B" }, NE: { name: "Front Right Corner", short: "Front Right", abbr: "FR" }, NW: { name: "Back Right Corner", short: "Back Right", abbr: "BR" }, SE: { name: "Front Left Corner", short: "Front Left", abbr: "FL" }, SW: { name: "Back Left Corner", short: "Back Left", abbr: "BL" } }, "Front Side Wall Reversed": { object: "directions-frontSideWallReversed.lwo", N: { name: "Left End Wall", short: "Left", abbr: "L" }, S: { name: "Right End Wall", short: "Right", abbr: "R" }, E: { name: "Back Side Wall", short: "Back", abbr: "B" }, W: { name: "Front Side Wall", short: "Front", abbr: "F" }, NE: { name: "Back Left Corner", short: "Back Left", abbr: "BL" }, NW: { name: "Front Left Corner", short: "Front Left", abbr: "FL" }, SE: { name: "Back Right Corner", short: "Back Right", abbr: "BR" }, SW: { name: "Front Right Corner", short: "Front Right", abbr: "FR" } }, "North Front": { object: "directions-northFront.lwo", N: { name: "North End Wall", short: "North", abbr: "N" }, S: { name: "South End Wall", short: "South", abbr: "S" }, E: { name: "East Side Wall", short: "East", abbr: "E" }, W: { name: "West Side Wall", short: "West", abbr: "W" }, NE: { name: "Northeast Corner", short: "Northeast", abbr: "NE" }, NW: { name: "Northwest Corner", short: "Northwest", abbr: "NW" }, SE: { name: "Southeast Corner", short: "Southeast", abbr: "SE" }, SW: { name: "Southwest Corner", short: "Southwest", abbr: "SW" } }, "South Front": { object: "directions-southFront.lwo", N: { name: "South End Wall", short: "South", abbr: "S" }, S: { name: "North End Wall", short: "North", abbr: "N" }, E: { name: "West Side Wall", short: "West", abbr: "W" }, W: { name: "East Side Wall", short: "East", abbr: "E" }, NE: { name: "Southwest Corner", short: "Southwest", abbr: "SW" }, NW: { name: "Southeast Corner", short: "Southeast", abbr: "SE" }, SE: { name: "Northwest Corner", short: "Northwest", abbr: "NW" }, SW: { name: "Northeast Corner", short: "Northeast", abbr: "NE" } }, "Front Side Wall A": { object: "directions-frontSideWallA.lwo", N: { name: "Left End Wall B", short: "Left B", abbr: "L" }, S: { name: "Right End Wall D", short: "Right D", abbr: "R" }, E: { name: "Back Side Wall C", short: "Back C", abbr: "B" }, W: { name: "Front Side Wall A", short: "Front A", abbr: "F" }, NE: { name: "Back Left Corner", short: "Back Left", abbr: "BL" }, NW: { name: "Front Left Corner", short: "Front Left", abbr: "FL" }, SE: { name: "Back Right Corner", short: "Back Right", abbr: "BR" }, SW: { name: "Front Right Corner", short: "Front Right", abbr: "FR" } } }, J = Da["Front End Wall"]; k = new dat.GUI({ autoplace: !1, width: 300, hideable: !1 }); var Ma = new ro, Wa = new eo, xa = new ao; function Oa() { this.width = 40, this.depth = 60, this.height = 12, this.roofType = "Gabled", this.asymmetrical = 0, this.roofPitch = 3, this.frameType = "Open Web Truss", this.ground = "Grass Plains", this.maxTrussSpacing = 14, this.maxPostSpacing = 14, this.maxLeantoPostSpacing = this.maxPostSpacing, this.secondaryMembers = "Steel", this.frameConstruction = "Open Web Tapered", this.girtSpacing = 2, this.flushGirts = !1, this.standingGirts = !0, this.girtThickness = 2.5 / 12, this.purlinSpacing = 2, this.flushPurlins = !1, this.standingPurlins = !0, this.purlinThickness = 3.5 / 12, this.logoPlacement = "Wall", this.logoShape = "Oval", this.hideWalls = 0, this.allowLeanToCeilingHeight = !1, this.roofColor = "Burnished Slate", this.wallColor = "Light Stone", this.trimColor = "Brown", this.soffitColor = "Gray", this.wainscotColor = "Charcoal", this.boardAndBattenWoodenBarnSiding = !1, this.enclosedN = !0, this.enclosedS = !0, this.enclosedE = !0, this.enclosedW = !0, this.wainscot1 = !1, this.wainscot2 = !1, this.wainscot3 = !1, this.wainscot4 = !1, this.wainscotHeight = 3, this.baseTrim = !1, this.gableFront = 0, this.gableBack = 0, this.eaveL = 0, this.eavePitchL = 4, this.eaveSoffitL = !1, this.eaveR = 0, this.eavePitchR = 4, this.eaveSoffitR = !1, this.boxedOverhangs = !1, this.cupola18in = 0, this.cupola2 = 0, this.cupola3 = 0, this.cupola4 = 0, this.cupolaWindow18in = 0, this.cupolaWindow2 = 0, this.cupolaWindow3 = 0, this.cupolaWindow4 = 0, this.eaveLightsEast = !1, this.eaveLightsWest = !1, this.eaveLightWidth = 48, this.eaveLightHeight = 24, this.eaveLightPanelsEast = !1, this.eaveLightPanelsWest = !1, this.weatherVane = "None", this.leanTo1 = !1, this.leanTo1CutL = 0, this.leanTo1CutR = 0, this.leanTo1Drop = 1, this.leanTo1Length = 8, this.leanTo1Depth = 6, this.leanTo1Height = 8, this.leanTo1Pitch = 4, this.leanTo1Enclosed = !0, this.leanTo1Walls = "Fully Enclosed", this.leanTo2 = !1, this.leanTo2CutL = 0, this.leanTo2CutR = 0, this.leanTo2Drop = 1, this.leanTo2Length = 8, this.leanTo2Depth = 6, this.leanTo2Height = 8, this.leanTo2Pitch = 4, this.leanTo2Enclosed = !0, this.leanTo2Walls = "Fully Enclosed", this.leanTo3 = !1, this.leanTo3CutL = 0, this.leanTo3CutR = 0, this.leanTo3Drop = 1, this.leanTo3Length = 8, this.leanTo3Depth = 6, this.leanTo3Height = 8, this.leanTo3Pitch = 4, this.leanTo3Enclosed = !0, this.leanTo3Walls = "Fully Enclosed", this.leanTo4 = !1, this.leanTo4CutL = 0, this.leanTo4CutR = 0, this.leanTo4Drop = 1, this.leanTo4Length = 8, this.leanTo4Depth = 6, this.leanTo4Height = 8, this.leanTo4Pitch = 4, this.leanTo4Enclosed = !0, this.leanTo4Walls = "Fully Enclosed", this.maxPorchPostSpacing = this.maxPostSpacing, this.porchN = !1, this.porchS = !1, this.porchE = !1, this.porchW = !1, this.porchWrapNW = !1, this.porchWrapNE = !1, this.porchWrapSE = !1, this.porchWrapSW = !1, this.porchWrapHipNW = !1, this.porchWrapHipNE = !1, this.porchWrapHipSE = !1, this.porchWrapHipSW = !1, this.coveredGableExtensionN = !1, this.coveredGableExtensionNCutL = 5, this.coveredGableExtensionNCutR = 5, this.coveredGableExtensionNHeight = 8, this.coveredGableExtensionNDepth = 6, this.coveredGableExtensionNPitch = 4, this.coveredGableExtensionNEnclosed = !1, this.coveredGableExtensionNStructure = "Wood", this.coveredGableExtensionS = !1, this.coveredGableExtensionSCutL = 5, this.coveredGableExtensionSCutR = 5, this.coveredGableExtensionSHeight = 8, this.coveredGableExtensionSDepth = 6, this.coveredGableExtensionSPitch = 4, this.coveredGableExtensionSEnclosed = !1, this.coveredGableExtensionSStructure = "Wood", this.coveredGableExtensionE = !1, this.coveredGableExtensionECutL = 5, this.coveredGableExtensionECutR = 5, this.coveredGableExtensionEHeight = 8, this.coveredGableExtensionEDepth = 6, this.coveredGableExtensionEPitch = 4, this.coveredGableExtensionEEnclosed = !1, this.coveredGableExtensionEStructure = "Wood", this.coveredGableExtensionW = !1, this.coveredGableExtensionWCutL = 5, this.coveredGableExtensionWCutR = 5, this.coveredGableExtensionWHeight = 8, this.coveredGableExtensionWDepth = 6, this.coveredGableExtensionWPitch = 4, this.coveredGableExtensionWEnclosed = !1, this.coveredGableExtensionWStructure = "Wood", this.windowPictureQty = 0, this.windowSliderQty = 0, this.windowDoubleHungQty = 0, this.windowSingleHungQty = 0, this.windowTwinsetQty = 0, this.windowCasementQty = 0, this.windowSlopeLeftQty = 0, this.windowSlopeRightQty = 0, this.windowAwningQty = 0, this.windowHopperQty = 0, this.windowFramedOpeningQty = 0, this.louverQty = 0, this.mansardQty = 0, this.mansardHipQty = 0, this.walkDoorSolidQty = 0, this.walkDoorSolidDoubleQty = 0, this.walkDoorHalfGlassDoubleQty = 0, this.walkDoorHalfGlassQty = 0, this.walkDoor6PanelQty = 0, this.walkDoor6PanelDoubleQty = 0, this.walkDoor6LiteQty = 0, this.walkDoor9LiteQty = 0, this.walkDoor9LiteDoubleQty = 0, this.walkDoorSlidingGlassDoubleQty = 0, this.walkDoorFrenchDoubleDoubleQty = 0, this.walkDoorAllGlassQty = 0, this.walkDoorAllGlassDoubleQty = 0, this.walkDoorCrossbuckQty = 0, this.walkDoorEquineQty = 0, this.walkDoorFramedOpeningQty = 0, this.garageOverheadPanelQty = 0, this.garageOverheadPanelWindowQty = 0, this.garageOverheadFlatQty = 0, this.garageOverheadFlatWindowQty = 0, this.garageOverheadFlatModernQty = 0, this.garageOverheadRibbedQty = 0, this.garageSlideQty = 0, this.garageSlideLeftQty = 0, this.garageSlideRightQty = 0, this.garageSlideCrossbuckQty = 0, this.garageBiFoldQty = 0, this.garageHydraulicQty = 0, this.garageRollUpQty = 0, this.garageFramedOpeningQty = 0, this.divisionWall = !1, this.divisionAmount = 8, this.divisionMaterial = "Steel", this.perimeterWalls = "None", this.perimeterWalls2 = "None", this.flooring = "None", this.flooring2 = "None", this.ceiling = "None", this.ceiling2 = "None", this.insulation = !1, this.insulationRoof = "None", this.insulationWalls = "None", this.interiorWallQty = 0, this.interiorDoorQty = 0, this.mezzanineBays = 0, this.mezzanineStartingBay = 1, this.mezzanineDepth = 0, this.useMezzanineDepth = !1, this.mezzanineHeight = 8, this.mezzanineSupport = "Floor Support", this.person = 0, this.truck = 0, this.car = 0, this.airplane = 0, this.atv = 0, this.jetski = 0, this.combine = 0, this.tractor = 0, this.boat = 0, this.skiBoat = 0, this.driveway = 0, this.grainCart = 0, this.semiTruck = 0, this.semiTrailer = 0, this.semiTrailer53 = 0, this.backhoe = 0, this.cornHead6 = 0, this.cornHead = 0, this.cornHead12 = 0, this.beanHead = 0, this.beanHead35 = 0, this.beanHead40 = 0, this.desk = 0, this.chair = 0, this.conferenceTable = 0, this.lawnMower = 0, this.rv = 0, this.camper = 0, this.horseStall = 0, this.hayBales = 0, this.workbench = 0, this.airCompressor = 0, this.cultivator = 0, this.utv = 0, this.kitchenChair = 0, this.nightStand = 0, this.coffeeTable = 0, this.endTable = 0, this.version = Zt } Oa.prototype.settings = { roofPitchMin: .5, roofPitchMax: 5, showPostsWithOpenGableWall: !1, showLeantoWallTriangleWhenOpen: !1, showExtensionTriangleWhenOpen: !1, firstGirtSpacingOffGround: 0, shadows: "medium", ground: "grass", showWatermark: !1, watermarkOpacity: .15, showLogoOnTruss: !1, downspountsOnEndsOnly: !1, ridgidFrameStraightColumns: !1, disclaimerButtonText: "", disclaimerText: "", boxedEaves: !1, postsOnGableRoofOverhangsOver: 5, enclosedGableRoofOverhangTriangles: !1, woodenPorchPosts: !0, variableLargeDoorSizes: !0, leantoRoofOverhangsFollowMainRoof: !0, allowZeroPitchRoof: !1, showPostFrameBottomPlate: !1, restrictPeakOfCoverdGablesToEaveHeight: !1, restrictEaveOfCoverdGablesToEaveHeight: !0, wrappedPorchPostColorMatches: "trimColor", vaultedCeiling: !0, showPorchMidPostsOnEndwallsOnly: !0, showPorchPostsOnEndwallsOnly: !0 }, Oa.prototype.coreBuildingDimensions = function() { return { width: this.width, depth: this.depth, height: this.height, center: { x: 0, y: 0, z: 0 }, northEdge: this.depth / 2, southEdge: this.depth / -2, eastEdge: this.width / -2, westEdge: this.width / 2 } }, Oa.prototype.buildingWithLeantoDimensions = function() { this.coreBuildingDimensions().width, this.coreBuildingDimensions().depth; var e = this.coreBuildingDimensions().height; let t = this.coreBuildingDimensions().northEdge, a = this.coreBuildingDimensions().southEdge, o = this.coreBuildingDimensions().eastEdge, i = this.coreBuildingDimensions().westEdge; da.leanTo1 && (t += da.leanTo1Depth), da.leanTo3 && (a -= da.leanTo3Depth), da.leanTo2 && (o -= da.leanTo2Depth), da.leanTo4 && (i += da.leanTo4Depth); var n = Math.abs(t) + Math.abs(a), r = Math.abs(o) + Math.abs(i), s = {}; return s.x = (o + i) / 2, s.y = this.peakHeight() / 2, s.z = (t + a) / 2, { width: r, depth: n, height: e, center: s, northEdge: t, southEdge: a, eastEdge: o, westEdge: i } }, Oa.prototype.buildingWithGableExtensionsDimensions = function() { let e, t, a, o, i, n, r; e = da.hasOwnProperty("coveredGableExtensionN") && da.coveredGableExtensionN ? Math.max(this.buildingWithLeantoDimensions().northEdge, this.coreBuildingDimensions().northEdge + da.coveredGableExtensionNDepth) : this.buildingWithLeantoDimensions().northEdge, t = da.hasOwnProperty("coveredGableExtensionS") && da.coveredGableExtensionS ? Math.min(this.buildingWithLeantoDimensions().southEdge, this.coreBuildingDimensions().southEdge - da.coveredGableExtensionSDepth) : this.buildingWithLeantoDimensions().southEdge, a = da.hasOwnProperty("coveredGableExtensionE") && da.coveredGableExtensionE ? Math.min(this.buildingWithLeantoDimensions().eastEdge, this.coreBuildingDimensions().eastEdge - da.coveredGableExtensionEDepth) : this.buildingWithLeantoDimensions().eastEdge, o = da.hasOwnProperty("coveredGableExtensionW") && da.coveredGableExtensionW ? Math.max(this.buildingWithLeantoDimensions().westEdge, this.coreBuildingDimensions().westEdge + da.coveredGableExtensionWDepth) : this.buildingWithLeantoDimensions().westEdge, n = Math.abs(e) + Math.abs(t), i = Math.abs(a) + Math.abs(o), r = this.buildingWithLeantoDimensions().height; var s = {}; return s.x = (a + o) / 2, s.y = this.peakHeight() / 2, s.z = (e + t) / 2, { width: i, depth: n, height: r, center: s, northEdge: e, southEdge: t, eastEdge: a, westEdge: o } }, Oa.prototype.buildingWithPorchesDimensions = function() { let e = this.buildingWithGableExtensionsDimensions().width, t = this.buildingWithGableExtensionsDimensions().depth; var a = this.buildingWithGableExtensionsDimensions().height, o = this.buildingWithGableExtensionsDimensions().northEdge, i = this.buildingWithGableExtensionsDimensions().southEdge, n = this.buildingWithGableExtensionsDimensions().eastEdge, r = this.buildingWithGableExtensionsDimensions().westEdge; let s = 0, l = 0, h = 0, c = 0; da.porchN && (d = ia.getObjectByName("porchN-clone"), s = d.userData.porchDepth, t += d.userData.porchDepth), da.porchS && (d = ia.getObjectByName("porchS-clone"), l = d.userData.porchDepth, t += d.userData.porchDepth), da.porchE && (d = ia.getObjectByName("porchE-clone"), h = d.userData.porchDepth, e += d.userData.porchDepth), da.porchW && (d = ia.getObjectByName("porchW-clone"), c = d.userData.porchDepth, e += d.userData.porchDepth), da.porchWrapNW && (d = ia.getObjectByName("porchWrapNW-clone"), s = Math.max(s, d.userData.porchDepth), c = Math.max(c, d.userData.porchDepth)), da.porchWrapNE && (d = ia.getObjectByName("porchWrapNE-clone"), s = Math.max(s, d.userData.porchDepth), h = Math.max(h, d.userData.porchDepth)), da.porchWrapSE && (d = ia.getObjectByName("porchWrapSE-clone"), l = Math.max(l, d.userData.porchDepth), h = Math.max(h, d.userData.porchDepth)), da.porchWrapSW && (d = ia.getObjectByName("porchWrapSW-clone"), l = Math.max(l, d.userData.porchDepth), c = Math.max(c, d.userData.porchDepth)), da.porchWrapHipNW && (d = ia.getObjectByName("porchWrapHipNW-clone"), s = Math.max(s, d.userData.porchDepth), c = Math.max(c, d.userData.porchDepth)), da.porchWrapHipNE && (d = ia.getObjectByName("porchWrapHipNE-clone"), s = Math.max(s, d.userData.porchDepth), h = Math.max(h, d.userData.porchDepth)), da.porchWrapHipSE && (d = ia.getObjectByName("porchWrapHipSE-clone"), l = Math.max(l, d.userData.porchDepth), h = Math.max(h, d.userData.porchDepth)), da.porchWrapHipSW && (d = ia.getObjectByName("porchWrapHipSW-clone"), l = Math.max(l, d.userData.porchDepth), c = Math.max(c, d.userData.porchDepth)), o += s, i -= l, n -= h, r += c, e += n + r, t += o + i; var d = {}; return d.x = (n + r) / 2, d.y = this.peakHeight() / 2, d.z = (o + i) / 2, { width: e, depth: t, height: a, center: d, northEdge: o, southEdge: i, eastEdge: n, westEdge: r } }, Oa.prototype.roofHeightAtX = function(e) { e = e || 0; let t = this.height, a = 0, o = this.width / 2 * (this.roofPitch / 12), i = ("Asymmetrical" == this.roofType && (a = this.asymmetrical, o = (this.width + Math.abs(this.asymmetrical)) / 2 * (this.roofPitch / 12)), 0), n = 0; return "Single Slope" == this.roofType ? (i = 0 <= this.roofPitch ? this.width / -2 - e : this.width / 2 - e, t += Math.abs(i * this.roofPitch / 12)) : 0 <= a && e <= a ? (i = Math.abs(this.width / -2 - e), t += i * this.roofPitch / 12) : a < 0 && e >= a ? (i = Math.abs(this.width / 2 - e), t += i * this.roofPitch / 12) : 0 <= a && e >= a ? (i = Math.abs(this.width / 2 - e), n = Math.abs(this.width / 2 - a), t += Zo(i, 0, n, 0, o)) : a < 0 && e <= a && (i = Math.abs(this.width / -2 - e), n = Math.abs(this.width / -2 - a), t += Zo(i, 0, n, 0, o)), t }, Oa.prototype.peakHeight = function() { return "Asymmetrical" == this.roofType ? this.roofHeightAtX(this.asymmetrical) : "Single Slope" == this.roofType ? 0 <= this.roofPitch ? this.roofHeightAtX(this.width / 2) : this.roofHeightAtX(this.width / -2) : this.roofHeightAtX(0) }, Oa.prototype.wallHeightL = function() { return "Single Slope" === da.roofType && da.width * da.roofPitch / 12 < 0 ? da.height + da.width * Math.abs(da.roofPitch) / 12 : da.height }, Oa.prototype.wallHeightR = function() { return "Single Slope" === da.roofType && 0 < da.width * da.roofPitch / 12 ? da.height + da.width * Math.abs(da.roofPitch) / 12 : da.height }; var da = new Oa; if (R && console.log(da), Z) { Z = !0; let e = "load.php?id=" + Kt + "&dt=" + ea; w && null == Kt && null == ea && (e = "color-visualizer-default.json"), $.getJSON(e, function(e) { if (e.hasOwnProperty("success") && !1 === e.success && e.hasOwnProperty("errors")) console.log(e.errors); else if (e.hasOwnProperty("params") && null !== e.params) { console.log("Loading saved building"), R && console.log(e), e.hasOwnProperty("version") ? e.version !== Zt && window.location.replace("./v" + e.version) : (e.params.hasOwnProperty("weatherVane") && ("true" === e.params.weatherVane || !0 === e.params.weatherVane ? e.params.weatherVane = "Rooster" : e.params.weatherVane = "None"), e.hasOwnProperty("doorsWindows") && null !== e.doorsWindows && 0 !== Object.keys(e.doorsWindows).length && (e.doorsWindows.filter(e => "window3x4-clone" == e.name).forEach(e => { e.name = "windowDoubleHung-clone", e.grid = "1", e.scale = "3,4,0" }), e.doorsWindows.filter(e => "window3x4Shutters-clone" == e.name).forEach(e => { e.name = "windowDoubleHung-clone", e.grid = "1", e.scale = "3,4,0", e.shutters = "1" }), e.doorsWindows.filter(e => "window4x3-clone" == e.name).forEach(e => { e.name = "windowSlider-clone", e.grid = "1", e.scale = "4,3,0" }), e.doorsWindows.filter(e => "window4x3Shutters-clone" == e.name).forEach(e => { e.name = "windowSlider-clone", e.grid = "1", e.scale = "4,3,0", e.shutters = "1" }), e.doorsWindows.filter(e => "walkDoorEquine-clone" == e.name).forEach(e => { e.scale = "4,7,0" }), e.doorsWindows.filter(e => "walkDoorSolid-clone" == e.name).forEach(e => { e.scale = "3,6.67,0" }), e.doorsWindows.filter(e => "walkDoorHalfGlass-clone" == e.name).forEach(e => { e.scale = "3,6.67,0" }), e.doorsWindows.filter(e => "walkDoor9Lite-clone" == e.name).forEach(e => { e.scale = "3,6.67,0" }), e.doorsWindows.filter(e => "walkDoorCrossbuck-clone" == e.name).forEach(e => { e.scale = "3,6.67,0" }), e.doorsWindows.filter(e => "garageOverhead-clone" == e.name).forEach(e => { e.name = "garageOverheadPanel-clone" }), e.doorsWindows.filter(e => "garageOverheadWindow-clone" == e.name).forEach(e => { e.name = "garageOverheadPanelWindow-clone" })), e.hasOwnProperty("porches") && null !== e.porches && 0 !== Object.keys(e.porches).length && e.porches.forEach(e => { var t, a = e.rotation.split(","); e.rotation = "0," + a[1] + "," + a[2], e.hasOwnProperty("porchOverhang") || (e.hasOwnProperty("porchOverhang") || (e.porchOverhang = 0), e.hasOwnProperty("posts") || (e.posts = 0), e.hasOwnProperty("postMiter") || (e.postMiter = ""), e.hasOwnProperty("postWrap") || (e.postWrap = ""), a = e.position.split(","), t = e.scale.split(","), e.scale = t[0] + "," + a[1] + "," + t[2], e.position = a[0] + ",0," + a[2], e.ceilingHeight = a[1] - e.porchDepth * e.porchPitch / 12, console.log(a[1] - e.porchDepth * e.porchPitch / 12)), console.log(e) })), e.params.hasOwnProperty("hideWalls") && (e.params.hideWalls = 0), e.hasOwnProperty("porches") && null !== e.porches && (Ht = e.porches), e.hasOwnProperty("doorsWindows") && null !== e.doorsWindows && (Nt = e.doorsWindows), e.hasOwnProperty("scaleItems") && null !== e.scaleItems && (Lt = e.scaleItems), e.hasOwnProperty("interiorItems") && null !== e.interiorItems && (Ct = e.interiorItems); var a = e.params; for (let t in a) a.hasOwnProperty(t) && da.hasOwnProperty(t) && ("object" != typeof a[t] || null === a[t] || Array.isArray(a[t]) ? isNaN(a[t]) ? "true" !== a[t] && "false" !== a[t] || (a[t] = "true" === a[t]) : a[t] = parseFloat(a[t]) : Object.keys(a[t]).forEach(e => { isNaN(a[t][e]) ? "true" !== a[t][e] && "false" !== a[t][e] || (a[t][e] = "true" === a[t][e]) : a[t][e] = parseFloat(a[t][e]) }), da[t] = a[t]); Ia() } }) } var Ra = {}, Ba = {}, Sa = !1, Ha = !1, Na = new THREE.Vector3, La = [], Ca = [], ja = new THREE.Raycaster, i = new THREE.Vector2; function za() { for (var e = TWEEN.getAll(), t = e.length - 1; 0 <= t; t--) e[t].stop() } function Ia() { Fa(), Ga(), P.addEventListener("start", function() { P.autoRotate = !1, za() }), W.domElement.addEventListener("mousedown", Ya, !1), W.domElement.addEventListener("mousemove", Za, !1), W.domElement.addEventListener("mouseup", Ja, !1), W.domElement.addEventListener("touchstart", Ya, !1), W.domElement.addEventListener("touchmove", Za, !1), W.domElement.addEventListener("touchend", Ja, !1), $(".guiColor select").each(function() { $(this).val() ? $(this).addClass($(this).children(":selected").val().replace(/\W/g, "")) : console.error("Invalid color selected.") }).on("change", function(e) { $(this).attr("class", "").addClass($(this).children(":selected").val().replace(/\W/g, "")) }), T = null, ve = null } function Fa() { (ia = new THREE.Scene).background = new THREE.Color(16777215), Detector.webgl ? W = new THREE.WebGLRenderer({ antialias: !0, preserveDrawingBuffer: !0 }) : $("#modal-loading").modal("hide"); var e = Oo(), t = (W.shadowMap.enabled = !0, W.shadowMap.type = THREE.PCFSoftShadowMap, W.localClippingEnabled = !0, (v = W.domElement).setAttribute("id", "viewport3D"), document.getElementById("builder").appendChild(v), (S = new THREE.PerspectiveCamera(60, e.aspectRatio, .1, 1e3)).name = "UserCamera", S.position.set(1.25 * da.width, da.height + 0, 1.25 * da.depth), S.layers.enable(1), ia.add(S), (E = new THREE.OrthographicCamera(-v.clientWidth / 2, v.clientWidth / 2, v.clientHeight / 2, -v.clientHeight / 2, 1, 1e3)).name = "TopView", E.position.set(0, 0, 400), E.layers.enable(1), ia.add(E), M = S, (P = new THREE.OrbitControls(S, W.domElement)).enableKeys = !1, P.autoRotate = !0, P.autoRotateSpeed = .03, P.enableDamping = !0, P.dampingFactor = .1, P.rotateSpeed = .1, P.minDistance = 1, P.maxDistance = 250, P.panSpeed = .1, P.maxPolarAngle = Math.PI / 2 + .05, P.target.set(0, da.height / 2, 0), P.addEventListener("change", () => { S.position.y <= .5 && (S.position.y = .5), G = !0 }), w && (P.minDistance = 40, P.enablePan = !1), (H = new THREE.OrbitControls(E, W.domElement)).enableKeys = !1, H.enableRotate = !1, H.screenSpacePanning = !0, H.minZoom = .25, H.maxZoom = 10, H.target.set(0, 0, 0), H.addEventListener("change", () => { G = !0 }), xt = "Half Trusses", Ot = "Half Truss", Rt = "Gable Entries", Bt = "Gable Entry", w || (g = k.addFolder("Building Dimensions")), e = k.addFolder(Pa[oa].Colors), y = k.addFolder("Wainscot"), w || (n = k.addFolder("Roof Extension Options")), w || (t = k.addFolder(xt)), !w && (da.hasOwnProperty("coveredGableExtensionN") || da.hasOwnProperty("coveredGableExtensionS") || da.hasOwnProperty("coveredGableExtensionE") || da.hasOwnProperty("coveredGableExtensionW")) && (b = k.addFolder(Rt)), w || (f = k.addFolder("Porches")), w || (p = k.addFolder("Windows & Doors")), w || (m = k.addFolder("Interior")), w || (folderEnvironment = k.addFolder("Environment")), w || (da.hasOwnProperty("location") && g.add(da, "location", ["Manitoba", "Saskatchewan"]).name("Building Location").onChange(function() { x() }), (da.hasOwnProperty("size") ? g.add(da, "size", ["30'x40'", "30'x60'", "40'x40'", "40'x60'", "40'x80'"]).name("Building Size").listen() : (g.add(da, "width", 12, 200).step(1).name("Width (ft)").onChange(function() { x() }), g.add(da, "depth", 2, 304).step(1).name("Length (ft)"))).onChange(function() { x() }), g.add(da, "height", 6, 24).step(1).name("Eave Height (ft)").onChange(function() { x() }), g.add(da, "roofType", ["Gabled", "Single Slope", "Asymmetrical"]).name("Roof Type").listen().onChange(function() { Qa() }), g.add(da, "asymmetrical", -20, 20).step(1).name("Asymmetrical").onChange(function() { x() }), g.add(da, "roofPitch", da.settings.roofPitchMin, da.settings.roofPitchMax).step(.5).name('Roof Pitch / 12"').listen().onChange(function() { x() }), da.hasOwnProperty("frameConstruction") && g.add(da, "frameConstruction", ["Open Web Tapered", "Residential Flush", "I-beams"]).name("Column Type").listen().onChange(function() { x() }), da.hasOwnProperty("postType") && g.add(da, "postType", ["6x6 Solid", "8x8 Solid", "Glue Laminated", "Steel Tube"]).name("Post Type").listen().onChange(function() { x() }), da.hasOwnProperty("columnSize") && g.add(da, "columnSize", ["6x6", "8x8"]).name("Column Size").listen().onChange(function() { x() }), da.hasOwnProperty("purlinType") && g.add(da, "purlinType", ["2x6 Wood", "2x6 Metal C-channel"]).name("Purlin Type").listen().onChange(function() { x() }), da.hasOwnProperty("snowLoad") && g.add(da, "snowLoad", ["None", "20", "30", "40", "50", "60"]).name("Snow Load lbs/ft²").listen().onChange(function() { x() }), da.hasOwnProperty("wallPanelType") && g.add(da, "wallPanelType", ["Single Skin", "Insulated Panels"]).name("Wall Panel Type").listen().onChange(function() { x() }), da.hasOwnProperty("roofPanelType") && g.add(da, "roofPanelType", ["Screw Down", "Standing Seam"]).name("Roof Panel Type").listen().onChange(function() { x() }), secondaryMembers = g.add(da, "secondaryMembers", ["Steel", "Wood"]).name("Secondary Members").listen().onChange(function() { x(), Xa() }), folderEnvironment.add(da, "ground", ["None", "Grass Plains", "Treed Vally", "Clearing", "Green Mountains", "Rocky Mountains", "Desert"]).name("Ground").listen().onChange(function() { ai() })), De = e.add(da, "roofColor", F.filter(e => e.categories.includes("roof")).map(e => e.name)).class("guiColor").name("Roof Color").onChange(function() { O() }), Me = e.add(da, "wallColor", F.filter(e => e.categories.includes("wall")).map(e => e.name)).class("guiColor").name("Wall Color").onChange(function() { O() }), da.hasOwnProperty("trimCornerColor") || (We = e.add(da, "trimColor", F.filter(e => e.categories.includes("trim")).map(e => e.name)).class("guiColor").name("Trim Color").onChange(function() { O() })), da.hasOwnProperty("trimBaseColor") && (Oe = e.add(da, "trimBaseColor", F.filter(e => e.categories.includes("trim")).map(e => e.name)).class("guiColor").name("Trim Color - Base").onChange(function() { O() })), da.hasOwnProperty("trimGableColor") && (Re = e.add(da, "trimGableColor", F.filter(e => e.categories.includes("trim")).map(e => e.name)).class("guiColor").name("Trim Color - Gable").onChange(function() { O() })), da.hasOwnProperty("trimCornerColor") && (Be = e.add(da, "trimCornerColor", F.filter(e => e.categories.includes("trim")).map(e => e.name)).class("guiColor").name("Trim Color - Corner").onChange(function() { O() })), da.hasOwnProperty("trimEaveColor") && (Se = e.add(da, "trimEaveColor", F.filter(e => e.categories.includes("trim")).map(e => e.name)).class("guiColor").name("Trim Color - Eave").onChange(function() { O() })), da.hasOwnProperty("doorWindowTrimColor") && (_e = e.add(da, "doorWindowTrimColor", F.filter(e => e.categories.includes("trim")).map(e => e.name)).class("guiColor").name("Door & Window Trim").onChange(function() { O() })), da.hasOwnProperty("windowTrimColor") && (qe = e.add(da, "windowTrimColor", F.filter(e => e.categories.includes("trim")).map(e => e.name)).class("guiColor").name("Window Trim").onChange(function() { O() })), da.hasOwnProperty("doorTrimColor") && (Ae = e.add(da, "doorTrimColor", F.filter(e => e.categories.includes("trim")).map(e => e.name)).class("guiColor").name("Window Trim").onChange(function() { O() })), da.hasOwnProperty("garageDoorTrimColor") && (Ve = e.add(da, "garageDoorTrimColor", F.filter(e => e.categories.includes("trim")).map(e => e.name)).class("guiColor").name("Window Trim").onChange(function() { O() })), da.hasOwnProperty("walkDoorTrimColor") && (Ue = e.add(da, "walkDoorTrimColor", F.filter(e => e.categories.includes("trim")).map(e => e.name)).class("guiColor").name("Window Trim").onChange(function() { O() })), da.hasOwnProperty("trimEaveLightsColor") && ($e = e.add(da, "trimEaveLightsColor", F.filter(e => e.categories.includes("eaveLightTrim")).map(e => e.name)).class("guiColor").name("Eave Lights Trim").onChange(function() { O() })), da.hasOwnProperty("ridgeCapColor") && e.add(da, "ridgeCapColor", ["Match Trim", "Match Roof"]).name("Ridge Cap Color").onChange(function() { O() }), da.hasOwnProperty("gutterColor") && (ke = e.add(da, "gutterColor", F.filter(e => e.categories.includes("trim")).map(e => e.name)).class("guiColor").name("Gutter Color").onChange(function() { O() })), da.hasOwnProperty("downspoutColor") && (Ge = e.add(da, "downspoutColor", F.filter(e => e.categories.includes("trim")).map(e => e.name)).class("guiColor").name("Downspout Color").onChange(function() { O() })), He = e.add(da, "soffitColor", F.filter(e => e.categories.includes("soffit")).map(e => e.name)).class("guiColor").name("Soffit Color").onChange(function() { O() }), da.hasOwnProperty("trackColor") && (Fe = e.add(da, "trackColor", F.filter(e => e.categories.includes("trackColor")).map(e => e.name)).class("guiColor").name("Door Track").onChange(function() { O() })), w || (Ne = e.add(da, "wainscotColor", F.filter(e => e.categories.includes("wainscot")).map(e => e.name)).class("guiColor").name("Wainscot Color").onChange(function() { O() })), y.add(da, "wainscot1").name("Wainscot " + J.N.short).onChange(function() { if (da.wainscot1 || da.wainscot2 || da.wainscot3 || da.wainscot4) { if (!da.hasOwnProperty("_previousTrimColor")) { da._previousTrimColor = da.trimColor; } if (We && da.trimColor !== "Charcoal") { We.setValue("Charcoal"); } } else { if (da.hasOwnProperty("_previousTrimColor") && We) { We.setValue(da._previousTrimColor); delete da._previousTrimColor; } } K() }), y.add(da, "wainscot3").name("Wainscot " + J.S.short).onChange(function() { if (da.wainscot1 || da.wainscot2 || da.wainscot3 || da.wainscot4) { if (!da.hasOwnProperty("_previousTrimColor")) { da._previousTrimColor = da.trimColor; } if (We && da.trimColor !== "Charcoal") { We.setValue("Charcoal"); } } else { if (da.hasOwnProperty("_previousTrimColor") && We) { We.setValue(da._previousTrimColor); delete da._previousTrimColor; } } K() }), y.add(da, "wainscot2").name("Wainscot " + J.E.short).onChange(function() { if (da.wainscot1 || da.wainscot2 || da.wainscot3 || da.wainscot4) { if (!da.hasOwnProperty("_previousTrimColor")) { da._previousTrimColor = da.trimColor; } if (We && da.trimColor !== "Charcoal") { We.setValue("Charcoal"); } } else { if (da.hasOwnProperty("_previousTrimColor") && We) { We.setValue(da._previousTrimColor); delete da._previousTrimColor; } } K() }), y.add(da, "wainscot4").name("Wainscot " + J.W.short).onChange(function() { if (da.wainscot1 || da.wainscot2 || da.wainscot3 || da.wainscot4) { if (!da.hasOwnProperty("_previousTrimColor")) { da._previousTrimColor = da.trimColor; } if (We && da.trimColor !== "Charcoal") { We.setValue("Charcoal"); } } else { if (da.hasOwnProperty("_previousTrimColor") && We) { We.setValue(da._previousTrimColor); delete da._previousTrimColor; } } K() }), w || (da.hasOwnProperty("roofMaterial") && n.add(da, "roofMaterial", ["Screw Down Roof (SDR)", "Standing Seam Roof (SSR)"]).name("Roof Material").listen().onChange(function() { x() }), n.add(da, "gableFront", 0, 5).step(1).name(J.N.abbr + " Gable Overhang").onChange(function() { x() }), n.add(da, "gableBack", 0, 5).step(1).name(J.S.abbr + " Gable Overhang").onChange(function() { x() }), n.add(da, "eaveL", 0, 3).step(1).name(J.E.abbr + " Eave Overhang").onChange(function() { x() }), n.add(da, "eaveR", 0, 3).step(1).name(J.W.abbr + " Eave Overhang").onChange(function() { x() }), n.add(da, "cupola2", 0, vt).step(1).name("2' Cupola").onChange(function() { Ua() }), n.add(da, "cupola3", 0, vt).step(1).name("3' Cupola").onChange(function() { Ua() }), n.add(da, "cupola4", 0, vt).step(1).name("4' Cupola").onChange(function() { Ua() }), (y = t.addFolder(J.N.name + " " + Ot)).add(da, "leanTo1").name("Enabled").onChange(function() { x(), K() }), y.add(da, "leanTo1Drop", 0, 20).step(1).name("Drop").onChange(function() { x() }), y.add(da, "leanTo1CutL", 0, 20).step(1).name("Cut L").onChange(function() { x() }), y.add(da, "leanTo1CutR", 0, 20).step(1).name("Cut R").onChange(function() { x() }), y.add(da, "leanTo1Depth", 1, 50).step(1).name("Depth").onChange(function() { x() }), y.add(da, "leanTo1Pitch", 1, 6).step(1).name("Roof Pitch").onChange(function() { x() }), y.add(da, "leanTo1Walls", ["Fully Enclosed", "Open", "Upper Triangles Only", "Length Enclosed", "Length 1ft", "Length 2ft", "Length 3ft", "Length 4ft"]).name("Walls").listen().onChange(function() { x(), K() }), (n = t.addFolder(J.E.name + " " + Ot)).add(da, "leanTo2").name("Enabled").onChange(function() { x(), K() }), n.add(da, "leanTo2Drop", 0, 20).step(1).name("Drop").onChange(function() { x() }), n.add(da, "leanTo2CutL", 0, 20).step(1).name("Cut L").onChange(function() { x() }), n.add(da, "leanTo2CutR", 0, 20).step(1).name("Cut R").onChange(function() { x() }), n.add(da, "leanTo2Depth", 1, 50).step(1).name("Width").onChange(function() { x() }), n.add(da, "leanTo2Pitch", 1, 6).step(1).name("Roof Pitch").onChange(function() { x() }), n.add(da, "leanTo2Walls", ["Fully Enclosed", "Open", "Upper Triangles Only", "Length Enclosed", "Length 1ft", "Length 2ft", "Length 3ft", "Length 4ft"]).name("Walls").listen().onChange(function() { x(), K() }), (y = t.addFolder(J.S.name + " " + Ot)).add(da, "leanTo3").name("Enabled").onChange(function() { x(), K() }), y.add(da, "leanTo3Drop", 0, 20).step(1).name("Drop").onChange(function() { x() }), y.add(da, "leanTo3CutL", 0, 20).step(1).name("Cut L").onChange(function() { x() }), y.add(da, "leanTo3CutR", 0, 20).step(1).name("Cut R").onChange(function() { x() }), y.add(da, "leanTo3Depth", 1, 50).step(1).name("Depth").onChange(function() { x() }), y.add(da, "leanTo3Pitch", 1, 6).step(1).name("Roof Pitch").onChange(function() { x() }), y.add(da, "leanTo3Walls", ["Fully Enclosed", "Open", "Upper Triangles Only", "Length Enclosed", "Length 1ft", "Length 2ft", "Length 3ft", "Length 4ft"]).name("Walls").listen().onChange(function() { x(), K() }), (n = t.addFolder(J.W.name + " " + Ot)).add(da, "leanTo4").name("Enabled").onChange(function() { x(), K() }), n.add(da, "leanTo4Drop", 0, 20).step(1).name("Drop").onChange(function() { x() }), n.add(da, "leanTo4CutL", 0, 20).step(1).name("Cut L").onChange(function() { x() }), n.add(da, "leanTo4CutR", 0, 20).step(1).name("Cut R").onChange(function() { x() }), n.add(da, "leanTo4Depth", 1, 50).step(1).name("Width").onChange(function() { x() }), n.add(da, "leanTo4Pitch", 1, 6).step(1).name("Roof Pitch").onChange(function() { x() }), n.add(da, "leanTo4Walls", ["Fully Enclosed", "Open", "Upper Triangles Only", "Length Enclosed", "Length 1ft", "Length 2ft", "Length 3ft", "Length 4ft"]).name("Walls").listen().onChange(function() { x(), K() }), da.hasOwnProperty("coveredGableExtensionN") && ((y = b.addFolder(J.N.name + " " + Bt)).add(da, "coveredGableExtensionN").name("Enabled").onChange(function() { x(), K() }), y.add(da, "coveredGableExtensionNHeight", 6, 20).step(1).name("Height").onChange(function() { x() }), y.add(da, "coveredGableExtensionNCutL", 0, 200).step(1).name("Cut L").onChange(function() { x() }), y.add(da, "coveredGableExtensionNCutR", 0, 200).step(1).name("Cut R").onChange(function() { x() }), y.add(da, "coveredGableExtensionNDepth", 6, 60).step(1).name("Depth").onChange(function() { x() }), y.add(da, "coveredGableExtensionNPitch", da.settings.roofPitchMin, da.settings.roofPitchMax).step(1).name("Roof Pitch").onChange(function() { x() }), y.add(da, "coveredGableExtensionNEnclosed").name("Enclosed").onChange(function() { x(), K() }), y.add(da, "coveredGableExtensionNStructure", ["Wood", "Steel"]).name("Structure").listen().onChange(function() { x() })), da.hasOwnProperty("coveredGableExtensionS") && ((t = b.addFolder(J.S.name + " " + Bt)).add(da, "coveredGableExtensionS").name("Enabled").onChange(function() { x(), K() }), t.add(da, "coveredGableExtensionSHeight", 6, 20).step(1).name("Height").onChange(function() { x() }), t.add(da, "coveredGableExtensionSCutL", 0, 200).step(1).name("Cut L").onChange(function() { x() }), t.add(da, "coveredGableExtensionSCutR", 0, 200).step(1).name("Cut R").onChange(function() { x() }), t.add(da, "coveredGableExtensionSDepth", 6, 60).step(1).name("Depth").onChange(function() { x() }), t.add(da, "coveredGableExtensionSPitch", da.settings.roofPitchMin, da.settings.roofPitchMax).step(1).name("Roof Pitch").onChange(function() { x() }), t.add(da, "coveredGableExtensionSEnclosed").name("Enclosed").onChange(function() { x(), K() }), t.add(da, "coveredGableExtensionSStructure", ["Wood", "Steel"]).name("Structure").listen().onChange(function() { x() })), da.hasOwnProperty("coveredGableExtensionE") && ((n = b.addFolder(J.E.name + " " + Bt)).add(da, "coveredGableExtensionE").name("Enabled").onChange(function() { x(), K() }), n.add(da, "coveredGableExtensionEHeight", 6, 20).step(1).name("Height").onChange(function() { x() }), n.add(da, "coveredGableExtensionECutL", 0, 200).step(1).name("Cut L").onChange(function() { x() }), n.add(da, "coveredGableExtensionECutR", 0, 200).step(1).name("Cut R").onChange(function() { x() }), n.add(da, "coveredGableExtensionEDepth", 6, 60).step(1).name("Depth").onChange(function() { x() }), n.add(da, "coveredGableExtensionEPitch", da.settings.roofPitchMin, da.settings.roofPitchMax).step(1).name("Roof Pitch").onChange(function() { x() }), n.add(da, "coveredGableExtensionEEnclosed").name("Enclosed").onChange(function() { x(), K() }), n.add(da, "coveredGableExtensionEStructure", ["Wood", "Steel"]).name("Structure").listen().onChange(function() { x() })), da.hasOwnProperty("coveredGableExtensionW") && ((y = b.addFolder(J.W.name + " " + Bt)).add(da, "coveredGableExtensionW").name("Enabled").onChange(function() { x(), K() }), y.add(da, "coveredGableExtensionWHeight", 6, 20).step(1).name("Height").onChange(function() { x() }), y.add(da, "coveredGableExtensionWCutL", 0, 200).step(1).name("Cut L").onChange(function() { x() }), y.add(da, "coveredGableExtensionWCutR", 0, 200).step(1).name("Cut R").onChange(function() { x() }), y.add(da, "coveredGableExtensionWDepth", 6, 60).step(1).name("Depth").onChange(function() { x() }), y.add(da, "coveredGableExtensionWPitch", da.settings.roofPitchMin, da.settings.roofPitchMax).step(1).name("Roof Pitch").onChange(function() { x() }), y.add(da, "coveredGableExtensionWEnclosed").name("Enclosed").onChange(function() { x(), K() }), y.add(da, "coveredGableExtensionWStructure", ["Wood", "Steel"]).name("Structure").listen().onChange(function() { x() })), f.add(da, "porchN").name(J.N.name + " Porch").listen().onChange(function() { x() }), f.add(da, "porchS").name(J.S.name + " Porch").listen().onChange(function() { x() }), f.add(da, "porchE").name(J.E.name + " Porch").listen().onChange(function() { x() }), f.add(da, "porchW").name(J.W.name + " Porch").listen().onChange(function() { x() }), f.add(da, "porchWrapNW").name(J.NW.abbr + " Wrap Porch").listen().onChange(function() { x() }), f.add(da, "porchWrapNE").name(J.NE.abbr + " Wrap Porch").listen().onChange(function() { x() }), f.add(da, "porchWrapSE").name(J.SE.abbr + " Wrap Porch").listen().onChange(function() { x() }), f.add(da, "porchWrapSW").name(J.SW.abbr + " Wrap Porch").listen().onChange(function() { x() }), p.add(Ma, "addWindowSlider").name("Add Slider Window"), p.add(Ma, "addWalkDoorSolid").name("Add Walk Door Solid"), p.add(Ma, "addWalkDoorHalfGlass").name("Add Walk Door Half Glass"), p.add(Ma, "addGarageOverheadPanel").name("Add Overhead Panel Door"), p.add(Ma, "addGarageSlide").name("Add Sliding Doors"), p.add(Ma, "addGarageBiFold").name("Add Bi-Fold Door"), p.add(Ma, "addGarageHydraulic").name("Add Hydraulic Door"), p.add(Ma, "addGarageRollUp").name("Add Roll Up Door"), (da.useMezzanineDepth ? m.add(da, "mezzanineDepth", 0, 200).step(1).name("Mezzanine Depth") : (m.add(da, "mezzanineBays", 0, 20).step(1).name("Mezzanine Bays").onChange(function() { x() }), m.add(da, "mezzanineStartingBay", 1, 20).step(1).name("Mezzanine Starting Bay"))).onChange(function() { x() }), m.add(da, "mezzanineHeight", 6, 20).step(1).name("Mezzanine Height").onChange(function() { x() }), da.hasOwnProperty("mezzanineSupport") && m.add(da, "mezzanineSupport", ["Floor Support", "Roof Support"]).name("Mezzanine Support").listen().onChange(function() { x() }), da.hasOwnProperty("mezzanineRailing") && m.add(da, "mezzanineRailing", ["None", "Framed", "Steel Covered"]).name("Mezzanine Railing").listen().onChange(function() { x() }), da.hasOwnProperty("mezzanineStairs") && m.add(da, "mezzanineStairs", ["None", "Left Straight", "Right Straight", "Left Landing", "Right Landing"]).name("Mezzanine Stairs").listen().onChange(function() { x() })), (w ? e : g).open(), k.open(), (na = new THREE.Group).name = "buildingNull", ia.add(na), (ra = new THREE.Group).name = "hiddenItemsNull", ia.add(ra), (z = new THREE.Group).name = "dimensionsNull", na.add(z), new THREE.Group), a = (t.name = "lightsNull", ia.add(t), new THREE.HemisphereLight(16770491, 16760576, 1)), o = (a.color.setHex(16777215), a.groundColor.setHex(16777215), a.name = "HemisphereLight", t.add(a), new THREE.AmbientLight(4210752, 1)), i = (o.name = "AmbientLight", t.add(o), new THREE.DirectionalLight("white", 1)); switch (i.name = "FrontDirectionalLight", i.position.set(60, 75, 120), i.target.position.set(0, 0, 0), i.castShadow = !0, i.shadow.mapSize.width = 4096, i.shadow.mapSize.height = 4096, i.shadow.camera.right = 110, i.shadow.camera.left = -110, i.shadow.camera.top = 110, i.shadow.camera.bottom = -110, i.shadow.camera.near = 25, i.shadow.camera.far = 300, i.shadow.camera.visible = !0, i.shadow.bias = -5e-4, t.add(i), da.settings.shadows) { case "none": a.intensity = .5, o.intensity = .5, i.intensity = .5, i.castShadow = !1; break; case "dark": a.intensity = .25, o.intensity = .25, i.intensity = .75; break; case "medium": a.intensity = .3, o.intensity = .8, i.intensity = .5; break; default: a.intensity = .5, o.intensity = 1, i.intensity = .1 } var n = new THREE.DirectionalLight("white", .2); n.name = "BackDirectionalLight", n.position.set(-30, 75, -150), n.target.position.set(0, 0, 0), t.add(n), (n = new THREE.DirectionalLight("white", .2)).name = "BackLeftDirectionalLight", n.position.set(-100, -75, 50), n.target.position.set(0, 0, 0), t.add(n), (n = new THREE.DirectionalLight("white", .2)).name = "BackRightDirectionalLight", n.position.set(75, 25, -100), n.target.position.set(0, 0, 0), t.add(n), ia.fog = new THREE.Fog(12637405, 250, 1e3); let r, s, l, h, c, d; r = new THREE.SphereGeometry(750, 25, 25), l = D + "images/sky/sky-sq.jpg", c = new THREE.TextureLoader, h = c.load(l), s = new THREE.MeshBasicMaterial({ name: "skySphere-Material", map: h, fog: !1 }), (L = new THREE.Mesh(r, s)).material.side = THREE.BackSide, L.name = "skySphere-Mesh", ia.add(L), da.settings.showWatermark && (l = "images/logo-watermark.png", c = new THREE.TextureLoader(T), h = c.load(l), r = new THREE.PlaneGeometry(1, 1), (s = new THREE.MeshBasicMaterial({ name: "watermark", map: h, opacity: da.settings.watermarkOpacity, transparent: !0 })).depthTest = !1, s.polygonOffset = !0, s.polygonOffsetFactor = -1, (b = new THREE.Mesh(r, s)).name = "watermark", b.castShadow = !1, b.receiveShadow = !1, b.position.set(0, 0, -1.25), M.add(b)), da.settings.showLogoOnTruss && (l = "images/logo-watermark.png", c = new THREE.TextureLoader, (h = c.load(l)).anisotropy = W.capabilities.getMaxAnisotropy(), r = new THREE.PlaneGeometry(1, 1), (s = new THREE.MeshBasicMaterial({ name: "logo", map: h, transparent: !0 })).polygonOffset = !0, s.polygonOffsetFactor = -1, (y = new THREE.Mesh(r, s)).name = "postLogo", y.castShadow = !1, y.receiveShadow = !1, y.position.y = -1, y.visible = !1, y.frustumCulled = !1, ra.add(y)), j = new THREE.GridHelper(1e3, 100, 13421772, 13421772), C = new THREE.GridHelper(1e3, 1200, 13421772, 13421772), j.material.transparent = !0, C.material.transparent = !0, j.material.opacity = .5, C.material.opacity = .35, j.visible = !1, C.visible = !1, ia.add(j), ia.add(C), (c = new THREE.LWOLoader).setResourcePath(D + "images/"), c.load(D + "objects/ground.lwo", function(e) { e.meshes.forEach(function(t) { t.visible = !0, t.castShadow = !1, t.receiveShadow = !0, t.frustumCulled = !1, t.name = "ground", 0 < t.material.length ? t.material.forEach(function(e) { t.hasOwnProperty("morphTargetInfluences") && (e.morphTargets = !0), "MeshStandardMaterial" == e.type && null !== e.roughnessMap && (e.roughness = 1) }) : (t.hasOwnProperty("morphTargetInfluences") && (t.material.morphTargets = !0), "MeshStandardMaterial" == t.material.type && null !== t.material.roughnessMap && (t.material.roughness = 1)), (c = new THREE.LWOLoader).setResourcePath(D + "images/"), c.load(D + "objects/ground.lwo", function(e) { e.meshes.forEach(function(t) { t.visible = !0, t.castShadow = !1, t.receiveShadow = !0, t.frustumCulled = !1, 0 < t.material.length ? t.material.forEach(function(e) { t.hasOwnProperty("morphTargetInfluences") && (e.morphTargets = !0), "MeshStandardMaterial" == e.type && null !== e.roughnessMap && (e.roughness = 1) }) : (t.hasOwnProperty("morphTargetInfluences") && (t.material.morphTargets = !0), "MeshStandardMaterial" == t.material.type && null !== t.material.roughnessMap && (t.material.roughness = 1)), N = t, ia.add(t), ai() }) }) }) }), l = D + "images/ground/map/mapBlend.jpg", c = new THREE.TextureLoader, (h = c.load(l)).anisotropy = W.capabilities.getMaxAnisotropy(), h.anisotropy = 5, da.hasOwnProperty("mapEnabled") && ((I = new THREE.Group).name = "mapRotationNull", I.visible = da.mapEnabled, I.userData.previouslyShown = !1, ia.add(I), r = new THREE.PlaneGeometry(1, 1), s = new THREE.MeshPhongMaterial({ name: "map1", alphaMap: h, transparent: !0, polygonOffset: !0, polygonOffsetFactor: 1, fog: !1 }), (object3d = new THREE.Mesh(r, s)).rotateX(-Math.PI / 2), object3d.name = "map1", object3d.renderOrder = -1, object3d.castShadow = !1, object3d.receiveShadow = !0, ae = object3d, I.add(object3d), (r = new THREE.PlaneGeometry(4, 4)).applyMatrix((new THREE.Matrix4).makeTranslation(0, 0, -.01)), s = new THREE.MeshPhongMaterial({ name: "map2", alphaMap: h, transparent: !0, polygonOffset: !0, polygonOffsetFactor: 2, fog: !1 }), (object3d = new THREE.Mesh(r, s)).name = "map2", object3d.receiveShadow = !(object3d.castShadow = !(object3d.renderOrder = -2)), oe = object3d, ae.add(object3d), (r = new THREE.PlaneGeometry(8, 8)).applyMatrix((new THREE.Matrix4).makeTranslation(0, 0, -.02)), s = new THREE.MeshPhongMaterial({ name: "map3", polygonOffset: !0, polygonOffsetFactor: 3, fog: !1 }), (object3d = new THREE.Mesh(r, s)).name = "map3", object3d.receiveShadow = !(object3d.castShadow = !(object3d.renderOrder = -3)), ie = object3d, ae.add(object3d), (f = k.addFolder("Place Building On Map")).add({ clicked: function() { ti() } }, "clicked").id("mapNavButton").name("Open Map Details Menu"), f.add(da, "mapRotation", -180, 180).step(1).name("Rotate Building").onChange(function() { ia.rotation.y = THREE.Math.degToRad(da.mapRotation), na.rotation.y = -THREE.Math.degToRad(da.mapRotation), de.rotation.y = -THREE.Math.degToRad(da.mapRotation) }), f.add(da.mapPosition, "x", -400, 400).step(.1).name("Move East/West").onChange(function() { ae.position.x = da.mapPosition.x }), f.add(da.mapPosition, "z", -400, 400).step(.1).name("Move North/South").onChange(function() { ae.position.z = da.mapPosition.z })), r = new THREE.BoxGeometry(1, .05, 1), l = D + "images/building/concrete.jpg", c = new THREE.TextureLoader, (h = c.load(l)).anisotropy = W.capabilities.getMaxAnisotropy(), h.wrapS = THREE.RepeatWrapping, h.wrapT = THREE.RepeatWrapping, s = new THREE.MeshPhongMaterial({ color: "white", name: "foundation-Material", map: h, bumpMap: h, bumpScale: .04, specularMap: h }), (ne = new THREE.Mesh(r, s)).name = "foundation", ne.castShadow = !0, ne.receiveShadow = !0, na.add(ne), $a(), (te = (new THREE.TextureLoader).load(D + "images/building/building-normal.jpg")).anisotropy = W.capabilities.getMaxAnisotropy(), te.wrapS = THREE.RepeatWrapping, te.wrapT = THREE.RepeatWrapping, (r = new THREE.BoxGeometry(1, 1, 1)).applyMatrix((new THREE.Matrix4).makeTranslation(0, .5, 0)), s = new THREE.MeshPhongMaterial({ color: 16770491, wireframe: !0, side: THREE.DoubleSide, visible: !1 }), (re = new THREE.Mesh(r, s)).name = "boundingBoxes", na.add(re), (r = new THREE.BoxGeometry(1, 1, 1)).applyMatrix((new THREE.Matrix4).makeTranslation(0, .5, 0)), s = new THREE.MeshPhongMaterial({ color: 16770491, wireframe: !0, side: THREE.DoubleSide, visible: !1 }), B && (s = new THREE.MeshPhongMaterial({ color: 11199999, wireframe: !0, wireframeLinewidth: 3, side: THREE.DoubleSide })), (se = new THREE.Mesh(r, s)).name = "buildingBoundingBox", Ca.push(se), re.add(se), (r = new THREE.BoxGeometry(1, 1, 1)).applyMatrix((new THREE.Matrix4).makeTranslation(0, .5, .5)), s = new THREE.MeshPhongMaterial({ color: 16770491, wireframe: !0, side: THREE.DoubleSide, visible: !1 }), B && (s = new THREE.MeshPhongMaterial({ color: 16770491, wireframe: !0, side: THREE.DoubleSide })); var p = new THREE.Mesh(r, s), m = (p.name = "leanTo1BoundingBox", p.rotation.y = 0, Ca.push(p), re.add(p), (r = new THREE.BoxGeometry(1, 1, 1)).applyMatrix((new THREE.Matrix4).makeTranslation(0, .5, .5)), s = new THREE.MeshPhongMaterial({ color: 16770491, wireframe: !0, side: THREE.DoubleSide, visible: !1 }), B && (s = new THREE.MeshPhongMaterial({ color: 16770491, wireframe: !0, side: THREE.DoubleSide })), new THREE.Mesh(r, s)), e = (m.name = "leanTo2BoundingBox", m.rotation.y = Math.PI / -2, Ca.push(m), re.add(m), (r = new THREE.BoxGeometry(1, 1, 1)).applyMatrix((new THREE.Matrix4).makeTranslation(0, .5, .5)), s = new THREE.MeshPhongMaterial({ color: 16770491, wireframe: !0, side: THREE.DoubleSide, visible: !1 }), B && (s = new THREE.MeshPhongMaterial({ color: 16770491, wireframe: !0, side: THREE.DoubleSide })), new THREE.Mesh(r, s)), g = (e.name = "leanTo3BoundingBox", e.rotation.y = Math.PI, Ca.push(e), re.add(e), (r = new THREE.BoxGeometry(1, 1, 1)).applyMatrix((new THREE.Matrix4).makeTranslation(0, .5, .5)), s = new THREE.MeshPhongMaterial({ color: 16770491, wireframe: !0, side: THREE.DoubleSide, visible: !1 }), B && (s = new THREE.MeshPhongMaterial({ color: 16770491, wireframe: !0, side: THREE.DoubleSide })), new THREE.Mesh(r, s)); switch (g.name = "leanTo4BoundingBox", g.rotation.y = Math.PI / 2, Ca.push(g), re.add(g), da.secondaryMembers) { case "Insulated Panels": Ea = At; break; case "Red Iron": Ea = Qt; break; case "Metal": case "Steel": Ea = Ut; break; default: Ea = At }(r = new THREE.PlaneBufferGeometry).translate(0, -.5, 0), s = new THREE.MeshStandardMaterial({ color: 13369395, side: THREE.DoubleSide }), (q = new THREE.Mesh(r, s)).name = "floor", q.rotation.x = THREE.Math.degToRad(90), q.position.y = .03, q.visible = !1, na.add(q), (r = new THREE.PlaneBufferGeometry).translate(0, .5, 0), s = new THREE.MeshStandardMaterial({ color: 13369395, side: THREE.DoubleSide }), (A = new THREE.Mesh(r, s)).name = "floor2", A.rotation.x = THREE.Math.degToRad(90), A.position.y = .03, A.visible = !1, na.add(A), (r = new THREE.PlaneBufferGeometry).translate(.5, -.5, 0), s = new THREE.MeshStandardMaterial({ color: 13369395, side: THREE.DoubleSide }), (V = new THREE.Mesh(r, s)).name = "ceilingL", V.rotation.x = THREE.Math.degToRad(90), V.visible = !1, na.add(V), (r = new THREE.PlaneBufferGeometry).translate(-.5, -.5, 0), s = new THREE.MeshStandardMaterial({ color: 13369395, side: THREE.DoubleSide }), (U = new THREE.Mesh(r, s)).name = "ceilingR", U.rotation.x = THREE.Math.degToRad(90), U.visible = !1, na.add(U), (r = new THREE.PlaneBufferGeometry).translate(.5, .5, 0), s = new THREE.MeshStandardMaterial({ color: 13369395, side: THREE.DoubleSide }), (Q = new THREE.Mesh(r, s)).name = "ceiling2L", Q.rotation.x = THREE.Math.degToRad(90), Q.visible = !1, na.add(Q), (r = new THREE.PlaneBufferGeometry).translate(-.5, .5, 0), s = new THREE.MeshStandardMaterial({ color: 13369395, side: THREE.DoubleSide }), (X = new THREE.Mesh(r, s)).name = "ceiling2R", X.rotation.x = THREE.Math.degToRad(90), X.visible = !1, na.add(X), c = new THREE.TextureLoader, l = D + "images/building/floor-carpet.jpg", (h = c.load(l)).anisotropy = Math.min(W.capabilities.getMaxAnisotropy(), 5), h.wrapS = THREE.RepeatWrapping, h.wrapT = THREE.RepeatWrapping; let u = c.load(l); u.anisotropy = Math.min(W.capabilities.getMaxAnisotropy(), 5), u.wrapS = THREE.RepeatWrapping, u.wrapT = THREE.RepeatWrapping, ct = new THREE.MeshPhongMaterial({ map: h, color: 16777215, specular: 3947580, shininess: 5, side: THREE.DoubleSide }), Tt = new THREE.MeshPhongMaterial({ map: u, color: 16777215, specular: 3947580, shininess: 5, side: THREE.DoubleSide }), l = D + "images/building/floor-tile.jpg", (h = c.load(l)).anisotropy = Math.min(W.capabilities.getMaxAnisotropy(), 5), h.wrapS = THREE.RepeatWrapping, h.wrapT = THREE.RepeatWrapping, (u = c.load(l)).anisotropy = Math.min(W.capabilities.getMaxAnisotropy(), 5), u.wrapS = THREE.RepeatWrapping, u.wrapT = THREE.RepeatWrapping, lt = new THREE.MeshPhongMaterial({ map: h, color: 16777215, specular: 3947580, shininess: 30, side: THREE.DoubleSide }), gt = new THREE.MeshPhongMaterial({ map: u, color: 16777215, specular: 3947580, shininess: 30, side: THREE.DoubleSide }), l = D + "images/building/floor-wood.jpg", (h = c.load(l)).anisotropy = Math.min(W.capabilities.getMaxAnisotropy(), 5), h.wrapS = THREE.RepeatWrapping, h.wrapT = THREE.RepeatWrapping, (u = c.load(l)).anisotropy = Math.min(W.capabilities.getMaxAnisotropy(), 5), u.wrapS = THREE.RepeatWrapping, u.wrapT = THREE.RepeatWrapping, ht = new THREE.MeshPhongMaterial({ map: h, color: 16777215, specular: 3947580, shininess: 20, side: THREE.DoubleSide }), ut = new THREE.MeshPhongMaterial({ map: u, color: 16777215, specular: 3947580, shininess: 20, side: THREE.DoubleSide }), l = D + "images/building/ceiling-tile2x2.jpg", (h = c.load(l)).anisotropy = Math.min(W.capabilities.getMaxAnisotropy(), 5), h.wrapS = THREE.RepeatWrapping, h.wrapT = THREE.RepeatWrapping, (u = c.load(l)).anisotropy = Math.min(W.capabilities.getMaxAnisotropy(), 5), u.wrapS = THREE.RepeatWrapping, u.wrapT = THREE.RepeatWrapping, nt = new THREE.MeshPhongMaterial({ map: h, color: 16777215, specular: 3947580, shininess: 10, side: THREE.DoubleSide }), dt = new THREE.MeshPhongMaterial({ map: u, color: 16777215, specular: 3947580, shininess: 10, side: THREE.DoubleSide }), l = D + "images/building/building-normal.jpg", (h = c.load(l)).anisotropy = Math.min(W.capabilities.getMaxAnisotropy(), 5), h.wrapS = THREE.RepeatWrapping, h.wrapT = THREE.RepeatWrapping, (u = c.load(l)).anisotropy = Math.min(W.capabilities.getMaxAnisotropy(), 5), u.wrapS = THREE.RepeatWrapping, u.wrapT = THREE.RepeatWrapping, rt = new THREE.MeshPhongMaterial({ normalMap: h, color: 16777215, specular: 3947580, shininess: 40, side: THREE.DoubleSide }), pt = new THREE.MeshPhongMaterial({ normalMap: u, color: 16777215, specular: 3947580, shininess: 40, side: THREE.DoubleSide }), rt.color.setStyle(F.filter(e => e.name === da.interiorPanelColor).map(e => e.hex)), pt.color.setStyle(F.filter(e => e.name === da.interiorPanelColor).map(e => e.hex)), (c = new THREE.LWOLoader).setResourcePath(D + "images/"), c.load(D + "objects/Mansards.lwo", function(e) { e.meshes.forEach(function(t) { t.visible = !1, t.castShadow = !0, t.receiveShadow = !0, t.frustumCulled = !1, 0 < t.material.length ? t.material.forEach(function(e) { t.hasOwnProperty("morphTargetInfluences") && (e.morphTargets = !0), "MeshStandardMaterial" == e.type && null !== e.roughnessMap && (e.roughness = 1) }) : (t.hasOwnProperty("morphTargetInfluences") && (t.material.morphTargets = !0), "MeshStandardMaterial" == t.material.type && null !== t.material.roughnessMap && (t.material.roughness = 1)), ra.add(t) }) }); var T = new THREE.LoadingManager, b = ((c = new THREE.LWOLoader).setResourcePath(D + "images/"), c.load(D + "objects/Cupola.lwo", function(e) { e.meshes.forEach(function(t) { t.visible = !1, t.castShadow = !0, t.receiveShadow = !0, 0 < t.material.length ? t.material.forEach(function(e) { e.castShadow = !0, e.receiveShadow = !0, t.hasOwnProperty("morphTargetInfluences") && (e.morphTargets = !0) }) : (t.material.castShadow = !0, t.material.receiveShadow = !0, t.hasOwnProperty("morphTargetInfluences") && (t.material.morphTargets = !0)), ra.add(t); for (let e = 1; e <= vt; e++) { var a = t.clone(); a.visible = !1, a.name = t.name + "-" + e, da[t.name] >= e && (a.visible = !0), na.add(a) } }) }), (c = new THREE.LWOLoader).setResourcePath(D + "images/"), c.load(D + "objects/WeatherVane.lwo", function(e) { e.meshes.forEach(function(t) { t.visible = !1, ra.add(t); for (let e = 1; e <= Et; e++) { var a = t.clone(); a.visible = !1, a.name = t.name + "-" + e, na.add(a) } }) }), da.hasOwnProperty("ridgeVents") && ((c = new THREE.LWOLoader).setResourcePath(D + "images/"), c.load(D + "objects/RidgeVents.lwo", function(e) { e.meshes.forEach(function(e) { e.visible = !1, ra.add(e) }) })), r = new THREE.PlaneGeometry(350, 350, 1), s = new THREE.MeshBasicMaterial({ color: 16776960 }), R ? s.wireframe = !0 : (s.transparent = !0, s.opacity = 0), (ce = new THREE.Mesh(r, s)).position.y = 1, ce.rotation.x = THREE.Math.degToRad(-90), ia.add(ce), (de = new THREE.Group).name = "measurementsNull", ia.add(de), c.load(D + "objects/measure.lwo", function(e) { e.meshes.forEach(function(e) { e.visible = !1, e.frustumCulled = !1, e.userData.fileType = "lwo", ra.add(e) }) }), c.load(D + "objects/WindowsDoors.lwo", function(e) { e.meshes.forEach(function(t) { t.visible = !1, 0 < t.material.length ? t.material.forEach(function(e) { e.castShadow = !0, e.receiveShadow = !0, e.emissive.setHex(0), t.hasOwnProperty("morphTargetInfluences") && (e.morphTargets = !0) }) : (t.material.castShadow = !0, t.material.receiveShadow = !0, t.material.emissive.setHex(0), t.hasOwnProperty("morphTargetInfluences") && (t.material.morphTargets = !0)), ra.add(t) }) }), (pa = new THREE.Group).name = "RigidFramingParent", na.add(pa), (ma = new THREE.Group).name = "RigidFramingMaster", pa.add(ma), (c = new THREE.LWOLoader).load(D + "objects/Frame-Rigid.lwo", function(e) { e.meshes.forEach(function(t) { t.visible = !1, t.frustumCulled = !1, 0 < t.material.length ? t.material.forEach(function(e) { e.castShadow = !0, e.receiveShadow = !0, t.hasOwnProperty("morphTargetInfluences") && (e.morphTargets = !0) }) : (t.material.castShadow = !0, t.material.receiveShadow = !0, t.hasOwnProperty("morphTargetInfluences") && (t.material.morphTargets = !0)), ma.add(t) }), (d = pa.getObjectByName("columnSide").clone()).name = "columnSideR", d.visible = !0, d.rotation.y = THREE.Math.degToRad(180), d.position.y = .05, da.settings.ridgidFrameStraightColumns && (d.morphTargetInfluences[d.morphTargetDictionary.unTaper] = 1), ma.add(d), (d = pa.getObjectByName("columnSide").clone()).name = "columnSideL", d.visible = !0, d.position.y = .05, da.settings.ridgidFrameStraightColumns && (d.morphTargetInfluences[d.morphTargetDictionary.unTaper] = 1), ma.add(d), (d = pa.getObjectByName("beamRoof").clone()).name = "beamRoofR", d.visible = !0, d.rotation.y = THREE.Math.degToRad(180), d.position.y = .05, ma.add(d), (d = pa.getObjectByName("beamRoof").clone()).name = "beamRoofL", d.visible = !0, d.position.y = .05, ma.add(d), ma.traverse(function(e) { e instanceof THREE.Mesh && "Truss" == e.material.name && e.material.color.copy(Ea) }) }), (Ta = new THREE.Group).name = "PostFrameParent", na.add(Ta), (ba = new THREE.Group).name = "PostFrameMaster", Ta.add(ba), (c = new THREE.LWOLoader).setResourcePath(D + "images/"), c.load(D + "objects/Frame-PostFrame.lwo", function(e) { e.meshes.forEach(function(t) { t.visible = !1, t.frustumCulled = !1, t.castShadow = !0, 0 < t.material.length ? t.material.forEach(function(e) { e.castShadow = !0, e.receiveShadow = !0, t.hasOwnProperty("morphTargetInfluences") && (e.morphTargets = !0) }) : (t.material.castShadow = !0, t.material.receiveShadow = !0, t.hasOwnProperty("morphTargetInfluences") && (t.material.morphTargets = !0)), ba.add(t) }), (d = Ta.getObjectByName("columnSide").clone()).name = "columnSideR", d.visible = !0, d.rotation.y = THREE.Math.degToRad(180), d.position.y = .05, ba.add(d), (d = Ta.getObjectByName("columnSide").clone()).name = "columnSideL", d.visible = !0, d.position.y = .05, ba.add(d); e = Ta.getObjectByName("webbing").clone(); if (e.name = "webbingVertR1", e.visible = !1, ba.add(e), (e = Ta.getObjectByName("webbing").clone()).name = "webbingVertR2", e.visible = !1, ba.add(e), (e = Ta.getObjectByName("webbing").clone()).name = "webbingVertL1", e.visible = !1, ba.add(e), (e = Ta.getObjectByName("webbing").clone()).name = "webbingVertL2", e.visible = !1, ba.add(e), (e = Ta.getObjectByName("webbing").clone()).name = "webbingDiagR1", e.visible = !1, ba.add(e), (e = Ta.getObjectByName("webbing").clone()).name = "webbingDiagR2", e.visible = !1, ba.add(e), (e = Ta.getObjectByName("webbing").clone()).name = "webbingDiagL1", e.visible = !1, ba.add(e), (e = Ta.getObjectByName("webbing").clone()).name = "webbingDiagL2", e.visible = !1, ba.add(e), (d = Ta.getObjectByName("beamRoof").clone()).name = "beamRoofR", d.visible = !0, d.rotation.y = THREE.Math.degToRad(180), d.position.y = .05, ba.add(d), (d = Ta.getObjectByName("beamRoof").clone()).name = "beamRoofL", d.visible = !0, d.position.y = .05, ba.add(d), (d = Ta.getObjectByName("truss")).visible = !0, da.settings.showLogoOnTruss) { let e = ia.getObjectByName("postLogo").clone(); e.visible = !0, e.frustumCulled = !1, e.position.z = .3, e.position.y = -.35, e.scale.set(1.1, 1.1, 1.1), d.add(e), (e = e.clone()).visible = !0, e.frustumCulled = !1, e.rotation.y = THREE.Math.degToRad(180), e.position.z = -.3, d.add(e) } }), (wa = new THREE.Group).name = "OpenWebFrameParent", wa.visible = !1, na.add(wa), (va = new THREE.Group).name = "OpenWebFrameMaster", wa.add(va), (c = new THREE.LWOLoader).setResourcePath(D + "images/"), c.load(D + "objects/Frame-OpenWebFrame.lwo", function(e) { e.meshes.forEach(function(t) { t.visible = !1, t.frustumCulled = !1, t.castShadow = !0, 0 < t.material.length ? t.material.forEach(function(e) { e.castShadow = !0, e.receiveShadow = !0, t.hasOwnProperty("morphTargetInfluences") && (e.morphTargets = !0) }) : (t.material.castShadow = !0, t.material.receiveShadow = !0, t.hasOwnProperty("morphTargetInfluences") && (t.material.morphTargets = !0)), va.add(t) }), da.hasOwnProperty("frameConstruction") && "I-beams" == da.frameConstruction ? ((d = wa.getObjectByName("beamRoof").clone()).name = "columnSideR", d.visible = !0, d.rotation.y = THREE.Math.degToRad(180), d.rotation.z = THREE.Math.degToRad(90), d.position.y = .05, va.add(d), (d = wa.getObjectByName("beamRoof").clone()).name = "columnSideL", d.visible = !0, d.rotation.z = THREE.Math.degToRad(90), d.position.y = .05, va.add(d)) : ((d = wa.getObjectByName("columnSide").clone()).name = "columnSideR", d.visible = !0, d.rotation.y = THREE.Math.degToRad(180), d.position.y = .05, va.add(d), (d = wa.getObjectByName("columnSide").clone()).name = "columnSideL", d.visible = !0, d.position.y = .05, va.add(d), (d = wa.getObjectByName("columnTubeSide").clone()).name = "columnTubeSideR", d.visible = !1, d.rotation.y = THREE.Math.degToRad(180), d.position.y = .05, va.add(d), (d = wa.getObjectByName("columnTubeSide").clone()).name = "columnTubeSideL", d.visible = !1, d.position.y = .05, va.add(d)), (d = wa.getObjectByName("columnSideInner").clone()).name = "columnSideInnerR", d.visible = !da.hasOwnProperty("frameConstruction") || "I-beams" != da.frameConstruction, d.rotation.y = THREE.Math.degToRad(180), d.position.y = .05, va.add(d), (d = wa.getObjectByName("columnSideInner").clone()).name = "columnSideInnerL", d.visible = !da.hasOwnProperty("frameConstruction") || "I-beams" != da.frameConstruction, d.position.y = .05, va.add(d), (d = wa.getObjectByName("beamRoof").clone()).name = "beamRoofR", d.applyMatrix((new THREE.Matrix4).makeScale(-1, 1, 1)), d.visible = !0, d.rotation.y = THREE.Math.degToRad(180), d.position.y = .05, va.add(d), (d = wa.getObjectByName("beamRoof").clone()).name = "beamRoofL", d.visible = !0, d.position.y = .05, va.add(d), (d = wa.getObjectByName("beamRoofInner").clone()).name = "beamRoofInnerR", d.visible = !da.hasOwnProperty("frameConstruction") || "I-beams" != da.frameConstruction, d.rotation.y = THREE.Math.degToRad(180), d.position.y = .05, va.add(d), (d = wa.getObjectByName("beamRoofInner").clone()).applyMatrix((new THREE.Matrix4).makeScale(-1, 1, 1)), d.name = "beamRoofInnerL", d.visible = !da.hasOwnProperty("frameConstruction") || "I-beams" != da.frameConstruction, d.position.y = .05, va.add(d), (d = wa.getObjectByName("trussVert").clone()).name = "columnSideTangentR", d.visible = !da.hasOwnProperty("frameConstruction") || "I-beams" != da.frameConstruction, d.rotation.y = THREE.Math.degToRad(180), d.position.y = .05, va.add(d), (d = wa.getObjectByName("trussVert").clone()).name = "columnSideTangentL", d.visible = !da.hasOwnProperty("frameConstruction") || "I-beams" != da.frameConstruction, d.position.y = .05, va.add(d) }), (ya = new THREE.Group).name = "HybridFrameParent", ya.visible = !1, na.add(ya), (fa = new THREE.Group).name = "HybridFrameMaster", ya.add(fa), (c = new THREE.LWOLoader).setResourcePath(D + "images/"), c.load(D + "objects/Frame-HybridFrame.lwo", function(e) { e.meshes.forEach(function(t) { t.visible = !1, t.frustumCulled = !1, t.castShadow = !0, 0 < t.material.length ? t.material.forEach(function(e) { e.castShadow = !0, e.receiveShadow = !0, t.hasOwnProperty("morphTargetInfluences") && (e.morphTargets = !0) }) : (t.material.castShadow = !0, t.material.receiveShadow = !0, t.hasOwnProperty("morphTargetInfluences") && (t.material.morphTargets = !0)), fa.add(t) }), (d = ya.getObjectByName("columnSide").clone()).name = "columnSideR", d.visible = !0, d.rotation.y = THREE.Math.degToRad(180), d.position.y = .05, fa.add(d), (d = ya.getObjectByName("columnSide").clone()).name = "columnSideL", d.visible = !0, d.position.y = .05, fa.add(d); e = ya.getObjectByName("trussVert").clone(); e.name = "trussVertR1", e.applyMatrix((new THREE.Matrix4).makeScale(-1, 1, 1)), e.visible = !da.hasOwnProperty("frameConstruction") || "I-beams" != da.frameConstruction, fa.add(e), (e = ya.getObjectByName("trussVert").clone()).name = "trussVertR2", e.visible = !da.hasOwnProperty("frameConstruction") || "I-beams" != da.frameConstruction, fa.add(e), (e = ya.getObjectByName("trussVert").clone()).name = "trussVertL1", e.visible = !da.hasOwnProperty("frameConstruction") || "I-beams" != da.frameConstruction, fa.add(e), (e = ya.getObjectByName("trussVert").clone()).name = "trussVertL2", e.applyMatrix((new THREE.Matrix4).makeScale(-1, 1, 1)), e.visible = !da.hasOwnProperty("frameConstruction") || "I-beams" != da.frameConstruction, fa.add(e), (d = ya.getObjectByName("beamRoof").clone()).name = "beamRoofR", d.applyMatrix((new THREE.Matrix4).makeScale(-1, 1, 1)), d.visible = !0, d.rotation.y = THREE.Math.degToRad(180), d.position.y = .05, fa.add(d), (d = ya.getObjectByName("beamRoof").clone()).name = "beamRoofL", d.visible = !0, d.position.y = .05, fa.add(d), fa.traverse(function(e) { e instanceof THREE.Mesh && "Truss" == e.material.name && e.material.color.copy(Ea) }) }), (ga = new THREE.Group).name = "SteelTrussFramingParent", ga.visible = !1, na.add(ga), (ua = new THREE.Group).name = "SteelTrussFramingMaster", ga.add(ua), (c = new THREE.LWOLoader).load(D + "objects/Frame-SteelTruss.lwo", function(e) { e.meshes.forEach(function(t) { t.visible = !1, t.frustumCulled = !1, 0 < t.material.length ? t.material.forEach(function(e) { e.castShadow = !0, e.receiveShadow = !0, t.hasOwnProperty("morphTargetInfluences") && (e.morphTargets = !0) }) : (t.material.castShadow = !0, t.material.receiveShadow = !0, t.hasOwnProperty("morphTargetInfluences") && (t.material.morphTargets = !0)), ua.add(t) }), (d = ga.getObjectByName("columnSide").clone()).name = "columnSideR", d.visible = !0, d.rotation.y = THREE.Math.degToRad(180), d.position.y = .05, ua.add(d), (d = ga.getObjectByName("columnSide").clone()).name = "columnSideL", d.visible = !0, d.position.y = .05, ua.add(d); e = ga.getObjectByName("webbing").clone(); e.name = "webbingVertR1", e.visible = !1, ua.add(e), (e = ga.getObjectByName("webbing").clone()).name = "webbingVertR2", e.visible = !1, ua.add(e), (e = ga.getObjectByName("webbing").clone()).name = "webbingVertL1", e.visible = !1, ua.add(e), (e = ga.getObjectByName("webbing").clone()).name = "webbingVertL2", e.visible = !1, ua.add(e), (e = ga.getObjectByName("webbing").clone()).name = "webbingDiagR1", e.visible = !1, ua.add(e), (e = ga.getObjectByName("webbing").clone()).name = "webbingDiagR2", e.visible = !1, ua.add(e), (e = ga.getObjectByName("webbing").clone()).name = "webbingDiagL1", e.visible = !1, ua.add(e), (e = ga.getObjectByName("webbing").clone()).name = "webbingDiagL2", e.visible = !1, ua.add(e), (d = ga.getObjectByName("beamRoof").clone()).name = "beamRoofR", d.visible = !0, d.rotation.y = THREE.Math.degToRad(180), d.position.y = .05, ua.add(d), (d = ga.getObjectByName("beamRoof").clone()).name = "beamRoofL", d.visible = !0, d.position.y = .05, ua.add(d), (d = ga.getObjectByName("truss")).visible = !0, ua.traverse(function(e) { e instanceof THREE.Mesh && "Truss" == e.material.name && e.material.color.copy(Ea) }) }), r = new THREE.BoxGeometry(.125, 1, 1), s = new THREE.MeshPhongMaterial({ color: Ea, name: "framing", specular: 3947580, shininess: 40 }), new THREE.Mesh(r, s)), y = (b.visible = !1, b.castShadow = !0, b.receiveShadow = !1, b.name = "masterSecondaryFramingPiece", ra.add(b), (r = new THREE.BoxGeometry(.2, .085, 1)).translate(-.1, 0, 0), s = new THREE.MeshPhongMaterial({ color: 12026452, name: "mezzanineWood", specular: 5394505, shininess: 15 }), new THREE.Mesh(r, s)), f = (y.visible = !1, y.name = "MezzanineWood", ra.add(y), (r = new THREE.BoxGeometry(.2, .085, 1)).translate(-.1, 0, 0), s = new THREE.MeshPhongMaterial({ color: 7895160, name: "mezzanineFrame", specular: 5394505, shininess: 15 }), new THREE.Mesh(r, s)); f.visible = !1, f.name = "Mezzanine", ra.add(f), r = new THREE.PlaneGeometry(1, 1, 1), s = new THREE.MeshBasicMaterial({ color: 65535 }), R ? s.wireframe = !0 : (s.transparent = !0, s.opacity = 0), (le = new THREE.Mesh(r, s)).position.y = .05, le.rotation.x = THREE.Math.degToRad(-90), ia.add(le), (he = new THREE.Group).name = "interiorNull", ia.add(he), c.load(D + "objects/interiorObjects.lwo", function(e) { e.meshes.forEach(function(e) { e.visible = !1, e.frustumCulled = !1, e.userData.fileType = "lwo", ra.add(e) }), (Y = ia.getObjectByName("interiorWall").clone()).visible = da.divisionWall, Y.name = "dividingWall"; var e = D + "images/building/building-normal.jpg", t = (new THREE.TextureLoader).load(e), e = (t.anisotropy = Math.min(W.capabilities.getMaxAnisotropy(), 5), t.wrapS = THREE.RepeatWrapping, t.wrapT = THREE.RepeatWrapping, D + "images/building/OSB.jpg"), a = (new THREE.TextureLoader).load(e); a.anisotropy = Math.min(W.capabilities.getMaxAnisotropy(), 5), a.wrapS = THREE.RepeatWrapping, a.wrapT = THREE.RepeatWrapping; for (let e = 0; e < Y.material.length; e++) "interiorWallUpper" === Y.material[e].name && (Y.material[e].normalMap = t, Y.userData.metalTexture = t, Y.userData.topMaterial = Y.material[e]), "interiorWallLower" === Y.material[e].name && (Y.material[e].map = a, Y.userData.woodTexture = a, Y.userData.bottomMaterial = Y.material[e]); na.add(Y) }), (c = new THREE.LWOLoader).setResourcePath(D + "images/"), c.load(D + "objects/Building.lwo", function(e) { e.meshes.forEach(function(t) { t.visible = !1, t.frustumCulled = !1, t.castShadow = !0, t.receiveShadow = !0, 0 < t.material.length ? t.material.forEach(function(e) { e.castShadow = !0, e.receiveShadow = !0, t.hasOwnProperty("morphTargetInfluences") && (e.morphTargets = !0) }) : (t.material.castShadow = !0, t.material.receiveShadow = !0, t.hasOwnProperty("morphTargetInfluences") && (t.material.morphTargets = !0)), "roofR" == t.name && ((sa = t).visible = !0, (la = t.GdeepCloneMaterials()).name = "roofL", la.visible = !0, la.rotation.y = Math.PI, la.material.side = THREE.DoubleSide, la.castShadow = !0, la.receiveShadow = !0, la.frustumCulled = !1, na.add(la)), "building" == t.name && ((_ = t).castShadow = !0, _.receiveShadow = !0, _.visible = !0), t.name.startsWith("Logo") && t.material.forEach(function(e) { var t; "Logo" == e.name && (t = (c = new THREE.TextureLoader).load("images/logo-square.jpg"), e.map = t, e.needsUpdate = !0) }), na.add(t) }) }), (c = new THREE.LWOLoader).setResourcePath(D + "images/"), c.load(D + "objects/" + J.object, function(e) { e.meshes.forEach(function(t) { t.visible = !0, t.castShadow = !1, t.receiveShadow = !0, t.frustumCulled = !1, 0 < t.material.length ? t.material.forEach(function(e) { void 0 !== t.morphTargetDictionary && (e.morphTargets = !0), "MeshStandardMaterial" == e.type && null !== e.roughnessMap && (e.roughness = 1) }) : (void 0 !== t.morphTargetDictionary && (t.material.morphTargets = !0), "MeshStandardMaterial" == t.material.type && null !== t.material.roughnessMap && (t.material.roughness = 1)), na.add(t) }) }), (c = new THREE.LWOLoader).load(D + "objects/dimensions.lwo", function(e) { e.meshes.forEach(function(t) { t.visible = !1, t.castShadow = !1, t.receiveShadow = !1, t.frustumCulled = !1, 0 < t.material.length ? t.material.forEach(function(e) { void 0 !== t.morphTargetDictionary && (e.morphTargets = !0), "MeshStandardMaterial" == e.type && null !== e.roughnessMap && (e.roughness = 1) }) : (void 0 !== t.morphTargetDictionary && (t.material.morphTargets = !0), "MeshStandardMaterial" == t.material.type && null !== t.material.roughnessMap && (t.material.roughness = 1), t.material.color.setHex(0), t.material.emissive.setHex(0)), ra.add(t) }) }), Ye = new THREE.Plane(new THREE.Vector3(-1, 0, 0), 0), Ze = new THREE.Plane(new THREE.Vector3(1, 0, 0), 0), Je = new THREE.Plane(new THREE.Vector3(-1, 0, 0), 0), Ke = new THREE.Plane(new THREE.Vector3(1, 0, 0), 0), et = new THREE.Plane(new THREE.Vector3(1, 0, 0), 0), tt = new THREE.Plane(new THREE.Vector3(-1, 0, 0), 0), at = new THREE.Plane(new THREE.Vector3(0, 0, 1), 0), ot = new THREE.Plane(new THREE.Vector3(0, 0, -1), 0), it = new THREE.Plane(new THREE.Vector3(0, 0, -1), 0), Qe = [Ye, Ze, Je, Ke], Xe = [at, ot], R && (p = new THREE.PlaneHelper(Ye, 35, 16776960), na.add(p)), R && (m = new THREE.PlaneHelper(Ze, 35, 65535), na.add(m)), R && (e = new THREE.PlaneHelper(Je, 35, 15921664), na.add(e)), R && (g = new THREE.PlaneHelper(Ke, 35, 62194), na.add(g)), R && (T = new THREE.PlaneHelper(et, 35, 15921664), ia.add(T)), R && (b = new THREE.PlaneHelper(tt, 35, 62194), ia.add(b)), R && (y = new THREE.PlaneHelper(at, 35, 15921664), na.add(y)), R && (f = new THREE.PlaneHelper(ot, 35, 62194), na.add(f)), R && (p = new THREE.PlaneHelper(it, 35, 62194), na.add(p)), R && ((Dt = new Stats).domElement.style.position = "absolute", Dt.domElement.style.bottom = "0px", Dt.domElement.style.zIndex = 100, document.getElementById("builder").appendChild(Dt.domElement), console.log(ia), console.log(da)) } function ka() { if (Z && !1 !== Nt) for (var e in Nt) Nt.hasOwnProperty(e) && l(Nt[e].name.replace("-clone", ""), Nt[e]); if (Z && !1 !== Lt) for (var t in Lt) Lt.hasOwnProperty(t) && s(Lt[t].name.replace("scale-", "").replace("-clone", ""), Lt[t]); if (Z && !1 !== Ht && 0 < Ht.length && Ht.forEach(function(e) { var t = e.name.replace("-clone", ""), a = t.replace("porch", "").replace("Wrap", "").replace("Hip", "").replace("GableExtension", ""), o = t.replace(a, ""); _a(da[t], a, o, e) }), Z && !1 !== Ct) for (var a in Ct) Ct.hasOwnProperty(a) && oo(Ct[a].name.replace("-clone", ""), Ct[a]); var o, i, n = !1; for (o in Pt) n = !!Pt.hasOwnProperty(o); if (n) for (var r in Pt) Pt.hasOwnProperty(r) && (i = (r = Pt[r].split(","))[0], r.shift(), l(i, r)); Z = !1, ve = T, T = null, Io(), ia.traverse(function(e) { e.userData.hasOwnProperty("hasBoundingBox") && e.userData.hasBoundingBox && Go(e) }) } function Ga() { _o(), requestAnimationFrame(Ga), G && (W.render(ia, M), G = !1), R && Dt.update(), TWEEN.update(), P.update(), H.update(), Po() } function $a() { var e = ia.getObjectByName("foundation"), t = 0, a = 0, o = 0, i = 0; da.leanTo2 && (t = da.leanTo2Depth), da.leanTo4 && (a = da.leanTo4Depth), da.leanTo1 && (o = da.leanTo1Depth), da.leanTo3 && (i = da.leanTo3Depth), da.hasOwnProperty("coveredGableExtensionE") && da.coveredGableExtensionE && da.coveredGableExtensionEEnclosed && (t = Math.max(t, da.coveredGableExtensionEDepth)), da.hasOwnProperty("coveredGableExtensionW") && da.coveredGableExtensionW && da.coveredGableExtensionWEnclosed && (a = Math.max(a, da.coveredGableExtensionWDepth)), da.hasOwnProperty("coveredGableExtensionN") && da.coveredGableExtensionN && da.coveredGableExtensionNEnclosed && (o = Math.max(o, da.coveredGableExtensionNDepth)), da.hasOwnProperty("coveredGableExtensionS") && da.coveredGableExtensionS && da.coveredGableExtensionSEnclosed && (i = Math.max(i, da.coveredGableExtensionSDepth)), e.scale.x = da.width + t + a + 8 / 12, e.scale.z = da.depth + o + i + 8 / 12, e.position.x = (a - t) / 2, e.position.z = (o - i) / 2, e.material.map.repeat.set((da.width + 8 / 12) / 10, (da.depth + 8 / 12) / 10), e.material.map.offset.x = (da.width + 8 / 12) / -20 + .5, e.material.map.offset.y = (da.depth + 8 / 12) / -20 + .5, void 0 !== le && (le.scale.x = e.scale.x - 1, le.scale.y = e.scale.z - 1, le.position.x = e.position.x, le.position.z = e.position.z), H.target.set(ia.getObjectByName("foundation").position.x, 0, ia.getObjectByName("foundation").position.z), E.position.set(ia.getObjectByName("foundation").position.x, 50, ia.getObjectByName("foundation").position.z), St && (a = da.buildingWithPorchesDimensions(), void 0 !== ia.getObjectByName("North") && a.northEdge && (ia.getObjectByName("North").position.z = a.northEdge + 10), void 0 !== ia.getObjectByName("East") && a.eastEdge && (ia.getObjectByName("East").position.x = a.eastEdge - 10), void 0 !== ia.getObjectByName("South") && a.southEdge && (ia.getObjectByName("South").position.z = a.southEdge - 10), void 0 !== ia.getObjectByName("West")) && a.westEdge && (ia.getObjectByName("West").position.x = a.westEdge + 10) } function x() { let o; if (da.hasOwnProperty("size") && (C = da.size.split("x"), da.width = parseInt(C[0].replace("'", "")), da.depth = parseInt(C[1].replace("'", ""))), da.hasOwnProperty("frameConstruction") && ("Weld Up" == da.frameConstruction && (da.settings.ridgidFrameStraightColumns = !0), "Bolt Up" == da.frameConstruction && (da.settings.ridgidFrameStraightColumns = !1), C = ma.getObjectByName("columnSideR"), e = ma.getObjectByName("columnSideL"), da.settings.ridgidFrameStraightColumns ? (C.morphTargetInfluences[C.morphTargetDictionary.unTaper] = 1, e.morphTargetInfluences[e.morphTargetDictionary.unTaper] = 1) : (C.morphTargetInfluences[C.morphTargetDictionary.unTaper] = 0, e.morphTargetInfluences[e.morphTargetDictionary.unTaper] = 0)), da.hasOwnProperty("location")) { switch (da.location) { case "Saskatchewan": da.flushGirts = !1, da.flushPurlins = !1, da.girtSpacing = 2, da.purlinSpacing = 2; break; case "Manitoba": da.flushGirts = !0, da.flushPurlins = !0, da.girtSpacing = 4, da.purlinSpacing = 2 } ee !== da.location && (ee = da.location, F.forEach(function(e) {})) } da.secondaryMembers; switch (da.secondaryMembers) { case "Insulated Panels": Ea = At; break; case "Red Iron": Ea = Qt; break; case "Metal": case "Steel": Ea = Ut; break; default: Ea = At } if (ma.traverse(function(e) { e instanceof THREE.Mesh && "Truss" == e.material.name && e.material.color.copy(Ea) }), ra.getObjectByName("masterSecondaryFramingPiece").material.color.copy(Ea), da.roofType, k.__folders.hasOwnProperty("Interior")) for (let e = 0; e < k.__folders.Interior.__controllers.length; e++) { var t = k.__folders.Interior.__controllers[e]; "divisionAmount" === t.property && (t.max(da.depth), da.divisionAmount > da.depth - 8 && (da.divisionAmount = da.depth - 8), t.updateDisplay()) } if ("Asymmetrical" === da.roofType && k.__folders.hasOwnProperty("Building Dimensions")) for (let e = 0; e < k.__folders["Building Dimensions"].__controllers.length; e++) { var a = k.__folders["Building Dimensions"].__controllers[e]; "asymmetrical" === a.property && (a.domElement.parentElement.parentElement.hidden = !1, a.min(da.width / -2 + 3), a.max(da.width / 2 - 3), da.asymmetrical < da.width / -2 + 3 && (da.asymmetrical = da.width / -2 + 3), da.asymmetrical > da.width / 2 - 3 && (da.asymmetrical = da.width / 2 - 3), a.updateDisplay()) } da.settings.hasOwnProperty("alternateTrussSpacingOver40FT") && (40 < da.width ? da.maxTrussSpacing = da.settings.alternateTrussSpacingOver40FT.over : da.maxTrussSpacing = da.settings.alternateTrussSpacingOver40FT.under), da.settings.hasOwnProperty("alternatePostSpacingOver40FT") && (40 < da.width ? da.maxPostSpacing = da.settings.alternatePostSpacingOver40FT.over : da.maxPostSpacing = da.settings.alternatePostSpacingOver40FT.under), Ye.constant = da.width / -2, Ze.constant = da.width / -2, at.constant = da.depth / -2, ot.constant = da.depth / -2; let i, n = 0; var r = da.eaveLightHeight / 12; if (void 0 === na.getObjectByName("eaveLightsClones") && void 0 === na.getObjectByName("eaveLightsClones") && ((i = new THREE.Group).name = "eaveLightsClones", na.add(i)), void 0 !== na.getObjectByName("eaveLightsClones")) { na.remove(na.getObjectByName("eaveLightsClones")), void 0 === na.getObjectByName("eaveLightsClones") && ((i = new THREE.Group).name = "eaveLightsClones", na.add(i)); let t = -.15, a = -.15; var s, l, h = .25, c = da.eaveLightWidth / 12; if ("Single Slope" === da.roofType && (n = da.width * da.roofPitch / 12, t += da.roofHeightAtX(da.width / -2) - da.height, a += da.roofHeightAtX(da.width / 2) - da.height), da.eaveLightsEast) for (let e = 0; e <= (da.depth - .5) / c; e++)(o = ra.getObjectByName("eaveLight").clone()).position.set(da.width / -2, da.height + t, da.depth / -2 + c / 2 + e * c + h), o.morphTargetInfluences[o.morphTargetDictionary.height] = r - 1, o.morphTargetInfluences[o.morphTargetDictionary.width] = c - 1, e + 1 > (da.depth - .5) / c && (s = da.depth / 2 - o.position.z - h + c / 2, o.morphTargetInfluences[o.morphTargetDictionary.width] = s - 1, o.position.z += (c - s) / -2), o.name = "eaveLight-clone", o.visible = !0, i.add(o); if (da.eaveLightsWest) for (let e = 0; e <= (da.depth - .5) / c; e++)(o = ra.getObjectByName("eaveLight").clone()).position.set(da.width / 2, da.height + a, da.depth / -2 + c / 2 + e * c + h), o.morphTargetInfluences[o.morphTargetDictionary.height] = r - 1, o.morphTargetInfluences[o.morphTargetDictionary.width] = c - 1, e + 1 > (da.depth - .5) / c && (l = da.depth / 2 - o.position.z - h + c / 2, o.morphTargetInfluences[o.morphTargetDictionary.width] = l - 1, o.position.z += (c - l) / -2), o.name = "eaveLight-clone", o.visible = !0, i.add(o) } let d; if (void 0 === na.getObjectByName("eaveLightPanelClones") && void 0 === na.getObjectByName("eaveLightPanelClones") && ((d = new THREE.Group).name = "eaveLightPanelClones", na.add(d)), void 0 !== na.getObjectByName("eaveLightPanelClones")) { if (na.remove(na.getObjectByName("eaveLightPanelClones")), void 0 === na.getObjectByName("eaveLightPanelClones") && ((d = new THREE.Group).name = "eaveLightPanelClones", na.add(d)), n = .1, "Single Slope" === da.roofType && (n = da.width * da.roofPitch / 12), da.eaveLightPanelsEast) for (let e = 0; e <= da.depth - 2; e++)(o = ra.getObjectByName("eaveLightPanel").clone()).position.set(da.width / -2, da.height - .25 + Math.max(n, 0), e - (da.depth - 2) / 2), o.rotation.y = THREE.Math.degToRad(90), o.morphTargetInfluences[o.morphTargetDictionary.height] = r - 1, o.name = "eaveLightPanel-clone", o.visible = !0, d.add(o); if (da.eaveLightPanelsWest) for (let e = 0; e <= da.depth - 2; e++)(o = ra.getObjectByName("eaveLightPanel").clone()).position.set(da.width / 2, da.height - .25 + Math.max(n, 0), e - (da.depth - 2) / 2), o.rotation.y = THREE.Math.degToRad(-90), o.morphTargetInfluences[o.morphTargetDictionary.height] = r - 1, o.name = "eaveLightPanel-clone", o.visible = !0, d.add(o) } if (k.__folders.hasOwnProperty(xt)) { if (k.__folders[xt].__folders.hasOwnProperty(J.N.name + " " + Ot)) for (let e = 0; e < k.__folders[xt].__folders[J.N.name + " " + Ot].__controllers.length; e++) { var p = k.__folders[xt].__folders[J.N.name + " " + Ot].__controllers[e]; "leanTo1Drop" === p.property && (p.max(Math.round(da.height - da.leanTo1Pitch / 12 * da.leanTo1Depth - 3)), !Z && da.leanTo1Drop > p.__max && (da.leanTo1Drop = p.__max), da.leanTo1Drop < 0 && (da.leanTo1Drop = 0), da.leanTo1Height = da.height - da.leanTo1Drop, p.updateDisplay()), "leanTo1CutL" === p.property && (p.max(da.width - da.leanTo1CutR - 6), !Z && da.leanTo1CutL > p.__max && (da.leanTo1CutL = p.__max), da.leanTo1CutL < 0 && (da.leanTo1CutL = 0), p.updateDisplay()), "leanTo1CutR" === p.property && (p.max(da.width - da.leanTo1CutL - 6), !Z && da.leanTo1CutR > p.__max && (da.leanTo1CutR = p.__max), da.leanTo1CutR < 0 && (da.leanTo1CutR = 0), p.updateDisplay(), da.leanTo1Length = da.width - da.leanTo1CutL - da.leanTo1CutR), "leanTo1Height" === p.property && (p.max(da.height), !Z && da.leanTo1Height > da.height && (da.leanTo1Height = da.height), p.updateDisplay()), "leanTo1Length" === p.property && (p.max(da.width), !Z && da.leanTo1Length > da.width && (da.leanTo1Length = da.width), p.updateDisplay()) } if (k.__folders[xt].__folders.hasOwnProperty(J.S.name + " " + Ot)) for (let e = 0; e < k.__folders[xt].__folders[J.S.name + " " + Ot].__controllers.length; e++) { var m = k.__folders[xt].__folders[J.S.name + " " + Ot].__controllers[e]; "leanTo3Drop" === m.property && (m.max(Math.round(da.height - da.leanTo3Pitch / 12 * da.leanTo3Depth - 3)), !Z && da.leanTo3Drop > m.__max && (da.leanTo3Drop = m.__max), da.leanTo3Drop < 0 && (da.leanTo3Drop = 0), da.leanTo3Height = da.height - da.leanTo3Drop, m.updateDisplay()), "leanTo3CutL" === m.property && (m.max(da.width - da.leanTo3CutR - 6), !Z && da.leanTo3CutL > m.__max && (da.leanTo3CutL = m.__max), da.leanTo3CutL < 0 && (da.leanTo3CutL = 0), m.updateDisplay()), "leanTo3CutR" === m.property && (m.max(da.width - da.leanTo3CutL - 6), !Z && da.leanTo3CutR > m.__max && (da.leanTo3CutR = m.__max), da.leanTo3CutR < 0 && (da.leanTo3CutR = 0), m.updateDisplay(), da.leanTo3Length = da.width - da.leanTo3CutL - da.leanTo3CutR), "leanTo3Height" === m.property && (m.max(da.height), !Z && da.leanTo3Height > da.height && (da.leanTo3Height = da.height), m.updateDisplay()), "leanTo3Length" === m.property && (m.max(da.width), !Z && da.leanTo3Length > da.width && (da.leanTo3Length = da.width), m.updateDisplay()) } if (k.__folders[xt].__folders.hasOwnProperty(J.E.name + " " + Ot)) for (let e = 0; e < k.__folders[xt].__folders[J.E.name + " " + Ot].__controllers.length; e++) { var g = k.__folders[xt].__folders[J.E.name + " " + Ot].__controllers[e]; "leanTo2Drop" === g.property && (g.max(Math.round(da.wallHeightL() - da.leanTo2Pitch / 12 * da.leanTo2Depth - 3)), !Z && da.leanTo2Drop > g.__max && (da.leanTo2Drop = g.__max), da.leanTo2Drop < 0 && (da.leanTo2Drop = 0), da.leanTo2Height = da.wallHeightL() - da.leanTo2Drop, g.updateDisplay()), "leanTo2CutL" === g.property && (g.max(da.depth - da.leanTo2CutR - 6), !Z && da.leanTo2CutL > g.__max && (da.leanTo2CutL = g.__max), da.leanTo2CutL < 0 && (da.leanTo2CutL = 0), g.updateDisplay()), "leanTo2CutR" === g.property && (g.max(da.depth - da.leanTo2CutL - 6), !Z && da.leanTo2CutR > g.__max && (da.leanTo2CutR = g.__max), da.leanTo2CutR < 0 && (da.leanTo2CutR = 0), g.updateDisplay(), da.leanTo2Length = da.depth - da.leanTo2CutL - da.leanTo2CutR), "leanTo2Height" === g.property && (g.max(da.wallHeightL()), !Z && da.leanTo2Height > da.wallHeightL() && (da.leanTo2Height = da.wallHeightL()), g.updateDisplay()), "leanTo2Length" === g.property && (g.max(da.depth), !Z && da.leanTo2Length > da.depth && (da.leanTo2Length = da.depth), g.updateDisplay()) } if (k.__folders[xt].__folders.hasOwnProperty(J.W.name + " " + Ot)) for (let e = 0; e < k.__folders[xt].__folders[J.W.name + " " + Ot].__controllers.length; e++) { var u = k.__folders[xt].__folders[J.W.name + " " + Ot].__controllers[e]; "leanTo4Drop" === u.property && (u.max(Math.round(da.wallHeightR() - da.leanTo4Pitch / 12 * da.leanTo4Depth - 3)), !Z && da.leanTo4Drop > u.__max && (da.leanTo4Drop = u.__max), da.leanTo4Drop < 0 && (da.leanTo4Drop = 0), da.leanTo4Height = da.wallHeightR() - da.leanTo4Drop, u.updateDisplay()), "leanTo4CutL" === u.property && (u.max(da.depth - da.leanTo4CutR - 6), !Z && da.leanTo4CutL > u.__max && (da.leanTo4CutL = u.__max), da.leanTo4CutL < 0 && (da.leanTo4CutL = 0), u.updateDisplay()), "leanTo4CutR" === u.property && (u.max(da.depth - da.leanTo4CutL - 6), !Z && da.leanTo4CutR > u.__max && (da.leanTo4CutR = u.__max), da.leanTo4CutR < 0 && (da.leanTo4CutR = 0), u.updateDisplay(), da.leanTo4Length = da.depth - da.leanTo4CutL - da.leanTo4CutR), "leanTo4Height" === u.property && (u.max(da.wallHeightR()), !Z && da.leanTo4Height > da.wallHeightR() && (da.leanTo4Height = da.wallHeightR()), u.updateDisplay()), "leanTo4Length" === u.property && (u.max(da.depth), !Z && da.leanTo4Length > da.depth && (da.leanTo4Length = da.depth), u.updateDisplay()) } } let T; if (da.leanTo1 || da.leanTo3 || da.leanTo2 || da.leanTo4) { if (ia.getObjectByName("leanTo1")) for (let e = 1; e <= 4; e++) if (T = "leanTo" + e, ia.getObjectByName(T).visible == da[T] || Z || (1 === e || 3 === e ? da[T + "Length"] = da.width - da[T + "CutL"] - da[T + "CutR"] : da[T + "Length"] = da.depth - da[T + "CutL"] - da[T + "CutR"]), void 0 !== ia.getObjectByName(T)) { ia.getObjectByName(T).visible = da[T], ia.getObjectByName(T + "Roof").visible = da[T], 0 != da[T] && da[T + "Enclosed"] && "Fully Enclosed" === da[T + "Walls"] || (ia.getObjectByName(T + "BoundingBox").position.set(0, 0, 0), ia.getObjectByName(T + "BoundingBox").scale.set(.1, .1, .1)), 2 !== e && e; var b = ia.getObjectByName(T); if (da[T + "Enclosed"] && 0 === da.hideWalls && "Fully Enclosed" == da[T + "Walls"]) b.morphTargetInfluences[b.morphTargetDictionary.unEnclosedHeight] = 0, ia.getObjectByName(T).traverse(function(t) { if (t instanceof THREE.Mesh) for (let e = 0; e < t.material.length; e++) "BuildingWalls" !== t.material[e].name.substring(0, 13) && "BuildingWainscot" !== t.material[e].name.substring(0, 16) && "LeantoWalls" !== t.material[e].name.substring(0, 11) && "LeantoWainscot" !== t.material[e].name.substring(0, 14) && "BuildingTrim" !== t.material[e].name.substring(0, 12) || (t.material[e].visible = !0) }); else if (0 === da.hideWalls && (!da[T + "Enclosed"] || "Fully Enclosed" !== da[T + "Walls"])) if (da.settings.showLeantoWallTriangleWhenOpen || "Upper Triangles Only" == da[T + "Walls"]) b.morphTargetInfluences[b.morphTargetDictionary.unEnclosedHeight] = (da[T + "Height"] - da[T + "Pitch"] / 12 * da[T + "Depth"] - .5) / 100, ia.getObjectByName(T).traverse(function(t) { if (t instanceof THREE.Mesh) for (let e = 0; e < t.material.length; e++) "BuildingWalls" !== t.material[e].name.substring(0, 13) && "BuildingWainscot" !== t.material[e].name.substring(0, 16) && "LeantoWalls" !== t.material[e].name.substring(0, 11) && "LeantoWainscot" !== t.material[e].name.substring(0, 14) && "BuildingTrim" !== t.material[e].name.substring(0, 12) || (t.material[e].visible = !0) }); else if (da[T + "Walls"].startsWith("Length")) { let e = da[T + "Walls"].replace(/^(Length )/, ""); "Enclosed" == (e = (e = e.replace(/ft$/, "")).replace(/"$/, "")) ? b.morphTargetInfluences[b.morphTargetDictionary.unEnclosedHeight] = 0: b.morphTargetInfluences[b.morphTargetDictionary.unEnclosedHeight] = (da[T + "Height"] - da[T + "Pitch"] / 12 * da[T + "Depth"] - e) / 100, ia.getObjectByName(T).traverse(function(t) { if (t instanceof THREE.Mesh) for (let e = 0; e < t.material.length; e++)(t.material[e].name.startsWith("LeantoWallsWidth") || t.material[e].name.startsWith("LeantoWainscot1") || t.material[e].name.startsWith("LeantoWainscot3") || t.material[e].name.startsWith("LeantoWainscotTrim1") || t.material[e].name.startsWith("LeantoWainscotTrim3") || t.material[e].name.startsWith("BuildingTrim1") || t.material[e].name.startsWith("BuildingTrim3") || t.material[e].name.startsWith("BuildingTrim-Base1") || t.material[e].name.startsWith("BuildingTrim-Base3")) && (t.material[e].visible = !1), (t.material[e].name.startsWith("LeantoWallsDepth") || t.material[e].name.startsWith("LeantoWainscot2") || t.material[e].name.startsWith("LeantoWainscotTrim2") || t.material[e].name.startsWith("BuildingTrim2") || t.material[e].name.startsWith("BuildingTrim-Base2")) && (t.material[e].visible = !0) }) } else ia.getObjectByName(T).traverse(function(t) { if (t instanceof THREE.Mesh) for (let e = 0; e < t.material.length; e++) "BuildingWalls" !== t.material[e].name.substring(0, 13) && "BuildingWainscot" !== t.material[e].name.substring(0, 16) && "LeantoWalls" !== t.material[e].name.substring(0, 11) && "LeantoWainscot" !== t.material[e].name.substring(0, 14) && "BuildingTrim" !== t.material[e].name.substring(0, 12) || (t.material[e].visible = !1) }) } } else for (let e = 0; e < 4; e++) { var j = (T = "leanTo" + (e + 1)) + "BoundingBox"; void 0 !== ia.getObjectByName(T) && (ia.getObjectByName(T).visible = da[T], ia.getObjectByName(T + "Roof").visible = da[T], ia.getObjectByName(j).position.set(0, 0, 0), ia.getObjectByName(j).scale.set(.1, .1, .1)) }(da.hasOwnProperty("coveredGableExtensionN") || da.hasOwnProperty("coveredGableExtensionS") || da.hasOwnProperty("coveredGableExtensionE") || da.hasOwnProperty("coveredGableExtensionW")) && ei(ia, da, k, Z, J, ba, Ta, re, Ca, Qe, Xe, po); var y = ia.getObjectByName("building").material; for (let e = 0; e < y.length; e++) 0 !== da.hideWalls || "BuildingTrim-Corner" !== y[e].name && "BuildingTrim1" !== y[e].name && "BuildingTrim2" !== y[e].name && "BuildingTrim3" !== y[e].name && "BuildingTrim4" !== y[e].name || (y[e].visible = !0), 0 !== da.hideWalls || "BuildingWallsDepthL" !== y[e].name && "BuildingWallsDepthL-Interior" !== y[e].name && "BuildingWallsDepthR" !== y[e].name && "BuildingWallsDepthR-Interior" !== y[e].name || (y[e].visible = !0), 0 !== da.hideWalls || "BuildingWallsDepthL-Interior" !== y[e].name && "BuildingWallsDepthR-Interior" !== y[e].name && "BuildingWallsWidthLeftBack-Interior" !== y[e].name && "BuildingWallsWidthLeftFront-Interior" !== y[e].name && "BuildingWallsWidthRightBack-Interior" !== y[e].name && "BuildingWallsWidthRightFront-Interior" !== y[e].name || (y[e].visible = !0); var f, w, v = [0, 0, 0, 0, 0]; for (let e = 1; e <= 4; e++) { var z = ia.getObjectByName("building").morphTargetDictionary["TrimStartHeight" + e]; ia.getObjectByName("building").morphTargetInfluences[z] = (da.height - Math.abs(v[e] - da.height)) / 100 } da.gutters && da.hideWalls <= 1 ? ia.traverse(function(t) { if (t instanceof THREE.Mesh && t.material) if (t.material.length) for (let e = 0; e < t.material.length; e++) t.material[e].name.startsWith("Gutters") && (t.material[e].visible = !0); else t.material.name.startsWith("Downspouts") && (t.material.visible = !0) }) : ia.traverse(function(t) { if (t instanceof THREE.Mesh && t.material) if (t.material.length) for (let e = 0; e < t.material.length; e++) t.material[e].name.startsWith("Gutters") && (t.material[e].visible = !1); else t.material.name.startsWith("Downspouts") && (t.material.visible = !1) }), da.boxedOverhangs ? (C = 2 * Math.cos(da.roofPitch / 12), e = 2 * Math.atan(da.roofPitch / 12), la.morphTargetInfluences[la.morphTargetDictionary.boxedOverhangX] = e, la.morphTargetInfluences[la.morphTargetDictionary.boxedOverhangY] = C, "Single Slope" === da.roofType ? sa.morphTargetInfluences[sa.morphTargetDictionary.boxedOverhangX] = -e : sa.morphTargetInfluences[sa.morphTargetDictionary.boxedOverhangX] = e, sa.morphTargetInfluences[sa.morphTargetDictionary.boxedOverhangY] = C) : (la.morphTargetInfluences[la.morphTargetDictionary.boxedOverhangX] = 0, la.morphTargetInfluences[la.morphTargetDictionary.boxedOverhangY] = 0, sa.morphTargetInfluences[sa.morphTargetDictionary.boxedOverhangX] = 0, sa.morphTargetInfluences[sa.morphTargetDictionary.boxedOverhangY] = 0), Xa(), void 0 !== na.getObjectByName("skylightNullR") && na.remove(ia.getObjectByName("skylightNullR")), void 0 !== na.getObjectByName("skylightNullL") && na.remove(ia.getObjectByName("skylightNullL")), (f = new THREE.Group).name = "skylightNullR", f.position.copy(sa.position), f.rotation.z = sa.rotation.z, f.position.z = 0, na.add(f), (w = new THREE.Group).name = "skylightNullL", w.position.copy(la.position), w.rotation.z = la.rotation.z, w.rotation.y = THREE.Math.degToRad(180), w.position.z = 0, na.add(w); var E, P = ia.getObjectByName("skylight"); if (da.skylights) { var I = da.depth / (da.skylights / 2); let t; da.width < 25 && (da.skylights = 0); for (let e = 1; e <= da.skylights / 2; e++) o = P.clone(), t = da.depth / -2 + I * (e - .5), o.position.set(2, 0, t), o.name = "skylight-clone", o.morphTargetInfluences[o.morphTargetDictionary.width] = .2, o.morphTargetInfluences[o.morphTargetDictionary.depth] = .002, o.frustumCulled = !1, o.visible = !0, w.add(o); for (let e = 1; e <= da.skylights / 2; e++) o = P.clone(), t = da.depth / -2 + I * (e - .5), o.position.set(2, 0, -t), o.name = "skylight-clone", o.morphTargetInfluences[o.morphTargetDictionary.width] = .2, o.morphTargetInfluences[o.morphTargetDictionary.depth] = .002, o.frustumCulled = !1, o.visible = !0, f.add(o); for (let e = 0; e < P.material.length; e++) "Skylight" !== P.material[e].name && "Skylight-Inside" !== P.material[e].name || (P.material[e].normalMap.repeat.set(4, 1), P.material[e].normalMap.offset.x = 4.5) } if (0 === da.hideWalls) { da.showGableTriangleWithOpenGableWall ? (da.enclosedN ? _.morphTargetInfluences[_.morphTargetDictionary.unEnclosedHeight1] = 0 : _.morphTargetInfluences[_.morphTargetDictionary.unEnclosedHeight1] = da.height - .5, da.enclosedS ? _.morphTargetInfluences[_.morphTargetDictionary.unEnclosedHeight3] = 0 : _.morphTargetInfluences[_.morphTargetDictionary.unEnclosedHeight3] = da.height - .5) : (_.morphTargetInfluences[_.morphTargetDictionary.unEnclosedHeight1] = 0, _.morphTargetInfluences[_.morphTargetDictionary.unEnclosedHeight3] = 0); for (let e = 0; e < _.material.length; e++)((E = _.material[e]).name.startsWith("BuildingWallsWidthLeftFront") || E.name.startsWith("BuildingWallsWidthRightFront") || "BuildingWainscot1" === E.name || "BuildingWainscotTrim1" === E.name || "BuildingTrimN" === E.name || "BuildingTrim-Base1" === E.name) && (da.enclosedN || da.showGableTriangleWithOpenGableWall ? E.visible = !0 : E.visible = !1), (E.name.startsWith("BuildingWallsWidthLeftBack") || E.name.startsWith("BuildingWallsWidthRightBack") || "BuildingWainscot3" === E.name || "BuildingWainscotTrim3" === E.name || "BuildingTrimS" === E.name || "BuildingTrim-Base3" === E.name) && (da.enclosedS || da.showGableTriangleWithOpenGableWall ? E.visible = !0 : E.visible = !1), !E.name.startsWith("BuildingWallsDepthL") && "BuildingWainscot2" !== E.name && "BuildingWainscotTrim2" !== E.name && "BuildingTrimE" !== E.name && "BuildingTrim-Base2" !== E.name || (da.enclosedE ? E.visible = !0 : E.visible = !1), !E.name.startsWith("BuildingWallsDepthR") && "BuildingWainscot4" !== E.name && "BuildingWainscotTrim4" !== E.name && "BuildingTrimW" !== E.name && "BuildingTrim-Base4" !== E.name || (da.enclosedW ? E.visible = !0 : E.visible = !1), !E.name.startsWith("BuildingTrim1") || da.enclosedN || da.enclosedE || (E.visible = !1), !E.name.startsWith("BuildingTrim2") || da.enclosedS || da.enclosedE || (E.visible = !1), !E.name.startsWith("BuildingTrim3") || da.enclosedS || da.enclosedW || (E.visible = !1), !E.name.startsWith("BuildingTrim4") || da.enclosedN || da.enclosedW || (E.visible = !1), !da.hasOwnProperty("baseTrim") || E.name.startsWith("BuildingTrim-Base") && !da.baseTrim && (E.visible = !1) } if (k.__folders.hasOwnProperty("Interior")) { if (da.hasOwnProperty("perimeterWallHeight")) for (let e = 0; e < k.__folders.Interior.__controllers.length; e++) { var D = k.__folders.Interior.__controllers[e]; "perimeterWallHeight" === D.property && (D.max(da.height), D.updateDisplay(), da.perimeterWallHeight > da.height) && (da.perimeterWallHeight = da.height, no()) } if (da.divisionWall) for (let e = 0; e < k.__folders.Interior.__controllers.length; e++) { var M = k.__folders.Interior.__controllers[e]; "divisionAmount" !== M.property && "divisionMaterial" !== M.property && "perimeterWalls2" !== M.property && "flooring2" !== M.property && "ceiling2" !== M.property || (M.domElement.parentElement.parentElement.hidden = !1, M.updateDisplay()) } else if (k.__folders.hasOwnProperty("Interior")) for (let e = 0; e < k.__folders.Interior.__controllers.length; e++) { var W = k.__folders.Interior.__controllers[e]; "divisionAmount" !== W.property && "divisionMaterial" !== W.property && "perimeterWalls2" !== W.property && "flooring2" !== W.property && "ceiling2" !== W.property || (W.domElement.parentElement.parentElement.hidden = !0, W.updateDisplay()) } } if (da.divisionWall && 0 < da.divisionAmount ? Y.visible = !0 : Y.visible = !1, Y.position.z = da.depth / 2 - da.divisionAmount, Y.scale.x = da.width - 1.4, Y.scale.y = da.height - .8, "Steel" == da.divisionMaterial ? (Y.userData.topMaterial.map = null, Y.userData.topMaterial.normalMap = Y.userData.metalTexture, Y.userData.topMaterial.specular.setHex(6250335), Y.userData.topMaterial.shininess = 90, Y.userData.topMaterial.reflectivity = .05, Y.userData.topMaterial.normalMap.repeat.set(12 * (da.width - 1.4) / 9, 1), Y.userData.bottomMaterial.map = null, Y.userData.bottomMaterial.normalMap = Y.userData.metalTexture, Y.userData.bottomMaterial.specular.setHex(6250335), Y.userData.bottomMaterial.shininess = 90, Y.userData.bottomMaterial.reflectivity = .05, Y.userData.bottomMaterial.normalMap.repeat.set(12 * (da.width - 1.4) / 9, 1)) : "Half Wood" == da.divisionMaterial ? (Y.userData.topMaterial.map = null, Y.userData.topMaterial.normalMap = Y.userData.metalTexture, Y.userData.topMaterial.specular.setHex(6250335), Y.userData.topMaterial.shininess = 90, Y.userData.topMaterial.reflectivity = .05, Y.userData.topMaterial.normalMap.repeat.set(12 * (da.width - 1.4) / 9, 1), Y.userData.bottomMaterial.map = Y.userData.woodTexture, Y.userData.bottomMaterial.normalMap = null, Y.userData.bottomMaterial.specular.setHex(2500134), Y.userData.bottomMaterial.shininess = 5.117649, Y.userData.bottomMaterial.reflectivity = 0, Y.userData.bottomMaterial.map.repeat.set((da.width - 1.4) / 2.5, (da.height - .8) / 2.5)) : "Wood" == da.divisionMaterial ? (Y.userData.topMaterial.map = Y.userData.woodTexture, Y.userData.topMaterial.normalMap = null, Y.userData.topMaterial.specular.setHex(2500134), Y.userData.topMaterial.shininess = 5.117649, Y.userData.topMaterial.reflectivity = 0, Y.userData.topMaterial.map.repeat.set((da.width - 1.4) / 2.5, (da.height - .8) / 2.5), Y.userData.bottomMaterial.map = Y.userData.woodTexture, Y.userData.bottomMaterial.normalMap = null, Y.userData.bottomMaterial.specular.setHex(2500134), Y.userData.bottomMaterial.shininess = 5.117649, Y.userData.bottomMaterial.reflectivity = 0, Y.userData.bottomMaterial.map.repeat.set((da.width - 1.4) / 2.5, (da.height - .8) / 2.5)) : "Drywall" == da.divisionMaterial && (Y.userData.topMaterial.map = null, Y.userData.topMaterial.normalMap = null, Y.userData.topMaterial.specular.setHex(14540253), Y.userData.topMaterial.shininess = 6, Y.userData.topMaterial.reflectivity = 0, Y.userData.bottomMaterial.map = null, Y.userData.bottomMaterial.normalMap = null, Y.userData.bottomMaterial.specular.setHex(14540253), Y.userData.bottomMaterial.shininess = 6, Y.userData.bottomMaterial.reflectivity = 0), Y.userData.bottomMaterial.needsUpdate = !0, Y.userData.topMaterial.needsUpdate = !0, "None" == da.flooring ? q.visible = !1 : (q.visible = !0, q.scale.x = da.width, da.divisionWall ? q.scale.y = da.divisionAmount : q.scale.y = da.depth, q.position.z = da.depth / 2, "Ceramic Tile" == da.flooring ? (q.material = lt, q.material.map.repeat.set(q.scale.x / 4, q.scale.y / 4)) : "Wood" == da.flooring ? (q.material = ht, q.material.map.repeat.set(q.scale.x / 4, q.scale.y / 10)) : "Carpet" == da.flooring && (q.material = ct, q.material.map.repeat.set(q.scale.x / 3, q.scale.y / 3))), "None" != da.flooring2 && da.divisionWall ? (A.visible = !0, A.scale.x = da.width, da.divisionWall ? A.scale.y = da.depth - da.divisionAmount : A.scale.y = da.depth, A.position.z = da.depth / -2, "Ceramic Tile" == da.flooring2 ? (A.material = gt, A.material.map.repeat.set(A.scale.x / 4, A.scale.y / 4)) : "Wood" == da.flooring2 ? (A.material = ut, A.material.map.repeat.set(A.scale.x / 4, A.scale.y / 10)) : "Carpet" == da.flooring2 && (A.material = Tt, A.material.map.repeat.set(A.scale.x / 3, A.scale.y / 3))) : A.visible = !1, "None" == da.ceiling || 1 < da.hideWalls ? (V.visible = !1, U.visible = !1) : (V.visible = !0, U.visible = !0, da.divisionWall ? (V.scale.y = da.divisionAmount - .7, U.scale.y = da.divisionAmount - .7) : (V.scale.y = da.depth - 1.4, U.scale.y = da.depth - 1.4), V.position.z = da.depth / 2 - .7, U.position.z = da.depth / 2 - .7, "Post Frame" == da.frameType ? (V.position.y = da.height - 1.1, U.position.y = da.height - 1.1, V.scale.x = da.width / 2 - .7, U.scale.x = da.width / 2 - .7, V.position.x = da.width / -2 + .7, U.position.x = da.width / 2 - .7, V.rotation.y = 0, U.rotation.y = 0) : (V.position.y = da.height - 1.58, U.position.y = da.height - 1.58, V.position.x = da.width / -2 + .7, U.position.x = da.width / 2 - .7, V.rotation.y = Math.atan2(da.roofPitch, 12), U.rotation.y = Math.atan2(-da.roofPitch, 12), V.scale.x = -V.position.x / Math.cos(V.rotation.y), U.scale.x = U.position.x / Math.cos(U.rotation.y)), "Steel" == da.ceiling ? (V.material = rt, V.material.normalMap.repeat.set(12 * V.scale.x / 9, 1), U.material = rt, U.material.normalMap.repeat.set(12 * U.scale.x / 9, 1)) : "Wood" == da.ceiling ? (V.material = st, V.material.map.repeat.set(V.scale.x / 4, V.scale.y / 4), U.material = mt, U.material.map.repeat.set(U.scale.x / 4, U.scale.y / 4)) : "2x2 Tile" == da.ceiling && (V.material = nt, V.material.map.repeat.set(V.scale.x / 2, V.scale.y / 2), U.material = nt, U.material.map.repeat.set(U.scale.x / 2, U.scale.y / 2))), "None" == da.ceiling2 || !da.divisionWall || 1 < da.hideWalls ? (Q.visible = !1, X.visible = !1) : (Q.visible = !0, X.visible = !0, da.divisionWall ? (Q.scale.y = da.depth - da.divisionAmount - .7, X.scale.y = da.depth - da.divisionAmount - .7) : (Q.scale.y = da.depth - 1.4, X.scale.y = da.depth - 1.4), Q.position.z = da.depth / -2 + .7, X.position.z = da.depth / -2 + .7, "Post Frame" == da.frameType ? (Q.position.y = da.height - 1.1, X.position.y = da.height - 1.1, Q.scale.x = da.width / 2 - .7, X.scale.x = da.width / 2 - .7, Q.position.x = da.width / -2 + .7, X.position.x = da.width / 2 - .7, Q.rotation.y = 0, X.rotation.y = 0) : (Q.position.y = da.height - 1.58, X.position.y = da.height - 1.58, Q.position.x = da.width / -2 + .7, X.position.x = da.width / 2 - .7, Q.rotation.y = Math.atan2(da.roofPitch, 12), X.rotation.y = Math.atan2(-da.roofPitch, 12), Q.scale.x = -Q.position.x / Math.cos(Q.rotation.y), X.scale.x = X.position.x / Math.cos(X.rotation.y)), "Steel" == da.ceiling2 ? (Q.material = pt, Q.material.normalMap.repeat.set(12 * Q.scale.x / 9, 1), X.material = pt, X.material.normalMap.repeat.set(12 * X.scale.x / 9, 1)) : "2x2 Tile" == da.ceiling2 && (Q.material = dt, Q.material.map.repeat.set(Q.scale.x / 2, Q.scale.y / 2), X.material = dt, X.material.map.repeat.set(X.scale.x / 2, X.scale.y / 2))), _a(da.porchN, "N", "porch"), _a(da.porchS, "S", "porch"), _a(da.porchE, "E", "porch"), _a(da.porchW, "W", "porch"), _a(da.porchWrapNW, "NW", "porchWrap"), _a(da.porchWrapNE, "NE", "porchWrap"), _a(da.porchWrapSW, "SW", "porchWrap"), _a(da.porchWrapSE, "SE", "porchWrap"), _a(da.porchWrapHipNW, "NW", "porchWrapHip"), _a(da.porchWrapHipNE, "NE", "porchWrapHip"), _a(da.porchWrapHipSW, "SW", "porchWrapHip"), _a(da.porchWrapHipSE, "SE", "porchWrapHip"), Xa(), qo(), ca.sort(function(e, t) { return e - t }), ca.reverse(), k.__folders.hasOwnProperty("Interior")) { for (let e = 0; e < k.__folders.Interior.__controllers.length; e++) { var x = k.__folders.Interior.__controllers[e]; "mezzanineStartingBay" === x.property && (x.max(ca.length - 1), da.mezzanineStartingBay > ca.length - 1 && (da.mezzanineStartingBay = ca.length - 1), x.updateDisplay()), "mezzanineBays" === x.property && (x.max(ca.length - da.mezzanineStartingBay), da.mezzanineBays > ca.length - da.mezzanineStartingBay && (da.mezzanineBays = ca.length - da.mezzanineStartingBay), x.updateDisplay()), "mezzanineDepth" === x.property && (x.max(da.depth), da.mezzanineDepth > da.depth && (da.mezzanineDepth = da.depth), x.updateDisplay()) } for (let e = 0; e < k.__folders.Interior.__controllers.length; e++) { var O = k.__folders.Interior.__controllers[e]; "mezzanineHeight" === O.property && (O.max(da.height), da.mezzanineHeight > da.height && (da.mezzanineHeight = da.height - 1), O.updateDisplay()) } } if (void 0 !== na.getObjectByName("mezzanineParent") && na.remove(na.getObjectByName("mezzanineParent")), 0 < da.mezzanineBays || 0 < da.mezzanineDepth) { var R, B = new THREE.Group, S = (B.name = "mezzanineParent", na.add(B), "Post Frame" == da.frameType || "Hybrid" == da.frameType ? ia.getObjectByName("Mezzanine").material.color.setHex(12026452) : ia.getObjectByName("Mezzanine").material.color.setHex(7895160), (R = da.useMezzanineDepth ? (da.mezzanineBays = Math.floor(da.mezzanineDepth / ca.spacingBetweenTrusses), -ca[0]) : (da.mezzanineDepth = da.mezzanineBays * ca.spacingBetweenTrusses, -ca[da.mezzanineStartingBay - 1])) + da.mezzanineDepth), H = (da.mezzanineDepth == da.depth && (S = ca[0]), da.mezzanineDepth), N = (da.mezzanineDepth == da.depth && (H = -ca[ca.length - 1] + ca[0]), (o = ia.getObjectByName("MezzanineWood").clone()).position.set(0, da.mezzanineHeight, R), o.rotation.y = Math.PI / 2, o.scale.z = da.width - .6, 1 == da.mezzanineStartingBay && (o.scale.z -= .3), da.mezzanineStartingBay + da.mezzanineBays == ca.length && (o.scale.z -= .3), o.scale.x = 5 * H, o.visible = !0, B.add(o), ia.getObjectByName("Mezzanine").clone()); if (N.position.set(0, da.mezzanineHeight - .04, R), N.rotation.y = Math.PI / 2, N.rotation.x = Math.PI / 2, N.scale.set(.25, 2, da.width - .6), N.visible = !0, B.add(N), (o = N.clone()).position.set(0, da.mezzanineHeight - .6, R), o.rotation.y = Math.PI / 2, o.rotation.x = Math.PI / 2, o.scale.set(.25, 2, da.width - .6), o.visible = !0, B.add(o), (o = N.clone()).name = "Mezzanine-Truss-Top", o.position.set(0, da.mezzanineHeight - .04, S), o.rotation.y = Math.PI / 2, o.rotation.x = Math.PI / 2, o.scale.set(.25, 2, da.width - .6), "Post Frame" == da.frameType && (o.scale.x = 3), o.visible = !0, B.add(o), "Post Frame" !== da.frameType && ((o = N.clone()).name = "Mezzanine-Truss-Bottom", o.position.set(0, da.mezzanineHeight - .6, S), o.rotation.x = Math.PI / 2, o.rotation.y = Math.PI / 2, o.scale.set(.25, 2, da.width - .6), o.visible = !0, B.add(o)), da.useMezzanineDepth) for (let e = 0; e < da.width / 3; e++)(o = ia.getObjectByName("MezzanineWood").clone()).position.set(1.5 * e, da.mezzanineHeight, (R + S) / 2), o.rotation.z = Math.PI / 2, o.scale.z = H, o.scale.x = 3, o.visible = !0, B.add(o), (o = ia.getObjectByName("MezzanineWood").clone()).position.set(-1.5 * e, da.mezzanineHeight, (R + S) / 2), o.rotation.z = Math.PI / 2, o.scale.z = H, o.scale.x = 3, o.visible = !0, B.add(o); for (let t = da.mezzanineStartingBay - 1; t < da.mezzanineBays + da.mezzanineStartingBay - 1; t++) { (o = N.clone()).name = "Mezzanine-Truss-Top", o.position.set(0, da.mezzanineHeight - .04, -ca[t + 1]), o.rotation.y = Math.PI / 2, o.rotation.x = Math.PI / 2, o.scale.set(.25, 2, da.width - .6), "Post Frame" == da.frameType && (o.scale.x = 3), o.visible = !0, B.add(o), "Post Frame" !== da.frameType && ((o = N.clone()).name = "Mezzanine-Truss-Bottom", o.position.set(0, da.mezzanineHeight - .6, -ca[t + 1]), o.rotation.x = Math.PI / 2, o.rotation.y = Math.PI / 2, o.scale.set(.25, 2, da.width - .6), o.visible = !0, B.add(o)); for (var L = 0; L < da.width / 3; L++) if (da.useMezzanineDepth || ((o = ia.getObjectByName("MezzanineWood").clone()).position.set(1.5 * L, da.mezzanineHeight, -ca[t + 1] + (ca[t] - ca[t + 1]) / -2), o.rotation.z = Math.PI / 2, o.rotation.y = 0, o.scale.z = ca[t] - ca[t + 1] - .06, o.scale.x = 3, o.visible = !0, B.add(o), (o = ia.getObjectByName("MezzanineWood").clone()).position.set(-1.5 * L, da.mezzanineHeight, -ca[t + 1] + (ca[t] - ca[t + 1]) / -2), o.rotation.z = Math.PI / 2, o.rotation.y = 0, o.scale.z = ca[t] - ca[t + 1] - .06, o.scale.x = 3, o.visible = !0, B.add(o)), "Post Frame" !== da.frameType) { let e; t == da.mezzanineStartingBay - 1 && ((o = N.clone()).material.color.copy(Ea), o.name = "Mezzanine-Webbing-Vertical", o.position.set(1.5 * L + .1, da.mezzanineHeight - .35, -ca[t]), o.scale.set(1, .5, .55), o.rotation.x = Math.PI / 2, o.rotation.y = 0, B.add(o), (o = N.clone()).name = "Mezzanine-Webbing-Vertical", o.position.set(-1.5 * L + .1, da.mezzanineHeight - .35, -ca[t]), o.scale.set(1, .5, .55), o.rotation.x = Math.PI / 2, o.rotation.y = 0, B.add(o), 3 * (L + 1) < da.width) && (e = L % 2 == 0 ? 1 : -1, (o = N.clone()).name = "Mezzanine-Webbing-Diagonal", o.position.set(1.5 * L + .85, da.mezzanineHeight - .35, -ca[t]), o.scale.set(.25, .5, 1.6), o.rotation.x = Math.PI / 2, o.rotation.y = 1.23 * e, B.add(o), e = L % 2 == 0 ? 1 : -1, (o = N.clone()).name = "Mezzanine-Webbing-Diagonal", o.position.set(-1.5 * L + .85, da.mezzanineHeight - .35, -ca[t]), o.scale.set(.25, .5, 1.6), o.rotation.x = Math.PI / 2, o.rotation.y = 1.23 * e, B.add(o)), (o = N.clone()).name = "Mezzanine-Webbing-Vertical", o.position.set(1.5 * L + .1, da.mezzanineHeight - .35, -ca[t + 1]), o.scale.set(1, .5, .55), o.rotation.x = Math.PI / 2, o.rotation.y = 0, B.add(o), (o = N.clone()).name = "Mezzanine-Webbing-Vertical", o.position.set(-1.5 * L + .1, da.mezzanineHeight - .35, -ca[t + 1]), o.scale.set(1, .5, .55), o.rotation.x = Math.PI / 2, o.rotation.y = 0, B.add(o), 3 * (L + 1) < da.width && (e = L % 2 == 0 ? 1 : -1, (o = N.clone()).name = "Mezzanine-Webbing-Diagonal", o.position.set(1.5 * L + .85, da.mezzanineHeight - .35, -ca[t + 1]), o.scale.set(.25, .5, 1.6), o.rotation.x = Math.PI / 2, o.rotation.y = 1.23 * e, B.add(o), e = L % 2 == 0 ? 1 : -1, (o = N.clone()).name = "Mezzanine-Webbing-Diagonal", o.position.set(-1.5 * L + .85, da.mezzanineHeight - .35, -ca[t + 1]), o.scale.set(.25, .5, 1.6), o.rotation.x = Math.PI / 2, o.rotation.y = 1.23 * e, B.add(o)) } } var e, C; let t = da.width - .6, a = 0; if (da.hasOwnProperty("mezzanineStairs") && "None" !== da.mezzanineStairs && (t -= 4, da.mezzanineStairs.startsWith("Left") ? a = 2 : da.mezzanineStairs.startsWith("Right") && (a = -2)), "Framed" == da.mezzanineRailing) { (o = N.clone()).position.set(a, da.mezzanineHeight + 4, S - .15), o.rotation.x = THREE.Math.degToRad(0), o.scale.set(1.5, 1.5, t), o.visible = !0, B.add(o), (o = N.clone()).position.set(a, da.mezzanineHeight + 3, S - .15), o.rotation.x = THREE.Math.degToRad(-90), o.scale.set(1.5, 1.5, t), o.visible = !0, B.add(o), (o = N.clone()).position.set(a, da.mezzanineHeight + 2, S - .15), o.rotation.x = THREE.Math.degToRad(-90), o.scale.set(1.5, 1.5, t), o.visible = !0, B.add(o), (o = N.clone()).position.set(a, da.mezzanineHeight + 1, S - .15), o.rotation.x = THREE.Math.degToRad(-90), o.scale.set(1.5, 1.5, t), o.visible = !0, B.add(o); for (let e = 0; e < t / 4; e++) o = N.clone(), da.mezzanineStairs.startsWith("Right") ? o.position.set(t / 2 - a - 4 * e, da.mezzanineHeight + 2, S - .15) : o.position.set(a - t / 2 + 4 * e, da.mezzanineHeight + 2, S - .15), o.rotation.y = THREE.Math.degToRad(0), o.rotation.z = THREE.Math.degToRad(-90), o.scale.set(1.5, 1.5, 4), o.visible = !0, B.add(o) } else "Steel Covered" == da.mezzanineRailing && (e = new THREE.BoxGeometry(1, 1, 1), (newTexture = te.clone()).needsUpdate = !0, (C = new THREE.MeshPhongMaterial({ normalMap: newTexture, color: 16777215, specular: 3947580, shininess: 40, side: THREE.DoubleSide })).normalMap = newTexture, (o = new THREE.Mesh(e, C)).position.set(a, da.mezzanineHeight + 2, S - .15), o.scale.set(t, 4, 4 / 12), B.add(o), C.normalMap.repeat.set(12 * t / 9, 1)); if (da.hasOwnProperty("mezzanineStairs") && "Left Straight" == da.mezzanineStairs) { (o = ia.getObjectByName("Stairs").clone()).position.set(a - da.width / 2 + .6, da.mezzanineHeight, S), o.visible = !0, o.castShadow = !0, o.receiveShadow = !1; for (let e = 0; e < o.material.length; e++) o.material[e].clippingPlanes = [it], o.material[e].clipIntersection = !0, o.material[e].clipShadows = !0, o.material[e].name.startsWith("StairsMetal") && ("Steel Covered" == da.mezzanineRailing ? o.material[e].visible = !0 : o.material[e].visible = !1); B.add(o), it.constant = S + da.mezzanineHeight / 7 * 11 + .01, it.normal.set(0, 0, -1) } if (da.hasOwnProperty("mezzanineStairs") && "Right Straight" == da.mezzanineStairs) { (o = ia.getObjectByName("Stairs").clone()).position.set(da.width / 2 + a - .6, da.mezzanineHeight, S), o.visible = !0, o.castShadow = !0, o.receiveShadow = !1; for (let e = 0; e < o.material.length; e++) o.material[e].clippingPlanes = [it], o.material[e].clipIntersection = !0, o.material[e].clipShadows = !0, o.material[e].name.startsWith("StairsMetal") && ("Steel Covered" == da.mezzanineRailing ? o.material[e].visible = !0 : o.material[e].visible = !1); B.add(o), it.constant = S + da.mezzanineHeight / 7 * 11 + .01, it.normal.set(0, 0, -1) } if (da.hasOwnProperty("mezzanineStairs") && "Left Landing" == da.mezzanineStairs) { (o = ia.getObjectByName("Stairs-L").clone()).position.set(da.width / -2 + .6, da.mezzanineHeight, S), o.visible = !0, o.castShadow = !0, o.receiveShadow = !1; for (let e = 0; e < o.material.length; e++) o.material[e].clippingPlanes = [it], o.material[e].clipIntersection = !0, o.material[e].clipShadows = !0, o.material[e].name.startsWith("StairsMetal") && ("Steel Covered" == da.mezzanineRailing ? o.material[e].visible = !0 : o.material[e].visible = !1); B.add(o), it.constant = da.width / -2 + .6 + 4 + da.mezzanineHeight / 7 * 11 + .01, it.normal.set(-1, 0, 0) } if (da.hasOwnProperty("mezzanineStairs") && "Right Landing" == da.mezzanineStairs) { (o = ia.getObjectByName("Stairs-R").clone()).position.set(da.width / 2 - .6, da.mezzanineHeight, S), o.visible = !0, o.castShadow = !0, o.receiveShadow = !1; for (let e = 0; e < o.material.length; e++) o.material[e].clippingPlanes = [it], o.material[e].clipIntersection = !0, o.material[e].clipShadows = !0, o.material[e].name.startsWith("StairsMetal") && ("Steel Covered" == da.mezzanineRailing ? o.material[e].visible = !0 : o.material[e].visible = !1); B.add(o), it.constant = da.width / -2 + .6 + 4 + da.mezzanineHeight / 7 * 11 + .01, it.normal.set(1, 0, 0) } } ia.traverse(function(i) { if ("scale-driveway-clone" === i.name) { let e = 0, t = 0, a = 0, o = 0; da.leanTo2 && (e = da.leanTo2Depth), da.leanTo4 && (t = da.leanTo4Depth), da.leanTo1 && (a = da.leanTo1Depth), da.leanTo3 && (o = da.leanTo3Depth), 0 === i.rotation.y ? i.position.z = da.depth / 2 + a : i.rotation.y === Math.PI / -2 ? i.position.x = da.width / -2 - e : i.rotation.y === Math.PI ? i.position.z = da.depth / -2 - o : i.rotation.y === Math.PI / 2 && (i.position.x = da.width / 2 + t) } if (i instanceof THREE.Mesh) { var e = 0; if ("building" === i.name) { "Asymmetrical" === da.roofType ? i.morphTargetInfluences[i.morphTargetDictionary.right] = da.asymmetrical / 100 : i.morphTargetInfluences[i.morphTargetDictionary.right] = 0; var t, a; for (da.leanTo2 && da.leanTo2Depth, da.leanTo4 && da.leanTo4Depth, da.leanTo1 && da.leanTo1Depth, da.leanTo3 && da.leanTo3Depth, se.scale.set(da.width, da.peakHeight(), da.depth), i.morphTargetInfluences[i.morphTargetDictionary.width] = (da.width - 1) / 100, i.morphTargetInfluences[i.morphTargetDictionary.depth] = (da.depth - 1) / 1e3, i.morphTargetInfluences[i.morphTargetDictionary.height] != (da.height - 1) / 100 && (i.morphTargetInfluences[i.morphTargetDictionary.height] = (da.height - 1) / 100), e = 0; e < i.material.length; e++) "BuildingWallsWidthLeftFront" !== i.material[e].name && "BuildingWallsWidthLeftBack" !== i.material[e].name && "BuildingWallsWidthLeftFront-Interior" !== i.material[e].name && "BuildingWallsWidthLeftBack-Interior" !== i.material[e].name || (a = "Asymmetrical" === da.roofType ? (t = da.width + 2 * da.asymmetrical, da.asymmetrical) : (t = da.width, 0), da.hasOwnProperty("boardAndBattenWoodenBarnSiding") && da.boardAndBattenWoodenBarnSiding && (i.material[e].map.repeat.set(t / 3, 2), i.material[e].map.offset.x = 12 * (t + a) / 9 + .5), i.material[e].normalMap.repeat.set(12 * t / 9, 1), i.material[e].normalMap.offset.x = 12 * (t + a) / 9 + .5), "BuildingWallsWidthRightFront" !== i.material[e].name && "BuildingWallsWidthRightBack" !== i.material[e].name && "BuildingWallsWidthRightFront-Interior" !== i.material[e].name && "BuildingWallsWidthRightBack-Interior" !== i.material[e].name || (a = "Asymmetrical" === da.roofType ? (t = da.width - 2 * da.asymmetrical, da.asymmetrical) : (t = da.width, 0), i.material[e].normalMap.repeat.set(12 * t / 9, 1), i.material[e].normalMap.offset.x = 12 * (t + a) / 9 + .5), "BuildingWallsWidth" !== i.material[e].name && "BuildingWainscot1" !== i.material[e].name && "BuildingWainscot3" !== i.material[e].name || (i.material[e].normalMap.repeat.set(12 * da.width / 9, 1), i.material[e].normalMap.offset.x = 12 * da.width / 9 + .5), "BuildingWallsDepthL" !== i.material[e].name && "BuildingWallsDepthR" !== i.material[e].name && "BuildingWallsDepthL-Interior" !== i.material[e].name && "BuildingWallsDepthR-Interior" !== i.material[e].name && "BuildingWainscot2" !== i.material[e].name && "BuildingWainscot4" !== i.material[e].name || (i.material[e].normalMap.repeat.set(12 * da.depth / 9, 1), i.material[e].normalMap.offset.x = 12 * da.depth / 9 + .5), "BuildingCeilingLeft-Interior" !== i.material[e].name && "BuildingCeilingRight-Interior" !== i.material[e].name || (i.material[e].normalMap.repeat.set(12 * da.depth / 9, 1), i.material[e].normalMap.offset.x = 12 * da.depth / 9 + .5) } if ("roofL" === i.name || "roofR" === i.name || "roofEaveL" === i.name || "roofEaveR" === i.name) for (i.morphTargetInfluences[i.morphTargetDictionary.depth] = (da.depth + da.gableFront + da.gableBack - 1) / 1e3, i.position.z = da.gableFront / 2 - da.gableBack / 2, e = 0; e < i.material.length; e++) "BuildingRoof" !== i.material[e].name && "BuildingSoffit" !== i.material[e].name || (i.material[e].normalMap.repeat.set(12 * (da.depth + da.gableFront + da.gableBack) / 9, 1), i.material[e].normalMap.offset.x = 12 * (da.depth + da.gableFront / 2 - 6 * da.gableBack) / 9 + .5); if ("leanTo1" === i.name || "leanTo2" === i.name || "leanTo3" === i.name || "leanTo4" === i.name) { let o = i.name.replace(/\D/g, ""), e = 0, t = 0; "leanTo1" === i.name || "leanTo3" === i.name ? e = da[i.name + "CutL"] / 2 - da[i.name + "CutR"] / 2 : t = da[i.name + "CutL"] / 2 - da[i.name + "CutR"] / 2, "leanTo1" === i.name && (i.position.set(e, 0, da.depth / 2), ia.getObjectByName(i.name + "Roof").position.set(e, 0, da.depth / 2)), "leanTo2" === i.name && (i.position.set(da.width / -2, 0, t), ia.getObjectByName(i.name + "Roof").position.set(da.width / -2, 0, t)), "leanTo3" === i.name && (i.position.set(-e, 0, da.depth / -2), ia.getObjectByName(i.name + "Roof").position.set(-e, 0, da.depth / -2)), "leanTo4" === i.name && (i.position.set(da.width / 2, 0, -t), ia.getObjectByName(i.name + "Roof").position.set(da.width / 2, 0, -t)), "leanTo1" === i.name && da.leanTo1 && da.leanTo1Enclosed && "Fully Enclosed" == da.leanTo1Walls && ia.getObjectByName("leanTo1BoundingBox").position.set(e, 0, da.depth / 2), "leanTo2" === i.name && da.leanTo2 && da.leanTo2Enclosed && "Fully Enclosed" == da.leanTo2Walls && ia.getObjectByName("leanTo2BoundingBox").position.set(da.width / -2, 0, t), "leanTo3" === i.name && da.leanTo3 && da.leanTo3Enclosed && "Fully Enclosed" == da.leanTo3Walls && ia.getObjectByName("leanTo3BoundingBox").position.set(-e, 0, da.depth / -2), "leanTo4" === i.name && da.leanTo4 && da.leanTo4Enclosed && "Fully Enclosed" == da.leanTo4Walls && ia.getObjectByName("leanTo4BoundingBox").position.set(da.width / 2, 0, -t), !da.settings.allowZeroPitchRoof && da["leanTo" + o + "Pitch"] < .5 && (da["leanTo" + o + "Pitch"] = .5), !da.settings.allowZeroPitchRoof && (.5 < da["leanTo" + o + "Pitch"] || da["leanTo" + o + "Pitch"] < -.5) && (da["leanTo" + o + "Pitch"] = Math.round(da["leanTo" + o + "Pitch"])), (1 == o || 3 == o) && da["leanTo" + o + "Height"] > da.height && (da["leanTo" + o + "Height"] = da.height), da.leanTo2Height > da.wallHeightL() && (da["leanTo" + o + "Height"] = da.wallHeightL()), da.leanTo4Height > da.wallHeightR() && (da["leanTo" + o + "Height"] = da.wallHeightR()), 1 == o || 3 == o ? da["leanTo" + o + "Length"] > da.width && (da["leanTo" + o + "Length"] = da.width) : 2 != o && 4 != o || da["leanTo" + o + "Length"] > da.depth && (da["leanTo" + o + "Length"] = da.depth); var n = da["leanTo" + o + "Depth"] * da["leanTo" + o + "Pitch"] / 12, r = Math.atan(da["leanTo" + o + "Depth"] / n), s = Math.sqrt(Math.pow(n, 2) + Math.pow(da["leanTo" + o + "Depth"], 2)), l = (i.morphTargetInfluences[i.morphTargetDictionary.roofPeak] = n / 100, ia.getObjectByName("leanTo" + o + "Roof").position.y = da["leanTo" + o + "Height"] + .1, 1 == o && ia.getObjectByName("leanTo" + o + "Roof").rotation.set(-r, Math.PI / -2, Math.PI / -2), 2 == o && ia.getObjectByName("leanTo" + o + "Roof").rotation.set(0, Math.PI, r - Math.PI / 2), 3 == o && ia.getObjectByName("leanTo" + o + "Roof").rotation.set(r - Math.PI, Math.PI / 2, Math.PI / 2), 4 == o && ia.getObjectByName("leanTo" + o + "Roof").rotation.set(0, 0, Math.PI / -2 + r), 2 == o && (ia.getObjectByName("leanTo" + o + "Roof").position.z = t + (da.gableFront - da.gableBack) / 2), 4 == o && (ia.getObjectByName("leanTo" + o + "Roof").position.z = -t + (da.gableFront - da.gableBack) / 2), 2 == o && (ia.getObjectByName("leanTo" + o + "Roof").morphTargetInfluences[ia.getObjectByName("leanTo" + o + "Roof").morphTargetDictionary.width] = (s - .5) / 50, da.settings.leantoRoofOverhangsFollowMainRoof) && (ia.getObjectByName("leanTo" + o + "Roof").morphTargetInfluences[ia.getObjectByName("leanTo" + o + "Roof").morphTargetDictionary.width] += da.eaveL / 50), 4 == o && (ia.getObjectByName("leanTo" + o + "Roof").morphTargetInfluences[ia.getObjectByName("leanTo" + o + "Roof").morphTargetDictionary.width] = (s - .5) / 50, da.settings.leantoRoofOverhangsFollowMainRoof) && (ia.getObjectByName("leanTo" + o + "Roof").morphTargetInfluences[ia.getObjectByName("leanTo" + o + "Roof").morphTargetDictionary.width] += da.eaveR / 50), 2 == o || 4 == o ? (ia.getObjectByName("leanTo" + o + "Roof").morphTargetInfluences[ia.getObjectByName("leanTo" + o + "Roof").morphTargetDictionary.depth] = (da["leanTo" + o + "Length"] - 1) / 1e3, da.settings.leantoRoofOverhangsFollowMainRoof && (ia.getObjectByName("leanTo" + o + "Roof").morphTargetInfluences[ia.getObjectByName("leanTo" + o + "Roof").morphTargetDictionary.depth] += (da.gableFront + da.gableBack) / 1e3)) : (ia.getObjectByName("leanTo" + o + "Roof").morphTargetInfluences[ia.getObjectByName("leanTo" + o + "Roof").morphTargetDictionary.width] = (s - .5) / 50, ia.getObjectByName("leanTo" + o + "Roof").morphTargetInfluences[ia.getObjectByName("leanTo" + o + "Roof").morphTargetDictionary.depth] = (da["leanTo" + o + "Length"] - 1) / 1e3), i.morphTargetInfluences[i.morphTargetDictionary.depth] = (da["leanTo" + o + "Length"] - 1) / 1e3, i.morphTargetInfluences[i.morphTargetDictionary.width] = (da["leanTo" + o + "Depth"] - .5) / 50, i.morphTargetInfluences[i.morphTargetDictionary.height] = (da["leanTo" + o + "Height"] - 1 - n) / 100, "leanTo1" === i.name && da.leanTo1 && da.leanTo1Enclosed && "Fully Enclosed" == da.leanTo1Walls && ia.getObjectByName("leanTo1BoundingBox").scale.set(da["leanTo" + o + "Length"], da["leanTo" + o + "Height"], da["leanTo" + o + "Depth"]), "leanTo2" === i.name && da.leanTo2 && da.leanTo2Enclosed && "Fully Enclosed" == da.leanTo2Walls && ia.getObjectByName("leanTo2BoundingBox").scale.set(da["leanTo" + o + "Length"], da["leanTo" + o + "Height"], da["leanTo" + o + "Depth"]), "leanTo3" === i.name && da.leanTo3 && da.leanTo3Enclosed && "Fully Enclosed" == da.leanTo3Walls && ia.getObjectByName("leanTo3BoundingBox").scale.set(da["leanTo" + o + "Length"], da["leanTo" + o + "Height"], da["leanTo" + o + "Depth"]), "leanTo4" === i.name && da.leanTo4 && da.leanTo4Enclosed && "Fully Enclosed" == da.leanTo4Walls && ia.getObjectByName("leanTo4BoundingBox").scale.set(da["leanTo" + o + "Length"], da["leanTo" + o + "Height"], da["leanTo" + o + "Depth"]), ia.getObjectByName("leanTo" + o).material); let a = 0; for (let e = 0; e < l.length; e++) "LeantoWallsDepth" !== l[e].name && "LeantoWainscot2" !== l[e].name || (a = da["leanTo" + o + "Length"], l[e].normalMap.repeat.set(12 * a / 9, 1), l[e].normalMap.offset.x = a + .5), "LeantoWallsWidth" !== l[e].name && "LeantoWainscot1" !== l[e].name && "LeantoWainscot3" !== l[e].name || (a = da["leanTo" + o + "Depth"], l[e].normalMap.repeat.set(24 * a / 9, 1), l[e].normalMap.offset.x = 24 * a / 9 + .5); if (da.leanTo2 && da.leanTo2Height == da.wallHeightL() && da.leanTo2Length == da.depth) ia.traverse(function(t) { if (t instanceof THREE.Mesh && "leanTo2Roof" === t.name) for (let e = 0; e < t.material.length; e++) "BuildingTrim-RoofPivot" !== t.material[e].name && "BuildingRidgeCap" !== t.material[e].name || (t.material[e].visible = !1); for (let e = 0; e < la.material.length; e++) "BuildingTrim-RoofEdge" === la.material[e].name && (la.material[e].visible = !1) }); else for (let e = 0; e < la.material.length; e++) da.hideWalls <= 1 && "BuildingTrim-RoofEdge" === la.material[e].name && (la.material[e].visible = !0); if (da.leanTo4 && da.leanTo4Height == da.wallHeightR() && da.leanTo4Length == da.depth) ia.traverse(function(t) { if (t instanceof THREE.Mesh && "leanTo4Roof" === t.name) for (let e = 0; e < t.material.length; e++) "BuildingTrim-RoofPivot" !== t.material[e].name && "BuildingRidgeCap" !== t.material[e].name || (t.material[e].visible = !1); for (let e = 0; e < sa.material.length; e++) "BuildingTrim-RoofEdge" === sa.material[e].name && (sa.material[e].visible = !1) }); else for (let e = 0; e < sa.material.length; e++) da.hideWalls <= 1 && "BuildingTrim-RoofEdge" === sa.material[e].name && (sa.material[e].visible = !0); if (l = ia.getObjectByName("building").material, da["leanTo" + o] && da["leanTo" + o + "Enclosed"] && "Fully Enclosed" == da["leanTo" + o + "Walls"] && ((1 == o || 3 == o) && da["leanTo" + o + "Length"] == da.width || (2 == o || 4 == o) && da["leanTo" + o + "Length"] == da.depth)) if (da["leanTo" + o + "Height"] == da.wallHeightL() && 2 == o || da["leanTo" + o + "Height"] == da.wallHeightR() && 4 == o) for (let e = 0; e < l.length; e++) 2 != o || "BuildingWallsDepthL" !== l[e].name && "BuildingWallsDepthL-Interior" !== l[e].name || (l[e].visible = !1), 4 != o || "BuildingWallsDepthR" !== l[e].name && "BuildingWallsDepthR-Interior" !== l[e].name || (l[e].visible = !1), l[e].name === "BuildingTrim" + o && (l[e].visible = !1), o - 1 == 0 ? "BuildingTrim4" === l[e].name && (l[e].visible = !1) : l[e].name === "BuildingTrim" + (o - 1) && (l[e].visible = !1); else { let e, t, a; a = 1 == o ? (e = +o + 1, t = +o + 3, da.depth) : 4 == o ? (e = +o - 3, t = +o - 1, da.depth) : (e = +o + 1, t = +o - 1, da.width), v[t] = Math.max(v[t], da["leanTo" + o + "Height"]), da["leanTo" + t] && da["leanTo" + t + "Length"] == a && (v[t] = Math.max(v[t], da["leanTo" + t + "Height"])), v[o] = Math.max(v[o], da["leanTo" + o + "Height"]), da["leanTo" + e] && da["leanTo" + e + "Length"] == a && (v[o] = Math.max(v[o], da["leanTo" + e + "Height"])) } } if ((i.name.startsWith("window") || i.name.startsWith("walkDoor") || i.name.startsWith("garage") || i.name.startsWith("mansard")) && La.includes(i.getObjectByName("itemSelectionBox"))) { let t = new THREE.Raycaster; r = new THREE.Vector3, s = new THREE.Vector3, n = (i.getWorldDirection(s), r.copy(i.position).add(s.multiplyScalar(200)), new THREE.Vector3), s = i.getWorldDirection(n).multiply(new THREE.Vector3(-1, 1, -1)); t.set(r, s), setTimeout(function() { var e = t.intersectObjects(Ca, !0); 0 < e.length && e[0].object.name.endsWith("BoundingBox") ? i.position.copy(e[0].point) : (da[i.name.replace("-clone", "") + "Qty"]--, ia.remove(i)), G = !0 }, 25) } } }), $a(), K(), io(), no(), Va(), Ua(), di(ye), G = !0 } function _a(r, s, l, h) { r = r || !1, s = s || !1, l = l || !1, h = h || !1; let c, d = 0, p = 0, m = 0, g = 0, u = (da.leanTo2 && da.leanTo2Length == da.depth && da.leanTo2Enclosed && "Fully Enclosed" == da.leanTo2Walls && (d = da.leanTo2Depth), da.leanTo4 && da.leanTo4Length == da.depth && da.leanTo4Enclosed && "Fully Enclosed" == da.leanTo4Walls && (p = da.leanTo4Depth), da.leanTo1 && da.leanTo1Length == da.width && da.leanTo1Enclosed && "Fully Enclosed" == da.leanTo1Walls && (m = da.leanTo1Depth), da.leanTo3 && da.leanTo3Length == da.width && da.leanTo3Enclosed && "Fully Enclosed" == da.leanTo3Walls && (g = da.leanTo3Depth), 0), T = 0, b = 0; if (r) { "NW" == s && (u = da.width / 2 + p, T = da.depth / 2 + m), "NE" == s && (u = da.width / -2 - d, T = da.depth / 2 + m, b = Math.PI / -2), "SW" == s && (u = da.width / 2 + p, T = da.depth / -2 - g, b = Math.PI / 2), "SE" == s && (u = da.width / -2 - d, T = da.depth / -2 - g, b = Math.PI), "N" == s && (u = !1, T = da.depth / 2 + m), "S" == s && (u = !1, T = da.depth / -2 - g, b = Math.PI), "E" == s && (u = da.width / -2 - d, T = !1, b = Math.PI / -2), "W" == s && (u = da.width / 2 + p, T = !1, b = Math.PI / 2); let e = 4; let t = 10; let a = 0; let o = 0; if (na.getObjectByName(l + s + "-clone")) c = na.getObjectByName(l + s + "-clone"), u && (c.position.x = u), T && (c.position.z = T), c.visible = !0, Aa(l + s + "-clone"); else if (na.getObjectByName(l)) { if ((c = na.getObjectByName(l).GdeepCloneMaterials()).name = l + s + "-clone", c.visible = !0, c.castShadow = !0, Fo(c), u && (c.position.x = u), T && (c.position.z = T), c.rotation.y = b, na.add(c), c.morphTargetInfluences[c.morphTargetDictionary.porchDepth] = -2, a = (e - 3.5) / 12 * 8, c.morphTargetInfluences[c.morphTargetDictionary.slope] = a, da.height - 1 < 10 && (t = da.height - 1), c.morphTargetInfluences[c.morphTargetDictionary.height] = t - 13.5 - a, da.allowLeanToCeilingHeight ? (c.morphTargetInfluences[c.morphTargetDictionary.ceilingHeight] = da.height - 10 - 1.5, da.allowLeanToCeilingHeight && da.height < 10.5 && (c.morphTargetInfluences[c.morphTargetDictionary.ceilingHeight] = da.height - 10 - 8 * e / 12)) : (o = t - 8 * e / 12 - .25, c.morphTargetInfluences[c.morphTargetDictionary.ceilingHeight] = o - 10 - 4 / 12), c.morphTargetInfluences[c.morphTargetDictionary.Overhang] = 0, !da.settings.woodenPorchPosts) for (let e = 0; e < c.material.length; e++) "PorchPosts" === c.material[e].name && (c.material[e].visible = !1), "PorchPostsMetal" === c.material[e].name && c.material[e].color.copy(Ea); if (da.settings.hasOwnProperty("showPorchPostsOnEndwallsOnly") && da.settings.showPorchPostsOnEndwallsOnly) { if ("E" == s || "W" == s) for (let e = 0; e < c.material.length; e++) "PorchPosts" !== c.material[e].name && "PorchPostsMetal" !== c.material[e].name || (c.material[e].visible = !1); "NW" != s && "SE" != s || console.log(c), "NE" != s && "SW" != s || console.log(c) } Aa(l + s + "-clone") } if ("object" == typeof h) { var r = h.position.split(","), r = (c.position.x = parseFloat(r[0]), c.position.z = parseFloat(r[2]), h.rotation.split(",")), r = (c.rotation.x = parseFloat(r[0]), c.rotation.y = parseFloat(r[1]), c.rotation.z = parseFloat(r[2]), h.scale.split(",")), y = parseFloat(r[0]), f = parseFloat(r[1]), r = parseFloat(r[2]), w = parseFloat(h.porchDepth); if (c.userData.porchDepth = w, o = parseFloat(h.ceilingHeight), c.userData.ceilingHeight = o, h.hasOwnProperty("porchPitch") && (e = parseFloat(h.porchPitch), c.userData.porchPitch = e), a = (e - 3.5) / 12 * w, c.morphTargetInfluences[c.morphTargetDictionary.slope] = a, c.morphTargetInfluences[c.morphTargetDictionary.width] = y - 10, "NW" != s && "NE" != s && "SW" != s && "SE" != s || (c.morphTargetInfluences[c.morphTargetDictionary.depth] = r - 10), c.morphTargetInfluences[c.morphTargetDictionary.height] = f - 13.5 - a, c.morphTargetInfluences[c.morphTargetDictionary.porchDepth] = w - 10, da.allowLeanToCeilingHeight ? (c.morphTargetInfluences[c.morphTargetDictionary.ceilingHeight] = da.height - 10 - 1.5, da.allowLeanToCeilingHeight && da.height < 10.5 && (c.morphTargetInfluences[c.morphTargetDictionary.ceilingHeight] = da.height - 10 - w * e / 12)) : c.morphTargetInfluences[c.morphTargetDictionary.ceilingHeight] = o - 10 - 4 / 12, c.morphTargetInfluences[c.morphTargetDictionary.Overhang] = h.porchOverhang / 12, "1" == h.postMiter && (c.morphTargetInfluences[c.morphTargetDictionary.miters] = 1), "1" == h.postWrap) for (var v = 0; v < c.material.length; v++) "PorchPosts" === c.material[v].name && (c.material[v].color.setStyle(F.filter(e => e.name === da[da.settings.wrappedPorchPostColorMatches]).map(e => e.hex)), c.material[v].specular.setHex(3947580), c.material[v].shininess.value = 40); if (h.hasOwnProperty("posts")) { let t = !1; "1" == h.posts && (t = !0); for (let e = 0; e < c.material.length; e++) "PorchPosts" !== c.material[e].name && "PorchPostsMetal" !== c.material[e].name || !da.settings.woodenPorchPosts && "PorchPostsMetal" !== c.material[e].name || (c.material[e].visible = t) } Aa(l + s + "-clone") } c.userData.porchSide = s, c.userData.masterObjectName = l, c.userData.name = c.name, c.userData.position = { x: c.position.x, y: c.position.y, z: c.position.z }, "N" == s && (c.userData.toBuildingCenter = c.position.x), "S" == s && (c.userData.toBuildingCenter = -c.position.x), "E" == s && (c.userData.toBuildingCenter = -c.position.z), "W" == s && (c.userData.toBuildingCenter = c.position.z), c.userData.rotation = b, c.userData.porchSide = s, c.userData.width = c.morphTargetInfluences[c.morphTargetDictionary.width] + 10, c.userData.height = c.morphTargetInfluences[c.morphTargetDictionary.height] + 13.5, c.userData.porchPitch = e, "NW" != s && "NE" != s && "SW" != s && "SE" != s || (c.userData.depth = c.morphTargetInfluences[c.morphTargetDictionary.depth] + 10), c.userData.postMiter = !!parseInt(c.morphTargetInfluences[c.morphTargetDictionary.miters]); let i = !1, n = !0; for (let e = 0; e < c.material.length; e++) "PorchPosts" === c.material[e].name && 40 == c.material[e].shininess.value && (i = !0), "PorchPostsMetal" === c.material[e].name && (n = c.material[e].visible); c.userData.postWrap = i, c.userData.posts = n, c.userData.porchPitch = e, c.userData.porchOverhang = c.morphTargetInfluences[c.morphTargetDictionary.Overhang], c.userData.porchDepth = c.morphTargetInfluences[c.morphTargetDictionary.porchDepth] + 10, c.userData.ceilingHeight = c.morphTargetInfluences[c.morphTargetDictionary.ceilingHeight] + 10, c.userData.scale = { x: c.userData.width, y: c.userData.height, z: c.userData.porchDepth }, qa(c), Go(c) } else na.getObjectByName(l + s + "-clone") && (na.getObjectByName(l + s + "-clone").visible = !1), Aa(l + s + "-clone", !0) } function qa(a) { a = a || !1; for (let t = 0; t < a.material.length; t++) { var o = 12 * (a.morphTargetInfluences[a.morphTargetDictionary.width] + 10) / 9; let e = 0; "porchWrapHip" === a.name.substring(0, 12) || "porchWrap" === a.name.substring(0, 9) ? (e = 12 * (a.morphTargetInfluences[a.morphTargetDictionary.depth] + 10) / 9, "BuildingRoofWidth" !== a.material[t].name && "BuildingWallsWidth" !== a.material[t].name || a.material[t].normalMap.repeat.set(o, 1), "BuildingRoofDepth" !== a.material[t].name && "BuildingWallsDepth" !== a.material[t].name || a.material[t].normalMap.repeat.set(e, 1)) : (e = 0, "BuildingRoof" !== a.material[t].name && "BuildingWalls" !== a.material[t].name || a.material[t].normalMap.repeat.set(o, 1)) } } function Aa(a, e) { if (a = a || !1, e = e || !1, void 0 !== na.getObjectByName(a)) { var o, i = na.getObjectByName(a); if (!0 === i.visible) { if (void 0 === i.getObjectByName("porchPosts") ? ((o = new THREE.Group).name = "porchPosts", i.add(o)) : o = i.getObjectByName("porchPosts"), po(o), !1 === e && i.userData.hasOwnProperty("posts") && !0 === i.userData.posts) { var n = 0, e = 0, t = 0, r = 0, n = i.morphTargetInfluences[i.morphTargetDictionary.width], e = i.morphTargetInfluences[i.morphTargetDictionary.depth], t = i.morphTargetInfluences[i.morphTargetDictionary.porchDepth], r = i.morphTargetInfluences[i.morphTargetDictionary.ceilingHeight], s = (e = "porchWrapHip" === a.substring(0, 12) ? (n = n + 10 + 10 + 2 * t, e + 10 + 10 + 2 * t) : "porchWrap" === a.substring(0, 9) ? (n = n + 10 + 10 + +t, e + 10 + 10 + +t) : (n += 10, 0), t += 10, da.maxPorchPostSpacing), l = Math.floor(n / s) - 1, h = Math.floor(e / s) - 1, c = ((da.settings.hasOwnProperty("showPorchMidPostsOnEndwallsOnly") && da.settings.showPorchMidPostsOnEndwallsOnly || da.settings.hasOwnProperty("showPorchPostsOnEndwallsOnly") && da.settings.showPorchPostsOnEndwallsOnly) && ((a.startsWith("porchWrapNW") || a.startsWith("porchWrapHipNW") || a.startsWith("porchWrapSE") || a.startsWith("porchWrapHipSE")) && (console.log("wrap A: " + a), h = 0), (a.startsWith("porchWrapNE") || a.startsWith("porchWrapHipNE") || a.startsWith("porchWrapSW") || a.startsWith("porchWrapHipSW")) && (console.log("wrap: " + a), l = 0), a.startsWith("porchE") || a.startsWith("porchW")) && (l = 0), n / ((l = Math.max(0, l)) + 1)), d = e / ((h = Math.max(0, h)) + 1); if ("porchWrap" === a.substring(0, 9) && (o.position.x = t), o.position.z = t - .4, void 0 !== na.getObjectByName("porchPost") && void 0 !== na.getObjectByName("porchPostMetal")) { let t; if (da.settings.woodenPorchPosts) t = na.getObjectByName("porchPost"); else { t = na.getObjectByName("porchPostMetal"); for (let e = 0; e < t.material.length; e++) "PorchPostsMetal" === t.material[e].name && t.material[e].color.copy(Ea) } for (let e = 1; e <= l + h; e++) { var p = t.GdeepCloneMaterials(); p.name = "porchPost-Clone", p.castShadow = !0, p.visible = !0, p.rotation.x = 0, e <= l ? "porchWrap" === a.substring(0, 9) ? p.position.x = e * -c : p.position.x = n / 2 + e * -c : (p.rotation.y = Math.PI / 2, p.position.z = (e - l) * -d), p.morphTargetInfluences[p.morphTargetDictionary.ceilingHeight] = r, p.morphTargetInfluences[p.morphTargetDictionary.miters] = i.morphTargetInfluences[i.morphTargetDictionary.miters]; for (let e = 0; e < i.material.length; e++) if ("PorchPosts" === i.material[e].name && i.material[e].color.getHex() !== At.getHex() && i.material[e].color.getHex() !== Vt.getHex()) for (let e = 0; e < p.material.length; e++) "PorchPosts" === p.material[e].name && (p.material[e].color.setStyle(F.filter(e => e.name === da[da.settings.wrappedPorchPostColorMatches]).map(e => e.hex)), p.material[e].specular.setHex(3947580), p.material[e].shininess.value = 40); o.add(p) } } } da.settings.hasOwnProperty("showPorchPostsOnEndwallsOnly") && da.settings.showPorchPostsOnEndwallsOnly && ((a.startsWith("porchWrapNW") || a.startsWith("porchWrapHipNW") || a.startsWith("porchWrapSE") || a.startsWith("porchWrapHipSE")) && (h = 0), (a.startsWith("porchWrapNE") || a.startsWith("porchWrapHipNE") || a.startsWith("porchWrapSW") || a.startsWith("porchWrapHipSW")) && (l = 0), a.startsWith("porchE") || a.startsWith("porchW")) } } } function Va() { var e = da.cupola18in + da.cupola2 + da.cupola3 + da.cupola4 + da.cupolaWindow18in + da.cupolaWindow2 + da.cupolaWindow3 + da.cupolaWindow4; let a = da.width / 2 * da.roofPitch / 12 + da.height; ia.traverse(function(e) { e instanceof THREE.Mesh && e.name.startsWith("weatherVane") && (e.visible = !1, e.parent = ia) }), "None" !== da.weatherVane && 0 == e && (ia.getObjectByName("weatherVane" + da.weatherVane + "-1").visible = !0, ia.getObjectByName("weatherVane" + da.weatherVane + "-1").position.set(0, a, da.depth / 2 - .25)); let o = 1; 0 < e && "None" !== da.weatherVane && ia.traverse(function(e) { var t; e instanceof THREE.Mesh && e.name.startsWith("cupola") && e.visible && (a = e.name.startsWith("cupola3") || e.name.startsWith("cupolaWindow3") ? 4.25 : e.name.startsWith("cupola4") || e.name.startsWith("cupolaWindow4") ? 5.25 : 2.75, (t = ia.getObjectByName("weatherVane" + da.weatherVane + "-" + o)).position.set(0, a, 0), t.visible = !0, t.parent = e, o++) }), G = !0 } function Ua() { var e = da.cupola18in + da.cupola2 + da.cupola3 + da.cupola4 + da.cupolaWindow18in + da.cupolaWindow2 + da.cupolaWindow3 + da.cupolaWindow4, t = da.roofPitch / 12 * 2 / 100, a = ia.getObjectByName("roofR").position.x, o = ia.getObjectByName("roofR").position.y, i = (da.depth - 3 - 3) / (e - 1), n = da.depth / 2 - 3, r = (1 === e && (n = 0), 2 === e && (i = 2 * (n = da.depth / 2 / 2)), da.cupola18in), s = 0, l = da.cupolaWindow18in, h = 0, c = da.cupola2, d = 0, p = da.cupolaWindow2, m = 0, g = da.cupola3, u = 0, T = da.cupolaWindow3, b = 0, y = da.cupola4, f = da.cupolaWindow4; 1 < da.cupola18in && (r = Math.round(da.cupola18in / 2), s = da.cupola18in - r), 1 < da.cupolaWindow18in && (l = Math.round(da.cupolaWindow18in / 2), h = da.cupolaWindow18in - l), 1 < da.cupola2 && (c = Math.round(da.cupola2 / 2), d = da.cupola2 - c), 1 < da.cupolaWindow2 && (p = Math.round(da.cupolaWindow2 / 2), m = da.cupolaWindow2 - p), 1 < da.cupola3 && (g = Math.round(da.cupola3 / 2), u = da.cupola3 - g), 1 < da.cupolaWindow3 && (T = Math.round(da.cupolaWindow3 / 2), b = da.cupolaWindow3 - T); for (let e = 1; e <= vt; e++) ia.getObjectByName("cupola18in-" + e) && (ia.getObjectByName("cupola18in-" + e).visible = !1), ia.getObjectByName("cupola2-" + e) && (ia.getObjectByName("cupola2-" + e).visible = !1), ia.getObjectByName("cupola3-" + e) && (ia.getObjectByName("cupola3-" + e).visible = !1), ia.getObjectByName("cupola4-" + e) && (ia.getObjectByName("cupola4-" + e).visible = !1), ia.getObjectByName("cupolaWindow18in-" + e) && (ia.getObjectByName("cupolaWindow18in-" + e).visible = !1), ia.getObjectByName("cupolaWindow2-" + e) && (ia.getObjectByName("cupolaWindow2-" + e).visible = !1), ia.getObjectByName("cupolaWindow3-" + e) && (ia.getObjectByName("cupolaWindow3-" + e).visible = !1), ia.getObjectByName("cupolaWindow4-" + e) && (ia.getObjectByName("cupolaWindow4-" + e).visible = !1), ia.getObjectByName("cupola18in-" + e) && da.cupola18in >= e && (ia.getObjectByName("cupola18in-" + e).visible = !0), ia.getObjectByName("cupola2-" + e) && da.cupola2 >= e && (ia.getObjectByName("cupola2-" + e).visible = !0), ia.getObjectByName("cupola3-" + e) && da.cupola3 >= e && (ia.getObjectByName("cupola3-" + e).visible = !0), ia.getObjectByName("cupola4-" + e) && da.cupola4 >= e && (ia.getObjectByName("cupola4-" + e).visible = !0), ia.getObjectByName("cupolaWindow18in-" + e) && da.cupolaWindow18in >= e && (ia.getObjectByName("cupolaWindow18in-" + e).visible = !0), ia.getObjectByName("cupolaWindow2-" + e) && da.cupolaWindow2 >= e && (ia.getObjectByName("cupolaWindow2-" + e).visible = !0), ia.getObjectByName("cupolaWindow3-" + e) && da.cupolaWindow3 >= e && (ia.getObjectByName("cupolaWindow3-" + e).visible = !0), ia.getObjectByName("cupolaWindow4-" + e) && da.cupolaWindow4 >= e && (ia.getObjectByName("cupolaWindow4-" + e).visible = !0); let w = 1, v; for (let e = 1; e <= r; e++) v = ia.getObjectByName("cupola18in-" + e), 1 < w && (n += -i), v.position.set(a, o, n), v.morphTargetInfluences[v.morphTargetDictionary.cupolaSlope] = t, w++; for (let e = 1; e <= l; e++) v = ia.getObjectByName("cupolaWindow18in-" + e), 1 < w && (n += -i), v.position.set(a, o, n), v.morphTargetInfluences[v.morphTargetDictionary.cupolaSlope] = t, w++; for (let e = 1; e <= c; e++) v = ia.getObjectByName("cupola2-" + e), 1 < w && (n += -i), v.position.set(a, o, n), v.morphTargetInfluences[v.morphTargetDictionary.cupolaSlope] = t, w++; for (let e = 1; e <= p; e++) v = ia.getObjectByName("cupolaWindow2-" + e), 1 < w && (n += -i), v.position.set(a, o, n), v.morphTargetInfluences[v.morphTargetDictionary.cupolaSlope] = t, w++; for (let e = 1; e <= g; e++) v = ia.getObjectByName("cupola3-" + e), 1 < w && (n += -i), v.position.set(a, o, n), v.morphTargetInfluences[v.morphTargetDictionary.cupolaSlope] = t, w++; for (let e = 1; e <= T; e++) v = ia.getObjectByName("cupolaWindow3-" + e), 1 < w && (n += -i), v.position.set(a, o, n), v.morphTargetInfluences[v.morphTargetDictionary.cupolaSlope] = t, w++; for (let e = 1; e <= y; e++) v = ia.getObjectByName("cupola4-" + e), 1 < w && (n += -i), v.position.set(a, o, n), v.morphTargetInfluences[v.morphTargetDictionary.cupolaSlope] = t, w++; for (let e = 1; e <= f; e++) v = ia.getObjectByName("cupolaWindow4-" + e), 1 < w && (n += -i), v.position.set(a, o, n), v.morphTargetInfluences[v.morphTargetDictionary.cupolaSlope] = t, w++; for (let e = T + 1; e <= b + T; e++) v = ia.getObjectByName("cupolaWindow3-" + e), 1 < w && (n += -i), v.position.set(a, o, n), v.morphTargetInfluences[v.morphTargetDictionary.cupolaSlope] = t, w++; for (let e = g + 1; e <= u + g; e++) v = ia.getObjectByName("cupola3-" + e), 1 < w && (n += -i), v.position.set(a, o, n), v.morphTargetInfluences[v.morphTargetDictionary.cupolaSlope] = t, w++; for (let e = p + 1; e <= m + p; e++) v = ia.getObjectByName("cupolaWindow2-" + e), 1 < w && (n += -i), v.position.set(a, o, n), v.morphTargetInfluences[v.morphTargetDictionary.cupolaSlope] = t, w++; for (let e = c + 1; e <= d + c; e++) v = ia.getObjectByName("cupola2-" + e), 1 < w && (n += -i), v.position.set(a, o, n), v.morphTargetInfluences[v.morphTargetDictionary.cupolaSlope] = t, w++; for (let e = l + 1; e <= h + l; e++) v = ia.getObjectByName("cupolaWindow18in-" + e), 1 < w && (n += -i), v.position.set(a, o, n), v.morphTargetInfluences[v.morphTargetDictionary.cupolaSlope] = t, w++; for (let e = r + 1; e <= s + r; e++) v = ia.getObjectByName("cupola18in-" + e), 1 < w && (n += -i), v.position.set(a, o, n), v.morphTargetInfluences[v.morphTargetDictionary.cupolaSlope] = t, w++; Va(), G = !0 } function K() { if (da.wainscot1 || da.wainscot2 || da.wainscot3 || da.wainscot4) { if (k.__folders.hasOwnProperty("Colors")) for (let e = 0; e < k.__folders.Colors.__controllers.length; e++) { var t = k.__folders.Colors.__controllers[e]; "wainscotColor" === t.property && (t.domElement.parentElement.parentElement.hidden = !1, t.updateDisplay()) } } else if (k.__folders.hasOwnProperty("Colors")) for (let e = 0; e < k.__folders.Colors.__controllers.length; e++) { var a = k.__folders.Colors.__controllers[e]; "wainscotColor" === a.property && (a.domElement.parentElement.parentElement.hidden = !0, a.updateDisplay()) } ia.traverse(function(t) { if (0 === da.hideWalls && t instanceof THREE.Mesh && ("building" === t.name || "leanTo1" === t.name || "leanTo2" === t.name || "leanTo3" === t.name || "leanTo4" === t.name || t.name.startsWith("coveredGableExtension"))) { t.hasOwnProperty("morphTargetDictionary") && t.morphTargetDictionary.hasOwnProperty("wainscotHeight") && (da.hasOwnProperty("wainscotHeight") ? t.morphTargetInfluences[t.morphTargetDictionary.wainscotHeight] = da.wainscotHeight - 1 : t.morphTargetInfluences[t.morphTargetDictionary.wainscotHeight] = 2.5); for (let e = 0; e < t.material.length; e++) "BuildingWainscot1" !== t.material[e].name && !t.material[e].name.startsWith("BuildingWainscotTrim1") && ("leanTo1" !== t.name || "LeantoWainscot1" !== t.material[e].name && "LeantoWainscotTrim1" !== t.material[e].name && "LeantoWainscot2" !== t.material[e].name && "LeantoWainscotTrim2" !== t.material[e].name && "LeantoWainscot3" !== t.material[e].name && "LeantoWainscotTrim3" !== t.material[e].name) || (da.wainscot1 && (da.enclosedN && t.material[e].name.startsWith("BuildingWainscot") && (!da.leanTo1 || da.leanTo1 && !da.leanTo1Enclosed) || t.material[e].name.startsWith("LeantoWainscot") && da.leanTo1 && da.leanTo1Enclosed && "Fully Enclosed" == da.leanTo1Walls) ? t.material[e].visible = !0 : t.material[e].visible = !1), "BuildingWainscot2" !== t.material[e].name && !t.material[e].name.startsWith("BuildingWainscotTrim2") && ("leanTo2" !== t.name || "LeantoWainscot1" !== t.material[e].name && "LeantoWainscotTrim1" !== t.material[e].name && "LeantoWainscot2" !== t.material[e].name && "LeantoWainscotTrim2" !== t.material[e].name && "LeantoWainscot3" !== t.material[e].name && "LeantoWainscotTrim3" !== t.material[e].name) || (da.wainscot2 && (da.enclosedE && t.material[e].name.startsWith("BuildingWainscot") && (!da.leanTo2 || da.leanTo2 && (!da.leanTo2Enclosed || "Fully Enclosed" !== da.leanTo2Walls)) || t.material[e].name.startsWith("LeantoWainscot") && da.leanTo2 && da.leanTo2Enclosed && "Fully Enclosed" == da.leanTo2Walls) ? t.material[e].visible = !0 : t.material[e].visible = !1), "BuildingWainscot3" !== t.material[e].name && !t.material[e].name.startsWith("BuildingWainscotTrim3") && ("leanTo3" !== t.name || "LeantoWainscot1" !== t.material[e].name && "LeantoWainscotTrim1" !== t.material[e].name && "LeantoWainscot2" !== t.material[e].name && "LeantoWainscotTrim2" !== t.material[e].name && "LeantoWainscot3" !== t.material[e].name && "LeantoWainscotTrim3" !== t.material[e].name) || (da.wainscot3 && (da.enclosedS && t.material[e].name.startsWith("BuildingWainscot") && (!da.leanTo3 || da.leanTo3 && !da.leanTo3Enclosed) || t.material[e].name.startsWith("LeantoWainscot") && da.leanTo3 && da.leanTo3Enclosed && "Fully Enclosed" == da.leanTo3Walls) ? t.material[e].visible = !0 : t.material[e].visible = !1), "BuildingWainscot4" !== t.material[e].name && !t.material[e].name.startsWith("BuildingWainscotTrim4") && ("leanTo4" !== t.name || "LeantoWainscot1" !== t.material[e].name && "LeantoWainscotTrim1" !== t.material[e].name && "LeantoWainscot2" !== t.material[e].name && "LeantoWainscotTrim2" !== t.material[e].name && "LeantoWainscot3" !== t.material[e].name && "LeantoWainscotTrim3" !== t.material[e].name) || (da.wainscot4 && (da.enclosedW && t.material[e].name.startsWith("BuildingWainscot") && (!da.leanTo4 || da.leanTo4 && (!da.leanTo4Enclosed || "Fully Enclosed" !== da.leanTo4Walls)) || t.material[e].name.startsWith("LeantoWainscot") && da.leanTo4 && da.leanTo4Enclosed && "Fully Enclosed" == da.leanTo4Walls) ? t.material[e].visible = !0 : t.material[e].visible = !1), "BuildingWainscot1" !== t.material[e].name && "BuildingWainscot2" !== t.material[e].name && "BuildingWainscot3" !== t.material[e].name && "BuildingWainscot4" !== t.material[e].name && "LeantoWainscot1" !== t.material[e].name && "LeantoWainscot2" !== t.material[e].name && "LeantoWainscot3" !== t.material[e].name || (("Stone" === da.wainscotColor || "Brick" === da.wainscotColor) && (da.wainscot1 || da.wainscot2 || da.wainscot3 || da.wainscot4) || (t.morphTargetInfluences[t.morphTargetDictionary.trimWainscot1] = 0, t.morphTargetInfluences[t.morphTargetDictionary.trimWainscot2] = 0, t.morphTargetInfluences[t.morphTargetDictionary.trimWainscot3] = 0, t.morphTargetInfluences[t.morphTargetDictionary.trimWainscot4] = 0), t.geometry.dynamic = !0, t.geometry.hasOwnProperty("normalsNeedUpdate") && (t.geometry.normalsNeedUpdate = !0), t.geometry.hasOwnProperty("tangentsNeedUpdate") && (t.geometry.tangentsNeedUpdate = !0)), da.leanTo1 && da.leanTo1Enclosed && "Fully Enclosed" == da.leanTo1Walls && da.leanTo1Length === da.depth && !1 === da.wainscot1 && da.wainscot2 && "leanTo1" === t.name && ("LeantoWainscot1" === t.material[e].name || "LeantoWainscotTrim1" === t.material[e].name) && (t.material[e].visible = !0), da.leanTo1 && da.leanTo1Enclosed && "Fully Enclosed" == da.leanTo1Walls && da.leanTo1Length === da.depth && !1 === da.wainscot1 && da.wainscot4 && "leanTo1" === t.name && ("LeantoWainscot3" === t.material[e].name || "LeantoWainscotTrim3" === t.material[e].name) && (t.material[e].visible = !0), da.leanTo1 && da.leanTo1Enclosed && "Fully Enclosed" == da.leanTo1Walls && da.leanTo1Length === da.width && da.wainscot1 && !1 === da.wainscot2 && "leanTo1" === t.name && ("LeantoWainscot1" === t.material[e].name || "LeantoWainscotTrim1" === t.material[e].name) && (t.material[e].visible = !1), da.leanTo1 && da.leanTo1Enclosed && "Fully Enclosed" == da.leanTo1Walls && da.leanTo1Length === da.width && da.wainscot1 && !1 === da.wainscot4 && "leanTo1" === t.name && ("LeantoWainscot3" === t.material[e].name || "LeantoWainscotTrim3" === t.material[e].name) && (t.material[e].visible = !1), da.leanTo2 && da.leanTo2Enclosed && "Fully Enclosed" == da.leanTo2Walls && da.leanTo2Length === da.depth && !1 === da.wainscot2 && da.wainscot1 && "leanTo2" === t.name && ("LeantoWainscot3" === t.material[e].name || "LeantoWainscotTrim3" === t.material[e].name) && (t.material[e].visible = !0), da.leanTo2 && da.leanTo2Enclosed && "Fully Enclosed" == da.leanTo2Walls && da.leanTo2Length === da.depth && !1 === da.wainscot2 && da.wainscot3 && "leanTo2" === t.name && ("LeantoWainscot1" === t.material[e].name || "LeantoWainscotTrim1" === t.material[e].name) && (t.material[e].visible = !0), da.leanTo2 && da.leanTo2Enclosed && "Fully Enclosed" == da.leanTo2Walls && da.leanTo2Length === da.depth && da.wainscot2 && !1 === da.wainscot1 && "leanTo2" === t.name && ("LeantoWainscot3" === t.material[e].name || "LeantoWainscotTrim3" === t.material[e].name) && (t.material[e].visible = !1), da.leanTo2 && da.leanTo2Enclosed && "Fully Enclosed" == da.leanTo2Walls && da.leanTo2Length === da.depth && da.wainscot2 && !1 === da.wainscot3 && "leanTo2" === t.name && ("LeantoWainscot1" === t.material[e].name || "LeantoWainscotTrim1" === t.material[e].name) && (t.material[e].visible = !1), da.leanTo3 && da.leanTo3Enclosed && "Fully Enclosed" == da.leanTo3Walls && da.leanTo3Length === da.depth && !1 === da.wainscot3 && da.wainscot2 && "leanTo3" === t.name && ("LeantoWainscot3" === t.material[e].name || "LeantoWainscotTrim3" === t.material[e].name) && (t.material[e].visible = !0), da.leanTo3 && da.leanTo3Enclosed && "Fully Enclosed" == da.leanTo3Walls && da.leanTo3Length === da.depth && !1 === da.wainscot3 && da.wainscot4 && "leanTo3" === t.name && ("LeantoWainscot1" === t.material[e].name || "LeantoWainscotTrim1" === t.material[e].name) && (t.material[e].visible = !0), da.leanTo3 && da.leanTo3Enclosed && "Fully Enclosed" == da.leanTo3Walls && da.leanTo3Length === da.width && da.wainscot3 && !1 === da.wainscot2 && "leanTo3" === t.name && ("LeantoWainscot3" === t.material[e].name || "LeantoWainscotTrim3" === t.material[e].name) && (t.material[e].visible = !1), da.leanTo3 && da.leanTo3Enclosed && "Fully Enclosed" == da.leanTo3Walls && da.leanTo3Length === da.width && da.wainscot3 && !1 === da.wainscot4 && "leanTo3" === t.name && ("LeantoWainscot1" === t.material[e].name || "LeantoWainscotTrim1" === t.material[e].name) && (t.material[e].visible = !1), da.leanTo4 && da.leanTo4Enclosed && "Fully Enclosed" == da.leanTo4Walls && da.leanTo4Length === da.depth && !1 === da.wainscot4 && da.wainscot1 && "leanTo4" === t.name && ("LeantoWainscot1" === t.material[e].name || "LeantoWainscotTrim1" === t.material[e].name) && (t.material[e].visible = !0), da.leanTo4 && da.leanTo4Enclosed && "Fully Enclosed" == da.leanTo4Walls && da.leanTo4Length === da.depth && !1 === da.wainscot4 && da.wainscot3 && "leanTo4" === t.name && ("LeantoWainscot3" === t.material[e].name || "LeantoWainscotTrim3" === t.material[e].name) && (t.material[e].visible = !0), da.leanTo4 && da.leanTo4Enclosed && "Fully Enclosed" == da.leanTo4Walls && da.leanTo4Length === da.depth && da.wainscot4 && !1 === da.wainscot1 && "leanTo4" === t.name && ("LeantoWainscot1" === t.material[e].name || "LeantoWainscotTrim1" === t.material[e].name) && (t.material[e].visible = !1), da.leanTo4 && da.leanTo4Enclosed && "Fully Enclosed" == da.leanTo4Walls && da.leanTo4Length === da.depth && da.wainscot4 && !1 === da.wainscot3 && "leanTo4" === t.name && ("LeantoWainscot3" === t.material[e].name || "LeantoWainscotTrim3" === t.material[e].name) && (t.material[e].visible = !1), da.leanTo1 && da.leanTo1Enclosed && "Fully Enclosed" == da.leanTo1Walls && da.wainscot1 && da.leanTo1Length !== da.width && ("BuildingWainscot1" === t.material[e].name || "BuildingWainscotTrim1" === t.material[e].name) && (t.material[e].visible = !0), da.leanTo2 && da.leanTo2Enclosed && "Fully Enclosed" == da.leanTo2Walls && da.wainscot2 && da.leanTo2Length !== da.depth && ("BuildingWainscot2" === t.material[e].name || "BuildingWainscotTrim2" === t.material[e].name) && (t.material[e].visible = !0), da.leanTo3 && da.leanTo3Enclosed && "Fully Enclosed" == da.leanTo3Walls && da.wainscot3 && da.leanTo3Length !== da.width && ("BuildingWainscot3" === t.material[e].name || "BuildingWainscotTrim3" === t.material[e].name) && (t.material[e].visible = !0), da.leanTo4 && da.leanTo4Enclosed && "Fully Enclosed" == da.leanTo4Walls && da.wainscot4 && da.leanTo4Length !== da.depth && ("BuildingWainscot4" === t.material[e].name || "BuildingWainscotTrim4" === t.material[e].name) && (t.material[e].visible = !0) } }), G = !0 } function Qa() { var e = 0; if ("Gabled" === da.roofType) { if (k.__folders.hasOwnProperty("Building Dimensions")) for (e = 0; e < k.__folders["Building Dimensions"].__controllers.length; e++) { var t = k.__folders["Building Dimensions"].__controllers[e]; "asymmetrical" === t.property && (t.domElement.parentElement.parentElement.hidden = !0, t.updateDisplay()), "roofPitch" === t.property && (t.min(da.settings.roofPitchMin), da.roofPitch < da.settings.roofPitchMin && (da.roofPitch = da.settings.roofPitchMin), t.updateDisplay()) } ia.traverse(function(t) { if (t instanceof THREE.Mesh) { if ("roofL" === t.name || "roofR" === t.name) for (let e = 0; e < t.material.length; e++) "BuildingRidgeCap" === t.material[e].name && (t.material[e].visible = !0); "building" === t.name && (t.morphTargetInfluences[t.morphTargetDictionary.heightRight] = 0, t.morphTargetInfluences[t.morphTargetDictionary.heightLeft] = 0) } }) } if ("Single Slope" === da.roofType) { if (k.__folders.hasOwnProperty("Building Dimensions")) for (e = 0; e < k.__folders["Building Dimensions"].__controllers.length; e++) { var a = k.__folders["Building Dimensions"].__controllers[e]; "asymmetrical" === a.property && (a.domElement.parentElement.parentElement.hidden = !0, a.updateDisplay()), "roofPitch" === a.property && (a.min(-da.settings.roofPitchMax), a.updateDisplay()) } ia.traverse(function(t) { if (t instanceof THREE.Mesh && ("roofL" === t.name || "roofR" === t.name)) for (let e = 0; e < t.material.length; e++) "BuildingRidgeCap" === t.material[e].name && (t.material[e].visible = !1) }) } if ("Asymmetrical" === da.roofType) { if (k.__folders.hasOwnProperty("Building Dimensions")) for (e = 0; e < k.__folders["Building Dimensions"].__controllers.length; e++) { var o = k.__folders["Building Dimensions"].__controllers[e]; "asymmetrical" === o.property && (o.domElement.parentElement.parentElement.hidden = !1, o.min(da.width / -2 + 3), o.max(da.width / 2 - 3), da.asymmetrical < da.width / -2 + 3 && (da.asymmetrical = da.width / -2 + 3), da.asymmetrical > da.width / 2 - 3 && (da.asymmetrical = da.width / 2 - 3), o.updateDisplay()), "roofPitch" === o.property && (o.min(da.settings.roofPitchMin), da.roofPitch < 3 && (da.roofPitch = 3), o.updateDisplay()) } ia.traverse(function(t) { if (t instanceof THREE.Mesh) { if ("roofL" === t.name || "roofR" === t.name) for (let e = 0; e < t.material.length; e++) "BuildingRidgeCap" === t.material[e].name && (t.material[e].visible = !0); "building" === t.name && (t.morphTargetInfluences[t.morphTargetDictionary.heightRight] = 0, t.morphTargetInfluences[t.morphTargetDictionary.heightLeft] = 0) } }) } x() } function Xa() { .5 < da.eavePitchL ? da.eavePitchL = Math.round(da.eavePitchL) : da.eavePitchL = .5, .5 < da.eavePitchR ? da.eavePitchR = Math.round(da.eavePitchR) : da.eavePitchR = .5; var e, t, a; da.height; let o = 0, i, n, r, s, l, h, c, d, p; if ("Single Slope" === da.roofType ? (da.width, Math.abs(da.roofPitch), o = da.width * Math.abs(da.roofPitch) / 12, i = Math.atan(da.width / o), n = i, r = -i, da.roofPitch < 0 && (n = -i, r = i), s = Math.sqrt(Math.pow(o, 2) + Math.pow(da.width, 2)), l = s / 2, h = s / 2, da.roofPitch < 0 ? la.rotation.z = Math.PI / -180 * -90 - i : la.rotation.z = Math.PI / 180 * -90 + i, la.position.x = 0, la.position.y = o / 2 + da.height + .1, la.morphTargetInfluences[la.morphTargetDictionary.width] = (s / 2 - .5) / 50 + da.eaveL / 50, da.roofPitch < 0 ? sa.rotation.z = -Math.PI / -180 * -90 + i : sa.rotation.z = -Math.PI / 180 * -90 - i, sa.position.x = 0, sa.position.y = o / 2 + da.height + .1, sa.morphTargetInfluences[sa.morphTargetDictionary.width] = (s / 2 - .5) / 50 + da.eaveR / 50, da.roofPitch < 0 ? (_.morphTargetInfluences[_.morphTargetDictionary.heightLeft] = o / 100, _.morphTargetInfluences[_.morphTargetDictionary.heightRight] = 0) : (_.morphTargetInfluences[_.morphTargetDictionary.heightRight] = o / 100, _.morphTargetInfluences[_.morphTargetDictionary.heightLeft] = 0), _.morphTargetInfluences[_.morphTargetDictionary.roofPeak] = o / 100 / 2) : "Asymmetrical" === da.roofType ? (!da.settings.allowZeroPitchRoof && da.roofPitch < .5 && (da.roofPitch = .5), !da.settings.allowZeroPitchRoof && (.5 < da.roofPitch || da.roofPitch < -.5) && (da.roofPitch = Math.round(da.roofPitch)), c = da.width / 2 + da.asymmetrical, d = da.width / 2 - da.asymmetrical, p = Math.max(c, d), o = p * da.roofPitch / 12, n = Math.atan(c / o), r = Math.atan(d / o), l = Math.sqrt(Math.pow(o, 2) + Math.pow(c, 2)), h = Math.sqrt(Math.pow(o, 2) + Math.pow(d, 2)), ia.traverse(function(e) { e instanceof THREE.Mesh && ("roofL" === e.name && (e.rotation.z = Math.PI / 180 * -90 + n, e.position.x = da.asymmetrical, e.position.y = o + da.height + .1, e.morphTargetInfluences[e.morphTargetDictionary.width] = (l - .5) / 50 + da.eaveL / 50), "roofR" === e.name && (e.rotation.z = -Math.PI / 180 * 90 + r, e.position.x = da.asymmetrical, e.position.y = o + da.height + .1, e.morphTargetInfluences[e.morphTargetDictionary.width] = (h - .5) / 50 + da.eaveR / 50), "building" === e.name) && (e.morphTargetInfluences[e.morphTargetDictionary.roofPeak] = o / 100) })) : (!da.settings.allowZeroPitchRoof && da.roofPitch < .5 && (da.roofPitch = .5), !da.settings.allowZeroPitchRoof && (.5 < da.roofPitch || da.roofPitch < -.5) && (da.roofPitch = Math.round(da.roofPitch)), o = da.width / 2 * da.roofPitch / 12, i = Math.atan(da.width / 2 / o), n = i, r = i, s = Math.sqrt(Math.pow(o, 2) + Math.pow(da.width / 2, 2)), l = s, h = s, da.leanTo2 && (da.leanTo2Depth, Math.tan(Math.atan(da.leanTo2Pitch / 12))), da.leanTo4 && (da.leanTo4Depth, Math.tan(Math.atan(da.leanTo4Pitch / 12))), ia.traverse(function(e) { e instanceof THREE.Mesh && ("roofL" === e.name && (e.rotation.z = Math.PI / 180 * -90 + i, e.position.x = 0, e.position.y = o + da.height + .1, 0 < da.eaveL && (!da.leanTo2 || da.leanTo2 && da.leanTo2Height < da.height) ? e.morphTargetInfluences[e.morphTargetDictionary.width] = (s - .5) / 50 + da.eaveL / 50 : e.morphTargetInfluences[e.morphTargetDictionary.width] = (s - .5) / 50), "roofR" === e.name && (e.rotation.z = -Math.PI / 180 * 90 + i, e.position.x = 0, e.position.y = o + da.height + .1, 0 < da.eaveR && (!da.leanTo4 || da.leanTo4 && da.leanTo4Height < da.height) ? e.morphTargetInfluences[e.morphTargetDictionary.width] = (s - .5) / 50 + da.eaveR / 50 : e.morphTargetInfluences[e.morphTargetDictionary.width] = (s - .5) / 50), "roofEaveL" !== e.name && "roofEaveR" !== e.name || (e.visible = !1), "building" === e.name) && (e.morphTargetInfluences[e.morphTargetDictionary.roofPeak] = o / 100) })), da.settings.boxedEaves && (u = ia.getObjectByName("boxedEaveL"), T = ia.getObjectByName("boxedEaveR"), 0 < da.eaveL && (u.visible = !0), 0 < da.eaveR && (T.visible = !0), u.position.y = da.wallHeightL(), T.position.y = da.wallHeightR(), u.position.x = da.width / -2, T.position.x = da.width / 2, u.position.z = -da.gableBack / 2 + da.gableFront / 2, T.position.z = -da.gableBack / 2 + da.gableFront / 2, u.morphTargetInfluences[u.morphTargetDictionary.depth] = da.depth + da.gableBack + da.gableFront - 1, T.morphTargetInfluences[T.morphTargetDictionary.depth] = da.depth + da.gableBack + da.gableFront - 1, u.morphTargetInfluences[u.morphTargetDictionary.width] = da.eaveL / Math.hypot(12, da.roofPitch) * 12 - 1.1, T.morphTargetInfluences[T.morphTargetDictionary.width] = da.eaveR / Math.hypot(12, da.roofPitch) * 12 - 1.1, u.morphTargetInfluences[u.morphTargetDictionary.height] = da.eaveL / Math.hypot(12, da.roofPitch) * da.roofPitch - .5, T.morphTargetInfluences[T.morphTargetDictionary.height] = da.eaveR / Math.hypot(12, da.roofPitch) * da.roofPitch - .5, u.morphTargetInfluences[u.morphTargetDictionary.slope] = u.morphTargetInfluences[u.morphTargetDictionary.height] + 1 - .5, T.morphTargetInfluences[T.morphTargetDictionary.slope] = T.morphTargetInfluences[T.morphTargetDictionary.height] + 1 - .5), da.hasOwnProperty("ridgeVents")) { var m = ia.getObjectByName("RidgeVent"); if (0 == da.ridgeVents) for (let e = 1; e <= 6; e++) void 0 !== ia.getObjectByName("RidgeVent" + e + "-clone") && (na.getObjectByName("RidgeVent" + e + "-clone").visible = !1); else { let t; for (let e = 1; e <= 6; e++) void 0 === ia.getObjectByName("RidgeVent" + e + "-clone") && ((t = m.clone()).name = "RidgeVent" + e + "-clone", na.add(t)), t = ia.getObjectByName("RidgeVent" + e + "-clone"), e <= da.ridgeVents ? t.visible = !0 : t.visible = !1, t.position.y = ia.getObjectByName("roofR").position.y, t.position.z = da.depth / -2 - da.depth / (2 * da.ridgeVents) + da.depth / (2 * da.ridgeVents) * 2 * e } } let g = "Logo-" + da.logoShape; "Wall" == da.logoPlacement && (g = "Logo-Round"), ia.getObjectByName(g) && (ue || ((ue = ia.getObjectByName(g)).castShadow = !0, ue.receiveShadow = !0, ue.visible = !0), Te || ((Te = ue.clone()).name += "2", Te.rotation.y = THREE.Math.degToRad(180), na.add(Te)), "Peak" == da.logoPlacement && (e = "Asymmetrical" === da.roofType ? da.asymmetrical : 0, t = "Single Slope" === da.roofType ? da.height + o / 2 - .25 : da.height + o - .25, b = da.depth / 2 + da.gableFront + .1, a = da.depth / 2 + da.gableBack + .1), "Wall" == da.logoPlacement && (e = "Asymmetrical" === da.roofType ? da.asymmetrical : 0, t = "Single Slope" === da.roofType ? da.height + o / 2 - 1.5 : da.height + o - 1.5, b = da.depth / 2 + .1, a = da.depth / 2 + .1), "None" == da.logoPlacement ? (ue.visible = !1, Te.visible = !1) : (ue.position.set(e, t, b), Te.position.set(e, t, -a))); var u = new THREE.Vector3, T = new THREE.Vector3, b = new THREE.Vector3; u.set(0, 1, 0).applyQuaternion(la.quaternion), T.set(0, -1, 0).applyQuaternion(la.quaternion), b.copy(la.position), Je.setFromNormalAndCoplanarPoint(u, b), et.setFromNormalAndCoplanarPoint(T, b), u = new THREE.Vector3, T = new THREE.Vector3, b = new THREE.Vector3, u.set(0, 1, 0).applyQuaternion(sa.quaternion), T.set(0, -1, 0).applyQuaternion(sa.quaternion), b.copy(sa.position), Ke.setFromNormalAndCoplanarPoint(u, b), tt.setFromNormalAndCoplanarPoint(T, b) } function O() { ia.traverse(function(a) { if (a instanceof THREE.Mesh && a.material) { a.name.startsWith("ceiling") && "Steel" == da.ceiling && a.material.color.setStyle(F.filter(e => e.name === da.interiorPanelColor).map(e => e.hex)), "Downspouts" === a.material.name && (da.hasOwnProperty("downspoutColor") ? a.material.color.setStyle(F.filter(e => e.name === da.downspoutColor).map(e => e.hex)) : da.hasOwnProperty("gutterColor") ? a.material.color.setStyle(F.filter(e => e.name === da.gutterColor).map(e => e.hex)) : da.hasOwnProperty("trimCornerColor") ? a.material.color.setStyle(F.filter(e => e.name === da.trimCornerColor).map(e => e.hex)) : da.hasOwnProperty("trimWallColor") ? a.material.color.setStyle(F.filter(e => e.name === da.trimWallColor).map(e => e.hex)) : a.material.color.setStyle(F.filter(e => e.name === da.trimColor).map(e => e.hex))); for (let t = 0; t < a.material.length; t++) { if (("BuildingRoof" === a.material[t].name || "BuildingRoofWidth" === a.material[t].name || "BuildingRoofDepth" === a.material[t].name || "CupolaRoof" === a.material[t].name || "BuildingRidgeCap" === a.material[t].name || a.material[t].name.startsWith("Shutters")) && (a.material[t].color.setStyle(F.filter(e => e.name === da.roofColor).map(e => e.hex)), da.hasOwnProperty("shutterColor")) && a.material[t].name.startsWith("Shutters") && a.material[t].color.setStyle(F.filter(e => e.name === da.shutterColor).map(e => e.hex)), a.name.startsWith("garageSlide") || "BuildingWallsWidth" !== a.material[t].name && "BuildingWallsWidthLeftFront" !== a.material[t].name && "BuildingWallsWidthLeftBack" !== a.material[t].name && "BuildingWallsWidthRightFront" !== a.material[t].name && "BuildingWallsWidthRightBack" !== a.material[t].name && "BuildingWallsDepth" !== a.material[t].name && "BuildingWallsDepthL" !== a.material[t].name && "BuildingWallsDepthR" !== a.material[t].name && "BuildingWalls" !== a.material[t].name && "LeantoWallsWidth" !== a.material[t].name && "LeantoWallsDepth" !== a.material[t].name || a.material[t].color.setStyle(F.filter(e => e.name === da.wallColor).map(e => e.hex)), "PorchPosts" === a.material[t].name && a.material[t].color && a.material[t].color.getHex() !== At.getHex() && a.material[t].color.getHex() !== Vt.getHex() && a.material[t].color.setStyle(F.filter(e => e.name === da[da.settings.wrappedPorchPostColorMatches]).map(e => e.hex)), da.hasOwnProperty("baseTrim") && a.material[t].name.startsWith("BuildingTrim-Base") && (da.baseTrim ? a.material[t].visible = !0 : a.material[t].visible = !1), (a.material[t].name.startsWith("BuildingTrim") || "BuildingRidgeCap" === a.material[t].name || "Track" === a.material[t].name) && (a.material[t].color.setStyle(F.filter(e => e.name === da.trimColor).map(e => e.hex)), da.hasOwnProperty("trimWallColor") && (a.material[t].name.startsWith("BuildingTrim-Base") || a.material[t].name.startsWith("BuildingTrim-Corner") || "BuildingTrim1" == a.material[t].name || "BuildingTrim2" == a.material[t].name || "BuildingTrim3" == a.material[t].name || "BuildingTrim4" == a.material[t].name) && a.material[t].color.setStyle(F.filter(e => e.name === da.trimWallColor).map(e => e.hex)), da.hasOwnProperty("doorWindowTrimColor") && a.material[t].name.startsWith("BuildingTrim") && (a.name.startsWith("window") || a.name.startsWith("walkDoor") || a.name.startsWith("garage")) && a.material[t].color.setStyle(F.filter(e => e.name === da.doorWindowTrimColor).map(e => e.hex)), da.hasOwnProperty("doorTrimColor") && a.material[t].name.startsWith("BuildingTrim") && (a.name.startsWith("walkDoor") || a.name.startsWith("garage")) && a.material[t].color.setStyle(F.filter(e => e.name === da.doorTrimColor).map(e => e.hex)), da.hasOwnProperty("walkDoorTrimColor") && a.material[t].name.startsWith("BuildingTrim") && a.name.startsWith("walkDoor") && a.material[t].color.setStyle(F.filter(e => e.name === da.walkDoorTrimColor).map(e => e.hex)), da.hasOwnProperty("garageDoorTrimColor") && a.material[t].name.startsWith("BuildingTrim") && a.name.startsWith("garage") && a.material[t].color.setStyle(F.filter(e => e.name === da.garageDoorTrimColor).map(e => e.hex)), da.hasOwnProperty("windowTrimColor") && a.material[t].name.startsWith("BuildingTrim") && a.name.startsWith("window") && a.material[t].color.setStyle(F.filter(e => e.name === da.windowTrimColor).map(e => e.hex)), da.hasOwnProperty("trimRoofColor") && (a.material[t].name.startsWith("BuildingTrim-RoofPivot") || a.material[t].name.startsWith("BuildingTrim-Gable") || "BuildingRidgeCap" === a.material[t].name || a.material[t].name.startsWith("BuildingTrim-RoofEdge") || a.name.startsWith("cupola") && a.material[t].name.startsWith("BuildingTrim")) && a.material[t].color.setStyle(F.filter(e => e.name === da.trimRoofColor).map(e => e.hex)), ((a.material[t].name.startsWith("BuildingTrim-Base1") && da.wainscot1) || (a.material[t].name.startsWith("BuildingTrim-Base2") && da.wainscot2) || (a.material[t].name.startsWith("BuildingTrim-Base3") && da.wainscot3) || (a.material[t].name.startsWith("BuildingTrim-Base4") && da.wainscot4)) && da.hasOwnProperty("wainscotColor") && a.material[t].color.setStyle(F.filter(e => e.name === da.wainscotColor).map(e => e.hex)), da.hasOwnProperty("trimBaseColor") && a.material[t].name.startsWith("BuildingTrim-Base") && !((a.material[t].name.startsWith("BuildingTrim-Base1") && da.wainscot1) || (a.material[t].name.startsWith("BuildingTrim-Base2") && da.wainscot2) || (a.material[t].name.startsWith("BuildingTrim-Base3") && da.wainscot3) || (a.material[t].name.startsWith("BuildingTrim-Base4") && da.wainscot4)) && a.material[t].color.setStyle(F.filter(e => e.name === da.trimBaseColor).map(e => e.hex)), da.hasOwnProperty("trimGableColor") && (a.material[t].name.startsWith("BuildingTrim-RoofPivot") || a.material[t].name.startsWith("BuildingTrim-Gable") || "BuildingRidgeCap" === a.material[t].name) && a.material[t].color.setStyle(F.filter(e => e.name === da.trimGableColor).map(e => e.hex)), da.hasOwnProperty("trimCornerColor") && (a.material[t].name.startsWith("BuildingTrim-Corner") || "BuildingTrim1" == a.material[t].name || "BuildingTrim2" == a.material[t].name || "BuildingTrim3" == a.material[t].name || "BuildingTrim4" == a.material[t].name) && a.material[t].color.setStyle(F.filter(e => e.name === da.trimCornerColor).map(e => e.hex)), da.hasOwnProperty("trimEaveColor") && a.material[t].name.startsWith("BuildingTrim-RoofEdge") && a.material[t].color.setStyle(F.filter(e => e.name === da.trimEaveColor).map(e => e.hex)), da.hasOwnProperty("trackColor")) && a.material[t].name.startsWith("Track") && a.material[t].color.setStyle(F.filter(e => e.name === da.trackColor).map(e => e.hex)), da.hasOwnProperty("ridgeCapColor") && ("Match Trim" == da.ridgeCapColor && "BuildingRidgeCap" === a.material[t].name && a.material[t].color.setStyle(F.filter(e => e.name === da.trimColor).map(e => e.hex)), "Match Roof" == da.ridgeCapColor) && "BuildingRidgeCap" === a.material[t].name && a.material[t].color.setStyle(F.filter(e => e.name === da.roofColor).map(e => e.hex)), "Gutters" === a.material[t].name && (da.hasOwnProperty("gutterColor") ? a.material[t].color.setStyle(F.filter(e => e.name === da.gutterColor).map(e => e.hex)) : da.hasOwnProperty("downspoutColor") ? a.material[t].color.setStyle(F.filter(e => e.name === da.downspoutColor).map(e => e.hex)) : da.hasOwnProperty("trimRoofColor") ? a.material[t].color.setStyle(F.filter(e => e.name === da.trimRoofColor).map(e => e.hex)) : a.material[t].color.setStyle(F.filter(e => e.name === da.trimColor).map(e => e.hex))), da.hasOwnProperty("walkDoorColor") && a.name.startsWith("walkDoor") && "Door" === a.material[t].name && a.material[t].color.setStyle(F.filter(e => e.name === da.walkDoorColor).map(e => e.hex)), da.hasOwnProperty("largeDoorColor") && a.name.startsWith("garage") && ("Door" === a.material[t].name || "RollUpDoor" === a.material[t].name || "BuildingWalls" === a.material[t].name) && a.material[t].color.setStyle(F.filter(e => e.name === da.largeDoorColor).map(e => e.hex)), da.hasOwnProperty("commercialDoorColor") && a.name.startsWith("garageOverheadFlat") && "Door" === a.material[t].name && a.material[t].color.setStyle(F.filter(e => e.name === da.commercialDoorColor).map(e => e.hex)), da.hasOwnProperty("residentialDoorColor") && a.name.startsWith("garageOverheadPanel") && "Door" === a.material[t].name && a.material[t].color.setStyle(F.filter(e => e.name === da.residentialDoorColor).map(e => e.hex)), (a.name.startsWith("garageSlide") || a.name.startsWith("garageBiFold") || a.name.startsWith("garageHydraulic")) && "BuildingWalls" === a.material[t].name) { a.material[t].color.setStyle(F.filter(e => e.name === da.wallColor).map(e => e.hex)); let e = 20 * a.morphTargetInfluences[a.morphTargetDictionary.width] + 10; a.name.startsWith("garageSlide") && (e /= 2), a.material[t].normalMap.repeat.set(12 * e / 9, 1), a.material[t].needsUpdate = !0 } a.name.startsWith("perimeterWall") && ("Steel" === da.perimeterWalls ? a.material[t].color.setStyle(F.filter(e => e.name === da.interiorPanelColor).map(e => e.hex)) : "Half Wood" === da.perimeterWalls ? ("interiorWallUpper" === a.material[t].name && a.material[t].color.setStyle(F.filter(e => e.name === da.interiorPanelColor).map(e => e.hex)), "interiorWallLower" === a.material[t].name && a.material[t].color.setStyle("#ffffff")) : "Drywall" === da.perimeterWalls ? a.material[t].color.setStyle("#eeeeee") : a.material[t].color.setStyle("#ffffff")), (a.material[t].name.startsWith("BuildingWainscot1") || a.material[t].name.startsWith("BuildingWainscot2") || a.material[t].name.startsWith("BuildingWainscot3") || a.material[t].name.startsWith("BuildingWainscot4") || "BuildingWainscotTrim1" === a.material[t].name || "BuildingWainscotTrim2" === a.material[t].name || "BuildingWainscotTrim3" === a.material[t].name || "BuildingWainscotTrim4" === a.material[t].name || "LeantoWainscot1" === a.material[t].name || "LeantoWainscot2" === a.material[t].name || "LeantoWainscot3" === a.material[t].name || "LeantoWainscotTrim1" === a.material[t].name || "LeantoWainscotTrim2" === a.material[t].name || "LeantoWainscotTrim3" === a.material[t].name) && a.material[t].color.setStyle(F.filter(e => e.name === da.wainscotColor).map(e => e.hex)), (a.material[t].name.startsWith("BuildingWainscot1") || a.material[t].name.startsWith("BuildingWainscot2") || a.material[t].name.startsWith("BuildingWainscot3") || a.material[t].name.startsWith("BuildingWainscot4") || "LeantoWainscot1" === a.material[t].name || "LeantoWainscot2" === a.material[t].name || "LeantoWainscot3" === a.material[t].name) && (("Stone" === da.wainscotColor || "Brick" === da.wainscotColor) && (da.wainscot1 || da.wainscot2 || da.wainscot3 || da.wainscot4) || (a.morphTargetInfluences[a.morphTargetDictionary.trimWainscot1] = 0, a.morphTargetInfluences[a.morphTargetDictionary.trimWainscot2] = 0, a.morphTargetInfluences[a.morphTargetDictionary.trimWainscot3] = 0, a.morphTargetInfluences[a.morphTargetDictionary.trimWainscot4] = 0), a.geometry.dynamic = !0, a.geometry.hasOwnProperty("normalsNeedUpdate") && (a.geometry.normalsNeedUpdate = !0), a.geometry.hasOwnProperty("tangentsNeedUpdate") && (a.geometry.tangentsNeedUpdate = !0), "Stone" === da.wainscotColor ? (a.material[t].color.setHex(16777215), a.material[t].specular.setHex(0), a.material[t].shininess = .1, a.material[t].map = (new THREE.TextureLoader).load(D + "images/building/Stone.jpg"), a.material[t].normalScale.set(.01, .01), a.material[t].map.wrapS = THREE.RepeatWrapping, a.material[t].map.wrapT = THREE.RepeatWrapping, a.material[t].map.anisotropy = 1, a.material[t].map.repeat.x = a.material[t].normalMap.repeat.x / 8, a.material[t].map.offset.x = a.material[t].normalMap.offset.x / 8) : "Brick" === da.wainscotColor ? (a.material[t].color.setHex(16777215), a.material[t].specular.setHex(0), a.material[t].shininess = .1, a.material[t].map = (new THREE.TextureLoader).load(D + "images/building/Brick.jpg"), a.material[t].normalScale.set(.01, .01), a.material[t].map.wrapS = THREE.RepeatWrapping, a.material[t].map.wrapT = THREE.RepeatWrapping, a.material[t].map.anisotropy = 1, a.material[t].map.repeat.x = a.material[t].normalMap.repeat.x / 8, a.material[t].map.offset.x = a.material[t].normalMap.offset.x / 8) : (a.material[t].map = null, a.material[t].normalScale.set(1, 1), a.material[t].specular.setHex(4144959), a.material[t].shininess = 40), a.material[t].needsUpdate = !0), "BuildingSoffit" === a.material[t].name && a.material[t].color.setStyle(F.filter(e => e.name === da.soffitColor).map(e => e.hex)), "EaveLightsTrim" === a.material[t].name && (da.hasOwnProperty("trimEaveLightsColor") ? a.material[t].color.setStyle(F.filter(e => e.name === da.trimEaveLightsColor).map(e => e.hex)) : a.material[t].color.setStyle(F.filter(e => e.name === da.trimColor).map(e => e.hex))) } } }), G = !0 } function Ya(e) { var t = !1, a = ("touchstart" !== e.type && "touchmove" !== e.type && "touchend" !== e.type || (t = !0), i.x = (e.clientX - W.domElement.getBoundingClientRect().left) / W.domElement.clientWidth * 2 - 1, i.y = 2 * -((e.clientY - W.domElement.getBoundingClientRect().top) / W.domElement.clientHeight) + 1, t && (i.x = (e.touches[0].clientX - W.domElement.getBoundingClientRect().left) / W.domElement.clientWidth * 2 - 1, i.y = 2 * -((e.touches[0].clientY - W.domElement.getBoundingClientRect().top) / W.domElement.clientHeight) + 1), ja.setFromCamera(i, M), Ba = t ? (Ra = { x: e.touches[0].clientX, y: e.touches[0].clientY }, { x: e.touches[0].clientX, y: e.touches[0].clientY }) : (Ra = { x: e.clientX, y: e.clientY }, { x: e.clientX, y: e.clientY }), Ha = !0, ho(), ja.intersectObjects(La)), o = -1; for (let e = 0; e < a.length; e++) if (a[e].object.name.startsWith("selectionBox") && (a[e].object = a[e].object.parent), a[e].object.userData.hasOwnProperty("fileType") && "lwo" == a[e].object.userData.fileType) { if ((M !== E || !a[e].object.name.startsWith("buildingBoundingBox")) && !0 === a[e].object.visible) { o = e; break } } else if (!0 === a[e].object.parent.visible) { o = e; break } w && 0 < a.length && -1 < o && !a[o].object.parent.name.startsWith("scale") && (o = -1), !0 === It || 2 === It ? ($("#popup").hide(), $("#line").hide()) : 0 < a.length && -1 < o && (0 === e.button || t && 1 === e.touches.length) && ("buildingBoundingBox" != a[o].object.name && "leanTo1BoundingBox" != a[o].object.name && "leanTo2BoundingBox" != a[o].object.name && "leanTo3BoundingBox" != a[o].object.name && "leanTo4BoundingBox" != a[o].object.name || M == E) && (M == E && 1 < a.length && ("buildingBoundingBox" == a[o].object.name || "leanTo1BoundingBox" == a[o].object.name || "leanTo2BoundingBox" == a[o].object.name || "leanTo3BoundingBox" == a[o].object.name || "leanTo4BoundingBox" == a[o].object.name) && (a[0] = a[1]), e.stopPropagation(), P.enableRotate = !1, H.enablePan = !1, zt = !0, "porc" === a[o].object.name.substring(0, 4) || "scal" === a[o].object.parent.name.substring(0, 4) || a[o].object.name.startsWith("scale") && a[o].object.userData.hasOwnProperty("fileType") && "lwo" == a[o].object.userData.fileType || a[o].object.name.startsWith("mansard") || "wind" === a[o].object.name.substring(0, 4) || "walk" === a[o].object.name.substring(0, 4) || "gara" === a[o].object.name.substring(0, 4) ? (ve = T, $o(T = a[o].object), a = a[o].object.name.startsWith("scale") && "lwo" == a[o].object.userData.fileType ? ja.intersectObject(N) : a[o].object.parent.name.startsWith("scale") ? (T = a[o].object.parent, ja.intersectObject(N)) : ja.intersectObjects(Ca, !0), Mo()) : a[o].object.name.startsWith("measure") ? (null != T && ia.traverse(function(t) { if (t instanceof THREE.Mesh && !T.name.startsWith("measure")) if (t.renderOrder = 1, t.material.length) for (let e = 0; e < t.material.length; e++) t.material[e].opacity = 1, t.material[e].depthTest = !0, t.material[e].emissive.setHex(0); else t.material.opacity = 1, t.material.depthTest = !0, t.material.emissive.setHex(0) }), ve = T, T = null, T = a[o].object, a = ja.intersectObject(ce), $("#popup").hide(), $("#line").hide()) : (ve = T, T = null, T = a[o].object.userData.hasOwnProperty("fileType") && "lwo" == a[o].object.userData.fileType ? a[o].object : a[o].object.parent, a = ja.intersectObject(N), $o(T), $("#popup").is(":visible") ? ($("#line").show(), Po(), Mo()) : ($("#popup").hide(), $("#line").hide()))) } function Za(e) { Io(); let t = !1, s = null, l; if (Ha) { if ("touchstart" !== e.type && "touchmove" !== e.type && "touchend" !== e.type || (t = !0), i.x = (e.clientX - W.domElement.getBoundingClientRect().left) / W.domElement.clientWidth * 2 - 1, i.y = 2 * -((e.clientY - W.domElement.getBoundingClientRect().top) / W.domElement.clientHeight) + 1, t && (e.preventDefault(), i.x = (e.touches[0].clientX - W.domElement.getBoundingClientRect().left) / W.domElement.clientWidth * 2 - 1, i.y = 2 * -((e.touches[0].clientY - W.domElement.getBoundingClientRect().top) / W.domElement.clientHeight) + 1), ja.setFromCamera(i, M), Ba = { x: i.x, y: i.y }, "popup" !== e.target.id && "popup" !== e.target.parentNode.id && "popup" !== e.target.parentNode.parentNode.id && "popup" !== e.target.parentNode.parentNode.parentNode.id && (!1 === Sa && (v.getBoundingClientRect(), t ? (1 < Math.abs(Ra.x - (e.touches[0].pageX - v.offsetLeft)) || 1 < Math.abs(Ra.y - (e.touches[0].pageY - v.offsetTop))) && (Sa = !0) : (1 < Math.abs(Ra.x - (e.pageX - v.offsetLeft)) || 1 < Math.abs(Ra.y - (e.pageY - v.offsetTop))) && (Sa = !0)), T) && Sa) { Mo(); let a = 0, o = 0, i = 0, n = 0, r = "front"; if (!zt || 0 !== e.button && 1 !== e.touches.length || !T.name.startsWith("mansard") && "porc" !== T.name.substring(0, 4) && "wind" !== T.name.substring(0, 4) && "walk" !== T.name.substring(0, 4) && "gara" !== T.name.substring(0, 4) || 0 != jt) { if (zt && (0 === e.button || 1 === e.touches.length) && (void 0 !== (l = T.name.startsWith("measure") ? ja.intersectObject(ce) : T.name.startsWith("interior") ? ja.intersectObject(le) : ja.intersectObject(N))[0] && (s = l[0].point.sub(Na), T.position.copy(s), T.name.startsWith("measure")) && (T.userData.position = { x: s.x, y: s.y, z: s.z }, Co(T)), "scale-driveway-clone" === T.name)) { var h = -1 * s.z - da.width / 2, c = s.x - da.depth / 2, d = s.z - da.width / 2, p = -1 * s.x - da.depth / 2, m = Math.min(h, c, d, p); h === m ? (T.rotation.y = 0, r = 1) : c === m ? (T.rotation.y = Math.PI / -2, r = 2) : d === m ? (T.rotation.y = +Math.PI, r = 3) : p === m && (T.rotation.y = Math.PI / 2, r = 4), a = 0, o = 0, i = 0, n = 0, da.leanTo2 && (a = da.leanTo2Depth), da.leanTo4 && (o = da.leanTo4Depth), da.leanTo1 && (i = da.leanTo1Depth), da.leanTo3 && (n = da.leanTo3Depth); let e, t; e = 19 <= da.width && (1 === r || 3 === r) ? Math.min(Math.max(s.x, da.width / -2 + 9.5), da.width / 2 - 9.5) : Math.min(Math.max(s.x, da.width / -2), da.width / 2), t = 19 <= da.depth && (2 === r || 4 === r) ? Math.min(Math.max(s.z, da.depth / -2 + 9.5), da.depth / 2 - 9.5) : Math.min(Math.max(s.z, da.depth / -2), da.depth / 2), 1 === r && (t += i), 2 === r && (e -= a), 3 === r && (t -= n), 4 === r && (e += o), T.position.set(e, 0, t) } } else { h = 0, c = 0, d = 0, p = 0; if (l = ja.intersectObjects(Ca, !0), "porc" === T.name.substring(0, 4) && (l = l.concat(ja.intersectObject(N))), 0 < (l = "porchWrap" === T.name.substring(0, 9) ? [] : l).length && Sa) { "porc" !== T.name.substring(0, 4) ? 0 === l[0].faceIndex || 1 === l[0].faceIndex ? T.rotation.y = Math.PI / 2 + l[0].object.rotation.y : 2 === l[0].faceIndex || 3 === l[0].faceIndex ? T.rotation.y = Math.PI / -2 + l[0].object.rotation.y : 8 === l[0].faceIndex || 9 === l[0].faceIndex ? T.rotation.y = 0 + l[0].object.rotation.y : 10 === l[0].faceIndex || 11 === l[0].faceIndex ? T.rotation.y = +Math.PI + l[0].object.rotation.y : r = !1 : r = !1, !1 !== r && (0 === T.rotation.y && (r = "front"), T.rotation.y === Math.PI / 2 && (r = "right"), T.rotation.y === Math.PI / -2 && (r = "left"), T.rotation.y === +Math.PI) && (r = "back"); var m = T.morphTargetInfluences[T.morphTargetDictionary.width], g = T.morphTargetInfluences[T.morphTargetDictionary.height]; let e = 0; null !== T.morphTargetDictionary.depth && (e = T.morphTargetInfluences[T.morphTargetDictionary.depth]), "window3x4-clone" === T.name || "window3x4Grid-clone" === T.name ? ("front" !== r && "back" !== r || (h = 2, c = 4.7, d = 2.5), "left" !== r && "right" !== r || (p = 2, c = 4.7, d = 2.5)) : "window3x4Shutters-clone" === T.name ? ("front" !== r && "back" !== r || (h = 3, c = 4.7, d = 2.5), "left" !== r && "right" !== r || (p = 3, c = 4.7, d = 2.5)) : "window4x3-clone" === T.name || "window4x3Grid-clone" === T.name ? ("front" !== r && "back" !== r || (h = 2.5, c = 5.2, d = 2), "left" !== r && "right" !== r || (p = 2.5, c = 5.2, d = 2)) : "window4x3Shutters-clone" === T.name ? ("front" !== r && "back" !== r || (h = 4, c = 5.2, d = 2), "left" !== r && "right" !== r || (p = 4, c = 5.2, d = 2)) : "windowPicture-clone" === T.name || "windowCasement-clone" === T.name || "windowSlider-clone" === T.name || "windowDoubleHung-clone" === T.name || "windowSingleHung-clone" === T.name || "windowTwinset-clone" === T.name || "windowAwning-clone" === T.name || "windowHopper-clone" === T.name || "windowSlopeLeft-clone" === T.name || "windowSlopeRight-clone" === T.name ? ("front" !== r && "back" !== r || (h = 1 + m / 2, c = 1 + g / 2 + 2, d = 1 + g / 2), "left" !== r && "right" !== r || (p = 1 + m / 2, c = 1 + g / 2 + 2, d = 1 + g / 2)) : "windowLouver-clone" === T.name ? ("front" !== r && "back" !== r || (h = 1 + m / 2, c = .5 + g / 2, d = 1 + g / 2), "left" !== r && "right" !== r || (p = 1 + m / 2, c = .5 + g / 2, d = 1 + g / 2)) : "windowFramedOpening-clone" === T.name ? ("front" !== r && "back" !== r || (h = 1 + m / 2, c = 1 + g / 2 + 2, d = 1 + g / 2), "left" !== r && "right" !== r || (p = 1 + m / 2, c = 1 + g / 2 + 2, d = 1 + g / 2)) : "walkDoorSolid-clone" === T.name ? ("front" !== r && "back" !== r || (h = 2 + m / 2, c = 0), "left" !== r && "right" !== r || (p = 2.5, c = 0)) : "walkDoorSolidDouble-clone" === T.name ? ("front" !== r && "back" !== r || (h = 3.5 + m / 2, c = 0), "left" !== r && "right" !== r || (p = 2.5, c = 0)) : "walkDoorHalfGlass-clone" === T.name ? ("front" !== r && "back" !== r || (h = 2 + m / 2, c = 0), "left" !== r && "right" !== r || (p = 2.5, c = 0)) : "walkDoorHalfGlassDouble-clone" === T.name ? ("front" !== r && "back" !== r || (h = 3.5 + m / 2, c = 0), "left" !== r && "right" !== r || (p = 2.5, c = 0)) : "walkDoor6Panel-clone" === T.name ? ("front" !== r && "back" !== r || (h = 2.5, c = 0), "left" !== r && "right" !== r || (p = 2.5, c = 0)) : "walkDoor6PanelDouble-clone" === T.name ? ("front" !== r && "back" !== r || (h = 3.5 + m / 2, c = 0), "left" !== r && "right" !== r || (p = 2.5, c = 0)) : "walkDoor6Lite-clone" === T.name || "walkDoor9Lite-clone" === T.name ? ("front" !== r && "back" !== r || (h = 2.5, c = 0), "left" !== r && "right" !== r || (p = 2.5, c = 0)) : "walkDoor9LiteDouble-clone" === T.name || "walkDoorSlidingGlassDouble-clone" === T.name || "walkDoorFrenchDouble-clone" === T.name ? ("front" !== r && "back" !== r || (h = 3.5 + m / 2, c = 0), "left" !== r && "right" !== r || (p = 2.5, c = 0)) : "walkDoorAllGlass-clone" === T.name ? ("front" !== r && "back" !== r || (h = 2.5, c = 0), "left" !== r && "right" !== r || (p = 2.5, c = 0)) : "walkDoorAllGlassDouble-clone" === T.name ? ("front" !== r && "back" !== r || (h = 3.5 + m / 2, c = 0), "left" !== r && "right" !== r || (p = 2.5, c = 0)) : "walkDoorCrossbuck-clone" === T.name ? ("front" !== r && "back" !== r || (h = 2.5, c = 0), "left" !== r && "right" !== r || (p = 2.5, c = 0)) : "walkDoorEquine-clone" === T.name ? ("front" !== r && "back" !== r || (h = 3, c = 0), "left" !== r && "right" !== r || (p = 3, c = 0)) : "walkDoorFramedOpening-clone" === T.name ? ("front" !== r && "back" !== r || (h = 2 + m / 2, c = 0), "left" !== r && "right" !== r || (p = 2.5, c = 0)) : "garageOverheadPanel-clone" === T.name || "garageOverheadPanelWindow-clone" === T.name || "garageOverheadFlat-clone" === T.name || "garageOverheadFlatWindow-clone" === T.name || "garageOverheadFlatModern-clone" === T.name || "garageOverheadRibbed-clone" === T.name ? ("front" !== r && "back" !== r || (h = 6 + 10 * m, c = 0), "left" !== r && "right" !== r || (p = 6 + 10 * m, c = 0)) : "garageSlide-clone" === T.name || "garageSlideLeft-clone" === T.name || "garageSlideRight-clone" === T.name || "garageSlideCrossbuck-clone" === T.name ? ("front" !== r && "back" !== r || (h = 10.25 + 10 * m * 2, c = 0), "left" !== r && "right" !== r || (p = 10.25 + 10 * m * 2, c = 0)) : "garageBiFold-clone" === T.name || "garageHydraulic-clone" === T.name || "garageRollUp-clone" === T.name || "garageFramedOpening-clone" === T.name ? ("front" !== r && "back" !== r || (h = 6 + 10 * m, c = 0), "left" !== r && "right" !== r || (p = 6 + 10 * m, c = 0)) : "mansard-clone" === T.name ? ("front" !== r && "back" !== r || (h = 1 + m / 2, c = 4.7, d = 2.5 + e), "left" !== r && "right" !== r || (p = 1 + m / 2, c = 4.7, d = 2.5 + e)) : "mansardHip-clone" === T.name && ("front" !== r && "back" !== r || (h = 2.5 + m / 2, c = 4.7, d = 2 + e), "left" !== r && "right" !== r || (p = 2.5 + m / 2, c = 4.7, d = 2 + e)), "porc" === T.name.substring(0, 4) ? (null === (s = l[0].point.sub(Na)) && (l = ja.intersectObject(N), s = l[0].point.sub(Na)), a = 0, o = 0, i = 0, n = 0, da.leanTo2 && (a = da.leanTo2Depth), da.leanTo4 && (o = da.leanTo4Depth), da.leanTo1 && (i = da.leanTo1Depth), da.leanTo3 && (n = da.leanTo3Depth), da.hasOwnProperty("coveredGableExtensionE") && da.coveredGableExtensionE && da.coveredGableExtensionEEnclosed && (a = Math.max(a, da.coveredGableExtensionEDepth)), da.hasOwnProperty("coveredGableExtensionW") && da.coveredGableExtensionW && da.coveredGableExtensionWEnclosed && (o = Math.max(o, da.coveredGableExtensionWDepth)), da.hasOwnProperty("coveredGableExtensionN") && da.coveredGableExtensionN && da.coveredGableExtensionNEnclosed && (i = Math.max(i, da.coveredGableExtensionNDepth)), da.hasOwnProperty("coveredGableExtensionS") && da.coveredGableExtensionS && da.coveredGableExtensionSEnclosed && (n = Math.max(n, da.coveredGableExtensionSDepth)), "porchN-clone" === T.name && (s.z = da.depth / 2 + i, h = 6), "porchS-clone" === T.name && (s.z = da.depth / -2 - n), "porchE-clone" === T.name && (s.x = da.width / -2 - a), "porchW-clone" === T.name && (s.x = da.width / 2 + o), s.y = 0) : r ? (null === (s = l[0].point.sub(Na)) && "porc" === T.name.substring(0, 4) && (l = ja.intersectObject(N), s = l[0].point.sub(Na)), a = 0, o = 0, i = 0, n = 0, da.leanTo2 && (a = da.leanTo2Depth), da.leanTo4 && (o = da.leanTo4Depth), da.leanTo1 && (i = da.leanTo1Depth), da.leanTo3 && (n = da.leanTo3Depth), da.hasOwnProperty("coveredGableExtensionE") && da.coveredGableExtensionE && da.coveredGableExtensionEEnclosed && (a = Math.max(a, da.coveredGableExtensionEDepth)), da.hasOwnProperty("coveredGableExtensionW") && da.coveredGableExtensionW && da.coveredGableExtensionWEnclosed && (o = Math.max(o, da.coveredGableExtensionWDepth)), da.hasOwnProperty("coveredGableExtensionN") && da.coveredGableExtensionN && da.coveredGableExtensionNEnclosed && (i = Math.max(i, da.coveredGableExtensionNDepth)), da.hasOwnProperty("coveredGableExtensionS") && da.coveredGableExtensionS && da.coveredGableExtensionSEnclosed && (n = Math.max(n, da.coveredGableExtensionSDepth)), s.x = Math.min(Math.max(s.x, da.width / -2 - a + h), da.width / 2 + o - h), s.y = 0 === c ? 0 : Math.min(Math.max(s.y, c), da.roofHeightAtX(s.x) - d), s.z = Math.min(Math.max(s.z, da.depth / -2 - n + p), da.depth / 2 + i - p)) : s.z = Math.min(Math.max(s.z, da.depth / -2 + p), da.depth / 2 - p), null != s && T.position.copy(s) } } } } else if (T && (!0 === It || 2 === It) && T.name.startsWith("measure")) t = !1, "touchstart" !== e.type && "touchmove" !== e.type && "touchend" !== e.type || (t = !0), i.x = (e.clientX - W.domElement.getBoundingClientRect().left) / W.domElement.clientWidth * 2 - 1, i.y = 2 * -((e.clientY - W.domElement.getBoundingClientRect().top) / W.domElement.clientHeight) + 1, t && (e.preventDefault(), i.x = (e.touches[0].clientX - W.domElement.getBoundingClientRect().left) / W.domElement.clientWidth * 2 - 1, i.y = 2 * -((e.touches[0].clientY - W.domElement.getBoundingClientRect().top) / W.domElement.clientHeight) + 1), ja.setFromCamera(i, M), Ba = { x: i.x, y: i.y }, void 0 !== (l = ja.intersectObject(ce))[0] && (s = l[0].point.sub(Na), T.position.copy(s), T.userData.position = { x: s.x, y: s.y, z: s.z }), 2 === It && (Co(T), G = !0); else { t = !1, "touchstart" !== e.type && "touchmove" !== e.type && "touchend" !== e.type || (t = !0), i.x = (e.clientX - W.domElement.getBoundingClientRect().left) / W.domElement.clientWidth * 2 - 1, i.y = 2 * -((e.clientY - W.domElement.getBoundingClientRect().top) / W.domElement.clientHeight) + 1, t && (e.preventDefault(), i.x = (e.touches[0].clientX - W.domElement.getBoundingClientRect().left) / W.domElement.clientWidth * 2 - 1, i.y = 2 * -((e.touches[0].clientY - W.domElement.getBoundingClientRect().top) / W.domElement.clientHeight) + 1), ja.setFromCamera(i, M), l = ja.intersectObjects(La, !0); for (let e = 0; e < l.length; e++) if (l[e].object.name.startsWith("itemSelectionBox")) { if (w && !l[e].object.parent.name.startsWith("scale")) break; l[e].object = l[e].object.parent, ko(l[e].object); break } } } function Ja(e) { var t = !1; "touchstart" !== e.type && "touchmove" !== e.type && "touchend" !== e.type || (t = !0), i.x = (e.clientX - W.domElement.getBoundingClientRect().left) / W.domElement.clientWidth * 2 - 1, i.y = 2 * -((e.clientY - W.domElement.getBoundingClientRect().top) / W.domElement.clientHeight) + 1, t && (i = { x: Ba.x, y: Ba.y }), T && !1 === Sa ? T.name.startsWith("interior") || T.name.startsWith("mansard") || T.name.startsWith("porch") || T.name.startsWith("scale") || T.name.startsWith("window") || T.name.startsWith("walk") || T.name.startsWith("garage") ? $("#popup").is(":hidden") ? ($("#popup").css("display", "flex"), t = Math.min(e.clientX + 50, $("#viewport3D").innerWidth() - $("#popup").outerWidth()), e = Math.max(e.clientY - 275, 0), $("#popup").css({ top: e, left: t }), $("#line").show(), Po(), Mo()) : ve && T.uuid === ve.uuid && !T.name.startsWith("measure") && ($("#popup").hide(), $("#line").hide(), ve = T, T = null, Io()) : T && T.name.startsWith("measure") && !0 === It ? (Lo(T), G = !0) : T && T.name.startsWith("measure") && 2 === It && (It = !1, ve = T, T = null, G = !0) : T && Sa && $("#popup").is(":hidden") && !T.name.startsWith("measure") && ($o(!1), ve = T, T = null, G = !0), qt = _t = $t = Gt = kt = Ft = 0, Sa = Ha = zt = !1, $("#touchGUI").hide(), P.enableRotate = !0, P.enablePan = !w, P.enableZoom = !0, H.enablePan = !w, H.enableZoom = !0 } function Ka(e, t, a) { e = e || "", t = t || 0, a = a || !1; var o = new THREE.Vector3, o = ia.getObjectByName("UserCamera").getWorldDirection(o), o = Math.atan2(o.x, o.z), i = ia.getObjectByName("UserCamera").position; let n = 1, r = 0, s = 0, l = 0, h = (i.x < da.width / 2 && i.x > da.width / -2 && i.y < da.height / 2 && 0 < i.y && i.z < da.depth / 2 && i.z > da.depth / -2 && (n = -1), 0), c = 0, d = 0, p = 0; da.leanTo1 && da.leanTo1Enclosed && "Fully Enclosed" == da.leanTo1Walls && (d = da.leanTo1Depth), da.leanTo2 && da.leanTo2Enclosed && "Fully Enclosed" == da.leanTo2Walls && (h = da.leanTo2Depth), da.leanTo3 && da.leanTo3Enclosed && "Fully Enclosed" == da.leanTo3Walls && (p = da.leanTo3Depth), da.leanTo4 && da.leanTo4Enclosed && "Fully Enclosed" == da.leanTo4Walls && (c = da.leanTo4Depth), da.hasOwnProperty("coveredGableExtensionE") && da.coveredGableExtensionE && da.coveredGableExtensionEEnclosed && (h = Math.max(h, da.coveredGableExtensionEDepth)), da.hasOwnProperty("coveredGableExtensionW") && da.coveredGableExtensionW && da.coveredGableExtensionWEnclosed && (c = Math.max(c, da.coveredGableExtensionWDepth)), da.hasOwnProperty("coveredGableExtensionN") && da.coveredGableExtensionN && da.coveredGableExtensionNEnclosed && (d = Math.max(d, da.coveredGableExtensionNDepth)), da.hasOwnProperty("coveredGableExtensionS") && da.coveredGableExtensionS && da.coveredGableExtensionSEnclosed && (p = Math.max(p, da.coveredGableExtensionSDepth)), l = Math.abs(o * n) < Math.PI / 4 || Math.abs(o * n) > 3 * Math.PI / 4 ? Math.abs(o) > Math.PI / 2 ? (s = (da.depth / 2 + d) * n + n * n, .5 * Math.PI * Math.abs(n - 1)) : (s = (da.depth / -2 - p) * n - n * n, .5 * Math.PI * (n + 1)) : 0 < i.x ? (r = (da.width / 2 + c) * n + n * n, Math.PI / 2 * n) : (r = (da.width / -2 - h) * n - n * n, Math.PI / -2 * n); var m = ia.getObjectByName(e).GdeepCloneMaterials(); if (m.name = e + "-clone", m.visible = !0, m.castShadow = !0, m.receiveShadow = !1, m.userData.scale = { x: 1, y: 1, z: 1 }, m.name.startsWith("walkDoor") && (m.userData.doorSwing = 1, m.userData.scale = { x: 3, y: 7, z: 0 }), m.name.startsWith("walkDoor") && m.name.endsWith("Double-clone") && (m.userData.doorSwing = 1, m.userData.scale = { x: 6, y: 7, z: 0 }), m.name.startsWith("garage") && (m.userData.scale = { x: 10, y: Math.min(da.height - 2, 10), z: 0 }), m.name.startsWith("mansardHip") && (m.userData.scale = { x: 6, y: 2, z: 2 }), m.userData.position = { x: r, y: t, z: s }, m.userData.rotation = { x: 0, y: l, z: 0 }, Fo(m), a) { if ("object" == typeof a) { o = a.position.split(","); if (m.position.set(parseFloat(o[0]), parseFloat(o[1]), parseFloat(o[2])), m.userData.position = { x: parseFloat(o[0]), y: parseFloat(o[1]), z: parseFloat(o[2]) }, o = a.rotation.split(","), m.rotation.set(parseFloat(o[0]), parseFloat(o[1]), parseFloat(o[2])), m.userData.rotation = { x: parseFloat(o[0]), y: parseFloat(o[1]), z: parseFloat(o[2]) }, m.name.startsWith("walk") && (o = a.scale.split(","), m.name.endsWith("Double-clone") ? m.morphTargetInfluences[m.morphTargetDictionary.width] = parseFloat(o[0]) - 6 : m.morphTargetInfluences[m.morphTargetDictionary.width] = parseFloat(o[0]) - 3, m.morphTargetInfluences[m.morphTargetDictionary.height] = parseFloat(o[1]) - 7, m.userData.scale = { x: parseFloat(o[0]), y: parseFloat(o[1]), z: parseFloat(o[2]) }), m.name.startsWith("window") && (o = a.scale.split(","), m.morphTargetInfluences[m.morphTargetDictionary.width] = parseFloat(o[0]) - 1, m.morphTargetInfluences[m.morphTargetDictionary.height] = parseFloat(o[1]) - 1, m.userData.scale = { x: parseFloat(o[0]), y: parseFloat(o[1]), z: parseFloat(o[2]) }, m.name.startsWith("windowSlope")) && (m.morphTargetInfluences[m.morphTargetDictionary.slope] = da.roofPitch / 12 * parseFloat(o[0])), m.name.startsWith("gara") && (o = a.scale.split(","), m.morphTargetInfluences[m.morphTargetDictionary.width] = (parseFloat(o[0]) - 10) / 10 / 2, m.morphTargetInfluences[m.morphTargetDictionary.height] = (parseFloat(o[1]) - 10) / 10, m.userData.scale = { x: parseFloat(o[0]), y: parseFloat(o[1]), z: parseFloat(o[2]) }), m.name.startsWith("mansard") && (o = a.scale.split(","), m.name.startsWith("mansardHip") ? m.morphTargetInfluences[m.morphTargetDictionary.width] = parseFloat(o[0]) - 5 : m.morphTargetInfluences[m.morphTargetDictionary.width] = parseFloat(o[0]) - 1, m.userData.scale = { x: parseFloat(o[0]), y: parseFloat(o[1]), z: parseFloat(o[2]) }), "-1" === a.doorSwing && (m.scale.x = -1, T.userData.doorSwing = -1), a.shutters) m.morphTargetInfluences[m.morphTargetDictionary.hideShutters] = 0; else { m.morphTargetInfluences[m.morphTargetDictionary.hideShutters] = 1; for (let e = 0; e < m.material.length; e++) "Shutters" === m.material[e].name && (m.material[e].visible = !1) } if (a.grid) for (let e = 0; e < m.material.length; e++) "WindowGrid" === m.material[e].name && (m.material[e].visible = !0); else for (let e = 0; e < m.material.length; e++) "WindowGrid" === m.material[e].name && (m.material[e].visible = !1); ve = T, T = null, Io() } } else { if (m.position.set(r, t, s), m.rotation.set(0, l, 0), m.name.startsWith("mansard") && (m.userData.scale = { x: 6, y: 2, z: 2 }, m.name.startsWith("mansardHip") ? m.morphTargetInfluences[m.morphTargetDictionary.width] = 1 : m.morphTargetInfluences[m.morphTargetDictionary.width] = 5), m.name.startsWith("window")) { let e = 3, t = 3; m.name.startsWith("windowSlider") && (e = 3, t = 3), m.name.startsWith("windowDoubleHung") && (e = 3, t = 3), m.name.startsWith("windowTwinset") && (e = 3, t = 4), m.name.startsWith("windowPicture") && (e = 3, t = 4), m.name.startsWith("windowSingleHung") && (e = 3, t = 4), m.name.startsWith("windowLouver") && (e = 4, t = 2), m.userData.scale = { x: e, y: t, z: 0 }, m.morphTargetInfluences[m.morphTargetDictionary.width] = e - 1, m.morphTargetInfluences[m.morphTargetDictionary.height] = t - 1, m.name.startsWith("windowSlope") && (m.morphTargetInfluences[m.morphTargetDictionary.slope] = da.roofPitch / 12 * e) } if (m.name.startsWith("window")) for (let e = 0; e < m.material.length; e++) "Shutters" === m.material[e].name && (m.material[e].visible = !1, m.morphTargetInfluences[m.morphTargetDictionary.hideShutters] = 1), "WindowGrid" === m.material[e].name && (m.material[e].visible = !1); if (m.name.startsWith("walkDoor")) { let e = 3, t = 80 / 12; m.name.startsWith("walkDoorEquine") && (e = 4, t = 82 / 12), m.name.endsWith("Double") && (e = 6, t = 80 / 12), m.userData.scale = { x: e, y: t, z: 0 }, m.name.endsWith("Double") ? m.morphTargetInfluences[m.morphTargetDictionary.width] = e - 6 : m.morphTargetInfluences[m.morphTargetDictionary.width] = e - 3, m.morphTargetInfluences[m.morphTargetDictionary.height] = t - 7 } m.name.startsWith("gara") && (m.morphTargetInfluences[m.morphTargetDictionary.width] = (m.userData.scale.x - 10) / 10 / 2, m.morphTargetInfluences[m.morphTargetDictionary.height] = (m.userData.scale.y - 10) / 10), da.hasOwnProperty(e + "Qty") && da[e + "Qty"]++, $o(m) } na.add(m), O(), G = !0 } function eo() { this.addPerson = function() { s("person") }, this.addTruck = function() { s("truck") }, this.addCar = function() { s("car") }, this.addAirplane = function() { s("airplane") }, this.addATV = function() { s("atv") }, this.addJetski = function() { s("jetski") }, this.addCombine = function() { s("combine") }, this.addTractor = function() { s("tractor") }, this.addBoat = function() { s("boat") }, this.addSkiBoat = function() { s("skiBoat") }, this.addDriveway = function() { s("driveway") }, this.addGrainCart = function() { s("grainCart") }, this.addSemiTruck = function() { s("semiTruck") }, this.addSemiTrailer = function() { s("semiTrailer") }, this.addSemiTrailer53 = function() { s("semiTrailer53") }, this.addBackhoe = function() { s("backhoe") }, this.addCornHead6 = function() { s("cornHead6") }, this.addCornHead = function() { s("cornHead") }, this.addCornHead12 = function() { s("cornHead12") }, this.addBeanHead = function() { s("beanHead") }, this.addBeanHead35 = function() { s("beanHead35") }, this.addBeanHead40 = function() { s("beanHead40") }, this.addDesk = function() { s("desk") }, this.addChair = function() { s("chair") }, this.addConferenceTable = function() { s("conferenceTable") }, this.addLawnMower = function() { s("lawnMower") }, this.addRV = function() { s("rv") }, this.addCamper = function() { s("camper") }, this.addHorseStall = function() { s("horseStall") }, this.addHayBales = function() { s("hayBales") }, this.addWorkbench = function() { s("workbench") }, this.addAirCompressor = function() { s("airCompressor") }, this.addBed = function() { s("bed") }, this.addCouch = function() { s("couch") }, this.addRidingMower = function() { s("ridingMower") }, this.addKitchenTable = function() { s("kitchenTable") }, this.addRecliner = function() { s("recliner") }, this.addToilet = function() { s("toilet") }, this.addUtilitySink = function() { s("utilitySink") }, this.addPedestalSink = function() { s("pedestalSink") }, this.addHorse = function() { s("horse") }, this.addUTV = function() { s("utv") }, this.addCultivator = function() { s("cultivator") }, this.addKitchenChair = function() { s("kitchenChair") }, this.addNightStand = function() { s("nightStand") }, this.addCoffeeTable = function() { s("coffeeTable") }, this.addEndTable = function() { s("endTable") } } function s(t, a) { var e, o; t = t || !1, a = a || !1, void 0 === ia.getObjectByName(t) ? (e = D + "objects/scale-" + t, (o = new THREE.LWOLoader).setResourcePath(D + "images/"), o.load(e + ".lwo", function(e) { e.meshes.forEach(function(e) { e.name = t, e.visible = !1, e.castShadow = !0, e.receiveShadow = !0, e.frustumCulled = !1, e.userData.fileType = "lwo", e.hasOwnProperty("morphTargetInfluences") && (e.material.morphTargets = !0), 0 < e.material.length ? e.material.forEach(function(e) { "MeshStandardMaterial" == e.type && null !== e.roughnessMap && (e.roughness = 1) }) : "MeshStandardMaterial" == e.material.type && null !== e.material.roughnessMap && (e.material.roughness = 1), ra.add(e), to(t, a) }) })) : to(t, a) } function to(e, t) { e = e || "", t = t || !1; var a = 0, o = 0, i = 0, n = 0, n = (da.leanTo1 && (i = da.leanTo1Depth), da.leanTo2 && (a = da.leanTo2Depth), da.leanTo3 && (n = da.leanTo3Depth), da.leanTo4 && (o = da.leanTo4Depth), da.hasOwnProperty("coveredGableExtensionE") && da.coveredGableExtensionE && da.coveredGableExtensionEEnclosed && (a = Math.max(a, da.coveredGableExtensionEDepth)), da.hasOwnProperty("coveredGableExtensionW") && da.coveredGableExtensionW && da.coveredGableExtensionWEnclosed && (o = Math.max(o, da.coveredGableExtensionWDepth)), da.hasOwnProperty("coveredGableExtensionN") && da.coveredGableExtensionN && da.coveredGableExtensionNEnclosed && (i = Math.max(i, da.coveredGableExtensionNDepth)), da.hasOwnProperty("coveredGableExtensionS") && da.coveredGableExtensionS && da.coveredGableExtensionSEnclosed && (n = Math.max(n, da.coveredGableExtensionSDepth)), []), o = ("person" == e && (n = [da.width / 2 + o + .75, 0, da.depth / 2 + i + 3.5]), "truck" == e && (n = [da.width / 2 + o + 7.75, 0, da.depth / 2 + i - 3.25]), "car" == e && (n = [da.width / 2 + o + 16, 0, da.depth / 2 + i - 3.25]), "airplane" == e && (n = [da.width / -2 - a - 12, 0, da.depth / 2 + i + 8.5]), "atv" == e && (n = [da.width / 2 - 4.5, 0, da.depth / 2 + i + 5.5]), "utv" == e && (n = [da.width / 2 - 4.5, 0, da.depth / 2 + i + 5.5]), "jetski" == e && (n = [da.width / 2 - 3.25, 0, da.depth / 2 + i + 16.75]), "combine" == e && (n = [da.width / -2 + 8.4, 0, da.depth / 2 + i + 23.5]), "tractor" == e && (n = [da.width / 2 - 10, 0, da.depth / 2 + i + 11.5]), "boat" == e && (n = [da.width / 2 + 3, 0, da.depth / 2 + i + 14]), "skiBoat" == e && (n = [da.width / 2 + 3, 0, da.depth / 2 + i + 14]), "driveway" == e && (n = [0, 0, +(da.depth / 2 + i)]), "grainCart" == e && (n = [da.width / 2 - 3.25, 0, da.depth / 2 + i + 16.75]), "semiTruck" == e && (n = [da.width / 2 - 3.25, 0, da.depth / 2 + i + 16.75]), "semiTrailer" == e && (n = [da.width / 2 + 6.25, 0, da.depth / 2 + i + 22.75]), "semiTrailer53" == e && (n = [da.width / 2 + 6.25, 0, da.depth / 2 + i + 26.75]), "backhoe" == e && (n = [da.width / 2 - 3.25, 0, da.depth / 2 + i + 16.75]), "cornHead6" == e && (n = [da.width / 2 - 3.25, 0, da.depth / 2 + i + 16.75]), "cornHead" == e && (n = [da.width / 2 - 3.25, 0, da.depth / 2 + i + 16.75]), "cornHead12" == e && (n = [da.width / 2 - 3.25, 0, da.depth / 2 + i + 16.75]), "beanHead" == e && (n = [da.width / 2 - 3.25, 0, da.depth / 2 + i + 16.75]), "beanHead35" == e && (n = [da.width / 2 - 3.25, 0, da.depth / 2 + i + 16.75]), "beanHead40" == e && (n = [da.width / 2 - 3.25, 0, da.depth / 2 + i + 16.75]), "cultivator" == e && (n = [da.width / 2 - 3.25, 0, da.depth / 2 + i + 16.75]), "desk" == e && (n = [0, 0, 0]), "chair" == e && (n = [0, 0, 0]), "conferenceTable" == e && (n = [0, 0, 0]), "lawnMower" == e && (n = [da.width / 2 - 3.25, 0, da.depth / 2 + i + 16.75]), "rv" == e && (n = [da.width / 2 - 3.25, 0, da.depth / 2 + i + 16.75]), "camper" == e && (n = [da.width / 2 - 3.25, 0, da.depth / 2 + i + 16.75]), "horseStall" == e && (n = [0, 0, 0]), "hayBales" == e && (n = [0, 0, 0]), "workbench" == e && (n = [0, 0, 0]), "airCompressor" == e && (n = [0, 0, 0]), "bed" == e && (n = [0, 0, 0]), "couch" == e && (n = [0, 0, 0]), "kitchenTable" == e && (n = [0, 0, 0]), "recliner" == e && (n = [0, 0, 0]), "toilet" == e && (n = [0, 0, 0]), "utilitySink" == e && (n = [0, 0, 0]), "pedestalSink" == e && (n = [0, 0, 0]), "ridingMower" == e && (n = [da.width / 2 - 10, 0, da.depth / 2 + i + 11.5]), "horse" == e && (n = [da.width / 2 - 10, 0, da.depth / 2 + i + 11.5]), "kitchenChair" == e && (n = [0, 0, 0]), "nightStand" == e && (n = [0, 0, 0]), "coffeeTable" == e && (n = [0, 0, 0]), "endTable" == e && (n = [0, 0, 0]), ia.getObjectByName(e).GdeepCloneMaterials()); o.name = "scale-" + e + "-clone", o.visible = !0, o.castShadow = !0, o.receiveShadow = !0, o.userData.fileType = ia.getObjectByName(e).userData.fileType, o.userData.rotationMultiplyer = 0, Fo(o), t ? "object" == typeof t && (a = t.position.split(","), o.position.set(parseFloat(a[0]), parseFloat(a[1]), parseFloat(a[2])), a = t.rotation.split(","), o.rotation.set(parseFloat(a[0]), parseFloat(a[1]), parseFloat(a[2])), o.userData.rotationMultiplyer = parseFloat(a[1])) : o.position.set(n[0], n[1], n[2]), na.add(o), da.hasOwnProperty(e) && da[e]++, G = !0 } function ao() { this.addInteriorWall = function() { oo("interiorWall") }, this.addInteriorDoor = function() { oo("interiorDoor") } } function oo(e, t) { e = e || !1, t = t || !1; var a = ia.getObjectByName(e); let o; if ((o = "interiorWall" == e ? a.deepClone() : a.clone()).name += "-clone", o.visible = !0, o.userData.rotationMultiplyer = 0, o.userData.position = new THREE.Vector3, o.userData.scale = new THREE.Vector3(1, 1, 1), o.userData.toNorthWall = function(e) { if (void 0 === e) return o.position.z + da.coreBuildingDimensions().northEdge; o.userData.position.z = o.position.z = da.coreBuildingDimensions().northEdge - e }, "interiorDoor" == e && (o.userData.doorSwing = 1), he.add(o), "interiorWall" === e) { var a = D + "images/building/building-normal.jpg", i = (new THREE.TextureLoader).load(a), a = (i.anisotropy = Math.min(W.capabilities.getMaxAnisotropy(), 5), i.wrapS = THREE.RepeatWrapping, i.wrapT = THREE.RepeatWrapping, D + "images/building/OSB.jpg"), n = (new THREE.TextureLoader).load(a); n.anisotropy = Math.min(W.capabilities.getMaxAnisotropy(), 5), n.wrapS = THREE.RepeatWrapping, n.wrapT = THREE.RepeatWrapping; for (let e = 0; e < o.material.length; e++) o.material[e] = o.material[e].clone(), "interiorWallUpper" === o.material[e].name && (o.material[e].normalMap = i, o.userData.metalTexture = i, o.userData.topMaterial = o.material[e]), "interiorWallLower" === o.material[e].name && (o.userData.woodTexture = n, o.userData.bottomMaterial = o.material[e]); o.scale.x = 5, o.userData.scale.x = 5, o.userData.material = "Steel" } Fo(o), t ? (a = t.position.split(","), o.position.set(parseFloat(a[0]), parseFloat(a[1]), parseFloat(a[2])), a = t.rotation.split(","), o.rotation.set(parseFloat(a[0]), parseFloat(a[1]), parseFloat(a[2])), o.userData.rotationMultiplyer = parseFloat(a[1]), a = t.scale.split(","), o.scale.set(parseFloat(a[0]), parseFloat(a[1]), parseFloat(a[2])), o.userData.width = parseFloat(a[0]), o.userData.height = parseFloat(a[1]), t.hasOwnProperty("doorSwing") && (-1 == t.doorSwing ? (o.userData.doorSwing = -1, o.scale.x = -1) : o.userData.doorSwing = 1), t.hasOwnProperty("material") && (o.userData.material = t.material)) : da.hasOwnProperty(e + "Qty") && da[e + "Qty"]++, io(), t || ($("#popup").show(), $("#line").show(), Po(), Mo()) } function io() { ia.traverse(function(e) { var t, a; e instanceof THREE.Mesh && ("interiorWall-clone" == e.name || "dividingWall" == e.name) && (t = e.scale.y = da.height - 1, a = e.scale.x, e.userData.height = t, e.userData.width = a, "interiorWall-clone" == e.name) && ("Half Wood" == e.userData.material ? (e.userData.topMaterial.map = null, e.userData.topMaterial.normalMap = e.userData.metalTexture, e.userData.topMaterial.specular.setHex(6250335), e.userData.topMaterial.shininess = 90, e.userData.topMaterial.reflectivity = .05, e.userData.topMaterial.normalMap.repeat.set(12 * a / 9, 1), e.userData.bottomMaterial.map = e.userData.woodTexture, e.userData.bottomMaterial.normalMap = null, e.userData.bottomMaterial.specular.setHex(2500134), e.userData.bottomMaterial.shininess = 5.117649, e.userData.bottomMaterial.reflectivity = 0, e.userData.bottomMaterial.map.repeat.set(a / 2.5, t / 2.5)) : "Wood" == e.userData.material ? (e.userData.topMaterial.map = e.userData.woodTexture, e.userData.topMaterial.normalMap = null, e.userData.topMaterial.specular.setHex(2500134), e.userData.topMaterial.shininess = 5.117649, e.userData.topMaterial.reflectivity = 0, e.userData.topMaterial.map.repeat.set(a / 2.5, t / 2.5), e.userData.bottomMaterial.map = e.userData.woodTexture, e.userData.bottomMaterial.normalMap = null, e.userData.bottomMaterial.specular.setHex(2500134), e.userData.bottomMaterial.shininess = 5.117649, e.userData.bottomMaterial.reflectivity = 0, e.userData.bottomMaterial.map.repeat.set(a / 2.5, t / 2.5)) : "Drywall" == da.divisionMaterial ? (e.userData.topMaterial.map = null, e.userData.topMaterial.normalMap = null, e.userData.topMaterial.specular.setHex(14540253), e.userData.topMaterial.shininess = 6, e.userData.topMaterial.reflectivity = 0, e.userData.bottomMaterial.map = null, e.userData.bottomMaterial.normalMap = null, e.userData.bottomMaterial.specular.setHex(14540253), e.userData.bottomMaterial.shininess = 6, e.userData.bottomMaterial.reflectivity = 0) : (e.userData.topMaterial.map = null, e.userData.topMaterial.normalMap = e.userData.metalTexture, e.userData.topMaterial.specular.setHex(6250335), e.userData.topMaterial.shininess = 90, e.userData.topMaterial.reflectivity = .05, e.userData.topMaterial.normalMap.repeat.set(12 * a / 9, 1), e.userData.bottomMaterial.map = null, e.userData.bottomMaterial.normalMap = e.userData.metalTexture, e.userData.bottomMaterial.specular.setHex(6250335), e.userData.bottomMaterial.shininess = 90, e.userData.bottomMaterial.reflectivity = .05, e.userData.bottomMaterial.normalMap.repeat.set(12 * a / 9, 1)), e.userData.topMaterial.needsUpdate = !0, e.userData.bottomMaterial.needsUpdate = !0) }) } function no() { var t, a, e; if (null == n[0]) for (let e = 0; e < 6; e++) { (t = Y.deepClone()).name = "perimeterWall" + (e + 1), t.scale.z = .075, t.userData.material = "Steel", i = D + "images/building/building-normal.jpg", (a = (new THREE.TextureLoader).load(i)).anisotropy = Math.min(W.capabilities.getMaxAnisotropy(), 5), a.wrapS = THREE.RepeatWrapping, a.wrapT = THREE.RepeatWrapping; var o, i = D + "images/building/OSB.jpg"; (o = (new THREE.TextureLoader).load(i)).anisotropy = Math.min(W.capabilities.getMaxAnisotropy(), 5), o.wrapS = THREE.RepeatWrapping, o.wrapT = THREE.RepeatWrapping; for (let e = 0; e < t.material.length; e++) t.material[e] = t.material[e].clone(), "interiorWallUpper" === t.material[e].name && (t.material[e].normalMap = a, t.userData.metalTexture = a, t.userData.topMaterial = t.material[e]), "interiorWallLower" === t.material[e].name && (t.userData.woodTexture = o, t.userData.bottomMaterial = t.material[e]); na.add(t), n[e] = t } n[0].hasOwnProperty("parent") && (n[0].visible = !1, n[1].visible = !1, n[2].visible = !1, n[3].visible = !1, n[4].visible = !1, n[5].visible = !1, da.divisionWall || "None" === da.perimeterWalls || 0 !== da.hideWalls || (n[0].visible = !0, n[1].visible = !0, n[2].visible = !0, n[3].visible = !0), da.divisionWall && "None" !== da.perimeterWalls && 0 === da.hideWalls && (n[0].visible = !0, n[1].visible = !0, n[5].visible = !0), da.divisionWall && "None" !== da.perimeterWalls2 && 0 === da.hideWalls && (n[2].visible = !0, n[3].visible = !0, n[4].visible = !0), e = .15, da.divisionWall || "None" === da.perimeterWalls ? da.divisionWall && "None" !== da.perimeterWalls && (n[0].position.set(0, 0, da.depth / 2 - e), n[1].position.set(da.width / -2 + e, 0, (da.depth - da.divisionAmount - e) / 2), n[5].position.set(da.width / 2 - e, 0, (da.depth - da.divisionAmount - e) / 2), n[0].rotation.y = 0, n[1].rotation.y = THREE.Math.degToRad(90), n[5].rotation.y = THREE.Math.degToRad(90), n[0].scale.x = da.width - .3, n[1].scale.x = da.divisionAmount - e, n[5].scale.x = da.divisionAmount - e, n[0].userData.material = da.perimeterWalls, n[1].userData.material = da.perimeterWalls, n[5].userData.material = da.perimeterWalls) : (n[0].position.set(0, 0, da.depth / 2 - e), n[1].position.set(da.width / -2 + e, 0, 0), n[2].position.set(0, 0, da.depth / -2 + e), n[3].position.set(da.width / 2 - e, 0, 0), n[0].rotation.y = 0, n[1].rotation.y = THREE.Math.degToRad(90), n[2].rotation.y = 0, n[3].rotation.y = THREE.Math.degToRad(90), n[0].scale.x = da.width - .3, n[1].scale.x = da.depth - .3, n[2].scale.x = da.width - .3, n[3].scale.x = da.depth - .3, n[0].userData.material = da.perimeterWalls, n[1].userData.material = da.perimeterWalls, n[2].userData.material = da.perimeterWalls, n[3].userData.material = da.perimeterWalls), da.divisionWall && "None" !== da.perimeterWalls2 && (n[2].position.set(da.width / -2 + e, 0, (da.divisionAmount - e) / -2), n[3].position.set(0, 0, da.depth / -2 + e), n[4].position.set(da.width / 2 - e, 0, (da.divisionAmount - e) / -2), n[2].rotation.y = THREE.Math.degToRad(90), n[3].rotation.y = 0, n[4].rotation.y = THREE.Math.degToRad(90), n[2].scale.x = da.depth - e - da.divisionAmount, n[3].scale.x = da.width - .3, n[4].scale.x = da.depth - e - da.divisionAmount, n[2].userData.material = da.perimeterWalls2, n[3].userData.material = da.perimeterWalls2, n[4].userData.material = da.perimeterWalls2), ia.traverse(function(t) { if (t instanceof THREE.Mesh && t.name.startsWith("perimeterWall") && ("None" !== da.perimeterWalls || "None" !== da.perimeterWalls2)) { let e = t.userData.height = t.scale.y = da.height - 1; if (da.hasOwnProperty("perimeterWallHeight")) e = t.userData.height = t.scale.y = da.perimeterWallHeight; else if (da.settings.vaultedCeiling && ("perimeterWall1" == t.name || "perimeterWall3" == t.name)) { console.log(t), e = t.userData.height = t.scale.y = da.peakHeight(); for (let e = 0; e < t.material.length; e++) t.material[e].clippingPlanes = [et, tt], t.material[e].clipIntersection = !1, t.material[e].clipShadows = !0 } var a = t.userData.width = t.scale.x; "Half Wood" == t.userData.material ? (t.userData.topMaterial.map = null, t.userData.topMaterial.normalMap = t.userData.metalTexture, t.userData.topMaterial.specular.setHex(6250335), t.userData.topMaterial.shininess = 90, t.userData.topMaterial.reflectivity = .05, t.userData.topMaterial.normalMap.repeat.set(12 * a / 9, 1), t.userData.bottomMaterial.map = t.userData.woodTexture, t.userData.bottomMaterial.normalMap = null, t.userData.bottomMaterial.specular.setHex(2500134), t.userData.bottomMaterial.shininess = 5.117649, t.userData.bottomMaterial.reflectivity = 0, t.userData.bottomMaterial.map.repeat.set(a / 2.5, e / 2.5)) : "Wood" == t.userData.material ? (t.userData.topMaterial.map = t.userData.woodTexture, t.userData.topMaterial.normalMap = null, t.userData.topMaterial.specular.setHex(2500134), t.userData.topMaterial.shininess = 5.117649, t.userData.topMaterial.reflectivity = 0, t.userData.topMaterial.map.repeat.set(a / 2.5, e / 2.5), t.userData.bottomMaterial.map = t.userData.woodTexture, t.userData.bottomMaterial.normalMap = null, t.userData.bottomMaterial.specular.setHex(2500134), t.userData.bottomMaterial.shininess = 5.117649, t.userData.bottomMaterial.reflectivity = 0, t.userData.bottomMaterial.map.repeat.set(a / 2.5, e / 2.5)) : "Drywall" == t.userData.material ? (t.userData.topMaterial.map = null, t.userData.topMaterial.normalMap = null, t.userData.topMaterial.specular.setHex(14540253), t.userData.topMaterial.shininess = 6, t.userData.topMaterial.reflectivity = 0, t.userData.bottomMaterial.map = null, t.userData.bottomMaterial.normalMap = null, t.userData.bottomMaterial.specular.setHex(14540253), t.userData.bottomMaterial.shininess = 6, t.userData.bottomMaterial.reflectivity = 0) : (t.userData.topMaterial.map = null, t.userData.topMaterial.normalMap = t.userData.metalTexture, t.userData.topMaterial.specular.setHex(6250335), t.userData.topMaterial.shininess = 90, t.userData.topMaterial.reflectivity = .05, t.userData.topMaterial.normalMap.repeat.set(12 * a / 9, 1), t.userData.bottomMaterial.map = null, t.userData.bottomMaterial.normalMap = t.userData.metalTexture, t.userData.bottomMaterial.specular.setHex(6250335), t.userData.bottomMaterial.shininess = 90, t.userData.bottomMaterial.reflectivity = .05, t.userData.bottomMaterial.normalMap.repeat.set(12 * a / 9, 1)), t.userData.topMaterial.needsUpdate = !0, t.userData.bottomMaterial.needsUpdate = !0 } })) } function ro() { this.addWindow3x4 = function() { l("window3x4") }, this.addWindow3x4Grid = function() { l("window3x4Grid") }, this.addWindow3x4Shutters = function() { l("window3x4Shutters") }, this.addWindow4x3 = function() { l("window4x3") }, this.addWindow4x3Grid = function() { l("window4x3Grid") }, this.addWindow4x3Shutters = function() { l("window4x3Shutters") }, this.addWindowPicture = function() { l("windowPicture") }, this.addWindowSlider = function() { l("windowSlider") }, this.addWindowCasement = function() { l("windowCasement") }, this.addWindowDoubleHung = function() { l("windowDoubleHung") }, this.addWindowSingleHung = function() { l("windowSingleHung") }, this.addWindowTwinset = function() { l("windowTwinset") }, this.addWindowAwning = function() { l("windowAwning") }, this.addWindowHopper = function() { l("windowHopper") }, this.addWindowSlopeLeft = function() { l("windowSlopeLeft") }, this.addWindowSlopeRight = function() { l("windowSlopeRight") }, this.addLouver = function() { l("windowLouver") }, this.addWindowFramedOpening = function() { l("windowFramedOpening") }, this.addMansard = function() { l("mansard") }, this.addMansardHip = function() { l("mansardHip") }, this.addWalkDoorSolid = function() { l("walkDoorSolid") }, this.addWalkDoorSolidDouble = function() { l("walkDoorSolidDouble") }, this.addWalkDoorHalfGlass = function() { l("walkDoorHalfGlass") }, this.addWalkDoorHalfGlassDouble = function() { l("walkDoorHalfGlassDouble") }, this.addWalkDoor6Panel = function() { l("walkDoor6Panel") }, this.addWalkDoor6PanelDouble = function() { l("walkDoor6PanelDouble") }, this.addWalkDoor6Lite = function() { l("walkDoor6Lite") }, this.addWalkDoor9Lite = function() { l("walkDoor9Lite") }, this.addWalkDoor9LiteDouble = function() { l("walkDoor9LiteDouble") }, this.addWalkDoorSlidingGlassDouble = function() { l("walkDoorSlidingGlassDouble") }, this.addWalkDoorFrenchDouble = function() { l("walkDoorFrenchDouble") }, this.addWalkDoorAllGlass = function() { l("walkDoorAllGlass") }, this.addWalkDoorAllGlassDouble = function() { l("walkDoorAllGlassDouble") }, this.addWalkDoorCrossbuck = function() { l("walkDoorCrossbuck") }, this.addWalkDoorEquine = function() { l("walkDoorEquine") }, this.addWalkDoorFramedOpening = function() { l("walkDoorFramedOpening") }, this.addGarageOverheadPanel = function() { l("garageOverheadPanel") }, this.addGarageOverheadPanelWindow = function() { l("garageOverheadPanelWindow") }, this.addGarageOverheadFlat = function() { l("garageOverheadFlat") }, this.addGarageOverheadFlatWindow = function() { l("garageOverheadFlatWindow") }, this.addGarageOverheadFlatModern = function() { l("garageOverheadFlatModern") }, this.addGarageOverheadRibbed = function() { l("garageOverheadRibbed") }, this.addGarageSlide = function() { l("garageSlide") }, this.addGarageSlideLeft = function() { l("garageSlideLeft") }, this.addGarageSlideRight = function() { l("garageSlideRight") }, this.addGarageSlideCrossbuck = function() { l("garageSlideCrossbuck") }, this.addGarageBiFold = function() { l("garageBiFold") }, this.addGarageHydraulic = function() { l("garageHydraulic") }, this.addGarageRollUp = function() { l("garageRollUp") }, this.addGarageFramedOpening = function() { l("garageFramedOpening") } } function l(e, t) { t = t || !1, "mansard" === (e = e || !1) || "mansardHip" === e ? Ka(e, 8, t) : e.startsWith("window") ? Ka(e, 5, t) : (e.startsWith("walkDoor") || e.startsWith("garage")) && Ka(e, 0, t) } function so(e, t) { for (var a = 0; a < t.length; a++) if (t[a] === e) return !0; return !1 } function lo(t) { t.userData.hasOwnProperty("hasBoundingBox") && t.userData.hasBoundingBox && so(t.userData.selectionBox, La) && (La = La.filter(function(e) { return e != t.userData.selectionBox })), so(t, La) && (La = La.filter(function(e) { return e != t })) } function ho() { var t = []; for (let e = 0; e < La.length; e++) null !== La[e].parent && La[e].parent !== ia && null !== La[e].parent.parent && t.push(La[e]); La = t } function co(a) { if (null !== a) { let t; if (lo(a), void 0 !== a.children) if (0 < a.children.length) { t = a.parent; for (let e = 0; e < a.children.length; e++) co(a.children[e]); if (a.geometry && (ia.remove(a.geometry), a.geometry.dispose(), a.geometry = void 0), void 0 !== a.material && 0 < a.material.length) for (let e = 0; e < a.material.length; e++) a.material[e] && (a.material[e].map && (ia.remove(a.material[e].map), a.material[e].map.dispose(), a.material[e].map = void 0), t.remove(a.material[e]), a.material[e].dispose(), a.material[e] = void 0); else a.material.map && (ia.remove(a.material.map), a.material.map.dispose(), a.material.map = void 0), t.remove(a.material), a.material.dispose(), a.material = void 0 } else { if (t = a.parent, 0 < a.material.length) for (let e = 0; e < a.material.length; e++) a.material[e] && (a.material[e].map && (ia.remove(a.material[e].map), a.material[e].map.dispose(), a.material[e].map = void 0), t.remove(a.material[e]), a.material[e].dispose(), a.material[e] = void 0); else a.material.map && (ia.remove(a.material.map), a.material.map.dispose(), a.material.map = void 0), t.remove(a.material), a.material.dispose(), a.material = void 0; a.geometry && (t.remove(a.geometry), a.geometry.dispose(), a.geometry = void 0) } }(parent = a.parent).remove(a) } function po(t) { for (let e = t.children.length - 1; 0 <= e; e--) t.remove(t.children[e]) } function mo(i = {}) { try { var n = M.aspect, r = W.getSize(new THREE.Vector2); let e = r.x, t = r.y, a = .92, o = !1; return i.hasOwnProperty("width") && Number.isInteger(i.width) && (e = i.width, o = !0), i.hasOwnProperty("height") && Number.isInteger(i.height) && (t = i.height, o = !0), i.hasOwnProperty("compression") && !isNaN(parseFloat(i.compression)) && (a = parseFloat(i.compression)), o && (M.aspect = e / t, W.setSize(e, t, !1), M.updateProjectionMatrix(), W.autoClear = !1, W.render(ia, M)), Mt = W.domElement.toDataURL("image/jpeg", a), o && (M.aspect = n, W.setSize(r, !1), M.updateProjectionMatrix(), W.autoClear = !0, W.render(ia, M)), Mt } catch (e) { console.log(e) } } function go() { setTimeout(function() { mo({ width: 1920, height: 800, compression: .55 }), $("#printImage").html(''), Wt = !1, uo(), setTimeout(function() { window.print() }, 100) }, 50) } function uo() { let e = ""; var t, r = { mansard: "Mansard Standard", mansardHip: "Mansard Hip End", window3x4: "Window (3x4)", window3x4Grid: "Window (3x4) w/ Grid", window3x4Shutters: "Window (3x4) w/ Shuters", window4x3: "Window (4x3)", window4x3Grid: "Window (4x3) w/ Grid", window4x3Shutters: "Window (4x3) w/ Shuters", windowPicture: "Picture Window", windowSlider: "Slider Window", windowCasement: "Casement Window", windowDoubleHung: "Double Hung Window", windowSingleHung: "Single Hung Window", windowTwinset: "Twinset Window", windowAwning: "Awning Window", windowHopper: "Hopper Window", windowSlopeLeft: "Left Slope Window", windowSlopeRight: "Right Slope Window", windowLouver: "Louver", windowFramedOpening: "Window Frame Out", walkDoorSolid: "Walk Door Solid", walkDoorSolidDouble: "Walk Door Solid Double", walkDoorHalfGlass: "Walk Door Half Lite", walkDoorHalfGlassDouble: "Walk Door Half Lite Double", walkDoor6Panel: "Walk Door 6-Panel", walkDoor6PanelDouble: "Walk Door 6-Panel Double", walkDoor6Lite: "Walk Door 6-Lite", walkDoor9Lite: "Walk Door 9-Lite", walkDoor9LiteDouble: "Walk Door 9-Lite Double", walkDoorSlidingGlassDouble: "Sliding Glass Patio Door", walkDoorFrenchDouble: "French Double Door", walkDoorAllGlass: "Walk Door All Glass", walkDoorAllGlassDouble: "Walk Door All Glass Double", walkDoorCrossbuck: "Walk Door Crossbuck", walkDoorEquine: "Dutch Door Equine", walkDoorFramedOpening: "Walk Door Frame Out", garageOverheadPanel: "Overhead Panel Door", garageOverheadPanelWindow: "Overhead Panel Window Door", garageOverheadFlat: "Overhead Commercial Door", garageOverheadFlat: "Overhead Flat Window Door", garageOverheadFlatModern: "Overhead Modern Door", garageOverheadRibbed: "Overhead Ribbed Door", garageSlide: "Sliding Doors", garageSlideLeft: "Sliding Door Left", garageSlideRight: "Sliding Door Right", garageSlideCrossbuck: "Sliding Crossbuck Doors", garageBiFold: "Bi-Fold Door", garageHydraulic: "Hydraulic Door", garageRollUp: "Roll Up Door", garageFramedOpening: "Framed Opening", interiorWall: "Interior Wall", interiorDoor: "Interior Door" }, s = ""; for (t in da) da.hasOwnProperty(t) && t.lastIndexOf("Qty", t.length - 3) === t.length - 3 && 0 < da[t] && (s += r[t.replace("Qty", "")] + " Qty: " + da[t] + "
"); s += "
Item Sizes:
"; let a = "", o = ""; ia.traverse(function(o) { if (o instanceof THREE.Mesh) { if ((o.name.startsWith("interior") || o.name.startsWith("mansard") || "wind" === o.name.substring(0, 4) || "walk" === o.name.substring(0, 4) || "gara" === o.name.substring(0, 4)) && o.name.lastIndexOf("-clone", o.name.length - 6) === o.name.length - 6) { var e = o.name.replace("-clone", ""), i = 1, n = 1; let t = !1, a = !1; if ("window3x4" === e ? (i = 3, n = 4) : "window4x3" === e ? (i = 4, n = 3) : "window3x4Grid" === e ? (i = 3, n = 4) : "window4x3Grid" === e ? (i = 4, n = 3) : "window3x4Shutters" === e ? (i = 3, n = 4) : "window4x3Shutters" === e ? (i = 4, n = 3) : e.startsWith("walk") ? (i = o.userData.scale.x, n = o.userData.scale.y) : "gara" === e.substring(0, 4) ? n = i = 10 : e.startsWith("mansardHip") ? (i = 5, n = 2) : e.startsWith("mansard") ? (i = 1, n = 2) : e.startsWith("interiorWall") ? (i = o.userData.width, n = o.userData.height) : e.startsWith("interiorDoor") && (i = 3, n = 7), e.startsWith("walk") && o.hasOwnProperty("morphTargetDictionary") && o.morphTargetDictionary.hasOwnProperty("width") ? i = Math.round(12 * (i + o.morphTargetInfluences[o.morphTargetDictionary.width])) : !e.startsWith("window") && !e.startsWith("mansard") && o.hasOwnProperty("morphTargetDictionary") && o.morphTargetDictionary.hasOwnProperty("width") && (i = parseFloat((i + 10 * o.morphTargetInfluences[o.morphTargetDictionary.width] * 2).toFixed(2))), e.startsWith("mansard") ? (i = parseFloat((i + o.morphTargetInfluences[o.morphTargetDictionary.width]).toFixed(2)), n = parseFloat((n + o.morphTargetInfluences[o.morphTargetDictionary.depth]).toFixed(2))) : e.startsWith("walk") && o.hasOwnProperty("morphTargetDictionary") && o.morphTargetDictionary.hasOwnProperty("height") ? n = Math.round(12 * (n + o.morphTargetInfluences[o.morphTargetDictionary.height])) : e.startsWith("garage") && (n = parseFloat((n + 10 * o.morphTargetInfluences[o.morphTargetDictionary.height]).toFixed(2))), e.startsWith("window")) { i = parseFloat((i + o.morphTargetInfluences[o.morphTargetDictionary.width]).toFixed(2)), n = parseFloat((n + o.morphTargetInfluences[o.morphTargetDictionary.height]).toFixed(2)); for (let e = 0; e < o.material.length; e++) "WindowGrid" === o.material[e].name && (t = o.material[e].visible), "Shutters" === o.material[e].name && (a = o.material[e].visible) } s = s + r[e] + ": w" + i + "' x h" + n + "'", void 0 !== t && t && (s += " with grid"), void 0 !== a && a && (s += " with shutters"), s += "
" } o.name.startsWith("porch") && o.name.endsWith("-clone") && o.visible && ("porchWrapHip" == o.userData.masterObjectName ? a += "" + J[o.userData.porchSide].abbr + " Wrap Hip Porch" : "porchWrap" == o.userData.masterObjectName ? a += "" + J[o.userData.porchSide].abbr + " Wrap Porch" : "porch" == o.userData.masterObjectName && (a += "" + J[o.userData.porchSide].abbr + " Porch"), a += " Width: " + o.userData.width + ",", "porch" !== o.userData.masterObjectName && (a += " length: " + o.userData.depth + "',"), a += " Height: " + Math.round(4 * o.userData.height) / 4 + "',", da.allowLeanToCeilingHeight && (a += " Ceiling Height:" + o.userData.ceilingHeight + "',"), a = (a = (a += " Porch Depth: " + o.userData.porchDepth + "',") + " Porch Roof Pitch: " + o.userData.porchPitch + "',") + " Porch Overhang: " + o.userData.porchOverhang + "',", o.userData.postMiter && (a += " Post Miters,"), o.userData.postWrap && (a += " Wrapped Posts"), o.userData.posts || (a += " No Posts"), a += "

") } }); var i = "", n = (da.hasOwnProperty("postFooting") && (i += "Post Footing: " + da.postFooting + "
"), da.hasOwnProperty("postType") && (i += "Post Type: " + da.postType + "
"), da.hasOwnProperty("frameConstruction") && (i += "Frame Type: " + da.frameConstruction + "
"), da.hasOwnProperty("columnSize") && (i += "Column Size: " + da.columnSize + "
"), da.hasOwnProperty("purlinType") && (i += "Purlin Type: " + da.purlinType + "
"), da.hasOwnProperty("wallPanelType") && (i += "Wall Panel Type: " + da.wallPanelType + "
"), da.hasOwnProperty("roofPanelType") && (i += "Roof Panel Type: " + da.roofPanelType + "
"), da.hasOwnProperty("snowLoad") && "None" !== da.snowLoad && (i += "Snow Load: " + da.snowLoad + "lbs/ft²
"), da.hasOwnProperty("windLoad") && "None" !== da.windLoad && (i += "Wind Load: " + da.windLoad + "mph
"), da.hasOwnProperty("baseTrim") && da.baseTrim && (i += "Base Trim: Yes
"), da.hasOwnProperty("permits") && da.baseTrim && (i += "Permits: Yes
"), da.hasOwnProperty("engineerPlans") && da.baseTrim && (i += "Engineer Plans: Yes
"), da.hasOwnProperty("clearingLand") && da.baseTrim && (i += "Clearing Land: Yes
"), da.hasOwnProperty("sitePrep") && da.baseTrim && (i += "Site Prep: Yes
"), da.hasOwnProperty("concreteFoundation") && da.baseTrim && (i += "Concrete Foundation: Yes
"), da.hasOwnProperty("concreteApproach") && da.baseTrim && (i += "Concrete Approach: Yes
"), da.hasOwnProperty("gravel") && da.baseTrim && (i += "Gravel: Yes
"), da.hasOwnProperty("asphalt") && da.baseTrim && (i += "Asphalt: Yes
"), da.hasOwnProperty("masonry") && da.baseTrim && (i += "Masonry: Yes
"), ""); (da.wainscot1 || da.wainscot2 || da.wainscot3 || da.wainscot4) && (n = "

Wainscot

", da.wainscot1 && (n += J.N.short + ": Yes
"), da.wainscot2 && (n += J.W.short + ": Yes
"), da.wainscot3 && (n += J.S.short + ": Yes
"), da.wainscot4 && (n += J.E.short + ": Yes
"), da.hasOwnProperty("wainscotHeight") && (n += "Wainscot Height: " + Do(da.wainscotHeight, 1).friendly + "
"), n += "
"); let l = "", h = (da.hasOwnProperty("divisionWall") && da.divisionWall && (l = "Division Wall at: " + da.divisionAmount + "ft", da.hasOwnProperty("divisionMaterial") && (l += ", " + da.divisionMaterial), l += "
"), ""), c = (("None" !== da.perimeterWalls || da.hasOwnProperty("perimeterWalls2") && "None" !== da.perimeterWalls2) && ("None" !== da.perimeterWalls && (h = "Perimeter Walls: " + da.perimeterWalls), da.hasOwnProperty("perimeterWalls2") && "None" !== da.perimeterWalls2 && (h += "
Perimeter Walls 2: " + da.perimeterWalls2), da.hasOwnProperty("perimeterWallHeight") && (h += ", " + da.perimeterWallHeight + "ft"), h += "
"), ""), d = (da.hasOwnProperty("flooring") && "None" !== da.flooring && (c += "Flooring: " + da.flooring + "
"), da.hasOwnProperty("flooring2") && "None" !== da.flooring2 && da.divisionWall && (c += "Flooring 2: " + da.flooring2 + "
"), ""), p = (da.hasOwnProperty("ceiling") && "None" !== da.ceiling && (d += "Ceiling: " + da.ceiling + "
"), da.hasOwnProperty("ceiling2") && "None" !== da.ceiling2 && da.divisionWall && (d += "Ceiling 2: " + da.ceiling2 + "
"), ""), m = (da.insulation && (p = "Insulation: Yes
"), "None" !== da.insulationRoof && (p += "Roof Insulation: " + da.insulationRoof + "
"), "None" !== da.insulationWalls && (p += "Wall Insulation: " + da.insulationWalls + "
"), ""), g = (da.hasOwnProperty("mezzanineBays") && 0 < da.mezzanineBays && (!da.useMezzanineDepth && 0 < da.mezzanineBays && (m = "Mezzanine Bays: " + da.mezzanineBays + "
", m += "Mezzanine Height: " + da.mezzanineHeight + "'
"), da.useMezzanineDepth && 0 < da.mezzanineDepth && (m = "Mezzanine Depth: " + da.mezzanineDepth + "'
", m += "Mezzanine Height: " + da.mezzanineHeight + "'
"), da.hasOwnProperty("mezzanineRailing") && "None" !== da.mezzanineRailing && (m += "Mezzanine Railing: " + da.mezzanineRailing + "
"), da.hasOwnProperty("mezzanineStairs")) && "None" !== da.mezzanineStairs && (m += "Mezzanine Stairs: " + da.mezzanineStairs + "'
"), ""); g = (g += "Roof Color: " + da.roofColor + "
") + "Wall Color: " + da.wallColor + "
", da.hasOwnProperty("trimCornerColor") || (g += "Trim Color: " + da.trimColor + "
"), da.hasOwnProperty("trimBaseColor") && (g += "Trim Base: " + da.trimBaseColor + "
"), da.hasOwnProperty("trimGableColor") && (g += "Trim Gable: " + da.trimGableColor + "
"), da.hasOwnProperty("trimEaveColor") && (g += "Trim Eave: " + da.trimEaveColor + "
"), da.hasOwnProperty("trimCornerColor") && (g += "Trim Corner: " + da.trimCornerColor + "
"), da.hasOwnProperty("trimWallColor") && (g += "Wall Trim: " + da.trimWallColor + "
"), da.hasOwnProperty("ridgeCapColor") && (g += "Ridge Cap Color: " + da.ridgeCapColor + "
"), da.hasOwnProperty("doorTrimColor") && (g += "Door Trim: " + da.doorTrimColor + "
"), da.hasOwnProperty("garageDoorTrimColor") && (g += "Large Door Trim: " + da.garageDoorTrimColor + "
"), da.hasOwnProperty("walkDoorTrimColor") && (g += "Walk Door Trim: " + da.walkDoorTrimColor + "
"), da.hasOwnProperty("doorWindowTrimColor") && (g += "Door and Garage Trim: " + da.doorWindowTrimColor + "
"), da.hasOwnProperty("walkDoorColor") && (g += "Walk Doors: " + da.walkDoorColor + "
"), da.hasOwnProperty("largeDoorColor") && (g += "Large Doors: " + da.largeDoorColor + "
"), da.hasOwnProperty("commercialDoorColor") && (g += "Commercial Doors: " + da.commercialDoorColor + "
"), da.hasOwnProperty("residentialDoorColor") && (g += "Residential Doors: " + da.residentialDoorColor + "
"), da.hasOwnProperty("trackColor") && (g += "Track: " + da.trackColor + "
"), da.hasOwnProperty("gutterColor") && (g += "Gutters: " + da.gutterColor + "
"), da.hasOwnProperty("downspoutColor") && (g += "Downspouts: " + da.downspoutColor + "
"), da.hasOwnProperty("wainscotColor") && (da.wainscot1 || da.wainscot2 || da.wainscot3 || da.wainscot4) && (g += "Wainscot Color: " + da.wainscotColor + "
"), e += "

Building Specs

Width: " + da.width + "'
Length: " + da.depth + "'
Height: " + da.height + "'
Roof Type: " + da.roofType + "
Roof Pitch: " + da.roofPitch + '":12"
' + i + "

Colors

" + g + "Soffit Color: " + da.soffitColor + "
" + n + "

Interior

" + l + h + c + d + p + m + "
"; var i = "", n = (da.enclosedN ? i += J.N.abbr + " Wall: Enclosed
" : i += J.N.abbr + " Wall: Open
", da.enclosedS ? i += J.S.abbr + " Wall: Enclosed
" : i += J.S.abbr + " Wall: Open
", da.enclosedE ? i += J.E.abbr + " Wall: Enclosed
" : i += J.E.abbr + " Wall: Open
", da.enclosedW ? i += J.W.abbr + " Wall: Enclosed
" : i += J.W.abbr + " Wall: Open
", da.hasOwnProperty("showGableTriangleWithOpenGableWall") && "" !== i && (i += " Enclose Gable Triangles: " + da.showGableTriangleWithOpenGableWall + "
"), da.eaveLightsEast, da.eaveLightsWest, da.eaveLightPanelsEast, da.eaveLightPanelsWest, da.eaveLightsEast && (i += "Eavelights " + J.E.short + ": " + da.eaveLightsEast + "
"), da.eaveLightsWest && (i += "Eavelights " + J.W.short + ": " + da.eaveLightsWest + "
"), da.eaveLightPanelsEast && (i += "Eave Light Panels " + J.E.short + ": " + da.eaveLightPanelsEast + "
"), da.eaveLightPanelsWest && (i += "Eave Light Panels " + J.W.short + ": " + da.eaveLightPanelsWest + "
"), ""), u = (0 < da.gableFront && (n += J.N.abbr + " " + Bt + ": " + da.gableFront + "'
"), 0 < da.gableBack && (n += J.S.abbr + " " + Bt + ": " + da.gableBack + "'
"), 0 < da.eaveL && (n += J.E.abbr + " " + Bt + ": " + da.eaveL + "
"), 0 < da.eaveR && (n += J.W.abbr + " " + Bt + ": " + da.eaveR + "
"), da.hasOwnProperty("boxedOverhangs") && da.boxedOverhangs && (n += "Boxed Overhangs: Yes
"), 0 < da.cupola2 && (n += "2'x2' Cupola Qty: " + da.cupola2 + "
"), 0 < da.cupola3 && (n += "3'x3' Cupola Qty: " + da.cupola3 + "
"), 0 < da.cupola4 && (n += "4'x4' Cupola Qty: " + da.cupola4 + "
"), 0 < da.cupolaWindow2 && (n += "2'x2' Cupola Window Qty: " + da.cupolaWindow2 + "
"), 0 < da.cupolaWindow3 && (n += "3'x3' Cupola Window Qty: " + da.cupolaWindow3 + "
"), 0 < da.cupolaWindow4 && (n += "4'x4' Cupola Window Qty: " + da.cupolaWindow4 + "
"), "None" !== da.weatherVane && (n += "Weather Vane: " + da.weatherVane + "
"), da.hasOwnProperty("gutters") && da.gutters && (n += "Gutters and Downspouts: Yes
"), 0 < da.ridgeVents && (n += "Ridge Vents: " + da.ridgeVents + "
"), 0 < da.skylights && (n += "Skylights: " + da.skylights + "
"), ""); let T; da.leanTo1 && (T = "Walls: " + da.leanTo1Walls, u += "" + Ot + " " + J.N.abbr + " Connection Height: " + da.leanTo1Height + "', Cut L: " + da.leanTo1CutL + "', Cut R:" + da.leanTo1CutR + "', Length: " + (da.width - da.leanTo1CutL - da.leanTo1CutR) + "', Depth: " + da.leanTo1Depth + "', Pitch: " + da.leanTo1Pitch + ":12, " + T + "

"), da.leanTo2 && (T = "Walls: " + da.leanTo2Walls, u += "" + Ot + " " + J.E.abbr + " Connection Height: " + da.leanTo2Height + "', Cut L: " + da.leanTo2CutL + "', Cut R:" + da.leanTo2CutR + "', Length: " + (da.depth - da.leanTo2CutL - da.leanTo2CutR) + "', Depth: " + da.leanTo2Depth + "' Pitch: " + da.leanTo2Pitch + ":12, " + T + "

"), da.leanTo4 && (T = "Walls: " + da.leanTo4Walls, u += "" + Ot + " " + J.W.abbr + " Connection Height: " + da.leanTo4Height + "', Cut L: " + da.leanTo4CutL + "', Cut R:" + da.leanTo4CutR + "', Length: " + (da.depth - da.leanTo4CutL - da.leanTo4CutR) + "', Depth: " + da.leanTo4Depth + "' Pitch: " + da.leanTo4Pitch + ":12, " + T + "

"), da.leanTo3 && (T = "Walls: " + da.leanTo3Walls, u += "" + Ot + " " + J.S.abbr + " Connection Height: " + da.leanTo3Height + "', Cut L: " + da.leanTo3CutL + "', Cut R:" + da.leanTo3CutR + "', Length: " + (da.width - da.leanTo3CutL - da.leanTo3CutR) + "', Depth: " + da.leanTo3Depth + "' Pitch: " + da.leanTo3Pitch + ":12, " + T + "

"), "" === i && "" === n && "" === u || (e += "

Walls

" + i + "

Roof Options

" + n + "

" + xt + "

" + u + "
"), (da.hasOwnProperty("coveredGableExtensionN") && da.coveredGableExtensionN || da.hasOwnProperty("coveredGableExtensionS") && da.coveredGableExtensionS || da.hasOwnProperty("coveredGableExtensionE") && da.coveredGableExtensionE || da.hasOwnProperty("coveredGableExtensionW") && da.coveredGableExtensionW) && (da.coveredGableExtensionN && (o = (o = (o = (o = (o += "" + J.N.short + " (" + (da.width - da.coveredGableExtensionNCutL - da.coveredGableExtensionNCutR) + " x " + da.coveredGableExtensionNDepth + "): ") + " Cut L: " + da.coveredGableExtensionNCutL + ",") + " Cut R: " + da.coveredGableExtensionNCutR + ",") + " Height: " + da.coveredGableExtensionNHeight + ",") + " Pitch: " + da.coveredGableExtensionNPitch + ":12,", da.coveredGableExtensionNEnclosed && (o += " Enclosed"), o += "

"), da.coveredGableExtensionS && (o = (o = (o = (o = (o += "" + J.S.short + " (" + (da.width - da.coveredGableExtensionSCutL - da.coveredGableExtensionSCutR) + " x " + da.coveredGableExtensionSDepth + "): ") + " Cut L: " + da.coveredGableExtensionsCutL + ",") + " Cut R: " + da.coveredGableExtensionSCutR + ",") + " Height: " + da.coveredGableExtensionSHeight + ",") + " Pitch: " + da.coveredGableExtensionSPitch + ":12,", da.coveredGableExtensionSEnclosed && (o += " Enclosed"), o += "

"), da.coveredGableExtensionE && (o = (o = (o = (o = (o += "" + J.E.short + " (" + (da.depth - da.coveredGableExtensionECutL - da.coveredGableExtensionECutR) + " x " + da.coveredGableExtensionEDepth + "): ") + " Cut L: " + da.coveredGableExtensionECutL + ",") + " Cut R: " + da.coveredGableExtensionECutR + ",") + " Height: " + da.coveredGableExtensionEHeight + ",") + " Pitch: " + da.coveredGableExtensionEPitch + ":12,", da.coveredGableExtensionEEnclosed && (o += " Enclosed"), o += "

"), da.coveredGableExtensionW && (o = (o = (o = (o = (o += "" + J.W.short + " (" + (da.depth - da.coveredGableExtensionWCutL - da.coveredGableExtensionWCutR) + " x " + da.coveredGableExtensionWDepth + "): ") + " Cut L: " + da.coveredGableExtensionWCutL + ",") + " Cut R: " + da.coveredGableExtensionWCutR + ",") + " Height: " + da.coveredGableExtensionWHeight + ",") + " Pitch: " + da.coveredGableExtensionWPitch + ":12,", da.coveredGableExtensionWEnclosed && (o += " Enclosed"), o += "

"), o = "

" + Rt + "

" + o + "
"), "" !== a && (a = "

Porches

" + a + "
"), e = (e += a + o) + "

Windows & Doors

" + s + "
", w && (e += "

Colors


Roof Color: " + da.roofColor + "
Wall Color: " + da.wallColor + "
Trim Color: " + da.trimColor + "
"), $("#printTable").html(e) } function To() { var e = {}; return e.params = da, e.porches = {}, e.doorsWindows = {}, JSON.stringify(e) } function bo(e, t, a, o) { if (e = e || !1, t = t || 1500, a = a || !1, o = o || !1, P.autoRotate = !1, za(), M == E) { var i = (new THREE.Box3).setFromObject(na), n = (i.min.x = da.buildingWithPorchesDimensions().eastEdge, i.min.y = 0, i.min.z = da.buildingWithPorchesDimensions().southEdge, i.max.x = da.buildingWithPorchesDimensions().westEdge, i.max.y = da.peakHeight(), i.max.z = da.buildingWithPorchesDimensions().northEdge, new THREE.Vector3), r = new THREE.Vector3; i.getCenter(r), i.getSize(n); let e, t; switch (E.userData.view) { case "Front": e = { view: "Front", dx: 0, dy: 0, dz: 1, width: n.x, height: n.y }, t = { x: THREE.Math.degToRad(90), y: 0, z: 0 }; break; case "Back": e = { view: "Back", dx: 0, dy: 0, dz: -1, width: n.x, height: n.y }, t = { x: THREE.Math.degToRad(-90), y: 0, z: 0 }; break; case "Left": e = { view: "Left", dx: -1, dy: 0, dz: 0, width: n.z, height: n.y }, t = { x: 0, y: 0, z: THREE.Math.degToRad(90) }; break; case "Right": e = { view: "Right", dx: 1, dy: 0, dz: 0, width: n.z, height: n.y }, t = { x: 0, y: 0, z: THREE.Math.degToRad(-90) }; break; default: e = { view: "Top", dx: 1e-5, dy: 1, dz: 0, width: n.z, height: n.x }, t = { x: 0, y: 0, z: 0 } } E.position.set(r.x + e.dx * n.x, r.y + e.dy * n.y, r.z + e.dz * n.z), H.target.set(r.x, r.y, r.z), "Top" !== e.view ? E.far = E.position.distanceTo(j.position) + .1 : E.far = 1e3, C.rotation.set(t.x, t.y, t.z), j.rotation.set(t.x, t.y, t.z); E.zoom = Math.min(v.clientHeight / (e.height + 100), v.clientWidth / (e.width + 100)), E.updateProjectionMatrix() } else { var i = new THREE.Vector3(1.25 * da.width, da.height + 0, 1.25 * da.depth), r = new THREE.Vector3(0, da.height / 2, 0), s = new THREE.Vector3(ia.getObjectByName("foundation").position.x, 50, ia.getObjectByName("foundation").position.z), l = new THREE.Vector3(ia.getObjectByName("foundation").position.x, 0, ia.getObjectByName("foundation").position.z); !1 !== a && (M == S ? i.set(a.x, a.y, a.z) : M == E && (s.set(a.x, a.y, a.z), l.set(a.x, 0, a.z))), !1 !== o && (M == S ? r.set(o.x, o.y, o.z) : M == E && l.set(o.x, 0, o.z)), !0 === e ? (c = new TWEEN.Tween(S.position).to(i, t).easing(TWEEN.Easing.Quartic.Out).onUpdate(e => { G = !0 }).start(), c = new TWEEN.Tween(P.target).to(r, t).easing(TWEEN.Easing.Quartic.Out).onUpdate(e => { G = !0 }).start(), c = new TWEEN.Tween(E.position).to(s, t).easing(TWEEN.Easing.Quartic.Out).onUpdate(e => { G = !0 }).start(), c = new TWEEN.Tween(H.target).to(l, t).easing(TWEEN.Easing.Quartic.Out).onUpdate(e => { G = !0 }).start(), c = new TWEEN.Tween(E).to({ zoom: 1 }, t).easing(TWEEN.Easing.Quartic.Out).onUpdate(e => { G = !0 }).start()) : "instant" === e && (S.position.set(i.x, i.y, i.z), P.target.set(r.x, r.y, r.z), E.position.set(s.x, s.y, s.z), H.target.set(l.x, l.y, l.z), E.zoom = 1, Ho(), E.updateProjectionMatrix(), W.render(ia, M)) } $("#guiInOut span.property-name").text("Look Inside"), 6 == (we += 1) ? (we = 0, gi()) : setTimeout(function() { 0 < we && --we }, 2500) } function yo() { "Look Inside" === $("#guiInOut span.property-name").text() ? (M == S ? bo(!0, 1e3, { x: 0, y: 5, z: 5 }, { x: 0, y: da.height / 2, z: 0 }) : (Eo("3dView"), bo("instant", 0, { x: 0, y: 5, z: 5 }, { x: 0, y: da.height / 2, z: 0 })), $("#guiInOut span.property-name").text("Go Outside")) : (M == S && bo(!0, 1e3, { x: 1.25 * da.width, y: da.height + 0, z: 1.25 * da.depth }, { x: 0, y: da.height / 2, z: 0 }), $("#guiInOut span.property-name").text("Look Inside")) } function fo() { 1 == confirm("Are you sure you want to erase your building and start over?") && (window.location = window.location.pathname) } function wo(e) { e = e || !1; var t = $("#navHideWalls"); 3 == da.hideWalls && !e || "showWalls" === e ? (ia.traverse(function(t) { if (t instanceof THREE.Mesh && (t.name.startsWith("roof") || "building" === t.name || "leanTo1" === t.name || "leanTo2" === t.name || "leanTo3" === t.name || "leanTo4" === t.name) || t.name.startsWith("perimeterWall") || t.name.startsWith("ceiling")) if (t.material.length) for (let e = 0; e < t.material.length; e++)(t.material[e].name.startsWith("BuildingCeiling") || t.material[e].name.startsWith("BuildingRoof") || "BuildingWalls" === t.material[e].name.substring(0, 13) || "BuildingWainscot" === t.material[e].name.substring(0, 16) || "LeantoWalls" === t.material[e].name.substring(0, 11) || "LeantoWainscot" === t.material[e].name.substring(0, 14) || t.material[e].name.startsWith("BuildingSoffit") || t.material[e].name.startsWith("BuildingTrim") || t.material[e].name.startsWith("BuildingRidgeCap") || t.material[e].name.startsWith("interiorWall")) && (t.material[e].visible = !0); else t.name.startsWith("ceiling") && (t.material.visible = !0) }), da.hideWalls = 0, t.text("Hide Walls")) : (ia.traverse(function(t) { if (t instanceof THREE.Mesh && ("building" === t.name || "leanTo1" === t.name || "leanTo2" === t.name || "leanTo3" === t.name || "leanTo4" === t.name || "downspout-clone" === t.name || t.name.startsWith("perimeterWall"))) if (t.material.length) for (let e = 0; e < t.material.length; e++)(t.material[e].name.startsWith("BuildingWalls") || "BuildingWainscot" === t.material[e].name.substring(0, 16) || "LeantoWalls" === t.material[e].name.substring(0, 11) || "LeantoWainscot" === t.material[e].name.substring(0, 14) || t.material[e].name.startsWith("BuildingTrim") || t.material[e].name.startsWith("BuildingTrim-Base") || t.material[e].name.startsWith("interiorWall")) && (t.material[e].visible = !1); else "Downspouts" === t.material.name && (t.material.visible = !1) }), 0 == da.hideWalls || "hideWalls" == e ? (da.hideWalls = 1, t.text("Hide Roof")) : 1 == da.hideWalls || "hideRoof" == e ? (da.hideWalls = 2, t.text("Hide Girts"), ia.traverse(function(t) { if (t instanceof THREE.Mesh && (t.name.startsWith("roof") || "building" === t.name || "leanTo1" === t.name || "leanTo2" === t.name || "leanTo3" === t.name || "leanTo4" === t.name || t.name.startsWith("ceiling"))) if (t.material.length) for (let e = 0; e < t.material.length; e++)(t.material[e].name.startsWith("BuildingCeiling") || t.material[e].name.startsWith("BuildingRoof") || t.material[e].name.startsWith("BuildingSoffit") || t.material[e].name.startsWith("BuildingTrim") || t.material[e].name.startsWith("BuildingRidgeCap") || t.material[e].name.startsWith("LeantoCeiling") || t.material[e].name.startsWith("Gutters")) && (t.material[e].visible = !1); else t.name.startsWith("ceiling") && (t.material.visible = !1) })) : (da.hideWalls = 3, t.text("Show Walls"), ha.getObjectByName("GirtParent").visible = !1, ha.getObjectByName("PurlinParentR").visible = !1, ha.getObjectByName("PurlinParentL").visible = !1)), x() } function vo() { ia.traverse(function(t) { if (t instanceof THREE.Mesh && ("ceiling" === t.name || "postLogo" === t.name || t.name.startsWith("Truss") || t.name.startsWith("Webbing") || "roofL" === t.name || "roofR" === t.name || "leanTo1Roof" === t.name || "leanTo2Roof" === t.name || "leanTo3Roof" === t.name || "leanTo4Roof" === t.name || "TrussMasterL" === t.name || "TrussMasterR" === t.name || "Framing" === t.name) && (t.visible = !1), t instanceof THREE.Mesh && ("building" === t.name || "leanTo1" === t.name || "leanTo2" === t.name || "leanTo3" === t.name || "leanTo4" === t.name)) for (let e = 0; e < t.material.length; e++) "LeantoCeiling" !== t.material[e].name && "BuildingCeiling" !== t.material[e].name && "BuildingCeilingRight-Interior" !== t.material[e].name && "BuildingCeilingLeft-Interior" !== t.material[e].name || (t.material[e].visible = !1) }), ha.getObjectByName("GirtParent").visible = !1, ha.getObjectByName("PurlinParentR").visible = !1, ha.getObjectByName("PurlinParentL").visible = !1, ha.visible = !1, da.hideWalls = 3 } function Eo(e, t) { e = e || !1, t = t || !0, "UserCamera" === M.name && !1 === e || "3dView" !== e ? (M = E, $("#guiTopView span.property-name").text("3D View"), E.userData.view = e, da.hideWalls = 1, wo(), x(), W.shadowMap.enabled = !1, ne.visible = !1, da.ground = "None", ai(), $("#guiHideWalls").addClass("disabled")) : (M = S, $("#guiTopView span.property-name").text("Top View"), t && (P.target.set(0, da.height / 2, 0), M.position.set(1.25 * da.width, da.height + 0, 1.25 * da.depth)), $("#guiInOut span.property-name").text("Look Inside"), $("#guiHideWalls").removeClass("disabled"), C.rotation.set(0, 0, 0), j.rotation.set(0, 0, 0), W.shadowMap.enabled = !0, da.hideWalls = 0, wo(), x()), $("#guiInOut span.property-name").text("Look Inside"), t && bo("instant"), _o(!0) } function Po() { var e, t, a, o, i, n, r, s; null != T && $("#popup").is(":visible") && (s = Oo(), t = (e = document.getElementById("line")).getContext("2d"), r = s.x, s = s.y, a = e.offsetWidth, o = e.offsetHeight, (i = (i = new THREE.Vector3).setFromMatrixPosition(T.matrixWorld)).y < .5 && (i.y = 3), "Driveway" === T.name && (i.y = 0), i.project(M), r = r / 2, s = s / 2, n = v.getBoundingClientRect(), i.x = i.x * r + r + n.left, i.y = -i.y * s + s + n.top, i.z = 0, r = $("#popup").offset().left + $("#popup").outerWidth() / 2, s = $("#popup").offset().top + $("#popup").outerHeight(), e.width = a, e.height = o, t.clearRect(0, 0, a, o), t.lineWidth = 2, t.strokeStyle = "#4AFF64", t.beginPath(), t.moveTo(i.x, i.y), t.lineTo(r, s), t.stroke()) } function Do(e, t) { t = t || 1; var a = Math.floor(Math.abs(e)), o = 12 * (Math.abs(e) - a); 12 <= (o = 0 !== t ? Math.round(o * t) / t : o) && (o -= 12, a += 1), e < 0 && (a = -a, o = -o); let i = ""; return 0 !== a && (i += a + "'"), 0 !== o && (i += " " + o + '"'), { feet: a, inches: o, friendly: i } } function Mo() { if (T) { let e = T.position.x; var t, a, o, i, n; if (T.rotation.y, T.rotation.y.toFixed(2) != Math.PI.toFixed(2) && "porchS-clone" != T.name || (e = -e), T.rotation.y.toFixed(2) != (Math.PI / 2).toFixed(2) && "porchW-clone" != T.name || (e = -T.position.z), T.rotation.y.toFixed(2) != (Math.PI / -2).toFixed(2) && "porchE-clone" != T.name || (e = T.position.z), T.name.startsWith("interior") ? (e = T.position.x, l = Do(T.userData.toNorthWall(), 1), $("#popup #zPosFt").val(l.feet), $("#popup #zPosIn").val(l.inches), $("#zpos").is(":hidden") && $("#zpos").show()) : $("#zpos").is(":visible") && $("#zpos").hide(), T.name.startsWith("interiorWall") ? ($("#popup #wallMaterial option[value='" + T.userData.material + "']").prop("selected", !0), $("#wallMaterialRow").is(":hidden") && $("#wallMaterialRow").show()) : $("#wallMaterialRow").is(":visible") && $("#wallMaterialRow").hide(), "scal" !== T.name.substring(0, 4) && "porchWrap" !== T.name.substring(0, 9) ? (h = Do(e, 1), $("#popup #xPosFt").val(h.feet), $("#popup #xPosIn").val(h.inches), $("#xpos").is(":hidden") && $("#xpos").show()) : $("#xpos").is(":visible") && $("#xpos").hide(), T.name.startsWith("walk") || T.name.startsWith("window") || T.name.startsWith("garage") && da.settings.hasOwnProperty("variableLargeDoorSizes") && !da.settings.variableLargeDoorSizes) { r = T.morphTargetInfluences[T.morphTargetDictionary.width], s = T.morphTargetInfluences[T.morphTargetDictionary.height]; let e, t = []; T.name.startsWith("walk") ? (r = parseFloat(r) + 3, s = parseFloat(s) + 7, e = Math.round(12 * r) + "x" + Math.round(12 * s), t = ["36x80", "48x80"], T.name.startsWith("walkDoorAllGlass") && (t = ["36x84", "48x84"]), T.name.startsWith("walkDoorFramedOpening") && (t = ["36x72", "36x84", "48x72", "48x84", "48x96"]), T.name.endsWith("Double-clone") && (t = ["72x80"]), T.name.startsWith("walkDoorEquine") && (e = "48x82", t = ["48x82"]), $("#popup #size").empty(), t.forEach(function(e) { $("#popup #size").append('") }), $("#popup #size option[value='" + e + "']").prop("selected", !0)) : T.name.startsWith("window") ? (r = Math.round(10 * parseFloat(r)) / 10 + 1, s = Math.round(10 * parseFloat(s)) / 10 + 1, e = r + "x" + s, currentValueStringConvertedToInches = Math.round(12 * r) + "x" + Math.round(12 * s), T.name.startsWith("windowPicture") && (t = ["2x6", "3x3", "3x4", "4x3", "4x4", "5x4", "6x3"]), T.name.startsWith("windowSlider") && (t = ["3x3", "3x4", "4x2", "4x3", "4x4", "5x3", "5x4", "6x3", "6x4"]), T.name.startsWith("windowHopper") && (t = ["2x6", "3x4"]), T.name.startsWith("windowDoubleHung") && (t = ["3x3", "3x4", "3x5", "4x6"]), T.name.startsWith("windowSingleHung") && (t = ["3x4", "3x5"]), T.name.startsWith("windowSlope") && (t = ["3x3", "3x4", "4x3", "4x4", "5x3", "5x4", "6x3", "6x4", "8x3", "8x4", "10x3", "10x4"]), T.name.startsWith("windowLouver") && (t = ["2x2", "4x2"]), T.name.startsWith("windowFramedOpening") && (t = ["2x3", "2x4", "2x5", "3x3", "3x4", "3x5", "3x6", "4x3", "4x4", "4x5", "4x6", "5x3", "5x4", "5x5", "5x6", "5x7"]), $("#popup #size").empty(), t.forEach(function(e) { $("#popup #size").append('") }), t.includes(e) ? $("#popup #size option[value='" + e + "']").prop("selected", !0) : t.includes(currentValueStringConvertedToInches) ? $("#popup #size option[value='" + currentValueStringConvertedToInches + "']").prop("selected", !0) : console.log("Window size not valid"), i = Math.floor(r), n = Math.round(12 * (r - i)), $("#popup #xScaFt").val(i), $("#popup #xScaIn").val(n), a = Math.floor(s), l = Math.round(12 * (s - a)), $("#popup #yScaFt").val(a), $("#popup #yScaIn").val(l), $("#xsca").is(":hidden") && $("#xsca").show(), $("#ysca").is(":hidden") && $("#ysca").show(), $("#xsca .inches").is(":hidden") && $("#xsca .inches").show(), $("#ysca .inches").is(":hidden") && $("#ysca .inches").show()) : T.name.startsWith("garage") && (r = Math.round(10 * parseFloat(r)) / 10 + 1, s = Math.round(10 * parseFloat(s)) / 10 + 1, e = r + "x" + s, T.name.startsWith("garage") && (t = ["8x8", "9x8", "10x8", "16x7", "16x8", "10x10", "10x12", "12x12", "12x14", "14x12", "14x14"]), T.name.startsWith("garageOverhead") && (t = ["8x8", "9x8", "10x8", "16x7", "16x8", "10x10", "10x12", "12x12", "12x14", "14x12", "14x14"]), T.name.startsWith("garageRollUp") && (t = ["8x8", "9x7", "9x8", "16x8", "10x10", "10x12", "12x12", "12x14", "14x12", "14x14"]), T.name.startsWith("garageFramedOpen") && (t = ["8x8", "9x8", "10x8", "16x7", "16x8", "10x10", "10x12", "12x12", "12x14", "14x12", "14x14", "16x16", "18x16"]), $("#popup #size").empty(), t.forEach(function(e) { $("#popup #size").append('") }), $("#popup #size option[value='" + e + "']").prop("selected", !0)), $("#sizeRow").is(":hidden") && $("#sizeRow").show() } else $("#sizeRow").is(":visible") && $("#sizeRow").hide(); if (T.name.startsWith("interior") || "porc" === T.name.substring(0, 4) || "walk" === T.name.substring(0, 4) || "gara" === T.name.substring(0, 4) || "scal" === T.name.substring(0, 4) ? $("#ypos").is(":visible") && $("#ypos").hide() : (h = Do(T.position.y, 1), $("#popup #yPosFt").val(h.feet), $("#popup #yPosIn").val(h.inches), $("#ypos").is(":hidden") && $("#ypos").show()), "walk" !== T.name.substring(0, 4) && !T.name.startsWith("interiorDoor") || T.name.startsWith("walkDoorFramedOpening") ? $("#doorSwingButton").is(":visible") && $("#doorSwingButton").hide() : $("#doorSwingButton").is(":hidden") && $("#doorSwingButton").show(), T.name.startsWith("interior") || T.name.startsWith("scale") && !T.name.startsWith("scale-driveway") ? $("#rotateRow").is(":hidden") && $("#rotateRow").show() : $("#rotateRow").is(":visible") && $("#rotateRow").hide(), "porchWrap" === T.name.substring(0, 9) ? $("#zsca").is(":hidden") && $("#zsca").show() : $("#zsca").is(":visible") && $("#zsca").hide(), "porc" === T.name.substring(0, 4)) { var r = T.morphTargetInfluences[T.morphTargetDictionary.width], s = T.morphTargetInfluences[T.morphTargetDictionary.height], l = T.morphTargetInfluences[T.morphTargetDictionary.slope], h = T.morphTargetInfluences[T.morphTargetDictionary.ceilingHeight] + 10, c = T.morphTargetInfluences[T.morphTargetDictionary.porchDepth] + 10, d = 12 * l / c + 3.5, p = 12 * T.morphTargetInfluences[T.morphTargetDictionary.Overhang], m = T.morphTargetInfluences[T.morphTargetDictionary.miters], g = !1, u = !1; r = Math.round(100 * parseFloat(r)) / 100 + 10, s = Math.round(100 * parseFloat(s)) / 100 + 13.5 + l, m = .5 < m; for (let e = 0; e < T.material.length; e++) "PorchPosts" === T.material[e].name && (g = T.material[e].color.getHex() != At.getHex() && T.material[e].color.getHex() != Vt.getHex()), "PorchPostsMetal" === T.material[e].name && (u = T.material[e].visible); r < -.2 && (r = -.2), s < -.4 && (s = -.4), i = Math.floor(r), n = Math.round(12 * (r - i)), $("#popup #xScaFt").val(i), $("#popup #xScaIn").val(n), a = Math.floor(s), l = Math.round(12 * (s - a)), $("#popup #yScaFt").val(a), $("#popup #yScaIn").val(l), $("#xsca").is(":hidden") && $("#xsca").show(), $("#ysca").is(":hidden") && $("#ysca").show(), $("#xsca .inches").is(":hidden") && $("#xsca .inches").show(), $("#ysca .inches").is(":hidden") && $("#ysca .inches").show(), $("#popup #ceilingHeight option[value='" + h + "']").prop("selected", !0), $("#popup #porchDepth option[value='" + c + "']").prop("selected", !0), $("#popup #porchPitch option[value='" + d + "']").prop("selected", !0), $("#popup #porchOverhang option[value='" + p + "']").prop("selected", !0), $("#popup #miter").prop("checked", m), $("#popup #wrap").prop("checked", g), $("#popup #posts").prop("checked", u), da.allowLeanToCeilingHeight ? $("#ceilingHeightRow").show() : $("#ceilingHeightRow").hide(), $("#porchPitchRow").is(":hidden") && $("#porchPitchRow").show(), $("#porchDepthRow").is(":hidden") && $("#porchDepthRow").show(), $("#porchOverhangRow").is(":hidden") && $("#porchOverhangRow").show(), $("#popup #miterRow").is(":hidden") && $("#popup #miterRow").show(), $("#popup #wrapRow").is(":hidden") && $("#popup #wrapRow").show(), $("#popup #postsRow").is(":hidden") && $("#popup #postsRow").show(), $("#porchOverhangRow").is(":visible") && $("#porchOverhangRow").hide(), $("#popup #miterRow").is(":visible") && $("#popup #miterRow").hide(), $("#popup #wrapRow").is(":visible") && $("#popup #wrapRow").hide(), $("#popup #postsRow").is(":visible") && $("#popup #postsRow").hide(), "porchWrap" === T.name.substring(0, 9) ? (t = T.morphTargetInfluences[T.morphTargetDictionary.depth], (t = Math.round(100 * parseFloat(t)) / 100 + 10) < -.2 && (t = -.2), o = Math.floor(t), l = Math.round(12 * (t - o)), $("#popup #zScaFt").val(o), $("#popup #zScaIn").val(l), $("#zsca").is(":hidden") && $("#zsca").show(), $("#zsca .inches").is(":hidden") && $("#zsca .inches").show()) : $("#zsca").is(":visible") && $("#zsca").hide() } else "gara" === T.name.substring(0, 4) ? (r = T.morphTargetInfluences[T.morphTargetDictionary.width], s = T.morphTargetInfluences[T.morphTargetDictionary.height], (r = Math.round(2e3 * parseFloat(r)) / 100 + 10) < -.2 && (r = -.2), (s = Math.round(1e3 * parseFloat(s)) / 100 + 10) < -.4 && (s = -.4), da.settings.hasOwnProperty("variableLargeDoorSizes") && !da.settings.variableLargeDoorSizes || (i = Math.floor(r), $("#popup #xScaFt").val(i), a = Math.floor(s), $("#popup #yScaFt").val(a), $("#xsca").is(":hidden") && $("#xsca").show(), $("#ysca").is(":hidden") && $("#ysca").show()), $("#xsca .inches").is(":visible") && $("#xsca .inches").hide(), $("#ysca .inches").is(":visible") && $("#ysca .inches").hide()) : T.name.startsWith("mansard") ? (r = T.morphTargetInfluences[T.morphTargetDictionary.width], t = T.morphTargetInfluences[T.morphTargetDictionary.depth], (r = T.name.startsWith("mansardHip") ? Math.round(100 * parseFloat(r)) / 100 + 5 : Math.round(100 * parseFloat(r)) / 100 + 1) < 0 && (r = 0), (t = Math.round(100 * parseFloat(t)) / 100 + 2) < 0 && (t = 0), i = Math.floor(r), o = Math.floor(t), $("#popup #xScaFt").val(i), $("#popup #zScaFt").val(o), $("#xsca").is(":hidden") && $("#xsca").show(), $("#zsca").is(":hidden") && $("#zsca").show(), $("#ysca").is(":hidden") && $("#ysca").hide(), $("#xsca .inches").is(":visible") && $("#xsca .inches").hide(), $("#ysca .inches").is(":visible") && $("#ysca .inches").hide(), $("#zsca .inches").is(":visible") && $("#zsca .inches").hide()) : ("interiorWall-clone" === T.name ? (h = T.scale.x, i = Math.floor(h), n = Math.round(12 * (h - i)), $("#popup #xScaFt").val(i), $("#popup #xScaIn").val(n), $("#xsca").is(":hidden") && $("#xsca").show(), $("#xsca .inches").is(":hidden") && $("#xsca .inches").show()) : T.name.startsWith("window") ? ($("#xsca").is(":hidden") && $("#xsca").show(), $("#ysca").is(":hidden") && $("#ysca").show()) : ($("#xsca").is(":visible") && $("#xsca").hide(), $("#ysca").is(":visible") && $("#ysca").hide(), $("#zsca").is(":visible") && $("#zsca").hide())), $("#ceilingHeightRow").is(":visible") && $("#ceilingHeightRow").hide(), $("#porchPitchRow").is(":visible") && $("#porchPitchRow").hide(), $("#porchDepthRow").is(":visible") && $("#porchDepthRow").hide(), $("#porchOverhangRow").is(":visible") && $("#porchOverhangRow").hide(), $("#popup #miterRow").is(":visible") && $("#popup #miterRow").hide(), $("#popup #wrapRow").is(":visible") && $("#popup #wrapRow").hide(), $("#popup #postsRow").is(":visible") && $("#popup #postsRow").hide(); if ("scal" == T.name.substring(0, 4) ? $("#updateItemButton").is(":visible") && $("#updateItemButton").hide() : $("#updateItemButton").is(":hidden") && $("#updateItemButton").show(), "lean" == T.name.substring(0, 4) ? $("#popup #enclosedRow").is(":hidden") && $("#popup #enclosedRow").show() : $("#popup #enclosedRow").is(":visible") && $("#popup #enclosedRow").hide(), !T.name.startsWith("window") || T.name.startsWith("windowFramedOpening") || T.name.startsWith("windowLouver") || T.name.startsWith("windowSlope")) $("#popup #gridRow").is(":visible") && $("#popup #gridRow").hide(), $("#popup #shuttersRow").is(":visible") && $("#popup #shuttersRow").hide(); else { $("#popup #gridRow").is(":hidden") && $("#popup #gridRow").show(), $("#popup #shuttersRow").is(":hidden") && $("#popup #shuttersRow").show(); let t, a; for (let e = 0; e < T.material.length; e++) "WindowGrid" === T.material[e].name && (t = T.material[e].visible), "Shutters" === T.material[e].name && (a = T.material[e].visible); $("#popup #grid").prop("checked", t), $("#popup #shutters").prop("checked", a) } } } function Wo(e) { e = e || !1; var t, a, o, i, n, r = 0, s = 0, l = 0, h = 0, c = 0; if ($("#popup #porchDepthRow").is(":visible") && !isNaN(parseFloat($("#popup #porchDepth option:selected").val())) && (i = parseFloat($("#popup #porchDepth option:selected").val()), T.userData.porchDepth = i, "porch" === T.name.substring(0, 5)) && (T.morphTargetInfluences[T.morphTargetDictionary.porchDepth] = i - 10), $("#popup #porchPitchRow").is(":visible") && !isNaN(parseFloat($("#popup #porchPitch option:selected").val())) && (n = parseFloat($("#popup #porchPitch option:selected").val()), T.name.startsWith("porch")) && (c = (n - 3.5) / 12 * i, T.userData.porchPitch = n, T.morphTargetInfluences[T.morphTargetDictionary.slope] = c), $("#popup #xpos").is(":visible") && !isNaN(parseFloat($("#popup #xPosIn").val())) && (i = parseFloat($("#popup #xPosFt").val()) + parseFloat($("#popup #xPosIn").val() / 12), T.name.startsWith("interior") ? (T.userData.toBuildingCenter = i, T.position.x = i, T.userData.position.x = i) : (0 == T.rotation.y && "porchS-clone" !== T.name && "porchE-clone" !== T.name && "porchW-clone" !== T.name && (T.position.x = i, T.userData.position.x = i), T.rotation.y.toFixed(2) != Math.PI.toFixed(2) && "porchS-clone" != T.name || (T.position.x = -i, T.userData.position.x = -i), T.rotation.y.toFixed(2) != (Math.PI / 2).toFixed(2) && "porchW-clone" != T.name || (T.position.z = -i, T.userData.position.z = -i), T.rotation.y.toFixed(2) != (Math.PI / -2).toFixed(2) && "porchE-clone" != T.name || (T.position.z = i, T.userData.position.z = i))), !$("#popup #zpos").is(":visible") || isNaN(parseFloat($("#popup #zPosFt").val())) || isNaN(parseFloat($("#popup #zPosIn").val())) || (n = parseFloat($("#popup #zPosFt").val()) + parseFloat($("#popup #zPosIn").val() / 12), T.name.startsWith("interior") && T.userData.toNorthWall(n)), !$("#popup #ypos").is(":visible") || isNaN(parseFloat($("#popup #yPosFt").val())) || isNaN(parseFloat($("#popup #yPosIn").val())) || (i = parseFloat($("#popup #yPosFt").val()) + parseFloat($("#popup #yPosIn").val() / 12), T.position.y = i, T.userData.position.y = i), $("#popup #sizeRow").is(":visible") && (n = $("#popup #size").val().split("x"), r = parseFloat(n[0]), T.name.startsWith("window") ? (20 < r && (r /= 12), T.morphTargetInfluences[T.morphTargetDictionary.width] = r - 1, T.userData.scale.x = r, T.name.startsWith("windowSlope") && (T.morphTargetInfluences[T.morphTargetDictionary.slope] = da.roofPitch / 12 * r)) : T.name.startsWith("walk") && (r = parseFloat((r / 12).toFixed(2)), T.morphTargetInfluences[T.morphTargetDictionary.width] = 4 < r ? r - 6 : r - 3, T.userData.scale.x = r), 1 < n.length) && (s = parseFloat(n[1]), T.name.startsWith("window") ? (20 < s && (s /= 12), T.morphTargetInfluences[T.morphTargetDictionary.height] = s - 1) : T.name.startsWith("walk") && (s = parseFloat((s / 12).toFixed(2)), T.morphTargetInfluences[T.morphTargetDictionary.height] = s - 7), T.userData.scale.y = s), $("#popup #xsca").is(":visible") && !isNaN(parseFloat($("#popup #xScaFt").val())) && (r = parseFloat($("#popup #xScaFt").val()), $("#popup #xScaIn").is(":visible") && !isNaN(parseFloat($("#popup #xScaIn").val())) && (r += parseFloat($("#popup #xScaIn").val() / 12)), T.name.startsWith("window") && (6 < (r = r < 3 ? 3 : r) && (r = 6), T.morphTargetInfluences[T.morphTargetDictionary.width] = r - 1), "gara" === T.name.substring(0, 4) && (r = Math.round(r), T.name.startsWith("garageSlide") ? (r = r < 8 ? 8 : r) > Math.min(da.width / 2, 24) && (r = Math.min(da.width / 2, 24)) : T.name.startsWith("garageBiFold") || T.name.startsWith("garageHydraulic") ? (r = r < 8 ? 8 : r) > da.width - 4 && (r = da.width - 4) : 24 < (r = r < 8 ? 8 : r) && (r = 24), T.morphTargetInfluences[T.morphTargetDictionary.width] = (r - 10) / 20), "porc" === T.name.substring(0, 4) && (T.morphTargetInfluences[T.morphTargetDictionary.width] = r - 10), T.name.startsWith("mansard") ? T.name.startsWith("mansardHip") ? (r < 5 && (r = 5), T.morphTargetInfluences[T.morphTargetDictionary.width] = r - 5) : (r < 3 && (r = 3), T.morphTargetInfluences[T.morphTargetDictionary.width] = r - 1) : T.name.startsWith("interiorWall") && (T.scale.x = r), T.userData.width = r, T.userData.scale.x = r), $("#popup #ysca").is(":visible") && !isNaN(parseFloat($("#popup #yScaFt").val())) && (s = parseFloat($("#popup #yScaFt").val()), isNaN(parseFloat($("#popup #yScaIn").val())) || (s += parseFloat($("#popup #yScaIn").val() / 12)), T.name.startsWith("window") && (5 < (s = s < 3 ? 3 : s) && (s = 5), T.morphTargetInfluences[T.morphTargetDictionary.height] = s - 1), "gara" === T.name.substring(0, 4) && (s = Math.round(s), T.name.startsWith("garageSlide") || T.name.startsWith("garageBiFold") || T.name.startsWith("garageHydraulic") ? (s = 28 < (s = s < 7 ? 7 : s) ? 28 : s) > da.roofHeightAtX(T.position.x) - 1 && (s = da.roofHeightAtX(T.position.x) - 1) : (s = 20 < (s = s < 7 ? 7 : s) ? 20 : s) > da.roofHeightAtX(T.position.x) - 2 && (s = da.roofHeightAtX(T.position.x) - 2), T.morphTargetInfluences[T.morphTargetDictionary.height] = (s - 10) / 10), "porc" === T.name.substring(0, 4) && (s > da.height && (s = da.height), T.morphTargetInfluences[T.morphTargetDictionary.height] = s - 13.5 - c), T.userData.height = s, T.userData.scale.y = s), !$("#popup #zsca").is(":visible") || isNaN(parseFloat($("#popup #zScaFt").val())) || isNaN(parseFloat($("#popup #zScaIn").val())) || (l = parseFloat($("#popup #zScaFt").val()) + parseFloat($("#popup #zScaIn").val() / 12), "porchWrap" === T.name.substring(0, 9) && (T.morphTargetInfluences[T.morphTargetDictionary.depth] = l - 10), T.name.startsWith("mansard") && (3 < (l = l < 2 ? 2 : l) && (l = 3), T.morphTargetInfluences[T.morphTargetDictionary.depth] = l - 2), T.userData.depth = l, T.userData.scale.z = l), $("#popup #wallMaterialRow").is(":visible") && (T.userData.material = $("#popup #wallMaterial option:selected").val(), io()), $("#popup #gridRow").is(":visible")) { t = $("#popup #grid").is(":checked"); for (let e = 0; e < T.material.length; e++) "WindowGrid" === T.material[e].name && (T.material[e].visible = t) } if ($("#popup #shuttersRow").is(":visible")) { a = $("#popup #shutters").is(":checked"); for (let e = 0; e < T.material.length; e++) "Shutters" === T.material[e].name && (T.material[e].visible = a, T.morphTargetInfluences[T.morphTargetDictionary.hideShutters] = 0 == a ? 1 : 0) } if ($("#popup #miterRow").is(":visible") && (i = $("#popup #miter").is(":checked"), T.userData.postMiter = i, T.morphTargetInfluences[T.morphTargetDictionary.miters] = !0 === i ? 1 : 0), $("#popup #wrapRow").is(":visible")) if (n = $("#popup #wrap").is(":checked"), !0 === (T.userData.postWrap = n)) for (let e = 0; e < T.material.length; e++) "PorchPosts" === T.material[e].name && (T.material[e].color.setStyle(F.filter(e => e.name === da.trimColor).map(e => e.hex)), T.material[e].specular.setHex(3947580), T.material[e].shininess.value = 40); else for (let e = 0; e < T.material.length; e++) "PorchPosts" === T.material[e].name && (T.material[e].color.copy(At), T.material[e].specular.setHex(5394505), T.material[e].shininess.value = 15); if ($("#popup #postsRow").is(":visible")) { o = $("#popup #posts").is(":checked"), T.userData.posts = o; for (let e = 0; e < T.material.length; e++) "PorchPosts" !== T.material[e].name && "PorchPostsMetal" !== T.material[e].name || !da.settings.woodenPorchPosts && "PorchPostsMetal" !== T.material[e].name || (T.material[e].visible = o) } $("#popup #porchOverhangRow").is(":visible") && (r = parseFloat($("#popup #porchOverhang option:selected").val()) / 12, T.userData.porchOverhang = parseFloat($("#popup #porchOverhang option:selected").val()) / 12, "porch" === T.name.substring(0, 5)) && (T.morphTargetInfluences[T.morphTargetDictionary.Overhang] = r), da.allowLeanToCeilingHeight && $("#popup #ceilingHeightRow").is(":visible") ? (h = parseFloat($("#popup #ceilingHeight option:selected").val()) - 10, T.userData.ceilingHeight = parseFloat($("#popup #ceilingHeight option:selected").val()), "porch" === T.name.substring(0, 5) && (T.morphTargetInfluences[T.morphTargetDictionary.ceilingHeight] = h)) : !da.allowLeanToCeilingHeight && T.name.startsWith("porch") && (h = s - T.userData.porchDepth * T.userData.porchPitch / 12 - .25, T.userData.ceilingHeight = h, T.morphTargetInfluences[T.morphTargetDictionary.ceilingHeight] = h - 10 - 4 / 12), "porch" === T.name.substring(0, 5) && (Aa(T.name), qa(T)), Go(T), e && xo(), G = !0 } function xo() { ve = T, T = null, $("#popup").hide(), $("#line").hide() } function Oo() { let e = 1, t = 1; return void 0 !== v && (e = v.clientWidth, t = v.clientHeight), { x: e, y: t, aspectRatio: e / t } } function Ro() { var e = document.getElementById("help"), t = document.getElementById("overlay"); 0 < e.style.opacity ? (t.style.pointerEvents = "none", e.style.pointerEvents = "none", t.style.opacity = 0, e.style.opacity = 0, t.style.display = "none", e.style.display = "none") : (t.style.display = "block", e.style.display = "block", t.style.pointerEvents = "auto", e.style.pointerEvents = "auto", t.style.opacity = .8, e.style.opacity = 1) } function Bo() { var e = document.getElementById("help"), t = document.getElementById("overlay"); t.style.pointerEvents = "none", e.style.pointerEvents = "none", t.style.opacity = 0, e.style.opacity = 0, t.style.display = "none", e.style.display = "none" } function So() { var t = "", a = "ACDEFHJKLMNPQRTUVWXYabcdefghijkmnpqrstuvwxy3479_-", o = 12 + Math.floor(4 * Math.random()); for (let e = 0; e < o; e++) t += a.charAt(Math.floor(Math.random() * a.length)); return t } function Ho() { var e, t, a, o, i, n, r; E.hasOwnProperty("left") && M == E && (e = Oo(), a = (t = da.buildingWithPorchesDimensions()).northEdge + 20, o = t.eastEdge - 20, i = t.southEdge - 20, n = t.westEdge + 20, r = t.center, (t.depth + 40) / (t.width + 40) > e.aspectRatio ? (E.left = -a, E.right = -i, E.top = (Math.abs(a) + Math.abs(i)) / e.aspectRatio / 2 + r.y, E.bottom = -((Math.abs(a) + Math.abs(i)) / e.aspectRatio) / 2 - r.y) : (E.top = -o, E.bottom = -n, E.left = -((Math.abs(o) + Math.abs(n)) * e.aspectRatio) / 2 - r.y, E.right = (Math.abs(o) + Math.abs(n)) * e.aspectRatio / 2 + r.y)) } function No() { for (; de.children.length;) de.remove(de.children[0]); It = !1 } function Lo(t) { if (t = t || !1, 2 !== It) { var a = ia.getObjectByName("measureMarker").clone(), o = zo(12); if (a.visible = !0, a.name = "measurementStart-" + o, a.userData.id = o, a.userData.point = "start", a.userData.distance = 0, a.userData.otherEndPoint = null, a.userData.line = null, a.userData.text = null, Fo(a), a.position.set(0, -2, 0), !(It = !0) !== t) { It = 2, o = t.userData.id, a.name = "measurementEnd-" + o, a.userData.point = "end", a.userData.otherEndPoint = t, Sa = !0, t.userData.otherEndPoint = a; var i = new THREE.LineBasicMaterial({ color: 16776960, linewidth: 2 }), n = new THREE.Geometry, r = (n.vertices.push(new THREE.Vector3(t.position.x, t.position.y, t.position.z)), n.vertices.push(new THREE.Vector3(t.position.x, t.position.y, t.position.z)), new THREE.Line(n, i)); r.frustumCulled = !1, a.userData.line = r, t.userData.line = r, de.add(r), n = new THREE.PlaneGeometry(1, 1, 1), i = new THREE.MeshBasicMaterial({ color: "#FFFFFF", name: "text" }); let e = new THREE.Mesh(n, i); e.name = "measurementText-" + o, e.userData.startingPoint = t, e.userData.endingPoint = a, e.userData.line = r, e.position.set(0, 1.1, 0), e.onBeforeRender = function() { e.quaternion.copy(M.quaternion) }, de.add(e), jo(0, e), a.userData.text = e, t.userData.text = e } de.add(a), ve = T, T = a } else It = !1 } function Co(e) { var t, a; null !== e.userData.otherEndPoint && (a = e.userData.line, t = e.userData.otherEndPoint, a.geometry.vertices[0].set(e.position.x, e.position.y, e.position.z), a.geometry.vertices[1].set(t.position.x, t.position.y, t.position.z), a.geometry.verticesNeedUpdate = !0, a.geometry.lineDistancesNeedUpdate = !0, a = Math.round(100 * t.position.distanceTo(e.position)) / 100, e.userData.distance = a, jo(t.userData.distance = a, e.userData.text)) } function jo(t, a) { "number" == typeof t ? t = hi(t) : "boolean" == typeof t && (t = t ? "true" : "false"), (new THREE.FontLoader).load("fonts/helvetiker_regular.typeface.json", function(e) { e = new THREE.TextGeometry(t + "'", { font: e, size: 1, height: 0, curveSegments: 2, bevelEnabled: !1 }); e.center(), a.hasOwnProperty("parent") && a.parent === de && (a.geometry.dispose(), a.geometry = e) }), a.position.set((a.userData.startingPoint.position.x + a.userData.endingPoint.position.x) / 2, 1.1, (a.userData.startingPoint.position.z + a.userData.endingPoint.position.z) / 2) } function zo(e, t) { (!e || e < 12) && (e = 12), t = t || 4, e += Math.floor(Math.random() * t); t = Date.now().toString().replace(/.(.)?/g, "$1").split("").join(""); let a = Math.floor(1e3 + 9e3 * Math.random()).toString().substring(0, 4) + t.substr(t.length - 4); for (var o = "ACDEFHJKLMNPQRTUVWXYabcdefghijkmnpqrstuvwxy3479", i = o.length, n = 8; n <= e; n++) a += o.charAt(Math.floor(Math.random() * i)); return a = a.split("").sort(function() { return .5 - Math.random() }).join("") } function Io() { ia.traverse(function(e) { e instanceof THREE.BoxHelper && (e.name.startsWith("itemBoundingBox") && e.parent !== T && 0 !== e.material.opacity ? (e.material.color.set(13421772), e.material.opacity = 0, G = !0) : e.name.startsWith("itemBoundingBox") && e.parent === T && (e.material.color.set(65280), e.material.opacity = 1, Ha) && (G = !0)) }) } function Fo(e) { var t = new THREE.Vector3, a = (t.copy(e.scale), e.scale.set(1, 1, 1), new THREE.BoxHelper(e)), o = (a.material.depthTest = !1, a.renderOrder = 1, a.material.color.set(13421772), a.material.transparent = !0, a.material.opacity = 1, a.material.linewidth = 3, a.name = "itemBoundingBox", e.add(a), (new THREE.Box3).setFromObject(e)), i = o.max.x - o.min.x, n = o.max.y - o.min.y, r = o.max.z - o.min.z, s = (o.max.x + o.min.x) / 2, l = (o.max.y + o.min.y) / 2, o = (o.max.z + o.min.z) / 2, i = new THREE.BoxGeometry(i, n, r), n = new THREE.MeshBasicMaterial({ color: 16711680 }), r = new THREE.Mesh(i, n); r.position.set(s, l, o), r.name = "itemSelectionBox", r.material.transparent = !0, r.material.opacity = 0, (r.userData.object = e).add(r), La.push(r), e.userData.hasBoundingBox = !0, e.userData.boundingBox = a, e.userData.selectionBox = r, ve = T, (T = e).scale.copy(t), Io() } function ko(e) { e.userData.hasBoundingBox && (e.userData.boundingBox.material.opacity = 1, e === T ? e.userData.boundingBox.material.color.set(65280) : e.userData.boundingBox.material.color.set(65535)), G = !0 } function Go(o) { if (o && o.userData.hasBoundingBox && !o.name.startsWith("measure") && !o.name.startsWith("interiorWall-clone") && !o.name.startsWith("interiorDoor-clone")) { var i, n = o.userData.boundingBox, s = o.userData.selectionBox; let e = s.position.x, t = s.position.y, a = s.position.z; if (n.parent = na, s.parent = na, o.hasOwnProperty("morphTargetInfluences") && 0 < o.morphTargetInfluences.length && !o.name.startsWith("porch")) { var l = o.morphTargetInfluences, h = [], c = new THREE.Vector3; let r = new THREE.Vector3; if ("BufferGeometry" === o.geometry.type) { var d = o.geometry.morphAttributes.position, p = o.geometry.attributes.position.array, m = p.length / 3; for (let n = 0; n < m; n++) { var g = new THREE.Vector3; r.set(p[3 * n], p[3 * n + 1], p[3 * n + 2]); let a = 0, o = 0, i = 0; for (let e = 0, t = d.length; e < t; e++) { var u = l[e]; 0 !== u && (a += u * (d[e].array[3 * n] - r.x), o += u * (d[e].array[3 * n + 1] - r.y), i += u * (d[e].array[3 * n + 2] - r.z)) } g.set(p[3 * n] + a, p[3 * n + 1] + o, p[3 * n + 2] + i), h.push(g) } } else { var T = o.geometry.morphTargets; for (let a = 0; a < o.geometry.vertices.length; a++) { var b = new THREE.Vector3; r = o.geometry.vertices[a], b = o.geometry.vertices[a]; for (let e = 0, t = T.length; e < t; e++) { var y, f = l[e]; 0 !== f && (y = T[e].vertices, b.addScaledVector(c.subVectors(y[a], r), f)) } h.push(b) } } var w = (new THREE.Box3).setFromPoints(h), v = w.max.x - w.min.x, E = w.max.y - w.min.y, P = w.max.z - w.min.z, w = (e = (w.max.x + w.min.x) / 2, t = (w.max.y + w.min.y) / 2, a = (w.max.z + w.min.z) / 2, new THREE.BoxGeometry(v, E, P)); s.geometry = w, n.setFromObject(o.userData.selectionBox), s.parent = o, n.parent = o, s.position.set(e, t, a) } else o.name.startsWith("porchWrap") ? (v = new THREE.Vector3(0, 0, 0), E = o.userData.width + o.userData.porchOverhang + o.userData.porchDepth, P = o.userData.height - o.userData.ceilingHeight, w = o.userData.depth + o.userData.porchOverhang + o.userData.porchDepth, i = new THREE.Vector3(E, P, w), (new THREE.Box3).setFromCenterAndSize(v, i), e = i.x / -2 + o.userData.porchDepth + o.userData.porchOverhang / 2, t = (o.userData.height - o.userData.ceilingHeight) / 2 + o.userData.ceilingHeight, a = i.z / -2 + o.userData.porchDepth + o.userData.porchOverhang / 2, v = new THREE.BoxGeometry(E, P, w), s.geometry = v, s.position.set(e, t, a), n.setFromObject(o.userData.selectionBox), s.parent = o, n.parent = o, s.position.set(e, t, a)) : o.name.startsWith("porch") && (i = new THREE.Vector3(0, 0, 0), E = new THREE.Vector3(o.userData.width + o.userData.porchOverhang, o.userData.height - o.userData.ceilingHeight, o.userData.porchDepth + o.userData.porchOverhang), w = (P = (new THREE.Box3).setFromCenterAndSize(i, E)).max.x - P.min.x, v = P.max.y - P.min.y, i = P.max.z - P.min.z, e = 0, t = (o.userData.height - o.userData.ceilingHeight) / 2 + o.userData.ceilingHeight, a = (o.userData.porchDepth + o.userData.porchOverhang) / 2, E = new THREE.BoxGeometry(w, v, i), s.geometry = E, s.position.set(e, t, a), n.setFromObject(o.userData.selectionBox), s.parent = o, n.parent = o, s.position.set(e, t, a)) } } function $o(e) { Go(e), e && e.userData.hasBoundingBox && (Io(), e.userData.boundingBox.material.opacity = 1, e === T ? e.userData.boundingBox.material.color.set(65280) : e.userData.boundingBox.material.color.set(65535)), G = !0 } function _o(e = !1) { var t = v.clientWidth, a = v.clientHeight; v.width === t && v.height === a && !e || (W.setSize(t, a, !1), M.aspect = t / a, M.updateProjectionMatrix(), Ho(), E.updateProjectionMatrix(), G = !0) } function qo() { var k, G, $, _, i, n, q, A, V = da.maxTrussSpacing, U = da.height, Q = 0; da.height; let r, X, Y; if ("Single Slope" === da.roofType ? (da.height, U += da.width * Math.abs(da.roofPitch) / 12, Q = da.width * Math.abs(da.roofPitch) / 12, n = -(i = k = Math.atan(da.width / Q)), da.roofPitch < 0 && (i = -k, n = k), q = (s = Math.sqrt(Math.pow(Q, 2) + Math.pow(da.width, 2))) / 2, A = s / 2) : "Asymmetrical" === da.roofType ? (da.asymmetrical, !da.settings.allowZeroPitchRoof && da.roofPitch < .5 && (da.roofPitch = .5), !da.settings.allowZeroPitchRoof && (.5 < da.roofPitch || da.roofPitch < -.5) && (da.roofPitch = Math.round(da.roofPitch)), $ = da.width / 2 + da.asymmetrical, _ = da.width / 2 - da.asymmetrical, Q = Math.max($, _) * da.roofPitch / 12, i = Math.atan($ / Q), n = Math.atan(_ / Q), q = Math.sqrt(Math.pow(Q, 2) + Math.pow($, 2)), A = Math.sqrt(Math.pow(Q, 2) + Math.pow(_, 2))) : (!da.settings.allowZeroPitchRoof && da.roofPitch < .5 && (da.roofPitch = .5), !da.settings.allowZeroPitchRoof && (.5 < da.roofPitch || da.roofPitch < -.5) && (da.roofPitch = Math.round(da.roofPitch)), Q = da.width / 2 * da.roofPitch / 12, n = i = k = Math.atan(da.width / 2 / Q), Math.atan(da.eavePitchL / 12), Math.atan(da.eavePitchR / 12), q = s = Math.sqrt(Math.pow(Q, 2) + Math.pow(da.width / 2, 2)), A = s, da.leanTo2 && (da.leanTo2Depth, Math.tan(Math.atan(da.leanTo2Pitch / 12))), da.leanTo4 && (da.leanTo4Depth, Math.tan(Math.atan(da.leanTo4Pitch / 12)))), void 0 !== pa.getObjectByName("RigidFramingClones") && Qo(pa.getObjectByName("RigidFramingClones")), void 0 !== ia.getObjectByName("SteelTrussFramingClones") && Qo(ga.getObjectByName("SteelTrussFramingClones")), void 0 !== ia.getObjectByName("PostFrameClones") && Qo(Ta.getObjectByName("PostFrameClones")), void 0 !== ia.getObjectByName("HybridFrameClones") && Qo(ya.getObjectByName("HybridFrameClones")), void 0 !== ia.getObjectByName("OpenWebFrameClones") && Qo(wa.getObjectByName("OpenWebFrameClones")), void 0 !== ia.getObjectByName("RigidFramingParent") && (ia.getObjectByName("RigidFramingParent").visible = !1), void 0 !== ia.getObjectByName("SteelTrussFramingParent") && (ia.getObjectByName("SteelTrussFramingParent").visible = !1), void 0 !== ia.getObjectByName("PostFrameParent") && (ia.getObjectByName("PostFrameParent").visible = !1), "Rigid" == da.frameType) { (ha = pa).visible = !0; var s = ma, Z = 0, l = ("Asymmetrical" === da.roofType && (Z = da.asymmetrical), .175), J = .66, K = da.width / -2 + l - Z, ee = da.width / -2 + l + Z, te = da.wallHeightL() - .5, ae = da.wallHeightR() - .5, h = 2, oe = (h = da.width < 25 ? 1.23 : h, (Math.PI - i) / 2), ie = (Math.PI - n) / 2, ne = h / Math.sin(oe), re = h / Math.sin(ie), se = Math.sqrt(Math.pow(ne, 2) - Math.pow(h, 2)), le = Math.sqrt(Math.pow(re, 2) - Math.pow(h, 2)), he = Math.sqrt(Math.pow(te - se, 2) + Math.pow(h - J, 2)), ce = Math.sqrt(Math.pow(ae - le, 2) + Math.pow(h - J, 2)), de = (Math.atan(se / ne), Math.atan(le / re), Math.acos((te - se) / he), Math.acos((ae - le) / ce), Math.abs(K) / Math.sin(i)), pe = Math.abs(ee) / Math.sin(n), me = (Math.abs(K), Math.sin(i), Math.abs(ee), Math.sin(n), Math.abs(h) / Math.sin(i)), ge = Math.abs(h) / Math.sin(n), c = s.getObjectByName("columnSideL"), d = 1.5, p = (da.settings.ridgidFrameStraightColumns && (d = .6), c.position.x = da.width / -2 + l, d / Math.tan(i)), m = d / Math.tan(n), g = (da.settings.ridgidFrameStraightColumns ? c.morphTargetInfluences[c.morphTargetDictionary.height] = te - 1 : c.morphTargetInfluences[c.morphTargetDictionary.height] = te - 1.1, c.morphTargetInfluences[c.morphTargetDictionary.slantTop] = p, (c = s.getObjectByName("columnSideR")).position.x = da.width / 2 - l, da.settings.ridgidFrameStraightColumns ? c.morphTargetInfluences[c.morphTargetDictionary.height] = ae - 1 : c.morphTargetInfluences[c.morphTargetDictionary.height] = ae - 1.1, c.morphTargetInfluences[c.morphTargetDictionary.slantTop] = m, c.material.color.copy(Ea), void 0 !== ia.getObjectByName("downspout") && void 0 !== s.getObjectByName("columnSideL") && void 0 !== s.getObjectByName("columnSideR") && void 0 === s.getObjectByName("columnSideL").getObjectByName("downspout-clone") && void 0 === s.getObjectByName("columnSideR").getObjectByName("downspout-clone") && ((E = ia.getObjectByName("downspout").clone()).name = "downspout-clone", E.visible = !0, E.castShadow = !0, E.receiveShadow = !0, E.rotation.y = THREE.Math.degToRad(180), E.position.x = -l, s.getObjectByName("columnSideL").add(E), s.getObjectByName("columnSideR").add(E.clone())), da.gutters && (g = s.getObjectByName("columnSideL").getObjectByName("downspout-clone"), u = s.getObjectByName("columnSideR").getObjectByName("downspout-clone"), g.morphTargetInfluences[g.morphTargetDictionary.height] = da.height - 1.2 - da.eaveL / Math.hypot(12, da.roofPitch) * da.roofPitch, u.morphTargetInfluences[u.morphTargetDictionary.height] = da.height - 1.2 - da.eaveR / Math.hypot(12, da.roofPitch) * da.roofPitch, g.morphTargetInfluences[g.morphTargetDictionary.downspoutOverhang] = da.eaveL / Math.hypot(12, da.roofPitch) * 12, u.morphTargetInfluences[u.morphTargetDictionary.downspoutOverhang] = da.eaveR / Math.hypot(12, da.roofPitch) * 12, 0 < da.hideWalls ? (g.visible = !1, u.visible = !1) : ("Single Slope" != da.roofType || "Single Slope" == da.roofType && 0 < da.roofPitch ? g.visible = !0 : g.visible = !1, "Single Slope" != da.roofType || "Single Slope" == da.roofType && da.roofPitch < 0 ? u.visible = !0 : u.visible = !1)), s.getObjectByName("beamRoofL")), u = Math.abs(K) - d, T = da.width / -2 + l + d, p = te + p, ue = u / Math.tan(i); g.position.x = T, g.position.y = p, g.morphTargetInfluences[g.morphTargetDictionary.length] = u - 1, g.morphTargetInfluences[g.morphTargetDictionary.slantTop] = ue, "Single Slope" != da.roofType ? (g = s.getObjectByName("beamRoofR"), u = Math.abs(ee) - d, T = da.width / 2 - l - d, p = ae + m, ue = u / Math.tan(n), g.visible = !0, g.position.x = T, g.position.y = p, g.morphTargetInfluences[g.morphTargetDictionary.length] = u - 1, g.morphTargetInfluences[g.morphTargetDictionary.slantTop] = ue) : (ue = (u *= 2) / Math.tan(i), g.morphTargetInfluences[g.morphTargetDictionary.length] = u - 1, g.morphTargetInfluences[g.morphTargetDictionary.slantTop] = ue, (g = ha.getObjectByName("beamRoofR")).visible = !1), (B = new THREE.Group).name = "RigidFramingClones", ha.add(B), ca = Vo(da.maxTrussSpacing, l, s, B), void 0 !== ia.getObjectByName("LeanTo1PostClones") && ia.getObjectByName("leanTo1").remove(ia.getObjectByName("LeanTo1PostClones")), void 0 !== ia.getObjectByName("LeanTo2PostClones") && ia.getObjectByName("leanTo2").remove(ia.getObjectByName("LeanTo2PostClones")), void 0 !== ia.getObjectByName("LeanTo3PostClones") && ia.getObjectByName("leanTo3").remove(ia.getObjectByName("LeanTo3PostClones")), void 0 !== ia.getObjectByName("LeanTo4PostClones") && ia.getObjectByName("leanTo4").remove(ia.getObjectByName("LeanTo4PostClones")); let e, t; if (void 0 !== s.getObjectByName("columnSide") && (e = s.getObjectByName("columnSide")), void 0 !== s.getObjectByName("beamRoof") && (t = s.getObjectByName("beamRoof")), void 0 !== ia.getObjectByName("downspout") && void 0 === e.getObjectByName("downspout-clone") && ((E = ia.getObjectByName("downspout").clone()).name = "downspout-clone", E.visible = !0, E.castShadow = !0, E.receiveShadow = !0, e.add(E)), 0 < da.settings.postsOnGableRoofOverhangsOver) { if (da.gableFront > da.settings.postsOnGableRoofOverhangsOver) { if ((clonedFrame = s.clone()).name = "OverhangFrontFrame", clonedFrame.position.z = da.depth / 2 + da.gableFront - l - .5, B.add(clonedFrame), da.settings.enclosedGableRoofOverhangTriangles) { let e; void 0 === na.getObjectByName("overhangEnclosureFront") ? (m = na.getObjectByName("coveredGableExtension"), (e = m.deepClone()).name = "overhangEnclosureFront", e.frustumCulled = !1, na.add(e)) : e = na.getObjectByName("overhangEnclosureFront"), e.position.z = da.depth / 2, e.visible = !0, e.morphTargetInfluences[e.morphTargetDictionary.width] = da.width - 1, e.morphTargetInfluences[e.morphTargetDictionary.depth] = da.gableFront - 1, e.morphTargetInfluences[e.morphTargetDictionary.height] = da.height - 1, e.morphTargetInfluences[e.morphTargetDictionary.unEnclosedHeight] = da.height - .85, e.morphTargetInfluences[e.morphTargetDictionary.roofPeak] = da.width / 2 * da.roofPitch / 12, e.material.forEach(function(e) { e.name.startsWith("BuildingWainscot") && (e.visible = !1), e.name.startsWith("BuildingTrim-Base") && (e.visible = !1) }) } } else void 0 !== na.getObjectByName("overhangEnclosureFront") && (na.getObjectByName("overhangEnclosureFront").visible = !1); if (da.gableBack > da.settings.postsOnGableRoofOverhangsOver) { if ((clonedFrame = s.clone()).name = "OverhangBackFrame", clonedFrame.position.z = da.depth / -2 - da.gableBack + l + .5, B.add(clonedFrame), da.settings.enclosedGableRoofOverhangTriangles) { let e; void 0 === na.getObjectByName("overhangEnclosureBack") ? (T = na.getObjectByName("coveredGableExtension"), (e = T.deepClone()).name = "overhangEnclosureBack", e.frustumCulled = !1, na.add(e)) : e = na.getObjectByName("overhangEnclosureBack"), e.position.z = da.depth / -2, e.rotation.y = Math.PI, e.visible = !0, e.morphTargetInfluences[e.morphTargetDictionary.width] = da.width - 1, e.morphTargetInfluences[e.morphTargetDictionary.depth] = da.gableBack - 1, e.morphTargetInfluences[e.morphTargetDictionary.height] = da.height - 1, e.morphTargetInfluences[e.morphTargetDictionary.unEnclosedHeight] = da.height - .85, e.morphTargetInfluences[e.morphTargetDictionary.roofPeak] = da.width / 2 * da.roofPitch / 12, e.material.forEach(function(e) { e.name.startsWith("BuildingWainscot") && (e.visible = !1), e.name.startsWith("BuildingTrim-Base") && (e.visible = !1) }) } } else void 0 !== na.getObjectByName("overhangEnclosureBack") && (na.getObjectByName("overhangEnclosureBack").visible = !1) } var Te = ia.getObjectByName("masterSecondaryFramingPiece"); if (Te.material.color.copy(Ea), da.leanTo1) { void 0 === ia.getObjectByName("LeanTo1PostClones") && ((S = new THREE.Group).name = "LeanTo1PostClones", S.rotation.y = 0, ia.getObjectByName("leanTo1").add(S), (H = new THREE.Group).name = "LeanTo1PostMaster", S.add(H)); (E = e.clone()).name = "LeanToPost", E.visible = !0, E.castShadow = !0, E.receiveShadow = !0, E.position.set(0, 0, da.leanTo1Depth - l - .08), E.morphTargetInfluences[E.morphTargetDictionary.height] = da.leanTo1Height - da.leanTo1Depth * da.leanTo1Pitch / 12 - .5 - 1, E.rotation.y = Math.PI / 2, H.add(E); p = E.getObjectByName("downspout-clone"); p && (p.position.x = -l - .08, p.rotation.y = Math.PI, p.morphTargetInfluences[p.morphTargetDictionary.height] = da.leanTo1Height - da.leanTo1Depth * da.leanTo1Pitch / 12 - 1); (E = t.clone()).name = "LeanToRoofBeam", E.visible = !0, E.castShadow = !0, E.receiveShadow = !0, E.position.set(0, da.leanTo1Height - da.leanTo1Depth * da.leanTo1Pitch / 12 - l, da.leanTo1Depth - l - .08), E.scale.x = da.leanTo1Depth / Math.cos((da.leanTo1Pitch - .5) / 12) - .5, E.rotation.y = Math.PI / 2, E.rotation.z = Math.atan(da.leanTo1Pitch / 12), H.add(E); var b = da.leanTo1Length / 2 - l - .08, y = da.leanTo1Length / -2 + l + .08, f = Math.ceil((b - y) / V); H.position.x = b; for (var w = 1; w <= f; w++)(r = ia.getObjectByName("LeanTo1PostMaster").clone()).name = "LeanToTrussClone", r.position.x = b - w * (b - y) / f, da.gutters && da.settings.downspountsOnEndsOnly && w < f && (r.getObjectByName("LeanToPost").getObjectByName("downspout-clone").visible = !1), S.add(r); if (da.leanTo1Enclosed && "Fully Enclosed" == da.leanTo1Walls) for (var w = 0, be = da.leanTo1Height - da.leanTo1Depth * da.leanTo1Pitch / 12; w < da.leanTo1Height / da.girtSpacing;) w < be / da.girtSpacing ? ((E = Te.clone()).position.set(0, w * da.girtSpacing + .05, da.leanTo1Depth - l / 2), E.rotation.y = Math.PI / 2, E.scale.z = da.leanTo1Length, E.scale.y = da.girtThickness, da.hideWalls < 3 ? E.visible = !0 : E.visible = !1, S.add(E), (E = Te.clone()).position.set(da.leanTo1Length / 2 - l / 2, w * da.girtSpacing + .05, da.leanTo1Depth / 2 - .2), E.rotation.y = 0, E.scale.z = da.leanTo1Depth, E.scale.y = da.girtThickness, da.hideWalls < 3 ? E.visible = !0 : E.visible = !1, S.add(E), (E = Te.clone()).position.set(da.leanTo1Length / -2 + l / 2, w * da.girtSpacing + .05, da.leanTo1Depth / 2 - .2), E.rotation.y = 0, E.scale.z = da.leanTo1Depth) : (I = (w * da.girtSpacing - da.leanTo1Height) / (da.leanTo1Pitch / 12) + 1, (E = Te.clone()).position.set(da.leanTo1Length / 2 - l / 2, w * da.girtSpacing + .05, I / -2 - .2), E.rotation.y = 0, E.scale.z = I, E.scale.y = da.girtThickness, da.hideWalls < 3 ? E.visible = !0 : E.visible = !1, S.add(E), (E = Te.clone()).position.set(da.leanTo1Length / -2 + l / 2, w * da.girtSpacing + .05, I / -2 - .2), E.rotation.y = 0, E.scale.z = I), E.scale.y = da.girtThickness, da.hideWalls < 3 ? E.visible = !0 : E.visible = !1, S.add(E), w++ } if (da.leanTo3) { void 0 === ia.getObjectByName("LeanTo3PostClones") && ((N = new THREE.Group).name = "LeanTo3PostClones", N.rotation.y = Math.PI, ia.getObjectByName("leanTo3").add(N), (L = new THREE.Group).name = "LeanTo3PostMaster", N.add(L)); (E = e.clone()).name = "LeanToPost", E.visible = !0, E.castShadow = !0, E.receiveShadow = !0, E.position.set(0, 0, da.leanTo3Depth - l - .08), E.morphTargetInfluences[E.morphTargetDictionary.height] = da.leanTo3Height - da.leanTo3Depth * da.leanTo3Pitch / 12 - .5 - 1, E.rotation.y = Math.PI / 2, L.add(E); m = E.getObjectByName("downspout-clone"); m && (m.position.x = -l - .08, m.rotation.y = Math.PI, m.morphTargetInfluences[m.morphTargetDictionary.height] = da.leanTo3Height - da.leanTo3Depth * da.leanTo3Pitch / 12 - 1); b = ((E = t.clone()).name = "LeanToRoofBeam", E.visible = !0, E.castShadow = !0, E.receiveShadow = !0, E.position.set(0, da.leanTo3Height - da.leanTo3Depth * da.leanTo3Pitch / 12 - l, da.leanTo3Depth - l - .08), E.scale.x = da.leanTo3Depth / Math.cos((da.leanTo3Pitch - .5) / 12) - .5, E.rotation.y = Math.PI / 2, E.rotation.z = Math.atan(da.leanTo3Pitch / 12), L.add(E), da.leanTo3Length / 2 - l - .08), y = da.leanTo3Length / -2 + l + .08, f = Math.ceil((b - y) / V); L.position.x = b; for (w = 1; w <= f; w++)(r = ia.getObjectByName("LeanTo3PostMaster").clone()).name = "LeanToTrussClone", r.position.x = b - w * (b - y) / f, da.gutters && da.settings.downspountsOnEndsOnly && w < f && (r.getObjectByName("LeanToPost").getObjectByName("downspout-clone").visible = !1), N.add(r); if (da.leanTo3Enclosed && "Fully Enclosed" == da.leanTo3Walls) for (var w = 0, ye = da.leanTo3Height - da.leanTo3Depth * da.leanTo3Pitch / 12; w < da.leanTo3Height / da.girtSpacing;) w < ye / da.girtSpacing ? ((E = Te.clone()).position.set(0, w * da.girtSpacing + .05, da.leanTo3Depth - l / 2), E.rotation.y = Math.PI / 2, E.scale.z = da.leanTo3Length, E.scale.y = da.girtThickness, da.hideWalls < 3 ? E.visible = !0 : E.visible = !1, N.add(E), (E = Te.clone()).position.set(da.leanTo3Length / 2 - l / 2, w * da.girtSpacing + .05, da.leanTo3Depth / 2 - .2), E.rotation.y = 0, E.scale.z = da.leanTo3Depth, E.scale.y = da.girtThickness, da.hideWalls < 3 ? E.visible = !0 : E.visible = !1, N.add(E), (E = Te.clone()).position.set(da.leanTo3Length / -2 + l / 2, w * da.girtSpacing + .05, da.leanTo3Depth / 2 - .2), E.rotation.y = 0, E.scale.z = da.leanTo3Depth) : (I = (w * da.girtSpacing - da.leanTo3Height) / (da.leanTo3Pitch / 12) + 1, (E = Te.clone()).position.set(da.leanTo3Length / 2 - l / 2, w * da.girtSpacing + .05, I / -2 - .2), E.rotation.y = 0, E.scale.z = I, E.scale.y = da.girtThickness, da.hideWalls < 3 ? E.visible = !0 : E.visible = !1, N.add(E), (E = Te.clone()).position.set(da.leanTo3Length / -2 + l / 2, w * da.girtSpacing + .05, I / -2 - .2), E.rotation.y = 0, E.scale.z = I), E.scale.y = da.girtThickness, da.hideWalls < 3 ? E.visible = !0 : E.visible = !1, N.add(E), w++ } if (da.leanTo2) { void 0 === ia.getObjectByName("LeanTo2PostClones") && ((C = new THREE.Group).name = "LeanTo2PostClones", C.rotation.y = Math.PI / -2, ia.getObjectByName("leanTo2").add(C), (j = new THREE.Group).name = "LeanTo2PostMaster", C.add(j)); (E = e.clone()).name = "LeanToPost", E.visible = !0, E.castShadow = !0, E.receiveShadow = !0, E.position.set(0, 0, da.leanTo2Depth - l - .08), E.morphTargetInfluences[E.morphTargetDictionary.height] = da.leanTo2Height - da.leanTo2Depth * da.leanTo2Pitch / 12 - .5 - 1, E.rotation.y = Math.PI / 2, j.add(E); s = E.getObjectByName("downspout-clone"); s && (s.position.x = -l - .08, s.rotation.y = Math.PI, s.morphTargetInfluences[s.morphTargetDictionary.height] = da.leanTo2Height - da.leanTo2Depth * da.leanTo2Pitch / 12 - 1); b = ((E = t.clone()).name = "LeanToRoofBeam", E.visible = !0, E.castShadow = !0, E.receiveShadow = !0, E.position.set(0, da.leanTo2Height - da.leanTo2Depth * da.leanTo2Pitch / 12 - l, da.leanTo2Depth - l - .08), E.scale.x = da.leanTo2Depth / Math.cos((da.leanTo2Pitch - .5) / 12) - .5, E.rotation.y = Math.PI / 2, E.rotation.z = Math.atan(da.leanTo2Pitch / 12), j.add(E), da.leanTo2Length / 2 - l - .08), y = da.leanTo2Length / -2 + l + .08, f = Math.ceil((b - y) / V); j.position.x = b; for (w = 1; w <= f; w++)(r = ia.getObjectByName("LeanTo2PostMaster").clone()).name = "LeanToTrussClone", r.position.x = b - w * (b - y) / f, da.gutters && da.settings.downspountsOnEndsOnly && w < f && (r.getObjectByName("LeanToPost").getObjectByName("downspout-clone").visible = !1), C.add(r); if (da.leanTo2Enclosed && "Fully Enclosed" == da.leanTo2Walls) for (var w = 0, fe = da.leanTo2Height - da.leanTo2Depth * da.leanTo2Pitch / 12; w < da.leanTo2Height / da.girtSpacing;) w < fe / da.girtSpacing ? ((E = Te.clone()).position.set(0, w * da.girtSpacing + .05, da.leanTo2Depth - l / 2), E.rotation.y = Math.PI / 2, E.scale.z = da.leanTo2Length, E.scale.y = da.girtThickness, da.hideWalls < 3 ? E.visible = !0 : E.visible = !1, C.add(E), (E = Te.clone()).position.set(da.leanTo2Length / 2 - l / 2, w * da.girtSpacing + .05, da.leanTo2Depth / 2 - .2), E.rotation.y = 0, E.scale.z = da.leanTo2Depth, E.scale.y = da.girtThickness, da.hideWalls < 3 ? E.visible = !0 : E.visible = !1, C.add(E), (E = Te.clone()).position.set(da.leanTo2Length / -2 + l / 2, w * da.girtSpacing + .05, da.leanTo2Depth / 2 - .2), E.rotation.y = 0, E.scale.z = da.leanTo2Depth) : (I = (w * da.girtSpacing - da.leanTo2Height) / (da.leanTo2Pitch / 12) + 1, (E = Te.clone()).position.set(da.leanTo2Length / 2 - l / 2, w * da.girtSpacing + .05, I / -2 - .2), E.rotation.y = 0, E.scale.z = I, E.scale.y = da.girtThickness, da.hideWalls < 3 ? E.visible = !0 : E.visible = !1, C.add(E), (E = Te.clone()).position.set(da.leanTo2Length / -2 + l / 2, w * da.girtSpacing + .05, I / -2 - .2), E.rotation.y = 0, E.scale.z = I), E.scale.y = da.girtThickness, da.hideWalls < 3 ? E.visible = !0 : E.visible = !1, C.add(E), w++ } if (da.leanTo4) { void 0 === ia.getObjectByName("LeanTo4PostClones") && ((z = new THREE.Group).name = "LeanTo4PostClones", z.rotation.y = Math.PI / 2, ia.getObjectByName("leanTo4").add(z), (Vt = new THREE.Group).name = "LeanTo4PostMaster", z.add(Vt)); (E = e.clone()).name = "LeanToPost", E.visible = !0, E.castShadow = !0, E.receiveShadow = !0, E.position.set(0, 0, da.leanTo4Depth - l - .08), E.morphTargetInfluences[E.morphTargetDictionary.height] = da.leanTo4Height - da.leanTo4Depth * da.leanTo4Pitch / 12 - .5 - 1, E.rotation.y = Math.PI / 2, Vt.add(E); T = E.getObjectByName("downspout-clone"); T && (T.position.x = -l - .08, T.rotation.y = Math.PI, T.morphTargetInfluences[T.morphTargetDictionary.height] = da.leanTo4Height - da.leanTo4Depth * da.leanTo4Pitch / 12 - 1); b = ((E = t.clone()).name = "LeanToRoofBeam", E.visible = !0, E.castShadow = !0, E.receiveShadow = !0, E.position.set(0, da.leanTo4Height - da.leanTo4Depth * da.leanTo4Pitch / 12 - l, da.leanTo4Depth - l - .08), E.scale.x = da.leanTo4Depth / Math.cos((da.leanTo4Pitch - .5) / 12) - .5, E.rotation.y = Math.PI / 2, E.rotation.z = Math.atan(da.leanTo4Pitch / 12), Vt.add(E), da.leanTo4Length / 2 - l - .08), y = da.leanTo4Length / -2 + l + .08, f = Math.ceil((b - y) / V); Vt.position.x = b; for (w = 1; w <= f; w++)(r = ia.getObjectByName("LeanTo4PostMaster").clone()).name = "LeanToTrussClone", r.position.x = b - w * (b - y) / f, da.gutters && da.settings.downspountsOnEndsOnly && w < f && (r.getObjectByName("LeanToPost").getObjectByName("downspout-clone").visible = !1), z.add(r); if (da.leanTo4Enclosed && "Fully Enclosed" == da.leanTo4Walls) for (var w = 0, we = da.leanTo4Height - da.leanTo4Depth * da.leanTo4Pitch / 12; w < da.leanTo4Height / da.girtSpacing;) w < we / da.girtSpacing ? ((E = Te.clone()).position.set(0, w * da.girtSpacing + .05, da.leanTo4Depth - l / 2), E.rotation.y = Math.PI / 2, E.scale.z = da.leanTo4Length, E.scale.y = da.girtThickness, da.hideWalls < 3 ? E.visible = !0 : E.visible = !1, z.add(E), (E = Te.clone()).position.set(da.leanTo4Length / 2 - l / 2, w * da.girtSpacing + .05, da.leanTo4Depth / 2 - .2), E.rotation.y = 0, E.scale.z = da.leanTo4Depth, E.scale.y = da.girtThickness, da.hideWalls < 3 ? E.visible = !0 : E.visible = !1, z.add(E), (E = Te.clone()).position.set(da.leanTo4Length / -2 + l / 2, w * da.girtSpacing + .05, da.leanTo4Depth / 2 - .2), E.rotation.y = 0, E.scale.z = da.leanTo4Depth) : (I = (w * da.girtSpacing - da.leanTo4Height) / (da.leanTo4Pitch / 12) + 1, (E = Te.clone()).position.set(da.leanTo4Length / 2 - l / 2, w * da.girtSpacing + .05, I / -2 - .2), E.rotation.y = 0, E.scale.z = I, E.scale.y = da.girtThickness, da.hideWalls < 3 ? E.visible = !0 : E.visible = !1, z.add(E), (E = Te.clone()).position.set(da.leanTo4Length / -2 + l / 2, w * da.girtSpacing + .05, I / -2 - .2), E.rotation.y = 0, E.scale.z = I), E.scale.y = da.girtThickness, da.hideWalls < 3 ? E.visible = !0 : E.visible = !1, z.add(E), w++ } var ve = da.girtSpacing, Ee = da.purlinSpacing; (F = new THREE.Group).name = "GirtParent", B.add(F), 2 < da.hideWalls ? F.visible = !1 : F.visible = !0, (Kt = new THREE.Group).name = "PurlinParentL", Kt.position.set(da.width / -2 + l + .1, te, 0), Kt.rotation.z = Math.PI / 2 - i, da.roofPitch < 0 && (Kt.rotation.z = Math.PI / -2 - i), F.add(Kt); (aa = new THREE.Group).name = "PurlinParentR", aa.position.set(da.width / 2 - l - .1, ae, 0), aa.rotation.z = n - Math.PI / -2, da.roofPitch < 0 && (aa.rotation.z = n - Math.PI / 2), F.add(aa); var Pe = da.depth - l; let a = Pe, o = 0; 0 < da.settings.postsOnGableRoofOverhangsOver && (da.gableFront > da.settings.postsOnGableRoofOverhangsOver && (a += da.gableFront - .5, o += da.gableFront / 2), da.gableBack > da.settings.postsOnGableRoofOverhangsOver) && (a += da.gableBack - .5, o -= da.gableBack / 2); for (var v = ia.getObjectByName("masterSecondaryFramingPiece").clone(), w = 0; w < q / Ee;) { var E = v.clone(); let e = 0; da.flushPurlins || da.standingPurlins ? (da.flushPurlins && (e = da.purlinThickness / 2 + .0625), da.standingPurlins && (e = 0), "Single Slope" === da.roofType && (e = 0 <= da.roofPitch ? da.purlinThickness / 2 + .1 : da.purlinThickness / 2 + .2)) : (E.rotation.z = Math.PI / 2, e = 0, "Single Slope" === da.roofType && (e = 0 <= da.roofPitch ? .1 : .2)), E.position.set(w * Ee, l / 2 - e, o), E.scale.y = da.purlinThickness, E.scale.z = a, E.rotation.y = 0, E.visible = !0, Kt.add(E), w++ } for (w = 0; w < A / Ee;) { E = v.clone(); let e; da.flushPurlins || da.standingPurlins ? (da.flushPurlins && (e = da.purlinThickness / 2 + .0625), da.standingPurlins && (e = 0), "Single Slope" === da.roofType && (e = 0 <= da.roofPitch ? da.purlinThickness / 2 - .05 : da.purlinThickness / 2 - .2)) : (E.rotation.z = Math.PI / 2, e = 0, "Single Slope" === da.roofType && (e = 0 <= da.roofPitch ? -.15 : -.25)), "Single Slope" === da.roofType ? E.position.set(w * -Ee, -l / 2 - e, o) : E.position.set(w * Ee, -l / 2 + e, o), E.scale.y = da.purlinThickness, E.scale.z = a, E.rotation.y = 0, E.visible = !0, aa.add(E), w++ } for (w = 0; w < U / ve;) { if (w < da.wallHeightL() / ve && da.enclosedE) { E = v.clone(); let e = 0; da.flushGirts && (E.rotation.z = Math.PI / 2, e = da.girtThickness / 2), E.position.set(da.width / -2 + l / 1.9 + e, w * ve + .05, 0), E.scale.y = da.girtThickness, E.scale.z = Pe, E.rotation.y = 0, E.visible = !0, F.add(E) } if (w < da.wallHeightR() / ve && da.enclosedW) { E = v.clone(); let e = 0; da.flushGirts && (E.rotation.z = Math.PI / 2, e = da.girtThickness / 2), E.position.set(da.width / 2 - l / 1.9 - e, w * ve + .05, 0), E.scale.y = da.girtThickness, E.scale.z = Pe, da.flushGirts && (E.rotation.z = Math.PI / 2), E.rotation.y = 0, E.visible = !0, F.add(E) } if (w < da.height / ve) { if (da.enclosedS) { E = v.clone(); let e = 0; da.flushGirts && (E.rotation.z = Math.PI / 2, e = da.girtThickness / 2), E.position.set(0, w * ve + .05, da.depth / -2 + l / 1.9 + e), E.rotation.y = Math.PI / 2, E.scale.y = da.girtThickness, E.scale.z = da.width - .25, E.visible = !0, F.add(E) } if (da.enclosedN) { E = v.clone(); let e = 0; da.flushGirts && (E.rotation.z = Math.PI / 2, e = da.girtThickness / 2), E.position.set(0, w * ve + .05, da.depth / 2 - l / 1.9 - e), E.rotation.y = Math.PI / 2, E.scale.y = da.girtThickness, E.scale.z = da.width - .25, E.visible = !0, F.add(E) } } w++ } if (!da.flushGirts) for (; w < (Q + da.height - .1 - 1) / ve;) { var De = w * ve - da.height, Me = ("Single Slope" !== da.roofType && (X = "Asymmetrical" === da.roofType ? De / Q * da.asymmetrical : ($ = da.width / 2, _ = da.width / 2, n = i = k, 0)), $ - (De + .5) / Math.tan(Math.PI / 2 - i)), We = _ - (De + .5) / Math.tan(Math.PI / 2 - n); da.enclosedS && ((E = v.clone()).position.set(X, w * ve + .05, da.depth / -2 + l / 1.9), E.rotation.y = Math.PI / 2, E.scale.y = da.girtThickness, E.scale.z = Me + We - .25, E.visible = !0, F.add(E)), da.enclosedN && ((E = v.clone()).position.set(X, w * ve + .05, da.depth / 2 - l / 1.9), E.rotation.y = Math.PI / 2, E.scale.y = da.girtThickness, E.scale.z = Me + We - .25, E.visible = !0, F.add(E)), w++ } da.settings.hasOwnProperty("alternatePostSpacingOver40FT") && (40 < da.width ? da.maxPostSpacing = da.settings.alternatePostSpacingOver40FT.over : da.maxPostSpacing = da.settings.alternatePostSpacingOver40FT.under); for (var xe = Math.ceil(da.width / da.maxPostSpacing) - 1, Oe = da.depth / 2 - (l + .125), Re = da.width / ((xe = xe < 0 ? 0 : xe) + 1), P = 0, Be = 0, w = 1; w <= xe; w++) if (P = da.width / -2 + Re * w, Be = "Single Slope" === da.roofType ? da.roofPitch < 0 ? da.height + (P - da.width / 2) * da.roofPitch / 12 - 1 : da.height + (P - -da.width / 2) * da.roofPitch / 12 - 1 : "Asymmetrical" === da.roofType ? (Le = 12 / Math.tan(i), Ce = 12 / Math.tan(n), P < da.asymmetrical ? da.height + (da.width / 2 - -P) * Le / 12 - 1 - 2.4 - .085 * Le : da.height + (da.width / 2 - P) * Ce / 12 - 1 - 2.4 - .085 * Ce) : da.height + (da.width / 2 - Math.abs(P)) * da.roofPitch / 12 - 1 - d, (E = ia.getObjectByName("columnEnd").clone()).name += "-clone", !da.settings.hasOwnProperty("showPostsWithOpenGableWall") || da.settings.showPostsWithOpenGableWall || da.enclosedN ? E.visible = !0 : E.visible = !1, E.position.set(P, 0, Oe), E.morphTargetInfluences[E.morphTargetDictionary.height] = Be / 100, B.add(E), (E = ia.getObjectByName("columnEnd").clone()).name += "-clone", !da.settings.hasOwnProperty("showPostsWithOpenGableWall") || da.settings.showPostsWithOpenGableWall || da.enclosedS ? E.visible = !0 : E.visible = !1, E.position.set(P, 0, -Oe), E.morphTargetInfluences[E.morphTargetDictionary.height] = Be / 100, B.add(E), 0 < da.mezzanineBays) { var Se = ca; Se.sort(function(e, t) { return e - t }); for (var He = 1; He <= da.mezzanineBays; He++)(E = ia.getObjectByName("columnEnd").clone()).name += "-clone", E.visible = !0, E.position.set(P, 0, Se[He]), E.morphTargetInfluences[E.morphTargetDictionary.height] = (da.mezzanineHeight - 1) / 100, B.add(E) } } if ("Steel Truss" == da.frameType) { (ha = ga).visible = !0; var p = ua, Z = 0, l = ("Asymmetrical" === da.roofType && (Z = da.asymmetrical), .3), J = .66, K = da.width / -2 + l - Z, ee = da.width / -2 + l + Z, te = da.wallHeightL() - .5, ae = da.wallHeightR() - .5, h = 2, oe = (h = da.width < 25 ? 1.23 : h, (Math.PI - i) / 2), ie = (Math.PI - n) / 2, ne = h / Math.sin(oe), re = h / Math.sin(ie), se = Math.sqrt(Math.pow(ne, 2) - Math.pow(h, 2)), le = Math.sqrt(Math.pow(re, 2) - Math.pow(h, 2)), he = Math.sqrt(Math.pow(te - se, 2) + Math.pow(h - J, 2)), ce = Math.sqrt(Math.pow(ae - le, 2) + Math.pow(h - J, 2)), de = (Math.atan(se / ne), Math.atan(le / re), Math.acos((te - se) / he), Math.acos((ae - le) / ce), Math.abs(K) / Math.sin(i)), pe = Math.abs(ee) / Math.sin(n), me = (Math.abs(K), Math.sin(i), Math.abs(ee), Math.sin(n), Math.abs(h) / Math.sin(i)), ge = Math.abs(h) / Math.sin(n), Ne = da.width / 2 * da.roofPitch / 12; (c = p.getObjectByName("columnSideL")).position.x = da.width / -2 + l, c.morphTargetInfluences[c.morphTargetDictionary.height] = te - 1.1, c.morphTargetInfluences[c.morphTargetDictionary.slantTop] = -2 * Math.tan(i - Math.PI / 2), (c = p.getObjectByName("columnSideR")).position.x = da.width / 2 - l, c.morphTargetInfluences[c.morphTargetDictionary.height] = ae - 1.1, c.morphTargetInfluences[c.morphTargetDictionary.slantTop] = -2 * Math.tan(n - Math.PI / 2); (Fe = p.getObjectByName("truss")).position.y = da.height - .5, Fe.morphTargetInfluences[Fe.morphTargetDictionary.width] = da.width - 1 - 2 * l, Fe.morphTargetInfluences[Fe.morphTargetDictionary.height] = Ne - 1, Fe.material.color.copy(Ea); p.getObjectByName("webbingVertR1").visible = !1, p.getObjectByName("webbingVertR2").visible = !1, p.getObjectByName("webbingVertL1").visible = !1, p.getObjectByName("webbingVertL2").visible = !1; (x = p.getObjectByName("webbingDiagR1")).position.y = da.height - .5, x.position.x = da.width / 2 / 3, x.rotation.z = Math.PI / 2 - Math.atan((Ne - .3) / (da.width / 2 / 3)), x.morphTargetInfluences[x.morphTargetDictionary.height] = Math.sqrt(Math.pow(Ne - .3, 2) + Math.pow(da.width / 2 / 3, 2)) - 1, x.position.x = 0, x.rotation.z = Math.atan((Ne / 4 * 3 - .25) / (da.width / 2 / 4)) - Math.PI / 2, x.morphTargetInfluences[x.morphTargetDictionary.height] = Math.hypot(Ne / 4 * 3 - .25, da.width / 2 / 4) - 1, (x = p.getObjectByName("webbingDiagL1")).position.y = da.height - .5, x.position.x = da.width / 2 / -3, x.rotation.z = Math.PI / -2 + Math.atan((Ne - .3) / (da.width / 2 / 3)), x.morphTargetInfluences[x.morphTargetDictionary.height] = Math.sqrt(Math.pow(Ne - .3, 2) + Math.pow(da.width / 2 / 3, 2)) - 1, x.position.x = 0, x.rotation.z = -Math.atan((Ne / 4 * 3 - .25) / (da.width / 2 / 4)) + Math.PI / 2, x.morphTargetInfluences[x.morphTargetDictionary.height] = Math.hypot(Ne / 4 * 3 - .25, da.width / 2 / 4) - 1, p.getObjectByName("webbingDiagR2").visible = !1, p.getObjectByName("webbingDiagL2").visible = !1, void 0 !== ia.getObjectByName("downspout") && void 0 !== p.getObjectByName("columnSideL") && void 0 !== p.getObjectByName("columnSideR") && void 0 === p.getObjectByName("columnSideL").getObjectByName("downspout-clone") && void 0 === p.getObjectByName("columnSideR").getObjectByName("downspout-clone") && ((E = ia.getObjectByName("downspout").clone()).name = "downspout-clone", E.visible = !0, E.castShadow = !0, E.receiveShadow = !0, E.rotation.y = THREE.Math.degToRad(180), E.position.x = -l, p.getObjectByName("columnSideL").add(E), p.getObjectByName("columnSideR").add(E.clone())), da.gutters && (m = p.getObjectByName("columnSideL").getObjectByName("downspout-clone"), s = p.getObjectByName("columnSideR").getObjectByName("downspout-clone"), m.morphTargetInfluences[m.morphTargetDictionary.height] = da.height - 1.2 - da.eaveL / Math.hypot(12, da.roofPitch) * da.roofPitch, s.morphTargetInfluences[s.morphTargetDictionary.height] = da.height - 1.2 - da.eaveR / Math.hypot(12, da.roofPitch) * da.roofPitch, m.morphTargetInfluences[m.morphTargetDictionary.downspoutOverhang] = da.eaveL / Math.hypot(12, da.roofPitch) * 12, s.morphTargetInfluences[s.morphTargetDictionary.downspoutOverhang] = da.eaveR / Math.hypot(12, da.roofPitch) * 12, 0 < da.hideWalls ? (m.visible = !1, s.visible = !1) : ("Single Slope" != da.roofType || "Single Slope" == da.roofType && 0 < da.roofPitch ? m.visible = !0 : m.visible = !1, "Single Slope" != da.roofType || "Single Slope" == da.roofType && da.roofPitch < 0 ? s.visible = !0 : s.visible = !1)); var g = p.getObjectByName("beamRoofL"), d = 0, ue = (u = Math.abs(K) - d) * da.roofPitch / 12; g.position.x = da.width / -2 + l + d, g.position.y = da.height - .4, g.morphTargetInfluences[g.morphTargetDictionary.length] = u - 1, g.morphTargetInfluences[g.morphTargetDictionary.slantTop] = ue, "Single Slope" != da.roofType ? (g = p.getObjectByName("beamRoofR"), u = Math.abs(ee) - d, g.visible = !0, g.position.x = da.width / 2 - l - d, g.position.y = da.height - .4, g.morphTargetInfluences[g.morphTargetDictionary.length] = u - 1, g.morphTargetInfluences[g.morphTargetDictionary.slantTop] = ue) : (g.morphTargetInfluences[g.morphTargetDictionary.length] = 2 * u - 1, g.morphTargetInfluences[g.morphTargetDictionary.slantTop] = 2 * ue, (g = ha.getObjectByName("beamRoofR")).visible = !1), (B = new THREE.Group).name = "SteelTrussFramingClones", ha.add(B), ca = Vo(da.maxTrussSpacing, l, p, B), void 0 !== ia.getObjectByName("LeanTo1PostClones") && ia.getObjectByName("leanTo1").remove(ia.getObjectByName("LeanTo1PostClones")), void 0 !== ia.getObjectByName("LeanTo2PostClones") && ia.getObjectByName("leanTo2").remove(ia.getObjectByName("LeanTo2PostClones")), void 0 !== ia.getObjectByName("LeanTo3PostClones") && ia.getObjectByName("leanTo3").remove(ia.getObjectByName("LeanTo3PostClones")), void 0 !== ia.getObjectByName("LeanTo4PostClones") && ia.getObjectByName("leanTo4").remove(ia.getObjectByName("LeanTo4PostClones")); let e, t; if (void 0 !== p.getObjectByName("columnSide") && (e = p.getObjectByName("columnSide")), void 0 !== p.getObjectByName("beamRoof") && (t = p.getObjectByName("beamRoof")), void 0 !== ia.getObjectByName("downspout") && void 0 === e.getObjectByName("downspout-clone") && ((E = ia.getObjectByName("downspout").clone()).name = "downspout-clone", E.visible = !0, E.castShadow = !0, E.receiveShadow = !0, e.add(E)), 0 < da.settings.postsOnGableRoofOverhangsOver) { if (da.gableFront > da.settings.postsOnGableRoofOverhangsOver) { if ((clonedFrame = p.clone()).name = "OverhangFrontFrame", clonedFrame.position.z = da.depth / 2 + da.gableFront - l - .5, B.add(clonedFrame), da.settings.enclosedGableRoofOverhangTriangles) { let e; void 0 === na.getObjectByName("overhangEnclosureFront") ? (T = na.getObjectByName("coveredGableExtension"), (e = T.deepClone()).name = "overhangEnclosureFront", e.frustumCulled = !1, na.add(e)) : e = na.getObjectByName("overhangEnclosureFront"), e.position.z = da.depth / 2, e.visible = !0, e.morphTargetInfluences[e.morphTargetDictionary.width] = da.width - 1, e.morphTargetInfluences[e.morphTargetDictionary.depth] = da.gableFront - 1, e.morphTargetInfluences[e.morphTargetDictionary.height] = da.height - 1, e.morphTargetInfluences[e.morphTargetDictionary.unEnclosedHeight] = da.height - .85, e.morphTargetInfluences[e.morphTargetDictionary.roofPeak] = da.width / 2 * da.roofPitch / 12, e.material.forEach(function(e) { e.name.startsWith("BuildingWainscot") && (e.visible = !1), e.name.startsWith("BuildingTrim-Base") && (e.visible = !1) }) } } else void 0 !== na.getObjectByName("overhangEnclosureFront") && (na.getObjectByName("overhangEnclosureFront").visible = !1); if (da.gableBack > da.settings.postsOnGableRoofOverhangsOver) { if ((clonedFrame = p.clone()).name = "OverhangBackFrame", clonedFrame.position.z = da.depth / -2 - da.gableBack + l + .5, B.add(clonedFrame), da.settings.enclosedGableRoofOverhangTriangles) { let e; void 0 === na.getObjectByName("overhangEnclosureBack") ? (m = na.getObjectByName("coveredGableExtension"), (e = m.deepClone()).name = "overhangEnclosureBack", e.frustumCulled = !1, na.add(e)) : e = na.getObjectByName("overhangEnclosureBack"), e.position.z = da.depth / -2, e.rotation.y = Math.PI, e.visible = !0, e.morphTargetInfluences[e.morphTargetDictionary.width] = da.width - 1, e.morphTargetInfluences[e.morphTargetDictionary.depth] = da.gableBack - 1, e.morphTargetInfluences[e.morphTargetDictionary.height] = da.height - 1, e.morphTargetInfluences[e.morphTargetDictionary.unEnclosedHeight] = da.height - .85, e.morphTargetInfluences[e.morphTargetDictionary.roofPeak] = da.width / 2 * da.roofPitch / 12, e.material.forEach(function(e) { e.name.startsWith("BuildingWainscot") && (e.visible = !1), e.name.startsWith("BuildingTrim-Base") && (e.visible = !1) }) } } else void 0 !== na.getObjectByName("overhangEnclosureBack") && (na.getObjectByName("overhangEnclosureBack").visible = !1) } if (ia.getObjectByName("masterSecondaryFramingPiece").material.color.copy(Ea), da.leanTo1) { void 0 === ia.getObjectByName("LeanTo1PostClones") && ((S = new THREE.Group).name = "LeanTo1PostClones", S.rotation.y = 0, ia.getObjectByName("leanTo1").add(S), (H = new THREE.Group).name = "LeanTo1PostMaster", S.add(H)); (E = e.clone()).name = "LeanToPost", E.visible = !0, E.castShadow = !0, E.receiveShadow = !0, E.position.set(0, 0, da.leanTo1Depth - l - .08), E.morphTargetInfluences[E.morphTargetDictionary.height] = da.leanTo1Height - da.leanTo1Depth * da.leanTo1Pitch / 12 - .5 - 1, E.rotation.y = Math.PI / 2, H.add(E); s = E.getObjectByName("downspout-clone"); s && (s.position.x = -l - .08, s.rotation.y = Math.PI, s.morphTargetInfluences[s.morphTargetDictionary.height] = da.leanTo1Height - da.leanTo1Depth * da.leanTo1Pitch / 12 - 1); b = ((E = t.clone()).name = "LeanToRoofBeam", E.visible = !0, E.castShadow = !0, E.receiveShadow = !0, E.position.set(0, da.leanTo1Height - da.leanTo1Depth * da.leanTo1Pitch / 12 - l, da.leanTo1Depth - l - .08), E.scale.x = da.leanTo1Depth / Math.cos((da.leanTo1Pitch - .5) / 12) - .5, E.rotation.y = Math.PI / 2, E.rotation.z = Math.atan(da.leanTo1Pitch / 12), H.add(E), da.leanTo1Length / 2 - l - .08), y = da.leanTo1Length / -2 + l + .08, f = Math.ceil((b - y) / V); H.position.x = b; for (w = 1; w <= f; w++)(r = ia.getObjectByName("LeanTo1PostMaster").clone()).name = "LeanToTrussClone", r.position.x = b - w * (b - y) / f, da.gutters && da.settings.downspountsOnEndsOnly && w < f && (r.getObjectByName("LeanToPost").getObjectByName("downspout-clone").visible = !1), S.add(r); if (da.leanTo1Enclosed && "Fully Enclosed" == da.leanTo1Walls) for (w = 0, be = da.leanTo1Height - da.leanTo1Depth * da.leanTo1Pitch / 12; w < da.leanTo1Height / da.girtSpacing;) w < be / da.girtSpacing ? ((E = ia.getObjectByName("masterSecondaryFramingPiece").clone()).position.set(0, w * da.girtSpacing, da.leanTo1Depth - l / 4), E.rotation.set(0, Math.PI / 2, 0), E.scale.z = da.leanTo1Length, E.scale.y = da.girtThickness, da.hideWalls < 3 ? E.visible = !0 : E.visible = !1, S.add(E), (E = ia.getObjectByName("masterSecondaryFramingPiece").clone()).position.set(da.leanTo1Length / 2 - l / 4, w * da.girtSpacing, da.leanTo1Depth / 2 - .2), E.rotation.set(0, 0, 0), E.scale.z = da.leanTo1Depth, E.scale.y = da.girtThickness, da.hideWalls < 3 ? E.visible = !0 : E.visible = !1, S.add(E), (E = ia.getObjectByName("masterSecondaryFramingPiece").clone()).position.set(da.leanTo1Length / -2 + l / 4, w * da.girtSpacing, da.leanTo1Depth / 2 - .2), E.rotation.set(0, 0, 0), E.scale.z = da.leanTo1Depth) : (I = (w * da.girtSpacing - da.leanTo1Height) / (da.leanTo1Pitch / 12), (E = ia.getObjectByName("masterSecondaryFramingPiece").clone()).position.set(da.leanTo1Length / 2 - l / 4, w * da.girtSpacing, I / -2 - .2), E.rotation.set(0, 0, 0), E.scale.z = I, E.scale.y = da.girtThickness, da.hideWalls < 3 ? E.visible = !0 : E.visible = !1, S.add(E), (E = ia.getObjectByName("masterSecondaryFramingPiece").clone()).position.set(da.leanTo1Length / -2 + l / 4, w * da.girtSpacing, I / -2 - .2), E.rotation.set(0, 0, 0), E.scale.z = I), E.scale.y = da.girtThickness, da.hideWalls < 3 ? E.visible = !0 : E.visible = !1, S.add(E), w++ } if (da.leanTo3) { void 0 === ia.getObjectByName("LeanTo3PostClones") && ((N = new THREE.Group).name = "LeanTo3PostClones", N.rotation.y = Math.PI, ia.getObjectByName("leanTo3").add(N), (L = new THREE.Group).name = "LeanTo3PostMaster", N.add(L)); (E = e.clone()).name = "LeanToPost", E.visible = !0, E.castShadow = !0, E.receiveShadow = !0, E.position.set(0, 0, da.leanTo3Depth - l - .08), E.morphTargetInfluences[E.morphTargetDictionary.height] = da.leanTo3Height - da.leanTo3Depth * da.leanTo3Pitch / 12 - .5 - 1, E.rotation.y = Math.PI / 2, L.add(E); T = E.getObjectByName("downspout-clone"); T && (T.position.x = -l - .08, T.rotation.y = Math.PI, T.morphTargetInfluences[T.morphTargetDictionary.height] = da.leanTo3Height - da.leanTo3Depth * da.leanTo3Pitch / 12 - 1); b = ((E = t.clone()).name = "LeanToRoofBeam", E.visible = !0, E.castShadow = !0, E.receiveShadow = !0, E.position.set(0, da.leanTo3Height - da.leanTo3Depth * da.leanTo3Pitch / 12 - l, da.leanTo3Depth - l - .08), E.scale.x = da.leanTo3Depth / Math.cos((da.leanTo3Pitch - .5) / 12) - .5, E.rotation.y = Math.PI / 2, E.rotation.z = Math.atan(da.leanTo3Pitch / 12), L.add(E), da.leanTo3Length / 2 - l - .08), y = da.leanTo3Length / -2 + l + .08, f = Math.ceil((b - y) / V); L.position.x = b; for (w = 1; w <= f; w++)(r = ia.getObjectByName("LeanTo3PostMaster").clone()).name = "LeanToTrussClone", r.position.x = b - w * (b - y) / f, da.gutters && da.settings.downspountsOnEndsOnly && w < f && (r.getObjectByName("LeanToPost").getObjectByName("downspout-clone").visible = !1), N.add(r); if (da.leanTo3Enclosed && "Fully Enclosed" == da.leanTo3Walls) for (w = 0, ye = da.leanTo3Height - da.leanTo3Depth * da.leanTo3Pitch / 12; w < da.leanTo3Height / da.girtSpacing;) w < ye / da.girtSpacing ? ((E = ia.getObjectByName("masterSecondaryFramingPiece").clone()).position.set(0, w * da.girtSpacing, da.leanTo3Depth - l / 4), E.rotation.set(0, Math.PI / 2, 0), E.scale.z = da.leanTo3Length, E.scale.y = da.girtThickness, da.hideWalls < 3 ? E.visible = !0 : E.visible = !1, N.add(E), (E = ia.getObjectByName("masterSecondaryFramingPiece").clone()).position.set(da.leanTo3Length / 2 - l / 4, w * da.girtSpacing, da.leanTo3Depth / 2 - .2), E.rotation.set(0, 0, 0), E.scale.z = da.leanTo3Depth, E.scale.y = da.girtThickness, da.hideWalls < 3 ? E.visible = !0 : E.visible = !1, N.add(E), (E = ia.getObjectByName("masterSecondaryFramingPiece").clone()).position.set(da.leanTo3Length / -2 + l / 4, w * da.girtSpacing, da.leanTo3Depth / 2 - .2), E.rotation.set(0, 0, 0), E.scale.z = da.leanTo3Depth) : (I = (w * da.girtSpacing - da.leanTo3Height) / (da.leanTo3Pitch / 12), (E = ia.getObjectByName("masterSecondaryFramingPiece").clone()).position.set(da.leanTo3Length / 2 - l / 4, w * da.girtSpacing, I / -2 - .2), E.rotation.set(0, 0, 0), E.scale.z = I, E.scale.y = da.girtThickness, da.hideWalls < 3 ? E.visible = !0 : E.visible = !1, N.add(E), (E = ia.getObjectByName("masterSecondaryFramingPiece").clone()).position.set(da.leanTo3Length / -2 + l / 4, w * da.girtSpacing, I / -2 - .2), E.rotation.set(0, 0, 0), E.scale.z = I), E.scale.y = da.girtThickness, da.hideWalls < 3 ? E.visible = !0 : E.visible = !1, N.add(E), w++ } if (da.leanTo2) { void 0 === ia.getObjectByName("LeanTo2PostClones") && ((C = new THREE.Group).name = "LeanTo2PostClones", C.rotation.y = Math.PI / -2, ia.getObjectByName("leanTo2").add(C), (j = new THREE.Group).name = "LeanTo2PostMaster", C.add(j)); (E = e.clone()).name = "LeanToPost", E.visible = !0, E.castShadow = !0, E.receiveShadow = !0, E.position.set(0, 0, da.leanTo2Depth - l - .08), E.morphTargetInfluences[E.morphTargetDictionary.height] = da.leanTo2Height - da.leanTo2Depth * da.leanTo2Pitch / 12 - .5 - 1, E.rotation.y = Math.PI / 2, j.add(E); p = E.getObjectByName("downspout-clone"); p && (p.position.x = -l - .08, p.rotation.y = Math.PI, p.morphTargetInfluences[p.morphTargetDictionary.height] = da.leanTo2Height - da.leanTo2Depth * da.leanTo2Pitch / 12 - 1); b = ((E = t.clone()).name = "LeanToRoofBeam", E.visible = !0, E.castShadow = !0, E.receiveShadow = !0, E.position.set(0, da.leanTo2Height - da.leanTo2Depth * da.leanTo2Pitch / 12 - l, da.leanTo2Depth - l - .08), E.scale.x = da.leanTo2Depth / Math.cos((da.leanTo2Pitch - .5) / 12) - .5, E.rotation.y = Math.PI / 2, E.rotation.z = Math.atan(da.leanTo2Pitch / 12), j.add(E), da.leanTo2Length / 2 - l - .08), y = da.leanTo2Length / -2 + l + .08, f = Math.ceil((b - y) / V); j.position.x = b; for (w = 1; w <= f; w++)(r = ia.getObjectByName("LeanTo2PostMaster").clone()).name = "LeanToTrussClone", r.position.x = b - w * (b - y) / f, da.gutters && da.settings.downspountsOnEndsOnly && w < f && (r.getObjectByName("LeanToPost").getObjectByName("downspout-clone").visible = !1), C.add(r); if (da.leanTo2Enclosed && "Fully Enclosed" == da.leanTo2Walls) for (w = 0, fe = da.leanTo2Height - da.leanTo2Depth * da.leanTo2Pitch / 12; w < da.leanTo2Height / da.girtSpacing;) w < fe / da.girtSpacing ? ((E = ia.getObjectByName("masterSecondaryFramingPiece").clone()).position.set(0, w * da.girtSpacing, da.leanTo2Depth - l / 4), E.rotation.set(0, Math.PI / 2, 0), E.scale.z = da.leanTo2Length, E.scale.y = da.girtThickness, da.hideWalls < 3 ? E.visible = !0 : E.visible = !1, C.add(E), (E = ia.getObjectByName("masterSecondaryFramingPiece").clone()).position.set(da.leanTo2Length / 2 - l / 4, w * da.girtSpacing, da.leanTo2Depth / 2 - .2), E.rotation.set(0, 0, 0), E.scale.z = da.leanTo2Depth, E.scale.y = da.girtThickness, da.hideWalls < 3 ? E.visible = !0 : E.visible = !1, C.add(E), (E = ia.getObjectByName("masterSecondaryFramingPiece").clone()).position.set(da.leanTo2Length / -2 + l / 4, w * da.girtSpacing, da.leanTo2Depth / 2 - .2), E.rotation.set(0, 0, 0), E.scale.z = da.leanTo2Depth) : (I = (w * da.girtSpacing - da.leanTo2Height) / (da.leanTo2Pitch / 12), (E = ia.getObjectByName("masterSecondaryFramingPiece").clone()).position.set(da.leanTo2Length / 2 - l / 4, w * da.girtSpacing, I / -2 - .2), E.rotation.set(0, 0, 0), E.scale.z = I, E.scale.y = da.girtThickness, da.hideWalls < 3 ? E.visible = !0 : E.visible = !1, C.add(E), (E = ia.getObjectByName("masterSecondaryFramingPiece").clone()).position.set(da.leanTo2Length / -2 + l / 4, w * da.girtSpacing, I / -2 - .2), E.rotation.set(0, 0, 0), E.scale.z = I), E.scale.y = da.girtThickness, da.hideWalls < 3 ? E.visible = !0 : E.visible = !1, C.add(E), w++ } if (da.leanTo4) { void 0 === ia.getObjectByName("LeanTo4PostClones") && ((z = new THREE.Group).name = "LeanTo4PostClones", z.rotation.y = Math.PI / 2, ia.getObjectByName("leanTo4").add(z), (Vt = new THREE.Group).name = "LeanTo4PostMaster", z.add(Vt)); (E = e.clone()).name = "LeanToPost", E.visible = !0, E.castShadow = !0, E.receiveShadow = !0, E.position.set(0, 0, da.leanTo4Depth - l - .08), E.morphTargetInfluences[E.morphTargetDictionary.height] = da.leanTo4Height - da.leanTo4Depth * da.leanTo4Pitch / 12 - .5 - 1, E.rotation.y = Math.PI / 2, Vt.add(E); m = E.getObjectByName("downspout-clone"); m && (m.position.x = -l - .08, m.rotation.y = Math.PI, m.morphTargetInfluences[m.morphTargetDictionary.height] = da.leanTo4Height - da.leanTo4Depth * da.leanTo4Pitch / 12 - 1); b = ((E = t.clone()).name = "LeanToRoofBeam", E.visible = !0, E.castShadow = !0, E.receiveShadow = !0, E.position.set(0, da.leanTo4Height - da.leanTo4Depth * da.leanTo4Pitch / 12 - l, da.leanTo4Depth - l - .08), E.scale.x = da.leanTo4Depth / Math.cos((da.leanTo4Pitch - .5) / 12) - .5, E.rotation.y = Math.PI / 2, E.rotation.z = Math.atan(da.leanTo4Pitch / 12), Vt.add(E), da.leanTo4Length / 2 - l - .08), y = da.leanTo4Length / -2 + l + .08, f = Math.ceil((b - y) / V); Vt.position.x = b; for (w = 1; w <= f; w++)(r = ia.getObjectByName("LeanTo4PostMaster").clone()).name = "LeanToTrussClone", r.position.x = b - w * (b - y) / f, da.gutters && da.settings.downspountsOnEndsOnly && w < f && (r.getObjectByName("LeanToPost").getObjectByName("downspout-clone").visible = !1), z.add(r); if (da.leanTo4Enclosed && "Fully Enclosed" == da.leanTo4Walls) for (w = 0, we = da.leanTo4Height - da.leanTo4Depth * da.leanTo4Pitch / 12; w < da.leanTo4Height / da.girtSpacing;) w < we / da.girtSpacing ? ((E = ia.getObjectByName("masterSecondaryFramingPiece").clone()).position.set(0, w * da.girtSpacing, da.leanTo4Depth - l / 4), E.rotation.set(0, Math.PI / 2, 0), E.scale.z = da.leanTo4Length, E.scale.y = da.girtThickness, da.hideWalls < 3 ? E.visible = !0 : E.visible = !1, z.add(E), (E = ia.getObjectByName("masterSecondaryFramingPiece").clone()).position.set(da.leanTo4Length / 2 - l / 4, w * da.girtSpacing, da.leanTo4Depth / 2 - .2), E.rotation.set(0, 0, 0), E.scale.z = da.leanTo4Depth, E.scale.y = da.girtThickness, da.hideWalls < 3 ? E.visible = !0 : E.visible = !1, z.add(E), (E = ia.getObjectByName("masterSecondaryFramingPiece").clone()).position.set(da.leanTo4Length / -2 + l / 4, w * da.girtSpacing, da.leanTo4Depth / 2 - .2), E.rotation.set(0, 0, 0), E.scale.z = da.leanTo4Depth) : (I = (w * da.girtSpacing - da.leanTo4Height) / (da.leanTo4Pitch / 12), (E = ia.getObjectByName("masterSecondaryFramingPiece").clone()).position.set(da.leanTo4Length / 2 - l / 4, w * da.girtSpacing, I / -2 - .2), E.rotation.set(0, 0, 0), E.scale.z = I, E.scale.y = da.girtThickness, da.hideWalls < 3 ? E.visible = !0 : E.visible = !1, z.add(E), (E = ia.getObjectByName("masterSecondaryFramingPiece").clone()).position.set(da.leanTo4Length / -2 + l / 4, w * da.girtSpacing, I / -2 - .2), E.rotation.set(0, 0, 0), E.scale.z = I), E.scale.y = da.girtThickness, da.hideWalls < 3 ? E.visible = !0 : E.visible = !1, z.add(E), w++ } var a = da.girtSpacing, o = da.purlinSpacing; (F = new THREE.Group).name = "GirtParent", B.add(F), 2 < da.hideWalls ? F.visible = !1 : F.visible = !0, (Kt = new THREE.Group).name = "PurlinParentL", Kt.position.set(da.width / -2 + l + .1, te, 0), Kt.rotation.z = Math.PI / 2 - i, da.roofPitch < 0 && (Kt.rotation.z = Math.PI / -2 - i), F.add(Kt); (aa = new THREE.Group).name = "PurlinParentR", aa.position.set(da.width / 2 - l - .1, ae, 0), aa.rotation.z = n - Math.PI / -2, da.roofPitch < 0 && (aa.rotation.z = n - Math.PI / 2), F.add(aa), da.depth; for (v = ia.getObjectByName("masterSecondaryFramingPiece").clone(), w = 0; w < q / o;) { E = v.clone(); let e = 0; da.flushPurlins || da.standingPurlins ? (da.flushPurlins && (e = da.purlinThickness / 2 + .0625), da.standingPurlins && (e = 0), "Single Slope" === da.roofType && (e = 0 <= da.roofPitch ? da.purlinThickness / 2 + .1 : da.purlinThickness / 2 + .2)) : (E.rotation.z = Math.PI / 2, e = 0, "Single Slope" === da.roofType && (e = 0 <= da.roofPitch ? .1 : .2)), E.position.set(w * o, l / 2 - e, 0), E.scale.y = da.purlinThickness, E.scale.z = da.depth - l, E.rotation.y = 0, E.visible = !0, Kt.add(E), w++ } for (w = 0; w < A / o;) { E = v.clone(); let e; da.flushPurlins || da.standingPurlins ? (da.flushPurlins && (e = da.purlinThickness / 2 + .0625), da.standingPurlins && (e = 0), "Single Slope" === da.roofType && (e = 0 <= da.roofPitch ? da.purlinThickness / 2 - .05 : da.purlinThickness / 2 - .2)) : (E.rotation.z = Math.PI / 2, e = 0, "Single Slope" === da.roofType && (e = 0 <= da.roofPitch ? -.15 : -.25)), "Single Slope" === da.roofType ? E.position.set(w * -o, -l / 2 - e, 0) : E.position.set(w * o, -l / 2 + e, 0), E.scale.y = da.purlinThickness, E.scale.z = da.depth - l, E.rotation.y = 0, E.visible = !0, aa.add(E), w++ } for (w = 0; w < U / a;) { if (w < da.wallHeightL() / a && da.enclosedE) { E = v.clone(); let e = 0; da.flushGirts && (E.rotation.z = Math.PI / 2, e = da.girtThickness / 2), E.position.set(da.width / -2 + l / 1.9 + e, w * a + .05, 0), E.scale.y = da.girtThickness, E.scale.z = da.depth - l, E.rotation.y = 0, E.visible = !0, F.add(E) } if (w < da.wallHeightR() / a && da.enclosedW) { E = v.clone(); let e = 0; da.flushGirts && (E.rotation.z = Math.PI / 2, e = da.girtThickness / 2), E.position.set(da.width / 2 - l / 1.9 - e, w * a + .05, 0), E.scale.y = da.girtThickness, E.scale.z = da.depth - l, da.flushGirts && (E.rotation.z = Math.PI / 2), E.rotation.y = 0, E.visible = !0, F.add(E) } if (w < da.height / a) { if (da.enclosedS) { E = v.clone(); let e = 0; da.flushGirts && (E.rotation.z = Math.PI / 2, e = da.girtThickness / 2), E.position.set(0, w * a + .05, da.depth / -2 + l / 1.9 + e), E.rotation.y = Math.PI / 2, E.scale.y = da.girtThickness, E.scale.z = da.width - .25, E.visible = !0, F.add(E) } if (da.enclosedN) { E = v.clone(); let e = 0; da.flushGirts && (E.rotation.z = Math.PI / 2, e = da.girtThickness / 2), E.position.set(0, w * a + .05, da.depth / 2 - l / 1.9 - e), E.rotation.y = Math.PI / 2, E.scale.y = da.girtThickness, E.scale.z = da.width - .25, E.visible = !0, F.add(E) } } w++ } if (!da.flushGirts) for (; w < (Q + da.height - .1 - 1) / a;) { De = w * a - da.height, Me = ("Single Slope" !== da.roofType && (X = "Asymmetrical" === da.roofType ? De / Q * da.asymmetrical : ($ = da.width / 2, _ = da.width / 2, n = i = k, 0)), $ - (De + .5) / Math.tan(Math.PI / 2 - i)), We = _ - (De + .5) / Math.tan(Math.PI / 2 - n); da.enclosedS && ((E = v.clone()).position.set(X, w * a + .05, da.depth / -2 + l / 1.9), E.rotation.y = Math.PI / 2, E.scale.y = da.girtThickness, E.scale.z = Me + We - .25, E.visible = !0, F.add(E)), da.enclosedN && ((E = v.clone()).position.set(X, w * a + .05, da.depth / 2 - l / 1.9), E.rotation.y = Math.PI / 2, E.scale.y = da.girtThickness, E.scale.z = Me + We - .25, E.visible = !0, F.add(E)), w++ } da.settings.hasOwnProperty("alternatePostSpacingOver40FT") && (40 < da.width ? da.maxPostSpacing = da.settings.alternatePostSpacingOver40FT.over : da.maxPostSpacing = da.settings.alternatePostSpacingOver40FT.under); for (var Le, Ce, xe = Math.ceil(da.width / da.maxPostSpacing) - 1, Oe = da.depth / 2 - (l + .125), Re = da.width / ((xe = xe < 0 ? 0 : xe) + 1), P = 0, Be = 0, w = 1; w <= xe; w++) if (P = da.width / -2 + Re * w, Be = "Single Slope" === da.roofType ? da.roofPitch < 0 ? da.height + (P - da.width / 2) * da.roofPitch / 12 - 1 : da.height + (P - -da.width / 2) * da.roofPitch / 12 - 1 : "Asymmetrical" === da.roofType ? (Le = 12 / Math.tan(i), Ce = 12 / Math.tan(n), P < da.asymmetrical ? da.height + (da.width / 2 - -P) * Le / 12 - 1 - 2.4 - .085 * Le : da.height + (da.width / 2 - P) * Ce / 12 - 1 - 2.4 - .085 * Ce) : da.height + (da.width / 2 - Math.abs(P)) * da.roofPitch / 12 - 1 - d, (E = ia.getObjectByName("columnEnd").clone()).name += "-clone", !da.settings.hasOwnProperty("showPostsWithOpenGableWall") || da.settings.showPostsWithOpenGableWall || da.enclosedN ? E.visible = !0 : E.visible = !1, E.position.set(P, 0, Oe), E.morphTargetInfluences[E.morphTargetDictionary.height] = Be / 100, B.add(E), (E = ia.getObjectByName("columnEnd").clone()).name += "-clone", !da.settings.hasOwnProperty("showPostsWithOpenGableWall") || da.settings.showPostsWithOpenGableWall || da.enclosedS ? E.visible = !0 : E.visible = !1, E.position.set(P, 0, -Oe), E.morphTargetInfluences[E.morphTargetDictionary.height] = Be / 100, B.add(E), 0 < da.mezzanineBays) { var je = ca; je.sort(function(e, t) { return e - t }); for (He = 1; He <= da.mezzanineBays; He++)(E = ia.getObjectByName("columnEnd").clone()).name += "-clone", E.visible = !0, E.position.set(P, 0, je[He]), E.morphTargetInfluences[E.morphTargetDictionary.height] = (da.mezzanineHeight - 1) / 100, B.add(E) } } if ("Post Frame" == da.frameType) { (ha = Ta).visible = !0; var D = ba, Z = 0, l = ("Asymmetrical" === da.roofType && (Z = da.asymmetrical), .3), J = .66, K = da.width / -2 + l - Z, ee = da.width / -2 + l + Z, te = da.wallHeightL() - .5, ae = da.wallHeightR() - .5, h = 2, oe = (h = da.width < 25 ? 1.23 : h, (Math.PI - i) / 2), ie = (Math.PI - n) / 2, ne = h / Math.sin(oe), re = h / Math.sin(ie), se = Math.sqrt(Math.pow(ne, 2) - Math.pow(h, 2)), le = Math.sqrt(Math.pow(re, 2) - Math.pow(h, 2)), he = Math.sqrt(Math.pow(te - se, 2) + Math.pow(h - J, 2)), ce = Math.sqrt(Math.pow(ae - le, 2) + Math.pow(h - J, 2)), de = (Math.atan(se / ne), Math.atan(le / re), Math.acos((te - se) / he), Math.acos((ae - le) / ce), Math.abs(K) / Math.sin(i)), pe = Math.abs(ee) / Math.sin(n), me = (Math.abs(K), Math.sin(i), Math.abs(ee), Math.sin(n), Math.abs(h) / Math.sin(i)), ge = Math.abs(h) / Math.sin(n), Ne = da.roofHeightAtX(0) - da.height; Math.max(me, ge); if ((c = D.getObjectByName("columnSideL")).position.x = da.width / -2 + l + 2 / 12 / 2, c.morphTargetInfluences[c.morphTargetDictionary.height] = te - 1.1, c.morphTargetInfluences[c.morphTargetDictionary.slantTop] = -2 * Math.tan(i - Math.PI / 2), (c = D.getObjectByName("columnSideR")).position.x = da.width / 2 - l - 2 / 12 / 2, c.morphTargetInfluences[c.morphTargetDictionary.height] = ae - 1.1, c.morphTargetInfluences[c.morphTargetDictionary.slantTop] = -2 * Math.tan(n - Math.PI / 2), void 0 !== D.getObjectByName("footingL") && (M = D.getObjectByName("footingL")).userData.type !== da.postFooting && (M.parent.remove(M), M.geometry.dispose(), M = void 0), void 0 !== ia.getObjectByName("downspout") && void 0 !== D.getObjectByName("columnSideL") && void 0 !== D.getObjectByName("columnSideR") && void 0 === D.getObjectByName("columnSideL").getObjectByName("downspout-clone") && void 0 === D.getObjectByName("columnSideR").getObjectByName("downspout-clone") && ((E = ia.getObjectByName("downspout").clone()).name = "downspout-clone", E.visible = !0, E.castShadow = !0, E.receiveShadow = !0, E.rotation.y = THREE.Math.degToRad(180), E.position.x = -l, D.getObjectByName("columnSideL").add(E), D.getObjectByName("columnSideR").add(E.clone())), da.gutters && (s = D.getObjectByName("columnSideL").getObjectByName("downspout-clone"), T = D.getObjectByName("columnSideR").getObjectByName("downspout-clone"), s.morphTargetInfluences[s.morphTargetDictionary.height] = da.height - 1.2 - da.eaveL / Math.hypot(12, da.roofPitch) * da.roofPitch, T.morphTargetInfluences[T.morphTargetDictionary.height] = da.height - 1.2 - da.eaveR / Math.hypot(12, da.roofPitch) * da.roofPitch, s.morphTargetInfluences[s.morphTargetDictionary.downspoutOverhang] = da.eaveL / Math.hypot(12, da.roofPitch) * 12, T.morphTargetInfluences[T.morphTargetDictionary.downspoutOverhang] = da.eaveR / Math.hypot(12, da.roofPitch) * 12, 0 < da.hideWalls ? (s.visible = !1, T.visible = !1) : ("Single Slope" != da.roofType || "Single Slope" == da.roofType && 0 < da.roofPitch ? s.visible = !0 : s.visible = !1, "Single Slope" != da.roofType || "Single Slope" == da.roofType && da.roofPitch < 0 ? T.visible = !0 : T.visible = !1)), void 0 === D.getObjectByName("footingL")) { switch (da.postFooting) { case "Post in Ground": M = D.getObjectByName("footing-Burried").clone(); break; case "Bracket on Concrete": case "Bracket": M = D.getObjectByName("footing").clone(); break; case "Perma-Column": M = D.getObjectByName("footing-PermaColumnConcretePost").clone(); break; default: M = !1 } M && (M.rotation.y = THREE.Math.degToRad(90), M.visible = !0, M.name = "footingL", M.userData.type = da.postFooting, D.add(M)) } else M = D.getObjectByName("footingL"); M && (M.position.x = da.width / -2 + l + 2 / 12 / 2, void 0 !== D.getObjectByName("footingR") && (dt = D.getObjectByName("footingR")).userData.type !== da.postFooting && (dt.parent.remove(dt), dt.geometry.dispose(), dt = void 0), void 0 === D.getObjectByName("footingR") ? ((dt = M.clone()).rotation.y = THREE.Math.degToRad(90), dt.name = "footingR", dt.userData.type = da.postFooting, D.add(dt)) : dt = D.getObjectByName("footingR"), dt.position.x = da.width / 2 - l - 2 / 12 / 2), (Fe = D.getObjectByName("truss")).position.y = da.height - .5, Fe.morphTargetInfluences[Fe.morphTargetDictionary.width] = da.width - 1 - 1, Fe.morphTargetInfluences[Fe.morphTargetDictionary.height] = Math.abs(Ne) - 1, Fe.morphTargetInfluences[Fe.morphTargetDictionary.asymmetrical] = 0, "Asymmetrical" === da.roofType && (Fe.morphTargetInfluences[Fe.morphTargetDictionary.asymmetrical] = da.asymmetrical, Fe.morphTargetInfluences[Fe.morphTargetDictionary.height] = da.roofHeightAtX(da.asymmetrical) - da.height - .5 - 1); { D.getObjectByName("webbingVertR1").visible = !1, D.getObjectByName("webbingVertR2").visible = !1, D.getObjectByName("webbingVertL1").visible = !1, D.getObjectByName("webbingVertL2").visible = !1, D.getObjectByName("webbingDiagR1").visible = !1, D.getObjectByName("webbingDiagR2").visible = !1, D.getObjectByName("webbingDiagL1").visible = !1, D.getObjectByName("webbingDiagL2").visible = !1; var ze = D.getObjectByName("webbingDiagR1"); let e = 0; p = Math.abs(K), m = Math.abs(ee); e = da.width < 60 ? 2 : da.width < 80 ? 4 : 6; let t; void 0 === D.getObjectByName("webbingGroup") ? ((t = new THREE.Group).name = "webbingGroup", D.add(t)) : t = D.getObjectByName("webbingGroup"), t.position.y = da.height - .5, po(t); let a, o, i, n, r, s, l; a = "Asymmetrical" === da.roofType ? da.asymmetrical : 0, o = a, r = p / (e + 1) * 2, s = p / (e / 2 + 1); for (w = 0; w < e; w++) i = w % 2 == 0 ? 0 == w ? (a -= r / 2, l = da.roofHeightAtX(o) - da.height - .35, n = Math.hypot(r / 2, l), THREE.Math.degToRad(-90) - Math.atan(l / (-r / 2))) : (a -= r, n = Math.hypot(o - a, l), THREE.Math.degToRad(-90) - Math.atan(l / -(o - a))) : (o -= s, l = da.roofHeightAtX(o) - da.height - .35, n = Math.hypot(o - a, l), THREE.Math.degToRad(90) + Math.atan(l / (o - a))), (WebbingClone = ze.clone()).name = "WebbingClone", WebbingClone.visible = !0, WebbingClone.scale.set(.6, n, .4), WebbingClone.rotation.z = i, WebbingClone.position.x = a, t.add(WebbingClone); a = "Asymmetrical" === da.roofType ? da.asymmetrical : 0, o = a, r = m / (e + 1) * 2, s = m / (e / 2 + 1); for (w = 0; w < e; w++) i = w % 2 == 0 ? 0 == w ? (a += r / 2, l = da.roofHeightAtX(o) - da.height - .35, n = Math.hypot(r / 2, l), THREE.Math.degToRad(90) - Math.atan(l / (r / 2))) : (a += r, n = Math.hypot(o - a, l), THREE.Math.degToRad(90) + Math.atan(l / (o - a))) : (o += s, l = da.roofHeightAtX(o) - da.height - .35, n = Math.hypot(o - a, l), THREE.Math.degToRad(-90) + Math.atan(l / (o - a))), (WebbingClone = ze.clone()).name = "WebbingClone", WebbingClone.visible = !0, WebbingClone.scale.set(.6, n, .4), WebbingClone.rotation.z = i, WebbingClone.position.x = a, t.add(WebbingClone) } g = D.getObjectByName("beamRoofL"), d = 0, ue = (u = Math.abs(K) - d) * da.roofPitch / 12; g.position.x = da.width / -2 + l + d, g.position.y = da.height - .4, g.morphTargetInfluences[g.morphTargetDictionary.length] = u - 1, g.morphTargetInfluences[g.morphTargetDictionary.slantTop] = ue, "Single Slope" !== da.roofType ? (u = pe - d, (g = D.getObjectByName("beamRoofR")).visible = !0, g.position.x = da.width / 2 - l - d, g.position.y = da.height - .4, g.morphTargetInfluences[g.morphTargetDictionary.length] = u - 1, g.rotation.z = -sa.rotation.z, u = de - d, (g = D.getObjectByName("beamRoofL")).visible = !0, g.position.x = da.width / -2 + l + d, g.position.y = da.height - .4, g.morphTargetInfluences[g.morphTargetDictionary.length] = u - 1, g.rotation.z = -la.rotation.z) : 0 <= da.roofPitch ? (g = D.getObjectByName("beamRoofL"), u = Math.abs(pe) + Math.abs(de) - 2 * d, g.visible = !0, g.position.x = da.width / -2 + l + d, g.position.y = da.height - .4, g.morphTargetInfluences[g.morphTargetDictionary.length] = u - 1, g.rotation.z = -la.rotation.z, (g = ha.getObjectByName("beamRoofR")).visible = !1) : (g = D.getObjectByName("beamRoofR"), u = Math.abs(pe) + Math.abs(de) - 2 * d, g.visible = !0, g.position.x = da.width / 2 - l - d, g.position.y = da.height - .4, g.morphTargetInfluences[g.morphTargetDictionary.length] = u - 1, g.rotation.z = -sa.rotation.z, (g = ha.getObjectByName("beamRoofL")).visible = !1), (B = new THREE.Group).name = "PostFrameClones", ha.add(B), ca = Vo(da.maxTrussSpacing, l, D, B), void 0 !== ia.getObjectByName("LeanTo1PostClones") && ia.getObjectByName("leanTo1").remove(ia.getObjectByName("LeanTo1PostClones")), void 0 !== ia.getObjectByName("LeanTo2PostClones") && ia.getObjectByName("leanTo2").remove(ia.getObjectByName("LeanTo2PostClones")), void 0 !== ia.getObjectByName("LeanTo3PostClones") && ia.getObjectByName("leanTo3").remove(ia.getObjectByName("LeanTo3PostClones")), void 0 !== ia.getObjectByName("LeanTo4PostClones") && ia.getObjectByName("leanTo4").remove(ia.getObjectByName("LeanTo4PostClones")); let e, t, a; switch (void 0 !== D.getObjectByName("columnSide") && (e = D.getObjectByName("columnSide")), void 0 !== D.getObjectByName("beamRoof") && (t = D.getObjectByName("beamRoof")), da.postFooting) { case "Post in Ground": a = D.getObjectByName("footing-Burried").clone(); break; case "Bracket on Concrete": case "Bracket": a = D.getObjectByName("footing").clone(); break; case "Perma-Column": a = D.getObjectByName("footing-PermaColumnConcretePost").clone(); break; default: a = !1 } var Ie = ra.getObjectByName("masterSecondaryFramingPiece"); if (da.leanTo1) { void 0 === na.getObjectByName("LeanTo1PostClones") && ((S = new THREE.Group).name = "LeanTo1PostClones", S.rotation.y = 0, na.getObjectByName("leanTo1").add(S), (H = new THREE.Group).name = "LeanTo1PostMaster", S.add(H)), a && ((E = a.clone()).name = "LeanToPostFooting", E.visible = !0, E.castShadow = !0, E.receiveShadow = !0, E.position.set(0, 0, da.leanTo1Depth - l - .08), H.add(E)); (E = e.clone()).name = "LeanToPost", E.visible = !0, E.castShadow = !0, E.receiveShadow = !0, E.position.set(0, 0, da.leanTo1Depth - l - .08), E.morphTargetInfluences[E.morphTargetDictionary.height] = da.leanTo1Height - da.leanTo1Depth * da.leanTo1Pitch / 12 - .5 - 1, H.add(E); s = E.getObjectByName("downspout-clone"); s && (s.position.x = -l - .08, s.rotation.y = Math.PI, s.morphTargetInfluences[s.morphTargetDictionary.height] = da.leanTo1Height - da.leanTo1Depth * da.leanTo1Pitch / 12 - 1); (E = t.clone()).name = "LeanToRoofBeam", E.visible = !0, E.castShadow = !0, E.receiveShadow = !0, E.position.set(0, da.leanTo1Height - da.leanTo1Depth * da.leanTo1Pitch / 12 - l, da.leanTo1Depth - l - .08), E.scale.x = da.leanTo1Depth / Math.cos((da.leanTo1Pitch - .5) / 12) - .5, E.rotation.y = Math.PI / 2, E.rotation.z = Math.atan(da.leanTo1Pitch / 12), H.add(E), void 0 !== na.getObjectByName("downspout") && void 0 !== H.getObjectByName("LeanToPost") && void 0 === H.getObjectByName("LeanToPost").getObjectByName("downspout-clone") && ((E = na.getObjectByName("downspout").clone()).name = "downspout-clone", E.visible = !0, E.castShadow = !0, E.receiveShadow = !0, E.rotation.y = THREE.Math.degToRad(-90), E.position.z = l, H.getObjectByName("LeanToPost").add(E)), da.gutters && 0 == da.hideWalls && ((T = H.getObjectByName("LeanToPost").getObjectByName("downspout-clone")).scale.y = 1 / T.parent.scale.y, T.morphTargetInfluences[T.morphTargetDictionary.height] = da.leanTo1Height - da.leanTo1Depth * da.leanTo1Pitch / 12 - 1); var b = da.leanTo1Length / 2 - l - .08, y = da.leanTo1Length / -2 + l + .08, f = Math.ceil((b - y) / V); H.position.x = b; for (w = 1; w <= f; w++)(r = na.getObjectByName("LeanTo1PostMaster").clone()).name = "LeanToTrussClone", r.position.x = b - w * (b - y) / f, da.gutters && da.settings.downspountsOnEndsOnly && w < f && (r.getObjectByName("LeanToPost").getObjectByName("downspout-clone").visible = !1), S.add(r); if (da.leanTo1Enclosed && "Fully Enclosed" == da.leanTo1Walls) for (w = 0, be = da.leanTo1Height - da.leanTo1Depth * da.leanTo1Pitch / 12; w < da.leanTo1Height / da.girtSpacing;) w < be / da.girtSpacing ? ((E = Ie.clone()).position.set(0, w * da.girtSpacing + .05, da.leanTo1Depth - l / 4), E.rotation.y = Math.PI / 2, E.scale.z = da.leanTo1Length, E.scale.y = da.girtThickness, da.hideWalls < 3 ? E.visible = !0 : E.visible = !1, S.add(E), (E = Ie.clone()).position.set(da.leanTo1Length / 2 - l / 4, w * da.girtSpacing + .05, da.leanTo1Depth / 2 - .2), E.rotation.y = 0, E.scale.z = da.leanTo1Depth, E.scale.y = da.girtThickness, da.hideWalls < 3 ? E.visible = !0 : E.visible = !1, S.add(E), (E = Ie.clone()).position.set(da.leanTo1Length / -2 + l / 4, w * da.girtSpacing + .05, da.leanTo1Depth / 2 - .2), E.rotation.y = 0, E.scale.z = da.leanTo1Depth) : (I = (w * da.girtSpacing - da.leanTo1Height) / (da.leanTo1Pitch / 12) + 1, (E = Ie.clone()).position.set(da.leanTo1Length / 2 - l / 4, w * da.girtSpacing + .05, I / -2 - .2), E.rotation.y = 0, E.scale.z = I, E.scale.y = da.girtThickness, da.hideWalls < 3 ? E.visible = !0 : E.visible = !1, S.add(E), (E = Ie.clone()).position.set(da.leanTo1Length / -2 + l / 4, w * da.girtSpacing + .05, I / -2 - .2), E.rotation.y = 0, E.scale.z = I), E.scale.y = da.girtThickness, da.hideWalls < 3 ? E.visible = !0 : E.visible = !1, S.add(E), w++ } if (da.leanTo3) { void 0 === na.getObjectByName("LeanTo3PostClones") && ((N = new THREE.Group).name = "LeanTo3PostClones", N.rotation.y = Math.PI, na.getObjectByName("leanTo3").add(N), (L = new THREE.Group).name = "LeanTo3PostMaster", N.add(L)), a && ((E = a.clone()).name = "LeanToPostFooting", E.visible = !0, E.castShadow = !0, E.receiveShadow = !0, E.rotation.set(0, 0, 0), E.position.set(0, 0, da.leanTo3Depth - l - .08), L.add(E)), (E = e.clone()).name = "LeanToPost", E.visible = !0, E.castShadow = !0, E.receiveShadow = !0, E.position.set(0, 0, da.leanTo3Depth - l - .08), E.morphTargetInfluences[E.morphTargetDictionary.height] = da.leanTo3Height - da.leanTo3Depth * da.leanTo3Pitch / 12 - .5 - 1, L.add(E); var Fe = E.getObjectByName("downspout-clone"), b = (Fe && (Fe.position.x = -l - .08, Fe.rotation.y = Math.PI, Fe.morphTargetInfluences[Fe.morphTargetDictionary.height] = da.leanTo3Height - da.leanTo3Depth * da.leanTo3Pitch / 12 - 1), (E = t.clone()).name = "LeanToRoofBeam", E.visible = !0, E.castShadow = !0, E.receiveShadow = !0, E.position.set(0, da.leanTo3Height - da.leanTo3Depth * da.leanTo3Pitch / 12 - l, da.leanTo3Depth - l - .08), E.scale.x = da.leanTo3Depth / Math.cos((da.leanTo3Pitch - .5) / 12) - .5, E.rotation.y = Math.PI / 2, E.rotation.z = Math.atan(da.leanTo3Pitch / 12), L.add(E), void 0 !== ia.getObjectByName("downspout") && void 0 !== L.getObjectByName("LeanToPost") && void 0 === L.getObjectByName("LeanToPost").getObjectByName("downspout-clone") && ((E = ia.getObjectByName("downspout").clone()).name = "downspout-clone", E.visible = !0, E.castShadow = !0, E.receiveShadow = !0, E.rotation.y = THREE.Math.degToRad(-90), E.position.z = l, L.getObjectByName("LeanToPost").add(E)), da.gutters && 0 == da.hideWalls && ((p = L.getObjectByName("LeanToPost").getObjectByName("downspout-clone")).scale.y = 1 / p.parent.scale.y, p.morphTargetInfluences[p.morphTargetDictionary.height] = da.leanTo3Height - da.leanTo3Depth * da.leanTo3Pitch / 12 - 1), da.leanTo3Length / 2 - l - .08), y = da.leanTo3Length / -2 + l + .08, f = Math.ceil((b - y) / V); L.position.x = b; for (w = 1; w <= f; w++)(r = ia.getObjectByName("LeanTo3PostMaster").clone()).name = "LeanToTrussClone", r.position.x = b - w * (b - y) / f, da.gutters && da.settings.downspountsOnEndsOnly && w < f && (r.getObjectByName("LeanToPost").getObjectByName("downspout-clone").visible = !1), N.add(r); if (da.leanTo3Enclosed && "Fully Enclosed" == da.leanTo3Walls) for (w = 0, ye = da.leanTo3Height - da.leanTo3Depth * da.leanTo3Pitch / 12; w < da.leanTo3Height / da.girtSpacing;) w < ye / da.girtSpacing ? ((E = Ie.clone()).position.set(0, w * da.girtSpacing + .05, da.leanTo3Depth - l / 4), E.rotation.y = Math.PI / 2, E.scale.z = da.leanTo3Length, E.scale.y = da.girtThickness, da.hideWalls < 3 ? E.visible = !0 : E.visible = !1, N.add(E), (E = Ie.clone()).position.set(da.leanTo3Length / 2 - l / 4, w * da.girtSpacing + .05, da.leanTo3Depth / 2 - .2), E.rotation.y = 0, E.scale.z = da.leanTo3Depth, E.scale.y = da.girtThickness, da.hideWalls < 3 ? E.visible = !0 : E.visible = !1, N.add(E), (E = Ie.clone()).position.set(da.leanTo3Length / -2 + l / 4, w * da.girtSpacing + .05, da.leanTo3Depth / 2 - .2), E.rotation.y = 0, E.scale.z = da.leanTo3Depth) : (I = (w * da.girtSpacing - da.leanTo3Height) / (da.leanTo3Pitch / 12) + 1, (E = Ie.clone()).position.set(da.leanTo3Length / 2 - l / 4, w * da.girtSpacing + .05, I / -2 - .2), E.rotation.y = 0, E.scale.z = I, E.scale.y = da.girtThickness, da.hideWalls < 3 ? E.visible = !0 : E.visible = !1, N.add(E), (E = Ie.clone()).position.set(da.leanTo3Length / -2 + l / 4, w * da.girtSpacing + .05, I / -2 - .2), E.rotation.y = 0, E.scale.z = I), E.scale.y = da.girtThickness, da.hideWalls < 3 ? E.visible = !0 : E.visible = !1, N.add(E), w++ } if (da.leanTo2) { void 0 === ia.getObjectByName("LeanTo2PostClones") && ((C = new THREE.Group).name = "LeanTo2PostClones", C.rotation.y = Math.PI / -2, ia.getObjectByName("leanTo2").add(C), (j = new THREE.Group).name = "LeanTo2PostMaster", C.add(j)), a && ((E = a.clone()).name = "LeanToPostFooting", E.visible = !0, E.castShadow = !0, E.receiveShadow = !0, E.position.set(0, 0, da.leanTo2Depth - l - .08), j.add(E)), (E = e.clone()).name = "LeanToPost", E.visible = !0, E.castShadow = !0, E.receiveShadow = !0, E.position.set(0, 0, da.leanTo2Depth - l - .08), E.morphTargetInfluences[E.morphTargetDictionary.height] = da.leanTo2Height - da.leanTo2Depth * da.leanTo2Pitch / 12 - .5 - 1, j.add(E); var m = E.getObjectByName("downspout-clone"), b = (m && (m.position.x = -l - .08, m.rotation.y = Math.PI, m.morphTargetInfluences[m.morphTargetDictionary.height] = da.leanTo2Height - da.leanTo2Depth * da.leanTo2Pitch / 12 - 1), (E = t.clone()).name = "LeanToRoofBeam", E.visible = !0, E.castShadow = !0, E.receiveShadow = !0, E.position.set(0, da.leanTo2Height - da.leanTo2Depth * da.leanTo2Pitch / 12 - l, da.leanTo2Depth - l - .08), E.scale.x = da.leanTo2Depth / Math.cos((da.leanTo2Pitch - .5) / 12) - .5, E.rotation.y = Math.PI / 2, E.rotation.z = Math.atan(da.leanTo2Pitch / 12), j.add(E), void 0 !== ia.getObjectByName("downspout") && void 0 !== j.getObjectByName("LeanToPost") && void 0 === j.getObjectByName("LeanToPost").getObjectByName("downspout-clone") && ((E = ia.getObjectByName("downspout").clone()).name = "downspout-clone", E.visible = !0, E.castShadow = !0, E.receiveShadow = !0, E.rotation.y = THREE.Math.degToRad(-90), E.position.z = l, j.getObjectByName("LeanToPost").add(E)), da.gutters && 0 == da.hideWalls && ((ue = j.getObjectByName("LeanToPost").getObjectByName("downspout-clone")).scale.y = 1 / ue.parent.scale.y, ue.morphTargetInfluences[ue.morphTargetDictionary.height] = da.leanTo2Height - da.leanTo2Depth * da.leanTo2Pitch / 12 - 1), da.leanTo2Length / 2 - l - .08), y = da.leanTo2Length / -2 + l + .08, f = Math.ceil((b - y) / V); j.position.x = b; for (w = 1; w <= f; w++)(r = ia.getObjectByName("LeanTo2PostMaster").clone()).name = "LeanToTrussClone", r.position.x = b - w * (b - y) / f, da.gutters && da.settings.downspountsOnEndsOnly && w < f && (r.getObjectByName("LeanToPost").getObjectByName("downspout-clone").visible = !1), C.add(r); if (da.leanTo2Enclosed && "Fully Enclosed" == da.leanTo2Walls) for (w = 0, fe = da.leanTo2Height - da.leanTo2Depth * da.leanTo2Pitch / 12; w < da.leanTo2Height / da.girtSpacing;) w < fe / da.girtSpacing ? ((E = Ie.clone()).position.set(0, w * da.girtSpacing + .05, da.leanTo2Depth - l / 4), E.rotation.y = Math.PI / 2, E.scale.z = da.leanTo2Length, E.scale.y = da.girtThickness, da.hideWalls < 3 ? E.visible = !0 : E.visible = !1, C.add(E), (E = Ie.clone()).position.set(da.leanTo2Length / 2 - l / 4, w * da.girtSpacing + .05, da.leanTo2Depth / 2 - .2), E.rotation.y = 0, E.scale.z = da.leanTo2Depth, E.scale.y = da.girtThickness, da.hideWalls < 3 ? E.visible = !0 : E.visible = !1, C.add(E), (E = Ie.clone()).position.set(da.leanTo2Length / -2 + l / 4, w * da.girtSpacing + .05, da.leanTo2Depth / 2 - .2), E.rotation.y = 0, E.scale.z = da.leanTo2Depth) : (I = (w * da.girtSpacing - da.leanTo2Height) / (da.leanTo2Pitch / 12) + 1, (E = Ie.clone()).position.set(da.leanTo2Length / 2 - l / 4, w * da.girtSpacing + .05, I / -2 - .2), E.rotation.y = 0, E.scale.z = I, E.scale.y = da.girtThickness, da.hideWalls < 3 ? E.visible = !0 : E.visible = !1, C.add(E), (E = Ie.clone()).position.set(da.leanTo2Length / -2 + l / 4, w * da.girtSpacing + .05, I / -2 - .2), E.rotation.y = 0, E.scale.z = I), E.scale.y = da.girtThickness, da.hideWalls < 3 ? E.visible = !0 : E.visible = !1, C.add(E), w++ } if (da.leanTo4) { void 0 === ia.getObjectByName("LeanTo4PostClones") && ((z = new THREE.Group).name = "LeanTo4PostClones", z.rotation.y = Math.PI / 2, ia.getObjectByName("leanTo4").add(z), (Vt = new THREE.Group).name = "LeanTo4PostMaster", z.add(Vt)), a && ((E = a.clone()).name = "LeanToPostFooting", E.visible = !0, E.castShadow = !0, E.receiveShadow = !0, E.position.set(0, 0, da.leanTo4Depth - l - .08), Vt.add(E)), (E = e.clone()).name = "LeanToPost", E.visible = !0, E.castShadow = !0, E.receiveShadow = !0, E.position.set(0, 0, da.leanTo4Depth - l - .08), E.morphTargetInfluences[E.morphTargetDictionary.height] = da.leanTo4Height - da.leanTo4Depth * da.leanTo4Pitch / 12 - .5 - 1, Vt.add(E); var u = E.getObjectByName("downspout-clone"), b = (u && (u.position.x = -l - .08, u.rotation.y = Math.PI, u.morphTargetInfluences[u.morphTargetDictionary.height] = da.leanTo4Height - da.leanTo4Depth * da.leanTo4Pitch / 12 - 1), (E = t.clone()).name = "LeanToRoofBeam", E.visible = !0, E.castShadow = !0, E.receiveShadow = !0, E.position.set(0, da.leanTo4Height - da.leanTo4Depth * da.leanTo4Pitch / 12 - l, da.leanTo4Depth - l - .08), E.scale.x = da.leanTo4Depth / Math.cos((da.leanTo4Pitch - .5) / 12) - .5, E.rotation.y = Math.PI / 2, E.rotation.z = Math.atan(da.leanTo4Pitch / 12), Vt.add(E), void 0 !== ia.getObjectByName("downspout") && void 0 !== Vt.getObjectByName("LeanToPost") && void 0 === Vt.getObjectByName("LeanToPost").getObjectByName("downspout-clone") && ((E = ia.getObjectByName("downspout").clone()).name = "downspout-clone", E.visible = !0, E.castShadow = !0, E.receiveShadow = !0, E.rotation.y = THREE.Math.degToRad(-90), E.position.z = l, Vt.getObjectByName("LeanToPost").add(E)), da.gutters && 0 == da.hideWalls && ((g = Vt.getObjectByName("LeanToPost").getObjectByName("downspout-clone")).scale.y = 1 / g.parent.scale.y, g.morphTargetInfluences[g.morphTargetDictionary.height] = da.leanTo4Height - da.leanTo4Depth * da.leanTo4Pitch / 12 - 1), da.leanTo4Length / 2 - l - .08), y = da.leanTo4Length / -2 + l + .08, f = Math.ceil((b - y) / V); Vt.position.x = b; for (w = 1; w <= f; w++)(r = ia.getObjectByName("LeanTo4PostMaster").clone()).name = "LeanToTrussClone", r.position.x = b - w * (b - y) / f, da.gutters && da.settings.downspountsOnEndsOnly && w < f && (r.getObjectByName("LeanToPost").getObjectByName("downspout-clone").visible = !1), z.add(r); if (da.leanTo4Enclosed && "Fully Enclosed" == da.leanTo4Walls) for (w = 0, we = da.leanTo4Height - da.leanTo4Depth * da.leanTo4Pitch / 12; w < da.leanTo4Height / da.girtSpacing;) w < we / da.girtSpacing ? ((E = Ie.clone()).position.set(0, w * da.girtSpacing + .05, da.leanTo4Depth - l / 4), E.rotation.y = Math.PI / 2, E.scale.z = da.leanTo4Length, E.scale.y = da.girtThickness, da.hideWalls < 3 ? E.visible = !0 : E.visible = !1, z.add(E), (E = Ie.clone()).position.set(da.leanTo4Length / 2 - l / 4, w * da.girtSpacing + .05, da.leanTo4Depth / 2 - .2), E.rotation.y = 0, E.scale.z = da.leanTo4Depth, E.scale.y = da.girtThickness, da.hideWalls < 3 ? E.visible = !0 : E.visible = !1, z.add(E), (E = Ie.clone()).position.set(da.leanTo4Length / -2 + l / 4, w * da.girtSpacing + .05, da.leanTo4Depth / 2 - .2), E.rotation.y = 0, E.scale.z = da.leanTo4Depth) : (I = (w * da.girtSpacing - da.leanTo4Height) / (da.leanTo4Pitch / 12) + 1, (E = Ie.clone()).position.set(da.leanTo4Length / 2 - l / 4, w * da.girtSpacing + .05, I / -2 - .2), E.rotation.y = 0, E.scale.z = I, E.scale.y = da.girtThickness, da.hideWalls < 3 ? E.visible = !0 : E.visible = !1, z.add(E), (E = Ie.clone()).position.set(da.leanTo4Length / -2 + l / 4, w * da.girtSpacing + .05, I / -2 - .2), E.rotation.y = 0, E.scale.z = I), E.scale.y = da.girtThickness, da.hideWalls < 3 ? E.visible = !0 : E.visible = !1, z.add(E), w++ } var ke = da.girtSpacing, Ge = da.purlinSpacing; (F = new THREE.Group).name = "GirtParent", B.add(F), 2 < da.hideWalls ? F.visible = !1 : F.visible = !0, (Kt = new THREE.Group).name = "PurlinParentL", Kt.position.set(da.width / -2 + l + .1, te, 0), Kt.rotation.z = Math.PI / 2 - i, da.roofPitch < 0 && (Kt.rotation.z = Math.PI / -2 - i), F.add(Kt); (aa = new THREE.Group).name = "PurlinParentR", aa.position.set(da.width / 2 - l - .1, ae, 0), aa.rotation.z = n - Math.PI / -2, da.roofPitch < 0 && (aa.rotation.z = n - Math.PI / 2), F.add(aa), da.depth; for (v = ia.getObjectByName("masterSecondaryFramingPiece").clone(), w = 0; w < q / Ge;) { E = v.clone(); let e = 0; da.flushPurlins || da.standingPurlins ? (da.flushPurlins && (e = da.purlinThickness / 2 + .0625), da.standingPurlins && (e = 0), "Single Slope" === da.roofType && (e = 0 <= da.roofPitch ? da.purlinThickness / 2 + .1 : da.purlinThickness / 2 + .2)) : (E.rotation.z = Math.PI / 2, e = 0, "Single Slope" === da.roofType && (e = 0 <= da.roofPitch ? .1 : .2)), E.position.set(w * Ge, l / 2 - e, 0), E.scale.y = da.purlinThickness, E.scale.z = da.depth - l, E.rotation.y = 0, E.visible = !0, Kt.add(E), w++ } for (w = 0; w < A / Ge;) { E = v.clone(); let e; da.flushPurlins || da.standingPurlins ? (da.flushPurlins && (e = da.purlinThickness / 2 + .0625), da.standingPurlins && (e = 0), "Single Slope" === da.roofType && (e = 0 <= da.roofPitch ? da.purlinThickness / 2 - .05 : da.purlinThickness / 2 - .2)) : (E.rotation.z = Math.PI / 2, e = 0, "Single Slope" === da.roofType && (e = 0 <= da.roofPitch ? -.15 : -.25)), "Single Slope" === da.roofType ? E.position.set(w * -Ge, -l / 2 - e, 0) : E.position.set(w * Ge, -l / 2 + e, 0), E.scale.y = da.purlinThickness, E.scale.z = da.depth - l, E.rotation.y = 0, E.visible = !0, aa.add(E), w++ }(E = t.clone()).position.set(da.width / 2 - l - 2 / 12 / 2, da.wallHeightR() - .5, (da.depth - l) / 2), E.scale.x = da.depth - l, E.rotation.y = THREE.Math.degToRad(90), E.visible = !0, F.add(E), (E = t.clone()).position.set(da.width / -2 + l + 2 / 12 / 2, da.wallHeightL() - .5, (da.depth - l) / 2), E.scale.x = da.depth - l, E.rotation.y = THREE.Math.degToRad(90), E.visible = !0, F.add(E), "Single Slope" === da.roofType && (0 <= da.roofPitch ? (E = t.clone()).position.set(da.width / 2 - l - 2 / 12 / 2, da.wallHeightL() - .5, (da.depth - l) / 2) : (E = t.clone()).position.set(da.width / -2 + l + 2 / 12 / 2, da.wallHeightR() - .5, (da.depth - l) / 2), E.scale.x = da.depth - l, E.rotation.y = THREE.Math.degToRad(90), E.visible = !0, F.add(E)), da.settings.showPostFrameBottomPlate && ((E = v.clone()).rotation.z = Math.PI / 2, bottomPlateFlushOffset = da.girtThickness / 2, E.position.set(da.width / -2 - .04 + l / 1.9 + bottomPlateFlushOffset + 1 / 12, .05, 0), E.scale.y = da.girtThickness, E.scale.z = da.depth - l, E.rotation.y = 0, E.visible = !0, F.add(E), (E = v.clone()).rotation.z = Math.PI / 2, E.position.set(da.width / 2 + .04 - l / 1.9 - bottomPlateFlushOffset - 1 / 12, .05, 0), E.scale.y = da.girtThickness, E.scale.z = da.depth - l, E.rotation.y = 0, E.visible = !0, F.add(E)); for (w = 0; w < U / ke;) { if (w < da.wallHeightL() / ke && da.enclosedE) { E = v.clone(); let e = 0; da.flushGirts && (E.rotation.z = Math.PI / 2, e = da.girtThickness / 2), E.position.set(da.width / -2 - .04 + l / 1.9 + e, w * ke + .05, 0), E.scale.y = da.girtThickness, E.scale.z = da.depth - l, E.rotation.y = 0, E.visible = !0, F.add(E) } if (w < da.wallHeightR() / ke && da.enclosedW) { E = v.clone(); let e = 0; da.flushGirts && (E.rotation.z = Math.PI / 2, e = da.girtThickness / 2), E.position.set(da.width / 2 + .04 - l / 1.9 - e, w * ke + .05, 0), E.scale.y = da.girtThickness, E.scale.z = da.depth - l, da.flushGirts && (E.rotation.z = Math.PI / 2), E.rotation.y = 0, E.visible = !0, F.add(E) } let e = 0; da.flushGirts && (e = da.girtThickness / 2), w < da.height / ke && (da.enclosedS && (E = v.clone(), da.flushGirts && (E.rotation.z = Math.PI / 2), E.position.set(0, w * ke + .05, da.depth / -2 + l / 1.9 + e), E.rotation.y = Math.PI / 2, E.scale.y = da.girtThickness, E.scale.z = da.width - .25, E.visible = !0, F.add(E)), da.enclosedN) && (E = v.clone(), da.flushGirts && (E.rotation.z = Math.PI / 2), E.position.set(0, w * ke + .05, da.depth / 2 - l / 1.9 - e), E.rotation.y = Math.PI / 2, E.scale.y = da.girtThickness, E.scale.z = da.width - .25, E.visible = !0, F.add(E)), w++ } if (!da.flushGirts) for (; w < (Q + da.height - .1) / ke;) { De = w * ke - da.height, Me = ("Single Slope" !== da.roofType && (X = "Asymmetrical" === da.roofType ? De / Q * da.asymmetrical : ($ = da.width / 2, _ = da.width / 2, n = i = k, 0)), $ - (De + .5) / Math.tan(Math.PI / 2 - i)), We = _ - (De + .5) / Math.tan(Math.PI / 2 - n); da.enclosedS && ((E = v.clone()).position.set(X, w * ke + .05, da.depth / -2 + l / 1.9), E.rotation.y = Math.PI / 2, E.scale.y = da.girtThickness, E.scale.z = Me + We - .25, E.visible = !0, F.add(E)), da.enclosedN && ((E = v.clone()).position.set(X, w * ke + .05, da.depth / 2 - l / 1.9), E.rotation.y = Math.PI / 2, E.scale.y = da.girtThickness, E.scale.z = Me + We - .25, E.visible = !0, F.add(E)), w++ } da.settings.hasOwnProperty("alternatePostSpacingOver40FT") && (40 < da.width ? da.maxPostSpacing = da.settings.alternatePostSpacingOver40FT.over : da.maxPostSpacing = da.settings.alternatePostSpacingOver40FT.under); for (xe = Math.ceil(da.width / da.maxPostSpacing) - 1, Oe = da.depth / 2 - (l + .125), Re = da.width / ((xe = xe < 0 ? 0 : xe) + 1), P = 0, Be = 0, w = 1; w <= xe; w++) { switch (P = da.width / -2 + Re * w, Be = da.height - 1 - 1, (E = D.getObjectByName("columnEnd").clone()).name += "-clone", !da.settings.hasOwnProperty("showPostsWithOpenGableWall") || da.settings.showPostsWithOpenGableWall || da.enclosedN ? (E.visible = !0, da.settings.showPostFrameBottomPlate && ((bottomPlateClonedObject = v.clone()).rotation.z = Math.PI / 2, bottomPlateFlushOffset = da.girtThickness / 2, bottomPlateClonedObject.position.set(0, .05, da.depth / 2 + .04 - l / 1.9 - bottomPlateFlushOffset - .125), bottomPlateClonedObject.scale.y = da.girtThickness, bottomPlateClonedObject.scale.z = da.width - l, bottomPlateClonedObject.rotation.y = THREE.Math.degToRad(90), bottomPlateClonedObject.visible = !0, F.add(bottomPlateClonedObject), (bottomPlateClonedObject = v.clone()).rotation.z = Math.PI / 2, bottomPlateClonedObject.position.set(0, .05, da.depth / -2 - .04 + l / 1.9 + bottomPlateFlushOffset + .125), bottomPlateClonedObject.scale.y = da.girtThickness, bottomPlateClonedObject.scale.z = da.width - l, bottomPlateClonedObject.rotation.y = THREE.Math.degToRad(90), bottomPlateClonedObject.visible = !0, F.add(bottomPlateClonedObject))) : E.visible = !1, E.position.set(P, 0, Oe), E.morphTargetInfluences[E.morphTargetDictionary.height] = Be, B.add(E), da.postFooting) { case "Post in Ground": var $e = D.getObjectByName("footing-Burried").clone(); break; case "Bracket on Concrete": case "Bracket": $e = D.getObjectByName("footing").clone(); break; case "Perma-Column": $e = D.getObjectByName("footing-PermaColumnConcretePost").clone(); break; default: $e = !1 } if ($e && ($e.visible = !0, $e.position.set(0, 0, 0), E.add($e)), (E = D.getObjectByName("columnEnd").clone()).name += "-clone", !da.settings.hasOwnProperty("showPostsWithOpenGableWall") || da.settings.showPostsWithOpenGableWall || da.enclosedS ? E.visible = !0 : E.visible = !1, E.position.set(P, 0, -Oe), E.morphTargetInfluences[E.morphTargetDictionary.height] = Be, B.add(E), $e && ((Y = $e.clone()).visible = !0, Y.position.set(0, 0, 0), E.add(Y)), 0 < da.mezzanineBays) { var _e = ca; _e.sort(function(e, t) { return e - t }); for (He = 1; He <= da.mezzanineBays; He++)(E = D.getObjectByName("columnEnd").clone()).name += "-clone", E.visible = !0, E.position.set(P, 0, _e[He]), E.scale.y = da.mezzanineHeight - .5, B.add(E) } } } if ("Hybrid" == da.frameType) { (ha = ya).visible = !0; var M, W = fa, Z = 0, l = ("Asymmetrical" === da.roofType && (Z = da.asymmetrical), .3), J = .66, K = da.width / -2 + l - Z, ee = da.width / -2 + l + Z, te = da.wallHeightL() - .5, ae = da.wallHeightR() - .5, h = 2, oe = (h = da.width < 25 ? 1.23 : h, (Math.PI - i) / 2), ie = (Math.PI - n) / 2, ne = h / Math.sin(oe), re = h / Math.sin(ie), se = Math.sqrt(Math.pow(ne, 2) - Math.pow(h, 2)), le = Math.sqrt(Math.pow(re, 2) - Math.pow(h, 2)), he = Math.sqrt(Math.pow(te - se, 2) + Math.pow(h - J, 2)), ce = Math.sqrt(Math.pow(ae - le, 2) + Math.pow(h - J, 2)), de = (Math.atan(se / ne), Math.atan(le / re), Math.acos((te - se) / he), Math.acos((ae - le) / ce), Math.abs(K) / Math.sin(i)), pe = Math.abs(ee) / Math.sin(n), me = (Math.abs(K), Math.sin(i), Math.abs(ee), Math.sin(n), Math.abs(h) / Math.sin(i)), ge = Math.abs(h) / Math.sin(n), Ne = da.roofHeightAtX(0) - da.height; Math.max(me, ge); if ((c = W.getObjectByName("columnSideL")).position.x = da.width / -2 + l + 2 / 12 / 2, c.morphTargetInfluences[c.morphTargetDictionary.height] = te - 1.1, c.morphTargetInfluences[c.morphTargetDictionary.slantTop] = -2 * Math.tan(i - Math.PI / 2), (c = W.getObjectByName("columnSideR")).position.x = da.width / 2 - l - 2 / 12 / 2, c.morphTargetInfluences[c.morphTargetDictionary.height] = ae - 1.1, c.morphTargetInfluences[c.morphTargetDictionary.slantTop] = -2 * Math.tan(n - Math.PI / 2), void 0 !== W.getObjectByName("footingL") && (M = W.getObjectByName("footingL")).userData.type !== da.postFooting && (M.parent.remove(M), M.geometry.dispose(), M = void 0), void 0 !== ia.getObjectByName("downspout") && void 0 !== W.getObjectByName("columnSideL") && void 0 !== W.getObjectByName("columnSideR") && void 0 === W.getObjectByName("columnSideL").getObjectByName("downspout-clone") && void 0 === W.getObjectByName("columnSideR").getObjectByName("downspout-clone") && ((E = ia.getObjectByName("downspout").clone()).name = "downspout-clone", E.visible = !0, E.castShadow = !0, E.receiveShadow = !0, E.rotation.y = THREE.Math.degToRad(180), E.position.x = -l, W.getObjectByName("columnSideL").add(E), W.getObjectByName("columnSideR").add(E.clone())), da.gutters && (s = W.getObjectByName("columnSideL").getObjectByName("downspout-clone"), T = W.getObjectByName("columnSideR").getObjectByName("downspout-clone"), s.morphTargetInfluences[s.morphTargetDictionary.height] = da.height - 1.2 - da.eaveL / Math.hypot(12, da.roofPitch) * da.roofPitch, T.morphTargetInfluences[T.morphTargetDictionary.height] = da.height - 1.2 - da.eaveR / Math.hypot(12, da.roofPitch) * da.roofPitch, s.morphTargetInfluences[s.morphTargetDictionary.downspoutOverhang] = da.eaveL / Math.hypot(12, da.roofPitch) * 12, T.morphTargetInfluences[T.morphTargetDictionary.downspoutOverhang] = da.eaveR / Math.hypot(12, da.roofPitch) * 12, 0 < da.hideWalls ? (s.visible = !1, T.visible = !1) : ("Single Slope" != da.roofType || "Single Slope" == da.roofType && 0 < da.roofPitch ? s.visible = !0 : s.visible = !1, "Single Slope" != da.roofType || "Single Slope" == da.roofType && da.roofPitch < 0 ? T.visible = !0 : T.visible = !1)), void 0 === W.getObjectByName("footingL")) { switch (da.postFooting) { case "Post in Ground": M = W.getObjectByName("footing-Burried").clone(); break; case "Bracket on Concrete": case "Bracket": M = W.getObjectByName("footing").clone(); break; case "Perma-Column": M = W.getObjectByName("footing-PermaColumnConcretePost").clone(); break; default: M = !1 } M && (M.rotation.y = THREE.Math.degToRad(90), M.visible = !0, M.name = "footingL", M.userData.type = da.postFooting, W.add(M)) } else M = W.getObjectByName("footingL"); M && (M.position.x = da.width / -2 + l + 2 / 12 / 2, void 0 !== W.getObjectByName("footingR") && (dt = W.getObjectByName("footingR")).userData.type !== da.postFooting && (dt.parent.remove(dt), dt.geometry.dispose(), dt = void 0), void 0 === W.getObjectByName("footingR") ? ((dt = M.clone()).rotation.y = THREE.Math.degToRad(90), dt.name = "footingR", dt.userData.type = da.postFooting, W.add(dt)) : dt = W.getObjectByName("footingR"), dt.position.x = da.width / 2 - l - 2 / 12 / 2); var x, qe = W.getObjectByName("beamRoofL"), Ae = 1.5, d = .375, Ve = Math.abs(K) - d, Ue = Math.abs(ee) - d, Qe = "Single Slope" === da.roofType ? (G = 12 / ((da.width - l - l) / Q), 12 / (-(da.width - l - l) / Q)) : "Asymmetrical" === da.roofType ? (G = 12 / ($ / Q), 12 / (_ / Q)) : (G = 12 / ((da.width / 2 - l + Z) / Q), 12 / ((da.width / 2 - l - Z) / Q)), Xe = Ae * G / 12, Ye = Ae * Qe / 12, Ze = (qe.position.x = da.width / -2 + l + d, qe.position.y = da.height - .4, qe.morphTargetInfluences[qe.morphTargetDictionary.length] = Ve - 1, qe.morphTargetInfluences[qe.morphTargetDictionary.shear] = Xe, "Single Slope" !== da.roofType ? (Ue = pe - d, (beamR = W.getObjectByName("beamRoofR")).visible = !0, beamR.position.x = da.width / 2 - l - d, beamR.position.y = da.height - .4, beamR.morphTargetInfluences[beamR.morphTargetDictionary.length] = Ue - 1, beamR.morphTargetInfluences[beamR.morphTargetDictionary.shear] = Ye, beamR.rotation.z = sa.rotation.z, beamR.rotation.y = THREE.Math.degToRad(0), Ve = de - d, (qe = W.getObjectByName("beamRoofL")).visible = !0, qe.position.x = da.width / -2 + l + d, qe.position.y = da.height - .4, qe.morphTargetInfluences[qe.morphTargetDictionary.length] = Ve - 1, qe.morphTargetInfluences[qe.morphTargetDictionary.shear] = Xe, qe.rotation.z = -la.rotation.z) : 0 <= da.roofPitch ? (qe = W.getObjectByName("beamRoofL"), Ve = Math.abs(pe) + Math.abs(de) - 2 * d, qe.visible = !0, qe.position.x = da.width / -2 + l + d, qe.position.y = da.height - .4, qe.morphTargetInfluences[qe.morphTargetDictionary.length] = Ve - 1, qe.morphTargetInfluences[qe.morphTargetDictionary.shear] = Xe, qe.rotation.z = -la.rotation.z, (beamR = W.getObjectByName("beamRoofR")).visible = !1) : (beamR = W.getObjectByName("beamRoofR"), Ue = Math.abs(pe) + Math.abs(de) - 2 * d, beamR.visible = !0, beamR.position.x = da.width / 2 - l - d, beamR.position.y = da.height - .4, beamR.morphTargetInfluences[beamR.morphTargetDictionary.length] = Ue - 1, beamR.morphTargetInfluences[beamR.morphTargetDictionary.shear] = -Ye, beamR.rotation.z = sa.rotation.z, beamR.rotation.y = THREE.Math.degToRad(0), (qe = W.getObjectByName("beamRoofL")).visible = !1), W.getObjectByName("webbing")), O = 2 * Ae / Math.sqrt(3); po(qe), po(beamR); for (w = 0; w < Ve / O; w++)(x = Ze.clone()).position.x = w * O, x.rotation.z = THREE.Math.degToRad(30), x.morphTargetInfluences[x.morphTargetDictionary.length] = O - 1, w * O + O / 2 < Ve - Xe && (x.visible = !0), qe.add(x), 0 < w && ((x = Ze.clone()).position.x = w * O, x.rotation.z = THREE.Math.degToRad(-30), x.morphTargetInfluences[x.morphTargetDictionary.length] = O - 1, x.visible = !0, qe.add(x)); for (w = 0; w < Ue / O; w++)(x = Ze.clone()).position.x = w * O, x.rotation.z = THREE.Math.degToRad(30), x.morphTargetInfluences[x.morphTargetDictionary.length] = O - 1, w * O + O / 2 < Ue - Ye && (x.visible = !0), beamR.add(x), 0 < w && ((x = Ze.clone()).position.x = w * O, x.rotation.z = THREE.Math.degToRad(-30), x.morphTargetInfluences[x.morphTargetDictionary.length] = O - 1, x.visible = !0, beamR.add(x)); (B = new THREE.Group).name = "HybridFrameClones", ha.add(B), ca = Vo(da.maxTrussSpacing, l, W, B), void 0 !== ia.getObjectByName("LeanTo1PostClones") && ia.getObjectByName("leanTo1").remove(ia.getObjectByName("LeanTo1PostClones")), void 0 !== ia.getObjectByName("LeanTo2PostClones") && ia.getObjectByName("leanTo2").remove(ia.getObjectByName("LeanTo2PostClones")), void 0 !== ia.getObjectByName("LeanTo3PostClones") && ia.getObjectByName("leanTo3").remove(ia.getObjectByName("LeanTo3PostClones")), void 0 !== ia.getObjectByName("LeanTo4PostClones") && ia.getObjectByName("leanTo4").remove(ia.getObjectByName("LeanTo4PostClones")); let e, t, a; if (void 0 !== W.getObjectByName("columnSide") && (e = W.getObjectByName("columnSide")), void 0 !== W.getObjectByName("beamRoof") && (t = W.getObjectByName("beamRoof")), a = !1, da.hasOwnProperty("postFooting")) switch (da.postFooting) { case "Post in Ground": a = W.getObjectByName("footing-Burried").clone(); break; case "Bracket on Concrete": case "Bracket": a = W.getObjectByName("footing").clone(); break; case "Perma-Column": a = W.getObjectByName("footing-PermaColumnConcretePost").clone(); break; default: a = !1 } var Je = ia.getObjectByName("masterSecondaryFramingPiece"); if (da.leanTo1) { void 0 === ia.getObjectByName("LeanTo1PostClones") && ((S = new THREE.Group).name = "LeanTo1PostClones", S.rotation.y = 0, ia.getObjectByName("leanTo1").add(S), (H = new THREE.Group).name = "LeanTo1PostMaster", S.add(H)), a && ((E = a.clone()).name = "LeanToPostFooting", E.visible = !0, E.castShadow = !0, E.receiveShadow = !0, E.position.set(0, 0, da.leanTo1Depth - l - .08), H.add(E)); (E = e.clone()).name = "LeanToPost", E.visible = !0, E.castShadow = !0, E.receiveShadow = !0, E.position.set(0, 0, da.leanTo1Depth - l - .08), E.morphTargetInfluences[E.morphTargetDictionary.height] = da.leanTo1Height - da.leanTo1Depth * da.leanTo1Pitch / 12 - .5 - 1, H.add(E); Fe = E.getObjectByName("downspout-clone"); Fe && (Fe.position.x = -l - .08, Fe.rotation.y = Math.PI, Fe.morphTargetInfluences[Fe.morphTargetDictionary.height] = da.leanTo1Height - da.leanTo1Depth * da.leanTo1Pitch / 12 - 1); (R = t.clone()).name = "LeanToRoofBeam", R.visible = !0, R.castShadow = !0, R.receiveShadow = !0, R.position.set(0, da.leanTo1Height - da.leanTo1Depth * da.leanTo1Pitch / 12 - l, da.leanTo1Depth - l - .36), R.morphTargetInfluences[R.morphTargetDictionary.length] = da.leanTo1Depth / Math.cos((da.leanTo1Pitch - .1) / 12) - .6 - 1, R.morphTargetInfluences[R.morphTargetDictionary.shear] = Ae * da.leanTo1Pitch / 12, R.rotation.y = Math.PI / 2, R.rotation.z = Math.atan(da.leanTo1Pitch / 12), H.add(R); for (var Ke = R.morphTargetInfluences[R.morphTargetDictionary.length] + 1, et = R.morphTargetInfluences[R.morphTargetDictionary.shear], w = 0; w < Ke / O; w++)(x = Ze.clone()).position.x = w * O, x.rotation.z = THREE.Math.degToRad(30), x.morphTargetInfluences[x.morphTargetDictionary.length] = O - 1, w * O + O / 2 < Ke - et && (x.visible = !0), R.add(x), 0 < w && ((x = Ze.clone()).position.x = w * O, x.rotation.z = THREE.Math.degToRad(-30), x.morphTargetInfluences[x.morphTargetDictionary.length] = O - 1, x.visible = !0, R.add(x)); void 0 !== ia.getObjectByName("downspout") && void 0 !== H.getObjectByName("LeanToPost") && void 0 === H.getObjectByName("LeanToPost").getObjectByName("downspout-clone") && ((E = ia.getObjectByName("downspout").clone()).name = "downspout-clone", E.visible = !0, E.castShadow = !0, E.receiveShadow = !0, E.rotation.y = THREE.Math.degToRad(-90), E.position.z = l, H.getObjectByName("LeanToPost").add(E)), da.gutters && 0 == da.hideWalls && ((p = H.getObjectByName("LeanToPost").getObjectByName("downspout-clone")).scale.y = 1 / p.parent.scale.y, p.morphTargetInfluences[p.morphTargetDictionary.height] = da.leanTo1Height - da.leanTo1Depth * da.leanTo1Pitch / 12 - 1); b = da.leanTo1Length / 2 - l - .08, y = da.leanTo1Length / -2 + l + .08, f = Math.ceil((b - y) / V); H.position.x = b; for (w = 1; w <= f; w++)(r = ia.getObjectByName("LeanTo1PostMaster").clone()).name = "LeanToTrussClone", r.position.x = b - w * (b - y) / f, da.gutters && da.settings.downspountsOnEndsOnly && w < f && (r.getObjectByName("LeanToPost").getObjectByName("downspout-clone").visible = !1), S.add(r); if (da.leanTo1Enclosed && "Fully Enclosed" == da.leanTo1Walls) for (w = 0, be = da.leanTo1Height - da.leanTo1Depth * da.leanTo1Pitch / 12; w < da.leanTo1Height / da.girtSpacing;) w < be / da.girtSpacing ? ((E = Je.clone()).position.set(0, w * da.girtSpacing + .05, da.leanTo1Depth - l / 2), E.rotation.y = Math.PI / 2, E.scale.z = da.leanTo1Length, E.scale.y = da.girtThickness, da.hideWalls < 3 ? E.visible = !0 : E.visible = !1, S.add(E), (E = Je.clone()).position.set(da.leanTo1Length / 2 - l / 2, w * da.girtSpacing + .05, da.leanTo1Depth / 2 - .2), E.rotation.y = 0, E.scale.z = da.leanTo1Depth, E.scale.y = da.girtThickness, da.hideWalls < 3 ? E.visible = !0 : E.visible = !1, S.add(E), (E = Je.clone()).position.set(da.leanTo1Length / -2 + l / 2, w * da.girtSpacing + .05, da.leanTo1Depth / 2 - .2), E.rotation.y = 0, E.scale.z = da.leanTo1Depth) : (I = (w * da.girtSpacing - da.leanTo1Height) / (da.leanTo1Pitch / 12) + 1, (E = Je.clone()).position.set(da.leanTo1Length / 2 - l / 2, w * da.girtSpacing + .05, I / -2 - .2), E.rotation.y = 0, E.scale.z = I, E.scale.y = da.girtThickness, da.hideWalls < 3 ? E.visible = !0 : E.visible = !1, S.add(E), (E = Je.clone()).position.set(da.leanTo1Length / -2 + l / 2, w * da.girtSpacing + .05, I / -2 - .2), E.rotation.y = 0, E.scale.z = I), E.scale.y = da.girtThickness, da.hideWalls < 3 ? E.visible = !0 : E.visible = !1, S.add(E), w++ } if (da.leanTo3) { void 0 === ia.getObjectByName("LeanTo3PostClones") && ((N = new THREE.Group).name = "LeanTo3PostClones", N.rotation.y = Math.PI, ia.getObjectByName("leanTo3").add(N), (L = new THREE.Group).name = "LeanTo3PostMaster", N.add(L)), a && ((E = a.clone()).name = "LeanToPostFooting", E.visible = !0, E.castShadow = !0, E.receiveShadow = !0, E.rotation.set(0, 0, 0), E.position.set(0, 0, da.leanTo3Depth - l - .08), L.add(E)); (E = e.clone()).name = "LeanToPost", E.visible = !0, E.castShadow = !0, E.receiveShadow = !0, E.position.set(0, 0, da.leanTo3Depth - l - .08), E.morphTargetInfluences[E.morphTargetDictionary.height] = da.leanTo3Height - da.leanTo3Depth * da.leanTo3Pitch / 12 - .5 - 1, L.add(E); m = E.getObjectByName("downspout-clone"); m && (m.position.x = -l - .08, m.rotation.y = Math.PI, m.morphTargetInfluences[m.morphTargetDictionary.height] = da.leanTo3Height - da.leanTo3Depth * da.leanTo3Pitch / 12 - 1); (R = t.clone()).name = "LeanToRoofBeam", R.visible = !0, R.castShadow = !0, R.receiveShadow = !0, R.position.set(0, da.leanTo3Height - da.leanTo3Depth * da.leanTo3Pitch / 12 - l, da.leanTo3Depth - l - .36), R.morphTargetInfluences[R.morphTargetDictionary.length] = da.leanTo3Depth / Math.cos((da.leanTo3Pitch - .1) / 12) - .6 - 1, R.morphTargetInfluences[R.morphTargetDictionary.shear] = Ae * da.leanTo3Pitch / 12, R.rotation.y = Math.PI / 2, R.rotation.z = Math.atan(da.leanTo3Pitch / 12), L.add(R); for (var tt = R.morphTargetInfluences[R.morphTargetDictionary.length] + 1, at = R.morphTargetInfluences[R.morphTargetDictionary.shear], w = 0; w < tt / O; w++)(x = Ze.clone()).position.x = w * O, x.rotation.z = THREE.Math.degToRad(30), x.morphTargetInfluences[x.morphTargetDictionary.length] = O - 1, w * O + O / 2 < tt - at && (x.visible = !0), R.add(x), 0 < w && ((x = Ze.clone()).position.x = w * O, x.rotation.z = THREE.Math.degToRad(-30), x.morphTargetInfluences[x.morphTargetDictionary.length] = O - 1, x.visible = !0, R.add(x)); void 0 !== ia.getObjectByName("downspout") && void 0 !== L.getObjectByName("LeanToPost") && void 0 === L.getObjectByName("LeanToPost").getObjectByName("downspout-clone") && ((E = ia.getObjectByName("downspout").clone()).name = "downspout-clone", E.visible = !0, E.castShadow = !0, E.receiveShadow = !0, E.rotation.y = THREE.Math.degToRad(-90), E.position.z = l, L.getObjectByName("LeanToPost").add(E)), da.gutters && 0 == da.hideWalls && ((ue = L.getObjectByName("LeanToPost").getObjectByName("downspout-clone")).scale.y = 1 / ue.parent.scale.y, ue.morphTargetInfluences[ue.morphTargetDictionary.height] = da.leanTo3Height - da.leanTo3Depth * da.leanTo3Pitch / 12 - 1); b = da.leanTo3Length / 2 - l - .08, y = da.leanTo3Length / -2 + l + .08, f = Math.ceil((b - y) / V); L.position.x = b; for (w = 1; w <= f; w++)(r = ia.getObjectByName("LeanTo3PostMaster").clone()).name = "LeanToTrussClone", r.position.x = b - w * (b - y) / f, da.gutters && da.settings.downspountsOnEndsOnly && w < f && (r.getObjectByName("LeanToPost").getObjectByName("downspout-clone").visible = !1), N.add(r); if (da.leanTo3Enclosed && "Fully Enclosed" == da.leanTo3Walls) for (w = 0, ye = da.leanTo3Height - da.leanTo3Depth * da.leanTo3Pitch / 12; w < da.leanTo3Height / da.girtSpacing;) w < ye / da.girtSpacing ? ((E = Je.clone()).position.set(0, w * da.girtSpacing + .05, da.leanTo3Depth - l / 2), E.rotation.y = Math.PI / 2, E.scale.z = da.leanTo3Length, E.scale.y = da.girtThickness, da.hideWalls < 3 ? E.visible = !0 : E.visible = !1, N.add(E), (E = Je.clone()).position.set(da.leanTo3Length / 2 - l / 2, w * da.girtSpacing + .05, da.leanTo3Depth / 2 - .2), E.rotation.y = 0, E.scale.z = da.leanTo3Depth, E.scale.y = da.girtThickness, da.hideWalls < 3 ? E.visible = !0 : E.visible = !1, N.add(E), (E = Je.clone()).position.set(da.leanTo3Length / -2 + l / 2, w * da.girtSpacing + .05, da.leanTo3Depth / 2 - .2), E.rotation.y = 0, E.scale.z = da.leanTo3Depth) : (I = (w * da.girtSpacing - da.leanTo3Height) / (da.leanTo3Pitch / 12) + 1, (E = Je.clone()).position.set(da.leanTo3Length / 2 - l / 2, w * da.girtSpacing + .05, I / -2 - .2), E.rotation.y = 0, E.scale.z = I, E.scale.y = da.girtThickness, da.hideWalls < 3 ? E.visible = !0 : E.visible = !1, N.add(E), (E = Je.clone()).position.set(da.leanTo3Length / -2 + l / 2, w * da.girtSpacing + .05, I / -2 - .2), E.rotation.y = 0, E.scale.z = I), E.scale.y = da.girtThickness, da.hideWalls < 3 ? E.visible = !0 : E.visible = !1, N.add(E), w++ } if (da.leanTo2) { void 0 === ia.getObjectByName("LeanTo2PostClones") && ((C = new THREE.Group).name = "LeanTo2PostClones", C.rotation.y = Math.PI / -2, ia.getObjectByName("leanTo2").add(C), (j = new THREE.Group).name = "LeanTo2PostMaster", C.add(j)), a && ((E = a.clone()).name = "LeanToPostFooting", E.visible = !0, E.castShadow = !0, E.receiveShadow = !0, E.position.set(0, 0, da.leanTo2Depth - l - .08), j.add(E)); (E = e.clone()).name = "LeanToPost", E.visible = !0, E.castShadow = !0, E.receiveShadow = !0, E.position.set(0, 0, da.leanTo2Depth - l - .08), E.morphTargetInfluences[E.morphTargetDictionary.height] = da.leanTo2Height - da.leanTo2Depth * da.leanTo2Pitch / 12 - .5 - 1, j.add(E); u = E.getObjectByName("downspout-clone"); u && (u.position.x = -l - .08, u.rotation.y = Math.PI, u.morphTargetInfluences[u.morphTargetDictionary.height] = da.leanTo2Height - da.leanTo2Depth * da.leanTo2Pitch / 12 - 1); (R = t.clone()).name = "LeanToRoofBeam", R.visible = !0, R.castShadow = !0, R.receiveShadow = !0, R.position.set(0, da.leanTo2Height - da.leanTo2Depth * da.leanTo2Pitch / 12 - l, da.leanTo2Depth - l - .36), R.morphTargetInfluences[R.morphTargetDictionary.length] = da.leanTo2Depth / Math.cos((da.leanTo2Pitch - .1) / 12) - .6 - 1, R.morphTargetInfluences[R.morphTargetDictionary.shear] = Ae * da.leanTo2Pitch / 12, R.rotation.y = Math.PI / 2, R.rotation.z = Math.atan(da.leanTo2Pitch / 12), j.add(R); for (var ot = R.morphTargetInfluences[R.morphTargetDictionary.length] + 1, it = R.morphTargetInfluences[R.morphTargetDictionary.shear], w = 0; w < ot / O; w++)(x = Ze.clone()).position.x = w * O, x.rotation.z = THREE.Math.degToRad(30), x.morphTargetInfluences[x.morphTargetDictionary.length] = O - 1, w * O + O / 2 < ot - it && (x.visible = !0), R.add(x), 0 < w && ((x = Ze.clone()).position.x = w * O, x.rotation.z = THREE.Math.degToRad(-30), x.morphTargetInfluences[x.morphTargetDictionary.length] = O - 1, x.visible = !0, R.add(x)); void 0 !== ia.getObjectByName("downspout") && void 0 !== j.getObjectByName("LeanToPost") && void 0 === j.getObjectByName("LeanToPost").getObjectByName("downspout-clone") && ((E = ia.getObjectByName("downspout").clone()).name = "downspout-clone", E.visible = !0, E.castShadow = !0, E.receiveShadow = !0, E.rotation.y = THREE.Math.degToRad(-90), E.position.z = l, j.getObjectByName("LeanToPost").add(E)), da.gutters && 0 == da.hideWalls && ((g = j.getObjectByName("LeanToPost").getObjectByName("downspout-clone")).scale.y = 1 / g.parent.scale.y, g.morphTargetInfluences[g.morphTargetDictionary.height] = da.leanTo2Height - da.leanTo2Depth * da.leanTo2Pitch / 12 - 1); b = da.leanTo2Length / 2 - l - .08, y = da.leanTo2Length / -2 + l + .08, f = Math.ceil((b - y) / V); j.position.x = b; for (w = 1; w <= f; w++)(r = ia.getObjectByName("LeanTo2PostMaster").clone()).name = "LeanToTrussClone", r.position.x = b - w * (b - y) / f, da.gutters && da.settings.downspountsOnEndsOnly && w < f && (r.getObjectByName("LeanToPost").getObjectByName("downspout-clone").visible = !1), C.add(r); if (da.leanTo2Enclosed && "Fully Enclosed" == da.leanTo2Walls) for (w = 0, fe = da.leanTo2Height - da.leanTo2Depth * da.leanTo2Pitch / 12; w < da.leanTo2Height / da.girtSpacing;) w < fe / da.girtSpacing ? ((E = Je.clone()).position.set(0, w * da.girtSpacing + .05, da.leanTo2Depth - l / 2), E.rotation.y = Math.PI / 2, E.scale.z = da.leanTo2Length, E.scale.y = da.girtThickness, da.hideWalls < 3 ? E.visible = !0 : E.visible = !1, C.add(E), (E = Je.clone()).position.set(da.leanTo2Length / 2 - l / 2, w * da.girtSpacing + .05, da.leanTo2Depth / 2 - .2), E.rotation.y = 0, E.scale.z = da.leanTo2Depth, E.scale.y = da.girtThickness, da.hideWalls < 3 ? E.visible = !0 : E.visible = !1, C.add(E), (E = Je.clone()).position.set(da.leanTo2Length / -2 + l / 2, w * da.girtSpacing + .05, da.leanTo2Depth / 2 - .2), E.rotation.y = 0, E.scale.z = da.leanTo2Depth) : (I = (w * da.girtSpacing - da.leanTo2Height) / (da.leanTo2Pitch / 12) + 1, (E = Je.clone()).position.set(da.leanTo2Length / 2 - l / 2, w * da.girtSpacing + .05, I / -2 - .2), E.rotation.y = 0, E.scale.z = I, E.scale.y = da.girtThickness, da.hideWalls < 3 ? E.visible = !0 : E.visible = !1, C.add(E), (E = Je.clone()).position.set(da.leanTo2Length / -2 + l / 2, w * da.girtSpacing + .05, I / -2 - .2), E.rotation.y = 0, E.scale.z = I), E.scale.y = da.girtThickness, da.hideWalls < 3 ? E.visible = !0 : E.visible = !1, C.add(E), w++ } if (da.leanTo4) { void 0 === ia.getObjectByName("LeanTo4PostClones") && ((z = new THREE.Group).name = "LeanTo4PostClones", z.rotation.y = Math.PI / 2, ia.getObjectByName("leanTo4").add(z), (Vt = new THREE.Group).name = "LeanTo4PostMaster", z.add(Vt)), a && ((E = a.clone()).name = "LeanToPostFooting", E.visible = !0, E.castShadow = !0, E.receiveShadow = !0, E.position.set(0, 0, da.leanTo4Depth - l - .08), Vt.add(E)); (E = e.clone()).name = "LeanToPost", E.visible = !0, E.castShadow = !0, E.receiveShadow = !0, E.position.set(0, 0, da.leanTo4Depth - l - .08), E.morphTargetInfluences[E.morphTargetDictionary.height] = da.leanTo4Height - da.leanTo4Depth * da.leanTo4Pitch / 12 - .5 - 1, Vt.add(E); c = E.getObjectByName("downspout-clone"); c && (c.position.x = -l - .08, c.rotation.y = Math.PI, c.morphTargetInfluences[c.morphTargetDictionary.height] = da.leanTo4Height - da.leanTo4Depth * da.leanTo4Pitch / 12 - 1); (R = t.clone()).name = "LeanToRoofBeam", R.visible = !0, R.castShadow = !0, R.receiveShadow = !0, R.position.set(0, da.leanTo4Height - da.leanTo4Depth * da.leanTo4Pitch / 12 - l, da.leanTo4Depth - l - .36), R.morphTargetInfluences[R.morphTargetDictionary.length] = da.leanTo4Depth / Math.cos((da.leanTo4Pitch - .1) / 12) - .6 - 1, R.morphTargetInfluences[R.morphTargetDictionary.shear] = Ae * da.leanTo4Pitch / 12, R.rotation.y = Math.PI / 2, R.rotation.z = Math.atan(da.leanTo4Pitch / 12), Vt.add(R); for (var R, nt = R.morphTargetInfluences[R.morphTargetDictionary.length] + 1, rt = R.morphTargetInfluences[R.morphTargetDictionary.shear], w = 0; w < nt / O; w++)(x = Ze.clone()).position.x = w * O, x.rotation.z = THREE.Math.degToRad(30), x.morphTargetInfluences[x.morphTargetDictionary.length] = O - 1, w * O + O / 2 < nt - rt && (x.visible = !0), R.add(x), 0 < w && ((x = Ze.clone()).position.x = w * O, x.rotation.z = THREE.Math.degToRad(-30), x.morphTargetInfluences[x.morphTargetDictionary.length] = O - 1, x.visible = !0, R.add(x)); void 0 !== ia.getObjectByName("downspout") && void 0 !== Vt.getObjectByName("LeanToPost") && void 0 === Vt.getObjectByName("LeanToPost").getObjectByName("downspout-clone") && ((E = ia.getObjectByName("downspout").clone()).name = "downspout-clone", E.visible = !0, E.castShadow = !0, E.receiveShadow = !0, E.rotation.y = THREE.Math.degToRad(-90), E.position.z = l, Vt.getObjectByName("LeanToPost").add(E)), da.gutters && 0 == da.hideWalls && ((s = Vt.getObjectByName("LeanToPost").getObjectByName("downspout-clone")).scale.y = 1 / s.parent.scale.y, s.morphTargetInfluences[s.morphTargetDictionary.height] = da.leanTo4Height - da.leanTo4Depth * da.leanTo4Pitch / 12 - 1); b = da.leanTo4Length / 2 - l - .08, y = da.leanTo4Length / -2 + l + .08, f = Math.ceil((b - y) / V); Vt.position.x = b; for (w = 1; w <= f; w++)(r = ia.getObjectByName("LeanTo4PostMaster").clone()).name = "LeanToTrussClone", r.position.x = b - w * (b - y) / f, da.gutters && da.settings.downspountsOnEndsOnly && w < f && (r.getObjectByName("LeanToPost").getObjectByName("downspout-clone").visible = !1), z.add(r); if (da.leanTo4Enclosed && "Fully Enclosed" == da.leanTo4Walls) for (w = 0, we = da.leanTo4Height - da.leanTo4Depth * da.leanTo4Pitch / 12; w < da.leanTo4Height / da.girtSpacing;) w < we / da.girtSpacing ? ((E = Je.clone()).position.set(0, w * da.girtSpacing + .05, da.leanTo4Depth - l / 2), E.rotation.y = Math.PI / 2, E.scale.z = da.leanTo4Length, E.scale.y = da.girtThickness, da.hideWalls < 3 ? E.visible = !0 : E.visible = !1, z.add(E), (E = Je.clone()).position.set(da.leanTo4Length / 2 - l / 2, w * da.girtSpacing + .05, da.leanTo4Depth / 2 - .2), E.rotation.y = 0, E.scale.z = da.leanTo4Depth, E.scale.y = da.girtThickness, da.hideWalls < 3 ? E.visible = !0 : E.visible = !1, z.add(E), (E = Je.clone()).position.set(da.leanTo4Length / -2 + l / 2, w * da.girtSpacing + .05, da.leanTo4Depth / 2 - .2), E.rotation.y = 0, E.scale.z = da.leanTo4Depth) : (I = (w * da.girtSpacing - da.leanTo4Height) / (da.leanTo4Pitch / 12) + 1, (E = Je.clone()).position.set(da.leanTo4Length / 2 - l / 2, w * da.girtSpacing + .05, I / -2 - .2), E.rotation.y = 0, E.scale.z = I, E.scale.y = da.girtThickness, da.hideWalls < 3 ? E.visible = !0 : E.visible = !1, z.add(E), (E = Je.clone()).position.set(da.leanTo4Length / -2 + l / 2, w * da.girtSpacing + .05, I / -2 - .2), E.rotation.y = 0, E.scale.z = I), E.scale.y = da.girtThickness, da.hideWalls < 3 ? E.visible = !0 : E.visible = !1, z.add(E), w++ } var st = da.girtSpacing, lt = da.purlinSpacing; (F = new THREE.Group).name = "GirtParent", B.add(F), 2 < da.hideWalls ? F.visible = !1 : F.visible = !0, (Kt = new THREE.Group).name = "PurlinParentL", Kt.position.set(da.width / -2, da.wallHeightL(), 0), Kt.rotation.z = Math.PI / 2 - i, da.roofPitch < 0 && (Kt.rotation.z = Math.PI / -2 - i), F.add(Kt); (aa = new THREE.Group).name = "PurlinParentR", aa.position.set(da.width / 2, da.wallHeightR(), 0), aa.rotation.z = n - Math.PI / -2, da.roofPitch < 0 && (aa.rotation.z = n - Math.PI / 2), F.add(aa), da.depth; for (v = ia.getObjectByName("masterSecondaryFramingPiece").clone(), w = 0; w < (q - l) / lt;) { E = v.clone(); let e = 0; da.flushPurlins || da.standingPurlins ? (da.flushPurlins && (e = da.purlinThickness / 2 + .0625), da.standingPurlins && (e = 0), "Single Slope" === da.roofType && (e = (da.roofPitch, da.purlinThickness / 2 + .1))) : (E.rotation.z = Math.PI / 2, e = 0, "Single Slope" === da.roofType && (e = 0 <= da.roofPitch ? .1 : .2)), "Single Slope" === da.roofType ? E.position.set(w * lt, -l / 2 - e, 0) : E.position.set(w * lt, -l / 2 - .25 - e, 0), E.scale.y = da.purlinThickness, E.scale.z = da.depth - l, E.rotation.y = 0, E.visible = !0, Kt.add(E), w++ } for (w = 0; w < (A - l) / lt;) { E = v.clone(); let e; da.flushPurlins || da.standingPurlins ? (da.flushPurlins && (e = da.purlinThickness / 2 + .0625), da.standingPurlins && (e = 0), "Single Slope" === da.roofType && (e = 0 <= da.roofPitch ? da.purlinThickness / 2 - .05 : da.purlinThickness / 2 - .2)) : (E.rotation.z = Math.PI / 2, e = 0, "Single Slope" === da.roofType && (e = 0 <= da.roofPitch ? -.15 : -.25)), "Single Slope" === da.roofType ? E.position.set(w * -lt, l / 2 - .45 - e, 0) : E.position.set(w * lt, l / 2 + .25 + e, 0), E.scale.y = da.purlinThickness, E.scale.z = da.depth - l, E.rotation.y = 0, E.visible = !0, aa.add(E), w++ } E = v.clone(); let o = 0; da.flushGirts && (E.rotation.z = Math.PI / 2, o = da.girtThickness / 2), E.position.set(da.width / 2 + .04 - l / 1.9 - o, da.wallHeightR() - .65, 0), E.scale.y = da.girtThickness, E.scale.z = da.depth - l, E.rotation.y = 0, E.visible = !0, F.add(E), E = v.clone(), da.flushGirts && (E.rotation.z = Math.PI / 2, o = da.girtThickness / 2), E.position.set(da.width / -2 - .04 + l / 1.9 + o, da.wallHeightL() - .65, 0), E.scale.y = da.girtThickness, E.scale.z = da.depth - l, E.rotation.y = 0, E.visible = !0, F.add(E), da.settings.showPostFrameBottomPlate && ((E = v.clone()).rotation.z = Math.PI / 2, bottomPlateFlushOffset = da.girtThickness / 2, E.position.set(da.width / -2 - .04 + l / 1.9 + bottomPlateFlushOffset + 1 / 12, .05, 0), E.scale.y = da.girtThickness, E.scale.z = da.depth - l, E.rotation.y = 0, E.visible = !0, F.add(E), (E = v.clone()).rotation.z = Math.PI / 2, E.position.set(da.width / 2 + .04 - l / 1.9 - bottomPlateFlushOffset - 1 / 12, .05, 0), E.scale.y = da.girtThickness, E.scale.z = da.depth - l, E.rotation.y = 0, E.visible = !0, F.add(E)); for (w = 0; w < U / st;) { if (w < da.wallHeightL() / st && da.enclosedE) { E = v.clone(); let e = 0; da.flushGirts && (E.rotation.z = Math.PI / 2, e = da.girtThickness / 2), E.position.set(da.width / -2 - .04 + l / 1.9 + e, w * st + .05, 0), E.scale.y = da.girtThickness, E.scale.z = da.depth - l, E.rotation.y = 0, E.visible = !0, F.add(E) } if (w < da.wallHeightR() / st && da.enclosedW) { E = v.clone(); let e = 0; da.flushGirts && (E.rotation.z = Math.PI / 2, e = da.girtThickness / 2), E.position.set(da.width / 2 + .04 - l / 1.9 - e, w * st + .05, 0), E.scale.y = da.girtThickness, E.scale.z = da.depth - l, da.flushGirts && (E.rotation.z = Math.PI / 2), E.rotation.y = 0, E.visible = !0, F.add(E) } let e = 0; da.flushGirts && (e = da.girtThickness / 2), w < da.height / st && (da.enclosedS && (E = v.clone(), da.flushGirts && (E.rotation.z = Math.PI / 2), E.position.set(0, w * st + .05, da.depth / -2 + l / 1.9 + e), E.rotation.y = Math.PI / 2, E.scale.y = da.girtThickness, E.scale.z = da.width - .25, E.visible = !0, F.add(E)), da.enclosedN) && (E = v.clone(), da.flushGirts && (E.rotation.z = Math.PI / 2), E.position.set(0, w * st + .05, da.depth / 2 - l / 1.9 - e), E.rotation.y = Math.PI / 2, E.scale.y = da.girtThickness, E.scale.z = da.width - .25, E.visible = !0, F.add(E)), w++ } if (!da.flushGirts) for (; w < (Q + da.height - .1) / st;) { De = w * st - da.height, Me = ("Single Slope" !== da.roofType && (X = "Asymmetrical" === da.roofType ? De / Q * da.asymmetrical : ($ = da.width / 2, _ = da.width / 2, n = i = k, 0)), $ - (De + .5) / Math.tan(Math.PI / 2 - i)), We = _ - (De + .5) / Math.tan(Math.PI / 2 - n); da.enclosedS && ((E = v.clone()).position.set(X, w * st + .05, da.depth / -2 + l / 1.9), E.rotation.y = Math.PI / 2, E.scale.y = da.girtThickness, E.scale.z = Me + We - .25, E.visible = !0, F.add(E)), da.enclosedN && ((E = v.clone()).position.set(X, w * st + .05, da.depth / 2 - l / 1.9), E.rotation.y = Math.PI / 2, E.scale.y = da.girtThickness, E.scale.z = Me + We - .25, E.visible = !0, F.add(E)), w++ } da.settings.hasOwnProperty("alternatePostSpacingOver40FT") && (40 < da.width ? da.maxPostSpacing = da.settings.alternatePostSpacingOver40FT.over : da.maxPostSpacing = da.settings.alternatePostSpacingOver40FT.under); for (xe = Math.ceil(da.width / da.maxPostSpacing) - 1, Oe = da.depth / 2 - (l + .125), Re = da.width / ((xe = xe < 0 ? 0 : xe) + 1), P = 0, Be = 0, w = 1; w <= xe; w++) { switch (P = da.width / -2 + Re * w, Be = da.height - 1 - 1, Be = P >= da.asymmetrical ? da.roofHeightAtX(P) - 1 - Ye - Ae - .25 : da.roofHeightAtX(P) - 1 - Xe - Ae - .25, (E = W.getObjectByName("columnEnd").clone()).name += "-clone", !da.settings.hasOwnProperty("showPostsWithOpenGableWall") || da.settings.showPostsWithOpenGableWall || da.enclosedN ? E.visible = !0 : E.visible = !1, E.position.set(P, 0, Oe), E.morphTargetInfluences[E.morphTargetDictionary.height] = Be, B.add(E), da.postFooting) { case "Post in Ground": $e = W.getObjectByName("footing-Burried").clone(); break; case "Bracket on Concrete": case "Bracket": $e = W.getObjectByName("footing").clone(); break; case "Perma-Column": $e = W.getObjectByName("footing-PermaColumnConcretePost").clone(); break; default: $e = !1 } if ($e && ($e.visible = da.enclosedN, $e.position.set(0, 0, 0), E.add($e)), (E = W.getObjectByName("columnEnd").clone()).name += "-clone", !da.settings.hasOwnProperty("showPostsWithOpenGableWall") || da.settings.showPostsWithOpenGableWall || da.enclosedS ? E.visible = !0 : E.visible = !1, E.position.set(P, 0, -Oe), E.morphTargetInfluences[E.morphTargetDictionary.height] = Be, B.add(E), $e && ((Y = $e.clone()).visible = da.enclosedS, Y.position.set(0, 0, 0), E.add(Y)), 0 < da.mezzanineBays) { var ht = ca; ht.sort(function(e, t) { return e - t }); for (He = 1; He <= da.mezzanineBays; He++)(E = W.getObjectByName("columnEnd").clone()).name += "-clone", E.visible = !0, E.position.set(P, 0, ht[He]), E.scale.y = da.mezzanineHeight - .5, B.add(E) } } } if ("Open Web Truss" == da.frameType) { (ha = wa).visible = !0; var ct = va; ct.visible = !1; (B = new THREE.Group).name = "OpenWebFrameClones", ha.add(B); var B, T = new THREE.Group, Z = (T.name = "primaryFrame", B.add(T), void 0 === ct.getObjectByName("WebbingMasterL") && ((WebbingMasterL = new THREE.Group).name = "WebbingMasterL", WebbingMasterL.position.x = pt, ct.add(WebbingMasterL)), 0), dt = da.roofPitch, Fe = da.roofPitch, K = ("Asymmetrical" === da.roofType && (Z = da.asymmetrical, 0 < da.asymmetrical ? Fe = li(da.roofPitch, da.width, Z) : dt = li(da.roofPitch, da.width, Z)), "Single Slope" == da.roofType && (Fe = (0 <= da.roofPitch || (dt = da.roofPitch), -da.roofPitch)), da.width / 2 + Z), ee = da.width / 2 - Z; let e = !0; "Single Slope" == da.roofType && (e = !1); p = ni(K, da.wallHeightL(), dt, da.eaveL, e), m = (p.name = "primaryFrameL", p.rotation.y = THREE.Math.degToRad(0), p.position.x = Z, T.add(p), ni(ee, da.wallHeightR(), Fe, da.eaveR, e)); m.name = "primaryFrameR", m.rotation.y = THREE.Math.degToRad(180), m.position.x = Z, T.add(m); let t = (l = .2) + .15; var J = .66, pt = da.width / -2 + l + 2 / 12 / 2, mt = da.width / 2 - l - 2 / 12 / 2, K = (da.hasOwnProperty("frameConstruction") && "Residential Flush" == da.frameConstruction && (t = .175, pt = da.width / -2 + .01, mt = da.width / 2 - .01), -pt + Z), ee = mt - Z, te = da.wallHeightL() - .5, ae = da.wallHeightR() - .5, h = 2, oe = (h = da.width < 25 ? 1.23 : h, (Math.PI - i) / 2), ie = (Math.PI - n) / 2, ne = ("Single Slope" == da.roofType && (0 <= da.roofPitch ? ie += THREE.Math.degToRad(90) : oe += THREE.Math.degToRad(90)), h / Math.sin(oe)), re = h / Math.sin(ie), se = Math.sqrt(Math.pow(ne, 2) - Math.pow(h, 2)), le = Math.sqrt(Math.pow(re, 2) - Math.pow(h, 2)), he = Math.sqrt(Math.pow(te - se, 2) + Math.pow(h - J, 2)), ce = Math.sqrt(Math.pow(ae - le, 2) + Math.pow(h - J, 2)), de = (Math.acos((te - se) / he), Math.acos((ae - le) / ce), K / Math.sin(i)), pe = ee / Math.sin(n), me = (Math.sin(i), Math.sin(n), Math.abs(h) / Math.sin(i)), ge = Math.abs(h) / Math.sin(n), Ne = Math.min(te + Math.sqrt(Math.pow(de, 2) - Math.pow(Math.abs(pt - Z), 2)), ae + Math.sqrt(Math.pow(pe, 2) - Math.pow(Math.abs(mt - Z), 2))); Math.max(me, ge); function gt(e, t, a, o) { return result = t, result += e / o * (a - t) } qe = ct.getObjectByName("beamRoofL"), Ae = 1.5, d = .375, Ve = K, Ue = ee, Xe = (Qe = "Single Slope" === da.roofType ? (G = 12 / ((da.width - l - l) / Q), 12 / (-(da.width - l - l) / Q)) : "Asymmetrical" === da.roofType ? (G = 12 / ($ / Q), 12 / (_ / Q)) : (G = 12 / ((da.width / 2 - l + Z) / Q), 12 / ((da.width / 2 - l - Z) / Q)), Ae * G / 12), Ye = Ae * Qe / 12; if (ca = Vo(da.maxTrussSpacing, t, T, B), !da.hasOwnProperty("frameConstruction") || "Open Web Tapered" == da.frameConstruction) { let e = 2; for (var ut = e = ca.length < 3 ? 1 : e; ut < ca.length; ut += 4) { let e = ct.getObjectByName("webbing").clone(); var Tt = te - .5, bt = Math.abs(ca[ut] - ca[ut - 1]); e.name = "WindRodClone", e.visible = !0, e.position.x = pt + .06, e.position.y = .5, e.position.z = ca[ut], e.rotation.x = THREE.Math.degToRad(180) + Math.atan(bt / Tt), e.scale.set(2, Math.hypot(Tt, bt), 2), B.add(e), (e = e.clone()).position.z = ca[ut - 1], e.rotation.x = THREE.Math.degToRad(180) + -Math.atan(bt / Tt), B.add(e), Tt = ae - .5, (e = e.clone()).position.x = mt - .06, e.position.z = ca[ut], e.rotation.x = THREE.Math.degToRad(180) + Math.atan(bt / Tt), e.scale.set(2, Math.hypot(Tt, bt), 2), B.add(e), (e = e.clone()).position.z = ca[ut - 1], e.rotation.x = THREE.Math.degToRad(180) + -Math.atan(bt / Tt), B.add(e) } } if (!da.hasOwnProperty("frameConstruction") || "Open Web Tapered" == da.frameConstruction) for (w = 0; w < ca.length; w++) { if (w + 1 < ca.length) { for (var yt = 6; yt < da.wallHeightL(); yt += 6) { var ft = ct.getObjectByName("webbing").clone(), wt = gt(yt, J, h, te); ft.name = "ChordBracingClone", ft.visible = !0, ft.position.x = pt + wt, ft.position.y = yt, ft.position.z = ca[w], ft.rotation.y = THREE.Math.degToRad(90) + Math.asin(wt / 3), ft.rotation.z = THREE.Math.degToRad(90), ft.scale.set(1.5, 3, 1.5), B.add(ft) } for (yt = 6; yt < da.wallHeightR(); yt += 6) { var vt = ct.getObjectByName("webbing").clone(), Et = gt(yt, J, h, ae); vt.name = "ChordBracingClone", vt.visible = !0, vt.position.x = mt - Et, vt.position.y = yt, vt.position.z = ca[w], vt.rotation.y = THREE.Math.degToRad(90) - Math.asin(Et / 3), vt.rotation.z = THREE.Math.degToRad(90), vt.scale.set(1.5, 3, 1.5), B.add(vt) } } if (0 < w) { for (yt = 6; yt < da.wallHeightL(); yt += 6) { var Pt = ct.getObjectByName("webbing").clone(), Dt = gt(yt, J, h, te); Pt.name = "ChordBracingClone", Pt.visible = !0, Pt.position.x = pt + Dt, Pt.position.y = yt, Pt.position.z = ca[w], Pt.rotation.y = THREE.Math.degToRad(-90) - Math.asin(Dt / 3), Pt.rotation.z = THREE.Math.degToRad(90), Pt.scale.set(1.5, 3, 1.5), B.add(Pt) } for (yt = 6; yt < da.wallHeightR(); yt += 6) { var Mt = ct.getObjectByName("webbing").clone(), Wt = gt(yt, J, h, ae); Mt.name = "ChordBracingClone", Mt.visible = !0, Mt.position.x = mt - Wt, Mt.position.y = yt, Mt.position.z = ca[w], Mt.rotation.y = THREE.Math.degToRad(-90) + Math.asin(Wt / 3), Mt.rotation.z = THREE.Math.degToRad(90), Mt.scale.set(1.5, 3, 1.5), B.add(Mt) } } } if (0 < da.settings.postsOnGableRoofOverhangsOver) { if (da.gableFront > da.settings.postsOnGableRoofOverhangsOver) { if (clonedFrame = new THREE.Group, (E = ct.getObjectByName("columnTubeSideL").clone()).visible = !0, E.scale.y = da.roofHeightAtX(da.width / -2), E.position.x = da.width / -2, clonedFrame.add(E), (E = ct.getObjectByName("columnTubeSideR").clone()).visible = !0, E.scale.y = da.roofHeightAtX(da.width / 2), E.position.x = da.width / 2, clonedFrame.add(E), clonedFrame.name = "OverhangFrontFrame", clonedFrame.position.z = da.depth / 2 + da.gableFront - l - .5, B.add(clonedFrame), da.settings.enclosedGableRoofOverhangTriangles) { let e; void 0 === na.getObjectByName("overhangEnclosureFront") ? (ue = na.getObjectByName("coveredGableExtension"), (e = ue.deepClone()).name = "overhangEnclosureFront", e.frustumCulled = !1, na.add(e)) : e = na.getObjectByName("overhangEnclosureFront"), e.position.z = da.depth / 2, e.visible = !0, e.morphTargetInfluences[e.morphTargetDictionary.width] = da.width - 1, e.morphTargetInfluences[e.morphTargetDictionary.depth] = da.gableFront - 1, e.morphTargetInfluences[e.morphTargetDictionary.height] = da.height - 1, e.morphTargetInfluences[e.morphTargetDictionary.unEnclosedHeight] = da.height - .85, e.morphTargetInfluences[e.morphTargetDictionary.roofPeak] = da.width / 2 * da.roofPitch / 12, e.material.forEach(function(e) { e.name.startsWith("BuildingWainscot") && (e.visible = !1), e.name.startsWith("BuildingTrim-Base") && (e.visible = !1) }) } } else void 0 !== na.getObjectByName("overhangEnclosureFront") && (na.getObjectByName("overhangEnclosureFront").visible = !1); if (da.gableBack > da.settings.postsOnGableRoofOverhangsOver) { if (clonedFrame = new THREE.Group, (E = ct.getObjectByName("columnTubeSideL").clone()).visible = !0, E.scale.y = da.roofHeightAtX(da.width / -2), E.position.x = da.width / -2, clonedFrame.add(E), (E = ct.getObjectByName("columnTubeSideR").clone()).visible = !0, E.scale.y = da.roofHeightAtX(da.width / 2), E.position.x = da.width / 2, clonedFrame.add(E), clonedFrame.name = "OverhangFrontFrame", clonedFrame.name = "OverhangBackFrame", clonedFrame.position.z = da.depth / -2 - da.gableBack + l + .5, B.add(clonedFrame), da.settings.enclosedGableRoofOverhangTriangles) { let e; void 0 === na.getObjectByName("overhangEnclosureBack") ? (u = na.getObjectByName("coveredGableExtension"), (e = u.deepClone()).name = "overhangEnclosureBack", e.frustumCulled = !1, na.add(e)) : e = na.getObjectByName("overhangEnclosureBack"), e.position.z = da.depth / -2, e.rotation.y = Math.PI, e.visible = !0, e.morphTargetInfluences[e.morphTargetDictionary.width] = da.width - 1, e.morphTargetInfluences[e.morphTargetDictionary.depth] = da.gableBack - 1, e.morphTargetInfluences[e.morphTargetDictionary.height] = da.height - 1, e.morphTargetInfluences[e.morphTargetDictionary.unEnclosedHeight] = da.height - .85, e.morphTargetInfluences[e.morphTargetDictionary.roofPeak] = da.width / 2 * da.roofPitch / 12, e.material.forEach(function(e) { e.name.startsWith("BuildingWainscot") && (e.visible = !1), e.name.startsWith("BuildingTrim-Base") && (e.visible = !1) }) } } else void 0 !== na.getObjectByName("overhangEnclosureBack") && (na.getObjectByName("overhangEnclosureBack").visible = !1) } void 0 !== ia.getObjectByName("LeanTo1PostClones") && ia.getObjectByName("leanTo1").remove(ia.getObjectByName("LeanTo1PostClones")), void 0 !== ia.getObjectByName("LeanTo2PostClones") && ia.getObjectByName("leanTo2").remove(ia.getObjectByName("LeanTo2PostClones")), void 0 !== ia.getObjectByName("LeanTo3PostClones") && ia.getObjectByName("leanTo3").remove(ia.getObjectByName("LeanTo3PostClones")), void 0 !== ia.getObjectByName("LeanTo4PostClones") && ia.getObjectByName("leanTo4").remove(ia.getObjectByName("LeanTo4PostClones")); let a; if (void 0 !== ct.getObjectByName("columnSide") && ct.getObjectByName("columnSide"), void 0 !== ct.getObjectByName("beamRoof") && ct.getObjectByName("beamRoof"), a = !1, da.hasOwnProperty("postFooting")) switch (da.postFooting) { case "Post in Ground": a = ct.getObjectByName("footing-Burried").clone(); break; case "Bracket on Concrete": case "Bracket": a = ct.getObjectByName("footing").clone(); break; case "Perma-Column": a = ct.getObjectByName("footing-PermaColumnConcretePost").clone(); break; default: a = !1 } var xt = ia.getObjectByName("masterSecondaryFramingPiece"); if (da.leanTo1) { void 0 === ia.getObjectByName("LeanTo1PostClones") && ((S = new THREE.Group).name = "LeanTo1PostClones", S.rotation.y = 0, ia.getObjectByName("leanTo1").add(S), (H = new THREE.Group).name = "LeanTo1PostMaster", S.add(H)); var S, H, g = ni(da.leanTo1Depth, da.leanTo1Height - si(da.leanTo1Depth, da.leanTo1Pitch), da.leanTo1Pitch, da.gableFront), b = (g.rotation.y = THREE.Math.degToRad(90), H.add(g), da.leanTo1Length / 2 - l - .08), y = da.leanTo1Length / -2 + l + .08, f = Math.ceil((b - y) / V); H.position.x = b; for (w = 1; w <= f; w++)(r = ia.getObjectByName("LeanTo1PostMaster").clone()).name = "LeanToTrussClone", r.position.x = b - w * (b - y) / f, da.gutters && da.settings.downspountsOnEndsOnly && w < f && (r.getObjectByName("downspout-clone").visible = !1), S.add(r); if (da.leanTo1Enclosed && "Fully Enclosed" == da.leanTo4Walls) { var Ot = da.leanTo1Depth, Rt = da.leanTo1Length, Bt = da.leanTo1Height, St = da.leanTo1Pitch, Ht = Bt - Ot * St / 12, Nt = S; let e = 0, t = 0; da.flushGirts && (t = Math.PI / 2), da.standingGirts && (t = Math.PI / 2); for (w = 0; w < Bt / da.girtSpacing;) w < Ht / da.girtSpacing ? (da.flushGirts && (e = da.girtThickness / 2 - .1), da.standingGirts && (e = da.girtThickness / 2 - .05), (E = xt.clone()).position.set(0, w * da.girtSpacing + .05, Ot + .04 - l / 1.9 - e), E.rotation.z = t, E.rotation.y = Math.PI / 2, E.scale.z = Rt - .1, E.scale.y = da.girtThickness, da.hideWalls < 3 ? E.visible = !0 : E.visible = !1, Nt.add(E), da.flushGirts && (e = da.girtThickness / 2 + .03), da.standingGirts && (e = da.girtThickness / 2 - .05), (E = xt.clone()).position.set(Rt / 2 + .04 - l / 1.9 - e, w * da.girtSpacing + .05, Ot / 2 + .04 - l / 1.9 - e), E.rotation.z = t, E.rotation.y = 0, E.scale.z = Ot, E.scale.y = da.girtThickness, da.hideWalls < 3 ? E.visible = !0 : E.visible = !1, Nt.add(E), (E = xt.clone()).position.set(Rt / -2 - .04 + l / 1.9 + e, w * da.girtSpacing + .05, Ot / 2 + .04 - l / 1.9 - e), E.rotation.z = t, E.rotation.y = 0, E.scale.z = Ot) : (da.flushGirts && (e = da.girtThickness / 2 + .03), da.standingGirts && (e = da.girtThickness / 2 - .05), I = (w * da.girtSpacing - Bt) / (St / 12) + 1, (E = xt.clone()).position.set(Rt / 2 + .04 - l / 1.9 - e, w * da.girtSpacing + .05, I / -2 + .04 - l / 1.9 - e), E.rotation.z = t, E.rotation.y = 0, E.scale.z = I, E.scale.y = da.girtThickness, da.hideWalls < 3 ? E.visible = !0 : E.visible = !1, Nt.add(E), (E = xt.clone()).position.set(Rt / -2 - .04 + l / 1.9 + e, w * da.girtSpacing + .05, I / -2 + .04 - l / 1.9 - e), E.rotation.z = t, E.rotation.y = 0, E.scale.z = I), E.scale.y = da.girtThickness, da.hideWalls < 3 ? E.visible = !0 : E.visible = !1, Nt.add(E), w++ } } if (da.leanTo3) { void 0 === ia.getObjectByName("LeanTo3PostClones") && ((N = new THREE.Group).name = "LeanTo3PostClones", N.rotation.y = Math.PI, ia.getObjectByName("leanTo3").add(N), (L = new THREE.Group).name = "LeanTo3PostMaster", N.add(L)); var N, L, c = ni(da.leanTo3Depth, da.leanTo3Height - si(da.leanTo3Depth, da.leanTo3Pitch), da.leanTo3Pitch, da.gableBack), b = (c.rotation.y = THREE.Math.degToRad(90), L.add(c), da.leanTo3Length / 2 - l - .08), y = da.leanTo3Length / -2 + l + .08, f = Math.ceil((b - y) / V); L.position.x = b; for (w = 1; w <= f; w++)(r = ia.getObjectByName("LeanTo3PostMaster").clone()).name = "LeanToTrussClone", r.position.x = b - w * (b - y) / f, da.gutters && da.settings.downspountsOnEndsOnly && w < f && (r.getObjectByName("downspout-clone").visible = !1), N.add(r); if (da.leanTo3Enclosed && "Fully Enclosed" == da.leanTo3Walls) { var Lt = da.leanTo3Depth, Ct = da.leanTo3Length, jt = da.leanTo3Height, zt = da.leanTo3Pitch, It = jt - Lt * zt / 12, Ft = N; let e = 0, t = 0; da.flushGirts && (t = Math.PI / 2), da.standingGirts && (t = Math.PI / 2); for (w = 0; w < jt / da.girtSpacing;) w < It / da.girtSpacing ? (da.flushGirts && (e = da.girtThickness / 2 - .1), da.standingGirts && (e = da.girtThickness / 2 - .05), (E = xt.clone()).position.set(0, w * da.girtSpacing + .05, Lt + .04 - l / 1.9 - e), E.rotation.z = t, E.rotation.y = Math.PI / 2, E.scale.z = Ct - .1, E.scale.y = da.girtThickness, da.hideWalls < 3 ? E.visible = !0 : E.visible = !1, Ft.add(E), da.flushGirts && (e = da.girtThickness / 2 + .03), da.standingGirts && (e = da.girtThickness / 2 - .05), (E = xt.clone()).position.set(Ct / 2 + .04 - l / 1.9 - e, w * da.girtSpacing + .05, Lt / 2 + .04 - l / 1.9 - e), E.rotation.z = t, E.rotation.y = 0, E.scale.z = Lt, E.scale.y = da.girtThickness, da.hideWalls < 3 ? E.visible = !0 : E.visible = !1, Ft.add(E), (E = xt.clone()).position.set(Ct / -2 - .04 + l / 1.9 + e, w * da.girtSpacing + .05, Lt / 2 + .04 - l / 1.9 - e), E.rotation.z = t, E.rotation.y = 0, E.scale.z = Lt) : (da.flushGirts && (e = da.girtThickness / 2 + .03), da.standingGirts && (e = da.girtThickness / 2 - .05), I = (w * da.girtSpacing - jt) / (zt / 12) + 1, (E = xt.clone()).position.set(Ct / 2 + .04 - l / 1.9 - e, w * da.girtSpacing + .05, I / -2 + .04 - l / 1.9 - e), E.rotation.z = t, E.rotation.y = 0, E.scale.z = I, E.scale.y = da.girtThickness, da.hideWalls < 3 ? E.visible = !0 : E.visible = !1, Ft.add(E), (E = xt.clone()).position.set(Ct / -2 - .04 + l / 1.9 + e, w * da.girtSpacing + .05, I / -2 + .04 - l / 1.9 - e), E.rotation.z = t, E.rotation.y = 0, E.scale.z = I), E.scale.y = da.girtThickness, da.hideWalls < 3 ? E.visible = !0 : E.visible = !1, Ft.add(E), w++ } } if (da.leanTo2) { void 0 === ia.getObjectByName("LeanTo2PostClones") && ((C = new THREE.Group).name = "LeanTo2PostClones", C.rotation.y = Math.PI / -2, ia.getObjectByName("leanTo2").add(C), (j = new THREE.Group).name = "LeanTo2PostMaster", C.add(j)); var C, j, s = ni(da.leanTo2Depth, da.leanTo2Height - si(da.leanTo2Depth, da.leanTo2Pitch), da.leanTo2Pitch, da.eaveL), b = (s.rotation.y = THREE.Math.degToRad(90), j.add(s), da.leanTo2Length / 2 - l - .08), y = da.leanTo2Length / -2 + l + .08, f = Math.ceil((b - y) / V); j.position.x = b; for (w = 1; w <= f; w++)(r = ia.getObjectByName("LeanTo2PostMaster").clone()).name = "LeanToTrussClone", r.position.x = b - w * (b - y) / f, da.gutters && da.settings.downspountsOnEndsOnly && w < f && (r.getObjectByName("downspout-clone").visible = !1), C.add(r); if (da.leanTo2Enclosed && "Fully Enclosed" == da.leanTo2Walls) { var kt = da.leanTo2Depth, Gt = da.leanTo2Length, $t = da.leanTo2Height, _t = da.leanTo2Pitch, qt = $t - kt * _t / 12, At = C; let e = 0, t = 0; da.flushGirts && (t = Math.PI / 2), da.standingGirts && (t = Math.PI / 2); for (w = 0; w < $t / da.girtSpacing;) w < qt / da.girtSpacing ? (da.flushGirts && (e = da.girtThickness / 2 - .1), da.standingGirts && (e = da.girtThickness / 2 - .05), (E = xt.clone()).position.set(0, w * da.girtSpacing + .05, kt + .04 - l / 1.9 - e), E.rotation.z = t, E.rotation.y = Math.PI / 2, E.scale.z = Gt - .1, E.scale.y = da.girtThickness, da.hideWalls < 3 ? E.visible = !0 : E.visible = !1, At.add(E), da.flushGirts && (e = da.girtThickness / 2 + .03), da.standingGirts && (e = da.girtThickness / 2 - .05), (E = xt.clone()).position.set(Gt / 2 + .04 - l / 1.9 - e, w * da.girtSpacing + .05, kt / 2 + .04 - l / 1.9 - e), E.rotation.z = t, E.rotation.y = 0, E.scale.z = kt, E.scale.y = da.girtThickness, da.hideWalls < 3 ? E.visible = !0 : E.visible = !1, At.add(E), (E = xt.clone()).position.set(Gt / -2 - .04 + l / 1.9 + e, w * da.girtSpacing + .05, kt / 2 + .04 - l / 1.9 - e), E.rotation.z = t, E.rotation.y = 0, E.scale.z = kt) : (da.flushGirts && (e = da.girtThickness / 2 + .03), da.standingGirts && (e = da.girtThickness / 2 - .05), I = (w * da.girtSpacing - $t) / (_t / 12) + 1, (E = xt.clone()).position.set(Gt / 2 + .04 - l / 1.9 - e, w * da.girtSpacing + .05, I / -2 + .04 - l / 1.9 - e), E.rotation.z = t, E.rotation.y = 0, E.scale.z = I, E.scale.y = da.girtThickness, da.hideWalls < 3 ? E.visible = !0 : E.visible = !1, At.add(E), (E = xt.clone()).position.set(Gt / -2 - .04 + l / 1.9 + e, w * da.girtSpacing + .05, I / -2 + .04 - l / 1.9 - e), E.rotation.z = t, E.rotation.y = 0, E.scale.z = I), E.scale.y = da.girtThickness, da.hideWalls < 3 ? E.visible = !0 : E.visible = !1, At.add(E), w++ } } if (da.leanTo4) { void 0 === ia.getObjectByName("LeanTo4PostClones") && ((z = new THREE.Group).name = "LeanTo4PostClones", z.rotation.y = Math.PI / 2, ia.getObjectByName("leanTo4").add(z), (Vt = new THREE.Group).name = "LeanTo4PostMaster", z.add(Vt)); var z, Vt, dt = ni(da.leanTo4Depth, da.leanTo4Height - si(da.leanTo4Depth, da.leanTo4Pitch), da.leanTo4Pitch, da.eaveR), b = (dt.rotation.y = THREE.Math.degToRad(90), Vt.add(dt), da.leanTo4Length / 2 - l - .08), y = da.leanTo4Length / -2 + l + .08, f = Math.ceil((b - y) / V); Vt.position.x = b; for (w = 1; w <= f; w++)(r = ia.getObjectByName("LeanTo4PostMaster").clone()).name = "LeanToTrussClone", r.position.x = b - w * (b - y) / f, da.gutters && da.settings.downspountsOnEndsOnly && w < f && (r.getObjectByName("downspout-clone").visible = !1), z.add(r); if (da.leanTo4Enclosed && "Fully Enclosed" == da.leanTo4Walls) { var Ut = da.leanTo4Depth, Qt = da.leanTo4Length, Xt = da.leanTo4Height, Yt = da.leanTo4Pitch, Zt = Xt - Ut * Yt / 12, Jt = z; let e = 0, t = 0; da.flushGirts && (t = Math.PI / 2), da.standingGirts && (t = Math.PI / 2); for (var I, w = 0; w < Xt / da.girtSpacing;) w < Zt / da.girtSpacing ? (da.flushGirts && (e = da.girtThickness / 2 - .1), da.standingGirts && (e = da.girtThickness / 2 - .05), (E = xt.clone()).position.set(0, w * da.girtSpacing + .05, Ut + .04 - l / 1.9 - e), E.rotation.z = t, E.rotation.y = Math.PI / 2, E.scale.z = Qt - .1, E.scale.y = da.girtThickness, da.hideWalls < 3 ? E.visible = !0 : E.visible = !1, Jt.add(E), da.flushGirts && (e = da.girtThickness / 2 + .03), da.standingGirts && (e = da.girtThickness / 2 - .05), (E = xt.clone()).position.set(Qt / 2 + .04 - l / 1.9 - e, w * da.girtSpacing + .05, Ut / 2 + .04 - l / 1.9 - e), E.rotation.z = t, E.rotation.y = 0, E.scale.z = Ut, E.scale.y = da.girtThickness, da.hideWalls < 3 ? E.visible = !0 : E.visible = !1, Jt.add(E), (E = xt.clone()).position.set(Qt / -2 - .04 + l / 1.9 + e, w * da.girtSpacing + .05, Ut / 2 + .04 - l / 1.9 - e), E.rotation.z = t, E.rotation.y = 0, E.scale.z = Ut) : (da.flushGirts && (e = da.girtThickness / 2 + .03), da.standingGirts && (e = da.girtThickness / 2 - .05), I = (w * da.girtSpacing - Xt) / (Yt / 12) + 1, (E = xt.clone()).position.set(Qt / 2 + .04 - l / 1.9 - e, w * da.girtSpacing + .05, I / -2 + .04 - l / 1.9 - e), E.rotation.z = t, E.rotation.y = 0, E.scale.z = I, E.scale.y = da.girtThickness, da.hideWalls < 3 ? E.visible = !0 : E.visible = !1, Jt.add(E), (E = xt.clone()).position.set(Qt / -2 - .04 + l / 1.9 + e, w * da.girtSpacing + .05, I / -2 + .04 - l / 1.9 - e), E.rotation.z = t, E.rotation.y = 0, E.scale.z = I), E.scale.y = da.girtThickness, da.hideWalls < 3 ? E.visible = !0 : E.visible = !1, Jt.add(E), w++ } } var F, Kt, ea = da.girtSpacing, ta = da.purlinSpacing; (F = new THREE.Group).name = "GirtParent", B.add(F), 2 < da.hideWalls ? F.visible = !1 : F.visible = !0, (Kt = new THREE.Group).name = "PurlinParentL", Kt.position.set(da.width / -2, da.wallHeightL(), 0), Kt.rotation.z = Math.PI / 2 - i, da.roofPitch < 0 && (Kt.rotation.z = Math.PI / -2 - i), F.add(Kt); (aa = new THREE.Group).name = "PurlinParentR", aa.position.set(da.width / 2, da.wallHeightR(), 0), aa.rotation.z = n - Math.PI / -2, da.roofPitch < 0 && (aa.rotation.z = n - Math.PI / 2), F.add(aa), da.depth; (v = ia.getObjectByName("masterSecondaryFramingPiece").clone()).rotation.set(0, 0, 0); for (var aa, w = 0; w < (q - l) / ta;) { E = v.clone(); let e = 0; da.flushPurlins || da.standingPurlins ? (da.flushPurlins && (e = da.purlinThickness / 2 + .0625), da.standingPurlins && (e = 0), "Single Slope" === da.roofType && (e = (da.roofPitch, 0))) : (E.rotation.z = Math.PI / 2, e = 0, "Single Slope" === da.roofType && (e = 0 <= da.roofPitch ? .1 : .2)), E.position.set(w * ta + l, -da.purlinThickness - e, 0), E.scale.y = da.purlinThickness, E.scale.z = da.depth - t - l, E.visible = !0, Kt.add(E), w++ } for (w = 0; w < (A - l) / ta;) { E = v.clone(); let e; da.flushPurlins || da.standingPurlins ? (da.flushPurlins && (e = da.purlinThickness / 2 + .0625), da.standingPurlins && (e = 0), "Single Slope" === da.roofType && (e = (da.roofPitch, 0))) : (E.rotation.z = Math.PI / 2, e = 0, "Single Slope" === da.roofType && (e = 0 <= da.roofPitch ? -.15 : -.25)), "Single Slope" === da.roofType ? E.position.set(w * -ta - l, -da.purlinThickness - e, 0) : E.position.set(w * ta + l, da.purlinThickness + e, 0), E.scale.y = da.purlinThickness, E.scale.z = da.depth - l, E.visible = !0, aa.add(E), w++ } for (w = 0; w < U / ea;) { if (w < da.wallHeightL() / ea && da.enclosedE) { var E = v.clone(); let e = 0; da.flushGirts && (E.rotation.z = Math.PI / 2, e += da.girtThickness / 2 - .1), da.standingGirts && (E.rotation.z = Math.PI / 2, e += da.girtThickness / 2 - .05), E.position.set(da.width / -2 - .04 + l / 1.9 + e, w * ea + .05, 0), E.scale.y = da.girtThickness, E.scale.z = da.depth - t, E.visible = !0, F.add(E) } if (w < da.wallHeightR() / ea && da.enclosedW) { var E = v.clone(); let e = 0; da.flushGirts && (E.rotation.z = Math.PI / 2, e += da.girtThickness / 2 - .1), da.standingGirts && (E.rotation.z = Math.PI / 2, e += da.girtThickness / 2 - .05), E.position.set(da.width / 2 + .04 - l / 1.9 - e, w * ea + .05, 0), E.scale.y = da.girtThickness, E.scale.z = da.depth - t, E.visible = !0, F.add(E) } let e = 0; w < da.height / ea && (da.enclosedS && (E = v.clone(), da.flushGirts && (E.rotation.z = Math.PI / 2, e = da.girtThickness / 2 + .03), da.standingGirts && (E.rotation.z = Math.PI / 2, e = da.girtThickness / 2 - .05), E.position.set(0, w * ea + .05, da.depth / -2 - .04 + l / 1.9 + e), E.rotation.y = Math.PI / 2, E.scale.y = da.girtThickness, E.scale.z = da.width - .25, E.visible = !0, F.add(E)), da.enclosedN) && (E = v.clone(), da.flushGirts && (E.rotation.z = Math.PI / 2, e = da.girtThickness / 2 + .03), da.standingGirts && (E.rotation.z = Math.PI / 2, e = da.girtThickness / 2 - .05), E.position.set(0, w * ea + .05, da.depth / 2 + .04 - l / 1.9 - e), E.rotation.y = Math.PI / 2, E.scale.y = da.girtThickness, E.scale.z = da.width - .25, E.visible = !0, F.add(E)), w++ } if (!da.flushGirts) { let e = 0; for (da.flushGirts && (e += da.girtThickness / 2 + .03), da.standingGirts && (e += da.girtThickness / 2 - .05); w < (Q + da.height - .1) / ea;) { De = w * ea - da.height, Me = ("Single Slope" !== da.roofType && (X = "Asymmetrical" === da.roofType ? De / Q * da.asymmetrical : ($ = da.width / 2, _ = da.width / 2, n = i = k, 0)), $ - (De + .5) / Math.tan(Math.PI / 2 - i)), We = _ - (De + .5) / Math.tan(Math.PI / 2 - n); da.enclosedS && ((E = v.clone()).position.set(X, w * ea + .05, da.depth / -2 - .04 + l / 1.9 + e), E.rotation.y = Math.PI / 2, da.standingGirts && (E.rotation.z = Math.PI / 2), E.scale.y = da.girtThickness, E.scale.z = Me + We - .25, E.visible = !0, F.add(E)), da.enclosedN && ((E = v.clone()).position.set(X, w * ea + .05, da.depth / 2 + .04 - l / 1.9 - e), E.rotation.y = Math.PI / 2, da.standingGirts && (E.rotation.z = Math.PI / 2), E.scale.y = da.girtThickness, E.scale.z = Me + We - .25, E.visible = !0, F.add(E)), w++ } } da.settings.hasOwnProperty("alternatePostSpacingOver40FT") && (40 < da.width ? da.maxPostSpacing = da.settings.alternatePostSpacingOver40FT.over : da.maxPostSpacing = da.settings.alternatePostSpacingOver40FT.under); for (Oe = ((xe = Math.ceil(da.width / da.maxPostSpacing) - 1) < 0 && (xe = 0), da.depth / 2 - (t + .04)), Re = da.width / (xe + 1), P = 0, Be = 0, w = 1; w <= xe; w++) { switch (P = da.width / -2 + Re * w, Be = da.height - 1 - 1, Be = P >= da.asymmetrical ? da.roofHeightAtX(P) - 1 - Ye - Ae - .25 : da.roofHeightAtX(P) - 1 - Xe - Ae - .25, (E = ct.getObjectByName("columnEnd").clone()).name += "-clone", !da.settings.hasOwnProperty("showPostsWithOpenGableWall") || da.settings.showPostsWithOpenGableWall || da.enclosedN ? E.visible = !0 : E.visible = !1, E.position.set(P, 0, Oe), E.morphTargetInfluences[E.morphTargetDictionary.height] = Be, B.add(E), da.postFooting) { case "Post in Ground": $e = ct.getObjectByName("footing-Burried").clone(); break; case "Bracket on Concrete": case "Bracket": $e = ct.getObjectByName("footing").clone(); break; case "Perma-Column": $e = ct.getObjectByName("footing-PermaColumnConcretePost").clone(); break; default: $e = !1 } if ($e && ($e.visible = da.enclosedN, $e.position.set(0, 0, 0), E.add($e)), (E = ct.getObjectByName("columnEnd").clone()).name += "-clone", !da.settings.hasOwnProperty("showPostsWithOpenGableWall") || da.settings.showPostsWithOpenGableWall || da.enclosedS ? E.visible = !0 : E.visible = !1, E.position.set(P, 0, -Oe), E.morphTargetInfluences[E.morphTargetDictionary.height] = Be, B.add(E), $e && ((Y = $e.clone()).visible = da.enclosedS, Y.position.set(0, 0, 0), E.add(Y)), 0 < da.mezzanineBays) { var oa = ca; oa.sort(function(e, t) { return e - t }); for (He = da.mezzanineStartingBay - 1; He <= da.mezzanineBays + da.mezzanineStartingBay - 1; He++)(He == da.mezzanineStartingBay - 1 && 1 < da.mezzanineStartingBay || He > da.mezzanineStartingBay - 1) && (da.hasOwnProperty("mezzanineSupport") && "Floor Support" != da.mezzanineSupport ? ((E = ct.getObjectByName("mezzanineHanger").clone()).name += "-clone", E.visible = !0, E.position.set(P, da.mezzanineHeight, oa[He]), E.morphTargetInfluences[E.morphTargetDictionary.height] = da.roofHeightAtX(P) - da.mezzanineHeight - 2.3 / Math.cos(ri(da.roofPitch)) - 1) : ((E = ct.getObjectByName("columnEnd").clone()).name += "-clone", E.visible = !0, E.position.set(P, 0, oa[He]), E.morphTargetDictionary.hasOwnProperty("height") ? E.morphTargetInfluences[E.morphTargetDictionary.height] = da.mezzanineHeight - 1 - .5 : E.scale.y = da.mezzanineHeight - .5), B.add(E)) } } } } function Ao(e, t) { var a = new THREE.Group, o = (a.name = "TrussClones", na.add(a), []); let i, n; for (var r = 1; r < da.depth / 2 / e; r++) o.push(r * e), o.push(r * -e), (i = ia.getObjectByName("RidgidPostMasterL").clone()).name = "TrussClone", i.position.z = r * e, a.add(i), (n = ia.getObjectByName("RidgidPostMasterL").clone()).name = "TrussClone", n.position.z = r * -e, a.add(n), (i = ia.getObjectByName("RidgidPostMasterR").clone()).name = "TrussClone", i.position.z = r * e, a.add(i), (n = ia.getObjectByName("RidgidPostMasterR").clone()).name = "TrussClone", n.position.z = r * -e, a.add(n); return o.push(da.depth / 2 - t - .25), o.push(da.depth / -2 + t + .25), (i = ia.getObjectByName("RidgidPostMasterL").clone()).name = "TrussClone", i.position.z = da.depth / 2 - t - .25, a.add(i), (n = ia.getObjectByName("RidgidPostMasterL").clone()).name = "TrussClone", n.position.z = da.depth / -2 + t + .25, a.add(n), (i = ia.getObjectByName("RidgidPostMasterR").clone()).name = "TrussClone", i.position.z = da.depth / 2 - t - .25, a.add(i), (n = ia.getObjectByName("RidgidPostMasterR").clone()).name = "TrussClone", n.position.z = da.depth / -2 + t + .25, a.add(n), o } function Vo(e, t, a, o) { var i, n, r = [], s = da.depth / 2 - t - .08, l = da.depth / -2 + t + .08, h = Math.ceil((s - l) / e); a.position.z = s, r.push(s); for (var c = 1; c <= h; c++) { if (r.push(i = s - c * (s - l) / h), (n = a.clone()).name = "TrussClone", n.position.z = i, da.gutters) { let e, t; t = "Open Web Truss" == da.frameType ? (e = n.getObjectByName("primaryFrameL"), n.getObjectByName("primaryFrameR")) : (e = n.getObjectByName("columnSideL"), n.getObjectByName("columnSideR")), da.settings.downspountsOnEndsOnly && c < h && (e.getObjectByName("downspout-clone").visible = !1, t.getObjectByName("downspout-clone").visible = !1), da.leanTo2 && da.depth / 2 - da.leanTo2CutR > i && da.depth / -2 + da.leanTo2CutL < i && (e.getObjectByName("downspout-clone").visible = !1), da.leanTo4 && da.depth / 2 - da.leanTo4CutL > i && da.depth / -2 + da.leanTo4CutR < i && (t.getObjectByName("downspout-clone").visible = !1) } if (1 < Math.round(da.maxPostSpacing / da.maxTrussSpacing)) c % Math.round(da.maxPostSpacing / da.maxTrussSpacing) != 0 && c < h && n.traverse(function(e) { e instanceof THREE.Mesh && (e.name.startsWith("footing") || e.name.startsWith("columnSide")) && (e.visible = !1) }); else if (1 < Math.round(da.maxTrussSpacing / da.maxPostSpacing)) { let o = Math.round(da.maxTrussSpacing / da.maxPostSpacing) - 1, i = (s - r[1]) / (1 + o); n.traverse(function(e) { if (e instanceof THREE.Mesh && (e.name.startsWith("footing") || e.name.startsWith("columnSide"))) for (var t = 1; t <= o; t++) { var a = e.clone(); a.position.z += i * t, a.name = "extra-" + a.name, n.add(a) } }) } o.add(n) } return Object.defineProperty(r, "spacingBetweenTrusses", { enumerable: !1, get: function() { return (s - l) / h } }), r } function Uo(e, t) { let a = new THREE.Group, o = (a.name = "TrussClones", na.add(a), []), i; var n = 0, r = (da.depth % 25 == 0 ? e = 25 : da.depth % 20 == 0 ? e = 20 : (da.depth - 25) % 20 == 0 ? (e = 20, n = 1) : (da.depth - 20) % 25 == 0 && (e = 25), da.depth / 2 - t - .25), s = da.depth / -2 + t + .25, l = Math.ceil((r - s) / e) - n; ia.getObjectByName("RidgidPostMasterR").position.z = r, ia.getObjectByName("RidgidPostMasterL").position.z = r; for (var h = 1; h <= l; h++) o.push(r - h * (e = h == l ? (r - s) / l : e)), (i = ia.getObjectByName("RidgidPostMasterR").clone()).name = "TrussClone", i.position.z = r - h * e, a.add(i), (i = ia.getObjectByName("RidgidPostMasterL").clone()).name = "TrussClone", i.position.z = r - h * e, a.add(i); return o } function Qo(e) { var t = e.parent; 0 < e.children.length && e.children.forEach(function(e) { Qo(e) }), e instanceof THREE.Mesh && (e.geometry.dispose(), 1 < e.material.length ? e.material.forEach(function(e) { e.dispose() }) : (e.material.dispose(), e.material = void 0)), t.remove(e) } function Xo(e, t) { void 0 === t && (t = "warning"), document.querySelector("#alert_top span.content").innerHTML = e, document.querySelector("#alert_top").className = "alert alert-" + t, $("#alert_top").slideDown("slow") } function Yo() { setTimeout(function() { "dev" == r ? Xo("NOTICE: You are currently using the development version of the " + ta + " " + aa + ". Saving, sharing, and requesting a quote are for testing purposes only. Submitting a building for a quote will not result in a quote being generated for your building.", "danger") : "demo" == r ? Xo("DEMO MODE: Saving, sharing, and requesting a quote are for demo purposes only. Submitting a building for a quote will not result in a quote being generated for your building.", "danger") : "live" !== r && Xo("NOTICE: This application is currently disabled. Please contact support to resolve the issue. Submitting a building for a quote will not result in a quote being generated for your building.", "danger") }, 1500) } function Zo(e, t, a, o, i) { return (e - t) / (a - t) * (i - o) + o } function Jo() { var t, a, o, i, n; for (let e = 1; e <= 4; e++) { a = "leanTo" + e, (o = (t = ia.getObjectByName(a)).deepClone()).name = a; for (let e = 0; e < o.material.length; e++) o.material[e].normalMap && void 0 !== o.material[e].normalMap.image && (i = o.material[e].clone(), (n = te.clone()).needsUpdate = !0, i.normalMap = n, o.material[e] = i, na.add(o), na.remove(t)) } } function Ko() { da.hasOwnProperty("boardAndBattenWoodenBarnSiding") && da.boardAndBattenWoodenBarnSiding && ia.traverse(function(e) { e instanceof THREE.Mesh && Array.isArray(e.material) && e.material.forEach(function(e) { (e.name.startsWith("BuildingWalls") || e.name.startsWith("BuildingWainscot") || e.name.startsWith("LeantoWalls") || e.name.startsWith("LeantoWainscot") || e.name.startsWith("interiorWall") || e.name.startsWith("BuildingTrim") && !e.name.endsWith("RoofEdge") && !e.name.endsWith("RoofPivot") && !e.name.endsWith("Gable")) && (e.shininess = 5, e.map = woodGrainTexture.clone(), e.normalMap = woodGrainNormal.clone(), e.map.needsUpdate = !0, e.normalMap.needsUpdate = !0, e.needsUpdate = !0) }) }) } function ei(g, u, t, a, o, T, b, y, f, w, v, E) { var i = u.settings.restrictPeakOfCoverdGablesToEaveHeight, n = u.settings.restrictEaveOfCoverdGablesToEaveHeight; if (t.__folders.hasOwnProperty(Rt)) { if (t.__folders[Rt].__folders.hasOwnProperty(o.N.name + " " + Bt)) for (var r = 0; r < t.__folders[Rt].__folders[o.N.name + " " + Bt].__controllers.length; r++) { var s = t.__folders[Rt].__folders[o.N.name + " " + Bt].__controllers[r], e = u.coveredGableExtensionNHeight + (u.width - u.coveredGableExtensionNCutR - u.coveredGableExtensionNCutL) / 2 * u.coveredGableExtensionNPitch / 12, l = u.roofHeightAtX(u.coveredGableExtensionNCutR - u.coveredGableExtensionNCutL); "coveredGableExtensionNHeight" === s.property && (s.max(Math.floor(u.coveredGableExtensionNHeight + l - e)), !a && u.coveredGableExtensionNHeight > s.__max && (u.coveredGableExtensionNHeight = s.__max), u.coveredGableExtensionNHeight < 6 && (u.coveredGableExtensionNHeight = 6), s.updateDisplay()), "coveredGableExtensionNCutL" === s.property && (s.max(u.width - u.coveredGableExtensionNCutR - 6), !a && u.coveredGableExtensionNCutL > s.__max && (u.coveredGableExtensionNCutL = s.__max), u.coveredGableExtensionNCutL < 0 && (u.coveredGableExtensionNCutL = 0), s.updateDisplay()), "coveredGableExtensionNCutR" === s.property && (s.max(u.width - u.coveredGableExtensionNCutL - 6), !a && u.coveredGableExtensionNCutR > s.__max && (u.coveredGableExtensionNCutR = s.__max), u.coveredGableExtensionNCutR < 0 && (u.coveredGableExtensionNCutR = 0), s.updateDisplay()) } if (t.__folders[Rt].__folders.hasOwnProperty(o.S.name + " " + Bt)) for (r = 0; r < t.__folders[Rt].__folders[o.S.name + " " + Bt].__controllers.length; r++) { var s = t.__folders[Rt].__folders[o.S.name + " " + Bt].__controllers[r], h = u.coveredGableExtensionSHeight + (u.width - u.coveredGableExtensionSCutR - u.coveredGableExtensionSCutL) / 2 * u.coveredGableExtensionSPitch / 12, c = u.roofHeightAtX(u.coveredGableExtensionSCutL - u.coveredGableExtensionSCutR); "coveredGableExtensionSHeight" === s.property && (s.max(Math.floor(u.coveredGableExtensionSHeight + c - h)), !a && u.coveredGableExtensionSHeight > s.__max && (u.coveredGableExtensionSHeight = s.__max), u.coveredGableExtensionSHeight < 6 && (u.coveredGableExtensionSHeight = 6), s.updateDisplay()), "coveredGableExtensionSCutL" === s.property && (s.max(u.width - u.coveredGableExtensionSCutR - 6), !a && u.coveredGableExtensionSCutL > s.__max && (u.coveredGableExtensionSCutL = s.__max), u.coveredGableExtensionSCutL < 0 && (u.coveredGableExtensionSCutL = 0), s.updateDisplay()), "coveredGableExtensionSCutR" === s.property && (s.max(u.width - u.coveredGableExtensionSCutL - 6), !a && u.coveredGableExtensionSCutR > s.__max && (u.coveredGableExtensionSCutR = s.__max), u.coveredGableExtensionSCutR < 0 && (u.coveredGableExtensionSCutR = 0), s.updateDisplay()) } if (t.__folders[Rt].__folders.hasOwnProperty(o.E.name + " " + Bt)) for (r = 0; r < t.__folders[Rt].__folders[o.E.name + " " + Bt].__controllers.length; r++) { var s = t.__folders[Rt].__folders[o.E.name + " " + Bt].__controllers[r], d = u.coveredGableExtensionEHeight + (u.depth - u.coveredGableExtensionECutR - u.coveredGableExtensionECutL) / 2 * u.coveredGableExtensionEPitch / 12; let e = u.peakHeight(); i && (e = u.height), "coveredGableExtensionEHeight" === s.property && (s.max(Math.floor(u.coveredGableExtensionEHeight + e - d)), n && s.max(u.height), !a && u.coveredGableExtensionEHeight > s.__max && (u.coveredGableExtensionEHeight = s.__max), u.coveredGableExtensionEHeight < 0 && (u.coveredGableExtensionEHeight = 0), s.updateDisplay()), "coveredGableExtensionECutL" === s.property && (s.max(u.depth - u.coveredGableExtensionECutR - 6), !a && u.coveredGableExtensionECutL > s.__max && (u.coveredGableExtensionECutL = s.__max), u.coveredGableExtensionECutL < 0 && (u.coveredGableExtensionECutL = 0), s.updateDisplay()), "coveredGableExtensionECutR" === s.property && (s.max(u.depth - u.coveredGableExtensionECutL - 6), !a && u.coveredGableExtensionECutR > s.__max && (u.coveredGableExtensionECutR = s.__max), u.coveredGableExtensionECutR < 0 && (u.coveredGableExtensionECutR = 0), s.updateDisplay()) } if (t.__folders[Rt].__folders.hasOwnProperty(o.W.name + " " + Bt)) for (r = 0; r < t.__folders[Rt].__folders[o.W.name + " " + Bt].__controllers.length; r++) { var s = t.__folders[Rt].__folders[o.W.name + " " + Bt].__controllers[r], p = u.coveredGableExtensionWHeight + (u.depth - u.coveredGableExtensionWCutR - u.coveredGableExtensionWCutL) / 2 * u.coveredGableExtensionWPitch / 12; let e = u.peakHeight(); i && (e = u.height), "coveredGableExtensionWHeight" === s.property && (s.max(Math.floor(u.coveredGableExtensionWHeight + e - p)), n && s.max(u.height), !a && u.coveredGableExtensionWHeight > s.__max && (u.coveredGableExtensionWHeight = s.__max), u.coveredGableExtensionWHeight < 0 && (u.coveredGableExtensionWHeight = 0), s.updateDisplay()), "coveredGableExtensionWCutL" === s.property && (s.max(u.depth - u.coveredGableExtensionWCutR - 6), !a && u.coveredGableExtensionWCutL > s.__max && (u.coveredGableExtensionWCutL = s.__max), u.coveredGableExtensionWCutL < 0 && (u.coveredGableExtensionWCutL = 0), s.updateDisplay()), "coveredGableExtensionWCutR" === s.property && (s.max(u.depth - u.coveredGableExtensionWCutL - 6), !a && u.coveredGableExtensionWCutR > s.__max && (u.coveredGableExtensionWCutR = s.__max), u.coveredGableExtensionWCutR < 0 && (u.coveredGableExtensionWCutR = 0), s.updateDisplay()) } } if (u.hasOwnProperty("coveredGableExtensionN") && u.coveredGableExtensionN || u.hasOwnProperty("coveredGableExtensionS") && u.coveredGableExtensionS || u.hasOwnProperty("coveredGableExtensionE") && u.coveredGableExtensionE || u.hasOwnProperty("coveredGableExtensionW") && u.coveredGableExtensionW) { let h = "coveredGableExtension"; if (void 0 === na.getObjectByName(h)) return; var P = na.getObjectByName(h); let c, d, p, m; for (let l = 0; l < 4; l++) { h = "coveredGableExtension"; let e = "", t = ""; switch (l) { case 0: h += "N", e = "N", t = 1; break; case 1: h += "S", e = "S", t = 3; break; case 2: h += "E", e = "E", t = 2; break; case 3: h += "W", e = "W", t = 4; break; default: h += "N", e = "N", t = 1 } if (void 0 === na.getObjectByName(h)) { (c = new THREE.Group).name = h + "Null", na.add(c), (d = P.deepClone()).name = h, d.frustumCulled = !1, c.add(d), p = na.getObjectByName("roofL").deepClone(), m = na.getObjectByName("roofR").deepClone(), p.name = h + "RoofL", m.name = h + "RoofR", c.add(p), c.add(m); for (let e = 0; e < d.material.length; e++) d.material[e].name.startsWith("BuildingWainscotTrim") ? d.material[e].name = "BuildingWainscotTrim" + t : d.material[e].name.startsWith("BuildingWainscot1") ? d.material[e].name = "BuildingWainscot" + t + "-front" : (d.material[e].name.startsWith("BuildingWainscot2") || d.material[e].name.startsWith("BuildingWainscot4")) && (d.material[e].name = "BuildingWainscot" + t + "-sides"); if ("E" == e || "W" == e) { for (let e = 0; e < d.material.length; e++) d.material[e].clippingPlanes = w, d.material[e].clipIntersection = !0, d.material[e].clipShadows = !0; for (let e = 0; e < p.material.length; e++) p.material[e].clippingPlanes = w, p.material[e].clipIntersection = !0, p.material[e].clipShadows = !0; for (let e = 0; e < m.material.length; e++) m.material[e].clippingPlanes = w, m.material[e].clipIntersection = !0, m.material[e].clipShadows = !0 } else { for (let e = 0; e < m.material.length; e++) p.material[e].clippingPlanes = v, p.material[e].clipIntersection = !0, p.material[e].clipShadows = !0; for (let e = 0; e < m.material.length; e++) m.material[e].clippingPlanes = v, m.material[e].clipIntersection = !0, m.material[e].clipShadows = !0 } } else c = na.getObjectByName(h + "Null"), d = c.getObjectByName(h), p = c.getObjectByName(h + "RoofL"), m = c.getObjectByName(h + "RoofR"); u.hideWalls < 2 ? (p.visible = !0, m.visible = !0) : (p.visible = !1, m.visible = !1); let o; switch (h) { case "coveredGableExtensionN": o = u.width - u[h + "CutR"] - u[h + "CutL"], d.morphTargetInfluences[d.morphTargetDictionary.width] = o - 1, c.position.x = u[h + "CutL"] / 2 - u[h + "CutR"] / 2, c.position.z = u.depth / 2; break; case "coveredGableExtensionS": c.rotation.y = THREE.Math.degToRad(180), o = u.width - u[h + "CutR"] - u[h + "CutL"], d.morphTargetInfluences[d.morphTargetDictionary.width] = o - 1, c.position.x = u[h + "CutR"] / 2 - u[h + "CutL"] / 2, c.position.z = u.depth / -2; break; case "coveredGableExtensionE": c.rotation.y = THREE.Math.degToRad(-90), o = u.depth - u[h + "CutR"] - u[h + "CutL"], d.morphTargetInfluences[d.morphTargetDictionary.width] = o - 1, c.position.z = u[h + "CutL"] / 2 - u[h + "CutR"] / 2, d.position.z = u.width / 2; break; case "coveredGableExtensionW": c.rotation.y = THREE.Math.degToRad(90), o = u.depth - u[h + "CutR"] - u[h + "CutL"], d.morphTargetInfluences[d.morphTargetDictionary.width] = o - 1, c.position.z = u[h + "CutR"] / 2 - u[h + "CutL"] / 2, d.position.z = u.width / 2 } var D = u[h + "Height"], M = D + o / 2 * u[h + "Pitch"] / 12; let i = u[h + "Depth"], a = 0; "E" != e && "W" != e || (i += u.width / 2, a = u.width / 2), d.morphTargetInfluences[d.morphTargetDictionary.height] = D - 1, p.position.y = M + .1, m.position.y = M + .1, d.morphTargetInfluences[d.morphTargetDictionary.depth] = i - 1, "E" != e && "W" != e || (d.morphTargetInfluences[d.morphTargetDictionary.depth] = i - u.width / 2 - 1), p.morphTargetInfluences[p.morphTargetDictionary.depth] = (i - 1) / 1e3, m.morphTargetInfluences[m.morphTargetDictionary.depth] = (i - 1) / 1e3, p.position.z = i / 2, m.position.z = i / 2, d.morphTargetInfluences[d.morphTargetDictionary.roofPeak] = o / 2 * u[h + "Pitch"] / 12, p.rotation.z = Math.atan(12 / u[h + "Pitch"]) - THREE.Math.degToRad(-90), m.rotation.z = THREE.Math.degToRad(-90) + Math.atan(12 / u[h + "Pitch"]), p.morphTargetInfluences[p.morphTargetDictionary.width] = (Math.hypot(o / 2, o / 2 * u[h + "Pitch"] / 12) - .5) / 50, m.morphTargetInfluences[m.morphTargetDictionary.width] = (Math.hypot(o / 2, o / 2 * u[h + "Pitch"] / 12) - .5) / 50, p.material.forEach(function(e) { null !== e.normalMap && e.normalMap.hasOwnProperty("image") && e.normalMap.image.src.endsWith("building-normal.jpg") && e.normalMap.repeat.set(12 * i / 9, 1) }), m.material.forEach(function(e) { null !== e.normalMap && e.normalMap.hasOwnProperty("image") && e.normalMap.image.src.endsWith("building-normal.jpg") && e.normalMap.repeat.set(12 * i / 9, 1) }), d.material.forEach(function(e) { null !== e.normalMap && e.normalMap.hasOwnProperty("image") && e.normalMap.image.src.endsWith("building-normal.jpg") && ((e.name.startsWith("BuildingWallsDepth") || e.name.startsWith("BuildingWainscot") && e.name.endsWith("-sides")) && e.normalMap.repeat.set(2 * u[h + "Depth"] * 12 / 9, 1), e.name.startsWith("BuildingWallsWidth") || e.name.startsWith("BuildingWainscot") && e.name.endsWith("-front")) && e.normalMap.repeat.set(12 * o / 9, 1) }); let n, r = .7; void 0 === c.getObjectByName(h + "Framing") ? ((n = new THREE.Group).name = h + "Framing", c.add(n)) : n = c.getObjectByName(h + "Framing"), E(n); var W = new THREE.Group; if (W.name = h + "framingPrimary", n.add(W), W.position.z = i - r, u.hasOwnProperty(h + "Structure") && "Wood" != u[h + "Structure"]) "Open Web Truss" == u.frameType && (r = .15, (O = g.getObjectByName("masterSecondaryFramingPiece").clone()).rotation.set(0, 0, 0), x = O.clone(), O = O.clone(), x.position.y = D - 2 * r, O.position.y = D - 2 * r, x.position.x = o / -2 + r, O.position.x = o / 2 - r, x.position.z = (i + a) / 2 - 2 * r, O.position.z = (i + a) / 2 - 2 * r, O.rotation.z = THREE.Math.degToRad(90), x.rotation.z = 0, x.scale.z = u[h + "Depth"] - 4 * r, O.scale.z = u[h + "Depth"] - 4 * r, n.add(x), n.add(O), (x = ni(o / 2, D + .25, u[h + "Pitch"], 0)).rotation.y = THREE.Math.degToRad(0), W.add(x), (O = ni(o / 2, D + .25, u[h + "Pitch"], 0)).rotation.y = THREE.Math.degToRad(180), W.add(O)); else { var x = T.getObjectByName("beamRoofL").clone(), O = T.getObjectByName("beamRoofR").clone(), R = (x.position.y = D, O.position.y = D, x.position.x = o / -2 + r, O.position.x = o / 2 - r, x.position.z = i - r, O.position.z = i - r, O.rotation.z = THREE.Math.degToRad(180), x.rotation.z = 0, x.rotation.y = THREE.Math.degToRad(90), O.rotation.y = THREE.Math.degToRad(90), x.morphTargetInfluences[x.morphTargetDictionary.length] = u[h + "Depth"] - r - 1, O.morphTargetInfluences[O.morphTargetDictionary.length] = u[h + "Depth"] - r - 1, n.add(x), n.add(O), b.getObjectByName("columnSide").clone()), B = b.getObjectByName("columnSide").clone(), R = (R.visible = !0, B.visible = !0, R.position.x = -o / 2 + r, B.position.x = o / 2 - r, R.morphTargetInfluences[R.morphTargetDictionary.height] = D - 1, B.morphTargetInfluences[B.morphTargetDictionary.height] = D - 1, W.add(R), W.add(B), T.getObjectByName("truss").clone()), B = M - D; R.position.y = D, R.morphTargetInfluences[R.morphTargetDictionary.width] = o - 2 * r - 1, R.morphTargetInfluences[R.morphTargetDictionary.height] = B - 1.25, R.morphTargetInfluences[R.morphTargetDictionary.asymmetrical] = 0, W.add(R); let e = T.getObjectByName("beamRoofL").clone(); e = T.getObjectByName("beamRoofL").clone(), M = Math.hypot(B, o / 2) - 1, e.visible = !0, e.position.x = o / -2 + r + 0, e.position.y = D + r * u[h + "Pitch"] / 12, e.morphTargetInfluences[e.morphTargetDictionary.length] = M - 1, e.rotation.z = THREE.Math.degToRad(180) - p.rotation.z, W.add(e), e = T.getObjectByName("beamRoofR").clone(), M = Math.hypot(B, o / 2) - 1, e.visible = !0, e.position.x = o / 2 - r, e.position.y = D + r * u[h + "Pitch"] / 12, e.morphTargetInfluences[e.morphTargetDictionary.length] = M - 1, e.rotation.z = THREE.Math.degToRad(180) - m.rotation.z, W.add(e); let t = 2; 30 < o && (t = 3); let a = T.getObjectByName("webbingVertR1").clone(); a.position.y = D - .3, a.position.x = o / 2 / t, a.morphTargetInfluences[a.morphTargetDictionary.height] = B - u[h + "Pitch"] / 12 * o / 2 / t - 1, W.add(a), (a = T.getObjectByName("webbingVertL1").clone()).position.y = D - .3, a.position.x = o / 2 / -t, a.morphTargetInfluences[a.morphTargetDictionary.height] = B - u[h + "Pitch"] / 12 * o / 2 / t - 1, W.add(a), 30 < o && ((a = T.getObjectByName("webbingVertR2").clone()).position.y = D - .3, a.position.x = o / t, a.morphTargetInfluences[a.morphTargetDictionary.height] = B - u[h + "Pitch"] / 12 * o / t - 1, W.add(a), (a = T.getObjectByName("webbingVertL2").clone()).position.y = D - .3, a.position.x = o / -t, a.morphTargetInfluences[a.morphTargetDictionary.height] = B - u[h + "Pitch"] / 12 * o / t - 1, W.add(a)), (a = T.getObjectByName("webbingDiagR1").clone()).position.y = D - .3, a.position.x = o / 2 / t, a.rotation.z = Math.PI / 2 - Math.atan((B - .3) / (o / 2 / t)), a.morphTargetInfluences[a.morphTargetDictionary.height] = Math.sqrt(Math.pow(B - .3, 2) + Math.pow(o / 2 / t, 2)) - 1, W.add(a), (a = T.getObjectByName("webbingDiagL1").clone()).position.y = D - .3, a.position.x = o / 2 / -t, a.rotation.z = Math.PI / -2 + Math.atan((B - .3) / (o / 2 / t)), a.morphTargetInfluences[a.morphTargetDictionary.height] = Math.sqrt(Math.pow(B - .3, 2) + Math.pow(o / 2 / t, 2)) - 1, W.add(a), 30 < o && ((a = T.getObjectByName("webbingDiagR2").clone()).position.y = D - .3, a.position.x = o / t, a.rotation.z = THREE.Math.degToRad(90) - Math.atan((B - u[h + "Pitch"] / 12 * o / 2 / t) / (o / 2 / t)), a.morphTargetInfluences[a.morphTargetDictionary.height] = Math.hypot(B - u[h + "Pitch"] / 12 * o / 2 / t, o / 2 / t) - 1, W.add(a), (a = T.getObjectByName("webbingDiagL2").clone()).position.y = D - .3, a.position.x = o / -t, a.rotation.z = Math.PI / -2 + Math.atan((u.roofHeightAtX(o / 2 / -t) - D - .3) / (o / 2 / t)), a.rotation.z = Math.atan((B - u[h + "Pitch"] / 12 * o / 2 / t) / (o / 2 / t)) - THREE.Math.degToRad(90), a.morphTargetInfluences[a.morphTargetDictionary.height] = Math.hypot(B - u[h + "Pitch"] / 12 * o / 2 / t, o / 2 / t) - 1, W.add(a)) } if (u[h + "Depth"] > u.maxTrussSpacing) { var S, H = Math.ceil(u[h + "Depth"] / u.maxTrussSpacing); for (let e = 1; e < H; e++)(S = W.clone()).position.z = i - r - u[h + "Depth"] / H * e, n.add(S) } let s; if (void 0 !== y.getObjectByName(h + "BoundingBox") ? s = y.getObjectByName(h + "BoundingBox") : ((R = new THREE.BoxGeometry(1, 1, 1)).applyMatrix((new THREE.Matrix4).makeTranslation(0, .5, .5)), M = new THREE.MeshPhongMaterial({ color: 16770491, wireframe: !0, side: THREE.DoubleSide, visible: !1 }), (s = new THREE.Mesh(R, M)).name = h + "BoundingBox", s.rotation.y = 0, f.push(s), y.add(s)), s.position.copy(c.position), s.rotation.copy(c.rotation), "W" == e ? s.position.x = u.width / 2 : "E" == e && (s.position.x = u.width / -2), s.scale.set(o, D + 10, u[h + "Depth"]), 0 != u[h] && u[h + "Enclosed"] || (s.position.set(0, 0, 0), s.scale.set(.1, .1, .1)), 0 < u.hideWalls) d.visible = !1; else if (u[h + "Enclosed"]) { d.visible = !0; for (let e = d.morphTargetInfluences[d.morphTargetDictionary.unEnclosedHeight] = 0; e < d.material.length; e++) d.material[e].name.startsWith("BuildingWainscot") && (u["wainscot" + t] && (d.material[e].name.startsWith("BuildingWainscot" + t) || d.material[e].name.startsWith("BuildingWainscotTrim" + t)) ? d.material[e].visible = !0 : u["wainscot" + t] || !d.material[e].name.startsWith("BuildingWainscot" + t) && !d.material[e].name.startsWith("BuildingWainscotTrim" + t) || (d.material[e].visible = !1)) } else if (u.settings.showExtensionTriangleWhenOpen) { d.visible = !0, d.morphTargetInfluences[d.morphTargetDictionary.unEnclosedHeight] = D - .3; for (let e = 0; e < d.material.length; e++)(d.material[e].name.startsWith("BuildingWainscot" + t) || d.material[e].name.startsWith("BuildingWainscotTrim" + t)) && (d.material[e].visible = !1) } else d.visible = !1 } } if (na.getObjectByName("coveredGableExtension")) for (let t = 0; t < 4; t++) { let e = "coveredGableExtension"; switch (t) { case 0: e += "N"; break; case 1: e += "S"; break; case 2: e += "E"; break; case 3: e += "W"; break; default: e += "N" } void 0 !== na.getObjectByName(e + "Null") && (na.getObjectByName(e + "Null").visible = u[e]) } } function ti() { try { googleMaps(ia, da, I) } catch (e) { import ("./modules/google-maps.php?v=" + Zt).then(({ googleMaps: e }) => { e(ia, da, I, W) }).catch(e => { console.log("module loading ERROR: " + e) }) } } function ai() { let e, t, a, o; switch (N.visible = !0, L.visible = !0, j.visible = !1, C.visible = !1, da.ground) { case "None": N.visible = !1, L.visible = !1, j.visible = !0, C.visible = !0, ia.fog.color.setHex(16777215); break; case "Treed Vally": o = D + "images/sky/sky-grass-2.jpg", a = D + "images/ground/grass/grass_color.jpg", e = 80, t = 120, ia.fog.color.setHex(7109683); break; case "Clearing": o = D + "images/sky/sky-grass-3.jpg", a = D + "images/ground/grass/grass_color.jpg", e = 80, t = 120, ia.fog.color.setHex(9671499); break; case "Green Mountains": o = D + "images/sky/sky-grass-mountains.jpg", a = D + "images/ground/grass/grass_color.jpg", e = 80, t = 120, ia.fog.color.setHex(6185017); break; case "Rocky Mountains": o = D + "images/sky/sky-mountains.jpg", a = D + "images/ground/rocky/rocky_color.jpg", e = 80, t = 120, ia.fog.color.setHex(8618883); break; case "Southwest": case "Desert": o = D + "images/sky/sky-desert.jpg", a = D + "images/ground/southwest/southwest_color.jpg", e = 80, t = 120, ia.fog.color.setHex(10452824); break; default: o = D + "images/sky/sky-grass.jpg", a = D + "images/ground/grass/grass_color.jpg", e = 80, t = 120, ia.fog.color.setHex(12637405) } let i = (loader = new THREE.TextureLoader).load(a); i.wrapS = THREE.RepeatWrapping, i.wrapT = THREE.RepeatWrapping, i.repeat.x = e, i.repeat.y = t, i.anisotropy = W.capabilities.getMaxAnisotropy(), i.anisotropy = 5, N.material.map = i, N.material.bumpMap = i, N.material.needsUpdate = !0, N.morphTargetInfluences[N.morphTargetDictionary.Hills] = 1.25, loader = new THREE.TextureLoader, i = loader.load(o), L.material.map = i, L.material.needsUpdate = !0 } function oi(e, t, a) { t = t.clone().sub(e).normalize().multiplyScalar(a); return e.clone().add(t) } function ii(e, t, a) { var o = (t = t.clone().sub(e)).length(), t = t.normalize().multiplyScalar(o * a); return e.clone().add(t) } function ni(e, t, a, o, i = !0) { var n = new THREE.Group, r = (n.name = "halfTrussMaster", po(n), va), s = (totalRoofRise = e * a / 12, ri(a) + THREE.Math.degToRad(90)); let l = .2 - e + 2 / 12 / 2; var h = -(l = da.hasOwnProperty("frameConstruction") && "Residential Flush" == da.frameConstruction ? .01 - e : l), c = t - .5 + si(e + l, a); let d = 2; var p = d = e < 12.5 && "Residential Flush" !== da.frameConstruction ? 1.23 : d, e = s / 2, m = d / Math.sin(e); let g = Math.sqrt(Math.pow(m, 2) - Math.pow(d, 2)); var u = Math.sqrt(Math.pow(c - g, 2) + Math.pow(d - .66, 2)), T = Math.acos((c - g) / u), b = h / Math.sin(s); let y = (h - d) / Math.sin(s); var f = Math.abs(d) / Math.sin(s), w = c + Math.sqrt(Math.pow(b, 2) - Math.pow(Math.abs(l), 2)); da.hasOwnProperty("frameConstruction") && "Residential Flush" == da.frameConstruction ? (da.flushGirts = !0, da.standingGirts = !0, d = .5, g = 2 / Math.cos(Math.PI / 2 - s) + Math.tan(Math.PI / 2 - s) * d, y = (h - d) / Math.sin(s), (v = r.getObjectByName("columnTubeSideL").clone()).name = "columnSide", v.position.x = l, v.morphTargetInfluences[v.morphTargetDictionary.height] = c - 1.1, v.morphTargetInfluences[v.morphTargetDictionary.slantTop] = -2 * Math.tan(s - Math.PI / 2)) : da.hasOwnProperty("frameConstruction") && "I-beams" == da.frameConstruction ? (da.flushGirts = !1, (v = r.getObjectByName("beamRoofL").clone()).name = "columnSide", v.position.x = l, v.rotation.z = THREE.Math.degToRad(90), v.morphTargetInfluences[v.morphTargetDictionary.length] = c - 1.1, v.morphTargetInfluences[v.morphTargetDictionary.shear] = -2 * Math.tan(s - Math.PI / 2) * 1.5, v.visible = !0, n.add(v), void 0 !== ia.getObjectByName("downspout") && void 0 !== n.getObjectByName("columnSide") && void 0 === n.getObjectByName("columnSide").getObjectByName("downspout-clone") && ((h = ia.getObjectByName("downspout").clone()).name = "downspout-clone", h.visible = !0, h.castShadow = !0, h.receiveShadow = !0, h.rotation.y = THREE.Math.degToRad(180), h.position.x = -.2, n.getObjectByName("columnSide").add(h)), da.gutters && ((u = n.getObjectByName("columnSide").getObjectByName("downspout-clone")).morphTargetInfluences[u.morphTargetDictionary.height] = t - 1.2 - o / Math.hypot(12, a) * a, u.morphTargetInfluences[u.morphTargetDictionary.downspoutOverhang] = o / Math.hypot(12, a) * 12, 0 < da.hideWalls ? u.visible = !1 : u.visible = 0 < a)) : (da.flushGirts = !1, (v = r.getObjectByName("columnSideL").clone()).name = "columnSide", v.position.x = l, v.morphTargetInfluences[v.morphTargetDictionary.height] = c - 1.1, v.morphTargetInfluences[v.morphTargetDictionary.slantTop] = -2 * Math.tan(s - Math.PI / 2), v.visible = !0, n.add(v), (v = r.getObjectByName("columnSideInnerL").clone()).name = "columnSideInner", v.position.x = l + .66, v.rotation.z = -T, v.morphTargetInfluences[v.morphTargetDictionary.height] = u - 1.1, v.morphTargetInfluences[v.morphTargetDictionary.slantTop] = -2 * Math.tan(s - Math.PI / 2), v.visible = !0, n.add(v), (v = r.getObjectByName("columnSideTangentL").clone()).name = "columnSideTangent", v.position.x = l, v.position.y = c, v.rotation.z = e, v.morphTargetInfluences[v.morphTargetDictionary.length] = m - 1), v.visible = !0, n.add(v), void 0 !== ia.getObjectByName("downspout") && void 0 !== n.getObjectByName("columnSide") && void 0 === n.getObjectByName("columnSide").getObjectByName("downspout-clone") && ((h = ia.getObjectByName("downspout").clone()).name = "downspout-clone", h.visible = !0, h.castShadow = !0, h.receiveShadow = !0, h.rotation.y = THREE.Math.degToRad(180), h.position.x = -.2, n.getObjectByName("columnSide").add(h)), da.gutters && ((u = n.getObjectByName("columnSide").getObjectByName("downspout-clone")).morphTargetInfluences[u.morphTargetDictionary.height] = t - 1.2 - o / Math.hypot(12, a) * a, u.morphTargetInfluences[u.morphTargetDictionary.downspoutOverhang] = o / Math.hypot(12, a) * 12, 0 < da.hideWalls ? u.visible = !1 : u.visible = 0 < a); var e = r.getObjectByName("beamRoofL").clone(), v = 1.5 * a / 12, h = b, t = (e.visible = !0, e.position.x = l, e.position.y = c, e.morphTargetInfluences[e.morphTargetDictionary.length] = h - 1, e.morphTargetInfluences[e.morphTargetDictionary.shear] = v, e.rotation.z = THREE.Math.degToRad(-90) + s, n.add(e), r.getObjectByName("beamRoofInnerL").clone()), o = (t.visible = !da.hasOwnProperty("frameConstruction") || "I-beams" != da.frameConstruction, t.morphTargetInfluences[t.morphTargetDictionary.length] = y - 1, t.position.x = l + d, t.position.y = c - g, t.rotation.z = THREE.Math.degToRad(90) + s, n.add(t), r.getObjectByName("trussVert").clone()), E = (o.position.x = 0, o.position.y = w, o.morphTargetInfluences[o.morphTargetDictionary.length] = Math.abs(f) - 1, o.visible = i && (!da.hasOwnProperty("frameConstruction") || "I-beams" != da.frameConstruction), n.add(o), new THREE.Group), P = (E.name = "WebbingMaster", E.position.x = l, n.add(E), new THREE.Group); if (P.name = "WebbingRoofMaster", P.position.set(l + d, c - g, 0), P.rotation.z = THREE.Math.degToRad(180) + s, n.add(P), !da.hasOwnProperty("frameConstruction") || "Open Web Tapered" == da.frameConstruction) { for (var D = 0, M = .66, W = Math.abs(T) + Math.PI / 2, x = Math.PI / 180 * 33.3, O = Math.PI - x, R = M / Math.sin(Math.PI - x - W) * Math.sin(W); D < c - g;)(WebbingClone = r.getObjectByName("webbing").clone()).name = "WebbingClone", WebbingClone.position.y = D, WebbingClone.scale.y = R, c - g < D + Math.sqrt(Math.pow(R, 2) - Math.pow(d, 2)) ? (WebbingClone.rotation.z = Math.atan((c - g - D) / d) + Math.PI / 2, WebbingClone.scale.y = Math.sqrt(Math.pow(d, 2) + Math.pow(c - g - D, 2))) : WebbingClone.rotation.z = x + Math.PI / 2, WebbingClone.visible = !0, E.add(WebbingClone), (D += R / Math.sin(Math.PI / 2) * Math.sin(x) * 2) < c && ((WebbingClone = r.getObjectByName("webbing").clone()).name = "WebbingClone", WebbingClone.position.y = D, WebbingClone.scale.y = R, WebbingClone.rotation.z = O - Math.PI / 2, WebbingClone.visible = !0, E.add(WebbingClone)), R = (M = R / Math.sin(Math.PI - W) * Math.sin(W - x)) / Math.sin(Math.PI - x - W) * Math.sin(W); var B, D = 0, M = .66, W = Math.abs(T) + Math.PI / 2, x = Math.PI / 2 + Math.PI / 180 * 33.3, R = p / Math.sin(x), S = b, H = y, N = Math.sqrt(Math.pow(m, 2) - Math.pow(p, 2)); for (y; D < H;)(WebbingClone = r.getObjectByName("webbing").clone()).name = "WebbingClone", WebbingClone.position.y = D, WebbingClone.scale.y = R, D + N + Math.sqrt(Math.pow(R, 2) - Math.pow(p, 2)) < S ? WebbingClone.rotation.z = -x : (B = S - N - D, WebbingClone.rotation.z = THREE.Math.degToRad(-90) - Math.atan(B / p), WebbingClone.scale.y = Math.sqrt(Math.pow(p, 2) + Math.pow(B, 2)), D += 100), WebbingClone.visible = !0, P.add(WebbingClone), D += 2 * Math.sqrt(Math.pow(R, 2) - Math.pow(p, 2)), (WebbingClone = r.getObjectByName("webbing").clone()).name = "WebbingClone", (WebbingClone.position.y = D) < H ? (WebbingClone.scale.y = R, WebbingClone.rotation.z = THREE.Math.degToRad(180) + x) : D < H + 5 && (B = (WebbingClone.position.y = H) - D + Math.sqrt(Math.pow(R, 2) - Math.pow(p, 2)), WebbingClone.rotation.z = 0 < B ? -Math.atan(p / B) : -THREE.Math.degToRad(180) - Math.atan(p / B), WebbingClone.scale.y = Math.sqrt(Math.pow(p, 2) + Math.pow(B, 2))), WebbingClone.visible = !0, P.add(WebbingClone); } return n } function ri(e) { return Math.atan(e / 12) } function si(e, t) { return e * t / 12 } function li(e, t, a) { a = t / 2 + Math.abs(a); return a * e / 12 / (t - a) * 12 } function hi(e) { var t = Math.floor(e), e = 12 * (Math.abs(e) - Math.abs(t)); let a = Math.floor(e); var o = e - a; let i; if (0 < o) switch (Math.round(4 * o)) { case 0: i = 0; break; case 1: i = "1/4"; break; case 2: i = "1/2"; break; case 3: i = "3/4"; break; case 4: i = 1; break; default: console.error("error rounding to fraction: " + o) } 1 == i && (a += i, i = 0); let n = ""; return t && (n += t.toString() + "' "), a && (n += a.toString()), i && (n += "-" + i), (a || i) && (n += '"'), n = "" == n ? "0'" : n } function ci(e, t) { var a; return "boolean" == typeof(t = void 0 === t ? !0 : t) && t ? Math.round(.3048 * e) : 0 < t ? Math.round(.3048 * e * 10 ** t) / 10 ** t : t < 0 ? (decimalLocation = (a = .3048 * e).toString().indexOf(".")) >= Math.abs(t) - 1 ? Math.round(a) : parseFloat(a.toString().substring(0, Math.abs(t))) : .3048 * e } function di(t) { if (t) { da.ground = "None", ai(); var a = da.coreBuildingDimensions(), o = (da.buildingWithLeantoDimensions(), da.buildingWithPorchesDimensions()); o.northEdge, a.northEdge, a.westEdge; let e = o.northEdge - a.northEdge; return pi({ name: "widthMainBuilding", arrowType: "groundArrow", arrowLength: da.width, stemLength: e + 3, posZ: o.northEdge + 3, autoOrient: !1 }), e = o.northEdge - a.northEdge, o.width > a.width ? pi({ name: "widthOverallBuilding", arrowType: "groundArrow", arrowLength: o.width, stemLength: e + 6, posX: o.center.x, posZ: o.northEdge + 6, ...da.leanTo2 ? { extendLeft: da.leanTo2CutR } : {}, ...da.leanTo4 ? { extendRight: da.leanTo4CutL } : {}, ...o.width <= a.width ? { visible: !1 } : {}, autoOrient: !1 }) : z.getObjectByName("widthOverallBuilding") && (z.getObjectByName("widthOverallBuilding").visible = !1), e = o.westEdge - a.westEdge, pi({ name: "depthMainBuilding", arrowType: "groundArrow", arrowLength: da.depth, stemLength: e + 3, posX: o.westEdge + 3, rotY: 90, autoOrient: !1 }), e = o.westEdge - a.westEdge, o.depth > a.depth ? pi({ name: "depthOverallBuilding", arrowType: "groundArrow", arrowLength: o.depth, stemLength: e + 6, posX: o.westEdge + 6, posZ: o.center.z, rotY: 90, autoOrient: !1 }) : z.getObjectByName("depthOverallBuilding") && (z.getObjectByName("depthOverallBuilding").visible = !1), "Single Slope" === da.roofType ? (e = o.westEdge - a.westEdge, pi({ name: "peakHeight", arrowType: "heightArrow", arrowLength: da.peakHeight(), stemLength: e + 3, ...0 <= da.roofPitch ? { stemLength: e + 3 } : { stemLength: e + da.width + 3 }, posX: o.westEdge + 3, posY: da.peakHeight() / 2, posZ: a.northEdge })) : (e = o.westEdge - a.westEdge + da.width / 2, "Asymmetrical" == da.roofType && (e -= da.asymmetrical), pi({ name: "peakHeight", arrowType: "heightArrow", arrowLength: da.peakHeight(), stemLength: e + 3, posX: o.westEdge + 3, posY: da.peakHeight() / 2, posZ: a.northEdge })), e = Math.abs(o.eastEdge) - Math.abs(a.eastEdge), pi({ name: "wallHeight", arrowType: "heightArrow", arrowLength: da.height, stemLength: e + 3, posX: o.eastEdge - 3, posY: da.height / 2, posZ: a.northEdge, rotY: 180 }), e = 3, pi({ name: "baySpacingDepth", arrowType: "groundArrow", arrowLength: da.depth / (ca.length - 1), stemLength: e + 3, posX: a.eastEdge + e + .5 + 3, posY: .5, posZ: (ca[0] + ca[1]) / 2, rotY: 90, autoOrient: !1 }), void(z.visible = t) } z.visible = t, G = !0 } function pi(e) { let t, a = (void 0 === (t = (e.hasOwnProperty("parent") ? e.parent : z).getObjectByName(e.name)) && ((t = ra.getObjectByName(e.arrowType).clone()).name = e.name, (e.hasOwnProperty("parent") ? e.parent : z).add(t)), t.morphTargetInfluences[t.morphTargetDictionary.length] = e.arrowLength - 1, e.hasOwnProperty("stemLength") && (t.morphTargetInfluences[t.morphTargetDictionary.offset] = e.stemLength - 1), e.hasOwnProperty("extendLeft") && (t.morphTargetInfluences[t.morphTargetDictionary.extendLeft] = e.extendLeft), e.hasOwnProperty("extendLeftUp") && (t.morphTargetInfluences[t.morphTargetDictionary.extendLeftUp] = e.extendLeftUp), e.hasOwnProperty("extendRight") && (t.morphTargetInfluences[t.morphTargetDictionary.extendRight] = e.extendRight), e.hasOwnProperty("posX") && (t.position.x = e.posX), e.hasOwnProperty("posY") && (t.position.y = e.posY), e.hasOwnProperty("posZ") && (t.position.z = e.posZ), e.hasOwnProperty("rotY") && (t.rotation.y = THREE.Math.degToRad(e.rotY)), 5), o = (e.hasOwnProperty("textSize") && (a = e.textSize), e.hasOwnProperty("textGap") && (t.morphTargetInfluences[t.morphTargetDictionary.textGap] = textAreaWidth), !0), i = !1; (o = e.hasOwnProperty("autoOrient") ? e.autoOrient : o) || "groundArrow" != e.arrowType || (i = !0), mi(e.arrowLength, t, o, i, a), e.hasOwnProperty("visible") ? t.visible = e.visible : t.visible = !0 } function mi(i, n, r, s, l) { "number" == typeof i ? i = hi(i) : "boolean" == typeof i && (i = i ? "true" : "false"), (new THREE.FontLoader).load("fonts/helvetiker_regular.typeface.json", function(e) { e = new THREE.TextGeometry(i, { font: e, size: .35 * l, height: 0, curveSegments: 2, bevelEnabled: !1 }); e.center(), e.applyMatrix((new THREE.Matrix4).makeTranslation(0, 0, .05)); let t = n.getObjectByName("text"); void 0 === t ? ((o = new THREE.MeshBasicMaterial({ color: 10748284 })).side = THREE.FrontSide, o.polygonOffset = !0, o.polygonOffsetFactor = -4, (t = new THREE.Mesh(e, o)).name = "text", s && (t.rotation.x = THREE.Math.degToRad(-90)), n.add(t), o = new THREE.PlaneGeometry(1, 1), a = new THREE.MeshBasicMaterial({ color: 15658734 }), o.applyMatrix((new THREE.Matrix4).makeTranslation(0, 0, .04)), a.side = THREE.FrontSide, a.polygonOffset = !0, a.polygonOffsetFactor = -2, (o = new THREE.Mesh(o, a)).name = "background", t.add(o), r && (t.onBeforeRender = function() { t.lookAt(new THREE.Vector3(M.position.x, M.position.y, M.position.z)) })) : (t.geometry.dispose(), t.geometry = e); var a = t.geometry.boundingBox.max.x - e.boundingBox.min.x, o = t.geometry.boundingBox.max.y - e.boundingBox.min.y; t.getObjectByName("background").scale.set(a + .2 * l, o + .2 * l, 1) }) } function gi() { var e, t = document.getElementById("footer"); if (null == t.querySelector("#cameraSelector")) for (var a = document.createElement("select"), o = (a.id = "cameraSelector", a.style.pointerEvents = "auto", a.onchange = function() { switch (this.value) { case "Top": Eo(); break; case "Front": Eo("Front"); break; case "Back": Eo("Back"); break; case "Left": Eo("Left"); break; case "Right": Eo("Right"); break; default: Eo("3dView") } }, t.appendChild(a), ["Perspective", "Top", "Front", "Back", "Left", "Right"]), i = 0; i < o.length; i++) { var n = document.createElement("option"); n.value = o[i], n.text = o[i], a.appendChild(n) } null == t.querySelector("#downloadBtn") && ((e = document.createElement("button")).type = "button", e.textContent = " Download ", e.id = "downloadBtn", e.onclick = function() { let t = mo({ width: 5760, height: 3240, compression: .75 }); var e = new Date; let a; a = e.getFullYear() + "-", a = (a = (a = (a = (a += ui(e.getMonth() + 1) + "-") + ui(e.getDate()) + " ") + ui(e.getHours()) + ".") + ui(e.getMinutes()) + ".") + ui(e.getSeconds()), setTimeout(function() { var e = document.createElement("a"); e.setAttribute("href", t), e.setAttribute("download", "3D Building Rendering - " + a + ".jpg"), document.body.appendChild(e), e.click(), document.body.removeChild(e) }, 50), event.stopPropagation() }, t.appendChild(e)) } function ui(e) { return e = e < 10 ? "0" + e : e } Z || Ia(), document.addEventListener("DOMContentLoaded", function() { let t = document.createElement("style"); document.body.appendChild(t); let a; F.forEach(function(e) { a = 360 < e.r + e.g + e.b ? "black" : "white", t.innerHTML += 'li.folder select option[value="' + e.name + '"] { background-color: ' + e.hex + "; background-image: url(" + D + "images/color.gif.php?c=" + e.hex.substr(1) + "); color: " + a + "; }", t.innerHTML += "li.folder select." + e.id + " { background-color: " + e.hex + "; background-image: url(" + D + "images/color.gif.php?c=" + e.hex.substr(1) + "); color: " + a + "; }" }) }, !1), THREE.DefaultLoadingManager.onStart = function(e, t, a) { var o = !1; (o = "models/scale-" === e.substring(0, 13) ? !0 : o) && $("#modal-loading").modal("show") }, THREE.DefaultLoadingManager.onLoad = function() { Z && ka(), $("#modal-loading").modal("hide"), St || (St = !0, Jo(), O(), Xa(), x(), K(), Qa(), Ua(), O(), Yo()), G = !0 }, THREE.DefaultLoadingManager.onProgress = function(e, t, a) {}, THREE.DefaultLoadingManager.onError = function(e) { console.log("There was an error loading " + e) }, $(document).ready(function() { window.addEventListener("beforeprint", function(e) { Wt ? (mo({ width: 1920, height: 800, compression: .55 }), $("#printImage").html('')) : (null == document.getElementById("printImage").getElementsByTagName("img")[0] && (mo({ width: 1920, height: 800, compression: .55 }), $("#printImage").html('')), Wt = !0), uo() }) }), $(document).ready(function() { $(".modal").on("shown", function() { $(function() { $(this).find("form :input:visible:enabled:first").focus() }) }), $("form").each(function() { $(this).validate() }), jQuery.validator.addMethod("multiemail", function(e, t) { if (this.optional(t)) return !0; var a, o = e.split(/[;,]+/); for (a in valid = !0, o) e = o[a], valid = valid && jQuery.validator.methods.email.call(this, $.trim(e), t); return valid }, jQuery.validator.messages.email) }), $(document).ready(function() { $("form").submit(function(n) { if ($(this).valid()) { n.preventDefault(); let o = $(this).find("button.btn.btn-primary"); R || o.prop("disabled", !0); var r = $(this).find("button.btn-primary i:first"), s = $(this).find("i.status-icon"), l = (s.attr("class", "status fas fa-cog fa-spin"), r.hide(), s.show(), {}), h = {}, b = {}, y = {}, f = {}, w = {}, v = 0, E = 0, P = 0, D = 0, c = (ia.traverse(function(t) { var e, a, o, i = !1, n = !1, r = !1, s = !1, l = !1, h = !1, c = !1, d = !1, p = !1, m = {}, g = {}, u = {}, T = {}; if (t instanceof THREE.Mesh || "Group" === t.type) { if ((t.name.startsWith("mansard") || t.name.startsWith("walk") || t.name.startsWith("window") || t.name.startsWith("garage")) && t.name.endsWith("-clone")) { if (i = parseFloat(t.position.x.toFixed(2)) + "," + parseFloat(t.position.y.toFixed(2)) + "," + parseFloat(t.position.z.toFixed(2)), n = parseFloat(t.rotation.x.toFixed(2)) + "," + parseFloat(t.rotation.y.toFixed(2)) + "," + parseFloat(t.rotation.z.toFixed(2)), e = parseFloat(t.userData.scale.x), a = parseFloat(t.userData.scale.y), o = parseFloat(t.userData.scale.z), r = parseFloat(e.toFixed(2)) + "," + parseFloat(a.toFixed(2)) + "," + parseFloat(o.toFixed(2)), t.scale.x < 0 && (c = -1), t.name.startsWith("window")) for (let e = 0; e < t.material.length; e++) "WindowGrid" === t.material[e].name && (d = t.material[e].visible), "Shutters" === t.material[e].name && (p = t.material[e].visible); m.name = t.name, m.position = i, m.rotation = n, m.scale = r, m.doorSwing = c, m.grid = d, m.shutters = p, y[E] = m, E++, c = r = n = i = !1 } if (t.name.startsWith("scale") && t.name.endsWith("-clone") && (i = parseFloat(t.position.x.toFixed(2)) + "," + parseFloat(t.position.y.toFixed(2)) + "," + parseFloat(t.position.z.toFixed(2)), n = parseFloat(t.rotation.x.toFixed(2)) + "," + parseFloat(t.rotation.y.toFixed(2)) + "," + parseFloat(t.rotation.z.toFixed(2)), u.name = t.name, u.position = i, u.rotation = n, f[P] = u, P++, n = i = !1), t.name.startsWith("interior") && t.name.endsWith("-clone") && (i = parseFloat(t.position.x.toFixed(2)) + "," + parseFloat(t.position.y.toFixed(2)) + "," + parseFloat(t.position.z.toFixed(2)), n = parseFloat(t.rotation.x.toFixed(2)) + "," + parseFloat(t.rotation.y.toFixed(2)) + "," + parseFloat(t.rotation.z.toFixed(2)), r = t.userData.hasOwnProperty("width") && t.userData.hasOwnProperty("height") ? parseFloat(t.userData.width.toFixed(2)) + "," + parseFloat(t.userData.height.toFixed(2)) + ",1" : t.userData.hasOwnProperty("doorSwing") && -1 == t.userData.doorSwing ? "-1,1,1" : "1,1,1", T.name = t.name, T.position = i, T.rotation = n, T.scale = r, t.userData.hasOwnProperty("doorSwing") && (T.doorSwing = c), t.userData.hasOwnProperty("material") && (T.material = t.userData.material), w[D] = T, D++, c = r = n = i = !1), t.name.startsWith("porch") && t.name.endsWith("-clone") && t.visible) { i = parseFloat(t.position.x.toFixed(2)) + "," + parseFloat(t.position.y.toFixed(2)) + "," + parseFloat(t.position.z.toFixed(2)), n = parseFloat(t.rotation.x.toFixed(2)) + "," + parseFloat(t.rotation.y.toFixed(2)) + "," + parseFloat(t.rotation.z.toFixed(2)), m = t.morphTargetInfluences[t.morphTargetDictionary.porchDepth] + 10, T = 12 * (u = t.morphTargetInfluences[t.morphTargetDictionary.slope]) / m + 3.5, c = t.morphTargetInfluences[t.morphTargetDictionary.ceilingHeight] + 10 + 4 / 12, o = a = e = 0, t.name.startsWith("porchWrap") ? (e = Math.round(100 * parseFloat(t.morphTargetInfluences[t.morphTargetDictionary.width])) / 100 + 10, a = Math.round(100 * parseFloat(t.morphTargetInfluences[t.morphTargetDictionary.height])) / 100 + 13.5 + u, o = Math.round(100 * parseFloat(t.morphTargetInfluences[t.morphTargetDictionary.depth])) / 100 + 10) : t.name.startsWith("porch") && (e = Math.round(100 * parseFloat(t.morphTargetInfluences[t.morphTargetDictionary.width])) / 100 + 10, a = Math.round(100 * parseFloat(t.morphTargetInfluences[t.morphTargetDictionary.height])) / 100 + 13.5 + u), r = parseFloat(e.toFixed(2)) + "," + parseFloat(a.toFixed(2)) + "," + parseFloat(o.toFixed(2)), u = 12 * t.morphTargetInfluences[t.morphTargetDictionary.Overhang], s = .5 < t.morphTargetInfluences[t.morphTargetDictionary.miters]; for (let e = 0; e < t.material.length; e++) "PorchPosts" === t.material[e].name && (l = t.material[e].color.getHex() != At.getHex() && t.material[e].color.getHex != Vt.getHex()), "PorchPostsMetal" === t.material[e].name && (h = t.material[e].visible); g.name = t.name, g.position = i, g.rotation = n, g.scale = r, g.porchDepth = m, g.porchPitch = T, g.ceilingHeight = c, g.porchOverhang = u, g.postMiter = s, g.postWrap = l, g.posts = h, b[v] = g, v++ } } }), M.aspect), d = W.getSize(new THREE.Vector2), p = (M.aspect = 800 / 450, W.setSize(800, 450, !1), M.updateProjectionMatrix(), W.render(ia, M, null, !1), Mt = W.domElement.toDataURL("image/jpeg", .4), M.aspect = c, W.setSize(d, !1), M.updateProjectionMatrix(), W.render(ia, M), ""), c = So(); let t, e = {}; if (null === localStorage.getItem("wwsb_utms") ? (e.utm_source = document.referrer, "" == e.utm_source && (e.utm_source = "direct"), e.utm_medium = !1, e.utm_campaign = !1, e.utm_term = !1, e.utm_content = !1, e.gclid = !1, e.msclkid = !1) : ("utm_source" in (e = JSON.parse(localStorage.getItem("wwsb_utms"))) || (e.utm_source = document.referrer), "utm_medium" in e || (e.utm_medium = !1), "utm_campaign" in e || (e.utm_campaign = !1), "utm_term" in e || (e.utm_term = !1), "utm_content" in e || (e.utm_content = !1), "gclid" in e || (e.gclid = !1), "msclkid" in e || (e.msclkid = !1)), "form-quote" === $(this).attr("name")) { if (t = { firstname: $("#request-quote input[name=firstname]").val(), lastname: $("#request-quote input[name=lastname]").val(), email: $("#request-quote input[name=email]").val(), phone: $("#request-quote input[name=phone]").val(), address: $("#request-quote input[name=address]").val(), city: $("#request-quote input[name=city]").val(), notes: $("#request-quote textarea[name=quoteNotes]").val(), action: $("#request-quote input[name=action]").val(), utm_source: e.utm_source, utm_medium: e.utm_medium, utm_campaign: e.utm_campaign, utm_term: e.utm_term, utm_content: e.utm_content, gclid: e.gclid, msclkid: e.msclkid }, $("#request-quote input[name=state]").length && (t.state = $("#request-quote input[name=state]").val()), $("#request-quote select[name=state]").length && (t.state = $("#request-quote select[name=state]").val()), $("#request-quote input[name=zip]").length && (t.zip = $("#request-quote input[name=zip]").val()), $("#request-quote input[name=province]").length && (t.province = $("#request-quote input[name=province]").val()), $("#request-quote input[name=postalCode]").length && (t.postalCode = $("#request-quote input[name=postalCode]").val()), $("#request-quote input[name=buildAddress]").length && (t.buildAddress = $("#request-quote input[name=buildAddress]").val()), $("#request-quote input[name=buildCity]").length && (t.buildCity = $("#request-quote input[name=buildCity]").val()), $("#request-quote input[name=buildState]").length && (t.buildState = $("#request-quote input[name=buildState]").val()), $("#request-quote input[name=buildZip]").length && (t.buildZip = $("#request-quote input[name=buildZip]").val()), $("#request-quote input[name=buildProvince]").length && (t.buildProvince = $("#request-quote input[name=buildProvince]").val()), $("#request-quote input[name=buildPostalCode]").length && (t.buildPostalCode = $("#request-quote input[name=buildPostalCode]").val()), $("#request-quote input[name=builder]").length && (t.builder = $("#request-quote input[name=builder]").val()), $("#request-quote input[name=use]").length && (t.use = $("#request-quote input[name=use]").val()), $("#request-quote input[name=type]").length && (t.type = $("#request-quote input[name=type]").val()), $("#request-quote input[name=county]").length && (t.county = $("#request-quote input[name=county]").val()), $("#request-quote input[name=squarefootage]").length && (t.squarefootage = $("#request-quote input[name=squarefootage]").val()), $("#request-quote input[name=schedule]").length && (t.schedule = $("#request-quote input[name=schedule]").val()), $("#request-quote input[name=site]").length && (t.site = $("#request-quote input[name=site]").val()), $("#request-quote input[name=market]").length && (t.market = $("#request-quote input[name=market]").val()), $("#request-quote select[name=pastcustomer]").length && (t.pastcustomer = $("#request-quote input[name=pastcustomer]").val()), $("#request-quote input[name=contact]").length) { let e = !1; 1 == $("#request-estimate input[name=contact]").prop("checked") && (e = "true"), t.contact = e } $("#request-quote input[name=customFormField1]").length && (t.customFormField1 = $("#request-quote input[name=customFormField1]").val()), $("#request-quote select[name=customFormField1]").length && (t.customFormField1 = $("#request-quote select[name=customFormField1]").val()), $("#request-quote input[name=customFormField2]").length && (t.customFormField2 = $("#request-quote input[name=customFormField2]").val()), $("#request-quote select[name=customFormField2]").length && (t.customFormField2 = $("#request-quote select[name=customFormField2]").val()), $("#request-quote input[name=customFormField3]").length && (t.customFormField3 = $("#request-quote input[name=customFormField3]").val()), $("#request-quote select[name=customFormField3]").length && (t.customFormField3 = $("#request-quote select[name=customFormField3]").val()), $("#request-quote input[name=customFormField4]").length && (t.customFormField4 = $("#request-quote input[name=customFormField4]").val()), $("#request-quote select[name=customFormField4]").length && (t.customFormField4 = $("#request-quote select[name=customFormField4]").val()), $("#request-quote input[name=customFormField5]").length && (t.customFormField5 = $("#request-quote input[name=customFormField5]").val()), $("#request-quote select[name=customFormField5]").length && (t.customFormField5 = $("#request-quote select[name=customFormField5]").val()), $("#request-quote input[name=customFormField6]").length && (t.customFormField6 = $("#request-quote input[name=customFormField6]").val()), $("#request-quote select[name=customFormField6]").length && (t.customFormField6 = $("#request-quote select[name=customFormField6]").val()), $("#request-quote input[name=customFormField7]").length && (t.customFormField7 = $("#request-quote input[name=customFormField7]").val()), $("#request-quote select[name=customFormField7]").length && (t.customFormField7 = $("#request-quote select[name=customFormField7]").val()), $("#request-quote input[name=customFormField8]").length && (t.customFormField8 = $("#request-quote input[name=customFormField8]").val()), $("#request-quote select[name=customFormField8]").length && (t.customFormField8 = $("#request-quote select[name=customFormField8]").val()), $("#request-quote input[name=customFormField9]").length && (t.customFormField9 = $("#request-quote input[name=customFormField9]").val()), $("#request-quote select[name=customFormField9]").length && (t.customFormField9 = $("#request-quote select[name=customFormField9]").val()), $("#request-quote input[name=customFormField10]").length && (t.customFormField10 = $("#request-quote input[name=customFormField10]").val()), $("#request-quote select[name=customFormField10]").length && (t.customFormField10 = $("#request-quote select[name=customFormField10]").val()), p = "Nice looking building you have there! We have received your quote request and one of our building representatives will be in touch soon." } else "form-share" === $(this).attr("name") ? (t = { shareEmail: $("#request-share input[name=shareEmail]").val(), firstname: $("#request-share input[name=firstname]").val(), lastname: $("#request-share input[name=lastname]").val(), email: $("#request-share input[name=email]").val(), notes: $("#request-share textarea[name=shareNotes]").val(), action: $("#request-share input[name=action]").val() }, p = "Check out that building!
A link to view your creation has been shared.") : "form-save" === $(this).attr("name") && (t = { email: $("#request-save input[name=saveEmail]").val(), notes: $("#request-save textarea[name=saveNotes]").val(), action: $("#request-save input[name=action]").val() }, p = "Nice creation!
A link to this building design has been emailed to you."); l.params = da, l.porches = b, l.doorsWindows = y, l.scaleItems = f, l.interiorItems = w, h.id = c, h.userData = t, h.buildingData = l, h.image = Mt; let a = JSON.stringify(h), i = m ? "?ref=" + m : ""; $.ajax({ type: "POST", url: "save.php" + i, data: a, dataType: "json", encode: !0 }).done(function(e) { if (console.log(e), !0 === e.success) $(".modal").modal("hide"), e.hasOwnProperty("redirectURL") ? window.location.href = e.redirectURL : e.hasOwnProperty("iframeURL") ? ($("#modal-success .modal-body").html(""), $("#modal-success").modal("show")) : ($("#modal-success .modal-body").html(p), $("#modal-success").modal("show"), o.prop("disabled", !1), s.attr("class", "status-icon fas fa-check"), setTimeout(function() { s.delay(5e3).hide(), r.delay(5e3).show() }, 5e3)); else { var t, a = ""; for (t of Object.keys(e.errors)) a += e.errors[t]; $("p.fail").html(a), $("p.fail").slideDown(500), $("p.fail").delay(5e3).slideUp(1750), o.prop("disabled", !1), s.attr("class", "status fas fa-exclamation"), s.attr("class", "status-icon fas fa-times"), setTimeout(function() { s.delay(5e3).hide(), r.delay(5e3).show() }, 5e3) } }).fail(function(e, t, a) { console.log(e); e = "There was a processing error, please try again. " + e.status; $("p.fail").html(e), $("p.fail").slideDown(500), $("p.fail").delay(5e3).slideUp(1750), o.prop("disabled", !1), s.attr("class", "status fas fa-exclamation"), s.attr("class", "status-icon fas fa-times"), setTimeout(function() { s.delay(5e3).hide(), r.delay(5e3).show() }, 5e3) }), n.preventDefault() } }) }), $("#popup #updateItemButton").click(function() { Wo(!0) }), $("#popup #wrap").change(function() { Wo() }), $("#popup input").change(function() { Wo(), Mo() }), $("#popup select").change(function() { Wo(), Mo() }), $("#doorSwingButton").click(function() { T.scale.x = -T.scale.x, 0 < T.scale.x ? T.userData.doorSwing = 1 : T.userData.doorSwing = -1, G = !0 }), $("#rotateLeftButton").click(function() { T.userData.rotationMultiplyer += parseFloat(THREE.Math.degToRad(45).toFixed(3)); var e = parseFloat(T.userData.rotationMultiplyer); c = new TWEEN.Tween(T.rotation).to(new THREE.Vector3(0, e, 0), 500).easing(TWEEN.Easing.Quartic.Out).onUpdate(e => { G = !0 }).start() }), $("#rotateRightButton").click(function() { T.userData.rotationMultiplyer -= parseFloat(THREE.Math.degToRad(45).toFixed(3)); var e = parseFloat(T.userData.rotationMultiplyer); c = new TWEEN.Tween(T.rotation).to(new THREE.Vector3(0, e, 0), 500).easing(TWEEN.Easing.Quartic.Out).onUpdate(e => { G = !0 }).start() }), $("#deleteItemButton").click(function() { if ("porc" === T.name.substring(0, 4)) T.visible = !1, da[T.name.replace("-clone", "")] = !1; else if ("scal" === T.name.substring(0, 4)) { if (T instanceof THREE.Group) { for (let e = 0; e < T.children.length; e++) co(T.children[e]); T.parent.remove(T) } else co(T); da[T.name.replace("-clone", "")]-- } else(T.name.startsWith("interior") ? (da[T.name.replace("-clone", "") + "Qty"]--, lo(T), T.parent) : (da[T.name.replace("-clone", "") + "Qty"]--, na)).remove(T); ve = T, T = null, $("#popup").hide(), $("#line").hide(), G = !0 }), $("#closePopupWindowButton").click(function() { xo() }), $("#helpButton").click(function() { Ro() }), $("#overlay, #help #closeButton").click(function() { Bo() }), THREE.Object3D.prototype.GdeepCloneMaterials = function() { for (var e = this.clone(new THREE.Object3D, !1), t = 0; t < this.children.length; t++) { var a = this.children[t]; a.GdeepCloneMaterials ? e.add(a.GdeepCloneMaterials()) : e.add(a.clone()) } return e }, THREE.Mesh.prototype.GdeepCloneMaterials = function(e, t) { if (void 0 === e) { var a; if (Array.isArray(this.material)) { var o = []; for (let e = 0; e < this.material.length; e++) o.push(this.material[e].clone()); a = o } else a = this.material.clone(); e = new THREE.Mesh(this.geometry, a) } return THREE.Object3D.prototype.GdeepCloneMaterials.call(this, e, t), e }, THREE.Object3D.prototype.deepClone = function(e) { e = this.clone(e = void 0 === e ? !0 : e); return e.traverse(function(a) { if (a.isMesh) { let t; if (0 < a.material.length) { t = []; for (let e = 0; e < a.material.length; e++) t[e] = a.material[e].clone(), a.material[e].map && void 0 !== a.material[e].map.image && (t[e].map = a.material[e].map.clone(), t[e].map.needsUpdate = !0), a.material[e].normalMap && void 0 !== a.material[e].normalMap.image && (t[e].normalMap = a.material[e].normalMap.clone(), t[e].normalMap.needsUpdate = !0) } else(t = a.material.clone()).map && void 0 !== a.material.map.image && (t.map = a.material.map.clone(), t.map.needsUpdate = !0), a.material.normalMap && void 0 !== a.material.normalMap.image && (t.normalMap = a.material.normalMap.clone(), t.normalMap.needsUpdate = !0); for (var e in a.material = t, this.userData) this.userData.hasOwnProperty(e) && (a.userData[e] = this.userData[e]) } }), e }, $(document).ready(function() { $("#alert_top .close").click(function() { $("#alert_top").slideUp("slow") }) }), $(document).ready(function() { $("#resetButton").click(function() { bootbox.confirm({ title: "Reset Building?", message: "Do you want to reset your building back to default settings? This cannot be undone.", buttons: { cancel: { label: ' Cancel' }, confirm: { label: ' Reset', className: "btn-danger" } }, callback: function(e) { e && location.reload() } }) }) }), $(document).ready(function() { var e; "" !== da.settings.disclaimerButtonText && "" !== da.settings.disclaimerButtonText && ((e = document.createElement("div")).setAttribute("id", "disclaimer"), e.textContent = da.settings.disclaimerButtonText, document.body.appendChild(e)), $("#disclaimer").click(function() { bootbox.alert({ message: da.settings.disclaimerText, centerVertical: !0, size: "small" }) }) }), $("#request-quote input[name=contact]").click(function() { $("#ready-for-quote-questions").toggle($(this).prop("checked")), $("#modal-quote .modal-body").animate({ scrollTop: $("#modal-quote .modal-body")[0].scrollHeight }, 1e3) }), da.hasOwnProperty("mapEnabled") && $("#mapButton").click(function() { ti() }), $(document).ready(function() { $("#printButton").click(function() { go() }), $("#shareButton").click(function() { $("#modal-share").modal("show") }), $("#saveButton").click(function() { $("#modal-save").modal("show") }), $("#quoteButton").click(function() { $("#modal-quote").modal("show") }), $("#zoomIn").click(function() { var e = P.minDistance, t = P.target, a = ii(M.position, t, .13); t.distanceTo(a) > e && M.position.set(a.x, a.y, a.z), event.preventDefault(), G = !0 }), $("#zoomOut").click(function() { var e = P.maxDistance, t = P.target, a = ii(M.position, t, -.15); t.distanceTo(a) < e && M.position.set(a.x, a.y, a.z), event.preventDefault(), G = !0 }), $("#addPerson").click(function() { s("person"), event.preventDefault() }), $("#addTruck").click(function() { s("truck"), event.preventDefault() }), $("#addAirplane").click(function() { s("airplane"), event.preventDefault() }), $("#addDriveway").click(function() { s("driveway"), event.preventDefault() }), $("#navReset").click(function() { bo(!0, 1e3, { x: 1.25 * da.width, y: da.height + 0, z: 1.25 * da.depth }, { x: 0, y: da.height / 2, z: 0 }), $("#navInOut").text("Look Inside") }), $("#navInOut").click(function() { "Look Inside" === $("#navInOut").text() ? (P.target.set(0, da.height / 2, 0), M.position.set(0, 5, 5), $("#navInOut").text("Go Outside")) : (P.target.set(0, da.height / 2, 0), M.position.set(1.25 * da.width, da.height + 0, 1.25 * da.depth), $("#navInOut").text("Look Inside")) }), $("#navStartOver").click(function() { 1 == confirm("Are you sure you want to erase your building and start over?") && (window.location = window.location.pathname) }), $("#navHideWalls").click(function() { wo() }) }), $(document).ready(function() { $("#toggleDimensions").click(function(e) { e.preventDefault(), di(ye = !ye) }) });