LOD fonctionne pour les split.
This commit is contained in:
parent
ab8622338e
commit
01824d8c12
2
.gitignore
vendored
2
.gitignore
vendored
|
@ -1,5 +1,3 @@
|
|||
city
|
||||
all.cpp
|
||||
all_includes.hh.d
|
||||
all_includes.hh.gch
|
||||
city-builder
|
||||
|
|
11
Makefile
11
Makefile
|
@ -2,9 +2,10 @@ CXX=g++
|
|||
# -ansi -pedantic -Wconversion
|
||||
CCWARN=-Wall -Wextra -Werror
|
||||
# -flto (nécessite GCC 4.5) -m32 ou -m64
|
||||
CFLAGS=-O0 -I. $(CCWARN)
|
||||
CFLAGS=-O0 -I. $(CCWARN) -g -rdynamic
|
||||
|
||||
SOURCES = $(shell echo *.cpp rules/*.cpp rules/*/*.cpp)
|
||||
HEADERS = $(shell echo *.hh rules/*.hh rules/*/*.hh)
|
||||
LIBS = -lm -lGL -lGLU -lSDL -lGLEW
|
||||
EXECUTABLE = city
|
||||
|
||||
|
@ -14,7 +15,7 @@ all: $(EXECUTABLE)
|
|||
|
||||
.PHONY: clean
|
||||
clean:
|
||||
rm -f $(EXECUTABLE) all_includes.hh.d all_includes.hh.gch all.cpp
|
||||
rm -f $(EXECUTABLE) all_includes.hh.gch all.cpp
|
||||
|
||||
$(EXECUTABLE): $(SOURCES) all_includes.hh.gch Makefile
|
||||
@echo "#ifndef _ALL_CPP_"> all.cpp
|
||||
|
@ -24,7 +25,5 @@ $(EXECUTABLE): $(SOURCES) all_includes.hh.gch Makefile
|
|||
$(CXX) $(LIBS) $(CFLAGS) all.cpp -o $@
|
||||
@rm all.cpp
|
||||
|
||||
-include all_includes.hh.d
|
||||
all_includes.hh.d:
|
||||
all_includes.hh.gch: all_includes.hh Makefile
|
||||
$(CXX) $(CFLAGS) -MMD -MF all_includes.hh.d all_includes.hh -o all_includes.hh.gch
|
||||
all_includes.hh.gch: $(HEADERS) Makefile
|
||||
$(CXX) $(CFLAGS) all_includes.hh -o all_includes.hh.gch
|
||||
|
|
|
@ -24,9 +24,11 @@ class Chose;
|
|||
#include "quad.hh"
|
||||
|
||||
#include "hash.hh"
|
||||
#include "view.hh"
|
||||
// LOD must be included before chose.hh
|
||||
// heap.hh must be included before lod.hh
|
||||
#include "heap.hh"
|
||||
// lod.hh must be included before chose.hh and view.hh
|
||||
#include "lod.hh"
|
||||
#include "view.hh"
|
||||
|
||||
#include "rules/chose.hh"
|
||||
|
||||
|
|
172
heap.cpp
Normal file
172
heap.cpp
Normal file
|
@ -0,0 +1,172 @@
|
|||
Heap::Heap()
|
||||
: buckets(new HeapNode*[1]), lastAllocatedBucket(-1),
|
||||
bucketArraySize(1), lastNode(-1) {
|
||||
}
|
||||
|
||||
void Heap::setId(int id) { this->id = id; }
|
||||
|
||||
void Heap::insert(int key, Chose* value) {
|
||||
// std::cout << "INSERT " << (int)(value) << " into " << id << std::endl;
|
||||
int _d_node = value->lod.heaps[id];
|
||||
if (_d_node <= lastNode && _d_node >= 0 &&
|
||||
buckets[getBucket(_d_node)][getIndex(_d_node)].value == value) {
|
||||
std::cout << "ERROR ! Trying to insert " << (int)(value)
|
||||
<< " but it is already here "
|
||||
<< (int)(buckets[getBucket(_d_node)][getIndex(_d_node)].value)
|
||||
<< std::endl;
|
||||
}
|
||||
// std::cout << "ENTER insert" << std::endl;
|
||||
++lastNode;
|
||||
if (getBucket(lastNode) > lastAllocatedBucket) {
|
||||
allocateBucket();
|
||||
}
|
||||
buckets[getBucket(lastNode)][getIndex(lastNode)].key = key;
|
||||
buckets[getBucket(lastNode)][getIndex(lastNode)].value = value;
|
||||
siftUp(lastNode);
|
||||
// std::cout << "EXIT insert" << std::endl;
|
||||
}
|
||||
|
||||
void handler();
|
||||
int global = 0;
|
||||
void Heap::remove(Chose* value) {
|
||||
// std::cout << "ENTER remove id=" << id << " " << (int)(value) << " " << value->lod.heaps[id] << "/" << lastNode << std::endl;
|
||||
int node = value->lod.heaps[id];
|
||||
if (buckets[getBucket(node)][getIndex(node)].value != value) {
|
||||
std::cout << "ERROR ! Trying to remove " << (int)(value)
|
||||
<< " but found " << (int)(buckets[getBucket(node)][getIndex(node)].value)
|
||||
<< std::endl;
|
||||
}
|
||||
|
||||
if (node == lastNode) { // On a supprimé le dernier noeud.
|
||||
--lastNode;
|
||||
// + 1 pour garder au moins un bucket "en cache".
|
||||
if (getBucket(lastNode) + 1 < lastAllocatedBucket)
|
||||
freeBucket();
|
||||
std::cout << "Remove exit A";
|
||||
return;
|
||||
}
|
||||
|
||||
buckets[getBucket(node)][getIndex(node)] = \
|
||||
buckets[getBucket(lastNode)][getIndex(lastNode)];
|
||||
|
||||
--lastNode;
|
||||
|
||||
// + 1 pour garder au moins un bucket "en cache".
|
||||
if (getBucket(lastNode) + 1 < lastAllocatedBucket) {
|
||||
freeBucket();
|
||||
}
|
||||
|
||||
siftDown(node);
|
||||
std::cout << "Remove exit B";
|
||||
}
|
||||
|
||||
Chose* Heap::popIfLessThan(int key) {
|
||||
std::cout << "Enter Pop " << id << " lastNode=" << lastNode;
|
||||
for (int i = 0; i <= lastNode; i++)
|
||||
std::cout << " "
|
||||
<< (int)(buckets[getBucket(i)][getIndex(i)].key) << "_"
|
||||
<< (int)(buckets[getBucket(i)][getIndex(i)].value);
|
||||
std::cout << std::endl;
|
||||
if (lastNode >= 0 && buckets[0][0].key < key) {
|
||||
Chose* ret = buckets[0][0].value;
|
||||
std::cout << "Pop " << ret->lod.heaps[id] << std::endl;
|
||||
remove(ret);
|
||||
std::cout << "Exit A Pop " << id << " lastNode=" << lastNode << " return=" << (int)(ret);
|
||||
for (int i = 0; i <= lastNode; i++)
|
||||
std::cout << " "
|
||||
<< (int)(buckets[getBucket(i)][getIndex(i)].key) << "_"
|
||||
<< (int)(buckets[getBucket(i)][getIndex(i)].value);
|
||||
std::cout << std::endl;
|
||||
return ret;
|
||||
}
|
||||
std::cout << "Exit B Pop " << id << " lastNode=" << lastNode << std::endl;
|
||||
return NULL;
|
||||
}
|
||||
|
||||
void Heap::siftUp(int node) {
|
||||
HeapNode* n;
|
||||
HeapNode* np;
|
||||
while (true) {
|
||||
n = &(buckets[getBucket(node)][getIndex(node)]);
|
||||
if (node <= 0)
|
||||
break;
|
||||
int p = parent(node);
|
||||
np = &(buckets[getBucket(p)][getIndex(p)]);
|
||||
if (n->key >= np->key)
|
||||
break;
|
||||
HeapNode temp = *n;
|
||||
*n = *np;
|
||||
*np = temp;
|
||||
// mettre à jour le champ lod.heaps[id] de l'ancien parent qu'on
|
||||
// vient de descendre.
|
||||
n->value->lod.heaps[id] = node;
|
||||
// std::cout << "SET " << (int)(n->value) << " id=" << id << " to " << node << std::endl;
|
||||
node = p;
|
||||
}
|
||||
// après les break; qui sortent de la boucle, on a déjà actualisé
|
||||
// le pointeur `n` vers buckets[getBucket(node)][getIndex(node)].
|
||||
n->value->lod.heaps[id] = node;
|
||||
// std::cout << "SET " << (int)(n->value) << " id=" << id << " to " << node << std::endl;
|
||||
}
|
||||
|
||||
void Heap::siftDown(int node) {
|
||||
HeapNode* n;
|
||||
HeapNode* nlc;
|
||||
HeapNode* nrc;
|
||||
while (true) {
|
||||
n = &(buckets[getBucket(node)][getIndex(node)]);
|
||||
int lc = leftchild(node);
|
||||
int rc = rightchild(node);
|
||||
nlc = &(buckets[getBucket(lc)][getIndex(lc)]);
|
||||
nrc = &(buckets[getBucket(rc)][getIndex(rc)]);
|
||||
// exchLeft et exchRight peuvent être tout deux true. Dans ce
|
||||
// cas, c'est exchRight qui gagne.
|
||||
bool exchLeft = (lc <= lastNode) && (n->key > nlc->key);
|
||||
bool exchRight = (rc <= lastNode) && (n->key > nrc->key) && (nlc->key > nrc->key);
|
||||
if ((!exchLeft) && (!exchRight))
|
||||
break;
|
||||
HeapNode temp = *n;
|
||||
if (exchRight) {
|
||||
*n = *nrc;
|
||||
*nrc = temp;
|
||||
} else {
|
||||
*n = *nlc;
|
||||
*nlc = temp;
|
||||
}
|
||||
// mettre à jour le champ lod.heaps[id] de l'ancien fils qu'on
|
||||
// vient de remonter.
|
||||
n->value->lod.heaps[id] = node;
|
||||
// std::cout << "SET " << (int)(n->value) << " id=" << id << " to " << node << std::endl;
|
||||
node = (exchRight ? rc : lc);
|
||||
}
|
||||
// après les break; qui sortent de la boucle, on a déjà actualisé
|
||||
// le pointeur `n` vers buckets[getBucket(node)][getIndex(node)].
|
||||
n->value->lod.heaps[id] = node;
|
||||
// std::cout << "SET " << (int)(n->value) << " id=" << id << " to " << node << std::endl;
|
||||
}
|
||||
|
||||
void Heap::allocateBucket() {
|
||||
++lastAllocatedBucket;
|
||||
if (lastAllocatedBucket >= bucketArraySize) {
|
||||
HeapNode** old = buckets;
|
||||
buckets = new HeapNode*[bucketArraySize*2];
|
||||
for (int i = 0; i < lastAllocatedBucket; i++)
|
||||
buckets[i] = old[i];
|
||||
delete[] old;
|
||||
bucketArraySize *= 2;
|
||||
}
|
||||
buckets[lastAllocatedBucket] = new HeapNode[bucketSize];
|
||||
}
|
||||
|
||||
void Heap::freeBucket() {
|
||||
delete[] buckets[lastAllocatedBucket];
|
||||
--lastAllocatedBucket;
|
||||
if (lastAllocatedBucket * 4 < bucketArraySize && bucketArraySize > 1) {
|
||||
HeapNode** old = buckets;
|
||||
buckets = new HeapNode*[bucketArraySize/2];
|
||||
for (int i = 0; i <= lastAllocatedBucket; i++)
|
||||
buckets[i] = old[i];
|
||||
delete[] old;
|
||||
bucketArraySize /= 2;
|
||||
}
|
||||
}
|
35
heap.hh
Normal file
35
heap.hh
Normal file
|
@ -0,0 +1,35 @@
|
|||
struct HeapNode {
|
||||
int key;
|
||||
Chose* value;
|
||||
};
|
||||
|
||||
class Heap {
|
||||
private:
|
||||
int id;
|
||||
static const int log2BucketSize = 9; // 2^9 = 512
|
||||
static const int bucketSize = (1 << log2BucketSize);
|
||||
HeapNode** buckets;
|
||||
int lastAllocatedBucket;
|
||||
int bucketArraySize;
|
||||
int lastNode;
|
||||
private:
|
||||
inline int getBucket(int node) {
|
||||
return (node >> log2BucketSize);
|
||||
}
|
||||
inline int getIndex(int node) {
|
||||
return (node & (bucketSize - 1));
|
||||
}
|
||||
void allocateBucket(); // Allocate into last+1
|
||||
void freeBucket(); // free last
|
||||
void siftUp(int node);
|
||||
void siftDown(int node);
|
||||
inline int parent(int node) { return (node - 1)/2; }
|
||||
inline int leftchild(int node) { return node * 2 + 1; }
|
||||
inline int rightchild(int node) { return node * 2 + 2; }
|
||||
public:
|
||||
Heap();
|
||||
void insert(int key, Chose* value);
|
||||
void remove(Chose* value);
|
||||
Chose* popIfLessThan(int key);
|
||||
void setId(int id);
|
||||
};
|
248
lod.cpp
248
lod.cpp
|
@ -1,79 +1,54 @@
|
|||
#include "all_includes.hh"
|
||||
|
||||
Abr::Abr() {
|
||||
Lod::Lod(Vertex camera, Chose* root) {
|
||||
for (int i = 0; i < 6; i++) merge[i].setId(i);
|
||||
for (int i = 0; i < 12; i++) split[i].setId(6+i);
|
||||
this->camera[0] = camera.x;
|
||||
this->camera[1] = camera.y;
|
||||
this->camera[2] = camera.z;
|
||||
addSplitCube(root);
|
||||
setCamera(camera);
|
||||
}
|
||||
|
||||
void Abr::insert(int key, Chose* value) {
|
||||
key = key;
|
||||
value = value;
|
||||
//map.insert(key,value);
|
||||
}
|
||||
|
||||
void Abr::remove(int key, Chose* value) {
|
||||
std::multimap<int, Chose*>::iterator it;
|
||||
std::pair<std::multimap<int, Chose*>::iterator, std::multimap<int, Chose*>::iterator> ret;
|
||||
ret = map.equal_range(key);
|
||||
|
||||
for (it=ret.first; it!=ret.second; ++it) {
|
||||
if ((*it).second == value) {
|
||||
map.erase(it);
|
||||
break;
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
Chose* Abr::popIfLessThan(int key) {
|
||||
std::multimap<int,Chose*>::iterator it = map.begin();
|
||||
|
||||
if((*it).first < key) {
|
||||
map.erase(it);
|
||||
return (*it).second;
|
||||
} else {
|
||||
return NULL;
|
||||
}
|
||||
}
|
||||
|
||||
#define NegateEven(v, i) ((v)*(((i)&1) ? 1 : -1))
|
||||
|
||||
Lod::Lod(){};
|
||||
|
||||
Lod::Lod(float camera[3]) {
|
||||
this->camera[0] = camera[0];
|
||||
this->camera[1] = camera[1];
|
||||
this->camera[2] = camera[2];
|
||||
}
|
||||
|
||||
void Lod::setCamera(float camera[3]) {
|
||||
this->camera[0] = camera[0];
|
||||
this->camera[1] = camera[1];
|
||||
this->camera[2] = camera[2];
|
||||
void Lod::setCamera(Vertex newCamera) {
|
||||
this->camera[0] = newCamera.x;
|
||||
this->camera[1] = newCamera.y;
|
||||
this->camera[2] = newCamera.z;
|
||||
|
||||
// Merge.
|
||||
for(int i = 0; i < 6; i++) {
|
||||
Chose* c;
|
||||
int pos = NegateEven(camera[i>>1], i);
|
||||
while((c = merge[i].popIfLessThan(pos))) {
|
||||
std::cout << "=== mer Pop " << (int)(c) << " from merge " << i << std::endl;
|
||||
for(int j = 0; j < 6; j++) {
|
||||
if(i == j) break;
|
||||
// TODO : sera merge[j].remove(c->mergeCube[j]);
|
||||
merge[j].remove(NegateEven(c->mergeCube[j], j), c);
|
||||
if(i == j) continue;
|
||||
std::cout << "=== mer Remove " << (int)(c) << " from merge " << j << std::endl;
|
||||
merge[j].remove(c);
|
||||
// TODO
|
||||
}
|
||||
}
|
||||
}
|
||||
// Split out vers split in.
|
||||
for(int i = 0; i < 6; i++) {
|
||||
Chose* c;
|
||||
int pos = NegateEven(camera[i>>1], i+1);
|
||||
int pos = NegateOdd(camera[i>>1], i);
|
||||
while((c = split[2*i+1].popIfLessThan(pos))) {
|
||||
std::cout << "=== soi Pop " << (int)(c) << " from split " << 2*i+1 << std::endl;
|
||||
for (int a = 0; a < 18; a++) std::cout << (c->lod.heaps[a]) << " ";
|
||||
std::cout << std::endl;
|
||||
if(c->inCounter == 5) {
|
||||
for(int j = 0; j < 6; j++) {
|
||||
if(i == j) break;
|
||||
// TODO : sera split[2*j].remove(c->splitCube[j]);
|
||||
split[2*j].remove(NegateEven(c->splitCube[j], j), c);
|
||||
if(i == j) continue;
|
||||
std::cout << "=== soi1 Remove " << (int)(c)<<" from split "<< 2*j<<std::endl;
|
||||
split[2*j].remove(c);
|
||||
}
|
||||
std::cout << "CALL doSplit FROM soi" << std::endl;
|
||||
doSplit(c);
|
||||
}
|
||||
else {
|
||||
c->inCounter++;
|
||||
std::cout << "=== soi2 Insert " << (int)(c) << " into split " << 2*i << std::endl;
|
||||
split[2*i].insert(c->splitCube[i], c);
|
||||
}
|
||||
}
|
||||
|
@ -84,154 +59,55 @@ void Lod::setCamera(float camera[3]) {
|
|||
Chose* c;
|
||||
int pos = NegateEven(camera[i>>1], i);
|
||||
while((c = split[2*i].popIfLessThan(pos))) {
|
||||
std::cout << "=== sio Pop " << (int)(c) << " from split " << 2*i << std::endl;
|
||||
c->inCounter--;
|
||||
std::cout << "=== sio Insert " << (int)(c) << " into split " << 2*i+1 << std::endl;
|
||||
split[2*i+1].insert(c->splitCube[i], c);
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
void Lod::addMergeCube(Chose* chose, int limits[6]) {
|
||||
for(int i = 0; i < 5; i++)
|
||||
merge[i].insert(NegateEven(limits[i], i), chose);
|
||||
void Lod::doSplit(Chose* c) {
|
||||
std::cout << "doSplit " << (int)(c) << std::endl;
|
||||
// TODO
|
||||
c->split();
|
||||
std::vector<Chose*>::iterator it;
|
||||
for (it = c->children.begin(); it != c->children.end(); ++it) {
|
||||
(*it)->triangulation();
|
||||
(*it)->updateAABB();
|
||||
addSplitCube((*it));
|
||||
}
|
||||
std::cout << "END doSplit" << std::endl;
|
||||
}
|
||||
|
||||
void Lod::addSplitCube(Chose* chose, int limits[6]) {
|
||||
void Lod::addMergeCube(Chose* chose) {
|
||||
for(int i = 0; i < 5; i++) {
|
||||
std::cout << "+++ mer Insert " << (int)(chose) << " into merge " << i << std::endl;
|
||||
merge[i].insert(NegateEven(chose->lod.mergeCube[i], i), chose);
|
||||
}
|
||||
}
|
||||
|
||||
void Lod::addSplitCube(Chose* chose) {
|
||||
std::cout << "addSplitCube " << (int)chose << std::endl;
|
||||
chose->inCounter = 0;
|
||||
for(int i = 0; i < 5; i++)
|
||||
if(NegateEven(limits[i],i) > camera[i>>1]) {
|
||||
for(int i = 0; i < 6; i++) {
|
||||
if(NegateEven(chose->lod.splitCube[i] - camera[i>>1], i) >= 0) {
|
||||
chose->inCounter++;
|
||||
split[2*i].insert(NegateEven(limits[i],i), chose);
|
||||
std::cout << "+++ spl1 Insert " << (int)(chose) << " into split " << 2*i << std::endl;
|
||||
split[2*i].insert(NegateEven(chose->lod.splitCube[i],i), chose);
|
||||
}
|
||||
else {
|
||||
split[2*i+1].insert(NegateEven(limits[i],i+1), chose);
|
||||
std::cout << "+++ spl2 Insert " << (int)(chose) << " into split " << 2*i+1<<std::endl;
|
||||
split[2*i+1].insert(NegateOdd(chose->lod.splitCube[i],i), chose);
|
||||
}
|
||||
}
|
||||
|
||||
Heap::Heap(int id)
|
||||
: id(id), buckets(new HeapNode*[1]), lastAllocatedBucket(-1),
|
||||
bucketArraySize(1), lastNode(-1) {
|
||||
}
|
||||
|
||||
void Heap::insert(int key, Chose* value) {
|
||||
++lastNode;
|
||||
if (getBucket(lastNode) > lastAllocatedBucket) {
|
||||
allocateBucket();
|
||||
}
|
||||
buckets[getBucket(lastNode)][getIndex(lastNode)].key = key;
|
||||
buckets[getBucket(lastNode)][getIndex(lastNode)].value = value;
|
||||
siftUp(lastNode);
|
||||
}
|
||||
|
||||
void Heap::remove(int node) {
|
||||
--lastNode;
|
||||
|
||||
if (node > lastNode) { // On a supprimé le dernier noeud.
|
||||
// + 1 pour garder au moins un bucket "en cache".
|
||||
if (getBucket(lastNode) + 1 < lastAllocatedBucket)
|
||||
freeBucket();
|
||||
return;
|
||||
}
|
||||
|
||||
buckets[getBucket(node)][getIndex(node)] = \
|
||||
buckets[getBucket(lastNode)][getIndex(lastNode)];
|
||||
|
||||
// + 1 pour garder au moins un bucket "en cache".
|
||||
if (getBucket(lastNode) + 1 < lastAllocatedBucket) {
|
||||
freeBucket();
|
||||
}
|
||||
|
||||
siftDown(node);
|
||||
}
|
||||
|
||||
Chose* Heap::popIfLessThan(int key) {
|
||||
if (lastNode >= 0 && buckets[0][0].key < key) {
|
||||
Chose* ret = buckets[0][0].value;
|
||||
remove(0);
|
||||
return ret;
|
||||
}
|
||||
return NULL;
|
||||
}
|
||||
|
||||
void Heap::siftUp(int node) {
|
||||
HeapNode* n;
|
||||
HeapNode* np;
|
||||
while (true) {
|
||||
n = &(buckets[getBucket(node)][getIndex(node)]);
|
||||
if (node <= 0)
|
||||
break;
|
||||
int p = parent(node);
|
||||
np = &(buckets[getBucket(p)][getIndex(p)]);
|
||||
if (n->key >= np->key)
|
||||
break;
|
||||
HeapNode temp = *n;
|
||||
*n = *np;
|
||||
*np = temp;
|
||||
// mettre à jour le champ lod.heaps[id] de l'ancien parent qu'on
|
||||
// vient de descendre.
|
||||
n->value->lod.heaps[id] = node;
|
||||
node = p;
|
||||
}
|
||||
// après les break; qui sortent de la boucle, on a déjà actualisé
|
||||
// le pointeur `n` vers buckets[getBucket(node)][getIndex(node)].
|
||||
n->value->lod.heaps[id] = node;
|
||||
}
|
||||
|
||||
void Heap::siftDown(int node) {
|
||||
HeapNode* n;
|
||||
HeapNode* nlc;
|
||||
HeapNode* nrc;
|
||||
while (true) {
|
||||
n = &(buckets[getBucket(node)][getIndex(node)]);
|
||||
int lc = leftchild(node);
|
||||
int rc = rightchild(node);
|
||||
nlc = &(buckets[getBucket(lc)][getIndex(lc)]);
|
||||
nrc = &(buckets[getBucket(rc)][getIndex(rc)]);
|
||||
// exchLeft et exchRight peuvent être tout deux true. Dans ce
|
||||
// cas, c'est exchRight qui gagne.
|
||||
bool exchLeft = (lc <= lastNode) && (n->key > nlc->key);
|
||||
bool exchRight = (rc <= lastNode) && (n->key > nrc->key) && (nlc->key > nrc->key);
|
||||
if ((!exchLeft) && (!exchRight))
|
||||
break;
|
||||
HeapNode temp = *n;
|
||||
if (exchRight) {
|
||||
*n = *nrc;
|
||||
*nrc = temp;
|
||||
} else {
|
||||
*n = *nlc;
|
||||
*nlc = temp;
|
||||
// TODO : si chose->inCounter == 6, il faut le split immédiatement.
|
||||
if (chose->inCounter == 6) {
|
||||
for(int i = 0; i < 6; i++) {
|
||||
std::cout << "+++ spl3 Remove " << (int)(chose) << " from split " << 2*i << std::endl;
|
||||
split[2*i].remove(chose);
|
||||
}
|
||||
// mettre à jour le champ lod.heaps[id] de l'ancien fils qu'on
|
||||
// vient de remonter.
|
||||
n->value->lod.heaps[id] = node;
|
||||
node = (exchRight ? rc : lc);
|
||||
}
|
||||
// après les break; qui sortent de la boucle, on a déjà actualisé
|
||||
// le pointeur `n` vers buckets[getBucket(node)][getIndex(node)].
|
||||
n->value->lod.heaps[id] = node;
|
||||
}
|
||||
|
||||
void Heap::allocateBucket() {
|
||||
++lastAllocatedBucket;
|
||||
if (lastAllocatedBucket >= bucketArraySize) {
|
||||
HeapNode** old = buckets;
|
||||
buckets = new HeapNode*[bucketArraySize*2];
|
||||
for (int i = 0; i < lastAllocatedBucket; i++)
|
||||
buckets[i] = old[i];
|
||||
delete[] old;
|
||||
bucketArraySize *= 2;
|
||||
}
|
||||
buckets[lastAllocatedBucket] = new HeapNode[bucketSize];
|
||||
}
|
||||
|
||||
void Heap::freeBucket() {
|
||||
delete[] buckets[lastAllocatedBucket];
|
||||
--lastAllocatedBucket;
|
||||
if (lastAllocatedBucket * 4 < bucketArraySize && bucketArraySize > 1) {
|
||||
HeapNode** old = buckets;
|
||||
buckets = new HeapNode*[bucketArraySize/2];
|
||||
for (int i = 0; i <= lastAllocatedBucket; i++)
|
||||
buckets[i] = old[i];
|
||||
delete[] old;
|
||||
bucketArraySize /= 2;
|
||||
std::cout << "CALL doSplit FROM addSplitCube" << std::endl;
|
||||
doSplit(chose);
|
||||
}
|
||||
}
|
||||
|
|
77
lod.hh
77
lod.hh
|
@ -2,74 +2,33 @@
|
|||
#define _LOD_HH_
|
||||
#include "all_includes.hh"
|
||||
|
||||
class Abr {
|
||||
private :
|
||||
std::multimap<int, Chose*> map;
|
||||
|
||||
public :
|
||||
Abr();
|
||||
void insert(int key, Chose* value); //TODO Retourne un item*.
|
||||
void remove(int key, Chose* value); //TODO Prend un item*.
|
||||
Chose* popIfLessThan(int key);
|
||||
};
|
||||
|
||||
|
||||
class Lod {
|
||||
private :
|
||||
Abr merge[6]; // {xMin, xMax, yMin, yMax, zMin, zMax}.
|
||||
Abr split[12]; // {xMinIn, xMinOut, xMaxIn, xMaxOut, yMinIn, yMaxOut, yMaxIn, yMaxOut, zMinIn, zMinOut, zMaxIn, zMaxOut}.
|
||||
private :
|
||||
Heap merge[6]; // {xMin, xMax, yMin, yMax, zMin, zMax}.
|
||||
Heap split[12]; // {xMinIn, xMinOut, xMaxIn, xMaxOut, yMinIn, yMaxOut, yMaxIn, yMaxOut, zMinIn, zMinOut, zMaxIn, zMaxOut}.
|
||||
float camera[3];
|
||||
|
||||
public :
|
||||
Lod();
|
||||
Lod(float[3]);
|
||||
void addMergeCube(Chose* chose, int limits[6]);
|
||||
void addSplitCube(Chose* chose, int limits[6]);
|
||||
void setCamera(float camera[3]);
|
||||
};
|
||||
|
||||
struct HeapNode {
|
||||
int key;
|
||||
Chose* value;
|
||||
};
|
||||
|
||||
class Heap {
|
||||
private:
|
||||
int id;
|
||||
static const int log2BucketSize = 9; // 2^9 = 512
|
||||
static const int bucketSize = (1 << log2BucketSize);
|
||||
HeapNode** buckets;
|
||||
int lastAllocatedBucket;
|
||||
int bucketArraySize;
|
||||
int lastNode;
|
||||
private:
|
||||
inline int getBucket(int node) {
|
||||
return (node >> log2BucketSize);
|
||||
inline float NegateEven(float value, int evenodd) {
|
||||
return (value*((evenodd&1) ? 1 : -1));
|
||||
}
|
||||
inline int getIndex(int node) {
|
||||
return (node & (bucketSize - 1));
|
||||
inline float NegateOdd(float value, int evenodd) {
|
||||
return (value*((evenodd&1) ? -1 : 1));
|
||||
}
|
||||
void allocateBucket(); // Allocate into last+1
|
||||
void freeBucket(); // free last
|
||||
void siftUp(int node);
|
||||
void siftDown(int node);
|
||||
inline int parent(int node) { return (node - 1)/2; }
|
||||
inline int leftchild(int node) { return node * 2 + 1; }
|
||||
inline int rightchild(int node) { return node * 2 + 2; }
|
||||
public:
|
||||
Heap(int id);
|
||||
void insert(int key, Chose* value);
|
||||
void remove(int node);
|
||||
Chose* popIfLessThan(int key);
|
||||
void doSplit(Chose* c);
|
||||
public :
|
||||
Lod(Vertex camera, Chose* root);
|
||||
void addMergeCube(Chose* chose);
|
||||
void addSplitCube(Chose* chose);
|
||||
void setCamera(Vertex camera);
|
||||
};
|
||||
|
||||
class LodNode {
|
||||
public:
|
||||
struct LodNode {
|
||||
int heaps[18];
|
||||
int aabb[6];
|
||||
float aabb[6];
|
||||
float splitCube[12];
|
||||
float mergeCube[6];
|
||||
int inCounter;
|
||||
HeapNode* splitCube[12];
|
||||
HeapNode* mergeCube[6];
|
||||
bool firstBBPoint;
|
||||
};
|
||||
|
||||
#endif
|
||||
|
|
29
main.cpp
29
main.cpp
|
@ -27,22 +27,23 @@ int main() {
|
|||
Vertex sw(0, 0, 0);
|
||||
Vertex nw(0, size, 0);
|
||||
Chose* c = QuartierQuad::factory(Chose::initialSeed, 0, ne, se, sw, nw);
|
||||
c->triangulation();
|
||||
c->updateAABB();
|
||||
// c->split();
|
||||
recursiveSubdivide(c);
|
||||
// recursiveSubdivide(c);
|
||||
|
||||
Heap h(1);
|
||||
(void)h;
|
||||
h.insert(43,c);
|
||||
h.insert(42,c->children[0]);
|
||||
h.popIfLessThan(42); // NULL
|
||||
h.popIfLessThan(43); // c->children[0]
|
||||
h.popIfLessThan(44); // c
|
||||
h.popIfLessThan(44); // NULL
|
||||
// Heap h(1);
|
||||
// (void)h;
|
||||
// h.insert(43,c);
|
||||
// h.insert(42,c->children[0]);
|
||||
// h.popIfLessThan(42); // NULL
|
||||
// h.popIfLessThan(43); // c->children[0]
|
||||
// h.popIfLessThan(44); // c
|
||||
// h.popIfLessThan(44); // NULL
|
||||
|
||||
View *v = new View(c);
|
||||
Vertex cc = v->camera.cameraCenter;
|
||||
float camera[3] = {cc.x, cc.y, cc.z};
|
||||
camera[0] = camera[0];
|
||||
Lod lod(camera);
|
||||
new View(c);
|
||||
// Vertex cc = v->camera.cameraCenter;
|
||||
// float camera[3] = {cc.x, cc.y, cc.z};
|
||||
// Lod lod(camera);
|
||||
return 0;
|
||||
}
|
||||
|
|
|
@ -1,62 +1,55 @@
|
|||
#include "all_includes.hh"
|
||||
|
||||
BatimentQuad::BatimentQuad(Vertex ne, Vertex se, Vertex sw, Vertex nw, Cardinal entry) : Chose(), ne(ne) {
|
||||
BatimentQuad::BatimentQuad(Vertex ne, Vertex se, Vertex sw, Vertex nw, Cardinal entry) : Chose() {
|
||||
addEntropy(ne, se, sw, nw);
|
||||
this->entry = entry;
|
||||
lctr = Vertex(ne.x-nw.x,se.y-ne.y,0.0f);
|
||||
this->ne = ne-lctr;
|
||||
this->se = se-lctr;
|
||||
this-> sw = sw-lctr;
|
||||
this->nw = nw-lctr;
|
||||
triangulation();
|
||||
lctr = (ne + se + sw + nw) / 4;
|
||||
corner[NE] = ne;//-lctr;
|
||||
corner[SE] = se;//-lctr;
|
||||
corner[SW] = sw;//-lctr;
|
||||
corner[NW] = nw;//-lctr;
|
||||
}
|
||||
|
||||
BatimentQuad::~BatimentQuad() {
|
||||
for(unsigned int i = 0; i < children.size(); i++)
|
||||
delete(children[i]);
|
||||
children.clear();
|
||||
triangles.clear();
|
||||
}
|
||||
|
||||
int BatimentQuad::width() { return this->ne.x - this->sw.x; }
|
||||
int BatimentQuad::height() { return this->ne.y - this->sw.y; }
|
||||
|
||||
std::vector<Vertex*> BatimentQuad::getBoundingBoxPoints() const {
|
||||
std::vector<Vertex*> list;
|
||||
return list;
|
||||
void BatimentQuad::getBoundingBoxPoints() {
|
||||
addBBPoint(corner[NE]);
|
||||
addBBPoint(corner[SE]);
|
||||
addBBPoint(corner[SW]);
|
||||
addBBPoint(corner[NW]);
|
||||
addBBPoint(corner[NE] + Vertex(0,0,maxHeight + maxHeight/2)); // TODO
|
||||
addBBPoint(corner[SE] + Vertex(0,0,maxHeight + maxHeight/2));
|
||||
addBBPoint(corner[SW] + Vertex(0,0,maxHeight + maxHeight/2));
|
||||
addBBPoint(corner[NW] + Vertex(0,0,maxHeight + maxHeight/2));
|
||||
}
|
||||
|
||||
bool BatimentQuad::split() {
|
||||
factory(1,1,ne,se,sw,nw);
|
||||
return true;
|
||||
}
|
||||
|
||||
Chose* BatimentQuad::factory(int seed, int n, Vertex ne, Vertex se, Vertex sw, Vertex nw) {
|
||||
int th = 20; // Terrain height.
|
||||
Quad q = Quad(ne,se,sw,nw);
|
||||
seed = seed;
|
||||
n = n;
|
||||
int th = 20; // Terrain height.
|
||||
Quad q = Quad(corner[NE],corner[SE],corner[SW],corner[NW]);
|
||||
q.offset(N,-140);
|
||||
q.offset(E,-140);
|
||||
q.offset(S,-140);
|
||||
q.offset(W,-140);
|
||||
|
||||
addChild(new TrottoirQuadNormal(lctr+ne,lctr+se,lctr+q.corner[1],lctr+q.corner[0],th,E));
|
||||
addChild(new TrottoirQuadNormal(lctr+se,lctr+sw,lctr+q.corner[2],lctr+q.corner[1],th,E));
|
||||
addChild(new TrottoirQuadNormal(lctr+sw,lctr+nw,lctr+q.corner[3],lctr+q.corner[2],th,E));
|
||||
addChild(new TrottoirQuadNormal(lctr+nw,lctr+ne,lctr+q.corner[0],lctr+q.corner[3],th,E));
|
||||
addChild(new TrottoirQuadNormal(/*lctr+*/corner[NE],/*lctr+*/corner[SE],/*lctr+*/q.corner[1],/*lctr+*/q.corner[0],th,E));
|
||||
addChild(new TrottoirQuadNormal(/*lctr+*/corner[SE],/*lctr+*/corner[SW],/*lctr+*/q.corner[2],/*lctr+*/q.corner[1],th,E));
|
||||
addChild(new TrottoirQuadNormal(/*lctr+*/corner[SW],/*lctr+*/corner[NW],/*lctr+*/q.corner[3],/*lctr+*/q.corner[2],th,E));
|
||||
addChild(new TrottoirQuadNormal(/*lctr+*/corner[NW],/*lctr+*/corner[NE],/*lctr+*/q.corner[0],/*lctr+*/q.corner[3],th,E));
|
||||
|
||||
q.corner[0] = q.corner[0] + Vertex(0,0,th);
|
||||
q.corner[1] = q.corner[1] + Vertex(0,0,th);
|
||||
q.corner[2] = q.corner[2] + Vertex(0,0,th);
|
||||
q.corner[3] = q.corner[3] + Vertex(0,0,th);
|
||||
|
||||
addChild(new BatimentQuadJardin(lctr+q.corner[0],lctr+q.corner[1],lctr+q.corner[2],lctr+q.corner[3]));
|
||||
addChild(new BatimentQuadJardin(/*lctr+*/q.corner[0],/*lctr+*/q.corner[1],/*lctr+*/q.corner[2],/*lctr+*/q.corner[3]));
|
||||
|
||||
q.offset(this->entry,-400);
|
||||
|
||||
addChild(new BatimentQuadMaison(lctr+q.corner[0],lctr+q.corner[1],lctr+q.corner[2],lctr+q.corner[3]));
|
||||
return NULL; // pour compilation, à virer.
|
||||
addChild(new BatimentQuadMaison(/*lctr+*/q.corner[0],/*lctr+*/q.corner[1],/*lctr+*/q.corner[2],/*lctr+*/q.corner[3]));
|
||||
return true;
|
||||
}
|
||||
|
||||
void BatimentQuad::triangulation() {
|
||||
|
@ -64,17 +57,17 @@ void BatimentQuad::triangulation() {
|
|||
|
||||
int h = hashInRange(seed,0,minHeight,maxHeight);
|
||||
int htoit = hashInRange(seed,0,minHeight/2,maxHeight/2);
|
||||
Vertex neh = ne + Vertex(0,0,h);
|
||||
Vertex seh = se + Vertex(0,0,h);
|
||||
Vertex nwh = nw + Vertex(0,0,h);
|
||||
Vertex swh = sw + Vertex(0,0,h);
|
||||
Vertex neh = corner[NE] + Vertex(0,0,h);
|
||||
Vertex seh = corner[SE] + Vertex(0,0,h);
|
||||
Vertex nwh = corner[NW] + Vertex(0,0,h);
|
||||
Vertex swh = corner[SW] + Vertex(0,0,h);
|
||||
Vertex toit = (neh + seh + nwh + swh) / 4 + Vertex(0,0,htoit);
|
||||
|
||||
// 4 Murs
|
||||
addTriangle(new Triangle(neh,seh,ne,0xf1,0xe3,0xad)); addTriangle(new Triangle(seh,se,ne,0xf1,0xe3,0xad)); // ne-se-seh-neh
|
||||
addTriangle(new Triangle(seh,swh,se,0xf1,0xe3,0xad)); addTriangle(new Triangle(swh,sw,se,0xf1,0xe3,0xad)); // se-sw-swh-seh
|
||||
addTriangle(new Triangle(swh,nwh,sw,0xf1,0xe3,0xad)); addTriangle(new Triangle(nwh,nw,sw,0xf1,0xe3,0xad)); // sw-nw-nwh-swh
|
||||
addTriangle(new Triangle(nwh,neh,nw,0xf1,0xe3,0xad)); addTriangle(new Triangle(neh,ne,nw,0xf1,0xe3,0xad)); // nw-ne-neh-nwh
|
||||
addTriangle(new Triangle(neh,seh,corner[NE],0xf1,0xe3,0xad)); addTriangle(new Triangle(seh,corner[SE],corner[NE],0xf1,0xe3,0xad)); // ne-se-seh-neh
|
||||
addTriangle(new Triangle(seh,swh,corner[SE],0xf1,0xe3,0xad)); addTriangle(new Triangle(swh,corner[SW],corner[SE],0xf1,0xe3,0xad)); // se-sw-swh-seh
|
||||
addTriangle(new Triangle(swh,nwh,corner[SW],0xf1,0xe3,0xad)); addTriangle(new Triangle(nwh,corner[NW],corner[SW],0xf1,0xe3,0xad)); // sw-nw-nwh-swh
|
||||
addTriangle(new Triangle(nwh,neh,corner[NW],0xf1,0xe3,0xad)); addTriangle(new Triangle(neh,corner[NE],corner[NW],0xf1,0xe3,0xad)); // nw-ne-neh-nwh
|
||||
|
||||
// 1 Toit
|
||||
addTriangle(new Triangle(neh,toit,seh,0x9a,0x48,0x3c));
|
||||
|
|
|
@ -6,10 +6,7 @@
|
|||
// RectangleRoutes est un quadrilatère de routes avec des angles aux coins égaux à 90°.
|
||||
class BatimentQuad : public Chose {
|
||||
private :
|
||||
Vertex ne;
|
||||
Vertex se;
|
||||
Vertex sw;
|
||||
Vertex nw;
|
||||
Vertex corner[4];
|
||||
Cardinal entry;
|
||||
|
||||
public :
|
||||
|
@ -18,12 +15,10 @@ class BatimentQuad : public Chose {
|
|||
|
||||
BatimentQuad(Vertex ne, Vertex se, Vertex sw, Vertex nw, Cardinal door);
|
||||
virtual ~BatimentQuad();
|
||||
int width();
|
||||
int height();
|
||||
virtual bool split();
|
||||
virtual void triangulation();
|
||||
Chose* factory(int seed, int n, Vertex ne, Vertex se, Vertex sw, Vertex nw);
|
||||
virtual std::vector<Vertex*> getBoundingBoxPoints() const;
|
||||
virtual void getBoundingBoxPoints();
|
||||
};
|
||||
|
||||
#endif
|
||||
|
|
|
@ -2,28 +2,27 @@
|
|||
|
||||
BatimentQuadJardin::BatimentQuadJardin(Vertex ne, Vertex se, Vertex sw, Vertex nw) : Chose() {
|
||||
addEntropy(ne, se, sw, nw);
|
||||
lctr = Vertex(ne.x-nw.x,se.y-ne.y,0.0f);
|
||||
this->ne = ne-lctr;
|
||||
this->se = se-lctr;
|
||||
this-> sw = sw-lctr;
|
||||
this->nw = nw-lctr;
|
||||
triangulation();
|
||||
lctr = (ne + se + sw + nw) / 4;
|
||||
corner[NE] = ne;//-lctr;
|
||||
corner[SE] = se;//-lctr;
|
||||
corner[SW] = sw;//-lctr;
|
||||
corner[NW] = nw;//-lctr;
|
||||
}
|
||||
|
||||
BatimentQuadJardin::~BatimentQuadJardin() {
|
||||
for(unsigned int i = 0; i < children.size(); i++)
|
||||
delete(children[i]);
|
||||
children.clear();
|
||||
triangles.clear();
|
||||
}
|
||||
|
||||
int BatimentQuadJardin::width() { return this->ne.x - this->sw.x; }
|
||||
|
||||
int BatimentQuadJardin::height() { return this->ne.y - this->sw.y; }
|
||||
|
||||
std::vector<Vertex*> BatimentQuadJardin::getBoundingBoxPoints() const {
|
||||
std::vector<Vertex*> list;
|
||||
return list;
|
||||
void BatimentQuadJardin::getBoundingBoxPoints() {
|
||||
addBBPoint(corner[NE]);
|
||||
addBBPoint(corner[SE]);
|
||||
addBBPoint(corner[SW]);
|
||||
addBBPoint(corner[NW]);
|
||||
addBBPoint(corner[NE] + Vertex(0,0,200)); // TODO
|
||||
addBBPoint(corner[SE] + Vertex(0,0,200));
|
||||
addBBPoint(corner[SW] + Vertex(0,0,200));
|
||||
addBBPoint(corner[NW] + Vertex(0,0,200));
|
||||
}
|
||||
|
||||
bool BatimentQuadJardin::split() {
|
||||
|
@ -34,6 +33,6 @@ bool BatimentQuadJardin::split() {
|
|||
void BatimentQuadJardin::triangulation() {
|
||||
triangles.reserve(2);
|
||||
|
||||
addTriangle(new Triangle(lctr+ne,lctr+nw,lctr+sw,0x12,0x64,0x12));
|
||||
addTriangle(new Triangle(lctr+sw,lctr+se,lctr+ne,0x10,0x60,0x10));
|
||||
addTriangle(new Triangle(/*lctr+*/corner[NE],/*lctr+*/corner[NW],/*lctr+*/corner[SW],0x12,0x64,0x12));
|
||||
addTriangle(new Triangle(/*lctr+*/corner[SW],/*lctr+*/corner[SE],/*lctr+*/corner[NE],0x12,0x64,0x12));
|
||||
}
|
||||
|
|
|
@ -6,10 +6,7 @@
|
|||
// RectangleRoutes est un quadrilatère de routes avec des angles aux coins égaux à 90°.
|
||||
class BatimentQuadJardin : public Chose {
|
||||
private :
|
||||
Vertex ne;
|
||||
Vertex se;
|
||||
Vertex sw;
|
||||
Vertex nw;
|
||||
Vertex corner[4];
|
||||
|
||||
public :
|
||||
static const int minHeight = 400;
|
||||
|
@ -17,12 +14,10 @@ class BatimentQuadJardin : public Chose {
|
|||
|
||||
BatimentQuadJardin(Vertex ne, Vertex se, Vertex sw, Vertex nw);
|
||||
virtual ~BatimentQuadJardin();
|
||||
int width();
|
||||
int height();
|
||||
virtual bool split();
|
||||
virtual void triangulation();
|
||||
Chose* factory(int seed, int n, Vertex ne, Vertex se, Vertex sw, Vertex nw);
|
||||
virtual std::vector<Vertex*> getBoundingBoxPoints() const;
|
||||
virtual void getBoundingBoxPoints();
|
||||
};
|
||||
|
||||
#endif
|
||||
|
|
|
@ -2,33 +2,31 @@
|
|||
|
||||
BatimentQuadMaison::BatimentQuadMaison(Vertex ne, Vertex se, Vertex sw, Vertex nw) : Chose() {
|
||||
addEntropy(ne, se, sw, nw);
|
||||
lctr = Vertex(ne.x-nw.x,se.y-ne.y,0.0f);
|
||||
this->ne = ne-lctr;
|
||||
this->se = se-lctr;
|
||||
this-> sw = sw-lctr;
|
||||
this->nw = nw-lctr;
|
||||
triangulation();
|
||||
lctr = (ne + se + sw + nw) / 4;
|
||||
corner[NE] = ne;//-lctr;
|
||||
corner[SE] = se;//-lctr;
|
||||
corner[SW] = sw;//-lctr;
|
||||
corner[NW] = nw;//-lctr;
|
||||
}
|
||||
|
||||
BatimentQuadMaison::~BatimentQuadMaison() {
|
||||
for(unsigned int i = 0; i < children.size(); i++)
|
||||
delete(children[i]);
|
||||
children.clear();
|
||||
triangles.clear();
|
||||
}
|
||||
|
||||
int BatimentQuadMaison::width() { return this->ne.x - this->sw.x; }
|
||||
|
||||
int BatimentQuadMaison::height() { return this->ne.y - this->sw.y; }
|
||||
|
||||
std::vector<Vertex*> BatimentQuadMaison::getBoundingBoxPoints() const {
|
||||
std::vector<Vertex*> list;
|
||||
return list;
|
||||
void BatimentQuadMaison::getBoundingBoxPoints() {
|
||||
addBBPoint(corner[NE]);
|
||||
addBBPoint(corner[SE]);
|
||||
addBBPoint(corner[SW]);
|
||||
addBBPoint(corner[NW]);
|
||||
addBBPoint(corner[NE] + Vertex(0,0,maxHeight + maxHeight/2)); // TODO
|
||||
addBBPoint(corner[SE] + Vertex(0,0,maxHeight + maxHeight/2));
|
||||
addBBPoint(corner[SW] + Vertex(0,0,maxHeight + maxHeight/2));
|
||||
addBBPoint(corner[NW] + Vertex(0,0,maxHeight + maxHeight/2));
|
||||
}
|
||||
|
||||
bool BatimentQuadMaison::split() {
|
||||
|
||||
return true;
|
||||
return false;
|
||||
}
|
||||
|
||||
void BatimentQuadMaison::triangulation() {
|
||||
|
@ -36,21 +34,21 @@ void BatimentQuadMaison::triangulation() {
|
|||
|
||||
int h = hashInRange(seed,0,minHeight,maxHeight);
|
||||
int htoit = hashInRange(seed,0,minHeight/2,maxHeight/2);
|
||||
Vertex neh = ne + Vertex(0,0,h);
|
||||
Vertex seh = se + Vertex(0,0,h);
|
||||
Vertex nwh = nw + Vertex(0,0,h);
|
||||
Vertex swh = sw + Vertex(0,0,h);
|
||||
Vertex neh = corner[NE] + Vertex(0,0,h);
|
||||
Vertex seh = corner[SE] + Vertex(0,0,h);
|
||||
Vertex nwh = corner[NW] + Vertex(0,0,h);
|
||||
Vertex swh = corner[SW] + Vertex(0,0,h);
|
||||
Vertex toit = (neh + seh + nwh + swh) / 4 + Vertex(0,0,htoit);
|
||||
|
||||
// 4 Murs
|
||||
addTriangle(new Triangle(lctr+neh,lctr+seh,lctr+ne,0xf1,0xe3,0xad)); addTriangle(new Triangle(lctr+seh,lctr+se,lctr+ne,0xf1,0xe3,0xad)); // ne-se-seh-neh
|
||||
addTriangle(new Triangle(lctr+seh,lctr+swh,lctr+se,0xf1,0xe3,0xad)); addTriangle(new Triangle(lctr+swh,lctr+sw,lctr+se,0xf1,0xe3,0xad)); // se-sw-swh-seh
|
||||
addTriangle(new Triangle(lctr+swh,lctr+nwh,lctr+sw,0xf1,0xe3,0xad)); addTriangle(new Triangle(lctr+nwh,lctr+nw,lctr+sw,0xf1,0xe3,0xad)); // sw-nw-nwh-swh
|
||||
addTriangle(new Triangle(lctr+nwh,lctr+neh,lctr+nw,0xf1,0xe3,0xad)); addTriangle(new Triangle(lctr+neh,lctr+ne,lctr+nw,0xf1,0xe3,0xad)); // nw-ne-neh-nwh
|
||||
addTriangle(new Triangle(/*lctr+*/neh,/*lctr+*/seh,/*lctr+*/corner[NE],0xf1,0xe3,0xad)); addTriangle(new Triangle(/*lctr+*/seh,/*lctr+*/corner[SE],/*lctr+*/corner[NE],0xf1,0xe3,0xad)); // ne-se-seh-neh
|
||||
addTriangle(new Triangle(/*lctr+*/seh,/*lctr+*/swh,/*lctr+*/corner[SE],0xf1,0xe3,0xad)); addTriangle(new Triangle(/*lctr+*/swh,/*lctr+*/corner[SW],/*lctr+*/corner[SE],0xf1,0xe3,0xad)); // se-sw-swh-seh
|
||||
addTriangle(new Triangle(/*lctr+*/swh,/*lctr+*/nwh,/*lctr+*/corner[SW],0xf1,0xe3,0xad)); addTriangle(new Triangle(/*lctr+*/nwh,/*lctr+*/corner[NW],/*lctr+*/corner[SW],0xf1,0xe3,0xad)); // sw-nw-nwh-swh
|
||||
addTriangle(new Triangle(/*lctr+*/nwh,/*lctr+*/neh,/*lctr+*/corner[NW],0xf1,0xe3,0xad)); addTriangle(new Triangle(/*lctr+*/neh,/*lctr+*/corner[NE],/*lctr+*/corner[NW],0xf1,0xe3,0xad)); // nw-ne-neh-nwh
|
||||
|
||||
// 1 Toit
|
||||
addTriangle(new Triangle(lctr+neh,lctr+toit,lctr+seh,0x9a,0x48,0x3c));
|
||||
addTriangle(new Triangle(lctr+seh,lctr+toit,lctr+swh,0x9a,0x48,0x3c));
|
||||
addTriangle(new Triangle(lctr+swh,lctr+toit,lctr+nwh,0x9a,0x48,0x3c));
|
||||
addTriangle(new Triangle(lctr+nwh,lctr+toit,lctr+neh,0x9a,0x48,0x3c));
|
||||
addTriangle(new Triangle(/*lctr+*/neh,/*lctr+*/toit,/*lctr+*/seh,0x9a,0x48,0x3c));
|
||||
addTriangle(new Triangle(/*lctr+*/seh,/*lctr+*/toit,/*lctr+*/swh,0x9a,0x48,0x3c));
|
||||
addTriangle(new Triangle(/*lctr+*/swh,/*lctr+*/toit,/*lctr+*/nwh,0x9a,0x48,0x3c));
|
||||
addTriangle(new Triangle(/*lctr+*/nwh,/*lctr+*/toit,/*lctr+*/neh,0x9a,0x48,0x3c));
|
||||
}
|
||||
|
|
|
@ -6,10 +6,7 @@
|
|||
// RectangleRoutes est un quadrilatère de routes avec des angles aux coins égaux à 90°.
|
||||
class BatimentQuadMaison : public Chose {
|
||||
private :
|
||||
Vertex ne;
|
||||
Vertex se;
|
||||
Vertex sw;
|
||||
Vertex nw;
|
||||
Vertex corner[4];
|
||||
|
||||
public :
|
||||
static const int minHeight = 400;
|
||||
|
@ -17,12 +14,10 @@ class BatimentQuadMaison : public Chose {
|
|||
|
||||
BatimentQuadMaison(Vertex ne, Vertex se, Vertex sw, Vertex nw);
|
||||
virtual ~BatimentQuadMaison();
|
||||
int width();
|
||||
int height();
|
||||
virtual bool split();
|
||||
virtual void triangulation();
|
||||
Chose* factory(int seed, int n, Vertex ne, Vertex se, Vertex sw, Vertex nw);
|
||||
virtual std::vector<Vertex*> getBoundingBoxPoints() const;
|
||||
virtual void getBoundingBoxPoints();
|
||||
};
|
||||
|
||||
#endif
|
||||
|
|
|
@ -1,6 +1,8 @@
|
|||
#include "all_includes.hh"
|
||||
|
||||
Chose::Chose() : seed(initialSeed), children() {}
|
||||
Chose::Chose() : seed(initialSeed), children() {
|
||||
std::cout << "NEW CHOSE " << (int)(this) << std::endl;
|
||||
}
|
||||
|
||||
void Chose::addChild(Chose* c) {
|
||||
children.push_back(c);
|
||||
|
@ -11,8 +13,6 @@ void Chose::addTriangle(Triangle* t) {
|
|||
}
|
||||
|
||||
bool Chose::merge() {
|
||||
for(unsigned int i = 0; i < children.size(); i++)
|
||||
delete(children[i]);
|
||||
children.clear();
|
||||
// triangles.clear();
|
||||
return true;
|
||||
|
@ -32,4 +32,33 @@ void Chose::display() {
|
|||
}
|
||||
}
|
||||
|
||||
unsigned int Chose::initialSeed = random_seed();
|
||||
void Chose::addBBPoint(Vertex v) {
|
||||
if (lod.firstBBPoint) {
|
||||
lod.firstBBPoint = false;
|
||||
lod.aabb[0] = v.x;
|
||||
lod.aabb[1] = v.x;
|
||||
lod.aabb[2] = v.y;
|
||||
lod.aabb[3] = v.y;
|
||||
lod.aabb[4] = v.z;
|
||||
lod.aabb[5] = v.z;
|
||||
} else {
|
||||
lod.aabb[0] = std::min(lod.aabb[0], v.x);
|
||||
lod.aabb[1] = std::max(lod.aabb[1], v.x);
|
||||
lod.aabb[2] = std::min(lod.aabb[2], v.y);
|
||||
lod.aabb[3] = std::max(lod.aabb[3], v.y);
|
||||
lod.aabb[4] = std::min(lod.aabb[4], v.z);
|
||||
lod.aabb[5] = std::max(lod.aabb[5], v.z);
|
||||
}
|
||||
}
|
||||
|
||||
void Chose::updateAABB() {
|
||||
lod.firstBBPoint = true;
|
||||
getBoundingBoxPoints();
|
||||
for (int i = 0; i < 6; i++) {
|
||||
// TODO
|
||||
lod.splitCube[i] = lod.aabb[i];
|
||||
lod.mergeCube[i] = lod.aabb[i];
|
||||
}
|
||||
}
|
||||
|
||||
unsigned int Chose::initialSeed = 779313522;//random_seed();
|
||||
|
|
|
@ -20,8 +20,12 @@ class Chose {
|
|||
void display();
|
||||
virtual bool split() = 0;
|
||||
virtual bool merge();
|
||||
virtual void triangulation() = 0;
|
||||
virtual void updateAABB();
|
||||
|
||||
protected :
|
||||
void addBBPoint(Vertex v);
|
||||
virtual void getBoundingBoxPoints() = 0;
|
||||
Chose();
|
||||
inline void addEntropy(unsigned int x1) {
|
||||
seed = hash2(seed, x1);
|
||||
|
@ -49,8 +53,6 @@ class Chose {
|
|||
}
|
||||
void addChild(Chose* c);
|
||||
void addTriangle(Triangle* t);
|
||||
virtual void triangulation() = 0;
|
||||
virtual std::vector<Vertex*> getBoundingBoxPoints() const = 0;
|
||||
};
|
||||
|
||||
#endif
|
||||
|
|
|
@ -9,15 +9,19 @@ QuartierQuad::QuartierQuad(Vertex ne, Vertex se, Vertex sw, Vertex nw) : Chose()
|
|||
}
|
||||
|
||||
QuartierQuad::~QuartierQuad() {
|
||||
for(unsigned int i = 0; i < children.size(); i++)
|
||||
delete(children[i]);
|
||||
children.clear();
|
||||
triangles.clear();
|
||||
}
|
||||
|
||||
std::vector<Vertex*> QuartierQuad::getBoundingBoxPoints() const {
|
||||
std::vector<Vertex*> list;
|
||||
return list;
|
||||
void QuartierQuad::getBoundingBoxPoints() {
|
||||
addBBPoint(corner[NE]);
|
||||
addBBPoint(corner[SE]);
|
||||
addBBPoint(corner[SW]);
|
||||
addBBPoint(corner[NW]);
|
||||
addBBPoint(corner[NE] + Vertex(0,0,1000)); // TODO
|
||||
addBBPoint(corner[SE] + Vertex(0,0,1000));
|
||||
addBBPoint(corner[SW] + Vertex(0,0,1000));
|
||||
addBBPoint(corner[NW] + Vertex(0,0,1000));
|
||||
}
|
||||
|
||||
Chose* QuartierQuad::factory(int seed, int n, Vertex ne, Vertex se, Vertex sw, Vertex nw) {
|
||||
|
|
|
@ -13,7 +13,7 @@ public:
|
|||
virtual bool split();
|
||||
virtual void triangulation();
|
||||
static Chose* factory(int seed, int n, Vertex ne, Vertex se, Vertex sw, Vertex nw);
|
||||
virtual std::vector<Vertex*> getBoundingBoxPoints() const;
|
||||
virtual void getBoundingBoxPoints();
|
||||
};
|
||||
|
||||
#endif
|
||||
|
|
|
@ -1,21 +1,13 @@
|
|||
#include "all_includes.hh"
|
||||
|
||||
QuartierQuadAngle::QuartierQuadAngle(Vertex ne, Vertex se, Vertex sw, Vertex nw) : QuartierQuad(ne, se, sw, nw) {
|
||||
triangulation();
|
||||
}
|
||||
|
||||
QuartierQuadAngle::~QuartierQuadAngle() {
|
||||
for(unsigned int i = 0; i < children.size(); i++)
|
||||
delete(children[i]);
|
||||
children.clear();
|
||||
triangles.clear();
|
||||
}
|
||||
|
||||
std::vector<Vertex*> QuartierQuadAngle::getBoundingBoxPoints() const {
|
||||
std::vector<Vertex*> list;
|
||||
return list;
|
||||
}
|
||||
|
||||
bool QuartierQuadAngle::split() {
|
||||
for (int i = 0; i < 4; i++) {
|
||||
if (Triangle(corner[NW+i], corner[NE+i], corner[SE+i]).angle() >= Angle::d2r(130)) {
|
||||
|
|
|
@ -12,7 +12,6 @@ class QuartierQuadAngle : public QuartierQuad {
|
|||
QuartierQuadAngle(Vertex ne, Vertex se, Vertex sw, Vertex nw);
|
||||
virtual ~QuartierQuadAngle();
|
||||
virtual bool split();
|
||||
virtual std::vector<Vertex*> getBoundingBoxPoints() const;
|
||||
|
||||
private :
|
||||
void cutAngle();
|
||||
|
|
|
@ -4,17 +4,10 @@ QuartierQuadCarre::QuartierQuadCarre(Vertex ne, Vertex se, Vertex sw, Vertex nw)
|
|||
}
|
||||
|
||||
QuartierQuadCarre::~QuartierQuadCarre() {
|
||||
for(unsigned int i = 0; i < children.size(); i++)
|
||||
delete(children[i]);
|
||||
children.clear();
|
||||
triangles.clear();
|
||||
}
|
||||
|
||||
std::vector<Vertex*> QuartierQuadCarre::getBoundingBoxPoints() const {
|
||||
std::vector<Vertex*> list;
|
||||
return list;
|
||||
}
|
||||
|
||||
bool QuartierQuadCarre::split() {
|
||||
Vertex middle[4];
|
||||
Quad q[4];
|
||||
|
|
|
@ -12,7 +12,6 @@ class QuartierQuadCarre : public QuartierQuad {
|
|||
QuartierQuadCarre(Vertex ne, Vertex se, Vertex sw, Vertex nw);
|
||||
virtual ~QuartierQuadCarre();
|
||||
virtual bool split();
|
||||
virtual std::vector<Vertex*> getBoundingBoxPoints() const;
|
||||
};
|
||||
|
||||
#endif
|
||||
|
|
|
@ -4,17 +4,10 @@ QuartierQuadRect::QuartierQuadRect(Vertex ne, Vertex se, Vertex sw, Vertex nw) :
|
|||
}
|
||||
|
||||
QuartierQuadRect::~QuartierQuadRect() {
|
||||
for(unsigned int i = 0; i < children.size(); i++)
|
||||
delete(children[i]);
|
||||
children.clear();
|
||||
triangles.clear();
|
||||
}
|
||||
|
||||
std::vector<Vertex*> QuartierQuadRect::getBoundingBoxPoints() const {
|
||||
std::vector<Vertex*> list;
|
||||
return list;
|
||||
}
|
||||
|
||||
bool QuartierQuadRect::split() {
|
||||
Vertex n = Segment(corner[NW], corner[NE]).randomPos(seed, 0, 33, 67);
|
||||
Vertex s = Segment(corner[SE], corner[SW]).randomPos(seed, 1, 33, 67);
|
||||
|
|
|
@ -12,7 +12,6 @@ class QuartierQuadRect : public QuartierQuad {
|
|||
QuartierQuadRect(Vertex ne, Vertex se, Vertex sw, Vertex nw);
|
||||
virtual ~QuartierQuadRect();
|
||||
virtual bool split();
|
||||
virtual std::vector<Vertex*> getBoundingBoxPoints() const;
|
||||
};
|
||||
|
||||
#endif
|
||||
|
|
|
@ -5,19 +5,20 @@ QuartierTri::QuartierTri(Vertex left, Vertex top, Vertex right) : Chose() {
|
|||
corner[0] = left;
|
||||
corner[1] = top;
|
||||
corner[2] = right;
|
||||
triangulation();
|
||||
}
|
||||
|
||||
QuartierTri::~QuartierTri() {
|
||||
for(unsigned int i = 0; i < children.size(); i++)
|
||||
delete(children[i]);
|
||||
children.clear();
|
||||
triangles.clear();
|
||||
children.clear();
|
||||
triangles.clear();
|
||||
}
|
||||
|
||||
std::vector<Vertex*> QuartierTri::getBoundingBoxPoints() const {
|
||||
std::vector<Vertex*> list;
|
||||
return list;
|
||||
void QuartierTri::getBoundingBoxPoints() {
|
||||
addBBPoint(corner[0]);
|
||||
addBBPoint(corner[1]);
|
||||
addBBPoint(corner[2]);
|
||||
addBBPoint(corner[0] + Vertex(0,0,1000)); // TODO
|
||||
addBBPoint(corner[1] + Vertex(0,0,1000));
|
||||
addBBPoint(corner[2] + Vertex(0,0,1000));
|
||||
}
|
||||
|
||||
Chose* QuartierTri::factory(int seed, int n, Vertex left, Vertex top, Vertex right) {
|
||||
|
|
|
@ -14,7 +14,7 @@ class QuartierTri : public Chose {
|
|||
virtual bool split();
|
||||
virtual void triangulation();
|
||||
static Chose* factory(int seed, int n, Vertex left, Vertex top, Vertex right);
|
||||
virtual std::vector<Vertex*> getBoundingBoxPoints() const;
|
||||
virtual void getBoundingBoxPoints();
|
||||
};
|
||||
|
||||
#endif
|
||||
|
|
|
@ -1,20 +1,27 @@
|
|||
#include "all_includes.hh"
|
||||
|
||||
RouteQuadCarrefour::RouteQuadCarrefour(Vertex ne, Vertex se, Vertex sw, Vertex nw) : Chose(), ne(ne), se(se), sw(sw), nw(nw) {
|
||||
RouteQuadCarrefour::RouteQuadCarrefour(Vertex ne, Vertex se, Vertex sw, Vertex nw) : Chose() {
|
||||
addEntropy(ne,se,sw,nw);
|
||||
triangulation();
|
||||
corner[NE] = ne;
|
||||
corner[SE] = se;
|
||||
corner[SW] = sw;
|
||||
corner[NW] = nw;
|
||||
}
|
||||
|
||||
RouteQuadCarrefour::~RouteQuadCarrefour() {
|
||||
for(unsigned int i = 0; i < children.size(); i++)
|
||||
delete(children[i]);
|
||||
children.clear();
|
||||
triangles.clear();
|
||||
}
|
||||
|
||||
std::vector<Vertex*> RouteQuadCarrefour::getBoundingBoxPoints() const {
|
||||
std::vector<Vertex*> list;
|
||||
return list;
|
||||
void RouteQuadCarrefour::getBoundingBoxPoints() {
|
||||
addBBPoint(corner[NE]);
|
||||
addBBPoint(corner[SE]);
|
||||
addBBPoint(corner[SW]);
|
||||
addBBPoint(corner[NW]);
|
||||
addBBPoint(corner[NE] + Vertex(0,0,1000)); // TODO
|
||||
addBBPoint(corner[SE] + Vertex(0,0,1000));
|
||||
addBBPoint(corner[SW] + Vertex(0,0,1000));
|
||||
addBBPoint(corner[NW] + Vertex(0,0,1000));
|
||||
}
|
||||
|
||||
bool RouteQuadCarrefour::split() {
|
||||
|
@ -24,6 +31,6 @@ bool RouteQuadCarrefour::split() {
|
|||
|
||||
void RouteQuadCarrefour::triangulation() {
|
||||
triangles.reserve(2);
|
||||
addTriangle(new Triangle(ne, nw, sw, 0x36, 0x36, 0x36));
|
||||
addTriangle(new Triangle(sw, se, ne, 0x36, 0x36, 0x36));
|
||||
addTriangle(new Triangle(corner[NE], corner[NW], corner[SW], 0x36, 0x36, 0x36));
|
||||
addTriangle(new Triangle(corner[SW], corner[SE], corner[NE], 0x36, 0x36, 0x36));
|
||||
}
|
||||
|
|
|
@ -5,17 +5,14 @@
|
|||
|
||||
class RouteQuadCarrefour : public Chose {
|
||||
private :
|
||||
Vertex ne;
|
||||
Vertex se;
|
||||
Vertex sw;
|
||||
Vertex nw;
|
||||
Vertex corner[4];
|
||||
|
||||
public :
|
||||
RouteQuadCarrefour(Vertex ne, Vertex se, Vertex sw, Vertex nw);
|
||||
virtual ~RouteQuadCarrefour();
|
||||
virtual bool split();
|
||||
virtual void triangulation();
|
||||
virtual std::vector<Vertex*> getBoundingBoxPoints() const;
|
||||
virtual void getBoundingBoxPoints();
|
||||
};
|
||||
|
||||
#endif
|
||||
|
|
|
@ -1,19 +1,27 @@
|
|||
#include "all_includes.hh"
|
||||
|
||||
RouteQuadChaussee::RouteQuadChaussee(Vertex ne, Vertex se, Vertex sw, Vertex nw) : Chose(), ne(ne), se(se), sw(sw), nw(nw) {
|
||||
triangulation();
|
||||
RouteQuadChaussee::RouteQuadChaussee(Vertex ne, Vertex se, Vertex sw, Vertex nw) : Chose() {
|
||||
addEntropy(ne,se,sw,nw);
|
||||
corner[NE] = ne;
|
||||
corner[SE] = se;
|
||||
corner[SW] = sw;
|
||||
corner[NW] = nw;
|
||||
}
|
||||
|
||||
RouteQuadChaussee::~RouteQuadChaussee() {
|
||||
for(unsigned int i = 0; i < children.size(); i++)
|
||||
delete(children[i]);
|
||||
children.clear();
|
||||
triangles.clear();
|
||||
}
|
||||
|
||||
std::vector<Vertex*> RouteQuadChaussee::getBoundingBoxPoints() const {
|
||||
std::vector<Vertex*> list;
|
||||
return list;
|
||||
void RouteQuadChaussee::getBoundingBoxPoints() {
|
||||
addBBPoint(corner[NE]);
|
||||
addBBPoint(corner[SE]);
|
||||
addBBPoint(corner[SW]);
|
||||
addBBPoint(corner[NW]);
|
||||
addBBPoint(corner[NE] + Vertex(0,0,1000)); // TODO
|
||||
addBBPoint(corner[SE] + Vertex(0,0,1000));
|
||||
addBBPoint(corner[SW] + Vertex(0,0,1000));
|
||||
addBBPoint(corner[NW] + Vertex(0,0,1000));
|
||||
}
|
||||
|
||||
bool RouteQuadChaussee::split() {
|
||||
|
@ -23,8 +31,8 @@ bool RouteQuadChaussee::split() {
|
|||
|
||||
void RouteQuadChaussee::triangulation() {
|
||||
triangles.reserve(2);
|
||||
addTriangle(new Triangle(ne, nw, sw, 0x36, 0x36, 0x36));
|
||||
addTriangle(new Triangle(sw, se, ne, 0x36, 0x36, 0x36));
|
||||
addTriangle(new Triangle(corner[NE], corner[NW], corner[SW], 0x36, 0x36, 0x36));
|
||||
addTriangle(new Triangle(corner[SW], corner[SE], corner[NE], 0x36, 0x36, 0x36));
|
||||
}
|
||||
|
||||
// Version avec trottoirs.
|
||||
|
|
|
@ -5,17 +5,14 @@
|
|||
|
||||
class RouteQuadChaussee : public Chose {
|
||||
private :
|
||||
Vertex ne;
|
||||
Vertex se;
|
||||
Vertex sw;
|
||||
Vertex nw;
|
||||
Vertex corner[4];
|
||||
|
||||
public :
|
||||
RouteQuadChaussee(Vertex ne, Vertex se, Vertex sw, Vertex nw);
|
||||
virtual ~RouteQuadChaussee();
|
||||
virtual bool split();
|
||||
virtual void triangulation();
|
||||
virtual std::vector<Vertex*> getBoundingBoxPoints() const;
|
||||
virtual void getBoundingBoxPoints();
|
||||
};
|
||||
|
||||
#endif
|
||||
|
|
|
@ -1,25 +1,30 @@
|
|||
#include "all_includes.hh"
|
||||
|
||||
TrottoirQuadNormal::TrottoirQuadNormal(Vertex ne, Vertex se, Vertex sw, Vertex nw, int height, Cardinal border) {
|
||||
this->ne = ne;
|
||||
this->nw = nw;
|
||||
this->se = se;
|
||||
this->sw = sw;
|
||||
c[NE] = ne;
|
||||
c[SE] = se;
|
||||
c[SW] = sw;
|
||||
c[NW] = nw;
|
||||
this->height = height;
|
||||
this->border = border;
|
||||
triangulation();
|
||||
// TODO : pas besoin de ce champ : il suffit d'orienter
|
||||
// correctement le trottoir lorsqu'on le crée.
|
||||
}
|
||||
|
||||
TrottoirQuadNormal::~TrottoirQuadNormal() {
|
||||
for(unsigned int i = 0; i < children.size(); i++)
|
||||
delete(children[i]);
|
||||
children.clear();
|
||||
triangles.clear();
|
||||
}
|
||||
|
||||
std::vector<Vertex*> TrottoirQuadNormal::getBoundingBoxPoints() const {
|
||||
std::vector<Vertex*> list;
|
||||
return list;
|
||||
void TrottoirQuadNormal::getBoundingBoxPoints() {
|
||||
addBBPoint(c[NE]);
|
||||
addBBPoint(c[SE]);
|
||||
addBBPoint(c[SW]);
|
||||
addBBPoint(c[NW]);
|
||||
addBBPoint(c[NE] + Vertex(0,0,height)); // TODO
|
||||
addBBPoint(c[SE] + Vertex(0,0,height));
|
||||
addBBPoint(c[SW] + Vertex(0,0,height));
|
||||
addBBPoint(c[NW] + Vertex(0,0,height));
|
||||
}
|
||||
|
||||
bool TrottoirQuadNormal::split() {
|
||||
|
@ -29,37 +34,37 @@ bool TrottoirQuadNormal::split() {
|
|||
|
||||
void TrottoirQuadNormal::triangulation() {
|
||||
Vertex h = Vertex(0,0,height);
|
||||
Quad q = Quad(ne,se,sw,nw);
|
||||
Quad q = Quad(c[NE],c[SE],c[SW],c[NW]);
|
||||
|
||||
if(border == E) {
|
||||
q.offset(E,-15);
|
||||
addTriangle(new Triangle(q.corner[0] + h, q.corner[3] + h, q.corner[2] + h, 0x66, 0x66, 0x66));
|
||||
addTriangle(new Triangle(q.corner[2] + h, q.corner[1] + h, q.corner[0] + h, 0x66, 0x66, 0x66));
|
||||
addTriangle(new Triangle(ne + h,q.corner[0] + h, q.corner[1] + h, 0xAA, 0xAA, 0xAA));
|
||||
addTriangle(new Triangle(q.corner[1] + h, se + h, ne + h, 0xAA, 0xAA, 0xAA));
|
||||
addTriangle(new Triangle(c[NE] + h,q.corner[0] + h, q.corner[1] + h, 0xAA, 0xAA, 0xAA));
|
||||
addTriangle(new Triangle(q.corner[1] + h, c[SE] + h, c[NE] + h, 0xAA, 0xAA, 0xAA));
|
||||
|
||||
addTriangle(new Triangle(nw + h, nw, sw, 0x66, 0x66, 0x66));
|
||||
addTriangle(new Triangle(sw, sw + h, nw + h, 0x66, 0x66, 0x66));
|
||||
addTriangle(new Triangle(ne, ne + h, se + h, 0xAA, 0xAA, 0xAA));
|
||||
addTriangle(new Triangle(se + h, se, ne, 0xAA, 0xAA, 0xAA));
|
||||
addTriangle(new Triangle(c[NW] + h, c[NW], c[SW], 0x66, 0x66, 0x66));
|
||||
addTriangle(new Triangle(c[SW], c[SW] + h, c[NW] + h, 0x66, 0x66, 0x66));
|
||||
addTriangle(new Triangle(c[NE], c[NE] + h, c[SE] + h, 0xAA, 0xAA, 0xAA));
|
||||
addTriangle(new Triangle(c[SE] + h, c[SE], c[NE], 0xAA, 0xAA, 0xAA));
|
||||
|
||||
addTriangle(new Triangle(ne + h, ne, nw, 0x66, 0x66, 0x66));
|
||||
addTriangle(new Triangle(nw, nw + h, ne + h, 0x66, 0x66, 0x66));
|
||||
addTriangle(new Triangle(sw, sw + h, se + h, 0x66, 0x66, 0x66));
|
||||
addTriangle(new Triangle(se + h, se, sw, 0x66, 0x66, 0x66));
|
||||
addTriangle(new Triangle(c[NE] + h, c[NE], c[NW], 0x66, 0x66, 0x66));
|
||||
addTriangle(new Triangle(c[NW], c[NW] + h, c[NE] + h, 0x66, 0x66, 0x66));
|
||||
addTriangle(new Triangle(c[SW], c[SW] + h, c[SE] + h, 0x66, 0x66, 0x66));
|
||||
addTriangle(new Triangle(c[SE] + h, c[SE], c[SW], 0x66, 0x66, 0x66));
|
||||
}
|
||||
else {
|
||||
addTriangle(new Triangle(q.corner[0] + h, q.corner[3] + h, q.corner[2] + h, 0x66, 0x66, 0x66));
|
||||
addTriangle(new Triangle(q.corner[2] + h, q.corner[1] + h, q.corner[0] + h, 0x66, 0x66, 0x66));
|
||||
|
||||
addTriangle(new Triangle(nw + h, nw, sw, 0x66, 0x66, 0x66));
|
||||
addTriangle(new Triangle(sw, sw + h, nw + h, 0x66, 0x66, 0x66));
|
||||
addTriangle(new Triangle(ne, ne + h, se + h, 0x66, 0x66, 0x66));
|
||||
addTriangle(new Triangle(se + h, se, ne, 0x66, 0x66, 0x66));
|
||||
addTriangle(new Triangle(c[NW] + h, c[NW], c[SW], 0x66, 0x66, 0x66));
|
||||
addTriangle(new Triangle(c[SW], c[SW] + h, c[NW] + h, 0x66, 0x66, 0x66));
|
||||
addTriangle(new Triangle(c[NE], c[NE] + h, c[SE] + h, 0x66, 0x66, 0x66));
|
||||
addTriangle(new Triangle(c[SE] + h, c[SE], c[NE], 0x66, 0x66, 0x66));
|
||||
|
||||
addTriangle(new Triangle(ne + h, ne, nw, 0x66, 0x66, 0x66));
|
||||
addTriangle(new Triangle(nw, nw + h, ne + h, 0x66, 0x66, 0x66));
|
||||
addTriangle(new Triangle(sw, sw + h, se + h, 0x66, 0x66, 0x66));
|
||||
addTriangle(new Triangle(se + h, se, sw, 0x66, 0x66, 0x66));
|
||||
addTriangle(new Triangle(c[NE] + h, c[NE], c[NW], 0x66, 0x66, 0x66));
|
||||
addTriangle(new Triangle(c[NW], c[NW] + h, c[NE] + h, 0x66, 0x66, 0x66));
|
||||
addTriangle(new Triangle(c[SW], c[SW] + h, c[SE] + h, 0x66, 0x66, 0x66));
|
||||
addTriangle(new Triangle(c[SE] + h, c[SE], c[SW], 0x66, 0x66, 0x66));
|
||||
}
|
||||
}
|
||||
|
|
|
@ -5,10 +5,7 @@
|
|||
|
||||
class TrottoirQuadNormal : public Chose {
|
||||
private :
|
||||
Vertex ne;
|
||||
Vertex se;
|
||||
Vertex sw;
|
||||
Vertex nw;
|
||||
Vertex c[4];
|
||||
int height;
|
||||
Cardinal border;
|
||||
|
||||
|
@ -17,7 +14,7 @@ class TrottoirQuadNormal : public Chose {
|
|||
virtual ~TrottoirQuadNormal();
|
||||
virtual bool split();
|
||||
virtual void triangulation();
|
||||
virtual std::vector<Vertex*> getBoundingBoxPoints() const;
|
||||
virtual void getBoundingBoxPoints();
|
||||
};
|
||||
|
||||
#endif
|
||||
|
|
|
@ -6,22 +6,26 @@ TerrainQuadHerbe::TerrainQuadHerbe(Vertex ne, Vertex se, Vertex sw, Vertex nw) :
|
|||
corner[SE] = se;
|
||||
corner[SW] = sw;
|
||||
corner[NW] = nw;
|
||||
triangulation();
|
||||
}
|
||||
|
||||
TerrainQuadHerbe::~TerrainQuadHerbe() {
|
||||
for(unsigned int i = 0; i < children.size(); i++)
|
||||
delete(children[i]);
|
||||
children.clear();
|
||||
triangles.clear();
|
||||
}
|
||||
|
||||
std::vector<Vertex*> TerrainQuadHerbe::getBoundingBoxPoints() const {
|
||||
std::vector<Vertex*> list;
|
||||
return list;
|
||||
void TerrainQuadHerbe::getBoundingBoxPoints() {
|
||||
addBBPoint(corner[NE]);
|
||||
addBBPoint(corner[SE]);
|
||||
addBBPoint(corner[SW]);
|
||||
addBBPoint(corner[NW]);
|
||||
addBBPoint(corner[NE] + Vertex(0,0,1000)); // TODO
|
||||
addBBPoint(corner[SE] + Vertex(0,0,1000));
|
||||
addBBPoint(corner[SW] + Vertex(0,0,1000));
|
||||
addBBPoint(corner[NW] + Vertex(0,0,1000));
|
||||
}
|
||||
|
||||
TerrainQuadHerbe::TerrainQuadHerbe(int red, Vertex ne, Vertex se, Vertex sw, Vertex nw) : Chose(), red(red) {
|
||||
TerrainQuadHerbe::TerrainQuadHerbe(int red, Vertex ne, Vertex se, Vertex sw, Vertex nw)
|
||||
: Chose(), red(red) {
|
||||
addEntropy(ne, se, sw, nw);
|
||||
corner[NE] = ne;
|
||||
corner[SE] = se;
|
||||
|
|
|
@ -15,7 +15,7 @@ class TerrainQuadHerbe : public Chose {
|
|||
virtual ~TerrainQuadHerbe();
|
||||
virtual bool split();
|
||||
virtual void triangulation();
|
||||
virtual std::vector<Vertex*> getBoundingBoxPoints() const;
|
||||
virtual void getBoundingBoxPoints();
|
||||
};
|
||||
|
||||
|
||||
|
|
8
view.cpp
8
view.cpp
|
@ -1,7 +1,10 @@
|
|||
#include "all_includes.hh"
|
||||
|
||||
// camera(Camera(Vertex(1000,1000,2000),45,100,1000,0.6)
|
||||
View::View(Chose* root) : root(root), camera(Camera(Vertex(9600,10000,15300),0,179,1000,0.6)) {
|
||||
// camera(Camera(Vertex(9600,10000,15300),0,179,1000,0.6)
|
||||
View::View(Chose* root)
|
||||
: root(root),
|
||||
camera(Camera(Vertex(10,10,-100),45,90,1000,0.6)),
|
||||
lod(camera.cameraCenter, root) {
|
||||
initWindow();
|
||||
mainLoop();
|
||||
}
|
||||
|
@ -86,6 +89,7 @@ void View::renderScene(int lastTime, int currentTime) {
|
|||
|
||||
camera.animation(currentTime-lastTime);
|
||||
camera.setCamera();
|
||||
lod.setCamera(camera.cameraCenter);
|
||||
|
||||
setLight();
|
||||
//displayAxes();
|
||||
|
|
Loading…
Reference in New Issue
Block a user