2011-m2s3-city-builder/rules/batiment/batimentquadpont.cpp
Georges Dupéron c87e38b4bb Corrections.
2012-01-13 16:01:03 +01:00

71 lines
1.8 KiB
C++

#include "all_includes.hh"
BatimentQuadPont::BatimentQuadPont(Quad _c, float _height) : Chose(), c(_c), height(_height) {
addEntropy(c);
}
void BatimentQuadPont::getBoundingBoxPoints() {
addBBPoints(c);
addBBPoints(c + Vertex(0,0,height)); // TODO
}
float BatimentQuadPont::ct(float x) {
return (float)(1 - cosh(x / 1.f));
}
float BatimentQuadPont::nt(float x, float _height) {
return (ct(x) + -ct(-1.7f))/(ct(0)+ -ct(-1.7f)) * _height;
}
void BatimentQuadPont::triangulation() {
//triangles.reserve(2);
float var;
Quad q = c;
Vertex a,b;
height -= 20;
Vertex pa = c[NW];
Vertex pb = c[SW];
Quad ch = c + Vertex(0,0,height+20);
Vertex l1 = c[NE] - c[NW];
Vertex l2 = c[SW] - c[SE];
float pas = 0.1f;
int steps = (int)(Angle::Pi / pas);
float n2 = l2.norm()/(Angle::Pi / pas);
n2=n2;
int middle = steps/2;
int n;
addGPUTriangle(c[SW],pb,ch[SW],0xD0D0D0);
addGPUTriangle(pa,c[NW],ch[NW],0xD0D0D0);
for(var=-1.7f, n=0; var <= 1.7f; var+=pas, n++) {
q = q.inset(W,n2);
a = q[NW] + Vertex(0,0,nt(var,height));
b = q[SW] + Vertex(0,0,nt(var,height));
addGPUQuad(a,b,pb,pa,0xD0D0D0);
if( n < middle) {
addGPUTriangle(pa,a,ch[NW],0xD0D0D0);
addGPUTriangle(b,pb,ch[SW],0xD0D0D0);
}
else if(n == middle) {
addGPUTriangle(pa,a,ch[NW],0xD0D0D0);
addGPUTriangle(b,pb,ch[SW],0xD0D0D0);
addGPUTriangle(a,ch[NE],ch[NW],0xD0D0D0);
addGPUTriangle(b,ch[SW],ch[SE],0xD0D0D0);
}
else {
addGPUTriangle(pa,a,ch[NE],0xD0D0D0);
addGPUTriangle(b,pb,ch[SE],0xD0D0D0);
}
pa = a;
pb = b;
}
addGPUTriangle(c[SE],pb,ch[SE],0xD0D0D0);
addGPUTriangle(c[NE],pa,ch[NE],0xD0D0D0);
}