Correction des quartiers presque convexes (angle > 160).

This commit is contained in:
Georges Dupéron 2012-01-16 17:35:07 +01:00
parent 59ca4daf55
commit 1a819fd8c3
13 changed files with 40 additions and 37 deletions

View File

@ -33,7 +33,7 @@ class Chose;
#include "view.hh"
#include "rules/chose.hh"
#include "rules/architecture/couleurs.hh"
#include "rules/architecture/couleursDimensions.hh"
#include "rules/architecture/arche.hh"
#include "rules/architecture/batiment.hh"

View File

@ -169,8 +169,8 @@ Coin Quad::concaveCorner() {
float dse2 = (nsw - nse).norm();
float dsw1 = (nse - nsw).norm();
float dsw2 = (nnw - nsw).norm();
//float dnw1 = (nsw - nnw).norm();
//float dnw2 = (nne - nnw).norm();
float dnw1 = (nsw - nnw).norm();
float dnw2 = (nne - nnw).norm();
if(dne1 >= 1.5 && dne2 >= 1.5)
return NE;
@ -178,8 +178,10 @@ Coin Quad::concaveCorner() {
return SE;
else if(dsw1 >= 1.5 && dsw2 >= 1.5)
return SW;
else
else if(dnw1 >= 1.5 && dnw2 >= 1.5)
return NW;
else
return maxAngleCorner();
}
bool Quad::isConcave() {
@ -196,7 +198,7 @@ bool Quad::isConcave() {
if(dne1 >= 1.5 || dse1 >= 1.5 || dsw1 >= 1.5 || dnw1 >= 1.5)
return true;
return false;
return (maxAngle() > Angle::d2r(160));
}
Quad operator+(const Quad& q, const Vertex& v) {

View File

@ -11,6 +11,7 @@ float Triangle::cosAngle() const {
}
float Triangle::angle() const {
// TODO : gérer le cas d'un angle à 0 ou 180.
return std::acos(cosAngle());
}

View File

@ -112,7 +112,6 @@ void Lod::addSplitCube(Chose* c) {
splitOut[i].insert(c->lod.splitBox[i], c);
}
}
// TODO : plutôt que d'ajouter puis enlever, précalculer puis enlever si nécessaire.
if (c->lod.inCounter == 6) {
for(int i = 0; i < 6; i++)
splitIn[i].remove(c->lod.splitBox[i], c);

2
lod.hh
View File

@ -5,8 +5,6 @@
class Lod {
private :
// TODO : puisqu'on utilise *soit* la mergeBox, *soit* la
// splitBox, réutiliser le heap In pour merge.
Heap merge[6]; // {xMin, xMax, yMin, yMax, zMin, zMax}.
Heap splitIn[6]; // {xMinIn, xMaxIn, yMinIn, yMaxIn, zMinIn, zMaxIn}.
Heap splitOut[6]; // {xMinOut, xMaxOut, yMinOut, yMaxOut, zMinOut, zMaxOut}.

View File

@ -1,11 +1,9 @@
#include "all_includes.hh"
// TODO : créer les routes dans les bâtiments
int main() {
// Générer une tile de base
std::cout << "Initial seed = " << Chose::initialSeed << std::endl;
float size = 22000;
float size = 200 * 100;
Vertex ne(size, size, 0);
Vertex se(size, 0, 0);
Vertex sw(0, 0, 0);

View File

@ -1,3 +0,0 @@
#include "all_includes.hh"
const unsigned int Couleurs::fog = mix(skyTop, skyBottom, 0.5);

View File

@ -0,0 +1,3 @@
#include "all_includes.hh"
const unsigned int Couleurs::fog = mix(cielHaut, cielBas, 0.5);

View File

@ -1,5 +1,5 @@
#ifndef _RULES_ARCHITECTURE_COLORS_HH_
#define _RULES_ARCHITECTURE_COLORS_HH_
#ifndef _RULES_ARCHITECTURE_COLULEURSDIMENSIONS_HH_
#define _RULES_ARCHITECTURE_COLULEURSDIMENSIONS_HH_
#include "all_includes.hh"
@ -25,9 +25,15 @@ public:
static const unsigned int trottoir = 0x666666;
static const unsigned int bordureTrottoir = 0xAAAAAA;
static const unsigned int herbe = 0x0c4010; // 11AA22
static const unsigned int skyTop = 0x3c14ff;
static const unsigned int skyBottom = 0x7F7FFF;
static const unsigned int cielHaut = 0x3c14ff;
static const unsigned int cielBas = 0x7F7FFF;
static const unsigned int fog; // définie dans couleurs.cpp .
};
class Dimensions {
public:
static const unsigned int largeurRoute = 200;
static const unsigned int largeurTrottoir = 140;
};
#endif

View File

@ -38,7 +38,7 @@ void QuartierQuad::triangulation() {
triangulationConcave(Triangle(q[NE], q[SE], q[SW]));
triangulationConcave(Triangle(q[SW], q[NW], q[NE]));
} else {
Quad ci = c.insetNESW(250 + 140); // TODO : factoriser cette longueur (largeur route + largeur trottoir).
Quad ci = c.insetNESW(Dimensions::largeurRoute + Dimensions::largeurTrottoir);
Quad cih = ci.offsetNormal(600); // TODO : factoriser cette longueur (hauteur max des bâtiments).
addGPUQuad(c, Couleurs::route);
addGPUQuad(cih, Couleurs::toit);
@ -49,7 +49,7 @@ void QuartierQuad::triangulation() {
void QuartierQuad::triangulationConcave(Triangle t) {
// Même code que QuartierTri::triangulation.
Triangle ci = t.insetLTR(250 + 140); // TODO : factoriser cette longueur (largeur route + largeur trottoir).
Triangle ci = t.insetLTR(Dimensions::largeurRoute + Dimensions::largeurTrottoir);
Triangle cih = ci.offsetNormal(600); // TODO : factoriser cette longueur (hauteur max des bâtiments).
addGPUTriangle(t, Couleurs::route);
addGPUTriangle(cih, Couleurs::toit);
@ -106,8 +106,8 @@ void QuartierQuad::carre() {
void QuartierQuad::batiments() {
float hauteurTrottoir = 20; // TODO : factoriser + ajouter ça à la hauteur max d'un bâtiment dans les autres calculs.
Quad qtrottoir = c.insetNESW(250);
Quad qinterieur = qtrottoir.insetNESW(140);
Quad qtrottoir = c.insetNESW(Dimensions::largeurRoute);
Quad qinterieur = qtrottoir.insetNESW(Dimensions::largeurTrottoir);
Quad qbatiments = qinterieur.offsetNormal(hauteurTrottoir);
for (int i = 0; i < 4; i++) {
@ -144,7 +144,7 @@ bool QuartierTri::split() {
bool angleAigu = minAngle < Angle::d2r(30);
bool anglesAcceptable = !angleAigu && !angleObtus;
if (!big && proba(seed, -1, 1, 20)) {
batiments(); // TODO : RouteTrottoirTri(c);
batiments();
} else if (big && anglesAcceptable) {
switch (hash2(seed, -2) % 3) {
case 0: centre(); break;
@ -165,7 +165,7 @@ bool QuartierTri::split() {
}
void QuartierTri::triangulation() {
Triangle ci = c.insetLTR(250 + 140); // TODO : factoriser cette longueur (largeur route + largeur trottoir).
Triangle ci = c.insetLTR(Dimensions::largeurRoute + Dimensions::largeurTrottoir);
Triangle cih = ci.offsetNormal(600); // TODO : factoriser cette longueur (hauteur max des bâtiments).
addGPUTriangle(c, Couleurs::route);
addGPUTriangle(cih, Couleurs::toit);
@ -205,8 +205,8 @@ void QuartierTri::trapeze() {
void QuartierTri::batiments() {
return;
float hauteurTrottoir = 14; // TODO : factoriser + ajouter ça à la hauteur max d'un bâtiment dans les autres calculs.
Triangle ttrottoir = c.insetLTR(250);
Triangle tinterieur = ttrottoir.insetLTR(140);
Triangle ttrottoir = c.insetLTR(Dimensions::largeurRoute);
Triangle tinterieur = ttrottoir.insetLTR(Dimensions::largeurTrottoir);
Triangle tbatiments = tinterieur.offsetNormal(hauteurTrottoir);
for (int i = 0; i < 3; i++) {

View File

@ -19,10 +19,10 @@ bool BatimentTri::split() {
// } else {
// int th = 20; // Terrain height.
// Quad q = Quad(c[NE],c[SE],c[SW],c[NW]);
// q.offset(N,-140);
// q.offset(E,-140);
// q.offset(S,-140);
// q.offset(W,-140);
// q.offset(N,-Dimensions::largeurTrottoir);
// q.offset(E,-Dimensions::largeurTrottoir);
// q.offset(S,-Dimensions::largeurTrottoir);
// q.offset(W,-Dimensions::largeurTrottoir);
// addChild(new TrottoirQuadNormal(Quad(c[NE],c[SE],q[SE],q[NE]),th,E));
// addChild(new TrottoirQuadNormal(Quad(c[SE],c[SW],q[SW],q[SE]),th,E));

View File

@ -7,7 +7,6 @@ Chose::Chose() : seed(initialSeed), children() {
void Chose::clearChildren() {
std::vector<Chose*>::iterator it;
for (it = children.begin(); it != children.end(); it++)
// TODO : d'abbord virer *it des arbres de LOD !
delete *it;
children.clear();
}
@ -163,4 +162,4 @@ void Chose::drawAABB() {
);
}
unsigned int Chose::initialSeed = 187001748;//random_seed();
unsigned int Chose::initialSeed = random_seed();

View File

@ -2,7 +2,7 @@
View::View(Chose* _root)
: root(_root),
camera(Camera(Vertex(2980,1567,16012), 45, 150, 1000, 0.6f)),
camera(Camera(Vertex(2980,1567,16012), 45, 150, 10000, 0.6f)),
lod(camera.cameraCenter, _root) {
fogColor[0] = Couleurs::r(Couleurs::fog) / 255.f;
@ -50,7 +50,7 @@ void View::initWindow() {
glFogi (GL_FOG_MODE, GL_LINEAR);
glFogfv (GL_FOG_COLOR, fogColor);
glFogf (GL_FOG_START, backFrustum / sqrt(3) / 2.f);
glFogf (GL_FOG_END, backFrustum / sqrt(3));
glFogf (GL_FOG_END, backFrustum / sqrt(3) * 0.9);
//glHint (GL_FOG_HINT, GL_NICEST);
}
@ -102,10 +102,10 @@ void View::setSkybox() {
for(int ii=0; ii<4;ii++) {
glBegin(GL_QUADS);
{
glColor3ub(Couleurs::r(Couleurs::skyBottom),Couleurs::g(Couleurs::skyBottom),Couleurs::b(Couleurs::skyBottom));
glColor3ub(Couleurs::r(Couleurs::cielBas),Couleurs::g(Couleurs::cielBas),Couleurs::b(Couleurs::cielBas));
glVertex3f(-d,d,-d);
glVertex3f(d,d,-d);
glColor3ub(Couleurs::r(Couleurs::skyTop),Couleurs::g(Couleurs::skyTop),Couleurs::b(Couleurs::skyTop));
glColor3ub(Couleurs::r(Couleurs::cielHaut),Couleurs::g(Couleurs::cielHaut),Couleurs::b(Couleurs::cielHaut));
glVertex3f(d,d,d);
glVertex3f(-d,d,d);
}
@ -115,7 +115,7 @@ void View::setSkybox() {
glBegin(GL_QUADS);
{
glColor3ub(Couleurs::r(Couleurs::skyTop),Couleurs::g(Couleurs::skyTop),Couleurs::b(Couleurs::skyTop));
glColor3ub(Couleurs::r(Couleurs::cielHaut),Couleurs::g(Couleurs::cielHaut),Couleurs::b(Couleurs::cielHaut));
glVertex3f(-d,d,d);
glVertex3f(d,d,d);
glVertex3f(d,-d,d);