diff --git a/source/engine/main.js b/source/engine/main.js index d970355..a830233 100644 --- a/source/engine/main.js +++ b/source/engine/main.js @@ -44,7 +44,7 @@ import { ArrayBufferToUtf8String, ArrayBufferToAsciiString, AsciiStringToArrayBu import { SetExternalLibLocation, GetExternalLibPath, LoadExternalLibrary } from './io/externallibs.js'; import { GetFileName, GetFileExtension, RequestUrl, ReadFile, TransformFileHostUrls, IsUrl, FileSource, FileFormat } from './io/fileutils.js'; import { TextWriter } from './io/textwriter.js'; -import { RGBColor, RGBAColor, ColorComponentFromFloat, ColorComponentToFloat, RGBColorFromFloatComponents, SRGBToLinear, LinearToSRGB, IntegerToHexString, RGBColorToHexString, RGBAColorToHexString, HexStringToRGBColor, ArrayToRGBColor, RGBColorIsEqual } from './model/color.js'; +import { RGBColor, RGBAColor, ColorComponentFromFloat, ColorComponentToFloat, RGBColorFromFloatComponents, SRGBToLinear, LinearToSRGB, IntegerToHexString, RGBColorToHexString, RGBAColorToHexString, HexStringToRGBColor, HexStringToRGBAColor, ArrayToRGBColor, RGBColorIsEqual } from './model/color.js'; import { GeneratorParams, Generator, GeneratorHelper, GenerateCuboid, GenerateCone, GenerateCylinder, GenerateSphere, GeneratePlatonicSolid } from './model/generator.js'; import { TextureMap, MaterialBase, FaceMaterial, PhongMaterial, PhysicalMaterial, TextureMapIsEqual, TextureIsEqual, MaterialType } from './model/material.js'; import { Mesh } from './model/mesh.js'; @@ -213,6 +213,7 @@ export { RGBColorToHexString, RGBAColorToHexString, HexStringToRGBColor, + HexStringToRGBAColor, ArrayToRGBColor, RGBColorIsEqual, GeneratorParams, diff --git a/source/engine/model/color.js b/source/engine/model/color.js index a651707..73d7afd 100644 --- a/source/engine/model/color.js +++ b/source/engine/model/color.js @@ -157,6 +157,22 @@ export function HexStringToRGBColor (hexString) return new RGBColor (r, g, b); } +export function HexStringToRGBAColor (hexString) +{ + if (hexString.length !== 6 && hexString.length !== 8) { + return null; + } + + let r = parseInt (hexString.substring (0, 2), 16); + let g = parseInt (hexString.substring (2, 4), 16); + let b = parseInt (hexString.substring (4, 6), 16); + let a = 255; + if (hexString.length === 8) { + a = parseInt (hexString.substring (6, 8), 16); + } + return new RGBAColor (r, g, b, a); +} + export function ArrayToRGBColor (arr) { return new RGBColor (arr[0], arr[1], arr[2]); diff --git a/test/tests/model_test.js b/test/tests/model_test.js index 00175da..828897c 100644 --- a/test/tests/model_test.js +++ b/test/tests/model_test.js @@ -229,12 +229,25 @@ describe ('Color Conversion', function () { assert.ok (!OV.RGBColorIsEqual (new OV.RGBColor (10, 20, 30), new OV.RGBColor (10, 20, 31))); }); - it ('Color hex string conversion', function () { + it ('RGB Color hex string conversion', function () { let color = new OV.RGBColor (10, 20, 30); let hexString = '0a141e'; assert.strictEqual (OV.RGBColorToHexString (color), hexString); assert.deepStrictEqual (OV.HexStringToRGBColor (hexString), color); }); + + it ('RGBA Color hex string conversion', function () { + let color = new OV.RGBAColor (10, 20, 30, 40); + let hexString = '0a141e28'; + assert.strictEqual (OV.RGBAColorToHexString (color), hexString); + assert.deepStrictEqual (OV.HexStringToRGBAColor (hexString), color); + + let color2 = new OV.RGBAColor (10, 20, 30, 255); + let hexString2 = '0a141e'; + let hexString2a = '0a141eff'; + assert.strictEqual (OV.RGBAColorToHexString (color2), hexString2a); + assert.deepStrictEqual (OV.HexStringToRGBAColor (hexString2), color2); + }); }); describe ('Node Hierarchy', function () {