| 581 | |
| 582 | /* called by the C++ code for initialization */ |
| 583 | extern "C" void device_init (char* cfg) |
| 584 | { |
| 585 | /* create scene data */ |
| 586 | g_triangle_meshes[0] = createPlane( |
| 587 | AffineSpace3fa::translate(Vec3fa(0.f, -3.f, 0.f)) * |
| 588 | AffineSpace3fa::scale(Vec3fa(10.f, 4.f, 4.f)) * |
| 589 | AffineSpace3fa::rotate(Vec3fa(1.f, 0.f, 0.f), float(pi)/2) * |
| 590 | AffineSpace3fa::translate(Vec3fa(-0.5f, -0.5f, 0.f)), |
| 591 | 1); |
| 592 | g_triangle_meshes[1] = createPlane( |
| 593 | AffineSpace3fa::translate(Vec3fa(0.f, -1.f, 2.f)) * |
| 594 | AffineSpace3fa::scale(Vec3fa(10.f, 4.f, 4.f)) * |
| 595 | AffineSpace3fa::translate(Vec3fa(-0.5f, -0.5f, 0.f)), |
| 596 | 8); |
| 597 | g_triangle_meshes[2] = createTriangulatedSphere(Vec3fa(3.f, -2.f, 0.0f), 1.f); |
| 598 | g_triangle_meshes[3] = createCube(Vec3fa(-3.f, -2.f, 0), 1.0f); |
| 599 | |
| 600 | /* create embree scene */ |
| 601 | g_sceneEmbreeInstance = rtcNewScene(g_device); |
| 602 | g_sceneUserDefinedInstance = rtcNewScene(g_device); |
| 603 | |
| 604 | /* create scene that will be instanced */ |
| 605 | g_scene1 = rtcNewScene(g_device); |
| 606 | |
| 607 | // add the four objects to all three scenes |
| 608 | { |
| 609 | RTCScene scenes[] = { g_scene1, g_sceneEmbreeInstance, g_sceneUserDefinedInstance }; |
| 610 | for (int m = 0; m < 4; ++m) |
| 611 | for (RTCScene scene : scenes) |
| 612 | { |
| 613 | RTCGeometry geom = rtcNewGeometry (g_device, RTC_GEOMETRY_TYPE_TRIANGLE); |
| 614 | rtcSetGeometryPointQueryFunction(geom, closestPointFunc); |
| 615 | rtcCommitGeometry(geom); |
| 616 | rtcSetSharedGeometryBuffer(geom,RTC_BUFFER_TYPE_VERTEX,0,RTC_FORMAT_FLOAT3,g_triangle_meshes[m]->vertices, 0,sizeof(Vertex), g_triangle_meshes[m]->num_vertices); |
| 617 | rtcSetSharedGeometryBuffer(geom,RTC_BUFFER_TYPE_INDEX, 0,RTC_FORMAT_UINT3, g_triangle_meshes[m]->triangles,0,sizeof(Triangle),g_triangle_meshes[m]->num_triangles); |
| 618 | rtcAttachGeometryByID(scene, geom, m); |
| 619 | rtcReleaseGeometry(geom); |
| 620 | rtcCommitGeometry(geom); |
| 621 | rtcCommitScene(scene); |
| 622 | } |
| 623 | } |
| 624 | |
| 625 | /* compute bounding box of the scene that will be instanced */ |
| 626 | Vec3f bbmin(inf); |
| 627 | Vec3f bbmax(neg_inf); |
| 628 | for (int i = 0; i < 4; ++i) { |
| 629 | TriangleMesh* mesh = g_triangle_meshes[i]; |
| 630 | for (unsigned int v = 0; v < mesh->num_vertices; ++v) { |
| 631 | Vertex* vert = mesh->vertices+v; |
| 632 | bbmin = min(bbmin, Vec3f(vert->x, vert->y, vert->z)); |
| 633 | bbmax = max(bbmax, Vec3f(vert->x, vert->y, vert->z)); |
| 634 | } |
| 635 | } |
| 636 | |
| 637 | /* instantiate geometry */ |
| 638 | for (unsigned int i = 0; i < 3; ++i) { |
| 639 | g_instanceEmbree[i] = rtcNewGeometry (g_device, RTC_GEOMETRY_TYPE_INSTANCE); |
| 640 | rtcSetGeometryInstancedScene(g_instanceEmbree[i], g_scene1); |
nothing calls this directly
no test coverage detected