/* called by the C++ code for initialization */ extern "C" void device_init (char* cfg) { /* initialize ray tracing core */ rtcInit(cfg); /* set error handler */ rtcSetErrorFunction(error_handler); /* create scene */ g_scene = rtcNewScene(RTC_SCENE_DYNAMIC,RTC_INTERSECT1); /* create scene with 4 triangulated spheres */ g_scene1 = rtcNewScene(RTC_SCENE_STATIC,RTC_INTERSECT1); createTriangulatedSphere(g_scene1,Vec3fa( 0, 0,+1),0.5); createTriangulatedSphere(g_scene1,Vec3fa(+1, 0, 0),0.5); createTriangulatedSphere(g_scene1,Vec3fa( 0, 0,-1),0.5); createTriangulatedSphere(g_scene1,Vec3fa(-1, 0, 0),0.5); rtcCommit (g_scene1); /* instantiate geometry */ g_instance0 = rtcNewInstance(g_scene,g_scene1); g_instance1 = rtcNewInstance(g_scene,g_scene1); g_instance2 = rtcNewInstance(g_scene,g_scene1); g_instance3 = rtcNewInstance(g_scene,g_scene1); createGroundPlane(g_scene); /* set all colors */ colors[0][0] = Vec3fa(0.25,0,0); colors[0][1] = Vec3fa(0.50,0,0); colors[0][2] = Vec3fa(0.75,0,0); colors[0][3] = Vec3fa(1.00,0,0); colors[1][0] = Vec3fa(0,0.25,0); colors[1][1] = Vec3fa(0,0.50,0); colors[1][2] = Vec3fa(0,0.75,0); colors[1][3] = Vec3fa(0,1.00,0); colors[2][0] = Vec3fa(0,0,0.25); colors[2][1] = Vec3fa(0,0,0.50); colors[2][2] = Vec3fa(0,0,0.75); colors[2][3] = Vec3fa(0,0,1.00); colors[3][0] = Vec3fa(0.25,0.25,0); colors[3][1] = Vec3fa(0.50,0.50,0); colors[3][2] = Vec3fa(0.75,0.75,0); colors[3][3] = Vec3fa(1.00,1.00,0); /* set start render mode */ renderPixel = renderPixelStandard; key_pressed_handler = device_key_pressed_default; }
/* called by the C++ code for initialization */ extern "C" void device_init (int8* cfg) { /* initialize ray tracing core */ rtcInit(cfg); /* set error handler */ rtcSetErrorFunction(error_handler); /* create scene */ g_scene = rtcNewScene(RTC_SCENE_DYNAMIC | RTC_SCENE_ROBUST,RTC_INTERSECT1); /* add cube */ addCube(g_scene); /* add ground plane */ addGroundPlane(g_scene); /* commit changes to scene */ #if !defined(PARALLEL_COMMIT) rtcCommit (g_scene); #else launch[ getNumHWThreads() ] parallelCommit(g_scene); #endif /* set start render mode */ renderPixel = renderPixelStandard; }
/* main function in embree namespace */ int main(int argc, char** argv) { /* for best performance set FTZ and DAZ flags in MXCSR control and status register */ _MM_SET_FLUSH_ZERO_MODE(_MM_FLUSH_ZERO_ON); _MM_SET_DENORMALS_ZERO_MODE(_MM_DENORMALS_ZERO_ON); /* initialize ray tracing core and force bvh4.triangle4v hierarchy for triangles */ rtcInit("tri_accel=bvh4.triangle4v"); /* set error handler */ rtcSetErrorFunction(error_handler); /* create scene */ g_scene = rtcNewScene(RTC_SCENE_STATIC,RTC_INTERSECT1); addCube(g_scene,Vec3fa(-1,0,0)); addCube(g_scene,Vec3fa(1,0,0)); addCube(g_scene,Vec3fa(0,0,-1)); addCube(g_scene,Vec3fa(0,0,1)); addHair(g_scene); addGroundPlane(g_scene); rtcCommit (g_scene); /* print triangle BVH */ print_bvh(g_scene); /* cleanup */ rtcDeleteScene (g_scene); rtcExit(); return 0; }
/* called by the C++ code for initialization */ extern "C" void device_init (char* cfg) { /* create scene */ g_scene = rtcNewScene(g_device); rtcSetSceneFlags(g_scene,RTC_SCENE_FLAG_DYNAMIC | RTC_SCENE_FLAG_ROBUST); rtcSetSceneBuildQuality(g_scene,RTC_BUILD_QUALITY_LOW); /* create some triangulated spheres */ for (int i=0; i<numSpheres; i++) { const float phi = i*2.0f*float(pi)/numSpheres; const float r = 2.0f*float(pi)/numSpheres; const Vec3fa p = 2.0f*Vec3fa(sin(phi),0.0f,-cos(phi)); //RTCBuildQuality quality = i%3 == 0 ? RTC_BUILD_QUALITY_MEDIUM : i%3 == 1 ? RTC_BUILD_QUALITY_REFIT : RTC_BUILD_QUALITY_LOW; RTCBuildQuality quality = i%2 ? RTC_BUILD_QUALITY_REFIT : RTC_BUILD_QUALITY_LOW; //RTCBuildQuality quality = RTC_BUILD_QUALITY_REFIT; int id = createSphere(quality,p,r); position[id] = p; radius[id] = r; colors[id].x = (i%16+1)/17.0f; colors[id].y = (i%8+1)/9.0f; colors[id].z = (i%4+1)/5.0f; } /* add ground plane to scene */ int id = addGroundPlane(g_scene); colors[id] = Vec3fa(1.0f,1.0f,1.0f); /* commit changes to scene */ rtcCommitScene (g_scene); /* set start render mode */ renderTile = renderTileStandard; key_pressed_handler = device_key_pressed_default; }
/* called by the C++ code for initialization */ extern "C" void device_init (int8* cfg) { /* initialize ray tracing core */ rtcInit(cfg); /* create scene */ g_scene = rtcNewScene(RTC_SCENE_DYNAMIC,RTC_INTERSECT1); /* create some triangulated spheres */ for (int i=0; i<numSpheres; i++) { const float phi = i*2.0f*float(pi)/numSpheres; const float r = 2.0f*float(pi)/numSpheres; const Vec3f p = 2.0f*Vec3f(sin(phi),0.0f,-cos(phi)); RTCGeometryFlags flags = i%2 ? RTC_GEOMETRY_DEFORMABLE : RTC_GEOMETRY_DYNAMIC; //RTCGeometryFlags flags = RTC_GEOMETRY_DEFORMABLE; int id = createSphere(flags,p,r); position[id] = p; radius[id] = r; colors[id].x = (i%16+1)/17.0f; colors[id].y = (i%8+1)/9.0f; colors[id].z = (i%4+1)/5.0f; } /* add ground plane to scene */ int id = addGroundPlane(g_scene); colors[id] = Vec3f(1.0f,1.0f,1.0f); /* commit changes to scene */ rtcCommit (g_scene); /* set start render mode */ renderPixel = renderPixelStandard; }
Raytracer::Raytracer(osg::Node *scene, osg::Camera *camera) :_rootNode(scene), _camera(camera), TILE_SIZE_X(32),TILE_SIZE_Y(32), _backgroundColor(0.3f,0.4f,0.5f,1.0f) { rtcInit(); _scene = rtcNewScene(RTC_SCENE_STATIC, RTC_INTERSECT1); buildScene(); setOutputResolution(512,512); }
/* called by the C++ code for initialization */ extern "C" void device_init (char* cfg) { /* create scene */ g_scene = rtcNewScene(g_device); rtcSetSceneFlags(g_scene,RTC_SCENE_FLAG_ROBUST); /* add ground plane */ addGroundPlane(g_scene); /* add cube */ addCube(g_scene); /* commit changes to scene */ rtcCommitScene (g_scene); /* set start render mode */ renderTile = renderTileStandard; key_pressed_handler = device_key_pressed_default; }
/* called by the C++ code for initialization */ extern "C" void device_init (int8* cfg) { /* initialize ray tracing core */ rtcInit(cfg); /* set error handler */ rtcSetErrorFunction(error_handler); /* create scene */ g_scene = rtcNewScene(RTC_SCENE_DYNAMIC,RTC_INTERSECT1); /* create some triangulated spheres */ for (int i=0; i<numSpheres; i++) { const float phi = i*2.0f*float(pi)/numSpheres; const float r = 2.0f*float(pi)/numSpheres; const Vec3fa p = 2.0f*Vec3fa(sin(phi),0.0f,-cos(phi)); //RTCGeometryFlags flags = i%3 == 0 ? RTC_GEOMETRY_STATIC : i%3 == 1 ? RTC_GEOMETRY_DEFORMABLE : RTC_GEOMETRY_DYNAMIC; RTCGeometryFlags flags = i%2 ? RTC_GEOMETRY_DEFORMABLE : RTC_GEOMETRY_DYNAMIC; //RTCGeometryFlags flags = RTC_GEOMETRY_DEFORMABLE; int id = createSphere(flags,p,r); position[id] = p; radius[id] = r; colors[id].x = (i%16+1)/17.0f; colors[id].y = (i%8+1)/9.0f; colors[id].z = (i%4+1)/5.0f; } /* add ground plane to scene */ int id = addGroundPlane(g_scene); colors[id] = Vec3fa(1.0f,1.0f,1.0f); /* commit changes to scene */ #if !defined(PARALLEL_COMMIT) rtcCommit (g_scene); #else launch[ getNumHWThreads() ] parallelCommit(g_scene); #endif /* set start render mode */ renderPixel = renderPixelStandard; }
/* called by the C++ code for initialization */ extern "C" void device_init (int8* cfg) { /* initialize ray tracing core */ rtcInit(cfg); /* create scene */ g_scene = rtcNewScene(RTC_SCENE_STATIC,RTC_INTERSECT1); /* add cube */ addCube(g_scene); /* add ground plane */ addGroundPlane(g_scene); /* commit changes to scene */ rtcCommit (g_scene); /* set start render mode */ renderPixel = renderPixelStandard; }
/* called by the C++ code for initialization */ extern "C" void device_init (int8* cfg) { /* initialize ray tracing core */ rtcInit(cfg); /* set error handler */ rtcSetErrorFunction(error_handler); /* create scene */ g_scene = rtcNewScene(RTC_SCENE_DYNAMIC | RTC_SCENE_ROBUST,RTC_INTERSECT1); /* add cube */ addCube(g_scene); /* add ground plane */ addGroundPlane(g_scene); /* set start render mode */ renderPixel = renderPixelStandard; }
RTCScene convertScene(ISPCScene* scene_in) { //scene_in->numHairSets = 0; //scene_in->numMeshes = 0; /* create scene */ RTCScene scene_out = rtcNewScene(RTC_SCENE_STATIC | RTC_SCENE_INCOHERENT, RTC_INTERSECT1); /* add all hair sets to the scene */ for (int i=0; i<scene_in->numHairSets; i++) { ISPCHairSet* hair = scene_in->hairs[i]; unsigned int geomID = rtcNewHairGeometry (scene_out, RTC_GEOMETRY_STATIC, hair->numHairs, hair->numVertices, hair->v2 ? 2 : 1); rtcSetBuffer(scene_out,geomID,RTC_VERTEX_BUFFER,hair->v,0,sizeof(Vertex)); if (hair->v2) rtcSetBuffer(scene_out,geomID,RTC_VERTEX_BUFFER1,hair->v2,0,sizeof(Vertex)); rtcSetBuffer(scene_out,geomID,RTC_INDEX_BUFFER,hair->hairs,0,sizeof(ISPCHair)); rtcSetOcclusionFilterFunction(scene_out,geomID,(RTCFilterFunc)&filterDispatch); } /* add all triangle meshes to the scene */ for (int i=0; i<scene_in->numMeshes; i++) { ISPCMesh* mesh = scene_in->meshes[i]; unsigned int geomID = rtcNewTriangleMesh (scene_out, RTC_GEOMETRY_STATIC, mesh->numTriangles, mesh->numVertices, mesh->positions2 ? 2 : 1); rtcSetBuffer(scene_out,geomID,RTC_VERTEX_BUFFER,mesh->positions,0,sizeof(Vertex)); if (mesh->positions2) rtcSetBuffer(scene_out,geomID,RTC_VERTEX_BUFFER1,mesh->positions2,0,sizeof(Vertex)); rtcSetBuffer(scene_out,geomID,RTC_INDEX_BUFFER,mesh->triangles,0,sizeof(ISPCTriangle)); rtcSetOcclusionFilterFunction(scene_out,geomID,(RTCFilterFunc)&filterDispatch); } /* commit changes to scene */ #if !defined(PARALLEL_COMMIT) rtcCommit (scene_out); #else launch[ getNumHWThreads() ] parallelCommit(scene_out); #endif return scene_out; }
/* called by the C++ code for initialization */ extern "C" void device_init (char* cfg) { /* create scene */ g_scene = rtcNewScene(g_device); /* add ground plane */ addGroundPlane(g_scene); /* add cubes */ addCurve(g_scene,Vec3fa(4.0f,-1.0f,-3.5f)); quadCubeID = addQuadSubdivCube(g_scene,Vec3fa(4.0f,0.0f,0.0f)); triCubeID = addTriangleSubdivCube(g_scene,Vec3fa(4.0f,0.0f,3.5f)); addTriangleCube(g_scene,Vec3fa(0.0f,0.0f,-3.0f)); addQuadCube(g_scene,Vec3fa(0.0f,0.0f,3.0f)); /* commit changes to scene */ rtcCommitScene (g_scene); /* set start render mode */ renderTile = renderTileStandard; key_pressed_handler = device_key_pressed_default; }
extern "C" RTCScene ispcNewScene (RTCSceneFlags flags, RTCAlgorithmFlags aflags) { if (!isCoherent(flags) && !isIncoherent(flags)) flags = RTCSceneFlags(flags | RTC_SCENE_COHERENT); return rtcNewScene(flags,aflags); }
/* called by the C++ code for initialization */ extern "C" void device_init (int8* cfg) { /* initialize ray tracing core */ rtcInit(cfg); /* create scene */ g_scene = rtcNewScene(RTC_SCENE_DYNAMIC,RTC_INTERSECT1); /* create scene with 4 analytical spheres */ g_scene0 = rtcNewScene(RTC_SCENE_STATIC,RTC_INTERSECT1); Sphere* spheres = createAnalyticalSpheres(g_scene0,4); spheres[0].p = Vec3f( 0, 0,+1); spheres[0].r = 0.5f; spheres[1].p = Vec3f(+1, 0, 0); spheres[1].r = 0.5f; spheres[2].p = Vec3f( 0, 0,-1); spheres[2].r = 0.5f; spheres[3].p = Vec3f(-1, 0, 0); spheres[3].r = 0.5f; rtcCommit(g_scene0); /* create scene with 4 triangulated spheres */ g_scene1 = rtcNewScene(RTC_SCENE_STATIC,RTC_INTERSECT1); createTriangulatedSphere(g_scene1,Vec3f( 0, 0,+1),0.5); createTriangulatedSphere(g_scene1,Vec3f(+1, 0, 0),0.5); createTriangulatedSphere(g_scene1,Vec3f( 0, 0,-1),0.5); createTriangulatedSphere(g_scene1,Vec3f(-1, 0, 0),0.5); rtcCommit(g_scene1); /* create scene with 2 triangulated and 2 analytical spheres */ g_scene2 = rtcNewScene(RTC_SCENE_STATIC,RTC_INTERSECT1); createTriangulatedSphere(g_scene2,Vec3f( 0, 0,+1),0.5); createAnalyticalSphere (g_scene2,Vec3f(+1, 0, 0),0.5); createTriangulatedSphere(g_scene2,Vec3f( 0, 0,-1),0.5); createAnalyticalSphere (g_scene2,Vec3f(-1, 0, 0),0.5); rtcCommit(g_scene2); /* instantiate geometry */ createGroundPlane(g_scene); g_instance0 = createInstance(g_scene,g_scene0,0,Vec3f(-2,-2,-2),Vec3f(+2,+2,+2)); g_instance1 = createInstance(g_scene,g_scene1,1,Vec3f(-2,-2,-2),Vec3f(+2,+2,+2)); g_instance2 = createInstance(g_scene,g_scene2,2,Vec3f(-2,-2,-2),Vec3f(+2,+2,+2)); g_instance3 = createInstance(g_scene,g_scene2,3,Vec3f(-2,-2,-2),Vec3f(+2,+2,+2)); /* set all colors */ colors[0][0] = Vec3f(0.25,0,0); colors[0][1] = Vec3f(0.50,0,0); colors[0][2] = Vec3f(0.75,0,0); colors[0][3] = Vec3f(1.00,0,0); colors[1][0] = Vec3f(0,0.25,0); colors[1][1] = Vec3f(0,0.50,0); colors[1][2] = Vec3f(0,0.75,0); colors[1][3] = Vec3f(0,1.00,0); colors[2][0] = Vec3f(0,0,0.25); colors[2][1] = Vec3f(0,0,0.50); colors[2][2] = Vec3f(0,0,0.75); colors[2][3] = Vec3f(0,0,1.00); colors[3][0] = Vec3f(0.25,0.25,0); colors[3][1] = Vec3f(0.50,0.50,0); colors[3][2] = Vec3f(0.75,0.75,0); colors[3][3] = Vec3f(1.00,1.00,0); colors[4][0] = Vec3f(1.0,1.0,1.0); colors[4][1] = Vec3f(1.0,1.0,1.0); colors[4][2] = Vec3f(1.0,1.0,1.0); colors[4][3] = Vec3f(1.0,1.0,1.0); /* set start render mode */ renderPixel = renderPixelStandard; }
EmbreeScene::EmbreeScene(const EmbreeScene::Arguments& arguments) { // Start stopwatch. Stopwatch<DefaultWallclockTimer> stopwatch; stopwatch.start(); Statistics statistics; m_device = arguments.m_device.m_device; m_scene = rtcNewScene(m_device); rtcSetSceneBuildQuality( m_scene, RTCBuildQuality::RTC_BUILD_QUALITY_HIGH); const ObjectInstanceContainer& instance_container = arguments.m_assembly.object_instances(); const size_t instance_count = instance_container.size(); m_geometry_container.reserve(instance_count); for (size_t instance_idx = 0; instance_idx < instance_count; ++instance_idx) { const ObjectInstance* object_instance = instance_container.get_by_index(instance_idx); assert(object_instance); RTCGeometry geometry_handle; // Set per instance data. unique_ptr<EmbreeGeometryData> geometry_data(new EmbreeGeometryData()); geometry_data->m_object_instance_idx = instance_idx; geometry_data->m_vis_flags = object_instance->get_vis_flags(); // // Collect geometry data for the instance. // const char* object_model = object_instance->get_object().get_model(); if (strcmp(object_model, MeshObjectFactory().get_model()) == 0) { geometry_data->m_geometry_type = RTC_GEOMETRY_TYPE_TRIANGLE; // Retrieve triangle data. collect_triangle_data(*object_instance, *geometry_data); geometry_handle = rtcNewGeometry( m_device, RTC_GEOMETRY_TYPE_TRIANGLE); rtcSetGeometryBuildQuality( geometry_handle, RTCBuildQuality::RTC_BUILD_QUALITY_HIGH); rtcSetGeometryTimeStepCount( geometry_handle, geometry_data->m_motion_steps_count); geometry_data->m_geometry_handle = geometry_handle; const unsigned int vertices_count = geometry_data->m_vertices_count; const unsigned int vertices_stride = geometry_data->m_vertices_stride; for (unsigned int m = 0; m < geometry_data->m_motion_steps_count; ++m) { // Byte offset for the current motion segment. const unsigned int vertices_offset = m * vertices_count * vertices_stride; // Set vertices. rtcSetSharedGeometryBuffer( geometry_handle, // geometry RTC_BUFFER_TYPE_VERTEX, // buffer type m, // slot RTC_FORMAT_FLOAT3, // format geometry_data->m_vertices, // buffer vertices_offset, // byte offset vertices_stride, // byte stride vertices_count); // item count } // Set vertex indices. rtcSetSharedGeometryBuffer( geometry_handle, // geometry RTC_BUFFER_TYPE_INDEX, // buffer type 0, // slot RTC_FORMAT_UINT3, // format geometry_data->m_primitives, // buffer 0, // byte offset geometry_data->m_primitives_stride, // byte stride geometry_data->m_primitives_count); // item count rtcSetGeometryMask( geometry_handle, geometry_data->m_vis_flags); rtcCommitGeometry(geometry_handle); } else if (strcmp(object_model, CurveObjectFactory().get_model()) == 0) { geometry_data->m_geometry_type = RTC_GEOMETRY_TYPE_FLAT_BEZIER_CURVE; // Retrieve curve data. collect_curve_data(*object_instance, *geometry_data); geometry_handle = rtcNewGeometry( m_device, RTC_GEOMETRY_TYPE_FLAT_BEZIER_CURVE); rtcSetGeometryBuildQuality( geometry_handle, RTCBuildQuality::RTC_BUILD_QUALITY_HIGH); // Set vertices. (x_pos, y_pos, z_pos, radii) rtcSetSharedGeometryBuffer( geometry_handle, // geometry RTC_BUFFER_TYPE_INDEX, // buffer type 0, // slot RTC_FORMAT_FLOAT4, // format geometry_data->m_vertices, // buffer 0, // byte offset geometry_data->m_vertices_stride, // byte stride geometry_data->m_vertices_count); // item count // Set vertex indices. rtcSetSharedGeometryBuffer( geometry_handle, // geometry RTC_BUFFER_TYPE_INDEX, // buffer type 0, // slot RTC_FORMAT_UINT4, // format geometry_data->m_primitives, // buffer 0, // byte offset geometry_data->m_primitives_stride, // byte stride geometry_data->m_primitives_count); // item count } else { // Unsupported object type. continue; } rtcAttachGeometryByID(m_scene, geometry_handle, static_cast<unsigned int>(instance_idx)); m_geometry_container.push_back(std::move(geometry_data)); } rtcCommitScene(m_scene); statistics.insert_time("total build time", stopwatch.measure().get_seconds()); RENDERER_LOG_DEBUG("%s", StatisticsVector::make( "Embree scene #" + to_string(arguments.m_assembly.get_uid()) + " statistics", statistics).to_string().c_str()); }
RTCScene convertScene(ISPCScene* scene_in) { //scene_in->numHairSets = 0; //scene_in->numMeshes = 0; /* create scene */ RTCScene scene_out = rtcNewScene(RTC_SCENE_STATIC | RTC_SCENE_INCOHERENT, RTC_INTERSECT1); /* add all hair sets to the scene */ for (int i=0; i<scene_in->numHairSets; i++) { ISPCHairSet* hair = scene_in->hairs[i]; unsigned int geomID = rtcNewHairGeometry (scene_out, RTC_GEOMETRY_STATIC, hair->numHairs, hair->numVertices, hair->v2 ? 2 : 1); rtcSetBuffer(scene_out,geomID,RTC_VERTEX_BUFFER,hair->v,0,sizeof(Vertex)); if (hair->v2) rtcSetBuffer(scene_out,geomID,RTC_VERTEX_BUFFER1,hair->v2,0,sizeof(Vertex)); rtcSetBuffer(scene_out,geomID,RTC_INDEX_BUFFER,hair->hairs,0,sizeof(ISPCHair)); rtcSetOcclusionFilterFunction(scene_out,geomID,(RTCFilterFunc)&filterDispatch); } /* add all triangle meshes to the scene */ for (int i=0; i<scene_in->numMeshes; i++) { ISPCMesh* mesh = scene_in->meshes[i]; if (mesh->numQuads) { g_subdiv_mode = true; size_t numPrimitives = mesh->numQuads; size_t numEdges = mesh->numQuads*4; mesh->edge_level = new float[numEdges]; int *index_buffer = new int[numEdges]; for (size_t i=0; i<numEdges; i++) mesh->edge_level[i] = FIXED_EDGE_TESSELLATION_VALUE; /* create a triangle mesh */ unsigned int geomID = rtcNewSubdivisionMesh (scene_out, RTC_GEOMETRY_STATIC, numPrimitives, numEdges, mesh->numVertices, 0, 0, 0); mesh->geomID = geomID; unsigned int* faces = (unsigned int*) rtcMapBuffer(scene_out, geomID, RTC_FACE_BUFFER); for (size_t i=0; i<mesh->numQuads ; i++) faces[i] = 4; rtcUnmapBuffer(scene_out,geomID,RTC_FACE_BUFFER); for (size_t i=0; i<mesh->numQuads; i++) { index_buffer[4*i+0] = mesh->quads[i].v0; index_buffer[4*i+1] = mesh->quads[i].v1; index_buffer[4*i+2] = mesh->quads[i].v2; index_buffer[4*i+3] = mesh->quads[i].v3; } rtcSetBuffer(scene_out, geomID, RTC_VERTEX_BUFFER, mesh->positions , 0, sizeof(Vec3fa )); rtcSetBuffer(scene_out, geomID, RTC_INDEX_BUFFER, index_buffer , 0, sizeof(unsigned int)); rtcSetBuffer(scene_out, geomID, RTC_LEVEL_BUFFER, mesh->edge_level, 0, sizeof(float)); #if ENABLE_DISPLACEMENTS == 1 rtcSetDisplacementFunction(scene_out,geomID,(RTCDisplacementFunc)&displacementFunction,NULL); #endif } else if (mesh->numTriangles) { unsigned int geomID = rtcNewTriangleMesh (scene_out, RTC_GEOMETRY_STATIC, mesh->numTriangles, mesh->numVertices, mesh->positions2 ? 2 : 1); rtcSetBuffer(scene_out,geomID,RTC_VERTEX_BUFFER,mesh->positions,0,sizeof(Vertex)); if (mesh->positions2) rtcSetBuffer(scene_out,geomID,RTC_VERTEX_BUFFER1,mesh->positions2,0,sizeof(Vertex)); rtcSetBuffer(scene_out,geomID,RTC_INDEX_BUFFER,mesh->triangles,0,sizeof(ISPCTriangle)); rtcSetOcclusionFilterFunction(scene_out,geomID,(RTCFilterFunc)&filterDispatch); } } /* commit changes to scene */ rtcCommit (scene_out); return scene_out; }