Book a Demo!
CoCalc Logo Icon
StoreFeaturesDocsShareSupportNewsAboutPoliciesSign UpSign In
godotengine
GitHub Repository: godotengine/godot
Path: blob/master/thirdparty/embree/kernels/geometry/intersector_iterators.h
9905 views
1
// Copyright 2009-2021 Intel Corporation
2
// SPDX-License-Identifier: Apache-2.0
3
4
#pragma once
5
6
#include "../common/scene.h"
7
#include "../common/ray.h"
8
#include "../common/point_query.h"
9
#include "../bvh/node_intersector1.h"
10
#include "../bvh/node_intersector_packet.h"
11
12
namespace embree
13
{
14
namespace isa
15
{
16
template<typename Intersector>
17
struct ArrayIntersector1
18
{
19
typedef typename Intersector::Primitive Primitive;
20
typedef typename Intersector::Precalculations Precalculations;
21
22
template<int N, bool robust>
23
static __forceinline void intersect(const Accel::Intersectors* This, Precalculations& pre, RayHit& ray, RayQueryContext* context, const Primitive* prim, size_t num, const TravRay<N,robust> &tray, size_t& lazy_node)
24
{
25
for (size_t i=0; i<num; i++) {
26
Intersector::intersect(pre,ray,context,prim[i]);
27
}
28
}
29
30
template<int N, bool robust>
31
static __forceinline bool occluded(const Accel::Intersectors* This, Precalculations& pre, Ray& ray, RayQueryContext* context, const Primitive* prim, size_t num, const TravRay<N,robust> &tray, size_t& lazy_node)
32
{
33
for (size_t i=0; i<num; i++) {
34
if (Intersector::occluded(pre,ray,context,prim[i]))
35
return true;
36
}
37
return false;
38
}
39
40
template<int N>
41
static __forceinline bool pointQuery(const Accel::Intersectors* This, PointQuery* query, PointQueryContext* context, const Primitive* prim, size_t num, const TravPointQuery<N> &tquery, size_t& lazy_node)
42
{
43
bool changed = false;
44
for (size_t i=0; i<num; i++)
45
changed |= Intersector::pointQuery(query, context, prim[i]);
46
return changed;
47
}
48
49
template<int K>
50
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)
51
{
52
}
53
54
template<int K>
55
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)
56
{
57
return valid;
58
}
59
};
60
61
template<int K, typename Intersector>
62
struct ArrayIntersectorK_1
63
{
64
typedef typename Intersector::Primitive Primitive;
65
typedef typename Intersector::Precalculations Precalculations;
66
67
template<bool robust>
68
static __forceinline void intersect(const vbool<K>& valid, const Accel::Intersectors* This, Precalculations& pre, RayHitK<K>& ray, RayQueryContext* context, const Primitive* prim, size_t num, const TravRayK<K, robust> &tray, size_t& lazy_node)
69
{
70
for (size_t i=0; i<num; i++) {
71
Intersector::intersect(valid,pre,ray,context,prim[i]);
72
}
73
}
74
75
template<bool robust>
76
static __forceinline vbool<K> occluded(const vbool<K>& valid, const Accel::Intersectors* This, Precalculations& pre, RayK<K>& ray, RayQueryContext* context, const Primitive* prim, size_t num, const TravRayK<K, robust> &tray, size_t& lazy_node)
77
{
78
vbool<K> valid0 = valid;
79
for (size_t i=0; i<num; i++) {
80
valid0 &= !Intersector::occluded(valid0,pre,ray,context,prim[i]);
81
if (none(valid0)) break;
82
}
83
return !valid0;
84
}
85
86
template<int N, bool robust>
87
static __forceinline void intersect(const Accel::Intersectors* This, Precalculations& pre, RayHitK<K>& ray, size_t k, RayQueryContext* context, const Primitive* prim, size_t num, const TravRay<N,robust> &tray, size_t& lazy_node)
88
{
89
for (size_t i=0; i<num; i++) {
90
Intersector::intersect(pre,ray,k,context,prim[i]);
91
}
92
}
93
94
template<int N, bool robust>
95
static __forceinline bool occluded(const Accel::Intersectors* This, Precalculations& pre, RayK<K>& ray, size_t k, RayQueryContext* context, const Primitive* prim, size_t num, const TravRay<N,robust> &tray, size_t& lazy_node)
96
{
97
for (size_t i=0; i<num; i++) {
98
if (Intersector::occluded(pre,ray,k,context,prim[i]))
99
return true;
100
}
101
return false;
102
}
103
};
104
105
// =============================================================================================
106
107
template<int K, typename IntersectorK>
108
struct ArrayIntersectorKStream
109
{
110
typedef typename IntersectorK::Primitive PrimitiveK;
111
typedef typename IntersectorK::Precalculations PrecalculationsK;
112
113
static __forceinline void intersectK(const vbool<K>& valid, const Accel::Intersectors* This, /* PrecalculationsK& pre, */ RayHitK<K>& ray, RayQueryContext* context, const PrimitiveK* prim, size_t num, size_t& lazy_node)
114
{
115
PrecalculationsK pre(valid,ray); // FIXME: might cause trouble
116
117
for (size_t i=0; i<num; i++) {
118
IntersectorK::intersect(valid,pre,ray,context,prim[i]);
119
}
120
}
121
122
static __forceinline vbool<K> occludedK(const vbool<K>& valid, const Accel::Intersectors* This, /* PrecalculationsK& pre, */ RayK<K>& ray, RayQueryContext* context, const PrimitiveK* prim, size_t num, size_t& lazy_node)
123
{
124
PrecalculationsK pre(valid,ray); // FIXME: might cause trouble
125
vbool<K> valid0 = valid;
126
for (size_t i=0; i<num; i++) {
127
valid0 &= !IntersectorK::occluded(valid0,pre,ray,context,prim[i]);
128
if (none(valid0)) break;
129
}
130
return !valid0;
131
}
132
133
static __forceinline void intersect(const Accel::Intersectors* This, RayHitK<K>& ray, size_t k, RayQueryContext* context, const PrimitiveK* prim, size_t num, size_t& lazy_node)
134
{
135
PrecalculationsK pre(ray.tnear() <= ray.tfar,ray); // FIXME: might cause trouble
136
for (size_t i=0; i<num; i++) {
137
IntersectorK::intersect(pre,ray,k,context,prim[i]);
138
}
139
}
140
141
static __forceinline bool occluded(const Accel::Intersectors* This, RayK<K>& ray, size_t k, RayQueryContext* context, const PrimitiveK* prim, size_t num, size_t& lazy_node)
142
{
143
PrecalculationsK pre(ray.tnear() <= ray.tfar,ray); // FIXME: might cause trouble
144
for (size_t i=0; i<num; i++) {
145
if (IntersectorK::occluded(pre,ray,k,context,prim[i]))
146
return true;
147
}
148
return false;
149
}
150
151
static __forceinline size_t occluded(const Accel::Intersectors* This, size_t cur_mask, RayK<K>** __restrict__ inputPackets, RayQueryContext* context, const PrimitiveK* prim, size_t num, size_t& lazy_node)
152
{
153
size_t m_occluded = 0;
154
for (size_t i=0; i<num; i++) {
155
size_t bits = cur_mask & (~m_occluded);
156
for (; bits!=0; )
157
{
158
const size_t rayID = bscf(bits);
159
RayHitK<K> &ray = *inputPackets[rayID / K];
160
const size_t k = rayID % K;
161
PrecalculationsK pre(ray.tnear() <= ray.tfar,ray); // FIXME: might cause trouble
162
if (IntersectorK::occluded(pre,ray,k,context,prim[i]))
163
{
164
m_occluded |= (size_t)1 << rayID;
165
ray.tfar[k] = neg_inf;
166
}
167
}
168
}
169
return m_occluded;
170
}
171
};
172
}
173
}
174
175