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;
}