You are on page 1of 3

#version 430

layout(lines) in;
layout(line_strip, max_vertices = 256) out;

uniform mat4 View;


uniform mat4 Projection;
uniform vec3 control_p1, control_p2, control_p3, control_p4;
uniform int no_of_instances; // primesc de la lab2.cpp
uniform int no_of_generated_points; // primesc de la lab2.cpp

in int instance[2];

vec3 rotateY(vec3 point, float u)


{
float x = point.x * cos(u) - point.z *sin(u);
float z = point.x * sin(u) + point.z *cos(u);
return vec3(x, point.y, z);
}

vec3 rotateZ(vec3 point, float u)


{
float x = point.x * cos(u) - point.y *sin(u);
float y = point.x * sin(u) + point.y *cos(u);
return vec3(x, y, point.z);
}

vec3 translateX(vec3 point, float t)


{
return vec3(point.x + t, point.y, point.z);
}

vec3 translateZ(vec3 point, float t)


{
return vec3(point.x, point.y, point.z + t);
}

vec3 translateY(vec3 point, float t)


{
return vec3(point.x, point.y + t, point.z);
}

vec3 bezier(float t)
{
return control_p1 * pow((1 - t), 3) + control_p2 * 3 * t * pow((1 - t), 2) +
control_p3 * 3 * pow(t, 2) * (1 - t) + control_p4 * pow(t, 3);
}

void main()
{

if (instance[0] < no_of_instances)


{
vec3 delta = vec3(1, 0, 0) * instance[0];
vec3 delta2 = vec3(1, 0, 0) * (instance[0]);
vec3 delta3 = vec3(1, 0, 0) * (instance[0] + 1);
vec3 delta4 = vec3(1, 0, 0) * (instance[0] + 1);
// delta2 = rotateY(delta2, 0.05);
// delta4 = rotateY(delta4, 0.05);

for (float t = 0.0; t < 1; t += 1.0 / no_of_generated_points) {


// delta = rotateZ(delta, 0.05);
// delta2 = rotateZ(delta2, 0.05);
// delta3 = rotateZ(delta3, 0.05);
// delta4 = rotateZ(delta4, 0.05);

delta = translateY(delta, 0.05);


delta2 = translateY(delta2, 0.05);
delta3 = translateY(delta3, 0.05);
delta4 = translateY(delta4, 0.05);

if (t > 0.5) {
delta = translateZ(delta, 0.05);
delta2 = translateZ(delta2, 0.05);
delta3 = translateZ(delta3, 0.05);
delta4 = translateZ(delta4, 0.05);
}

if (t < 0.5) {
delta = translateX(delta, 0.0005);
delta2 = translateX(delta2, 0.0005);
delta3 = translateX(delta3, 0.0005);
delta4 = translateX(delta4, 0.0005);
}

if (t < 0.2) {
delta = translateZ(delta, -0.05);
delta2 = translateZ(delta2, -0.05);
delta3 = translateZ(delta3, -0.05);
delta4 = translateZ(delta4, -0.05);
}

vec3 p1 = bezier(t);
vec3 p2 = bezier(t + 1.0 / no_of_generated_points);
vec3 p3 = bezier(t);
vec3 p4 = bezier(t + 1.0 / no_of_generated_points);

gl_Position = Projection* View * vec4(p1 + delta, 1);


EmitVertex();
gl_Position = Projection * View * vec4(p2 + delta2, 1);
EmitVertex();
gl_Position = Projection * View * vec4(p3 + delta3, 1);
EmitVertex();
gl_Position = Projection * View * vec4(p4 + delta4, 1);
EmitVertex();
// gl_Position = Projection* View * vec4(p1+delta, 1);
EmitVertex();
// gl_Position = Projection * View * vec4(p2 + delta2, 1);
EmitVertex();

//gl_Position = Projection* View * vec4(control_p1, 1);


EmitVertex();
//gl_Position = Projection* View * vec4(control_p2, 1);
EmitVertex();
//gl_Position = Projection* View * vec4(control_p3, 1);
EmitVertex();
//gl_Position = Projection* View * vec4(control_p4, 1);
EmitVertex();
EndPrimitive();
}
}

You might also like