-
-
Notifications
You must be signed in to change notification settings - Fork 304
New issue
Have a question about this project? Sign up for a free GitHub account to open an issue and contact its maintainers and the community.
By clicking “Sign up for GitHub”, you agree to our terms of service and privacy statement. We’ll occasionally send you account related emails.
Already on GitHub? Sign in to your account
Gltf Iridescence #2425
base: dev/1.4
Are you sure you want to change the base?
Gltf Iridescence #2425
Changes from 35 commits
5a26f3d
5ecc318
cafc24f
dc69489
221b7b6
0d45d9c
0f14c3f
8871d9b
3b4ffd7
f649a58
598fc56
e33a66f
41ef06f
b5214fc
f36ce02
ff8b7c2
634236f
91e6fa4
3932448
671cace
92b972e
9226d38
ff6a69a
0838968
82d5a8f
39043a2
ad61eed
2b308ec
2c1604f
0be9f2a
88f89f2
b5b9a0a
d7a82de
d1547d4
76c5423
aa41aaf
f4b16fd
File filter
Filter by extension
Conversations
Jump to
Diff view
Diff view
There are no files selected for viewing
Original file line number | Diff line number | Diff line change | ||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||
---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|
@@ -1,4 +1,4 @@ | ||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||
import { MathUtil, Vector3 } from "@galacean/engine-math"; | ||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||
import { MathUtil, Vector3, Vector4 } from "@galacean/engine-math"; | ||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||
import { Engine } from "../Engine"; | ||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||
import { ShaderProperty } from "../shader"; | ||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||
import { Shader } from "../shader/Shader"; | ||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||
|
@@ -20,6 +20,10 @@ export class PBRMaterial extends PBRBaseMaterial { | |||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||
|
||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||
private _anisotropyRotation: number = 0; | ||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||
|
||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||
private static _iridescenceInfoProp = ShaderProperty.getByName("material_IridescenceInfo"); | ||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||
private static _iridescenceThicknessTextureProp = ShaderProperty.getByName("material_IridescenceThicknessTexture"); | ||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||
private static _iridescenceTextureProp = ShaderProperty.getByName("material_IridescenceTexture"); | ||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||
|
||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||
/** | ||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||
* Index Of Refraction. | ||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||
* @defaultValue `1.5` | ||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||
|
@@ -132,6 +136,99 @@ export class PBRMaterial extends PBRBaseMaterial { | |||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||
} | ||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||
} | ||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||
|
||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||
/** | ||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||
* The iridescence intensity factor. | ||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||
* @defaultValue `0.0` | ||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||
*/ | ||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||
get iridescenceFactor(): number { | ||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||
return this.shaderData.getVector4(PBRMaterial._iridescenceInfoProp).x; | ||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||
} | ||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||
|
||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||
set iridescenceFactor(value: number) { | ||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||
const iridescenceInfo = this.shaderData.getVector4(PBRMaterial._iridescenceInfoProp); | ||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||
if (!!iridescenceInfo.x !== !!value) { | ||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||
if (value === 0) { | ||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||
this.shaderData.disableMacro("MATERIAL_ENABLE_IRIDESCENCE"); | ||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||
} else { | ||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||
this.shaderData.enableMacro("MATERIAL_ENABLE_IRIDESCENCE"); | ||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||
} | ||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||
iridescenceInfo.x = value; | ||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||
} | ||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||
|
||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||
/** | ||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||
* The index of refraction of the dielectric thin-film layer. | ||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||
* @defaultValue `1.3` | ||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||
*/ | ||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||
get iridescenceIor(): number { | ||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||
return this.shaderData.getVector4(PBRMaterial._iridescenceInfoProp).y; | ||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||
} | ||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||
|
||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||
set iridescenceIor(value: number) { | ||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||
const iridescenceInfo = this.shaderData.getVector4(PBRMaterial._iridescenceInfoProp); | ||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||
iridescenceInfo.y = value; | ||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||
} | ||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||
|
||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||
Comment on lines
+167
to
+170
There was a problem hiding this comment. Choose a reason for hiding this commentThe reason will be displayed to describe this comment to others. Learn more. Add validation for iridescence IOR. The index of refraction must be greater than 1.0 as it represents a physical property. Apply this diff to add validation: set iridescenceIor(value: number) {
const iridescenceInfo = this.shaderData.getVector4(PBRMaterial._iridescenceInfoProp);
+ value = Math.max(1.0, value);
iridescenceInfo.y = value;
} 📝 Committable suggestion
Suggested change
🧰 Tools🪛 Biome[error] 166-166: Expected a semicolon or an implicit semicolon after a statement, but found none An explicit or implicit semicolon is expected here... ...Which is required to end this statement (parse) [error] 166-166: expected Remove : (parse) [error] 166-166: Expected a semicolon or an implicit semicolon after a statement, but found none An explicit or implicit semicolon is expected here... ...Which is required to end this statement (parse) [error] 166-175: This code is unreachable ... because this statement will return from the function beforehand (lint/correctness/noUnreachable) There was a problem hiding this comment. Choose a reason for hiding this commentThe reason will be displayed to describe this comment to others. Learn more. Add validation for iridescence IOR. The index of refraction must be greater than 1.0 as it represents a physical property. Apply this diff to add validation: set iridescenceIor(value: number) {
const iridescenceInfo = this.shaderData.getVector4(PBRMaterial._iridescenceInfoProp);
+ value = Math.max(1.0, value);
iridescenceInfo.y = value;
} Would you like me to help generate unit tests for this property? 📝 Committable suggestion
Suggested change
🧰 Tools🪛 eslint[error] 160-160: Delete (prettier/prettier) 🪛 GitHub Check: codecov/patch[warning] 164-165: packages/core/src/material/PBRMaterial.ts#L164-L165 [warning] 168-170: packages/core/src/material/PBRMaterial.ts#L168-L170 🪛 GitHub Check: lint[failure] 160-160: |
||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||
/** | ||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||
* The minimum thickness of the thin-film layer given in nanometers. | ||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||
* @defaultValue `100` | ||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||
*/ | ||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||
get iridescenceThicknessMin(): number { | ||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||
return this.shaderData.getVector4(PBRMaterial._iridescenceInfoProp).z; | ||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||
|
||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||
} | ||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||
|
||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||
set iridescenceThicknessMin(value: number) { | ||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||
const iridescenceInfo = this.shaderData.getVector4(PBRMaterial._iridescenceInfoProp); | ||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||
iridescenceInfo.z = value; | ||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||
} | ||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||
|
||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||
/** | ||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||
* The maximum thickness of the thin-film layer given in nanometers. | ||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||
* @defaultValue `400` | ||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||
*/ | ||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||
get iridescenceThicknessMax(): number { | ||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||
return this.shaderData.getVector4(PBRMaterial._iridescenceInfoProp).w; | ||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||
} | ||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||
|
||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||
set iridescenceThicknessMax(value: number) { | ||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||
const iridescenceInfo = this.shaderData.getVector4(PBRMaterial._iridescenceInfoProp); | ||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||
iridescenceInfo.w = value; | ||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||
} | ||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||
|
||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||
There was a problem hiding this comment. Choose a reason for hiding this commentThe reason will be displayed to describe this comment to others. Learn more. Add validation for thickness values. The thickness values need validation to ensure:
Apply this diff to add validation: set iridescenceThicknessMin(value: number) {
const iridescenceInfo = this.shaderData.getVector4(PBRMaterial._iridescenceInfoProp);
+ value = Math.max(0, value);
+ const maxThickness = iridescenceInfo.w;
+ if (value >= maxThickness) {
+ value = maxThickness * 0.9; // Ensure min is less than max
+ }
iridescenceInfo.z = value;
}
set iridescenceThicknessMax(value: number) {
const iridescenceInfo = this.shaderData.getVector4(PBRMaterial._iridescenceInfoProp);
+ value = Math.max(0, value);
+ const minThickness = iridescenceInfo.z;
+ if (value <= minThickness) {
+ value = minThickness * 1.1; // Ensure max is greater than min
+ }
iridescenceInfo.w = value;
} 📝 Committable suggestion
Suggested change
🧰 Tools🪛 Biome[error] 180-180: Expected a semicolon or an implicit semicolon after a statement, but found none An explicit or implicit semicolon is expected here... ...Which is required to end this statement (parse) [error] 180-180: expected Remove : (parse) [error] 180-180: Expected a semicolon or an implicit semicolon after a statement, but found none An explicit or implicit semicolon is expected here... ...Which is required to end this statement (parse) [error] 189-189: Expected a semicolon or an implicit semicolon after a statement, but found none An explicit or implicit semicolon is expected here... ...Which is required to end this statement (parse) [error] 189-189: Expected a semicolon or an implicit semicolon after a statement, but found none An explicit or implicit semicolon is expected here... ...Which is required to end this statement (parse) [error] 193-193: Expected a semicolon or an implicit semicolon after a statement, but found none An explicit or implicit semicolon is expected here... ...Which is required to end this statement (parse) [error] 193-193: expected Remove : (parse) [error] 193-193: Expected a semicolon or an implicit semicolon after a statement, but found none An explicit or implicit semicolon is expected here... ...Which is required to end this statement (parse) [error] 190-190: The setter should not return a value. The setter is here: Returning a value from a setter is ignored. (lint/correctness/noSetterReturn) [error] 189-191: This block statement doesn't serve any purpose and can be safely removed. Standalone block statements without any block-level declarations are redundant in JavaScript and can be removed to simplify the code. (lint/complexity/noUselessLoneBlockStatements) |
||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||
/** | ||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||
* The thickness texture of the thin-film layer. | ||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||
*/ | ||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||
get iridescenceThicknessTexture(): Texture2D { | ||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||
return <Texture2D>this.shaderData.getTexture(PBRMaterial._iridescenceThicknessTextureProp); | ||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||
} | ||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||
|
||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||
set iridescenceThicknessTexture(value: Texture2D) { | ||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||
this.shaderData.setTexture(PBRMaterial._iridescenceThicknessTextureProp, value); | ||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||
|
||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||
if (value) { | ||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||
this.shaderData.enableMacro("MATERIAL_HAS_IRIDESCENCE_THICKNESS_TEXTURE"); | ||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||
} else { | ||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||
this.shaderData.disableMacro("MATERIAL_HAS_IRIDESCENCE_THICKNESS_TEXTURE"); | ||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||
} | ||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||
} | ||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||
|
||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||
/** | ||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||
* The iridescence intensity texture. | ||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||
*/ | ||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||
get iridescenceTexture(): Texture2D { | ||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||
return <Texture2D>this.shaderData.getTexture(PBRMaterial._iridescenceTextureProp); | ||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||
} | ||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||
|
||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||
set iridescenceTexture(value: Texture2D) { | ||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||
this.shaderData.setTexture(PBRMaterial._iridescenceTextureProp, value); | ||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||
|
||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||
if (value) { | ||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||
this.shaderData.enableMacro("MATERIAL_HAS_IRIDESCENCE_TEXTURE"); | ||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||
} else { | ||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||
this.shaderData.disableMacro("MATERIAL_HAS_IRIDESCENCE_TEXTURE"); | ||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||
} | ||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||
} | ||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||
|
||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||
/** | ||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||
* Create a pbr metallic-roughness workflow material instance. | ||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||
* @param engine - Engine to which the material belongs | ||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||
|
@@ -144,6 +241,8 @@ export class PBRMaterial extends PBRBaseMaterial { | |||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||
shaderData.setFloat(PBRMaterial._roughnessProp, 1); | ||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||
shaderData.setFloat(PBRMaterial._iorProp, 1.5); | ||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||
shaderData.setVector3(PBRMaterial._anisotropyInfoProp, new Vector3(1, 0, 0)); | ||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||
shaderData.setVector4(PBRMaterial._iridescenceInfoProp, new Vector4(0, 1.3, 100, 400)); | ||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||
|
||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||
} | ||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||
|
||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||
/** | ||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||
|
Original file line number | Diff line number | Diff line change |
---|---|---|
|
@@ -26,11 +26,11 @@ export interface IKHRLightsPunctual { | |
* Interfaces from the KHR_materials_clearcoat extension | ||
*/ | ||
export interface IKHRMaterialsClearcoat { | ||
clearcoatFactor: number; | ||
clearcoatTexture: ITextureInfo; | ||
clearcoatRoughnessFactor: number; | ||
clearcoatRoughnessTexture: ITextureInfo; | ||
clearcoatNormalTexture: IMaterialNormalTextureInfo; | ||
clearcoatFactor?: number; | ||
clearcoatTexture?: ITextureInfo; | ||
clearcoatRoughnessFactor?: number; | ||
clearcoatRoughnessTexture?: ITextureInfo; | ||
clearcoatNormalTexture?: IMaterialNormalTextureInfo; | ||
There was a problem hiding this comment. Choose a reason for hiding this commentThe reason will be displayed to describe this comment to others. Learn more. thank you |
||
} | ||
|
||
/** | ||
|
@@ -176,6 +176,18 @@ export interface IGalaceanAnimation { | |
}[]; | ||
} | ||
|
||
/** | ||
* Interfaces from the KHR_materials_iridescence extension | ||
*/ | ||
export interface IKHRMaterialsIridescence { | ||
iridescenceFactor?: number; | ||
iridescenceTexture?: ITextureInfo; | ||
iridescenceIor?: number; | ||
iridescenceThicknessMinimum?: number; | ||
iridescenceThicknessMaximum?: number; | ||
iridescenceThicknessTexture?: ITextureInfo; | ||
} | ||
|
||
export type GLTFExtensionSchema = | ||
| IKHRLightsPunctual_Light | ||
| IKHRMaterialsClearcoat | ||
|
@@ -194,4 +206,5 @@ export type GLTFExtensionSchema = | |
| IKHRXmp | ||
| IKHRXmp_Node | ||
| IGalaceanAnimation | ||
| IKHRMaterialsIridescence | ||
| Object; |
Original file line number | Diff line number | Diff line change |
---|---|---|
@@ -0,0 +1,40 @@ | ||
import { PBRMaterial, Texture2D } from "@galacean/engine-core"; | ||
import { GLTFMaterialParser } from "../parser/GLTFMaterialParser"; | ||
import { registerGLTFExtension } from "../parser/GLTFParser"; | ||
import { GLTFParserContext, GLTFParserType } from "../parser/GLTFParserContext"; | ||
import { GLTFExtensionMode, GLTFExtensionParser } from "./GLTFExtensionParser"; | ||
import { IKHRMaterialsIridescence } from "./GLTFExtensionSchema"; | ||
|
||
@registerGLTFExtension("KHR_materials_iridescence", GLTFExtensionMode.AdditiveParse) | ||
class KHR_materials_iridescence extends GLTFExtensionParser { | ||
override additiveParse(context: GLTFParserContext, material: PBRMaterial, schema: IKHRMaterialsIridescence): void { | ||
const { | ||
iridescenceFactor = 0, | ||
iridescenceTexture, | ||
iridescenceIor = 1.3, | ||
iridescenceThicknessMinimum = 100, | ||
iridescenceThicknessMaximum = 400, | ||
iridescenceThicknessTexture | ||
} = schema; | ||
|
||
material.iridescenceFactor = iridescenceFactor; | ||
material.iridescenceIor = iridescenceIor; | ||
material.iridescenceThicknessMin = iridescenceThicknessMinimum; | ||
material.iridescenceThicknessMax = iridescenceThicknessMaximum; | ||
|
||
if (iridescenceTexture) { | ||
GLTFMaterialParser._checkOtherTextureTransform(iridescenceTexture, "Iridescence texture"); | ||
|
||
context.get<Texture2D>(GLTFParserType.Texture, iridescenceTexture.index).then((texture) => { | ||
material.iridescenceTexture = texture; | ||
}); | ||
} | ||
Comment on lines
+28
to
+31
There was a problem hiding this comment. Choose a reason for hiding this commentThe reason will be displayed to describe this comment to others. Learn more. 🛠️ Refactor suggestion Add error handling for texture loading The async texture loading should include error handling to prevent silent failures. context.get<Texture2D>(GLTFParserType.Texture, iridescenceTexture.index).then((texture) => {
material.iridescenceTexture = texture;
-});
+}).catch((error) => {
+ console.warn(`Failed to load iridescence texture: ${error.message}`);
+});
// Similar change for iridescenceThicknessTexture Also applies to: 35-38 |
||
if (iridescenceThicknessTexture) { | ||
GLTFMaterialParser._checkOtherTextureTransform(iridescenceThicknessTexture, "IridescenceThickness texture"); | ||
|
||
context.get<Texture2D>(GLTFParserType.Texture, iridescenceThicknessTexture.index).then((texture) => { | ||
material.iridescenceThicknessTexture = texture; | ||
}); | ||
} | ||
} | ||
} |
There was a problem hiding this comment.
Choose a reason for hiding this comment
The reason will be displayed to describe this comment to others. Learn more.
Fix iridescence factor implementation.
There are two issues in the implementation:
Apply this diff to fix both issues:
📝 Committable suggestion