diff --git a/package-lock.json b/package-lock.json index b06b37c..9659509 100644 --- a/package-lock.json +++ b/package-lock.json @@ -15,7 +15,7 @@ "fflate": "0.7.4", "occt-import-js": "0.0.18", "rhino3dm": "8.0.0", - "three": "0.150.1", + "three": "0.151.3", "web-ifc": "0.0.35" }, "devDependencies": { @@ -5190,9 +5190,9 @@ "dev": true }, "node_modules/three": { - "version": "0.150.1", - "resolved": "https://registry.npmjs.org/three/-/three-0.150.1.tgz", - "integrity": "sha512-5C1MqKUWaHYo13BX0Q64qcdwImgnnjSOFgBscOzAo8MYCzEtqfQqorEKMcajnA3FHy1yVlIe9AmaMQ0OQracNA==" + "version": "0.151.3", + "resolved": "https://registry.npmjs.org/three/-/three-0.151.3.tgz", + "integrity": "sha512-+vbuqxFy8kzLeO5MgpBHUvP/EAiecaDwDuOPPDe6SbrZr96kccF0ktLngXc7xA7bzyd3N0t2f6mw3Z9y6JCojQ==" }, "node_modules/timers-ext": { "version": "0.1.7", @@ -9502,9 +9502,9 @@ "dev": true }, "three": { - "version": "0.150.1", - "resolved": "https://registry.npmjs.org/three/-/three-0.150.1.tgz", - "integrity": "sha512-5C1MqKUWaHYo13BX0Q64qcdwImgnnjSOFgBscOzAo8MYCzEtqfQqorEKMcajnA3FHy1yVlIe9AmaMQ0OQracNA==" + "version": "0.151.3", + "resolved": "https://registry.npmjs.org/three/-/three-0.151.3.tgz", + "integrity": "sha512-+vbuqxFy8kzLeO5MgpBHUvP/EAiecaDwDuOPPDe6SbrZr96kccF0ktLngXc7xA7bzyd3N0t2f6mw3Z9y6JCojQ==" }, "timers-ext": { "version": "0.1.7", diff --git a/package.json b/package.json index 4d4e2ac..6189984 100644 --- a/package.json +++ b/package.json @@ -80,7 +80,7 @@ "fflate": "0.7.4", "occt-import-js": "0.0.18", "rhino3dm": "8.0.0", - "three": "0.150.1", + "three": "0.151.3", "web-ifc": "0.0.35" }, "eslintConfig": { diff --git a/source/engine/import/importer3dm.js b/source/engine/import/importer3dm.js index a35a2bb..1da0ba1 100644 --- a/source/engine/import/importer3dm.js +++ b/source/engine/import/importer3dm.js @@ -189,7 +189,7 @@ export class Importer3dm extends ImporterBase let materialIndex = this.GetMaterialIndex (rhinoDoc, rhinoObject, rhinoInstanceReferences); let threeJson = rhinoMesh.toThreejsJSON (); - let mesh = ConvertThreeGeometryToMesh (threeJson.data, materialIndex); + let mesh = ConvertThreeGeometryToMesh (threeJson.data, materialIndex, null); mesh.SetName (rhinoAttributes.name); let userStrings = rhinoAttributes.getUserStrings (); diff --git a/source/engine/import/importerfcstd.js b/source/engine/import/importerfcstd.js index 9a33236..27c8552 100644 --- a/source/engine/import/importerfcstd.js +++ b/source/engine/import/importerfcstd.js @@ -403,7 +403,7 @@ export class ImporterFcstd extends ImporterBase object.color.a ); } - let mesh = ConvertThreeGeometryToMesh (resultMesh, materialIndex); + let mesh = ConvertThreeGeometryToMesh (resultMesh, materialIndex, null); if (object.shapeName !== null) { let indexString = objectMeshIndex.toString ().padStart (3, '0'); mesh.SetName (object.shapeName + ' ' + indexString); diff --git a/source/engine/import/importerocct.js b/source/engine/import/importerocct.js index 4a02372..f47c919 100644 --- a/source/engine/import/importerocct.js +++ b/source/engine/import/importerocct.js @@ -104,7 +104,7 @@ export class ImporterOcct extends ImporterBase let color = RGBColorFromFloatComponents (occtMesh.color[0], occtMesh.color[1], occtMesh.color[2]); materialIndex = colorToMaterial.GetMaterialIndex (color.r, color.g, color.b, null); } - let mesh = ConvertThreeGeometryToMesh (occtMesh, materialIndex); + let mesh = ConvertThreeGeometryToMesh (occtMesh, materialIndex, null); if (occtMesh.name) { mesh.SetName (occtMesh.name); } diff --git a/source/engine/import/importerthree.js b/source/engine/import/importerthree.js index 7d7f511..828b7c6 100644 --- a/source/engine/import/importerthree.js +++ b/source/engine/import/importerthree.js @@ -6,7 +6,7 @@ import { Base64DataURIToArrayBuffer, CreateObjectUrl, GetFileExtensionFromMimeTy import { GetFileExtension, GetFileName } from '../io/fileutils.js'; import { PhongMaterial, TextureMap } from '../model/material.js'; import { Node, NodeType } from '../model/node.js'; -import { ConvertThreeColorToColor, ConvertThreeGeometryToMesh } from '../threejs/threeutils.js'; +import { ConvertThreeColorToColor, ConvertThreeGeometryToMesh, ThreeLinearToSRGBColorConverter } from '../threejs/threeutils.js'; import { ImporterBase } from './importerbase.js'; import * as THREE from 'three'; @@ -21,6 +21,8 @@ export class ImporterThreeBase extends ImporterBase constructor () { super (); + + this.colorConverter = null; } CreateLoader (manager) @@ -155,7 +157,7 @@ export class ImporterThreeBase extends ImporterBase { let mesh = null; if (Array.isArray (threeMesh.material)) { - mesh = ConvertThreeGeometryToMesh (threeMesh.geometry, null); + mesh = ConvertThreeGeometryToMesh (threeMesh.geometry, null, this.colorConverter); if (threeMesh.geometry.attributes.color === undefined || threeMesh.geometry.attributes.color === null) { let materialIndices = []; for (let i = 0; i < threeMesh.material.length; i++) { @@ -179,7 +181,7 @@ export class ImporterThreeBase extends ImporterBase } } else { const materialIndex = this.FindOrCreateMaterial (threeMesh.material); - mesh = ConvertThreeGeometryToMesh (threeMesh.geometry, materialIndex); + mesh = ConvertThreeGeometryToMesh (threeMesh.geometry, materialIndex, this.colorConverter); } if (threeMesh.name !== undefined && threeMesh.name !== null) { mesh.SetName (threeMesh.name); @@ -252,12 +254,12 @@ export class ImporterThreeBase extends ImporterBase let material = new PhongMaterial (); material.name = threeMaterial.name; - material.color = ConvertThreeColorToColor (threeMaterial.color); + material.color = this.ConvertThreeColor (threeMaterial.color); material.opacity = threeMaterial.opacity; material.transparent = threeMaterial.transparent; material.alphaTest = threeMaterial.alphaTest; if (threeMaterial.type === 'MeshPhongMaterial') { - material.specular = ConvertThreeColorToColor (threeMaterial.specular); + material.specular = this.ConvertThreeColor (threeMaterial.specular); material.shininess = threeMaterial.shininess / 100.0; } material.diffuseMap = CreateTexture (threeMaterial.map, this.objectUrlToFileName); @@ -266,6 +268,14 @@ export class ImporterThreeBase extends ImporterBase return material; } + + ConvertThreeColor (threeColor) + { + if (this.colorConverter !== null) { + threeColor = this.colorConverter.Convert (threeColor); + } + return ConvertThreeColorToColor (threeColor); + } } export class ImporterThreeFbx extends ImporterThreeBase @@ -273,6 +283,7 @@ export class ImporterThreeFbx extends ImporterThreeBase constructor () { super (); + this.colorConverter = new ThreeLinearToSRGBColorConverter (); } CanImportExtension (extension) diff --git a/source/engine/main.js b/source/engine/main.js index fcb3435..bf43fb4 100644 --- a/source/engine/main.js +++ b/source/engine/main.js @@ -63,7 +63,7 @@ import { Triangle } from './model/triangle.js'; import { ParameterListBuilder, ParameterListParser, CreateUrlBuilder, CreateUrlParser, CreateModelUrlParameters, ParameterConverter } from './parameters/parameterlist.js'; import { ModelToThreeConversionParams, ModelToThreeConversionOutput, ThreeConversionStateHandler, ThreeNodeTree, ConvertModelToThreeObject } from './threejs/threeconverter.js'; import { ThreeModelLoader } from './threejs/threemodelloader.js'; -import { HasHighpDriverIssue, GetShadingType, ConvertThreeColorToColor, ConvertColorToThreeColor, ConvertThreeGeometryToMesh, DisposeThreeObjects, ShadingType } from './threejs/threeutils.js'; +import { ThreeColorConverter, ThreeLinearToSRGBColorConverter, HasHighpDriverIssue, GetShadingType, ConvertThreeColorToColor, ConvertColorToThreeColor, ConvertThreeGeometryToMesh, DisposeThreeObjects, ShadingType } from './threejs/threeutils.js'; import { Camera, CameraIsEqual3D, CameraMode } from './viewer/camera.js'; import { GetIntegerFromStyle, GetDomElementExternalWidth, GetDomElementExternalHeight, GetDomElementInnerDimensions, GetDomElementClientCoordinates, CreateDomElement, AddDomElement, AddDiv, ClearDomElement, InsertDomElementBefore, InsertDomElementAfter, ShowDomElement, IsDomElementVisible, SetDomElementWidth, SetDomElementHeight, GetDomElementOuterWidth, GetDomElementOuterHeight, SetDomElementOuterWidth, SetDomElementOuterHeight, CreateDiv } from './viewer/domutils.js'; import { EmbeddedViewer, Init3DViewerFromUrlList, Init3DViewerFromFileList, Init3DViewerElements } from './viewer/embeddedviewer.js'; @@ -282,6 +282,8 @@ export { ThreeNodeTree, ConvertModelToThreeObject, ThreeModelLoader, + ThreeColorConverter, + ThreeLinearToSRGBColorConverter, HasHighpDriverIssue, GetShadingType, ConvertThreeColorToColor, diff --git a/source/engine/threejs/threeutils.js b/source/engine/threejs/threeutils.js index 057d572..bc8e0f8 100644 --- a/source/engine/threejs/threeutils.js +++ b/source/engine/threejs/threeutils.js @@ -89,6 +89,22 @@ export function GetShadingType (model) } } +export class ThreeColorConverter +{ + Convert (color) + { + return null; + } +} + +export class ThreeLinearToSRGBColorConverter extends ThreeColorConverter +{ + Convert (color) + { + return new THREE.Color ().copyLinearToSRGB (color); + } +} + export function ConvertThreeColorToColor (threeColor) { return RGBColorFromFloatComponents (threeColor.r, threeColor.g, threeColor.b); @@ -103,7 +119,7 @@ export function ConvertColorToThreeColor (color) ); } -export function ConvertThreeGeometryToMesh (threeGeometry, materialIndex) +export function ConvertThreeGeometryToMesh (threeGeometry, materialIndex, colorConverter) { let mesh = new Mesh (); @@ -122,6 +138,9 @@ export function ConvertThreeGeometryToMesh (threeGeometry, materialIndex) let colorItemSize = threeGeometry.attributes.color.itemSize || 3; for (let i = 0; i < colors.length; i += colorItemSize) { let threeColor = new THREE.Color (colors[i], colors[i + 1], colors[i + 2]); + if (colorConverter !== null) { + threeColor = colorConverter.Convert (threeColor); + } mesh.AddVertexColor (ConvertThreeColorToColor (threeColor)); } }