API Docs for:
Show:

File: ../src/components/spline.js

///@INFO: UNCOMMON
/**
* Spline allows to define splines in 3D
* @class Spline
* @constructor
* @param {String} object to configure from
*/

function Spline( o )
{
	this.enabled = true;
	this._render_in_viewport = false;
	this.path = new LS.Path();
	this._type = LS.Path.LINE;
	this._must_update = false;

	if(o)
		this.configure(o);

	this._max_points = 1024;
	this._range = 0;
}

Object.defineProperty( Spline.prototype, 'render_in_viewport', {
	get: function() { return this._render_in_viewport; },
	set: function(v) { 
		if(this._render_in_viewport == v)
			return;
		this._render_in_viewport = v;
		//set events
		if(!this._root || !this._root.scene)
			return;
		if(v)
			LEvent.bind( this._root.scene, "collectRenderInstances", this.onCollectInstances, this );
		else
			LEvent.unbind( this._root.scene, "collectRenderInstances", this.onCollectInstances, this );
	},
	enumerable: true
});

Object.defineProperty( Spline.prototype, 'type', {
	get: function() { return this.path.type; },
	set: function(v) { 
		this.path.type = v;
		this._must_update = true;
	},
	enumerable: true
});


Spline["@type"] = { type: "enum", values: { line: LS.Path.LINE, spline: LS.Path.SPLINE, bezier: LS.Path.BEZIER } };

Spline.prototype.onAddedToScene = function(scene)
{
	if(this._render_in_viewport)
		LEvent.bind( this._root.scene, "collectRenderInstances", this.onCollectInstances, this );
}

Spline.prototype.onRemovedFromScene = function(scene)
{
	if(this._render_in_viewport)
		LEvent.unbind( this._root.scene, "collectRenderInstances", this.onCollectInstances, this );
}

Spline.prototype.onCollectInstances = function(e, instances)
{
	if(!this.enabled)
		return;

	if(!this._root)
		return;

	if(this.path.getSegments() == 0)
		return;

	if(!this._mesh || this._must_update)
		this.updateMesh();

	var RI = this._render_instance;
	if(!RI)
		this._render_instance = RI = new LS.RenderInstance(this._root, this);

	if(this._root.transform)
		this._root.transform.getGlobalMatrix( RI.matrix );
	RI.setMatrix( RI.matrix ); //force normal
	//mat4.multiplyVec3( RI.center, RI.matrix, vec3.create() );
	mat4.getTranslation( RI.center, RI.matrix );
	RI.setMesh( this._mesh, gl.LINE_STRIP );
	RI.setRange( 0, this._range );
	RI.flags = RI_DEFAULT_FLAGS;
	RI.applyNodeFlags();
	RI.setMaterial( this.material || this._root.getMaterial() );

	instances.push(RI);	
}

Spline.prototype.updateMesh = function()
{
	if(!this._mesh)
		this._mesh = GL.Mesh.load( { vertices: new Float32Array( this._max_points * 3 ) } );
	
	var vertices_buffer = this._mesh.getVertexBuffer("vertices");
	var vertices_data = vertices_buffer.data;

	var total = 0;

	if(this.path.type == LS.Path.LINE)
		total = this.path.getSegments() + 1;
	else
		total = this.path.getSegments() * 10; //10 points per segment

	if(total > this._max_points)
		total = this._max_points;

	this.path.samplePointsTyped( total, vertices_data );
	vertices_buffer.upload( gl.STREAM_TYPE );

	this._range = total;

	this._must_update = false;
}

Spline.prototype.addPoint = function( point )
{
	this.path.addPoint( point );
	this._must_update = true;
}

//not finished yet
//LS.registerComponent( Spline );