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)
|
function GetTextureParams (mainJson, texture, addTexture)
|
||||||
{
|
{
|
||||||
if (texture === null || texture.name === null || texture.url === null) {
|
if (texture === null || !texture.IsValid ()) {
|
||||||
return null;
|
return null;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|||||||
@ -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);
|
||||||
}
|
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|||||||
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)
|
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 ();
|
||||||
|
|||||||
@ -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;
|
||||||
}
|
}
|
||||||
});
|
});
|
||||||
|
|
||||||
|
|||||||
@ -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) {
|
||||||
|
|||||||
@ -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;
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|||||||
@ -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);
|
||||||
}
|
}
|
||||||
|
|||||||
@ -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;
|
||||||
|
|||||||
@ -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;
|
||||||
}
|
}
|
||||||
});
|
});
|
||||||
|
|||||||
@ -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 ();
|
||||||
|
|||||||
Loading…
Reference in New Issue
Block a user