Secure your code as it's written. Use Snyk Code to scan source code in minutes - no build needed - and fix issues immediately.
}
const promises = new Array>();
babylonMaterial.metallic = null;
babylonMaterial.roughness = null;
if (properties.diffuseFactor) {
babylonMaterial.albedoColor = Color3.FromArray(properties.diffuseFactor);
babylonMaterial.alpha = properties.diffuseFactor[3];
}
else {
babylonMaterial.albedoColor = Color3.White();
}
babylonMaterial.reflectivityColor = properties.specularFactor ? Color3.FromArray(properties.specularFactor) : Color3.White();
babylonMaterial.microSurface = properties.glossinessFactor == undefined ? 1 : properties.glossinessFactor;
if (properties.diffuseTexture) {
promises.push(this._loader.loadTextureInfoAsync(`${context}/diffuseTexture`, properties.diffuseTexture, (texture) => {
texture.name = `${babylonMaterial.name} (Diffuse)`;
babylonMaterial.albedoTexture = texture;
}));
}
if (properties.specularGlossinessTexture) {
promises.push(this._loader.loadTextureInfoAsync(`${context}/specularGlossinessTexture`, properties.specularGlossinessTexture, (texture) => {
texture.name = `${babylonMaterial.name} (Specular Glossiness)`;
babylonMaterial.reflectivityTexture = texture;
}));
babylonMaterial.reflectivityTexture.hasAlpha = true;
private _loadSpecularGlossinessPropertiesAsync(context: string, material: IMaterial, properties: IKHRMaterialsPbrSpecularGlossiness, babylonMaterial: Material): Promise {
if (!(babylonMaterial instanceof PBRMaterial)) {
throw new Error(`${context}: Material type not supported`);
}
const promises = new Array>();
babylonMaterial.metallic = null;
babylonMaterial.roughness = null;
if (properties.diffuseFactor) {
babylonMaterial.albedoColor = Color3.FromArray(properties.diffuseFactor);
babylonMaterial.alpha = properties.diffuseFactor[3];
}
else {
babylonMaterial.albedoColor = Color3.White();
}
babylonMaterial.reflectivityColor = properties.specularFactor ? Color3.FromArray(properties.specularFactor) : Color3.White();
babylonMaterial.microSurface = properties.glossinessFactor == undefined ? 1 : properties.glossinessFactor;
if (properties.diffuseTexture) {
promises.push(this._loader.loadTextureInfoAsync(`${context}/diffuseTexture`, properties.diffuseTexture, (texture) => {
texture.name = `${babylonMaterial.name} (Diffuse)`;
babylonMaterial.albedoTexture = texture;
}));
}
if (properties.specularGlossinessTexture) {
promises.push(this._loader.loadTextureInfoAsync(`${context}/specularGlossinessTexture`, properties.specularGlossinessTexture, (texture) => {
texture.name = `${babylonMaterial.name} (Specular Glossiness)`;
babylonMaterial.reflectivityTexture = texture;
const lightRotationQuaternion = Quaternion.RotationYawPitchRoll(yaw, pitch, 0);
if (convertToRightHandedSystem) {
_GLTFUtilities._GetRightHandedQuaternionFromRef(lightRotationQuaternion);
}
if (!lightRotationQuaternion.equals(Quaternion.Identity())) {
node.rotation = lightRotationQuaternion.asArray();
}
}
if (babylonLight.falloffType !== Light.FALLOFF_GLTF) {
Logger.Warn(`${context}: Light falloff for ${babylonLight.name} does not match the ${NAME} specification!`);
}
light = {
type: lightType
};
if (!babylonLight.diffuse.equals(Color3.White())) {
light.color = babylonLight.diffuse.asArray();
}
if (babylonLight.intensity !== 1.0) {
light.intensity = babylonLight.intensity;
}
if (babylonLight.range !== Number.MAX_VALUE) {
light.range = babylonLight.range;
}
if (lightType === LightType.SPOT) {
const babylonSpotLight = babylonLight as SpotLight;
if (babylonSpotLight.angle !== Math.PI / 2.0) {
if (light.spot == null) {
light.spot = {};
}
light.spot.outerConeAngle = babylonSpotLight.angle / 2.0;
private setMetallicRoughnessPbrMaterial(metallicRoughness: Nullable<_IPBRMetallicRoughness>, babylonPBRMaterial: PBRMaterial, glTFMaterial: IMaterial, glTFPbrMetallicRoughness: IMaterialPbrMetallicRoughness, mimeType: ImageMimeType, hasTextureCoords: boolean): Promise {
const materialMap = this._exporter._materialMap;
const materials = this._exporter._materials;
let promises = [];
if (metallicRoughness) {
_GLTFMaterialExporter._SetAlphaMode(glTFMaterial, babylonPBRMaterial);
if (!(_GLTFMaterialExporter.FuzzyEquals(metallicRoughness.baseColor, Color3.White(), _GLTFMaterialExporter._Epsilon) && babylonPBRMaterial.alpha >= _GLTFMaterialExporter._Epsilon)) {
glTFPbrMetallicRoughness.baseColorFactor = [
metallicRoughness.baseColor.r,
metallicRoughness.baseColor.g,
metallicRoughness.baseColor.b,
babylonPBRMaterial.alpha
];
}
if (metallicRoughness.metallic != null && metallicRoughness.metallic !== 1) {
glTFPbrMetallicRoughness.metallicFactor = metallicRoughness.metallic;
}
if (metallicRoughness.roughness != null && metallicRoughness.roughness !== 1) {
glTFPbrMetallicRoughness.roughnessFactor = metallicRoughness.roughness;
}
if (babylonPBRMaterial.backFaceCulling != null && !babylonPBRMaterial.backFaceCulling) {
private _loadUnlitPropertiesAsync(context: string, material: IMaterial, babylonMaterial: Material): Promise {
if (!(babylonMaterial instanceof PBRMaterial)) {
throw new Error(`${context}: Material type not supported`);
}
const promises = new Array>();
babylonMaterial.unlit = true;
const properties = material.pbrMetallicRoughness;
if (properties) {
if (properties.baseColorFactor) {
babylonMaterial.albedoColor = Color3.FromArray(properties.baseColorFactor);
babylonMaterial.alpha = properties.baseColorFactor[3];
}
else {
babylonMaterial.albedoColor = Color3.White();
}
if (properties.baseColorTexture) {
promises.push(this._loader.loadTextureInfoAsync(`${context}/baseColorTexture`, properties.baseColorTexture, (texture) => {
texture.name = `${babylonMaterial.name} (Base Color)`;
babylonMaterial.albedoTexture = texture;
}));
}
}
if (material.doubleSided) {
babylonMaterial.backFaceCulling = false;
babylonMaterial.twoSidedLighting = true;
}
this._loader.loadMaterialAlphaProperties(context, material, babylonMaterial);
return Promise.resolve().then(() => {
const samplers = this._exporter._samplers;
const textures = this._exporter._textures;
const specGloss: _IPBRSpecularGlossiness = {
diffuseColor: babylonPBRMaterial.albedoColor || Color3.White(),
specularColor: babylonPBRMaterial.reflectivityColor || Color3.White(),
glossiness: babylonPBRMaterial.microSurface || 1,
};
let samplerIndex: Nullable = null;
const sampler = this._getGLTFTextureSampler(babylonPBRMaterial.albedoTexture);
if (sampler.magFilter != null && sampler.minFilter != null && sampler.wrapS != null && sampler.wrapT != null) {
samplers.push(sampler);
samplerIndex = samplers.length - 1;
}
if (babylonPBRMaterial.reflectivityTexture && !babylonPBRMaterial.useMicroSurfaceFromReflectivityMapAlpha) {
return Promise.reject("_ConvertPBRMaterial: Glossiness values not included in the reflectivity texture are currently not supported");
}
if ((babylonPBRMaterial.albedoTexture || babylonPBRMaterial.reflectivityTexture) && hasTextureCoords) {
return this._convertSpecularGlossinessTexturesToMetallicRoughnessAsync(babylonPBRMaterial.albedoTexture, babylonPBRMaterial.reflectivityTexture, specGloss, mimeType).then((metallicRoughnessFactors) => {
if (metallicRoughnessFactors.baseColorTextureBase64) {
const glTFBaseColorTexture = this._getTextureInfoFromBase64(metallicRoughnessFactors.baseColorTextureBase64, "bjsBaseColorTexture_" + (textures.length) + ".png", mimeType, babylonPBRMaterial.albedoTexture ? babylonPBRMaterial.albedoTexture.coordinatesIndex : null, samplerIndex);
break;
}
case LightType.SPOT: {
const babylonSpotLight = new SpotLight(name, Vector3.Zero(), Vector3.Backward(), 0, 1, this._loader.babylonScene);
babylonSpotLight.angle = ((light.spot && light.spot.outerConeAngle) || Math.PI / 4) * 2;
babylonSpotLight.innerAngle = ((light.spot && light.spot.innerConeAngle) || 0) * 2;
babylonLight = babylonSpotLight;
break;
}
default: {
throw new Error(`${extensionContext}: Invalid light type (${light.type})`);
}
}
babylonLight.falloffType = Light.FALLOFF_GLTF;
babylonLight.diffuse = light.color ? Color3.FromArray(light.color) : Color3.White();
babylonLight.intensity = light.intensity == undefined ? 1 : light.intensity;
babylonLight.range = light.range == undefined ? Number.MAX_VALUE : light.range;
babylonLight.parent = babylonMesh;
GLTFLoader.AddPointerMetadata(babylonLight, extensionContext);
assign(babylonMesh);
});
});
private _loadMaterialMetallicRoughnessPropertiesAsync(context: string, properties: IMaterialPbrMetallicRoughness, babylonMaterial: Material): Promise {
if (!(babylonMaterial instanceof PBRMaterial)) {
throw new Error(`${context}: Material type not supported`);
}
const promises = new Array>();
if (properties) {
if (properties.baseColorFactor) {
babylonMaterial.albedoColor = Color3.FromArray(properties.baseColorFactor);
babylonMaterial.alpha = properties.baseColorFactor[3];
}
else {
babylonMaterial.albedoColor = Color3.White();
}
babylonMaterial.metallic = properties.metallicFactor == undefined ? 1 : properties.metallicFactor;
babylonMaterial.roughness = properties.roughnessFactor == undefined ? 1 : properties.roughnessFactor;
if (properties.baseColorTexture) {
promises.push(this.loadTextureInfoAsync(`${context}/baseColorTexture`, properties.baseColorTexture, (texture) => {
texture.name = `${babylonMaterial.name} (Base Color)`;
babylonMaterial.albedoTexture = texture;
}));
}
if (properties.metallicRoughnessTexture) {
promises.push(this.loadTextureInfoAsync(`${context}/metallicRoughnessTexture`, properties.metallicRoughnessTexture, (texture) => {
texture.name = `${babylonMaterial.name} (Metallic Roughness)`;
babylonMaterial.metallicTexture = texture;
private _loadMaterialMetallicRoughnessPropertiesAsync(context: string, properties: IMaterialPbrMetallicRoughness, babylonMaterial: Material): Promise {
if (!(babylonMaterial instanceof PBRMaterial)) {
throw new Error(`${context}: Material type not supported`);
}
const promises = new Array>();
if (properties) {
if (properties.baseColorFactor) {
babylonMaterial.albedoColor = Color3.FromArray(properties.baseColorFactor);
babylonMaterial.alpha = properties.baseColorFactor[3];
}
else {
babylonMaterial.albedoColor = Color3.White();
}
babylonMaterial.metallic = properties.metallicFactor == undefined ? 1 : properties.metallicFactor;
babylonMaterial.roughness = properties.roughnessFactor == undefined ? 1 : properties.roughnessFactor;
if (properties.baseColorTexture) {
promises.push(this.loadTextureInfoAsync(`${context}/baseColorTexture`, properties.baseColorTexture, (texture) => {
texture.name = `${babylonMaterial.name} (Base Color)`;
babylonMaterial.albedoTexture = texture;
}));
}
if (properties.metallicRoughnessTexture) {
promises.push(this.loadTextureInfoAsync(`${context}/metallicRoughnessTexture`, properties.metallicRoughnessTexture, (texture) => {
texture.name = `${babylonMaterial.name} (Metallic Roughness)`;
babylonMaterial.metallicTexture = texture;