diff --git a/source/include/group.h b/source/include/group.h index 1be9802..74d8705 100644 --- a/source/include/group.h +++ b/source/include/group.h @@ -46,6 +46,8 @@ public: bool includes(Shape *b); + uint32_t getObjectCount() { return this->objectCount + this->unboxableObjectCount; }; + Group(); void dumpMe(FILE * fp); diff --git a/source/include/world.h b/source/include/world.h index 040dd5f..94c8360 100644 --- a/source/include/world.h +++ b/source/include/world.h @@ -15,6 +15,7 @@ #include #include #include +#include #ifdef ENABLE_LUA_SUPPORT extern "C" { @@ -25,15 +26,13 @@ extern "C" { class World { public: - uint32_t objectCount; uint32_t lightCount; private: - uint32_t allocatedObjectCount; uint32_t allocatedLightCount; - Light* *lightList; - Shape* *objectList; + + Group worldGroup; #ifdef ENABLE_LUA_SUPPORT lua_State *L; @@ -50,9 +49,12 @@ public: bool lightIsIn(Light &l); bool objectIsIn(Shape &s); - Shape *getObject(int i) { return this->objectList[i]; }; + Shape *getObject(int i) { return this->worldGroup[i]; }; Light *getLight(int i) { return this->lightList[i]; }; + uint32_t getObjectCount() { return this->worldGroup.getObjectCount(); }; + uint32_t getLightCount() { return this->lightCount; }; + Tuple shadeHit(Computation comps, uint32_t depthCount = 4); Tuple colourAt(Ray r, uint32_t depthCount = 4); bool isShadowed(Tuple point, Tuple lightPosition); diff --git a/source/world.cpp b/source/world.cpp index 15d5073..598f2de 100644 --- a/source/world.cpp +++ b/source/world.cpp @@ -22,16 +22,12 @@ extern "C" { #define MIN_ALLOC (2) -World::World() : objectCount(0), lightCount(0) +World::World() : lightCount(0) { this->allocatedLightCount = MIN_ALLOC; this->lightList = (Light **)calloc(sizeof(Light *), MIN_ALLOC); this->lightCount = 0; - this->allocatedObjectCount = MIN_ALLOC; - this->objectList = (Shape **)calloc(sizeof(Shape *), MIN_ALLOC); - this->objectCount = 0; - #ifdef ENABLE_LUA_SUPPORT this->L = luaL_newstate(); /* opens Lua */ luaL_openlibs(L); /* opens the basic library */ @@ -45,12 +41,10 @@ World::~World() void World::addObject(Shape *s) { - if ((this->objectCount + 1) > this->allocatedObjectCount) - { - this->allocatedObjectCount *= 2; - this->objectList = (Shape **)realloc(this->objectList, sizeof(Shape **) * this->allocatedObjectCount); - } - this->objectList[this->objectCount++] = s; + /* Cheaty but need to be done for now */ + s->materialSet = true; + + this->worldGroup.addObject(s); } void World::addLight(Light *l) @@ -78,33 +72,12 @@ bool World::lightIsIn(Light &l) bool World::objectIsIn(Shape &s) { - int i; - for(i = 0; i < this->objectCount; i++) - { - if (*this->objectList[i] == s) - { - return true; - } - } - return false; + return this->worldGroup.includes(&s); } Intersect World::intersect(Ray r) { - Intersect ret; - int i, j; - - for(i = 0; i < this->objectCount; i++) - { - Intersect xs = this->objectList[i]->intersect(r); - - for(j = 0; j < xs.count(); j++) - { - ret.add(xs[j]); - } - } - - return ret; + return this->worldGroup.intersect(r); } Tuple World::shadeHit(Computation comps, uint32_t depthCount) @@ -230,12 +203,7 @@ void World::dumpMe(FILE *fp) fprintf(fp, "},\n"); fprintf(fp, "\"Objects\": {\n"); - for(i = 0; i < this->objectCount; i++) - { - fprintf(fp, "\"%d\": {\n", i); - this->objectList[i]->dumpMe(fp); - fprintf(fp, "},\n"); - } + this->worldGroup.dumpMe(fp); fprintf(fp, "},\n"); /* JSON Closing */ diff --git a/tests/world_test.cpp b/tests/world_test.cpp index 0564a83..07ce64d 100644 --- a/tests/world_test.cpp +++ b/tests/world_test.cpp @@ -22,8 +22,8 @@ TEST(WorldTest, Creating_a_world) { World w; - ASSERT_EQ(w.lightCount, 0); - ASSERT_EQ(w.objectCount, 0); + ASSERT_EQ(w.getLightCount(), 0); + ASSERT_EQ(w.getObjectCount(), 0); } TEST(WorldTest, The_default_world) @@ -41,9 +41,12 @@ TEST(WorldTest, The_default_world) s2.setTransform(scaling(0.5, 0.5,0.5)); + Shape *obj0 = w.getObject(0); + Shape *obj1 = w.getObject(1); + ASSERT_TRUE(w.lightIsIn(l)); - ASSERT_TRUE(w.objectIsIn(s1)); - ASSERT_TRUE(w.objectIsIn(s2)); + ASSERT_EQ(*obj0, s1); + ASSERT_EQ(*obj1, s2); } TEST(WorldTest, Intersect_a_world_with_a_ray)