Store the original file buffer in textures.

This commit is contained in:
Viktor Kovacs 2021-03-28 14:06:55 +02:00
parent 665a419e49
commit c15e7ff3b4
10 changed files with 73 additions and 65 deletions

View File

@ -331,7 +331,7 @@ OV.ExporterGltf = class extends OV.ExporterBase
function GetTextureParams (mainJson, texture, addTexture) function GetTextureParams (mainJson, texture, addTexture)
{ {
if (texture === null || texture.name === null || texture.url === null) { if (texture === null || !texture.IsValid ()) {
return null; return null;
} }

View File

@ -14,18 +14,19 @@ OV.ExporterObj = class extends OV.ExporterBase
{ {
function WriteTexture (mtlWriter, keyword, texture, files) function WriteTexture (mtlWriter, keyword, texture, files)
{ {
if (texture !== null && texture.name !== null && texture.url !== null) { if (texture === null || !texture.IsValid ()) {
let fileName = OV.GetFileName (texture.name); return;
mtlWriter.WriteArrayLine ([keyword, fileName]); }
let fileName = OV.GetFileName (texture.name);
mtlWriter.WriteArrayLine ([keyword, fileName]);
let fileIndex = files.findIndex (function (file) { let fileIndex = files.findIndex (function (file) {
return file.GetName () === fileName; return file.GetName () === fileName;
}); });
if (fileIndex === -1) { if (fileIndex === -1) {
let textureFile = new OV.ExportedFile (fileName); let textureFile = new OV.ExportedFile (fileName);
textureFile.SetUrl (texture.url); textureFile.SetUrl (texture.url);
files.push (textureFile); files.push (textureFile);
}
} }
} }

View File

@ -15,7 +15,7 @@ OV.ConvertModelToThreeMeshes = function (model, callbacks)
function LoadTexture (threeMaterial, texture, onLoad) function LoadTexture (threeMaterial, texture, onLoad)
{ {
if (texture === null || texture.url === null) { if (texture === null || !texture.IsValid ()) {
return; return;
} }
let loader = new THREE.TextureLoader (); let loader = new THREE.TextureLoader ();

View File

@ -245,52 +245,36 @@ OV.Importer = class
result.mainFile = mainFile.file.name; result.mainFile = mainFile.file.name;
result.usedFiles.push (mainFile.file.name); result.usedFiles.push (mainFile.file.name);
let fileNameToContent = {};
let textureNameToUrl = {};
let obj = this; let obj = this;
let importer = mainFile.importer; let importer = mainFile.importer;
let fileNameToBuffer = {};
importer.Import (mainFile.file.content, mainFile.file.extension, { importer.Import (mainFile.file.content, mainFile.file.extension, {
getDefaultMaterial : function () { getDefaultMaterial : function () {
let material = new OV.Material (); let material = new OV.Material ();
material.diffuse = new OV.Color (200, 200, 200); material.diffuse = new OV.Color (200, 200, 200);
return material; return material;
}, },
getFileContent : function (filePath) { getFileBuffer : function (filePath) {
let fileName = OV.GetFileName (filePath); let fileName = OV.GetFileName (filePath);
let fileContent = fileNameToContent[fileName]; let fileBuffer = fileNameToBuffer[fileName];
if (fileContent === undefined) { if (fileBuffer === undefined) {
let file = obj.fileList.FindFileByPath (filePath); let file = obj.fileList.FindFileByPath (filePath);
if (file === null || file.content === null) { if (file === null || file.content === null) {
result.missingFiles.push (fileName); result.missingFiles.push (fileName);
obj.missingFiles.push (fileName); obj.missingFiles.push (fileName);
fileContent = null; fileBuffer = 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;
} else { } else {
result.usedFiles.push (fileName); result.usedFiles.push (fileName);
let blob = new Blob ([file.content]); let blob = new Blob ([file.content]);
let blobURL = URL.createObjectURL (blob); let blobURL = URL.createObjectURL (blob);
textureUrl = blobURL; fileBuffer = {
url : blobURL,
buffer : file.content
};
} }
textureNameToUrl[fileName] = textureUrl; fileNameToBuffer[fileName] = fileBuffer;
} }
return textureUrl; return fileBuffer;
} }
}); });

View File

@ -177,9 +177,12 @@ OV.Importer3ds = class extends OV.ImporterBase
this.ReadChunks (reader, endByte, function (chunkId, chunkLength) { this.ReadChunks (reader, endByte, function (chunkId, chunkLength) {
if (chunkId === OV.CHUNK3DS.MAT_TEXMAP_NAME) { if (chunkId === OV.CHUNK3DS.MAT_TEXMAP_NAME) {
let textureName = obj.ReadName (reader); let textureName = obj.ReadName (reader);
let textureObjectUrl = obj.callbacks.getTextureObjectUrl (textureName); let textureBuffer = obj.callbacks.getFileBuffer (textureName);
texture.name = 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) { } else if (chunkId === OV.CHUNK3DS.MAT_TEXMAP_UOFFSET) {
texture.offset.x = reader.ReadFloat32 (); texture.offset.x = reader.ReadFloat32 ();
} else if (chunkId === OV.CHUNK3DS.MAT_TEXMAP_VOFFSET) { } else if (chunkId === OV.CHUNK3DS.MAT_TEXMAP_VOFFSET) {

View File

@ -401,7 +401,10 @@ OV.ImporterGltf = class extends OV.ImporterBase
let gltfBuffer = gltf.buffers[i]; let gltfBuffer = gltf.buffers[i];
let base64Buffer = OV.Base64DataURIToArrayBuffer (gltfBuffer.uri); let base64Buffer = OV.Base64DataURIToArrayBuffer (gltfBuffer.uri);
if (base64Buffer === null) { if (base64Buffer === null) {
buffer = this.callbacks.getFileContent (gltfBuffer.uri); let fileBuffer = this.callbacks.getFileBuffer (gltfBuffer.uri);
if (fileBuffer !== null) {
buffer = fileBuffer.buffer;
}
} else { } else {
buffer = base64Buffer.buffer; buffer = base64Buffer.buffer;
} }
@ -622,10 +625,14 @@ OV.ImporterGltf = class extends OV.ImporterBase
let blob = new Blob ([base64Buffer.buffer], { type : base64Buffer.mimeType }); let blob = new Blob ([base64Buffer.buffer], { type : base64Buffer.mimeType });
texture.name = 'Embedded_' + textureIndexString + GetTextureFileExtension (base64Buffer.mimeType); texture.name = 'Embedded_' + textureIndexString + GetTextureFileExtension (base64Buffer.mimeType);
texture.url = URL.createObjectURL (blob); texture.url = URL.createObjectURL (blob);
texture.buffer = base64Buffer.buffer;
} else { } else {
let textureObjectUrl = this.callbacks.getTextureObjectUrl (gltfImage.uri); let textureBuffer = this.callbacks.getFileBuffer (gltfImage.uri);
texture.name = 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) { } else if (gltfImage.bufferView !== undefined) {
let bufferView = gltf.bufferViews[gltfImage.bufferView]; let bufferView = gltf.bufferViews[gltfImage.bufferView];
@ -635,6 +642,7 @@ OV.ImporterGltf = class extends OV.ImporterBase
let blob = new Blob ([buffer], { type: gltfImage.mimeType }); let blob = new Blob ([buffer], { type: gltfImage.mimeType });
texture.name = 'Binary_' + textureIndexString + GetTextureFileExtension (gltfImage.mimeType); texture.name = 'Binary_' + textureIndexString + GetTextureFileExtension (gltfImage.mimeType);
texture.url = URL.createObjectURL (blob); texture.url = URL.createObjectURL (blob);
texture.buffer = buffer;
} }
} }

View File

@ -169,10 +169,12 @@ OV.ImporterObj = class extends OV.ImporterBase
function CreateTexture (keyword, line, callbacks) function CreateTexture (keyword, line, callbacks)
{ {
let texture = new OV.TextureMap (); let texture = new OV.TextureMap ();
texture.name = OV.NameFromLine (line, keyword.length, '#'); let textureName = OV.NameFromLine (line, keyword.length, '#');
let textureObjectUrl = callbacks.getTextureObjectUrl (texture.name); let textureBuffer = callbacks.getFileBuffer (textureName);
if (textureObjectUrl !== null) { texture.name = textureName;
texture.url = textureObjectUrl; if (textureBuffer !== null) {
texture.url = textureBuffer.url;
texture.buffer = textureBuffer.buffer;
} }
return texture; return texture;
} }
@ -206,9 +208,9 @@ OV.ImporterObj = class extends OV.ImporterBase
return true; return true;
} }
let fileName = OV.NameFromLine (line, keyword.length, '#'); let fileName = OV.NameFromLine (line, keyword.length, '#');
let fileContent = this.callbacks.getFileContent (fileName); let fileBuffer = this.callbacks.getFileBuffer (fileName);
if (fileContent !== null) { if (fileBuffer !== null && fileBuffer.buffer !== null) {
OV.ReadLines (fileContent, function (line) { OV.ReadLines (fileBuffer.buffer, function (line) {
if (!obj.IsError ()) { if (!obj.IsError ()) {
obj.ProcessLine (line); obj.ProcessLine (line);
} }

View File

@ -54,11 +54,17 @@ OV.TextureMap = class
{ {
this.name = null; this.name = null;
this.url = null; this.url = null;
this.buffer = null;
this.offset = new OV.Coord2D (0.0, 0.0); this.offset = new OV.Coord2D (0.0, 0.0);
this.scale = new OV.Coord2D (1.0, 1.0); this.scale = new OV.Coord2D (1.0, 1.0);
this.rotation = 0.0; // radians this.rotation = 0.0; // radians
} }
IsValid ()
{
return this.name !== null && this.url !== null && this.buffer !== null;
}
HasTransformation () HasTransformation ()
{ {
if (!OV.CoordIsEqual2D (this.offset, new OV.Coord2D (0.0, 0.0))) { if (!OV.CoordIsEqual2D (this.offset, new OV.Coord2D (0.0, 0.0))) {
@ -78,6 +84,7 @@ OV.TextureMap = class
let cloned = new OV.TextureMap (); let cloned = new OV.TextureMap ();
cloned.name = this.name; cloned.name = this.name;
cloned.url = this.url; cloned.url = this.url;
cloned.buffer = this.buffer;
cloned.offset = this.offset.Clone (); cloned.offset = this.offset.Clone ();
cloned.scale = this.scale.Clone (); cloned.scale = this.scale.Clone ();
cloned.rotation = this.rotation; cloned.rotation = this.rotation;

View File

@ -12,12 +12,15 @@ function CreateTestModel ()
material1.diffuseMap = new OV.TextureMap (); material1.diffuseMap = new OV.TextureMap ();
material1.diffuseMap.name = 'textures/texture1.png'; material1.diffuseMap.name = 'textures/texture1.png';
material1.diffuseMap.url = 'texture1_url'; material1.diffuseMap.url = 'texture1_url';
material1.diffuseMap.buffer = new ArrayBuffer (4);
material1.specularMap = new OV.TextureMap (); material1.specularMap = new OV.TextureMap ();
material1.specularMap.name = 'textures/texture2.png'; material1.specularMap.name = 'textures/texture2.png';
material1.specularMap.url = 'texture2_url'; material1.specularMap.url = 'texture2_url';
material1.specularMap.buffer = new ArrayBuffer (4);
material1.bumpMap = new OV.TextureMap (); material1.bumpMap = new OV.TextureMap ();
material1.bumpMap.name = 'textures/texture3.png'; material1.bumpMap.name = 'textures/texture3.png';
material1.bumpMap.url = 'texture3_url'; material1.bumpMap.url = 'texture3_url';
material1.bumpMap.buffer = new ArrayBuffer (4);
model.AddMaterial (material1); model.AddMaterial (material1);
let material2 = new OV.Material (); let material2 = new OV.Material ();
@ -306,10 +309,13 @@ end_header
getDefaultMaterial () { getDefaultMaterial () {
return new OV.Material (); return new OV.Material ();
}, },
getFileContent (filePath) { getFileBuffer (filePath) {
return binFile.GetContent (); if (filePath == 'model.bin') {
}, return {
getTextureObjectUrl (filePath) { url : null,
buffer : binFile.GetContent ()
};
}
return null; return null;
} }
}); });
@ -344,10 +350,7 @@ end_header
getDefaultMaterial () { getDefaultMaterial () {
return new OV.Material (); return new OV.Material ();
}, },
getFileContent (filePath) { getFileBuffer (filePath) {
return binFile.GetContent ();
},
getTextureObjectUrl (filePath) {
return null; return null;
} }
}); });

View File

@ -79,7 +79,7 @@ module.exports =
var material = new OV.Material (); var material = new OV.Material ();
return material; return material;
}, },
getFileContent : function (requestedFileName) { getFileBuffer : function (requestedFileName) {
let extension = OV.GetFileExtension (requestedFileName); let extension = OV.GetFileExtension (requestedFileName);
let knownFormats = importer.GetKnownFileFormats (); let knownFormats = importer.GetKnownFileFormats ();
let format = OV.FileFormat.Binary; let format = OV.FileFormat.Binary;
@ -92,10 +92,10 @@ module.exports =
} else if (format == OV.FileFormat.Binary) { } else if (format == OV.FileFormat.Binary) {
fileContent = myThis.GetArrayBufferFileContent (folder, requestedFileName); fileContent = myThis.GetArrayBufferFileContent (folder, requestedFileName);
} }
return fileContent; return {
}, url : null,
getTextureObjectUrl : function (requestedFileName) { buffer : fileContent
return requestedFileName; };
} }
}); });
let model = importer.GetModel (); let model = importer.GetModel ();