// ======================================================================== // // 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.h" /* configuration */ #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 */ Vec3fa old_p; /* error reporting function */ void error_handler(const RTCError code, const int8* str) { printf("Embree: "); switch (code) { case RTC_UNKNOWN_ERROR : printf("RTC_UNKNOWN_ERROR"); break; case RTC_INVALID_ARGUMENT : printf("RTC_INVALID_ARGUMENT"); break; case RTC_INVALID_OPERATION: printf("RTC_INVALID_OPERATION"); break; case RTC_OUT_OF_MEMORY : printf("RTC_OUT_OF_MEMORY"); break; case RTC_UNSUPPORTED_CPU : printf("RTC_UNSUPPORTED_CPU"); break; default : printf("invalid error code"); break; } if (str) { printf(" ("); while (*str) putchar(*str++); printf(")\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 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 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, }; unsigned int cube_faces[6] = { 4, 4, 4, 4, 4, 4 }; #else #define NUM_INDICES 36 #define NUM_FACES 12 #define FACE_SIZE 3 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 }; unsigned int cube_faces[12] = { 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3 }; #endif /* adds a cube to the scene */ unsigned int addCube (RTCScene scene_i) { /* create a triangulated cube with 6 quads and 8 vertices */ 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(Vec3fa )); rtcSetBuffer(scene_i, geomID, RTC_INDEX_BUFFER, cube_indices , 0, sizeof(unsigned int)); rtcSetBuffer(scene_i, geomID, RTC_FACE_BUFFER, cube_faces, 0, sizeof(unsigned int)); return geomID; } /*! updates the tessellation level for each edge */ void updateEdgeLevelBuffer( RTCScene scene_i, unsigned geomID, const Vec3fa& cam_pos ) { float* level = (float* ) rtcMapBuffer(scene_i, geomID, RTC_LEVEL_BUFFER); int* faces = (int* ) rtcMapBuffer(scene_i, geomID, RTC_INDEX_BUFFER); Vec3fa* vertices = (Vec3fa*) rtcMapBuffer(scene_i, geomID, RTC_VERTEX_BUFFER); for (size_t f=0; f