diff --git a/source/include/intersect.h b/source/include/intersect.h index b2685f3..a4fa944 100644 --- a/source/include/intersect.h +++ b/source/include/intersect.h @@ -15,14 +15,15 @@ class Intersect { private: - Intersection *list; + Intersection **list; uint32_t num; uint32_t allocated; public: Intersect(); + ~Intersect(); void add(Intersection i); int count() { return this->num; }; - Intersection operator[](const int p) { return this->list[p]; } + Intersection operator[](const int p) { return *this->list[p]; } Intersection hit(); }; diff --git a/source/intersect.cpp b/source/intersect.cpp index 52b380f..df8abfe 100644 --- a/source/intersect.cpp +++ b/source/intersect.cpp @@ -17,18 +17,39 @@ Intersect::Intersect() { this->allocated = MIN_ALLOC; - this->list = (Intersection *)calloc(sizeof(Intersection *), MIN_ALLOC); + this->list = (Intersection **)calloc(sizeof(Intersection *), MIN_ALLOC); this->num = 0; } +Intersect::~Intersect() +{ + /* Free stuff */ +} + void Intersect::add(Intersection i) { + Intersection *x; + int j, k; + if ((this->num + 1) > this->allocated) { this->allocated *= 2; - this->list = (Intersection *)realloc(this->list, sizeof(Intersection *) * this->allocated); + this->list = (Intersection **)realloc(this->list, sizeof(Intersection *) * this->allocated); + } + this->list[this->num++] = new Intersection(i.t, i.object); + + /* Now sort.. */ + for(j = 1; j < (this->num); j++) + { + x = this->list[j]; + k = j; + while( (k > 0) && (this->list[k - 1]->t) > x->t ) + { + this->list[k] = this->list[k - 1]; + k--; + } + this->list[k] = x; } - this->list[this->num++] = i; } Intersection Intersect::hit() @@ -38,10 +59,10 @@ Intersection Intersect::hit() uint32_t curHit = -1; for(i = 0; i < this->num; i++) { - if ((this->list[i].t >= 0) && (this->list[i].t < minHit)) + if ((this->list[i]->t >= 0) && (this->list[i]->t < minHit)) { curHit = i; - minHit = this->list[i].t; + minHit = this->list[i]->t; } } @@ -50,5 +71,5 @@ Intersection Intersect::hit() return Intersection(0, nullptr); } - return this->list[curHit]; + return *this->list[curHit]; } \ No newline at end of file