// ======================================================================== // // 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 #if defined(__XEON_PHI__) #define EDGE_LEVEL 64.0f #else #define EDGE_LEVEL 256.0f #endif /* 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 void displacementFunction(void* uniform ptr, uniform unsigned int geomID, uniform int unsigned primID, const uniform float* uniform u, /*!< u coordinates (source) */ const uniform float* uniform v, /*!< v coordinates (source) */ const uniform float* uniform nx, /*!< x coordinates of normal at point to displace (source) */ const uniform float* uniform ny, /*!< y coordinates of normal at point to displace (source) */ const uniform float* uniform nz, /*!< z coordinates of normal at point to displace (source) */ uniform float* uniform px, /*!< x coordinates of points to displace (source and target) */ uniform float* uniform py, /*!< y coordinates of points to displace (source and target) */ uniform float* uniform pz, /*!< z coordinates of points to displace (source and target) */ uniform size_t N) { foreach (i=0 ... N) { const Vec3fa P = make_Vec3fa(px[i],py[i],pz[i]); const Vec3fa Ng = make_Vec3fa(nx[i],ny[i],nz[i]); float dN = 0.0f; for (float freq = 1.0f; freq<40.0f; freq*= 2) { float n = abs(noise(freq*P)); dN += 1.4f*n*n/freq; } const Vec3fa dP = dN*Ng; px[i] += dP.x; py[i] += dP.y; pz[i] += dP.z; } } /* 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)); uniform float* uniform level = (uniform float* uniform) rtcMapBuffer(scene_i, geomID, RTC_LEVEL_BUFFER); for (uniform size_t i=0; i