Store the original file buffer in textures.
This commit is contained in:
parent
665a419e49
commit
c15e7ff3b4
@ -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;
|
||||
}
|
||||
|
||||
|
||||
@ -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);
|
||||
}
|
||||
}
|
||||
|
||||
|
||||
2
source/external/three.converter.js
vendored
2
source/external/three.converter.js
vendored
@ -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 ();
|
||||
|
||||
@ -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;
|
||||
}
|
||||
});
|
||||
|
||||
|
||||
@ -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) {
|
||||
|
||||
@ -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;
|
||||
}
|
||||
}
|
||||
|
||||
|
||||
@ -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);
|
||||
}
|
||||
|
||||
@ -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;
|
||||
|
||||
@ -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;
|
||||
}
|
||||
});
|
||||
|
||||
@ -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 ();
|
||||
|
||||
Loading…
Reference in New Issue
Block a user