|
@@ -112,7 +112,7 @@
|
|
|
|
|
|
}
|
|
}
|
|
|
|
|
|
- // console.log( FBXTree );
|
|
|
|
|
|
+ console.log( FBXTree );
|
|
|
|
|
|
var connections = parseConnections( FBXTree );
|
|
var connections = parseConnections( FBXTree );
|
|
var images = parseImages( FBXTree );
|
|
var images = parseImages( FBXTree );
|
|
@@ -1449,6 +1449,145 @@
|
|
}
|
|
}
|
|
break;
|
|
break;
|
|
|
|
|
|
|
|
+ case 'Light':
|
|
|
|
+ /* ***********
|
|
|
|
+ * Supported light types:
|
|
|
|
+ * DirectionalLight
|
|
|
|
+ * PointLight
|
|
|
|
+ * SpotLight
|
|
|
|
+ *
|
|
|
|
+ * TODO: Support DirectionalLight and SpotLight targets
|
|
|
|
+ ************** */
|
|
|
|
+
|
|
|
|
+ var lightAttribute;
|
|
|
|
+
|
|
|
|
+ for ( var childrenIndex = 0, childrenLength = conns.children.length; childrenIndex < childrenLength; ++ childrenIndex ) {
|
|
|
|
+
|
|
|
|
+ var childID = conns.children[ childrenIndex ].ID;
|
|
|
|
+
|
|
|
|
+ var attr = FBXTree.Objects.subNodes.NodeAttribute[ childID ];
|
|
|
|
+
|
|
|
|
+ if ( attr !== undefined && attr.properties !== undefined ) {
|
|
|
|
+
|
|
|
|
+ lightAttribute = attr.properties;
|
|
|
|
+
|
|
|
|
+ }
|
|
|
|
+
|
|
|
|
+ }
|
|
|
|
+
|
|
|
|
+ if ( lightAttribute === undefined ) {
|
|
|
|
+
|
|
|
|
+ model = new THREE.Object3D();
|
|
|
|
+
|
|
|
|
+ } else {
|
|
|
|
+
|
|
|
|
+ console.log( lightAttribute );
|
|
|
|
+
|
|
|
|
+ var type;
|
|
|
|
+
|
|
|
|
+ // LightType is undefined for Point lights
|
|
|
|
+ if ( lightAttribute.LightType === undefined ) {
|
|
|
|
+
|
|
|
|
+ type = '0';
|
|
|
|
+
|
|
|
|
+ } else {
|
|
|
|
+
|
|
|
|
+ type = lightAttribute.LightType.value;
|
|
|
|
+
|
|
|
|
+ }
|
|
|
|
+
|
|
|
|
+ var color = 0xffffff;
|
|
|
|
+
|
|
|
|
+ if ( lightAttribute.Color !== undefined ) {
|
|
|
|
+
|
|
|
|
+ var temp = lightAttribute.Color.value.split( ',' );
|
|
|
|
+
|
|
|
|
+ var r = parseInt( temp[ 0 ], 10 );
|
|
|
|
+ var g = parseInt( temp[ 1 ], 10 );
|
|
|
|
+ var b = parseInt( temp[ 1 ], 10 );
|
|
|
|
+
|
|
|
|
+ color = new THREE.Color( r, g, b );
|
|
|
|
+
|
|
|
|
+ }
|
|
|
|
+
|
|
|
|
+ var intensity = ( lightAttribute.Intensity === undefined ) ? 1 : lightAttribute.Intensity.value / 100;
|
|
|
|
+
|
|
|
|
+ // light disabled
|
|
|
|
+ if ( lightAttribute.CastLightOnObject !== undefined && lightAttribute.CastLightOnObject.value === '0' ) {
|
|
|
|
+
|
|
|
|
+ intensity = 0;
|
|
|
|
+
|
|
|
|
+ }
|
|
|
|
+
|
|
|
|
+ var distance = 0;
|
|
|
|
+ if ( lightAttribute.FarAttenuationEnd !== undefined ) {
|
|
|
|
+
|
|
|
|
+ if ( lightAttribute.EnableFarAttenuation !== undefined && lightAttribute.EnableFarAttenuation.value === '0' ) {
|
|
|
|
+
|
|
|
|
+ distance = 0;
|
|
|
|
+
|
|
|
|
+ } else {
|
|
|
|
+
|
|
|
|
+ distance = lightAttribute.FarAttenuationEnd.value / 1000;
|
|
|
|
+
|
|
|
|
+ }
|
|
|
|
+
|
|
|
|
+ }
|
|
|
|
+
|
|
|
|
+ // TODO
|
|
|
|
+ // could be calculated linearly from FarAttenuationStart to FarAttenuationEnd ?
|
|
|
|
+ var decay = 1;
|
|
|
|
+
|
|
|
|
+ switch ( type ) {
|
|
|
|
+
|
|
|
|
+ case '0': // Point
|
|
|
|
+ model = new THREE.PointLight( color, intensity, distance, decay );
|
|
|
|
+ break;
|
|
|
|
+
|
|
|
|
+ case '1': // Directional
|
|
|
|
+ model = new THREE.DirectionalLight( color, intensity );
|
|
|
|
+ break;
|
|
|
|
+
|
|
|
|
+ case '2': // Spot
|
|
|
|
+ var angle = Math.PI / 3;
|
|
|
|
+
|
|
|
|
+ if ( lightAttribute.InnerAngle !== undefined ) {
|
|
|
|
+
|
|
|
|
+ angle = THREE.Math.degToRad( lightAttribute.InnerAngle.value );
|
|
|
|
+
|
|
|
|
+ }
|
|
|
|
+
|
|
|
|
+ var penumbra = 0; // Falloff / Field
|
|
|
|
+ if ( lightAttribute.OuterAngle !== undefined ) {
|
|
|
|
+
|
|
|
|
+ // note: 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 = THREE.Math.degToRad( lightAttribute.OuterAngle.value );
|
|
|
|
+ penumbra = Math.max( penumbra, 1 );
|
|
|
|
+
|
|
|
|
+ }
|
|
|
|
+
|
|
|
|
+ model = new THREE.SpotLight( color, intensity, distance, angle, penumbra, decay );
|
|
|
|
+ break;
|
|
|
|
+
|
|
|
|
+ default:
|
|
|
|
+ console.warn( 'THREE.FBXLoader: Unknown light type ' + lightAttribute.LightType + ', defaulting to a THREE.PointLight.' );
|
|
|
|
+ model = new THREE.PointLight( color, intensity );
|
|
|
|
+ break;
|
|
|
|
+
|
|
|
|
+ }
|
|
|
|
+
|
|
|
|
+ if ( lightAttribute.CastShadows !== undefined && lightAttribute.CastShadows.value === '1' ) {
|
|
|
|
+
|
|
|
|
+ model.castShadow = true;
|
|
|
|
+
|
|
|
|
+ }
|
|
|
|
+
|
|
|
|
+ }
|
|
|
|
+
|
|
|
|
+ break;
|
|
|
|
+
|
|
case 'NurbsCurve':
|
|
case 'NurbsCurve':
|
|
var geometry = null;
|
|
var geometry = null;
|
|
|
|
|