// ======================================================================== // // Copyright 2009-2014 Intel Corporation // // // // Licensed under the Apache License, Version 2.0 (the "License"); // // you may not use this file except in compliance with the License. // // You may obtain a copy of the License at // // // // http://www.apache.org/licenses/LICENSE-2.0 // // // // Unless required by applicable law or agreed to in writing, software // // distributed under the License is distributed on an "AS IS" BASIS, // // WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. // // See the License for the specific language governing permissions and // // limitations under the License. // // ======================================================================== // #include "../common/tutorial/tutorial_device.isph" /* configuration */ #define PARALLEL_COMMIT #define MIN_EDGE_LEVEL 2.0f #define MAX_EDGE_LEVEL 64.0f #define LEVEL_FACTOR 64.0f /* scene data */ RTCScene g_scene = NULL; /* render function to use */ renderPixelFunc renderPixel; /* previous camera position */ uniform Vec3f old_p; /* error reporting function */ void error_handler(const uniform RTCError code, const uniform int8* uniform str) { print("Embree: "); switch (code) { case RTC_UNKNOWN_ERROR : print("RTC_UNKNOWN_ERROR"); break; case RTC_INVALID_ARGUMENT : print("RTC_INVALID_ARGUMENT"); break; case RTC_INVALID_OPERATION: print("RTC_INVALID_OPERATION"); break; case RTC_OUT_OF_MEMORY : print("RTC_OUT_OF_MEMORY"); break; case RTC_UNSUPPORTED_CPU : print("RTC_UNSUPPORTED_CPU"); break; default : print("invalid error code"); break; } if (str) { print(" ("); while (*str) putchar(*str++); print(")\n"); } abort(); } /* rtcCommitThread called by all ISPC worker threads to enable parallel build */ #if defined(PARALLEL_COMMIT) task void parallelCommit(RTCScene scene) { rtcCommitThread (scene,threadIndex,threadCount); } #endif uniform float cube_vertices[8][4] = { { -1.0f, -1.0f, -1.0f, 0.0f }, { 1.0f, -1.0f, -1.0f, 0.0f }, { 1.0f, -1.0f, 1.0f, 0.0f }, { -1.0f, -1.0f, 1.0f, 0.0f }, { -1.0f, 1.0f, -1.0f, 0.0f }, { 1.0f, 1.0f, -1.0f, 0.0f }, { 1.0f, 1.0f, 1.0f, 0.0f }, { -1.0f, 1.0f, 1.0f, 0.0f } }; #if 1 #define NUM_INDICES 24 #define NUM_FACES 6 #define FACE_SIZE 4 uniform unsigned int cube_indices[24] = { 0, 1, 5, 4, 1, 2, 6, 5, 2, 3, 7, 6, 0, 4, 7, 3, 4, 5, 6, 7, 0, 3, 2, 1, }; uniform unsigned int cube_faces[6] = { 4, 4, 4, 4, 4, 4 }; #else #define NUM_INDICES 36 #define NUM_FACES 12 #define FACE_SIZE 3 uniform unsigned int cube_indices[36] = { 1, 5, 4, 0, 1, 4, 2, 6, 5, 1, 2, 5, 3, 7, 6, 2, 3, 6, 4, 7, 3, 0, 4, 3, 5, 6, 7, 4, 5, 7, 3, 2, 1, 0, 3, 1 }; uniform unsigned int cube_faces[12] = { 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3 }; #endif /* adds a cube to the scene */ uniform unsigned int addCube (RTCScene scene_i) { /* create a triangulated cube with 6 quads and 8 vertices */ uniform unsigned int geomID = rtcNewSubdivisionMesh(scene_i, RTC_GEOMETRY_STATIC, NUM_FACES, NUM_INDICES, 8, 0, 0, 0); rtcSetBuffer(scene_i, geomID, RTC_VERTEX_BUFFER, cube_vertices, 0, sizeof(uniform Vec3fa )); rtcSetBuffer(scene_i, geomID, RTC_INDEX_BUFFER, cube_indices , 0, sizeof(uniform unsigned int)); rtcSetBuffer(scene_i, geomID, RTC_FACE_BUFFER, cube_faces, 0, sizeof(uniform unsigned int)); return geomID; } /*! updates the tessellation level for each edge */ void updateEdgeLevelBuffer( RTCScene scene_i, uniform unsigned geomID, const uniform Vec3f& cam_pos ) { uniform float* uniform level = (uniform float* uniform) rtcMapBuffer(scene_i, geomID, RTC_LEVEL_BUFFER); uniform int* uniform faces = (uniform int* uniform) rtcMapBuffer(scene_i, geomID, RTC_INDEX_BUFFER); uniform Vec3fa* uniform vertices = (uniform Vec3fa* uniform) rtcMapBuffer(scene_i, geomID, RTC_VERTEX_BUFFER); for (uniform size_t f=0; f