package detectiongame.proto;
import engine.Vec3f;
import engine.model.Material;
import java.util.Vector;
import org.lwjgl.opengl.ARBMultitexture;
import static org.lwjgl.opengl.GL11.*;
public class Streets {
private Vector<Vec3f> nodes;
private Vector<Float> rads;
private float width,vOffset;
private Material mat;
public Streets(Material material,int type,float wid){
mat = material;
nodes = new Vector<>();
vOffset = 0f;
if(type == 0) {
nodes.add(new Vec3f(0, 0, 0));
for(int i=0;i<32;i++){
nodes.add(new Vec3f(nodes.lastElement().x+1f, 0, nodes.lastElement().z+(float)Math.sin((float)i/5f)*0.3f));
}
float x,z;
x = nodes.lastElement().x;
z = nodes.lastElement().z;
for(int i=0;i<22;i++){
nodes.add(new Vec3f(
x+(float)Math.sin(((float)i)/10f)*8f+1f,
0,
z-(float)Math.cos(((float)i)/10f)*8f+8f
));
}
x = nodes.lastElement().x-0.5f;
z = nodes.lastElement().z;
for(int i=0;i<64;i++){
nodes.add(new Vec3f(x-i/2f, 0, z+(float)Math.sin((float)i/8f+0.15f)*6f));
}
}
else if(type == 1){
for(int i=0;i<70;i++){
nodes.add(new Vec3f((float)Math.sin(((float)i)/10f)*8f, 0,(float)Math.cos(((float)i)/10f)*8f));
}
}
else if(type == 2){
Vector<Vec3f> tnodes = new Vector<>();
float x,z,c;
tnodes.add(new Vec3f(0,0,0));
tnodes.add(new Vec3f(1,0,10));
tnodes.add(new Vec3f(20,0,10));
tnodes.add(new Vec3f(20,0,25));
for(int i=1;i<tnodes.size();i++){
x = tnodes.get(i).x - tnodes.get(i-1).x;
z = tnodes.get(i).z - tnodes.get(i-1).z;
c = (float)Math.sqrt(x*x+z*z);
for(float r=0;r<c;r++){
//nodes.add(new Vec3f(tnodes.get(i-1).x+(x/r)*(float)Math.sin(0.31415*r), 0, tnodes.get(i-1).z+(z/r)*(float)Math.cos(0.31415*r)));
nodes.add(new Vec3f(tnodes.get(i-1).x+(x/c*r), 0, tnodes.get(i-1).z+(z/c*r)));
}
}
}
else if(type == 3){
nodes.add(new Vec3f(0,0,0));
nodes.add(new Vec3f(1,0,10));
nodes.add(new Vec3f(20,0,10));
nodes.add(new Vec3f(20,0,25));
}
else if(type == 4){
float radx=0f,rady=0f,offsetx=0f,offsety;
nodes.add(new Vec3f(0, 0, 0));
for(int i=0;i<100;i++){
offsetx = (float)Math.random()/8f;
offsety = (float)Math.random()/8f;
for(int r=0;r<10;r++){
nodes.add(new Vec3f(nodes.lastElement().x+(float)Math.sin(radx)*2f, i/100f, nodes.lastElement().z+(float)Math.cos(rady)*2f));
radx += offsetx;
rady += offsety;
}
}
}
else if(type == 5){
for(int i=0;i<10;i++){
nodes.add(new Vec3f(i, 0, 0));
}
float x = nodes.lastElement().x;
for(int r=0;r<10;r++){
nodes.add(new Vec3f(x, 0, r+1));
}
}
/*
nodes.add(new Vec3f(0, 0, -20));
nodes.add(new Vec3f(0, 0, -10));
nodes.add(new Vec3f(0, 0, 2));
nodes.add(new Vec3f(0, 0, 10));
nodes.add(new Vec3f(-10, 0, 10));
nodes.add(new Vec3f(-20, 0, 10));
nodes.add(new Vec3f(-30, 0, 10));
nodes.add(new Vec3f(-33, 0, 11));
nodes.add(new Vec3f(-36, 0, 12));
nodes.add(new Vec3f(-38, 0, 9));
nodes.add(new Vec3f(-38, 0, 0));
nodes.add(new Vec3f(-38, 0, 0));
*/
width = wid;
rads = new Vector<>();
for(int i=0;i<nodes.size();i++){
if(i == 0){
rads.add((float)Math.atan2(nodes.get(i).z - nodes.get(i+1).z, nodes.get(i).x - nodes.get(i+1).x));
}
else if(i == nodes.size()-1){
rads.add((float)Math.atan2(nodes.get(i-1).z - nodes.get(i).z, nodes.get(i-1).x - nodes.get(i).x));
}
else{
rads.add((float)Math.atan2(nodes.get(i-1).z - nodes.get(i+1).z, nodes.get(i-1).x - nodes.get(i+1).x));
}
}
}
public void exist(){
//vOffset -= 0.01f;
glColor4f(1.0f, 1.0f, 1.0f, 1.0f);
//glDisable(GL_CULL_FACE);
this.mat.shader.enable();
if(mat.texture0 != null && mat.texture0.texture != null){
ARBMultitexture.glActiveTextureARB(ARBMultitexture.GL_TEXTURE0_ARB);
glBindTexture(GL_TEXTURE_2D, mat.texture0.texture.getTextureID());
}
glBegin(GL_TRIANGLES);
Vec3f before = nodes.firstElement(),node;
float rad0,rad1,t[][],v0=0f,v1=-0.0f,v00=0f,v01=0f,d;
t = new float[6][2];
for(int i=1;i<nodes.size()-1;i++){
node = this.nodes.get(i);
rad0 = this.rads.get(i-1);
rad1 = this.rads.get(i);
t[0][0] = this.rotX(rad0, this.width);
t[0][1] = this.rotZ(rad0, this.width);
t[1][0] = this.rotX(rad0, -this.width);
t[1][1] = this.rotZ(rad0, -this.width);
t[2][0] = this.rotX(rad1, -this.width);
t[2][1] = this.rotZ(rad1, -this.width);
t[3][0] = this.rotX(rad0, this.width);
t[3][1] = this.rotZ(rad0, this.width);
t[4][0] = this.rotX(rad1, -this.width);
t[4][1] = this.rotZ(rad1, -this.width);
t[5][0] = this.rotX(rad1, this.width);
t[5][1] = this.rotZ(rad1, this.width);
d = (float)Math.sqrt(Math.pow(before.x-node.x,2)+Math.pow(before.z-node.z,2));
v0 = v0+(float)Math.sqrt(Math.pow(t[1][0]-(t[2][0]+Math.abs(before.x-node.x)), 2)+Math.pow(t[1][1]-(t[2][1]+Math.abs(before.z-node.z)), 2));
v1 = v1+(float)Math.sqrt(Math.pow((t[5][0]+Math.abs(before.x-node.x))-t[3][0], 2)+Math.pow((t[5][1]+Math.abs(before.z-node.z))-t[3][1], 2));
//rad0 = -45f;
glTexCoord2f(0f, v01+vOffset);
glVertex3f(t[0][0]+before.x, before.y, t[0][1]+before.z);
glTexCoord2f(1f, v00+vOffset);
glVertex3f(t[1][0]+before.x, before.y, t[1][1]+before.z);
glTexCoord2f(1f, v0+vOffset);
glVertex3f(t[2][0]+node.x, node.y, t[2][1]+node.z);
glTexCoord2f(0f, v01+vOffset);
glVertex3f(t[3][0]+before.x, before.y, t[3][1]+before.z);
glTexCoord2f(1f, v0+vOffset);
glVertex3f(t[4][0]+node.x, node.y, t[4][1]+node.z);
glTexCoord2f(0f, v1+vOffset);
glVertex3f(t[5][0]+node.x, node.y, t[5][1]+node.z);
v00 = v0;
v01 = v1;
before = node;
}
glEnd();
glBindTexture(GL_TEXTURE_2D,0);
this.mat.shader.disable();
/*
glBegin(GL_LINE_STRIP);
for(int i=0;i<nodes.size();i++){
glVertex3f(nodes.get(i).x, 0.1f, nodes.get(i).z);
}
glEnd();
glPointSize(3.0f);
glColor4f(1.0f, 0.0f, 0.0f, 1.0f);
glBegin(GL_POINTS);
for(int i=0;i<nodes.size();i++){
glVertex3f(nodes.get(i).x, 0.01f, nodes.get(i).z);
}
glEnd();
*/
}
private float rotX(float rad, float z){
return (float)-(z*Math.sin(rad));
}
private float rotZ(float rad, float z){
return (float)(z*Math.cos(rad));
}
private float scaleCorner(float num, float rad){
return (float)(Math.sin(rad*2f)*num*(3.14159f/2f));
}
}