<jittershader name="gm.billboard.jxs">
	<description>Screen-aligned billboarding geometry shader</description>
	<param name="scale" type="float" default="0.2" />
	<param name="tex0" type="int" default="0" />
	<param name="modelViewProjectionMatrix" type="mat4" state="MODELVIEW_PROJECTION_MATRIX" />
	<param name="modelViewMatrix" type="mat4" state="MODELVIEW_MATRIX" />
	<param name="texdim0" type="vec2" state="TEXDIM0" />
	<param name="position" type="vec3" state="POSITION" />
	<param name="color" type="vec4" state="COLOR" />
	<language name="glsl" version="1.2">
		<bind param="scale" program="gp" />
		<bind param="tex0" program="fp" />
		<program name="vp" type="vertex">
<![CDATA[

#version 120

varying vec2 texdim0;

void main(void)
{
	//just send the things as they are
	gl_Position = gl_Vertex;
	gl_FrontColor = gl_Color;
	
	texdim0 = vec2 (abs(gl_TextureMatrix[0][0][0]),abs(gl_TextureMatrix[0][1][1]));
}

]]>		
		</program>
		<program name="gp" vertices_out="4" input_type="points" output_type="triangle_strip" type="geometry">
<![CDATA[

#version 120
#extension GL_EXT_geometry_shader4 : enable

uniform float scale;

varying in vec2 texdim0[1];
varying out vec2 TC;

void main(void)
{
	vec3 Vx = vec3(	gl_ModelViewMatrix[0].x, 
					gl_ModelViewMatrix[1].x, 
					gl_ModelViewMatrix[2].x);
	
	vec3 Vy = vec3(	gl_ModelViewMatrix[0].y, 
					gl_ModelViewMatrix[1].y, 
					gl_ModelViewMatrix[2].y);

	//vec3 N = cross(Vy, Vx);

	vec3 UL = (-Vx + Vy)*scale;
	vec3 UR = (Vx + Vy)*scale;
	vec3 LR = (Vx - Vy)*scale;
	vec3 LL = (-Vx - Vy)*scale;

	gl_FrontColor = gl_FrontColorIn[0];
	TC = vec2(0., 0.);
	gl_Position = gl_ModelViewProjectionMatrix * vec4(gl_PositionIn[0].xyz+UL, 1.);
	EmitVertex();
	
	gl_FrontColor = gl_FrontColorIn[0];
	TC = vec2(1., 0.)*texdim0[0];
	gl_Position = gl_ModelViewProjectionMatrix * vec4(gl_PositionIn[0].xyz+UR, 1.);	
	EmitVertex();

	gl_FrontColor = gl_FrontColorIn[0];
	TC = vec2(0., 1.)*texdim0[0];
	gl_Position = gl_ModelViewProjectionMatrix * vec4(gl_PositionIn[0].xyz+LL, 1.);
	EmitVertex();
	
	gl_FrontColor = gl_FrontColorIn[0];
	TC = vec2(1., 1.)*texdim0[0];
	gl_Position = gl_ModelViewProjectionMatrix * vec4(gl_PositionIn[0].xyz+LR, 1.);
	EmitVertex();
	
	EndPrimitive();
}


]]>
		</program>
		<program name="fp" type="fragment">
<![CDATA[

#version 120

varying vec2 TC;

uniform sampler2DRect tex0;

void main (void)
{
	vec4 img = texture2DRect(tex0, TC);
	gl_FragColor = gl_Color*img;
}


]]>		
		</program>		
	</language>

	<language name="glsl" version="1.5">
		<bind param="textureMatrix0" program="vp" />
		<bind param="position" program="vp" />
		<bind param="color" program="vp" />	
		<bind param="scale" program="gp" />
		<bind param="texdim0" program="gp" />
		<bind param="modelViewMatrix" program="gp" />
		<bind param="modelViewProjectionMatrix" program="gp" />
		<bind param="tex0" program="fp" />

		<program name="vp" type="vertex">
<![CDATA[

#version 330

in vec3 position;
in vec4 color;

out jit_PerVertex {
	flat vec4 color;
} jit_out;

void main(void)
{
	//just send the things as they are
	gl_Position = vec4(position, 1);
	jit_out.color = color;
}

]]>		
		</program>
		<program name="gp" vertices_out="4" input_type="points" output_type="triangle_strip" type="geometry">
<![CDATA[

#version 330
layout (points) in;
layout (triangle_strip, max_vertices=4) out;

in jit_PerVertex {
	flat vec4 color;
} jit_in[];

out jit_PerVertex {
	flat vec4 color;
	vec2 TC;
};

uniform float scale;
uniform vec2 texdim0;
uniform mat4 modelViewMatrix;
uniform mat4 modelViewProjectionMatrix;

void main(void)
{
	vec3 Vx = vec3(	modelViewMatrix[0].x, 
					modelViewMatrix[1].x, 
					modelViewMatrix[2].x);
	
	vec3 Vy = vec3(	modelViewMatrix[0].y, 
					modelViewMatrix[1].y, 
					modelViewMatrix[2].y);

	vec3 UL = (-Vx + Vy)*scale;
	vec3 UR = (Vx + Vy)*scale;
	vec3 LR = (Vx - Vy)*scale;
	vec3 LL = (-Vx - Vy)*scale;

	color = jit_in[0].color;
	TC = vec2(0., 0.);
	gl_Position = modelViewProjectionMatrix * vec4(gl_in[0].gl_Position.xyz+UL, 1.);
	EmitVertex();
	
	color = jit_in[0].color;
	TC = vec2(1., 0.)*texdim0[0];
	gl_Position = modelViewProjectionMatrix * vec4(gl_in[0].gl_Position.xyz+UR, 1.);	
	EmitVertex();

	color = jit_in[0].color;
	TC = vec2(0., 1.)*texdim0[0];
	gl_Position = modelViewProjectionMatrix * vec4(gl_in[0].gl_Position.xyz+LL, 1.);
	EmitVertex();
	
	color = jit_in[0].color;
	TC = vec2(1., 1.)*texdim0[0];
	gl_Position = modelViewProjectionMatrix * vec4(gl_in[0].gl_Position.xyz+LR, 1.);
	EmitVertex();
	
	EndPrimitive();
}

]]>
		</program>
		<program name="fp" type="fragment">
<![CDATA[

#version 330

in jit_PerVertex {
	flat vec4 color;
	vec2 TC;
} jit_in;

out vec4 color;

uniform sampler2DRect tex0;

void main (void)
{
	vec4 img = texture(tex0, jit_in.TC);
	color = jit_in.color * img;
}

]]>		
		</program>		
	</language>	
</jittershader>
