Changeset View
Changeset View
Standalone View
Standalone View
intern/cycles/kernel/geom/geom_bvh_embree.h
- This file was added.
| /* | |||||
| * Copyright 2011-2014 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 | |||||
| */ | |||||
| /* Embree BVH | |||||
| * | |||||
| * Embree CPU traversal functions | |||||
| * Experimental */ | |||||
| CCL_NAMESPACE_BEGIN | |||||
| /* Regular traversal */ | |||||
| ccl_device bool embree_intersect(RTCScene embree_scene, const Ray *ray, Intersection *isect) { | |||||
| /* Embree Ray */ | |||||
| RTCRay embree_ray; | |||||
| /* Populate Ray */ | |||||
| embree_ray.org[0] = ray->P.x; | |||||
| embree_ray.org[1] = ray->P.y; | |||||
| embree_ray.org[2] = ray->P.z;; | |||||
| embree_ray.dir[0] = ray->D.x; | |||||
| embree_ray.dir[1] = ray->D.y; | |||||
| embree_ray.dir[2] = ray->D.z; | |||||
| embree_ray.tnear = 0.0f; | |||||
| embree_ray.tfar = FLT_MAX; // maxDist; /* XXX */ | |||||
| embree_ray.time = 0.0f; | |||||
| embree_ray.mask = 0xFFFFFFFF; | |||||
| embree_ray.geomID = RTC_INVALID_GEOMETRY_ID; | |||||
| embree_ray.primID = RTC_INVALID_GEOMETRY_ID; | |||||
| //embree_ray.instID = RTC_INVALID_GEOMETRY_ID; | |||||
| /* Intersect */ | |||||
| rtcIntersect(embree_scene, embree_ray); | |||||
| /* Did we hit? */ | |||||
| if(embree_ray.geomID != RTC_INVALID_GEOMETRY_ID) | |||||
| { | |||||
| isect->prim = embree_ray.primID; | |||||
| isect->object = embree_ray.geomID; | |||||
| isect->type = PRIMITIVE_TRIANGLE; | |||||
| isect->u = embree_ray.u; | |||||
| isect->v = embree_ray.v; | |||||
| isect->t = embree_ray.tfar; | |||||
| return true; | |||||
| } | |||||
| else { | |||||
| isect->t = ray->t; | |||||
| isect->object = OBJECT_NONE; | |||||
| isect->prim = PRIM_NONE; | |||||
| isect->u = 0.0f; | |||||
| isect->v = 0.0f; | |||||
| return false; | |||||
| } | |||||
| } | |||||
| /* Shadow Ray traversal */ | |||||
| ccl_device bool embree_occluded(RTCScene embree_scene, const Ray *ray, Intersection *isect) { | |||||
| /* Embree Ray */ | |||||
| RTCRay embree_ray; | |||||
| /* Populate Ray */ | |||||
| embree_ray.org[0] = ray->P.x; | |||||
| embree_ray.org[1] = ray->P.y; | |||||
| embree_ray.org[2] = ray->P.z;; | |||||
| embree_ray.dir[0] = ray->D.x; | |||||
| embree_ray.dir[1] = ray->D.y; | |||||
| embree_ray.dir[2] = ray->D.z; | |||||
| embree_ray.tnear = 0.0f; | |||||
| embree_ray.tfar = FLT_MAX; | |||||
| embree_ray.time = 0.0f; | |||||
| embree_ray.mask = 0xFFFFFFFF; | |||||
| embree_ray.geomID = RTC_INVALID_GEOMETRY_ID; | |||||
| embree_ray.primID = RTC_INVALID_GEOMETRY_ID; | |||||
| embree_ray.instID = RTC_INVALID_GEOMETRY_ID; | |||||
| /* Intersect */ | |||||
| rtcOccluded(embree_scene, embree_ray); | |||||
| /* geomID is 0 if we hit */ | |||||
| if(embree_ray.geomID == 0) | |||||
| return true; | |||||
| else | |||||
| return false; | |||||
| } | |||||
| CCL_NAMESPACE_END | |||||