Fix Intersect and add sort the list each time we add something to it.

This commit is contained in:
Godzil
2020-02-20 00:46:19 +00:00
parent a82b67faa4
commit dbaa6eea2c
2 changed files with 30 additions and 8 deletions

View File

@@ -15,14 +15,15 @@
class Intersect class Intersect
{ {
private: private:
Intersection *list; Intersection **list;
uint32_t num; uint32_t num;
uint32_t allocated; uint32_t allocated;
public: public:
Intersect(); Intersect();
~Intersect();
void add(Intersection i); void add(Intersection i);
int count() { return this->num; }; 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(); Intersection hit();
}; };

View File

@@ -17,18 +17,39 @@
Intersect::Intersect() Intersect::Intersect()
{ {
this->allocated = MIN_ALLOC; this->allocated = MIN_ALLOC;
this->list = (Intersection *)calloc(sizeof(Intersection *), MIN_ALLOC); this->list = (Intersection **)calloc(sizeof(Intersection *), MIN_ALLOC);
this->num = 0; this->num = 0;
} }
Intersect::~Intersect()
{
/* Free stuff */
}
void Intersect::add(Intersection i) void Intersect::add(Intersection i)
{ {
Intersection *x;
int j, k;
if ((this->num + 1) > this->allocated) if ((this->num + 1) > this->allocated)
{ {
this->allocated *= 2; 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() Intersection Intersect::hit()
@@ -38,10 +59,10 @@ Intersection Intersect::hit()
uint32_t curHit = -1; uint32_t curHit = -1;
for(i = 0; i < this->num; i++) 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; curHit = i;
minHit = this->list[i].t; minHit = this->list[i]->t;
} }
} }
@@ -50,5 +71,5 @@ Intersection Intersect::hit()
return Intersection(0, nullptr); return Intersection(0, nullptr);
} }
return this->list[curHit]; return *this->list[curHit];
} }