Browse Source

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

Godzil 4 years ago
parent
commit
dbaa6eea2c
2 changed files with 30 additions and 8 deletions
  1. 3 2
      source/include/intersect.h
  2. 27 6
      source/intersect.cpp

+ 3 - 2
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();
 };
 

+ 27 - 6
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];
 }