Fix Intersect and add sort the list each time we add something to it.
This commit is contained in:
@@ -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();
|
||||
};
|
||||
|
||||
|
||||
@@ -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];
|
||||
}
|
||||
Reference in New Issue
Block a user