1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
130
131
132
133
134
135
136
137
138
139
140
141
142
143
144
145
146
147
148
149
150
151
152
153
154
155
156
157
158
159
160
161
|
// Copyright 2009-2021 Intel Corporation
// SPDX-License-Identifier: Apache-2.0
#pragma once
#include "object.h"
#include "../common/ray.h"
namespace embree
{
namespace isa
{
template<bool mblur>
struct ObjectIntersector1
{
typedef Object Primitive;
static const bool validIntersectorK = false;
struct Precalculations {
__forceinline Precalculations() {}
__forceinline Precalculations (const Ray& ray, const void *ptr) {}
};
static __forceinline void intersect(const Precalculations& pre, RayHit& ray, RayQueryContext* context, const Primitive& prim)
{
AccelSet* accel = (AccelSet*) context->scene->get(prim.geomID());
/* perform ray mask test */
#if defined(EMBREE_RAY_MASK)
if ((ray.mask & accel->mask) == 0)
return;
#endif
accel->intersect(ray,prim.geomID(),prim.primID(),context);
}
static __forceinline bool occluded(const Precalculations& pre, Ray& ray, RayQueryContext* context, const Primitive& prim)
{
AccelSet* accel = (AccelSet*) context->scene->get(prim.geomID());
/* perform ray mask test */
#if defined(EMBREE_RAY_MASK)
if ((ray.mask & accel->mask) == 0)
return false;
#endif
accel->occluded(ray,prim.geomID(),prim.primID(),context);
return ray.tfar < 0.0f;
}
static __forceinline bool intersect(const Precalculations& pre, Ray& ray, RayQueryContext* context, const Primitive& prim) {
return occluded(pre,ray,context,prim);
}
static __forceinline void intersect(unsigned int k, const Precalculations& pre, RayHit& ray, RayQueryContext* context, const Primitive& prim)
{
AccelSet* accel = (AccelSet*) context->scene->get(prim.geomID());
/* perform ray mask test */
#if defined(EMBREE_RAY_MASK)
if ((ray.mask & accel->mask) == 0)
return;
#endif
accel->intersect(k,ray,prim.geomID(),prim.primID(),context);
}
static __forceinline bool occluded(unsigned int k, const Precalculations& pre, Ray& ray, RayQueryContext* context, const Primitive& prim)
{
AccelSet* accel = (AccelSet*) context->scene->get(prim.geomID());
/* perform ray mask test */
#if defined(EMBREE_RAY_MASK)
if ((ray.mask & accel->mask) == 0)
return false;
#endif
accel->occluded(k, ray,prim.geomID(),prim.primID(),context);
return ray.tfar < 0.0f;
}
static __forceinline bool intersect(unsigned int k, const Precalculations& pre, Ray& ray, RayQueryContext* context, const Primitive& prim) {
return occluded(k,pre,ray,context,prim);
}
static __forceinline bool pointQuery(PointQuery* query, PointQueryContext* context, const Primitive& prim)
{
AccelSet* accel = (AccelSet*)context->scene->get(prim.geomID());
context->geomID = prim.geomID();
context->primID = prim.primID();
return accel->pointQuery(query, context);
}
template<int K>
static __forceinline void intersectK(const vbool<K>& valid, /* PrecalculationsK& pre, */ RayHitK<K>& ray, RayQueryContext* context, const Primitive* prim, size_t num, size_t& lazy_node)
{
assert(false);
}
template<int K>
static __forceinline vbool<K> occludedK(const vbool<K>& valid, /* PrecalculationsK& pre, */ RayK<K>& ray, RayQueryContext* context, const Primitive* prim, size_t num, size_t& lazy_node)
{
assert(false);
return valid;
}
};
template<int K, bool mblur>
struct ObjectIntersectorK
{
typedef Object Primitive;
struct Precalculations {
__forceinline Precalculations (const vbool<K>& valid, const RayK<K>& ray) {}
};
static __forceinline void intersect(const vbool<K>& valid_i, const Precalculations& pre, RayHitK<K>& ray, RayQueryContext* context, const Primitive& prim)
{
vbool<K> valid = valid_i;
AccelSet* accel = (AccelSet*) context->scene->get(prim.geomID());
/* perform ray mask test */
#if defined(EMBREE_RAY_MASK)
valid &= (ray.mask & accel->mask) != 0;
if (none(valid)) return;
#endif
accel->intersect(valid,ray,prim.geomID(),prim.primID(),context);
}
static __forceinline vbool<K> occluded(const vbool<K>& valid_i, const Precalculations& pre, RayK<K>& ray, RayQueryContext* context, const Primitive& prim)
{
vbool<K> valid = valid_i;
AccelSet* accel = (AccelSet*) context->scene->get(prim.geomID());
/* perform ray mask test */
#if defined(EMBREE_RAY_MASK)
valid &= (ray.mask & accel->mask) != 0;
if (none(valid)) return false;
#endif
accel->occluded(valid,ray,prim.geomID(),prim.primID(),context);
return ray.tfar < 0.0f;
}
static __forceinline void intersect(Precalculations& pre, RayHitK<K>& ray, size_t k, RayQueryContext* context, const Primitive& prim) {
intersect(vbool<K>(1<<int(k)),pre,ray,context,prim);
}
static __forceinline bool occluded(Precalculations& pre, RayK<K>& ray, size_t k, RayQueryContext* context, const Primitive& prim) {
occluded(vbool<K>(1<<int(k)),pre,ray,context,prim);
return ray.tfar[k] < 0.0f;
}
};
typedef ObjectIntersectorK<4,false> ObjectIntersector4;
typedef ObjectIntersectorK<8,false> ObjectIntersector8;
typedef ObjectIntersectorK<16,false> ObjectIntersector16;
typedef ObjectIntersectorK<4,true> ObjectIntersector4MB;
typedef ObjectIntersectorK<8,true> ObjectIntersector8MB;
typedef ObjectIntersectorK<16,true> ObjectIntersector16MB;
}
}
|