Changeset View
Changeset View
Standalone View
Standalone View
intern/cycles/render/embree.cpp
- This file was added.
| /* | |||||
| * Copyright 2011-2013 Blender Foundation | |||||
| * | |||||
| * 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 "scene.h" | |||||
| #include "object.h" | |||||
| #include "mesh.h" | |||||
| #include "embree.h" | |||||
| #include "util_foreach.h" | |||||
| CCL_NAMESPACE_BEGIN | |||||
| Embree::Embree() | |||||
| { | |||||
| /* Initialize Embree */ | |||||
| rtcInit(NULL); | |||||
| /* Embree Szene */ | |||||
| embree_scene = NULL; | |||||
| } | |||||
| Embree::~Embree() | |||||
| { | |||||
| rtcExit(); | |||||
| } | |||||
| void Embree::embree_create_scene(const vector<Object*>& objects, PackedBVH *pack) | |||||
| { | |||||
| /* Initialize Embree scene */ | |||||
| embree_scene = rtcNewScene(RTC_SCENE_STATIC, RTC_INTERSECT1); | |||||
| size_t num = 0; | |||||
| uint i = 0; | |||||
| foreach(Object *ob, objects) { | |||||
| Mesh *mesh = ob->mesh; | |||||
| num += mesh->triangles.size(); | |||||
| } | |||||
| pack->prim_index.resize(num); | |||||
| pack->prim_object.resize(num); | |||||
| num = 0; | |||||
| foreach(Object *ob, objects) { | |||||
| /* Cycles Mesh */ | |||||
| Mesh *mesh = ob->mesh; | |||||
| int ntris = mesh->triangles.size(); | |||||
| int nverts = mesh->verts.size(); | |||||
| assert(mesh->transform_applied); | |||||
| /* Embree Mesh */ | |||||
| unsigned int emesh = rtcNewTriangleMesh(embree_scene, RTC_GEOMETRY_STATIC, ntris, nverts, 1); | |||||
| /* set vertices */ | |||||
| EVertex* vertices = (EVertex*) rtcMapBuffer(embree_scene, emesh, RTC_VERTEX_BUFFER); | |||||
| for (int j=0; j<mesh->verts.size(); j++) { | |||||
| vertices[j].x = mesh->verts[j].x; | |||||
| vertices[j].y = mesh->verts[j].y; | |||||
| vertices[j].z = mesh->verts[j].z; | |||||
| } | |||||
| rtcUnmapBuffer(embree_scene, emesh, RTC_VERTEX_BUFFER); | |||||
| /* set triangles */ | |||||
| ETriangle* triangles = (ETriangle*) rtcMapBuffer(embree_scene, emesh, RTC_INDEX_BUFFER); | |||||
| for (int j=0; j<mesh->triangles.size(); j++) { | |||||
| triangles[j].v0 = mesh->triangles[j].v[0]; | |||||
| triangles[j].v1 = mesh->triangles[j].v[1]; | |||||
| triangles[j].v2 = mesh->triangles[j].v[2]; | |||||
| pack->prim_index[num] = j; | |||||
| pack->prim_object[num] = i; | |||||
| num++; | |||||
| } | |||||
| rtcUnmapBuffer(embree_scene, emesh, RTC_INDEX_BUFFER); | |||||
| i++; | |||||
| } | |||||
| /* BVH building */ | |||||
| rtcCommit(embree_scene); | |||||
| } | |||||
| CCL_NAMESPACE_END | |||||