createLight method
dynamic
createLight(
- dynamic relationships
Implementation
createLight( relationships ) {
var model;
var lightAttribute;
relationships.children.forEach( ( child ) {
var attr = fbxTree.Objects["NodeAttribute"][ child["ID"] ];
if ( attr != null ) {
lightAttribute = attr;
}
} );
if ( lightAttribute == null ) {
model = new Object3D();
} else {
var type;
// LightType can be null for Point lights
if ( lightAttribute.LightType == null ) {
type = 0;
} else {
type = lightAttribute.LightType.value;
}
var color = Color.fromHex(0xffffff);
if ( lightAttribute.Color != null ) {
color = new Color().fromArray( lightAttribute.Color.value );
}
var intensity = ( lightAttribute.Intensity == null ) ? 1 : lightAttribute.Intensity.value / 100;
// light disabled
if ( lightAttribute.CastLightOnObject != null && lightAttribute.CastLightOnObject.value == 0 ) {
intensity = 0;
}
double distance = 0.0;
if ( lightAttribute.FarAttenuationEnd != null ) {
if ( lightAttribute.EnableFarAttenuation != null && lightAttribute.EnableFarAttenuation.value == 0 ) {
distance = 0.0;
} else {
distance = lightAttribute.FarAttenuationEnd.value;
}
}
// TODO: could this be calculated linearly from FarAttenuationStart to FarAttenuationEnd?
double decay = 1.0;
switch ( type ) {
case 0: // Point
model = new PointLight( color, intensity, distance, decay );
break;
case 1: // Directional
model = new DirectionalLight( color, intensity );
break;
case 2: // Spot
num angle = Math.PI / 3;
if ( lightAttribute.InnerAngle != null ) {
angle = MathUtils.degToRad( lightAttribute.InnerAngle.value );
}
num penumbra = 0;
if ( lightAttribute.OuterAngle != null ) {
// TODO: this is not correct - FBX calculates outer and inner angle in degrees
// with OuterAngle > InnerAngle && OuterAngle <= Math.PI
// while three.js uses a penumbra between (0, 1) to attenuate the inner angle
penumbra = MathUtils.degToRad( lightAttribute.OuterAngle.value );
penumbra = Math.max( penumbra, 1 );
}
model = new SpotLight( color, intensity, distance, angle, penumbra, decay );
break;
default:
print( 'THREE.FBXLoader: Unknown light type ${lightAttribute.LightType.value}, defaulting to a PointLight.' );
model = new PointLight( color, intensity );
break;
}
if ( lightAttribute.CastShadows != null && lightAttribute.CastShadows.value == 1 ) {
model.castShadow = true;
}
}
return model;
}