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)
{
if (texture === null || texture.name === null || texture.url === null) {
if (texture === null || !texture.IsValid ()) {
return null;
}

View File

@ -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);
}
}

View File

@ -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 ();

View File

@ -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;
}
});

View File

@ -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) {

View File

@ -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;
}
}

View File

@ -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);
}

View File

@ -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;

View File

@ -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;
}
});

View File

@ -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 ();