{
"version": 3,
"sources": ["../source/website/index.js", "../source/engine/io/externallibs.js", "../source/engine/geometry/geometry.js", "../source/engine/geometry/coord2d.js", "../source/engine/viewer/domutils.js", "../source/engine/model/color.js", "../source/engine/io/bufferutils.js", "../source/website/splitter.js", "../source/website/utils.js", "../source/website/eventhandler.js", "../source/engine/geometry/coord3d.js", "../source/engine/viewer/camera.js", "../source/engine/parameters/parameterlist.js", "../source/engine/io/fileutils.js", "../source/engine/core/taskrunner.js", "../source/engine/import/filelist.js", "../source/engine/geometry/quaternion.js", "../source/engine/geometry/coord4d.js", "../source/engine/geometry/matrix.js", "../source/engine/geometry/transformation.js", "../source/engine/model/material.js", "../source/engine/model/meshutils.js", "../source/engine/geometry/box3d.js", "../source/engine/geometry/octree.js", "../source/engine/model/topology.js", "../source/engine/model/modelutils.js", "../source/engine/model/property.js", "../source/engine/model/object.js", "../source/engine/model/mesh.js", "../source/engine/model/triangle.js", "../source/engine/threejs/threeutils.js", "../source/engine/model/meshinstance.js", "../source/engine/model/node.js", "../source/engine/model/model.js", "../source/engine/core/core.js", "../source/engine/model/modelfinalization.js", "../source/engine/import/importerbase.js", "../source/engine/import/importerutils.js", "../source/engine/import/importer3dm.js", "../source/engine/io/binaryreader.js", "../source/engine/import/importer3ds.js", "../source/engine/import/importergltf.js", "../source/engine/import/importerifc.js", "../source/engine/model/generator.js", "../source/engine/import/importero3dv.js", "../source/engine/import/importerobj.js", "../source/engine/import/importeroff.js", "../source/engine/import/importerply.js", "../source/engine/import/importerstp.js", "../source/engine/import/importerstl.js", "../source/engine/import/importerbim.js", "../source/engine/import/importerthree.js", "../source/engine/import/importer.js", "../source/engine/geometry/tween.js", "../source/engine/viewer/navigation.js", "../source/engine/viewer/viewergeometry.js", "../source/engine/viewer/viewer.js", "../source/website/hashhandler.js", "../source/engine/threejs/threeconverter.js", "../source/engine/threejs/threemodelloader.js", "../source/website/dialog.js", "../source/website/dialogs.js", "../source/website/threemodelloaderui.js", "../source/website/embed.js", "../source/website/panelset.js", "../source/website/treeview.js", "../source/website/navigatorpanel.js", "../source/website/navigatorfilespanel.js", "../source/website/navigatoritems.js", "../source/website/navigatormaterialspanel.js", "../source/website/navigatormeshespanel.js", "../source/website/navigator.js", "../source/website/cookiehandler.js", "../source/website/settings.js", "../source/engine/model/quantities.js", "../source/website/sidebarpanel.js", "../source/website/sidebardetailspanel.js", "../source/website/featureset.js", "../source/website/sidebarsettingspanel.js", "../source/website/sidebar.js", "../source/website/themehandler.js", "../source/website/toolbar.js", "../source/engine/model/meshbuffer.js", "../source/engine/export/exporterbase.js", "../source/engine/export/exporter3dm.js", "../source/engine/io/binarywriter.js", "../source/engine/export/exportergltf.js", "../source/engine/export/exportermodel.js", "../source/engine/io/textwriter.js", "../source/engine/export/exporterobj.js", "../source/engine/export/exporteroff.js", "../source/engine/export/exporterply.js", "../source/engine/export/exporterstl.js", "../source/engine/export/exporter.js", "../source/website/exportdialog.js", "../source/website/snapshotdialog.js", "../source/website/openurldialog.js", "../source/website/sharingdialog.js", "../source/website/measuretool.js", "../source/website/website.js"],
"sourcesContent": ["import { SetExternalLibLocation } from '../engine/io/externallibs.js';\nimport { CreateDomElement } from '../engine/viewer/domutils.js';\nimport { AddSvgIconElement, InstallTooltip } from './utils.js';\nimport { SetEventHandler } from './eventhandler.js';\nimport { Embed } from './embed.js';\nimport { Website } from './website.js';\n\nexport function SetWebsiteEventHandler (eventHandler)\n{\n SetEventHandler (eventHandler);\n}\n\nexport function StartWebsite (externalLibLocation)\n{\n SetExternalLibLocation (externalLibLocation);\n window.addEventListener ('load', () => {\n let website = new Website ({\n headerDiv : document.getElementById ('header'),\n toolbarDiv : document.getElementById ('toolbar'),\n mainDiv : document.getElementById ('main'),\n introDiv : document.getElementById ('intro'),\n fileNameDiv : document.getElementById ('main_file_name'),\n navigatorDiv : document.getElementById ('main_navigator'),\n navigatorSplitterDiv : document.getElementById ('main_navigator_splitter'),\n sidebarDiv : document.getElementById ('main_sidebar'),\n sidebarSplitterDiv : document.getElementById ('main_sidebar_splitter'),\n viewerDiv : document.getElementById ('main_viewer'),\n fileInput : document.getElementById ('open_file')\n });\n website.Load ();\n });\n}\n\nexport function StartEmbed (externalLibLocation)\n{\n SetExternalLibLocation (externalLibLocation);\n window.addEventListener ('load', () => {\n let embed = new Embed ({\n viewerDiv : document.getElementById ('embed_viewer'),\n websiteLinkDiv : document.getElementById ('website_link')\n });\n embed.Load ();\n });\n}\n\nexport function CreateHeaderButton (parentElement, iconName, title, link)\n{\n let buttonLink = CreateDomElement ('a');\n buttonLink.setAttribute ('href', link);\n buttonLink.setAttribute ('target', '_blank');\n buttonLink.setAttribute ('rel', 'noopener noreferrer');\n InstallTooltip (buttonLink, title);\n AddSvgIconElement (buttonLink, iconName, 'header_button');\n parentElement.appendChild (buttonLink);\n return buttonLink;\n}\n", "let externalLibLocation = null;\nlet loadedExternalLibs = new Set ();\n\nexport function SetExternalLibLocation (newExternalLibLocation)\n{\n externalLibLocation = newExternalLibLocation;\n}\n\nexport function GetExternalLibPath (libName)\n{\n if (externalLibLocation === null) {\n return null;\n }\n return externalLibLocation + '/' + libName;\n}\n\nexport function LoadExternalLibrary (libName)\n{\n return new Promise ((resolve, reject) => {\n if (externalLibLocation === null) {\n reject ();\n return;\n }\n\n if (loadedExternalLibs.has (libName)) {\n resolve ();\n return;\n }\n\n let scriptElement = document.createElement ('script');\n scriptElement.type = 'text/javascript';\n scriptElement.src = GetExternalLibPath (libName);\n scriptElement.onload = () => {\n loadedExternalLibs.add (libName);\n resolve ();\n };\n scriptElement.onerror = () => {\n reject ();\n };\n document.head.appendChild (scriptElement);\n });\n}\n", "export const Eps = 0.00000001;\nexport const BigEps = 0.0001;\nexport const RadDeg = 57.29577951308232;\nexport const DegRad = 0.017453292519943;\n\nexport function IsZero (a)\n{\n\treturn Math.abs (a) < Eps;\n}\n\nexport function IsLower (a, b)\n{\n\treturn b - a > Eps;\n}\n\nexport function IsGreater (a, b)\n{\n\treturn a - b > Eps;\n}\n\nexport function IsLowerOrEqual (a, b)\n{\n\treturn b - a > -Eps;\n}\n\nexport function IsGreaterOrEqual (a, b)\n{\n\treturn a - b > -Eps;\n}\n\nexport function IsEqual (a, b)\n{\n\treturn Math.abs (b - a) < Eps;\n}\n\nexport function IsEqualEps (a, b, eps)\n{\n\treturn Math.abs (b - a) < eps;\n}\n\nexport function IsPositive (a)\n{\n\treturn a > Eps;\n}\n\nexport function IsNegative (a)\n{\n\treturn a < -Eps;\n}\n\nexport const Direction =\n{\n\tX : 1,\n\tY : 2,\n\tZ : 3\n};\n", "import { IsEqual } from './geometry.js';\n\nexport class Coord2D\n{\n\tconstructor (x, y)\n\t{\n\t\tthis.x = x;\n\t\tthis.y = y;\n\t}\n\n\tClone ()\n\t{\n\t\treturn new Coord2D (this.x, this.y);\n\t}\n}\n\nexport function CoordIsEqual2D (a, b)\n{\n\treturn IsEqual (a.x, b.x) && IsEqual (a.y, b.y);\n}\n\nexport function AddCoord2D (a, b)\n{\n\treturn new Coord2D (a.x + b.x, a.y + b.y);\n}\n\nexport function SubCoord2D (a, b)\n{\n\treturn new Coord2D (a.x - b.x, a.y - b.y);\n}\n\nexport function CoordDistance2D (a, b)\n{\n\treturn Math.sqrt ((a.x - b.x) * (a.x - b.x) + (a.y - b.y) * (a.y - b.y));\n}\n", "import { Coord2D } from '../geometry/coord2d.js';\n\nexport function GetIntegerFromStyle (parameter)\n{\n return Math.round (parseFloat (parameter));\n}\n\nexport function GetDomElementExternalWidth (style)\n{\n let padding = GetIntegerFromStyle (style.paddingLeft) + GetIntegerFromStyle (style.paddingRight);\n let border = GetIntegerFromStyle (style.borderLeftWidth) + GetIntegerFromStyle (style.borderRightWidth);\n let margin = GetIntegerFromStyle (style.marginLeft) + GetIntegerFromStyle (style.marginRight);\n return padding + border + margin;\n}\n\nexport function GetDomElementExternalHeight (style)\n{\n let padding = GetIntegerFromStyle (style.paddingTop) + GetIntegerFromStyle (style.paddingBottom);\n let border = GetIntegerFromStyle (style.borderTopWidth) + GetIntegerFromStyle (style.borderBottomWidth);\n let margin = GetIntegerFromStyle (style.marginTop) + GetIntegerFromStyle (style.marginBottom);\n return padding + border + margin;\n}\n\nexport function GetDomElementInnerDimensions (element, outerWidth, outerHeight)\n{\n let style = getComputedStyle (element);\n let width = outerWidth - GetDomElementExternalWidth (style);\n let height = outerHeight - GetDomElementExternalHeight (style);\n return {\n width : width,\n height : height\n };\n}\n\nexport function GetDomElementClientCoordinates (element, clientX, clientY)\n{\n if (element.getBoundingClientRect) {\n let clientRect = element.getBoundingClientRect ();\n clientX -= clientRect.left;\n clientY -= clientRect.top;\n }\n if (window.pageXOffset && window.pageYOffset) {\n clientX += window.pageXOffset;\n clientY += window.pageYOffset;\n }\n return (new Coord2D (clientX, clientY));\n}\n\nexport function CreateDomElement (elementType, className, innerHTML)\n{\n let element = document.createElement (elementType);\n if (className) {\n element.className = className;\n }\n if (innerHTML) {\n element.innerHTML = innerHTML;\n }\n return element;\n}\n\nexport function AddDomElement (parentElement, elementType, className, innerHTML)\n{\n let element = CreateDomElement (elementType, className, innerHTML);\n parentElement.appendChild (element);\n return element;\n}\n\nexport function AddDiv (parentElement, className, innerHTML)\n{\n return AddDomElement (parentElement, 'div', className, innerHTML);\n}\n\nexport function ClearDomElement (element)\n{\n while (element.firstChild) {\n element.removeChild (element.firstChild);\n }\n}\n\nexport function InsertDomElementBefore (newElement, existingElement)\n{\n existingElement.parentNode.insertBefore (newElement, existingElement);\n}\n\nexport function InsertDomElementAfter (newElement, existingElement)\n{\n existingElement.parentNode.insertBefore (newElement, existingElement.nextSibling);\n}\n\nexport function ShowDomElement (element, show)\n{\n if (show) {\n element.style.display = 'block';\n } else {\n element.style.display = 'none';\n }\n}\n\nexport function IsDomElementVisible (element)\n{\n return element.offsetParent !== null;\n}\n\nexport function SetDomElementWidth (element, width)\n{\n element.style.width = width.toString () + 'px';\n}\n\nexport function SetDomElementHeight (element, height)\n{\n element.style.height = height.toString () + 'px';\n}\n\nexport function GetDomElementOuterWidth (element)\n{\n let style = getComputedStyle (element);\n return element.offsetWidth + GetIntegerFromStyle (style.marginLeft) + GetIntegerFromStyle (style.marginRight);\n}\n\nexport function GetDomElementOuterHeight (element)\n{\n let style = getComputedStyle (element);\n return element.offsetHeight + GetIntegerFromStyle (style.marginTop) + GetIntegerFromStyle (style.marginBottom);\n}\n\nexport function SetDomElementOuterWidth (element, width)\n{\n let style = getComputedStyle (element);\n SetDomElementWidth (element, width - GetDomElementExternalWidth (style));\n}\n\nexport function SetDomElementOuterHeight (element, height)\n{\n let style = getComputedStyle (element);\n SetDomElementHeight (element, height - GetDomElementExternalHeight (style));\n}\n\nexport function CreateDiv (className, innerHTML)\n{\n return CreateDomElement ('div', className, innerHTML);\n}\n", "export class Color\n{\n constructor (r, g, b)\n {\n this.r = r; // 0 .. 255\n this.g = g; // 0 .. 255\n this.b = b; // 0 .. 255\n }\n\n Set (r, g, b)\n {\n this.r = r;\n this.g = g;\n this.b = b;\n }\n\n Clone ()\n {\n return new Color (this.r, this.g, this.b);\n }\n}\n\nexport function ColorComponentFromFloat (component)\n{\n return parseInt (Math.round (component * 255.0), 10);\n}\n\nexport function ColorFromFloatComponents (r, g, b)\n{\n return new Color (\n ColorComponentFromFloat (r),\n ColorComponentFromFloat (g),\n ColorComponentFromFloat (b)\n );\n}\n\nexport function SRGBToLinear (component)\n{\n if (component < 0.04045) {\n return component * 0.0773993808;\n } else {\n return Math.pow (component * 0.9478672986 + 0.0521327014, 2.4);\n }\n}\n\nexport function LinearToSRGB (component)\n{\n if (component < 0.0031308) {\n return component * 12.92;\n } else {\n return 1.055 * (Math.pow (component, 0.41666)) - 0.055;\n }\n}\n\nexport function IntegerToHexString (intVal)\n{\n let result = parseInt (intVal, 10).toString (16);\n while (result.length < 2) {\n result = '0' + result;\n }\n return result;\n}\n\nexport function ColorToHexString (color)\n{\n let r = IntegerToHexString (color.r);\n let g = IntegerToHexString (color.g);\n let b = IntegerToHexString (color.b);\n return r + g + b;\n}\n\nexport function HexStringToColor (hexString)\n{\n if (hexString.length !== 6) {\n return null;\n }\n\n let r = parseInt (hexString.substring (0, 2), 16);\n let g = parseInt (hexString.substring (2, 4), 16);\n let b = parseInt (hexString.substring (4, 6), 16);\n return new Color (r, g, b);\n}\n\nexport function ArrayToColor (arr)\n{\n\treturn new Color (arr[0], arr[1], arr[2]);\n}\n\nexport function ColorIsEqual (a, b)\n{\n\treturn a.r === b.r && a.g === b.g && a.b === b.b;\n}\n", "export function ArrayBufferToUtf8String (buffer)\n{\n\tlet decoder = new TextDecoder ('utf-8');\n\treturn decoder.decode (buffer);\n}\n\nexport function ArrayBufferToAsciiString (buffer)\n{\n\tlet text = '';\n\tlet bufferView = new Uint8Array (buffer);\n\tfor (let i = 0; i < bufferView.byteLength; i++) {\n\t\ttext += String.fromCharCode (bufferView[i]);\n\t}\n\treturn text;\n}\n\nexport function AsciiStringToArrayBuffer (str)\n{\n\tlet buffer = new ArrayBuffer (str.length);\n\tlet bufferView = new Uint8Array (buffer);\n\tfor (let i = 0; i < str.length; i++) {\n\t\tbufferView[i] = str.charCodeAt (i);\n\t}\n\treturn buffer;\n}\n\nexport function Utf8StringToArrayBuffer (str)\n{\n\tlet encoder = new TextEncoder ();\n\tlet uint8Array = encoder.encode (str);\n\treturn uint8Array.buffer;\n}\n\nexport function Base64DataURIToArrayBuffer (uri)\n{\n\tlet dataPrefix = 'data:';\n\tif (!uri.startsWith (dataPrefix)) {\n\t\treturn null;\n\t}\n\n\tlet mimeSeparator = uri.indexOf (';');\n\tif (mimeSeparator === -1) {\n\t\treturn null;\n\t}\n\n\tlet bufferSeparator = uri.indexOf (',');\n\tif (bufferSeparator === -1) {\n\t\treturn null;\n\t}\n\n\tlet mimeType = uri.substring (dataPrefix.length, dataPrefix.length + mimeSeparator - 5);\n\tlet base64String = atob (uri.substring (bufferSeparator + 1));\n\tlet buffer = new ArrayBuffer (base64String.length);\n\tlet bufferView = new Uint8Array (buffer);\n\tfor (let i = 0; i < base64String.length; i++) {\n\t\tbufferView[i] = base64String.charCodeAt (i);\n\t}\n\n\treturn {\n\t\tmimeType : mimeType,\n\t\tbuffer : buffer\n\t};\n}\n\nexport function GetFileExtensionFromMimeType (mimeType)\n{\n\tif (mimeType === undefined || mimeType === null) {\n\t\treturn '';\n\t}\n\tlet mimeParts = mimeType.split ('/');\n\tif (mimeParts.length === 0) {\n\t\treturn '';\n\t}\n\treturn mimeParts[mimeParts.length - 1];\n}\n\nexport function CreateObjectUrl (content)\n{\n\tlet blob = new Blob ([content]);\n\tlet url = URL.createObjectURL (blob);\n\treturn url;\n}\n\nexport function CreateObjectUrlWithMimeType (content, mimeType)\n{\n\tlet blob = new Blob ([content], { type : mimeType });\n\tlet url = URL.createObjectURL (blob);\n\treturn url;\n}\n\nexport function RevokeObjectUrl (url)\n{\n\tURL.revokeObjectURL (url);\n}\n", "export function CreateVerticalSplitter (splitterDiv, callbacks)\n{\n let originalPosition = null;\n\n let mouseMoveHandler = (ev) => {\n ev.preventDefault ();\n const diff = ev.clientX - originalPosition;\n callbacks.onSplit (diff);\n };\n\n let mouseUpHandler = () => {\n document.removeEventListener ('mousemove', mouseMoveHandler);\n document.removeEventListener ('mouseup', mouseUpHandler);\n document.removeEventListener ('mouseleave', mouseUpHandler);\n originalPosition = null;\n };\n\n splitterDiv.addEventListener ('mousedown', (ev) => {\n originalPosition = ev.clientX;\n callbacks.onSplitStart ();\n\n document.addEventListener ('mousemove', mouseMoveHandler);\n document.addEventListener ('mouseup', mouseUpHandler);\n document.addEventListener ('mouseleave', mouseUpHandler);\n });\n}\n", "import { Color, ColorToHexString } from '../engine/model/color.js';\nimport { CreateObjectUrl } from '../engine/io/bufferutils.js';\nimport { AddDiv, CreateDiv, AddDomElement, GetDomElementOuterWidth, SetDomElementOuterWidth } from '../engine/viewer/domutils.js';\nimport { CreateVerticalSplitter } from './splitter.js';\n\nexport function GetNameOrDefault (originalName, defaultName)\n{\n if (originalName.length > 0) {\n return originalName;\n }\n return defaultName;\n}\n\nexport function GetNodeName (originalName)\n{\n return GetNameOrDefault (originalName, 'No Name');\n}\n\nexport function GetMeshName (originalName)\n{\n return GetNameOrDefault (originalName, 'No Name');\n}\n\nexport function GetMaterialName (originalName)\n{\n return GetNameOrDefault (originalName, 'No Name');\n}\n\nexport function IsHoverEnabled ()\n{\n return window.matchMedia ('(hover: hover)').matches;\n}\n\nexport function AddSmallWidthChangeEventListener (onChange)\n{\n let mediaQuery = window.matchMedia ('(max-width: 800px)');\n mediaQuery.addEventListener ('change', onChange);\n}\n\nexport function IsSmallWidth ()\n{\n return window.matchMedia ('(max-width: 800px)').matches;\n}\n\nexport function IsSmallHeight ()\n{\n return window.matchMedia ('(max-height: 800px)').matches;\n}\n\nexport function InstallTooltip (element, text)\n{\n function CalculateOffset (element, tooltip)\n {\n let windowWidth = window.innerWidth;\n\n let elementOffset = element.getBoundingClientRect ();\n let elementWidth = element.offsetWidth;\n let elementHeight = element.offsetHeight;\n let tooltipWidth = tooltip.offsetWidth;\n\n let tooltipMargin = 10;\n let left = elementOffset.left + elementWidth / 2 - tooltipWidth / 2;\n if (left + tooltipWidth > windowWidth - tooltipMargin) {\n left = windowWidth - tooltipWidth - tooltipMargin;\n }\n if (left < tooltipMargin) {\n left = tooltipMargin;\n }\n left = Math.max (left, 0);\n return {\n left : left,\n top : elementOffset.top + elementHeight + tooltipMargin\n };\n }\n\n if (!IsHoverEnabled ()) {\n return;\n }\n\n let tooltip = null;\n element.addEventListener ('mouseover', () => {\n tooltip = AddDiv (document.body, 'ov_tooltip', text);\n let offset = CalculateOffset (element, tooltip);\n tooltip.style.left = offset.left + 'px';\n tooltip.style.top = offset.top + 'px';\n });\n element.addEventListener ('mouseout', () => {\n tooltip.remove ();\n });\n}\n\nexport function CopyToClipboard (text)\n{\n let input = document.createElement ('input');\n input.style.position = 'absolute';\n input.style.left = '0';\n input.style.top = '0';\n input.setAttribute ('value', text);\n document.body.appendChild (input);\n input.select ();\n document.execCommand ('copy');\n document.body.removeChild (input);\n}\n\nexport function DownloadUrlAsFile (url, fileName)\n{\n let link = document.createElement ('a');\n link.href = url;\n link.download = fileName;\n document.body.appendChild (link);\n link.click ();\n document.body.removeChild (link);\n}\n\nexport function DownloadArrayBufferAsFile (arrayBuffer, fileName)\n{\n let url = CreateObjectUrl (arrayBuffer);\n DownloadUrlAsFile (url, fileName);\n}\n\nexport function CreateSvgIconElement (iconName, className)\n{\n let iconDiv = CreateDiv ('ov_svg_icon');\n if (className) {\n iconDiv.classList.add (className);\n }\n AddDomElement (iconDiv, 'i', 'icon icon-' + iconName);\n return iconDiv;\n}\n\nexport function AddSvgIconElement (parentElement, iconName, className)\n{\n let iconDiv = CreateSvgIconElement (iconName, className);\n parentElement.appendChild (iconDiv);\n return iconDiv;\n}\n\nexport function SetSvgIconImageElement (iconElement, iconName)\n{\n let iconDiv = iconElement.firstChild;\n iconDiv.className = 'icon icon-' + iconName;\n}\n\nexport function CreateInlineColorCircle (color)\n{\n let hexString = '#' + ColorToHexString (color);\n let darkerColor = new Color (\n Math.max (0, color.r - 50),\n Math.max (0, color.g - 50),\n Math.max (0, color.b - 50)\n );\n let darkerColorHexString = '#' + ColorToHexString (darkerColor);\n let circleDiv = CreateDiv ('ov_color_circle');\n circleDiv.style.background = hexString;\n circleDiv.style.border = '1px solid ' + darkerColorHexString;\n return circleDiv;\n}\n\nexport function IsDarkTextNeededForColor (color)\n{\n let intensity = color.r * 0.299 + color.g * 0.587 + color.b * 0.114;\n return intensity > 186.0;\n}\n\nexport function InstallVerticalSplitter (splitterDiv, resizedDiv, flipped, onResize)\n{\n let originalWidth = null;\n CreateVerticalSplitter (splitterDiv, {\n onSplitStart : () => {\n originalWidth = GetDomElementOuterWidth (resizedDiv);\n },\n onSplit : (xDiff) => {\n const minWidth = 280;\n const maxWidth = 450;\n let newWidth = 0;\n if (flipped) {\n newWidth = originalWidth - xDiff;\n } else {\n newWidth = originalWidth + xDiff;\n }\n if (newWidth < minWidth) {\n newWidth = minWidth;\n } else if (newWidth > maxWidth) {\n newWidth = maxWidth;\n }\n SetDomElementOuterWidth (resizedDiv, newWidth);\n onResize ();\n }\n });\n}\n\nexport function GetFilesFromDataTransfer (dataTransfer, onReady)\n{\n async function GetFileEntriesFromDirectory (dirEntry, fileEntries)\n {\n let reader = dirEntry.createReader ();\n return new Promise ((resolve, reject) => {\n reader.readEntries (\n async (dirEntries) => {\n for (let entry of dirEntries) {\n if (entry.isFile) {\n fileEntries.push (entry);\n } else if (entry.isDirectory) {\n await GetFileEntriesFromDirectory (entry, fileEntries);\n }\n }\n resolve ();\n },\n (error) => {\n reject (error);\n }\n );\n });\n }\n\n async function GetFileObjectsFromEntries (entries, onReady)\n {\n let fileEntries = [];\n for (let entry of entries) {\n if (entry.isFile) {\n fileEntries.push (entry);\n } else if (entry.isDirectory) {\n await GetFileEntriesFromDirectory (entry, fileEntries);\n }\n }\n\n let fileObjects = await Promise.all (fileEntries.map ((fileEntry) => {\n return new Promise ((resolve, reject) => {\n fileEntry.file (\n (file) => {\n resolve (file);\n },\n (error) => {\n reject (error);\n }\n );\n });\n }));\n\n onReady (fileObjects);\n }\n\n let getAsEntryFunc = null;\n if (DataTransferItem) {\n if (DataTransferItem.prototype.getAsEntry) {\n getAsEntryFunc = DataTransferItem.prototype.getAsEntry;\n } else if (DataTransferItem.prototype.webkitGetAsEntry) {\n getAsEntryFunc = DataTransferItem.prototype.webkitGetAsEntry;\n }\n }\n\n if (getAsEntryFunc !== null) {\n let entries = [];\n for (let item of dataTransfer.items) {\n let entry = getAsEntryFunc.call (item);\n if (entry !== null) {\n entries.push (entry);\n }\n }\n GetFileObjectsFromEntries (entries, (allEntries) => {\n onReady (allEntries);\n });\n } else {\n onReady (dataTransfer.files);\n }\n}\n\nexport function AddCheckbox (parentElement, id, text, isChecked, onChange)\n{\n let label = AddDomElement (parentElement, 'label');\n label.setAttribute ('for', id);\n let check = AddDomElement (label, 'input', 'ov_checkbox');\n check.setAttribute ('type', 'checkbox');\n check.setAttribute ('id', id);\n check.checked = isChecked;\n AddDomElement (label, 'span', null, text);\n if (onChange) {\n check.addEventListener ('change', onChange);\n }\n return check;\n}\n\nexport function AddRadioButton (parentElement, id, name, text, isChecked, onChange)\n{\n let label = AddDomElement (parentElement, 'label');\n label.setAttribute ('for', id);\n let radio = AddDomElement (label, 'input', 'ov_radio_button');\n radio.setAttribute ('type', 'radio');\n radio.setAttribute ('id', id);\n radio.setAttribute ('name', name);\n radio.checked = isChecked;\n AddDomElement (label, 'span', null, text);\n if (onChange) {\n radio.addEventListener ('change', onChange);\n }\n return radio;\n}\n\nexport function AddRangeSlider (parentElement, min, max)\n{\n let slider = AddDomElement (parentElement, 'input', 'ov_slider');\n slider.setAttribute ('type', 'range');\n slider.setAttribute ('min', min.toString ());\n slider.setAttribute ('max', max.toString ());\n return slider;\n}\n\nexport function AddSelect (parentElement, options, selectedIndex, onChange)\n{\n let container = AddDiv (parentElement, 'ov_select_container');\n let select = AddDomElement (container, 'select', 'ov_select');\n for (let option of options) {\n AddDomElement (select, 'option', null, option);\n }\n select.selectedIndex = selectedIndex;\n if (onChange) {\n select.addEventListener ('change', () => {\n onChange (select.selectedIndex);\n });\n }\n return select;\n}\n\nexport function AddToggle (parentElement, className)\n{\n function UpdateStatus (toggle, status)\n {\n if (status) {\n toggle.classList.add ('on');\n } else {\n toggle.classList.remove ('on');\n }\n }\n\n let status = false;\n let onChange = null;\n\n let toggleClassName = 'ov_toggle';\n if (className) {\n toggleClassName += ' ' + className;\n }\n let toggle = AddDiv (parentElement, toggleClassName);\n AddDiv (toggle, 'ov_toggle_slider');\n\n toggle.addEventListener ('click', () => {\n status = !status;\n UpdateStatus (toggle, status);\n if (onChange) {\n onChange ();\n }\n });\n\n return {\n element : toggle,\n GetStatus : () => {\n return status;\n },\n SetStatus : (newStatus) => {\n status = newStatus;\n UpdateStatus (toggle, status);\n },\n OnChange : (onChangeHandler) => {\n onChange = onChangeHandler;\n }\n };\n}\n", "let eventHandlerFunc = null;\n\nexport function SetEventHandler (eventHandler)\n{\n eventHandlerFunc = eventHandler;\n}\n\nexport function HandleEvent (eventName, eventLabel, eventParams)\n{\n if (eventHandlerFunc === undefined || eventHandlerFunc === null) {\n return;\n }\n eventHandlerFunc (eventName, eventLabel, eventParams);\n}\n", "import { IsEqual } from './geometry.js';\n\nexport class Coord3D\n{\n\tconstructor (x, y, z)\n\t{\n\t\tthis.x = x;\n\t\tthis.y = y;\n\t\tthis.z = z;\n\t}\n\n\tLength ()\n\t{\n\t\treturn Math.sqrt (this.x * this.x + this.y * this.y + this.z * this.z);\n\t}\n\n\tMultiplyScalar (scalar)\n\t{\n\t\tthis.x *= scalar;\n\t\tthis.y *= scalar;\n\t\tthis.z *= scalar;\n\t\treturn this;\n\t}\n\n\tNormalize ()\n\t{\n\t\tlet length = this.Length ();\n\t\tif (length > 0.0) {\n\t\t\tthis.MultiplyScalar (1.0 / length);\n\t\t}\n\t\treturn this;\n\t}\n\n\tOffset (direction, distance)\n\t{\n\t\tlet normal = direction.Clone ().Normalize ();\n\t\tthis.x += normal.x * distance;\n\t\tthis.y += normal.y * distance;\n\t\tthis.z += normal.z * distance;\n\t\treturn this;\n\t}\n\n\tRotate (axis, angle, origo)\n\t{\n\t\tlet normal = axis.Clone ().Normalize ();\n\n\t\tlet u = normal.x;\n\t\tlet v = normal.y;\n\t\tlet w = normal.z;\n\n\t\tlet x = this.x - origo.x;\n\t\tlet y = this.y - origo.y;\n\t\tlet z = this.z - origo.z;\n\n\t\tlet si = Math.sin (angle);\n\t\tlet co = Math.cos (angle);\n\t\tthis.x = - u * (- u * x - v * y - w * z) * (1.0 - co) + x * co + (- w * y + v * z) * si;\n\t\tthis.y = - v * (- u * x - v * y - w * z) * (1.0 - co) + y * co + (w * x - u * z) * si;\n\t\tthis.z = - w * (- u * x - v * y - w * z) * (1.0 - co) + z * co + (- v * x + u * y) * si;\n\n\t\tthis.x += origo.x;\n\t\tthis.y += origo.y;\n\t\tthis.z += origo.z;\n\t\treturn this;\n\t}\n\n\tClone ()\n\t{\n\t\treturn new Coord3D (this.x, this.y, this.z);\n\t}\n}\n\nexport function CoordIsEqual3D (a, b)\n{\n\treturn IsEqual (a.x, b.x) && IsEqual (a.y, b.y) && IsEqual (a.z, b.z);\n}\n\nexport function AddCoord3D (a, b)\n{\n\treturn new Coord3D (a.x + b.x, a.y + b.y, a.z + b.z);\n}\n\nexport function SubCoord3D (a, b)\n{\n\treturn new Coord3D (a.x - b.x, a.y - b.y, a.z - b.z);\n}\n\nexport function CoordDistance3D (a, b)\n{\n\treturn Math.sqrt ((a.x - b.x) * (a.x - b.x) + (a.y - b.y) * (a.y - b.y) + (a.z - b.z) * (a.z - b.z));\n}\n\nexport function DotVector3D (a, b)\n{\n\treturn a.x * b.x + a.y * b.y + a.z * b.z;\n}\n\nexport function VectorAngle3D (a, b)\n{\n\tlet aDirection = a.Clone ().Normalize ();\n\tlet bDirection = b.Clone ().Normalize ();\n\tif (CoordIsEqual3D (aDirection, bDirection)) {\n\t\treturn 0.0;\n\t}\n\tlet product = DotVector3D (aDirection, bDirection);\n\treturn Math.acos (product);\n}\n\nexport function CrossVector3D (a, b)\n{\n\tlet result = new Coord3D (0.0, 0.0, 0.0);\n\tresult.x = a.y * b.z - a.z * b.y;\n\tresult.y = a.z * b.x - a.x * b.z;\n\tresult.z = a.x * b.y - a.y * b.x;\n\treturn result;\n}\n\nexport function VectorLength3D (x, y, z)\n{\n\treturn Math.sqrt (x * x + y * y + z * z);\n}\n\nexport function ArrayToCoord3D (arr)\n{\n\treturn new Coord3D (arr[0], arr[1], arr[2]);\n}\n", "import { CoordIsEqual3D } from '../geometry/coord3d.js';\n\nexport class Camera\n{\n constructor (eye, center, up)\n {\n this.eye = eye;\n this.center = center;\n this.up = up;\n }\n\n Clone ()\n {\n return new Camera (\n this.eye.Clone (),\n this.center.Clone (),\n this.up.Clone ()\n );\n }\n}\n\nexport function CameraIsEqual3D (a, b)\n{\n\treturn CoordIsEqual3D (a.eye, b.eye) && CoordIsEqual3D (a.center, b.center) && CoordIsEqual3D (a.up, b.up);\n}\n", "import { Coord3D } from '../geometry/coord3d.js';\nimport { Color } from '../model/color.js';\nimport { Camera } from '../viewer/camera.js';\n\nexport let ParameterConverter =\n{\n IntegerToString (integer)\n {\n return integer.toString ();\n },\n\n StringToInteger (str)\n {\n return parseInt (str, 10);\n },\n\n NumberToString (number)\n {\n let precision = 5;\n return number.toFixed (precision);\n },\n\n StringToNumber (str)\n {\n return parseFloat (str);\n },\n\n ModelUrlsToString : function (urls)\n {\n if (urls === null) {\n return null;\n }\n return urls.join (',');\n },\n\n StringToModelUrls : function (str)\n {\n if (str === null || str.length === 0) {\n return null;\n }\n return str.split (',');\n },\n\n CameraToString : function (camera)\n {\n if (camera === null) {\n return null;\n }\n let cameraParameters = [\n this.NumberToString (camera.eye.x), this.NumberToString (camera.eye.y), this.NumberToString (camera.eye.z),\n this.NumberToString (camera.center.x), this.NumberToString (camera.center.y), this.NumberToString (camera.center.z),\n this.NumberToString (camera.up.x), this.NumberToString (camera.up.y), this.NumberToString (camera.up.z)\n ].join (',');\n return cameraParameters;\n },\n\n StringToCamera : function (str)\n {\n if (str === null || str.length === 0) {\n return null;\n }\n let paramParts = str.split (',');\n if (paramParts.length !== 9) {\n return null;\n }\n let camera = new Camera (\n new Coord3D (this.StringToNumber (paramParts[0]), this.StringToNumber (paramParts[1]), this.StringToNumber (paramParts[2])),\n new Coord3D (this.StringToNumber (paramParts[3]), this.StringToNumber (paramParts[4]), this.StringToNumber (paramParts[5])),\n new Coord3D (this.StringToNumber (paramParts[6]), this.StringToNumber (paramParts[7]), this.StringToNumber (paramParts[8]))\n );\n return camera;\n },\n\n ColorToString : function (color)\n {\n if (color === null) {\n return null;\n }\n let colorParameters = [\n this.IntegerToString (color.r),\n this.IntegerToString (color.g),\n this.IntegerToString (color.b)\n ].join (',');\n return colorParameters;\n },\n\n StringToColor : function (str)\n {\n if (str === null || str.length === 0) {\n return null;\n }\n let paramParts = str.split (',');\n if (paramParts.length !== 3) {\n return null;\n }\n let color = new Color (\n this.StringToInteger (paramParts[0]),\n this.StringToInteger (paramParts[1]),\n this.StringToInteger (paramParts[2])\n );\n return color;\n },\n\n EnvironmentSettingsToString (environmentSettings)\n {\n if (environmentSettings === null) {\n return null;\n }\n let environmentSettingsParameters = [\n environmentSettings.environmentMapName,\n environmentSettings.backgroundIsEnvMap ? 'on' : 'off'\n ].join (',');\n return environmentSettingsParameters;\n },\n\n StringToEnvironmentSettings : function (str)\n {\n if (str === null || str.length === 0) {\n return null;\n }\n let paramParts = str.split (',');\n if (paramParts.length !== 2) {\n return null;\n }\n let environmentSettings = {\n environmentMapName : paramParts[0],\n backgroundIsEnvMap : paramParts[1] === 'on' ? true : false\n };\n return environmentSettings;\n },\n\n EdgeSettingsToString : function (edgeSettings)\n {\n if (edgeSettings === null) {\n return null;\n }\n let edgeSettingsParameters = [\n edgeSettings.showEdges ? 'on' : 'off',\n this.ColorToString (edgeSettings.edgeColor),\n this.IntegerToString (edgeSettings.edgeThreshold),\n ].join (',');\n return edgeSettingsParameters;\n },\n\n StringToEdgeSettings : function (str)\n {\n if (str === null || str.length === 0) {\n return null;\n }\n let paramParts = str.split (',');\n if (paramParts.length !== 5) {\n return null;\n }\n let edgeSettings = {\n showEdges : paramParts[0] === 'on' ? true : false,\n edgeColor : new Color (\n this.StringToInteger (paramParts[1]),\n this.StringToInteger (paramParts[2]),\n this.StringToInteger (paramParts[3])\n ),\n edgeThreshold : this.StringToInteger (paramParts[4])\n };\n return edgeSettings;\n }\n};\n\nexport class ParameterListBuilder\n{\n constructor (separator)\n {\n this.separator = separator;\n this.paramList = '';\n }\n\n AddModelUrls (urls)\n {\n this.AddUrlPart ('model', ParameterConverter.ModelUrlsToString (urls));\n return this;\n }\n\n AddCamera (camera)\n {\n this.AddUrlPart ('camera', ParameterConverter.CameraToString (camera));\n return this;\n }\n\n AddEnvironmentSettings (envSettings)\n {\n this.AddUrlPart ('envsettings', ParameterConverter.EnvironmentSettingsToString (envSettings));\n return this;\n }\n\n AddBackgroundColor (background)\n {\n this.AddUrlPart ('backgroundcolor', ParameterConverter.ColorToString (background));\n return this;\n }\n\n AddDefaultColor (color)\n {\n this.AddUrlPart ('defaultcolor', ParameterConverter.ColorToString (color));\n return this;\n }\n\n AddEdgeSettings (edgeSettings)\n {\n this.AddUrlPart ('edgesettings', ParameterConverter.EdgeSettingsToString (edgeSettings));\n return this;\n }\n\n AddUrlPart (keyword, urlPart)\n {\n if (keyword === null || urlPart === null) {\n return;\n }\n if (this.paramList.length > 0) {\n this.paramList += this.separator;\n }\n this.paramList += keyword + '=' + urlPart;\n }\n\n GetParameterList ()\n {\n return this.paramList;\n }\n}\n\nexport class ParameterListParser\n{\n constructor (paramList, separator)\n {\n this.separator = separator;\n this.paramList = paramList;\n }\n\n GetModelUrls ()\n {\n // detect legacy links\n if (this.paramList.indexOf ('=') === -1) {\n return this.paramList.split (',');\n }\n\n let keywordParams = this.GetKeywordParams ('model');\n return ParameterConverter.StringToModelUrls (keywordParams);\n }\n\n GetCamera ()\n {\n let keywordParams = this.GetKeywordParams ('camera');\n return ParameterConverter.StringToCamera (keywordParams);\n }\n\n GetEnvironmentSettings ()\n {\n let environmentSettingsParams = this.GetKeywordParams ('envsettings');\n return ParameterConverter.StringToEnvironmentSettings (environmentSettingsParams);\n }\n\n GetBackgroundColor ()\n {\n let backgroundParams = this.GetKeywordParams ('backgroundcolor');\n return ParameterConverter.StringToColor (backgroundParams);\n }\n\n GetDefaultColor ()\n {\n let colorParams = this.GetKeywordParams ('defaultcolor');\n return ParameterConverter.StringToColor (colorParams);\n }\n\n GetEdgeSettings ()\n {\n let edgeSettingsParams = this.GetKeywordParams ('edgesettings');\n return ParameterConverter.StringToEdgeSettings (edgeSettingsParams);\n }\n\n GetKeywordParams (keyword)\n {\n if (this.paramList === null || this.paramList.length === 0) {\n return null;\n }\n let keywordToken = keyword + '=';\n let urlParts = this.paramList.split (this.separator);\n for (let i = 0; i < urlParts.length; i++) {\n let urlPart = urlParts[i];\n if (urlPart.startsWith (keywordToken)) {\n return urlPart.substring (keywordToken.length);\n }\n }\n return null;\n }\n}\n\nexport function CreateUrlBuilder ()\n{\n return new ParameterListBuilder ('$');\n}\n\nexport function CreateUrlParser (urlParams)\n{\n return new ParameterListParser (urlParams, '$');\n}\n\nexport function CreateModelUrlParameters (urls)\n{\n let builder = CreateUrlBuilder ();\n builder.AddModelUrls (urls);\n return builder.GetParameterList ();\n}\n", "export const FileSource =\n{\n Url : 1,\n File : 2,\n\tDecompressed : 3\n};\n\nexport const FileFormat =\n{\n Text : 1,\n Binary : 2\n};\n\nexport function GetFileName (filePath)\n{\n\tlet firstSeparator = filePath.lastIndexOf ('/');\n\tif (firstSeparator === -1) {\n\t\tfirstSeparator = filePath.lastIndexOf ('\\\\');\n\t}\n\tlet fileName = filePath;\n\tif (firstSeparator !== -1) {\n\t\tfileName = filePath.substring (firstSeparator + 1);\n\t}\n\tlet firstParamIndex = fileName.indexOf ('?');\n\tif (firstParamIndex !== -1) {\n\t\tfileName = fileName.substring (0, firstParamIndex);\n\t}\n\treturn decodeURI (fileName);\n}\n\nexport function GetFileExtension (filePath)\n{\n\tlet fileName = GetFileName (filePath);\n\tlet firstPoint = fileName.lastIndexOf ('.');\n\tif (firstPoint === -1) {\n\t\treturn '';\n\t}\n\tlet extension = fileName.substring (firstPoint + 1);\n\treturn extension.toLowerCase ();\n}\n\nexport function RequestUrl (url, format)\n{\n\treturn new Promise ((resolve, reject) => {\n\t\tlet request = new XMLHttpRequest ();\n\t\trequest.open ('GET', url, true);\n\t\tif (format === FileFormat.Text) {\n\t\t\trequest.responseType = 'text';\n\t\t} else if (format === FileFormat.Binary) {\n\t\t\trequest.responseType = 'arraybuffer';\n\t\t} else {\n\t\t\treject ();\n\t\t\treturn;\n\t\t}\n\n\t\trequest.onload = function () {\n\t\t\tif (request.status === 200) {\n\t\t\t\tresolve (request.response);\n\t\t\t} else {\n\t\t\t\treject ();\n\t\t\t}\n\t\t};\n\n\t\trequest.onerror = function () {\n\t\t\treject ();\n\t\t};\n\n\t\trequest.send (null);\n\t});\n}\n\nexport function ReadFile (file, format)\n{\n\treturn new Promise ((resolve, reject) => {\n\t\tlet reader = new FileReader ();\n\n\t\treader.onloadend = function (event) {\n\t\t\tif (event.target.readyState === FileReader.DONE) {\n\t\t\t\tresolve (event.target.result);\n\t\t\t}\n\t\t};\n\n\t\treader.onerror = function () {\n\t\t\treject ();\n\t\t};\n\n\t\tif (format === FileFormat.Text) {\n\t\t\treader.readAsText (file);\n\t\t} else if (format === FileFormat.Binary) {\n\t\t\treader.readAsArrayBuffer (file);\n\t\t} else {\n\t\t\treject ();\n\t\t}\n\t});\n}\n\nexport function TransformFileHostUrls (urls)\n{\n for (let i = 0; i < urls.length; i++) {\n let url = urls[i];\n if (url.search (/www\\.dropbox\\.com/u) !== -1) {\n url = url.replace ('www.dropbox.com', 'dl.dropbox.com');\n let separatorPos = url.indexOf ('?');\n if (separatorPos !== -1) {\n url = url.substring (0, separatorPos);\n }\n urls[i] = url;\n } else if (url.search (/github\\.com/u) !== -1) {\n url = url.replace ('github.com', 'raw.githubusercontent.com');\n url = url.replace ('/blob', '');\n let separatorPos = url.indexOf ('?');\n if (separatorPos !== -1) {\n url = url.substring (0, separatorPos);\n }\n urls[i] = url;\n }\n }\n}\n", "export class TaskRunner\n{\n constructor ()\n {\n this.count = null;\n this.current = null;\n this.callbacks = null;\n }\n\n Run (count, callbacks)\n {\n this.count = count;\n this.current = 0;\n this.callbacks = callbacks;\n if (count === 0) {\n this.TaskReady ();\n } else {\n this.RunOnce ();\n }\n }\n\n RunBatch (count, batchCount, callbacks)\n {\n let stepCount = 0;\n if (count > 0) {\n stepCount = parseInt ((count - 1) / batchCount, 10) + 1;\n }\n this.Run (stepCount, {\n runTask : (index, ready) => {\n const firstIndex = index * batchCount;\n const lastIndex = Math.min ((index + 1) * batchCount, count) - 1;\n callbacks.runTask (firstIndex, lastIndex, ready);\n },\n onReady : callbacks.onReady\n });\n }\n\n RunOnce ()\n {\n setTimeout (() => {\n this.callbacks.runTask (this.current, this.TaskReady.bind (this));\n }, 0);\n }\n\n TaskReady ()\n {\n this.current += 1;\n if (this.current < this.count) {\n this.RunOnce ();\n } else {\n if (this.callbacks.onReady) {\n this.callbacks.onReady ();\n }\n }\n }\n}\n\nexport function RunTaskAsync (task)\n{\n setTimeout (() => {\n task ();\n }, 0);\n}\n\nexport function RunTasks (count, callbacks)\n{\n let taskRunner = new TaskRunner ();\n taskRunner.Run (count, callbacks);\n}\n\nexport function RunTasksBatch (count, batchCount, callbacks)\n{\n let taskRunner = new TaskRunner ();\n taskRunner.RunBatch (count, batchCount, callbacks);\n}\n\nexport function WaitWhile (expression)\n{\n function Waiter (expression)\n {\n if (expression ()) {\n setTimeout (() => {\n Waiter (expression);\n }, 1);\n }\n }\n Waiter (expression);\n}\n", "import { RunTasks } from '../core/taskrunner.js';\nimport { FileFormat, FileSource, GetFileExtension, GetFileName, ReadFile, RequestUrl } from '../io/fileutils.js';\n\nexport class File\n{\n constructor (file, source)\n {\n this.source = source;\n if (source === FileSource.Url) {\n this.fileUrl = file;\n this.fileObject = null;\n this.name = GetFileName (file);\n this.extension = GetFileExtension (file);\n } else if (source === FileSource.File) {\n this.fileUrl = null;\n this.fileObject = file;\n this.name = GetFileName (file.name);\n this.extension = GetFileExtension (file.name);\n } else if (source === FileSource.Decompressed) {\n this.fileUrl = null;\n this.fileObject = null;\n this.name = GetFileName (file);\n this.extension = GetFileExtension (file);\n }\n this.content = null;\n }\n\n SetContent (content)\n {\n this.content = content;\n }\n}\n\nexport class FileList\n{\n constructor ()\n {\n this.files = [];\n }\n\n FillFromFileUrls (fileList)\n {\n this.Fill (fileList, FileSource.Url);\n }\n\n FillFromFileObjects (fileList)\n {\n this.Fill (fileList, FileSource.File);\n }\n\n ExtendFromFileList (files)\n {\n for (let i = 0; i < files.length; i++) {\n let file = files[i];\n if (!this.ContainsFileByPath (file.name)) {\n this.files.push (file);\n }\n }\n }\n\n GetFiles ()\n {\n return this.files;\n }\n\n GetContent (onReady)\n {\n RunTasks (this.files.length, {\n runTask : (index, complete) => {\n this.GetFileContent (this.files[index], complete);\n },\n onReady : onReady\n });\n }\n\n ContainsFileByPath (filePath)\n {\n return this.FindFileByPath (filePath) !== null;\n }\n\n FindFileByPath (filePath)\n {\n let fileName = GetFileName (filePath).toLowerCase ();\n for (let fileIndex = 0; fileIndex < this.files.length; fileIndex++) {\n let file = this.files[fileIndex];\n if (file.name.toLowerCase () === fileName) {\n return file;\n }\n }\n return null;\n }\n\n IsOnlyUrlSource ()\n {\n if (this.files.length === 0) {\n return false;\n }\n for (let i = 0; i < this.files.length; i++) {\n let file = this.files[i];\n if (file.source !== FileSource.Url && file.source !== FileSource.Decompressed) {\n return false;\n }\n }\n return true;\n }\n\n Fill (fileList, fileSource)\n {\n this.files = [];\n for (let fileIndex = 0; fileIndex < fileList.length; fileIndex++) {\n let fileObject = fileList[fileIndex];\n let file = new File (fileObject, fileSource);\n this.AddFile (file);\n }\n }\n\n AddFile (file)\n {\n this.files.push (file);\n }\n\n GetFileContent (file, complete)\n {\n if (file.content !== null) {\n complete ();\n return;\n }\n let loaderPromise = null;\n if (file.source === FileSource.Url) {\n loaderPromise = RequestUrl (file.fileUrl, FileFormat.Binary);\n } else if (file.source === FileSource.File) {\n loaderPromise = ReadFile (file.fileObject, FileFormat.Binary);\n } else {\n complete ();\n return;\n }\n loaderPromise.then ((content) => {\n file.SetContent (content);\n }).catch (() => {\n }).finally (() => {\n complete ();\n });\n }\n}\n", "import { IsEqual } from './geometry.js';\n\nexport class Quaternion\n{\n\tconstructor (x, y, z, w)\n\t{\n\t\tthis.x = x;\n\t\tthis.y = y;\n\t\tthis.z = z;\n this.w = w;\n\t}\n}\n\nexport function QuaternionIsEqual (a, b)\n{\n\treturn IsEqual (a.x, b.x) && IsEqual (a.y, b.y) && IsEqual (a.z, b.z) && IsEqual (a.w, b.w);\n}\n\nexport function ArrayToQuaternion (arr)\n{\n\treturn new Quaternion (arr[0], arr[1], arr[2], arr[3]);\n}\n\nexport function QuaternionFromAxisAngle (axis, angle)\n{\n\tconst a = angle / 2.0;\n\tconst s = Math.sin (a);\n\n\treturn new Quaternion (\n\t\taxis.x * s,\n\t\taxis.y * s,\n\t\taxis.z * s,\n\t\tMath.cos (a)\n\t);\n}\n\nexport function QuaternionFromXYZ (x, y, z, mode) {\n\n\tconst c1 = Math.cos (x / 2.0);\n\tconst c2 = Math.cos (y / 2.0);\n\tconst c3 = Math.cos (z / 2.0);\n\n\tconst s1 = Math.sin (x / 2.0);\n\tconst s2 = Math.sin (y / 2.0);\n\tconst s3 = Math.sin (z / 2.0);\n\n\tlet quaternion = new Quaternion (0.0, 0.0, 0.0, 1.0);\n\tif (mode === 'XYZ') {\n\t\tquaternion.x = s1 * c2 * c3 + c1 * s2 * s3;\n\t\tquaternion.y = c1 * s2 * c3 - s1 * c2 * s3;\n\t\tquaternion.z = c1 * c2 * s3 + s1 * s2 * c3;\n\t\tquaternion.w = c1 * c2 * c3 - s1 * s2 * s3;\n\t} else if (mode === 'YXZ') {\n\t\tquaternion.x = s1 * c2 * c3 + c1 * s2 * s3;\n\t\tquaternion.y = c1 * s2 * c3 - s1 * c2 * s3;\n\t\tquaternion.z = c1 * c2 * s3 - s1 * s2 * c3;\n\t\tquaternion.w = c1 * c2 * c3 + s1 * s2 * s3;\n\t} else if (mode === 'ZXY') {\n\t\tquaternion.x = s1 * c2 * c3 - c1 * s2 * s3;\n\t\tquaternion.y = c1 * s2 * c3 + s1 * c2 * s3;\n\t\tquaternion.z = c1 * c2 * s3 + s1 * s2 * c3;\n\t\tquaternion.w = c1 * c2 * c3 - s1 * s2 * s3;\n\t} else if (mode === 'ZYX') {\n\t\tquaternion.x = s1 * c2 * c3 - c1 * s2 * s3;\n\t\tquaternion.y = c1 * s2 * c3 + s1 * c2 * s3;\n\t\tquaternion.z = c1 * c2 * s3 - s1 * s2 * c3;\n\t\tquaternion.w = c1 * c2 * c3 + s1 * s2 * s3;\n\t} else if (mode === 'YZX') {\n\t\tquaternion.x = s1 * c2 * c3 + c1 * s2 * s3;\n\t\tquaternion.y = c1 * s2 * c3 + s1 * c2 * s3;\n\t\tquaternion.z = c1 * c2 * s3 - s1 * s2 * c3;\n\t\tquaternion.w = c1 * c2 * c3 - s1 * s2 * s3;\n\t} else if (mode === 'XZY') {\n\t\tquaternion.x = s1 * c2 * c3 - c1 * s2 * s3;\n\t\tquaternion.y = c1 * s2 * c3 - s1 * c2 * s3;\n\t\tquaternion.z = c1 * c2 * s3 + s1 * s2 * c3;\n\t\tquaternion.w = c1 * c2 * c3 + s1 * s2 * s3;\n\t} else {\n\t\treturn null;\n\t}\n\n\treturn quaternion;\n}\n", "export class Coord4D\n{\n\tconstructor (x, y, z, w)\n\t{\n\t\tthis.x = x;\n\t\tthis.y = y;\n\t\tthis.z = z;\n this.w = w;\n\t}\n\n\tClone ()\n\t{\n\t\treturn new Coord4D (this.x, this.y, this.z, this.w);\n\t}\n}\n", "import { Quaternion } from './quaternion.js';\nimport { Coord3D, VectorLength3D } from './coord3d.js';\nimport { Coord4D } from './coord4d.js';\nimport { IsEqual, IsNegative } from './geometry.js';\nimport { QuaternionFromAxisAngle } from './quaternion.js';\n\nexport class Matrix\n{\n constructor (matrix)\n {\n this.matrix = null;\n if (matrix !== undefined && matrix !== null) {\n this.matrix = matrix;\n }\n }\n\n IsValid ()\n {\n return this.matrix !== null;\n }\n\n Set (matrix)\n {\n this.matrix = matrix;\n return this;\n }\n\n Get ()\n {\n return this.matrix;\n }\n\n Clone ()\n {\n let result = [\n this.matrix[0], this.matrix[1], this.matrix[2], this.matrix[3],\n this.matrix[4], this.matrix[5], this.matrix[6], this.matrix[7],\n this.matrix[8], this.matrix[9], this.matrix[10], this.matrix[11],\n this.matrix[12], this.matrix[13], this.matrix[14], this.matrix[15]\n ];\n return new Matrix (result);\n }\n\n CreateIdentity ()\n {\n this.matrix = [\n 1.0, 0.0, 0.0, 0.0,\n 0.0, 1.0, 0.0, 0.0,\n 0.0, 0.0, 1.0, 0.0,\n 0.0, 0.0, 0.0, 1.0\n ];\n return this;\n }\n\n IsIdentity ()\n {\n let identity = new Matrix ().CreateIdentity ().Get ();\n for (let i = 0; i < 16; i++) {\n if (!IsEqual (this.matrix[i], identity[i])) {\n return false;\n }\n }\n return true;\n }\n\n CreateTranslation (x, y, z)\n {\n this.matrix = [\n 1.0, 0.0, 0.0, 0.0,\n 0.0, 1.0, 0.0, 0.0,\n 0.0, 0.0, 1.0, 0.0,\n x, y, z, 1.0\n ];\n return this;\n }\n\n CreateRotation (x, y, z, w)\n {\n let x2 = x + x;\n let y2 = y + y;\n let z2 = z + z;\n let xx = x * x2;\n let xy = x * y2;\n let xz = x * z2;\n let yy = y * y2;\n let yz = y * z2;\n let zz = z * z2;\n let wx = w * x2;\n let wy = w * y2;\n let wz = w * z2;\n this.matrix = [\n 1.0 - (yy + zz), xy + wz, xz - wy, 0.0,\n xy - wz, 1.0 - (xx + zz), yz + wx, 0.0,\n xz + wy, yz - wx, 1.0 - (xx + yy), 0.0,\n 0.0, 0.0, 0.0, 1.0\n ];\n return this;\n }\n\n CreateRotationAxisAngle (axis, angle)\n {\n let quaternion = QuaternionFromAxisAngle (axis, angle);\n return this.CreateRotation (quaternion.x, quaternion.y, quaternion.z, quaternion.w);\n }\n\n CreateScale (x, y, z)\n {\n this.matrix = [\n x, 0.0, 0.0, 0.0,\n 0.0, y, 0.0, 0.0,\n 0.0, 0.0, z, 0.0,\n 0.0, 0.0, 0.0, 1.0\n ];\n return this;\n }\n\n ComposeTRS (translation, rotation, scale)\n {\n let tx = translation.x;\n let ty = translation.y;\n let tz = translation.z;\n let qx = rotation.x;\n let qy = rotation.y;\n let qz = rotation.z;\n let qw = rotation.w;\n let sx = scale.x;\n let sy = scale.y;\n let sz = scale.z;\n\n let x2 = qx + qx;\n let y2 = qy + qy;\n let z2 = qz + qz;\n let xx = qx * x2;\n let xy = qx * y2;\n let xz = qx * z2;\n let yy = qy * y2;\n let yz = qy * z2;\n let zz = qz * z2;\n let wx = qw * x2;\n let wy = qw * y2;\n let wz = qw * z2;\n\n this.matrix = [\n (1.0 - (yy + zz)) * sx, (xy + wz) * sx, (xz - wy) * sx, 0.0,\n (xy - wz) * sy, (1.0 - (xx + zz)) * sy, (yz + wx) * sy, 0.0,\n (xz + wy) * sz, (yz - wx) * sz, (1.0 - (xx + yy)) * sz, 0.0,\n tx, ty, tz, 1.0\n ];\n return this;\n }\n\n DecomposeTRS ()\n {\n let translation = new Coord3D (\n this.matrix[12],\n this.matrix[13],\n this.matrix[14]\n );\n\n let sx = VectorLength3D (this.matrix[0], this.matrix[1], this.matrix[2]);\n let sy = VectorLength3D (this.matrix[4], this.matrix[5], this.matrix[6]);\n let sz = VectorLength3D (this.matrix[8], this.matrix[9], this.matrix[10]);\n let determinant = this.Determinant ();\n if (IsNegative (determinant)) {\n sx *= -1.0;\n }\n let scale = new Coord3D (sx, sy, sz);\n\n let m00 = this.matrix[0] / sx;\n let m01 = this.matrix[4] / sy;\n let m02 = this.matrix[8] / sz;\n let m10 = this.matrix[1] / sx;\n let m11 = this.matrix[5] / sy;\n let m12 = this.matrix[9] / sz;\n let m20 = this.matrix[2] / sx;\n let m21 = this.matrix[6] / sy;\n let m22 = this.matrix[10] / sz;\n\n // http://www.euclideanspace.com/maths/geometry/rotations/conversions/matrixToQuaternion/index.htm\n let rotation = null;\n let tr = m00 + m11 + m22;\n if (tr > 0.0) {\n let s = Math.sqrt (tr + 1.0) * 2.0;\n rotation = new Quaternion (\n (m21 - m12) / s,\n (m02 - m20) / s,\n (m10 - m01) / s,\n 0.25 * s\n );\n } else if ((m00 > m11) && (m00 > m22)) {\n let s = Math.sqrt (1.0 + m00 - m11 - m22) * 2.0;\n rotation = new Quaternion (\n 0.25 * s,\n (m01 + m10) / s,\n (m02 + m20) / s,\n (m21 - m12) / s\n );\n } else if (m11 > m22) {\n let s = Math.sqrt (1.0 + m11 - m00 - m22) * 2.0;\n rotation = new Quaternion (\n (m01 + m10) / s,\n 0.25 * s,\n (m12 + m21) / s,\n (m02 - m20) / s\n );\n } else {\n let s = Math.sqrt (1.0 + m22 - m00 - m11) * 2.0;\n rotation = new Quaternion (\n (m02 + m20) / s,\n (m12 + m21) / s,\n 0.25 * s,\n (m10 - m01) / s\n );\n }\n\n return {\n translation : translation,\n rotation : rotation,\n scale : scale\n };\n }\n\n Determinant ()\n {\n let a00 = this.matrix[0];\n let a01 = this.matrix[1];\n let a02 = this.matrix[2];\n let a03 = this.matrix[3];\n let a10 = this.matrix[4];\n let a11 = this.matrix[5];\n let a12 = this.matrix[6];\n let a13 = this.matrix[7];\n let a20 = this.matrix[8];\n let a21 = this.matrix[9];\n let a22 = this.matrix[10];\n let a23 = this.matrix[11];\n let a30 = this.matrix[12];\n let a31 = this.matrix[13];\n let a32 = this.matrix[14];\n let a33 = this.matrix[15];\n\n let b00 = a00 * a11 - a01 * a10;\n let b01 = a00 * a12 - a02 * a10;\n let b02 = a00 * a13 - a03 * a10;\n let b03 = a01 * a12 - a02 * a11;\n let b04 = a01 * a13 - a03 * a11;\n let b05 = a02 * a13 - a03 * a12;\n let b06 = a20 * a31 - a21 * a30;\n let b07 = a20 * a32 - a22 * a30;\n let b08 = a20 * a33 - a23 * a30;\n let b09 = a21 * a32 - a22 * a31;\n let b10 = a21 * a33 - a23 * a31;\n let b11 = a22 * a33 - a23 * a32;\n\n let determinant = b00 * b11 - b01 * b10 + b02 * b09 + b03 * b08 - b04 * b07 + b05 * b06;\n return determinant;\n }\n\n Invert ()\n {\n let a00 = this.matrix[0];\n let a01 = this.matrix[1];\n let a02 = this.matrix[2];\n let a03 = this.matrix[3];\n let a10 = this.matrix[4];\n let a11 = this.matrix[5];\n let a12 = this.matrix[6];\n let a13 = this.matrix[7];\n let a20 = this.matrix[8];\n let a21 = this.matrix[9];\n let a22 = this.matrix[10];\n let a23 = this.matrix[11];\n let a30 = this.matrix[12];\n let a31 = this.matrix[13];\n let a32 = this.matrix[14];\n let a33 = this.matrix[15];\n\n let b00 = a00 * a11 - a01 * a10;\n let b01 = a00 * a12 - a02 * a10;\n let b02 = a00 * a13 - a03 * a10;\n let b03 = a01 * a12 - a02 * a11;\n let b04 = a01 * a13 - a03 * a11;\n let b05 = a02 * a13 - a03 * a12;\n let b06 = a20 * a31 - a21 * a30;\n let b07 = a20 * a32 - a22 * a30;\n let b08 = a20 * a33 - a23 * a30;\n let b09 = a21 * a32 - a22 * a31;\n let b10 = a21 * a33 - a23 * a31;\n let b11 = a22 * a33 - a23 * a32;\n\n let determinant = b00 * b11 - b01 * b10 + b02 * b09 + b03 * b08 - b04 * b07 + b05 * b06;\n if (IsEqual (determinant, 0.0)) {\n return null;\n }\n\n let result = [\n (a11 * b11 - a12 * b10 + a13 * b09) / determinant,\n (a02 * b10 - a01 * b11 - a03 * b09) / determinant,\n (a31 * b05 - a32 * b04 + a33 * b03) / determinant,\n (a22 * b04 - a21 * b05 - a23 * b03) / determinant,\n (a12 * b08 - a10 * b11 - a13 * b07) / determinant,\n (a00 * b11 - a02 * b08 + a03 * b07) / determinant,\n (a32 * b02 - a30 * b05 - a33 * b01) / determinant,\n (a20 * b05 - a22 * b02 + a23 * b01) / determinant,\n (a10 * b10 - a11 * b08 + a13 * b06) / determinant,\n (a01 * b08 - a00 * b10 - a03 * b06) / determinant,\n (a30 * b04 - a31 * b02 + a33 * b00) / determinant,\n (a21 * b02 - a20 * b04 - a23 * b00) / determinant,\n (a11 * b07 - a10 * b09 - a12 * b06) / determinant,\n (a00 * b09 - a01 * b07 + a02 * b06) / determinant,\n (a31 * b01 - a30 * b03 - a32 * b00) / determinant,\n (a20 * b03 - a21 * b01 + a22 * b00) / determinant\n ];\n\n return new Matrix (result);\n }\n\n Transpose ()\n {\n let result = [\n this.matrix[0], this.matrix[4], this.matrix[8], this.matrix[12],\n this.matrix[1], this.matrix[5], this.matrix[9], this.matrix[13],\n this.matrix[2], this.matrix[6], this.matrix[10], this.matrix[14],\n this.matrix[3], this.matrix[7], this.matrix[11], this.matrix[15]\n ];\n return new Matrix (result);\n }\n\n InvertTranspose ()\n {\n let result = this.Invert ();\n if (result === null) {\n return null;\n }\n return result.Transpose ();\n }\n\n MultiplyVector (vector)\n {\n let a00 = vector.x;\n let a01 = vector.y;\n let a02 = vector.z;\n let a03 = vector.w;\n\n let b00 = this.matrix[0];\n let b01 = this.matrix[1];\n let b02 = this.matrix[2];\n let b03 = this.matrix[3];\n let b10 = this.matrix[4];\n let b11 = this.matrix[5];\n let b12 = this.matrix[6];\n let b13 = this.matrix[7];\n let b20 = this.matrix[8];\n let b21 = this.matrix[9];\n let b22 = this.matrix[10];\n let b23 = this.matrix[11];\n let b30 = this.matrix[12];\n let b31 = this.matrix[13];\n let b32 = this.matrix[14];\n let b33 = this.matrix[15];\n\n let result = new Coord4D (\n a00 * b00 + a01 * b10 + a02 * b20 + a03 * b30,\n a00 * b01 + a01 * b11 + a02 * b21 + a03 * b31,\n a00 * b02 + a01 * b12 + a02 * b22 + a03 * b32,\n a00 * b03 + a01 * b13 + a02 * b23 + a03 * b33\n );\n return result;\n }\n\n MultiplyMatrix (matrix)\n {\n let a00 = this.matrix[0];\n let a01 = this.matrix[1];\n let a02 = this.matrix[2];\n let a03 = this.matrix[3];\n let a10 = this.matrix[4];\n let a11 = this.matrix[5];\n let a12 = this.matrix[6];\n let a13 = this.matrix[7];\n let a20 = this.matrix[8];\n let a21 = this.matrix[9];\n let a22 = this.matrix[10];\n let a23 = this.matrix[11];\n let a30 = this.matrix[12];\n let a31 = this.matrix[13];\n let a32 = this.matrix[14];\n let a33 = this.matrix[15];\n\n let b00 = matrix.matrix[0];\n let b01 = matrix.matrix[1];\n let b02 = matrix.matrix[2];\n let b03 = matrix.matrix[3];\n let b10 = matrix.matrix[4];\n let b11 = matrix.matrix[5];\n let b12 = matrix.matrix[6];\n let b13 = matrix.matrix[7];\n let b20 = matrix.matrix[8];\n let b21 = matrix.matrix[9];\n let b22 = matrix.matrix[10];\n let b23 = matrix.matrix[11];\n let b30 = matrix.matrix[12];\n let b31 = matrix.matrix[13];\n let b32 = matrix.matrix[14];\n let b33 = matrix.matrix[15];\n\n let result = [\n a00 * b00 + a01 * b10 + a02 * b20 + a03 * b30,\n a00 * b01 + a01 * b11 + a02 * b21 + a03 * b31,\n a00 * b02 + a01 * b12 + a02 * b22 + a03 * b32,\n a00 * b03 + a01 * b13 + a02 * b23 + a03 * b33,\n a10 * b00 + a11 * b10 + a12 * b20 + a13 * b30,\n a10 * b01 + a11 * b11 + a12 * b21 + a13 * b31,\n a10 * b02 + a11 * b12 + a12 * b22 + a13 * b32,\n a10 * b03 + a11 * b13 + a12 * b23 + a13 * b33,\n a20 * b00 + a21 * b10 + a22 * b20 + a23 * b30,\n a20 * b01 + a21 * b11 + a22 * b21 + a23 * b31,\n a20 * b02 + a21 * b12 + a22 * b22 + a23 * b32,\n a20 * b03 + a21 * b13 + a22 * b23 + a23 * b33,\n a30 * b00 + a31 * b10 + a32 * b20 + a33 * b30,\n a30 * b01 + a31 * b11 + a32 * b21 + a33 * b31,\n a30 * b02 + a31 * b12 + a32 * b22 + a33 * b32,\n a30 * b03 + a31 * b13 + a32 * b23 + a33 * b33\n ];\n\n return new Matrix (result);\n }\n}\n\nexport function MatrixIsEqual (a, b)\n{\n const aMatrix = a.Get ();\n const bMatrix = b.Get ();\n\tfor (let i = 0; i < 16; i++) {\n if (!IsEqual (aMatrix[i], bMatrix[i])) {\n return false;\n }\n }\n return true;\n}\n", "import { Coord3D } from './coord3d.js';\nimport { Coord4D } from './coord4d.js';\nimport { Matrix, MatrixIsEqual } from './matrix.js';\n\nexport class Transformation\n{\n constructor (matrix)\n {\n if (matrix !== undefined && matrix !== null) {\n this.matrix = matrix;\n } else {\n this.matrix = new Matrix ();\n this.matrix.CreateIdentity ();\n }\n }\n\n SetMatrix (matrix)\n {\n this.matrix = matrix;\n return this;\n }\n\n GetMatrix ()\n {\n return this.matrix;\n }\n\n IsIdentity ()\n {\n return this.matrix.IsIdentity ();\n }\n\n AppendMatrix (matrix)\n {\n this.matrix = this.matrix.MultiplyMatrix (matrix);\n return this;\n }\n\n Append (transformation)\n {\n this.AppendMatrix (transformation.GetMatrix ());\n return this;\n }\n\n TransformCoord3D (coord)\n {\n let coord4D = new Coord4D (coord.x, coord.y, coord.z, 1.0);\n let resultCoord4D = this.matrix.MultiplyVector (coord4D);\n let result = new Coord3D (resultCoord4D.x, resultCoord4D.y, resultCoord4D.z);\n return result;\n }\n\n Clone ()\n {\n const clonedMatrix = this.matrix.Clone ();\n return new Transformation (clonedMatrix);\n }\n}\n\nexport function TransformationIsEqual (a, b)\n{\n return MatrixIsEqual (a.GetMatrix (), b.GetMatrix ());\n}\n", "import { Coord2D, CoordIsEqual2D } from '../geometry/coord2d.js';\nimport { IsEqual } from '../geometry/geometry.js';\nimport { Color, ColorIsEqual } from './color.js';\n\nexport class TextureMap\n{\n constructor ()\n {\n this.name = null;\n this.url = null;\n this.buffer = null;\n this.offset = new Coord2D (0.0, 0.0);\n this.scale = new Coord2D (1.0, 1.0);\n this.rotation = 0.0; // radians\n }\n\n IsValid ()\n {\n return this.name !== null && this.url !== null && this.buffer !== null;\n }\n\n HasTransformation ()\n {\n if (!CoordIsEqual2D (this.offset, new Coord2D (0.0, 0.0))) {\n return true;\n }\n if (!CoordIsEqual2D (this.scale, new Coord2D (1.0, 1.0))) {\n return true;\n }\n if (!IsEqual (this.rotation, 0.0)) {\n return true;\n }\n return false;\n }\n\n IsEqual (rhs)\n {\n if (this.name !== rhs.name) {\n return false;\n }\n if (this.url !== rhs.url) {\n return false;\n }\n if (!CoordIsEqual2D (this.offset, rhs.offset)) {\n return false;\n }\n if (!CoordIsEqual2D (this.scale, rhs.scale)) {\n return false;\n }\n if (!IsEqual (this.rotation, rhs.rotation)) {\n return false;\n }\n return true;\n }\n}\n\nexport function TextureMapIsEqual (aTex, bTex)\n{\n if (aTex === null && bTex === null) {\n return true;\n } else if (aTex === null || bTex === null) {\n return false;\n }\n return aTex.IsEqual (bTex);\n}\n\nexport const MaterialType =\n{\n Phong : 1,\n Physical : 2\n};\n\nexport class MaterialBase\n{\n constructor (type)\n {\n this.type = type;\n this.isDefault = false;\n\n this.name = '';\n this.color = new Color (0, 0, 0);\n\n this.vertexColors = false;\n }\n\n IsEqual (rhs)\n {\n if (this.type !== rhs.type) {\n return false;\n }\n if (this.isDefault !== rhs.isDefault) {\n return false;\n }\n if (this.name !== rhs.name) {\n return false;\n }\n if (!ColorIsEqual (this.color, rhs.color)) {\n return false;\n }\n if (this.vertexColors !== rhs.vertexColors) {\n return false;\n }\n return true;\n }\n}\n\nexport class FaceMaterial extends MaterialBase\n{\n constructor (type)\n {\n super (type);\n\n this.emissive = new Color (0, 0, 0);\n\n this.opacity = 1.0; // 0.0 .. 1.0\n this.transparent = false;\n\n this.diffuseMap = null;\n this.bumpMap = null;\n this.normalMap = null;\n this.emissiveMap = null;\n\n this.alphaTest = 0.0; // 0.0 .. 1.0\n this.multiplyDiffuseMap = false;\n }\n\n IsEqual (rhs)\n {\n if (!super.IsEqual (rhs)) {\n return false;\n }\n if (!ColorIsEqual (this.emissive, rhs.emissive)) {\n return false;\n }\n if (!IsEqual (this.opacity, rhs.opacity)) {\n return false;\n }\n if (this.transparent !== rhs.transparent) {\n return false;\n }\n if (!TextureMapIsEqual (this.diffuseMap, rhs.diffuseMap)) {\n return false;\n }\n if (!TextureMapIsEqual (this.bumpMap, rhs.bumpMap)) {\n return false;\n }\n if (!TextureMapIsEqual (this.normalMap, rhs.normalMap)) {\n return false;\n }\n if (!TextureMapIsEqual (this.emissiveMap, rhs.emissiveMap)) {\n return false;\n }\n if (!IsEqual (this.alphaTest, rhs.alphaTest)) {\n return false;\n }\n if (this.multiplyDiffuseMap !== rhs.multiplyDiffuseMap) {\n return false;\n }\n return true;\n }\n\n EnumerateTextureMaps (enumerator)\n {\n if (this.diffuseMap !== null) {\n enumerator (this.diffuseMap);\n }\n if (this.bumpMap !== null) {\n enumerator (this.bumpMap);\n }\n if (this.normalMap !== null) {\n enumerator (this.normalMap);\n }\n if (this.emissiveMap !== null) {\n enumerator (this.emissiveMap);\n }\n }\n}\n\nexport class PhongMaterial extends FaceMaterial\n{\n constructor ()\n {\n super (MaterialType.Phong);\n\n this.ambient = new Color (0, 0, 0);\n this.specular = new Color (0, 0, 0);\n this.shininess = 0.0; // 0.0 .. 1.0\n this.specularMap = null;\n }\n\n IsEqual (rhs)\n {\n if (!super.IsEqual (rhs)) {\n return false;\n }\n if (!ColorIsEqual (this.ambient, rhs.ambient)) {\n return false;\n }\n if (!ColorIsEqual (this.specular, rhs.specular)) {\n return false;\n }\n if (!IsEqual (this.shininess, rhs.shininess)) {\n return false;\n }\n if (!TextureMapIsEqual (this.specularMap, rhs.specularMap)) {\n return false;\n }\n return true;\n }\n\n EnumerateTextureMaps (enumerator)\n {\n super.EnumerateTextureMaps (enumerator);\n if (this.specularMap !== null) {\n enumerator (this.specularMap);\n }\n }\n}\n\nexport class PhysicalMaterial extends FaceMaterial\n{\n constructor ()\n {\n super (MaterialType.Physical);\n\n this.metalness = 0.0; // 0.0 .. 1.0\n this.roughness = 1.0; // 0.0 .. 1.0\n this.metalnessMap = null;\n }\n\n IsEqual (rhs)\n {\n if (!super.IsEqual (rhs)) {\n return false;\n }\n if (!IsEqual (this.metalness, rhs.metalness)) {\n return false;\n }\n if (!IsEqual (this.roughness, rhs.roughness)) {\n return false;\n }\n if (!TextureMapIsEqual (this.metalnessMap, rhs.metalnessMap)) {\n return false;\n }\n return true;\n }\n\n EnumerateTextureMaps (enumerator)\n {\n super.EnumerateTextureMaps (enumerator);\n if (this.metalnessMap !== null) {\n enumerator (this.metalnessMap);\n }\n }\n}\n\nexport function TextureIsEqual (a, b)\n{\n if (a.name !== b.name) {\n return false;\n }\n if (a.url !== b.url) {\n return false;\n }\n if (!CoordIsEqual2D (a.offset, b.offset)) {\n return false;\n }\n if (!CoordIsEqual2D (a.scale, b.scale)) {\n return false;\n }\n if (!IsEqual (a.rotation, b.rotation)) {\n return false;\n }\n return true;\n}\n", "import { CrossVector3D, SubCoord3D } from '../geometry/coord3d.js';\nimport { Transformation } from '../geometry/transformation.js';\n\nexport const MeshType =\n{\n Empty : 0,\n TriangleMesh : 1\n};\n\nexport function GetMeshType (mesh)\n{\n if (mesh.TriangleCount () > 0) {\n return MeshType.TriangleMesh;\n }\n return MeshType.Empty;\n}\n\nexport function CalculateTriangleNormal (v0, v1, v2)\n{\n let v = SubCoord3D (v1, v0);\n let w = SubCoord3D (v2, v0);\n let normal = CrossVector3D (v, w);\n normal.Normalize ();\n return normal;\n}\n\nexport function TransformMesh (mesh, transformation)\n{\n if (transformation.IsIdentity ()) {\n return;\n }\n\n for (let i = 0; i < mesh.VertexCount (); i++) {\n let vertex = mesh.GetVertex (i);\n let transformed = transformation.TransformCoord3D (vertex);\n vertex.x = transformed.x;\n vertex.y = transformed.y;\n vertex.z = transformed.z;\n }\n\n if (mesh.NormalCount () > 0) {\n let normalMatrix = transformation.GetMatrix ().InvertTranspose ();\n if (normalMatrix !== null) {\n let normalTransformation = new Transformation (normalMatrix);\n for (let i = 0; i < mesh.NormalCount (); i++) {\n let normal = mesh.GetNormal (i);\n let transformed = normalTransformation.TransformCoord3D (normal);\n normal.x = transformed.x;\n normal.y = transformed.y;\n normal.z = transformed.z;\n }\n }\n }\n}\n\nexport function FlipMeshTrianglesOrientation (mesh)\n{\n for (let i = 0; i < mesh.TriangleCount (); i++) {\n let triangle = mesh.GetTriangle (i);\n let tmp = triangle.v1;\n triangle.v1 = triangle.v2;\n triangle.v2 = tmp;\n }\n}\n", "import { Coord3D } from './coord3d.js';\n\nexport class Box3D\n{\n constructor (min, max)\n {\n this.min = min;\n this.max = max;\n }\n\n GetMin ()\n {\n return this.min;\n }\n\n GetMax ()\n {\n return this.max;\n }\n\n GetCenter ()\n {\n return new Coord3D (\n (this.min.x + this.max.x) / 2.0,\n (this.min.y + this.max.y) / 2.0,\n (this.min.z + this.max.z) / 2.0\n );\n }\n}\n\nexport class BoundingBoxCalculator3D\n{\n constructor ()\n {\n this.box = new Box3D (\n new Coord3D (Infinity, Infinity, Infinity),\n new Coord3D (-Infinity, -Infinity, -Infinity)\n );\n this.isValid = false;\n }\n\n GetBox ()\n {\n if (!this.isValid) {\n return null;\n }\n return this.box;\n }\n\n AddPoint (point)\n {\n this.box.min.x = Math.min (this.box.min.x, point.x);\n this.box.min.y = Math.min (this.box.min.y, point.y);\n this.box.min.z = Math.min (this.box.min.z, point.z);\n this.box.max.x = Math.max (this.box.max.x, point.x);\n this.box.max.y = Math.max (this.box.max.y, point.y);\n this.box.max.z = Math.max (this.box.max.z, point.z);\n this.isValid = true;\n }\n}\n", "import { Box3D } from './box3d.js';\nimport { Coord3D, CoordIsEqual3D } from './coord3d.js';\nimport { IsGreaterOrEqual, IsLowerOrEqual } from './geometry.js';\n\nexport class OctreeNode\n{\n constructor (boundingBox, level)\n {\n this.boundingBox = boundingBox;\n this.level = level;\n this.pointItems = [];\n this.childNodes = [];\n }\n\n AddPoint (point, data, options)\n {\n let node = this.FindNodeForPoint (point);\n if (node === null) {\n return false;\n }\n\n if (node.FindPointDirectly (point) !== null) {\n return false;\n }\n\n if (node.pointItems.length < options.maxPointsPerNode || node.level >= options.maxTreeDepth) {\n node.AddPointDirectly (point, data);\n return true;\n } else {\n node.CreateChildNodes ();\n let oldPointItems = node.pointItems;\n node.pointItems = [];\n for (let i = 0; i < oldPointItems.length; i++) {\n let pointItem = oldPointItems[i];\n if (!node.AddPoint (pointItem.point, pointItem.data, options)) {\n return false;\n }\n }\n return node.AddPoint (point, data, options);\n }\n }\n\n FindPoint (point)\n {\n let node = this.FindNodeForPoint (point);\n if (node === null) {\n return null;\n }\n return node.FindPointDirectly (point);\n }\n\n AddPointDirectly (point, data)\n {\n this.pointItems.push ({\n point : point,\n data : data\n });\n }\n\n FindPointDirectly (point)\n {\n for (let i = 0; i < this.pointItems.length; i++) {\n let pointItem = this.pointItems[i];\n if (CoordIsEqual3D (point, pointItem.point)) {\n return pointItem.data;\n }\n }\n return null;\n }\n\n FindNodeForPoint (point)\n {\n if (!this.IsPointInBounds (point)) {\n return null;\n }\n\n if (this.childNodes.length === 0) {\n return this;\n }\n\n for (let i = 0; i < this.childNodes.length; i++) {\n let childNode = this.childNodes[i];\n let foundNode = childNode.FindNodeForPoint (point);\n if (foundNode !== null) {\n return foundNode;\n }\n }\n\n return null;\n }\n\n CreateChildNodes ()\n {\n function AddChildNode (node, minX, minY, minZ, sizeX, sizeY, sizeZ)\n {\n let box = new Box3D (\n new Coord3D (minX, minY, minZ),\n new Coord3D (minX + sizeX, minY + sizeY, minZ + sizeZ)\n );\n node.childNodes.push (new OctreeNode (box, node.level + 1));\n }\n\n let min = this.boundingBox.min;\n let center = this.boundingBox.GetCenter ();\n let sizeX = (this.boundingBox.max.x - this.boundingBox.min.x) / 2.0;\n let sizeY = (this.boundingBox.max.y - this.boundingBox.min.y) / 2.0;\n let sizeZ = (this.boundingBox.max.z - this.boundingBox.min.z) / 2.0;\n\n AddChildNode (this, min.x, min.y, min.z, sizeX, sizeY, sizeZ);\n AddChildNode (this, center.x, min.y, min.z, sizeX, sizeY, sizeZ);\n AddChildNode (this, min.x, center.y, min.z, sizeX, sizeY, sizeZ);\n AddChildNode (this, center.x, center.y, min.z, sizeX, sizeY, sizeZ);\n AddChildNode (this, min.x, min.y, center.z, sizeX, sizeY, sizeZ);\n AddChildNode (this, center.x, min.y, center.z, sizeX, sizeY, sizeZ);\n AddChildNode (this, min.x, center.y, center.z, sizeX, sizeY, sizeZ);\n AddChildNode (this, center.x, center.y, center.z, sizeX, sizeY, sizeZ);\n }\n\n IsPointInBounds (point)\n {\n let isEqual =\n IsGreaterOrEqual (point.x, this.boundingBox.min.x) &&\n IsGreaterOrEqual (point.y, this.boundingBox.min.y) &&\n IsGreaterOrEqual (point.z, this.boundingBox.min.z) &&\n IsLowerOrEqual (point.x, this.boundingBox.max.x) &&\n IsLowerOrEqual (point.y, this.boundingBox.max.y) &&\n IsLowerOrEqual (point.z, this.boundingBox.max.z);\n return isEqual;\n }\n}\n\nexport class Octree\n{\n constructor (boundingBox, options)\n {\n this.options = {\n maxPointsPerNode : 10,\n maxTreeDepth : 10\n };\n if (options !== undefined) {\n if (options.maxPointsPerNode !== undefined) {\n this.options.maxPointsPerNode = options.maxPointsPerNode;\n }\n if (options.maxTreeDepth !== undefined) {\n this.options.maxTreeDepth = options.maxTreeDepth;\n }\n }\n this.rootNode = new OctreeNode (boundingBox, 0);\n }\n\n AddPoint (point, data)\n {\n return this.rootNode.AddPoint (point, data, this.options);\n }\n\n FindPoint (point)\n {\n return this.rootNode.FindPoint (point);\n }\n}\n", "export class TopologyVertex\n{\n constructor ()\n {\n this.edges = [];\n this.triangles = [];\n }\n}\n\nexport class TopologyEdge\n{\n constructor (vertex1, vertex2)\n {\n this.vertex1 = vertex1;\n this.vertex2 = vertex2;\n this.triangles = [];\n }\n}\n\nexport class TopologyTriangleEdge\n{\n constructor (edge, reversed)\n {\n this.edge = edge;\n this.reversed = reversed;\n }\n}\n\nexport class TopologyTriangle\n{\n constructor ()\n {\n this.triEdge1 = null;\n this.triEdge2 = null;\n this.triEdge3 = null;\n }\n}\n\nexport class Topology\n{\n constructor ()\n {\n this.vertices = [];\n this.edges = [];\n this.triangleEdges = [];\n this.triangles = [];\n this.edgeStartToEndVertexMap = new Map ();\n }\n\n AddVertex ()\n {\n this.vertices.push (new TopologyVertex ());\n return this.vertices.length - 1;\n }\n\n AddTriangle (vertex1, vertex2, vertex3)\n {\n function AddTriangleToVertex (vertices, vertexIndex, triangleIndex)\n {\n let vertex = vertices[vertexIndex];\n vertex.triangles.push (triangleIndex);\n }\n\n function AddEdgeToVertex (vertices, triangleEdges, vertexIndex, triangleEdgeIndex)\n {\n let vertex = vertices[vertexIndex];\n let triangleEdge = triangleEdges[triangleEdgeIndex];\n vertex.edges.push (triangleEdge.edge);\n }\n\n function AddTriangleToEdge (edges, triangleEdges, triangleEdgeIndex, triangleIndex)\n {\n let triangleEdge = triangleEdges[triangleEdgeIndex];\n let edge = edges[triangleEdge.edge];\n edge.triangles.push (triangleIndex);\n }\n\n let triangleIndex = this.triangles.length;\n let triangle = new TopologyTriangle ();\n triangle.triEdge1 = this.AddTriangleEdge (vertex1, vertex2);\n triangle.triEdge2 = this.AddTriangleEdge (vertex2, vertex3);\n triangle.triEdge3 = this.AddTriangleEdge (vertex3, vertex1);\n\n AddTriangleToVertex (this.vertices, vertex1, triangleIndex);\n AddTriangleToVertex (this.vertices, vertex2, triangleIndex);\n AddTriangleToVertex (this.vertices, vertex3, triangleIndex);\n\n AddEdgeToVertex (this.vertices, this.triangleEdges, vertex1, triangle.triEdge1);\n AddEdgeToVertex (this.vertices, this.triangleEdges, vertex2, triangle.triEdge2);\n AddEdgeToVertex (this.vertices, this.triangleEdges, vertex3, triangle.triEdge3);\n\n AddTriangleToEdge (this.edges, this.triangleEdges, triangle.triEdge1, triangleIndex);\n AddTriangleToEdge (this.edges, this.triangleEdges, triangle.triEdge2, triangleIndex);\n AddTriangleToEdge (this.edges, this.triangleEdges, triangle.triEdge3, triangleIndex);\n\n this.triangles.push (triangle);\n }\n\n AddTriangleEdge (vertex1, vertex2)\n {\n let startVertex = vertex1;\n let endVertex = vertex2;\n let reversed = false;\n if (vertex2 < vertex1) {\n startVertex = vertex2;\n endVertex = vertex1;\n reversed = true;\n }\n\n let edgeIndex = this.AddEdge (startVertex, endVertex);\n this.triangleEdges.push (new TopologyTriangleEdge (edgeIndex, reversed));\n return this.triangleEdges.length - 1;\n }\n\n AddEdge (startVertex, endVertex)\n {\n if (!this.edgeStartToEndVertexMap.has (startVertex)) {\n this.edgeStartToEndVertexMap.set (startVertex, []);\n }\n\n let endVertices = this.edgeStartToEndVertexMap.get (startVertex);\n for (let i = 0; i < endVertices.length; i++) {\n let endVertexItem = endVertices[i];\n if (endVertexItem.endVertex === endVertex) {\n return endVertexItem.edgeIndex;\n }\n }\n\n let edgeIndex = this.edges.length;\n endVertices.push ({\n endVertex : endVertex,\n edgeIndex : edgeIndex\n });\n\n this.edges.push (new TopologyEdge (startVertex, endVertex));\n return edgeIndex;\n }\n}\n", "import { BoundingBoxCalculator3D } from '../geometry/box3d.js';\nimport { Octree } from '../geometry/octree.js';\nimport { GetMeshType, MeshType } from './meshutils.js';\nimport { Topology } from './topology.js';\n\nexport function IsModelEmpty (model)\n{\n let isEmpty = true;\n model.EnumerateMeshInstances ((meshInstance) => {\n if (GetMeshType (meshInstance) !== MeshType.Empty) {\n isEmpty = false;\n }\n });\n return isEmpty;\n}\n\nexport function GetBoundingBox (object3D)\n{\n let calculator = new BoundingBoxCalculator3D ();\n object3D.EnumerateVertices ((vertex) => {\n calculator.AddPoint (vertex);\n });\n return calculator.GetBox ();\n}\n\nexport function GetTopology (object3D)\n{\n function GetVertexIndex (vertex, octree, topology)\n {\n let index = octree.FindPoint (vertex);\n if (index === null) {\n index = topology.AddVertex ();\n octree.AddPoint (vertex, index);\n }\n return index;\n }\n\n let boundingBox = GetBoundingBox (object3D);\n let octree = new Octree (boundingBox);\n let topology = new Topology ();\n\n object3D.EnumerateTriangleVertices ((v0, v1, v2) => {\n let v0Index = GetVertexIndex (v0, octree, topology);\n let v1Index = GetVertexIndex (v1, octree, topology);\n let v2Index = GetVertexIndex (v2, octree, topology);\n topology.AddTriangle (v0Index, v1Index, v2Index);\n });\n return topology;\n}\n\nexport function IsSolid (object3D)\n{\n function GetEdgeOrientationInTriangle (topology, triangleIndex, edgeIndex)\n {\n const triangle = topology.triangles[triangleIndex];\n const triEdge1 = topology.triangleEdges[triangle.triEdge1];\n const triEdge2 = topology.triangleEdges[triangle.triEdge2];\n const triEdge3 = topology.triangleEdges[triangle.triEdge3];\n if (triEdge1.edge === edgeIndex) {\n return triEdge1.reversed;\n }\n if (triEdge2.edge === edgeIndex) {\n return triEdge2.reversed;\n }\n if (triEdge3.edge === edgeIndex) {\n return triEdge3.reversed;\n }\n return null;\n }\n\n const topology = GetTopology (object3D);\n for (let edgeIndex = 0; edgeIndex < topology.edges.length; edgeIndex++) {\n const edge = topology.edges[edgeIndex];\n let triCount = edge.triangles.length;\n if (triCount === 0 || triCount % 2 !== 0) {\n return false;\n }\n let edgesDirection = 0;\n for (let triIndex = 0; triIndex < edge.triangles.length; triIndex++) {\n const triangleIndex = edge.triangles[triIndex];\n const edgeOrientation = GetEdgeOrientationInTriangle (topology, triangleIndex, edgeIndex);\n if (edgeOrientation) {\n edgesDirection += 1;\n } else {\n edgesDirection -= 1;\n }\n }\n if (edgesDirection !== 0) {\n return false;\n }\n }\n return true;\n}\n\nexport function HasDefaultMaterial (model)\n{\n for (let i = 0; i < model.MaterialCount (); i++) {\n let material = model.GetMaterial (i);\n if (material.isDefault && !material.vertexColors) {\n return true;\n }\n }\n return false;\n}\n\nexport function ReplaceDefaultMaterialColor (model, color)\n{\n for (let i = 0; i < model.MaterialCount (); i++) {\n let material = model.GetMaterial (i);\n if (material.isDefault) {\n material.color = color;\n }\n }\n}\n", "export const PropertyType =\n{\n Text : 1,\n Integer : 2,\n Number : 3,\n Boolean : 4,\n Percent : 5,\n Color : 6\n};\n\nexport class Property\n{\n constructor (type, name, value)\n {\n this.type = type;\n this.name = name;\n this.value = value;\n }\n}\n\nexport class PropertyGroup\n{\n constructor (name)\n {\n this.name = name;\n this.properties = [];\n }\n\n PropertyCount ()\n {\n return this.properties.length;\n }\n\n AddProperty (property)\n {\n this.properties.push (property);\n }\n\n GetProperty (index)\n {\n return this.properties[index];\n }\n}\n", "export class Object3D\n{\n constructor ()\n {\n\n }\n\n VertexCount ()\n {\n return 0;\n }\n\n VertexColorCount ()\n {\n return 0;\n }\n\n NormalCount ()\n {\n return 0;\n }\n\n TextureUVCount ()\n {\n return 0;\n }\n\n TriangleCount ()\n {\n return 0;\n }\n\n EnumerateVertices (onVertex)\n {\n\n }\n\n EnumerateTriangleVertexIndices (onTriangleVertexIndices)\n {\n\n }\n\n EnumerateTriangleVertices (onTriangleVertices)\n {\n\n }\n}\n\nexport class ModelObject3D extends Object3D\n{\n constructor ()\n {\n super ();\n this.name = '';\n this.propertyGroups = [];\n }\n\n GetName ()\n {\n return this.name;\n }\n\n SetName (name)\n {\n this.name = name;\n }\n\n PropertyGroupCount ()\n {\n return this.propertyGroups.length;\n }\n\n AddPropertyGroup (propertyGroup)\n {\n this.propertyGroups.push (propertyGroup);\n return this.propertyGroups.length - 1;\n }\n\n GetPropertyGroup (index)\n {\n return this.propertyGroups[index];\n }\n}\n", "import { ModelObject3D } from './object.js';\n\nexport class Mesh extends ModelObject3D\n{\n constructor ()\n {\n super ();\n this.vertices = [];\n this.vertexColors = [];\n this.normals = [];\n this.uvs = [];\n this.triangles = [];\n }\n\n VertexCount ()\n {\n return this.vertices.length;\n }\n\n VertexColorCount ()\n {\n return this.vertexColors.length;\n }\n\n NormalCount ()\n {\n return this.normals.length;\n }\n\n TextureUVCount ()\n {\n return this.uvs.length;\n }\n\n TriangleCount ()\n {\n return this.triangles.length;\n }\n\n AddVertex (vertex)\n {\n this.vertices.push (vertex);\n return this.vertices.length - 1;\n }\n\n SetVertex (index, vertex)\n {\n this.vertices[index] = vertex;\n }\n\n GetVertex (index)\n {\n return this.vertices[index];\n }\n\n AddVertexColor (color)\n {\n this.vertexColors.push (color);\n return this.vertexColors.length - 1;\n }\n\n SetVertexColor (index, color)\n {\n this.vertexColors[index] = color;\n }\n\n GetVertexColor (index)\n {\n return this.vertexColors[index];\n }\n\n AddNormal (normal)\n {\n this.normals.push (normal);\n return this.normals.length - 1;\n }\n\n SetNormal (index, normal)\n {\n this.normals[index] = normal;\n }\n\n GetNormal (index)\n {\n return this.normals[index];\n }\n\n AddTextureUV (uv)\n {\n this.uvs.push (uv);\n return this.uvs.length - 1;\n }\n\n SetTextureUV (index, uv)\n {\n this.uvs[index] = uv;\n }\n\n GetTextureUV (index)\n {\n return this.uvs[index];\n }\n\n AddTriangle (triangle)\n {\n this.triangles.push (triangle);\n return this.triangles.length - 1;\n }\n\n GetTriangle (index)\n {\n return this.triangles[index];\n }\n\n EnumerateVertices (onVertex)\n {\n for (const vertex of this.vertices) {\n onVertex (vertex);\n }\n }\n\n EnumerateTriangleVertexIndices (onTriangleVertexIndices)\n {\n for (const triangle of this.triangles) {\n onTriangleVertexIndices (triangle.v0, triangle.v1, triangle.v2);\n }\n }\n\n EnumerateTriangleVertices (onTriangleVertices)\n {\n for (const triangle of this.triangles) {\n let v0 = this.vertices[triangle.v0];\n let v1 = this.vertices[triangle.v1];\n let v2 = this.vertices[triangle.v2];\n onTriangleVertices (v0, v1, v2);\n }\n }\n\n Clone ()\n {\n let cloned = new Mesh ();\n\n cloned.SetName (this.GetName ());\n\n for (let i = 0; i < this.VertexCount (); i++) {\n let vertex = this.GetVertex (i);\n cloned.AddVertex (vertex.Clone ());\n }\n\n for (let i = 0; i < this.VertexColorCount (); i++) {\n let color = this.GetVertexColor (i);\n cloned.AddVertexColor (color.Clone ());\n }\n\n for (let i = 0; i < this.NormalCount (); i++) {\n let normal = this.GetNormal (i);\n cloned.AddNormal (normal.Clone ());\n }\n\n for (let i = 0; i < this.TextureUVCount (); i++) {\n let uv = this.GetTextureUV (i);\n cloned.AddTextureUV (uv.Clone ());\n }\n\n for (let i = 0; i < this.TriangleCount (); i++) {\n let triangle = this.GetTriangle (i);\n cloned.AddTriangle (triangle.Clone ());\n }\n\n return cloned;\n }\n}\n", "export class Triangle\n{\n constructor (v0, v1, v2)\n {\n this.v0 = v0;\n this.v1 = v1;\n this.v2 = v2;\n\n this.c0 = null;\n this.c1 = null;\n this.c2 = null;\n\n this.n0 = null;\n this.n1 = null;\n this.n2 = null;\n\n this.u0 = null;\n this.u1 = null;\n this.u2 = null;\n\n this.mat = null;\n this.curve = null;\n }\n\n HasVertices ()\n {\n return this.v0 !== null && this.v1 !== null && this.v2 !== null;\n }\n\n HasVertexColors ()\n {\n return this.c0 !== null && this.c1 !== null && this.c2 !== null;\n }\n\n HasNormals ()\n {\n return this.n0 !== null && this.n1 !== null && this.n2 !== null;\n }\n\n HasTextureUVs ()\n {\n return this.u0 !== null && this.u1 !== null && this.u2 !== null;\n }\n\n SetVertices (v0, v1, v2)\n {\n this.v0 = v0;\n this.v1 = v1;\n this.v2 = v2;\n return this;\n }\n\n SetVertexColors (c0, c1, c2)\n {\n this.c0 = c0;\n this.c1 = c1;\n this.c2 = c2;\n return this;\n }\n\n SetNormals (n0, n1, n2)\n {\n this.n0 = n0;\n this.n1 = n1;\n this.n2 = n2;\n return this;\n }\n\n SetTextureUVs (u0, u1, u2)\n {\n this.u0 = u0;\n this.u1 = u1;\n this.u2 = u2;\n return this;\n }\n\n SetMaterial (mat)\n {\n this.mat = mat;\n return this;\n }\n\n SetCurve (curve)\n {\n this.curve = curve;\n return this;\n }\n\n Clone ()\n {\n let cloned = new Triangle (this.v0, this.v1, this.v2);\n cloned.SetVertexColors (this.c0, this.c1, this.c2);\n cloned.SetNormals (this.n0, this.n1, this.n2);\n cloned.SetTextureUVs (this.u0, this.u1, this.u2);\n cloned.SetMaterial (this.mat);\n cloned.SetCurve (this.curve);\n return cloned;\n }\n}\n", "import { Coord2D } from '../geometry/coord2d.js';\nimport { Coord3D } from '../geometry/coord3d.js';\nimport { ColorFromFloatComponents } from '../model/color.js';\nimport { MaterialType } from '../model/material.js';\nimport { Mesh } from '../model/mesh.js';\nimport { Triangle } from '../model/triangle.js';\n\n// Some mobile devices say that they support mediump, but in reality they don't. At the end\n// all materials rendered as black. This hack renders a single plane with red material and\n// it checks if it's really red. If it's not, then probably there is a driver issue.\n// https://github.com/kovacsv/Online3DViewer/issues/69\nexport function HasHighpDriverIssue ()\n{\n let canvas = document.createElement ('canvas');\n document.body.appendChild (canvas);\n let parameters = {\n canvas : canvas,\n antialias : true\n };\n\n let renderer = new THREE.WebGLRenderer (parameters);\n renderer.setClearColor ('#ffffff', 1);\n renderer.setSize (10, 10);\n\n let scene = new THREE.Scene ();\n\n let ambientLight = new THREE.AmbientLight (0x888888);\n scene.add (ambientLight);\n\n let light = new THREE.DirectionalLight (0x888888);\n light.position.set (0.0, 0.0, 1.0);\n scene.add (light);\n\n let camera = new THREE.PerspectiveCamera (45.0, 1.0, 0.1, 1000.0);\n camera.position.set (0.0, 0.0, 1.0);\n camera.up.set (0.0, 1.0, 0.0);\n camera.lookAt (new THREE.Vector3 (0.0, 0.0, 0.0));\n scene.add (camera);\n\n let plane = new THREE.PlaneGeometry (1.0, 1.0);\n let mesh = new THREE.Mesh (plane, new THREE.MeshPhongMaterial ({\n color : 0xcc0000\n }));\n scene.add (mesh);\n renderer.render (scene, camera);\n\n let context = renderer.getContext ();\n let pixels = new Uint8Array (4);\n context.readPixels(\n 5, 5, 1, 1,\n context.RGBA,\n context.UNSIGNED_BYTE,\n pixels\n );\n\n document.body.removeChild (canvas);\n\n let blackThreshold = 50;\n if (pixels[0] < blackThreshold && pixels[1] < blackThreshold && pixels[2] < blackThreshold) {\n return true;\n }\n return false;\n}\n\nexport const ShadingType =\n{\n Phong : 1,\n Physical : 2\n};\n\nexport function GetShadingType (model)\n{\n let phongCount = 0;\n let physicalCount = 0;\n for (let i = 0; i < model.MaterialCount (); i++) {\n let material = model.GetMaterial (i);\n if (material.type === MaterialType.Phong) {\n phongCount += 1;\n } else if (material.type === MaterialType.Physical) {\n physicalCount += 1;\n }\n }\n if (phongCount >= physicalCount) {\n return ShadingType.Phong;\n } else {\n return ShadingType.Physical;\n }\n}\n\nexport function ConvertThreeColorToColor (threeColor)\n{\n return ColorFromFloatComponents (threeColor.r, threeColor.g, threeColor.b);\n}\n\nexport function ConvertColorToThreeColor (color)\n{\n return new THREE.Color (\n color.r / 255.0,\n color.g / 255.0,\n color.b / 255.0\n );\n}\n\nexport function ConvertThreeGeometryToMesh (threeGeometry, materialIndex)\n{\n let mesh = new Mesh ();\n\n let vertices = threeGeometry.attributes.position.array;\n let vertexItemSize = threeGeometry.attributes.position.itemSize || 3;\n for (let i = 0; i < vertices.length; i += vertexItemSize) {\n let x = vertices[i];\n let y = vertices[i + 1];\n let z = vertices[i + 2];\n mesh.AddVertex (new Coord3D (x, y, z));\n }\n\n let hasVertexColors = (threeGeometry.attributes.color !== undefined);\n if (hasVertexColors) {\n let colors = threeGeometry.attributes.color.array;\n let colorItemSize = threeGeometry.attributes.color.itemSize || 3;\n for (let i = 0; i < colors.length; i += colorItemSize) {\n let threeColor = new THREE.Color (colors[i], colors[i + 1], colors[i + 2]);\n mesh.AddVertexColor (ConvertThreeColorToColor (threeColor));\n }\n }\n\n let hasNormals = (threeGeometry.attributes.normal !== undefined);\n if (hasNormals) {\n let normals = threeGeometry.attributes.normal.array;\n let normalItemSize = threeGeometry.attributes.normal.itemSize || 3;\n for (let i = 0; i < normals.length; i += normalItemSize) {\n let x = normals[i];\n let y = normals[i + 1];\n let z = normals[i + 2];\n mesh.AddNormal (new Coord3D (x, y, z));\n }\n }\n\n let hasUVs = (threeGeometry.attributes.uv !== undefined);\n if (hasUVs) {\n let uvs = threeGeometry.attributes.uv.array;\n let uvItemSize = threeGeometry.attributes.uv.itemSize || 2;\n for (let i = 0; i < uvs.length; i += uvItemSize) {\n let x = uvs[i];\n let y = uvs[i + 1];\n mesh.AddTextureUV (new Coord2D (x, y));\n }\n }\n\n let indices = null;\n if (threeGeometry.index !== null) {\n indices = threeGeometry.index.array;\n } else {\n indices = [];\n for (let i = 0; i < vertices.length / 3; i++) {\n indices.push (i);\n }\n }\n\n for (let i = 0; i < indices.length; i += 3) {\n let v0 = indices[i];\n let v1 = indices[i + 1];\n let v2 = indices[i + 2];\n let triangle = new Triangle (v0, v1, v2);\n if (hasVertexColors) {\n triangle.SetVertexColors (v0, v1, v2);\n }\n if (hasNormals) {\n triangle.SetNormals (v0, v1, v2);\n }\n if (hasUVs) {\n triangle.SetTextureUVs (v0, v1, v2);\n }\n if (materialIndex !== null) {\n triangle.SetMaterial (materialIndex);\n }\n mesh.AddTriangle (triangle);\n }\n\n return mesh;\n}\n", "import { TransformMesh } from './meshutils.js';\nimport { ModelObject3D } from './object.js';\n\nexport class MeshInstanceId\n{\n constructor (nodeId, meshIndex)\n {\n this.nodeId = nodeId;\n this.meshIndex = meshIndex;\n }\n\n IsEqual (rhs)\n {\n return this.nodeId === rhs.nodeId && this.meshIndex === rhs.meshIndex;\n }\n\n GetKey ()\n {\n return this.nodeId.toString () + ':' + this.meshIndex.toString ();\n }\n}\n\nexport class MeshInstance extends ModelObject3D\n{\n constructor (id, node, mesh)\n {\n super ();\n this.id = id;\n this.node = node;\n this.mesh = mesh;\n }\n\n GetId ()\n {\n return this.id;\n }\n\n GetTransformation ()\n {\n return this.node.GetWorldTransformation ();\n }\n\n GetMesh ()\n {\n return this.mesh;\n }\n\n VertexCount ()\n {\n return this.mesh.VertexCount ();\n }\n\n VertexColorCount ()\n {\n return this.mesh.VertexColorCount ();\n }\n\n NormalCount ()\n {\n return this.mesh.NormalCount ();\n }\n\n TextureUVCount ()\n {\n return this.mesh.TextureUVCount ();\n }\n\n TriangleCount ()\n {\n return this.mesh.TriangleCount ();\n }\n\n EnumerateVertices (onVertex)\n {\n let transformation = this.node.GetWorldTransformation ();\n if (transformation.IsIdentity ()) {\n this.mesh.EnumerateVertices (onVertex);\n } else {\n this.mesh.EnumerateVertices ((vertex) => {\n const transformed = transformation.TransformCoord3D (vertex);\n onVertex (transformed);\n });\n }\n }\n\n EnumerateTriangleVertexIndices (onTriangleVertexIndices)\n {\n this.mesh.EnumerateTriangleVertexIndices (onTriangleVertexIndices);\n }\n\n EnumerateTriangleVertices (onTriangleVertices)\n {\n let transformation = this.node.GetWorldTransformation ();\n if (transformation.IsIdentity ()) {\n this.mesh.EnumerateTriangleVertices (onTriangleVertices);\n } else {\n this.mesh.EnumerateTriangleVertices ((v0, v1, v2) => {\n const v0Transformed = transformation.TransformCoord3D (v0);\n const v1Transformed = transformation.TransformCoord3D (v1);\n const v2Transformed = transformation.TransformCoord3D (v2);\n onTriangleVertices (v0Transformed, v1Transformed, v2Transformed);\n });\n }\n }\n\n PropertyGroupCount ()\n {\n return this.mesh.PropertyGroupCount ();\n }\n\n AddPropertyGroup (propertyGroup)\n {\n return this.mesh.AddPropertyGroup (propertyGroup);\n }\n\n GetPropertyGroup (index)\n {\n return this.mesh.GetPropertyGroup (index);\n }\n\n GetTransformedMesh ()\n {\n let transformation = this.node.GetWorldTransformation ();\n let transformed = this.mesh.Clone ();\n TransformMesh (transformed, transformation);\n return transformed;\n }\n}\n", "import { Transformation } from '../geometry/transformation.js';\n\nclass NodeIdGenerator\n{\n constructor ()\n {\n this.nextId = 0;\n }\n\n GenerateId ()\n {\n const id = this.nextId;\n this.nextId += 1;\n return id;\n }\n}\n\nexport const NodeType =\n{\n GroupNode : 0,\n MeshNode : 1\n};\n\nexport class Node\n{\n constructor ()\n {\n this.type = NodeType.GroupNode;\n this.name = '';\n this.parent = null;\n this.transformation = new Transformation ();\n\n this.childNodes = [];\n this.meshIndices = [];\n\n this.idGenerator = new NodeIdGenerator ();\n this.id = this.idGenerator.GenerateId ();\n }\n\n IsEmpty ()\n {\n return this.childNodes.length === 0 && this.meshIndices.length === 0;\n }\n\n GetType ()\n {\n return this.type;\n }\n\n SetType (type)\n {\n this.type = type;\n }\n\n GetId ()\n {\n return this.id;\n }\n\n GetName ()\n {\n return this.name;\n }\n\n SetName (name)\n {\n this.name = name;\n }\n\n HasParent ()\n {\n return this.parent !== null;\n }\n\n GetParent ()\n {\n return this.parent;\n }\n\n GetTransformation ()\n {\n return this.transformation;\n }\n\n GetWorldTransformation ()\n {\n let transformation = this.transformation.Clone ();\n let parent = this.parent;\n while (parent !== null) {\n transformation.Append (parent.transformation);\n parent = parent.parent;\n }\n return transformation;\n }\n\n SetTransformation (transformation)\n {\n this.transformation = transformation;\n }\n\n AddChildNode (node)\n {\n node.parent = this;\n node.idGenerator = this.idGenerator;\n node.id = node.idGenerator.GenerateId ();\n this.childNodes.push (node);\n return this.childNodes.length - 1;\n }\n\n RemoveChildNode (node)\n {\n node.parent = null;\n let index = this.childNodes.indexOf (node);\n this.childNodes.splice (index, 1);\n }\n\n GetChildNodes ()\n {\n return this.childNodes;\n }\n\n ChildNodeCount ()\n {\n return this.childNodes.length;\n }\n\n GetChildNode (index)\n {\n return this.childNodes[index];\n }\n\n AddMeshIndex (index)\n {\n this.meshIndices.push (index);\n return this.meshIndices.length - 1;\n }\n\n MeshIndexCount ()\n {\n return this.meshIndices.length;\n }\n\n GetMeshIndex (index)\n {\n return this.meshIndices[index];\n }\n\n GetMeshIndices ()\n {\n return this.meshIndices;\n }\n\n Enumerate (processor)\n {\n processor (this);\n for (const childNode of this.childNodes) {\n childNode.Enumerate (processor);\n }\n }\n\n EnumerateChildren (processor)\n {\n for (const childNode of this.childNodes) {\n processor (childNode);\n childNode.EnumerateChildren (processor);\n }\n }\n\n EnumerateMeshIndices (processor)\n {\n for (const meshIndex of this.meshIndices) {\n processor (meshIndex);\n }\n for (const childNode of this.childNodes) {\n childNode.EnumerateMeshIndices (processor);\n }\n }\n}\n", "import { MeshInstance, MeshInstanceId } from './meshinstance.js';\nimport { Node } from './node.js';\nimport { ModelObject3D } from './object.js';\n\nexport class Model extends ModelObject3D\n{\n constructor ()\n {\n super ();\n this.root = new Node ();\n this.materials = [];\n this.meshes = [];\n }\n\n GetRootNode ()\n {\n return this.root;\n }\n\n MaterialCount ()\n {\n return this.materials.length;\n }\n\n MeshCount ()\n {\n return this.meshes.length;\n }\n\n MeshInstanceCount ()\n {\n let count = 0;\n this.root.Enumerate ((node) => {\n count += node.MeshIndexCount ();\n });\n return count;\n }\n\n VertexCount ()\n {\n let count = 0;\n this.EnumerateMeshInstances ((meshInstance) => {\n count += meshInstance.VertexCount ();\n });\n return count;\n }\n\n VertexColorCount ()\n {\n let count = 0;\n this.EnumerateMeshInstances ((meshInstance) => {\n count += meshInstance.VertexColorCount ();\n });\n return count;\n }\n\n NormalCount ()\n {\n let count = 0;\n this.EnumerateMeshInstances ((meshInstance) => {\n count += meshInstance.NormalCount ();\n });\n return count;\n }\n\n TextureUVCount ()\n {\n let count = 0;\n this.EnumerateMeshInstances ((meshInstance) => {\n count += meshInstance.TextureUVCount ();\n });\n return count;\n }\n\n TriangleCount ()\n {\n let count = 0;\n this.EnumerateMeshInstances ((meshInstance) => {\n count += meshInstance.TriangleCount ();\n });\n return count;\n }\n\n AddMaterial (material)\n {\n this.materials.push (material);\n return this.materials.length - 1;\n }\n\n GetMaterial (index)\n {\n return this.materials[index];\n }\n\n AddMesh (mesh)\n {\n this.meshes.push (mesh);\n return this.meshes.length - 1;\n }\n\n AddMeshToRootNode (mesh)\n {\n const meshIndex = this.AddMesh (mesh);\n this.root.AddMeshIndex (meshIndex);\n return meshIndex;\n }\n\n RemoveMesh (index)\n {\n this.meshes.splice (index, 1);\n this.root.Enumerate ((node) => {\n for (let i = 0; i < node.meshIndices.length; i++) {\n if (node.meshIndices[i] === index) {\n node.meshIndices.splice (i, 1);\n i -= 1;\n } else if (node.meshIndices[i] > index) {\n node.meshIndices[i] -= 1;\n }\n }\n });\n }\n\n GetMesh (index)\n {\n return this.meshes[index];\n }\n\n GetMeshInstance (instanceId)\n {\n let foundNode = null;\n this.root.Enumerate ((node) => {\n if (node.GetId () === instanceId.nodeId) {\n foundNode = node;\n }\n });\n if (foundNode === null) {\n return null;\n }\n const nodeMeshIndices = foundNode.GetMeshIndices ();\n if (nodeMeshIndices.indexOf (instanceId.meshIndex) === -1) {\n return null;\n }\n let foundMesh = this.GetMesh (instanceId.meshIndex);\n let id = new MeshInstanceId (foundNode.GetId (), instanceId.meshIndex);\n return new MeshInstance (id, foundNode, foundMesh);\n }\n\n EnumerateMeshes (onMesh)\n {\n for (const mesh of this.meshes) {\n onMesh (mesh);\n }\n }\n\n EnumerateMeshInstances (onMeshInstance)\n {\n this.root.Enumerate ((node) => {\n for (let meshIndex of node.GetMeshIndices ()) {\n let id = new MeshInstanceId (node.GetId (), meshIndex);\n let mesh = this.GetMesh (meshIndex);\n let meshInstance = new MeshInstance (id, node, mesh);\n onMeshInstance (meshInstance);\n }\n });\n }\n\n EnumerateTransformedMeshes (onMesh)\n {\n this.EnumerateMeshInstances ((meshInstance) => {\n const transformed = meshInstance.GetTransformedMesh ();\n onMesh (transformed);\n });\n }\n\n EnumerateVertices (onVertex)\n {\n this.EnumerateMeshInstances ((meshInstance) => {\n meshInstance.EnumerateVertices (onVertex);\n });\n }\n\n EnumerateTriangleVertexIndices (onTriangleVertexIndices)\n {\n this.EnumerateMeshInstances ((meshInstance) => {\n meshInstance.EnumerateTriangleVertexIndices (onTriangleVertexIndices);\n });\n }\n\n EnumerateTriangleVertices (onTriangleVertices)\n {\n this.EnumerateMeshInstances ((meshInstance) => {\n meshInstance.EnumerateTriangleVertices (onTriangleVertices);\n });\n }\n}\n", "export function IsDefined (val)\n{\n return val !== undefined && val !== null;\n}\n\nexport function ValueOrDefault (val, def)\n{\n if (val === undefined || val === null) {\n return def;\n }\n return val;\n}\n\nexport function CopyObjectAttributes (src, dest)\n{\n if (!IsDefined (src)) {\n return;\n }\n for (let attribute of Object.keys (src)) {\n if (IsDefined (src[attribute])) {\n dest[attribute] = src[attribute];\n }\n }\n}\n", "import { CopyObjectAttributes } from '../core/core.js';\nimport { AddCoord3D, Coord3D, CoordIsEqual3D } from '../geometry/coord3d.js';\nimport { Color } from './color.js';\nimport { PhongMaterial } from './material.js';\nimport { CalculateTriangleNormal, GetMeshType, MeshType } from './meshutils.js';\n\nclass ModelFinalizer\n{\n constructor (params)\n {\n this.params = {\n getDefaultMaterialColor : () => {\n return new Color (0, 0, 0);\n }\n };\n CopyObjectAttributes (params, this.params);\n this.defaultMaterialIndex = null;\n }\n\n Finalize (model)\n {\n this.Reset ();\n\n this.FinalizeMeshes (model);\n this.FinalizeMaterials (model);\n this.FinalizeNodes (model);\n }\n\n FinalizeMaterials (model)\n {\n let hasVertexColors = (model.VertexColorCount () > 0);\n if (!hasVertexColors) {\n return;\n }\n\n let materialHasVertexColors = new Map ();\n for (let meshIndex = 0; meshIndex < model.MeshCount (); meshIndex++) {\n let mesh = model.GetMesh (meshIndex);\n for (let triangleIndex = 0; triangleIndex < mesh.TriangleCount (); triangleIndex++) {\n let triangle = mesh.GetTriangle (triangleIndex);\n let hasVertexColors = triangle.HasVertexColors ();\n if (!materialHasVertexColors.has (triangle.mat)) {\n materialHasVertexColors.set (triangle.mat, hasVertexColors);\n } else if (!hasVertexColors) {\n materialHasVertexColors.set (triangle.mat, false);\n }\n }\n }\n\n for (let [materialIndex, hasVertexColors] of materialHasVertexColors) {\n let material = model.GetMaterial (materialIndex);\n material.vertexColors = hasVertexColors;\n }\n }\n\n FinalizeMeshes (model)\n {\n for (let meshIndex = 0; meshIndex < model.MeshCount (); meshIndex++) {\n let mesh = model.GetMesh (meshIndex);\n let type = GetMeshType (mesh);\n if (type === MeshType.Empty) {\n model.RemoveMesh (meshIndex);\n meshIndex = meshIndex - 1;\n continue;\n }\n this.FinalizeMesh (model, mesh);\n }\n }\n\n FinalizeMesh (model, mesh)\n {\n function CalculateCurveNormals (mesh)\n {\n function AddAverageNormal (mesh, triangle, vertexIndex, triangleNormals, vertexToTriangles)\n {\n function IsNormalInArray (array, normal)\n {\n for (let i = 0; i < array.length; i++) {\n let current = array[i];\n if (CoordIsEqual3D (current, normal)) {\n return true;\n }\n }\n return false;\n }\n\n let averageNormals = [];\n let neigTriangles = vertexToTriangles.get (vertexIndex);\n for (let i = 0; i < neigTriangles.length; i++) {\n let neigIndex = neigTriangles[i];\n let neigTriangle = mesh.GetTriangle (neigIndex);\n if (triangle.curve === neigTriangle.curve) {\n let triangleNormal = triangleNormals[neigIndex];\n if (!IsNormalInArray (averageNormals, triangleNormal)) {\n averageNormals.push (triangleNormal);\n }\n }\n }\n\n let averageNormal = new Coord3D (0.0, 0.0, 0.0);\n for (let i = 0; i < averageNormals.length; i++) {\n averageNormal = AddCoord3D (averageNormal, averageNormals[i]);\n }\n averageNormal.MultiplyScalar (1.0 / averageNormals.length);\n averageNormal.Normalize ();\n return mesh.AddNormal (averageNormal);\n }\n\n let triangleNormals = [];\n let vertexToTriangles = new Map ();\n\n for (let vertexIndex = 0; vertexIndex < mesh.VertexCount (); vertexIndex++) {\n vertexToTriangles.set (vertexIndex, []);\n }\n\n for (let triangleIndex = 0; triangleIndex < mesh.TriangleCount (); triangleIndex++) {\n let triangle = mesh.GetTriangle (triangleIndex);\n let v0 = mesh.GetVertex (triangle.v0);\n let v1 = mesh.GetVertex (triangle.v1);\n let v2 = mesh.GetVertex (triangle.v2);\n let normal = CalculateTriangleNormal (v0, v1, v2);\n triangleNormals.push (normal);\n vertexToTriangles.get (triangle.v0).push (triangleIndex);\n vertexToTriangles.get (triangle.v1).push (triangleIndex);\n vertexToTriangles.get (triangle.v2).push (triangleIndex);\n }\n\n for (let triangleIndex = 0; triangleIndex < mesh.TriangleCount (); triangleIndex++) {\n let triangle = mesh.GetTriangle (triangleIndex);\n if (!triangle.HasNormals ()) {\n let n0 = AddAverageNormal (mesh, triangle, triangle.v0, triangleNormals, vertexToTriangles);\n let n1 = AddAverageNormal (mesh, triangle, triangle.v1, triangleNormals, vertexToTriangles);\n let n2 = AddAverageNormal (mesh, triangle, triangle.v2, triangleNormals, vertexToTriangles);\n triangle.SetNormals (n0, n1, n2);\n }\n }\n }\n\n let meshStatus = {\n calculateCurveNormals : false\n };\n\n for (let i = 0; i < mesh.TriangleCount (); i++) {\n let triangle = mesh.GetTriangle (i);\n this.FinalizeTriangle (mesh, triangle, meshStatus);\n\n if (triangle.mat === null) {\n triangle.mat = this.GetDefaultMaterialIndex (model);\n }\n }\n\n if (meshStatus.calculateCurveNormals) {\n CalculateCurveNormals (mesh);\n }\n }\n\n FinalizeTriangle (mesh, triangle, meshStatus)\n {\n if (!triangle.HasNormals ()) {\n if (triangle.curve === null || triangle.curve === 0) {\n let v0 = mesh.GetVertex (triangle.v0);\n let v1 = mesh.GetVertex (triangle.v1);\n let v2 = mesh.GetVertex (triangle.v2);\n let normal = CalculateTriangleNormal (v0, v1, v2);\n let normalIndex = mesh.AddNormal (normal);\n triangle.SetNormals (normalIndex, normalIndex, normalIndex);\n } else {\n meshStatus.calculateCurveNormals = true;\n }\n }\n\n if (triangle.curve === null) {\n triangle.curve = 0;\n }\n }\n\n FinalizeNodes (model)\n {\n let rootNode = model.GetRootNode ();\n\n let emptyNodes = [];\n rootNode.EnumerateChildren ((node) => {\n if (node.IsEmpty ()) {\n emptyNodes.push (node);\n }\n });\n\n for (let nodeIndex = 0; nodeIndex < emptyNodes.length; nodeIndex++) {\n let node = emptyNodes[nodeIndex];\n let parentNode = node.GetParent ();\n if (parentNode === null) {\n continue;\n }\n parentNode.RemoveChildNode (node);\n if (parentNode.IsEmpty ()) {\n emptyNodes.push (parentNode);\n }\n }\n }\n\n GetDefaultMaterialIndex (model)\n {\n if (this.defaultMaterialIndex === null) {\n let defaultMaterialColor = this.params.getDefaultMaterialColor ();\n let defaultMaterial = new PhongMaterial ();\n defaultMaterial.color = defaultMaterialColor;\n defaultMaterial.isDefault = true;\n this.defaultMaterialIndex = model.AddMaterial (defaultMaterial);\n }\n return this.defaultMaterialIndex;\n }\n\n Reset ()\n {\n this.defaultMaterialIndex = null;\n }\n}\n\nexport function FinalizeModel (model, params)\n{\n let finalizer = new ModelFinalizer (params);\n finalizer.Finalize (model);\n}\n\nexport function CheckModel (model)\n{\n function IsCorrectValue (val)\n {\n if (val === undefined || val === null) {\n return false;\n }\n return true;\n }\n\n function IsCorrectNumber (val)\n {\n if (!IsCorrectValue (val)) {\n return false;\n }\n if (isNaN (val)) {\n return false;\n }\n return true;\n }\n\n function IsCorrectIndex (val, count)\n {\n if (!IsCorrectNumber (val)) {\n return false;\n }\n if (val < 0 || val >= count) {\n return false;\n }\n return true;\n }\n\n function CheckMesh (model, mesh)\n {\n function CheckTriangle (model, mesh, triangle)\n {\n if (!IsCorrectIndex (triangle.v0, mesh.VertexCount ())) {\n return false;\n }\n if (!IsCorrectIndex (triangle.v1, mesh.VertexCount ())) {\n return false;\n }\n if (!IsCorrectIndex (triangle.v2, mesh.VertexCount ())) {\n return false;\n }\n if (triangle.HasVertexColors ()) {\n if (!IsCorrectIndex (triangle.c0, mesh.VertexColorCount ())) {\n return false;\n }\n if (!IsCorrectIndex (triangle.c1, mesh.VertexColorCount ())) {\n return false;\n }\n if (!IsCorrectIndex (triangle.c2, mesh.VertexColorCount ())) {\n return false;\n }\n }\n if (!IsCorrectIndex (triangle.n0, mesh.NormalCount ())) {\n return false;\n }\n if (!IsCorrectIndex (triangle.n1, mesh.NormalCount ())) {\n return false;\n }\n if (!IsCorrectIndex (triangle.n2, mesh.NormalCount ())) {\n return false;\n }\n if (triangle.HasTextureUVs ()) {\n if (!IsCorrectIndex (triangle.u0, mesh.TextureUVCount ())) {\n return false;\n }\n if (!IsCorrectIndex (triangle.u1, mesh.TextureUVCount ())) {\n return false;\n }\n if (!IsCorrectIndex (triangle.u2, mesh.TextureUVCount ())) {\n return false;\n }\n }\n if (!IsCorrectIndex (triangle.mat, model.MaterialCount ())) {\n return false;\n }\n if (!IsCorrectNumber (triangle.curve)) {\n return false;\n }\n\n return true;\n }\n\n for (let i = 0; i < mesh.VertexCount (); i++) {\n let vertex = mesh.GetVertex (i);\n if (!IsCorrectNumber (vertex.x)) {\n return false;\n }\n if (!IsCorrectNumber (vertex.y)) {\n return false;\n }\n if (!IsCorrectNumber (vertex.z)) {\n return false;\n }\n }\n\n for (let i = 0; i < mesh.VertexColorCount (); i++) {\n let color = mesh.GetVertexColor (i);\n if (!IsCorrectNumber (color.r)) {\n return false;\n }\n if (!IsCorrectNumber (color.g)) {\n return false;\n }\n if (!IsCorrectNumber (color.b)) {\n return false;\n }\n }\n\n for (let i = 0; i < mesh.NormalCount (); i++) {\n let normal = mesh.GetNormal (i);\n if (!IsCorrectNumber (normal.x)) {\n return false;\n }\n if (!IsCorrectNumber (normal.y)) {\n return false;\n }\n if (!IsCorrectNumber (normal.z)) {\n return false;\n }\n }\n\n for (let i = 0; i < mesh.TextureUVCount (); i++) {\n let uv = mesh.GetTextureUV (i);\n if (!IsCorrectNumber (uv.x)) {\n return false;\n }\n if (!IsCorrectNumber (uv.y)) {\n return false;\n }\n }\n\n for (let i = 0; i < mesh.TriangleCount (); i++) {\n let triangle = mesh.GetTriangle (i);\n if (!CheckTriangle (model, mesh, triangle)) {\n return false;\n }\n }\n\n return true;\n }\n\n for (let i = 0; i < model.MeshCount (); i++) {\n let mesh = model.GetMesh (i);\n if (!CheckMesh (model, mesh)) {\n return false;\n }\n }\n\n return true;\n}\n", "import { Direction } from '../geometry/geometry.js';\nimport { Model } from '../model/model.js';\nimport { FinalizeModel } from '../model/modelfinalization.js';\nimport { IsModelEmpty } from '../model/modelutils.js';\n\nexport class ImporterBase\n{\n constructor ()\n {\n this.name = null;\n this.extension = null;\n this.callbacks = null;\n this.model = null;\n this.error = null;\n this.message = null;\n }\n\n Import (name, extension, content, callbacks)\n {\n this.Clear ();\n\n this.name = name;\n this.extension = extension;\n this.callbacks = callbacks;\n this.model = new Model ();\n this.error = false;\n this.message = null;\n this.ResetContent ();\n this.ImportContent (content, () => {\n this.CreateResult (callbacks);\n });\n }\n\n Clear ()\n {\n this.name = null;\n this.extension = null;\n this.callbacks = null;\n this.model = null;\n this.error = null;\n this.message = null;\n this.ClearContent ();\n }\n\n CreateResult (callbacks)\n {\n if (this.error) {\n callbacks.onError ();\n callbacks.onComplete ();\n return;\n }\n\n if (IsModelEmpty (this.model)) {\n this.SetError ('The model doesn\\'t contain any meshes.');\n callbacks.onError ();\n callbacks.onComplete ();\n return;\n }\n\n FinalizeModel (this.model, {\n getDefaultMaterialColor : this.callbacks.getDefaultMaterialColor\n });\n\n callbacks.onSuccess ();\n callbacks.onComplete ();\n }\n\n CanImportExtension (extension)\n {\n return false;\n }\n\n GetUpDirection ()\n {\n return Direction.Z;\n }\n\n ClearContent ()\n {\n\n }\n\n ResetContent ()\n {\n\n }\n\n ImportContent (fileContent, onFinish)\n {\n\n }\n\n GetModel ()\n {\n return this.model;\n }\n\n SetError (message)\n {\n this.error = true;\n if (message !== undefined && message !== null) {\n this.message = message;\n }\n }\n\n WasError ()\n {\n return this.error;\n }\n\n GetErrorMessage ()\n {\n return this.message;\n }\n}\n", "import { IsLower } from '../geometry/geometry.js';\nimport { ColorToHexString } from '../model/color.js';\n\nexport function NameFromLine (line, startIndex, commentChar)\n{\n\tlet name = line.substring (startIndex);\n\tlet commentStart = name.indexOf (commentChar);\n\tif (commentStart !== -1) {\n\t\tname = name.substring (0, commentStart);\n\t}\n\treturn name.trim ();\n}\n\nexport function ParametersFromLine (line, commentChar)\n{\n\tif (commentChar !== null) {\n\t\tlet commentStart = line.indexOf (commentChar);\n\t\tif (commentStart !== -1) {\n\t\t\tline = line.substring (0, commentStart).trim ();\n\t\t}\n\t}\n\treturn line.split (/\\s+/u);\n}\n\nexport function ReadLines (str, onLine)\n{\n\tfunction LineFound (line, onLine)\n\t{\n\t\tlet trimmed = line.trim ();\n\t\tif (trimmed.length > 0) {\n\t\t\tonLine (trimmed);\n\t\t}\n\t}\n\n\tlet cursor = 0;\n\tlet next = str.indexOf ('\\n', cursor);\n\twhile (next !== -1) {\n\t\tLineFound (str.substring (cursor, next), onLine);\n\t\tcursor = next + 1;\n\t\tnext = str.indexOf ('\\n', cursor);\n\t}\n\tLineFound (str.substring (cursor), onLine);\n}\n\nexport function IsPowerOfTwo (x)\n{\n\treturn (x & (x - 1)) === 0;\n}\n\nexport function NextPowerOfTwo (x)\n{\n\tif (IsPowerOfTwo (x)) {\n\t\treturn x;\n\t}\n\tlet npot = Math.pow (2, Math.ceil (Math.log (x) / Math.log (2)));\n\treturn parseInt (npot, 10);\n}\n\nexport function UpdateMaterialTransparency (material)\n{\n\tmaterial.transparent = false;\n\tif (IsLower (material.opacity, 1.0)) {\n\t\tmaterial.transparent = true;\n\t}\n}\n\nexport class ColorToMaterialConverter\n{\n\tconstructor (createMaterialFunc)\n\t{\n\t\tthis.createMaterialFunc = createMaterialFunc;\n\t\tthis.colorToMaterialIndex = new Map ();\n\t}\n\n\tGetMaterialIndex (color)\n\t{\n\t\tlet colorKey = ColorToHexString (color);\n\t\tif (this.colorToMaterialIndex.has (colorKey)) {\n\t\t\treturn this.colorToMaterialIndex.get (colorKey);\n\t\t} else {\n\t\t\tlet materialIndex = this.createMaterialFunc (color);\n\t\t\tthis.colorToMaterialIndex.set (colorKey, materialIndex);\n\t\t\treturn materialIndex;\n\t\t}\n\t}\n}\n", "import { Direction } from '../geometry/geometry.js';\nimport { Matrix } from '../geometry/matrix.js';\nimport { Transformation } from '../geometry/transformation.js';\nimport { LoadExternalLibrary } from '../io/externallibs.js';\nimport { GetFileName } from '../io/fileutils.js';\nimport { PhongMaterial, PhysicalMaterial } from '../model/material.js';\nimport { TransformMesh } from '../model/meshutils.js';\nimport { IsModelEmpty } from '../model/modelutils.js';\nimport { Property, PropertyGroup, PropertyType } from '../model/property.js';\nimport { ConvertThreeGeometryToMesh } from '../threejs/threeutils.js';\nimport { ImporterBase } from './importerbase.js';\nimport { UpdateMaterialTransparency } from './importerutils.js';\nimport { TextureMap } from '../model/material.js';\n\nexport class Importer3dm extends ImporterBase\n{\n constructor ()\n {\n super ();\n this.rhino = null;\n }\n\n CanImportExtension (extension)\n {\n return extension === '3dm';\n }\n\n GetUpDirection ()\n {\n return Direction.Z;\n }\n\n ClearContent ()\n {\n this.instanceIdToObject = null;\n this.instanceIdToDefinition = null;\n }\n\n ResetContent ()\n {\n this.instanceIdToObject = new Map ();\n this.instanceIdToDefinition = new Map ();\n }\n\n ImportContent (fileContent, onFinish)\n {\n if (this.rhino === null) {\n LoadExternalLibrary ('loaders/rhino3dm.min.js').then (() => {\n rhino3dm ().then ((rhino) => {\n this.rhino = rhino;\n this.ImportRhinoContent (fileContent);\n onFinish ();\n });\n }).catch (() => {\n this.SetError ('Failed to load rhino3dm.');\n onFinish ();\n });\n } else {\n this.ImportRhinoContent (fileContent);\n onFinish ();\n }\n }\n\n ImportRhinoContent (fileContent)\n {\n let rhinoDoc = this.rhino.File3dm.fromByteArray (fileContent);\n if (rhinoDoc === null) {\n this.SetError ('Failed to read Rhino file.');\n return;\n }\n this.ImportRhinoDocument (rhinoDoc);\n if (IsModelEmpty (this.model)) {\n this.SetError ('The model doesn\\'t contain any 3D meshes. Try to save the model while you are in shaded view in Rhino.');\n }\n }\n\n ImportRhinoDocument (rhinoDoc)\n {\n this.InitRhinoInstances (rhinoDoc);\n this.ImportRhinoUserStrings (rhinoDoc);\n this.ImportRhinoGeometry (rhinoDoc);\n }\n\n InitRhinoInstances (rhinoDoc)\n {\n let rhinoObjects = rhinoDoc.objects ();\n for (let i = 0; i < rhinoObjects.count; i++) {\n let rhinoObject = rhinoObjects.get (i);\n let rhinoAttributes = rhinoObject.attributes ();\n if (rhinoAttributes.isInstanceDefinitionObject) {\n this.instanceIdToObject.set (rhinoAttributes.id, rhinoObject);\n }\n }\n let rhinoInstanceDefinitions = rhinoDoc.instanceDefinitions ();\n for (let i = 0; i < rhinoInstanceDefinitions.count (); i++) {\n let rhinoInstanceDefinition = rhinoInstanceDefinitions.get (i);\n this.instanceIdToDefinition.set (rhinoInstanceDefinition.id, rhinoInstanceDefinition);\n }\n }\n\n ImportRhinoUserStrings (rhinoDoc)\n {\n let docStrings = rhinoDoc.strings ();\n if (docStrings.count () > 0) {\n let propertyGroup = new PropertyGroup ('Document user texts');\n for (let i = 0; i < docStrings.count (); i++) {\n let docString = docStrings.get (i);\n propertyGroup.AddProperty (new Property (PropertyType.Text, docString[0], docString[1]));\n }\n this.model.AddPropertyGroup (propertyGroup);\n }\n }\n\n ImportRhinoGeometry (rhinoDoc)\n {\n let rhinoObjects = rhinoDoc.objects ();\n for (let i = 0; i < rhinoObjects.count; i++) {\n let rhinoObject = rhinoObjects.get (i);\n this.ImportRhinoGeometryObject (rhinoDoc, rhinoObject, []);\n }\n }\n\n ImportRhinoGeometryObject (rhinoDoc, rhinoObject, rhinoInstanceReferences)\n {\n let rhinoGeometry = rhinoObject.geometry ();\n let rhinoAttributes = rhinoObject.attributes ();\n\n let objectType = rhinoGeometry.objectType;\n if (rhinoAttributes.isInstanceDefinitionObject && rhinoInstanceReferences.length === 0) {\n return;\n }\n\n let rhinoMesh = null;\n let deleteMesh = false;\n\n if (objectType === this.rhino.ObjectType.Mesh) {\n rhinoMesh = rhinoGeometry;\n deleteMesh = false;\n } else if (objectType === this.rhino.ObjectType.Extrusion) {\n rhinoMesh = rhinoGeometry.getMesh (this.rhino.MeshType.Any);\n deleteMesh = true;\n } else if (objectType === this.rhino.ObjectType.Brep) {\n rhinoMesh = new this.rhino.Mesh ();\n let faces = rhinoGeometry.faces ();\n for (let i = 0; i < faces.count; i++) {\n let face = faces.get (i);\n let mesh = face.getMesh (this.rhino.MeshType.Any);\n if (mesh) {\n rhinoMesh.append (mesh);\n mesh.delete ();\n }\n face.delete ();\n }\n faces.delete ();\n rhinoMesh.compact ();\n deleteMesh = true;\n } else if (objectType === this.rhino.ObjectType.SubD) {\n rhinoGeometry.subdivide (3);\n rhinoMesh = this.rhino.Mesh.createFromSubDControlNet (rhinoGeometry);\n deleteMesh = true;\n } else if (objectType === this.rhino.ObjectType.InstanceReference) {\n let parentDefinitionId = rhinoGeometry.parentIdefId;\n if (this.instanceIdToDefinition.has (parentDefinitionId)) {\n let instanceDefinition = this.instanceIdToDefinition.get (parentDefinitionId);\n let instanceObjectIds = instanceDefinition.getObjectIds ();\n for (let i = 0; i < instanceObjectIds.length; i++) {\n let instanceObjectId = instanceObjectIds[i];\n if (this.instanceIdToObject.has (instanceObjectId)) {\n let instanceObject = this.instanceIdToObject.get (instanceObjectId);\n rhinoInstanceReferences.push (rhinoObject);\n this.ImportRhinoGeometryObject (rhinoDoc, instanceObject, rhinoInstanceReferences);\n rhinoInstanceReferences.pop ();\n }\n }\n }\n }\n\n if (rhinoMesh !== null) {\n this.ImportRhinoMesh (rhinoDoc, rhinoMesh, rhinoObject, rhinoInstanceReferences);\n if (deleteMesh) {\n rhinoMesh.delete ();\n }\n }\n }\n\n ImportRhinoMesh (rhinoDoc, rhinoMesh, rhinoObject, rhinoInstanceReferences)\n {\n let rhinoAttributes = rhinoObject.attributes ();\n\n let materialIndex = this.GetMaterialIndex (rhinoDoc, rhinoObject, rhinoInstanceReferences);\n let threeJson = rhinoMesh.toThreejsJSON ();\n let mesh = ConvertThreeGeometryToMesh (threeJson.data, materialIndex);\n mesh.SetName (rhinoAttributes.name);\n\n let userStrings = rhinoAttributes.getUserStrings ();\n if (userStrings.length > 0) {\n let propertyGroup = new PropertyGroup ('User texts');\n for (let i = 0; i < userStrings.length; i++) {\n let userString = userStrings[i];\n propertyGroup.AddProperty (new Property (PropertyType.Text, userString[0], userString[1]));\n }\n mesh.AddPropertyGroup (propertyGroup);\n }\n\n if (rhinoInstanceReferences.length !== 0) {\n let matrix = new Matrix ().CreateIdentity ();\n for (let i = rhinoInstanceReferences.length - 1; i >= 0; i--) {\n let rhinoInstanceReference = rhinoInstanceReferences[i];\n let rhinoInstanceReferenceGeometry = rhinoInstanceReference.geometry ();\n let rhinoInstanceReferenceMatrix = rhinoInstanceReferenceGeometry.xform.toFloatArray (false);\n let transformationMatrix = new Matrix (rhinoInstanceReferenceMatrix);\n matrix = matrix.MultiplyMatrix (transformationMatrix);\n }\n let transformation = new Transformation (matrix);\n TransformMesh (mesh, transformation);\n }\n this.model.AddMeshToRootNode (mesh);\n }\n\n GetMaterialIndex (rhinoDoc, rhinoObject, rhinoInstanceReferences)\n {\n function GetRhinoMaterial (rhino, rhinoObject, rhinoInstanceReferences)\n {\n let rhinoAttributes = rhinoObject.attributes ();\n if (rhinoAttributes.materialSource === rhino.ObjectMaterialSource.MaterialFromObject) {\n let materialIndex = rhinoAttributes.materialIndex;\n if (materialIndex > -1) {\n return rhinoDoc.materials ().get (materialIndex);\n }\n } else if (rhinoAttributes.materialSource === rhino.ObjectMaterialSource.MaterialFromLayer) {\n let layerIndex = rhinoAttributes.layerIndex;\n if (layerIndex > -1) {\n let layer = rhinoDoc.layers ().get (layerIndex);\n let layerMaterialIndex = layer.renderMaterialIndex;\n if (layerMaterialIndex > -1) {\n return rhinoDoc.materials ().get (layerMaterialIndex);\n }\n }\n } else if (rhinoAttributes.materialSource === rhino.ObjectMaterialSource.MaterialFromParent) {\n if (rhinoInstanceReferences.length !== 0) {\n return GetRhinoMaterial (rhino, rhinoInstanceReferences[0], []);\n }\n }\n return null;\n }\n\n function ConvertRhinoMaterial (rhinoMaterial, callbacks)\n {\n function SetColor (color, rhinoColor)\n {\n color.Set (rhinoColor.r, rhinoColor.g, rhinoColor.b);\n }\n\n function IsBlack (rhinoColor)\n {\n return rhinoColor.r === 0 && rhinoColor.g === 0 && rhinoColor.b === 0;\n }\n\n function IsWhite (rhinoColor)\n {\n return rhinoColor.r === 255 && rhinoColor.g === 255 && rhinoColor.b === 255;\n }\n\n let material = null;\n let physicallyBased = rhinoMaterial.physicallyBased ();\n if (physicallyBased.supported) {\n material = new PhysicalMaterial ();\n material.metalness = physicallyBased.metallic ? 1.0 : 0.0;\n material.roughness = physicallyBased.roughness;\n } else {\n material = new PhongMaterial ();\n SetColor (material.ambient, rhinoMaterial.ambientColor);\n SetColor (material.specular, rhinoMaterial.specularColor);\n }\n\n material.name = rhinoMaterial.name;\n\n SetColor (material.color, rhinoMaterial.diffuseColor);\n material.opacity = 1.0 - rhinoMaterial.transparency;\n UpdateMaterialTransparency (material);\n\n if (IsBlack (material.color) && !IsWhite (rhinoMaterial.reflectionColor)) {\n SetColor (material.color, rhinoMaterial.reflectionColor);\n }\n if (IsBlack (material.color) && !IsWhite (rhinoMaterial.transparentColor)) {\n SetColor (material.color, rhinoMaterial.transparentColor);\n }\n\n let rhinoTexture = rhinoMaterial.getBitmapTexture ();\n if (rhinoTexture) {\n let texture = new TextureMap ();\n let textureName = GetFileName (rhinoTexture.fileName);\n let textureBuffer = callbacks.getTextureBuffer (textureName);\n texture.name = textureName;\n if (textureBuffer !== null) {\n texture.url = textureBuffer.url;\n texture.buffer = textureBuffer.buffer;\n }\n material.diffuseMap = texture;\n }\n\n return material;\n }\n\n function FindMatchingMaterial (model, rhinoMaterial, callbacks)\n {\n let material = ConvertRhinoMaterial (rhinoMaterial, callbacks);\n for (let i = 0; i < model.MaterialCount (); i++) {\n let current = model.GetMaterial (i);\n if (current.IsEqual (material)) {\n return i;\n }\n }\n return model.AddMaterial (material);\n }\n\n let rhinoMaterial = GetRhinoMaterial (this.rhino, rhinoObject, rhinoInstanceReferences);\n if (rhinoMaterial === null) {\n return null;\n }\n return FindMatchingMaterial (this.model, rhinoMaterial, this.callbacks);\n }\n}\n", "export class BinaryReader\n{\n constructor (arrayBuffer, isLittleEndian)\n {\n this.arrayBuffer = arrayBuffer;\n this.dataView = new DataView (arrayBuffer);\n this.isLittleEndian = isLittleEndian;\n this.position = 0;\n }\n\n GetPosition ()\n {\n return this.position;\n }\n\n SetPosition (position)\n {\n this.position = position;\n }\n\n GetByteLength ()\n {\n return this.arrayBuffer.byteLength;\n }\n\n Skip (bytes)\n {\n this.position = this.position + bytes;\n }\n\n End ()\n {\n return this.position >= this.arrayBuffer.byteLength;\n }\n\n ReadArrayBuffer (byteLength)\n {\n let originalBufferView = new Uint8Array (this.arrayBuffer);\n let arrayBuffer = new ArrayBuffer (byteLength);\n let bufferView = new Uint8Array (arrayBuffer);\n let subArray = originalBufferView.subarray (this.position, this.position + byteLength);\n bufferView.set (subArray, 0);\n this.position += byteLength;\n return arrayBuffer;\n }\n\n ReadBoolean8 ()\n {\n let result = this.dataView.getInt8 (this.position);\n this.position = this.position + 1;\n return result ? true : false;\n }\n\n ReadCharacter8 ()\n {\n let result = this.dataView.getInt8 (this.position);\n this.position = this.position + 1;\n return result;\n }\n\n ReadUnsignedCharacter8 ()\n {\n let result = this.dataView.getUint8 (this.position);\n this.position = this.position + 1;\n return result;\n }\n\n ReadInteger16 ()\n {\n let result = this.dataView.getInt16 (this.position, this.isLittleEndian);\n this.position = this.position + 2;\n return result;\n }\n\n ReadUnsignedInteger16 ()\n {\n let result = this.dataView.getUint16 (this.position, this.isLittleEndian);\n this.position = this.position + 2;\n return result;\n }\n\n ReadInteger32 ()\n {\n let result = this.dataView.getInt32 (this.position, this.isLittleEndian);\n this.position = this.position + 4;\n return result;\n }\n\n ReadUnsignedInteger32 ()\n {\n let result = this.dataView.getUint32 (this.position, this.isLittleEndian);\n this.position = this.position + 4;\n return result;\n }\n\n ReadFloat32 ()\n {\n let result = this.dataView.getFloat32 (this.position, this.isLittleEndian);\n this.position = this.position + 4;\n return result;\n }\n\n ReadDouble64 ()\n {\n let result = this.dataView.getFloat64 (this.position, this.isLittleEndian);\n this.position = this.position + 8;\n return result;\n }\n}\n", "import { Coord2D } from '../geometry/coord2d.js';\nimport { ArrayToCoord3D, Coord3D } from '../geometry/coord3d.js';\nimport { DegRad, Direction, IsNegative } from '../geometry/geometry.js';\nimport { Matrix } from '../geometry/matrix.js';\nimport { ArrayToQuaternion } from '../geometry/quaternion.js';\nimport { Transformation } from '../geometry/transformation.js';\nimport { BinaryReader } from '../io/binaryreader.js';\nimport { Color, ColorComponentFromFloat } from '../model/color.js';\nimport { PhongMaterial, TextureMap } from '../model/material.js';\nimport { Mesh } from '../model/mesh.js';\nimport { FlipMeshTrianglesOrientation, TransformMesh } from '../model/meshutils.js';\nimport { Node, NodeType } from '../model/node.js';\nimport { Triangle } from '../model/triangle.js';\nimport { ImporterBase } from './importerbase.js';\nimport { UpdateMaterialTransparency } from './importerutils.js';\n\nconst CHUNK3DS =\n{\n MAIN3DS : 0x4D4D,\n EDIT3DS : 0x3D3D,\n EDIT_MATERIAL : 0xAFFF,\n MAT_NAME : 0xA000,\n MAT_AMBIENT : 0xA010,\n MAT_DIFFUSE : 0xA020,\n MAT_SPECULAR : 0xA030,\n MAT_SHININESS : 0xA040,\n MAT_SHININESS_STRENGTH : 0xA041,\n MAT_TRANSPARENCY : 0xA050,\n MAT_COLOR_F : 0x0010,\n MAT_COLOR : 0x0011,\n MAT_LIN_COLOR : 0x0012,\n MAT_LIN_COLOR_F : 0x0013,\n MAT_TEXMAP : 0xA200,\n MAT_TEXMAP_NAME : 0xA300,\n MAT_TEXMAP_UOFFSET : 0xA358,\n MAT_TEXMAP_VOFFSET : 0xA35A,\n MAT_TEXMAP_USCALE : 0xA354,\n MAT_TEXMAP_VSCALE : 0xA356,\n MAT_TEXMAP_ROTATION : 0xA35C,\n PERCENTAGE : 0x0030,\n PERCENTAGE_F : 0x0031,\n EDIT_OBJECT : 0x4000,\n OBJ_TRIMESH : 0x4100,\n OBJ_LIGHT : 0x4600,\n OBJ_CAMERA : 0x4700,\n TRI_VERTEX : 0x4110,\n TRI_TEXVERTEX : 0x4140,\n TRI_FACE : 0x4120,\n TRI_TRANSFORMATION : 0x4160,\n TRI_MATERIAL : 0x4130,\n TRI_SMOOTH : 0x4150,\n KF3DS : 0xB000,\n OBJECT_NODE : 0xB002,\n OBJECT_HIERARCHY : 0xB010,\n OBJECT_INSTANCE_NAME : 0xB011,\n OBJECT_PIVOT : 0xB013,\n OBJECT_POSITION : 0xB020,\n OBJECT_ROTATION : 0xB021,\n OBJECT_SCALE : 0xB022,\n OBJECT_ID : 0xB030\n};\n\nclass Importer3dsNode\n{\n constructor ()\n {\n this.id = -1;\n this.name = '';\n this.flags = -1;\n this.parentId = -1;\n this.instanceName = '';\n this.pivot = [0.0, 0.0, 0.0];\n this.positions = [];\n this.rotations = [];\n this.scales = [];\n }\n}\n\nclass Importer3dsNodeList\n{\n constructor ()\n {\n this.nodes = [];\n this.nodeIdToNode = new Map ();\n }\n\n IsEmpty ()\n {\n return this.nodes.length === 0;\n }\n\n AddNode (node)\n {\n this.nodes.push (node);\n this.nodeIdToNode.set (node.nodeId, node);\n }\n\n GetNodes ()\n {\n return this.nodes;\n }\n}\n\nexport class Importer3ds extends ImporterBase\n{\n constructor ()\n {\n super ();\n }\n\n CanImportExtension (extension)\n {\n return extension === '3ds';\n }\n\n GetUpDirection ()\n {\n return Direction.Z;\n }\n\n ClearContent ()\n {\n this.materialNameToIndex = null;\n this.meshNameToIndex = null;\n this.nodeList = null;\n }\n\n ResetContent ()\n {\n this.materialNameToIndex = new Map ();\n this.meshNameToIndex = new Map ();\n this.nodeList = new Importer3dsNodeList ();\n }\n\n ImportContent (fileContent, onFinish)\n {\n this.ProcessBinary (fileContent);\n onFinish ();\n }\n\n ProcessBinary (fileContent)\n {\n let reader = new BinaryReader (fileContent, true);\n let endByte = reader.GetByteLength ();\n this.ReadChunks (reader, endByte, (chunkId, chunkLength) => {\n if (chunkId === CHUNK3DS.MAIN3DS) {\n this.ReadMainChunk (reader, chunkLength);\n } else {\n this.SkipChunk (reader, chunkLength);\n }\n });\n }\n\n ReadMainChunk (reader, length)\n {\n let endByte = this.GetChunkEnd (reader, length);\n this.ReadChunks (reader, endByte, (chunkId, chunkLength) => {\n if (chunkId === CHUNK3DS.EDIT3DS) {\n this.ReadEditorChunk (reader, chunkLength);\n } else if (chunkId === CHUNK3DS.KF3DS) {\n this.ReadKeyFrameChunk (reader, chunkLength);\n } else {\n this.SkipChunk (reader, chunkLength);\n }\n });\n this.BuildNodeHierarchy ();\n }\n\n ReadEditorChunk (reader, length)\n {\n let endByte = this.GetChunkEnd (reader, length);\n this.ReadChunks (reader, endByte, (chunkId, chunkLength) => {\n if (chunkId === CHUNK3DS.EDIT_MATERIAL) {\n this.ReadMaterialChunk (reader, chunkLength);\n } else if (chunkId === CHUNK3DS.EDIT_OBJECT) {\n this.ReadObjectChunk (reader, chunkLength);\n } else {\n this.SkipChunk (reader, chunkLength);\n }\n });\n }\n\n ReadMaterialChunk (reader, length)\n {\n let material = new PhongMaterial ();\n let endByte = this.GetChunkEnd (reader, length);\n let shininess = null;\n let shininessStrength = null;\n this.ReadChunks (reader, endByte, (chunkId, chunkLength) => {\n if (chunkId === CHUNK3DS.MAT_NAME) {\n material.name = this.ReadName (reader);\n } else if (chunkId === CHUNK3DS.MAT_AMBIENT) {\n material.ambient = this.ReadColorChunk (reader, chunkLength);\n } else if (chunkId === CHUNK3DS.MAT_DIFFUSE) {\n material.color = this.ReadColorChunk (reader, chunkLength);\n } else if (chunkId === CHUNK3DS.MAT_SPECULAR) {\n material.specular = this.ReadColorChunk (reader, chunkLength);\n } else if (chunkId === CHUNK3DS.MAT_SHININESS) {\n shininess = this.ReadPercentageChunk (reader, chunkLength);\n } else if (chunkId === CHUNK3DS.MAT_SHININESS_STRENGTH) {\n shininessStrength = this.ReadPercentageChunk (reader, chunkLength);\n } else if (chunkId === CHUNK3DS.MAT_TRANSPARENCY) {\n material.opacity = 1.0 - this.ReadPercentageChunk (reader, chunkLength);\n UpdateMaterialTransparency (material);\n } else if (chunkId === CHUNK3DS.MAT_TEXMAP) {\n material.diffuseMap = this.ReadTextureMapChunk (reader, chunkLength);\n UpdateMaterialTransparency (material);\n } else {\n this.SkipChunk (reader, chunkLength);\n }\n });\n\n if (shininess !== null && shininessStrength !== null) {\n material.shininess = shininess * shininessStrength / 10.0;\n }\n let materialIndex = this.model.AddMaterial (material);\n this.materialNameToIndex.set (material.name, materialIndex);\n }\n\n ReadTextureMapChunk (reader, length)\n {\n let texture = new TextureMap ();\n let endByte = this.GetChunkEnd (reader, length);\n this.ReadChunks (reader, endByte, (chunkId, chunkLength) => {\n if (chunkId === CHUNK3DS.MAT_TEXMAP_NAME) {\n let textureName = this.ReadName (reader);\n let textureBuffer = this.callbacks.getTextureBuffer (textureName);\n texture.name = textureName;\n if (textureBuffer !== null) {\n texture.url = textureBuffer.url;\n texture.buffer = textureBuffer.buffer;\n }\n } else if (chunkId === CHUNK3DS.MAT_TEXMAP_UOFFSET) {\n texture.offset.x = reader.ReadFloat32 ();\n } else if (chunkId === CHUNK3DS.MAT_TEXMAP_VOFFSET) {\n texture.offset.y = reader.ReadFloat32 ();\n } else if (chunkId === CHUNK3DS.MAT_TEXMAP_USCALE) {\n texture.scale.x = reader.ReadFloat32 ();\n } else if (chunkId === CHUNK3DS.MAT_TEXMAP_VSCALE) {\n texture.scale.y = reader.ReadFloat32 ();\n } else if (chunkId === CHUNK3DS.MAT_TEXMAP_ROTATION) {\n texture.rotation = reader.ReadFloat32 () * DegRad;\n } else {\n this.SkipChunk (reader, chunkLength);\n }\n });\n return texture;\n }\n\n ReadColorChunk (reader, length)\n {\n let color = new Color (0, 0, 0);\n let endByte = this.GetChunkEnd (reader, length);\n let hasLinColor = false;\n this.ReadChunks (reader, endByte, (chunkId, chunkLength) => {\n if (chunkId === CHUNK3DS.MAT_COLOR) {\n if (!hasLinColor) {\n color.r = reader.ReadUnsignedCharacter8 ();\n color.g = reader.ReadUnsignedCharacter8 ();\n color.b = reader.ReadUnsignedCharacter8 ();\n }\n } else if (chunkId === CHUNK3DS.MAT_LIN_COLOR) {\n color.r = reader.ReadUnsignedCharacter8 ();\n color.g = reader.ReadUnsignedCharacter8 ();\n color.b = reader.ReadUnsignedCharacter8 ();\n hasLinColor = true;\n } else if (chunkId === CHUNK3DS.MAT_COLOR_F) {\n if (!hasLinColor) {\n color.r = ColorComponentFromFloat (reader.ReadFloat32 ());\n color.g = ColorComponentFromFloat (reader.ReadFloat32 ());\n color.b = ColorComponentFromFloat (reader.ReadFloat32 ());\n }\n } else if (chunkId === CHUNK3DS.MAT_LIN_COLOR_F) {\n color.r = ColorComponentFromFloat (reader.ReadFloat32 ());\n color.g = ColorComponentFromFloat (reader.ReadFloat32 ());\n color.b = ColorComponentFromFloat (reader.ReadFloat32 ());\n hasLinColor = true;\n } else {\n this.SkipChunk (reader, chunkLength);\n }\n });\n return color;\n }\n\n ReadPercentageChunk (reader, length)\n {\n let percentage = 0.0;\n let endByte = this.GetChunkEnd (reader, length);\n this.ReadChunks (reader, endByte, (chunkId, chunkLength) => {\n if (chunkId === CHUNK3DS.PERCENTAGE) {\n percentage = reader.ReadUnsignedInteger16 () / 100.0;\n } else if (chunkId === CHUNK3DS.PERCENTAGE_F) {\n percentage = reader.ReadFloat32 ();\n } else {\n this.SkipChunk (reader, chunkLength);\n }\n });\n return percentage;\n }\n\n ReadObjectChunk (reader, length)\n {\n let endByte = this.GetChunkEnd (reader, length);\n let objectName = this.ReadName (reader);\n this.ReadChunks (reader, endByte, (chunkId, chunkLength) => {\n if (chunkId === CHUNK3DS.OBJ_TRIMESH) {\n this.ReadMeshChunk (reader, chunkLength, objectName);\n } else {\n this.SkipChunk (reader, chunkLength);\n }\n });\n }\n\n ReadMeshChunk (reader, length, objectName)\n {\n function ApplyMeshTransformation (mesh, meshMatrix)\n {\n if (!meshMatrix.IsValid ()) {\n return;\n }\n\n let determinant = meshMatrix.Determinant ();\n let mirrorByX = IsNegative (determinant);\n if (mirrorByX) {\n let scaleMatrix = new Matrix ().CreateScale (-1.0, 1.0, 1.0);\n meshMatrix = scaleMatrix.MultiplyMatrix (meshMatrix);\n }\n\n let invMeshMatrix = meshMatrix.Invert ();\n if (invMeshMatrix === null) {\n return;\n }\n\n let transformation = new Transformation (invMeshMatrix);\n TransformMesh (mesh, transformation);\n if (mirrorByX) {\n FlipMeshTrianglesOrientation (mesh);\n }\n }\n\n let mesh = new Mesh ();\n mesh.SetName (objectName);\n\n let endByte = this.GetChunkEnd (reader, length);\n let matrixElements = null;\n this.ReadChunks (reader, endByte, (chunkId, chunkLength) => {\n if (chunkId === CHUNK3DS.TRI_VERTEX) {\n this.ReadVerticesChunk (mesh, reader);\n } else if (chunkId === CHUNK3DS.TRI_TEXVERTEX) {\n this.ReadTextureVerticesChunk (mesh, reader);\n } else if (chunkId === CHUNK3DS.TRI_FACE) {\n this.ReadFacesChunk (mesh, reader, chunkLength);\n } else if (chunkId === CHUNK3DS.TRI_TRANSFORMATION) {\n matrixElements = this.ReadTransformationChunk (reader);\n } else {\n this.SkipChunk (reader, chunkLength);\n }\n });\n\n if (mesh.VertexCount () === mesh.TextureUVCount ()) {\n for (let i = 0; i < mesh.TriangleCount (); i++) {\n let triangle = mesh.GetTriangle (i);\n triangle.SetTextureUVs (\n triangle.v0,\n triangle.v1,\n triangle.v2\n );\n }\n }\n\n let meshMatrix = new Matrix (matrixElements);\n ApplyMeshTransformation (mesh, meshMatrix);\n\n let meshIndex = this.model.AddMesh (mesh);\n this.meshNameToIndex.set (mesh.GetName (), meshIndex);\n }\n\n ReadVerticesChunk (mesh, reader)\n {\n let vertexCount = reader.ReadUnsignedInteger16 ();\n for (let i = 0; i < vertexCount; i++) {\n let x = reader.ReadFloat32 ();\n let y = reader.ReadFloat32 ();\n let z = reader.ReadFloat32 ();\n mesh.AddVertex (new Coord3D (x, y, z));\n }\n }\n\n ReadTextureVerticesChunk (mesh, reader)\n {\n let texVertexCount = reader.ReadUnsignedInteger16 ();\n for (let i = 0; i < texVertexCount; i++) {\n let x = reader.ReadFloat32 ();\n let y = reader.ReadFloat32 ();\n mesh.AddTextureUV (new Coord2D (x, y));\n }\n }\n\n ReadFacesChunk (mesh, reader, length)\n {\n let endByte = this.GetChunkEnd (reader, length);\n let faceCount = reader.ReadUnsignedInteger16 ();\n for (let i = 0; i < faceCount; i++) {\n let v0 = reader.ReadUnsignedInteger16 ();\n let v1 = reader.ReadUnsignedInteger16 ();\n let v2 = reader.ReadUnsignedInteger16 ();\n reader.ReadUnsignedInteger16 (); // flags\n mesh.AddTriangle (new Triangle (v0, v1, v2));\n }\n\n this.ReadChunks (reader, endByte, (chunkId, chunkLength) => {\n if (chunkId === CHUNK3DS.TRI_MATERIAL) {\n this.ReadFaceMaterialsChunk (mesh, reader);\n } else if (chunkId === CHUNK3DS.TRI_SMOOTH) {\n this.ReadFaceSmoothingGroupsChunk (mesh, faceCount, reader);\n } else {\n this.SkipChunk (reader, chunkLength);\n }\n });\n }\n\n ReadFaceMaterialsChunk (mesh, reader)\n {\n let materialName = this.ReadName (reader);\n let materialIndex = this.materialNameToIndex.get (materialName);\n let faceCount = reader.ReadUnsignedInteger16 ();\n for (let i = 0; i < faceCount; i++) {\n let faceIndex = reader.ReadUnsignedInteger16 ();\n let triangle = mesh.GetTriangle (faceIndex);\n if (materialIndex !== undefined) {\n triangle.mat = materialIndex;\n }\n }\n }\n\n ReadFaceSmoothingGroupsChunk (mesh, faceCount, reader)\n {\n for (let i = 0; i < faceCount; i++) {\n let smoothingGroup = reader.ReadUnsignedInteger32 ();\n let triangle = mesh.GetTriangle (i);\n triangle.curve = smoothingGroup;\n }\n }\n\n ReadTransformationChunk (reader)\n {\n let matrix = [];\n for (let i = 0; i < 4; i++) {\n for (let j = 0; j < 3; j++) {\n matrix.push (reader.ReadFloat32 ());\n }\n if (i < 3) {\n matrix.push (0);\n } else {\n matrix.push (1);\n }\n }\n return matrix;\n }\n\n ReadKeyFrameChunk (reader, length)\n {\n let endByte = this.GetChunkEnd (reader, length);\n this.ReadChunks (reader, endByte, (chunkId, chunkLength) => {\n if (chunkId === CHUNK3DS.OBJECT_NODE) {\n this.ReadObjectNodeChunk (reader, chunkLength);\n } else {\n this.SkipChunk (reader, chunkLength);\n }\n });\n }\n\n BuildNodeHierarchy ()\n {\n function GetNodeTransformation (node3ds, isMeshNode)\n {\n function GetNodePosition (node3ds)\n {\n if (node3ds.positions.length === 0) {\n return [0.0, 0.0, 0.0];\n }\n return node3ds.positions[0];\n }\n\n function GetNodeRotation (node3ds)\n {\n function GetQuaternionFromAxisAndAngle (axisAngle)\n {\n let result = [0.0, 0.0, 0.0, 1.0];\n let length = Math.sqrt (axisAngle[0] * axisAngle[0] + axisAngle[1] * axisAngle[1] + axisAngle[2] * axisAngle[2]);\n if (length > 0.0) {\n let omega = axisAngle[3] * -0.5;\n let si = Math.sin (omega) / length;\n result = [si * axisAngle[0], si * axisAngle[1], si * axisAngle[2], Math.cos (omega)];\n }\n return result;\n }\n\n if (node3ds.rotations.length === 0) {\n return [0.0, 0.0, 0.0, 1.0];\n }\n\n let rotation = node3ds.rotations[0];\n return GetQuaternionFromAxisAndAngle (rotation);\n }\n\n function GetNodeScale (node3ds)\n {\n if (node3ds.scales.length === 0) {\n return [1.0, 1.0, 1.0];\n }\n return node3ds.scales[0];\n }\n\n let matrix = new Matrix ();\n matrix.ComposeTRS (\n ArrayToCoord3D (GetNodePosition (node3ds)),\n ArrayToQuaternion (GetNodeRotation (node3ds)),\n ArrayToCoord3D (GetNodeScale (node3ds))\n );\n\n if (isMeshNode) {\n let pivotPoint = node3ds.pivot;\n let pivotMatrix = new Matrix ().CreateTranslation (-pivotPoint[0], -pivotPoint[1], -pivotPoint[2]);\n matrix = pivotMatrix.MultiplyMatrix (matrix);\n }\n\n return new Transformation (matrix);\n }\n\n let rootNode = this.model.GetRootNode ();\n if (this.nodeList.IsEmpty ()) {\n for (let meshIndex = 0; meshIndex < this.model.MeshCount (); meshIndex++) {\n rootNode.AddMeshIndex (meshIndex);\n }\n } else {\n let nodeIdToModelNode = new Map ();\n for (let node3ds of this.nodeList.GetNodes ()) {\n let node = new Node ();\n if (node3ds.name.length > 0 && node3ds.name !== '$$$DUMMY') {\n node.SetName (node3ds.name);\n if (node3ds.instanceName.length > 0) {\n node.SetName (node.GetName () + ' ' + node3ds.instanceName);\n }\n }\n if (node3ds.parentId === 65535 || !nodeIdToModelNode.has (node3ds.parentId)) {\n rootNode.AddChildNode (node);\n } else {\n let parentNode = nodeIdToModelNode.get (node3ds.parentId);\n parentNode.AddChildNode (node);\n }\n nodeIdToModelNode.set (node3ds.id, node);\n let isMeshNode = this.meshNameToIndex.has (node3ds.name);\n node.SetTransformation (GetNodeTransformation (node3ds, isMeshNode));\n if (isMeshNode) {\n node.SetType (NodeType.MeshNode);\n node.AddMeshIndex (this.meshNameToIndex.get (node3ds.name));\n }\n }\n }\n }\n\n ReadObjectNodeChunk (reader, length)\n {\n function ReadTrackVector (obj, reader, type)\n {\n let result = [];\n reader.Skip (10);\n\n let keyNum = reader.ReadInteger32 ();\n for (let i = 0; i < keyNum; i++) {\n reader.ReadInteger32 ();\n let flags = reader.ReadUnsignedInteger16 ();\n if (flags !== 0) {\n reader.ReadFloat32 ();\n }\n\n let current = null;\n if (type === CHUNK3DS.OBJECT_ROTATION) {\n let tmp = reader.ReadFloat32 ();\n current = obj.ReadVector (reader);\n current[3] = tmp;\n } else {\n current = obj.ReadVector (reader);\n }\n result.push (current);\n }\n\n return result;\n }\n\n let node3ds = new Importer3dsNode ();\n let endByte = this.GetChunkEnd (reader, length);\n this.ReadChunks (reader, endByte, (chunkId, chunkLength) => {\n if (chunkId === CHUNK3DS.OBJECT_HIERARCHY) {\n node3ds.name = this.ReadName (reader);\n node3ds.flags = reader.ReadUnsignedInteger32 ();\n node3ds.parentId = reader.ReadUnsignedInteger16 ();\n } else if (chunkId === CHUNK3DS.OBJECT_INSTANCE_NAME) {\n node3ds.instanceName = this.ReadName (reader);\n } else if (chunkId === CHUNK3DS.OBJECT_PIVOT) {\n node3ds.pivot = this.ReadVector (reader);\n } else if (chunkId === CHUNK3DS.OBJECT_POSITION) {\n node3ds.positions = ReadTrackVector (this, reader, CHUNK3DS.OBJECT_POSITION);\n } else if (chunkId === CHUNK3DS.OBJECT_ROTATION) {\n node3ds.rotations = ReadTrackVector (this, reader, CHUNK3DS.OBJECT_ROTATION);\n } else if (chunkId === CHUNK3DS.OBJECT_SCALE) {\n node3ds.scales = ReadTrackVector (this, reader, CHUNK3DS.OBJECT_SCALE);\n } else if (chunkId === CHUNK3DS.OBJECT_ID) {\n node3ds.id = reader.ReadUnsignedInteger16 ();\n } else {\n this.SkipChunk (reader, chunkLength);\n }\n });\n\n this.nodeList.AddNode (node3ds);\n }\n\n ReadName (reader)\n {\n let name = '';\n let char = 0;\n let count = 0;\n while (count < 64) {\n char = reader.ReadCharacter8 ();\n if (char === 0) {\n break;\n }\n name = name + String.fromCharCode (char);\n count = count + 1;\n }\n return name;\n }\n\n ReadVector (reader)\n {\n let result = [\n reader.ReadFloat32 (),\n reader.ReadFloat32 (),\n reader.ReadFloat32 ()\n ];\n return result;\n }\n\n ReadChunks (reader, endByte, onChunk)\n {\n while (reader.GetPosition () <= endByte - 6) {\n let chunkId = reader.ReadUnsignedInteger16 ();\n let chunkLength = reader.ReadUnsignedInteger32 ();\n onChunk (chunkId, chunkLength);\n }\n }\n\n GetChunkEnd (reader, length)\n {\n return reader.GetPosition () + length - 6;\n }\n\n SkipChunk (reader, length)\n {\n reader.Skip (length - 6);\n }\n}\n", "import { Coord2D } from '../geometry/coord2d.js';\nimport { ArrayToCoord3D, Coord3D } from '../geometry/coord3d.js';\nimport { Coord4D } from '../geometry/coord4d.js';\nimport { Direction } from '../geometry/geometry.js';\nimport { Matrix } from '../geometry/matrix.js';\nimport { ArrayToQuaternion } from '../geometry/quaternion.js';\nimport { Transformation } from '../geometry/transformation.js';\nimport { BinaryReader } from '../io/binaryreader.js';\nimport { ArrayBufferToUtf8String, Base64DataURIToArrayBuffer, CreateObjectUrlWithMimeType, GetFileExtensionFromMimeType } from '../io/bufferutils.js';\nimport { LoadExternalLibrary } from '../io/externallibs.js';\nimport { Color, ColorComponentFromFloat, ColorFromFloatComponents, LinearToSRGB } from '../model/color.js';\nimport { PhongMaterial, PhysicalMaterial, TextureMap } from '../model/material.js';\nimport { Mesh } from '../model/mesh.js';\nimport { Node, NodeType } from '../model/node.js';\nimport { Property, PropertyGroup, PropertyType } from '../model/property.js';\nimport { Triangle } from '../model/triangle.js';\nimport { ImporterBase } from './importerbase.js';\n\nconst GltfComponentType =\n{\n BYTE : 5120,\n UNSIGNED_BYTE : 5121,\n SHORT : 5122,\n UNSIGNED_SHORT : 5123,\n UNSIGNED_INT : 5125,\n FLOAT : 5126\n};\n\nconst GltfDataType =\n{\n SCALAR : 0,\n VEC2 : 1,\n VEC3 : 2,\n VEC4 : 3,\n MAT2 : 4,\n MAT3 : 5,\n MAT4 : 6\n};\n\nconst GltfRenderMode =\n{\n POINTS : 0,\n LINES : 1,\n LINE_LOOP : 2,\n LINE_STRIP : 3,\n TRIANGLES : 4,\n TRIANGLE_STRIP : 5,\n TRIANGLE_FAN : 6\n};\n\nconst GltfConstants =\n{\n GLTF_STRING : 0x46546C67,\n JSON_CHUNK_TYPE : 0x4E4F534A,\n BINARY_CHUNK_TYPE : 0x004E4942\n};\n\nfunction GetGltfColor (color)\n{\n return ColorFromFloatComponents (\n LinearToSRGB (color[0]),\n LinearToSRGB (color[1]),\n LinearToSRGB (color[2])\n );\n}\n\nfunction GetGltfVertexColor (color, componentType)\n{\n function GetColorComponent (component, componentType)\n {\n let normalized = component;\n if (componentType !== GltfComponentType.FLOAT) {\n normalized /= 255.0;\n }\n return ColorComponentFromFloat (LinearToSRGB (normalized));\n }\n\n return new Color (\n GetColorComponent (color[0], componentType),\n GetColorComponent (color[1], componentType),\n GetColorComponent (color[2], componentType)\n );\n}\n\nclass GltfBufferReader\n{\n constructor (buffer)\n {\n this.reader = new BinaryReader (buffer, true);\n this.componentType = null;\n this.dataType = null;\n this.byteStride = null;\n this.dataCount = null;\n this.sparseReader = null;\n }\n\n SetComponentType (componentType)\n {\n this.componentType = componentType;\n }\n\n SetDataType (dataType)\n {\n if (dataType === 'SCALAR') {\n this.dataType = GltfDataType.SCALAR;\n } else if (dataType === 'VEC2') {\n this.dataType = GltfDataType.VEC2;\n } else if (dataType === 'VEC3') {\n this.dataType = GltfDataType.VEC3;\n } else if (dataType === 'VEC4') {\n this.dataType = GltfDataType.VEC4;\n } else if (dataType === 'MAT2') {\n this.dataType = GltfDataType.MAT2;\n } else if (dataType === 'MAT3') {\n this.dataType = GltfDataType.MAT3;\n } else if (dataType === 'MAT4') {\n this.dataType = GltfDataType.MAT4;\n }\n }\n\n SetByteStride (byteStride)\n {\n this.byteStride = byteStride;\n }\n\n SetDataCount (dataCount)\n {\n this.dataCount = dataCount;\n }\n\n SetSparseReader (indexReader, valueReader)\n {\n this.sparseReader = {\n indexReader : indexReader,\n valueReader : valueReader\n };\n }\n\n ReadArrayBuffer (byteLength)\n {\n return this.reader.ReadArrayBuffer (byteLength);\n }\n\n GetDataCount ()\n {\n return this.dataCount;\n }\n\n ReadData ()\n {\n if (this.dataType === null) {\n return null;\n }\n if (this.dataType === GltfDataType.SCALAR) {\n let data = this.ReadComponent ();\n this.SkipBytesByStride (1);\n return data;\n } else if (this.dataType === GltfDataType.VEC2) {\n let x = this.ReadComponent ();\n let y = this.ReadComponent ();\n this.SkipBytesByStride (2);\n return new Coord2D (x, y);\n } else if (this.dataType === GltfDataType.VEC3) {\n let x = this.ReadComponent ();\n let y = this.ReadComponent ();\n let z = this.ReadComponent ();\n this.SkipBytesByStride (3);\n return new Coord3D (x, y, z);\n } else if (this.dataType === GltfDataType.VEC4) {\n let x = this.ReadComponent ();\n let y = this.ReadComponent ();\n let z = this.ReadComponent ();\n let w = this.ReadComponent ();\n this.SkipBytesByStride (4);\n return new Coord4D (x, y, z, w);\n }\n return null;\n }\n\n EnumerateData (onData)\n {\n if (this.sparseReader === null) {\n for (let i = 0; i < this.dataCount; i++) {\n onData (this.ReadData ());\n }\n } else {\n let sparseData = [];\n for (let i = 0; i < this.sparseReader.indexReader.GetDataCount (); i++) {\n let index = this.sparseReader.indexReader.ReadData ();\n let value = this.sparseReader.valueReader.ReadData ();\n sparseData.push ({\n index : index,\n value : value\n });\n }\n let sparseIndex = 0;\n for (let i = 0; i < this.dataCount; i++) {\n let data = this.ReadData ();\n if (sparseIndex < sparseData.length && sparseData[sparseIndex].index === i) {\n onData (sparseData[sparseIndex].value);\n sparseIndex += 1;\n } else {\n onData (data);\n }\n }\n }\n }\n\n SkipBytes (bytes)\n {\n this.reader.Skip (bytes);\n }\n\n ReadComponent ()\n {\n if (this.componentType === null) {\n return null;\n }\n if (this.componentType === GltfComponentType.BYTE) {\n return this.reader.ReadCharacter8 ();\n } else if (this.componentType === GltfComponentType.UNSIGNED_BYTE) {\n return this.reader.ReadUnsignedCharacter8 ();\n } else if (this.componentType === GltfComponentType.SHORT) {\n return this.reader.ReadInteger16 ();\n } else if (this.componentType === GltfComponentType.UNSIGNED_SHORT) {\n return this.reader.ReadUnsignedInteger16 ();\n } else if (this.componentType === GltfComponentType.UNSIGNED_INT) {\n return this.reader.ReadInteger32 ();\n } else if (this.componentType === GltfComponentType.FLOAT) {\n return this.reader.ReadFloat32 ();\n }\n return null;\n }\n\n SkipBytesByStride (componentCount)\n {\n if (this.byteStride === null) {\n return;\n }\n let readBytes = componentCount * this.GetComponentSize ();\n this.reader.Skip (this.byteStride - readBytes);\n }\n\n GetComponentSize ()\n {\n if (this.componentType === GltfComponentType.BYTE) {\n return 1;\n } else if (this.componentType === GltfComponentType.UNSIGNED_BYTE) {\n return 1;\n } else if (this.componentType === GltfComponentType.SHORT) {\n return 2;\n } else if (this.componentType === GltfComponentType.UNSIGNED_SHORT) {\n return 2;\n } else if (this.componentType === GltfComponentType.UNSIGNED_INT) {\n return 4;\n } else if (this.componentType === GltfComponentType.FLOAT) {\n return 4;\n }\n return 0;\n }\n}\n\nclass GltfExtensions\n{\n constructor ()\n {\n this.supportedExtensions = [\n 'KHR_draco_mesh_compression',\n 'KHR_materials_pbrSpecularGlossiness',\n 'KHR_texture_transform',\n ];\n this.draco = null;\n }\n\n LoadLibraries (extensionsRequired, callbacks)\n {\n if (extensionsRequired === undefined) {\n callbacks.onSuccess ();\n return;\n }\n if (this.draco === null && extensionsRequired.indexOf ('KHR_draco_mesh_compression') !== -1) {\n\t\t\tLoadExternalLibrary ('loaders/draco_decoder.js').then (() => {\n DracoDecoderModule ().then ((draco) => {\n this.draco = draco;\n callbacks.onSuccess ();\n });\n }).catch (() => {\n callbacks.onError ('Failed to load draco decoder.');\n });\n } else {\n callbacks.onSuccess ();\n }\n }\n\n GetUnsupportedExtensions (extensionsRequired)\n {\n let unsupportedExtensions = [];\n if (extensionsRequired === undefined) {\n return unsupportedExtensions;\n }\n for (let i = 0; i < extensionsRequired.length; i++) {\n let requiredExtension = extensionsRequired[i];\n if (this.supportedExtensions.indexOf (requiredExtension) === -1) {\n unsupportedExtensions.push (requiredExtension);\n }\n }\n return unsupportedExtensions;\n }\n\n ProcessMaterial (gltfMaterial, material, imporTextureFn)\n {\n if (gltfMaterial.extensions === undefined) {\n return null;\n }\n\n let khrSpecularGlossiness = gltfMaterial.extensions.KHR_materials_pbrSpecularGlossiness;\n if (khrSpecularGlossiness === undefined) {\n return null;\n }\n\n let phongMaterial = new PhongMaterial ();\n let diffuseColor = khrSpecularGlossiness.diffuseFactor;\n if (diffuseColor !== undefined) {\n phongMaterial.color = GetGltfColor (diffuseColor);\n phongMaterial.opacity = diffuseColor[3];\n }\n let diffuseTexture = khrSpecularGlossiness.diffuseTexture;\n if (diffuseTexture !== undefined) {\n phongMaterial.diffuseMap = imporTextureFn (diffuseTexture);\n }\n let specularColor = khrSpecularGlossiness.specularFactor;\n if (specularColor !== undefined) {\n phongMaterial.specular = GetGltfColor (specularColor);\n }\n let specularTexture = khrSpecularGlossiness.specularGlossinessTexture;\n if (specularTexture !== undefined) {\n phongMaterial.specularMap = imporTextureFn (specularTexture);\n }\n let glossiness = khrSpecularGlossiness.glossinessFactor;\n if (glossiness !== undefined) {\n phongMaterial.shininess = glossiness;\n }\n\n return phongMaterial;\n }\n\n ProcessTexture (gltfTexture, texture)\n {\n if (gltfTexture.extensions === undefined) {\n return;\n }\n let khrTextureTransform = gltfTexture.extensions.KHR_texture_transform;\n if (khrTextureTransform !== undefined) {\n if (khrTextureTransform.offset !== undefined) {\n texture.offset.x = khrTextureTransform.offset[0];\n texture.offset.y = -khrTextureTransform.offset[1];\n }\n if (khrTextureTransform.scale !== undefined) {\n texture.scale.x = khrTextureTransform.scale[0];\n texture.scale.y = khrTextureTransform.scale[1];\n }\n if (khrTextureTransform.rotation !== undefined) {\n texture.rotation = -khrTextureTransform.rotation;\n }\n }\n }\n\n ProcessPrimitive (importer, gltf, primitive, mesh)\n {\n function EnumerateComponents (draco, decoder, dracoMesh, attributeId, processor)\n {\n let attribute = decoder.GetAttributeByUniqueId (dracoMesh, attributeId);\n let numComponents = attribute.num_components ();\n let numPoints = dracoMesh.num_points ();\n let numValues = numPoints * numComponents;\n let dataSize = numValues * 4;\n let attributePtr = draco._malloc (dataSize);\n decoder.GetAttributeDataArrayForAllPoints (dracoMesh, attribute, draco.DT_FLOAT32, dataSize, attributePtr);\n let attributeArray = new Float32Array (draco.HEAPF32.buffer, attributePtr, numValues).slice ();\n if (numComponents === 2) {\n for (let i = 0; i < attributeArray.length; i += 2) {\n processor (new Coord2D (\n attributeArray[i + 0],\n attributeArray[i + 1]\n ));\n }\n } else if (numComponents === 3) {\n for (let i = 0; i < attributeArray.length; i += 3) {\n processor (new Coord3D (\n attributeArray[i + 0],\n attributeArray[i + 1],\n attributeArray[i + 2]\n ));\n }\n } else if (numComponents === 4) {\n for (let i = 0; i < attributeArray.length; i += 4) {\n processor (new Coord4D (\n attributeArray[i + 0],\n attributeArray[i + 1],\n attributeArray[i + 2],\n attributeArray[i + 3]\n ));\n }\n }\n draco._free (attributePtr);\n }\n\n if (this.draco === null) {\n return false;\n }\n\n if (primitive.extensions === undefined || primitive.extensions.KHR_draco_mesh_compression === undefined) {\n return false;\n }\n\n let decoder = new this.draco.Decoder ();\n let decoderBuffer = new this.draco.DecoderBuffer ();\n\n let extensionParams = primitive.extensions.KHR_draco_mesh_compression;\n let compressedBufferView = gltf.bufferViews[extensionParams.bufferView];\n let compressedReader = importer.GetReaderFromBufferView (compressedBufferView);\n let compressedArrayBuffer = compressedReader.ReadArrayBuffer (compressedBufferView.byteLength);\n decoderBuffer.Init (new Int8Array (compressedArrayBuffer), compressedArrayBuffer.byteLength);\n let geometryType = decoder.GetEncodedGeometryType (decoderBuffer);\n if (geometryType !== this.draco.TRIANGULAR_MESH) {\n return true;\n }\n\n let dracoMesh = new this.draco.Mesh ();\n let decodingStatus = decoder.DecodeBufferToMesh (decoderBuffer, dracoMesh);\n if (!decodingStatus.ok ()) {\n return true;\n }\n\n let hasVertices = (extensionParams.attributes.POSITION !== undefined);\n let hasVertexColors = false;\n let hasNormals = (extensionParams.attributes.NORMAL !== undefined);\n let hasUVs = (extensionParams.attributes.TEXCOORD_0 !== undefined);\n\n if (!hasVertices) {\n return true;\n }\n\n let vertexOffset = mesh.VertexCount ();\n let vertexColorOffset = mesh.VertexColorCount ();\n let normalOffset = mesh.NormalCount ();\n let uvOffset = mesh.TextureUVCount ();\n\n EnumerateComponents (this.draco, decoder, dracoMesh, extensionParams.attributes.POSITION, (vertex) => {\n mesh.AddVertex (vertex);\n });\n\n if (hasNormals) {\n EnumerateComponents (this.draco, decoder, dracoMesh, extensionParams.attributes.NORMAL, (normal) => {\n mesh.AddNormal (normal);\n });\n }\n\n if (hasUVs) {\n EnumerateComponents (this.draco, decoder, dracoMesh, extensionParams.attributes.TEXCOORD_0, (uv) => {\n uv.y = -uv.y;\n mesh.AddTextureUV (uv);\n });\n }\n\n let faceCount = dracoMesh.num_faces ();\n let indexCount = faceCount * 3;\n let indexDataSize = indexCount * 4;\n let indexDataPtr = this.draco._malloc (indexDataSize);\n decoder.GetTrianglesUInt32Array (dracoMesh, indexDataSize, indexDataPtr);\n let indexArray = new Uint32Array (this.draco.HEAPU32.buffer, indexDataPtr, indexCount).slice ();\n for (let i = 0; i < indexArray.length; i += 3) {\n let v0 = indexArray[i];\n let v1 = indexArray[i + 1];\n let v2 = indexArray[i + 2];\n importer.AddTriangle (primitive, mesh, v0, v1, v2, hasVertexColors, hasNormals, hasUVs, vertexOffset, vertexColorOffset, normalOffset, uvOffset);\n }\n this.draco._free (indexDataPtr);\n\n return true;\n }\n}\n\nexport class ImporterGltf extends ImporterBase\n{\n constructor ()\n {\n super ();\n this.gltfExtensions = new GltfExtensions ();\n }\n\n CanImportExtension (extension)\n {\n return extension === 'gltf' || extension === 'glb';\n }\n\n GetUpDirection ()\n {\n return Direction.Y;\n }\n\n ClearContent ()\n {\n this.bufferContents = null;\n this.imageIndexToTextureParams = null;\n }\n\n ResetContent ()\n {\n this.bufferContents = [];\n this.imageIndexToTextureParams = new Map ();\n }\n\n ImportContent (fileContent, onFinish)\n {\n if (this.extension === 'gltf') {\n this.ProcessGltf (fileContent, onFinish);\n } else if (this.extension === 'glb') {\n this.ProcessBinaryGltf (fileContent, onFinish);\n }\n }\n\n ProcessGltf (fileContent, onFinish)\n {\n let textContent = ArrayBufferToUtf8String (fileContent);\n let gltf = JSON.parse (textContent);\n if (gltf.asset.version !== '2.0') {\n this.SetError ('Invalid glTF version.');\n onFinish ();\n return;\n }\n\n for (let i = 0; i < gltf.buffers.length; i++) {\n let buffer = null;\n let gltfBuffer = gltf.buffers[i];\n let base64Buffer = Base64DataURIToArrayBuffer (gltfBuffer.uri);\n if (base64Buffer !== null) {\n buffer = base64Buffer.buffer;\n } else {\n let fileBuffer = this.callbacks.getFileBuffer (gltfBuffer.uri);\n if (fileBuffer !== null) {\n buffer = fileBuffer;\n }\n }\n if (buffer === null) {\n this.SetError ('One of the requested buffers is missing.');\n onFinish ();\n return;\n }\n this.bufferContents.push (buffer);\n }\n\n this.ProcessMainFile (gltf, onFinish);\n }\n\n ProcessBinaryGltf (fileContent, onFinish)\n {\n function ReadChunk (reader)\n {\n let length = reader.ReadUnsignedInteger32 ();\n let type = reader.ReadUnsignedInteger32 ();\n let buffer = reader.ReadArrayBuffer (length);\n return {\n type : type,\n buffer : buffer\n };\n }\n\n let reader = new BinaryReader (fileContent, true);\n let magic = reader.ReadUnsignedInteger32 ();\n if (magic !== GltfConstants.GLTF_STRING) {\n this.SetError ('Invalid glTF file.');\n onFinish ();\n return;\n }\n let version = reader.ReadUnsignedInteger32 ();\n if (version !== 2) {\n this.SetError ('Invalid glTF version.');\n onFinish ();\n return;\n }\n let length = reader.ReadUnsignedInteger32 ();\n if (length !== reader.GetByteLength ()) {\n this.SetError ('Invalid glTF file.');\n onFinish ();\n return;\n }\n\n let gltfTextContent = null;\n while (!reader.End ()) {\n let chunk = ReadChunk (reader);\n if (chunk.type === GltfConstants.JSON_CHUNK_TYPE) {\n gltfTextContent = ArrayBufferToUtf8String (chunk.buffer);\n } else if (chunk.type === GltfConstants.BINARY_CHUNK_TYPE) {\n this.bufferContents.push (chunk.buffer);\n }\n }\n\n if (gltfTextContent !== null) {\n let gltf = JSON.parse (gltfTextContent);\n this.ProcessMainFile (gltf, onFinish);\n }\n }\n\n ProcessMainFile (gltf, onFinish)\n {\n let unsupportedExtensions = this.gltfExtensions.GetUnsupportedExtensions (gltf.extensionsRequired);\n if (unsupportedExtensions.length > 0) {\n this.SetError ('Unsupported extension: ' + unsupportedExtensions.join (', ') + '.');\n onFinish ();\n return;\n }\n\n this.gltfExtensions.LoadLibraries (gltf.extensionsRequired, {\n onSuccess : () => {\n this.ImportModel (gltf);\n onFinish ();\n },\n onError : (message) => {\n this.SetError (message);\n onFinish ();\n }\n });\n }\n\n ImportModel (gltf)\n {\n let materials = gltf.materials;\n if (materials !== undefined) {\n for (let material of materials) {\n this.ImportMaterial (gltf, material);\n }\n }\n\n let meshes = gltf.meshes;\n if (meshes !== undefined) {\n for (let mesh of meshes) {\n this.ImportMesh (gltf, mesh);\n }\n }\n\n this.ImportNodes (gltf);\n this.ImportModelProperties (gltf);\n }\n\n ImportModelProperties (gltf)\n {\n function ImportProperties (model, propertyGroupName, propertyObject)\n {\n let propertyGroup = new PropertyGroup (propertyGroupName);\n for (let propertyName in propertyObject) {\n if (Object.prototype.hasOwnProperty.call (propertyObject, propertyName)) {\n if (typeof propertyObject[propertyName] === 'string') {\n const property = new Property (PropertyType.Text, propertyName, propertyObject[propertyName]);\n propertyGroup.AddProperty (property);\n }\n }\n }\n if (propertyGroup.PropertyCount () > 0) {\n model.AddPropertyGroup (propertyGroup);\n }\n return propertyGroup;\n }\n\n ImportProperties (this.model, 'Asset properties', gltf.asset);\n if (gltf.asset['extras']) {\n ImportProperties (this.model, 'Extras', gltf.asset['extras']);\n }\n }\n\n GetDefaultScene (gltf)\n {\n let defaultSceneIndex = gltf.scene || 0;\n if (defaultSceneIndex >= gltf.scenes.length) {\n return null;\n }\n return gltf.scenes[defaultSceneIndex];\n }\n\n ImportMaterial (gltf, gltfMaterial)\n {\n let material = new PhysicalMaterial ();\n if (gltfMaterial.name !== undefined) {\n material.name = gltfMaterial.name;\n }\n\n material.color = GetGltfColor ([1.0, 1.0, 1.0]);\n if (gltfMaterial.pbrMetallicRoughness !== undefined) {\n let baseColor = gltfMaterial.pbrMetallicRoughness.baseColorFactor;\n if (baseColor !== undefined) {\n material.color = GetGltfColor (baseColor);\n material.opacity = baseColor[3];\n }\n let metallicFactor = gltfMaterial.pbrMetallicRoughness.metallicFactor;\n if (metallicFactor !== undefined) {\n material.metalness = metallicFactor;\n }\n let roughnessFactor = gltfMaterial.pbrMetallicRoughness.roughnessFactor;\n if (roughnessFactor !== undefined) {\n material.roughness = roughnessFactor;\n }\n let emissiveColor = gltfMaterial.emissiveFactor;\n if (emissiveColor !== undefined) {\n material.emissive = GetGltfColor (emissiveColor);\n }\n\n material.diffuseMap = this.ImportTexture (gltf, gltfMaterial.pbrMetallicRoughness.baseColorTexture);\n material.metalnessMap = this.ImportTexture (gltf, gltfMaterial.pbrMetallicRoughness.metallicRoughnessTexture);\n material.normalMap = this.ImportTexture (gltf, gltfMaterial.normalTexture);\n material.emissiveMap = this.ImportTexture (gltf, gltfMaterial.emissiveTexture);\n if (material.diffuseMap !== null) {\n material.multiplyDiffuseMap = true;\n }\n\n let alphaMode = gltfMaterial.alphaMode;\n if (alphaMode !== undefined) {\n if (alphaMode === 'BLEND') {\n material.transparent = true;\n } else if (alphaMode === 'MASK') {\n material.transparent = true;\n material.alphaTest = gltfMaterial.alphaCutoff || 0.5;\n }\n }\n }\n\n let newMaterial = this.gltfExtensions.ProcessMaterial (gltfMaterial, material, (textureRef) => {\n return this.ImportTexture (gltf, textureRef);\n });\n if (newMaterial !== null) {\n material = newMaterial;\n }\n this.model.AddMaterial (material);\n }\n\n ImportTexture (gltf, gltfTextureRef)\n {\n if (gltfTextureRef === undefined || gltfTextureRef === null) {\n return null;\n }\n\n let texture = new TextureMap ();\n let gltfTexture = gltf.textures[gltfTextureRef.index];\n let gltfImageIndex = gltfTexture.source;\n let gltfImage = gltf.images[gltfImageIndex];\n\n let textureParams = null;\n if (this.imageIndexToTextureParams.has (gltfImageIndex)) {\n textureParams = this.imageIndexToTextureParams.get (gltfImageIndex);\n } else {\n textureParams = {\n name : null,\n url : null,\n buffer : null\n };\n let textureIndexString = gltfImageIndex.toString ();\n if (gltfImage.uri !== undefined) {\n let base64Buffer = Base64DataURIToArrayBuffer (gltfImage.uri);\n if (base64Buffer !== null) {\n textureParams.name = 'Embedded_' + textureIndexString + '.' + GetFileExtensionFromMimeType (base64Buffer.mimeType);\n textureParams.url = CreateObjectUrlWithMimeType (base64Buffer.buffer, base64Buffer.mimeType);\n textureParams.buffer = base64Buffer.buffer;\n } else {\n let textureBuffer = this.callbacks.getTextureBuffer (gltfImage.uri);\n textureParams.name = gltfImage.uri;\n if (textureBuffer !== null) {\n textureParams.url = textureBuffer.url;\n textureParams.buffer = textureBuffer.buffer;\n }\n }\n } else if (gltfImage.bufferView !== undefined) {\n let bufferView = gltf.bufferViews[gltfImage.bufferView];\n let reader = this.GetReaderFromBufferView (bufferView);\n if (reader !== null) {\n let buffer = reader.ReadArrayBuffer (bufferView.byteLength);\n textureParams.name = 'Binary_' + textureIndexString + '.' + GetFileExtensionFromMimeType (gltfImage.mimeType);\n textureParams.url = CreateObjectUrlWithMimeType (buffer, gltfImage.mimeType);\n textureParams.buffer = buffer;\n }\n }\n this.imageIndexToTextureParams.set (gltfImageIndex, textureParams);\n }\n\n texture.name = textureParams.name;\n texture.url = textureParams.url;\n texture.buffer = textureParams.buffer;\n\n this.gltfExtensions.ProcessTexture (gltfTextureRef, texture);\n return texture;\n }\n\n ImportMesh (gltf, gltfMesh)\n {\n let mesh = new Mesh ();\n this.model.AddMesh (mesh);\n if (gltfMesh.name !== undefined) {\n mesh.SetName (gltfMesh.name);\n }\n\n for (let i = 0; i < gltfMesh.primitives.length; i++) {\n let primitive = gltfMesh.primitives[i];\n this.ImportPrimitive (gltf, primitive, mesh);\n }\n }\n\n ImportPrimitive (gltf, primitive, mesh)\n {\n if (this.gltfExtensions.ProcessPrimitive (this, gltf, primitive, mesh)) {\n return;\n }\n\n if (primitive.attributes === undefined) {\n return;\n }\n\n let hasVertices = (primitive.attributes.POSITION !== undefined);\n let hasVertexColors = (primitive.attributes.COLOR_0 !== undefined);\n let hasNormals = (primitive.attributes.NORMAL !== undefined);\n let hasUVs = (primitive.attributes.TEXCOORD_0 !== undefined);\n let hasIndices = (primitive.indices !== undefined);\n\n let mode = GltfRenderMode.TRIANGLES;\n if (primitive.mode !== undefined) {\n mode = primitive.mode;\n }\n if (mode !== GltfRenderMode.TRIANGLES && mode !== GltfRenderMode.TRIANGLE_STRIP && mode !== GltfRenderMode.TRIANGLE_FAN) {\n return;\n }\n\n let vertexOffset = mesh.VertexCount ();\n let vertexColorOffset = mesh.VertexColorCount ();\n let normalOffset = mesh.NormalCount ();\n let uvOffset = mesh.TextureUVCount ();\n\n if (hasVertices) {\n let accessor = gltf.accessors[primitive.attributes.POSITION];\n let reader = this.GetReaderFromAccessor (gltf, accessor);\n if (reader === null) {\n return;\n }\n reader.EnumerateData ((data) => {\n mesh.AddVertex (data);\n });\n } else {\n return;\n }\n\n if (hasVertexColors) {\n let accessor = gltf.accessors[primitive.attributes.COLOR_0];\n let reader = this.GetReaderFromAccessor (gltf, accessor);\n if (reader === null) {\n return;\n }\n reader.EnumerateData ((data) => {\n let color = GetGltfVertexColor ([data.x, data.y, data.z], reader.componentType);\n mesh.AddVertexColor (color);\n });\n }\n\n if (hasNormals) {\n let accessor = gltf.accessors[primitive.attributes.NORMAL];\n let reader = this.GetReaderFromAccessor (gltf, accessor);\n if (reader === null) {\n return;\n }\n reader.EnumerateData ((data) => {\n mesh.AddNormal (data);\n });\n }\n\n if (hasUVs) {\n let accessor = gltf.accessors[primitive.attributes.TEXCOORD_0];\n let reader = this.GetReaderFromAccessor (gltf, accessor);\n if (reader === null) {\n return;\n }\n reader.EnumerateData ((data) => {\n data.y = -data.y;\n mesh.AddTextureUV (data);\n });\n }\n\n let vertexIndices = [];\n if (hasIndices) {\n let accessor = gltf.accessors[primitive.indices];\n let reader = this.GetReaderFromAccessor (gltf, accessor);\n if (reader === null) {\n return;\n }\n reader.EnumerateData ((data) => {\n vertexIndices.push (data);\n });\n } else {\n let primitiveVertexCount = mesh.VertexCount () - vertexOffset;\n for (let i = 0; i < primitiveVertexCount; i++) {\n vertexIndices.push (i);\n }\n }\n\n if (mode === GltfRenderMode.TRIANGLES) {\n for (let i = 0; i < vertexIndices.length; i += 3) {\n let v0 = vertexIndices[i];\n let v1 = vertexIndices[i + 1];\n let v2 = vertexIndices[i + 2];\n this.AddTriangle (primitive, mesh, v0, v1, v2, hasVertexColors, hasNormals, hasUVs, vertexOffset, vertexColorOffset, normalOffset, uvOffset);\n }\n } else if (mode === GltfRenderMode.TRIANGLE_STRIP) {\n for (let i = 0; i < vertexIndices.length - 2; i++) {\n let v0 = vertexIndices[i];\n let v1 = vertexIndices[i + 1];\n let v2 = vertexIndices[i + 2];\n if (i % 2 === 1) {\n let tmp = v1;\n v1 = v2;\n v2 = tmp;\n }\n this.AddTriangle (primitive, mesh, v0, v1, v2, hasVertexColors, hasNormals, hasUVs, vertexOffset, vertexColorOffset, normalOffset, uvOffset);\n }\n } else if (mode === GltfRenderMode.TRIANGLE_FAN) {\n for (let i = 1; i < vertexIndices.length - 1; i++) {\n let v0 = vertexIndices[0];\n let v1 = vertexIndices[i];\n let v2 = vertexIndices[i + 1];\n this.AddTriangle (primitive, mesh, v0, v1, v2, hasVertexColors, hasNormals, hasUVs, vertexOffset, vertexColorOffset, normalOffset, uvOffset);\n }\n }\n }\n\n AddTriangle (primitive, mesh, v0, v1, v2, hasVertexColors, hasNormals, hasUVs, vertexOffset, vertexColorOffset, normalOffset, uvOffset)\n {\n let triangle = new Triangle (\n vertexOffset + v0,\n vertexOffset + v1,\n vertexOffset + v2\n );\n if (hasVertexColors) {\n triangle.SetVertexColors (\n vertexColorOffset + v0,\n vertexColorOffset + v1,\n vertexColorOffset + v2\n );\n }\n if (hasNormals) {\n triangle.SetNormals (\n normalOffset + v0,\n normalOffset + v1,\n normalOffset + v2\n );\n }\n if (hasUVs) {\n triangle.SetTextureUVs (\n uvOffset + v0,\n uvOffset + v1,\n uvOffset + v2\n );\n }\n if (primitive.material !== undefined) {\n triangle.mat = primitive.material;\n }\n mesh.AddTriangle (triangle);\n }\n\n ImportNodes (gltf)\n {\n let scene = this.GetDefaultScene (gltf);\n if (scene === null) {\n return;\n }\n let rootNode = this.model.GetRootNode ();\n for (let nodeIndex of scene.nodes) {\n let gltfNode = gltf.nodes[nodeIndex];\n this.ImportNode (gltf, gltfNode, rootNode);\n }\n }\n\n ImportNode (gltf, gltfNode, parentNode)\n {\n function GetNodeTransformation (gltfNode)\n {\n let matrix = new Matrix ().CreateIdentity ();\n if (gltfNode.matrix !== undefined) {\n matrix.Set (gltfNode.matrix);\n } else {\n let translation = [0.0, 0.0, 0.0];\n let rotation = [0.0, 0.0, 0.0, 1.0];\n let scale = [1.0, 1.0, 1.0];\n if (gltfNode.translation !== undefined) {\n translation = gltfNode.translation;\n }\n if (gltfNode.rotation !== undefined) {\n rotation = gltfNode.rotation;\n }\n if (gltfNode.scale !== undefined) {\n scale = gltfNode.scale;\n }\n matrix.ComposeTRS (\n ArrayToCoord3D (translation),\n ArrayToQuaternion (rotation),\n ArrayToCoord3D (scale)\n );\n }\n return new Transformation (matrix);\n }\n\n if (gltfNode.children === undefined && gltfNode.mesh === undefined) {\n return;\n }\n\n let node = new Node ();\n if (gltfNode.name !== undefined) {\n node.SetName (gltfNode.name);\n }\n node.SetTransformation (GetNodeTransformation (gltfNode));\n parentNode.AddChildNode (node);\n\n if (gltfNode.children !== undefined) {\n for (let childIndex of gltfNode.children) {\n let childGltfNode = gltf.nodes[childIndex];\n this.ImportNode (gltf, childGltfNode, node);\n }\n }\n\n if (gltfNode.mesh !== undefined) {\n if (gltfNode.children === undefined || gltfNode.children.length === 0) {\n node.SetType (NodeType.MeshNode);\n }\n node.AddMeshIndex (gltfNode.mesh);\n }\n }\n\n GetReaderFromBufferView (bufferView)\n {\n let bufferIndex = bufferView.buffer || 0;\n let buffer = this.bufferContents[bufferIndex];\n if (buffer === undefined || buffer === null) {\n return null;\n }\n\n let reader = new GltfBufferReader (buffer);\n reader.SkipBytes (bufferView.byteOffset || 0);\n let byteStride = bufferView.byteStride;\n if (byteStride !== undefined && byteStride !== 0) {\n reader.SetByteStride (byteStride);\n }\n\n return reader;\n }\n\n GetReaderFromAccessor (gltf, accessor)\n {\n let bufferViewIndex = accessor.bufferView || 0;\n let bufferView = gltf.bufferViews[bufferViewIndex];\n let reader = this.GetReaderFromBufferView (bufferView);\n if (reader === null) {\n return null;\n }\n\n reader.SetComponentType (accessor.componentType);\n reader.SetDataType (accessor.type);\n reader.SetDataCount (accessor.count);\n reader.SkipBytes (accessor.byteOffset || 0);\n\n if (accessor.sparse !== undefined) {\n let indexReader = this.GetReaderFromSparseAccessor (gltf, accessor.sparse.indices, accessor.sparse.indices.componentType, 'SCALAR', accessor.sparse.count);\n let valueReader = this.GetReaderFromSparseAccessor (gltf, accessor.sparse.values, accessor.componentType, accessor.type, accessor.sparse.count);\n if (indexReader !== null && valueReader !== null) {\n reader.SetSparseReader (indexReader, valueReader);\n }\n }\n return reader;\n }\n\n GetReaderFromSparseAccessor (gltf, sparseAccessor, componentType, type, count)\n {\n if (sparseAccessor.bufferView === undefined) {\n return null;\n }\n\n let bufferView = gltf.bufferViews[sparseAccessor.bufferView];\n let reader = this.GetReaderFromBufferView (bufferView);\n if (reader === null) {\n return null;\n }\n\n reader.SetComponentType (componentType);\n reader.SetDataType (type);\n reader.SetDataCount (count);\n reader.SkipBytes (sparseAccessor.byteOffset || 0);\n return reader;\n }\n}\n", "import { Coord3D } from '../geometry/coord3d.js';\nimport { Direction } from '../geometry/geometry.js';\nimport { Matrix } from '../geometry/matrix.js';\nimport { Transformation } from '../geometry/transformation.js';\nimport { LoadExternalLibrary } from '../io/externallibs.js';\nimport { ColorFromFloatComponents, IntegerToHexString } from '../model/color.js';\nimport { PhongMaterial } from '../model/material.js';\nimport { Mesh } from '../model/mesh.js';\nimport { Property, PropertyGroup, PropertyType } from '../model/property.js';\nimport { Triangle } from '../model/triangle.js';\nimport { ImporterBase } from './importerbase.js';\nimport { UpdateMaterialTransparency } from './importerutils.js';\n\nexport class ImporterIfc extends ImporterBase\n{\n constructor ()\n {\n super ();\n this.ifc = null;\n }\n\n CanImportExtension (extension)\n {\n return extension === 'ifc';\n }\n\n GetUpDirection ()\n {\n return Direction.Y;\n }\n\n\tClearContent ()\n\t{\n this.materialNameToIndex = null;\n this.expressIDToMesh = null;\n\t}\n\n ResetContent ()\n {\n this.materialNameToIndex = new Map ();\n this.expressIDToMesh = new Map ();\n }\n\n ImportContent (fileContent, onFinish)\n {\n\t\tif (this.ifc === null) {\n\t\t\tLoadExternalLibrary ('loaders/web-ifc-api-browser.js').then (() => {\n this.ifc = new WebIFC.IfcAPI ();\n this.ifc.Init ().then (() => {\n this.ImportIfcContent (fileContent);\n onFinish ();\n });\n }).catch (() => {\n this.SetError ('Failed to load web-ifc.');\n onFinish ();\n });\n\t\t} else {\n\t\t\tthis.ImportIfcContent (fileContent);\n\t\t\tonFinish ();\n\t\t}\n }\n\n\tImportIfcContent (fileContent)\n\t{\n const fileBuffer = new Uint8Array (fileContent);\n\t\tconst modelID = this.ifc.OpenModel (fileBuffer, {\n COORDINATE_TO_ORIGIN : true\n });\n const ifcMeshes = this.ifc.LoadAllGeometry (modelID);\n for (let meshIndex = 0; meshIndex < ifcMeshes.size (); meshIndex++) {\n const ifcMesh = ifcMeshes.get (meshIndex);\n if (ifcMesh.geometries.size () > 0) {\n this.ImportIfcMesh (modelID, ifcMesh);\n }\n }\n this.ImportProperties (modelID);\n this.ifc.CloseModel (modelID);\n\t}\n\n ImportIfcMesh (modelID, ifcMesh)\n {\n let mesh = new Mesh ();\n mesh.SetName ('Mesh ' + ifcMesh.expressID.toString ());\n\n let vertexOffset = 0;\n const ifcGeometries = ifcMesh.geometries;\n for (let geometryIndex = 0; geometryIndex < ifcGeometries.size (); geometryIndex++) {\n const ifcGeometry = ifcGeometries.get (geometryIndex);\n const ifcGeometryData = this.ifc.GetGeometry (modelID, ifcGeometry.geometryExpressID);\n const ifcVertices = this.ifc.GetVertexArray (ifcGeometryData.GetVertexData (), ifcGeometryData.GetVertexDataSize ());\n const ifcIndices = this.ifc.GetIndexArray (ifcGeometryData.GetIndexData (), ifcGeometryData.GetIndexDataSize ());\n const materialIndex = this.GetMaterialIndexByColor (ifcGeometry.color);\n const matrix = new Matrix (ifcGeometry.flatTransformation);\n const transformation = new Transformation (matrix);\n\n for (let i = 0; i < ifcVertices.length; i += 6) {\n const x = ifcVertices[i];\n const y = ifcVertices[i + 1];\n const z = ifcVertices[i + 2];\n const coord = new Coord3D (x, y, z);\n const transformed = transformation.TransformCoord3D (coord);\n mesh.AddVertex (transformed);\n }\n // TODO: normals\n for (let i = 0; i < ifcIndices.length; i += 3) {\n const v0 = ifcIndices[i];\n const v1 = ifcIndices[i + 1];\n const v2 = ifcIndices[i + 2];\n const triangle = new Triangle (\n vertexOffset + v0,\n vertexOffset + v1,\n vertexOffset + v2\n );\n triangle.SetMaterial (materialIndex);\n mesh.AddTriangle (triangle);\n }\n vertexOffset += ifcVertices.length / 6;\n }\n\n this.expressIDToMesh.set (ifcMesh.expressID, mesh);\n this.model.AddMeshToRootNode (mesh);\n }\n\n ImportProperties (modelID)\n {\n const lines = this.ifc.GetLineIDsWithType (modelID, WebIFC.IFCRELDEFINESBYPROPERTIES);\n for (let i = 0; i < lines.size (); i++) {\n const relID = lines.get (i);\n const rel = this.ifc.GetLine (modelID, relID);\n if (Array.isArray (rel.RelatingPropertyDefinition)) {\n continue;\n }\n rel.RelatedObjects.forEach ((objectRelID) => {\n let element = null;\n if (this.expressIDToMesh.has (objectRelID.value)) {\n element = this.expressIDToMesh.get (objectRelID.value);\n } else {\n let propSetOwner = this.ifc.GetLine (modelID, objectRelID.value, true);\n if (propSetOwner.type === WebIFC.IFCBUILDING) {\n element = this.model;\n }\n }\n if (element === null) {\n return;\n }\n let propSetDef = rel.RelatingPropertyDefinition;\n let propSet = this.ifc.GetLine (modelID, propSetDef.value, true);\n if (!propSet || !propSet.HasProperties) {\n return;\n }\n let propertyGroup = new PropertyGroup (propSet.Name.value);\n propSet.HasProperties.forEach ((property) => {\n if (!property || !property.Name || !property.NominalValue) {\n return;\n }\n let elemProperty = null;\n let propertyName = this.GetIFCString (property.Name.value);\n let strValue = null;\n switch (property.NominalValue.label) {\n case 'IFCTEXT':\n case 'IFCLABEL':\n case 'IFCIDENTIFIER':\n elemProperty = new Property (PropertyType.Text, propertyName, this.GetIFCString (property.NominalValue.value));\n break;\n case 'IFCBOOLEAN':\n case 'IFCLOGICAL':\n strValue = 'Unknown';\n if (property.NominalValue.value === 'T') {\n strValue = 'True';\n } else if (property.NominalValue.value === 'F') {\n strValue = 'False';\n }\n elemProperty = new Property (PropertyType.Text, propertyName, strValue);\n break;\n case 'IFCINTEGER':\n case 'IFCCOUNTMEASURE':\n elemProperty = new Property (PropertyType.Integer, propertyName, property.NominalValue.value);\n break;\n case 'IFCREAL':\n case 'IFCLENGTHMEASURE':\n case 'IFCPOSITIVELENGTHMEASURE':\n case 'IFCAREAMEASURE':\n case 'IFCVOLUMEMEASURE':\n case 'IFCRATIOMEASURE':\n case 'IFCPOSITIVERATIOMEASURE':\n case 'IFCMASSMEASURE':\n case 'IFCMASSPERLENGTHMEASURE':\n case 'IFCPLANEANGLEMEASURE':\n case 'IFCTHERMALTRANSMITTANCEMEASURE':\n elemProperty = new Property (PropertyType.Number, propertyName, property.NominalValue.value);\n break;\n default:\n // TODO\n console.log (property.NominalValue.label);\n console.log (property.NominalValue.value);\n break;\n }\n if (elemProperty !== null) {\n propertyGroup.AddProperty (elemProperty);\n }\n });\n if (propertyGroup.PropertyCount () > 0) {\n element.AddPropertyGroup (propertyGroup);\n }\n });\n }\n }\n\n GetMaterialIndexByColor (ifcColor)\n {\n const color = ColorFromFloatComponents (ifcColor.x, ifcColor.y, ifcColor.z);\n\n const materialName = 'Color ' +\n IntegerToHexString (color.r) +\n IntegerToHexString (color.g) +\n IntegerToHexString (color.b) +\n IntegerToHexString (parseInt (ifcColor.w * 255.0, 10));\n\n if (this.materialNameToIndex.has (materialName)) {\n return this.materialNameToIndex.get (materialName);\n } else {\n\t\t\tlet material = new PhongMaterial ();\n material.name = materialName;\n\t\t\tmaterial.color = color;\n material.opacity = ifcColor.w;\n UpdateMaterialTransparency (material);\n let materialIndex = this.model.AddMaterial (material);\n this.materialNameToIndex.set (materialName, materialIndex);\n return materialIndex;\n }\n }\n\n GetIFCString (ifcString)\n {\n let decoded = this.DecodeIFCString (ifcString);\n if (decoded.length === 0) {\n decoded = '-';\n }\n return decoded;\n }\n\n DecodeIFCString (ifcString)\n {\n // TODO: https://github.com/tomvandig/web-ifc/issues/58\n const ifcUnicodeRegEx = /\\\\X2\\\\(.*?)\\\\X0\\\\/uig;\n let resultString = ifcString;\n let match = ifcUnicodeRegEx.exec (ifcString);\n while (match) {\n const unicodeChar = String.fromCharCode (parseInt (match[1], 16));\n resultString = resultString.replace (match[0], unicodeChar);\n match = ifcUnicodeRegEx.exec (ifcString);\n }\n return resultString;\n }\n}\n", "import { Coord2D } from '../geometry/coord2d.js';\nimport { Coord3D } from '../geometry/coord3d.js';\nimport { IsPositive, IsNegative, IsZero } from '../geometry/geometry.js';\nimport { Mesh } from './mesh.js';\nimport { Triangle } from './triangle.js';\n\nexport class GeneratorParams\n{\n constructor ()\n {\n this.name = null;\n this.material = null;\n }\n\n SetName (name)\n {\n this.name = name;\n return this;\n }\n\n SetMaterial (material)\n {\n this.material = material;\n return this;\n }\n}\n\nexport class Generator\n{\n constructor (params)\n {\n this.params = params || new GeneratorParams ();\n this.mesh = new Mesh ();\n if (this.params.name !== null) {\n this.mesh.SetName (this.params.name);\n }\n this.curve = null;\n }\n\n GetMesh ()\n {\n return this.mesh;\n }\n\n AddVertex (x, y, z)\n {\n let coord = new Coord3D (x, y, z);\n return this.mesh.AddVertex (coord);\n }\n\n AddVertices (vertices)\n {\n let indices = [];\n for (let i = 0; i < vertices.length; i++) {\n let vertex = vertices[i];\n indices.push (this.AddVertex (vertex.x, vertex.y, vertex.z));\n }\n return indices;\n }\n\n SetCurve (curve)\n {\n this.curve = curve;\n }\n\n ResetCurve ()\n {\n this.curve = null;\n }\n\n AddTriangle (v0, v1, v2)\n {\n let triangle = new Triangle (v0, v1, v2);\n if (this.params.material !== null) {\n triangle.mat = this.params.material;\n }\n if (this.curve !== null) {\n triangle.SetCurve (this.curve);\n }\n return this.mesh.AddTriangle (triangle);\n }\n\n AddTriangleInverted (v0, v1, v2)\n {\n this.AddTriangle (v0, v2, v1);\n }\n\n AddConvexPolygon (vertices)\n {\n for (let vertexIndex = 0; vertexIndex < vertices.length - 2; vertexIndex++) {\n this.AddTriangle (\n vertices[0],\n vertices[vertexIndex + 1],\n vertices[vertexIndex + 2]\n );\n }\n }\n\n AddConvexPolygonInverted (vertices)\n {\n for (let vertexIndex = 0; vertexIndex < vertices.length - 2; vertexIndex++) {\n this.AddTriangleInverted (\n vertices[0],\n vertices[vertexIndex + 1],\n vertices[vertexIndex + 2]\n );\n }\n }\n}\n\nexport class GeneratorHelper\n{\n constructor (generator)\n {\n this.generator = generator;\n }\n\n GenerateSurfaceBetweenPolygons (startIndices, endIndices)\n {\n if (startIndices.length !== endIndices.length) {\n return;\n }\n const vertexCount = startIndices.length;\n for (let i = 0; i < vertexCount; i++) {\n const index = i;\n const nextIndex = (i < vertexCount - 1) ? index + 1 : 0;\n this.generator.AddConvexPolygon ([\n startIndices[index],\n startIndices[nextIndex],\n endIndices[nextIndex],\n endIndices[index]\n ]);\n }\n }\n\n GenerateTriangleFan (startIndices, endIndex)\n {\n const vertexCount = startIndices.length;\n for (let i = 0; i < vertexCount; i++) {\n const index = i;\n const nextIndex = (i < vertexCount - 1) ? index + 1 : 0;\n this.generator.AddTriangle (\n endIndex,\n startIndices[index],\n startIndices[nextIndex]\n );\n }\n }\n}\n\nfunction GetCylindricalCoord (radius, angle)\n{\n return new Coord2D (\n radius * Math.cos (angle),\n radius * Math.sin (angle)\n );\n}\n\nexport function GenerateCuboid (genParams, xSize, ySize, zSize)\n{\n if (!IsPositive (xSize) || !IsPositive (ySize) || !IsPositive (zSize)) {\n return null;\n }\n\n let generator = new Generator (genParams);\n\n generator.AddVertex (0.0, 0.0, 0.0);\n generator.AddVertex (xSize, 0.0, 0.0);\n generator.AddVertex (xSize, ySize, 0.0);\n generator.AddVertex (0.0, ySize, 0.0);\n generator.AddVertex (0.0, 0.0, zSize);\n generator.AddVertex (xSize, 0.0, zSize);\n generator.AddVertex (xSize, ySize, zSize);\n generator.AddVertex (0.0, ySize, zSize);\n\n generator.AddConvexPolygon ([0, 3, 2, 1]);\n generator.AddConvexPolygon ([0, 1, 5, 4]);\n generator.AddConvexPolygon ([1, 2, 6, 5]);\n generator.AddConvexPolygon ([2, 3, 7, 6]);\n generator.AddConvexPolygon ([3, 0, 4, 7]);\n generator.AddConvexPolygon ([4, 5, 6, 7]);\n\n return generator.GetMesh ();\n}\n\nexport function GenerateCone (genParams, topRadius, bottomRadius, height, segments, smooth)\n{\n if (IsNegative (topRadius) || IsNegative (bottomRadius)) {\n return null;\n }\n\n if (!IsPositive (height) || segments < 3) {\n return null;\n }\n\n let isZeroTop = IsZero (topRadius);\n let isZeroBottom = IsZero (bottomRadius);\n if (isZeroTop && isZeroBottom) {\n return null;\n }\n\n let generator = new Generator (genParams);\n let helper = new GeneratorHelper (generator);\n const step = 2.0 * Math.PI / segments;\n const curve = (smooth ? 1 : null);\n\n let topPolygon = [];\n if (isZeroTop) {\n topPolygon.push (generator.AddVertex (0.0, 0.0, height));\n } else {\n for (let i = 0; i < segments; i++) {\n let topVertex = GetCylindricalCoord (topRadius, i * step);\n topPolygon.push (generator.AddVertex (topVertex.x, topVertex.y, height));\n }\n }\n\n let bottomPolygon = [];\n if (isZeroBottom) {\n bottomPolygon.push (generator.AddVertex (0.0, 0.0, 0.0));\n } else {\n for (let i = 0; i < segments; i++) {\n let bottomVertex = GetCylindricalCoord (bottomRadius, i * step);\n bottomPolygon.push (generator.AddVertex (bottomVertex.x, bottomVertex.y, 0.0));\n }\n }\n\n if (isZeroTop) {\n generator.SetCurve (curve);\n helper.GenerateTriangleFan (bottomPolygon, topPolygon[0]);\n generator.ResetCurve ();\n generator.AddConvexPolygonInverted (bottomPolygon);\n } else if (isZeroBottom) {\n generator.SetCurve (curve);\n helper.GenerateTriangleFan (topPolygon.slice ().reverse (), bottomPolygon[0]);\n generator.ResetCurve ();\n generator.AddConvexPolygon (topPolygon);\n } else {\n generator.SetCurve (curve);\n helper.GenerateSurfaceBetweenPolygons (bottomPolygon, topPolygon);\n generator.ResetCurve ();\n generator.AddConvexPolygonInverted (bottomPolygon);\n generator.AddConvexPolygon (topPolygon);\n }\n\n return generator.GetMesh ();\n}\n\nexport function GenerateCylinder (genParams, radius, height, segments, smooth)\n{\n return GenerateCone (genParams, radius, radius, height, segments, smooth);\n}\n\nexport function GenerateSphere (genParams, radius, segments, smooth)\n{\n function GetSphericalCoord (radius, theta, phi)\n {\n return new Coord3D (\n radius * Math.sin (theta) * Math.cos (phi),\n radius * Math.sin (theta) * Math.sin (phi),\n radius * Math.cos (theta)\n );\n }\n\n if (!IsPositive (radius) || segments < 3) {\n return null;\n }\n\n let generator = new Generator (genParams);\n let helper = new GeneratorHelper (generator);\n\n generator.SetCurve (smooth ? 1 : null);\n\n let allLevelVertices = [];\n let levels = segments + 1;\n const levelStep = Math.PI / segments;\n\tconst cylindricalStep = 2.0 * Math.PI / segments;\n for (let levelIndex = 1; levelIndex < levels - 1; levelIndex++) {\n let levelVertices = [];\n let theta = levelIndex * levelStep;\n for (let cylindricalIndex = 0; cylindricalIndex < segments; cylindricalIndex++) {\n let phi = cylindricalIndex * cylindricalStep;\n let vertex = GetSphericalCoord (radius, theta, -phi);\n levelVertices.push (generator.AddVertex (vertex.x, vertex.y, vertex.z));\n }\n if (levelIndex > 1) {\n helper.GenerateSurfaceBetweenPolygons (allLevelVertices[allLevelVertices.length - 1], levelVertices);\n }\n allLevelVertices.push (levelVertices);\n }\n\n let topVertex = generator.AddVertex (0.0, 0.0, radius);\n let bottomVertex = generator.AddVertex (0.0, 0.0, -radius);\n helper.GenerateTriangleFan (allLevelVertices[0].slice ().reverse (), topVertex);\n helper.GenerateTriangleFan (allLevelVertices[allLevelVertices.length - 1], bottomVertex);\n\n generator.ResetCurve ();\n\n return generator.GetMesh ();\n}\n\nexport function GeneratePlatonicSolid (genParams, type, radius)\n{\n function AddVertex (generator, radius, x, y, z)\n {\n let vertex = new Coord3D (x, y, z);\n vertex.MultiplyScalar (radius / vertex.Length ());\n generator.AddVertex (vertex.x, vertex.y, vertex.z);\n }\n\n if (!IsPositive (radius)) {\n return null;\n }\n\n let generator = new Generator (genParams);\n if (type === 'tetrahedron') {\n let a = 1.0;\n AddVertex (generator, radius, +a, +a, +a);\n AddVertex (generator, radius, -a, -a, +a);\n AddVertex (generator, radius, -a, +a, -a);\n AddVertex (generator, radius, +a, -a, -a);\n generator.AddTriangle (0, 1, 3);\n generator.AddTriangle (0, 2, 1);\n generator.AddTriangle (0, 3, 2);\n generator.AddTriangle (1, 2, 3);\n } else if (type === 'hexahedron') {\n let a = 1.0;\n AddVertex (generator, radius, +a, +a, +a);\n AddVertex (generator, radius, +a, +a, -a);\n AddVertex (generator, radius, +a, -a, +a);\n AddVertex (generator, radius, +a, -a, -a);\n AddVertex (generator, radius, -a, +a, +a);\n AddVertex (generator, radius, -a, +a, -a);\n AddVertex (generator, radius, -a, -a, +a);\n AddVertex (generator, radius, -a, -a, -a);\n generator.AddConvexPolygon ([0, 1, 5, 4]);\n generator.AddConvexPolygon ([0, 2, 3, 1]);\n generator.AddConvexPolygon ([0, 4, 6, 2]);\n generator.AddConvexPolygon ([1, 3, 7, 5]);\n generator.AddConvexPolygon ([2, 6, 7, 3]);\n generator.AddConvexPolygon ([4, 5, 7, 6]);\n } else if (type === 'octahedron') {\n let a = 1.0;\n let b = 0.0;\n AddVertex (generator, radius, +a, +b, +b);\n AddVertex (generator, radius, -a, +b, +b);\n AddVertex (generator, radius, +b, +a, +b);\n AddVertex (generator, radius, +b, -a, +b);\n AddVertex (generator, radius, +b, +b, +a);\n AddVertex (generator, radius, +b, +b, -a);\n generator.AddTriangle (0, 2, 4);\n generator.AddTriangle (0, 3, 5);\n generator.AddTriangle (0, 4, 3);\n generator.AddTriangle (0, 5, 2);\n generator.AddTriangle (1, 2, 5);\n generator.AddTriangle (1, 3, 4);\n generator.AddTriangle (1, 4, 2);\n generator.AddTriangle (1, 5, 3);\n } else if (type === 'dodecahedron') {\n let a = 1.0;\n let b = 0.0;\n let c = (1.0 + Math.sqrt (5.0)) / 2.0;\n let d = 1.0 / c;\n AddVertex (generator, radius, +a, +a, +a);\n AddVertex (generator, radius, +a, +a, -a);\n AddVertex (generator, radius, +a, -a, +a);\n AddVertex (generator, radius, -a, +a, +a);\n AddVertex (generator, radius, +a, -a, -a);\n AddVertex (generator, radius, -a, +a, -a);\n AddVertex (generator, radius, -a, -a, +a);\n AddVertex (generator, radius, -a, -a, -a);\n AddVertex (generator, radius, +b, +d, +c);\n AddVertex (generator, radius, +b, +d, -c);\n AddVertex (generator, radius, +b, -d, +c);\n AddVertex (generator, radius, +b, -d, -c);\n AddVertex (generator, radius, +d, +c, +b);\n AddVertex (generator, radius, +d, -c, +b);\n AddVertex (generator, radius, -d, +c, +b);\n AddVertex (generator, radius, -d, -c, +b);\n AddVertex (generator, radius, +c, +b, +d);\n AddVertex (generator, radius, -c, +b, +d);\n AddVertex (generator, radius, +c, +b, -d);\n AddVertex (generator, radius, -c, +b, -d);\n generator.AddConvexPolygon ([0, 8, 10, 2, 16]);\n generator.AddConvexPolygon ([0, 16, 18, 1, 12]);\n generator.AddConvexPolygon ([0, 12, 14, 3, 8]);\n generator.AddConvexPolygon ([1, 9, 5, 14, 12]);\n generator.AddConvexPolygon ([1, 18, 4, 11, 9]);\n generator.AddConvexPolygon ([2, 10, 6, 15, 13]);\n generator.AddConvexPolygon ([2, 13, 4, 18, 16]);\n generator.AddConvexPolygon ([3, 14, 5, 19, 17]);\n generator.AddConvexPolygon ([3, 17, 6, 10, 8]);\n generator.AddConvexPolygon ([4, 13, 15, 7, 11]);\n generator.AddConvexPolygon ([5, 9, 11, 7, 19]);\n generator.AddConvexPolygon ([6, 17, 19, 7, 15]);\n } else if (type === 'icosahedron') {\n let a = 1.0;\n let b = 0.0;\n let c = (1.0 + Math.sqrt (5.0)) / 2.0;\n AddVertex (generator, radius, +b, +a, +c);\n AddVertex (generator, radius, +b, +a, -c);\n AddVertex (generator, radius, +b, -a, +c);\n AddVertex (generator, radius, +b, -a, -c);\n AddVertex (generator, radius, +a, +c, +b);\n AddVertex (generator, radius, +a, -c, +b);\n AddVertex (generator, radius, -a, +c, +b);\n AddVertex (generator, radius, -a, -c, +b);\n AddVertex (generator, radius, +c, +b, +a);\n AddVertex (generator, radius, +c, +b, -a);\n AddVertex (generator, radius, -c, +b, +a);\n AddVertex (generator, radius, -c, +b, -a);\n generator.AddTriangle (0, 2, 8);\n generator.AddTriangle (0, 4, 6);\n generator.AddTriangle (0, 6, 10);\n generator.AddTriangle (0, 8, 4);\n generator.AddTriangle (0, 10, 2);\n generator.AddTriangle (1, 3, 11);\n generator.AddTriangle (1, 4, 9);\n generator.AddTriangle (1, 6, 4);\n generator.AddTriangle (1, 9, 3);\n generator.AddTriangle (1, 11, 6);\n generator.AddTriangle (2, 5, 8);\n generator.AddTriangle (2, 7, 5);\n generator.AddTriangle (2, 10, 7);\n generator.AddTriangle (3, 5, 7);\n generator.AddTriangle (3, 7, 11);\n generator.AddTriangle (3, 9, 5);\n generator.AddTriangle (4, 8, 9);\n generator.AddTriangle (5, 9, 8);\n generator.AddTriangle (6, 11, 10);\n generator.AddTriangle (7, 10, 11);\n }\n return generator.GetMesh ();\n}\n", "import { ValueOrDefault } from '../core/core.js';\nimport { ArrayToCoord3D, Coord3D } from '../geometry/coord3d.js';\nimport { Direction } from '../geometry/geometry.js';\nimport { Matrix } from '../geometry/matrix.js';\nimport { ArrayToQuaternion, Quaternion } from '../geometry/quaternion.js';\nimport { Transformation } from '../geometry/transformation.js';\nimport { ArrayBufferToUtf8String } from '../io/bufferutils.js';\nimport { ArrayToColor } from '../model/color.js';\nimport { GenerateCone, GenerateCuboid, GenerateCylinder, GeneratePlatonicSolid, GenerateSphere, GeneratorParams } from '../model/generator.js';\nimport { PhysicalMaterial } from '../model/material.js';\nimport { Node, NodeType } from '../model/node.js';\nimport { Property, PropertyGroup, PropertyType } from '../model/property.js';\nimport { ImporterBase } from './importerbase.js';\n\nexport class ImporterO3dv extends ImporterBase\n{\n constructor ()\n {\n super ();\n }\n\n CanImportExtension (extension)\n {\n return extension === 'o3dv';\n }\n\n GetUpDirection ()\n {\n return Direction.Z;\n }\n\n ClearContent ()\n {\n\n }\n\n ResetContent ()\n {\n\n }\n\n ImportContent (fileContent, onFinish)\n {\n let textContent = ArrayBufferToUtf8String (fileContent);\n let content = JSON.parse (textContent);\n if (content.root === undefined) {\n onFinish ();\n return;\n }\n\n if (content.materials !== undefined) {\n for (let i = 0; i < content.materials.length; i++) {\n const materialContent = content.materials[i];\n this.ImportMaterial (materialContent);\n }\n }\n if (content.meshes !== undefined) {\n for (let i = 0; i < content.meshes.length; i++) {\n const meshContent = content.meshes[i];\n this.ImportMesh (meshContent);\n }\n }\n\n let rootNode = content.nodes[content.root];\n this.ImportNode (content, rootNode, this.model.GetRootNode ());\n this.ImportProperties (this.model, content);\n\n onFinish ();\n }\n\n ImportMaterial (materialContent)\n {\n let material = new PhysicalMaterial ();\n material.color.Set (255, 255, 255);\n if (materialContent.name !== undefined) {\n material.name = materialContent.name;\n }\n if (materialContent.color !== undefined) {\n material.color = ArrayToColor (materialContent.color);\n }\n material.metalness = ValueOrDefault (materialContent.metalness, 0.0);\n material.roughness = ValueOrDefault (materialContent.roughness, 1.0);\n this.model.AddMaterial (material);\n }\n\n ImportMesh (meshContent)\n {\n let genParams = new GeneratorParams ();\n if (meshContent.name !== undefined) {\n genParams.SetName (meshContent.name);\n }\n if (meshContent.material !== undefined) {\n genParams.SetMaterial (meshContent.material);\n }\n\n let parameters = meshContent.parameters;\n if (parameters === undefined) {\n return;\n }\n\n let mesh = null;\n if (meshContent.type === 'cuboid') {\n if (parameters.size_x === undefined || parameters.size_y === undefined || parameters.size_z === undefined) {\n return;\n }\n mesh = GenerateCuboid (genParams, parameters.size_x, parameters.size_y, parameters.size_z);\n } else if (meshContent.type === 'cylinder') {\n if (parameters.radius === undefined || parameters.height === undefined) {\n return;\n }\n let segments = ValueOrDefault (parameters.segments, 25);\n let smooth = ValueOrDefault (parameters.smooth, true);\n mesh = GenerateCylinder (genParams, parameters.radius, parameters.height, segments, smooth);\n } else if (meshContent.type === 'cone') {\n if (parameters.top_radius === undefined || parameters.bottom_radius === undefined || parameters.height === undefined) {\n return;\n }\n let segments = ValueOrDefault (parameters.segments, 25);\n let smooth = ValueOrDefault (parameters.smooth, true);\n mesh = GenerateCone (genParams, parameters.top_radius, parameters.bottom_radius, parameters.height, segments, smooth);\n } else if (meshContent.type === 'sphere') {\n if (parameters.radius === undefined) {\n return;\n }\n let segments = ValueOrDefault (parameters.segments, 20);\n let smooth = ValueOrDefault (parameters.smooth, true);\n mesh = GenerateSphere (genParams, parameters.radius, segments, smooth);\n } else if (meshContent.type === 'platonic') {\n if (parameters.solid_type === undefined) {\n return;\n }\n let radius = ValueOrDefault (parameters.radius, 1.0);\n mesh = GeneratePlatonicSolid (genParams, parameters.solid_type, radius);\n }\n if (mesh !== null) {\n this.ImportProperties (mesh, meshContent);\n this.model.AddMesh (mesh);\n }\n }\n\n ImportNode (content, nodeContent, node)\n {\n if (nodeContent.name !== undefined) {\n node.SetName (nodeContent.name);\n }\n if (nodeContent.transformation !== undefined) {\n const nodeTransformation = this.GetTransformation (nodeContent.transformation);\n node.SetTransformation (nodeTransformation);\n }\n if (nodeContent.children !== undefined) {\n for (const childIndex of nodeContent.children) {\n let childContent = content.nodes[childIndex];\n let childNode = new Node ();\n node.AddChildNode (childNode);\n this.ImportNode (content, childContent, childNode);\n }\n }\n if (nodeContent.mesh !== undefined) {\n if (nodeContent.children === undefined || nodeContent.children.length === 0) {\n node.SetType (NodeType.MeshNode);\n }\n node.AddMeshIndex (nodeContent.mesh);\n }\n }\n\n ImportProperties (element, nodeContent)\n {\n if (nodeContent.properties !== undefined) {\n const propertyGroup = new PropertyGroup ('Properties');\n element.AddPropertyGroup (propertyGroup);\n for (const nodeProperty of nodeContent.properties) {\n const property = new Property (PropertyType.Text, nodeProperty.name, nodeProperty.value);\n propertyGroup.AddProperty (property);\n }\n }\n }\n\n GetTransformation (contentTransformation)\n {\n let translation = new Coord3D (0.0, 0.0, 0.0);\n let rotation = new Quaternion (0.0, 0.0, 0.0, 1.0);\n let scale = new Coord3D (1.0, 1.0, 1.0);\n if (contentTransformation.translation !== undefined) {\n translation = ArrayToCoord3D (contentTransformation.translation);\n }\n if (contentTransformation.rotation !== undefined) {\n rotation = ArrayToQuaternion (contentTransformation.rotation);\n }\n if (contentTransformation.scale !== undefined) {\n scale = ArrayToCoord3D (contentTransformation.scale);\n }\n const matrix = new Matrix ().ComposeTRS (translation, rotation, scale);\n return new Transformation (matrix);\n }\n}\n", "import { Coord2D } from '../geometry/coord2d.js';\nimport { Coord3D } from '../geometry/coord3d.js';\nimport { Direction } from '../geometry/geometry.js';\nimport { ArrayBufferToUtf8String } from '../io/bufferutils.js';\nimport { Color, ColorFromFloatComponents } from '../model/color.js';\nimport { PhongMaterial, TextureMap } from '../model/material.js';\nimport { Mesh } from '../model/mesh.js';\nimport { Triangle } from '../model/triangle.js';\nimport { ImporterBase } from './importerbase.js';\nimport { NameFromLine, ParametersFromLine, ReadLines, UpdateMaterialTransparency } from './importerutils.js';\n\nclass ObjMeshConverter\n{\n constructor (mesh)\n {\n this.mesh = mesh;\n this.globalToMeshVertices = new Map ();\n this.globalToMeshVertexColors = new Map ();\n this.globalToMeshNormals = new Map ();\n this.globalToMeshUvs = new Map ();\n }\n\n AddVertex (globalIndex, globalVertices)\n {\n return this.GetLocalIndex (globalIndex, globalVertices, this.globalToMeshVertices, (val) => {\n return this.mesh.AddVertex (new Coord3D (val.x, val.y, val.z));\n });\n }\n\n AddVertexColor (globalIndex, globalVertexColors)\n {\n return this.GetLocalIndex (globalIndex, globalVertexColors, this.globalToMeshVertexColors, (val) => {\n return this.mesh.AddVertexColor (new Color (val.r, val.g, val.b));\n });\n }\n\n AddNormal (globalIndex, globalNormals)\n {\n return this.GetLocalIndex (globalIndex, globalNormals, this.globalToMeshNormals, (val) => {\n return this.mesh.AddNormal (new Coord3D (val.x, val.y, val.z));\n });\n }\n\n AddUV (globalIndex, globalUvs)\n {\n return this.GetLocalIndex (globalIndex, globalUvs, this.globalToMeshUvs, (val) => {\n return this.mesh.AddTextureUV (new Coord2D (val.x, val.y));\n });\n }\n\n AddTriangle (triangle)\n {\n this.mesh.AddTriangle (triangle);\n }\n\n GetLocalIndex (globalIndex, globalValueArray, globalToMeshIndices, valueAdderFunc)\n {\n if (isNaN (globalIndex) || globalIndex < 0 || globalIndex >= globalValueArray.length) {\n return null;\n }\n if (globalToMeshIndices.has (globalIndex)) {\n return globalToMeshIndices.get (globalIndex);\n } else {\n let globalValue = globalValueArray[globalIndex];\n let localIndex = valueAdderFunc (globalValue);\n globalToMeshIndices.set (globalIndex, localIndex);\n return localIndex;\n }\n }\n}\n\nfunction CreateColor (r, g, b)\n{\n return ColorFromFloatComponents (\n parseFloat (r),\n parseFloat (g),\n parseFloat (b)\n );\n}\n\nexport class ImporterObj extends ImporterBase\n{\n constructor ()\n {\n super ();\n }\n\n CanImportExtension (extension)\n {\n return extension === 'obj';\n }\n\n GetUpDirection ()\n {\n return Direction.Y;\n }\n\n ClearContent ()\n {\n this.globalVertices = null;\n this.globalVertexColors = null;\n this.globalNormals = null;\n this.globalUvs = null;\n\n this.currentMeshConverter = null;\n this.currentMaterial = null;\n this.currentMaterialIndex = null;\n\n this.meshNameToConverter = null;\n this.materialNameToIndex = null;\n }\n\n ResetContent ()\n {\n this.globalVertices = [];\n this.globalVertexColors = [];\n this.globalNormals = [];\n this.globalUvs = [];\n\n this.currentMeshConverter = null;\n this.currentMaterial = null;\n this.currentMaterialIndex = null;\n\n this.meshNameToConverter = new Map ();\n this.materialNameToIndex = new Map ();\n }\n\n ImportContent (fileContent, onFinish)\n {\n let textContent = ArrayBufferToUtf8String (fileContent);\n ReadLines (textContent, (line) => {\n if (!this.WasError ()) {\n this.ProcessLine (line);\n }\n });\n onFinish ();\n }\n\n ProcessLine (line)\n {\n if (line[0] === '#') {\n return;\n }\n\n let parameters = ParametersFromLine (line, '#');\n if (parameters.length === 0) {\n return;\n }\n\n let keyword = parameters[0].toLowerCase ();\n parameters.shift ();\n\n if (this.ProcessMeshParameter (keyword, parameters, line)) {\n return;\n }\n\n if (this.ProcessMaterialParameter (keyword, parameters, line)) {\n return;\n }\n }\n\n AddNewMesh (name)\n {\n if (this.meshNameToConverter.has (name)) {\n this.currentMeshConverter = this.meshNameToConverter.get (name);\n } else {\n let mesh = new Mesh ();\n mesh.SetName (name);\n this.model.AddMeshToRootNode (mesh);\n this.currentMeshConverter = new ObjMeshConverter (mesh);\n this.meshNameToConverter.set (name, this.currentMeshConverter);\n }\n }\n\n ProcessMeshParameter (keyword, parameters, line)\n {\n if (keyword === 'g' || keyword === 'o') {\n if (parameters.length === 0) {\n return true;\n }\n let name = NameFromLine (line, keyword.length, '#');\n this.AddNewMesh (name);\n return true;\n } else if (keyword === 'v') {\n if (parameters.length < 3) {\n return true;\n }\n this.globalVertices.push (new Coord3D (\n parseFloat (parameters[0]),\n parseFloat (parameters[1]),\n parseFloat (parameters[2])\n ));\n if (parameters.length >= 6) {\n this.globalVertexColors.push (CreateColor (parameters[3], parameters[4], parameters[5]));\n }\n return true;\n } else if (keyword === 'vn') {\n if (parameters.length < 3) {\n return true;\n }\n this.globalNormals.push (new Coord3D (\n parseFloat (parameters[0]),\n parseFloat (parameters[1]),\n parseFloat (parameters[2])\n ));\n return true;\n } else if (keyword === 'vt') {\n if (parameters.length < 2) {\n return true;\n }\n this.globalUvs.push (new Coord2D (\n parseFloat (parameters[0]),\n parseFloat (parameters[1])\n ));\n return true;\n } else if (keyword === 'f') {\n if (parameters.length < 3) {\n return true;\n }\n this.ProcessFace (parameters);\n return true;\n }\n\n return false;\n }\n\n ProcessMaterialParameter (keyword, parameters, line)\n {\n function CreateTexture (keyword, line, callbacks)\n {\n let texture = new TextureMap ();\n let textureName = NameFromLine (line, keyword.length, '#');\n let textureBuffer = callbacks.getTextureBuffer (textureName);\n texture.name = textureName;\n if (textureBuffer !== null) {\n texture.url = textureBuffer.url;\n texture.buffer = textureBuffer.buffer;\n }\n return texture;\n }\n\n if (keyword === 'newmtl') {\n if (parameters.length === 0) {\n return true;\n }\n\n let material = new PhongMaterial ();\n let materialName = NameFromLine (line, keyword.length, '#');\n let materialIndex = this.model.AddMaterial (material);\n material.name = materialName;\n this.currentMaterial = material;\n this.materialNameToIndex.set (materialName, materialIndex);\n return true;\n } else if (keyword === 'usemtl') {\n if (parameters.length === 0) {\n return true;\n }\n\n let materialName = NameFromLine (line, keyword.length, '#');\n if (this.materialNameToIndex.has (materialName)) {\n this.currentMaterialIndex = this.materialNameToIndex.get (materialName);\n }\n return true;\n } else if (keyword === 'mtllib') {\n if (parameters.length === 0) {\n return true;\n }\n let fileName = NameFromLine (line, keyword.length, '#');\n let fileBuffer = this.callbacks.getFileBuffer (fileName);\n if (fileBuffer !== null) {\n let textContent = ArrayBufferToUtf8String (fileBuffer);\n ReadLines (textContent, (line) => {\n if (!this.WasError ()) {\n this.ProcessLine (line);\n }\n });\n }\n return true;\n } else if (keyword === 'map_kd') {\n if (this.currentMaterial === null || parameters.length === 0) {\n return true;\n }\n this.currentMaterial.diffuseMap = CreateTexture (keyword, line, this.callbacks);\n UpdateMaterialTransparency (this.currentMaterial);\n return true;\n } else if (keyword === 'map_ks') {\n if (this.currentMaterial === null || parameters.length === 0) {\n return true;\n }\n this.currentMaterial.specularMap = CreateTexture (keyword, line, this.callbacks);\n return true;\n } else if (keyword === 'map_bump' || keyword === 'bump') {\n if (this.currentMaterial === null || parameters.length === 0) {\n return true;\n }\n this.currentMaterial.bumpMap = CreateTexture (keyword, line, this.callbacks);\n return true;\n } else if (keyword === 'ka') {\n if (this.currentMaterial === null || parameters.length < 3) {\n return true;\n }\n this.currentMaterial.ambient = CreateColor (parameters[0], parameters[1], parameters[2]);\n return true;\n } else if (keyword === 'kd') {\n if (this.currentMaterial === null || parameters.length < 3) {\n return true;\n }\n this.currentMaterial.color = CreateColor (parameters[0], parameters[1], parameters[2]);\n return true;\n } else if (keyword === 'ks') {\n if (this.currentMaterial === null || parameters.length < 3) {\n return true;\n }\n this.currentMaterial.specular = CreateColor (parameters[0], parameters[1], parameters[2]);\n return true;\n } else if (keyword === 'ns') {\n if (this.currentMaterial === null || parameters.length < 1) {\n return true;\n }\n this.currentMaterial.shininess = parseFloat (parameters[0]) / 1000.0;\n return true;\n } else if (keyword === 'tr') {\n if (this.currentMaterial === null || parameters.length < 1) {\n return true;\n }\n this.currentMaterial.opacity = 1.0 - parseFloat (parameters[0]);\n UpdateMaterialTransparency (this.currentMaterial);\n return true;\n } else if (keyword === 'd') {\n if (this.currentMaterial === null || parameters.length < 1) {\n return true;\n }\n this.currentMaterial.opacity = parseFloat (parameters[0]);\n UpdateMaterialTransparency (this.currentMaterial);\n return true;\n }\n\n return false;\n }\n\n ProcessFace (parameters)\n {\n function GetRelativeIndex (index, count)\n {\n if (index > 0) {\n return index - 1;\n } else {\n return count + index;\n }\n }\n\n let vertices = [];\n let colors = [];\n let normals = [];\n let uvs = [];\n\n for (let i = 0; i < parameters.length; i++) {\n let vertexParams = parameters[i].split ('/');\n vertices.push (GetRelativeIndex (parseInt (vertexParams[0], 10), this.globalVertices.length));\n if (this.globalVertices.length === this.globalVertexColors.length) {\n colors.push (GetRelativeIndex (parseInt (vertexParams[0], 10), this.globalVertices.length));\n }\n if (vertexParams.length > 1 && vertexParams[1].length > 0) {\n uvs.push (GetRelativeIndex (parseInt (vertexParams[1], 10), this.globalUvs.length));\n }\n if (vertexParams.length > 2 && vertexParams[2].length > 0) {\n normals.push (GetRelativeIndex (parseInt (vertexParams[2], 10), this.globalNormals.length));\n }\n }\n\n if (this.currentMeshConverter === null) {\n this.AddNewMesh ('');\n }\n\n for (let i = 0; i < vertices.length - 2; i++) {\n let v0 = this.currentMeshConverter.AddVertex (vertices[0], this.globalVertices);\n let v1 = this.currentMeshConverter.AddVertex (vertices[i + 1], this.globalVertices);\n let v2 = this.currentMeshConverter.AddVertex (vertices[i + 2], this.globalVertices);\n if (v0 === null || v1 === null || v2 === null) {\n this.SetError ('Invalid vertex index.');\n break;\n }\n\n let triangle = new Triangle (v0, v1, v2);\n\n if (colors.length === vertices.length) {\n let c0 = this.currentMeshConverter.AddVertexColor (colors[0], this.globalVertexColors);\n let c1 = this.currentMeshConverter.AddVertexColor (colors[i + 1], this.globalVertexColors);\n let c2 = this.currentMeshConverter.AddVertexColor (colors[i + 2], this.globalVertexColors);\n if (c0 === null || c1 === null || c2 === null) {\n this.SetError ('Invalid vertex color index.');\n break;\n }\n triangle.SetVertexColors (c0, c1, c2);\n }\n\n if (normals.length === vertices.length) {\n let n0 = this.currentMeshConverter.AddNormal (normals[0], this.globalNormals);\n let n1 = this.currentMeshConverter.AddNormal (normals[i + 1], this.globalNormals);\n let n2 = this.currentMeshConverter.AddNormal (normals[i + 2], this.globalNormals);\n if (n0 === null || n1 === null || n2 === null) {\n this.SetError ('Invalid normal index.');\n break;\n }\n triangle.SetNormals (n0, n1, n2);\n }\n\n if (uvs.length === vertices.length) {\n let u0 = this.currentMeshConverter.AddUV (uvs[0], this.globalUvs);\n let u1 = this.currentMeshConverter.AddUV (uvs[i + 1], this.globalUvs);\n let u2 = this.currentMeshConverter.AddUV (uvs[i + 2], this.globalUvs);\n if (u0 === null || u1 === null || u2 === null) {\n this.SetError ('Invalid uv index.');\n break;\n }\n triangle.SetTextureUVs (u0, u1, u2);\n }\n\n if (this.currentMaterialIndex !== null) {\n triangle.mat = this.currentMaterialIndex;\n }\n\n this.currentMeshConverter.AddTriangle (triangle);\n }\n }\n}\n", "import { Coord3D } from '../geometry/coord3d.js';\nimport { Direction } from '../geometry/geometry.js';\nimport { ArrayBufferToUtf8String } from '../io/bufferutils.js';\nimport { Mesh } from '../model/mesh.js';\nimport { Triangle } from '../model/triangle.js';\nimport { ImporterBase } from './importerbase.js';\nimport { ParametersFromLine, ReadLines } from './importerutils.js';\n\nexport class ImporterOff extends ImporterBase\n{\n constructor ()\n {\n super ();\n }\n\n CanImportExtension (extension)\n {\n return extension === 'off';\n }\n\n GetUpDirection ()\n {\n return Direction.Y;\n }\n\n ClearContent ()\n {\n this.mesh = null;\n this.status = null;\n }\n\n ResetContent ()\n {\n this.mesh = new Mesh ();\n this.model.AddMeshToRootNode (this.mesh);\n this.status = {\n vertexCount : 0,\n faceCount : 0,\n foundVertex : 0,\n foundFace : 0\n };\n }\n\n ImportContent (fileContent, onFinish)\n {\n let textContent = ArrayBufferToUtf8String (fileContent);\n ReadLines (textContent, (line) => {\n if (!this.WasError ()) {\n this.ProcessLine (line);\n }\n });\n onFinish ();\n }\n\n ProcessLine (line)\n {\n if (line[0] === '#') {\n return;\n }\n\n let parameters = ParametersFromLine (line, '#');\n if (parameters.length === 0) {\n return;\n }\n\n if (parameters[0] === 'OFF') {\n return;\n }\n\n if (this.status.vertexCount === 0 && this.status.faceCount === 0) {\n if (parameters.length > 1) {\n this.status.vertexCount = parseInt (parameters[0], 10);\n this.status.faceCount = parseInt (parameters[1], 10);\n }\n return;\n }\n\n if (this.status.foundVertex < this.status.vertexCount) {\n if (parameters.length >= 3) {\n this.mesh.AddVertex (new Coord3D (\n parseFloat (parameters[0]),\n parseFloat (parameters[1]),\n parseFloat (parameters[2])\n ));\n this.status.foundVertex += 1;\n }\n return;\n }\n\n if (this.status.foundFace < this.status.faceCount) {\n if (parameters.length >= 4) {\n let vertexCount = parseInt (parameters[0], 10);\n if (parameters.length < vertexCount + 1) {\n return;\n }\n for (let i = 0; i < vertexCount - 2; i++) {\n let v0 = parseInt (parameters[1]);\n let v1 = parseInt (parameters[i + 2]);\n let v2 = parseInt (parameters[i + 3]);\n let triangle = new Triangle (v0, v1, v2);\n this.mesh.AddTriangle (triangle);\n }\n this.status.foundFace += 1;\n }\n return;\n }\n }\n}\n", "import { Coord3D } from '../geometry/coord3d.js';\nimport { Direction } from '../geometry/geometry.js';\nimport { BinaryReader } from '../io/binaryreader.js';\nimport { ArrayBufferToUtf8String } from '../io/bufferutils.js';\nimport { Color, IntegerToHexString } from '../model/color.js';\nimport { PhongMaterial } from '../model/material.js';\nimport { Mesh } from '../model/mesh.js';\nimport { Triangle } from '../model/triangle.js';\nimport { ImporterBase } from './importerbase.js';\nimport { ParametersFromLine, ReadLines, UpdateMaterialTransparency } from './importerutils.js';\n\nconst PlyHeaderCheckResult =\n{\n Ok : 1,\n NoVertices : 2,\n NoFaces : 3,\n UnknownError : 4\n};\n\nclass PlyHeader\n{\n constructor ()\n {\n this.format = null;\n this.elements = [];\n }\n\n SetFormat (format)\n {\n this.format = format;\n }\n\n AddElement (name, count)\n {\n this.elements.push ({\n name : name,\n count : count,\n format : []\n });\n }\n\n GetElements ()\n {\n return this.elements;\n }\n\n AddSingleFormat (elemType, name)\n {\n let lastElement = this.elements[this.elements.length - 1];\n lastElement.format.push ({\n name : name,\n isSingle : true,\n elemType : elemType\n });\n }\n\n AddListFormat (countType, elemType, name)\n {\n let lastElement = this.elements[this.elements.length - 1];\n lastElement.format.push ({\n name : name,\n isSingle : false,\n countType : countType,\n elemType : elemType\n });\n }\n\n GetElement (name)\n {\n for (let i = 0; i < this.elements.length; i++) {\n let element = this.elements[i];\n if (element.name === name) {\n return element;\n }\n }\n return null;\n }\n\n Check ()\n {\n let vertex = this.GetElement ('vertex');\n if (vertex === null || vertex.length === 0 || vertex.format.length < 3) {\n return PlyHeaderCheckResult.NoVertices;\n }\n\n let face = this.GetElement ('face');\n if (this.format === 'ascii') {\n if (face === null || face.count === 0 || face.format.length < 0) {\n return PlyHeaderCheckResult.NoFaces;\n }\n } else if (this.format === 'binary_little_endian' || this.format === 'binary_big_endian') {\n let triStrips = this.GetElement ('tristrips');\n let hasFaces = (face !== null && face.count > 0 && face.format.length > 0);\n let hasTriStrips = (triStrips !== null && triStrips.count > 0 && triStrips.format.length > 0);\n if (!hasFaces && !hasTriStrips) {\n return PlyHeaderCheckResult.NoFaces;\n }\n } else {\n return PlyHeaderCheckResult.UnknownError;\n }\n\n return PlyHeaderCheckResult.Ok;\n }\n}\n\nclass PlyMaterialHandler\n{\n constructor (model)\n {\n this.model = model;\n this.colorToMaterial = new Map ();\n }\n\n GetMaterialIndexByColor (color)\n {\n let materialName = 'Color ' +\n IntegerToHexString (color[0]) +\n IntegerToHexString (color[1]) +\n IntegerToHexString (color[2]) +\n IntegerToHexString (color[3]);\n\n if (this.colorToMaterial.has (materialName)) {\n return this.colorToMaterial.get (materialName);\n } else {\n let material = new PhongMaterial ();\n material.name = materialName;\n material.color = new Color (color[0], color[1], color[2]);\n material.opacity = color[3] / 255.0;\n UpdateMaterialTransparency (material);\n let materialIndex = this.model.AddMaterial (material);\n this.colorToMaterial.set (materialName, materialIndex);\n return materialIndex;\n }\n }\n}\n\nexport class ImporterPly extends ImporterBase\n{\n constructor ()\n {\n super ();\n }\n\n CanImportExtension (extension)\n {\n return extension === 'ply';\n }\n\n GetUpDirection ()\n {\n return Direction.Y;\n }\n\n ClearContent ()\n {\n this.mesh = null;\n }\n\n ResetContent ()\n {\n this.mesh = new Mesh ();\n this.model.AddMeshToRootNode (this.mesh);\n }\n\n ImportContent (fileContent, onFinish)\n {\n let headerString = this.GetHeaderContent (fileContent);\n let header = this.ReadHeader (headerString);\n let checkResult = header.Check ();\n if (checkResult === PlyHeaderCheckResult.Ok) {\n if (header.format === 'ascii') {\n let contentString = ArrayBufferToUtf8String (fileContent);\n contentString = contentString.substring (headerString.length);\n this.ReadAsciiContent (header, contentString);\n } else if (header.format === 'binary_little_endian' || header.format === 'binary_big_endian') {\n this.ReadBinaryContent (header, fileContent, headerString.length);\n }\n } else {\n if (checkResult === PlyHeaderCheckResult.NoVertices) {\n this.SetError ('The model contains no vertices.');\n } else if (checkResult === PlyHeaderCheckResult.NoFaces) {\n this.SetError ('The model contains no faces.');\n } else {\n this.SetError ('Invalid header information.');\n }\n }\n onFinish ();\n }\n\n GetHeaderContent (fileContent)\n {\n let headerContent = '';\n let bufferView = new Uint8Array (fileContent);\n let bufferIndex = 0;\n for (bufferIndex = 0; bufferIndex < fileContent.byteLength; bufferIndex++) {\n headerContent += String.fromCharCode (bufferView[bufferIndex]);\n if (headerContent.endsWith ('end_header')) {\n break;\n }\n }\n bufferIndex += 1;\n while (bufferIndex < fileContent.byteLength) {\n let char = String.fromCharCode (bufferView[bufferIndex]);\n headerContent += char;\n bufferIndex += 1;\n if (char === '\\n') {\n break;\n }\n }\n return headerContent;\n }\n\n ReadHeader (headerContent)\n {\n let header = new PlyHeader ();\n ReadLines (headerContent, (line) => {\n let parameters = ParametersFromLine (line, null);\n if (parameters.length === 0 || parameters[0] === 'comment') {\n return;\n }\n\n if (parameters[0] === 'ply') {\n return;\n } else if (parameters[0] === 'format' && parameters.length >= 2) {\n header.SetFormat (parameters[1]);\n } else if (parameters[0] === 'element' && parameters.length >= 3) {\n header.AddElement (parameters[1], parseInt (parameters[2], 10));\n } else if (parameters[0] === 'property' && parameters.length >= 3) {\n if (parameters[1] === 'list' && parameters.length >= 5) {\n header.AddListFormat (parameters[2], parameters[3], parameters[4]);\n } else {\n header.AddSingleFormat (parameters[1], parameters[2]);\n }\n }\n });\n\n return header;\n }\n\n ReadAsciiContent (header, fileContent)\n {\n let vertex = header.GetElement ('vertex');\n let face = header.GetElement ('face');\n let foundVertex = 0;\n let foundFace = 0;\n ReadLines (fileContent, (line) => {\n if (this.WasError ()) {\n return;\n }\n\n let parameters = ParametersFromLine (line, null);\n if (parameters.length === 0 || parameters[0] === 'comment') {\n return;\n }\n\n if (foundVertex < vertex.count) {\n if (parameters.length >= 3) {\n this.mesh.AddVertex (new Coord3D (\n parseFloat (parameters[0]),\n parseFloat (parameters[1]),\n parseFloat (parameters[2])\n ));\n foundVertex += 1;\n }\n return;\n }\n\n if (face !== null && foundFace < face.count) {\n if (parameters.length >= 4) {\n let vertexCount = parseInt (parameters[0], 10);\n if (parameters.length < vertexCount + 1) {\n return;\n }\n for (let i = 0; i < vertexCount - 2; i++) {\n let v0 = parseInt (parameters[1]);\n let v1 = parseInt (parameters[i + 2]);\n let v2 = parseInt (parameters[i + 3]);\n let triangle = new Triangle (v0, v1, v2);\n this.mesh.AddTriangle (triangle);\n }\n foundFace += 1;\n }\n return;\n }\n });\n }\n\n ReadBinaryContent (header, fileContent, headerLength)\n {\n function ReadByFormat (reader, format)\n {\n function ReadType (reader, type)\n {\n if (type === 'char' || type === 'int8') {\n return reader.ReadCharacter8 ();\n } else if (type === 'uchar' || type === 'uint8') {\n return reader.ReadUnsignedCharacter8 ();\n } else if (type === 'short' || type === 'int16') {\n return reader.ReadInteger16 ();\n } else if (type === 'ushort' || type === 'uint16') {\n return reader.ReadUnsignedInteger16 ();\n } else if (type === 'int' || type === 'int32') {\n return reader.ReadInteger32 ();\n } else if (type === 'uint' || type === 'uint32') {\n return reader.ReadUnsignedInteger32 ();\n } else if (type === 'float' || type === 'float32') {\n return reader.ReadFloat32 ();\n } else if (type === 'double' || type === 'double64') {\n return reader.ReadDouble64 ();\n }\n return null;\n }\n\n if (format.isSingle) {\n return ReadType (reader, format.elemType);\n } else {\n let list = [];\n let count = ReadType (reader, format.countType);\n for (let i = 0; i < count; i++) {\n list.push (ReadType (reader, format.elemType));\n }\n return list;\n }\n }\n\n function SkipFormat (reader, format, startIndex)\n {\n for (let i = startIndex; i < format.length; i++) {\n ReadByFormat (reader, format[i]);\n }\n }\n\n function SkipAndGetColor (reader, format, startIndex)\n {\n let r = null;\n let g = null;\n let b = null;\n let a = 255;\n\n for (let i = startIndex; i < format.length; i++) {\n let currFormat = format[i];\n let val = ReadByFormat (reader, currFormat);\n if (currFormat.name === 'red') {\n r = val;\n } else if (currFormat.name === 'green') {\n g = val;\n } else if (currFormat.name === 'blue') {\n b = val;\n } else if (currFormat.name === 'alpha') {\n a = val;\n }\n }\n\n if (r !== null && g !== null && b !== null) {\n return [r, g, b, a];\n }\n\n return null;\n }\n\n let reader = null;\n if (header.format === 'binary_little_endian') {\n reader = new BinaryReader (fileContent, true);\n } else if (header.format === 'binary_big_endian') {\n reader = new BinaryReader (fileContent, false);\n } else {\n return;\n }\n reader.Skip (headerLength);\n\n let materialHandler = new PlyMaterialHandler (this.model);\n let elements = header.GetElements ();\n for (let elementIndex = 0; elementIndex < elements.length; elementIndex++) {\n let element = elements[elementIndex];\n if (element.name === 'vertex') {\n for (let vertexIndex = 0; vertexIndex < element.count; vertexIndex++) {\n let x = ReadByFormat (reader, element.format[0]);\n let y = ReadByFormat (reader, element.format[1]);\n let z = ReadByFormat (reader, element.format[2]);\n let color = SkipAndGetColor (reader, element.format, 3);\n if (color !== null) {\n this.mesh.AddVertexColor (new Color (color[0], color[1], color[2]));\n }\n this.mesh.AddVertex (new Coord3D (x, y, z));\n }\n } else if (element.name === 'face') {\n for (let faceIndex = 0; faceIndex < element.count; faceIndex++) {\n let vertices = ReadByFormat (reader, element.format[0]);\n let faceColor = SkipAndGetColor (reader, element.format, 1);\n for (let i = 0; i < vertices.length - 2; i++) {\n let v0 = vertices[0];\n let v1 = vertices[i + 1];\n let v2 = vertices[i + 2];\n let triangle = new Triangle (v0, v1, v2);\n if (faceColor !== null) {\n triangle.mat = materialHandler.GetMaterialIndexByColor (faceColor);\n } else if (this.mesh.VertexColorCount () > 0) {\n triangle.SetVertexColors (v0, v1, v2);\n }\n this.mesh.AddTriangle (triangle);\n }\n }\n } else if (element.name === 'tristrips') {\n for (let triStripIndex = 0; triStripIndex < element.count; triStripIndex++) {\n let vertices = ReadByFormat (reader, element.format[0]);\n SkipFormat (reader, element.format, 1);\n let ccw = true;\n for (let i = 0; i < vertices.length - 2; i++) {\n let v0 = vertices[i];\n let v1 = vertices[i + 1];\n let v2 = vertices[i + 2];\n if (v2 === -1) {\n i += 2;\n ccw = true;\n continue;\n }\n if (!ccw) {\n let tmp = v1;\n v1 = v2;\n v2 = tmp;\n }\n ccw = !ccw;\n let triangle = new Triangle (v0, v1, v2);\n this.mesh.AddTriangle (triangle);\n }\n }\n } else {\n SkipFormat (reader, element.format, 0);\n }\n }\n }\n}\n", "import { Direction } from '../geometry/geometry.js';\nimport { GetExternalLibPath } from '../io/externallibs.js';\nimport { ColorFromFloatComponents, ColorToHexString } from '../model/color.js';\nimport { PhongMaterial } from '../model/material.js';\nimport { ConvertThreeGeometryToMesh } from '../threejs/threeutils.js';\nimport { ImporterBase } from './importerbase.js';\nimport { ColorToMaterialConverter } from './importerutils.js';\n\nexport class ImporterStp extends ImporterBase\n{\n constructor ()\n {\n super ();\n\t\tthis.worker = null;\n }\n\n CanImportExtension (extension)\n {\n return extension === 'stp' || extension === 'step';\n }\n\n GetUpDirection ()\n {\n return Direction.Y;\n }\n\n\tClearContent ()\n\t{\n\n\t}\n\n ResetContent ()\n {\n\n }\n\n ImportContent (fileContent, onFinish)\n {\n if (this.worker === null) {\n let workerPath = GetExternalLibPath ('loaders/occt-import-js-worker.js');\n this.worker = new Worker (workerPath);\n }\n\n let onModelConverted = (ev) => {\n this.ImportStepContent (ev.data, onFinish);\n this.worker.removeEventListener ('message', onModelConverted);\n };\n\n this.worker.addEventListener ('message', onModelConverted);\n this.worker.addEventListener ('error', (ev) => {\n this.worker = null;\n this.SetError ('Failed to load occt-import-js.');\n onFinish ();\n });\n\n let fileBuffer = new Uint8Array (fileContent);\n this.worker.postMessage (fileBuffer);\n }\n\n\tImportStepContent (stepContent, onFinish)\n\t{\n if (!stepContent.success) {\n return;\n }\n let colorToMaterial = new ColorToMaterialConverter ((color) => {\n let material = new PhongMaterial ();\n material.name = ColorToHexString (color).toUpperCase ();\n material.color = color;\n return this.model.AddMaterial (material);\n });\n for (let occtMesh of stepContent.meshes) {\n let materialIndex = null;\n if (occtMesh.color) {\n let color = ColorFromFloatComponents (occtMesh.color[0], occtMesh.color[1], occtMesh.color[2]);\n materialIndex = colorToMaterial.GetMaterialIndex (color);\n }\n let mesh = ConvertThreeGeometryToMesh (occtMesh, materialIndex);\n if (occtMesh.name) {\n mesh.SetName (occtMesh.name);\n }\n if (occtMesh.face_colors) {\n for (let faceColorGroup of occtMesh.face_colors) {\n let faceColor = ColorFromFloatComponents (faceColorGroup.color[0], faceColorGroup.color[1], faceColorGroup.color[2]);\n let faceMaterialIndex = colorToMaterial.GetMaterialIndex (faceColor);\n for (let i = faceColorGroup.first; i <= faceColorGroup.last; i++) {\n let triangle = mesh.GetTriangle (i);\n triangle.SetMaterial (faceMaterialIndex);\n }\n }\n }\n this.model.AddMeshToRootNode (mesh);\n }\n onFinish ();\n\t}\n}\n", "import { Coord3D } from '../geometry/coord3d.js';\nimport { Direction, IsPositive } from '../geometry/geometry.js';\nimport { BinaryReader } from '../io/binaryreader.js';\nimport { ArrayBufferToUtf8String } from '../io/bufferutils.js';\nimport { Mesh } from '../model/mesh.js';\nimport { Triangle } from '../model/triangle.js';\nimport { ImporterBase } from './importerbase.js';\nimport { NameFromLine, ParametersFromLine, ReadLines } from './importerutils.js';\n\nexport class ImporterStl extends ImporterBase\n{\n constructor ()\n {\n super ();\n }\n\n CanImportExtension (extension)\n {\n return extension === 'stl';\n }\n\n GetUpDirection ()\n {\n return Direction.Z;\n }\n\n ClearContent ()\n {\n this.mesh = null;\n this.triangle = null;\n }\n\n ResetContent ()\n {\n this.mesh = new Mesh ();\n this.model.AddMeshToRootNode (this.mesh);\n this.triangle = null;\n }\n\n ImportContent (fileContent, onFinish)\n {\n if (this.IsBinaryStlFile (fileContent)) {\n this.ProcessBinary (fileContent);\n } else {\n let textContent = ArrayBufferToUtf8String (fileContent);\n ReadLines (textContent, (line) => {\n if (!this.WasError ()) {\n this.ProcessLine (line);\n }\n });\n }\n onFinish ();\n }\n\n IsBinaryStlFile (fileContent)\n {\n let byteLength = fileContent.byteLength;\n if (byteLength < 84) {\n return false;\n }\n\n let reader = new BinaryReader (fileContent, true);\n reader.Skip (80);\n\n let triangleCount = reader.ReadUnsignedInteger32 ();\n if (byteLength !== triangleCount * 50 + 84) {\n return false;\n }\n\n return true;\n }\n\n ProcessLine (line)\n {\n if (line[0] === '#') {\n return;\n }\n\n let parameters = ParametersFromLine (line, '#');\n if (parameters.length === 0) {\n return;\n }\n\n let keyword = parameters[0];\n if (keyword === 'solid') {\n if (parameters.length > 1) {\n let name = NameFromLine (line, keyword.length, '#');\n this.mesh.SetName (name);\n }\n return;\n }\n\n if (keyword === 'facet') {\n this.triangle = new Triangle (-1, -1, -1);\n if (parameters.length >= 5 && parameters[1] === 'normal') {\n let normalVector = new Coord3D (\n parseFloat (parameters[2]),\n parseFloat (parameters[3]),\n parseFloat (parameters[4])\n );\n if (IsPositive (normalVector.Length ())) {\n let normalIndex = this.mesh.AddNormal (normalVector);\n this.triangle.SetNormals (\n normalIndex,\n normalIndex,\n normalIndex\n );\n }\n }\n return;\n }\n\n if (keyword === 'vertex' && this.triangle !== null) {\n if (parameters.length >= 4) {\n let vertexIndex = this.mesh.AddVertex (new Coord3D (\n parseFloat (parameters[1]),\n parseFloat (parameters[2]),\n parseFloat (parameters[3])\n ));\n if (this.triangle.v0 === -1) {\n this.triangle.v0 = vertexIndex;\n } else if (this.triangle.v1 === -1) {\n this.triangle.v1 = vertexIndex;\n } else if (this.triangle.v2 === -1) {\n this.triangle.v2 = vertexIndex;\n }\n }\n return;\n }\n\n if (keyword === 'endfacet' && this.triangle !== null) {\n if (this.triangle.v0 !== -1 && this.triangle.v1 !== -1 && this.triangle.v2 !== null) {\n this.mesh.AddTriangle (this.triangle);\n }\n this.triangle = null;\n return;\n }\n }\n\n ProcessBinary (fileContent)\n {\n function ReadVector (reader)\n {\n let coord = new Coord3D ();\n coord.x = reader.ReadFloat32 ();\n coord.y = reader.ReadFloat32 ();\n coord.z = reader.ReadFloat32 ();\n return coord;\n }\n\n function AddVertex (mesh, reader)\n {\n let coord = ReadVector (reader);\n return mesh.AddVertex (coord);\n }\n\n let reader = new BinaryReader (fileContent, true);\n reader.Skip (80);\n let triangleCount = reader.ReadUnsignedInteger32 ();\n for (let i = 0; i < triangleCount; i++) {\n let normalVector = ReadVector (reader);\n let v0 = AddVertex (this.mesh, reader);\n let v1 = AddVertex (this.mesh, reader);\n let v2 = AddVertex (this.mesh, reader);\n reader.Skip (2);\n let triangle = new Triangle (v0, v1, v2);\n if (IsPositive (normalVector.Length ())) {\n let normal = this.mesh.AddNormal (normalVector);\n triangle.SetNormals (normal, normal, normal);\n }\n this.mesh.AddTriangle (triangle);\n }\n }\n}\n", "import { Coord3D } from '../geometry/coord3d.js';\nimport { Direction } from '../geometry/geometry.js';\nimport { ArrayBufferToUtf8String } from '../io/bufferutils.js';\nimport { Node, NodeType } from '../model/node.js';\nimport { PhongMaterial } from '../model/material.js';\nimport { Color, IntegerToHexString } from '../model/color.js';\nimport { Mesh } from '../model/mesh.js';\nimport { Triangle } from '../model/triangle.js';\nimport { ImporterBase } from './importerbase.js';\nimport { Quaternion } from '../geometry/quaternion.js';\nimport { Matrix } from '../geometry/matrix.js';\nimport { Transformation } from '../geometry/transformation.js';\nimport { UpdateMaterialTransparency } from './importerutils.js';\nimport { Property, PropertyGroup, PropertyType } from '../model/property.js';\n\nexport class ImporterBim extends ImporterBase\n{\n constructor ()\n {\n super ();\n }\n\n CanImportExtension (extension)\n {\n return extension === 'bim';\n }\n\n GetUpDirection ()\n {\n return Direction.Z;\n }\n\n ClearContent ()\n {\n this.meshIdToMesh = null;\n this.colorToMaterialIndex = null;\n }\n\n ResetContent ()\n {\n this.meshIdToMesh = new Map ();\n this.colorToMaterialIndex = new Map ();\n }\n\n ImportContent (fileContent, onFinish)\n {\n let textContent = ArrayBufferToUtf8String (fileContent);\n let bimJson = null;\n try {\n bimJson = JSON.parse (textContent);\n } catch (err) {\n this.SetError ('Failed to parse bim file.');\n onFinish ();\n return;\n }\n\n for (let bimMesh of bimJson.meshes) {\n this.meshIdToMesh.set (bimMesh.mesh_id, bimMesh);\n }\n\n this.ImportProperties (bimJson, this.model);\n for (let bimElement of bimJson.elements) {\n let mesh = this.ImportElement (bimElement);\n mesh.SetName (bimElement.type);\n this.ImportProperties (bimElement, mesh);\n }\n\n onFinish ();\n }\n\n ImportElement (bimElement)\n {\n let materialIndex = null;\n if (bimElement.color) {\n let colorKey =\n IntegerToHexString (bimElement.color.r) +\n IntegerToHexString (bimElement.color.g) +\n IntegerToHexString (bimElement.color.b) +\n IntegerToHexString (bimElement.color.a);\n if (this.colorToMaterialIndex.has (colorKey)) {\n materialIndex = this.colorToMaterialIndex.get (colorKey);\n } else {\n let material = new PhongMaterial ();\n material.name = colorKey;\n material.color = new Color (bimElement.color.r, bimElement.color.g, bimElement.color.b);\n if (bimElement.color.a < 255) {\n material.opacity = bimElement.color.a / 255.0;\n UpdateMaterialTransparency (material);\n }\n materialIndex = this.model.AddMaterial (material);\n this.colorToMaterialIndex.set (colorKey, materialIndex);\n }\n }\n\n let rootNode = this.model.GetRootNode ();\n\n let bimMesh = this.meshIdToMesh.get (bimElement.mesh_id);\n let mesh = this.ImportMesh (bimMesh, materialIndex);\n let meshIndex = this.model.AddMesh (mesh);\n\n let elementNode = new Node ();\n elementNode.SetType (NodeType.MeshNode);\n elementNode.AddMeshIndex (meshIndex);\n\n let translation = new Coord3D (0.0, 0.0, 0.0);\n if (bimElement.vector) {\n translation = new Coord3D (\n bimElement.vector.x,\n bimElement.vector.y,\n bimElement.vector.z\n );\n }\n let rotation = new Quaternion (0.0, 0.0, 0.0, 1.0);\n if (bimElement.rotation) {\n rotation = new Quaternion (\n bimElement.rotation.qx,\n bimElement.rotation.qy,\n bimElement.rotation.qz,\n bimElement.rotation.qw\n );\n }\n let scale = new Coord3D (1.0, 1.0, 1.0);\n let matrix = new Matrix ().ComposeTRS (translation, rotation, scale);\n elementNode.SetTransformation (new Transformation (matrix));\n\n rootNode.AddChildNode (elementNode);\n return mesh;\n }\n\n ImportMesh (bimMesh, materialIndex)\n {\n let mesh = new Mesh ();\n\n for (let i = 0; i < bimMesh.coordinates.length; i += 3) {\n mesh.AddVertex (new Coord3D (\n bimMesh.coordinates[i + 0],\n bimMesh.coordinates[i + 1],\n bimMesh.coordinates[i + 2]\n ));\n }\n\n for (let i = 0; i < bimMesh.indices.length; i += 3) {\n let triangle = new Triangle (\n bimMesh.indices[i + 0],\n bimMesh.indices[i + 1],\n bimMesh.indices[i + 2]\n );\n if (materialIndex !== null) {\n triangle.SetMaterial (materialIndex);\n }\n mesh.AddTriangle (triangle);\n }\n\n return mesh;\n }\n\n ImportProperties (source, target)\n {\n function AddProperty (group, name, value)\n {\n if (value === undefined || value === null) {\n return;\n }\n let property = new Property (PropertyType.Text, name, value);\n group.AddProperty (property);\n }\n\n if (!source.info) {\n return;\n }\n\n let info = source.info;\n let propertyGroup = new PropertyGroup ('Info');\n AddProperty (propertyGroup, 'Guid', source.guid);\n AddProperty (propertyGroup, 'Type', source.type);\n for (let propertyName in info) {\n if (Object.prototype.hasOwnProperty.call (info, propertyName)) {\n if (typeof info[propertyName] === 'string') {\n AddProperty (propertyGroup, propertyName, info[propertyName]);\n }\n }\n }\n target.AddPropertyGroup (propertyGroup);\n }\n}\n", "import { WaitWhile } from '../core/taskrunner.js';\nimport { Direction } from '../geometry/geometry.js';\nimport { Matrix } from '../geometry/matrix.js';\nimport { Transformation } from '../geometry/transformation.js';\nimport { Base64DataURIToArrayBuffer, CreateObjectUrl, GetFileExtensionFromMimeType } from '../io/bufferutils.js';\nimport { LoadExternalLibrary } from '../io/externallibs.js';\nimport { GetFileExtension, GetFileName } from '../io/fileutils.js';\nimport { PhongMaterial, TextureMap } from '../model/material.js';\nimport { Node, NodeType } from '../model/node.js';\nimport { ConvertThreeColorToColor, ConvertThreeGeometryToMesh } from '../threejs/threeutils.js';\nimport { ImporterBase } from './importerbase.js';\n\nexport class ImporterThreeBase extends ImporterBase\n{\n constructor ()\n {\n super ();\n }\n\n GetExternalLibraries ()\n {\n return null;\n }\n\n CreateLoader (manager)\n {\n return null;\n }\n\n GetMainObject (loadedObject)\n {\n return loadedObject;\n }\n\n IsMeshVisible (mesh)\n {\n return true;\n }\n\n ClearContent ()\n {\n this.loader = null;\n this.materialIdToIndex = null;\n this.objectUrlToFileName = null;\n }\n\n ResetContent ()\n {\n this.loader = null;\n this.materialIdToIndex = new Map ();\n this.objectUrlToFileName = new Map ();\n }\n\n ImportContent (fileContent, onFinish)\n {\n async function LoadLibraries (libraries, onFinish, onError)\n {\n try {\n for (let i = 0; i < libraries.length; i++) {\n await LoadExternalLibrary (libraries[i]);\n }\n } catch (err) {\n onError ();\n }\n onFinish ();\n }\n\n const libraries = this.GetExternalLibraries ();\n if (libraries === null) {\n onFinish ();\n return;\n }\n\n LoadLibraries (libraries, () => {\n this.LoadModel (fileContent, onFinish);\n }, () => {\n this.SetError ('Failed to load three.js loader.');\n onFinish ();\n });\n }\n\n LoadModel (fileContent, onFinish)\n {\n let isAllLoadersDone = false;\n let loadingManager = new THREE.LoadingManager (() => {\n isAllLoadersDone = true;\n });\n\n const mainFileUrl = CreateObjectUrl (fileContent);\n loadingManager.setURLModifier ((url) => {\n if (url === mainFileUrl) {\n return url;\n }\n const name = GetFileName (url);\n const extension = GetFileExtension (url);\n if (extension.length > 0) {\n const buffer = this.callbacks.getFileBuffer (url);\n if (buffer !== null) {\n let objectUrl = CreateObjectUrl (buffer);\n this.objectUrlToFileName.set (objectUrl, name);\n return objectUrl;\n }\n }\n return url;\n });\n\n const threeLoader = this.CreateLoader (loadingManager);\n if (threeLoader === null) {\n onFinish ();\n return;\n }\n\n threeLoader.load (mainFileUrl,\n (object) => {\n WaitWhile (() => {\n if (isAllLoadersDone) {\n this.OnThreeObjectsLoaded (object, onFinish);\n return false;\n }\n return true;\n });\n },\n () => {\n },\n (err) => {\n this.SetError (err);\n onFinish ();\n }\n );\n }\n\n OnThreeObjectsLoaded (loadedObject, onFinish)\n {\n function GetObjectTransformation (threeObject)\n {\n let matrix = new Matrix ().CreateIdentity ();\n threeObject.updateMatrix ();\n if (threeObject.matrix !== undefined && threeObject.matrix !== null) {\n matrix.Set (threeObject.matrix.elements);\n }\n return new Transformation (matrix);\n }\n\n function AddObject (importer, model, threeObject, parentNode)\n {\n let node = new Node ();\n if (threeObject.name !== undefined) {\n node.SetName (threeObject.name);\n }\n node.SetTransformation (GetObjectTransformation (threeObject));\n parentNode.AddChildNode (node);\n\n for (let childObject of threeObject.children) {\n AddObject (importer, model, childObject, node);\n }\n if (threeObject.isMesh && importer.IsMeshVisible (threeObject)) {\n if (threeObject.children.length === 0) {\n node.SetType (NodeType.MeshNode);\n }\n let mesh = importer.ConvertThreeMesh (threeObject);\n let meshIndex = model.AddMesh (mesh);\n node.AddMeshIndex (meshIndex);\n }\n }\n\n let mainObject = this.GetMainObject (loadedObject);\n let rootNode = this.model.GetRootNode ();\n rootNode.SetTransformation (GetObjectTransformation (mainObject));\n for (let childObject of mainObject.children) {\n AddObject (this, this.model, childObject, rootNode);\n }\n\n onFinish ();\n }\n\n ConvertThreeMesh (threeMesh)\n {\n let mesh = null;\n if (Array.isArray (threeMesh.material)) {\n mesh = ConvertThreeGeometryToMesh (threeMesh.geometry, null);\n if (threeMesh.geometry.attributes.color === undefined || threeMesh.geometry.attributes.color === null) {\n let materialIndices = [];\n for (let i = 0; i < threeMesh.material.length; i++) {\n const material = threeMesh.material[i];\n const materialIndex = this.FindOrCreateMaterial (material);\n materialIndices.push (materialIndex);\n }\n for (let i = 0; i < threeMesh.geometry.groups.length; i++) {\n let group = threeMesh.geometry.groups[i];\n let groupEnd = null;\n if (group.count === Infinity) {\n groupEnd = mesh.TriangleCount ();\n } else {\n groupEnd = group.start / 3 + group.count / 3;\n }\n for (let j = group.start / 3; j < groupEnd; j++) {\n let triangle = mesh.GetTriangle (j);\n triangle.SetMaterial (materialIndices[group.materialIndex]);\n }\n }\n }\n } else {\n const materialIndex = this.FindOrCreateMaterial (threeMesh.material);\n mesh = ConvertThreeGeometryToMesh (threeMesh.geometry, materialIndex);\n }\n if (threeMesh.name !== undefined && threeMesh.name !== null) {\n mesh.SetName (threeMesh.name);\n }\n return mesh;\n }\n\n FindOrCreateMaterial (threeMaterial)\n {\n if (this.materialIdToIndex.has (threeMaterial.id)) {\n return this.materialIdToIndex.get (threeMaterial.id);\n }\n let material = this.ConvertThreeMaterial (threeMaterial);\n let materialIndex = this.model.AddMaterial (material);\n this.materialIdToIndex.set (threeMaterial.id, materialIndex);\n return materialIndex;\n }\n\n ConvertThreeMaterial (threeMaterial)\n {\n function CreateTexture (threeMap, objectUrlToFileName)\n {\n function GetDataUrl (img)\n {\n if (img.data !== undefined && img.data !== null) {\n let imageData = new ImageData (img.width, img.height);\n let imageSize = img.width * img.height * 4;\n for (let i = 0; i < imageSize; i++) {\n imageData.data[i] = img.data[i];\n }\n return THREE.ImageUtils.getDataURL (imageData);\n } else {\n return THREE.ImageUtils.getDataURL (img);\n }\n }\n\n if (threeMap === undefined || threeMap === null) {\n return null;\n }\n\n if (threeMap.image === undefined || threeMap.image === null) {\n return null;\n }\n\n try {\n const dataUrl = GetDataUrl (threeMap.image);\n const base64Buffer = Base64DataURIToArrayBuffer (dataUrl);\n let texture = new TextureMap ();\n let textureName = null;\n if (objectUrlToFileName.has (threeMap.image.src)) {\n textureName = objectUrlToFileName.get (threeMap.image.src);\n } else if (threeMap.name !== undefined && threeMap.name !== null) {\n textureName = threeMap.name + '.' + GetFileExtensionFromMimeType (base64Buffer.mimeType);\n } else {\n textureName = 'Embedded_' + threeMap.id.toString () + '.' + GetFileExtensionFromMimeType (base64Buffer.mimeType);\n }\n texture.name = textureName;\n texture.url = dataUrl;\n texture.buffer = base64Buffer.buffer;\n texture.rotation = threeMap.rotation;\n texture.offset.x = threeMap.offset.x;\n texture.offset.y = threeMap.offset.y;\n texture.scale.x = threeMap.repeat.x;\n texture.scale.y = threeMap.repeat.y;\n return texture;\n } catch (err) {\n return null;\n }\n }\n\n let material = new PhongMaterial ();\n material.name = threeMaterial.name;\n material.color = ConvertThreeColorToColor (threeMaterial.color);\n material.opacity = threeMaterial.opacity;\n material.transparent = threeMaterial.transparent;\n material.alphaTest = threeMaterial.alphaTest;\n if (threeMaterial.type === 'MeshPhongMaterial') {\n material.specular = ConvertThreeColorToColor (threeMaterial.specular);\n material.shininess = threeMaterial.shininess / 100.0;\n }\n material.diffuseMap = CreateTexture (threeMaterial.map, this.objectUrlToFileName);\n material.normalMap = CreateTexture (threeMaterial.normalMap, this.objectUrlToFileName);\n material.bumpMap = CreateTexture (threeMaterial.bumpMap, this.objectUrlToFileName);\n\n return material;\n }\n}\n\nexport class ImporterThreeFbx extends ImporterThreeBase\n{\n constructor ()\n {\n super ();\n }\n\n CanImportExtension (extension)\n {\n return extension === 'fbx';\n }\n\n GetUpDirection ()\n {\n return Direction.Y;\n }\n\n GetExternalLibraries ()\n {\n return [\n 'loaders/fflate.min.js',\n 'three_loaders/TGALoader.js',\n 'three_loaders/FBXLoader.js'\n ];\n }\n\n CreateLoader (manager)\n {\n manager.addHandler (/\\.tga$/i, new THREE.TGALoader (manager));\n return new THREE.FBXLoader (manager);\n }\n\n GetMainObject (loadedObject)\n {\n return loadedObject;\n }\n}\n\nexport class ImporterThreeDae extends ImporterThreeBase\n{\n constructor ()\n {\n super ();\n }\n\n CanImportExtension (extension)\n {\n return extension === 'dae';\n }\n\n GetUpDirection ()\n {\n return Direction.Y;\n }\n\n GetExternalLibraries ()\n {\n return [\n 'three_loaders/TGALoader.js',\n 'three_loaders/ColladaLoader.js'\n ];\n }\n\n CreateLoader (manager)\n {\n manager.addHandler (/\\.tga$/i, new THREE.TGALoader (manager));\n return new THREE.ColladaLoader (manager);\n }\n\n GetMainObject (loadedObject)\n {\n return loadedObject.scene;\n }\n}\n\nexport class ImporterThreeWrl extends ImporterThreeBase\n{\n constructor ()\n {\n super ();\n }\n\n CanImportExtension (extension)\n {\n return extension === 'wrl';\n }\n\n GetUpDirection ()\n {\n return Direction.Y;\n }\n\n GetExternalLibraries ()\n {\n return [\n 'three_loaders/chevrotain.min.js',\n 'three_loaders/VRMLLoader.js'\n ];\n }\n\n CreateLoader (manager)\n {\n return new THREE.VRMLLoader (manager);\n }\n\n GetMainObject (loadedObject)\n {\n return loadedObject;\n }\n\n IsMeshVisible (mesh)\n {\n let isVisible = true;\n if (Array.isArray (mesh.material)) {\n for (let i = 0; i < mesh.material.length; i++) {\n if (mesh.material[i].side === THREE.BackSide) {\n isVisible = false;\n break;\n }\n }\n } else {\n isVisible = (mesh.material.side !== THREE.BackSide);\n }\n return isVisible;\n }\n}\n\nexport class ImporterThree3mf extends ImporterThreeBase\n{\n constructor ()\n {\n super ();\n }\n\n CanImportExtension (extension)\n {\n return extension === '3mf';\n }\n\n GetUpDirection ()\n {\n return Direction.Z;\n }\n\n GetExternalLibraries ()\n {\n return [\n 'loaders/fflate.min.js',\n 'three_loaders/3MFLoader.js'\n ];\n }\n\n CreateLoader (manager)\n {\n return new THREE.ThreeMFLoader (manager);\n }\n\n GetMainObject (loadedObject)\n {\n return loadedObject;\n }\n}\n", "import { RunTaskAsync } from '../core/taskrunner.js';\nimport { CreateObjectUrl, RevokeObjectUrl } from '../io/bufferutils.js';\nimport { LoadExternalLibrary } from '../io/externallibs.js';\nimport { FileSource, GetFileName } from '../io/fileutils.js';\nimport { Color } from '../model/color.js';\nimport { File, FileList } from './filelist.js';\nimport { Importer3dm } from './importer3dm.js';\nimport { Importer3ds } from './importer3ds.js';\nimport { ImporterGltf } from './importergltf.js';\nimport { ImporterIfc } from './importerifc.js';\nimport { ImporterO3dv } from './importero3dv.js';\nimport { ImporterObj } from './importerobj.js';\nimport { ImporterOff } from './importeroff.js';\nimport { ImporterPly } from './importerply.js';\nimport { ImporterStp } from './importerstp.js';\nimport { ImporterStl } from './importerstl.js';\nimport { ImporterBim } from './importerbim.js';\nimport { ImporterThree3mf, ImporterThreeDae, ImporterThreeFbx, ImporterThreeWrl } from './importerthree.js';\n\nexport class ImportSettings\n{\n constructor ()\n {\n this.defaultColor = new Color (200, 200, 200);\n }\n}\n\nexport const ImportErrorCode =\n{\n NoImportableFile : 1,\n FailedToLoadFile : 2,\n ImportFailed : 3,\n UnknownError : 4\n};\n\nexport class ImportError\n{\n constructor (code)\n {\n this.code = code;\n this.mainFile = null;\n this.message = null;\n }\n}\n\nexport class ImportResult\n{\n constructor ()\n {\n this.model = null;\n this.mainFile = null;\n this.upVector = null;\n this.usedFiles = null;\n this.missingFiles = null;\n }\n}\n\nexport class ImporterFileAccessor\n{\n constructor (getBufferCallback)\n {\n this.getBufferCallback = getBufferCallback;\n this.fileBuffers = new Map ();\n this.textureBuffers = new Map ();\n }\n\n GetFileBuffer (filePath)\n {\n let fileName = GetFileName (filePath);\n if (this.fileBuffers.has (fileName)) {\n return this.fileBuffers.get (fileName);\n }\n let buffer = this.getBufferCallback (fileName);\n this.fileBuffers.set (fileName, buffer);\n return buffer;\n }\n\n GetTextureBuffer (filePath)\n {\n let fileName = GetFileName (filePath);\n if (this.textureBuffers.has (fileName)) {\n return this.textureBuffers.get (fileName);\n }\n let buffer = null;\n let textureBuffer = this.getBufferCallback (fileName);\n if (textureBuffer !== null) {\n buffer = {\n url : CreateObjectUrl (textureBuffer),\n buffer : textureBuffer\n };\n }\n this.textureBuffers.set (fileName, buffer);\n return buffer;\n }\n}\n\nexport class Importer\n{\n constructor ()\n {\n this.importers = [\n new ImporterObj (),\n new ImporterStl (),\n new ImporterOff (),\n new ImporterPly (),\n new Importer3ds (),\n new ImporterGltf (),\n new ImporterO3dv (),\n new ImporterBim (),\n new Importer3dm (),\n new ImporterIfc (),\n new ImporterStp (),\n new ImporterThreeFbx (),\n new ImporterThreeDae (),\n new ImporterThreeWrl (),\n new ImporterThree3mf ()\n ];\n this.fileList = new FileList ();\n this.model = null;\n this.usedFiles = [];\n this.missingFiles = [];\n }\n\n\tAddImporter (importer)\n\t{\n\t\tthis.importers.push (importer);\n\t}\n\n ImportFiles (fileList, fileSource, settings, callbacks)\n {\n this.LoadFiles (fileList, fileSource, () => {\n callbacks.onFilesLoaded ();\n RunTaskAsync (() => {\n this.ImportLoadedFiles (settings, callbacks);\n });\n });\n }\n\n LoadFiles (fileList, fileSource, onReady)\n {\n let newFileList = new FileList ();\n if (fileSource === FileSource.Url) {\n newFileList.FillFromFileUrls (fileList);\n } else if (fileSource === FileSource.File) {\n newFileList.FillFromFileObjects (fileList);\n }\n let reset = false;\n if (this.HasImportableFile (newFileList)) {\n reset = true;\n } else {\n let foundMissingFile = false;\n for (let i = 0; i < this.missingFiles.length; i++) {\n let missingFile = this.missingFiles[i];\n if (newFileList.ContainsFileByPath (missingFile)) {\n foundMissingFile = true;\n }\n }\n if (!foundMissingFile) {\n reset = true;\n } else {\n let newFiles = newFileList.GetFiles ();\n this.fileList.ExtendFromFileList (newFiles);\n reset = false;\n }\n }\n if (reset) {\n this.fileList = newFileList;\n }\n this.fileList.GetContent (() => {\n this.DecompressArchives (this.fileList, () => {\n onReady ();\n });\n });\n }\n\n ImportLoadedFiles (settings, callbacks)\n {\n let importableFiles = this.GetImportableFiles (this.fileList);\n if (importableFiles.length === 0) {\n callbacks.onImportError (new ImportError (ImportErrorCode.NoImportableFile));\n return;\n }\n\n if (importableFiles.length === 1 || !callbacks.onSelectMainFile) {\n let mainFile = importableFiles[0];\n this.ImportLoadedMainFile (mainFile, settings, callbacks);\n } else {\n let fileNames = importableFiles.map (importableFile => importableFile.file.name);\n callbacks.onSelectMainFile (fileNames, (mainFileIndex) => {\n if (mainFileIndex === null) {\n callbacks.onImportError (new ImportError (ImportErrorCode.NoImportableFile));\n return;\n }\n RunTaskAsync (() => {\n let mainFile = importableFiles[mainFileIndex];\n this.ImportLoadedMainFile (mainFile, settings, callbacks);\n });\n });\n }\n }\n\n ImportLoadedMainFile (mainFile, settings, callbacks)\n {\n if (mainFile === null || mainFile.file === null || mainFile.file.content === null) {\n let error = new ImportError (ImportErrorCode.FailedToLoadFile);\n if (mainFile !== null && mainFile.file !== null) {\n error.mainFile = mainFile.file.name;\n }\n callbacks.onImportError (error);\n return;\n }\n\n this.RevokeModelUrls ();\n this.model = null;\n this.usedFiles = [];\n this.missingFiles = [];\n this.usedFiles.push (mainFile.file.name);\n\n let importer = mainFile.importer;\n let fileAccessor = new ImporterFileAccessor ((fileName) => {\n let fileBuffer = null;\n let file = this.fileList.FindFileByPath (fileName);\n if (file === null || file.content === null) {\n this.missingFiles.push (fileName);\n fileBuffer = null;\n } else {\n this.usedFiles.push (fileName);\n fileBuffer = file.content;\n }\n return fileBuffer;\n });\n\n importer.Import (mainFile.file.name, mainFile.file.extension, mainFile.file.content, {\n getDefaultMaterialColor : () => {\n return settings.defaultColor;\n },\n getFileBuffer : (filePath) => {\n return fileAccessor.GetFileBuffer (filePath);\n },\n getTextureBuffer : (filePath) => {\n return fileAccessor.GetTextureBuffer (filePath);\n },\n onSuccess : () => {\n this.model = importer.GetModel ();\n let result = new ImportResult ();\n result.mainFile = mainFile.file.name;\n result.model = this.model;\n result.usedFiles = this.usedFiles;\n result.missingFiles = this.missingFiles;\n result.upVector = importer.GetUpDirection ();\n callbacks.onImportSuccess (result);\n },\n onError : () => {\n let error = new ImportError (ImportErrorCode.ImportFailed);\n error.mainFile = mainFile.file.name;\n error.message = importer.GetErrorMessage ();\n callbacks.onImportError (error);\n },\n onComplete : () => {\n importer.Clear ();\n }\n });\n }\n\n DecompressArchives (fileList, onReady)\n {\n let files = fileList.GetFiles ();\n let archives = [];\n for (let file of files) {\n if (file.extension === 'zip') {\n archives.push (file);\n }\n }\n if (archives.length === 0) {\n onReady ();\n return;\n }\n LoadExternalLibrary ('loaders/fflate.min.js').then (() => {\n for (let i = 0; i < archives.length; i++) {\n const archiveFile = archives[i];\n const archiveBuffer = new Uint8Array (archiveFile.content);\n const decompressed = fflate.unzipSync (archiveBuffer);\n for (const fileName in decompressed) {\n if (Object.prototype.hasOwnProperty.call (decompressed, fileName)) {\n let file = new File (fileName, FileSource.Decompressed);\n file.SetContent (decompressed[fileName].buffer);\n fileList.AddFile (file);\n }\n }\n }\n onReady ();\n }).catch (() => {\n onReady ();\n });\n }\n\n GetFileList ()\n {\n return this.fileList;\n }\n\n HasImportableFile (fileList)\n {\n let importableFiles = this.GetImportableFiles (fileList);\n return importableFiles.length > 0;\n }\n\n GetImportableFiles (fileList)\n {\n function FindImporter (file, importers)\n {\n for (let importerIndex = 0; importerIndex < importers.length; importerIndex++) {\n let importer = importers[importerIndex];\n if (importer.CanImportExtension (file.extension)) {\n return importer;\n }\n }\n return null;\n }\n\n let importableFiles = [];\n let files = fileList.GetFiles ();\n for (let fileIndex = 0; fileIndex < files.length; fileIndex++) {\n let file = files[fileIndex];\n let importer = FindImporter (file, this.importers);\n if (importer !== null) {\n importableFiles.push ({\n file : file,\n importer : importer\n });\n }\n }\n return importableFiles;\n }\n\n RevokeModelUrls ()\n {\n if (this.model === null) {\n return;\n }\n for (let i = 0; i < this.model.MaterialCount (); i++) {\n let material = this.model.GetMaterial (i);\n material.EnumerateTextureMaps ((texture) => {\n if (texture.url !== null) {\n RevokeObjectUrl (texture.url);\n }\n });\n }\n }\n}\n", "import { CoordDistance3D, SubCoord3D } from './coord3d.js';\n\nexport function BezierTweenFunction (distance, index, count)\n{\n let t = index / count;\n\treturn distance * (t * t * (3.0 - 2.0 * t));\n}\n\nexport function LinearTweenFunction (distance, index, count)\n{\n return index * distance / count;\n}\n\nexport function ParabolicTweenFunction (distance, index, count)\n{\n let t = index / count;\n let t2 = t * t;\n return distance * (t2 / (2.0 * (t2 - t) + 1.0));\n}\n\nexport function TweenCoord3D (a, b, count, tweenFunc)\n{\n\tlet dir = SubCoord3D (b, a).Normalize ();\n\tlet distance = CoordDistance3D (a, b);\n\tlet result = [];\n\tfor (let i = 0; i < count; i++) {\n let step = tweenFunc (distance, i, count - 1);\n\t\tresult.push (a.Clone ().Offset (dir, step));\n\t}\n\treturn result;\n}\n", "import { Coord2D, CoordDistance2D, SubCoord2D } from '../geometry/coord2d.js';\nimport { CoordDistance3D, CrossVector3D, SubCoord3D, VectorAngle3D } from '../geometry/coord3d.js';\nimport { DegRad, IsGreater, IsLower, IsZero } from '../geometry/geometry.js';\nimport { ParabolicTweenFunction, TweenCoord3D } from '../geometry/tween.js';\nimport { CameraIsEqual3D } from './camera.js';\nimport { GetDomElementClientCoordinates } from './domutils.js';\n\nexport class MouseInteraction\n{\n constructor ()\n {\n this.prev = new Coord2D (0.0, 0.0);\n this.curr = new Coord2D (0.0, 0.0);\n this.diff = new Coord2D (0.0, 0.0);\n this.buttons = [];\n }\n\n Down (canvas, ev)\n {\n this.buttons.push (ev.which);\n this.curr = this.GetPositionFromEvent (canvas, ev);\n this.prev = this.curr.Clone ();\n }\n\n Move (canvas, ev)\n {\n this.curr = this.GetPositionFromEvent (canvas, ev);\n\t\tthis.diff = SubCoord2D (this.curr, this.prev);\n\t\tthis.prev = this.curr.Clone ();\n\t}\n\n\tUp (canvas, ev)\n\t{\n\t\tlet buttonIndex = this.buttons.indexOf (ev.which);\n\t\tif (buttonIndex !== -1) {\n\t\t\tthis.buttons.splice (buttonIndex, 1);\n\t\t}\n\t\tthis.curr = this.GetPositionFromEvent (canvas, ev);\n\t}\n\n\tLeave (canvas, ev)\n\t{\n\t\tthis.buttons = [];\n\t\tthis.curr = this.GetPositionFromEvent (canvas, ev);\n\t}\n\n\tIsButtonDown ()\n\t{\n\t\treturn this.buttons.length > 0;\n\t}\n\n\tGetButton ()\n\t{\n\t\tlet length = this.buttons.length;\n\t\tif (length === 0) {\n\t\t\treturn 0;\n\t\t}\n\t\treturn this.buttons[length - 1];\n\t}\n\n\tGetPosition ()\n\t{\n\t\treturn this.curr;\n\t}\n\n\tGetMoveDiff ()\n\t{\n\t\treturn this.diff;\n\t}\n\n\tGetPositionFromEvent (canvas, ev)\n\t{\n\t\treturn GetDomElementClientCoordinates (canvas, ev.clientX, ev.clientY);\n\t}\n}\n\nexport class TouchInteraction\n{\n\tconstructor ()\n\t{\n\t\tthis.prevPos = new Coord2D (0.0, 0.0);\n\t\tthis.currPos = new Coord2D (0.0, 0.0);\n\t\tthis.diffPos = new Coord2D (0.0, 0.0);\n\t\tthis.prevDist = 0.0;\n\t\tthis.currDist = 0.0;\n\t\tthis.diffDist = 0.0;\n\t\tthis.fingers = 0;\n\t}\n\n\tStart (canvas, ev)\n\t{\n\t\tif (ev.touches.length === 0) {\n\t\t\treturn;\n\t\t}\n\n\t\tthis.fingers = ev.touches.length;\n\n\t\tthis.currPos = this.GetPositionFromEvent (canvas, ev);\n\t\tthis.prevPos = this.currPos.Clone ();\n\n\t\tthis.currDist = this.GetTouchDistanceFromEvent (canvas, ev);\n\t\tthis.prevDist = this.currDist;\n\t}\n\n\tMove (canvas, ev)\n\t{\n\t\tif (ev.touches.length === 0) {\n\t\t\treturn;\n\t\t}\n\n\t\tthis.currPos = this.GetPositionFromEvent (canvas, ev);\n\t\tthis.diffPos = SubCoord2D (this.currPos, this.prevPos);\n\t\tthis.prevPos = this.currPos.Clone ();\n\n\t\tthis.currDist = this.GetTouchDistanceFromEvent (canvas, ev);\n\t\tthis.diffDist = this.currDist - this.prevDist;\n\t\tthis.prevDist = this.currDist;\n\t}\n\n\tEnd (canvas, ev)\n\t{\n\t\tif (ev.touches.length === 0) {\n\t\t\treturn;\n\t\t}\n\n\t\tthis.fingers = 0;\n\t\tthis.currPos = this.GetPositionFromEvent (canvas, ev);\n\t\tthis.currDist = this.GetTouchDistanceFromEvent (canvas, ev);\n\t}\n\n\tIsFingerDown ()\n\t{\n\t\treturn this.fingers !== 0;\n\t}\n\n\tGetFingerCount ()\n\t{\n\t\treturn this.fingers;\n\t}\n\n\tGetPosition ()\n\t{\n\t\treturn this.currPos;\n\t}\n\n\tGetMoveDiff ()\n\t{\n\t\treturn this.diffPos;\n\t}\n\n\tGetDistanceDiff ()\n\t{\n\t\treturn this.diffDist;\n\t}\n\n\tGetPositionFromEvent (canvas, ev)\n\t{\n\t\tlet coord = null;\n\t\tif (ev.touches.length !== 0) {\n\t\t\tlet touchEv = ev.touches[0];\n\t\t\tcoord = GetDomElementClientCoordinates (canvas, touchEv.pageX, touchEv.pageY);\n\t\t}\n\t\treturn coord;\n\t}\n\n\tGetTouchDistanceFromEvent (canvas, ev)\n\t{\n\t\tif (ev.touches.length !== 2) {\n\t\t\treturn 0.0;\n\t\t}\n\t\tlet touchEv1 = ev.touches[0];\n\t\tlet touchEv2 = ev.touches[1];\n\t\tlet distance = CoordDistance2D (\n\t\t\tGetDomElementClientCoordinates (canvas, touchEv1.pageX, touchEv1.pageY),\n\t\t\tGetDomElementClientCoordinates (canvas, touchEv2.pageX, touchEv2.pageY)\n\t\t);\n\t\treturn distance;\n\t}\n}\n\nexport class ClickDetector\n{\n\tconstructor ()\n\t{\n\t\tthis.isClick = false;\n\t\tthis.startPosition = null;\n\t}\n\n\tStart (startPosition)\n\t{\n\t\tthis.isClick = true;\n\t\tthis.startPosition = startPosition;\n\t}\n\n\tMove (currentPosition)\n\t{\n\t\tif (!this.isClick) {\n\t\t\treturn;\n\t\t}\n\n\t\tif (this.startPosition !== null) {\n\t\t\tconst maxClickDistance = 3.0;\n\t\t\tconst currentDistance = CoordDistance2D (this.startPosition, currentPosition);\n\t\t\tif (currentDistance > maxClickDistance) {\n\t\t\t\tthis.Cancel ();\n\t\t\t}\n\t\t} else {\n\t\t\tthis.Cancel ();\n\t\t}\n\t}\n\n\tEnd ()\n\t{\n\t\tthis.startPosition = null;\n\t}\n\n\tCancel ()\n\t{\n\t\tthis.isClick = false;\n\t\tthis.startPosition = null;\n\t}\n\n\tIsClick ()\n\t{\n\t\treturn this.isClick;\n\t}\n}\n\nexport const NavigationType =\n{\n\tNone : 0,\n\tOrbit : 1,\n\tPan : 2,\n\tZoom : 3\n};\n\nexport class Navigation\n{\n\tconstructor (canvas, camera, callbacks)\n\t{\n\t\tthis.canvas = canvas;\n\t\tthis.camera = camera;\n\t\tthis.callbacks = callbacks;\n\t\tthis.fixUpVector = true;\n\n\t\tthis.mouse = new MouseInteraction ();\n\t\tthis.touch = new TouchInteraction ();\n\t\tthis.clickDetector = new ClickDetector ();\n\n\t\tthis.onMouseClick = null;\n\t\tthis.onMouseMove = null;\n\t\tthis.onContext = null;\n\n\t\tif (this.canvas.addEventListener) {\n\t\t\tthis.canvas.addEventListener ('mousedown', this.OnMouseDown.bind (this));\n\t\t\tthis.canvas.addEventListener ('wheel', this.OnMouseWheel.bind (this));\n\t\t\tthis.canvas.addEventListener ('touchstart', this.OnTouchStart.bind (this));\n\t\t\tthis.canvas.addEventListener ('touchmove', this.OnTouchMove.bind (this));\n\t\t\tthis.canvas.addEventListener ('touchcancel', this.OnTouchEnd.bind (this));\n\t\t\tthis.canvas.addEventListener ('touchend', this.OnTouchEnd.bind (this));\n\t\t\tthis.canvas.addEventListener ('contextmenu', this.OnContextMenu.bind (this));\n\t\t}\n\t\tif (document.addEventListener) {\n\t\t\tdocument.addEventListener ('mousemove', this.OnMouseMove.bind (this));\n\t\t\tdocument.addEventListener ('mouseup', this.OnMouseUp.bind (this));\n\t\t\tdocument.addEventListener ('mouseleave', this.OnMouseLeave.bind (this));\n\t\t}\n\t}\n\n\tSetMouseClickHandler (onMouseClick)\n\t{\n\t\tthis.onMouseClick = onMouseClick;\n\t}\n\n\tSetMouseMoveHandler (onMouseMove)\n\t{\n\t\tthis.onMouseMove = onMouseMove;\n\t}\n\n\tSetContextMenuHandler (onContext)\n\t{\n\t\tthis.onContext = onContext;\n\t}\n\n\tIsFixUpVector ()\n\t{\n\t\treturn this.fixUpVector;\n\t}\n\n\tSetFixUpVector (fixUpVector)\n\t{\n\t\tthis.fixUpVector = fixUpVector;\n\t}\n\n\tGetCamera ()\n\t{\n\t\treturn this.camera;\n\t}\n\n\tSetCamera (camera)\n\t{\n\t\tthis.camera = camera;\n\t}\n\n\tMoveCamera (newCamera, stepCount)\n\t{\n\t\tfunction Step (obj, steps, count, index)\n\t\t{\n\t\t\tobj.camera.eye = steps.eye[index];\n\t\t\tobj.camera.center = steps.center[index];\n\t\t\tobj.camera.up = steps.up[index];\n\t\t\tobj.Update ();\n\n\t\t\tif (index < count - 1) {\n\t\t\t\trequestAnimationFrame (() => {\n\t\t\t\t\tStep (obj, steps, count, index + 1);\n\t\t\t\t});\n\t\t\t}\n\t\t}\n\n\t\tif (newCamera === null) {\n\t\t\treturn;\n\t\t}\n\n\t\tif (stepCount === 0 || CameraIsEqual3D (this.camera, newCamera)) {\n\t\t\tthis.camera = newCamera;\n\t\t} else {\n\t\t\tlet tweenFunc = ParabolicTweenFunction;\n\t\t\tlet steps = {\n\t\t\t\teye : TweenCoord3D (this.camera.eye, newCamera.eye, stepCount, tweenFunc),\n\t\t\t\tcenter : TweenCoord3D (this.camera.center, newCamera.center, stepCount, tweenFunc),\n\t\t\t\tup : TweenCoord3D (this.camera.up, newCamera.up, stepCount, tweenFunc)\n\t\t\t};\n\t\t\trequestAnimationFrame (() => {\n\t\t\t\tStep (this, steps, stepCount, 0);\n\t\t\t});\n\t\t}\n\n\t\tthis.Update ();\n\t}\n\n\tGetFitToSphereCamera (center, radius, fov)\n\t{\n\t\tif (IsZero (radius)) {\n\t\t\treturn null;\n\t\t}\n\n\t\tlet fitCamera = this.camera.Clone ();\n\n\t\tlet offsetToOrigo = SubCoord3D (fitCamera.center, center);\n\t\tfitCamera.eye = SubCoord3D (fitCamera.eye, offsetToOrigo);\n\t\tfitCamera.center = center.Clone ();\n\n\t\tlet centerEyeDirection = SubCoord3D (fitCamera.eye, fitCamera.center).Normalize ();\n\t\tlet fieldOfView = fov / 2.0;\n\t\tif (this.canvas.width < this.canvas.height) {\n\t\t\tfieldOfView = fieldOfView * this.canvas.width / this.canvas.height;\n\t\t}\n\t\tlet distance = radius / Math.sin (fieldOfView * DegRad);\n\n\t\tfitCamera.eye = fitCamera.center.Clone ().Offset (centerEyeDirection, distance);\n\n\t\treturn fitCamera;\n\t}\n\n\tOnMouseDown (ev)\n\t{\n\t\tev.preventDefault ();\n\n\t\tthis.mouse.Down (this.canvas, ev);\n\t\tthis.clickDetector.Start (this.mouse.GetPosition ());\n\t}\n\n\tOnMouseMove (ev)\n\t{\n\t\tthis.mouse.Move (this.canvas, ev);\n\t\tthis.clickDetector.Move (this.mouse.GetPosition ());\n\t\tif (this.onMouseMove) {\n\t\t\tlet mouseCoords = GetDomElementClientCoordinates (this.canvas, ev.clientX, ev.clientY);\n\t\t\tthis.onMouseMove (mouseCoords);\n\t\t}\n\n\t\tif (!this.mouse.IsButtonDown ()) {\n\t\t\treturn;\n\t\t}\n\n\t\tlet moveDiff = this.mouse.GetMoveDiff ();\n\t\tlet mouseButton = this.mouse.GetButton ();\n\n\t\tlet navigationType = NavigationType.None;\n\t\tif (mouseButton === 1) {\n\t\t\tif (ev.ctrlKey) {\n\t\t\t\tnavigationType = NavigationType.Zoom;\n\t\t\t} else if (ev.shiftKey) {\n\t\t\t\tnavigationType = NavigationType.Pan;\n\t\t\t} else {\n\t\t\t\tnavigationType = NavigationType.Orbit;\n\t\t\t}\n\t\t} else if (mouseButton === 2 || mouseButton === 3) {\n\t\t\tnavigationType = NavigationType.Pan;\n\t\t}\n\n\t\tif (navigationType === NavigationType.Orbit) {\n\t\t\tlet orbitRatio = 0.5;\n\t\t\tthis.Orbit (moveDiff.x * orbitRatio, moveDiff.y * orbitRatio);\n\t\t} else if (navigationType === NavigationType.Pan) {\n\t\t\tlet eyeCenterDistance = CoordDistance3D (this.camera.eye, this.camera.center);\n\t\t\tlet panRatio = 0.001 * eyeCenterDistance;\n\t\t\tthis.Pan (moveDiff.x * panRatio, moveDiff.y * panRatio);\n\t\t} else if (navigationType === NavigationType.Zoom) {\n\t\t\tlet zoomRatio = 0.005;\n\t\t\tthis.Zoom (-moveDiff.y * zoomRatio);\n\t\t}\n\n\t\tthis.Update ();\n\t}\n\n\tOnMouseUp (ev)\n\t{\n\t\tthis.mouse.Up (this.canvas, ev);\n\t\tthis.clickDetector.End ();\n\n\t\tif (this.clickDetector.IsClick ()) {\n\t\t\tlet mouseCoords = this.mouse.GetPosition ();\n\t\t\tthis.Click (ev.which, mouseCoords);\n\t\t}\n\t}\n\n\tOnMouseLeave (ev)\n\t{\n\t\tthis.mouse.Leave (this.canvas, ev);\n\t\tthis.clickDetector.Cancel ();\n\t}\n\n\tOnTouchStart (ev)\n\t{\n\t\tev.preventDefault ();\n\n\t\tthis.touch.Start (this.canvas, ev);\n\t\tthis.clickDetector.Start (this.touch.GetPosition ());\n\t}\n\n\tOnTouchMove (ev)\n\t{\n\t\tev.preventDefault ();\n\n\t\tthis.touch.Move (this.canvas, ev);\n\t\tthis.clickDetector.Move (this.touch.GetPosition ());\n\t\tif (!this.touch.IsFingerDown ()) {\n\t\t\treturn;\n\t\t}\n\n\t\tlet moveDiff = this.touch.GetMoveDiff ();\n\t\tlet distanceDiff = this.touch.GetDistanceDiff ();\n\t\tlet fingerCount = this.touch.GetFingerCount ();\n\n\t\tlet navigationType = NavigationType.None;\n\t\tif (fingerCount === 1) {\n\t\t\tnavigationType = NavigationType.Orbit;\n\t\t} else if (fingerCount === 2) {\n\t\t\tnavigationType = NavigationType.Pan;\n\t\t}\n\n\t\tif (navigationType === NavigationType.Orbit) {\n\t\t\tlet orbitRatio = 0.5;\n\t\t\tthis.Orbit (moveDiff.x * orbitRatio, moveDiff.y * orbitRatio);\n\t\t} else if (navigationType === NavigationType.Pan) {\n\t\t\tlet zoomRatio = 0.005;\n\t\t\tthis.Zoom (distanceDiff * zoomRatio);\n\t\t\tlet panRatio = 0.001 * CoordDistance3D (this.camera.eye, this.camera.center);\n\t\t\tthis.Pan (moveDiff.x * panRatio, moveDiff.y * panRatio);\n\t\t}\n\n\t\tthis.Update ();\n\t}\n\n\tOnTouchEnd (ev)\n\t{\n\t\tev.preventDefault ();\n\n\t\tthis.touch.End (this.canvas, ev);\n\t\tthis.clickDetector.End ();\n\n\t\tif (this.clickDetector.IsClick ()) {\n\t\t\tlet touchCoords = this.touch.GetPosition ();\n\t\t\tif (this.touch.GetFingerCount () === 1) {\n\t\t\t\tthis.Click (1, touchCoords);\n\t\t\t}\n\t\t}\n\t}\n\n\tOnMouseWheel (ev)\n\t{\n\t\tlet params = ev || window.event;\n\t\tparams.preventDefault ();\n\n\t\tlet delta = -params.deltaY / 40;\n\t\tlet ratio = 0.1;\n\t\tif (delta < 0) {\n\t\t\tratio = ratio * -1.0;\n\t\t}\n\n\t\tthis.Zoom (ratio);\n\t\tthis.Update ();\n\t}\n\n\tOnContextMenu (ev)\n\t{\n\t\tev.preventDefault ();\n\n\t\tif (this.clickDetector.IsClick ()) {\n\t\t\tthis.Context (ev.clientX, ev.clientY);\n\t\t\tthis.clickDetector.Cancel ();\n\t\t}\n\t}\n\n\tOrbit (angleX, angleY)\n\t{\n\t\tlet radAngleX = angleX * DegRad;\n\t\tlet radAngleY = angleY * DegRad;\n\n\t\tlet viewDirection = SubCoord3D (this.camera.center, this.camera.eye).Normalize ();\n\t\tlet horizontalDirection = CrossVector3D (viewDirection, this.camera.up).Normalize ();\n\n\t\tif (this.fixUpVector) {\n\t\t\tlet originalAngle = VectorAngle3D (viewDirection, this.camera.up);\n\t\t\tlet newAngle = originalAngle + radAngleY;\n\t\t\tif (IsGreater (newAngle, 0.0) && IsLower (newAngle, Math.PI)) {\n\t\t\t\tthis.camera.eye.Rotate (horizontalDirection, -radAngleY, this.camera.center);\n\t\t\t}\n\t\t\tthis.camera.eye.Rotate (this.camera.up, -radAngleX, this.camera.center);\n\t\t} else {\n\t\t\tlet verticalDirection = CrossVector3D (horizontalDirection, viewDirection).Normalize ();\n\t\t\tthis.camera.eye.Rotate (horizontalDirection, -radAngleY, this.camera.center);\n\t\t\tthis.camera.eye.Rotate (verticalDirection, -radAngleX, this.camera.center);\n\t\t\tthis.camera.up = verticalDirection;\n\t\t}\n\t}\n\n\tPan (moveX, moveY)\n\t{\n\t\tlet viewDirection = SubCoord3D (this.camera.center, this.camera.eye).Normalize ();\n\t\tlet horizontalDirection = CrossVector3D (viewDirection, this.camera.up).Normalize ();\n\t\tlet verticalDirection = CrossVector3D (horizontalDirection, viewDirection).Normalize ();\n\n\t\tthis.camera.eye.Offset (horizontalDirection, -moveX);\n\t\tthis.camera.center.Offset (horizontalDirection, -moveX);\n\n\t\tthis.camera.eye.Offset (verticalDirection, moveY);\n\t\tthis.camera.center.Offset (verticalDirection, moveY);\n\t}\n\n\tZoom (ratio)\n\t{\n\t\tlet direction = SubCoord3D (this.camera.center, this.camera.eye);\n\t\tlet distance = direction.Length ();\n\t\tlet move = distance * ratio;\n\t\tthis.camera.eye.Offset (direction, move);\n\t}\n\n\tUpdate ()\n\t{\n\t\tthis.callbacks.onUpdate ();\n\t}\n\n\tClick (button, mouseCoords)\n\t{\n\t\tif (this.onMouseClick) {\n\t\t\tthis.onMouseClick (button, mouseCoords);\n\t\t}\n\t}\n\n\tContext (clientX, clientY)\n\t{\n\t\tif (this.onContext) {\n\t\t\tlet globalCoords = {\n\t\t\t\tx : clientX,\n\t\t\t\ty : clientY\n\t\t\t};\n\t\t\tlet localCoords = GetDomElementClientCoordinates (this.canvas, clientX, clientY);\n\t\t\tthis.onContext (globalCoords, localCoords);\n\t\t}\n\t}\n}\n", "import { Color } from '../model/color.js';\nimport { ConvertColorToThreeColor } from '../threejs/threeutils.js';\n\nexport function SetThreeMeshPolygonOffset (mesh, offset)\n{\n function SetMaterialsPolygonOffset (materials, offset)\n {\n for (let material of materials) {\n material.polygonOffset = offset;\n material.polygonOffsetUnit = 1;\n material.polygonOffsetFactor = 1;\n }\n }\n\n SetMaterialsPolygonOffset (mesh.material, offset);\n if (mesh.userData.threeMaterials) {\n SetMaterialsPolygonOffset (mesh.userData.threeMaterials, offset);\n }\n}\n\nexport class ViewerGeometry\n{\n constructor (scene)\n {\n this.scene = scene;\n\n this.mainObject = null;\n this.mainEdgeObject = null;\n\n this.edgeSettings = {\n showEdges : false,\n edgeColor : new Color (0, 0, 0),\n edgeThreshold : 1\n };\n }\n\n SetMainObject (mainObject)\n {\n this.mainObject = mainObject;\n this.scene.add (this.mainObject);\n if (this.edgeSettings.showEdges) {\n this.GenerateMainEdgeObject ();\n }\n }\n\n UpdateWorldMatrix ()\n {\n if (this.mainObject !== null) {\n this.mainObject.updateWorldMatrix (true, true);\n }\n }\n\n SetEdgeSettings (show, color, threshold)\n {\n let needToGenerate = false;\n if (show && (!this.edgeSettings.showEdges || this.edgeSettings.edgeThreshold !== threshold)) {\n needToGenerate = true;\n }\n\n this.edgeSettings.showEdges = show;\n this.edgeSettings.edgeThreshold = threshold;\n this.edgeSettings.edgeColor = color;\n\n if (this.mainObject === null) {\n return;\n }\n\n if (this.edgeSettings.showEdges) {\n if (needToGenerate) {\n this.ClearMainEdgeObject ();\n this.GenerateMainEdgeObject ();\n } else {\n\n let edgeColor = ConvertColorToThreeColor (this.edgeSettings.edgeColor);\n this.EnumerateEdges ((edge) => {\n edge.material.color = edgeColor;\n });\n }\n } else {\n this.ClearMainEdgeObject ();\n }\n }\n\n GenerateMainEdgeObject ()\n {\n let edgeColor = ConvertColorToThreeColor (this.edgeSettings.edgeColor);\n this.mainEdgeObject = new THREE.Object3D ();\n\n this.UpdateWorldMatrix ();\n this.EnumerateMeshes ((mesh) => {\n SetThreeMeshPolygonOffset (mesh, true);\n let edges = new THREE.EdgesGeometry (mesh.geometry, this.edgeSettings.edgeThreshold);\n let line = new THREE.LineSegments (edges, new THREE.LineBasicMaterial ({\n color: edgeColor\n }));\n line.applyMatrix4 (mesh.matrixWorld);\n line.userData = mesh.userData;\n line.visible = mesh.visible;\n this.mainEdgeObject.add (line);\n });\n this.scene.add (this.mainEdgeObject);\n }\n\n GetBoundingBox (needToProcess)\n {\n let hasMesh = false;\n let boundingBox = new THREE.Box3 ();\n this.EnumerateMeshes ((mesh) => {\n if (needToProcess (mesh.userData)) {\n boundingBox.union (new THREE.Box3 ().setFromObject (mesh));\n hasMesh = true;\n }\n });\n if (!hasMesh) {\n return null;\n }\n return boundingBox;\n }\n\n GetBoundingSphere (needToProcess)\n {\n let boundingBox = this.GetBoundingBox (needToProcess);\n if (boundingBox === null) {\n return null;\n }\n\n let boundingSphere = new THREE.Sphere ();\n boundingBox.getBoundingSphere (boundingSphere);\n return boundingSphere;\n }\n\n Clear ()\n {\n this.ClearMainObject ();\n this.ClearMainEdgeObject ();\n }\n\n ClearMainObject ()\n {\n if (this.mainObject === null) {\n return;\n }\n\n this.EnumerateMeshes ((mesh) => {\n mesh.geometry.dispose ();\n });\n this.scene.remove (this.mainObject);\n this.mainObject = null;\n }\n\n ClearMainEdgeObject ()\n {\n if (this.mainEdgeObject === null) {\n return;\n }\n\n this.EnumerateMeshes ((mesh) => {\n SetThreeMeshPolygonOffset (mesh, false);\n });\n this.EnumerateEdges ((edge) => {\n edge.geometry.dispose ();\n });\n this.scene.remove (this.mainEdgeObject);\n this.mainEdgeObject = null;\n }\n\n EnumerateMeshes (enumerator)\n {\n if (this.mainObject === null) {\n return;\n }\n this.mainObject.traverse ((obj) => {\n if (obj.isMesh) {\n enumerator (obj);\n }\n });\n }\n\n EnumerateEdges (enumerator)\n {\n if (this.mainEdgeObject === null) {\n return;\n }\n this.mainEdgeObject.traverse ((obj) => {\n if (obj.isLineSegments) {\n enumerator (obj);\n }\n });\n }\n\n GetMeshIntersectionUnderMouse (mouseCoords, camera, width, height)\n {\n if (this.mainObject === null) {\n return null;\n }\n\n if (mouseCoords.x < 0.0 || mouseCoords.x > width || mouseCoords.y < 0.0 || mouseCoords.y > height) {\n return null;\n }\n\n let raycaster = new THREE.Raycaster ();\n let mousePos = new THREE.Vector2 ();\n mousePos.x = (mouseCoords.x / width) * 2 - 1;\n mousePos.y = -(mouseCoords.y / height) * 2 + 1;\n raycaster.setFromCamera (mousePos, camera);\n let iSectObjects = raycaster.intersectObject (this.mainObject, true);\n for (let i = 0; i < iSectObjects.length; i++) {\n let iSectObject = iSectObjects[i];\n if (iSectObject.object.type === 'Mesh' && iSectObject.object.visible) {\n return iSectObject;\n }\n }\n\n return null;\n }\n}\n\nexport class ViewerExtraGeometry\n{\n constructor (scene)\n {\n this.scene = scene;\n this.mainObject = null;\n }\n\n AddObject (object)\n {\n if (this.mainObject === null) {\n this.mainObject = new THREE.Object3D ();\n this.scene.add (this.mainObject);\n }\n this.mainObject.add (object);\n }\n\n Clear ()\n {\n if (this.mainObject === null) {\n return;\n }\n this.mainObject.traverse ((obj) => {\n if (obj.isMesh || obj.isLineSegments) {\n obj.geometry.dispose ();\n }\n });\n this.scene.remove (this.mainObject);\n this.mainObject = null;\n }\n}\n", "import { Coord3D, CoordDistance3D, SubCoord3D } from '../geometry/coord3d.js';\nimport { Direction } from '../geometry/geometry.js';\nimport { ColorToHexString } from '../model/color.js';\nimport { ShadingType } from '../threejs/threeutils.js';\nimport { Camera } from './camera.js';\nimport { GetDomElementInnerDimensions } from './domutils.js';\nimport { Navigation } from './navigation.js';\nimport { ViewerExtraGeometry, ViewerGeometry } from './viewergeometry.js';\n\nexport function GetDefaultCamera (direction)\n{\n if (direction === Direction.X) {\n return new Camera (\n new Coord3D (2.0, -3.0, 1.5),\n new Coord3D (0.0, 0.0, 0.0),\n new Coord3D (1.0, 0.0, 0.0)\n );\n } else if (direction === Direction.Y) {\n return new Camera (\n new Coord3D (-1.5, 2.0, 3.0),\n new Coord3D (0.0, 0.0, 0.0),\n new Coord3D (0.0, 1.0, 0.0)\n );\n } else if (direction === Direction.Z) {\n return new Camera (\n new Coord3D (-1.5, -3.0, 2.0),\n new Coord3D (0.0, 0.0, 0.0),\n new Coord3D (0.0, 0.0, 1.0)\n );\n }\n return null;\n}\n\nexport function TraverseThreeObject (object, processor)\n{\n if (!processor (object)) {\n return false;\n }\n for (let child of object.children) {\n if (!TraverseThreeObject (child, processor)) {\n return false;\n }\n }\n return true;\n}\n\nexport function GetShadingTypeOfObject (mainObject)\n{\n let shadingType = null;\n TraverseThreeObject (mainObject, (obj) => {\n if (obj.isMesh) {\n for (const material of obj.material) {\n if (material.type === 'MeshPhongMaterial') {\n shadingType = ShadingType.Phong;\n } else if (material.type === 'MeshStandardMaterial') {\n shadingType = ShadingType.Physical;\n }\n return false;\n }\n }\n return true;\n });\n return shadingType;\n}\n\nexport class UpVector\n{\n constructor ()\n {\n this.direction = Direction.Z;\n this.isFixed = true;\n this.isFlipped = false;\n }\n\n SetDirection (newDirection, oldCamera)\n {\n this.direction = newDirection;\n this.isFlipped = false;\n\n let defaultCamera = GetDefaultCamera (this.direction);\n let defaultDir = SubCoord3D (defaultCamera.eye, defaultCamera.center);\n\n let distance = CoordDistance3D (oldCamera.center, oldCamera.eye);\n let newEye = oldCamera.center.Clone ().Offset (defaultDir, distance);\n\n let newCamera = oldCamera.Clone ();\n if (this.direction === Direction.X) {\n newCamera.up = new Coord3D (1.0, 0.0, 0.0);\n newCamera.eye = newEye;\n } else if (this.direction === Direction.Y) {\n newCamera.up = new Coord3D (0.0, 1.0, 0.0);\n newCamera.eye = newEye;\n } else if (this.direction === Direction.Z) {\n newCamera.up = new Coord3D (0.0, 0.0, 1.0);\n newCamera.eye = newEye;\n }\n return newCamera;\n }\n\n SetFixed (isFixed, oldCamera)\n {\n this.isFixed = isFixed;\n if (this.isFixed) {\n return this.SetDirection (this.direction, oldCamera);\n }\n return null;\n }\n\n Flip (oldCamera)\n {\n this.isFlipped = !this.isFlipped;\n let newCamera = oldCamera.Clone ();\n newCamera.up.MultiplyScalar (-1.0);\n return newCamera;\n }\n}\n\nexport class ShadingModel\n{\n constructor (scene)\n {\n this.scene = scene;\n\n this.type = ShadingType.Phong;\n this.ambientLight = new THREE.AmbientLight (0x888888);\n this.directionalLight = new THREE.DirectionalLight (0x888888);\n this.environment = null;\n this.backgroundIsEnvMap = false;\n\n this.scene.add (this.ambientLight);\n this.scene.add (this.directionalLight);\n }\n\n SetType (type)\n {\n this.type = type;\n this.UpdateShading ();\n }\n\n UpdateShading ()\n {\n if (this.type === ShadingType.Phong) {\n this.ambientLight.color.set (0x888888);\n this.directionalLight.color.set (0x888888);\n this.scene.environment = null;\n this.scene.background = null;\n } else if (this.type === ShadingType.Physical) {\n this.ambientLight.color.set (0x000000);\n this.directionalLight.color.set (0x555555);\n this.scene.environment = this.environment;\n if (this.backgroundIsEnvMap) {\n this.scene.background = this.environment;\n } else {\n this.scene.background = null;\n }\n }\n }\n\n SetEnvironment (textures, useAsBackground, onLoaded)\n {\n let loader = new THREE.CubeTextureLoader ();\n this.environment = loader.load (textures, () => {\n onLoaded ();\n });\n this.backgroundIsEnvMap = useAsBackground;\n }\n\n UpdateByCamera (camera)\n {\n const lightDir = SubCoord3D (camera.eye, camera.center);\n this.directionalLight.position.set (lightDir.x, lightDir.y, lightDir.z);\n }\n\n CreateHighlightMaterial (highlightColor, withOffset)\n {\n let material = null;\n if (this.type === ShadingType.Phong) {\n material = new THREE.MeshPhongMaterial ({\n color : highlightColor,\n side : THREE.DoubleSide\n });\n } else if (this.type === ShadingType.Physical) {\n material = new THREE.MeshStandardMaterial ({\n color : highlightColor,\n side : THREE.DoubleSide\n });\n }\n if (material !== null && withOffset) {\n material.polygonOffset = true;\n material.polygonOffsetUnit = 1;\n material.polygonOffsetFactor = 1;\n }\n return material;\n }\n}\n\nexport class Viewer\n{\n constructor ()\n {\n this.canvas = null;\n this.renderer = null;\n this.scene = null;\n this.geometry = null;\n this.extraGeometry = null;\n this.camera = null;\n this.shading = null;\n this.navigation = null;\n this.upVector = null;\n this.settings = {\n animationSteps : 40\n };\n }\n\n Init (canvas)\n {\n this.canvas = canvas;\n this.canvas.id = 'viewer';\n\n let parameters = {\n canvas : this.canvas,\n antialias : true\n };\n\n this.renderer = new THREE.WebGLRenderer (parameters);\n if (window.devicePixelRatio) {\n this.renderer.setPixelRatio (window.devicePixelRatio);\n }\n this.renderer.setClearColor ('#ffffff', 1.0);\n this.renderer.setSize (this.canvas.width, this.canvas.height);\n\n this.scene = new THREE.Scene ();\n this.geometry = new ViewerGeometry (this.scene);\n this.extraGeometry = new ViewerExtraGeometry (this.scene);\n\n this.InitNavigation ();\n this.InitShading ();\n\n this.Render ();\n }\n\n SetMouseClickHandler (onMouseClick)\n {\n this.navigation.SetMouseClickHandler (onMouseClick);\n }\n\n SetMouseMoveHandler (onMouseMove)\n {\n this.navigation.SetMouseMoveHandler (onMouseMove);\n }\n\n SetContextMenuHandler (onContext)\n {\n this.navigation.SetContextMenuHandler (onContext);\n }\n\n SetEnvironmentMapSettings (textures, useAsBackground)\n {\n this.shading.SetEnvironment (textures, useAsBackground, () => {\n this.Render ();\n });\n this.shading.UpdateShading ();\n this.Render ();\n }\n\n SetBackgroundColor (color)\n {\n let hexColor = '#' + ColorToHexString (color);\n this.renderer.setClearColor (hexColor, 1.0);\n this.Render ();\n }\n\n SetEdgeSettings (show, color, threshold)\n {\n this.geometry.SetEdgeSettings (show, color, threshold);\n this.Render ();\n }\n\n GetCanvas ()\n {\n return this.canvas;\n }\n\n GetCamera ()\n {\n return this.navigation.GetCamera ();\n }\n\n SetCamera (camera)\n {\n this.navigation.SetCamera (camera);\n this.Render ();\n }\n\n Resize (width, height)\n {\n let innerSize = GetDomElementInnerDimensions (this.canvas, width, height);\n this.ResizeRenderer (innerSize.width, innerSize.height);\n }\n\n ResizeRenderer (width, height)\n {\n if (window.devicePixelRatio) {\n this.renderer.setPixelRatio (window.devicePixelRatio);\n }\n this.camera.aspect = width / height;\n this.camera.updateProjectionMatrix ();\n this.renderer.setSize (width, height);\n this.Render ();\n }\n\n FitSphereToWindow (boundingSphere, animation)\n {\n if (boundingSphere === null) {\n return;\n }\n let center = new Coord3D (boundingSphere.center.x, boundingSphere.center.y, boundingSphere.center.z);\n let radius = boundingSphere.radius;\n let fov = this.camera.fov;\n\n let newCamera = this.navigation.GetFitToSphereCamera (center, radius, fov);\n this.navigation.MoveCamera (newCamera, animation ? this.settings.animationSteps : 0);\n }\n\n AdjustClippingPlanesToSphere (boundingSphere)\n {\n if (boundingSphere === null) {\n return;\n }\n if (boundingSphere.radius < 10.0) {\n this.camera.near = 0.01;\n this.camera.far = 100.0;\n } else if (boundingSphere.radius < 100.0) {\n this.camera.near = 0.1;\n this.camera.far = 1000.0;\n } else if (boundingSphere.radius < 1000.0) {\n this.camera.near = 10.0;\n this.camera.far = 10000.0;\n } else {\n this.camera.near = 100.0;\n this.camera.far = 1000000.0;\n }\n this.camera.updateProjectionMatrix ();\n this.Render ();\n }\n\n IsFixUpVector ()\n {\n return this.navigation.IsFixUpVector ();\n }\n\n SetFixUpVector (fixUpVector)\n {\n let oldCamera = this.navigation.GetCamera ();\n let newCamera = this.upVector.SetFixed (fixUpVector, oldCamera);\n this.navigation.SetFixUpVector (fixUpVector);\n if (newCamera !== null) {\n this.navigation.MoveCamera (newCamera, this.settings.animationSteps);\n }\n this.Render ();\n }\n\n SetUpVector (upDirection, animate)\n {\n let oldCamera = this.navigation.GetCamera ();\n let newCamera = this.upVector.SetDirection (upDirection, oldCamera);\n let animationSteps = animate ? this.settings.animationSteps : 0;\n this.navigation.MoveCamera (newCamera, animationSteps);\n this.Render ();\n }\n\n FlipUpVector ()\n {\n let oldCamera = this.navigation.GetCamera ();\n let newCamera = this.upVector.Flip (oldCamera);\n this.navigation.MoveCamera (newCamera, 0);\n this.Render ();\n }\n\n Render ()\n {\n let navigationCamera = this.navigation.GetCamera ();\n this.camera.position.set (navigationCamera.eye.x, navigationCamera.eye.y, navigationCamera.eye.z);\n this.camera.up.set (navigationCamera.up.x, navigationCamera.up.y, navigationCamera.up.z);\n this.camera.lookAt (new THREE.Vector3 (navigationCamera.center.x, navigationCamera.center.y, navigationCamera.center.z));\n\n this.shading.UpdateByCamera (navigationCamera);\n this.renderer.render (this.scene, this.camera);\n }\n\n SetMainObject (object)\n {\n const shadingType = GetShadingTypeOfObject (object);\n this.geometry.SetMainObject (object);\n this.shading.SetType (shadingType);\n\n this.Render ();\n }\n\n AddExtraObject (object)\n {\n this.extraGeometry.AddObject (object);\n this.Render ();\n }\n\n Clear ()\n {\n this.geometry.Clear ();\n this.extraGeometry.Clear ();\n this.Render ();\n }\n\n ClearExtra ()\n {\n this.extraGeometry.Clear ();\n this.Render ();\n }\n\n SetMeshesVisibility (isVisible)\n {\n this.geometry.EnumerateMeshes ((mesh) => {\n let visible = isVisible (mesh.userData);\n if (mesh.visible !== visible) {\n mesh.visible = visible;\n }\n });\n this.geometry.EnumerateEdges ((edge) => {\n let visible = isVisible (edge.userData);\n if (edge.visible !== visible) {\n edge.visible = visible;\n }\n });\n this.Render ();\n }\n\n SetMeshesHighlight (highlightColor, isHighlighted)\n {\n function CreateHighlightMaterials (originalMaterials, highlightMaterial)\n {\n let highlightMaterials = [];\n for (let i = 0; i < originalMaterials.length; i++) {\n highlightMaterials.push (highlightMaterial);\n }\n return highlightMaterials;\n }\n\n const highlightMaterial = this.CreateHighlightMaterial (highlightColor);\n this.geometry.EnumerateMeshes ((mesh) => {\n let highlighted = isHighlighted (mesh.userData);\n if (highlighted) {\n if (mesh.userData.threeMaterials === null) {\n mesh.userData.threeMaterials = mesh.material;\n mesh.material = CreateHighlightMaterials (mesh.material, highlightMaterial);\n }\n } else {\n if (mesh.userData.threeMaterials !== null) {\n mesh.material = mesh.userData.threeMaterials;\n mesh.userData.threeMaterials = null;\n }\n }\n });\n\n this.Render ();\n }\n\n CreateHighlightMaterial (highlightColor)\n {\n const showEdges = this.geometry.edgeSettings.showEdges;\n return this.shading.CreateHighlightMaterial (highlightColor, showEdges);\n }\n\n GetMeshUserDataUnderMouse (mouseCoords)\n {\n let intersection = this.GetMeshIntersectionUnderMouse (mouseCoords);\n if (intersection === null) {\n return null;\n }\n return intersection.object.userData;\n }\n\n GetMeshIntersectionUnderMouse (mouseCoords)\n {\n let canvasSize = this.GetCanvasSize ();\n let intersection = this.geometry.GetMeshIntersectionUnderMouse (mouseCoords, this.camera, canvasSize.width, canvasSize.height);\n if (intersection === null) {\n return null;\n }\n return intersection;\n }\n\n GetBoundingBox (needToProcess)\n {\n return this.geometry.GetBoundingBox (needToProcess);\n }\n\n GetBoundingSphere (needToProcess)\n {\n return this.geometry.GetBoundingSphere (needToProcess);\n }\n\n EnumerateMeshesUserData (enumerator)\n {\n this.geometry.EnumerateMeshes ((mesh) => {\n enumerator (mesh.userData);\n });\n }\n\n InitNavigation ()\n {\n this.camera = new THREE.PerspectiveCamera (45.0, this.canvas.width / this.canvas.height, 0.1, 1000.0);\n this.scene.add (this.camera);\n\n let canvasElem = this.renderer.domElement;\n let camera = GetDefaultCamera (Direction.Z);\n\n this.navigation = new Navigation (canvasElem, camera, {\n onUpdate : () => {\n this.Render ();\n }\n });\n\n this.upVector = new UpVector ();\n }\n\n InitShading ()\n {\n this.shading = new ShadingModel (this.scene);\n }\n\n GetShadingType ()\n {\n return this.shading.type;\n }\n\n GetImageSize ()\n {\n let originalSize = new THREE.Vector2 ();\n this.renderer.getSize (originalSize);\n return {\n width : parseInt (originalSize.x, 10),\n height : parseInt (originalSize.y, 10)\n };\n }\n\n GetCanvasSize ()\n {\n let width = this.canvas.width;\n let height = this.canvas.height;\n if (window.devicePixelRatio) {\n width /= window.devicePixelRatio;\n height /= window.devicePixelRatio;\n }\n return {\n width : width,\n height : height\n };\n }\n\n GetImageAsDataUrl (width, height)\n {\n let originalSize = this.GetImageSize ();\n let renderWidth = width;\n let renderHeight = height;\n if (window.devicePixelRatio) {\n renderWidth /= window.devicePixelRatio;\n renderHeight /= window.devicePixelRatio;\n }\n this.ResizeRenderer (renderWidth, renderHeight);\n this.Render ();\n let url = this.renderer.domElement.toDataURL ();\n this.ResizeRenderer (originalSize.width, originalSize.height);\n return url;\n }\n}\n", "import { CreateModelUrlParameters, CreateUrlParser } from '../engine/parameters/parameterlist.js';\n\nexport class HashHandler\n{\n constructor ()\n {\n this.skipNextEvent = false;\n this.eventListener = null;\n }\n\n SetEventListener (eventListener)\n {\n this.eventListener = eventListener;\n window.onhashchange = this.OnChange.bind (this);\n }\n\n SkipNextEventHandler ()\n {\n this.skipNextEvent = true;\n }\n\n HasHash ()\n {\n let hash = this.GetHash ();\n return hash.length > 0;\n }\n\n ClearHash ()\n {\n this.SetHash ('');\n }\n\n GetModelFilesFromHash ()\n {\n let parser = CreateUrlParser (this.GetHash ());\n return parser.GetModelUrls ();\n }\n\n SetModelFilesToHash (files)\n {\n let params = CreateModelUrlParameters (files);\n this.SetHash (params);\n }\n\n GetCameraFromHash ()\n {\n let parser = CreateUrlParser (this.GetHash ());\n return parser.GetCamera ();\n }\n\n GetBackgroundFromHash ()\n {\n let parser = CreateUrlParser (this.GetHash ());\n return parser.GetBackgroundColor ();\n }\n\n GetEnvironmentSettingsFromHash ()\n {\n let parser = CreateUrlParser (this.GetHash ());\n return parser.GetEnvironmentSettings ();\n }\n\n GetDefaultColorFromHash ()\n {\n let parser = CreateUrlParser (this.GetHash ());\n return parser.GetDefaultColor ();\n }\n\n GetEdgeSettingsFromHash ()\n {\n let parser = CreateUrlParser (this.GetHash ());\n return parser.GetEdgeSettings ();\n }\n\n GetHash ()\n {\n return window.location.hash.substring (1);\n }\n\n SetHash (hash)\n {\n window.location.hash = hash;\n }\n\n OnChange ()\n {\n if (this.skipNextEvent) {\n this.skipNextEvent = false;\n return;\n }\n this.eventListener ();\n }\n}\n", "import { RunTasksBatch } from '../core/taskrunner.js';\nimport { IsEqual } from '../geometry/geometry.js';\nimport { MaterialType } from '../model/material.js';\nimport { MeshInstanceId } from '../model/meshinstance.js';\nimport { GetMeshType, MeshType } from '../model/meshutils.js';\nimport { ConvertColorToThreeColor, GetShadingType, ShadingType } from './threeutils.js';\n\nexport class ModelToThreeConversionParams\n{\n\tconstructor ()\n\t{\n\t\tthis.forceMediumpForMaterials = false;\n\t}\n}\n\nexport class ModelToThreeConversionOutput\n{\n\tconstructor ()\n\t{\n\t\tthis.defaultMaterial = null;\n\t}\n}\n\nexport class ThreeConversionStateHandler\n{\n\tconstructor (callbacks)\n\t{\n\t\tthis.callbacks = callbacks;\n\t\tthis.texturesNeeded = 0;\n\t\tthis.texturesLoaded = 0;\n\t\tthis.threeObject = null;\n\t}\n\n\tOnTextureNeeded ()\n\t{\n\t\tthis.texturesNeeded += 1;\n\t}\n\n\tOnTextureLoaded ()\n\t{\n\t\tthis.texturesLoaded += 1;\n\t\tthis.callbacks.onTextureLoaded ();\n\t\tthis.Finish ();\n\t}\n\n\tOnModelLoaded (threeObject)\n\t{\n\t\tthis.threeObject = threeObject;\n\t\tthis.Finish ();\n\t}\n\n\tFinish ()\n\t{\n\t\tif (this.threeObject !== null && this.texturesNeeded === this.texturesLoaded) {\n\t\t\tthis.callbacks.onModelLoaded (this.threeObject);\n\t\t}\n\t}\n}\n\nexport class ThreeNodeTree\n{\n\tconstructor (rootNode, threeRootNode)\n\t{\n\t\tthis.meshInstances = [];\n\t\tthis.AddNode (rootNode, threeRootNode);\n\t}\n\n\tAddNode (node, threeNode)\n\t{\n\t\tlet matrix = node.GetTransformation ().GetMatrix ();\n\t\tlet threeMatrix = new THREE.Matrix4 ().fromArray (matrix.Get ());\n\t\tthreeNode.applyMatrix4 (threeMatrix);\n\n\t\tfor (let childNode of node.GetChildNodes ()) {\n\t\t\tlet threeChildNode = new THREE.Object3D ();\n\t\t\tthreeNode.add (threeChildNode);\n\t\t\tthis.AddNode (childNode, threeChildNode);\n\t\t}\n\t\tfor (let meshIndex of node.GetMeshIndices ()) {\n\t\t\tthis.meshInstances.push ({\n\t\t\t\tnode : node,\n\t\t\t\tthreeNode : threeNode,\n\t\t\t\tmeshIndex : meshIndex\n\t\t\t});\n\t\t}\n\t}\n\n\tGetMeshInstances ()\n\t{\n\t\treturn this.meshInstances;\n\t}\n}\n\nexport function ConvertModelToThreeObject (model, params, output, callbacks)\n{\n\tfunction CreateThreeMaterial (stateHandler, model, materialIndex, shadingType, params, output)\n\t{\n\t\tfunction SetTextureParameters (texture, threeTexture)\n\t\t{\n\t\t\tthreeTexture.wrapS = THREE.RepeatWrapping;\n\t\t\tthreeTexture.wrapT = THREE.RepeatWrapping;\n\t\t\tthreeTexture.rotation = texture.rotation;\n\t\t\tthreeTexture.offset.x = texture.offset.x;\n\t\t\tthreeTexture.offset.y = texture.offset.y;\n\t\t\tthreeTexture.repeat.x = texture.scale.x;\n\t\t\tthreeTexture.repeat.y = texture.scale.y;\n\t\t}\n\n\t\tfunction LoadTexture (stateHandler, threeMaterial, texture, onTextureLoaded)\n\t\t{\n\t\t\tif (texture === null || !texture.IsValid ()) {\n\t\t\t\treturn;\n\t\t\t}\n\t\t\tlet loader = new THREE.TextureLoader ();\n\t\t\tstateHandler.OnTextureNeeded ();\n\t\t\tloader.load (texture.url,\n\t\t\t\t(threeTexture) => {\n\t\t\t\t\tSetTextureParameters (texture, threeTexture);\n\t\t\t\t\tthreeMaterial.needsUpdate = true;\n\t\t\t\t\tonTextureLoaded (threeTexture);\n\t\t\t\t\tstateHandler.OnTextureLoaded ();\n\t\t\t\t},\n\t\t\t\tnull,\n\t\t\t\t(err) => {\n\t\t\t\t\tstateHandler.OnTextureLoaded ();\n\t\t\t\t}\n\t\t\t);\n\t\t}\n\n\t\tlet material = model.GetMaterial (materialIndex);\n\t\tlet baseColor = ConvertColorToThreeColor (material.color);\n\t\tif (material.vertexColors) {\n\t\t\tbaseColor.setRGB (1.0, 1.0, 1.0);\n\t\t}\n\n\t\tlet materialParams = {\n\t\t\tcolor : baseColor,\n\t\t\tvertexColors : material.vertexColors,\n\t\t\topacity : material.opacity,\n\t\t\ttransparent : material.transparent,\n\t\t\talphaTest : material.alphaTest,\n\t\t\tside : THREE.DoubleSide\n\t\t};\n\n\t\tif (params.forceMediumpForMaterials) {\n\t\t\tmaterialParams.precision = 'mediump';\n\t\t}\n\n\t\tlet threeMaterial = null;\n\t\tif (shadingType === ShadingType.Phong) {\n\t\t\tthreeMaterial = new THREE.MeshPhongMaterial (materialParams);\n\t\t\tif (material.type === MaterialType.Phong) {\n\t\t\t\tlet specularColor = ConvertColorToThreeColor (material.specular);\n\t\t\t\tif (IsEqual (material.shininess, 0.0)) {\n\t\t\t\t\tspecularColor.setRGB (0.0, 0.0, 0.0);\n\t\t\t\t}\n\t\t\t\tthreeMaterial.specular = specularColor;\n\t\t\t\tthreeMaterial.shininess = material.shininess * 100.0;\n\t\t\t\tLoadTexture (stateHandler, threeMaterial, material.specularMap, (threeTexture) => {\n\t\t\t\t\tthreeMaterial.specularMap = threeTexture;\n\t\t\t\t});\n\t\t\t}\n\t\t} else if (shadingType === ShadingType.Physical) {\n\t\t\tthreeMaterial = new THREE.MeshStandardMaterial (materialParams);\n\t\t\tif (material.type === MaterialType.Physical) {\n\t\t\t\tthreeMaterial.metalness = material.metalness;\n\t\t\t\tthreeMaterial.roughness = material.roughness;\n\t\t\t\tLoadTexture (stateHandler, threeMaterial, material.metalnessMap, (threeTexture) => {\n\t\t\t\t\tthreeMaterial.metalness = 1.0;\n\t\t\t\t\tthreeMaterial.roughness = 1.0;\n\t\t\t\t\tthreeMaterial.metalnessMap = threeTexture;\n\t\t\t\t\tthreeMaterial.roughnessMap = threeTexture;\n\t\t\t\t});\n\t\t\t}\n\t\t}\n\n\t\tlet emissiveColor = ConvertColorToThreeColor (material.emissive);\n\t\tthreeMaterial.emissive = emissiveColor;\n\n\t\tLoadTexture (stateHandler, threeMaterial, material.diffuseMap, (threeTexture) => {\n\t\t\tif (!material.multiplyDiffuseMap) {\n\t\t\t\tthreeMaterial.color.setRGB (1.0, 1.0, 1.0);\n\t\t\t}\n\t\t\tthreeMaterial.map = threeTexture;\n\t\t});\n\t\tLoadTexture (stateHandler, threeMaterial, material.bumpMap, (threeTexture) => {\n\t\t\tthreeMaterial.bumpMap = threeTexture;\n\t\t});\n\t\tLoadTexture (stateHandler, threeMaterial, material.normalMap, (threeTexture) => {\n\t\t\tthreeMaterial.normalMap = threeTexture;\n\t\t});\n\t\tLoadTexture (stateHandler, threeMaterial, material.emissiveMap, (threeTexture) => {\n\t\t\tthreeMaterial.emissiveMap = threeTexture;\n\t\t});\n\n\t\tif (material.isDefault) {\n\t\t\toutput.defaultMaterial = threeMaterial;\n\t\t}\n\n\t\treturn threeMaterial;\n\t}\n\n\tfunction CreateThreeMesh (model, meshInstanceId, modelThreeMaterials)\n\t{\n\t\tlet mesh = model.GetMesh (meshInstanceId.meshIndex);\n\t\tlet triangleCount = mesh.TriangleCount ();\n\n\t\tlet triangleIndices = [];\n\t\tfor (let i = 0; i < triangleCount; i++) {\n\t\t\ttriangleIndices.push (i);\n\t\t}\n\t\ttriangleIndices.sort ((a, b) => {\n\t\t\tlet aTriangle = mesh.GetTriangle (a);\n\t\t\tlet bTriangle = mesh.GetTriangle (b);\n\t\t\treturn aTriangle.mat - bTriangle.mat;\n\t\t});\n\n\t\tlet threeGeometry = new THREE.BufferGeometry ();\n\t\tlet meshThreeMaterials = [];\n\t\tlet meshOriginalMaterials = [];\n\t\tlet modelToThreeMaterials = new Map ();\n\n\t\tlet vertices = [];\n\t\tlet vertexColors = [];\n\t\tlet normals = [];\n\t\tlet uvs = [];\n\n\t\tlet groups = [];\n\t\tgroups.push ({\n\t\t\tstart : 0,\n\t\t\tend : -1\n\t\t});\n\n\t\tlet meshHasVertexColors = (mesh.VertexColorCount () > 0);\n\t\tlet meshHasUVs = (mesh.TextureUVCount () > 0);\n\t\tfor (let i = 0; i < triangleIndices.length; i++) {\n\t\t\tlet triangleIndex = triangleIndices[i];\n\t\t\tlet triangle = mesh.GetTriangle (triangleIndex);\n\n\t\t\tlet v0 = mesh.GetVertex (triangle.v0);\n\t\t\tlet v1 = mesh.GetVertex (triangle.v1);\n\t\t\tlet v2 = mesh.GetVertex (triangle.v2);\n\t\t\tvertices.push (v0.x, v0.y, v0.z, v1.x, v1.y, v1.z, v2.x, v2.y, v2.z);\n\n\t\t\tif (triangle.HasVertexColors ()) {\n\t\t\t\tlet vc0 = ConvertColorToThreeColor (mesh.GetVertexColor (triangle.c0));\n\t\t\t\tlet vc1 = ConvertColorToThreeColor (mesh.GetVertexColor (triangle.c1));\n\t\t\t\tlet vc2 = ConvertColorToThreeColor (mesh.GetVertexColor (triangle.c2));\n\t\t\t\tvertexColors.push (\n\t\t\t\t\tvc0.r, vc0.g, vc0.b,\n\t\t\t\t\tvc1.r, vc1.g, vc1.b,\n\t\t\t\t\tvc2.r, vc2.g, vc2.b\n\t\t\t\t);\n\t\t\t} else if (meshHasVertexColors) {\n\t\t\t\tvertexColors.push (\n\t\t\t\t\t0.0, 0.0, 0.0,\n\t\t\t\t\t0.0, 0.0, 0.0,\n\t\t\t\t\t0.0, 0.0, 0.0\n\t\t\t\t);\n\t\t\t}\n\n\t\t\tlet n0 = mesh.GetNormal (triangle.n0);\n\t\t\tlet n1 = mesh.GetNormal (triangle.n1);\n\t\t\tlet n2 = mesh.GetNormal (triangle.n2);\n\t\t\tnormals.push (n0.x, n0.y, n0.z, n1.x, n1.y, n1.z, n2.x, n2.y, n2.z);\n\n\t\t\tif (triangle.HasTextureUVs ()) {\n\t\t\t\tlet u0 = mesh.GetTextureUV (triangle.u0);\n\t\t\t\tlet u1 = mesh.GetTextureUV (triangle.u1);\n\t\t\t\tlet u2 = mesh.GetTextureUV (triangle.u2);\n\t\t\t\tuvs.push (u0.x, u0.y, u1.x, u1.y, u2.x, u2.y);\n\t\t\t} else if (meshHasUVs) {\n\t\t\t\tuvs.push (0.0, 0.0, 0.0, 0.0, 0.0, 0.0);\n\t\t\t}\n\n\t\t\tlet modelMaterialIndex = triangle.mat;\n\t\t\tif (!modelToThreeMaterials.has (modelMaterialIndex)) {\n\t\t\t\tmodelToThreeMaterials.set (modelMaterialIndex, meshThreeMaterials.length);\n\t\t\t\tmeshThreeMaterials.push (modelThreeMaterials[modelMaterialIndex]);\n\t\t\t\tmeshOriginalMaterials.push (modelMaterialIndex);\n\t\t\t\tif (i > 0) {\n\t\t\t\t\tgroups[groups.length - 1].end = i - 1;\n\t\t\t\t\tgroups.push ({\n\t\t\t\t\t\tstart : groups[groups.length - 1].end + 1,\n\t\t\t\t\t\tend : -1\n\t\t\t\t\t});\n\t\t\t\t}\n\t\t\t}\n\t\t}\n\n\t\tgroups[groups.length - 1].end = triangleCount - 1;\n\n\t\tthreeGeometry.setAttribute ('position', new THREE.Float32BufferAttribute (vertices, 3));\n\t\tif (vertexColors.length !== 0) {\n\t\t\tthreeGeometry.setAttribute ('color', new THREE.Float32BufferAttribute (vertexColors, 3));\n\t\t}\n\t\tthreeGeometry.setAttribute ('normal', new THREE.Float32BufferAttribute (normals, 3));\n\t\tif (uvs.length !== 0) {\n\t\t\tthreeGeometry.setAttribute ('uv', new THREE.Float32BufferAttribute (uvs, 2));\n\t\t}\n\t\tfor (let i = 0; i < groups.length; i++) {\n\t\t\tlet group = groups[i];\n\t\t\tthreeGeometry.addGroup (group.start * 3, (group.end - group.start + 1) * 3, i);\n\t\t}\n\n\t\tlet threeMesh = new THREE.Mesh (threeGeometry, meshThreeMaterials);\n\t\tthreeMesh.userData = {\n\t\t\toriginalMeshId : meshInstanceId,\n\t\t\toriginalMaterials : meshOriginalMaterials,\n\t\t\tthreeMaterials : null\n\t\t};\n\n\t\treturn threeMesh;\n\t}\n\n\tfunction ConvertMesh (threeObject, model, meshInstanceId, modelThreeMaterials)\n\t{\n\t\tlet mesh = model.GetMesh (meshInstanceId.meshIndex);\n\t\tlet type = GetMeshType (mesh);\n\t\tif (type === MeshType.TriangleMesh) {\n\t\t\tlet threeMesh = CreateThreeMesh (model, meshInstanceId, modelThreeMaterials);\n\t\t\tthreeObject.add (threeMesh);\n\t\t}\n\t}\n\n\tfunction ConvertNodeHierarchy (threeRootNode, model, modelThreeMaterials, stateHandler)\n\t{\n\t\tlet rootNode = model.GetRootNode ();\n\t\tlet nodeTree = new ThreeNodeTree (rootNode, threeRootNode);\n\t\tlet meshInstances = nodeTree.GetMeshInstances ();\n\n\t\tRunTasksBatch (meshInstances.length, 100, {\n\t\t\trunTask : (firstMeshInstanceIndex, lastMeshInstanceIndex, onReady) => {\n\t\t\t\tfor (let meshInstanceIndex = firstMeshInstanceIndex; meshInstanceIndex <= lastMeshInstanceIndex; meshInstanceIndex++) {\n\t\t\t\t\tlet meshInstance = meshInstances[meshInstanceIndex];\n\t\t\t\t\tlet node = meshInstance.node;\n\t\t\t\t\tlet threeNode = meshInstance.threeNode;\n\t\t\t\t\tlet meshInstanceId = new MeshInstanceId (node.GetId (), meshInstance.meshIndex);\n\t\t\t\t\tConvertMesh (threeNode, model, meshInstanceId, modelThreeMaterials);\n\t\t\t\t}\n\t\t\t\tonReady ();\n\t\t\t},\n\t\t\tonReady : () => {\n\t\t\t\tstateHandler.OnModelLoaded (threeRootNode);\n\t\t\t}\n\t\t});\n\t}\n\n\tlet stateHandler = new ThreeConversionStateHandler (callbacks);\n\tlet shadingType = GetShadingType (model);\n\n\tlet modelThreeMaterials = [];\n\tfor (let materialIndex = 0; materialIndex < model.MaterialCount (); materialIndex++) {\n\t\tlet threeMaterial = CreateThreeMaterial (stateHandler, model, materialIndex, shadingType, params, output);\n\t\tmodelThreeMaterials.push (threeMaterial);\n\t}\n\n\tlet threeObject = new THREE.Object3D ();\n\tConvertNodeHierarchy (threeObject, model, modelThreeMaterials, stateHandler);\n}\n", "import { Direction } from '../geometry/geometry.js';\nimport { Importer } from '../import/importer.js';\nimport { ConvertModelToThreeObject, ModelToThreeConversionOutput, ModelToThreeConversionParams } from './threeconverter.js';\nimport { ConvertColorToThreeColor, HasHighpDriverIssue } from './threeutils.js';\n\nexport class ThreeModelLoader\n{\n constructor ()\n {\n this.importer = new Importer ();\n this.inProgress = false;\n this.defaultMaterial = null;\n this.hasHighpDriverIssue = HasHighpDriverIssue ();\n }\n\n InProgress ()\n {\n return this.inProgress;\n }\n\n LoadModel (files, fileSource, settings, callbacks)\n {\n if (this.inProgress) {\n return;\n }\n\n this.inProgress = true;\n callbacks.onLoadStart ();\n this.importer.ImportFiles (files, fileSource, settings, {\n onFilesLoaded : () => {\n callbacks.onImportStart ();\n },\n onSelectMainFile : (fileNames, selectFile) => {\n if (!callbacks.onSelectMainFile) {\n selectFile (0);\n } else {\n callbacks.onSelectMainFile (fileNames, selectFile);\n }\n },\n onImportSuccess : (importResult) => {\n callbacks.onVisualizationStart ();\n let params = new ModelToThreeConversionParams ();\n params.forceMediumpForMaterials = this.hasHighpDriverIssue;\n let output = new ModelToThreeConversionOutput ();\n ConvertModelToThreeObject (importResult.model, params, output, {\n onTextureLoaded : () => {\n callbacks.onTextureLoaded ();\n },\n onModelLoaded : (threeObject) => {\n this.defaultMaterial = output.defaultMaterial;\n if (importResult.upVector === Direction.X) {\n let rotation = new THREE.Quaternion ().setFromAxisAngle (new THREE.Vector3 (0.0, 0.0, 1.0), Math.PI / 2.0);\n threeObject.quaternion.multiply (rotation);\n } else if (importResult.upVector === Direction.Z) {\n let rotation = new THREE.Quaternion ().setFromAxisAngle (new THREE.Vector3 (1.0, 0.0, 0.0), -Math.PI / 2.0);\n threeObject.quaternion.multiply (rotation);\n }\n callbacks.onModelFinished (importResult, threeObject);\n this.inProgress = false;\n }\n });\n },\n onImportError : (importError) => {\n callbacks.onLoadError (importError);\n this.inProgress = false;\n }\n });\n }\n\n GetImporter ()\n {\n return this.importer;\n }\n\n GetDefaultMaterial ()\n {\n return this.defaultMaterial;\n }\n\n ReplaceDefaultMaterialColor (defaultColor)\n {\n if (this.defaultMaterial !== null && !this.defaultMaterial.vertexColors) {\n this.defaultMaterial.color = ConvertColorToThreeColor (defaultColor);\n }\n }\n}\n", "import { AddDiv, CreateDiv } from '../engine/viewer/domutils.js';\nimport { AddSvgIconElement, CreateInlineColorCircle, IsHoverEnabled } from './utils.js';\n\nlet currentDialog = null;\n\nexport function CloseAllDialogs ()\n{\n if (currentDialog === null) {\n return;\n }\n currentDialog.Close ();\n currentDialog = null;\n}\n\nfunction OnCloseDialog ()\n{\n currentDialog = null;\n}\n\nfunction OnOpenDialog (dialog)\n{\n CloseAllDialogs ();\n currentDialog = dialog;\n}\n\nclass Dialog\n{\n constructor ()\n {\n this.modalDiv = CreateDiv ('ov_modal');\n this.modalDiv.addEventListener ('mousemove', (ev) => {\n ev.stopPropagation ();\n });\n\n this.overlayDiv = null;\n this.resizeHandler = null;\n this.positionCalculator = null;\n this.closeHandler = null;\n this.isOpen = false;\n this.closeable = true;\n }\n\n GetContentDiv ()\n {\n return this.modalDiv;\n }\n\n SetCloseable (closeable)\n {\n this.closeable = closeable;\n }\n\n SetPositionCalculator (positionCalculator)\n {\n this.positionCalculator = positionCalculator;\n }\n\n SetCloseHandler (closeHandler)\n {\n this.closeHandler = closeHandler;\n }\n\n Open ()\n {\n if (this.isOpen) {\n return;\n }\n\n OnOpenDialog (this);\n\n this.overlayDiv = AddDiv (document.body, 'ov_modal_overlay');\n document.body.appendChild (this.modalDiv);\n\n this.resizeHandler = this.Resize.bind (this);\n window.addEventListener ('resize', this.resizeHandler);\n if (this.closeable) {\n this.overlayDiv.addEventListener ('click', (ev) => {\n ev.preventDefault ();\n this.Close ();\n });\n this.overlayDiv.addEventListener ('mousemove', (ev) => {\n ev.stopPropagation ();\n });\n this.overlayDiv.addEventListener ('contextmenu', (ev) => {\n ev.preventDefault ();\n this.Close ();\n });\n }\n\n this.isOpen = true;\n this.Resize ();\n }\n\n Close ()\n {\n if (!this.isOpen) {\n return;\n }\n\n OnCloseDialog ();\n\n window.removeEventListener ('resize', this.resizeHandler);\n if (this.closeHandler !== null) {\n this.closeHandler ();\n }\n\n this.modalDiv.remove ();\n this.overlayDiv.remove ();\n\n this.overlayDiv = null;\n this.resizeHandler = null;\n this.isOpen = false;\n }\n\n Resize ()\n {\n let windowWidth = window.innerWidth;\n let windowHeight = window.innerHeight;\n let positionX = (windowWidth - this.modalDiv.offsetWidth) / 2;\n let positionY = (windowHeight - this.modalDiv.offsetHeight) / 3;\n if (this.positionCalculator !== null) {\n let calculatedPosition = this.positionCalculator ();\n positionX = calculatedPosition.x;\n positionY = calculatedPosition.y;\n }\n this.modalDiv.style.left = positionX + 'px';\n this.modalDiv.style.top = positionY + 'px';\n }\n}\n\nexport class ProgressDialog extends Dialog\n{\n constructor ()\n {\n super ();\n this.SetCloseable (false);\n this.textDiv = null;\n }\n\n Init (text)\n {\n let contentDiv = this.GetContentDiv ();\n contentDiv.classList.add ('ov_progress');\n\n AddDiv(contentDiv, 'ov_progress_img', '
');\n this.textDiv = AddDiv (contentDiv, 'ov_progress_text');\n this.SetText (text);\n }\n\n SetText (text)\n {\n this.textDiv.innerHTML = text;\n }\n}\n\nexport class ButtonDialog extends Dialog\n{\n constructor ()\n {\n super ();\n }\n\n Init (title, buttons)\n {\n function AddButton (button, buttonsDiv)\n {\n let buttonDiv = AddDiv (buttonsDiv, 'ov_button ov_dialog_button', button.name);\n if (button.subClass) {\n buttonDiv.classList.add (button.subClass);\n }\n buttonDiv.addEventListener ('click', () => {\n button.onClick ();\n });\n }\n\n let contentDiv = this.GetContentDiv ();\n contentDiv.classList.add ('ov_dialog');\n\n AddDiv (contentDiv, 'ov_dialog_title', title);\n let dialogContentDiv = AddDiv (contentDiv, 'ov_dialog_content');\n let buttonsDiv = AddDiv (contentDiv, 'ov_dialog_buttons');\n let buttonsInnerDiv = AddDiv (buttonsDiv, 'ov_dialog_buttons_inner');\n for (let i = 0; i < buttons.length; i++) {\n AddButton (buttons[i], buttonsInnerDiv);\n }\n\n return dialogContentDiv;\n }\n}\n\nexport class PopupDialog extends Dialog\n{\n constructor ()\n {\n super ();\n }\n\n Init (positionCalculator)\n {\n let contentDiv = this.GetContentDiv ();\n contentDiv.classList.add ('ov_popup');\n this.SetPositionCalculator (positionCalculator);\n return contentDiv;\n }\n}\n\nexport class ListPopup extends PopupDialog\n{\n constructor ()\n {\n super ();\n this.listDiv = null;\n }\n\n Init (positionCalculator)\n {\n let contentDiv = super.Init (positionCalculator);\n this.listDiv = AddDiv (contentDiv, 'ov_popup_list ov_thin_scrollbar');\n return contentDiv;\n }\n\n AddListItem (item, callbacks)\n {\n let listItemDiv = AddDiv (this.listDiv, 'ov_popup_list_item');\n if (item.icon) {\n AddSvgIconElement (listItemDiv, item.icon, 'left_inline');\n }\n if (item.color) {\n let iconDiv = AddDiv (listItemDiv, 'ov_popup_list_item_icon');\n let colorCircle = CreateInlineColorCircle (item.color);\n iconDiv.appendChild (colorCircle);\n }\n AddDiv (listItemDiv, 'ov_popup_list_item_name', item.name);\n listItemDiv.addEventListener ('click', callbacks.onClick);\n if (IsHoverEnabled () && callbacks.onHoverStart && callbacks.onHoverStop) {\n listItemDiv.addEventListener ('mouseover', () => {\n callbacks.onHoverStart ();\n });\n listItemDiv.addEventListener ('mouseout', () => {\n callbacks.onHoverStop ();\n });\n }\n }\n}\n", "import { AddDiv } from '../engine/viewer/domutils.js';\nimport { ButtonDialog, ListPopup } from './dialog.js';\n\nexport function ShowMessageDialog (title, message, subMessage)\n{\n let dialog = new ButtonDialog ();\n let contentDiv = dialog.Init (title, [\n {\n name : 'OK',\n onClick () {\n dialog.Close ();\n }\n }\n ]);\n AddDiv (contentDiv, 'ov_dialog_message', message);\n if (subMessage !== null) {\n AddDiv (contentDiv, 'ov_dialog_submessage', subMessage);\n }\n dialog.Open ();\n return dialog;\n}\n\nexport function ShowListPopup (items, callbacks)\n{\n if (items.length === 0) {\n return null;\n }\n\n let popup = new ListPopup ();\n popup.Init (() => {\n return callbacks.calculatePosition (popup.GetContentDiv ());\n });\n for (let i = 0; i < items.length; i++) {\n let item = items[i];\n popup.AddListItem (item, {\n onHoverStart : function () {\n if (callbacks.onHoverStart) {\n callbacks.onHoverStart (i);\n }\n },\n onHoverStop : function () {\n if (callbacks.onHoverStop) {\n callbacks.onHoverStop (i);\n }\n },\n onClick : function () {\n popup.Close ();\n callbacks.onClick (i);\n }\n });\n }\n popup.Open ();\n return popup;\n}\n\nexport function CalculatePopupPositionToElementTopLeft (elementDiv, contentDiv)\n{\n let offset = elementDiv.getBoundingClientRect ();\n return {\n x : offset.left - contentDiv.offsetWidth,\n y : offset.top\n };\n}\n\nexport function CalculatePopupPositionToElementBottomRight (elementDiv, contentDiv)\n{\n let offset = elementDiv.getBoundingClientRect ();\n return {\n x : offset.left + elementDiv.offsetWidth,\n y : offset.top + elementDiv.offsetHeight - contentDiv.offsetHeight\n };\n}\n\nexport function CalculatePopupPositionToScreen (globalMouseCoordinates, contentDiv)\n{\n let windowWidth = window.innerWidth;\n let windowHeight = window.innerHeight;\n let left = globalMouseCoordinates.x;\n let top = globalMouseCoordinates.y;\n let right = left + contentDiv.offsetWidth;\n let bottom = top + contentDiv.offsetHeight;\n if (right > windowWidth) {\n left = left - (right - windowWidth);\n }\n if (bottom > windowHeight) {\n top = top - (bottom - windowHeight);\n }\n return {\n x : left,\n y : top\n };\n}\n", "import { AddDiv } from '../engine/viewer/domutils.js';\nimport { ThreeModelLoader } from '../engine/threejs/threemodelloader.js';\nimport { ShowMessageDialog } from './dialogs.js';\nimport { ButtonDialog, ProgressDialog } from './dialog.js';\nimport { AddSvgIconElement } from './utils.js';\nimport { ImportErrorCode } from '../engine/import/importer.js';\n\nexport class ThreeModelLoaderUI\n{\n constructor ()\n {\n this.modelLoader = new ThreeModelLoader ();\n this.modalDialog = null;\n }\n\n LoadModel (files, fileSource, settings, callbacks)\n {\n if (this.modelLoader.InProgress ()) {\n return;\n }\n\n let progressDialog = null;\n this.modelLoader.LoadModel (files, fileSource, settings, {\n onLoadStart : () => {\n this.CloseDialogIfOpen ();\n callbacks.onStart ();\n progressDialog = new ProgressDialog ();\n progressDialog.Init ('Loading Model');\n progressDialog.Open ();\n },\n onSelectMainFile : (fileNames, selectFile) => {\n progressDialog.Close ();\n this.modalDialog = this.ShowFileSelectorDialog (fileNames, (index) => {\n progressDialog.Open ();\n selectFile (index);\n });\n },\n onImportStart : () => {\n progressDialog.SetText ('Importing Model');\n },\n onVisualizationStart : () => {\n progressDialog.SetText ('Visualizing Model');\n },\n onModelFinished : (importResult, threeObject) => {\n progressDialog.Close ();\n callbacks.onFinish (importResult, threeObject);\n },\n onTextureLoaded : () => {\n callbacks.onRender ();\n },\n onLoadError : (importError) => {\n progressDialog.Close ();\n callbacks.onError (importError);\n this.modalDialog = this.ShowErrorDialog (importError);\n },\n });\n }\n\n GetModelLoader ()\n {\n return this.modelLoader;\n }\n\n GetImporter ()\n {\n return this.modelLoader.GetImporter ();\n }\n\n ShowErrorDialog (importError)\n {\n if (importError.code === ImportErrorCode.NoImportableFile) {\n return ShowMessageDialog (\n 'Something went wrong',\n 'No importable file found.',\n null\n );\n } else if (importError.code === ImportErrorCode.FailedToLoadFile) {\n return ShowMessageDialog (\n 'Something went wrong',\n 'Failed to load file for import.',\n 'The remote server refused to fulfill the request. Check if the url is correct, and make sure that CORS requests are allowed on the remote server.'\n );\n } else if (importError.code === ImportErrorCode.ImportFailed) {\n return ShowMessageDialog (\n 'Something went wrong',\n 'Failed to import model.',\n importError.message\n );\n } else {\n return ShowMessageDialog (\n 'Something went wrong',\n 'Unknown error.',\n null\n );\n }\n }\n\n ShowFileSelectorDialog (fileNames, onSelect)\n {\n let dialog = new ButtonDialog ();\n let contentDiv = dialog.Init ('Select Model', [\n {\n name : 'Cancel',\n subClass : 'outline',\n onClick () {\n dialog.Close ();\n }\n }\n ]);\n dialog.SetCloseHandler (() => {\n onSelect (null);\n });\n\n let text = 'Multiple importable models found. Select the model you would like to import from the list below.';\n AddDiv (contentDiv, 'ov_dialog_message', text);\n\n let fileListSection = AddDiv (contentDiv, 'ov_dialog_section');\n let fileList = AddDiv (fileListSection, 'ov_dialog_import_file_list ov_thin_scrollbar');\n\n for (let i = 0; i < fileNames.length; i++) {\n let fileName = fileNames[i];\n let fileLink = AddDiv (fileList, 'ov_dialog_file_link');\n AddSvgIconElement (fileLink, 'meshes', 'ov_file_link_img');\n AddDiv (fileLink, 'ov_dialog_file_link_text', fileName);\n fileLink.addEventListener ('click', () => {\n dialog.SetCloseHandler (null);\n dialog.Close ();\n onSelect (i);\n });\n }\n\n dialog.Open ();\n return dialog;\n }\n\n CloseDialogIfOpen ()\n {\n if (this.modalDialog !== null) {\n this.modalDialog.Close ();\n this.modalDialog = null;\n }\n }\n}\n", "import { CreateModelUrlParameters } from '../engine/parameters/parameterlist.js';\nimport { FileSource, TransformFileHostUrls } from '../engine/io/fileutils.js';\nimport { ImportSettings } from '../engine/import/importer.js';\nimport { AddDomElement } from '../engine/viewer/domutils.js';\nimport { Viewer } from '../engine/viewer/viewer.js';\nimport { HashHandler } from './hashhandler.js';\nimport { ThreeModelLoaderUI } from './threemodelloaderui.js';\nimport { Direction } from '../engine/geometry/geometry.js';\n\nexport class Embed\n{\n constructor (parameters)\n {\n this.parameters = parameters;\n this.viewer = new Viewer ();\n this.hashHandler = new HashHandler ();\n this.modelLoaderUI = new ThreeModelLoaderUI ();\n }\n\n Load ()\n {\n let canvas = AddDomElement (this.parameters.viewerDiv, 'canvas');\n this.viewer.Init (canvas);\n this.Resize ();\n\n if (this.hashHandler.HasHash ()) {\n let urls = this.hashHandler.GetModelFilesFromHash ();\n if (urls === null) {\n return;\n }\n TransformFileHostUrls (urls);\n\n let envMapName = 'fishermans_bastion';\n let bgIsEnvMap = false;\n let environmentSettings = this.hashHandler.GetEnvironmentSettingsFromHash ();\n if (environmentSettings !== null) {\n envMapName = environmentSettings.environmentMapName;\n bgIsEnvMap = environmentSettings.backgroundIsEnvMap;\n }\n let envMapPath = 'assets/envmaps/' + envMapName + '/';\n let envMapTextures = [\n envMapPath + 'posx.jpg',\n envMapPath + 'negx.jpg',\n envMapPath + 'posy.jpg',\n envMapPath + 'negy.jpg',\n envMapPath + 'posz.jpg',\n envMapPath + 'negz.jpg'\n ];\n this.viewer.SetEnvironmentMapSettings (envMapTextures, bgIsEnvMap);\n\n let background = this.hashHandler.GetBackgroundFromHash ();\n if (background !== null) {\n this.viewer.SetBackgroundColor (background);\n }\n let edgeSettings = this.hashHandler.GetEdgeSettingsFromHash ();\n if (edgeSettings !== null) {\n this.viewer.SetEdgeSettings (\n edgeSettings.showEdges,\n edgeSettings.edgeColor,\n edgeSettings.edgeThreshold\n );\n }\n let settings = new ImportSettings ();\n let defaultColor = this.hashHandler.GetDefaultColorFromHash ();\n if (defaultColor !== null) {\n settings.defaultColor = defaultColor;\n }\n this.modelLoaderUI.LoadModel (urls, FileSource.Url, settings, {\n onStart : () =>\n {\n\n },\n onFinish : (importResult, threeObject) =>\n {\n this.OnModelFinished (threeObject);\n },\n onRender : () =>\n {\n this.viewer.Render ();\n },\n onError : (importError) =>\n {\n\n }\n });\n let hashParameters = CreateModelUrlParameters (urls);\n let websiteUrl = this.parameters.websiteLinkDiv.getAttribute ('href') + '#' + hashParameters;\n this.parameters.websiteLinkDiv.setAttribute ('href', websiteUrl);\n }\n\n\t\twindow.addEventListener ('resize', () => {\n\t\t\tthis.Resize ();\n\t\t});\n }\n\n Resize ()\n {\n let windowWidth = window.innerWidth;\n let windowHeight = window.innerHeight;\n this.viewer.Resize (windowWidth, windowHeight);\n }\n\n OnModelFinished (threeObject)\n {\n this.viewer.SetMainObject (threeObject);\n let boundingSphere = this.viewer.GetBoundingSphere ((meshUserData) => {\n return true;\n });\n this.viewer.AdjustClippingPlanesToSphere (boundingSphere);\n let camera = this.hashHandler.GetCameraFromHash ();\n if (camera !== null) {\n this.viewer.SetCamera (camera);\n } else {\n this.viewer.SetUpVector (Direction.Y, false);\n this.viewer.FitSphereToWindow (boundingSphere, false);\n }\n }\n}\n", "import { AddDiv, ShowDomElement, IsDomElementVisible, SetDomElementWidth, SetDomElementHeight } from '../engine/viewer/domutils.js';\nimport { AddSvgIconElement, SetSvgIconImageElement } from './utils.js';\n\nexport class Panel\n{\n constructor (parentDiv)\n {\n this.parentDiv = parentDiv;\n this.panelDiv = AddDiv (parentDiv);\n ShowDomElement (this.panelDiv, false);\n this.visible = false;\n }\n\n GetName ()\n {\n return null;\n }\n\n GetIcon ()\n {\n return null;\n }\n\n IsVisible ()\n {\n return this.visible;\n }\n\n Show (show)\n {\n if (this.visible === show) {\n return;\n }\n\n this.visible = show;\n ShowDomElement (this.panelDiv, this.visible);\n }\n\n Resize ()\n {\n\n }\n\n Clear ()\n {\n\n }\n}\n\nexport class PanelSet\n{\n constructor (parentDiv)\n {\n this.parentDiv = parentDiv;\n this.menuDiv = AddDiv (parentDiv, 'ov_panel_set_menu');\n this.contentDiv = AddDiv (parentDiv, 'ov_panel_set_content ov_thin_scrollbar');\n this.panels = [];\n this.panelButtons = [];\n this.panelsVisible = true;\n this.panelsPrevWidth = null;\n this.callbacks = null;\n }\n\n Init (callbacks)\n {\n this.callbacks = callbacks;\n }\n\n GetContentDiv ()\n {\n return this.contentDiv;\n }\n\n AddPanel (panel)\n {\n this.panels.push (panel);\n let button = AddSvgIconElement (this.menuDiv, panel.GetIcon (), 'ov_panel_set_menu_button');\n button.setAttribute ('alt', panel.GetName ());\n button.setAttribute ('title', panel.GetName ());\n this.panelButtons.push (button);\n button.addEventListener ('click', () => {\n if (panel === this.GetVisiblePanel ()) {\n this.ShowPanels (false);\n } else {\n this.ShowPanels (true);\n this.ShowPanel (panel);\n }\n });\n }\n\n IsPanelsVisible ()\n {\n return this.panelsVisible;\n }\n\n ShowPanels (show)\n {\n if (!this.IsParentVisible ()) {\n return;\n }\n\n if (this.panelsVisible === show) {\n return;\n }\n\n this.panelsVisible = show;\n if (this.panelsVisible) {\n ShowDomElement (this.contentDiv, true);\n SetDomElementWidth (this.parentDiv, this.menuDiv.offsetWidth + this.panelsPrevWidth);\n } else {\n for (let panelButton of this.panelButtons) {\n panelButton.classList.remove ('selected');\n }\n for (let panel of this.panels) {\n panel.Show (false);\n }\n this.panelsPrevWidth = this.contentDiv.offsetWidth;\n SetDomElementWidth (this.parentDiv, this.menuDiv.offsetWidth);\n ShowDomElement (this.contentDiv, false);\n }\n\n this.callbacks.onShowHidePanels (this.panelsVisible);\n this.callbacks.onResize ();\n }\n\n ShowPanel (panel)\n {\n if (panel === this.GetVisiblePanel ()) {\n return;\n }\n\n let panelButton = this.GetPanelButton (panel);\n for (let otherPanelButton of this.panelButtons) {\n if (otherPanelButton !== panelButton) {\n otherPanelButton.classList.remove ('selected');\n }\n }\n panelButton.classList.add ('selected');\n\n for (let otherPanel of this.panels) {\n if (otherPanel !== panel) {\n otherPanel.Show (false);\n }\n }\n panel.Show (true);\n panel.Resize ();\n }\n\n GetVisiblePanel ()\n {\n if (!this.panelsVisible) {\n return null;\n }\n for (let panel of this.panels) {\n if (panel.IsVisible ()) {\n return panel;\n }\n }\n return null;\n }\n\n SetPanelIcon (panel, icon)\n {\n let panelButton = this.GetPanelButton (panel);\n SetSvgIconImageElement (panelButton, icon);\n }\n\n GetPanelButton (panel)\n {\n const panelIndex = this.panels.indexOf (panel);\n return this.panelButtons[panelIndex];\n }\n\n Resize ()\n {\n let height = this.parentDiv.offsetHeight;\n SetDomElementHeight (this.menuDiv, height);\n SetDomElementHeight (this.contentDiv, height);\n if (this.panelsVisible) {\n for (let panel of this.panels) {\n if (panel.IsVisible ()) {\n panel.Resize ();\n }\n }\n }\n }\n\n IsParentVisible ()\n {\n return IsDomElementVisible (this.parentDiv);\n }\n\n Clear ()\n {\n for (let panel of this.panels) {\n panel.Clear ();\n }\n }\n}\n", "import { IsDefined } from '../engine/core/core.js';\nimport { AddDiv, CreateDiv, ShowDomElement, ClearDomElement, InsertDomElementBefore, InsertDomElementAfter } from '../engine/viewer/domutils.js';\nimport { CreateSvgIconElement, SetSvgIconImageElement } from './utils.js';\n\nexport function ScrollToView (element)\n{\n element.scrollIntoView ({\n behavior : 'smooth',\n block : 'nearest'\n });\n}\n\nexport class TreeViewButton\n{\n constructor (imagePath)\n {\n this.imagePath = imagePath;\n this.mainElement = CreateSvgIconElement (this.imagePath, 'ov_tree_item_button');\n this.mainElement.setAttribute ('src', this.imagePath);\n }\n\n SetImage (imagePath)\n {\n this.imagePath = imagePath;\n SetSvgIconImageElement (this.mainElement, this.imagePath);\n }\n\n OnClick (clickHandler)\n {\n this.mainElement.addEventListener ('click', (ev) => {\n ev.stopPropagation ();\n clickHandler (ev);\n });\n }\n\n GetDomElement ()\n {\n return this.mainElement;\n }\n}\n\nexport class TreeViewItem\n{\n constructor (name, icon)\n {\n this.name = name;\n this.parent = null;\n this.mainElement = CreateDiv ('ov_tree_item');\n this.mainElement.setAttribute ('title', this.name);\n this.nameElement = AddDiv (this.mainElement, 'ov_tree_item_name', this.name);\n if (IsDefined (icon)) {\n let iconElement = CreateSvgIconElement (icon, 'ov_tree_item_icon');\n InsertDomElementBefore (iconElement, this.nameElement);\n }\n }\n\n OnClick (onClick)\n {\n this.mainElement.classList.add ('clickable');\n this.mainElement.style.cursor = 'pointer';\n this.mainElement.addEventListener ('click', onClick);\n }\n\n SetParent (parent)\n {\n this.parent = parent;\n }\n\n AddDomElements (parentDiv)\n {\n parentDiv.appendChild (this.mainElement);\n }\n}\n\nexport class TreeViewSingleItem extends TreeViewItem\n{\n constructor (name, icon)\n {\n super (name, icon);\n this.selected = false;\n }\n\n SetSelected (selected)\n {\n this.selected = selected;\n if (this.selected) {\n this.mainElement.classList.add ('selected');\n let parent = this.parent;\n if (parent === null) {\n ScrollToView (this.mainElement);\n } else {\n while (parent !== null) {\n parent.ShowChildren (true);\n ScrollToView (this.mainElement);\n parent = parent.parent;\n }\n }\n } else {\n this.mainElement.classList.remove ('selected');\n }\n }\n}\n\nexport class TreeViewButtonItem extends TreeViewSingleItem\n{\n constructor (name, icon)\n {\n super (name, icon);\n this.buttonsDiv = CreateDiv ('ov_tree_item_button_container');\n InsertDomElementBefore (this.buttonsDiv, this.nameElement);\n }\n\n AppendButton (button)\n {\n this.buttonsDiv.appendChild (button.GetDomElement ());\n }\n}\n\nexport class TreeViewGroupItem extends TreeViewItem\n{\n constructor (name, icon)\n {\n super (name, icon);\n this.children = [];\n this.isVisible = true;\n this.isChildrenVisible = false;\n\n this.childrenDiv = null;\n this.openButtonIcon = 'arrow_down';\n this.closeButtonIcon = 'arrow_right';\n\n this.openCloseButton = CreateSvgIconElement (this.openButtonIcon, 'ov_tree_item_icon');\n InsertDomElementBefore (this.openCloseButton, this.nameElement);\n }\n\n AddChild (child)\n {\n this.CreateChildrenDiv ();\n this.children.push (child);\n child.SetParent (this);\n child.AddDomElements (this.childrenDiv);\n }\n\n ExpandAll (expand)\n {\n for (let child of this.children) {\n if (child instanceof TreeViewGroupItem) {\n child.ShowChildren (expand);\n child.ExpandAll (expand);\n }\n }\n }\n\n Show (show)\n {\n this.isVisible = show;\n if (this.childrenDiv === null) {\n return;\n }\n if (this.isVisible) {\n ShowDomElement (this.mainElement, true);\n this.childrenDiv.classList.add ('ov_tree_view_children');\n } else {\n ShowDomElement (this.mainElement, false);\n this.childrenDiv.classList.remove ('ov_tree_view_children');\n }\n }\n\n ShowChildren (show)\n {\n this.isChildrenVisible = show;\n if (this.childrenDiv === null) {\n return;\n }\n if (show) {\n SetSvgIconImageElement (this.openCloseButton, this.openButtonIcon);\n ShowDomElement (this.childrenDiv, true);\n } else {\n SetSvgIconImageElement (this.openCloseButton, this.closeButtonIcon);\n ShowDomElement (this.childrenDiv, false);\n }\n }\n\n CreateChildrenDiv ()\n {\n if (this.childrenDiv === null) {\n this.childrenDiv = CreateDiv ('ov_tree_view_children');\n InsertDomElementAfter (this.childrenDiv, this.mainElement);\n this.Show (this.isVisible);\n this.ShowChildren (this.isChildrenVisible);\n this.OnClick ((ev) => {\n this.isChildrenVisible = !this.isChildrenVisible;\n this.ShowChildren (this.isChildrenVisible);\n });\n }\n return this.childrenDiv;\n }\n}\n\nexport class TreeViewGroupButtonItem extends TreeViewGroupItem\n{\n constructor (name, icon)\n {\n super (name, icon);\n this.buttonsDiv = CreateDiv ('ov_tree_item_button_container');\n InsertDomElementBefore (this.buttonsDiv, this.nameElement);\n }\n\n AppendButton (button)\n {\n this.buttonsDiv.appendChild (button.GetDomElement ());\n }\n}\n\nexport class TreeView\n{\n constructor (parentDiv)\n {\n this.mainDiv = AddDiv (parentDiv, 'ov_tree_view');\n this.children = [];\n }\n\n AddClass (className)\n {\n this.mainDiv.classList.add (className);\n }\n\n AddChild (child)\n {\n child.AddDomElements (this.mainDiv);\n this.children.push (child);\n }\n\n Clear ()\n {\n ClearDomElement (this.mainDiv);\n this.children = [];\n }\n}\n", "import { AddDiv } from '../engine/viewer/domutils.js';\nimport { Panel } from './panelset.js';\nimport { TreeView } from './treeview.js';\nimport { AddSvgIconElement } from './utils.js';\n\nexport class NavigatorPopupButton\n{\n constructor (parentDiv)\n {\n this.parentDiv = parentDiv;\n this.callbacks = null;\n this.popup = null;\n\n this.button = AddDiv (this.parentDiv, 'ov_panel_button');\n this.buttonText = AddDiv (this.button, 'ov_panel_button_text');\n AddSvgIconElement (this.button, 'arrow_right', 'ov_panel_button_icon');\n this.button.addEventListener ('click', () => {\n this.OnButtonClick ();\n });\n }\n\n Init (callbacks)\n {\n this.callbacks = callbacks;\n }\n\n OnButtonClick ()\n {\n\n }\n\n Clear ()\n {\n if (this.popup !== null) {\n this.popup.Close ();\n this.popup = null;\n }\n }\n}\n\nexport class NavigatorPanel extends Panel\n{\n constructor (parentDiv)\n {\n super (parentDiv);\n this.callbacks = null;\n\n this.titleDiv = AddDiv (this.panelDiv, 'ov_navigator_tree_title');\n this.treeDiv = AddDiv (this.panelDiv, 'ov_navigator_tree_panel ov_thin_scrollbar');\n this.treeView = new TreeView (this.treeDiv);\n\n let panelName = this.GetName ();\n this.titleDiv.innerHTML = panelName;\n this.titleDiv.setAttribute ('title', panelName);\n }\n\n Clear ()\n {\n this.treeView.Clear ();\n }\n\n GetName ()\n {\n return null;\n }\n\n Init (callbacks)\n {\n this.callbacks = callbacks;\n }\n\n Fill (importResult)\n {\n\n }\n}\n", "import { SetDomElementHeight, GetDomElementOuterHeight } from '../engine/viewer/domutils.js';\nimport { NavigatorPanel } from './navigatorpanel.js';\nimport { TreeViewButton, TreeViewButtonItem, TreeViewGroupItem, TreeViewSingleItem } from './treeview.js';\n\nexport class NavigatorFilesPanel extends NavigatorPanel\n{\n constructor (parentDiv)\n {\n super (parentDiv);\n }\n\n GetName ()\n {\n return 'Files';\n }\n\n GetIcon ()\n {\n return 'files';\n }\n\n Resize ()\n {\n let titleHeight = GetDomElementOuterHeight (this.titleDiv);\n let height = this.parentDiv.offsetHeight;\n SetDomElementHeight (this.treeDiv, height - titleHeight);\n }\n\n Clear ()\n {\n super.Clear ();\n }\n\n Fill (importResult)\n {\n super.Fill (importResult);\n const usedFiles = importResult.usedFiles;\n const missingFiles = importResult.missingFiles;\n\n if (missingFiles.length > 0) {\n let missingFilesItem = new TreeViewGroupItem ('Missing Files', null);\n missingFilesItem.ShowChildren (true);\n this.treeView.AddChild (missingFilesItem);\n for (let i = 0; i < missingFiles.length; i++) {\n let file = missingFiles[i];\n let item = new TreeViewButtonItem (file);\n let browseButton = new TreeViewButton ('open');\n browseButton.OnClick (() => {\n this.callbacks.onFileBrowseButtonClicked ();\n });\n item.AppendButton (browseButton);\n missingFilesItem.AddChild (item);\n }\n let filesItem = new TreeViewGroupItem ('Available Files', null);\n filesItem.ShowChildren (true);\n this.treeView.AddChild (filesItem);\n for (let i = 0; i < usedFiles.length; i++) {\n let file = usedFiles[i];\n let item = new TreeViewSingleItem (file);\n filesItem.AddChild (item);\n }\n } else {\n for (let i = 0; i < usedFiles.length; i++) {\n let file = usedFiles[i];\n let item = new TreeViewSingleItem (file);\n this.treeView.AddChild (item);\n }\n }\n }\n}\n", "import { IsDefined } from '../engine/core/core.js';\nimport { TreeViewButton, TreeViewButtonItem, TreeViewGroupButtonItem, TreeViewSingleItem } from './treeview.js';\n\nexport const NavigatorItemRecurse =\n{\n No : 0,\n Parents : 1,\n Children : 2,\n All : 3\n};\n\nexport class MaterialItem extends TreeViewSingleItem\n{\n constructor (name, materialIndex, callbacks)\n {\n super (name);\n this.OnClick (() => {\n callbacks.onSelected (materialIndex);\n });\n }\n}\n\nexport class MeshItem extends TreeViewButtonItem\n{\n constructor (name, icon, meshInstanceId, callbacks)\n {\n super (name, icon);\n\n this.meshInstanceId = meshInstanceId;\n this.visible = true;\n\n this.fitToWindowButton = new TreeViewButton ('fit');\n this.fitToWindowButton.OnClick (() => {\n callbacks.onFitToWindow (this.meshInstanceId);\n });\n this.AppendButton (this.fitToWindowButton);\n\n this.showHideButton = new TreeViewButton ('visible');\n this.showHideButton.OnClick (() => {\n callbacks.onShowHide (this.meshInstanceId);\n });\n this.AppendButton (this.showHideButton);\n\n this.OnClick (() => {\n callbacks.onSelected (this.meshInstanceId);\n });\n }\n\n GetMeshInstanceId ()\n {\n return this.meshInstanceId;\n }\n\n IsVisible ()\n {\n return this.visible;\n }\n\n SetVisible (visible, recurse)\n {\n if (this.visible === visible) {\n return;\n }\n this.visible = visible;\n if (this.visible) {\n this.showHideButton.SetImage ('visible');\n } else {\n this.showHideButton.SetImage ('hidden');\n }\n if (recurse === NavigatorItemRecurse.Parents) {\n if (this.parent instanceof NodeItem) {\n let parentIsVisible = this.parent.CalculateIsVisible ();\n this.parent.SetVisible (parentIsVisible, NavigatorItemRecurse.Parents);\n }\n }\n }\n}\n\nexport class NodeItem extends TreeViewGroupButtonItem\n{\n constructor (name, nodeId, callbacks)\n {\n super (name, null);\n this.nodeId = nodeId;\n this.callbacks = callbacks;\n this.visible = true;\n\n this.fitToWindowButton = new TreeViewButton ('fit');\n this.fitToWindowButton.OnClick (() => {\n this.callbacks.onFitToWindow (nodeId);\n });\n this.AppendButton (this.fitToWindowButton);\n\n this.showHideButton = new TreeViewButton ('visible');\n this.showHideButton.OnClick (() => {\n this.callbacks.onShowHide (nodeId);\n });\n this.AppendButton (this.showHideButton);\n }\n\n GetNodeId ()\n {\n return this.nodeId;\n }\n\n IsVisible ()\n {\n return this.visible;\n }\n\n CalculateIsVisible ()\n {\n let isVisible = false;\n for (let child of this.children) {\n if (child instanceof NodeItem || child instanceof MeshItem) {\n if (child.IsVisible ()) {\n isVisible = true;\n break;\n }\n }\n }\n return isVisible;\n }\n\n SetVisible (visible, recurse)\n {\n if (this.visible === visible) {\n return;\n }\n this.visible = visible;\n if (this.visible) {\n this.showHideButton.SetImage ('visible');\n } else {\n this.showHideButton.SetImage ('hidden');\n }\n if (IsDefined (this.callbacks.onVisibilityChanged)) {\n this.callbacks.onVisibilityChanged (this.visible);\n }\n if (recurse === NavigatorItemRecurse.Children || recurse === NavigatorItemRecurse.All) {\n for (let child of this.children) {\n if (child instanceof NodeItem || child instanceof MeshItem) {\n child.SetVisible (this.visible, NavigatorItemRecurse.Children);\n }\n }\n }\n if (recurse === NavigatorItemRecurse.Parents || recurse === NavigatorItemRecurse.All) {\n if (this.parent instanceof NodeItem) {\n let parentIsVisible = this.parent.CalculateIsVisible ();\n this.parent.SetVisible (parentIsVisible, NavigatorItemRecurse.Parents);\n }\n }\n }\n\n EnumerateMeshItems (processor)\n {\n for (let child of this.children) {\n if (child instanceof NodeItem) {\n child.EnumerateMeshItems (processor);\n } else if (child instanceof MeshItem) {\n processor (child);\n }\n }\n }\n}\n", "import { AddDiv, SetDomElementHeight, GetDomElementOuterHeight } from '../engine/viewer/domutils.js';\nimport { CalculatePopupPositionToElementBottomRight, ShowListPopup } from './dialogs.js';\nimport { MaterialItem } from './navigatoritems.js';\nimport { NavigatorPanel, NavigatorPopupButton } from './navigatorpanel.js';\nimport { GetMaterialName, GetMeshName } from './utils.js';\n\nclass NavigatorMeshesPopupButton extends NavigatorPopupButton\n{\n constructor (parentDiv)\n {\n super (parentDiv);\n this.meshInfoArray = null;\n }\n\n Update (meshInfoArray)\n {\n this.meshInfoArray = meshInfoArray;\n if (this.meshInfoArray === null) {\n return;\n }\n\n let meshesText = 'Meshes (' + this.meshInfoArray.length + ')';\n this.buttonText.innerHTML = meshesText;\n }\n\n OnButtonClick ()\n {\n if (this.meshInfoArray === null) {\n return;\n }\n\n let meshItems = [];\n for (let i = 0; i < this.meshInfoArray.length; i++) {\n let meshInfo = this.meshInfoArray[i];\n meshItems.push ({\n name : GetMeshName (meshInfo.name)\n });\n }\n\n if (meshItems.length === 0) {\n return;\n }\n\n this.popup = ShowListPopup (meshItems, {\n calculatePosition : (contentDiv) => {\n return CalculatePopupPositionToElementBottomRight (this.button, contentDiv);\n },\n onHoverStart : (index) => {\n const meshData = this.meshInfoArray[index];\n this.callbacks.onMeshHover (meshData.meshId);\n },\n onHoverStop : (index) => {\n this.callbacks.onMeshHover (null);\n },\n onClick : (index) => {\n const meshData = this.meshInfoArray[index];\n this.callbacks.onMeshSelected (meshData.meshId);\n }\n });\n }\n}\n\nexport class NavigatorMaterialsPanel extends NavigatorPanel\n{\n constructor (parentDiv)\n {\n super (parentDiv);\n this.callbacks = null;\n this.materialIndexToItem = new Map ();\n\n this.popupDiv = AddDiv (this.panelDiv, 'ov_navigator_info_panel');\n this.meshesButton = new NavigatorMeshesPopupButton (this.popupDiv);\n }\n\n GetName ()\n {\n return 'Materials';\n }\n\n GetIcon ()\n {\n return 'materials';\n }\n\n Resize ()\n {\n let titleHeight = GetDomElementOuterHeight (this.titleDiv);\n let popupHeight = GetDomElementOuterHeight (this.popupDiv);\n let height = this.parentDiv.offsetHeight;\n SetDomElementHeight (this.treeDiv, height - titleHeight - popupHeight);\n }\n\n Clear ()\n {\n super.Clear ();\n this.meshesButton.Clear ();\n this.materialIndexToItem = new Map ();\n }\n\n Init (callbacks)\n {\n super.Init (callbacks);\n this.meshesButton.Init ({\n onMeshHover : (meshInstanceId) => {\n this.callbacks.onMeshTemporarySelected (meshInstanceId);\n },\n onMeshSelected : (meshInstanceId) => {\n this.callbacks.onMeshSelected (meshInstanceId);\n }\n });\n }\n\n Fill (importResult)\n {\n super.Fill (importResult);\n const model = importResult.model;\n for (let materialIndex = 0; materialIndex < model.MaterialCount (); materialIndex++) {\n let material = model.GetMaterial (materialIndex);\n let materialName = GetMaterialName (material.name);\n let materialItem = new MaterialItem (materialName, materialIndex, {\n onSelected : (materialIndex) => {\n this.callbacks.onMaterialSelected (materialIndex);\n }\n });\n this.materialIndexToItem.set (materialIndex, materialItem);\n this.treeView.AddChild (materialItem);\n }\n }\n\n GetMaterialItem (materialIndex)\n {\n return this.materialIndexToItem.get (materialIndex);\n }\n\n SelectMaterialItem (materialIndex, isSelected)\n {\n this.GetMaterialItem (materialIndex).SetSelected (isSelected);\n }\n\n UpdateMeshList (meshInfoArray)\n {\n this.meshesButton.Update (meshInfoArray);\n }\n}\n", "import { NodeType } from '../engine/model/node.js';\nimport { MeshInstanceId } from '../engine/model/meshinstance.js';\nimport { AddDiv, CreateDiv, ShowDomElement, ClearDomElement, InsertDomElementBefore, SetDomElementHeight, GetDomElementOuterHeight, IsDomElementVisible } from '../engine/viewer/domutils.js';\nimport { CalculatePopupPositionToElementBottomRight, ShowListPopup } from './dialogs.js';\nimport { MeshItem, NavigatorItemRecurse, NodeItem } from './navigatoritems.js';\nimport { NavigatorPanel, NavigatorPopupButton } from './navigatorpanel.js';\nimport { AddSvgIconElement, GetMaterialName, GetMeshName, GetNodeName, SetSvgIconImageElement } from './utils.js';\n\nconst MeshesPanelMode =\n{\n Simple : 0,\n FlatList : 1,\n TreeView : 2\n};\n\nclass NavigatorMaterialsPopupButton extends NavigatorPopupButton\n{\n constructor (parentDiv)\n {\n super (parentDiv);\n this.materialInfoArray = null;\n }\n\n Update (materialInfoArray)\n {\n this.materialInfoArray = materialInfoArray;\n if (this.materialInfoArray === null) {\n return;\n }\n\n let materialsText = 'Materials (' + this.materialInfoArray.length + ')';\n this.buttonText.innerHTML = materialsText;\n }\n\n OnButtonClick ()\n {\n if (this.materialInfoArray === null) {\n return;\n }\n\n let materialItems = [];\n for (let i = 0; i < this.materialInfoArray.length; i++) {\n let usedMaterial = this.materialInfoArray[i];\n materialItems.push ({\n name : GetMaterialName (usedMaterial.name),\n color : usedMaterial.color\n });\n }\n\n if (materialItems.length === 0) {\n return;\n }\n\n this.popup = ShowListPopup (materialItems, {\n calculatePosition : (contentDiv) => {\n return CalculatePopupPositionToElementBottomRight (this.button, contentDiv);\n },\n onClick : (index) => {\n let usedMaterial = this.materialInfoArray[index];\n this.callbacks.onMaterialSelected (usedMaterial.index);\n }\n });\n }\n}\n\nexport class NavigatorMeshesPanel extends NavigatorPanel\n{\n constructor (parentDiv)\n {\n super (parentDiv);\n\n this.callbacks = null;\n this.nodeIdToItem = new Map ();\n this.meshInstanceIdToItem = new Map ();\n this.rootItem = null;\n this.mode = MeshesPanelMode.Simple;\n this.buttons = null;\n\n this.treeView.AddClass ('tight');\n this.titleButtonsDiv = AddDiv (this.titleDiv, 'ov_navigator_tree_title_buttons');\n this.buttonsDiv = CreateDiv ('ov_navigator_buttons');\n InsertDomElementBefore (this.buttonsDiv, this.treeDiv);\n\n this.popupDiv = AddDiv (this.panelDiv, 'ov_navigator_info_panel');\n this.materialsButton = new NavigatorMaterialsPopupButton (this.popupDiv);\n }\n\n GetName ()\n {\n return 'Meshes';\n }\n\n GetIcon ()\n {\n return 'meshes';\n }\n\n Resize ()\n {\n let titleHeight = GetDomElementOuterHeight (this.titleDiv);\n let buttonsHeight = 0;\n if (IsDomElementVisible (this.buttonsDiv)) {\n buttonsHeight = GetDomElementOuterHeight (this.buttonsDiv);\n }\n let popupHeight = GetDomElementOuterHeight (this.popupDiv);\n let height = this.parentDiv.offsetHeight;\n SetDomElementHeight (this.treeDiv, height - titleHeight - buttonsHeight - popupHeight);\n }\n\n Clear ()\n {\n this.ClearMeshTree ();\n ClearDomElement (this.titleButtonsDiv);\n ClearDomElement (this.buttonsDiv);\n this.buttons = null;\n }\n\n ClearMeshTree ()\n {\n super.Clear ();\n this.materialsButton.Clear ();\n this.nodeIdToItem = new Map ();\n this.meshInstanceIdToItem = new Map ();\n this.rootItem = null;\n }\n\n Init (callbacks)\n {\n super.Init (callbacks);\n this.materialsButton.Init ({\n onMeshHover : (meshInstanceId) => {\n this.callbacks.onMeshTemporarySelected (meshInstanceId);\n },\n onMeshSelected : (meshInstanceId) => {\n this.callbacks.onMeshSelected (meshInstanceId);\n },\n onMaterialSelected : (materialIndex) => {\n this.callbacks.onMaterialSelected (materialIndex);\n }\n });\n }\n\n Fill (importResult)\n {\n super.Fill (importResult);\n\n const rootNode = importResult.model.GetRootNode ();\n let isHierarchical = false;\n for (let childNode of rootNode.GetChildNodes ()) {\n if (childNode.GetType () === NodeType.GroupNode) {\n isHierarchical = true;\n break;\n }\n }\n if (this.mode === MeshesPanelMode.Simple) {\n if (isHierarchical) {\n this.mode = MeshesPanelMode.FlatList;\n }\n } else if (this.mode === MeshesPanelMode.FlatList || this.mode === MeshesPanelMode.TreeView) {\n if (!isHierarchical) {\n this.mode = MeshesPanelMode.Simple;\n }\n }\n\n this.FillButtons (importResult);\n if (this.mode === MeshesPanelMode.Simple) {\n ShowDomElement (this.buttonsDiv, false);\n this.titleDiv.classList.add ('withbuttons');\n this.titleDiv.classList.remove ('nomargin');\n } else {\n ShowDomElement (this.buttonsDiv, true);\n this.titleDiv.classList.remove ('withbuttons');\n this.titleDiv.classList.add ('nomargin');\n }\n\n this.FillMeshTree (importResult.model);\n this.Resize ();\n }\n\n FillButtons (importResult)\n {\n function CreateButton (parentDiv, button, className, onClick)\n {\n button.div = AddDiv (parentDiv, 'ov_navigator_button');\n button.div.setAttribute ('alt', button.name);\n button.div.setAttribute ('title', button.name);\n if (className) {\n button.div.classList.add (className);\n }\n button.iconDiv = AddSvgIconElement (button.div, button.icon);\n button.div.addEventListener ('click', () => {\n onClick ();\n });\n }\n\n function UpdateButtonsStatus (buttons, mode)\n {\n let showTree = (mode === MeshesPanelMode.TreeView);\n if (showTree) {\n buttons.flatList.iconDiv.classList.remove ('selected');\n buttons.treeView.iconDiv.classList.add ('selected');\n } else {\n buttons.flatList.iconDiv.classList.add ('selected');\n buttons.treeView.iconDiv.classList.remove ('selected');\n }\n ShowDomElement (buttons.separator, showTree);\n ShowDomElement (buttons.expandAll.div, showTree);\n ShowDomElement (buttons.collapseAll.div, showTree);\n }\n\n function UpdateView (panel, importResult)\n {\n let hiddenMeshInstanceIds = [];\n panel.EnumerateMeshItems ((meshItem) => {\n if (!meshItem.IsVisible ()) {\n hiddenMeshInstanceIds.push (meshItem.GetMeshInstanceId ());\n }\n return true;\n });\n\n panel.ClearMeshTree ();\n panel.FillMeshTree (importResult.model);\n\n for (let meshInstanceId of hiddenMeshInstanceIds) {\n let meshItem = panel.GetMeshItem (meshInstanceId);\n meshItem.SetVisible (false, NavigatorItemRecurse.Parents);\n }\n\n UpdateButtonsStatus (panel.buttons, panel.mode);\n panel.callbacks.onViewTypeChanged ();\n }\n\n this.buttons = {\n flatList : {\n name : 'Flat list',\n icon : 'flat_list',\n div : null,\n iconDiv : null\n },\n treeView : {\n name : 'Tree view',\n icon : 'tree_view',\n div : null,\n iconDiv : null\n },\n separator : null,\n expandAll : {\n name : 'Expand all',\n icon : 'expand',\n div : null,\n iconDiv : null\n },\n collapseAll : {\n name : 'Collapse all',\n icon : 'collapse',\n div : null,\n iconDiv : null\n },\n showHideMeshes : {\n name : 'Show/hide meshes',\n icon : 'visible',\n div : null,\n iconDiv : null\n },\n fitToWindow : {\n name : 'Fit meshes to window',\n icon : 'fit',\n div : null,\n iconDiv : null\n }\n };\n\n if (this.mode === MeshesPanelMode.Simple) {\n CreateButton (this.titleButtonsDiv, this.buttons.showHideMeshes, 'right', () => {\n let nodeId = this.rootItem.GetNodeId ();\n this.callbacks.onNodeShowHide (nodeId);\n });\n\n CreateButton (this.titleButtonsDiv, this.buttons.fitToWindow, 'right', () => {\n let nodeId = this.rootItem.GetNodeId ();\n this.callbacks.onNodeFitToWindow (nodeId);\n });\n } else {\n CreateButton (this.buttonsDiv, this.buttons.flatList, null, () => {\n if (this.mode === MeshesPanelMode.FlatList) {\n return;\n }\n this.mode = MeshesPanelMode.FlatList;\n UpdateView (this, importResult);\n });\n\n CreateButton (this.buttonsDiv, this.buttons.treeView, null, () => {\n if (this.mode === MeshesPanelMode.TreeView) {\n return;\n }\n this.mode = MeshesPanelMode.TreeView;\n UpdateView (this, importResult);\n });\n\n this.buttons.separator = AddDiv (this.buttonsDiv, 'ov_navigator_buttons_separator');\n\n CreateButton (this.buttonsDiv, this.buttons.expandAll, null, () => {\n this.rootItem.ExpandAll (true);\n });\n\n CreateButton (this.buttonsDiv, this.buttons.collapseAll, null, () => {\n this.rootItem.ExpandAll (false);\n });\n\n CreateButton (this.buttonsDiv, this.buttons.showHideMeshes, 'right', () => {\n let nodeId = this.rootItem.GetNodeId ();\n this.callbacks.onNodeShowHide (nodeId);\n });\n\n CreateButton (this.buttonsDiv, this.buttons.fitToWindow, 'right', () => {\n let nodeId = this.rootItem.GetNodeId ();\n this.callbacks.onNodeFitToWindow (nodeId);\n });\n\n UpdateButtonsStatus (this.buttons, this.mode);\n }\n }\n\n FillMeshTree (model)\n {\n function AddMeshToNodeTree (panel, model, node, meshIndex, parentItem, mode)\n {\n let mesh = model.GetMesh (meshIndex);\n let meshName = GetMeshName (mesh.GetName ());\n let meshInstanceId = new MeshInstanceId (node.GetId (), meshIndex);\n let meshItemIcon = (mode === MeshesPanelMode.TreeView ? 'tree_mesh' : null);\n let meshItem = new MeshItem (meshName, meshItemIcon, meshInstanceId, {\n onShowHide : (selectedMeshId) => {\n panel.callbacks.onMeshShowHide (selectedMeshId);\n },\n onFitToWindow : (selectedMeshId) => {\n panel.callbacks.onMeshFitToWindow (selectedMeshId);\n },\n onSelected : (selectedMeshId) => {\n panel.callbacks.onMeshSelected (selectedMeshId);\n }\n });\n panel.meshInstanceIdToItem.set (meshInstanceId.GetKey (), meshItem);\n parentItem.AddChild (meshItem);\n }\n\n function CreateNodeItem (panel, node)\n {\n const nodeName = GetNodeName (node.GetName ());\n const nodeId = node.GetId ();\n let nodeItem = new NodeItem (nodeName, nodeId, {\n onShowHide : (selectedNodeId) => {\n panel.callbacks.onNodeShowHide (selectedNodeId);\n },\n onFitToWindow : (selectedNodeId) => {\n panel.callbacks.onNodeFitToWindow (selectedNodeId);\n }\n });\n panel.nodeIdToItem.set (nodeId, nodeItem);\n return nodeItem;\n }\n\n function CreateDummyRootItem (panel, node)\n {\n const nodeId = node.GetId ();\n let rootItem = new NodeItem (null, nodeId, {\n onVisibilityChanged : (isVisible) => {\n if (isVisible) {\n SetSvgIconImageElement (panel.buttons.showHideMeshes.iconDiv, 'visible');\n } else {\n SetSvgIconImageElement (panel.buttons.showHideMeshes.iconDiv, 'hidden');\n }\n }\n });\n rootItem.Show (false);\n rootItem.ShowChildren (true);\n panel.treeView.AddChild (rootItem);\n panel.nodeIdToItem.set (nodeId, rootItem);\n return rootItem;\n }\n\n function AddModelNodeToTree (panel, model, node, parentItem, mode)\n {\n let meshNodes = [];\n for (let childNode of node.GetChildNodes ()) {\n if (mode === MeshesPanelMode.TreeView) {\n if (childNode.GetType () === NodeType.GroupNode) {\n let nodeItem = CreateNodeItem (panel, childNode);\n parentItem.AddChild (nodeItem);\n AddModelNodeToTree (panel, model, childNode, nodeItem, mode);\n } else if (childNode.GetType () === NodeType.MeshNode) {\n meshNodes.push (childNode);\n }\n } else {\n AddModelNodeToTree (panel, model, childNode, parentItem, mode);\n }\n }\n for (let meshNode of meshNodes) {\n AddModelNodeToTree (panel, model, meshNode, parentItem, mode);\n }\n for (let meshIndex of node.GetMeshIndices ()) {\n AddMeshToNodeTree (panel, model, node, meshIndex, parentItem, mode);\n }\n }\n\n let rootNode = model.GetRootNode ();\n this.rootItem = CreateDummyRootItem (this, rootNode);\n AddModelNodeToTree (this, model, rootNode, this.rootItem, this.mode);\n }\n\n UpdateMaterialList (materialInfoArray)\n {\n this.materialsButton.Update (materialInfoArray);\n }\n\n GetNodeItem (nodeId)\n {\n return this.nodeIdToItem.get (nodeId);\n }\n\n MeshItemCount ()\n {\n return this.meshInstanceIdToItem.size;\n }\n\n GetMeshItem (meshInstanceId)\n {\n return this.meshInstanceIdToItem.get (meshInstanceId.GetKey ());\n }\n\n EnumerateNodeItems (processor)\n {\n for (const nodeItem of this.nodeIdToItem.values ()) {\n if (!processor (nodeItem)) {\n break;\n }\n }\n }\n\n EnumerateMeshItems (processor)\n {\n for (const meshItem of this.meshInstanceIdToItem.values ()) {\n if (!processor (meshItem)) {\n break;\n }\n }\n }\n\n IsMeshVisible (meshInstanceId)\n {\n let meshItem = this.GetMeshItem (meshInstanceId);\n return meshItem.IsVisible ();\n }\n\n HasHiddenMesh ()\n {\n let hasHiddenMesh = false;\n this.EnumerateMeshItems ((meshItem) => {\n if (!meshItem.IsVisible ()) {\n hasHiddenMesh = true;\n return false;\n }\n return true;\n });\n return hasHiddenMesh;\n }\n\n ShowAllMeshes (show)\n {\n this.EnumerateNodeItems ((nodeItem) => {\n nodeItem.SetVisible (show, NavigatorItemRecurse.No);\n return true;\n });\n this.EnumerateMeshItems ((meshItem) => {\n meshItem.SetVisible (show, NavigatorItemRecurse.No);\n return true;\n });\n }\n\n ToggleNodeVisibility (nodeId)\n {\n let nodeItem = this.GetNodeItem (nodeId);\n nodeItem.SetVisible (!nodeItem.IsVisible (), NavigatorItemRecurse.All);\n }\n\n ToggleMeshVisibility (meshInstanceId)\n {\n let meshItem = this.GetMeshItem (meshInstanceId);\n meshItem.SetVisible (!meshItem.IsVisible (), NavigatorItemRecurse.Parents);\n }\n\n IsMeshIsolated (meshInstanceId)\n {\n let isIsolated = true;\n this.EnumerateMeshItems ((meshItem) => {\n if (!meshItem.GetMeshInstanceId ().IsEqual (meshInstanceId) && meshItem.IsVisible ()) {\n isIsolated = false;\n return false;\n }\n return true;\n });\n return isIsolated;\n }\n\n IsolateMesh (meshInstanceId)\n {\n this.ShowAllMeshes (false);\n this.ToggleMeshVisibility (meshInstanceId);\n }\n}\n", "import { ShowDomElement, SetDomElementHeight, GetDomElementOuterWidth, SetDomElementOuterHeight } from '../engine/viewer/domutils.js';\nimport { NavigatorFilesPanel } from './navigatorfilespanel.js';\nimport { NavigatorMaterialsPanel } from './navigatormaterialspanel.js';\nimport { NavigatorMeshesPanel } from './navigatormeshespanel.js';\nimport { PanelSet } from './panelset.js';\nimport { InstallVerticalSplitter } from './utils.js';\n\nexport const SelectionType =\n{\n Material : 1,\n Mesh : 2\n};\n\nexport class Selection\n{\n constructor (type, data)\n {\n this.type = type;\n this.materialIndex = null;\n this.meshInstanceId = null;\n if (this.type === SelectionType.Material) {\n this.materialIndex = data;\n } else if (this.type === SelectionType.Mesh) {\n this.meshInstanceId = data;\n }\n }\n\n IsEqual (rhs)\n {\n if (this.type !== rhs.type) {\n return false;\n }\n if (this.type === SelectionType.Material) {\n return this.materialIndex === rhs.materialIndex;\n } else if (this.type === SelectionType.Mesh) {\n return this.meshInstanceId.IsEqual (rhs.meshInstanceId);\n }\n }\n}\n\nexport class Navigator\n{\n constructor (mainDiv, splitterDiv)\n {\n this.mainDiv = mainDiv;\n this.splitterDiv = splitterDiv;\n\n this.panelSet = new PanelSet (mainDiv);\n this.callbacks = null;\n this.selection = null;\n this.tempSelectedMeshId = null;\n\n this.filesPanel = new NavigatorFilesPanel (this.panelSet.GetContentDiv ());\n this.materialsPanel = new NavigatorMaterialsPanel (this.panelSet.GetContentDiv ());\n this.meshesPanel = new NavigatorMeshesPanel (this.panelSet.GetContentDiv ());\n\n this.panelSet.AddPanel (this.filesPanel);\n this.panelSet.AddPanel (this.materialsPanel);\n this.panelSet.AddPanel (this.meshesPanel);\n this.panelSet.ShowPanel (this.meshesPanel);\n }\n\n ShowPanels (show)\n {\n this.panelSet.ShowPanels (show);\n }\n\n Init (callbacks)\n {\n this.callbacks = callbacks;\n\n this.panelSet.Init ({\n onResize : () => {\n ShowDomElement (this.splitterDiv, this.panelSet.IsPanelsVisible ());\n this.callbacks.onResize ();\n },\n onShowHidePanels : (show) => {\n this.callbacks.onShowHidePanels (show);\n },\n });\n\n this.filesPanel.Init ({\n onFileBrowseButtonClicked : () => {\n this.callbacks.openFileBrowserDialog ();\n }\n });\n\n this.materialsPanel.Init ({\n onMaterialSelected : (materialIndex) => {\n this.SetSelection (new Selection (SelectionType.Material, materialIndex));\n },\n onMeshTemporarySelected : (meshInstanceId) => {\n this.tempSelectedMeshId = meshInstanceId;\n this.callbacks.updateMeshesSelection ();\n },\n onMeshSelected : (meshInstanceId) => {\n this.SetSelection (new Selection (SelectionType.Mesh, meshInstanceId));\n }\n });\n\n this.meshesPanel.Init ({\n onMeshSelected : (meshId) => {\n this.SetSelection (new Selection (SelectionType.Mesh, meshId));\n },\n onMeshShowHide : (meshId) => {\n this.ToggleMeshVisibility (meshId);\n },\n onMeshFitToWindow : (meshId) => {\n this.FitMeshToWindow (meshId);\n },\n onNodeShowHide : (nodeId) => {\n this.ToggleNodeVisibility (nodeId);\n },\n onNodeFitToWindow : (nodeId) => {\n this.FitNodeToWindow (nodeId);\n },\n onMaterialSelected : (materialIndex) => {\n this.SetSelection (new Selection (SelectionType.Material, materialIndex));\n },\n onViewTypeChanged : () => {\n this.SetSelection (null);\n }\n });\n\n InstallVerticalSplitter (this.splitterDiv, this.mainDiv, false, () => {\n this.callbacks.onResize ();\n });\n }\n\n GetWidth ()\n {\n let navigatorWidth = GetDomElementOuterWidth (this.mainDiv);\n let splitterWidth = 0;\n if (this.panelSet.IsPanelsVisible ()) {\n splitterWidth = this.splitterDiv.offsetWidth;\n }\n return navigatorWidth + splitterWidth;\n }\n\n Resize (height)\n {\n SetDomElementOuterHeight (this.mainDiv, height);\n SetDomElementHeight (this.splitterDiv, height);\n this.panelSet.Resize ();\n }\n\n FillTree (importResult)\n {\n this.filesPanel.Fill (importResult);\n if (importResult.missingFiles.length === 0) {\n this.panelSet.SetPanelIcon (this.filesPanel, 'files');\n } else {\n this.panelSet.SetPanelIcon (this.filesPanel, 'missing_files');\n }\n this.materialsPanel.Fill (importResult);\n this.meshesPanel.Fill (importResult);\n this.OnSelectionChanged ();\n }\n\n MeshItemCount ()\n {\n return this.meshesPanel.MeshItemCount ();\n }\n\n IsMeshVisible (meshInstanceId)\n {\n return this.meshesPanel.IsMeshVisible (meshInstanceId);\n }\n\n HasHiddenMesh ()\n {\n return this.meshesPanel.HasHiddenMesh ();\n }\n\n ShowAllMeshes (show)\n {\n this.meshesPanel.ShowAllMeshes (show);\n this.callbacks.updateMeshesVisibility ();\n }\n\n ToggleNodeVisibility (nodeId)\n {\n this.meshesPanel.ToggleNodeVisibility (nodeId);\n this.callbacks.updateMeshesVisibility ();\n }\n\n ToggleMeshVisibility (meshInstanceId)\n {\n this.meshesPanel.ToggleMeshVisibility (meshInstanceId);\n this.callbacks.updateMeshesVisibility ();\n }\n\n IsMeshIsolated (meshInstanceId)\n {\n return this.meshesPanel.IsMeshIsolated (meshInstanceId);\n }\n\n IsolateMesh (meshInstanceId)\n {\n this.meshesPanel.IsolateMesh (meshInstanceId);\n this.callbacks.updateMeshesVisibility ();\n }\n\n GetSelectedMeshId ()\n {\n if (this.tempSelectedMeshId !== null) {\n return this.tempSelectedMeshId;\n }\n if (this.selection === null || this.selection.type !== SelectionType.Mesh) {\n return null;\n }\n return this.selection.meshInstanceId;\n }\n\n SetSelection (selection)\n {\n function SetEntitySelection (navigator, selection, select)\n {\n if (selection.type === SelectionType.Material) {\n if (select && navigator.panelSet.IsPanelsVisible ()) {\n navigator.panelSet.ShowPanel (navigator.materialsPanel);\n }\n navigator.materialsPanel.SelectMaterialItem (selection.materialIndex, select);\n } else if (selection.type === SelectionType.Mesh) {\n if (select && navigator.panelSet.IsPanelsVisible ()) {\n navigator.panelSet.ShowPanel (navigator.meshesPanel);\n }\n navigator.meshesPanel.GetMeshItem (selection.meshInstanceId).SetSelected (select);\n }\n }\n\n function SetCurrentSelection (navigator, selection)\n {\n navigator.selection = selection;\n navigator.OnSelectionChanged ();\n }\n\n let oldSelection = this.selection;\n if (oldSelection !== null) {\n SetEntitySelection (this, oldSelection, false);\n }\n\n SetCurrentSelection (this, selection);\n this.tempSelectedMeshId = null;\n\n if (this.selection !== null) {\n if (oldSelection !== null && oldSelection.IsEqual (this.selection)) {\n SetEntitySelection (this, this.selection, false);\n SetCurrentSelection (this, null);\n } else {\n SetEntitySelection (this, this.selection, true);\n }\n }\n\n this.callbacks.updateMeshesSelection ();\n }\n\n OnSelectionChanged ()\n {\n if (this.selection === null) {\n this.callbacks.onModelSelected ();\n } else {\n if (this.selection.type === SelectionType.Material) {\n this.callbacks.onMaterialSelected (this.selection.materialIndex);\n } else if (this.selection.type === SelectionType.Mesh) {\n this.callbacks.onMeshSelected (this.selection.meshInstanceId);\n }\n }\n this.UpdatePanels ();\n }\n\n UpdatePanels ()\n {\n let materialIndex = null;\n let meshInstanceId = null;\n if (this.selection !== null) {\n if (this.selection.type === SelectionType.Material) {\n materialIndex = this.selection.materialIndex;\n } else if (this.selection.type === SelectionType.Mesh) {\n meshInstanceId = this.selection.meshInstanceId;\n }\n }\n\n let usedByMeshes = this.callbacks.getMeshesForMaterial (materialIndex);\n this.materialsPanel.UpdateMeshList (usedByMeshes);\n\n let usedByMaterials = this.callbacks.getMaterialsForMesh (meshInstanceId);\n this.meshesPanel.UpdateMaterialList (usedByMaterials);\n }\n\n FitNodeToWindow (nodeId)\n {\n let meshInstanceIdSet = new Set ();\n let nodeItem = this.meshesPanel.GetNodeItem (nodeId);\n nodeItem.EnumerateMeshItems ((meshItem) => {\n meshInstanceIdSet.add (meshItem.GetMeshInstanceId ());\n });\n this.callbacks.fitMeshesToWindow (meshInstanceIdSet);\n }\n\n FitMeshToWindow (meshInstanceId)\n {\n this.callbacks.fitMeshToWindow (meshInstanceId);\n }\n\n Clear ()\n {\n this.panelSet.Clear ();\n this.selection = null;\n }\n}\n", "import { ParameterConverter } from '../engine/parameters/parameterlist.js';\n\nexport function CookieSetStringVal (key, value)\n{\n let date = new Date ();\n let expirationDays = 365;\n date.setTime (date.getTime () + (expirationDays * 24 * 60 * 60 * 1000));\n document.cookie = key + '=' + value + '; expires=' + date.toUTCString () + ';';\n}\n\nexport function CookieGetStringVal (key, defVal)\n{\n let cookie = decodeURIComponent (document.cookie);\n let cookieParts = cookie.split (';');\n for (let i = 0; i < cookieParts.length; i++) {\n let currentCookie = cookieParts[i].trim ();\n if (currentCookie.startsWith (key + '=')) {\n return currentCookie.substring (key.length + 1);\n }\n }\n return defVal;\n}\n\nexport function CookieGetBoolVal (key, defVal)\n{\n let stringVal = CookieGetStringVal (key, null);\n if (stringVal === null) {\n return defVal;\n }\n return stringVal === 'true' ? true : false;\n}\n\nexport function CookieSetBoolVal (key, value)\n{\n CookieSetStringVal (key, value ? 'true' : 'false');\n}\n\nexport function CookieGetIntVal (key, defVal)\n{\n let stringVal = CookieGetStringVal (key, null);\n if (stringVal === null) {\n return defVal;\n }\n return parseInt (stringVal, 10);\n}\n\nexport function CookieSetIntVal (key, value)\n{\n CookieSetStringVal (key, value.toString ());\n}\n\nexport function CookieGetColorVal (key, defVal)\n{\n let stringVal = CookieGetStringVal (key, null);\n if (stringVal === null) {\n return defVal;\n }\n return ParameterConverter.StringToColor (stringVal);\n}\n\nexport function CookieSetColorVal (key, value)\n{\n CookieSetStringVal (key, ParameterConverter.ColorToString (value));\n}\n\nexport function CookieClearVal (key)\n{\n CookieSetStringVal (key, '');\n}\n", "import { Color } from '../engine/model/color.js';\nimport { CookieGetBoolVal, CookieGetColorVal, CookieGetIntVal, CookieGetStringVal, CookieSetBoolVal, CookieSetColorVal, CookieSetIntVal, CookieSetStringVal } from './cookiehandler.js';\n\nexport const Theme =\n{\n Light : 1,\n Dark : 2\n};\n\nexport class Settings\n{\n constructor ()\n {\n this.environmentMapName = 'fishermans_bastion';\n this.backgroundIsEnvMap = false;\n this.backgroundColor = new Color (255, 255, 255);\n this.defaultColor = new Color (200, 200, 200);\n this.showEdges = false;\n this.edgeColor = new Color (0, 0, 0);\n this.edgeThreshold = 1;\n this.themeId = Theme.Light;\n }\n\n LoadFromCookies ()\n {\n this.environmentMapName = CookieGetStringVal ('ov_environment_map', 'fishermans_bastion');\n this.backgroundIsEnvMap = CookieGetBoolVal ('ov_background_is_envmap', false);\n this.backgroundColor = CookieGetColorVal ('ov_background_color', new Color (255, 255, 255));\n this.defaultColor = CookieGetColorVal ('ov_default_color', new Color (200, 200, 200));\n this.showEdges = CookieGetBoolVal ('ov_show_edges', false);\n this.edgeColor = CookieGetColorVal ('ov_edge_color', new Color (0, 0, 0));\n this.edgeThreshold = CookieGetIntVal ('ov_edge_threshold', 1);\n this.themeId = CookieGetIntVal ('ov_theme_id', Theme.Light);\n }\n\n SaveToCookies ()\n {\n CookieSetStringVal ('ov_environment_map', this.environmentMapName);\n CookieSetBoolVal ('ov_background_is_envmap', this.backgroundIsEnvMap);\n CookieSetColorVal ('ov_background_color', this.backgroundColor);\n CookieSetColorVal ('ov_default_color', this.defaultColor);\n CookieSetBoolVal ('ov_show_edges', this.showEdges);\n CookieSetColorVal ('ov_edge_color', this.edgeColor);\n CookieSetIntVal ('ov_edge_threshold', this.edgeThreshold);\n CookieSetIntVal ('ov_theme_id', this.themeId);\n }\n}\n", "import { CoordDistance3D, CrossVector3D, DotVector3D } from '../geometry/coord3d.js';\n\nexport function GetTriangleArea (v0, v1, v2)\n{\n const a = CoordDistance3D (v0, v1);\n const b = CoordDistance3D (v1, v2);\n const c = CoordDistance3D (v0, v2);\n const s = (a + b + c) / 2.0;\n const areaSquare = s * (s - a) * (s - b) * (s - c);\n if (areaSquare < 0.0) {\n return 0.0;\n }\n return Math.sqrt (areaSquare);\n}\n\nexport function GetTetrahedronSignedVolume (v0, v1, v2)\n{\n return DotVector3D (v0, CrossVector3D (v1, v2)) / 6.0;\n}\n\nexport function CalculateVolume (object3D)\n{\n let volume = 0.0;\n object3D.EnumerateTriangleVertices ((v0, v1, v2) => {\n volume += GetTetrahedronSignedVolume (v0, v1, v2);\n });\n return volume;\n}\n\nexport function CalculateSurfaceArea (object3D)\n{\n let surface = 0.0;\n object3D.EnumerateTriangleVertices ((v0, v1, v2) => {\n surface += GetTriangleArea (v0, v1, v2);\n });\n return surface;\n}\n", "import { AddDiv, ClearDomElement } from '../engine/viewer/domutils.js';\nimport { Panel } from './panelset.js';\n\nexport class SidebarPanel extends Panel\n{\n constructor (parentDiv)\n {\n super (parentDiv);\n this.callbacks = null;\n\n this.titleDiv = null;\n if (this.HasTitle ()) {\n this.titleDiv = AddDiv (this.panelDiv, 'ov_sidebar_title');\n AddDiv (this.titleDiv, 'ov_sidebar_title_text', this.GetName ());\n this.titleDiv.setAttribute ('title', this.GetName ());\n }\n\n this.contentDiv = AddDiv (this.panelDiv, 'ov_sidebar_content ov_thin_scrollbar');\n }\n\n GetName ()\n {\n return null;\n }\n\n HasTitle ()\n {\n return true;\n }\n\n Clear ()\n {\n ClearDomElement (this.contentDiv);\n }\n\n Init (callbacks)\n {\n this.callbacks = callbacks;\n }\n}\n", "import { RunTaskAsync } from '../engine/core/taskrunner.js';\nimport { SubCoord3D } from '../engine/geometry/coord3d.js';\nimport { GetBoundingBox, IsSolid } from '../engine/model/modelutils.js';\nimport { CalculateVolume, CalculateSurfaceArea } from '../engine/model/quantities.js';\nimport { Property, PropertyType } from '../engine/model/property.js';\nimport { AddDiv, AddDomElement, ClearDomElement } from '../engine/viewer/domutils.js';\nimport { SidebarPanel } from './sidebarpanel.js';\nimport { CreateInlineColorCircle } from './utils.js';\nimport { GetFileName } from '../engine/io/fileutils.js';\nimport { MaterialType } from '../engine/model/material.js';\nimport { ColorToHexString } from '../engine/model/color.js';\n\nexport class SidebarDetailsPanel extends SidebarPanel\n{\n constructor (parentDiv)\n {\n super (parentDiv);\n }\n\n GetName ()\n {\n return 'Details';\n }\n\n GetIcon ()\n {\n return 'details';\n }\n\n AddObject3DProperties (object3D)\n {\n this.Clear ();\n let table = AddDiv (this.contentDiv, 'ov_property_table');\n let boundingBox = GetBoundingBox (object3D);\n let size = SubCoord3D (boundingBox.max, boundingBox.min);\n this.AddProperty (table, new Property (PropertyType.Integer, 'Vertices', object3D.VertexCount ()));\n this.AddProperty (table, new Property (PropertyType.Integer, 'Triangles', object3D.TriangleCount ()));\n this.AddProperty (table, new Property (PropertyType.Number, 'Size X', size.x));\n this.AddProperty (table, new Property (PropertyType.Number, 'Size Y', size.y));\n this.AddProperty (table, new Property (PropertyType.Number, 'Size Z', size.z));\n this.AddCalculatedProperty (table, 'Volume', () => {\n if (!IsSolid (object3D)) {\n return null;\n }\n const volume = CalculateVolume (object3D);\n return new Property (PropertyType.Number, null, volume);\n });\n this.AddCalculatedProperty (table, 'Surface', () => {\n const surfaceArea = CalculateSurfaceArea (object3D);\n return new Property (PropertyType.Number, null, surfaceArea);\n });\n if (object3D.PropertyGroupCount () > 0) {\n let customTable = AddDiv (this.contentDiv, 'ov_property_table ov_property_table_custom');\n for (let i = 0; i < object3D.PropertyGroupCount (); i++) {\n const propertyGroup = object3D.GetPropertyGroup (i);\n this.AddPropertyGroup (customTable, propertyGroup);\n for (let j = 0; j < propertyGroup.PropertyCount (); j++) {\n const property = propertyGroup.GetProperty (j);\n this.AddPropertyInGroup (customTable, property);\n }\n }\n }\n this.Resize ();\n }\n\n AddMaterialProperties (material)\n {\n function AddTextureMap (obj, table, name, map)\n {\n if (map === null || map.name === null) {\n return;\n }\n let fileName = GetFileName (map.name);\n obj.AddProperty (table, new Property (PropertyType.Text, name, fileName));\n }\n\n this.Clear ();\n let table = AddDiv (this.contentDiv, 'ov_property_table');\n let typeString = null;\n if (material.type === MaterialType.Phong) {\n typeString = 'Phong';\n } else if (material.type === MaterialType.Physical) {\n typeString = 'Physical';\n }\n this.AddProperty (table, new Property (PropertyType.Text, 'Source', material.isDefault ? 'Default' : 'Model'));\n this.AddProperty (table, new Property (PropertyType.Text, 'Type', typeString));\n if (material.vertexColors) {\n this.AddProperty (table, new Property (PropertyType.Text, 'Color', 'Vertex colors'));\n } else {\n this.AddProperty (table, new Property (PropertyType.Color, 'Color', material.color));\n if (material.type === MaterialType.Phong) {\n this.AddProperty (table, new Property (PropertyType.Color, 'Ambient', material.ambient));\n this.AddProperty (table, new Property (PropertyType.Color, 'Specular', material.specular));\n }\n }\n if (material.type === MaterialType.Physical) {\n this.AddProperty (table, new Property (PropertyType.Percent, 'Metalness', material.metalness));\n this.AddProperty (table, new Property (PropertyType.Percent, 'Roughness', material.roughness));\n }\n this.AddProperty (table, new Property (PropertyType.Percent, 'Opacity', material.opacity));\n AddTextureMap (this, table, 'Diffuse Map', material.diffuseMap);\n AddTextureMap (this, table, 'Bump Map', material.bumpMap);\n AddTextureMap (this, table, 'Normal Map', material.normalMap);\n AddTextureMap (this, table, 'Emissive Map', material.emissiveMap);\n if (material.type === MaterialType.Phong) {\n AddTextureMap (this, table, 'Specular Map', material.specularMap);\n } else if (material.type === MaterialType.Physical) {\n AddTextureMap (this, table, 'Metallic Map', material.metalnessMap);\n }\n this.Resize ();\n }\n\n AddPropertyGroup (table, propertyGroup)\n {\n let row = AddDiv (table, 'ov_property_table_row group', propertyGroup.name);\n row.setAttribute ('title', propertyGroup.name);\n }\n\n AddProperty (table, property)\n {\n let row = AddDiv (table, 'ov_property_table_row');\n let nameColumn = AddDiv (row, 'ov_property_table_cell ov_property_table_name', property.name + ':');\n let valueColumn = AddDiv (row, 'ov_property_table_cell ov_property_table_value');\n nameColumn.setAttribute ('title', property.name);\n this.DisplayPropertyValue (property, valueColumn);\n return row;\n }\n\n AddPropertyInGroup (table, property)\n {\n let row = this.AddProperty (table, property);\n row.classList.add ('ingroup');\n }\n\n AddCalculatedProperty (table, name, calculateValue)\n {\n let row = AddDiv (table, 'ov_property_table_row');\n let nameColumn = AddDiv (row, 'ov_property_table_cell ov_property_table_name', name + ':');\n let valueColumn = AddDiv (row, 'ov_property_table_cell ov_property_table_value');\n nameColumn.setAttribute ('title', name);\n\n let calculateButton = AddDiv (valueColumn, 'ov_property_table_button', 'Calculate...');\n calculateButton.addEventListener ('click', () => {\n ClearDomElement (valueColumn);\n valueColumn.innerHTML = 'Please wait...';\n RunTaskAsync (() => {\n let propertyValue = calculateValue ();\n if (propertyValue === null) {\n valueColumn.innerHTML = '-';\n } else {\n this.DisplayPropertyValue (propertyValue, valueColumn);\n }\n });\n });\n }\n\n DisplayPropertyValue (property, targetDiv)\n {\n ClearDomElement (targetDiv);\n let valueText = null;\n if (property.type === PropertyType.Text) {\n valueText = property.value;\n } else if (property.type === PropertyType.Integer) {\n valueText = property.value.toLocaleString ();\n } else if (property.type === PropertyType.Number) {\n valueText = property.value.toLocaleString (undefined, {\n minimumFractionDigits: 2,\n maximumFractionDigits: 2\n });\n } else if (property.type === PropertyType.Boolean) {\n valueText = property.value ? 'True' : 'False';\n } else if (property.type === PropertyType.Percent) {\n valueText = parseInt (property.value * 100, 10).toString () + '%';\n } else if (property.type === PropertyType.Color) {\n let hexString = '#' + ColorToHexString (property.value);\n let colorCircle = CreateInlineColorCircle (property.value);\n targetDiv.appendChild (colorCircle);\n AddDomElement (targetDiv, 'span', null, hexString);\n }\n if (valueText !== null) {\n targetDiv.innerHTML = valueText;\n targetDiv.setAttribute ('title', valueText);\n }\n }\n}\n", "export const FeatureSet =\n{\n EnvironmentMap : false\n};\n", "import { Color, ColorToHexString } from '../engine/model/color.js';\nimport { AddDiv, AddDomElement, ShowDomElement, SetDomElementOuterHeight } from '../engine/viewer/domutils.js';\nimport { AddRangeSlider, AddToggle, AddCheckbox } from '../website/utils.js';\nimport { CalculatePopupPositionToElementTopLeft } from './dialogs.js';\nimport { FeatureSet } from './featureset.js';\nimport { PopupDialog } from './dialog.js';\nimport { Settings, Theme } from './settings.js';\nimport { SidebarPanel } from './sidebarpanel.js';\nimport { AddSvgIconElement } from './utils.js';\n\nfunction AddColorPicker (parentDiv, defaultColor, predefinedColors, onChange)\n{\n let pickr = Pickr.create ({\n el : parentDiv,\n theme : 'monolith',\n position : 'left-start',\n swatches : predefinedColors,\n comparison : false,\n default : '#' + ColorToHexString (defaultColor),\n components : {\n preview : false,\n opacity : false,\n hue : true,\n interaction: {\n hex : false,\n rgba : false,\n hsla : false,\n hsva : false,\n cmyk : false,\n input : true,\n clear : false,\n save : false\n }\n }\n });\n pickr.on ('change', (color, source, instance) => {\n let rgbaColor = color.toRGBA ();\n let ovColor = new Color (\n parseInt (rgbaColor[0], 10),\n parseInt (rgbaColor[1], 10),\n parseInt (rgbaColor[2], 10)\n );\n onChange (ovColor);\n });\n return pickr;\n}\n\nclass EnvironmentMapPopup extends PopupDialog\n{\n constructor ()\n {\n super ();\n }\n\n ShowPopup (buttonDiv, settings, callbacks)\n {\n let contentDiv = super.Init (() => {\n return CalculatePopupPositionToElementTopLeft (buttonDiv, contentDiv);\n });\n\n let envMapImages = [\n {\n element: null,\n name: 'fishermans_bastion'\n },\n {\n element: null,\n name: 'citadella'\n },\n {\n element: null,\n name: 'maskonaive'\n },\n {\n element: null,\n name: 'teide'\n },\n {\n element: null,\n name: 'ice_river'\n },\n {\n element: null,\n name: 'park'\n }\n ];\n\n for (let envMapImage of envMapImages) {\n envMapImage.element = AddDomElement (contentDiv, 'img', 'ov_environment_map_preview');\n envMapImage.element.setAttribute ('src', 'assets/envmaps/' + envMapImage.name + '.jpg');\n if (envMapImage.name === settings.environmentMapName) {\n envMapImage.element.classList.add ('selected');\n }\n envMapImage.element.addEventListener ('click', () => {\n for (let otherImage of envMapImages) {\n otherImage.element.classList.remove ('selected');\n }\n envMapImage.element.classList.add ('selected');\n settings.environmentMapName = envMapImage.name;\n callbacks.onEnvironmentMapChange ();\n });\n }\n\n let backgroundIsEnvMapCheckbox = AddCheckbox (contentDiv, 'use_as_background', 'Use as background', settings.backgroundIsEnvMap, () => {\n settings.backgroundIsEnvMap = backgroundIsEnvMapCheckbox.checked;\n callbacks.onEnvironmentMapChange ();\n });\n\n contentDiv.classList.add ('sidebar');\n this.Open ();\n }\n}\n\nclass SettingsSection\n{\n constructor (parentDiv, title)\n {\n this.parentDiv = parentDiv;\n this.contentDiv = AddDiv (this.parentDiv, 'ov_sidebar_settings_section');\n AddDiv (this.contentDiv, 'ov_sidebar_title', title);\n }\n\n Init (settings, callbacks)\n {\n\n }\n\n Update (settings)\n {\n\n }\n\n Clear ()\n {\n\n }\n}\n\nclass SettingsModelDisplaySection extends SettingsSection\n{\n constructor (parentDiv)\n {\n super (parentDiv, 'Model Display');\n\n this.environmentMapButton = null;\n this.environmentMapPopup = null;\n\n this.backgroundColorPicker = null;\n\n this.edgeDisplayToggle = null;\n this.edgeColorPicker = null;\n this.thresholdSlider = null;\n this.thresholdSliderValue = null;\n this.edgeSettingsDiv = null;\n }\n\n Init (settings, callbacks)\n {\n if (FeatureSet.EnvironmentMap) {\n this.environmentMapButton = AddDiv (this.contentDiv, 'ov_panel_button');\n AddSvgIconElement (this.environmentMapButton, 'arrow_left', 'ov_panel_button_left_icon');\n AddDiv (this.environmentMapButton, 'ov_panel_button_text', 'Environment Map');\n this.environmentMapButton.addEventListener ('click', () => {\n this.environmentMapPopup = new EnvironmentMapPopup ();\n this.environmentMapPopup.ShowPopup (this.environmentMapButton, settings, {\n onEnvironmentMapChange : () => {\n callbacks.onEnvironmentMapChange ();\n }\n });\n });\n }\n\n let backgroundColorDiv = AddDiv (this.contentDiv, 'ov_sidebar_parameter');\n let backgroundColorInput = AddDiv (backgroundColorDiv, 'ov_color_picker');\n AddDiv (backgroundColorDiv, null, 'Background Color');\n let predefinedBackgroundColors = ['#ffffff', '#e3e3e3', '#c9c9c9', '#898989', '#5f5f5f', '#494949', '#383838', '#0f0f0f'];\n this.backgroundColorPicker = AddColorPicker (backgroundColorInput, settings.backgroundColor, predefinedBackgroundColors, (color) => {\n settings.backgroundColor = color;\n callbacks.onBackgroundColorChange ();\n });\n\n let edgeParameterDiv = AddDiv (this.contentDiv, 'ov_sidebar_parameter');\n this.edgeDisplayToggle = AddToggle (edgeParameterDiv, 'ov_sidebar_parameter_toggle');\n AddDiv (edgeParameterDiv, 'ov_sidebar_parameter_text', 'Show Edges');\n\n this.edgeSettingsDiv = AddDiv (this.contentDiv, 'ov_sidebar_settings_padded');\n this.edgeDisplayToggle.OnChange (() => {\n ShowDomElement (this.edgeSettingsDiv, this.edgeDisplayToggle.GetStatus ());\n settings.showEdges = this.edgeDisplayToggle.GetStatus ();\n callbacks.onShowEdgesChange ();\n });\n\n let edgeColorRow = AddDiv (this.edgeSettingsDiv, 'ov_sidebar_settings_row');\n let predefinedEdgeColors = ['#ffffff', '#e3e3e3', '#c9c9c9', '#898989', '#5f5f5f', '#494949', '#383838', '#0f0f0f'];\n\n let edgeColorInput = AddDiv (edgeColorRow, 'ov_color_picker');\n this.edgeColorPicker = AddColorPicker (edgeColorInput, settings.edgeColor, predefinedEdgeColors, (color) => {\n settings.edgeColor = color;\n callbacks.onEdgeColorChange ();\n });\n AddDiv (edgeColorRow, null, 'Edge Color');\n\n let thresholdRow = AddDiv (this.edgeSettingsDiv, 'ov_sidebar_settings_row large');\n this.thresholdSlider = AddRangeSlider (thresholdRow, 0, 90);\n this.thresholdSlider.setAttribute ('title', 'Edge Angle Threshold');\n this.thresholdSliderValue = AddDomElement (thresholdRow, 'span', 'ov_slider_label');\n this.thresholdSlider.addEventListener ('input', () => {\n this.thresholdSliderValue.innerHTML = this.thresholdSlider.value;\n });\n this. thresholdSlider.addEventListener ('change', () => {\n settings.edgeThreshold = this.thresholdSlider.value;\n callbacks.onEdgeThresholdChange ();\n });\n this.thresholdSlider.value = settings.edgeThreshold;\n this.thresholdSliderValue.innerHTML = settings.edgeThreshold;\n\n this.edgeDisplayToggle.SetStatus (settings.showEdges);\n ShowDomElement (this.edgeSettingsDiv, settings.showEdges);\n }\n\n UpdateVisibility (isPhysicallyBased)\n {\n if (this.environmentMapButton !== null) {\n ShowDomElement (this.environmentMapButton, isPhysicallyBased);\n }\n }\n\n Update (settings)\n {\n if (this.backgroundColorPicker !== null) {\n this.backgroundColorPicker.setColor ('#' + ColorToHexString (settings.backgroundColor));\n }\n\n if (this.edgeDisplayToggle !== null) {\n this.edgeDisplayToggle.SetStatus (settings.showEdges);\n ShowDomElement (this.edgeSettingsDiv, settings.showEdges);\n\n this.edgeColorPicker.setColor ('#' + ColorToHexString (settings.edgeColor));\n this.thresholdSlider.value = settings.edgeThreshold;\n this.thresholdSliderValue.innerHTML = settings.edgeThreshold;\n }\n }\n\n Clear ()\n {\n if (this.environmentMapPopup !== null) {\n this.environmentMapPopup.Close ();\n this.environmentMapPopup = null;\n }\n\n if (this.backgroundColorPicker !== null) {\n this.backgroundColorPicker.hide ();\n }\n\n if (this.edgeColorPicker !== null) {\n this.edgeColorPicker.hide ();\n }\n }\n}\n\nclass SettingsImportParametersSection extends SettingsSection\n{\n constructor (parentDiv)\n {\n super (parentDiv, 'Import Settings');\n this.defaultColorPicker = null;\n }\n\n Init (settings, callbacks)\n {\n let defaultColorDiv = AddDiv (this.contentDiv, 'ov_sidebar_parameter');\n let defaultColorInput = AddDiv (defaultColorDiv, 'ov_color_picker');\n AddDiv (defaultColorDiv, null, 'Default Color');\n let predefinedDefaultColors = ['#ffffff', '#e3e3e3', '#cc3333', '#fac832', '#4caf50', '#3393bd', '#9b27b0', '#fda4b8'];\n this.defaultColorPicker = AddColorPicker (defaultColorInput, settings.defaultColor, predefinedDefaultColors, (color) => {\n settings.defaultColor = color;\n callbacks.onDefaultColorChange ();\n });\n }\n\n Update (settings)\n {\n if (this.defaultColorPicker !== null) {\n this.defaultColorPicker.setColor ('#' + ColorToHexString (settings.defaultColor));\n }\n }\n\n UpdateVisibility (hasDefaultMaterial)\n {\n if (this.contentDiv !== null) {\n ShowDomElement (this.contentDiv, hasDefaultMaterial);\n }\n }\n\n Clear ()\n {\n if (this.defaultColorPicker !== null) {\n this.defaultColorPicker.hide ();\n }\n }\n}\n\nclass SettingsAppearanceSection extends SettingsSection\n{\n constructor (parentDiv)\n {\n super (parentDiv, 'Appearance');\n this.darkModeToggle = null;\n }\n\n Init (settings, callbacks)\n {\n let darkModeParameterDiv = AddDiv (this.contentDiv, 'ov_sidebar_parameter');\n\n this.darkModeToggle = AddToggle (darkModeParameterDiv, 'ov_sidebar_parameter_toggle');\n this.darkModeToggle.OnChange (() => {\n settings.themeId = (this.darkModeToggle.GetStatus () ? Theme.Dark : Theme.Light);\n callbacks.onThemeChange ();\n });\n AddDiv (darkModeParameterDiv, null, 'Dark Mode');\n\n let isDarkMode = (settings.themeId === Theme.Dark);\n this.darkModeToggle.SetStatus (isDarkMode);\n }\n\n Update (settings)\n {\n if (this.darkModeToggle !== null) {\n let isDarkMode = (settings.themeId === Theme.Dark);\n this.darkModeToggle.SetStatus (isDarkMode);\n }\n }\n}\n\nexport class SidebarSettingsPanel extends SidebarPanel\n{\n constructor (parentDiv, settings)\n {\n super (parentDiv);\n this.settings = settings;\n\n this.sectionsDiv = AddDiv (this.contentDiv, 'ov_sidebar_settings_sections ov_thin_scrollbar');\n this.modelDisplaySection = new SettingsModelDisplaySection (this.sectionsDiv);\n this.importParametersSection = new SettingsImportParametersSection (this.sectionsDiv);\n this.appearanceSection = new SettingsAppearanceSection (this.sectionsDiv);\n\n this.resetToDefaultsButton = AddDiv (this.contentDiv, 'ov_button ov_panel_button outline', 'Reset to Default');\n this.resetToDefaultsButton.addEventListener ('click', () => {\n this.ResetToDefaults ();\n });\n }\n\n GetName ()\n {\n return 'Settings';\n }\n\n HasTitle ()\n {\n return false;\n }\n\n GetIcon ()\n {\n return 'settings';\n }\n\n Clear ()\n {\n this.modelDisplaySection.Clear ();\n this.importParametersSection.Clear ();\n this.appearanceSection.Clear ();\n }\n\n Init (callbacks)\n {\n super.Init (callbacks);\n this.modelDisplaySection.Init (this.settings, {\n onEnvironmentMapChange : () => {\n callbacks.onEnvironmentMapChange ();\n },\n onBackgroundColorChange : () => {\n callbacks.onBackgroundColorChange ();\n },\n onShowEdgesChange : () => {\n callbacks.onEdgeDisplayChange ();\n },\n onEdgeColorChange : () => {\n callbacks.onEdgeDisplayChange ();\n },\n onEdgeThresholdChange : () => {\n callbacks.onEdgeDisplayChange ();\n }\n });\n this.importParametersSection.Init (this.settings, {\n onDefaultColorChange : () => {\n callbacks.onDefaultColorChange ();\n }\n });\n this.appearanceSection.Init (this.settings, {\n onThemeChange : () => {\n if (this.settings.themeId === Theme.Light) {\n this.settings.backgroundColor = new Color (255, 255, 255);\n this.settings.defaultColor = new Color (200, 200, 200);\n } else if (this.settings.themeId === Theme.Dark) {\n this.settings.backgroundColor = new Color (42, 43, 46);\n this.settings.defaultColor = new Color (200, 200, 200);\n }\n this.modelDisplaySection.Update (this.settings);\n this.importParametersSection.Update (this.settings);\n callbacks.onThemeChange ();\n }\n });\n }\n\n UpdateSettings (isPhysicallyBased, hasDefaultMaterial)\n {\n this.modelDisplaySection.UpdateVisibility (isPhysicallyBased);\n this.importParametersSection.UpdateVisibility (hasDefaultMaterial);\n this.Resize ();\n }\n\n ResetToDefaults ()\n {\n let defaultSettings = new Settings ();\n\n this.settings.environmentMapName = defaultSettings.environmentMapName;\n this.settings.backgroundIsEnvMap = defaultSettings.backgroundIsEnvMap;\n this.settings.backgroundColor = defaultSettings.backgroundColor;\n this.settings.defaultColor = defaultSettings.defaultColor;\n this.settings.showEdges = defaultSettings.showEdges;\n this.settings.edgeColor = defaultSettings.edgeColor;\n this.settings.edgeThreshold = defaultSettings.edgeThreshold;\n this.settings.themeId = defaultSettings.themeId;\n\n this.modelDisplaySection.Update (this.settings);\n this.importParametersSection.Update (this.settings);\n this.appearanceSection.Update (this.settings);\n\n this.callbacks.onEnvironmentMapChange ();\n this.callbacks.onThemeChange ();\n }\n\n Resize ()\n {\n let resetButtonHeight = this.resetToDefaultsButton.offsetHeight;\n let height = this.parentDiv.offsetHeight;\n SetDomElementOuterHeight (this.sectionsDiv, height - resetButtonHeight);\n }\n}\n", "import { ShowDomElement, SetDomElementWidth, SetDomElementHeight, GetDomElementOuterWidth, SetDomElementOuterHeight } from '../engine/viewer/domutils.js';\nimport { PanelSet } from './panelset.js';\nimport { SidebarDetailsPanel } from './sidebardetailspanel.js';\nimport { SidebarSettingsPanel } from './sidebarsettingspanel.js';\nimport { InstallVerticalSplitter } from './utils.js';\n\nexport class Sidebar\n{\n constructor (mainDiv, splitterDiv, settings)\n {\n this.mainDiv = mainDiv;\n this.splitterDiv = splitterDiv;\n this.panelSet = new PanelSet (mainDiv);\n\n this.detailsPanel = new SidebarDetailsPanel (this.panelSet.GetContentDiv ());\n this.settingsPanel = new SidebarSettingsPanel (this.panelSet.GetContentDiv (), settings);\n\n this.panelSet.AddPanel (this.detailsPanel);\n this.panelSet.AddPanel (this.settingsPanel);\n this.panelSet.ShowPanel (this.detailsPanel);\n }\n\n IsPanelsVisible ()\n {\n return this.panelSet.IsPanelsVisible ();\n }\n\n ShowPanels (show)\n {\n this.panelSet.ShowPanels (show);\n }\n\n Init (callbacks)\n {\n this.callbacks = callbacks;\n\n this.panelSet.Init ({\n onResize : () => {\n ShowDomElement (this.splitterDiv, this.panelSet.IsPanelsVisible ());\n this.callbacks.onResize ();\n },\n onShowHidePanels : (show) => {\n this.callbacks.onShowHidePanels (show);\n }\n });\n\n this.settingsPanel.Init ({\n onEnvironmentMapChange : () => {\n this.callbacks.onEnvironmentMapChange ();\n },\n onBackgroundColorChange : () => {\n this.callbacks.onBackgroundColorChange ();\n },\n onDefaultColorChange : () => {\n this.callbacks.onDefaultColorChange ();\n },\n onEdgeDisplayChange : () => {\n this.callbacks.onEdgeDisplayChange ();\n },\n onThemeChange : () => {\n this.callbacks.onThemeChange ();\n }\n });\n\n InstallVerticalSplitter (this.splitterDiv, this.mainDiv, true, () => {\n this.callbacks.onResize ();\n });\n }\n\n UpdateSettings (isPhysicallyBased, hasDefaultMaterial)\n {\n this.settingsPanel.UpdateSettings (isPhysicallyBased, hasDefaultMaterial);\n }\n\n Resize (height)\n {\n SetDomElementOuterHeight (this.mainDiv, height);\n SetDomElementHeight (this.splitterDiv, height);\n this.panelSet.Resize ();\n }\n\n GetWidth ()\n {\n let sidebarWidth = GetDomElementOuterWidth (this.mainDiv);\n let splitterWidth = 0;\n if (this.panelSet.IsPanelsVisible ()) {\n splitterWidth = this.splitterDiv.offsetWidth;\n }\n return sidebarWidth + splitterWidth;\n }\n\n DecreaseWidth (diff)\n {\n let oldWidth = this.mainDiv.offsetWidth;\n SetDomElementWidth (this.mainDiv, oldWidth - diff);\n }\n\n Clear ()\n {\n this.panelSet.Clear ();\n }\n\n AddObject3DProperties (object3D)\n {\n this.detailsPanel.AddObject3DProperties (object3D);\n }\n\n AddMaterialProperties (material)\n {\n this.detailsPanel.AddMaterialProperties (material);\n }\n}\n", "import { Theme } from './settings.js';\n\nexport class ThemeHandler\n{\n constructor () {\n this.css = {\n '--ov_foreground_color': {},\n '--ov_background_color': {},\n '--ov_button_color': {},\n '--ov_button_hover_color': {},\n '--ov_button_text_color': {},\n '--ov_outline_button_color': {},\n '--ov_outline_button_hover_color': {},\n '--ov_outline_button_text_color': {},\n '--ov_icon_color': {},\n '--ov_light_icon_color': {},\n '--ov_selected_icon_color': {},\n '--ov_disabled_icon_color': {},\n '--ov_hover_color': {},\n '--ov_hover_text_color': {},\n '--ov_logo_text_color': {},\n '--ov_logo_border_color': {},\n '--ov_toolbar_background_color': {},\n '--ov_toolbar_selected_color': {},\n '--ov_toolbar_separator_color': {},\n '--ov_treeview_selected_color': {},\n '--ov_dialog_foreground_color': {},\n '--ov_dialog_background_color': {},\n '--ov_border_color': {},\n '--ov_shadow': {}\n };\n let root = document.querySelector (':root');\n let style = window.getComputedStyle (root);\n for (let property in this.css) {\n if (Object.prototype.hasOwnProperty.call (this.css, property)) {\n this.css[property].light = style.getPropertyValue (property);\n this.css[property].dark = style.getPropertyValue (property + '_dark');\n }\n }\n }\n\n SwitchTheme (themeId)\n {\n let themeName = null;\n if (themeId === Theme.Light) {\n themeName = 'light';\n } else if (themeId === Theme.Dark) {\n themeName = 'dark';\n } else {\n return;\n }\n\n let root = document.querySelector (':root');\n for (let property in this.css) {\n if (Object.prototype.hasOwnProperty.call (this.css, property)) {\n let value = this.css[property][themeName];\n if (value !== undefined) {\n root.style.setProperty (property, value);\n }\n }\n }\n }\n}\n", "import { AddDiv, CreateDiv } from '../engine/viewer/domutils.js';\nimport { AddSvgIconElement, InstallTooltip } from './utils.js';\n\nexport class ToolbarButton\n{\n constructor (image, imageTitle, onClick)\n {\n this.image = image;\n this.imageTitle = imageTitle;\n\n this.selected = false;\n this.buttonDiv = CreateDiv ('ov_toolbar_button');\n this.buttonImg = AddSvgIconElement (this.buttonDiv, this.image);\n if (onClick !== null) {\n this.buttonDiv.addEventListener ('click', onClick);\n }\n\n this.buttonDiv.setAttribute ('alt', this.imageTitle);\n InstallTooltip (this.buttonDiv, this.imageTitle);\n }\n\n AddDomElements (parentDiv)\n {\n parentDiv.appendChild (this.buttonDiv);\n }\n\n AddClass (className)\n {\n this.buttonDiv.classList.add (className);\n }\n\n RemoveClass (className)\n {\n this.buttonDiv.classList.remove (className);\n }\n\n AddImageClass (className)\n {\n this.buttonImg.classList.add (className);\n }\n\n RemoveImageClass (className)\n {\n this.buttonImg.classList.remove (className);\n }\n\n IsSelected ()\n {\n return this.selected;\n }\n\n SetSelected (selected)\n {\n this.selected = selected;\n if (this.selected) {\n this.buttonDiv.classList.add ('selected');\n } else {\n this.buttonDiv.classList.remove ('selected');\n }\n }\n}\n\nexport class Toolbar\n{\n constructor (parentDiv)\n {\n this.mainDiv = AddDiv (parentDiv, 'ov_toolbar');\n }\n\n AddImageButton (image, imageTitle, onClick)\n {\n let button = new ToolbarButton (image, imageTitle, onClick);\n button.AddDomElements (this.mainDiv);\n return button;\n }\n\n AddImagePushButton (image, imageTitle, isSelected, onClick)\n {\n let button = new ToolbarButton (image, imageTitle, () => {\n button.SetSelected (!button.IsSelected ());\n onClick (button.IsSelected ());\n });\n button.AddDomElements (this.mainDiv);\n button.SetSelected (isSelected);\n return button;\n }\n\n AddImageRadioButton (buttonData, selectedIndex, onClick)\n {\n let buttons = [];\n for (let buttonIndex = 0; buttonIndex < buttonData.length; buttonIndex++) {\n let data = buttonData[buttonIndex];\n let button = this.AddImageButton (data.image, data.title, () => {\n for (let i = 0; i < buttons.length; i++) {\n let currentButton = buttons[i];\n if (i === buttonIndex) {\n currentButton.SetSelected (true);\n } else {\n currentButton.SetSelected (false);\n }\n }\n onClick (buttonIndex);\n });\n if (selectedIndex === buttonIndex) {\n button.SetSelected (true);\n }\n buttons.push (button);\n }\n return buttons;\n }\n\n AddSeparator ()\n {\n return AddDiv (this.mainDiv, 'ov_toolbar_separator');\n }\n}\n", "import { Coord2D, CoordIsEqual2D } from '../geometry/coord2d.js';\nimport { CoordIsEqual3D } from '../geometry/coord3d.js';\nimport { Color, ColorIsEqual } from './color.js';\n\nexport class MeshPrimitiveBuffer\n{\n constructor ()\n {\n this.indices = [];\n this.vertices = [];\n this.colors = [];\n this.normals = [];\n this.uvs = [];\n this.material = null;\n }\n\n GetBounds ()\n {\n let min = [Infinity, Infinity, Infinity];\n let max = [-Infinity, -Infinity, -Infinity];\n for (let i = 0; i < this.vertices.length / 3; i++) {\n for (let j = 0; j < 3; j++) {\n min[j] = Math.min (min[j], this.vertices[i * 3 + j]);\n max[j] = Math.max (max[j], this.vertices[i * 3 + j]);\n }\n }\n return {\n min : min,\n max : max\n };\n }\n\n GetByteLength (indexTypeSize, numberTypeSize)\n {\n let indexCount = this.indices.length;\n let numberCount = this.vertices.length + this.colors.length + this.normals.length + this.uvs.length;\n return indexCount * indexTypeSize + numberCount * numberTypeSize;\n }\n}\n\nexport class MeshBuffer\n{\n constructor ()\n {\n this.primitives = [];\n }\n\n PrimitiveCount ()\n {\n return this.primitives.length;\n }\n\n GetPrimitive (index)\n {\n return this.primitives[index];\n }\n\n GetByteLength (indexTypeSize, numberTypeSize)\n {\n let byteLength = 0;\n for (let i = 0; i < this.primitives.length; i++) {\n let primitive = this.primitives[i];\n byteLength += primitive.GetByteLength (indexTypeSize, numberTypeSize);\n }\n return byteLength;\n }\n}\n\nexport function ConvertMeshToMeshBuffer (mesh)\n{\n function AddVertexToPrimitiveBuffer (mesh, indices, primitiveBuffer, meshVertexToPrimitiveVertices)\n {\n function GetColorOrDefault (mesh, colorIndex, forceColors)\n {\n if (colorIndex !== null) {\n return mesh.GetVertexColor (colorIndex);\n } else if (forceColors) {\n return new Color (0, 0, 0);\n } else {\n return null;\n }\n }\n\n function GetUVOrDefault (mesh, uvIndex, forceUVs)\n {\n if (uvIndex !== null) {\n return mesh.GetTextureUV (uvIndex);\n } else if (forceUVs) {\n return new Coord2D (0.0, 0.0);\n } else {\n return null;\n }\n }\n\n function AddVertex (mesh, indices, primitiveBuffer)\n {\n let forceColors = mesh.VertexColorCount () > 0;\n let forceUVs = mesh.TextureUVCount () > 0;\n\n let vertex = mesh.GetVertex (indices.vertex);\n let normal = mesh.GetNormal (indices.normal);\n\n let primitiveVertexIndex = primitiveBuffer.vertices.length / 3;\n primitiveBuffer.indices.push (primitiveVertexIndex);\n primitiveBuffer.vertices.push (vertex.x, vertex.y, vertex.z);\n\n let color = GetColorOrDefault (mesh, indices.color, forceColors);\n if (color !== null) {\n primitiveBuffer.colors.push (color.r / 255.0, color.g / 255.0, color.b / 255.0);\n }\n\n primitiveBuffer.normals.push (normal.x, normal.y, normal.z);\n\n let uv = GetUVOrDefault (mesh, indices.uv, forceUVs);\n if (uv !== null) {\n primitiveBuffer.uvs.push (uv.x, uv.y);\n }\n\n return {\n index : primitiveVertexIndex,\n color : color,\n normal : normal,\n uv : uv\n };\n }\n\n function FindMatchingPrimitiveVertex (mesh, primitiveVertices, indices)\n {\n function IsEqualColor (mesh, colorIndex, existingColor)\n {\n if (existingColor === null && colorIndex === null) {\n return true;\n }\n let color = GetColorOrDefault (mesh, colorIndex, true);\n return ColorIsEqual (existingColor, color);\n }\n\n function IsEqualNormal (mesh, normalIndex, existingNormal)\n {\n let normal = mesh.GetNormal (normalIndex);\n return CoordIsEqual3D (existingNormal, normal);\n }\n\n function IsEqualUV (mesh, uvIndex, existingUv)\n {\n if (existingUv === null && uvIndex === null) {\n return true;\n }\n let uv = GetUVOrDefault (mesh, uvIndex, true);\n return CoordIsEqual2D (existingUv, uv);\n }\n\n for (let i = 0; i < primitiveVertices.length; i++) {\n let primitiveVertex = primitiveVertices[i];\n let equalColor = IsEqualColor (mesh, indices.color, primitiveVertex.color);\n let equalNormal = IsEqualNormal (mesh, indices.normal, primitiveVertex.normal);\n let equalUv = IsEqualUV (mesh, indices.uv, primitiveVertex.uv);\n if (equalColor && equalNormal && equalUv) {\n return primitiveVertex;\n }\n }\n return null;\n }\n\n if (meshVertexToPrimitiveVertices.has (indices.vertex)) {\n let primitiveVertices = meshVertexToPrimitiveVertices.get (indices.vertex);\n let existingPrimitiveVertex = FindMatchingPrimitiveVertex (mesh, primitiveVertices, indices);\n if (existingPrimitiveVertex !== null) {\n primitiveBuffer.indices.push (existingPrimitiveVertex.index);\n } else {\n let primitiveVertex = AddVertex (mesh, indices, primitiveBuffer);\n primitiveVertices.push (primitiveVertex);\n }\n } else {\n let primitiveVertex = AddVertex (mesh, indices, primitiveBuffer);\n meshVertexToPrimitiveVertices.set (indices.vertex, [primitiveVertex]);\n }\n }\n\n let meshBuffer = new MeshBuffer ();\n\n let triangleCount = mesh.TriangleCount ();\n if (triangleCount === 0) {\n return null;\n }\n\n let triangleIndices = [];\n for (let i = 0; i < triangleCount; i++) {\n triangleIndices.push (i);\n }\n triangleIndices.sort ((a, b) => {\n let aTriangle = mesh.GetTriangle (a);\n let bTriangle = mesh.GetTriangle (b);\n return aTriangle.mat - bTriangle.mat;\n });\n\n let primitiveBuffer = null;\n let meshVertexToPrimitiveVertices = null;\n for (let i = 0; i < triangleIndices.length; i++) {\n let triangleIndex = triangleIndices[i];\n let triangle = mesh.GetTriangle (triangleIndex);\n if (primitiveBuffer === null || primitiveBuffer.material !== triangle.mat) {\n primitiveBuffer = new MeshPrimitiveBuffer ();\n primitiveBuffer.material = triangle.mat;\n meshVertexToPrimitiveVertices = new Map ();\n meshBuffer.primitives.push (primitiveBuffer);\n }\n let v0Indices = {\n vertex : triangle.v0,\n color : triangle.c0,\n normal : triangle.n0,\n uv : triangle.u0\n };\n let v1Indices = {\n vertex : triangle.v1,\n color : triangle.c1,\n normal : triangle.n1,\n uv : triangle.u1\n };\n let v2Indices = {\n vertex : triangle.v2,\n color : triangle.c2,\n normal : triangle.n2,\n uv : triangle.u2\n };\n\n AddVertexToPrimitiveBuffer (mesh, v0Indices, primitiveBuffer, meshVertexToPrimitiveVertices);\n AddVertexToPrimitiveBuffer (mesh, v1Indices, primitiveBuffer, meshVertexToPrimitiveVertices);\n AddVertexToPrimitiveBuffer (mesh, v2Indices, primitiveBuffer, meshVertexToPrimitiveVertices);\n }\n\n return meshBuffer;\n}\n", "import { ArrayBufferToUtf8String, Utf8StringToArrayBuffer } from '../io/bufferutils.js';\n\nexport class ExportedFile\n{\n\tconstructor (name)\n\t{\n\t\tthis.name = name;\n\t\tthis.content = null;\n\t}\n\n\tGetName ()\n\t{\n\t\treturn this.name;\n\t}\n\n\tSetName (name)\n\t{\n\t\tthis.name = name;\n\t}\n\n\tGetTextContent ()\n\t{\n\t\tlet text = ArrayBufferToUtf8String (this.content);\n\t\treturn text;\n\t}\n\n\tGetBufferContent ()\n\t{\n\t\treturn this.content;\n\t}\n\n\tSetTextContent (content)\n\t{\n\t\tlet buffer = Utf8StringToArrayBuffer (content);\n\t\tthis.content = buffer;\n\t}\n\n\tSetBufferContent (content)\n\t{\n\t\tthis.content = content;\n\t}\n}\n\nexport class ExporterBase\n{\n constructor ()\n {\n\n }\n\n CanExport (format, extension)\n {\n return false;\n }\n\n\tExport (exporterModel, format, onFinish)\n\t{\n\t\tlet files = [];\n\t\tthis.ExportContent (exporterModel, format, files, () => {\n\t\t\tonFinish (files);\n\t\t});\n\t}\n\n\tExportContent (exporterModel, format, files, onFinish)\n\t{\n\n\t}\n\n\tGetExportedMaterialName (originalName)\n\t{\n\t\treturn this.GetExportedName (originalName, 'Material');\n\t}\n\n\tGetExportedMeshName (originalName)\n\t{\n\t\treturn this.GetExportedName (originalName, 'Mesh');\n\t}\n\n\tGetExportedName (originalName, defaultName)\n\t{\n\t\tif (originalName.length === 0) {\n\t\t\treturn defaultName;\n\t\t}\n\t\treturn originalName;\n\t}\n}\n", "import { LoadExternalLibrary } from '../io/externallibs.js';\nimport { FileFormat } from '../io/fileutils.js';\nimport { MaterialType } from '../model/material.js';\nimport { ConvertMeshToMeshBuffer } from '../model/meshbuffer.js';\nimport { ExportedFile, ExporterBase } from './exporterbase.js';\n\nexport class Exporter3dm extends ExporterBase\n{\n\tconstructor ()\n\t{\n\t\tsuper ();\n this.rhino = null;\n\t}\n\n CanExport (format, extension)\n {\n return format === FileFormat.Binary && extension === '3dm';\n }\n\n\tExportContent (exporterModel, format, files, onFinish)\n\t{\n\t\tif (this.rhino === null) {\n\t\t\tLoadExternalLibrary ('loaders/rhino3dm.min.js').then (() => {\n rhino3dm ().then ((rhino) => {\n this.rhino = rhino;\n this.ExportRhinoContent (exporterModel, files, onFinish);\n });\n }).catch (() => {\n onFinish ();\n });\n\t\t} else {\n\t\t\tthis.ExportRhinoContent (exporterModel, files, onFinish);\n\t\t}\n\t}\n\n ExportRhinoContent (exporterModel, files, onFinish)\n {\n function ColorToRhinoColor (color)\n {\n return {\n r : color.r,\n g : color.g,\n b : color.b,\n a : 255\n };\n }\n\n\t\tlet rhinoFile = new ExportedFile ('model.3dm');\n\t\tfiles.push (rhinoFile);\n\n let rhinoDoc = new this.rhino.File3dm ();\n exporterModel.EnumerateTransformedMeshes ((mesh) => {\n let meshBuffer = ConvertMeshToMeshBuffer (mesh);\n for (let primitiveIndex = 0; primitiveIndex < meshBuffer.PrimitiveCount (); primitiveIndex++) {\n let primitive = meshBuffer.GetPrimitive (primitiveIndex);\n let threeJson = {\n data : {\n attributes : {\n position : {\n itemSize : 3,\n type : 'Float32Array',\n array : primitive.vertices\n },\n normal : {\n itemSize : 3,\n type : 'Float32Array',\n array : primitive.normals\n }\n },\n index : {\n type : 'Uint16Array',\n array : primitive.indices\n }\n }\n };\n\n let material = exporterModel.GetMaterial (primitive.material);\n let rhinoMaterial = new this.rhino.Material ();\n rhinoMaterial.name = this.GetExportedMaterialName (material.name);\n if (material.type === MaterialType.Phong) {\n rhinoMaterial.ambientColor = ColorToRhinoColor (material.ambient);\n rhinoMaterial.specularColor = ColorToRhinoColor (material.specular);\n }\n rhinoMaterial.diffuseColor = ColorToRhinoColor (material.color);\n rhinoMaterial.transparency = 1.0 - material.opacity;\n\n let rhinoMaterialIndex = rhinoDoc.materials ().count ();\n rhinoDoc.materials ().add (rhinoMaterial);\n\n let rhinoMesh = new this.rhino.Mesh.createFromThreejsJSON (threeJson);\n let rhinoAttributes = new this.rhino.ObjectAttributes ();\n rhinoAttributes.name = this.GetExportedMeshName (mesh.GetName ());\n rhinoAttributes.materialSource = this.rhino.ObjectMaterialSource.MaterialFromObject;\n rhinoAttributes.materialIndex = rhinoMaterialIndex;\n rhinoDoc.objects ().add (rhinoMesh, rhinoAttributes);\n }\n });\n\n let writeOptions = new this.rhino.File3dmWriteOptions ();\n writeOptions.version = 6;\n let rhinoDocBuffer = rhinoDoc.toByteArray (writeOptions);\n\n rhinoFile.SetBufferContent (rhinoDocBuffer);\n\t\tonFinish ();\n }\n}\n", "export class BinaryWriter\n{\n constructor (byteLength, isLittleEndian)\n {\n this.arrayBuffer = new ArrayBuffer (byteLength);\n this.dataView = new DataView (this.arrayBuffer);\n this.isLittleEndian = isLittleEndian;\n this.position = 0;\n }\n\n GetPosition ()\n {\n return this.position;\n }\n\n SetPosition (position)\n {\n this.position = position;\n }\n\n End ()\n {\n return this.position >= this.arrayBuffer.byteLength;\n }\n\n GetBuffer ()\n {\n return this.arrayBuffer;\n }\n\n WriteArrayBuffer (arrayBuffer)\n {\n let bufferView = new Uint8Array (arrayBuffer);\n let thisBufferView = new Uint8Array (this.arrayBuffer);\n thisBufferView.set (bufferView, this.position);\n this.position += arrayBuffer.byteLength;\n }\n\n WriteBoolean8 (val)\n {\n this.dataView.setInt8 (this.position, val ? 1 : 0);\n this.position = this.position + 1;\n }\n\n WriteCharacter8 (val)\n {\n this.dataView.setInt8 (this.position, val);\n this.position = this.position + 1;\n }\n\n WriteUnsignedCharacter8 (val)\n {\n this.dataView.setUint8 (this.position, val);\n this.position = this.position + 1;\n }\n\n WriteInteger16 (val)\n {\n this.dataView.setInt16 (this.position, val, this.isLittleEndian);\n this.position = this.position + 2;\n }\n\n WriteUnsignedInteger16 (val)\n {\n this.dataView.setUint16 (this.position, val, this.isLittleEndian);\n this.position = this.position + 2;\n }\n\n WriteInteger32 (val)\n {\n this.dataView.setInt32 (this.position, val, this.isLittleEndian);\n this.position = this.position + 4;\n }\n\n WriteUnsignedInteger32 (val)\n {\n this.dataView.setUint32 (this.position, val, this.isLittleEndian);\n this.position = this.position + 4;\n }\n\n WriteFloat32 (val)\n {\n this.dataView.setFloat32 (this.position, val, this.isLittleEndian);\n this.position = this.position + 4;\n }\n\n WriteDouble64 (val)\n {\n this.dataView.setFloat64 (this.position, val, this.isLittleEndian);\n this.position = this.position + 8;\n }\n}\n", "import { BinaryWriter } from '../io/binarywriter.js';\nimport { Utf8StringToArrayBuffer } from '../io/bufferutils.js';\nimport { FileFormat, GetFileExtension, GetFileName } from '../io/fileutils.js';\nimport { Color, SRGBToLinear } from '../model/color.js';\nimport { MaterialType } from '../model/material.js';\nimport { ConvertMeshToMeshBuffer } from '../model/meshbuffer.js';\nimport { ExportedFile, ExporterBase } from './exporterbase.js';\n\nexport class ExporterGltf extends ExporterBase\n{\n\tconstructor ()\n\t{\n\t\tsuper ();\n this.components = {\n index : {\n type : 5125, // unsigned int 32\n size : 4\n },\n number : {\n type : 5126, // float 32\n size : 4\n }\n };\n\t}\n\n CanExport (format, extension)\n {\n return (format === FileFormat.Text && extension === 'gltf') || (format === FileFormat.Binary && extension === 'glb');\n }\n\n\tExportContent (exporterModel, format, files, onFinish)\n\t{\n if (format === FileFormat.Text) {\n this.ExportAsciiContent (exporterModel, files);\n } else if (format === FileFormat.Binary) {\n this.ExportBinaryContent (exporterModel, files);\n }\n onFinish ();\n\t}\n\n\tExportAsciiContent (exporterModel, files)\n\t{\n let gltfFile = new ExportedFile ('model.gltf');\n let binFile = new ExportedFile ('model.bin');\n files.push (gltfFile);\n files.push (binFile);\n\n let meshDataArr = this.GetMeshData (exporterModel);\n let mainBuffer = this.GetMainBuffer (meshDataArr);\n let mainJson = this.GetMainJson (meshDataArr);\n mainJson.buffers.push ({\n uri : binFile.GetName (),\n byteLength : mainBuffer.byteLength\n });\n\n let fileNameToIndex = new Map ();\n this.ExportMaterials (exporterModel, mainJson, (texture) => {\n let fileName = GetFileName (texture.name);\n if (fileNameToIndex.has (fileName)) {\n return fileNameToIndex.get (fileName);\n } else {\n let textureFile = new ExportedFile (fileName);\n textureFile.SetBufferContent (texture.buffer);\n files.push (textureFile);\n\n let textureIndex = mainJson.textures.length;\n fileNameToIndex.set (fileName, textureIndex);\n\n mainJson.images.push ({\n uri : fileName\n });\n\n mainJson.textures.push ({\n source : textureIndex\n });\n\n return textureIndex;\n }\n });\n\n gltfFile.SetTextContent (JSON.stringify (mainJson, null, 4));\n binFile.SetBufferContent (mainBuffer);\n }\n\n ExportBinaryContent (exporterModel, files)\n {\n function AlignToBoundary (size)\n {\n let remainder = size % 4;\n if (remainder === 0) {\n return size;\n }\n return size + (4 - remainder);\n }\n\n function WriteCharacters (writer, char, count)\n {\n for (let i = 0; i < count; i++) {\n writer.WriteUnsignedCharacter8 (char);\n }\n }\n\n let glbFile = new ExportedFile ('model.glb');\n files.push (glbFile);\n\n let meshDataArr = this.GetMeshData (exporterModel);\n let mainBuffer = this.GetMainBuffer (meshDataArr);\n let mainJson = this.GetMainJson (meshDataArr);\n\n let textureBuffers = [];\n let textureOffset = mainBuffer.byteLength;\n\n let fileNameToIndex = new Map ();\n this.ExportMaterials (exporterModel, mainJson, (texture) => {\n let fileName = GetFileName (texture.name);\n let extension = GetFileExtension (texture.name);\n if (fileNameToIndex.has (fileName)) {\n return fileNameToIndex.get (fileName);\n } else {\n let bufferViewIndex = mainJson.bufferViews.length;\n let textureIndex = mainJson.textures.length;\n fileNameToIndex.set (fileName, textureIndex);\n let textureBuffer = texture.buffer;\n textureBuffers.push (textureBuffer);\n mainJson.bufferViews.push ({\n buffer : 0,\n byteOffset : textureOffset,\n byteLength : textureBuffer.byteLength\n });\n textureOffset += textureBuffer.byteLength;\n mainJson.images.push ({\n bufferView : bufferViewIndex,\n mimeType : 'image/' + extension\n });\n mainJson.textures.push ({\n source : textureIndex\n });\n\n return textureIndex;\n }\n });\n\n let mainBinaryBufferLength = mainBuffer.byteLength;\n for (let i = 0; i < textureBuffers.length; i++) {\n let textureBuffer = textureBuffers[i];\n mainBinaryBufferLength += textureBuffer.byteLength;\n }\n let mainBinaryBufferAlignedLength = AlignToBoundary (mainBinaryBufferLength);\n mainJson.buffers.push ({\n byteLength : mainBinaryBufferAlignedLength\n });\n\n let mainJsonString = JSON.stringify (mainJson);\n let mainJsonBuffer = Utf8StringToArrayBuffer (mainJsonString);\n let mainJsonBufferLength = mainJsonBuffer.byteLength;\n let mainJsonBufferAlignedLength = AlignToBoundary (mainJsonBufferLength);\n\n let glbSize = 12 + 8 + mainJsonBufferAlignedLength + 8 + mainBinaryBufferAlignedLength;\n let glbWriter = new BinaryWriter (glbSize, true);\n\n glbWriter.WriteUnsignedInteger32 (0x46546C67);\n glbWriter.WriteUnsignedInteger32 (2);\n glbWriter.WriteUnsignedInteger32 (glbSize);\n\n glbWriter.WriteUnsignedInteger32 (mainJsonBufferAlignedLength);\n glbWriter.WriteUnsignedInteger32 (0x4E4F534A);\n glbWriter.WriteArrayBuffer (mainJsonBuffer);\n WriteCharacters (glbWriter, 32, mainJsonBufferAlignedLength - mainJsonBufferLength);\n\n glbWriter.WriteUnsignedInteger32 (mainBinaryBufferAlignedLength);\n glbWriter.WriteUnsignedInteger32 (0x004E4942);\n glbWriter.WriteArrayBuffer (mainBuffer);\n\n for (let i = 0; i < textureBuffers.length; i++) {\n let textureBuffer = textureBuffers[i];\n glbWriter.WriteArrayBuffer (textureBuffer);\n }\n WriteCharacters (glbWriter, 0, mainBinaryBufferAlignedLength - mainBinaryBufferLength);\n\n glbFile.SetBufferContent (glbWriter.GetBuffer ());\n }\n\n GetMeshData (exporterModel)\n {\n let meshDataArr = [];\n\n exporterModel.EnumerateTransformedMeshes ((mesh) => {\n let buffer = ConvertMeshToMeshBuffer (mesh);\n meshDataArr.push ({\n name : mesh.GetName (),\n buffer : buffer,\n offsets : [],\n sizes : []\n });\n });\n\n return meshDataArr;\n }\n\n GetMainBuffer (meshDataArr)\n {\n let mainBufferSize = 0;\n for (let meshIndex = 0; meshIndex < meshDataArr.length; meshIndex++) {\n let meshData = meshDataArr[meshIndex];\n mainBufferSize += meshData.buffer.GetByteLength (this.components.index.size, this.components.number.size);\n }\n\n let writer = new BinaryWriter (mainBufferSize, true);\n for (let meshIndex = 0; meshIndex < meshDataArr.length; meshIndex++) {\n let meshData = meshDataArr[meshIndex];\n for (let primitiveIndex = 0; primitiveIndex < meshData.buffer.PrimitiveCount (); primitiveIndex++) {\n let primitive = meshData.buffer.GetPrimitive (primitiveIndex);\n let offset = writer.GetPosition ();\n for (let i = 0; i < primitive.indices.length; i++) {\n writer.WriteUnsignedInteger32 (primitive.indices[i]);\n }\n for (let i = 0; i < primitive.vertices.length; i++) {\n writer.WriteFloat32 (primitive.vertices[i]);\n }\n for (let i = 0; i < primitive.colors.length; i++) {\n writer.WriteFloat32 (SRGBToLinear (primitive.colors[i]));\n }\n for (let i = 0; i < primitive.normals.length; i++) {\n writer.WriteFloat32 (primitive.normals[i]);\n }\n for (let i = 0; i < primitive.uvs.length; i++) {\n let texCoord = primitive.uvs[i];\n if (i % 2 === 1) {\n texCoord *= -1.0;\n }\n writer.WriteFloat32 (texCoord);\n }\n meshData.offsets.push (offset);\n meshData.sizes.push (writer.GetPosition () - offset);\n }\n }\n\n return writer.GetBuffer ();\n }\n\n GetMainJson (meshDataArr)\n {\n class BufferViewCreator\n {\n constructor (mainJson, byteOffset)\n {\n this.mainJson = mainJson;\n this.byteOffset = byteOffset;\n }\n\n AddBufferView (byteLength)\n {\n this.mainJson.bufferViews.push ({\n buffer : 0,\n byteOffset : this.byteOffset,\n byteLength : byteLength,\n });\n this.byteOffset += byteLength;\n return this.mainJson.bufferViews.length - 1;\n }\n }\n\n let mainJson = {\n asset : {\n generator : 'https://3dviewer.net',\n version : '2.0'\n },\n scene : 0,\n scenes : [\n {\n nodes : []\n }\n ],\n nodes : [],\n materials : [],\n meshes : [],\n buffers : [],\n bufferViews : [],\n accessors : []\n };\n\n for (let meshIndex = 0; meshIndex < meshDataArr.length; meshIndex++) {\n let meshData = meshDataArr[meshIndex];\n mainJson.scenes[0].nodes.push (meshIndex);\n mainJson.nodes.push ({\n mesh : meshIndex\n });\n let jsonMesh = {\n name : this.GetExportedMeshName (meshData.name),\n primitives : []\n };\n\n let primitives = meshData.buffer.primitives;\n for (let primitiveIndex = 0; primitiveIndex < primitives.length; primitiveIndex++) {\n let primitive = primitives[primitiveIndex];\n\n let bufferViewCreator = new BufferViewCreator (mainJson, meshData.offsets[primitiveIndex]);\n let indicesBufferView = bufferViewCreator.AddBufferView (primitive.indices.length * this.components.index.size);\n let verticesBufferView = bufferViewCreator.AddBufferView (primitive.vertices.length * this.components.number.size);\n let colorsBufferView = null;\n if (primitive.colors.length > 0) {\n colorsBufferView = bufferViewCreator.AddBufferView (primitive.colors.length * this.components.number.size);\n }\n let normalsBufferView = bufferViewCreator.AddBufferView (primitive.normals.length * this.components.number.size);\n let uvsBufferView = null;\n if (primitive.uvs.length > 0) {\n uvsBufferView = bufferViewCreator.AddBufferView (primitive.uvs.length * this.components.number.size);\n }\n\n let jsonPrimitive = {\n attributes : {},\n mode : 4,\n material : primitive.material\n };\n\n let bounds = primitive.GetBounds ();\n\n mainJson.accessors.push ({\n bufferView : indicesBufferView,\n byteOffset : 0,\n componentType : this.components.index.type,\n count : primitive.indices.length,\n type : 'SCALAR'\n });\n jsonPrimitive.indices = mainJson.accessors.length - 1;\n\n mainJson.accessors.push ({\n bufferView : verticesBufferView,\n byteOffset : 0,\n componentType : this.components.number.type,\n count : primitive.vertices.length / 3,\n min : bounds.min,\n max : bounds.max,\n type : 'VEC3'\n });\n jsonPrimitive.attributes.POSITION = mainJson.accessors.length - 1;\n\n if (colorsBufferView !== null) {\n mainJson.accessors.push ({\n bufferView : colorsBufferView,\n byteOffset : 0,\n componentType : this.components.number.type,\n count : primitive.colors.length / 3,\n type : 'VEC3'\n });\n jsonPrimitive.attributes.COLOR_0 = mainJson.accessors.length - 1;\n }\n\n mainJson.accessors.push ({\n bufferView : normalsBufferView,\n byteOffset : 0,\n componentType : this.components.number.type,\n count : primitive.normals.length / 3,\n type : 'VEC3'\n });\n jsonPrimitive.attributes.NORMAL = mainJson.accessors.length - 1;\n\n if (uvsBufferView !== null) {\n mainJson.accessors.push ({\n bufferView : uvsBufferView,\n byteOffset : 0,\n componentType : this.components.number.type,\n count : primitive.uvs.length / 2,\n type : 'VEC2'\n });\n jsonPrimitive.attributes.TEXCOORD_0 = mainJson.accessors.length - 1;\n }\n\n jsonMesh.primitives.push (jsonPrimitive);\n }\n mainJson.meshes.push (jsonMesh);\n }\n\n return mainJson;\n }\n\n ExportMaterials (exporterModel, mainJson, addTexture)\n {\n function ExportMaterial (obj, mainJson, material, addTexture)\n {\n function ColorToRGBA (color, opacity)\n {\n return [\n SRGBToLinear (color.r / 255.0),\n SRGBToLinear (color.g / 255.0),\n SRGBToLinear (color.b / 255.0),\n opacity\n ];\n }\n\n function ColorToRGB (color)\n {\n return [\n SRGBToLinear (color.r / 255.0),\n SRGBToLinear (color.g / 255.0),\n SRGBToLinear (color.b / 255.0)\n ];\n }\n\n function GetTextureParams (mainJson, texture, addTexture)\n {\n if (texture === null || !texture.IsValid ()) {\n return null;\n }\n\n if (mainJson.images === undefined) {\n mainJson.images = [];\n }\n if (mainJson.textures === undefined) {\n mainJson.textures = [];\n }\n\n let textureIndex = addTexture (texture);\n let textureParams = {\n index : textureIndex\n };\n\n if (texture.HasTransformation ()) {\n let extensionName = 'KHR_texture_transform';\n if (mainJson.extensionsUsed === undefined) {\n mainJson.extensionsUsed = [];\n }\n if (mainJson.extensionsUsed.indexOf (extensionName) === -1) {\n mainJson.extensionsUsed.push (extensionName);\n }\n textureParams.extensions = {\n KHR_texture_transform : {\n offset : [texture.offset.x, -texture.offset.y],\n scale : [texture.scale.x, texture.scale.y],\n rotation : -texture.rotation\n }\n };\n }\n\n return textureParams;\n }\n\n let jsonMaterial = {\n name : obj.GetExportedMaterialName (material.name),\n pbrMetallicRoughness : {\n baseColorFactor : ColorToRGBA (material.color, material.opacity)\n },\n emissiveFactor : ColorToRGB (material.emissive),\n doubleSided : true,\n alphaMode : 'OPAQUE'\n };\n\n if (material.transparent) {\n // TODO: mask, alphaCutoff?\n jsonMaterial.alphaMode = 'BLEND';\n }\n\n let baseColorTexture = GetTextureParams (mainJson, material.diffuseMap, addTexture);\n if (baseColorTexture !== null) {\n if (!material.multiplyDiffuseMap) {\n jsonMaterial.pbrMetallicRoughness.baseColorFactor = ColorToRGBA (new Color (255, 255, 255), material.opacity);\n }\n jsonMaterial.pbrMetallicRoughness.baseColorTexture = baseColorTexture;\n }\n if (material.type === MaterialType.Physical) {\n let metallicTexture = GetTextureParams (mainJson, material.metalnessMap, addTexture);\n if (metallicTexture !== null) {\n jsonMaterial.pbrMetallicRoughness.metallicRoughnessTexture = metallicTexture;\n } else {\n jsonMaterial.pbrMetallicRoughness.metallicFactor = material.metalness;\n jsonMaterial.pbrMetallicRoughness.roughnessFactor = material.roughness;\n }\n }\n let normalTexture = GetTextureParams (mainJson, material.normalMap, addTexture);\n if (normalTexture !== null) {\n jsonMaterial.normalTexture = normalTexture;\n }\n let emissiveTexture = GetTextureParams (mainJson, material.emissiveMap, addTexture);\n if (emissiveTexture !== null) {\n jsonMaterial.emissiveTexture = emissiveTexture;\n }\n\n mainJson.materials.push (jsonMaterial);\n }\n\n for (let materialIndex = 0; materialIndex < exporterModel.MaterialCount (); materialIndex++) {\n let material = exporterModel.GetMaterial (materialIndex);\n ExportMaterial (this, mainJson, material, addTexture);\n }\n }\n}\n", "import { CopyObjectAttributes } from '../core/core.js';\nimport { Transformation } from '../geometry/transformation.js';\nimport { CalculateTriangleNormal, TransformMesh } from '../model/meshutils.js';\n\nexport class ExporterSettings\n{\n constructor (settings)\n {\n this.transformation = new Transformation ();\n this.isMeshVisible = (meshInstanceId) => {\n return true;\n };\n\n CopyObjectAttributes (settings, this);\n }\n}\n\nexport class ExporterModel\n{\n constructor (model, settings)\n {\n this.model = model;\n this.settings = settings || new ExporterSettings ();\n }\n\n MaterialCount ()\n {\n return this.model.MaterialCount ();\n }\n\n GetMaterial (index)\n {\n return this.model.GetMaterial (index);\n }\n\n VertexCount ()\n {\n let vertexCount = 0;\n this.EnumerateMeshInstances ((meshInstance) => {\n vertexCount += meshInstance.VertexCount ();\n });\n return vertexCount;\n }\n\n TriangleCount ()\n {\n let triangleCount = 0;\n this.EnumerateMeshInstances ((meshInstance) => {\n triangleCount += meshInstance.TriangleCount ();\n });\n return triangleCount;\n }\n\n MeshInstanceCount ()\n {\n let meshInstanceCount = 0;\n this.EnumerateMeshInstances ((meshInstance) => {\n meshInstanceCount += 1;\n });\n return meshInstanceCount;\n }\n\n EnumerateMeshInstances (onMeshInstance)\n {\n this.model.EnumerateMeshInstances ((meshInstance) => {\n if (this.settings.isMeshVisible (meshInstance.GetId ())) {\n onMeshInstance (meshInstance);\n }\n });\n }\n\n EnumerateTransformedMeshes (onMesh)\n {\n this.EnumerateMeshInstances ((meshInstance) => {\n let transformation = meshInstance.GetTransformation ();\n if (!this.settings.transformation.IsIdentity ()) {\n transformation.Append (this.settings.transformation);\n }\n\n let mesh = meshInstance.GetMesh ();\n let transformed = mesh.Clone ();\n if (!transformation.IsIdentity ()) {\n TransformMesh (transformed, transformation);\n }\n\n onMesh (transformed);\n });\n }\n\n EnumerateVerticesAndTriangles (callbacks)\n {\n let transformedMeshes = [];\n this.EnumerateTransformedMeshes ((mesh) => {\n transformedMeshes.push (mesh);\n });\n\n for (let mesh of transformedMeshes) {\n mesh.EnumerateVertices ((vertex) => {\n callbacks.onVertex (vertex.x, vertex.y, vertex.z);\n });\n }\n\n let vertexOffset = 0;\n for (let mesh of transformedMeshes) {\n mesh.EnumerateTriangleVertexIndices ((v0, v1, v2) => {\n callbacks.onTriangle (v0 + vertexOffset, v1 + vertexOffset, v2 + vertexOffset);\n });\n vertexOffset += mesh.VertexCount ();\n }\n }\n\n EnumerateTrianglesWithNormals (onTriangle)\n {\n this.EnumerateTransformedMeshes ((mesh) => {\n mesh.EnumerateTriangleVertices ((v0, v1, v2) => {\n let normal = CalculateTriangleNormal (v0, v1, v2);\n onTriangle (v0, v1, v2, normal);\n });\n });\n }\n}\n", "export class TextWriter\n{\n\tconstructor ()\n\t{\n\t\tthis.text = '';\n\t\tthis.indentation = 0;\n\t}\n\n\tGetText ()\n\t{\n\t\treturn this.text;\n\t}\n\n\tIndent (diff)\n\t{\n\t\tthis.indentation += diff;\n\t}\n\n\tWriteArrayLine (arr)\n\t{\n\t\tthis.WriteLine (arr.join (' '));\n\t}\n\n\tWriteLine (str)\n\t{\n\t\tthis.WriteIndentation ();\n\t\tthis.Write (str + '\\n');\n\t}\n\n\tWriteIndentation ()\n\t{\n\t\tfor (let i = 0; i < this.indentation; i++) {\n\t\t\tthis.Write (' ');\n\t\t}\n\t}\n\n\tWrite (str)\n\t{\n\t\tthis.text += str;\n\t}\n}\n", "import { FileFormat, GetFileName } from '../io/fileutils.js';\nimport { TextWriter } from '../io/textwriter.js';\nimport { MaterialType } from '../model/material.js';\nimport { ExportedFile, ExporterBase } from './exporterbase.js';\n\nexport class ExporterObj extends ExporterBase\n{\n constructor ()\n {\n super ();\n }\n\n CanExport (format, extension)\n {\n return format === FileFormat.Text && extension === 'obj';\n }\n\n ExportContent (exporterModel, format, files, onFinish)\n {\n function WriteTexture (mtlWriter, keyword, texture, files)\n {\n if (texture === null || !texture.IsValid ()) {\n return;\n }\n let fileName = GetFileName (texture.name);\n mtlWriter.WriteArrayLine ([keyword, fileName]);\n\n let fileIndex = files.findIndex ((file) => {\n return file.GetName () === fileName;\n });\n if (fileIndex === -1) {\n let textureFile = new ExportedFile (fileName);\n textureFile.SetBufferContent (texture.buffer);\n files.push (textureFile);\n }\n }\n\n let mtlFile = new ExportedFile ('model.mtl');\n let objFile = new ExportedFile ('model.obj');\n\n files.push (mtlFile);\n files.push (objFile);\n\n let mtlWriter = new TextWriter ();\n mtlWriter.WriteLine (this.GetHeaderText ());\n for (let materialIndex = 0; materialIndex < exporterModel.MaterialCount (); materialIndex++) {\n let material = exporterModel.GetMaterial (materialIndex);\n mtlWriter.WriteArrayLine (['newmtl', this.GetExportedMaterialName (material.name)]);\n mtlWriter.WriteArrayLine (['Kd', material.color.r / 255.0, material.color.g / 255.0, material.color.b / 255.0]);\n mtlWriter.WriteArrayLine (['d', material.opacity]);\n if (material.type === MaterialType.Phong) {\n mtlWriter.WriteArrayLine (['Ka', material.ambient.r / 255.0, material.ambient.g / 255.0, material.ambient.b / 255.0]);\n mtlWriter.WriteArrayLine (['Ks', material.specular.r / 255.0, material.specular.g / 255.0, material.specular.b / 255.0]);\n mtlWriter.WriteArrayLine (['Ns', material.shininess * 1000.0]);\n }\n WriteTexture (mtlWriter, 'map_Kd', material.diffuseMap, files);\n if (material.type === MaterialType.Phong) {\n WriteTexture (mtlWriter, 'map_Ks', material.specularMap, files);\n }\n WriteTexture (mtlWriter, 'bump', material.bumpMap, files);\n }\n mtlFile.SetTextContent (mtlWriter.GetText ());\n\n let objWriter = new TextWriter ();\n objWriter.WriteLine (this.GetHeaderText ());\n objWriter.WriteArrayLine (['mtllib', mtlFile.GetName ()]);\n let vertexOffset = 0;\n let normalOffset = 0;\n let uvOffset = 0;\n let usedMaterialName = null;\n exporterModel.EnumerateTransformedMeshes ((mesh) => {\n objWriter.WriteArrayLine (['g', this.GetExportedMeshName (mesh.GetName ())]);\n for (let vertexIndex = 0; vertexIndex < mesh.VertexCount (); vertexIndex++) {\n let vertex = mesh.GetVertex (vertexIndex);\n objWriter.WriteArrayLine (['v', vertex.x, vertex.y, vertex.z]);\n }\n for (let normalIndex = 0; normalIndex < mesh.NormalCount (); normalIndex++) {\n let normal = mesh.GetNormal (normalIndex);\n objWriter.WriteArrayLine (['vn', normal.x, normal.y, normal.z]);\n }\n for (let textureUVIndex = 0; textureUVIndex < mesh.TextureUVCount (); textureUVIndex++) {\n let uv = mesh.GetTextureUV (textureUVIndex);\n objWriter.WriteArrayLine (['vt', uv.x, uv.y]);\n }\n for (let triangleIndex = 0; triangleIndex < mesh.TriangleCount (); triangleIndex++) {\n let triangle = mesh.GetTriangle (triangleIndex);\n let v0 = triangle.v0 + vertexOffset + 1;\n let v1 = triangle.v1 + vertexOffset + 1;\n let v2 = triangle.v2 + vertexOffset + 1;\n let n0 = triangle.n0 + normalOffset + 1;\n let n1 = triangle.n1 + normalOffset + 1;\n let n2 = triangle.n2 + normalOffset + 1;\n if (triangle.mat !== null) {\n let material = exporterModel.GetMaterial (triangle.mat);\n let materialName = this.GetExportedMaterialName (material.name);\n if (materialName !== usedMaterialName) {\n objWriter.WriteArrayLine (['usemtl', materialName]);\n usedMaterialName = materialName;\n }\n }\n let u0 = '';\n let u1 = '';\n let u2 = '';\n if (triangle.HasTextureUVs ()) {\n u0 = triangle.u0 + uvOffset + 1;\n u1 = triangle.u1 + uvOffset + 1;\n u2 = triangle.u2 + uvOffset + 1;\n }\n objWriter.WriteArrayLine (['f', [v0, u0, n0].join ('/'), [v1, u1, n1].join ('/'), [v2, u2, n2].join ('/')]);\n }\n vertexOffset += mesh.VertexCount ();\n normalOffset += mesh.NormalCount ();\n uvOffset += mesh.TextureUVCount ();\n });\n\n objFile.SetTextContent (objWriter.GetText ());\n onFinish ();\n }\n\n GetHeaderText ()\n {\n return '# exported by https://3dviewer.net';\n }\n}\n", "import { FileFormat } from '../io/fileutils.js';\nimport { TextWriter } from '../io/textwriter.js';\nimport { ExportedFile, ExporterBase } from './exporterbase.js';\n\nexport class ExporterOff extends ExporterBase\n{\n\tconstructor ()\n\t{\n\t\tsuper ();\n\t}\n\n CanExport (format, extension)\n {\n return format === FileFormat.Text && extension === 'off';\n }\n\n\tExportContent (exporterModel, format, files, onFinish)\n\t{\n\t\tlet offFile = new ExportedFile ('model.off');\n\t\tfiles.push (offFile);\n\n\t\tlet offWriter = new TextWriter ();\n\t\toffWriter.WriteLine ('OFF');\n\t\toffWriter.WriteArrayLine ([exporterModel.VertexCount (), exporterModel.TriangleCount (), 0]);\n\n\t\texporterModel.EnumerateVerticesAndTriangles ({\n\t\t\tonVertex : function (x, y, z) {\n\t\t\t\toffWriter.WriteArrayLine ([x, y, z]);\n\t\t\t},\n\t\t\tonTriangle : function (v0, v1, v2) {\n\t\t\t\toffWriter.WriteArrayLine ([3, v0, v1, v2]);\n\t\t\t}\n\t\t});\n\n\t\toffFile.SetTextContent (offWriter.GetText ());\n\t\tonFinish ();\n\t}\n}\n", "import { BinaryWriter } from '../io/binarywriter.js';\nimport { FileFormat } from '../io/fileutils.js';\nimport { TextWriter } from '../io/textwriter.js';\nimport { ExportedFile, ExporterBase } from './exporterbase.js';\n\nexport class ExporterPly extends ExporterBase\n{\n\tconstructor ()\n\t{\n\t\tsuper ();\n\t}\n\n CanExport (format, extension)\n {\n return (format === FileFormat.Text || format === FileFormat.Binary) && extension === 'ply';\n }\n\n\tExportContent (exporterModel, format, files, onFinish)\n\t{\n\t\tif (format === FileFormat.Text) {\n\t\t\tthis.ExportText (exporterModel, files);\n\t\t} else {\n\t\t\tthis.ExportBinary (exporterModel, files);\n\t\t}\n\t\tonFinish ();\n\t}\n\n\tExportText (exporterModel, files)\n\t{\n\t\tlet plyFile = new ExportedFile ('model.ply');\n\t\tfiles.push (plyFile);\n\n\t\tlet plyWriter = new TextWriter ();\n\n\t\tlet vertexCount = exporterModel.VertexCount ();\n\t\tlet triangleCount = exporterModel.TriangleCount ();\n\t\tlet headerText = this.GetHeaderText ('ascii', vertexCount, triangleCount);\n\t\tplyWriter.Write (headerText);\n\n\t\texporterModel.EnumerateVerticesAndTriangles ({\n\t\t\tonVertex : function (x, y, z) {\n\t\t\t\tplyWriter.WriteArrayLine ([x, y, z]);\n\t\t\t},\n\t\t\tonTriangle : function (v0, v1, v2) {\n\t\t\t\tplyWriter.WriteArrayLine ([3, v0, v1, v2]);\n\t\t\t}\n\t\t});\n\n\t\tplyFile.SetTextContent (plyWriter.GetText ());\n\t}\n\n\tExportBinary (exporterModel, files)\n\t{\n\t\tlet plyFile = new ExportedFile ('model.ply');\n\t\tfiles.push (plyFile);\n\n\t\tlet vertexCount = exporterModel.VertexCount ();\n\t\tlet triangleCount = exporterModel.TriangleCount ();\n\t\tlet headerText = this.GetHeaderText ('binary_little_endian', vertexCount, triangleCount);\n\n\t\tlet fullByteLength = headerText.length + vertexCount * 3 * 4 + triangleCount * (1 + 3 * 4);\n\t\tlet plyWriter = new BinaryWriter (fullByteLength, true);\n\n\t\tfor (let i = 0; i < headerText.length; i++) {\n\t\t\tplyWriter.WriteUnsignedCharacter8 (headerText.charCodeAt (i));\n\t\t}\n\n\t\texporterModel.EnumerateVerticesAndTriangles ({\n\t\t\tonVertex : function (x, y, z) {\n\t\t\t\tplyWriter.WriteFloat32 (x);\n\t\t\t\tplyWriter.WriteFloat32 (y);\n\t\t\t\tplyWriter.WriteFloat32 (z);\n\t\t\t},\n\t\t\tonTriangle : function (v0, v1, v2) {\n\t\t\t\tplyWriter.WriteUnsignedCharacter8 (3);\n\t\t\t\tplyWriter.WriteInteger32 (v0);\n\t\t\t\tplyWriter.WriteInteger32 (v1);\n\t\t\t\tplyWriter.WriteInteger32 (v2);\n\t\t\t}\n\t\t});\n\n\t\tplyFile.SetBufferContent (plyWriter.GetBuffer ());\n\t}\n\n\tGetHeaderText (format, vertexCount, triangleCount)\n\t{\n\t\tlet headerWriter = new TextWriter ();\n\t\theaderWriter.WriteLine ('ply');\n\t\theaderWriter.WriteLine ('format ' + format + ' 1.0');\n\t\theaderWriter.WriteLine ('element vertex ' + vertexCount);\n\t\theaderWriter.WriteLine ('property float x');\n\t\theaderWriter.WriteLine ('property float y');\n\t\theaderWriter.WriteLine ('property float z');\n\t\theaderWriter.WriteLine ('element face ' + triangleCount);\n\t\theaderWriter.WriteLine ('property list uchar int vertex_index');\n\t\theaderWriter.WriteLine ('end_header');\n\t\treturn headerWriter.GetText ();\n\t}\n}\n", "import { BinaryWriter } from '../io/binarywriter.js';\nimport { FileFormat } from '../io/fileutils.js';\nimport { TextWriter } from '../io/textwriter.js';\nimport { ExportedFile, ExporterBase } from './exporterbase.js';\n\nexport class ExporterStl extends ExporterBase\n{\n\tconstructor ()\n\t{\n\t\tsuper ();\n\t}\n\n CanExport (format, extension)\n {\n return (format === FileFormat.Text || format === FileFormat.Binary) && extension === 'stl';\n }\n\n\tExportContent (exporterModel, format, files, onFinish)\n\t{\n\t\tif (format === FileFormat.Text) {\n\t\t\tthis.ExportText (exporterModel, files);\n\t\t} else {\n\t\t\tthis.ExportBinary (exporterModel, files);\n\t\t}\n\t\tonFinish ();\n\t}\n\n\tExportText (exporterModel, files)\n\t{\n\t\tlet stlFile = new ExportedFile ('model.stl');\n\t\tfiles.push (stlFile);\n\n\t\tlet stlWriter = new TextWriter ();\n\t\tstlWriter.WriteLine ('solid Model');\n\t\texporterModel.EnumerateTrianglesWithNormals ((v0, v1, v2, normal) => {\n\t\t\tstlWriter.WriteArrayLine (['facet', 'normal', normal.x, normal.y, normal.z]);\n\t\t\tstlWriter.Indent (1);\n\t\t\tstlWriter.WriteLine ('outer loop');\n\t\t\tstlWriter.Indent (1);\n\t\t\tstlWriter.WriteArrayLine (['vertex', v0.x, v0.y, v0.z]);\n\t\t\tstlWriter.WriteArrayLine (['vertex', v1.x, v1.y, v1.z]);\n\t\t\tstlWriter.WriteArrayLine (['vertex', v2.x, v2.y, v2.z]);\n\t\t\tstlWriter.Indent (-1);\n\t\t\tstlWriter.WriteLine ('endloop');\n\t\t\tstlWriter.Indent (-1);\n\t\t\tstlWriter.WriteLine ('endfacet');\n\t\t});\n\t\tstlWriter.WriteLine ('endsolid Model');\n\n\t\tstlFile.SetTextContent (stlWriter.GetText ());\n\t}\n\n\tExportBinary (exporterModel, files)\n\t{\n\t\tlet stlFile = new ExportedFile ('model.stl');\n\t\tfiles.push (stlFile);\n\n\t\tlet triangleCount = exporterModel.TriangleCount ();\n\t\tlet headerSize = 80;\n\t\tlet fullByteLength = headerSize + 4 + triangleCount * 50;\n\t\tlet stlWriter = new BinaryWriter (fullByteLength, true);\n\n\t\tfor (let i = 0; i < headerSize; i++) {\n\t\t\tstlWriter.WriteUnsignedCharacter8 (0);\n\t\t}\n\n\t\tstlWriter.WriteUnsignedInteger32 (triangleCount);\n\t\texporterModel.EnumerateTrianglesWithNormals ((v0, v1, v2, normal) => {\n\t\t\tstlWriter.WriteFloat32 (normal.x);\n\t\t\tstlWriter.WriteFloat32 (normal.y);\n\t\t\tstlWriter.WriteFloat32 (normal.z);\n\n\t\t\tstlWriter.WriteFloat32 (v0.x);\n\t\t\tstlWriter.WriteFloat32 (v0.y);\n\t\t\tstlWriter.WriteFloat32 (v0.z);\n\n\t\t\tstlWriter.WriteFloat32 (v1.x);\n\t\t\tstlWriter.WriteFloat32 (v1.y);\n\t\t\tstlWriter.WriteFloat32 (v1.z);\n\n\t\t\tstlWriter.WriteFloat32 (v2.x);\n\t\t\tstlWriter.WriteFloat32 (v2.y);\n\t\t\tstlWriter.WriteFloat32 (v2.z);\n\n\t\t\tstlWriter.WriteUnsignedInteger16 (0);\n\t\t});\n\n\t\tstlFile.SetBufferContent (stlWriter.GetBuffer ());\n\t}\n}\n", "import { Exporter3dm } from './exporter3dm.js';\nimport { ExporterGltf } from './exportergltf.js';\nimport { ExporterModel } from './exportermodel.js';\nimport { ExporterObj } from './exporterobj.js';\nimport { ExporterOff } from './exporteroff.js';\nimport { ExporterPly } from './exporterply.js';\nimport { ExporterStl } from './exporterstl.js';\n\nexport class Exporter\n{\n constructor ()\n {\n this.exporters = [\n new ExporterObj (),\n new ExporterStl (),\n new ExporterPly (),\n new ExporterOff (),\n new ExporterGltf (),\n new Exporter3dm ()\n ];\n }\n\n AddExporter (exporter)\n {\n this.exporters.push (exporter);\n }\n\n Export (model, settings, format, extension, callbacks)\n {\n let exporter = null;\n for (let i = 0; i < this.exporters.length; i++) {\n let currentExporter = this.exporters[i];\n if (currentExporter.CanExport (format, extension)) {\n exporter = currentExporter;\n break;\n }\n }\n if (exporter === null) {\n callbacks.onError ();\n return;\n }\n\n let exporterModel = new ExporterModel (model, settings);\n exporter.Export (exporterModel, format, (files) => {\n if (files.length === 0) {\n callbacks.onError ();\n } else {\n callbacks.onSuccess (files);\n }\n });\n }\n}\n", "import { RunTaskAsync } from '../engine/core/taskrunner.js';\nimport { Coord3D } from '../engine/geometry/coord3d.js';\nimport { Matrix } from '../engine/geometry/matrix.js';\nimport { FileFormat } from '../engine/io/fileutils.js';\nimport { LoadExternalLibrary } from '../engine/io/externallibs.js';\nimport { Exporter } from '../engine/export/exporter.js';\nimport { ExporterModel, ExporterSettings } from '../engine/export/exportermodel.js';\nimport { AddDiv, ClearDomElement } from '../engine/viewer/domutils.js';\nimport { AddSelect } from '../website/utils.js';\nimport { ButtonDialog, ProgressDialog } from './dialog.js';\nimport { ShowMessageDialog } from './dialogs.js';\nimport { DownloadArrayBufferAsFile } from './utils.js';\nimport { CookieGetStringVal, CookieSetStringVal } from './cookiehandler.js';\nimport { HandleEvent } from './eventhandler.js';\n\nclass ModelExporterUI\n{\n constructor (name, format, extension)\n {\n this.name = name;\n this.format = format;\n this.extension = extension;\n this.visibleOnlySelect = null;\n this.rotationSelect = null;\n }\n\n GetName ()\n {\n return this.name;\n }\n\n GenerateParametersUI (parametersDiv)\n {\n function AddSelectItem (parametersDiv, name, values, defaultIndex)\n {\n let parameterRow = AddDiv (parametersDiv, 'ov_dialog_row');\n AddDiv (parameterRow, 'ov_dialog_row_name', name);\n let parameterValueDiv = AddDiv (parameterRow, 'ov_dialog_row_value');\n return AddSelect (parameterValueDiv, values, defaultIndex);\n }\n\n this.visibleOnlySelect = AddSelectItem (parametersDiv, 'Scope', ['Entire Model', 'Visible Only'], 1);\n this.rotationSelect = AddSelectItem (parametersDiv, 'Rotation', ['No Rotation', '-90 Degrees', '90 Degrees'], 0);\n }\n\n ExportModel (model, callbacks)\n {\n let settings = new ExporterSettings ();\n if (this.visibleOnlySelect.selectedIndex === 1) {\n settings.isMeshVisible = (meshInstanceId) => {\n return callbacks.isMeshVisible (meshInstanceId);\n };\n }\n\n if (this.rotationSelect.selectedIndex === 1) {\n let matrix = new Matrix ().CreateRotationAxisAngle (new Coord3D (1.0, 0.0, 0.0), -Math.PI / 2.0);\n settings.transformation.SetMatrix (matrix);\n } else if (this.rotationSelect.selectedIndex === 2) {\n let matrix = new Matrix ().CreateRotationAxisAngle (new Coord3D (1.0, 0.0, 0.0), Math.PI / 2.0);\n settings.transformation.SetMatrix (matrix);\n }\n\n let exporterModel = new ExporterModel (model, settings);\n if (exporterModel.MeshInstanceCount () === 0) {\n ShowMessageDialog (\n 'Export Failed',\n 'The model doesn\\'t contain any meshes.',\n null\n );\n return;\n }\n\n let progressDialog = new ProgressDialog ();\n progressDialog.Init ('Exporting Model');\n progressDialog.Open ();\n\n RunTaskAsync (() => {\n let exporter = new Exporter ();\n exporter.Export (model, settings, this.format, this.extension, {\n onError : () => {\n progressDialog.Close ();\n },\n onSuccess : (files) => {\n if (files.length === 0) {\n progressDialog.Close ();\n } else if (files.length === 1) {\n progressDialog.Close ();\n let file = files[0];\n DownloadArrayBufferAsFile (file.GetBufferContent (), file.GetName ());\n } else if (files.length > 1) {\n LoadExternalLibrary ('loaders/fflate.min.js').then (() => {\n let filesInZip = {};\n for (let file of files) {\n filesInZip[file.name] = new Uint8Array (file.content);\n }\n let zippedContent = fflate.zipSync (filesInZip);\n let zippedBuffer = zippedContent.buffer;\n progressDialog.Close ();\n DownloadArrayBufferAsFile (zippedBuffer, 'model.zip');\n }).catch (() => {\n progressDialog.Close ();\n });\n }\n }\n });\n });\n }\n}\n\nclass ExportDialog\n{\n constructor (callbacks)\n {\n this.callbacks = callbacks;\n this.selectedExporter = null;\n this.parametersDiv = null;\n\n this.exporters = [\n new ModelExporterUI ('Wavefront (.obj)', FileFormat.Text, 'obj'),\n new ModelExporterUI ('Stereolithography Text (.stl)', FileFormat.Text, 'stl'),\n new ModelExporterUI ('Stereolithography Binary (.stl)', FileFormat.Binary, 'stl'),\n new ModelExporterUI ('Polygon File Format Text (.ply)', FileFormat.Text, 'ply'),\n new ModelExporterUI ('Polygon File Format Binary (.ply)', FileFormat.Binary, 'ply'),\n new ModelExporterUI ('glTF Text (.gltf)', FileFormat.Text, 'gltf'),\n new ModelExporterUI ('glTF Binary (.glb)', FileFormat.Binary, 'glb'),\n new ModelExporterUI ('Object File Format Text (.off)', FileFormat.Text, 'off'),\n new ModelExporterUI ('Rhinoceros 3D (.3dm)', FileFormat.Binary, '3dm')\n ];\n }\n\n Open (model, viewer)\n {\n let mainDialog = new ButtonDialog ();\n let contentDiv = mainDialog.Init ('Export', [\n {\n name : 'Close',\n subClass : 'outline',\n onClick () {\n mainDialog.Close ();\n }\n },\n {\n name : 'Export',\n onClick : () => {\n mainDialog.Close ();\n this.ExportFormat (model, viewer);\n }\n }\n ]);\n\n let text = 'Select the format from the list below, and adjust the settings of the selected format.';\n AddDiv (contentDiv, 'ov_dialog_section', text);\n\n let formatRow = AddDiv (contentDiv, 'ov_dialog_row');\n this.parametersDiv = AddDiv (contentDiv);\n let formatNames = this.exporters.map (exporter => exporter.GetName ());\n let defaultFormat = CookieGetStringVal ('ov_last_export_format', 'glTF Binary (.glb)');\n let defaultFormatIndex = formatNames.indexOf (defaultFormat);\n if (defaultFormatIndex === -1) {\n defaultFormatIndex = 6;\n }\n AddSelect (formatRow, formatNames, defaultFormatIndex, (selectedIndex) => {\n CookieSetStringVal ('ov_last_export_format', formatNames[selectedIndex]);\n this.OnFormatSelected (selectedIndex);\n });\n this.OnFormatSelected (defaultFormatIndex);\n\n mainDialog.Open ();\n }\n\n OnFormatSelected (selectedIndex)\n {\n ClearDomElement (this.parametersDiv);\n this.selectedExporter = this.exporters[selectedIndex];\n this.selectedExporter.GenerateParametersUI (this.parametersDiv);\n }\n\n ExportFormat (model, viewer)\n {\n this.selectedExporter.ExportModel (model, {\n isMeshVisible : (meshInstanceId) => {\n return this.callbacks.isMeshVisible (meshInstanceId);\n }\n });\n HandleEvent ('model_exported', this.selectedExporter.GetName ());\n }\n}\n\nexport function ShowExportDialog (model, viewer, callbacks)\n{\n let exportDialog = new ExportDialog (callbacks);\n exportDialog.Open (model, viewer);\n}\n", "import { AddDiv, CreateDomElement } from '../engine/viewer/domutils.js';\nimport { AddRadioButton } from '../website/utils.js';\nimport { ButtonDialog } from './dialog.js';\nimport { DownloadUrlAsFile } from './utils.js';\nimport { CookieGetStringVal, CookieSetStringVal } from './cookiehandler.js';\nimport { HandleEvent } from './eventhandler.js';\n\nexport function ShowSnapshotDialog (viewer)\n{\n function AddSizeRadioButton (parentDiv, id, text, isSelected, onChange)\n {\n let line = AddDiv (parentDiv, 'ov_dialog_row');\n AddRadioButton (line, id, 'snapshot_size', text, isSelected, onChange);\n }\n\n function GetImageUrl (viewer, snapshotSize)\n {\n if (snapshotSize.size === null) {\n let size = viewer.GetImageSize ();\n return viewer.GetImageAsDataUrl (size.width, size.height);\n } else {\n return viewer.GetImageAsDataUrl (snapshotSize.size[0], snapshotSize.size[1]);\n }\n }\n\n function UpdatePreview (viewer, previewImage, snapshotSize)\n {\n let url = GetImageUrl (viewer, snapshotSize);\n previewImage.src = url;\n }\n\n let selectedIndex = 0;\n let sizes = [\n {\n name : 'Current size',\n size : null\n },\n {\n name : '1280 x 720',\n size : [1280, 720]\n },\n {\n name : '1920 x 1080',\n size : [1920, 1080]\n }\n ];\n\n let dialog = new ButtonDialog ();\n let contentDiv = dialog.Init ('Create Snapshot', [\n {\n name : 'Cancel',\n subClass : 'outline',\n onClick () {\n dialog.Close ();\n }\n },\n {\n name : 'Create',\n onClick () {\n dialog.Close ();\n HandleEvent ('snapshot_created', sizes[selectedIndex].name);\n let url = GetImageUrl (viewer, sizes[selectedIndex]);\n DownloadUrlAsFile (url, 'model.png');\n }\n }\n ]);\n\n let optionsDiv = AddDiv (contentDiv, 'ov_snapshot_dialog_left');\n let previewImage = CreateDomElement ('img', 'ov_snapshot_dialog_preview');\n\n let lastSnapshotSizeName = CookieGetStringVal ('ov_last_snapshot_size', sizes[1].name);\n for (let i = 0; i < sizes.length; i++) {\n if (lastSnapshotSizeName === sizes[i].name) {\n selectedIndex = i;\n break;\n }\n }\n\n for (let i = 0; i < sizes.length; i++) {\n let size = sizes[i];\n let selected = (i === selectedIndex);\n AddSizeRadioButton (optionsDiv, 'snapshot_' + i.toString (), size.name, selected, () => {\n selectedIndex = i;\n CookieSetStringVal ('ov_last_snapshot_size', size.name);\n UpdatePreview (viewer, previewImage, size);\n });\n }\n\n contentDiv.appendChild (previewImage);\n UpdatePreview (viewer, previewImage, sizes[selectedIndex]);\n\n dialog.Open ();\n return dialog;\n}\n", "import { ReadLines } from '../engine/import/importerutils.js';\nimport { AddDiv, CreateDomElement } from '../engine/viewer/domutils.js';\nimport { ButtonDialog } from './dialog.js';\n\nexport function ShowOpenUrlDialog (onOk)\n{\n let dialog = new ButtonDialog ();\n let urlsTextArea = CreateDomElement ('textarea', 'ov_dialog_textarea');\n let contentDiv = dialog.Init ('Open Model from Url', [\n {\n name : 'Cancel',\n subClass : 'outline',\n onClick () {\n dialog.Close ();\n }\n },\n {\n name : 'OK',\n onClick () {\n let urls = [];\n ReadLines (urlsTextArea.value, (line) => {\n urls.push (line);\n });\n dialog.Close ();\n onOk (urls);\n }\n }\n ]);\n let text = 'Here you can load models based on their urls. You can add more lines if your model builds up from multiple files.';\n AddDiv (contentDiv, 'ov_dialog_section', text);\n contentDiv.appendChild (urlsTextArea);\n dialog.Open ();\n urlsTextArea.focus ();\n return dialog;\n}\n", "import { FileSource } from '../engine/io/fileutils.js';\nimport { AddDiv, AddDomElement } from '../engine/viewer/domutils.js';\nimport { AddCheckbox } from '../website/utils.js';\nimport { CreateUrlBuilder } from '../engine/parameters/parameterlist.js';\nimport { ShowMessageDialog } from './dialogs.js';\nimport { ButtonDialog } from './dialog.js';\nimport { CopyToClipboard } from './utils.js';\nimport { HandleEvent } from './eventhandler.js';\n\nexport function ShowSharingDialog (fileList, settings, camera)\n{\n function AddCheckboxLine (parentDiv, text, id, onChange)\n {\n let line = AddDiv (parentDiv, 'ov_dialog_row');\n let checkbox = AddCheckbox (line, id, text, true, () => {\n onChange (checkbox.checked);\n });\n }\n\n function AddCopyableTextInput (parentDiv, getText)\n {\n let copyText = 'Copy';\n let copiedText = 'Copied';\n let container = AddDiv (parentDiv, 'ov_dialog_copyable_input');\n let input = AddDomElement (container, 'input', 'ov_dialog_text');\n input.readOnly = true;\n let button = AddDiv (container, 'ov_button outline ov_dialog_copyable_input_button', copyText);\n button.addEventListener ('click', () => {\n CopyToClipboard (getText ());\n button.innerHTML = copiedText;\n setTimeout (() => {\n button.innerHTML = copyText;\n }, 2000);\n });\n return input;\n }\n\n function AddSharingLinkTab (parentDiv, modelFiles)\n {\n function GetSharingLink (modelFiles)\n {\n let builder = CreateUrlBuilder ();\n builder.AddModelUrls (modelFiles);\n let hashParameters = builder.GetParameterList ();\n return 'https://3dviewer.net#' + hashParameters;\n }\n\n let section = AddDiv (parentDiv, 'ov_dialog_section');\n AddDiv (section, 'ov_dialog_inner_title', 'Sharing Link');\n let sharingLinkInput = AddCopyableTextInput (section, () => {\n HandleEvent ('model_shared', 'sharing_link');\n return GetSharingLink (modelFiles);\n });\n sharingLinkInput.value = GetSharingLink (modelFiles);\n }\n\n function AddEmbeddingCodeTab (parentDiv, modelFiles, settings, camera)\n {\n function GetEmbeddingCode (modelFiles, useCurrentSettings, settings, camera)\n {\n let builder = CreateUrlBuilder ();\n builder.AddModelUrls (modelFiles);\n if (useCurrentSettings) {\n builder.AddCamera (camera);\n let environmentSettings = {\n environmentMapName : settings.environmentMapName,\n backgroundIsEnvMap : settings.backgroundIsEnvMap\n };\n builder.AddEnvironmentSettings (environmentSettings);\n builder.AddBackgroundColor (settings.backgroundColor);\n builder.AddDefaultColor (settings.defaultColor);\n let edgeSettings = {\n showEdges : settings.showEdges,\n edgeColor : settings.edgeColor,\n edgeThreshold : settings.edgeThreshold\n };\n builder.AddEdgeSettings (edgeSettings);\n }\n let hashParameters = builder.GetParameterList ();\n\n let embeddingCode = '';\n embeddingCode += '';\n return embeddingCode;\n }\n\n let useCurrentSettings = true;\n let section = AddDiv (parentDiv, 'ov_dialog_section');\n section.style.marginTop = '20px';\n AddDiv (section, 'ov_dialog_inner_title', 'Embedding Code');\n let optionsSection = AddDiv (section, 'ov_dialog_section');\n let embeddingCodeInput = AddCopyableTextInput (section, () => {\n HandleEvent ('model_shared', 'embedding_code');\n return GetEmbeddingCode (modelFiles, useCurrentSettings, settings, camera);\n });\n AddCheckboxLine (optionsSection, 'Use customized settings', 'embed_current_settings', (checked) => {\n useCurrentSettings = checked;\n embeddingCodeInput.value = GetEmbeddingCode (modelFiles, useCurrentSettings, settings, camera);\n });\n\n embeddingCodeInput.value = GetEmbeddingCode (modelFiles, useCurrentSettings, settings, camera);\n }\n\n if (!fileList.IsOnlyUrlSource ()) {\n return ShowMessageDialog (\n 'Sharing Failed',\n 'Sharing works only if you load files by url. Please upload your model files to a web server, open them by url, and try embedding again.',\n null\n );\n }\n\n let files = fileList.GetFiles ();\n let modelFiles = [];\n for (let fileIndex = 0; fileIndex < files.length; fileIndex++) {\n let file = files[fileIndex];\n if (file.source === FileSource.Url) {\n modelFiles.push (file.fileUrl);\n }\n }\n\n let dialog = new ButtonDialog ();\n let contentDiv = dialog.Init ('Share', [\n {\n name : 'Close',\n onClick () {\n dialog.Close ();\n }\n }\n ]);\n\n AddSharingLinkTab (contentDiv, modelFiles);\n AddEmbeddingCodeTab (contentDiv, modelFiles, settings, camera);\n\n dialog.Open ();\n return dialog;\n}\n", "import { BigEps, IsEqualEps, RadDeg } from '../engine/geometry/geometry.js';\nimport { AddDiv, ClearDomElement } from '../engine/viewer/domutils.js';\nimport { AddSvgIconElement, IsDarkTextNeededForColor } from './utils.js';\n\nfunction GetFaceWorldNormal (intersection)\n{\n let normalMatrix = new THREE.Matrix4 ();\n intersection.object.updateWorldMatrix (true, false);\n normalMatrix.extractRotation (intersection.object.matrixWorld);\n let faceNormal = intersection.face.normal.clone ();\n faceNormal.applyMatrix4 (normalMatrix);\n return faceNormal;\n}\n\nfunction CreateMaterial ()\n{\n return new THREE.LineBasicMaterial ({\n color : 0x263238,\n depthTest : false\n });\n}\n\nfunction CreateLineFromPoints (points, material)\n{\n let geometry = new THREE.BufferGeometry ().setFromPoints (points);\n return new THREE.Line (geometry, material);\n}\n\nclass Marker\n{\n constructor (intersection, radius)\n {\n this.intersection = null;\n this.markerObject = new THREE.Object3D ();\n\n let material = CreateMaterial ();\n let circleCurve = new THREE.EllipseCurve (0.0, 0.0, radius, radius, 0.0, 2.0 * Math.PI, false, 0.0);\n this.markerObject.add (CreateLineFromPoints (circleCurve.getPoints (50), material));\n this.markerObject.add (CreateLineFromPoints ([new THREE.Vector3 (-radius, 0.0, 0.0), new THREE.Vector3 (radius, 0.0, 0.0)], material));\n this.markerObject.add (CreateLineFromPoints ([new THREE.Vector3 (0.0, -radius, 0.0), new THREE.Vector3 (0.0, radius, 0.0)], material));\n\n this.UpdatePosition (intersection);\n }\n\n UpdatePosition (intersection)\n {\n this.intersection = intersection;\n let faceNormal = GetFaceWorldNormal (this.intersection);\n this.markerObject.updateMatrixWorld (true);\n this.markerObject.position.set (0.0, 0.0, 0.0);\n this.markerObject.lookAt (faceNormal);\n this.markerObject.position.set (this.intersection.point.x, this.intersection.point.y, this.intersection.point.z);\n }\n\n Show (show)\n {\n this.markerObject.visible = show;\n }\n\n GetIntersection ()\n {\n return this.intersection;\n }\n\n GetObject ()\n {\n return this.markerObject;\n }\n}\n\nfunction CalculateMarkerValues (aMarker, bMarker)\n{\n const aIntersection = aMarker.GetIntersection ();\n const bIntersection = bMarker.GetIntersection ();\n let result = {\n pointsDistance : null,\n parallelFacesDistance : null,\n facesAngle : null\n };\n\n const aNormal = GetFaceWorldNormal (aIntersection);\n const bNormal = GetFaceWorldNormal (bIntersection);\n result.pointsDistance = aIntersection.point.distanceTo (bIntersection.point);\n result.facesAngle = aNormal.angleTo (bNormal);\n if (IsEqualEps (result.facesAngle, 0.0, BigEps) || IsEqualEps (result.facesAngle, Math.PI, BigEps)) {\n let aPlane = new THREE.Plane ().setFromNormalAndCoplanarPoint (aNormal, aIntersection.point);\n result.parallelFacesDistance = Math.abs (aPlane.distanceToPoint (bIntersection.point));\n }\n return result;\n}\n\nexport class MeasureTool\n{\n constructor (viewer, settings)\n {\n this.viewer = viewer;\n this.settings = settings;\n this.isActive = false;\n this.markers = [];\n this.tempMarker = null;\n\n this.panel = null;\n this.button = null;\n }\n\n SetButton (button)\n {\n this.button = button;\n }\n\n IsActive ()\n {\n return this.isActive;\n }\n\n SetActive (isActive)\n {\n if (this.isActive === isActive) {\n return;\n }\n this.isActive = isActive;\n this.button.SetSelected (isActive);\n if (this.isActive) {\n this.panel = AddDiv (document.body, 'ov_measure_panel');\n this.UpdatePanel ();\n this.Resize ();\n } else {\n this.ClearMarkers ();\n this.panel.remove ();\n }\n }\n\n Click (mouseCoordinates)\n {\n let intersection = this.viewer.GetMeshIntersectionUnderMouse (mouseCoordinates);\n if (intersection === null) {\n this.ClearMarkers ();\n this.UpdatePanel ();\n return;\n }\n\n if (this.markers.length === 2) {\n this.ClearMarkers ();\n }\n\n this.AddMarker (intersection);\n this.UpdatePanel ();\n }\n\n MouseMove (mouseCoordinates)\n {\n let intersection = this.viewer.GetMeshIntersectionUnderMouse (mouseCoordinates);\n if (intersection === null) {\n if (this.tempMarker !== null) {\n this.tempMarker.Show (false);\n this.viewer.Render ();\n }\n return;\n }\n if (this.tempMarker === null) {\n this.tempMarker = this.GenerateMarker (intersection);\n }\n this.tempMarker.UpdatePosition (intersection);\n this.tempMarker.Show (true);\n this.viewer.Render ();\n }\n\n AddMarker (intersection)\n {\n let marker = this.GenerateMarker (intersection);\n this.markers.push (marker);\n if (this.markers.length === 2) {\n let material = CreateMaterial ();\n let aPoint = this.markers[0].GetIntersection ().point;\n let bPoint = this.markers[1].GetIntersection ().point;\n this.viewer.AddExtraObject (CreateLineFromPoints ([aPoint, bPoint], material));\n }\n }\n\n GenerateMarker (intersection)\n {\n let boundingSphere = this.viewer.GetBoundingSphere ((meshUserData) => {\n return true;\n });\n\n let radius = boundingSphere.radius / 20.0;\n let marker = new Marker (intersection, radius);\n this.viewer.AddExtraObject (marker.GetObject ());\n return marker;\n }\n\n UpdatePanel ()\n {\n function AddValue (panel, icon, title, value)\n {\n let svgIcon = AddSvgIconElement (panel, icon, 'left_inline');\n svgIcon.title = title;\n AddDiv (panel, 'ov_measure_value', value);\n }\n\n ClearDomElement (this.panel);\n if (IsDarkTextNeededForColor (this.settings.backgroundColor)) {\n this.panel.style.color = '#000000';\n } else {\n this.panel.style.color = '#ffffff';\n }\n if (this.markers.length === 0) {\n this.panel.innerHTML = 'Select a point.';\n } else if (this.markers.length === 1) {\n this.panel.innerHTML = 'Select another point.';\n } else {\n let calcResult = CalculateMarkerValues (this.markers[0], this.markers[1]);\n\n if (calcResult.pointsDistance !== null) {\n AddValue (this.panel, 'measure_distance', 'Distance of points', calcResult.pointsDistance.toFixed (3));\n }\n if (calcResult.parallelFacesDistance !== null) {\n AddValue (this.panel, 'measure_distance_parallel', 'Distance of parallel faces', calcResult.parallelFacesDistance.toFixed (3));\n }\n if (calcResult.facesAngle !== null) {\n let degreeValue = calcResult.facesAngle * RadDeg;\n AddValue (this.panel, 'measure_angle', 'Angle of faces', degreeValue.toFixed (1) + '\\xB0');\n }\n }\n }\n\n Resize ()\n {\n if (!this.isActive) {\n return;\n }\n let canvas = this.viewer.GetCanvas ();\n let rect = canvas.getBoundingClientRect ();\n this.panel.style.left = rect.left + 'px';\n this.panel.style.top = rect.top + 'px';\n this.panel.style.width = (rect.right - rect.left) + 'px';\n }\n\n ClearMarkers ()\n {\n this.viewer.ClearExtra ();\n this.markers = [];\n this.tempMarker = null;\n }\n}\n", "import { FileSource, GetFileExtension, TransformFileHostUrls } from '../engine/io/fileutils.js';\nimport { ImportErrorCode, ImportSettings } from '../engine/import/importer.js';\nimport { Viewer } from '../engine/viewer/viewer.js';\nimport { AddDiv, AddDomElement, ShowDomElement, SetDomElementOuterHeight } from '../engine/viewer/domutils.js';\nimport { CalculatePopupPositionToScreen, ShowListPopup } from './dialogs.js';\nimport { HandleEvent } from './eventhandler.js';\nimport { HashHandler } from './hashhandler.js';\nimport { Navigator, Selection, SelectionType } from './navigator.js';\nimport { Settings, Theme } from './settings.js';\nimport { Sidebar } from './sidebar.js';\nimport { ThemeHandler } from './themehandler.js';\nimport { ThreeModelLoaderUI } from './threemodelloaderui.js';\nimport { Toolbar } from './toolbar.js';\nimport { ShowExportDialog } from './exportdialog.js';\nimport { ShowSnapshotDialog } from './snapshotdialog.js';\nimport { AddSmallWidthChangeEventListener, GetFilesFromDataTransfer, IsSmallWidth } from './utils.js';\nimport { ShowOpenUrlDialog } from './openurldialog.js';\nimport { ShowSharingDialog } from './sharingdialog.js';\nimport { HasDefaultMaterial, ReplaceDefaultMaterialColor } from '../engine/model/modelutils.js';\nimport { Direction } from '../engine/geometry/geometry.js';\nimport { CookieGetBoolVal, CookieSetBoolVal } from './cookiehandler.js';\nimport { ShadingType } from '../engine/threejs/threeutils.js';\nimport { MeasureTool } from './measuretool.js';\nimport { CloseAllDialogs } from './dialog.js';\n\nexport const WebsiteUIState =\n{\n Undefined : 0,\n Intro : 1,\n Model : 2,\n Loading : 3\n};\n\nexport class Website\n{\n constructor (parameters)\n {\n this.parameters = parameters;\n this.settings = new Settings ();\n this.viewer = new Viewer ();\n this.measureTool = new MeasureTool (this.viewer, this.settings);\n this.hashHandler = new HashHandler ();\n this.toolbar = new Toolbar (this.parameters.toolbarDiv);\n this.navigator = new Navigator (this.parameters.navigatorDiv, this.parameters.navigatorSplitterDiv);\n this.sidebar = new Sidebar (this.parameters.sidebarDiv, this.parameters.sidebarSplitterDiv, this.settings);\n this.modelLoaderUI = new ThreeModelLoaderUI ();\n this.themeHandler = new ThemeHandler ();\n this.highlightColor = new THREE.Color (0x8ec9f0);\n this.uiState = WebsiteUIState.Undefined;\n this.model = null;\n }\n\n Load ()\n {\n this.settings.LoadFromCookies ();\n this.SwitchTheme (this.settings.themeId, false);\n HandleEvent ('theme_on_load', this.settings.themeId === Theme.Light ? 'light' : 'dark');\n\n this.InitViewer ();\n this.InitToolbar ();\n this.InitDragAndDrop ();\n this.InitSidebar ();\n this.InitNavigator ();\n this.InitCookieConsent ();\n\n this.viewer.SetMouseClickHandler (this.OnModelClicked.bind (this));\n this.viewer.SetMouseMoveHandler (this.OnModelMouseMoved.bind (this));\n this.viewer.SetContextMenuHandler (this.OnModelContextMenu.bind (this));\n\n this.Resize ();\n this.SetUIState (WebsiteUIState.Intro);\n\n this.hashHandler.SetEventListener (this.OnHashChange.bind (this));\n this.OnHashChange ();\n\n AddSmallWidthChangeEventListener (() => {\n this.OnSmallWidthChanged ();\n });\n\n window.addEventListener ('resize', () => {\n\t\t\tthis.Resize ();\n\t\t});\n }\n\n Resize ()\n {\n let windowWidth = window.innerWidth;\n let windowHeight = window.innerHeight;\n let headerHeight = this.parameters.headerDiv.offsetHeight;\n\n let navigatorWidth = 0;\n let sidebarWidth = 0;\n let safetyMargin = 0;\n if (!IsSmallWidth ()) {\n navigatorWidth = this.navigator.GetWidth ();\n sidebarWidth = this.sidebar.GetWidth ();\n safetyMargin = 1;\n }\n\n const minContentWidth = 50;\n let contentWidth = windowWidth - navigatorWidth - sidebarWidth;\n if (contentWidth < minContentWidth) {\n this.sidebar.DecreaseWidth (minContentWidth - contentWidth);\n contentWidth = minContentWidth;\n }\n let contentHeight = windowHeight - headerHeight;\n\n SetDomElementOuterHeight (this.parameters.introDiv, contentHeight);\n this.navigator.Resize (contentHeight);\n this.sidebar.Resize (contentHeight);\n this.viewer.Resize (contentWidth - safetyMargin, contentHeight);\n this.measureTool.Resize ();\n }\n\n OnSmallWidthChanged ()\n {\n if (this.uiState === WebsiteUIState.Model) {\n this.UpdatePanelsVisibility ();\n }\n }\n\n HasLoadedModel ()\n {\n return this.model !== null;\n }\n\n SetUIState (uiState)\n {\n function ShowOnlyOnModelElements (show)\n {\n let root = document.querySelector (':root');\n root.style.setProperty ('--ov_only_on_model_display', show ? 'inherit' : 'none');\n }\n\n if (this.uiState === uiState) {\n return;\n }\n\n this.uiState = uiState;\n if (this.uiState === WebsiteUIState.Intro) {\n ShowDomElement (this.parameters.introDiv, true);\n ShowDomElement (this.parameters.mainDiv, false);\n ShowOnlyOnModelElements (false);\n } else if (this.uiState === WebsiteUIState.Model) {\n ShowDomElement (this.parameters.introDiv, false);\n ShowDomElement (this.parameters.mainDiv, true);\n ShowOnlyOnModelElements (true);\n this.UpdatePanelsVisibility ();\n } else if (this.uiState === WebsiteUIState.Loading) {\n ShowDomElement (this.parameters.introDiv, false);\n ShowDomElement (this.parameters.mainDiv, false);\n ShowOnlyOnModelElements (false);\n }\n\n this.Resize ();\n }\n\n ClearModel ()\n {\n CloseAllDialogs ();\n\n this.model = null;\n this.viewer.Clear ();\n\n this.parameters.fileNameDiv.innerHTML = '';\n\n this.navigator.Clear ();\n this.sidebar.Clear ();\n\n this.measureTool.SetActive (false);\n }\n\n OnModelLoaded (importResult, threeObject)\n {\n this.model = importResult.model;\n this.parameters.fileNameDiv.innerHTML = importResult.mainFile;\n this.viewer.SetMainObject (threeObject);\n this.viewer.SetUpVector (Direction.Y, false);\n this.navigator.FillTree (importResult);\n this.UpdateSidebar ();\n this.FitModelToWindow (true);\n }\n\n OnModelClicked (button, mouseCoordinates)\n {\n if (button !== 1) {\n return;\n }\n\n if (this.measureTool.IsActive ()) {\n this.measureTool.Click (mouseCoordinates);\n return;\n }\n\n let meshUserData = this.viewer.GetMeshUserDataUnderMouse (mouseCoordinates);\n if (meshUserData === null) {\n this.navigator.SetSelection (null);\n } else {\n this.navigator.SetSelection (new Selection (SelectionType.Mesh, meshUserData.originalMeshId));\n }\n }\n\n OnModelMouseMoved (mouseCoordinates)\n {\n if (this.measureTool.IsActive ()) {\n this.measureTool.MouseMove (mouseCoordinates);\n }\n }\n\n OnModelContextMenu (globalMouseCoordinates, mouseCoordinates)\n {\n let meshUserData = this.viewer.GetMeshUserDataUnderMouse (mouseCoordinates);\n let items = [];\n if (meshUserData === null) {\n items.push ({\n name : 'Fit model to window',\n icon : 'fit',\n onClick : () => {\n this.FitModelToWindow (false);\n }\n });\n if (this.navigator.HasHiddenMesh ()) {\n items.push ({\n name : 'Show all meshes',\n icon : 'visible',\n onClick : () => {\n this.navigator.ShowAllMeshes (true);\n }\n });\n }\n } else {\n items.push ({\n name : 'Hide mesh',\n icon : 'hidden',\n onClick : () => {\n this.navigator.ToggleMeshVisibility (meshUserData.originalMeshId);\n }\n });\n items.push ({\n name : 'Fit mesh to window',\n icon : 'fit',\n onClick : () => {\n this.navigator.FitMeshToWindow (meshUserData.originalMeshId);\n }\n });\n if (this.navigator.MeshItemCount () > 1) {\n let isMeshIsolated = this.navigator.IsMeshIsolated (meshUserData.originalMeshId);\n items.push ({\n name : isMeshIsolated ? 'Remove isolation' : 'Isolate mesh',\n icon : isMeshIsolated ? 'deisolate' : 'isolate',\n onClick : () => {\n if (isMeshIsolated) {\n this.navigator.ShowAllMeshes (true);\n } else {\n this.navigator.IsolateMesh (meshUserData.originalMeshId);\n }\n }\n });\n }\n }\n ShowListPopup (items, {\n calculatePosition : (contentDiv) => {\n return CalculatePopupPositionToScreen (globalMouseCoordinates, contentDiv);\n },\n onClick : (index) => {\n let clickedItem = items[index];\n clickedItem.onClick ();\n }\n });\n }\n\n OnHashChange ()\n {\n if (this.hashHandler.HasHash ()) {\n let urls = this.hashHandler.GetModelFilesFromHash ();\n if (urls === null) {\n return;\n }\n TransformFileHostUrls (urls);\n let importSettings = new ImportSettings ();\n importSettings.defaultColor = this.settings.defaultColor;\n let defaultColor = this.hashHandler.GetDefaultColorFromHash ();\n if (defaultColor !== null) {\n importSettings.defaultColor = defaultColor;\n }\n HandleEvent ('model_load_started', 'hash');\n this.LoadModelFromUrlList (urls, importSettings);\n } else {\n this.ClearModel ();\n this.SetUIState (WebsiteUIState.Intro);\n }\n }\n\n OpenFileBrowserDialog ()\n {\n this.parameters.fileInput.click ();\n }\n\n FitModelToWindow (onLoad)\n {\n let animation = !onLoad;\n let boundingSphere = this.viewer.GetBoundingSphere ((meshUserData) => {\n return this.navigator.IsMeshVisible (meshUserData.originalMeshId);\n });\n if (onLoad) {\n this.viewer.AdjustClippingPlanesToSphere (boundingSphere);\n }\n this.viewer.FitSphereToWindow (boundingSphere, animation);\n }\n\n FitMeshToWindow (meshInstanceId)\n {\n let boundingSphere = this.viewer.GetBoundingSphere ((meshUserData) => {\n return meshUserData.originalMeshId.IsEqual (meshInstanceId);\n });\n this.viewer.FitSphereToWindow (boundingSphere, true);\n }\n\n FitMeshesToWindow (meshInstanceIdSet)\n {\n let meshInstanceIdKeys = new Set ();\n for (let meshInstanceId of meshInstanceIdSet) {\n meshInstanceIdKeys.add (meshInstanceId.GetKey ());\n }\n let boundingSphere = this.viewer.GetBoundingSphere ((meshUserData) => {\n return meshInstanceIdKeys.has (meshUserData.originalMeshId.GetKey ());\n });\n this.viewer.FitSphereToWindow (boundingSphere, true);\n }\n\n UpdateSidebar ()\n {\n let shadingType = this.viewer.GetShadingType ();\n let isPhysicallyBased = (shadingType === ShadingType.Physical);\n let hasDefaultMaterial = HasDefaultMaterial (this.model);\n this.sidebar.UpdateSettings (isPhysicallyBased, hasDefaultMaterial);\n }\n\n UpdateMeshesVisibility ()\n {\n this.viewer.SetMeshesVisibility ((meshUserData) => {\n return this.navigator.IsMeshVisible (meshUserData.originalMeshId);\n });\n }\n\n UpdateMeshesSelection ()\n {\n let selectedMeshId = this.navigator.GetSelectedMeshId ();\n this.viewer.SetMeshesHighlight (this.highlightColor, (meshUserData) => {\n if (selectedMeshId !== null && meshUserData.originalMeshId.IsEqual (selectedMeshId)) {\n return true;\n }\n return false;\n });\n }\n\n LoadModelFromUrlList (urls, settings)\n {\n this.LoadModel (urls, FileSource.Url, settings);\n this.ClearHashIfNotOnlyUrlList ();\n }\n\n LoadModelFromFileList (files)\n {\n let importSettings = new ImportSettings ();\n importSettings.defaultColor = this.settings.defaultColor;\n this.LoadModel (files, FileSource.File, importSettings);\n this.ClearHashIfNotOnlyUrlList ();\n }\n\n LoadModel (files, fileSource, settings)\n {\n this.modelLoaderUI.LoadModel (files, fileSource, settings, {\n onStart : () =>\n {\n this.SetUIState (WebsiteUIState.Loading);\n this.ClearModel ();\n },\n onFinish : (importResult, threeObject) =>\n {\n this.SetUIState (WebsiteUIState.Model);\n this.OnModelLoaded (importResult, threeObject);\n let importedExtension = GetFileExtension (importResult.mainFile);\n HandleEvent ('model_loaded', importedExtension);\n },\n onRender : () =>\n {\n this.viewer.Render ();\n },\n onError : (importError) =>\n {\n this.SetUIState (WebsiteUIState.Intro);\n let extensionStr = null;\n if (importError.mainFile !== null) {\n extensionStr = GetFileExtension (importError.mainFile);\n } else {\n let extensions = [];\n let importer = this.modelLoaderUI.GetImporter ();\n let fileList = importer.GetFileList ().GetFiles ();\n for (let i = 0; i < fileList.length; i++) {\n let extension = fileList[i].extension;\n extensions.push (extension);\n }\n extensionStr = extensions.join (',');\n }\n if (importError.code === ImportErrorCode.NoImportableFile) {\n HandleEvent ('no_importable_file', extensionStr);\n } else if (importError.code === ImportErrorCode.FailedToLoadFile) {\n HandleEvent ('failed_to_load_file', extensionStr);\n } else if (importError.code === ImportErrorCode.ImportFailed) {\n HandleEvent ('import_failed', extensionStr, {\n error_message : importError.message\n });\n }\n }\n });\n }\n\n ClearHashIfNotOnlyUrlList ()\n {\n let importer = this.modelLoaderUI.GetImporter ();\n let isOnlyUrl = importer.GetFileList ().IsOnlyUrlSource ();\n if (!isOnlyUrl && this.hashHandler.HasHash ()) {\n this.hashHandler.SkipNextEventHandler ();\n this.hashHandler.ClearHash ();\n }\n }\n\n UpdateEdgeDisplay ()\n {\n this.settings.SaveToCookies ();\n this.viewer.SetEdgeSettings (this.settings.showEdges, this.settings.edgeColor, this.settings.edgeThreshold);\n }\n\n UpdateEnvironmentMap ()\n {\n let envMapPath = 'assets/envmaps/' + this.settings.environmentMapName + '/';\n let envMapTextures = [\n envMapPath + 'posx.jpg',\n envMapPath + 'negx.jpg',\n envMapPath + 'posy.jpg',\n envMapPath + 'negy.jpg',\n envMapPath + 'posz.jpg',\n envMapPath + 'negz.jpg'\n ];\n this.viewer.SetEnvironmentMapSettings (envMapTextures, this.settings.backgroundIsEnvMap);\n }\n\n SwitchTheme (newThemeId, resetColors)\n {\n this.settings.themeId = newThemeId;\n this.themeHandler.SwitchTheme (this.settings.themeId);\n this.settings.SaveToCookies ();\n if (resetColors) {\n this.viewer.SetBackgroundColor (this.settings.backgroundColor);\n let modelLoader = this.modelLoaderUI.GetModelLoader ();\n if (modelLoader.GetDefaultMaterial () !== null) {\n ReplaceDefaultMaterialColor (this.model, this.settings.defaultColor);\n modelLoader.ReplaceDefaultMaterialColor (this.settings.defaultColor);\n }\n }\n }\n\n InitViewer ()\n {\n let canvas = AddDomElement (this.parameters.viewerDiv, 'canvas');\n this.viewer.Init (canvas);\n this.viewer.SetEdgeSettings (this.settings.showEdges, this.settings.edgeColor, this.settings.edgeThreshold);\n this.viewer.SetBackgroundColor (this.settings.backgroundColor);\n this.UpdateEnvironmentMap ();\n }\n\n InitToolbar ()\n {\n function AddButton (toolbar, imageName, imageTitle, classNames, onClick)\n {\n let button = toolbar.AddImageButton (imageName, imageTitle, () => {\n onClick ();\n });\n for (let className of classNames) {\n button.AddClass (className);\n }\n return button;\n }\n\n function AddPushButton (toolbar, imageName, imageTitle, classNames, onClick)\n {\n let button = toolbar.AddImagePushButton (imageName, imageTitle, false, (isSelected) => {\n onClick (isSelected);\n });\n for (let className of classNames) {\n button.AddClass (className);\n }\n return button;\n }\n\n function AddRadioButton (toolbar, imageNames, imageTitles, selectedIndex, classNames, onClick)\n {\n let imageData = [];\n for (let i = 0; i < imageNames.length; i++) {\n let imageName = imageNames[i];\n let imageTitle = imageTitles[i];\n imageData.push ({\n image : imageName,\n title : imageTitle\n });\n }\n let buttons = toolbar.AddImageRadioButton (imageData, selectedIndex, (buttonIndex) => {\n onClick (buttonIndex);\n });\n for (let className of classNames) {\n for (let button of buttons) {\n button.AddClass (className);\n }\n }\n }\n\n function AddSeparator (toolbar, classNames)\n {\n let separator = toolbar.AddSeparator ();\n if (classNames !== null) {\n for (let className of classNames) {\n separator.classList.add (className);\n }\n }\n }\n\n let importer = this.modelLoaderUI.GetImporter ();\n\n AddButton (this.toolbar, 'open', 'Open model from your device', [], () => {\n this.OpenFileBrowserDialog ();\n });\n AddButton (this.toolbar, 'open_url', 'Open model from a url', [], () => {\n ShowOpenUrlDialog ((urls) => {\n if (urls.length > 0) {\n this.hashHandler.SetModelFilesToHash (urls);\n }\n });\n });\n AddSeparator (this.toolbar, ['only_on_model']);\n AddButton (this.toolbar, 'fit', 'Fit model to window', ['only_on_model'], () => {\n this.FitModelToWindow (false);\n });\n AddButton (this.toolbar, 'up_y', 'Set Y axis as up vector', ['only_on_model'], () => {\n this.viewer.SetUpVector (Direction.Y, true);\n });\n AddButton (this.toolbar, 'up_z', 'Set Z axis as up vector', ['only_on_model'], () => {\n this.viewer.SetUpVector (Direction.Z, true);\n });\n AddButton (this.toolbar, 'flip', 'Flip up vector', ['only_on_model'], () => {\n this.viewer.FlipUpVector ();\n });\n AddSeparator (this.toolbar, ['only_on_model']);\n AddRadioButton (this.toolbar, ['fix_up_on', 'fix_up_off'], ['Fixed up vector', 'Free orbit'], 0, ['only_on_model'], (buttonIndex) => {\n if (buttonIndex === 0) {\n this.viewer.SetFixUpVector (true);\n } else if (buttonIndex === 1) {\n this.viewer.SetFixUpVector (false);\n }\n });\n AddSeparator (this.toolbar, ['only_full_width', 'only_on_model']);\n let measureToolButton = AddPushButton (this.toolbar, 'measure', 'Measure', ['only_full_width', 'only_on_model'], (isSelected) => {\n HandleEvent ('measure_tool_activated', isSelected ? 'on' : 'off');\n this.navigator.SetSelection (null);\n this.measureTool.SetActive (isSelected);\n });\n this.measureTool.SetButton (measureToolButton);\n AddSeparator (this.toolbar, ['only_full_width', 'only_on_model']);\n AddButton (this.toolbar, 'snapshot', 'Create snapshot', ['only_full_width', 'only_on_model'], () => {\n ShowSnapshotDialog (this.viewer);\n });\n AddButton (this.toolbar, 'export', 'Export model', ['only_full_width', 'only_on_model'], () => {\n ShowExportDialog (this.model, this.viewer, {\n isMeshVisible : (meshInstanceId) => {\n return this.navigator.IsMeshVisible (meshInstanceId);\n }\n });\n });\n AddButton (this.toolbar, 'share', 'Share model', ['only_full_width', 'only_on_model'], () => {\n ShowSharingDialog (importer.GetFileList (), this.settings, this.viewer.GetCamera ());\n });\n\n this.parameters.fileInput.addEventListener ('change', (ev) => {\n if (ev.target.files.length > 0) {\n HandleEvent ('model_load_started', 'open_file');\n this.LoadModelFromFileList (ev.target.files);\n }\n });\n }\n\n InitDragAndDrop ()\n {\n window.addEventListener ('dragstart', (ev) => {\n ev.preventDefault ();\n }, false);\n\n window.addEventListener ('dragover', (ev) => {\n ev.stopPropagation ();\n ev.preventDefault ();\n ev.dataTransfer.dropEffect = 'copy';\n }, false);\n\n window.addEventListener ('drop', (ev) => {\n ev.stopPropagation ();\n ev.preventDefault ();\n GetFilesFromDataTransfer (ev.dataTransfer, (files) => {\n if (files.length > 0) {\n HandleEvent ('model_load_started', 'drop');\n this.LoadModelFromFileList (files);\n }\n });\n }, false);\n }\n\n InitSidebar ()\n {\n this.sidebar.Init ({\n onEnvironmentMapChange : () => {\n this.settings.SaveToCookies ();\n this.UpdateEnvironmentMap ();\n },\n onBackgroundColorChange : () => {\n this.settings.SaveToCookies ();\n this.viewer.SetBackgroundColor (this.settings.backgroundColor);\n if (this.measureTool.IsActive ()) {\n this.measureTool.UpdatePanel ();\n }\n },\n onDefaultColorChange : () => {\n this.settings.SaveToCookies ();\n let modelLoader = this.modelLoaderUI.GetModelLoader ();\n if (modelLoader.GetDefaultMaterial () !== null) {\n ReplaceDefaultMaterialColor (this.model, this.settings.defaultColor);\n modelLoader.ReplaceDefaultMaterialColor (this.settings.defaultColor);\n }\n this.viewer.Render ();\n },\n onEdgeDisplayChange : () => {\n HandleEvent ('edge_display_changed', this.settings.showEdges ? 'on' : 'off');\n this.UpdateEdgeDisplay ();\n },\n onThemeChange : () => {\n HandleEvent ('theme_changed', this.settings.themeId === Theme.Light ? 'light' : 'dark');\n this.SwitchTheme (this.settings.themeId, true);\n },\n onResize : () => {\n this.Resize ();\n },\n onShowHidePanels : (show) => {\n CookieSetBoolVal ('ov_show_sidebar', show);\n }\n });\n }\n\n InitNavigator ()\n {\n function GetMeshUserData (viewer, meshInstanceId)\n {\n let userData = null;\n viewer.EnumerateMeshesUserData ((meshUserData) => {\n if (meshUserData.originalMeshId.IsEqual (meshInstanceId)) {\n userData = meshUserData;\n }\n });\n return userData;\n }\n\n function GetMeshesForMaterial (viewer, model, materialIndex)\n {\n let usedByMeshes = [];\n viewer.EnumerateMeshesUserData ((meshUserData) => {\n if (materialIndex === null || meshUserData.originalMaterials.indexOf (materialIndex) !== -1) {\n const mesh = model.GetMesh (meshUserData.originalMeshId.meshIndex);\n usedByMeshes.push ({\n meshId : meshUserData.originalMeshId,\n name : mesh.GetName ()\n });\n }\n });\n return usedByMeshes;\n }\n\n function GetMaterialReferenceInfo (model, materialIndex)\n {\n const material = model.GetMaterial (materialIndex);\n return {\n index : materialIndex,\n name : material.name,\n color : material.color.Clone ()\n };\n }\n\n function GetMaterialsForMesh (viewer, model, meshInstanceId)\n {\n let usedMaterials = [];\n if (meshInstanceId === null) {\n for (let materialIndex = 0; materialIndex < model.MaterialCount (); materialIndex++) {\n usedMaterials.push (GetMaterialReferenceInfo (model, materialIndex));\n }\n } else {\n let userData = GetMeshUserData (viewer, meshInstanceId);\n for (let i = 0; i < userData.originalMaterials.length; i++) {\n const materialIndex = userData.originalMaterials[i];\n usedMaterials.push (GetMaterialReferenceInfo (model, materialIndex));\n }\n }\n usedMaterials.sort ((a, b) => {\n return a.index - b.index;\n });\n return usedMaterials;\n }\n\n this.navigator.Init ({\n openFileBrowserDialog : () => {\n this.OpenFileBrowserDialog ();\n },\n updateMeshesVisibility : () => {\n this.UpdateMeshesVisibility ();\n },\n updateMeshesSelection : () => {\n this.UpdateMeshesSelection ();\n },\n fitMeshToWindow : (meshInstanceId) => {\n this.FitMeshToWindow (meshInstanceId);\n },\n fitMeshesToWindow : (meshInstanceIdSet) => {\n this.FitMeshesToWindow (meshInstanceIdSet);\n },\n getMeshesForMaterial : (materialIndex) => {\n return GetMeshesForMaterial (this.viewer, this.model, materialIndex);\n },\n getMaterialsForMesh : (meshInstanceId) => {\n return GetMaterialsForMesh (this.viewer, this.model, meshInstanceId);\n },\n onModelSelected : () => {\n this.sidebar.AddObject3DProperties (this.model);\n },\n onMeshSelected : (meshInstanceId) => {\n let meshInstance = this.model.GetMeshInstance (meshInstanceId);\n this.sidebar.AddObject3DProperties (meshInstance);\n },\n onMaterialSelected : (materialIndex) => {\n this.sidebar.AddMaterialProperties (this.model.GetMaterial (materialIndex));\n },\n onResize : () => {\n this.Resize ();\n },\n onShowHidePanels : (show) => {\n CookieSetBoolVal ('ov_show_navigator', show);\n }\n });\n }\n\n UpdatePanelsVisibility ()\n {\n let showNavigator = CookieGetBoolVal ('ov_show_navigator', true);\n let showSidebar = CookieGetBoolVal ('ov_show_sidebar', true);\n this.navigator.ShowPanels (showNavigator);\n this.sidebar.ShowPanels (showSidebar);\n }\n\n InitCookieConsent ()\n {\n let accepted = CookieGetBoolVal ('ov_cookie_consent', false);\n if (accepted) {\n return;\n }\n\n let text = 'This website uses cookies to offer you better user experience. See the details at the Cookies Policy page.';\n let popupDiv = AddDiv (document.body, 'ov_bottom_floating_panel');\n AddDiv (popupDiv, 'ov_floating_panel_text', text);\n let acceptButton = AddDiv (popupDiv, 'ov_button ov_floating_panel_button', 'Accept');\n acceptButton.addEventListener ('click', () => {\n CookieSetBoolVal ('ov_cookie_consent', true);\n popupDiv.remove ();\n });\n }\n}\n"],
"mappings": "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",
"names": []
}