TEST(OctreeTest, TriangleBoundsTest) { Triangle triangle0(glm::vec3(1.0f, 2.0f, 3.0f), glm::vec3(4.0f, 5.0f, 6.0f), glm::vec3(7.0f, 8.0f, 9.0f)); BoundingBox box0 = triangle0.GetBounds(); EXPECT_EQ(box0, BoundingBox(glm::vec3(1.0f, 2.0f, 3.0f), glm::vec3(7.0f, 8.0f, 9.0f))); }
TEST(KDTree, shouldSupportTriangles) { KDTree tree; vector<RTShape*> shapes; RTTriangle triangle0(Vector(0.1,0.1,0.1), Vector(1,1,1), Vector(0.1,2,0.1)); RTTriangle triangle1(Vector(-0.1,-0.1,-0.1), Vector(-1,-1,-1), Vector(-0.1,-2,-0.1)); shapes.push_back(&triangle0); shapes.push_back(&triangle1); BoundingBox box(Vector(-1,-2,-1), Vector(2,4,2)); tree.setBoundingBox(box); tree.build(shapes, 0); CHECK_EQUAL( 1, tree.getLeft()->size() ); CHECK_EQUAL( 1, tree.getRight()->size() ); }
/* The segments, numbered arbitrarily from the top left: ________ _ ________ \ /\ /\ \ |\ / \ 0 / \ / \3> | \ 5 / \ / 1 \ / 2 \| ..|4 \ /-6-.. ___________\/______\/______\/______\/______\ | /\ /\ /\ /\ /\ |7 / \ 9 / \ 11 / \ 13 / \ 15 / \ | / 8 \ / 10 \ / 12 \ / 14 \ / 16 \ |/______\/______\/______\/______\/______\ \ /\ / /\ /\ \ 17 / \ 18 / / \ 20 / \ \ / \ / / 19 \ / 21 \ \/ \/ /______\/______\ Each triangle can be connected to at most two other triangles. We start from the middle, #12, and work our way to the edges. Its centroid is 0,0. */ static void triangle (ModeInfo *mi, int which, Bool frontp, GLfloat fold_ratio, GLfloat stel_ratio) { planetstruct *gp = &planets[MI_SCREEN(mi)]; const GLfloat fg[3] = { 1, 1, 1 }; const GLfloat bg[3] = { 0.3, 0.3, 0.3 }; int a = -1, b = -1; GLfloat max = acos (sqrt(5)/3); GLfloat rot = -max * fold_ratio / (M_PI/180); Bool wire = MI_IS_WIREFRAME(mi); if (wire) glColor3fv (fg); switch (which) { case 3: /* One third of the face. */ triangle0 (mi, frontp, stel_ratio, 1<<3 | 1<<4); break; case 4: /* Two thirds of the face: convex. */ triangle0 (mi, frontp, stel_ratio, 1<<1 | 1<<2 | 1<<3 | 1<<4); break; case 6: /* One half of the face. */ triangle0 (mi, frontp, stel_ratio, 1<<1 | 1<<2 | 1<<3); break; case 7: /* One half of the face. */ triangle0 (mi, frontp, stel_ratio, 1<<2 | 1<<3 | 1<<4); break; default: /* Full face. */ triangle0 (mi, frontp, stel_ratio, 0x3F); break; } if (wire) { char tag[20]; glColor3fv (bg); sprintf (tag, "%d", which); glPushMatrix(); glTranslatef (-0.1, 0.2, 0); glScalef (0.005, 0.005, 0.005); print_texture_string (gp->font_data, tag); glPopMatrix(); mi->polygon_count++; } /* The connection hierarchy of the faces starting at the middle, #12. */ switch (which) { case 0: break; case 1: a = 0; b = -1; break; case 2: a = -1; b = 3; break; case 3: break; case 4: a = -1; b = 5; break; case 5: a = -1; b = 6; break; case 7: break; case 6: break; case 8: a = 17; b = 7; break; case 9: a = 8; b = -1; break; case 10: a = 18; b = 9; break; case 11: a = 10; b = 1; break; case 12: a = 11; b = 13; break; case 13: a = 2; b = 14; break; case 14: a = 15; b = 20; break; case 15: a = 4; b = 16; break; case 16: break; case 17: break; case 18: break; case 19: break; case 20: a = 21; b = 19; break; case 21: break; default: abort(); break; } if (a != -1) { glPushMatrix(); glTranslatef (-0.5, 0, 0); /* Move model matrix to upper left */ glRotatef (60, 0, 0, 1); glTranslatef ( 0.5, 0, 0); glMatrixMode(GL_TEXTURE); /* glPushMatrix(); */ glTranslatef (-0.5, 0, 0); /* Move texture matrix the same way */ glRotatef (60, 0, 0, 1); glTranslatef ( 0.5, 0, 0); glMatrixMode(GL_MODELVIEW); glRotatef (rot, 1, 0, 0); triangle (mi, a, frontp, fold_ratio, stel_ratio); /* This should just be a PopMatrix on the TEXTURE stack, but f*****g iOS has GL_MAX_TEXTURE_STACK_DEPTH == 4! WTF! So we have to undo our rotations and translations manually. */ glMatrixMode(GL_TEXTURE); /* glPopMatrix(); */ glTranslatef (-0.5, 0, 0); glRotatef (-60, 0, 0, 1); glTranslatef (0.5, 0, 0); glMatrixMode(GL_MODELVIEW); glPopMatrix(); } if (b != -1) { glPushMatrix(); glTranslatef (0.5, 0, 0); /* Move model matrix to upper right */ glRotatef (-60, 0, 0, 1); glTranslatef (-0.5, 0, 0); glMatrixMode(GL_TEXTURE); /* glPushMatrix(); */ glTranslatef (0.5, 0, 0); /* Move texture matrix the same way */ glRotatef (-60, 0, 0, 1); glTranslatef (-0.5, 0, 0); glMatrixMode(GL_MODELVIEW); glRotatef (rot, 1, 0, 0); triangle (mi, b, frontp, fold_ratio, stel_ratio); /* See above. Grr. */ glMatrixMode(GL_TEXTURE); /* glPopMatrix(); */ glTranslatef (0.5, 0, 0); glRotatef (60, 0, 0, 1); glTranslatef (-0.5, 0, 0); glMatrixMode(GL_MODELVIEW); glPopMatrix(); } }