From c15e7ff3b43e8e16be5d57ccc06a11cbd674bba7 Mon Sep 17 00:00:00 2001 From: Viktor Kovacs Date: Sun, 28 Mar 2021 14:06:55 +0200 Subject: [PATCH] Store the original file buffer in textures. --- source/export/exportergltf.js | 2 +- source/export/exporterobj.js | 23 +++++++++--------- source/external/three.converter.js | 2 +- source/import/importer.js | 38 +++++++++--------------------- source/import/importer3ds.js | 7 ++++-- source/import/importergltf.js | 14 ++++++++--- source/import/importerobj.js | 16 +++++++------ source/model/modelentities.js | 7 ++++++ test/tests/exporter_test.js | 19 ++++++++------- test/utils/testfiles.js | 10 ++++---- 10 files changed, 73 insertions(+), 65 deletions(-) diff --git a/source/export/exportergltf.js b/source/export/exportergltf.js index 39b8498..06294ab 100644 --- a/source/export/exportergltf.js +++ b/source/export/exportergltf.js @@ -331,7 +331,7 @@ OV.ExporterGltf = class extends OV.ExporterBase function GetTextureParams (mainJson, texture, addTexture) { - if (texture === null || texture.name === null || texture.url === null) { + if (texture === null || !texture.IsValid ()) { return null; } diff --git a/source/export/exporterobj.js b/source/export/exporterobj.js index 0267ea7..98b65f0 100644 --- a/source/export/exporterobj.js +++ b/source/export/exporterobj.js @@ -14,18 +14,19 @@ OV.ExporterObj = class extends OV.ExporterBase { function WriteTexture (mtlWriter, keyword, texture, files) { - if (texture !== null && texture.name !== null && texture.url !== null) { - let fileName = OV.GetFileName (texture.name); - mtlWriter.WriteArrayLine ([keyword, fileName]); + if (texture === null || !texture.IsValid ()) { + return; + } + let fileName = OV.GetFileName (texture.name); + mtlWriter.WriteArrayLine ([keyword, fileName]); - let fileIndex = files.findIndex (function (file) { - return file.GetName () === fileName; - }); - if (fileIndex === -1) { - let textureFile = new OV.ExportedFile (fileName); - textureFile.SetUrl (texture.url); - files.push (textureFile); - } + let fileIndex = files.findIndex (function (file) { + return file.GetName () === fileName; + }); + if (fileIndex === -1) { + let textureFile = new OV.ExportedFile (fileName); + textureFile.SetUrl (texture.url); + files.push (textureFile); } } diff --git a/source/external/three.converter.js b/source/external/three.converter.js index f8b16d7..2020e6f 100644 --- a/source/external/three.converter.js +++ b/source/external/three.converter.js @@ -15,7 +15,7 @@ OV.ConvertModelToThreeMeshes = function (model, callbacks) function LoadTexture (threeMaterial, texture, onLoad) { - if (texture === null || texture.url === null) { + if (texture === null || !texture.IsValid ()) { return; } let loader = new THREE.TextureLoader (); diff --git a/source/import/importer.js b/source/import/importer.js index d8ab5a5..3c386e0 100644 --- a/source/import/importer.js +++ b/source/import/importer.js @@ -245,52 +245,36 @@ OV.Importer = class result.mainFile = mainFile.file.name; result.usedFiles.push (mainFile.file.name); - let fileNameToContent = {}; - let textureNameToUrl = {}; - let obj = this; let importer = mainFile.importer; + let fileNameToBuffer = {}; importer.Import (mainFile.file.content, mainFile.file.extension, { getDefaultMaterial : function () { let material = new OV.Material (); material.diffuse = new OV.Color (200, 200, 200); return material; }, - getFileContent : function (filePath) { + getFileBuffer : function (filePath) { let fileName = OV.GetFileName (filePath); - let fileContent = fileNameToContent[fileName]; - if (fileContent === undefined) { + let fileBuffer = fileNameToBuffer[fileName]; + if (fileBuffer === undefined) { let file = obj.fileList.FindFileByPath (filePath); if (file === null || file.content === null) { result.missingFiles.push (fileName); obj.missingFiles.push (fileName); - fileContent = null; - } else { - result.usedFiles.push (fileName); - fileContent = file.content; - } - fileNameToContent[fileName] = fileContent; - } - return fileContent; - }, - getTextureObjectUrl : function (filePath) { - let fileName = OV.GetFileName (filePath); - let textureUrl = textureNameToUrl[fileName]; - if (textureUrl === undefined) { - let file = obj.fileList.FindFileByPath (filePath); - if (file === null || file.content === null) { - result.missingFiles.push (fileName); - obj.missingFiles.push (fileName); - textureUrl = null; + fileBuffer = null; } else { result.usedFiles.push (fileName); let blob = new Blob ([file.content]); let blobURL = URL.createObjectURL (blob); - textureUrl = blobURL; + fileBuffer = { + url : blobURL, + buffer : file.content + }; } - textureNameToUrl[fileName] = textureUrl; + fileNameToBuffer[fileName] = fileBuffer; } - return textureUrl; + return fileBuffer; } }); diff --git a/source/import/importer3ds.js b/source/import/importer3ds.js index b11868f..3b035e6 100644 --- a/source/import/importer3ds.js +++ b/source/import/importer3ds.js @@ -177,9 +177,12 @@ OV.Importer3ds = class extends OV.ImporterBase this.ReadChunks (reader, endByte, function (chunkId, chunkLength) { if (chunkId === OV.CHUNK3DS.MAT_TEXMAP_NAME) { let textureName = obj.ReadName (reader); - let textureObjectUrl = obj.callbacks.getTextureObjectUrl (textureName); + let textureBuffer = obj.callbacks.getFileBuffer (textureName); texture.name = textureName; - texture.url = textureObjectUrl; + if (textureBuffer !== null) { + texture.url = textureBuffer.url; + texture.buffer = textureBuffer.buffer; + } } else if (chunkId === OV.CHUNK3DS.MAT_TEXMAP_UOFFSET) { texture.offset.x = reader.ReadFloat32 (); } else if (chunkId === OV.CHUNK3DS.MAT_TEXMAP_VOFFSET) { diff --git a/source/import/importergltf.js b/source/import/importergltf.js index cc314a1..58f2e10 100644 --- a/source/import/importergltf.js +++ b/source/import/importergltf.js @@ -401,7 +401,10 @@ OV.ImporterGltf = class extends OV.ImporterBase let gltfBuffer = gltf.buffers[i]; let base64Buffer = OV.Base64DataURIToArrayBuffer (gltfBuffer.uri); if (base64Buffer === null) { - buffer = this.callbacks.getFileContent (gltfBuffer.uri); + let fileBuffer = this.callbacks.getFileBuffer (gltfBuffer.uri); + if (fileBuffer !== null) { + buffer = fileBuffer.buffer; + } } else { buffer = base64Buffer.buffer; } @@ -622,10 +625,14 @@ OV.ImporterGltf = class extends OV.ImporterBase let blob = new Blob ([base64Buffer.buffer], { type : base64Buffer.mimeType }); texture.name = 'Embedded_' + textureIndexString + GetTextureFileExtension (base64Buffer.mimeType); texture.url = URL.createObjectURL (blob); + texture.buffer = base64Buffer.buffer; } else { - let textureObjectUrl = this.callbacks.getTextureObjectUrl (gltfImage.uri); + let textureBuffer = this.callbacks.getFileBuffer (gltfImage.uri); texture.name = gltfImage.uri; - texture.url = textureObjectUrl; + if (textureBuffer !== null) { + texture.url = textureBuffer.url; + texture.buffer = textureBuffer.buffer; + } } } else if (gltfImage.bufferView !== undefined) { let bufferView = gltf.bufferViews[gltfImage.bufferView]; @@ -635,6 +642,7 @@ OV.ImporterGltf = class extends OV.ImporterBase let blob = new Blob ([buffer], { type: gltfImage.mimeType }); texture.name = 'Binary_' + textureIndexString + GetTextureFileExtension (gltfImage.mimeType); texture.url = URL.createObjectURL (blob); + texture.buffer = buffer; } } diff --git a/source/import/importerobj.js b/source/import/importerobj.js index 40b9aff..d60f2a0 100644 --- a/source/import/importerobj.js +++ b/source/import/importerobj.js @@ -169,10 +169,12 @@ OV.ImporterObj = class extends OV.ImporterBase function CreateTexture (keyword, line, callbacks) { let texture = new OV.TextureMap (); - texture.name = OV.NameFromLine (line, keyword.length, '#'); - let textureObjectUrl = callbacks.getTextureObjectUrl (texture.name); - if (textureObjectUrl !== null) { - texture.url = textureObjectUrl; + let textureName = OV.NameFromLine (line, keyword.length, '#'); + let textureBuffer = callbacks.getFileBuffer (textureName); + texture.name = textureName; + if (textureBuffer !== null) { + texture.url = textureBuffer.url; + texture.buffer = textureBuffer.buffer; } return texture; } @@ -206,9 +208,9 @@ OV.ImporterObj = class extends OV.ImporterBase return true; } let fileName = OV.NameFromLine (line, keyword.length, '#'); - let fileContent = this.callbacks.getFileContent (fileName); - if (fileContent !== null) { - OV.ReadLines (fileContent, function (line) { + let fileBuffer = this.callbacks.getFileBuffer (fileName); + if (fileBuffer !== null && fileBuffer.buffer !== null) { + OV.ReadLines (fileBuffer.buffer, function (line) { if (!obj.IsError ()) { obj.ProcessLine (line); } diff --git a/source/model/modelentities.js b/source/model/modelentities.js index 39bbe09..7279f3f 100644 --- a/source/model/modelentities.js +++ b/source/model/modelentities.js @@ -54,11 +54,17 @@ OV.TextureMap = class { this.name = null; this.url = null; + this.buffer = null; this.offset = new OV.Coord2D (0.0, 0.0); this.scale = new OV.Coord2D (1.0, 1.0); this.rotation = 0.0; // radians } + IsValid () + { + return this.name !== null && this.url !== null && this.buffer !== null; + } + HasTransformation () { if (!OV.CoordIsEqual2D (this.offset, new OV.Coord2D (0.0, 0.0))) { @@ -78,6 +84,7 @@ OV.TextureMap = class let cloned = new OV.TextureMap (); cloned.name = this.name; cloned.url = this.url; + cloned.buffer = this.buffer; cloned.offset = this.offset.Clone (); cloned.scale = this.scale.Clone (); cloned.rotation = this.rotation; diff --git a/test/tests/exporter_test.js b/test/tests/exporter_test.js index 3a1b44d..402aec8 100644 --- a/test/tests/exporter_test.js +++ b/test/tests/exporter_test.js @@ -12,12 +12,15 @@ function CreateTestModel () material1.diffuseMap = new OV.TextureMap (); material1.diffuseMap.name = 'textures/texture1.png'; material1.diffuseMap.url = 'texture1_url'; + material1.diffuseMap.buffer = new ArrayBuffer (4); material1.specularMap = new OV.TextureMap (); material1.specularMap.name = 'textures/texture2.png'; material1.specularMap.url = 'texture2_url'; + material1.specularMap.buffer = new ArrayBuffer (4); material1.bumpMap = new OV.TextureMap (); material1.bumpMap.name = 'textures/texture3.png'; material1.bumpMap.url = 'texture3_url'; + material1.bumpMap.buffer = new ArrayBuffer (4); model.AddMaterial (material1); let material2 = new OV.Material (); @@ -306,10 +309,13 @@ end_header getDefaultMaterial () { return new OV.Material (); }, - getFileContent (filePath) { - return binFile.GetContent (); - }, - getTextureObjectUrl (filePath) { + getFileBuffer (filePath) { + if (filePath == 'model.bin') { + return { + url : null, + buffer : binFile.GetContent () + }; + } return null; } }); @@ -344,10 +350,7 @@ end_header getDefaultMaterial () { return new OV.Material (); }, - getFileContent (filePath) { - return binFile.GetContent (); - }, - getTextureObjectUrl (filePath) { + getFileBuffer (filePath) { return null; } }); diff --git a/test/utils/testfiles.js b/test/utils/testfiles.js index ed4cd2d..6e0e239 100644 --- a/test/utils/testfiles.js +++ b/test/utils/testfiles.js @@ -79,7 +79,7 @@ module.exports = var material = new OV.Material (); return material; }, - getFileContent : function (requestedFileName) { + getFileBuffer : function (requestedFileName) { let extension = OV.GetFileExtension (requestedFileName); let knownFormats = importer.GetKnownFileFormats (); let format = OV.FileFormat.Binary; @@ -92,10 +92,10 @@ module.exports = } else if (format == OV.FileFormat.Binary) { fileContent = myThis.GetArrayBufferFileContent (folder, requestedFileName); } - return fileContent; - }, - getTextureObjectUrl : function (requestedFileName) { - return requestedFileName; + return { + url : null, + buffer : fileContent + }; } }); let model = importer.GetModel ();