/* adds a cube to the scene */ unsigned int addSubdivCube (RTCScene scene_i) { unsigned int geomID = rtcNewSubdivisionMesh(scene_i, RTC_GEOMETRY_STATIC, NUM_QUAD_FACES, NUM_QUAD_INDICES, NUM_VERTICES, 0, 0, 0); rtcSetBuffer(scene_i, geomID, RTC_VERTEX_BUFFER, cube_vertices, 0, sizeof(Vec3fa )); rtcSetBuffer(scene_i, geomID, RTC_INDEX_BUFFER, cube_quad_indices , 0, sizeof(unsigned int)); rtcSetBuffer(scene_i, geomID, RTC_FACE_BUFFER, cube_quad_faces, 0, sizeof(unsigned int)); float* level = (float*) rtcMapBuffer(scene_i, geomID, RTC_LEVEL_BUFFER); for (size_t i=0; i<NUM_QUAD_INDICES; i++) level[i] = 4; rtcUnmapBuffer(scene_i, geomID, RTC_LEVEL_BUFFER); /* create face color array */ colors = (Vec3fa*) alignedMalloc(6*sizeof(Vec3fa)); colors[0] = Vec3fa(1,0,0); // left side colors[1] = Vec3fa(0,1,0); // right side colors[2] = Vec3fa(0.5f); // bottom side colors[3] = Vec3fa(1.0f); // top side colors[4] = Vec3fa(0,0,1); // front side colors[5] = Vec3fa(1,1,0); // back side /* set intersection filter for the cube */ if (g_mode != MODE_NORMAL) { rtcSetIntersectionFilterFunctionN(scene_i,geomID,intersectionFilterN); rtcSetOcclusionFilterFunctionN (scene_i,geomID,occlusionFilterN); } else { rtcSetIntersectionFilterFunction(scene_i,geomID,intersectionFilter); rtcSetOcclusionFilterFunction (scene_i,geomID,occlusionFilter); } return geomID; }
/* adds a cube to the scene */ unsigned int addCube (RTCScene scene_i) { /* create a triangulated cube with 12 triangles and 8 vertices */ unsigned int mesh = rtcNewTriangleMesh (scene_i, RTC_GEOMETRY_STATIC, 12, 8); /* set vertices */ Vertex* vertices = (Vertex*) rtcMapBuffer(scene_i,mesh,RTC_VERTEX_BUFFER); vertices[0].x = -1; vertices[0].y = -1; vertices[0].z = -1; vertices[1].x = -1; vertices[1].y = -1; vertices[1].z = +1; vertices[2].x = -1; vertices[2].y = +1; vertices[2].z = -1; vertices[3].x = -1; vertices[3].y = +1; vertices[3].z = +1; vertices[4].x = +1; vertices[4].y = -1; vertices[4].z = -1; vertices[5].x = +1; vertices[5].y = -1; vertices[5].z = +1; vertices[6].x = +1; vertices[6].y = +1; vertices[6].z = -1; vertices[7].x = +1; vertices[7].y = +1; vertices[7].z = +1; rtcUnmapBuffer(scene_i,mesh,RTC_VERTEX_BUFFER); /* create triangle color array */ colors = new Vec3f[12]; /* set triangles and colors */ int tri = 0; Triangle* triangles = (Triangle*) rtcMapBuffer(scene_i,mesh,RTC_INDEX_BUFFER); // left side colors[tri] = Vec3f(1,0,0); triangles[tri].v0 = 0; triangles[tri].v1 = 2; triangles[tri].v2 = 1; tri++; colors[tri] = Vec3f(1,0,0); triangles[tri].v0 = 1; triangles[tri].v1 = 2; triangles[tri].v2 = 3; tri++; // right side colors[tri] = Vec3f(0,1,0); triangles[tri].v0 = 4; triangles[tri].v1 = 5; triangles[tri].v2 = 6; tri++; colors[tri] = Vec3f(0,1,0); triangles[tri].v0 = 5; triangles[tri].v1 = 7; triangles[tri].v2 = 6; tri++; // bottom side colors[tri] = Vec3f(0.5f); triangles[tri].v0 = 0; triangles[tri].v1 = 1; triangles[tri].v2 = 4; tri++; colors[tri] = Vec3f(0.5f); triangles[tri].v0 = 1; triangles[tri].v1 = 5; triangles[tri].v2 = 4; tri++; // top side colors[tri] = Vec3f(1.0f); triangles[tri].v0 = 2; triangles[tri].v1 = 6; triangles[tri].v2 = 3; tri++; colors[tri] = Vec3f(1.0f); triangles[tri].v0 = 3; triangles[tri].v1 = 6; triangles[tri].v2 = 7; tri++; // front side colors[tri] = Vec3f(0,0,1); triangles[tri].v0 = 0; triangles[tri].v1 = 4; triangles[tri].v2 = 2; tri++; colors[tri] = Vec3f(0,0,1); triangles[tri].v0 = 2; triangles[tri].v1 = 4; triangles[tri].v2 = 6; tri++; // back side colors[tri] = Vec3f(1,1,0); triangles[tri].v0 = 1; triangles[tri].v1 = 3; triangles[tri].v2 = 5; tri++; colors[tri] = Vec3f(1,1,0); triangles[tri].v0 = 3; triangles[tri].v1 = 7; triangles[tri].v2 = 5; tri++; rtcUnmapBuffer(scene_i,mesh,RTC_INDEX_BUFFER); /* set intersection filter for the cube */ rtcSetIntersectionFilterFunction(scene_i,mesh,(RTCFilterFunc)&intersectionFilter); rtcSetOcclusionFilterFunction (scene_i,mesh,(RTCFilterFunc)&occlusionFilter); return mesh; }
/* adds a cube to the scene */ unsigned int addCube (RTCScene scene_i, const Vec3fa& offset, const Vec3fa& scale, float rotation) { /* create a triangulated cube with 12 triangles and 8 vertices */ unsigned int geomID = rtcNewTriangleMesh (scene_i, RTC_GEOMETRY_STATIC, NUM_TRI_FACES, NUM_VERTICES); //rtcSetBuffer(scene_i, geomID, RTC_VERTEX_BUFFER, cube_vertices, 0, sizeof(Vec3fa )); Vec3fa* ptr = (Vec3fa*) rtcMapBuffer(scene_i, geomID, RTC_VERTEX_BUFFER); for (size_t i=0; i<NUM_VERTICES; i++) { float x = cube_vertices[i][0]; float y = cube_vertices[i][1]; float z = cube_vertices[i][2]; Vec3fa vtx = Vec3fa(x,y,z); ptr[i] = Vec3fa(offset+LinearSpace3fa::rotate(Vec3fa(0,1,0),rotation)*LinearSpace3fa::scale(scale)*vtx); } rtcUnmapBuffer(scene_i,geomID,RTC_VERTEX_BUFFER); rtcSetBuffer(scene_i, geomID, RTC_INDEX_BUFFER, cube_tri_indices , 0, 3*sizeof(unsigned int)); /* create per-triangle color array */ colors = (Vec3fa*) alignedMalloc(12*sizeof(Vec3fa)); colors[0] = Vec3fa(1,0,0); // left side colors[1] = Vec3fa(1,0,0); colors[2] = Vec3fa(0,1,0); // right side colors[3] = Vec3fa(0,1,0); colors[4] = Vec3fa(0.5f); // bottom side colors[5] = Vec3fa(0.5f); colors[6] = Vec3fa(1.0f); // top side colors[7] = Vec3fa(1.0f); colors[8] = Vec3fa(0,0,1); // front side colors[9] = Vec3fa(0,0,1); colors[10] = Vec3fa(1,1,0); // back side colors[11] = Vec3fa(1,1,0); /* set intersection filter for the cube */ if (g_mode != MODE_NORMAL) { rtcSetIntersectionFilterFunctionN(scene_i,geomID,intersectionFilterN); rtcSetOcclusionFilterFunctionN (scene_i,geomID,occlusionFilterN); } else { rtcSetIntersectionFilterFunction(scene_i,geomID,intersectionFilter); rtcSetOcclusionFilterFunction (scene_i,geomID,occlusionFilter); } return geomID; }