/* called by the C++ code to render */ extern "C" void device_render (int* pixels, const unsigned int width, const unsigned int height, const float time, const ISPCCamera& camera) { const int numTilesX = (width +TILE_SIZE_X-1)/TILE_SIZE_X; const int numTilesY = (height+TILE_SIZE_Y-1)/TILE_SIZE_Y; parallel_for(size_t(0),size_t(numTilesX*numTilesY),[&](const range<size_t>& range) { for (size_t i=range.begin(); i<range.end(); i++) renderTileTask((int)i,pixels,width,height,time,camera,numTilesX,numTilesY); }); }
/* called by the C++ code to render */ extern "C" void device_render (int* pixels, const unsigned int width, const unsigned int height, const float time, const ISPCCamera& camera) { float t0 = 0.7f*time; float t1 = 1.5f*time; /* rotate instances around themselves */ LinearSpace3fa xfm; xfm.vx = Vec3fa(cos(t1),0,sin(t1)); xfm.vy = Vec3fa(0,1,0); xfm.vz = Vec3fa(-sin(t1),0,cos(t1)); /* calculate transformations to move instances in cirle */ for (int i=0; i<4; i++) { float t = t0+i*2.0f*float(pi)/4.0f; instance_xfm[i] = AffineSpace3fa(xfm,2.2f*Vec3fa(+cos(t),0.0f,+sin(t))); } /* calculate transformations to properly transform normals */ for (int i=0; i<4; i++) normal_xfm[i] = transposed(rcp(instance_xfm[i].l)); /* set instance transformations */ rtcSetTransform2(g_scene,g_instance0,RTC_MATRIX_COLUMN_MAJOR_ALIGNED16,(float*)&instance_xfm[0],0); rtcSetTransform2(g_scene,g_instance1,RTC_MATRIX_COLUMN_MAJOR_ALIGNED16,(float*)&instance_xfm[1],0); rtcSetTransform2(g_scene,g_instance2,RTC_MATRIX_COLUMN_MAJOR_ALIGNED16,(float*)&instance_xfm[2],0); rtcSetTransform2(g_scene,g_instance3,RTC_MATRIX_COLUMN_MAJOR_ALIGNED16,(float*)&instance_xfm[3],0); /* update scene */ rtcUpdate(g_scene,g_instance0); rtcUpdate(g_scene,g_instance1); rtcUpdate(g_scene,g_instance2); rtcUpdate(g_scene,g_instance3); rtcCommit (g_scene); /* render all pixels */ const int numTilesX = (width +TILE_SIZE_X-1)/TILE_SIZE_X; const int numTilesY = (height+TILE_SIZE_Y-1)/TILE_SIZE_Y; parallel_for(size_t(0),size_t(numTilesX*numTilesY),[&](const range<size_t>& range) { const int threadIndex = (int)TaskScheduler::threadIndex(); for (size_t i=range.begin(); i<range.end(); i++) renderTileTask((int)i,threadIndex,pixels,width,height,time,camera,numTilesX,numTilesY); }); }
/* called by the C++ code to render */ extern "C" void device_render (int* pixels, const unsigned int width, const unsigned int height, const float time, const ISPCCamera& camera) { bool camera_changed = g_changed; g_changed = false; /* create scene */ if (g_scene == nullptr) { g_scene = convertScene(g_ispc_scene); if (g_subdiv_mode) updateEdgeLevels(g_ispc_scene, camera.xfm.p); rtcCommit (g_scene); old_p = camera.xfm.p; } else { /* check if camera changed */ if (ne(camera.xfm.p,old_p)) { camera_changed = true; old_p = camera.xfm.p; } /* update edge levels if camera changed */ if (camera_changed && g_subdiv_mode) { updateEdgeLevels(g_ispc_scene,camera.xfm.p); rtcCommit (g_scene); } } /* render image */ const int numTilesX = (width +TILE_SIZE_X-1)/TILE_SIZE_X; const int numTilesY = (height+TILE_SIZE_Y-1)/TILE_SIZE_Y; parallel_for(size_t(0),size_t(numTilesX*numTilesY),[&](const range<size_t>& range) { const int threadIndex = (int)TaskScheduler::threadIndex(); for (size_t i=range.begin(); i<range.end(); i++) renderTileTask((int)i,threadIndex,pixels,width,height,time,camera,numTilesX,numTilesY); }); //rtcDebug(); }
/* called by the C++ code to render */ extern "C" void device_render (int* pixels, const unsigned int width, const unsigned int height, const float time, const ISPCCamera& camera) { #if !defined(FORCE_FIXED_EDGE_TESSELLATION) setQuadSubdivCubeLevels (rtcGetGeometry(g_scene, quadCubeID), camera.xfm.p); setTriangleSubdivCubeLevels (rtcGetGeometry(g_scene, triCubeID), camera.xfm.p); #endif rtcCommitScene(g_scene); const int numTilesX = (width +TILE_SIZE_X-1)/TILE_SIZE_X; const int numTilesY = (height+TILE_SIZE_Y-1)/TILE_SIZE_Y; parallel_for(size_t(0),size_t(numTilesX*numTilesY),[&](const range<size_t>& range) { const int threadIndex = (int)TaskScheduler::threadIndex(); for (size_t i=range.begin(); i<range.end(); i++) renderTileTask((int)i,threadIndex,pixels,width,height,time,camera,numTilesX,numTilesY); }); }
/* called by the C++ code to render */ extern "C" void device_render (int* pixels, const unsigned int width, const unsigned int height, const float time, const ISPCCamera& camera) { /* animate sphere */ for (int i=0; i<numSpheres; i++) animateSphere(i,time+i); /* commit changes to scene */ rtcCommitScene (g_scene); /* render all pixels */ const int numTilesX = (width +TILE_SIZE_X-1)/TILE_SIZE_X; const int numTilesY = (height+TILE_SIZE_Y-1)/TILE_SIZE_Y; parallel_for(size_t(0),size_t(numTilesX*numTilesY),[&](const range<size_t>& range) { const int threadIndex = (int)TaskScheduler::threadIndex(); for (size_t i=range.begin(); i<range.end(); i++) renderTileTask((int)i,threadIndex,pixels,width,height,time,camera,numTilesX,numTilesY); }); }