VectorLine

From Unify Community Wiki
(Difference between revisions)
Jump to: navigation, search
(VectorLine.js: Made routine for line width > 1 faster and better)
m (Text replace - "<javascript>" to "<syntaxhighlight lang="javascript">")
Line 10: Line 10:
 
Put this script on a camera.  The public variables control the number of points in the line, its color, its thickness, and whether the line should be drawn or not (because disabling the script doesn't stop the OnPostRender function from running).  The linePoints array is an array of Vector2s in normalized viewport coordinates (i.e. (0, 0) is the lower-left corner of the screen and (1,1) is the upper-right).  Currently only one contiguous line is supported, but it would be easy enough to modify it to use an array of Vector2s in order to draw multiple separate lines, if so inclined.  A sample routine, which results in the image above:
 
Put this script on a camera.  The public variables control the number of points in the line, its color, its thickness, and whether the line should be drawn or not (because disabling the script doesn't stop the OnPostRender function from running).  The linePoints array is an array of Vector2s in normalized viewport coordinates (i.e. (0, 0) is the lower-left corner of the screen and (1,1) is the upper-right).  Currently only one contiguous line is supported, but it would be easy enough to modify it to use an array of Vector2s in order to draw multiple separate lines, if so inclined.  A sample routine, which results in the image above:
  
<javascript>private var origPoints : Vector2[];
+
<syntaxhighlight lang="javascript">private var origPoints : Vector2[];
  
 
function Start () {
 
function Start () {
Line 37: Line 37:
  
 
== VectorLine.js ==
 
== VectorLine.js ==
<javascript>var numberOfPoints = 31;
+
<syntaxhighlight lang="javascript">var numberOfPoints = 31;
 
var lineColor = Color.white;
 
var lineColor = Color.white;
 
var lineWidth = 3;
 
var lineWidth = 3;

Revision as of 20:48, 10 January 2012

Author: Eric Haines (Eric5h5)

Description

Draws a vector line on the screen based on normalized viewport coordinates. The line can have an arbitrary width, color, and number of segments, and is defined by an array of Vector2s. Requires Unity Pro, since it uses the GL class.

VectorLines.png

Usage

Put this script on a camera. The public variables control the number of points in the line, its color, its thickness, and whether the line should be drawn or not (because disabling the script doesn't stop the OnPostRender function from running). The linePoints array is an array of Vector2s in normalized viewport coordinates (i.e. (0, 0) is the lower-left corner of the screen and (1,1) is the upper-right). Currently only one contiguous line is supported, but it would be easy enough to modify it to use an array of Vector2s in order to draw multiple separate lines, if so inclined. A sample routine, which results in the image above:

private var origPoints : Vector2[];
 
function Start () {
	linePoints = new Vector2[numberOfPoints];
	origPoints = new Vector2[numberOfPoints];
 
	// Plot points on a circle
	var radians : float = 360.0/(numberOfPoints-1)*Mathf.Deg2Rad;
	var p = 0.0;
	for (i = 0; i < numberOfPoints; i++) {
		linePoints[i] = Vector2(.5 + .25*Mathf.Cos(p), .5 + .25*Mathf.Sin(p));
		origPoints[i] = linePoints[i];
		p += radians;
	}
}
 
function Update () { 
	for (i = 0; i < linePoints.Length; i++) {
		if (i%2 == 0) {var m = .4; var t = 1.0;}
		else {m = .5; t = .5;}
		linePoints[i] = (origPoints[i]-Vector2(.5, .5))*(Mathf.Sin(Time.time*t)+Mathf.PI*m)+Vector2(.5, .5);
	}
}</javascript>
 
This should be in the same script with the VectorLine code, below.
 
== VectorLine.js ==
<syntaxhighlight lang="javascript">var numberOfPoints = 31;
var lineColor = Color.white;
var lineWidth = 3;
var drawLines = true;
private var lineMaterial : Material;
private var linePoints : Vector2[];
private var cam : Camera;
 
function Awake () {
	lineMaterial = new Material( "Shader \"Lines/Colored Blended\" {" +
		"SubShader { Pass {" +
		"   BindChannels { Bind \"Color\",color }" +
		"   Blend SrcAlpha OneMinusSrcAlpha" +
		"   ZWrite Off Cull Off Fog { Mode Off }" +
		"} } }");
	lineMaterial.hideFlags = HideFlags.HideAndDontSave;
	lineMaterial.shader.hideFlags = HideFlags.HideAndDontSave;
	cam = camera;
}
 
function OnPostRender () {
	if (!drawLines || !linePoints || linePoints.Length < 2) {return;}
 
	var nearClip = cam.nearClipPlane + .00001; // Add a bit, else there's flickering when the camera moves
	var end = linePoints.Length - 1;
	var thisWidth = 1.0/Screen.width * lineWidth * .5;
 
	lineMaterial.SetPass(0);
	GL.Color(lineColor);
 
	if (lineWidth == 1) {
		GL.Begin(GL.LINES);
		for (i = 0; i < end; i++) {
			GL.Vertex(cam.ViewportToWorldPoint(Vector3(linePoints[i].x, linePoints[i].y, nearClip)));
			GL.Vertex(cam.ViewportToWorldPoint(Vector3(linePoints[i+1].x, linePoints[i+1].y, nearClip)));
		}
	}
	else {
		GL.Begin(GL.QUADS);
		for (i = 0; i < end; i++) {
			var perpendicular = (Vector3(linePoints[i+1].y, linePoints[i].x, nearClip) -
								 Vector3(linePoints[i].y, linePoints[i+1].x, nearClip)).normalized * thisWidth;
			var v1 = Vector3(linePoints[i].x, linePoints[i].y, nearClip);
			var v2 = Vector3(linePoints[i+1].x, linePoints[i+1].y, nearClip);
			GL.Vertex(cam.ViewportToWorldPoint(v1 - perpendicular));
			GL.Vertex(cam.ViewportToWorldPoint(v1 + perpendicular));
			GL.Vertex(cam.ViewportToWorldPoint(v2 + perpendicular));
			GL.Vertex(cam.ViewportToWorldPoint(v2 - perpendicular));
		}
	}
	GL.End();
}
 
function OnApplicationQuit () {
	DestroyImmediate(lineMaterial);
}
 
@script RequireComponent(Camera)</javascript>
Personal tools
Namespaces

Variants
Actions
Navigation
Extras
Toolbox