53 lines
2.1 KiB
C++
53 lines
2.1 KiB
C++
#include "all_includes.hh"
|
|
|
|
QuartierQuadAngle::QuartierQuadAngle(Quad c) : QuartierQuad(c) {
|
|
}
|
|
|
|
bool QuartierQuadAngle::split() {
|
|
for (int i = 0; i < 4; i++) {
|
|
if (Triangle(c[NW+i], c[NE+i], c[SE+i]).angle() >= Angle::d2r(130)) {
|
|
// TODO : maintenant que Triangle::offset prend un paramètre side, on peut simplifier ce bazaar.
|
|
Triangle t1 = Triangle(c[NE+i], c[SE+i], c[SW+i]).inset(BASE, hrw);
|
|
Triangle t2 = Triangle(c[SW+i], c[NW+i], c[NE+i]).inset(BASE, hrw);
|
|
addChild(QuartierTri::factory(seed, 0, t1));
|
|
addChild(QuartierTri::factory(seed, 1, t2));
|
|
addChild(new RouteQuadChaussee(Quad(t1[LEFT], t1[RIGHT], t2[LEFT], t2[RIGHT])));
|
|
addChild(new RouteTriChaussee(Triangle(t2[RIGHT], c[NE+i], t1[LEFT])));
|
|
addChild(new RouteTriChaussee(Triangle(t1[RIGHT], c[SW+i], t2[LEFT])));
|
|
return true;
|
|
}
|
|
}
|
|
|
|
for (int i = 0; i < 4; i++) {
|
|
if (Triangle(c[NW+i], c[NE+i], c[SE+i]).angle() <= Angle::d2r(50)) {
|
|
// "couper ce coin".
|
|
Vertex n = Segment(c[NW+i], c[NE+i]).randomPos(seed, 0, 0.4f, 0.6f);
|
|
Vertex e = Segment(c[NE+i], c[SE+i]).randomPos(seed, 1, 0.4f, 0.6f);
|
|
Triangle tn = Triangle(n, c[NE+i], c[SE+i]);
|
|
Triangle te = Triangle(c[NW+i], c[NE+i], e);
|
|
Quad q;
|
|
if (tn.minAngle() > te.minAngle()) {
|
|
q = Quad(n, c[SE+i], c[SW+i], c[NW+i]).inset(E, hrw);
|
|
Vertex oldtnright = tn[RIGHT];
|
|
tn = tn.inset(BASE, hrw);
|
|
addChild(QuartierTri::factory(seed, 0, tn));
|
|
addChild(QuartierQuad::factory(seed, 1, q));
|
|
addChild(new RouteQuadChaussee(Quad(tn[LEFT], tn[RIGHT], q[SE], q[NE])));
|
|
addChild(new RouteTriChaussee(Triangle(tn[RIGHT], oldtnright, q[SE])));
|
|
} else {
|
|
q = Quad(c[NW+i], e, c[SE+i], c[SW+i]).inset(E, hrw);
|
|
Vertex oldteleft = te[LEFT];
|
|
te = te.inset(BASE, hrw);
|
|
addChild(QuartierTri::factory(seed, 0, te));
|
|
addChild(QuartierQuad::factory(seed, 1, q));
|
|
addChild(new RouteQuadChaussee(Quad(te[LEFT], te[RIGHT], q[SE], q[NE])));
|
|
addChild(new RouteTriChaussee(Triangle(q[NE], oldteleft, te[LEFT])));
|
|
}
|
|
return true;
|
|
}
|
|
}
|
|
// Ne devait jamais arriver ici !
|
|
addChild(new TerrainQuadHerbe(c));
|
|
return true;
|
|
}
|