From 9bd495bcd54d4f4383fcc4181394f8c5c8e9b303 Mon Sep 17 00:00:00 2001 From: kovacsv Date: Wed, 22 Mar 2023 22:15:59 +0100 Subject: [PATCH] Texture map options not parsed from mtl file #371 --- source/engine/import/importerobj.js | 50 ++++++++++++++++++++--- test/testfiles/obj/texture_parameters.mtl | 15 +++++++ test/testfiles/obj/texture_parameters.obj | 50 +++++++++++++++++++++++ 3 files changed, 110 insertions(+), 5 deletions(-) create mode 100644 test/testfiles/obj/texture_parameters.mtl create mode 100644 test/testfiles/obj/texture_parameters.obj diff --git a/source/engine/import/importerobj.js b/source/engine/import/importerobj.js index c688bcd..0853567 100644 --- a/source/engine/import/importerobj.js +++ b/source/engine/import/importerobj.js @@ -226,13 +226,53 @@ export class ImporterObj extends ImporterBase ProcessMaterialParameter (keyword, parameters, line) { - function CreateTexture (keyword, line, callbacks) + function ExtractTextureParameters (parameters) + { + let textureParameters = new Map (); + let lastParameter = null; + for (let i = 0; i < parameters.length - 1; i++) { + let parameter = parameters[i]; + if (parameter.startsWith ('-')) { + lastParameter = parameter; + textureParameters.set (lastParameter, []); + continue; + } + if (lastParameter !== null) { + textureParameters.get (lastParameter).push (parameter); + } + } + return textureParameters; + } + + function CreateTexture (parameters, callbacks) { let texture = new TextureMap (); - let textureName = NameFromLine (line, keyword.length, '#'); + let textureName = parameters[parameters.length - 1]; let textureBuffer = callbacks.getFileBuffer (textureName); texture.name = textureName; texture.buffer = textureBuffer; + + let textureParameters = ExtractTextureParameters (parameters); + if (textureParameters.has ('-o')) { + let offsetParameters = textureParameters.get ('-o'); + if (offsetParameters.length > 0) { + texture.offset.x = parseFloat (offsetParameters[0]); + } + if (offsetParameters.length > 1) { + texture.offset.y = parseFloat (offsetParameters[1]); + } + } + + if (textureParameters.has ('-s')) { + let scaleParameters = textureParameters.get ('-s'); + if (scaleParameters.length > 0) { + texture.scale.x = parseFloat (scaleParameters[0]); + } + if (scaleParameters.length > 1) { + texture.scale.y = parseFloat (scaleParameters[1]); + } + } + return texture; } @@ -277,20 +317,20 @@ export class ImporterObj extends ImporterBase if (this.currentMaterial === null || parameters.length === 0) { return true; } - this.currentMaterial.diffuseMap = CreateTexture (keyword, line, this.callbacks); + this.currentMaterial.diffuseMap = CreateTexture (parameters, this.callbacks); UpdateMaterialTransparency (this.currentMaterial); return true; } else if (keyword === 'map_ks') { if (this.currentMaterial === null || parameters.length === 0) { return true; } - this.currentMaterial.specularMap = CreateTexture (keyword, line, this.callbacks); + this.currentMaterial.specularMap = CreateTexture (parameters, this.callbacks); return true; } else if (keyword === 'map_bump' || keyword === 'bump') { if (this.currentMaterial === null || parameters.length === 0) { return true; } - this.currentMaterial.bumpMap = CreateTexture (keyword, line, this.callbacks); + this.currentMaterial.bumpMap = CreateTexture (parameters, this.callbacks); return true; } else if (keyword === 'ka') { if (this.currentMaterial === null || parameters.length < 3) { diff --git a/test/testfiles/obj/texture_parameters.mtl b/test/testfiles/obj/texture_parameters.mtl new file mode 100644 index 0000000..745ae31 --- /dev/null +++ b/test/testfiles/obj/texture_parameters.mtl @@ -0,0 +1,15 @@ +newmtl No Parameters +Kd 1.000000 1.000000 1.000000 +map_Kd texture.png + +newmtl Offset +Kd 1.000000 1.000000 1.000000 +map_Kd -o 0.1 0.2 0.0 texture.png + +newmtl Scale +Kd 1.000000 1.000000 1.000000 +map_Kd -s 2.0 3.0 0.0 texture.png + +newmtl Offset and scale +Kd 1.000000 1.000000 1.000000 +map_Kd -o 0.1 0.2 0.0 -s 2.0 3.0 0.0 texture.png diff --git a/test/testfiles/obj/texture_parameters.obj b/test/testfiles/obj/texture_parameters.obj new file mode 100644 index 0000000..0d52b7b --- /dev/null +++ b/test/testfiles/obj/texture_parameters.obj @@ -0,0 +1,50 @@ +# Texture parameters + +mtllib texture_parameters.mtl + +vn 0.0 0.0 1.0 + +vt 0.0 0.0 +vt 1.0 0.0 +vt 1.0 1.0 +vt 0.0 1.0 + +g No parameters +usemtl No Parameters + +v 0.0 0.0 0.0 +v 1.0 0.0 0.0 +v 1.0 1.0 0.0 +v 0.0 1.0 0.0 + +f -4/1/1 -3/2/1 -2/3/1 -1/4/1 + +g Offset +usemtl Offset + +v 1.0 0.0 0.0 +v 2.0 0.0 0.0 +v 2.0 1.0 0.0 +v 1.0 1.0 0.0 + +f -4/1/1 -3/2/1 -2/3/1 -1/4/1 + +g Scale +usemtl Scale + +v 2.0 0.0 0.0 +v 3.0 0.0 0.0 +v 3.0 1.0 0.0 +v 2.0 1.0 0.0 + +f -4/1/1 -3/2/1 -2/3/1 -1/4/1 + +g Offset and scale +usemtl Offset and scale + +v 3.0 0.0 0.0 +v 4.0 0.0 0.0 +v 4.0 1.0 0.0 +v 3.0 1.0 0.0 + +f -4/1/1 -3/2/1 -2/3/1 -1/4/1