From 12537cdac8ef10710f27406772d3bb43f4cd6b2d Mon Sep 17 00:00:00 2001 From: kovacsv Date: Sun, 18 Sep 2022 14:35:06 +0200 Subject: [PATCH] Enable camera mode setting during embedding. --- sandbox/embed_camera.html | 24 +++- sandbox/three_ortho.html | 4 +- source/engine/parameters/parameterlist.js | 33 +++++ source/engine/viewer/embeddedviewer.js | 11 ++ source/engine/viewer/viewer.js | 13 ++ source/website/embed.js | 4 + source/website/featureset.js | 2 +- source/website/hashhandler.js | 6 + source/website/sharingdialog.js | 17 +-- source/website/website.js | 40 ++++-- test/tests/parameterlist_test.js | 160 ++++++++++++++-------- 11 files changed, 229 insertions(+), 85 deletions(-) diff --git a/sandbox/embed_camera.html b/sandbox/embed_camera.html index f3c6685..bab1ec4 100644 --- a/sandbox/embed_camera.html +++ b/sandbox/embed_camera.html @@ -25,26 +25,38 @@ + +
+ +
+
diff --git a/sandbox/three_ortho.html b/sandbox/three_ortho.html index 6f82d7d..504c13b 100644 --- a/sandbox/three_ortho.html +++ b/sandbox/three_ortho.html @@ -90,7 +90,7 @@ orthographicCamera.position.set (eye.x, eye.y, eye.z); orthographicCamera.up.set (up.x, up.y, up.z); orthographicCamera.lookAt (center); - InitRenderer ('ortographic_canvas', orthographicCamera, width, height); + InitRenderer ('orthographic_canvas', orthographicCamera, width, height); } window.onload = function () { @@ -101,7 +101,7 @@ - + diff --git a/source/engine/parameters/parameterlist.js b/source/engine/parameters/parameterlist.js index 37290fc..89e2274 100644 --- a/source/engine/parameters/parameterlist.js +++ b/source/engine/parameters/parameterlist.js @@ -1,6 +1,7 @@ import { Coord3D } from '../geometry/coord3d.js'; import { RGBAColor, RGBColor } from '../model/color.js'; import { Camera } from '../viewer/camera.js'; +import { CameraMode } from '../viewer/viewer.js'; export let ParameterConverter = { @@ -55,6 +56,16 @@ export let ParameterConverter = return cameraParameters; }, + CameraModeToString : function (cameraMode) + { + if (cameraMode === CameraMode.Perspective) { + return 'perspective'; + } else if (cameraMode === CameraMode.Orthographic) { + return 'orthographic'; + } + return null; + }, + StringToCamera : function (str) { if (str === null || str.length === 0) { @@ -79,6 +90,16 @@ export let ParameterConverter = return camera; }, + StringToCameraMode : function (str) + { + if (str === 'perspective') { + return CameraMode.Perspective; + } else if (str === 'orthographic') { + return CameraMode.Orthographic; + } + return null; + }, + RGBColorToString : function (color) { if (color === null) { @@ -224,6 +245,12 @@ export class ParameterListBuilder return this; } + AddCameraMode (cameraMode) + { + this.AddUrlPart ('cameramode', ParameterConverter.CameraModeToString (cameraMode)); + return this; + } + AddEnvironmentSettings (envSettings) { this.AddUrlPart ('envsettings', ParameterConverter.EnvironmentSettingsToString (envSettings)); @@ -290,6 +317,12 @@ export class ParameterListParser return ParameterConverter.StringToCamera (keywordParams); } + GetCameraMode () + { + let keywordParams = this.GetKeywordParams ('cameramode'); + return ParameterConverter.StringToCameraMode (keywordParams); + } + GetEnvironmentSettings () { let environmentSettingsParams = this.GetKeywordParams ('envsettings'); diff --git a/source/engine/viewer/embeddedviewer.js b/source/engine/viewer/embeddedviewer.js index def08db..1c0c0f3 100644 --- a/source/engine/viewer/embeddedviewer.js +++ b/source/engine/viewer/embeddedviewer.js @@ -27,6 +27,10 @@ export class EmbeddedViewer let height = this.parentElement.clientHeight; this.viewer.Resize (width, height); + if (this.parameters.cameraMode) { + this.viewer.SetCameraMode (this.parameters.cameraMode); + } + if (this.parameters.backgroundColor) { this.viewer.SetBackgroundColor (this.parameters.backgroundColor); } @@ -172,6 +176,12 @@ export function Init3DViewerElements (onReady) camera = ParameterConverter.StringToCamera (cameraParams); } + let cameraMode = null; + let cameraModeParams = element.getAttribute ('cameramode'); + if (cameraModeParams) { + cameraMode = ParameterConverter.StringToCameraMode (cameraModeParams); + } + let backgroundColor = null; let backgroundColorParams = element.getAttribute ('backgroundcolor'); if (backgroundColorParams) { @@ -215,6 +225,7 @@ export function Init3DViewerElements (onReady) return Init3DViewerElement (element, modelUrls, { camera : camera, + cameraMode : cameraMode, backgroundColor : backgroundColor, defaultColor : defaultColor, edgeSettings : edgeSettings, diff --git a/source/engine/viewer/viewer.js b/source/engine/viewer/viewer.js index fa5523a..cde69fc 100644 --- a/source/engine/viewer/viewer.js +++ b/source/engine/viewer/viewer.js @@ -337,6 +337,11 @@ export class Viewer return this.navigation.GetCamera (); } + GetCameraMode () + { + return this.cameraMode; + } + SetCamera (camera) { this.navigation.SetCamera (camera); @@ -392,6 +397,14 @@ export class Viewer this.navigation.MoveCamera (newCamera, animation ? this.settings.animationSteps : 0); } + AdjustClippingPlanes () + { + let boundingSphere = this.GetBoundingSphere ((meshUserData) => { + return true; + }); + this.AdjustClippingPlanesToSphere (boundingSphere); + } + AdjustClippingPlanesToSphere (boundingSphere) { if (boundingSphere === null) { diff --git a/source/website/embed.js b/source/website/embed.js index b13f9ad..1a623a7 100644 --- a/source/website/embed.js +++ b/source/website/embed.js @@ -49,6 +49,10 @@ export class Embed ]; this.viewer.SetEnvironmentMapSettings (envMapTextures, bgIsEnvMap); + let cameraMode = this.hashHandler.GetCameraModeFromHash (); + if (cameraMode !== null) { + this.viewer.SetCameraMode (cameraMode); + } let background = this.hashHandler.GetBackgroundFromHash (); if (background !== null) { this.viewer.SetBackgroundColor (background); diff --git a/source/website/featureset.js b/source/website/featureset.js index 1590268..6b17d76 100644 --- a/source/website/featureset.js +++ b/source/website/featureset.js @@ -1,4 +1,4 @@ export const FeatureSet = { - + OrthographicView : false }; diff --git a/source/website/hashhandler.js b/source/website/hashhandler.js index fa7929c..18c1538 100644 --- a/source/website/hashhandler.js +++ b/source/website/hashhandler.js @@ -48,6 +48,12 @@ export class HashHandler return parser.GetCamera (); } + GetCameraModeFromHash () + { + let parser = CreateUrlParser (this.GetHash ()); + return parser.GetCameraMode (); + } + GetBackgroundFromHash () { let parser = CreateUrlParser (this.GetHash ()); diff --git a/source/website/sharingdialog.js b/source/website/sharingdialog.js index e0d4112..59d8bc2 100644 --- a/source/website/sharingdialog.js +++ b/source/website/sharingdialog.js @@ -7,7 +7,7 @@ import { ButtonDialog } from './dialog.js'; import { CopyToClipboard } from './utils.js'; import { HandleEvent } from './eventhandler.js'; -export function ShowSharingDialog (fileList, settings, camera) +export function ShowSharingDialog (fileList, settings, viewer) { function AddCheckboxLine (parentDiv, text, id, onChange) { @@ -55,14 +55,15 @@ export function ShowSharingDialog (fileList, settings, camera) sharingLinkInput.value = GetSharingLink (modelFiles); } - function AddEmbeddingCodeTab (parentDiv, modelFiles, settings, camera) + function AddEmbeddingCodeTab (parentDiv, modelFiles, settings, viewer) { - function GetEmbeddingCode (modelFiles, useCurrentSettings, settings, camera) + function GetEmbeddingCode (modelFiles, useCurrentSettings, settings, viewer) { let builder = CreateUrlBuilder (); builder.AddModelUrls (modelFiles); if (useCurrentSettings) { - builder.AddCamera (camera); + builder.AddCamera (viewer.GetCamera ()); + builder.AddCameraMode (viewer.GetCameraMode ()); let environmentSettings = { environmentMapName : settings.environmentMapName, backgroundIsEnvMap : settings.backgroundIsEnvMap @@ -95,14 +96,14 @@ export function ShowSharingDialog (fileList, settings, camera) let optionsSection = AddDiv (section, 'ov_dialog_section'); let embeddingCodeInput = AddCopyableTextInput (section, () => { HandleEvent ('model_shared', 'embedding_code'); - return GetEmbeddingCode (modelFiles, useCurrentSettings, settings, camera); + return GetEmbeddingCode (modelFiles, useCurrentSettings, settings, viewer); }); AddCheckboxLine (optionsSection, 'Use customized settings', 'embed_current_settings', (checked) => { useCurrentSettings = checked; - embeddingCodeInput.value = GetEmbeddingCode (modelFiles, useCurrentSettings, settings, camera); + embeddingCodeInput.value = GetEmbeddingCode (modelFiles, useCurrentSettings, settings, viewer); }); - embeddingCodeInput.value = GetEmbeddingCode (modelFiles, useCurrentSettings, settings, camera); + embeddingCodeInput.value = GetEmbeddingCode (modelFiles, useCurrentSettings, settings, viewer); } if (!fileList.IsOnlyUrlSource ()) { @@ -133,7 +134,7 @@ export function ShowSharingDialog (fileList, settings, camera) ]); AddSharingLinkTab (contentDiv, modelFiles); - AddEmbeddingCodeTab (contentDiv, modelFiles, settings, camera); + AddEmbeddingCodeTab (contentDiv, modelFiles, settings, viewer); dialog.Open (); return dialog; diff --git a/source/website/website.js b/source/website/website.js index a950657..6607ae0 100644 --- a/source/website/website.js +++ b/source/website/website.js @@ -1,7 +1,7 @@ import { GetFileExtension, TransformFileHostUrls } from '../engine/io/fileutils.js'; import { InputFilesFromFileObjects, InputFilesFromUrls } from '../engine/import/importerfiles.js'; import { ImportErrorCode, ImportSettings } from '../engine/import/importer.js'; -import { Viewer } from '../engine/viewer/viewer.js'; +import { CameraMode, Viewer } from '../engine/viewer/viewer.js'; import { AddDiv, AddDomElement, ShowDomElement, SetDomElementOuterHeight } from '../engine/viewer/domutils.js'; import { CalculatePopupPositionToScreen, ShowListPopup } from './dialogs.js'; import { HandleEvent } from './eventhandler.js'; @@ -23,6 +23,7 @@ import { CookieGetBoolVal, CookieSetBoolVal } from './cookiehandler.js'; import { ShadingType } from '../engine/threejs/threeutils.js'; import { MeasureTool } from './measuretool.js'; import { CloseAllDialogs } from './dialog.js'; +import { FeatureSet } from './featureset.js'; import * as THREE from 'three'; @@ -556,14 +557,33 @@ export class Website this.viewer.FlipUpVector (); }); AddSeparator (this.toolbar, ['only_on_model']); - AddRadioButton (this.toolbar, ['fix_up_on', 'fix_up_off'], ['Fixed up vector', 'Free orbit'], 0, ['only_on_model'], (buttonIndex) => { - if (buttonIndex === 0) { - this.viewer.SetFixUpVector (true); - } else if (buttonIndex === 1) { - this.viewer.SetFixUpVector (false); - } - }); - AddSeparator (this.toolbar, ['only_full_width', 'only_on_model']); + if (FeatureSet.OrthographicView) { + AddRadioButton (this.toolbar, ['fix_up_on', 'fix_up_off'], ['Perspective camera', 'Orthographic camera'], 0, ['only_on_model'], (buttonIndex) => { + if (buttonIndex === 0) { + this.viewer.SetCameraMode (CameraMode.Perspective); + } else if (buttonIndex === 1) { + this.viewer.SetCameraMode (CameraMode.Orthographic); + } + }); + AddSeparator (this.toolbar, ['only_full_width', 'only_on_model']); + AddRadioButton (this.toolbar, ['fix_up_on', 'fix_up_off'], ['Fixed up vector', 'Free orbit'], 0, ['only_full_width', 'only_on_model'], (buttonIndex) => { + if (buttonIndex === 0) { + this.viewer.SetFixUpVector (true); + } else if (buttonIndex === 1) { + this.viewer.SetFixUpVector (false); + } + }); + AddSeparator (this.toolbar, ['only_full_width', 'only_on_model']); + } else { + AddRadioButton (this.toolbar, ['fix_up_on', 'fix_up_off'], ['Fixed up vector', 'Free orbit'], 0, ['only_on_model'], (buttonIndex) => { + if (buttonIndex === 0) { + this.viewer.SetFixUpVector (true); + } else if (buttonIndex === 1) { + this.viewer.SetFixUpVector (false); + } + }); + AddSeparator (this.toolbar, ['only_full_width', 'only_on_model']); + } let measureToolButton = AddPushButton (this.toolbar, 'measure', 'Measure', ['only_full_width', 'only_on_model'], (isSelected) => { HandleEvent ('measure_tool_activated', isSelected ? 'on' : 'off'); this.navigator.SetSelection (null); @@ -582,7 +602,7 @@ export class Website }); }); AddButton (this.toolbar, 'share', 'Share model', ['only_full_width', 'only_on_model'], () => { - ShowSharingDialog (importer.GetFileList (), this.settings, this.viewer.GetCamera ()); + ShowSharingDialog (importer.GetFileList (), this.settings, this.viewer); }); this.parameters.fileInput.addEventListener ('change', (ev) => { diff --git a/test/tests/parameterlist_test.js b/test/tests/parameterlist_test.js index 416e39d..eb67dc9 100644 --- a/test/tests/parameterlist_test.js +++ b/test/tests/parameterlist_test.js @@ -15,22 +15,42 @@ describe ('Parameter List', function () { ); let background = new OV.RGBAColor (4, 5, 6, 7); let color = new OV.RGBColor (1, 2, 3); - let urlParams1 = OV.CreateUrlBuilder ().AddModelUrls (modelUrls).GetParameterList (); - let urlParams2 = OV.CreateUrlBuilder ().AddCamera (camera).GetParameterList (); - let urlParams3 = OV.CreateUrlBuilder ().AddModelUrls (modelUrls).AddCamera (camera).GetParameterList (); - let urlParams4 = OV.CreateUrlBuilder ().AddModelUrls (modelUrls).AddCamera (camera).AddDefaultColor (color).GetParameterList (); - let urlParams5 = OV.CreateUrlBuilder ().AddModelUrls (modelUrls).AddCamera (camera).AddBackgroundColor (background).AddDefaultColor (color).GetParameterList (); - let urlParams6 = OV.CreateUrlBuilder ().AddEdgeSettings ({ - showEdges : true, - edgeColor : new OV.RGBColor (1, 2, 3), - edgeThreshold : 15 - }).GetParameterList (); - assert.strictEqual (urlParams1, 'model=a.txt,b.txt'); - assert.strictEqual (urlParams2, 'camera=1.00000,1.00000,1.00000,0.00000,0.00000,0.00000,0.00000,0.00000,1.00000,45.00000'); - assert.strictEqual (urlParams3, 'model=a.txt,b.txt$camera=1.00000,1.00000,1.00000,0.00000,0.00000,0.00000,0.00000,0.00000,1.00000,45.00000'); - assert.strictEqual (urlParams4, 'model=a.txt,b.txt$camera=1.00000,1.00000,1.00000,0.00000,0.00000,0.00000,0.00000,0.00000,1.00000,45.00000$defaultcolor=1,2,3'); - assert.strictEqual (urlParams5, 'model=a.txt,b.txt$camera=1.00000,1.00000,1.00000,0.00000,0.00000,0.00000,0.00000,0.00000,1.00000,45.00000$backgroundcolor=4,5,6,7$defaultcolor=1,2,3'); - assert.strictEqual (urlParams6, 'edgesettings=on,1,2,3,15'); + { + let urlParams = OV.CreateUrlBuilder ().AddModelUrls (modelUrls).GetParameterList (); + assert.strictEqual (urlParams, 'model=a.txt,b.txt'); + } + { + let urlParams = OV.CreateUrlBuilder ().AddCamera (camera).GetParameterList (); + assert.strictEqual (urlParams, 'camera=1.00000,1.00000,1.00000,0.00000,0.00000,0.00000,0.00000,0.00000,1.00000,45.00000'); + } + { + let urlParams = OV.CreateUrlBuilder ().AddModelUrls (modelUrls).AddCamera (camera).GetParameterList (); + assert.strictEqual (urlParams, 'model=a.txt,b.txt$camera=1.00000,1.00000,1.00000,0.00000,0.00000,0.00000,0.00000,0.00000,1.00000,45.00000'); + } + { + let urlParams = OV.CreateUrlBuilder ().AddModelUrls (modelUrls).AddCamera (camera).AddDefaultColor (color).GetParameterList (); + assert.strictEqual (urlParams, 'model=a.txt,b.txt$camera=1.00000,1.00000,1.00000,0.00000,0.00000,0.00000,0.00000,0.00000,1.00000,45.00000$defaultcolor=1,2,3'); + } + { + let urlParams = OV.CreateUrlBuilder ().AddModelUrls (modelUrls).AddCamera (camera).AddBackgroundColor (background).AddDefaultColor (color).GetParameterList (); + assert.strictEqual (urlParams, 'model=a.txt,b.txt$camera=1.00000,1.00000,1.00000,0.00000,0.00000,0.00000,0.00000,0.00000,1.00000,45.00000$backgroundcolor=4,5,6,7$defaultcolor=1,2,3'); + } + { + let urlParams = OV.CreateUrlBuilder ().AddEdgeSettings ({ + showEdges : true, + edgeColor : new OV.RGBColor (1, 2, 3), + edgeThreshold : 15 + }).GetParameterList (); + assert.strictEqual (urlParams, 'edgesettings=on,1,2,3,15'); + } + { + let urlParams = OV.CreateUrlBuilder ().AddCameraMode (OV.CameraMode.Perspective).GetParameterList (); + assert.strictEqual (urlParams, 'cameramode=perspective'); + } + { + let urlParams = OV.CreateUrlBuilder ().AddCameraMode (OV.CameraMode.Orthographic).GetParameterList (); + assert.strictEqual (urlParams, 'cameramode=orthographic'); + } }); it ('Parameter list parser', function () { @@ -43,48 +63,72 @@ describe ('Parameter List', function () { ); let background = new OV.RGBAColor (4, 5, 6, 7); let color = new OV.RGBColor (1, 2, 3); - let urlParamsLegacy = 'a.txt,b.txt'; - let urlParams1 = 'model=a.txt,b.txt'; - let urlParams2 = 'camera=1.0000,1.0000,1.0000,0.0000,0.0000,0.0000,0.0000,0.0000,1.0000'; - let urlParams2b = 'camera=1.0000,1.0000,1.0000,0.0000,0.0000,0.0000,0.0000,0.0000,1.0000,60.0000'; - let urlParams3 = 'model=a.txt,b.txt$camera=1.0000,1.0000,1.0000,0.0000,0.0000,0.0000,0.0000,0.0000,1.0000'; - let urlParams4 = 'model=a.txt,b.txt$camera=1.0000,1.0000,1.0000,0.0000,0.0000,0.0000,0.0000,0.0000,1.0000$defaultcolor=1,2,3'; - let urlParams5 = 'model=a.txt,b.txt$camera=1.0000,1.0000,1.0000,0.0000,0.0000,0.0000,0.0000,0.0000,1.0000$backgroundcolor=4,5,6,7$defaultcolor=1,2,3'; - let urlParams6 = 'edgesettings=on,1,2,3,15'; - let parserLegacy = OV.CreateUrlParser (urlParamsLegacy); - assert.deepStrictEqual (parserLegacy.GetModelUrls (), modelUrls); - assert.deepStrictEqual (parserLegacy.GetCamera (), null); - let parser1 = OV.CreateUrlParser (urlParams1); - assert.deepStrictEqual (parser1.GetModelUrls (), modelUrls); - assert.deepStrictEqual (parser1.GetCamera (), null); - assert.deepStrictEqual (parser1.GetDefaultColor (), null); - let parser2 = OV.CreateUrlParser (urlParams2); - assert.deepStrictEqual (parser2.GetModelUrls (), null); - assert.deepStrictEqual (parser2.GetCamera (), camera); - assert.deepStrictEqual (parser2.GetDefaultColor (), null); - let parser2b = OV.CreateUrlParser (urlParams2b); - assert.deepStrictEqual (parser2b.GetModelUrls (), null); - assert.deepStrictEqual (parser2b.GetCamera (), new OV.Camera (new OV.Coord3D (1.0, 1.0, 1.0), new OV.Coord3D (0.0, 0.0, 0.0), new OV.Coord3D (0.0, 0.0, 1.0), 60.0)); - assert.deepStrictEqual (parser2b.GetDefaultColor (), null); - let parser3 = OV.CreateUrlParser (urlParams3); - assert.deepStrictEqual (parser3.GetModelUrls (), modelUrls); - assert.deepStrictEqual (parser3.GetCamera (), camera); - assert.deepStrictEqual (parser3.GetDefaultColor (), null); - let parser4 = OV.CreateUrlParser (urlParams4); - assert.deepStrictEqual (parser4.GetModelUrls (), modelUrls); - assert.deepStrictEqual (parser4.GetCamera (), camera); - assert.deepStrictEqual (parser4.GetDefaultColor (), color); - let parser5 = OV.CreateUrlParser (urlParams5); - assert.deepStrictEqual (parser5.GetModelUrls (), modelUrls); - assert.deepStrictEqual (parser5.GetCamera (), camera); - assert.deepStrictEqual (parser5.GetDefaultColor (), color); - assert.deepStrictEqual (parser5.GetBackgroundColor (), background); - let parser6 = OV.CreateUrlParser (urlParams6); - assert.deepStrictEqual (parser6.GetEdgeSettings (), { - showEdges : true, - edgeColor : new OV.RGBColor (1, 2, 3), - edgeThreshold : 15 - }); + + { + let parser = OV.CreateUrlParser ('a.txt,b.txt'); + assert.deepStrictEqual (parser.GetModelUrls (), modelUrls); + assert.deepStrictEqual (parser.GetCamera (), null); + } + + { + let parser = OV.CreateUrlParser ('model=a.txt,b.txt'); + assert.deepStrictEqual (parser.GetModelUrls (), modelUrls); + assert.deepStrictEqual (parser.GetCamera (), null); + assert.deepStrictEqual (parser.GetDefaultColor (), null); + } + + { + let parser = OV.CreateUrlParser ('camera=1.0000,1.0000,1.0000,0.0000,0.0000,0.0000,0.0000,0.0000,1.0000'); + assert.deepStrictEqual (parser.GetModelUrls (), null); + assert.deepStrictEqual (parser.GetCamera (), camera); + assert.deepStrictEqual (parser.GetDefaultColor (), null); + } + + { + let parser = OV.CreateUrlParser ('camera=1.0000,1.0000,1.0000,0.0000,0.0000,0.0000,0.0000,0.0000,1.0000,60.0000'); + assert.deepStrictEqual (parser.GetModelUrls (), null); + assert.deepStrictEqual (parser.GetCamera (), new OV.Camera (new OV.Coord3D (1.0, 1.0, 1.0), new OV.Coord3D (0.0, 0.0, 0.0), new OV.Coord3D (0.0, 0.0, 1.0), 60.0)); + assert.deepStrictEqual (parser.GetDefaultColor (), null); + } + + { + let parser = OV.CreateUrlParser ('model=a.txt,b.txt$camera=1.0000,1.0000,1.0000,0.0000,0.0000,0.0000,0.0000,0.0000,1.0000'); + assert.deepStrictEqual (parser.GetModelUrls (), modelUrls); + assert.deepStrictEqual (parser.GetCamera (), camera); + assert.deepStrictEqual (parser.GetDefaultColor (), null); + } + + { + let parser = OV.CreateUrlParser ('model=a.txt,b.txt$camera=1.0000,1.0000,1.0000,0.0000,0.0000,0.0000,0.0000,0.0000,1.0000$defaultcolor=1,2,3'); + assert.deepStrictEqual (parser.GetModelUrls (), modelUrls); + assert.deepStrictEqual (parser.GetCamera (), camera); + assert.deepStrictEqual (parser.GetDefaultColor (), color); + } + + { + let parser = OV.CreateUrlParser ('model=a.txt,b.txt$camera=1.0000,1.0000,1.0000,0.0000,0.0000,0.0000,0.0000,0.0000,1.0000$backgroundcolor=4,5,6,7$defaultcolor=1,2,3'); + assert.deepStrictEqual (parser.GetModelUrls (), modelUrls); + assert.deepStrictEqual (parser.GetCamera (), camera); + assert.deepStrictEqual (parser.GetDefaultColor (), color); + assert.deepStrictEqual (parser.GetBackgroundColor (), background); + } + + { + let parser = OV.CreateUrlParser ('edgesettings=on,1,2,3,15'); + assert.deepStrictEqual (parser.GetEdgeSettings (), { + showEdges : true, + edgeColor : new OV.RGBColor (1, 2, 3), + edgeThreshold : 15 + }); + } + { + let parser = OV.CreateUrlParser ('cameramode=perspective'); + assert.deepStrictEqual (parser.GetCameraMode (), OV.CameraMode.Perspective); + } + { + let parser = OV.CreateUrlParser ('cameramode=orthographic'); + assert.deepStrictEqual (parser.GetCameraMode (), OV.CameraMode.Orthographic); + } }); });