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
|
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();
|
||||||
};
|
};
|
||||||
|
|
||||||
|
|||||||
@@ -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];
|
||||||
}
|
}
|
||||||
Reference in New Issue
Block a user