diff --git a/sandbox/embed_selfhost_calculate.html b/sandbox/embed_selfhost_calculate.html index 9bfc823..4873c7b 100644 --- a/sandbox/embed_selfhost_calculate.html +++ b/sandbox/embed_selfhost_calculate.html @@ -63,7 +63,7 @@ }); // load a model providing model urls - viewer.LoadModelFromUrls ([ + viewer.LoadModelFromUrlList ([ '../../test/testfiles/obj/hundred_cubes.obj', '../../test/testfiles/obj/hundred_cubes.mtl' ]); diff --git a/sandbox/embed_selfhost_code_url.html b/sandbox/embed_selfhost_code_url.html index eb58a15..00c019b 100644 --- a/sandbox/embed_selfhost_code_url.html +++ b/sandbox/embed_selfhost_code_url.html @@ -52,7 +52,7 @@ }); // load a model providing model urls - viewer.LoadModelFromUrls ([ + viewer.LoadModelFromUrlList ([ '../../test/testfiles/gltf/DamagedHelmet/glTF-Binary/DamagedHelmet.glb' ]); }); diff --git a/sandbox/embed_selfhost_noextension.html b/sandbox/embed_selfhost_noextension.html new file mode 100644 index 0000000..f35bf41 --- /dev/null +++ b/sandbox/embed_selfhost_noextension.html @@ -0,0 +1,51 @@ + + + + + + + + Online 3D Viewer + + + + + + + + + +
+
+ + + diff --git a/source/engine/import/filelist.js b/source/engine/import/filelist.js index 82f6e19..1c4525a 100644 --- a/source/engine/import/filelist.js +++ b/source/engine/import/filelist.js @@ -1,27 +1,44 @@ import { RunTasks } from '../core/taskrunner.js'; import { FileFormat, FileSource, GetFileExtension, GetFileName, ReadFile, RequestUrl } from '../io/fileutils.js'; -export class File +export class InputFile { - constructor (file, source) + constructor (name, source, data) { + this.name = name; this.source = source; - if (source === FileSource.Url) { - this.fileUrl = file; - this.fileObject = null; - this.name = GetFileName (file); - this.extension = GetFileExtension (file); - } else if (source === FileSource.File) { - this.fileUrl = null; - this.fileObject = file; - this.name = GetFileName (file.name); - this.extension = GetFileExtension (file.name); - } else if (source === FileSource.Decompressed) { - this.fileUrl = null; - this.fileObject = null; - this.name = GetFileName (file); - this.extension = GetFileExtension (file); - } + this.data = data; + } +} + +export function InputFilesFromUrls (urls) +{ + let inputFiles = []; + for (let url of urls) { + let fileName = GetFileName (url); + inputFiles.push (new InputFile (fileName, FileSource.Url, url)); + } + return inputFiles; +} + +export function InputFilesFromFileObjects (fileObjects) +{ + let inputFiles = []; + for (let fileObject of fileObjects) { + let fileName = GetFileName (fileObject.name); + inputFiles.push (new InputFile (fileName, FileSource.File, fileObject)); + } + return inputFiles; +} + +export class ImporterFile +{ + constructor (name, source, data) + { + this.name = GetFileName (name); + this.extension = GetFileExtension (name); + this.source = source; + this.data = data; this.content = null; } @@ -31,25 +48,25 @@ export class File } } -export class FileList +export class ImporterFileList { constructor () { this.files = []; } - FillFromFileUrls (fileList) + FillFromInputFiles (inputFiles) { - this.Fill (fileList, FileSource.Url); + this.files = []; + for (let inputFile of inputFiles) { + let file = new ImporterFile (inputFile.name, inputFile.source, inputFile.data); + this.files.push (file); + } } - FillFromFileObjects (fileList) - { - this.Fill (fileList, FileSource.File); - } - - ExtendFromFileList (files) + ExtendFromFileList (fileList) { + let files = fileList.GetFiles (); for (let i = 0; i < files.length; i++) { let file = files[i]; if (!this.ContainsFileByPath (file.name)) { @@ -104,16 +121,6 @@ export class FileList return true; } - Fill (fileList, fileSource) - { - this.files = []; - for (let fileIndex = 0; fileIndex < fileList.length; fileIndex++) { - let fileObject = fileList[fileIndex]; - let file = new File (fileObject, fileSource); - this.AddFile (file); - } - } - AddFile (file) { this.files.push (file); @@ -127,9 +134,9 @@ export class FileList } let loaderPromise = null; if (file.source === FileSource.Url) { - loaderPromise = RequestUrl (file.fileUrl, FileFormat.Binary); + loaderPromise = RequestUrl (file.data, FileFormat.Binary); } else if (file.source === FileSource.File) { - loaderPromise = ReadFile (file.fileObject, FileFormat.Binary); + loaderPromise = ReadFile (file.data, FileFormat.Binary); } else { complete (); return; diff --git a/source/engine/import/importer.js b/source/engine/import/importer.js index bcb79eb..4d5099c 100644 --- a/source/engine/import/importer.js +++ b/source/engine/import/importer.js @@ -1,7 +1,7 @@ import { RunTaskAsync } from '../core/taskrunner.js'; import { FileSource, GetFileName } from '../io/fileutils.js'; import { Color } from '../model/color.js'; -import { File, FileList } from './filelist.js'; +import { ImporterFile, ImporterFileList } from './filelist.js'; import { Importer3dm } from './importer3dm.js'; import { Importer3ds } from './importer3ds.js'; import { ImporterGltf } from './importergltf.js'; @@ -96,7 +96,7 @@ export class Importer new ImporterThreeWrl (), new ImporterThree3mf () ]; - this.fileList = new FileList (); + this.fileList = new ImporterFileList (); this.model = null; this.usedFiles = []; this.missingFiles = []; @@ -107,9 +107,9 @@ export class Importer this.importers.push (importer); } - ImportFiles (fileList, fileSource, settings, callbacks) + ImportFiles (inputFiles, settings, callbacks) { - this.LoadFiles (fileList, fileSource, () => { + this.LoadFiles (inputFiles, () => { callbacks.onFilesLoaded (); RunTaskAsync (() => { this.ImportLoadedFiles (settings, callbacks); @@ -117,14 +117,11 @@ export class Importer }); } - LoadFiles (fileList, fileSource, onReady) + LoadFiles (inputFiles, onReady) { - let newFileList = new FileList (); - if (fileSource === FileSource.Url) { - newFileList.FillFromFileUrls (fileList); - } else if (fileSource === FileSource.File) { - newFileList.FillFromFileObjects (fileList); - } + let newFileList = new ImporterFileList (); + newFileList.FillFromInputFiles (inputFiles); + let reset = false; if (this.HasImportableFile (newFileList)) { reset = true; @@ -139,8 +136,7 @@ export class Importer if (!foundMissingFile) { reset = true; } else { - let newFiles = newFileList.GetFiles (); - this.fileList.ExtendFromFileList (newFiles); + this.fileList.ExtendFromFileList (newFileList); reset = false; } } @@ -258,7 +254,7 @@ export class Importer const decompressed = fflate.unzipSync (archiveBuffer); for (const fileName in decompressed) { if (Object.prototype.hasOwnProperty.call (decompressed, fileName)) { - let file = new File (fileName, FileSource.Decompressed); + let file = new ImporterFile (fileName, FileSource.Decompressed, null); file.SetContent (decompressed[fileName].buffer); fileList.AddFile (file); } diff --git a/source/engine/main.js b/source/engine/main.js index d5639f7..778524b 100644 --- a/source/engine/main.js +++ b/source/engine/main.js @@ -20,7 +20,7 @@ import { OctreeNode, Octree } from './geometry/octree.js'; import { Quaternion, QuaternionIsEqual, ArrayToQuaternion, QuaternionFromAxisAngle, QuaternionFromXYZ } from './geometry/quaternion.js'; import { Transformation, TransformationIsEqual } from './geometry/transformation.js'; import { BezierTweenFunction, LinearTweenFunction, ParabolicTweenFunction, TweenCoord3D } from './geometry/tween.js'; -import { File, FileList } from './import/filelist.js'; +import { InputFile, ImporterFile, ImporterFileList, InputFilesFromUrls, InputFilesFromFileObjects } from './import/filelist.js'; import { ImportSettings, ImportError, ImportResult, ImporterFileAccessor, Importer, ImportErrorCode } from './import/importer.js'; import { Importer3dm } from './import/importer3dm.js'; import { Importer3ds } from './import/importer3ds.js'; @@ -140,8 +140,11 @@ export { LinearTweenFunction, ParabolicTweenFunction, TweenCoord3D, - File, - FileList, + InputFile, + ImporterFile, + ImporterFileList, + InputFilesFromUrls, + InputFilesFromFileObjects, ImportSettings, ImportError, ImportResult, diff --git a/source/engine/threejs/threemodelloader.js b/source/engine/threejs/threemodelloader.js index c8aa560..75a7d0a 100644 --- a/source/engine/threejs/threemodelloader.js +++ b/source/engine/threejs/threemodelloader.js @@ -22,7 +22,7 @@ export class ThreeModelLoader return this.inProgress; } - LoadModel (files, fileSource, settings, callbacks) + LoadModel (inputFiles, settings, callbacks) { if (this.inProgress) { return; @@ -31,7 +31,7 @@ export class ThreeModelLoader this.inProgress = true; callbacks.onLoadStart (); this.RevokeObjectUrls (); - this.importer.ImportFiles (files, fileSource, settings, { + this.importer.ImportFiles (inputFiles, settings, { onFilesLoaded : () => { callbacks.onImportStart (); }, diff --git a/source/engine/viewer/embeddedviewer.js b/source/engine/viewer/embeddedviewer.js index 71ab1e0..28c32d7 100644 --- a/source/engine/viewer/embeddedviewer.js +++ b/source/engine/viewer/embeddedviewer.js @@ -1,7 +1,8 @@ import { IsDefined } from '../core/core.js'; import { Direction } from '../geometry/geometry.js'; +import { InputFilesFromFileObjects, InputFilesFromUrls } from '../import/filelist.js'; import { ImportErrorCode, ImportSettings } from '../import/importer.js'; -import { FileSource, TransformFileHostUrls } from '../io/fileutils.js'; +import { TransformFileHostUrls } from '../io/fileutils.js'; import { ParameterConverter } from '../parameters/parameterlist.js'; import { ThreeModelLoader } from '../threejs/threemodelloader.js'; import { Viewer } from './viewer.js'; @@ -51,20 +52,22 @@ export class EmbeddedViewer }); } - LoadModelFromUrls (modelUrls) + LoadModelFromUrlList (modelUrls) { TransformFileHostUrls (modelUrls); - this.LoadModelInternal (modelUrls, FileSource.Url); + let inputFiles = InputFilesFromUrls (modelUrls); + this.LoadModelFromInputFiles (inputFiles); } LoadModelFromFileList (fileList) { - this.LoadModelInternal (fileList, FileSource.File); + let inputFiles = InputFilesFromFileObjects (fileList); + this.LoadModelFromInputFiles (inputFiles); } - LoadModelInternal (fileList, fileSource) + LoadModelFromInputFiles (inputFiles) { - if (fileList === null || fileList.length === 0) { + if (inputFiles === null || inputFiles.length === 0) { return null; } @@ -77,7 +80,7 @@ export class EmbeddedViewer this.model = null; let progressDiv = null; let loader = new ThreeModelLoader (); - loader.LoadModel (fileList, fileSource, settings, { + loader.LoadModel (inputFiles, settings, { onLoadStart : () => { this.canvas.style.display = 'none'; progressDiv = document.createElement ('div'); @@ -151,7 +154,7 @@ export class EmbeddedViewer export function Init3DViewerElement (parentElement, modelUrls, parameters) { let viewer = new EmbeddedViewer (parentElement, parameters); - viewer.LoadModelFromUrls (modelUrls); + viewer.LoadModelFromUrlList (modelUrls); return viewer; } diff --git a/source/website/embed.js b/source/website/embed.js index e22f52e..91c034b 100644 --- a/source/website/embed.js +++ b/source/website/embed.js @@ -1,5 +1,5 @@ import { CreateModelUrlParameters } from '../engine/parameters/parameterlist.js'; -import { FileSource, TransformFileHostUrls } from '../engine/io/fileutils.js'; +import { TransformFileHostUrls } from '../engine/io/fileutils.js'; import { ImportSettings } from '../engine/import/importer.js'; import { AddDomElement } from '../engine/viewer/domutils.js'; import { Viewer } from '../engine/viewer/viewer.js'; @@ -7,6 +7,7 @@ import { HashHandler } from './hashhandler.js'; import { ThreeModelLoaderUI } from './threemodelloaderui.js'; import { Direction } from '../engine/geometry/geometry.js'; import { HandleEvent } from './eventhandler.js'; +import { InputFilesFromUrls } from '../engine/import/filelist.js'; export class Embed { @@ -66,7 +67,8 @@ export class Embed if (defaultColor !== null) { settings.defaultColor = defaultColor; } - this.modelLoaderUI.LoadModel (urls, FileSource.Url, settings, { + let inputFiles = InputFilesFromUrls (urls); + this.modelLoaderUI.LoadModel (inputFiles, settings, { onStart : () => { diff --git a/source/website/sharingdialog.js b/source/website/sharingdialog.js index 4e539f1..e0d4112 100644 --- a/source/website/sharingdialog.js +++ b/source/website/sharingdialog.js @@ -118,7 +118,7 @@ export function ShowSharingDialog (fileList, settings, camera) for (let fileIndex = 0; fileIndex < files.length; fileIndex++) { let file = files[fileIndex]; if (file.source === FileSource.Url) { - modelFiles.push (file.fileUrl); + modelFiles.push (file.data); } } diff --git a/source/website/threemodelloaderui.js b/source/website/threemodelloaderui.js index 1005151..b960e61 100644 --- a/source/website/threemodelloaderui.js +++ b/source/website/threemodelloaderui.js @@ -13,14 +13,14 @@ export class ThreeModelLoaderUI this.modalDialog = null; } - LoadModel (files, fileSource, settings, callbacks) + LoadModel (inputFiles, settings, callbacks) { if (this.modelLoader.InProgress ()) { return; } let progressDialog = null; - this.modelLoader.LoadModel (files, fileSource, settings, { + this.modelLoader.LoadModel (inputFiles, settings, { onLoadStart : () => { this.CloseDialogIfOpen (); callbacks.onStart (); diff --git a/source/website/website.js b/source/website/website.js index 78d2346..4e76ca2 100644 --- a/source/website/website.js +++ b/source/website/website.js @@ -1,4 +1,5 @@ -import { FileSource, GetFileExtension, TransformFileHostUrls } from '../engine/io/fileutils.js'; +import { GetFileExtension, TransformFileHostUrls } from '../engine/io/fileutils.js'; +import { InputFilesFromFileObjects, InputFilesFromUrls } from '../engine/import/filelist.js'; import { ImportErrorCode, ImportSettings } from '../engine/import/importer.js'; import { Viewer } from '../engine/viewer/viewer.js'; import { AddDiv, AddDomElement, ShowDomElement, SetDomElementOuterHeight } from '../engine/viewer/domutils.js'; @@ -358,7 +359,8 @@ export class Website LoadModelFromUrlList (urls, settings) { - this.LoadModel (urls, FileSource.Url, settings); + let inputFiles = InputFilesFromUrls (urls); + this.LoadModelFromInputFiles (inputFiles, settings); this.ClearHashIfNotOnlyUrlList (); } @@ -366,13 +368,14 @@ export class Website { let importSettings = new ImportSettings (); importSettings.defaultColor = this.settings.defaultColor; - this.LoadModel (files, FileSource.File, importSettings); + let inputFiles = InputFilesFromFileObjects (files); + this.LoadModelFromInputFiles (inputFiles, importSettings); this.ClearHashIfNotOnlyUrlList (); } - LoadModel (files, fileSource, settings) + LoadModelFromInputFiles (files, settings) { - this.modelLoaderUI.LoadModel (files, fileSource, settings, { + this.modelLoaderUI.LoadModel (files, settings, { onStart : () => { this.SetUIState (WebsiteUIState.Loading); diff --git a/test/testfiles/obj/hundred_cubes_noext_mtl b/test/testfiles/obj/hundred_cubes_noext_mtl new file mode 100644 index 0000000..cd2c541 --- /dev/null +++ b/test/testfiles/obj/hundred_cubes_noext_mtl @@ -0,0 +1,14 @@ +newmtl Red +Ka 0.000000 0.000000 0.000000 +Kd 0.800000 0.200000 0.200000 +Ks 0.500000 0.500000 0.500000 + +newmtl Green +Ka 0.000000 0.000000 0.000000 +Kd 0.152940 0.607840 0.380390 +Ks 0.500000 0.500000 0.500000 + +newmtl Blue +Ka 0.000000 0.000000 0.000000 +Kd 0.000000 0.541180 0.721570 +Ks 0.500000 0.500000 0.500000 diff --git a/test/testfiles/obj/hundred_cubes_noext_obj b/test/testfiles/obj/hundred_cubes_noext_obj new file mode 100644 index 0000000..2061de5 --- /dev/null +++ b/test/testfiles/obj/hundred_cubes_noext_obj @@ -0,0 +1,1603 @@ +mtllib hundred_cubes.mtl + +v 0.0 0.0 0.0 +v 1.0 0.0 0.0 +v 1.0 1.0 0.0 +v 0.0 1.0 0.0 +v 0.0 0.0 1.0 +v 1.0 0.0 1.0 +v 1.0 1.0 1.0 +v 0.0 1.0 1.0 +v 0.0 2.0 0.0 +v 1.0 2.0 0.0 +v 1.0 3.0 0.0 +v 0.0 3.0 0.0 +v 0.0 2.0 1.0 +v 1.0 2.0 1.0 +v 1.0 3.0 1.0 +v 0.0 3.0 1.0 +v 0.0 4.0 0.0 +v 1.0 4.0 0.0 +v 1.0 5.0 0.0 +v 0.0 5.0 0.0 +v 0.0 4.0 1.0 +v 1.0 4.0 1.0 +v 1.0 5.0 1.0 +v 0.0 5.0 1.0 +v 0.0 6.0 0.0 +v 1.0 6.0 0.0 +v 1.0 7.0 0.0 +v 0.0 7.0 0.0 +v 0.0 6.0 1.0 +v 1.0 6.0 1.0 +v 1.0 7.0 1.0 +v 0.0 7.0 1.0 +v 0.0 8.0 0.0 +v 1.0 8.0 0.0 +v 1.0 9.0 0.0 +v 0.0 9.0 0.0 +v 0.0 8.0 1.0 +v 1.0 8.0 1.0 +v 1.0 9.0 1.0 +v 0.0 9.0 1.0 +v 0.0 10.0 0.0 +v 1.0 10.0 0.0 +v 1.0 11.0 0.0 +v 0.0 11.0 0.0 +v 0.0 10.0 1.0 +v 1.0 10.0 1.0 +v 1.0 11.0 1.0 +v 0.0 11.0 1.0 +v 0.0 12.0 0.0 +v 1.0 12.0 0.0 +v 1.0 13.0 0.0 +v 0.0 13.0 0.0 +v 0.0 12.0 1.0 +v 1.0 12.0 1.0 +v 1.0 13.0 1.0 +v 0.0 13.0 1.0 +v 0.0 14.0 0.0 +v 1.0 14.0 0.0 +v 1.0 15.0 0.0 +v 0.0 15.0 0.0 +v 0.0 14.0 1.0 +v 1.0 14.0 1.0 +v 1.0 15.0 1.0 +v 0.0 15.0 1.0 +v 0.0 16.0 0.0 +v 1.0 16.0 0.0 +v 1.0 17.0 0.0 +v 0.0 17.0 0.0 +v 0.0 16.0 1.0 +v 1.0 16.0 1.0 +v 1.0 17.0 1.0 +v 0.0 17.0 1.0 +v 0.0 18.0 0.0 +v 1.0 18.0 0.0 +v 1.0 19.0 0.0 +v 0.0 19.0 0.0 +v 0.0 18.0 1.0 +v 1.0 18.0 1.0 +v 1.0 19.0 1.0 +v 0.0 19.0 1.0 +v 2.0 0.0 0.0 +v 3.0 0.0 0.0 +v 3.0 1.0 0.0 +v 2.0 1.0 0.0 +v 2.0 0.0 1.0 +v 3.0 0.0 1.0 +v 3.0 1.0 1.0 +v 2.0 1.0 1.0 +v 2.0 2.0 0.0 +v 3.0 2.0 0.0 +v 3.0 3.0 0.0 +v 2.0 3.0 0.0 +v 2.0 2.0 1.0 +v 3.0 2.0 1.0 +v 3.0 3.0 1.0 +v 2.0 3.0 1.0 +v 2.0 4.0 0.0 +v 3.0 4.0 0.0 +v 3.0 5.0 0.0 +v 2.0 5.0 0.0 +v 2.0 4.0 1.0 +v 3.0 4.0 1.0 +v 3.0 5.0 1.0 +v 2.0 5.0 1.0 +v 2.0 6.0 0.0 +v 3.0 6.0 0.0 +v 3.0 7.0 0.0 +v 2.0 7.0 0.0 +v 2.0 6.0 1.0 +v 3.0 6.0 1.0 +v 3.0 7.0 1.0 +v 2.0 7.0 1.0 +v 2.0 8.0 0.0 +v 3.0 8.0 0.0 +v 3.0 9.0 0.0 +v 2.0 9.0 0.0 +v 2.0 8.0 1.0 +v 3.0 8.0 1.0 +v 3.0 9.0 1.0 +v 2.0 9.0 1.0 +v 2.0 10.0 0.0 +v 3.0 10.0 0.0 +v 3.0 11.0 0.0 +v 2.0 11.0 0.0 +v 2.0 10.0 1.0 +v 3.0 10.0 1.0 +v 3.0 11.0 1.0 +v 2.0 11.0 1.0 +v 2.0 12.0 0.0 +v 3.0 12.0 0.0 +v 3.0 13.0 0.0 +v 2.0 13.0 0.0 +v 2.0 12.0 1.0 +v 3.0 12.0 1.0 +v 3.0 13.0 1.0 +v 2.0 13.0 1.0 +v 2.0 14.0 0.0 +v 3.0 14.0 0.0 +v 3.0 15.0 0.0 +v 2.0 15.0 0.0 +v 2.0 14.0 1.0 +v 3.0 14.0 1.0 +v 3.0 15.0 1.0 +v 2.0 15.0 1.0 +v 2.0 16.0 0.0 +v 3.0 16.0 0.0 +v 3.0 17.0 0.0 +v 2.0 17.0 0.0 +v 2.0 16.0 1.0 +v 3.0 16.0 1.0 +v 3.0 17.0 1.0 +v 2.0 17.0 1.0 +v 2.0 18.0 0.0 +v 3.0 18.0 0.0 +v 3.0 19.0 0.0 +v 2.0 19.0 0.0 +v 2.0 18.0 1.0 +v 3.0 18.0 1.0 +v 3.0 19.0 1.0 +v 2.0 19.0 1.0 +v 4.0 0.0 0.0 +v 5.0 0.0 0.0 +v 5.0 1.0 0.0 +v 4.0 1.0 0.0 +v 4.0 0.0 1.0 +v 5.0 0.0 1.0 +v 5.0 1.0 1.0 +v 4.0 1.0 1.0 +v 4.0 2.0 0.0 +v 5.0 2.0 0.0 +v 5.0 3.0 0.0 +v 4.0 3.0 0.0 +v 4.0 2.0 1.0 +v 5.0 2.0 1.0 +v 5.0 3.0 1.0 +v 4.0 3.0 1.0 +v 4.0 4.0 0.0 +v 5.0 4.0 0.0 +v 5.0 5.0 0.0 +v 4.0 5.0 0.0 +v 4.0 4.0 1.0 +v 5.0 4.0 1.0 +v 5.0 5.0 1.0 +v 4.0 5.0 1.0 +v 4.0 6.0 0.0 +v 5.0 6.0 0.0 +v 5.0 7.0 0.0 +v 4.0 7.0 0.0 +v 4.0 6.0 1.0 +v 5.0 6.0 1.0 +v 5.0 7.0 1.0 +v 4.0 7.0 1.0 +v 4.0 8.0 0.0 +v 5.0 8.0 0.0 +v 5.0 9.0 0.0 +v 4.0 9.0 0.0 +v 4.0 8.0 1.0 +v 5.0 8.0 1.0 +v 5.0 9.0 1.0 +v 4.0 9.0 1.0 +v 4.0 10.0 0.0 +v 5.0 10.0 0.0 +v 5.0 11.0 0.0 +v 4.0 11.0 0.0 +v 4.0 10.0 1.0 +v 5.0 10.0 1.0 +v 5.0 11.0 1.0 +v 4.0 11.0 1.0 +v 4.0 12.0 0.0 +v 5.0 12.0 0.0 +v 5.0 13.0 0.0 +v 4.0 13.0 0.0 +v 4.0 12.0 1.0 +v 5.0 12.0 1.0 +v 5.0 13.0 1.0 +v 4.0 13.0 1.0 +v 4.0 14.0 0.0 +v 5.0 14.0 0.0 +v 5.0 15.0 0.0 +v 4.0 15.0 0.0 +v 4.0 14.0 1.0 +v 5.0 14.0 1.0 +v 5.0 15.0 1.0 +v 4.0 15.0 1.0 +v 4.0 16.0 0.0 +v 5.0 16.0 0.0 +v 5.0 17.0 0.0 +v 4.0 17.0 0.0 +v 4.0 16.0 1.0 +v 5.0 16.0 1.0 +v 5.0 17.0 1.0 +v 4.0 17.0 1.0 +v 4.0 18.0 0.0 +v 5.0 18.0 0.0 +v 5.0 19.0 0.0 +v 4.0 19.0 0.0 +v 4.0 18.0 1.0 +v 5.0 18.0 1.0 +v 5.0 19.0 1.0 +v 4.0 19.0 1.0 +v 6.0 0.0 0.0 +v 7.0 0.0 0.0 +v 7.0 1.0 0.0 +v 6.0 1.0 0.0 +v 6.0 0.0 1.0 +v 7.0 0.0 1.0 +v 7.0 1.0 1.0 +v 6.0 1.0 1.0 +v 6.0 2.0 0.0 +v 7.0 2.0 0.0 +v 7.0 3.0 0.0 +v 6.0 3.0 0.0 +v 6.0 2.0 1.0 +v 7.0 2.0 1.0 +v 7.0 3.0 1.0 +v 6.0 3.0 1.0 +v 6.0 4.0 0.0 +v 7.0 4.0 0.0 +v 7.0 5.0 0.0 +v 6.0 5.0 0.0 +v 6.0 4.0 1.0 +v 7.0 4.0 1.0 +v 7.0 5.0 1.0 +v 6.0 5.0 1.0 +v 6.0 6.0 0.0 +v 7.0 6.0 0.0 +v 7.0 7.0 0.0 +v 6.0 7.0 0.0 +v 6.0 6.0 1.0 +v 7.0 6.0 1.0 +v 7.0 7.0 1.0 +v 6.0 7.0 1.0 +v 6.0 8.0 0.0 +v 7.0 8.0 0.0 +v 7.0 9.0 0.0 +v 6.0 9.0 0.0 +v 6.0 8.0 1.0 +v 7.0 8.0 1.0 +v 7.0 9.0 1.0 +v 6.0 9.0 1.0 +v 6.0 10.0 0.0 +v 7.0 10.0 0.0 +v 7.0 11.0 0.0 +v 6.0 11.0 0.0 +v 6.0 10.0 1.0 +v 7.0 10.0 1.0 +v 7.0 11.0 1.0 +v 6.0 11.0 1.0 +v 6.0 12.0 0.0 +v 7.0 12.0 0.0 +v 7.0 13.0 0.0 +v 6.0 13.0 0.0 +v 6.0 12.0 1.0 +v 7.0 12.0 1.0 +v 7.0 13.0 1.0 +v 6.0 13.0 1.0 +v 6.0 14.0 0.0 +v 7.0 14.0 0.0 +v 7.0 15.0 0.0 +v 6.0 15.0 0.0 +v 6.0 14.0 1.0 +v 7.0 14.0 1.0 +v 7.0 15.0 1.0 +v 6.0 15.0 1.0 +v 6.0 16.0 0.0 +v 7.0 16.0 0.0 +v 7.0 17.0 0.0 +v 6.0 17.0 0.0 +v 6.0 16.0 1.0 +v 7.0 16.0 1.0 +v 7.0 17.0 1.0 +v 6.0 17.0 1.0 +v 6.0 18.0 0.0 +v 7.0 18.0 0.0 +v 7.0 19.0 0.0 +v 6.0 19.0 0.0 +v 6.0 18.0 1.0 +v 7.0 18.0 1.0 +v 7.0 19.0 1.0 +v 6.0 19.0 1.0 +v 8.0 0.0 0.0 +v 9.0 0.0 0.0 +v 9.0 1.0 0.0 +v 8.0 1.0 0.0 +v 8.0 0.0 1.0 +v 9.0 0.0 1.0 +v 9.0 1.0 1.0 +v 8.0 1.0 1.0 +v 8.0 2.0 0.0 +v 9.0 2.0 0.0 +v 9.0 3.0 0.0 +v 8.0 3.0 0.0 +v 8.0 2.0 1.0 +v 9.0 2.0 1.0 +v 9.0 3.0 1.0 +v 8.0 3.0 1.0 +v 8.0 4.0 0.0 +v 9.0 4.0 0.0 +v 9.0 5.0 0.0 +v 8.0 5.0 0.0 +v 8.0 4.0 1.0 +v 9.0 4.0 1.0 +v 9.0 5.0 1.0 +v 8.0 5.0 1.0 +v 8.0 6.0 0.0 +v 9.0 6.0 0.0 +v 9.0 7.0 0.0 +v 8.0 7.0 0.0 +v 8.0 6.0 1.0 +v 9.0 6.0 1.0 +v 9.0 7.0 1.0 +v 8.0 7.0 1.0 +v 8.0 8.0 0.0 +v 9.0 8.0 0.0 +v 9.0 9.0 0.0 +v 8.0 9.0 0.0 +v 8.0 8.0 1.0 +v 9.0 8.0 1.0 +v 9.0 9.0 1.0 +v 8.0 9.0 1.0 +v 8.0 10.0 0.0 +v 9.0 10.0 0.0 +v 9.0 11.0 0.0 +v 8.0 11.0 0.0 +v 8.0 10.0 1.0 +v 9.0 10.0 1.0 +v 9.0 11.0 1.0 +v 8.0 11.0 1.0 +v 8.0 12.0 0.0 +v 9.0 12.0 0.0 +v 9.0 13.0 0.0 +v 8.0 13.0 0.0 +v 8.0 12.0 1.0 +v 9.0 12.0 1.0 +v 9.0 13.0 1.0 +v 8.0 13.0 1.0 +v 8.0 14.0 0.0 +v 9.0 14.0 0.0 +v 9.0 15.0 0.0 +v 8.0 15.0 0.0 +v 8.0 14.0 1.0 +v 9.0 14.0 1.0 +v 9.0 15.0 1.0 +v 8.0 15.0 1.0 +v 8.0 16.0 0.0 +v 9.0 16.0 0.0 +v 9.0 17.0 0.0 +v 8.0 17.0 0.0 +v 8.0 16.0 1.0 +v 9.0 16.0 1.0 +v 9.0 17.0 1.0 +v 8.0 17.0 1.0 +v 8.0 18.0 0.0 +v 9.0 18.0 0.0 +v 9.0 19.0 0.0 +v 8.0 19.0 0.0 +v 8.0 18.0 1.0 +v 9.0 18.0 1.0 +v 9.0 19.0 1.0 +v 8.0 19.0 1.0 +v 10.0 0.0 0.0 +v 11.0 0.0 0.0 +v 11.0 1.0 0.0 +v 10.0 1.0 0.0 +v 10.0 0.0 1.0 +v 11.0 0.0 1.0 +v 11.0 1.0 1.0 +v 10.0 1.0 1.0 +v 10.0 2.0 0.0 +v 11.0 2.0 0.0 +v 11.0 3.0 0.0 +v 10.0 3.0 0.0 +v 10.0 2.0 1.0 +v 11.0 2.0 1.0 +v 11.0 3.0 1.0 +v 10.0 3.0 1.0 +v 10.0 4.0 0.0 +v 11.0 4.0 0.0 +v 11.0 5.0 0.0 +v 10.0 5.0 0.0 +v 10.0 4.0 1.0 +v 11.0 4.0 1.0 +v 11.0 5.0 1.0 +v 10.0 5.0 1.0 +v 10.0 6.0 0.0 +v 11.0 6.0 0.0 +v 11.0 7.0 0.0 +v 10.0 7.0 0.0 +v 10.0 6.0 1.0 +v 11.0 6.0 1.0 +v 11.0 7.0 1.0 +v 10.0 7.0 1.0 +v 10.0 8.0 0.0 +v 11.0 8.0 0.0 +v 11.0 9.0 0.0 +v 10.0 9.0 0.0 +v 10.0 8.0 1.0 +v 11.0 8.0 1.0 +v 11.0 9.0 1.0 +v 10.0 9.0 1.0 +v 10.0 10.0 0.0 +v 11.0 10.0 0.0 +v 11.0 11.0 0.0 +v 10.0 11.0 0.0 +v 10.0 10.0 1.0 +v 11.0 10.0 1.0 +v 11.0 11.0 1.0 +v 10.0 11.0 1.0 +v 10.0 12.0 0.0 +v 11.0 12.0 0.0 +v 11.0 13.0 0.0 +v 10.0 13.0 0.0 +v 10.0 12.0 1.0 +v 11.0 12.0 1.0 +v 11.0 13.0 1.0 +v 10.0 13.0 1.0 +v 10.0 14.0 0.0 +v 11.0 14.0 0.0 +v 11.0 15.0 0.0 +v 10.0 15.0 0.0 +v 10.0 14.0 1.0 +v 11.0 14.0 1.0 +v 11.0 15.0 1.0 +v 10.0 15.0 1.0 +v 10.0 16.0 0.0 +v 11.0 16.0 0.0 +v 11.0 17.0 0.0 +v 10.0 17.0 0.0 +v 10.0 16.0 1.0 +v 11.0 16.0 1.0 +v 11.0 17.0 1.0 +v 10.0 17.0 1.0 +v 10.0 18.0 0.0 +v 11.0 18.0 0.0 +v 11.0 19.0 0.0 +v 10.0 19.0 0.0 +v 10.0 18.0 1.0 +v 11.0 18.0 1.0 +v 11.0 19.0 1.0 +v 10.0 19.0 1.0 +v 12.0 0.0 0.0 +v 13.0 0.0 0.0 +v 13.0 1.0 0.0 +v 12.0 1.0 0.0 +v 12.0 0.0 1.0 +v 13.0 0.0 1.0 +v 13.0 1.0 1.0 +v 12.0 1.0 1.0 +v 12.0 2.0 0.0 +v 13.0 2.0 0.0 +v 13.0 3.0 0.0 +v 12.0 3.0 0.0 +v 12.0 2.0 1.0 +v 13.0 2.0 1.0 +v 13.0 3.0 1.0 +v 12.0 3.0 1.0 +v 12.0 4.0 0.0 +v 13.0 4.0 0.0 +v 13.0 5.0 0.0 +v 12.0 5.0 0.0 +v 12.0 4.0 1.0 +v 13.0 4.0 1.0 +v 13.0 5.0 1.0 +v 12.0 5.0 1.0 +v 12.0 6.0 0.0 +v 13.0 6.0 0.0 +v 13.0 7.0 0.0 +v 12.0 7.0 0.0 +v 12.0 6.0 1.0 +v 13.0 6.0 1.0 +v 13.0 7.0 1.0 +v 12.0 7.0 1.0 +v 12.0 8.0 0.0 +v 13.0 8.0 0.0 +v 13.0 9.0 0.0 +v 12.0 9.0 0.0 +v 12.0 8.0 1.0 +v 13.0 8.0 1.0 +v 13.0 9.0 1.0 +v 12.0 9.0 1.0 +v 12.0 10.0 0.0 +v 13.0 10.0 0.0 +v 13.0 11.0 0.0 +v 12.0 11.0 0.0 +v 12.0 10.0 1.0 +v 13.0 10.0 1.0 +v 13.0 11.0 1.0 +v 12.0 11.0 1.0 +v 12.0 12.0 0.0 +v 13.0 12.0 0.0 +v 13.0 13.0 0.0 +v 12.0 13.0 0.0 +v 12.0 12.0 1.0 +v 13.0 12.0 1.0 +v 13.0 13.0 1.0 +v 12.0 13.0 1.0 +v 12.0 14.0 0.0 +v 13.0 14.0 0.0 +v 13.0 15.0 0.0 +v 12.0 15.0 0.0 +v 12.0 14.0 1.0 +v 13.0 14.0 1.0 +v 13.0 15.0 1.0 +v 12.0 15.0 1.0 +v 12.0 16.0 0.0 +v 13.0 16.0 0.0 +v 13.0 17.0 0.0 +v 12.0 17.0 0.0 +v 12.0 16.0 1.0 +v 13.0 16.0 1.0 +v 13.0 17.0 1.0 +v 12.0 17.0 1.0 +v 12.0 18.0 0.0 +v 13.0 18.0 0.0 +v 13.0 19.0 0.0 +v 12.0 19.0 0.0 +v 12.0 18.0 1.0 +v 13.0 18.0 1.0 +v 13.0 19.0 1.0 +v 12.0 19.0 1.0 +v 14.0 0.0 0.0 +v 15.0 0.0 0.0 +v 15.0 1.0 0.0 +v 14.0 1.0 0.0 +v 14.0 0.0 1.0 +v 15.0 0.0 1.0 +v 15.0 1.0 1.0 +v 14.0 1.0 1.0 +v 14.0 2.0 0.0 +v 15.0 2.0 0.0 +v 15.0 3.0 0.0 +v 14.0 3.0 0.0 +v 14.0 2.0 1.0 +v 15.0 2.0 1.0 +v 15.0 3.0 1.0 +v 14.0 3.0 1.0 +v 14.0 4.0 0.0 +v 15.0 4.0 0.0 +v 15.0 5.0 0.0 +v 14.0 5.0 0.0 +v 14.0 4.0 1.0 +v 15.0 4.0 1.0 +v 15.0 5.0 1.0 +v 14.0 5.0 1.0 +v 14.0 6.0 0.0 +v 15.0 6.0 0.0 +v 15.0 7.0 0.0 +v 14.0 7.0 0.0 +v 14.0 6.0 1.0 +v 15.0 6.0 1.0 +v 15.0 7.0 1.0 +v 14.0 7.0 1.0 +v 14.0 8.0 0.0 +v 15.0 8.0 0.0 +v 15.0 9.0 0.0 +v 14.0 9.0 0.0 +v 14.0 8.0 1.0 +v 15.0 8.0 1.0 +v 15.0 9.0 1.0 +v 14.0 9.0 1.0 +v 14.0 10.0 0.0 +v 15.0 10.0 0.0 +v 15.0 11.0 0.0 +v 14.0 11.0 0.0 +v 14.0 10.0 1.0 +v 15.0 10.0 1.0 +v 15.0 11.0 1.0 +v 14.0 11.0 1.0 +v 14.0 12.0 0.0 +v 15.0 12.0 0.0 +v 15.0 13.0 0.0 +v 14.0 13.0 0.0 +v 14.0 12.0 1.0 +v 15.0 12.0 1.0 +v 15.0 13.0 1.0 +v 14.0 13.0 1.0 +v 14.0 14.0 0.0 +v 15.0 14.0 0.0 +v 15.0 15.0 0.0 +v 14.0 15.0 0.0 +v 14.0 14.0 1.0 +v 15.0 14.0 1.0 +v 15.0 15.0 1.0 +v 14.0 15.0 1.0 +v 14.0 16.0 0.0 +v 15.0 16.0 0.0 +v 15.0 17.0 0.0 +v 14.0 17.0 0.0 +v 14.0 16.0 1.0 +v 15.0 16.0 1.0 +v 15.0 17.0 1.0 +v 14.0 17.0 1.0 +v 14.0 18.0 0.0 +v 15.0 18.0 0.0 +v 15.0 19.0 0.0 +v 14.0 19.0 0.0 +v 14.0 18.0 1.0 +v 15.0 18.0 1.0 +v 15.0 19.0 1.0 +v 14.0 19.0 1.0 +v 16.0 0.0 0.0 +v 17.0 0.0 0.0 +v 17.0 1.0 0.0 +v 16.0 1.0 0.0 +v 16.0 0.0 1.0 +v 17.0 0.0 1.0 +v 17.0 1.0 1.0 +v 16.0 1.0 1.0 +v 16.0 2.0 0.0 +v 17.0 2.0 0.0 +v 17.0 3.0 0.0 +v 16.0 3.0 0.0 +v 16.0 2.0 1.0 +v 17.0 2.0 1.0 +v 17.0 3.0 1.0 +v 16.0 3.0 1.0 +v 16.0 4.0 0.0 +v 17.0 4.0 0.0 +v 17.0 5.0 0.0 +v 16.0 5.0 0.0 +v 16.0 4.0 1.0 +v 17.0 4.0 1.0 +v 17.0 5.0 1.0 +v 16.0 5.0 1.0 +v 16.0 6.0 0.0 +v 17.0 6.0 0.0 +v 17.0 7.0 0.0 +v 16.0 7.0 0.0 +v 16.0 6.0 1.0 +v 17.0 6.0 1.0 +v 17.0 7.0 1.0 +v 16.0 7.0 1.0 +v 16.0 8.0 0.0 +v 17.0 8.0 0.0 +v 17.0 9.0 0.0 +v 16.0 9.0 0.0 +v 16.0 8.0 1.0 +v 17.0 8.0 1.0 +v 17.0 9.0 1.0 +v 16.0 9.0 1.0 +v 16.0 10.0 0.0 +v 17.0 10.0 0.0 +v 17.0 11.0 0.0 +v 16.0 11.0 0.0 +v 16.0 10.0 1.0 +v 17.0 10.0 1.0 +v 17.0 11.0 1.0 +v 16.0 11.0 1.0 +v 16.0 12.0 0.0 +v 17.0 12.0 0.0 +v 17.0 13.0 0.0 +v 16.0 13.0 0.0 +v 16.0 12.0 1.0 +v 17.0 12.0 1.0 +v 17.0 13.0 1.0 +v 16.0 13.0 1.0 +v 16.0 14.0 0.0 +v 17.0 14.0 0.0 +v 17.0 15.0 0.0 +v 16.0 15.0 0.0 +v 16.0 14.0 1.0 +v 17.0 14.0 1.0 +v 17.0 15.0 1.0 +v 16.0 15.0 1.0 +v 16.0 16.0 0.0 +v 17.0 16.0 0.0 +v 17.0 17.0 0.0 +v 16.0 17.0 0.0 +v 16.0 16.0 1.0 +v 17.0 16.0 1.0 +v 17.0 17.0 1.0 +v 16.0 17.0 1.0 +v 16.0 18.0 0.0 +v 17.0 18.0 0.0 +v 17.0 19.0 0.0 +v 16.0 19.0 0.0 +v 16.0 18.0 1.0 +v 17.0 18.0 1.0 +v 17.0 19.0 1.0 +v 16.0 19.0 1.0 +v 18.0 0.0 0.0 +v 19.0 0.0 0.0 +v 19.0 1.0 0.0 +v 18.0 1.0 0.0 +v 18.0 0.0 1.0 +v 19.0 0.0 1.0 +v 19.0 1.0 1.0 +v 18.0 1.0 1.0 +v 18.0 2.0 0.0 +v 19.0 2.0 0.0 +v 19.0 3.0 0.0 +v 18.0 3.0 0.0 +v 18.0 2.0 1.0 +v 19.0 2.0 1.0 +v 19.0 3.0 1.0 +v 18.0 3.0 1.0 +v 18.0 4.0 0.0 +v 19.0 4.0 0.0 +v 19.0 5.0 0.0 +v 18.0 5.0 0.0 +v 18.0 4.0 1.0 +v 19.0 4.0 1.0 +v 19.0 5.0 1.0 +v 18.0 5.0 1.0 +v 18.0 6.0 0.0 +v 19.0 6.0 0.0 +v 19.0 7.0 0.0 +v 18.0 7.0 0.0 +v 18.0 6.0 1.0 +v 19.0 6.0 1.0 +v 19.0 7.0 1.0 +v 18.0 7.0 1.0 +v 18.0 8.0 0.0 +v 19.0 8.0 0.0 +v 19.0 9.0 0.0 +v 18.0 9.0 0.0 +v 18.0 8.0 1.0 +v 19.0 8.0 1.0 +v 19.0 9.0 1.0 +v 18.0 9.0 1.0 +v 18.0 10.0 0.0 +v 19.0 10.0 0.0 +v 19.0 11.0 0.0 +v 18.0 11.0 0.0 +v 18.0 10.0 1.0 +v 19.0 10.0 1.0 +v 19.0 11.0 1.0 +v 18.0 11.0 1.0 +v 18.0 12.0 0.0 +v 19.0 12.0 0.0 +v 19.0 13.0 0.0 +v 18.0 13.0 0.0 +v 18.0 12.0 1.0 +v 19.0 12.0 1.0 +v 19.0 13.0 1.0 +v 18.0 13.0 1.0 +v 18.0 14.0 0.0 +v 19.0 14.0 0.0 +v 19.0 15.0 0.0 +v 18.0 15.0 0.0 +v 18.0 14.0 1.0 +v 19.0 14.0 1.0 +v 19.0 15.0 1.0 +v 18.0 15.0 1.0 +v 18.0 16.0 0.0 +v 19.0 16.0 0.0 +v 19.0 17.0 0.0 +v 18.0 17.0 0.0 +v 18.0 16.0 1.0 +v 19.0 16.0 1.0 +v 19.0 17.0 1.0 +v 18.0 17.0 1.0 +v 18.0 18.0 0.0 +v 19.0 18.0 0.0 +v 19.0 19.0 0.0 +v 18.0 19.0 0.0 +v 18.0 18.0 1.0 +v 19.0 18.0 1.0 +v 19.0 19.0 1.0 +v 18.0 19.0 1.0 + +g Mesh001 +usemtl Red +f 1 2 6 5 +f 2 3 7 6 +f 3 4 8 7 +f 4 1 5 8 +f 1 4 3 2 +f 5 6 7 8 +g Mesh002 +usemtl Green +f 9 10 14 13 +f 10 11 15 14 +f 11 12 16 15 +f 12 9 13 16 +f 9 12 11 10 +f 13 14 15 16 +g Mesh003 +usemtl Blue +f 17 18 22 21 +f 18 19 23 22 +f 19 20 24 23 +f 20 17 21 24 +f 17 20 19 18 +f 21 22 23 24 +g Mesh004 +usemtl Red +f 25 26 30 29 +f 26 27 31 30 +f 27 28 32 31 +f 28 25 29 32 +f 25 28 27 26 +f 29 30 31 32 +g Mesh005 +usemtl Green +f 33 34 38 37 +f 34 35 39 38 +f 35 36 40 39 +f 36 33 37 40 +f 33 36 35 34 +f 37 38 39 40 +g Mesh006 +usemtl Blue +f 41 42 46 45 +f 42 43 47 46 +f 43 44 48 47 +f 44 41 45 48 +f 41 44 43 42 +f 45 46 47 48 +g Mesh007 +usemtl Red +f 49 50 54 53 +f 50 51 55 54 +f 51 52 56 55 +f 52 49 53 56 +f 49 52 51 50 +f 53 54 55 56 +g Mesh008 +usemtl Green +f 57 58 62 61 +f 58 59 63 62 +f 59 60 64 63 +f 60 57 61 64 +f 57 60 59 58 +f 61 62 63 64 +g Mesh009 +usemtl Blue +f 65 66 70 69 +f 66 67 71 70 +f 67 68 72 71 +f 68 65 69 72 +f 65 68 67 66 +f 69 70 71 72 +g Mesh010 +usemtl Red +f 73 74 78 77 +f 74 75 79 78 +f 75 76 80 79 +f 76 73 77 80 +f 73 76 75 74 +f 77 78 79 80 +g Mesh011 +usemtl Green +f 81 82 86 85 +f 82 83 87 86 +f 83 84 88 87 +f 84 81 85 88 +f 81 84 83 82 +f 85 86 87 88 +g Mesh012 +usemtl Blue +f 89 90 94 93 +f 90 91 95 94 +f 91 92 96 95 +f 92 89 93 96 +f 89 92 91 90 +f 93 94 95 96 +g Mesh013 +usemtl Red +f 97 98 102 101 +f 98 99 103 102 +f 99 100 104 103 +f 100 97 101 104 +f 97 100 99 98 +f 101 102 103 104 +g Mesh014 +usemtl Green +f 105 106 110 109 +f 106 107 111 110 +f 107 108 112 111 +f 108 105 109 112 +f 105 108 107 106 +f 109 110 111 112 +g Mesh015 +usemtl Blue +f 113 114 118 117 +f 114 115 119 118 +f 115 116 120 119 +f 116 113 117 120 +f 113 116 115 114 +f 117 118 119 120 +g Mesh016 +usemtl Red +f 121 122 126 125 +f 122 123 127 126 +f 123 124 128 127 +f 124 121 125 128 +f 121 124 123 122 +f 125 126 127 128 +g Mesh017 +usemtl Green +f 129 130 134 133 +f 130 131 135 134 +f 131 132 136 135 +f 132 129 133 136 +f 129 132 131 130 +f 133 134 135 136 +g Mesh018 +usemtl Blue +f 137 138 142 141 +f 138 139 143 142 +f 139 140 144 143 +f 140 137 141 144 +f 137 140 139 138 +f 141 142 143 144 +g Mesh019 +usemtl Red +f 145 146 150 149 +f 146 147 151 150 +f 147 148 152 151 +f 148 145 149 152 +f 145 148 147 146 +f 149 150 151 152 +g Mesh020 +usemtl Green +f 153 154 158 157 +f 154 155 159 158 +f 155 156 160 159 +f 156 153 157 160 +f 153 156 155 154 +f 157 158 159 160 +g Mesh021 +usemtl Blue +f 161 162 166 165 +f 162 163 167 166 +f 163 164 168 167 +f 164 161 165 168 +f 161 164 163 162 +f 165 166 167 168 +g Mesh022 +usemtl Red +f 169 170 174 173 +f 170 171 175 174 +f 171 172 176 175 +f 172 169 173 176 +f 169 172 171 170 +f 173 174 175 176 +g Mesh023 +usemtl Green +f 177 178 182 181 +f 178 179 183 182 +f 179 180 184 183 +f 180 177 181 184 +f 177 180 179 178 +f 181 182 183 184 +g Mesh024 +usemtl Blue +f 185 186 190 189 +f 186 187 191 190 +f 187 188 192 191 +f 188 185 189 192 +f 185 188 187 186 +f 189 190 191 192 +g Mesh025 +usemtl Red +f 193 194 198 197 +f 194 195 199 198 +f 195 196 200 199 +f 196 193 197 200 +f 193 196 195 194 +f 197 198 199 200 +g Mesh026 +usemtl Green +f 201 202 206 205 +f 202 203 207 206 +f 203 204 208 207 +f 204 201 205 208 +f 201 204 203 202 +f 205 206 207 208 +g Mesh027 +usemtl Blue +f 209 210 214 213 +f 210 211 215 214 +f 211 212 216 215 +f 212 209 213 216 +f 209 212 211 210 +f 213 214 215 216 +g Mesh028 +usemtl Red +f 217 218 222 221 +f 218 219 223 222 +f 219 220 224 223 +f 220 217 221 224 +f 217 220 219 218 +f 221 222 223 224 +g Mesh029 +usemtl Green +f 225 226 230 229 +f 226 227 231 230 +f 227 228 232 231 +f 228 225 229 232 +f 225 228 227 226 +f 229 230 231 232 +g Mesh030 +usemtl Blue +f 233 234 238 237 +f 234 235 239 238 +f 235 236 240 239 +f 236 233 237 240 +f 233 236 235 234 +f 237 238 239 240 +g Mesh031 +usemtl Red +f 241 242 246 245 +f 242 243 247 246 +f 243 244 248 247 +f 244 241 245 248 +f 241 244 243 242 +f 245 246 247 248 +g Mesh032 +usemtl Green +f 249 250 254 253 +f 250 251 255 254 +f 251 252 256 255 +f 252 249 253 256 +f 249 252 251 250 +f 253 254 255 256 +g Mesh033 +usemtl Blue +f 257 258 262 261 +f 258 259 263 262 +f 259 260 264 263 +f 260 257 261 264 +f 257 260 259 258 +f 261 262 263 264 +g Mesh034 +usemtl Red +f 265 266 270 269 +f 266 267 271 270 +f 267 268 272 271 +f 268 265 269 272 +f 265 268 267 266 +f 269 270 271 272 +g Mesh035 +usemtl Green +f 273 274 278 277 +f 274 275 279 278 +f 275 276 280 279 +f 276 273 277 280 +f 273 276 275 274 +f 277 278 279 280 +g Mesh036 +usemtl Blue +f 281 282 286 285 +f 282 283 287 286 +f 283 284 288 287 +f 284 281 285 288 +f 281 284 283 282 +f 285 286 287 288 +g Mesh037 +usemtl Red +f 289 290 294 293 +f 290 291 295 294 +f 291 292 296 295 +f 292 289 293 296 +f 289 292 291 290 +f 293 294 295 296 +g Mesh038 +usemtl Green +f 297 298 302 301 +f 298 299 303 302 +f 299 300 304 303 +f 300 297 301 304 +f 297 300 299 298 +f 301 302 303 304 +g Mesh039 +usemtl Blue +f 305 306 310 309 +f 306 307 311 310 +f 307 308 312 311 +f 308 305 309 312 +f 305 308 307 306 +f 309 310 311 312 +g Mesh040 +usemtl Red +f 313 314 318 317 +f 314 315 319 318 +f 315 316 320 319 +f 316 313 317 320 +f 313 316 315 314 +f 317 318 319 320 +g Mesh041 +usemtl Green +f 321 322 326 325 +f 322 323 327 326 +f 323 324 328 327 +f 324 321 325 328 +f 321 324 323 322 +f 325 326 327 328 +g Mesh042 +usemtl Blue +f 329 330 334 333 +f 330 331 335 334 +f 331 332 336 335 +f 332 329 333 336 +f 329 332 331 330 +f 333 334 335 336 +g Mesh043 +usemtl Red +f 337 338 342 341 +f 338 339 343 342 +f 339 340 344 343 +f 340 337 341 344 +f 337 340 339 338 +f 341 342 343 344 +g Mesh044 +usemtl Green +f 345 346 350 349 +f 346 347 351 350 +f 347 348 352 351 +f 348 345 349 352 +f 345 348 347 346 +f 349 350 351 352 +g Mesh045 +usemtl Blue +f 353 354 358 357 +f 354 355 359 358 +f 355 356 360 359 +f 356 353 357 360 +f 353 356 355 354 +f 357 358 359 360 +g Mesh046 +usemtl Red +f 361 362 366 365 +f 362 363 367 366 +f 363 364 368 367 +f 364 361 365 368 +f 361 364 363 362 +f 365 366 367 368 +g Mesh047 +usemtl Green +f 369 370 374 373 +f 370 371 375 374 +f 371 372 376 375 +f 372 369 373 376 +f 369 372 371 370 +f 373 374 375 376 +g Mesh048 +usemtl Blue +f 377 378 382 381 +f 378 379 383 382 +f 379 380 384 383 +f 380 377 381 384 +f 377 380 379 378 +f 381 382 383 384 +g Mesh049 +usemtl Red +f 385 386 390 389 +f 386 387 391 390 +f 387 388 392 391 +f 388 385 389 392 +f 385 388 387 386 +f 389 390 391 392 +g Mesh050 +usemtl Green +f 393 394 398 397 +f 394 395 399 398 +f 395 396 400 399 +f 396 393 397 400 +f 393 396 395 394 +f 397 398 399 400 +g Mesh051 +usemtl Blue +f 401 402 406 405 +f 402 403 407 406 +f 403 404 408 407 +f 404 401 405 408 +f 401 404 403 402 +f 405 406 407 408 +g Mesh052 +usemtl Red +f 409 410 414 413 +f 410 411 415 414 +f 411 412 416 415 +f 412 409 413 416 +f 409 412 411 410 +f 413 414 415 416 +g Mesh053 +usemtl Green +f 417 418 422 421 +f 418 419 423 422 +f 419 420 424 423 +f 420 417 421 424 +f 417 420 419 418 +f 421 422 423 424 +g Mesh054 +usemtl Blue +f 425 426 430 429 +f 426 427 431 430 +f 427 428 432 431 +f 428 425 429 432 +f 425 428 427 426 +f 429 430 431 432 +g Mesh055 +usemtl Red +f 433 434 438 437 +f 434 435 439 438 +f 435 436 440 439 +f 436 433 437 440 +f 433 436 435 434 +f 437 438 439 440 +g Mesh056 +usemtl Green +f 441 442 446 445 +f 442 443 447 446 +f 443 444 448 447 +f 444 441 445 448 +f 441 444 443 442 +f 445 446 447 448 +g Mesh057 +usemtl Blue +f 449 450 454 453 +f 450 451 455 454 +f 451 452 456 455 +f 452 449 453 456 +f 449 452 451 450 +f 453 454 455 456 +g Mesh058 +usemtl Red +f 457 458 462 461 +f 458 459 463 462 +f 459 460 464 463 +f 460 457 461 464 +f 457 460 459 458 +f 461 462 463 464 +g Mesh059 +usemtl Green +f 465 466 470 469 +f 466 467 471 470 +f 467 468 472 471 +f 468 465 469 472 +f 465 468 467 466 +f 469 470 471 472 +g Mesh060 +usemtl Blue +f 473 474 478 477 +f 474 475 479 478 +f 475 476 480 479 +f 476 473 477 480 +f 473 476 475 474 +f 477 478 479 480 +g Mesh061 +usemtl Red +f 481 482 486 485 +f 482 483 487 486 +f 483 484 488 487 +f 484 481 485 488 +f 481 484 483 482 +f 485 486 487 488 +g Mesh062 +usemtl Green +f 489 490 494 493 +f 490 491 495 494 +f 491 492 496 495 +f 492 489 493 496 +f 489 492 491 490 +f 493 494 495 496 +g Mesh063 +usemtl Blue +f 497 498 502 501 +f 498 499 503 502 +f 499 500 504 503 +f 500 497 501 504 +f 497 500 499 498 +f 501 502 503 504 +g Mesh064 +usemtl Red +f 505 506 510 509 +f 506 507 511 510 +f 507 508 512 511 +f 508 505 509 512 +f 505 508 507 506 +f 509 510 511 512 +g Mesh065 +usemtl Green +f 513 514 518 517 +f 514 515 519 518 +f 515 516 520 519 +f 516 513 517 520 +f 513 516 515 514 +f 517 518 519 520 +g Mesh066 +usemtl Blue +f 521 522 526 525 +f 522 523 527 526 +f 523 524 528 527 +f 524 521 525 528 +f 521 524 523 522 +f 525 526 527 528 +g Mesh067 +usemtl Red +f 529 530 534 533 +f 530 531 535 534 +f 531 532 536 535 +f 532 529 533 536 +f 529 532 531 530 +f 533 534 535 536 +g Mesh068 +usemtl Green +f 537 538 542 541 +f 538 539 543 542 +f 539 540 544 543 +f 540 537 541 544 +f 537 540 539 538 +f 541 542 543 544 +g Mesh069 +usemtl Blue +f 545 546 550 549 +f 546 547 551 550 +f 547 548 552 551 +f 548 545 549 552 +f 545 548 547 546 +f 549 550 551 552 +g Mesh070 +usemtl Red +f 553 554 558 557 +f 554 555 559 558 +f 555 556 560 559 +f 556 553 557 560 +f 553 556 555 554 +f 557 558 559 560 +g Mesh071 +usemtl Green +f 561 562 566 565 +f 562 563 567 566 +f 563 564 568 567 +f 564 561 565 568 +f 561 564 563 562 +f 565 566 567 568 +g Mesh072 +usemtl Blue +f 569 570 574 573 +f 570 571 575 574 +f 571 572 576 575 +f 572 569 573 576 +f 569 572 571 570 +f 573 574 575 576 +g Mesh073 +usemtl Red +f 577 578 582 581 +f 578 579 583 582 +f 579 580 584 583 +f 580 577 581 584 +f 577 580 579 578 +f 581 582 583 584 +g Mesh074 +usemtl Green +f 585 586 590 589 +f 586 587 591 590 +f 587 588 592 591 +f 588 585 589 592 +f 585 588 587 586 +f 589 590 591 592 +g Mesh075 +usemtl Blue +f 593 594 598 597 +f 594 595 599 598 +f 595 596 600 599 +f 596 593 597 600 +f 593 596 595 594 +f 597 598 599 600 +g Mesh076 +usemtl Red +f 601 602 606 605 +f 602 603 607 606 +f 603 604 608 607 +f 604 601 605 608 +f 601 604 603 602 +f 605 606 607 608 +g Mesh077 +usemtl Green +f 609 610 614 613 +f 610 611 615 614 +f 611 612 616 615 +f 612 609 613 616 +f 609 612 611 610 +f 613 614 615 616 +g Mesh078 +usemtl Blue +f 617 618 622 621 +f 618 619 623 622 +f 619 620 624 623 +f 620 617 621 624 +f 617 620 619 618 +f 621 622 623 624 +g Mesh079 +usemtl Red +f 625 626 630 629 +f 626 627 631 630 +f 627 628 632 631 +f 628 625 629 632 +f 625 628 627 626 +f 629 630 631 632 +g Mesh080 +usemtl Green +f 633 634 638 637 +f 634 635 639 638 +f 635 636 640 639 +f 636 633 637 640 +f 633 636 635 634 +f 637 638 639 640 +g Mesh081 +usemtl Blue +f 641 642 646 645 +f 642 643 647 646 +f 643 644 648 647 +f 644 641 645 648 +f 641 644 643 642 +f 645 646 647 648 +g Mesh082 +usemtl Red +f 649 650 654 653 +f 650 651 655 654 +f 651 652 656 655 +f 652 649 653 656 +f 649 652 651 650 +f 653 654 655 656 +g Mesh083 +usemtl Green +f 657 658 662 661 +f 658 659 663 662 +f 659 660 664 663 +f 660 657 661 664 +f 657 660 659 658 +f 661 662 663 664 +g Mesh084 +usemtl Blue +f 665 666 670 669 +f 666 667 671 670 +f 667 668 672 671 +f 668 665 669 672 +f 665 668 667 666 +f 669 670 671 672 +g Mesh085 +usemtl Red +f 673 674 678 677 +f 674 675 679 678 +f 675 676 680 679 +f 676 673 677 680 +f 673 676 675 674 +f 677 678 679 680 +g Mesh086 +usemtl Green +f 681 682 686 685 +f 682 683 687 686 +f 683 684 688 687 +f 684 681 685 688 +f 681 684 683 682 +f 685 686 687 688 +g Mesh087 +usemtl Blue +f 689 690 694 693 +f 690 691 695 694 +f 691 692 696 695 +f 692 689 693 696 +f 689 692 691 690 +f 693 694 695 696 +g Mesh088 +usemtl Red +f 697 698 702 701 +f 698 699 703 702 +f 699 700 704 703 +f 700 697 701 704 +f 697 700 699 698 +f 701 702 703 704 +g Mesh089 +usemtl Green +f 705 706 710 709 +f 706 707 711 710 +f 707 708 712 711 +f 708 705 709 712 +f 705 708 707 706 +f 709 710 711 712 +g Mesh090 +usemtl Blue +f 713 714 718 717 +f 714 715 719 718 +f 715 716 720 719 +f 716 713 717 720 +f 713 716 715 714 +f 717 718 719 720 +g Mesh091 +usemtl Red +f 721 722 726 725 +f 722 723 727 726 +f 723 724 728 727 +f 724 721 725 728 +f 721 724 723 722 +f 725 726 727 728 +g Mesh092 +usemtl Green +f 729 730 734 733 +f 730 731 735 734 +f 731 732 736 735 +f 732 729 733 736 +f 729 732 731 730 +f 733 734 735 736 +g Mesh093 +usemtl Blue +f 737 738 742 741 +f 738 739 743 742 +f 739 740 744 743 +f 740 737 741 744 +f 737 740 739 738 +f 741 742 743 744 +g Mesh094 +usemtl Red +f 745 746 750 749 +f 746 747 751 750 +f 747 748 752 751 +f 748 745 749 752 +f 745 748 747 746 +f 749 750 751 752 +g Mesh095 +usemtl Green +f 753 754 758 757 +f 754 755 759 758 +f 755 756 760 759 +f 756 753 757 760 +f 753 756 755 754 +f 757 758 759 760 +g Mesh096 +usemtl Blue +f 761 762 766 765 +f 762 763 767 766 +f 763 764 768 767 +f 764 761 765 768 +f 761 764 763 762 +f 765 766 767 768 +g Mesh097 +usemtl Red +f 769 770 774 773 +f 770 771 775 774 +f 771 772 776 775 +f 772 769 773 776 +f 769 772 771 770 +f 773 774 775 776 +g Mesh098 +usemtl Green +f 777 778 782 781 +f 778 779 783 782 +f 779 780 784 783 +f 780 777 781 784 +f 777 780 779 778 +f 781 782 783 784 +g Mesh099 +usemtl Blue +f 785 786 790 789 +f 786 787 791 790 +f 787 788 792 791 +f 788 785 789 792 +f 785 788 787 786 +f 789 790 791 792 +g Mesh100 +usemtl Red +f 793 794 798 797 +f 794 795 799 798 +f 795 796 800 799 +f 796 793 797 800 +f 793 796 795 794 +f 797 798 799 800 diff --git a/test/tests/exportimport_test.js b/test/tests/exportimport_test.js index 4155b4e..2623982 100644 --- a/test/tests/exportimport_test.js +++ b/test/tests/exportimport_test.js @@ -116,8 +116,8 @@ function ExportImport (model, format, extension, onReady) onSuccess : function (exportedFiles) { let importer = new OV.Importer (); let settings = new OV.ImportSettings (); - let fileObjects = exportedFiles.map (file => new FileObject ('', file.name, file.content)); - importer.ImportFiles (fileObjects, OV.FileSource.File, settings, { + let fileObjects = exportedFiles.map (file => new OV.InputFile (file.name, OV.FileSource.File, new FileObject ('', file.name, file.content))); + importer.ImportFiles (fileObjects, settings, { onFilesLoaded : function () { }, diff --git a/test/tests/importer_test.js b/test/tests/importer_test.js index 0f73b9f..9d04c2c 100644 --- a/test/tests/importer_test.js +++ b/test/tests/importer_test.js @@ -7,7 +7,8 @@ export default function suite () function ImportFilesWithImporter (importer, files, callbacks) { let settings = new OV.ImportSettings (); - importer.ImportFiles (files, OV.FileSource.File, settings, { + let inputFiles = OV.InputFilesFromFileObjects (files); + importer.ImportFiles (inputFiles, settings, { onFilesLoaded : function () { }, @@ -259,7 +260,8 @@ describe ('Importer Test', function () { let theImporter = new OV.Importer (); let settings = new OV.ImportSettings (); settings.defaultColor = new OV.Color (200, 0, 0); - theImporter.ImportFiles (files, OV.FileSource.File, settings, { + let inputFiles = OV.InputFilesFromFileObjects (files); + theImporter.ImportFiles (inputFiles, settings, { onFilesLoaded : function () { },