Browse Source

Merge remote-tracking branch 'refs/remotes/mrdoob/dev' into dev

Dusan Bosnjak 8 years ago
parent
commit
577c00b4c6

+ 1 - 1
docs/api/core/Object3D.html

@@ -273,7 +273,7 @@
 
 		<h3>[method:Vector3 localToWorld]( [page:Vector3 vector] )</h3>
 		<div>
-		vector - A vector representing a position in local (object) spave.<br /><br />
+		vector - A vector representing a position in local (object) space.<br /><br />
 
 		Converts the vector from local space to world space.
 		</div>

+ 1 - 1
docs/api/helpers/FaceNormalsHelper.html

@@ -32,7 +32,7 @@
 
 		helper = new THREE.FaceNormalsHelper( box, 2, 0x00ff00, 1 );
 
-		scene.add( object );
+		scene.add( box );
 		scene.add( helper );
 		</code>
 

+ 1 - 1
docs/api/materials/Material.html

@@ -236,7 +236,7 @@
 		<h3>[page:EventDispatcher EventDispatcher] methods are available on this class.</h3>
 
 		<h3>[method:Material clone]( )</h3>
-		<div>Return a new materials with the same parameters as this material.</div>
+		<div>Return a new material with the same parameters as this material.</div>
 
 		<h3>[method:Material copy]( [page:material material] )</h3>
 		<div>Copy the parameters from the passed material into this material.</div>

+ 3 - 3
docs/api/textures/CompressedTexture.html

@@ -25,11 +25,11 @@
 
 		<h3>[name]( [page:Array mipmaps], [page:Number width], [page:Number height], [page:Constant format], [page:Constant type], [page:Constant mapping], [page:Constant wrapS], [page:Constant wrapT], [page:Constant magFilter], [page:Constant minFilter], [page:Number anisotropy] )</h3>
 		<div>
-		[page:Array mipmaps] -- The mipmaps array should contains objects with data, width and height. The mipmaps should be from of the correct format and type. <br />
+		[page:Array mipmaps] -- The mipmaps array should contain objects with data, width and height. The mipmaps should be of the correct format and type.<br />
 
-		[page:Number width] -- The width of the biggest mipmap<br />
+		[page:Number width] -- The width of the biggest mipmap.<br />
 
-		[page:Number height] -- The height of the biggest mipmap <br />
+		[page:Number height] -- The height of the biggest mipmap.<br />
 
 		[page:Constant format] -- The format used in the mipmaps.
 		See [page:Textures ST3C Compressed Texture Formats],

+ 1 - 1
docs/manual/introduction/Creating-text.html

@@ -62,7 +62,7 @@
 		<div>
 			<p>
 				Use this method if you prefer to work purely in three.js or create procedural and dynamic 3d
-				text geometries. However, font data files in THREE.js JSON format needs to be loaded
+				text geometries. However, font data files in THREE.js JSON format need to be loaded
 				before this will work.
 				See the [page:TextGeometry] page for examples of JSON fonts.
 			</p>

+ 3 - 3
docs/manual/introduction/Drawing-lines.html

@@ -27,7 +27,7 @@ camera.lookAt(new THREE.Vector3(0, 0, 0));
 
 var scene = new THREE.Scene();
 			</code>
-			<p>Next thing we will do is define a material. For lines we have to use [page:LineBasicMaterial] oe [page:LineDashedMaterial].</p>
+			<p>Next thing we will do is define a material. For lines we have to use [page:LineBasicMaterial] or [page:LineDashedMaterial].</p>
 			<code>
 //create a blue LineBasicMaterial
 var material = new THREE.LineBasicMaterial({ color: 0x0000ff });
@@ -35,7 +35,7 @@ var material = new THREE.LineBasicMaterial({ color: 0x0000ff });
 
 			<p>
 				After material we will need a [page:Geometry] or [page:BufferGeometry] with some vertices
-				(it's reccomended to use a BufferGeometry as it's more performant, however for simplicity we'll use a Geometry here):
+				(it's recommended to use a BufferGeometry as it's more performant, however for simplicity we'll use a Geometry here):
 			</p>
 
 			<code>
@@ -58,7 +58,7 @@ scene.add(line);
 renderer.render(scene, camera);
 			</code>
 
-			<p>You should now be seeing a arrow pointing upwards, made from two blue lines.</p>
+			<p>You should now be seeing an arrow pointing upwards, made from two blue lines.</p>
 		</div>
 	</body>
 </html>

+ 2 - 3
docs/manual/introduction/How-to-run-thing-locally.html

@@ -26,10 +26,10 @@
 
 			<ol>
 				<li>
-					Change security for local files in a browser (this allows you to access your page as <code>file:///yourFile.html</code>
+					Change security for local files in a browser. This allows you to access your page as: <code>file:///yourFile.html</code>
 				</li>
 				<li>
-					Run files from a local web server (this allows you to access your page as <code>http://localhost/yourFile.html</code>
+					Run files from a local web server. This allows you to access your page as: <code>http://localhost/yourFile.html</code>
 				</li>
 			</ol>
 
@@ -165,7 +165,6 @@ ruby -r webrick -e "s = WEBrick::HTTPServer.new(:Port => 8000, :DocumentRoot =>
 					<li>
 						Create a configuration file called lighttpd.conf in the directory where you want to run
 						your webserver. There is a sample [link:http://redmine.lighttpd.net/projects/lighttpd/wiki/TutorialConfiguration here].
-						 page.
 					 </li>
 					<li>
 						In the conf file, change the server.document-root to the directory you want to serve files from.

+ 3 - 3
docs/manual/introduction/How-to-update-things.html

@@ -10,7 +10,7 @@
 	<body>
 		<h1>[name]</h1>
 		<div>
-			<p>All objects by default automatically update their matrices if the have been added to the scene with</p>
+			<p>All objects by default automatically update their matrices if they have been added to the scene with</p>
 			<code>
 var object = new THREE.Object3D;
 scene.add( object );
@@ -44,8 +44,8 @@ object.updateMatrix();
 					work with.
 				</p>
 				<p>
-					With regards to updating BufferGeometries, the most important thing to understand is that you
-					you cannot resize buffers (this is very costly,	basically the equivalent to creating new a geometry).
+					With regards to updating BufferGeometries, the most important thing to understand is that
+					you cannot resize buffers (this is very costly,	basically the equivalent to creating a new geometry).
 					You can however update the content of buffers.
 				</p>
 				<p>

+ 3 - 3
docs/manual/introduction/Useful-links.html

@@ -51,7 +51,7 @@
 			</li>
 		 <li>
 			 [link:https://www.udacity.com/course/cs291 Interactive 3D Graphics] - a free course on Udacity that teaches the fundamentals of 3D Graphics,
-			 and uses three.js as it coding tool.
+			 and uses three.js as its coding tool.
 		 </li>
 		 <li>
 			[Link:https://aerotwist.com/tutorials/ Aerotwist] tutorials by [link:https://github.com/paullewis/ Paul Lewis].
@@ -81,7 +81,7 @@
 		<ul>
 			<li>
 				[link:http://threejsdoc.appspot.com/doc/index.html threejsdoc] - less descriptive than the official docs here, however this is
-				useful because it links every API element to to every official three.js [link:https://threejs.org/examples/ example] that uses it.
+				useful because it links every API element to every official three.js [link:https://threejs.org/examples/ example] that uses it.
 			</li>
 			<li>
 				[link:http://ushiroad.com/3j/ Three.js walking map] - a graphical breakdown of the structure of a three.js scene.
@@ -97,7 +97,7 @@
 				[link:http://www.reddit.com/r/webgl/ WebGL on reddit]
 			</li>
 			<li>
-				[link:http://learningwebgl.com/blog/ Learning WebGL Blog] – The authoritaive news source for WebGL.
+				[link:http://learningwebgl.com/blog/ Learning WebGL Blog] – The authoritive news source for WebGL.
 			</li>
 			<li>
 				[link:https://plus.google.com/104300307601542851567/posts Three.js posts] on Google+ – frequent posts on Three.js

+ 5 - 2
examples/js/curves/NURBSCurve.js

@@ -13,11 +13,14 @@
  *	NURBS curve
  **************************************************************/
 
-THREE.NURBSCurve = function ( degree, knots /* array of reals */, controlPoints /* array of Vector(2|3|4) */ ) {
+THREE.NURBSCurve = function ( degree, knots /* array of reals */, controlPoints /* array of Vector(2|3|4) */, startKnot /* index in knots */, endKnot /* index in knots */ ) {
 
 	this.degree = degree;
 	this.knots = knots;
 	this.controlPoints = [];
+	// Used by periodic NURBS to remove hidden spans
+	this.startKnot = startKnot || 0;
+	this.endKnot = endKnot || ( this.knots.length - 1 );
 	for ( var i = 0; i < controlPoints.length; ++ i ) {
 
 		// ensure Vector4 for control points
@@ -35,7 +38,7 @@ THREE.NURBSCurve.prototype.constructor = THREE.NURBSCurve;
 
 THREE.NURBSCurve.prototype.getPoint = function ( t ) {
 
-	var u = this.knots[ 0 ] + t * ( this.knots[ this.knots.length - 1 ] - this.knots[ 0 ] ); // linear mapping t->u
+	var u = this.knots[ this.startKnot ] + t * ( this.knots[ this.endKnot ] - this.knots[ this.startKnot ] ); // linear mapping t->u
 
 	// following results in (wx, wy, wz, w) homogeneous point
 	var hpoint = THREE.NURBSUtils.calcBSplinePoint( this.degree, this.knots, this.controlPoints, u );

+ 4 - 4
examples/js/loaders/3MFLoader.js

@@ -418,10 +418,10 @@ THREE.ThreeMFLoader.prototype = {
 					} );
 					var mat4 = new THREE.Matrix4();
 					buildItem[ 'transform' ] = mat4.set(
-						t[ 0 ], t[  1 ], t[  2 ], 0.0,
-						t[ 3 ], t[  4 ], t[  5 ], 0.0,
-						t[ 6 ], t[  7 ], t[  8 ], 0.0,
-						t[ 9 ], t[ 10 ], t[ 11 ], 1.0
+						t[ 0 ], t[  3 ], t[  6 ], t[  9 ],
+						t[ 1 ], t[  4 ], t[  7 ], t[ 10 ],
+						t[ 2 ], t[  5 ], t[  8 ], t[ 11 ],
+						   0.0,     0.0,     0.0,     1.0
 					);
 
 				}

+ 17 - 3
examples/js/loaders/FBXLoader.js

@@ -10,7 +10,7 @@
  *  - normal / uv
  *  - material (Multi-Material too)
  *  - textures (Must be in same directory)
- *  - nurbs
+ *  - nurbs (Open, Closed and Periodic forms)
  *
  *  No Support
  *  - morph
@@ -377,6 +377,7 @@
 
 			}
 
+			var degree = order - 1;
 			var knots = this.parseFloatList( nurbsInfo.subNodes.KnotVector.properties.a );
 
 			var controlPoints = [];
@@ -389,17 +390,30 @@
 
 			}
 
+			var startKnot, endKnot;
+
 			if ( nurbsInfo.properties.Form == "Closed" ) {
 
 				controlPoints.push( controlPoints[ 0 ] );
 
+			} else if ( nurbsInfo.properties.Form === 'Periodic' ) {
+
+				startKnot = degree;
+				endKnot = knots.length - 1 - startKnot;
+
+				for ( var i = 0; i < degree; ++ i ) {
+
+					controlPoints.push( controlPoints[ i ] );
+
+				}
+
 			}
 
-			var curve = new THREE.NURBSCurve( order - 1, knots, controlPoints );
+			var curve = new THREE.NURBSCurve( degree, knots, controlPoints, startKnot, endKnot );
 
 			// Pre-generate a geometry
 			var geometry = new THREE.Geometry();
-			geometry.vertices = curve.getPoints( controlPoints.length * 1.5 );
+			geometry.vertices = curve.getPoints( controlPoints.length * 7 );
 
 			var mesh = new THREE.Line( geometry );
 			// Store the THREE.NURBSCurve class so the user can recreate a new geometry with a different number of points

+ 17 - 11
examples/js/loaders/FBXLoader2.js

@@ -12,6 +12,7 @@
  *  Animation
  * 	- Separated Animations based on stacks.
  * 	- Skeletal & Non-Skeletal Animations
+ *  NURBS (Open, Closed and Periodic forms)
  *
  * Needs Support:
  * 	Indexed Buffers
@@ -1010,15 +1011,7 @@
 
 						}
 
-						if ( geometryNode.properties.Form === 'Periodic' ) {
-
-							console.error( "FBXLoader: Currently no support for Periodic Nurbs Curves for geometry ID: " + geometryNode.id + ", using empty geometry buffer." );
-							return new THREE.BufferGeometry();
-
-							//TODO: Support Periodic NURBS curves.
-							//Info Link: https://knowledge.autodesk.com/support/maya/learn-explore/caas/CloudHelp/cloudhelp/2015/ENU/Maya/files/NURBS-overview-Periodic-closed-and-open-geometry-htm.html
-
-						}
+						var degree = order - 1;
 
 						var knots = parseFloatArray( geometryNode.subNodes.KnotVector.properties.a );
 						var controlPoints = [];
@@ -1030,14 +1023,27 @@
 
 						}
 
+						var startKnot, endKnot;
+
 						if ( geometryNode.properties.Form === 'Closed' ) {
 
 							controlPoints.push( controlPoints[ 0 ] );
 
+						} else if ( geometryNode.properties.Form === 'Periodic' ) {
+
+							startKnot = degree;
+							endKnot = knots.length - 1 - startKnot;
+
+							for ( var i = 0; i < degree; ++ i ) {
+
+								controlPoints.push( controlPoints[ i ] );
+
+							}
+
 						}
 
-						var curve = new THREE.NURBSCurve( order - 1, knots, controlPoints );
-						var vertices = curve.getPoints( controlPoints.length * 1.5 );
+						var curve = new THREE.NURBSCurve( degree, knots, controlPoints, startKnot, endKnot );
+						var vertices = curve.getPoints( controlPoints.length * 7 );
 
 						var vertexBuffer = [];
 						for ( var verticesIndex = 0, verticesLength = vertices.length; verticesIndex < verticesLength; ++ verticesIndex ) {

+ 12 - 1
examples/js/loaders/GLTFLoader.js

@@ -1160,7 +1160,18 @@ THREE.GLTFLoader = ( function () {
 
 					}
 
-					Object.assign( materialValues, khr_material.values );
+					// don't copy over unused values to avoid material warning spam
+					var c = ['ambient', 'transparent', 'transparency', 'doubleSided'];
+					var allowedValues = {
+						'CONSTANT': c.concat('emission'),
+						'LAMBERT':  c.concat('emission', 'diffuse'),
+						'BLINN':    c.concat('emission', 'diffuse', 'specular', 'shininess'),
+						'PHONG':    c.concat('emission', 'diffuse', 'specular', 'shininess')
+					};
+
+					allowedValues[khr_material.technique].forEach(function(v){
+						materialValues[v] = khr_material.values[v];
+					});
 
 					if ( khr_material.doubleSided || materialValues.doubleSided ) {
 

+ 99 - 157
examples/models/fbx/nurbs.fbx

@@ -8,169 +8,103 @@ FBXHeaderExtension:  {
 	FBXVersion: 7200
 }
 
-; Object definitions
+; Object properties
 ;------------------------------------------------------------------
 
-Definitions:  {
-	Version: 100
-	Count: 51
-	ObjectType: "Model" {
-		Count: 25
-		PropertyTemplate: "KFbxNode" {
-			Properties70:  {
-				P: "QuaternionInterpolate", "enum", "", "",0
-				P: "RotationOffset", "Vector3D", "Vector", "",0,0,0
-				P: "RotationPivot", "Vector3D", "Vector", "",0,0,0
-				P: "ScalingOffset", "Vector3D", "Vector", "",0,0,0
-				P: "ScalingPivot", "Vector3D", "Vector", "",0,0,0
-				P: "TranslationActive", "bool", "", "",0
-				P: "TranslationMin", "Vector3D", "Vector", "",0,0,0
-				P: "TranslationMax", "Vector3D", "Vector", "",0,0,0
-				P: "TranslationMinX", "bool", "", "",0
-				P: "TranslationMinY", "bool", "", "",0
-				P: "TranslationMinZ", "bool", "", "",0
-				P: "TranslationMaxX", "bool", "", "",0
-				P: "TranslationMaxY", "bool", "", "",0
-				P: "TranslationMaxZ", "bool", "", "",0
-				P: "RotationOrder", "enum", "", "",0
-				P: "RotationSpaceForLimitOnly", "bool", "", "",0
-				P: "RotationStiffnessX", "double", "Number", "",0
-				P: "RotationStiffnessY", "double", "Number", "",0
-				P: "RotationStiffnessZ", "double", "Number", "",0
-				P: "AxisLen", "double", "Number", "",10
-				P: "PreRotation", "Vector3D", "Vector", "",0,0,0
-				P: "PostRotation", "Vector3D", "Vector", "",0,0,0
-				P: "RotationActive", "bool", "", "",0
-				P: "RotationMin", "Vector3D", "Vector", "",0,0,0
-				P: "RotationMax", "Vector3D", "Vector", "",0,0,0
-				P: "RotationMinX", "bool", "", "",0
-				P: "RotationMinY", "bool", "", "",0
-				P: "RotationMinZ", "bool", "", "",0
-				P: "RotationMaxX", "bool", "", "",0
-				P: "RotationMaxY", "bool", "", "",0
-				P: "RotationMaxZ", "bool", "", "",0
-				P: "InheritType", "enum", "", "",0
-				P: "ScalingActive", "bool", "", "",0
-				P: "ScalingMin", "Vector3D", "Vector", "",0,0,0
-				P: "ScalingMax", "Vector3D", "Vector", "",1,1,1
-				P: "ScalingMinX", "bool", "", "",0
-				P: "ScalingMinY", "bool", "", "",0
-				P: "ScalingMinZ", "bool", "", "",0
-				P: "ScalingMaxX", "bool", "", "",0
-				P: "ScalingMaxY", "bool", "", "",0
-				P: "ScalingMaxZ", "bool", "", "",0
-				P: "GeometricTranslation", "Vector3D", "Vector", "",0,0,0
-				P: "GeometricRotation", "Vector3D", "Vector", "",0,0,0
-				P: "GeometricScaling", "Vector3D", "Vector", "",1,1,1
-				P: "MinDampRangeX", "double", "Number", "",0
-				P: "MinDampRangeY", "double", "Number", "",0
-				P: "MinDampRangeZ", "double", "Number", "",0
-				P: "MaxDampRangeX", "double", "Number", "",0
-				P: "MaxDampRangeY", "double", "Number", "",0
-				P: "MaxDampRangeZ", "double", "Number", "",0
-				P: "MinDampStrengthX", "double", "Number", "",0
-				P: "MinDampStrengthY", "double", "Number", "",0
-				P: "MinDampStrengthZ", "double", "Number", "",0
-				P: "MaxDampStrengthX", "double", "Number", "",0
-				P: "MaxDampStrengthY", "double", "Number", "",0
-				P: "MaxDampStrengthZ", "double", "Number", "",0
-				P: "PreferedAngleX", "double", "Number", "",0
-				P: "PreferedAngleY", "double", "Number", "",0
-				P: "PreferedAngleZ", "double", "Number", "",0
-				P: "LookAtProperty", "object", "", ""
-				P: "UpVectorProperty", "object", "", ""
-				P: "Show", "bool", "", "",1
-				P: "NegativePercentShapeSupport", "bool", "", "",1
-				P: "DefaultAttributeIndex", "int", "Integer", "",-1
-				P: "Freeze", "bool", "", "",0
-				P: "LODBox", "bool", "", "",0
-				P: "Lcl Translation", "Lcl Translation", "", "A",0,0,0
-				P: "Lcl Rotation", "Lcl Rotation", "", "A",0,0,0
-				P: "Lcl Scaling", "Lcl Scaling", "", "A",1,1,1
-				P: "Visibility", "Visibility", "", "A",1
-				P: "Visibility Inheritance", "Visibility Inheritance", "", "",1
-			}
+Objects:  {
+	Geometry: 1000, "Geometry::", "NurbsCurve" {
+		GeometryVersion: 124
+		Type: "NurbsCurve"
+		NurbsCurveVersion: 100
+		Order: 3
+		Dimension: 3
+		Form: "Open"
+		Rational: 1
+		Points: *32 {
+			a: 10,20,0,1, 10,20,10,1, 0,20,10,1, -10,20,10,1, -10,20,0,1, -10,20,-10,1, 0,20,-10,1, 10,22,-10,1
 		}
-	}
-	ObjectType: "NodeAttribute" {
-		Count: 2
-		PropertyTemplate: "KFbxNull" {
-			Properties70:  {
-				P: "Color", "ColorRGB", "Color", "",0.8,0.8,0.8
-				P: "Size", "double", "Number", "",100
-				P: "Look", "enum", "", "",1
-			}
+		KnotVector: *11 {
+			a: 0,0,0,0.17,0.33,0.5,0.67,0.83,1,1,1
 		}
 	}
-	ObjectType: "Geometry" {
-		Count: 23
-		PropertyTemplate: "KFbxNurbsCurve" {
-			Properties70:  {
-				P: "Color", "ColorRGB", "Color", "",0.8,0.8,0.8
-				P: "BBoxMin", "Vector3D", "Vector", "",0,0,0
-				P: "BBoxMax", "Vector3D", "Vector", "",0,0,0
-			}
+	Geometry: 1001, "Geometry::", "NurbsCurve" {
+		GeometryVersion: 124
+		Type: "NurbsCurve"
+		NurbsCurveVersion: 100
+		Order: 3
+		Dimension: 3
+		Form: "Closed"
+		Rational: 1
+		Points: *32 {
+			a: 10,15,0,1, 10,15,10,1, 0,15,10,1, -10,15,10,1, -10,15,0,1, -10,15,-10,1, 0,15,-10,1, 10,17,-10,1
+		}
+		KnotVector: *12 {
+			a: 0,0,0,0.14,0.29,0.43,0.57,0.71,0.86,1,1,1
 		}
 	}
-}
-
-; Object properties
-;------------------------------------------------------------------
-
-Objects:  {
-	NodeAttribute: 211671216, "NodeAttribute::Default", "Null" {
-		TypeFlags: "Null"
-	}
-	NodeAttribute: 211674096, "NodeAttribute::Layer 01", "Null" {
-		TypeFlags: "Null"
-	}
-	Geometry: 211707024, "Geometry::", "NurbsCurve" {
+	Geometry: 1003, "Geometry::", "NurbsCurve" {
 		GeometryVersion: 124
 		Type: "NurbsCurve"
 		NurbsCurveVersion: 100
 		Order: 3
 		Dimension: 3
 		Form: "Open"
-		Rational: 1
-		Points: *12 {
-			a: 0,10,-20,1,15,15,0,1,0,0,15,1
+		Rational: 0
+		Points: *28 {
+			a: -7.88491751885913,0,-6.3416140214512,1,-7.55614153653084,0,-2.14888095861657,1,-6.89858957187424,0,6.23658516705268,1,6.75015994493138,0,6.91307446273969,1,8.41087276805083,0,-7.08434013027703,1,4.56806678889053,0,-9.8832858634819,1,-2.6353540655343,1.51455220168221,-9.66990979123821,1
 		}
-		KnotVector: *6 {
-			a: -0,-0,-0,1,1,1
+		KnotVector: *10 {
+			a: 0,0,0,1,2,3,4,5,5,5
 		}
 	}
-	Model: 211686688, "Model::Default", "Null" {
-		Version: 232
-		Properties70:  {
-			P: "ScalingMax", "Vector3D", "Vector", "",0,0,0
-			P: "DefaultAttributeIndex", "int", "Integer", "",0
+	Geometry: 1004, "Geometry::", "NurbsCurve" {
+		GeometryVersion: 124
+		Type: "NurbsCurve"
+		NurbsCurveVersion: 100
+		Order: 3
+		Dimension: 3
+		Form: "Periodic"
+		Rational: 0
+		Points: *28 {
+			a: -7.98766001333675,-5.56797696184566e-17,-7.65184310358704,1,-7.55614153653083,9.29849790468227e-18,-2.14888095861657,1,-6.89858957187424,-5.31636952823902e-17,6.23658516705267,1,6.75015994493138,0,6.91307446273969,1,8.41087276805082,4.96506830649454e-16,-7.08434013027705,1,4.56806678889055,-2.91370319417538e-16,-9.8832858634819,1,-4.88642308254206,1.9878497647079,-9.60322976866206,1
+		}
+		KnotVector: *12 {
+			a: -0.625,-0.3125,0,1,2,3,4,5,5.3125,5.625,6.625,7.625
+		}
+	}
+	Geometry: 1005, "Geometry::", "NurbsCurve" {
+		GeometryVersion: 124
+		Type: "NurbsCurve"
+		NurbsCurveVersion: 100
+		Order: 4
+		Dimension: 3
+		Form: "Periodic"
+		Rational: 0
+		Points: *32 {
+			a: 0.783611624891225,4.79823734098847e-17,-0.783611624891224,1,-1.26431706078293e-16,6.78573232311091e-17,-1.10819418755439,1,-0.783611624891224,4.79823734098847e-17,-0.783611624891224,1,-1.10819418755439,1.96633546161879e-32,-3.21126950723723e-16,1,-0.783611624891224,-4.79823734098847e-17,0.783611624891224,1,-3.33920536359052e-16,-6.78573232311091e-17,1.10819418755439,1,0.783611624891224,-4.79823734098847e-17,0.783611624891224,1,1.10819418755439,-3.64463006790479e-32,5.95213259928059e-16,1
+		}
+		KnotVector: *15 {
+			a: -3,-2,-1,0,1,2,3,4,5,6,7,8,9,10,11
 		}
-		MultiLayer: 0
-		MultiTake: 1
-		Shading: Y
-		Culling: "CullingOff"
 	}
-	Model: 211700960, "Model::Layer 01", "Null" {
-		Version: 232
+	Model: 10, "Model::Layer 01", "Null" {
+	}
+	Model: 100, "Model::Object_1", "NurbsCurve" {
+	}
+	Model: 101, "Model::Object_2", "NurbsCurve" {
+	}
+	Model: 103, "Model::Object_4", "NurbsCurve" {
+	}
+	Model: 104, "Model::Object_5", "NurbsCurve" {
 		Properties70:  {
-			P: "ScalingMax", "Vector3D", "Vector", "",0,0,0
-			P: "DefaultAttributeIndex", "int", "Integer", "",0
+			P: "Lcl Translation", "Lcl Translation", "", "A",0,3.38368368081907,0
 		}
-		MultiLayer: 0
-		MultiTake: 1
-		Shading: Y
-		Culling: "CullingOff"
 	}
-	Model: 211707328, "Model::Object_1", "NurbsCurve" {
-		Version: 232
+	Model: 105, "Model::Object_6", "NurbsCurve" {
 		Properties70:  {
-			P: "ScalingMax", "Vector3D", "Vector", "",0,0,0
-			P: "DefaultAttributeIndex", "int", "Integer", "",0
+			P: "Lcl Translation", "Lcl Translation", "", "A",0.000265865200637982,2.121861293983,0.0232605698569328
+			P: "Lcl Scaling", "Lcl Scaling", "", "A",9.95283433152597,1,9.95283433152597
 		}
-		MultiLayer: 0
-		MultiTake: 1
-		Shading: Y
-		Culling: "CullingOff"
 	}
 }
 
@@ -178,28 +112,36 @@ Objects:  {
 ;------------------------------------------------------------------
 
 Connections:  {
+	;Model::Layer 01, Model::RootNode
+	C: "OO",10,0
 
-	;Model::Default, Model::RootNode
-	C: "OO",211686688,0
+	;Model::Object_1, Model::Layer 01
+	C: "OO",100,10
 
-	;Model::Layer 01, Model::RootNode
-	C: "OO",211700960,0
+	;Geometry::, Model::Object_1
+	C: "OO",1000,100
 
-	;NodeAttribute::Default, Model::Default
-	C: "OO",211671216,211686688
+	;Model::Object_2, Model::Layer 01
+	C: "OO",101,10
 
-	;NodeAttribute::Layer 01, Model::Layer 01
-	C: "OO",211674096,211700960
+	;Geometry::, Model::Object_2
+	C: "OO",1001,101
 
-	;Model::Object_1, Model::Layer 01
-	C: "OO",211707328,211700960
+	;Model::Object_4, Model::Layer 01
+	C: "OO",103,10
 
-	;Geometry::, Model::Object_1
-	C: "OO",211707024,211707328
-}
-;Takes section
-;----------------------------------------------------
+	;Geometry::, Model::Object_4
+	C: "OO",1003,103
+
+	;Model::Object_5, Model::Layer 01
+	C: "OO",104,10
+
+	;Geometry::, Model::Object_5
+	C: "OO",1004,104
+
+	;Model::Object_6, Model::Layer 01
+	C: "OO",105,10
 
-Takes:  {
-	Current: ""
+	;Geometry::, Model::Object_6
+	C: "OO",1005,105
 }