|
@@ -1,10 +1,9 @@
|
|
/// <reference path="../../../../../dist/preview release/babylon.d.ts"/>
|
|
/// <reference path="../../../../../dist/preview release/babylon.d.ts"/>
|
|
|
|
|
|
module BABYLON.GLTF2.Extensions {
|
|
module BABYLON.GLTF2.Extensions {
|
|
- const NAME = "KHR_lights";
|
|
|
|
|
|
+ const NAME = "KHR_lights_punctual";
|
|
|
|
|
|
enum LightType {
|
|
enum LightType {
|
|
- AMBIENT = "ambient",
|
|
|
|
DIRECTIONAL = "directional",
|
|
DIRECTIONAL = "directional",
|
|
POINT = "point",
|
|
POINT = "point",
|
|
SPOT = "spot"
|
|
SPOT = "spot"
|
|
@@ -14,10 +13,11 @@ module BABYLON.GLTF2.Extensions {
|
|
light: number;
|
|
light: number;
|
|
}
|
|
}
|
|
|
|
|
|
- interface ILight {
|
|
|
|
|
|
+ interface ILight extends IChildRootProperty {
|
|
type: LightType;
|
|
type: LightType;
|
|
color?: number[];
|
|
color?: number[];
|
|
intensity?: number;
|
|
intensity?: number;
|
|
|
|
+ range?: number;
|
|
spot?: {
|
|
spot?: {
|
|
innerConeAngle?: number;
|
|
innerConeAngle?: number;
|
|
outerConeAngle?: number;
|
|
outerConeAngle?: number;
|
|
@@ -29,7 +29,7 @@ module BABYLON.GLTF2.Extensions {
|
|
}
|
|
}
|
|
|
|
|
|
/**
|
|
/**
|
|
- * [Specification](https://github.com/MiiBond/glTF/tree/khr_lights_v1/extensions/Khronos/KHR_lights) (Experimental)
|
|
|
|
|
|
+ * [Specification](https://github.com/KhronosGroup/glTF/blob/1048d162a44dbcb05aefc1874bfd423cf60135a6/extensions/2.0/Khronos/KHR_lights_punctual/README.md) (Experimental)
|
|
*/
|
|
*/
|
|
export class KHR_lights implements IGLTFLoaderExtension {
|
|
export class KHR_lights implements IGLTFLoaderExtension {
|
|
/** The name of this extension. */
|
|
/** The name of this extension. */
|
|
@@ -62,22 +62,6 @@ module BABYLON.GLTF2.Extensions {
|
|
}
|
|
}
|
|
|
|
|
|
/** @hidden */
|
|
/** @hidden */
|
|
- public loadSceneAsync(context: string, scene: ILoaderScene): Nullable<Promise<void>> {
|
|
|
|
- return GLTFLoader.LoadExtensionAsync<ILightReference>(context, scene, this.name, (extensionContext, extension) => {
|
|
|
|
- const promise = this._loader.loadSceneAsync(context, scene);
|
|
|
|
-
|
|
|
|
- const light = ArrayItem.Get(extensionContext, this._lights, extension.light);
|
|
|
|
- if (light.type !== LightType.AMBIENT) {
|
|
|
|
- throw new Error(`${extensionContext}: Only ambient lights are allowed on a scene`);
|
|
|
|
- }
|
|
|
|
-
|
|
|
|
- this._loader.babylonScene.ambientColor = light.color ? Color3.FromArray(light.color) : Color3.Black();
|
|
|
|
-
|
|
|
|
- return promise;
|
|
|
|
- });
|
|
|
|
- }
|
|
|
|
-
|
|
|
|
- /** @hidden */
|
|
|
|
public loadNodeAsync(context: string, node: ILoaderNode, assign: (babylonMesh: Mesh) => void): Nullable<Promise<Mesh>> {
|
|
public loadNodeAsync(context: string, node: ILoaderNode, assign: (babylonMesh: Mesh) => void): Nullable<Promise<Mesh>> {
|
|
return GLTFLoader.LoadExtensionAsync<ILightReference, Mesh>(context, node, this.name, (extensionContext, extension) => {
|
|
return GLTFLoader.LoadExtensionAsync<ILightReference, Mesh>(context, node, this.name, (extensionContext, extension) => {
|
|
return this._loader.loadNodeAsync(context, node, babylonMesh => {
|
|
return this._loader.loadNodeAsync(context, node, babylonMesh => {
|
|
@@ -85,12 +69,10 @@ module BABYLON.GLTF2.Extensions {
|
|
|
|
|
|
const name = babylonMesh.name;
|
|
const name = babylonMesh.name;
|
|
const light = ArrayItem.Get(extensionContext, this._lights, extension.light);
|
|
const light = ArrayItem.Get(extensionContext, this._lights, extension.light);
|
|
|
|
+
|
|
switch (light.type) {
|
|
switch (light.type) {
|
|
- case LightType.AMBIENT: {
|
|
|
|
- throw new Error(`${extensionContext}: Ambient lights are not allowed on a node`);
|
|
|
|
- }
|
|
|
|
case LightType.DIRECTIONAL: {
|
|
case LightType.DIRECTIONAL: {
|
|
- babylonLight = new DirectionalLight(name, Vector3.Forward(), this._loader.babylonScene);
|
|
|
|
|
|
+ babylonLight = new DirectionalLight(name, Vector3.Backward(), this._loader.babylonScene);
|
|
break;
|
|
break;
|
|
}
|
|
}
|
|
case LightType.POINT: {
|
|
case LightType.POINT: {
|
|
@@ -98,10 +80,10 @@ module BABYLON.GLTF2.Extensions {
|
|
break;
|
|
break;
|
|
}
|
|
}
|
|
case LightType.SPOT: {
|
|
case LightType.SPOT: {
|
|
- // TODO: support inner and outer cone angles
|
|
|
|
- //const innerConeAngle = spotLight.innerConeAngle || 0;
|
|
|
|
- const outerConeAngle = light.spot && light.spot.outerConeAngle || Math.PI / 4;
|
|
|
|
- babylonLight = new SpotLight(name, Vector3.Zero(), Vector3.Forward(), outerConeAngle, 2, this._loader.babylonScene);
|
|
|
|
|
|
+ const babylonSpotLight = new SpotLight(name, Vector3.Zero(), Vector3.Backward(), 0, 2, this._loader.babylonScene);
|
|
|
|
+ babylonSpotLight.angle = light.spot && light.spot.outerConeAngle || Math.PI / 4;
|
|
|
|
+ babylonSpotLight.innerAngle = light.spot && light.spot.innerConeAngle || 0;
|
|
|
|
+ babylonLight = babylonSpotLight;
|
|
break;
|
|
break;
|
|
}
|
|
}
|
|
default: {
|
|
default: {
|
|
@@ -109,8 +91,10 @@ module BABYLON.GLTF2.Extensions {
|
|
}
|
|
}
|
|
}
|
|
}
|
|
|
|
|
|
|
|
+ babylonLight.falloffType = Light.FALLOFF_GLTF;
|
|
babylonLight.diffuse = light.color ? Color3.FromArray(light.color) : Color3.White();
|
|
babylonLight.diffuse = light.color ? Color3.FromArray(light.color) : Color3.White();
|
|
babylonLight.intensity = light.intensity == undefined ? 1 : light.intensity;
|
|
babylonLight.intensity = light.intensity == undefined ? 1 : light.intensity;
|
|
|
|
+ babylonLight.range = light.range == undefined ? Number.MAX_VALUE : light.range;
|
|
babylonLight.parent = babylonMesh;
|
|
babylonLight.parent = babylonMesh;
|
|
|
|
|
|
assign(babylonMesh);
|
|
assign(babylonMesh);
|