Book a Demo!
CoCalc Logo Icon
StoreFeaturesDocsShareSupportNewsAboutPoliciesSign UpSign In
godotengine
GitHub Repository: godotengine/godot
Path: blob/master/thirdparty/embree/kernels/geometry/instance_intersector.h
9905 views
1
// Copyright 2009-2021 Intel Corporation
2
// SPDX-License-Identifier: Apache-2.0
3
4
#pragma once
5
6
#include "instance.h"
7
#include "../common/ray.h"
8
#include "../common/point_query.h"
9
10
namespace embree
11
{
12
namespace isa
13
{
14
struct InstanceIntersector1
15
{
16
typedef InstancePrimitive Primitive;
17
18
struct Precalculations {
19
__forceinline Precalculations (const Ray& ray, const void *ptr) {}
20
};
21
22
static void intersect(const Precalculations& pre, RayHit& ray, RayQueryContext* context, const Primitive& prim);
23
static bool occluded(const Precalculations& pre, Ray& ray, RayQueryContext* context, const Primitive& prim);
24
static bool pointQuery(PointQuery* query, PointQueryContext* context, const Primitive& prim);
25
};
26
27
struct InstanceIntersector1MB
28
{
29
typedef InstancePrimitive Primitive;
30
31
struct Precalculations {
32
__forceinline Precalculations (const Ray& ray, const void *ptr) {}
33
};
34
35
static void intersect(const Precalculations& pre, RayHit& ray, RayQueryContext* context, const Primitive& prim);
36
static bool occluded(const Precalculations& pre, Ray& ray, RayQueryContext* context, const Primitive& prim);
37
static bool pointQuery(PointQuery* query, PointQueryContext* context, const Primitive& prim);
38
};
39
40
template<int K>
41
struct InstanceIntersectorK
42
{
43
typedef InstancePrimitive Primitive;
44
45
struct Precalculations {
46
__forceinline Precalculations (const vbool<K>& valid, const RayK<K>& ray) {}
47
};
48
49
static void intersect(const vbool<K>& valid_i, const Precalculations& pre, RayHitK<K>& ray, RayQueryContext* context, const Primitive& prim);
50
static vbool<K> occluded(const vbool<K>& valid_i, const Precalculations& pre, RayK<K>& ray, RayQueryContext* context, const Primitive& prim);
51
52
static __forceinline void intersect(Precalculations& pre, RayHitK<K>& ray, size_t k, RayQueryContext* context, const Primitive& prim) {
53
intersect(vbool<K>(1<<int(k)),pre,ray,context,prim);
54
}
55
56
static __forceinline bool occluded(Precalculations& pre, RayK<K>& ray, size_t k, RayQueryContext* context, const Primitive& prim) {
57
occluded(vbool<K>(1<<int(k)),pre,ray,context,prim);
58
return ray.tfar[k] < 0.0f;
59
}
60
};
61
62
template<int K>
63
struct InstanceIntersectorKMB
64
{
65
typedef InstancePrimitive Primitive;
66
67
struct Precalculations {
68
__forceinline Precalculations (const vbool<K>& valid, const RayK<K>& ray) {}
69
};
70
71
static void intersect(const vbool<K>& valid_i, const Precalculations& pre, RayHitK<K>& ray, RayQueryContext* context, const Primitive& prim);
72
static vbool<K> occluded(const vbool<K>& valid_i, const Precalculations& pre, RayK<K>& ray, RayQueryContext* context, const Primitive& prim);
73
74
static __forceinline void intersect(Precalculations& pre, RayHitK<K>& ray, size_t k, RayQueryContext* context, const Primitive& prim) {
75
intersect(vbool<K>(1<<int(k)),pre,ray,context,prim);
76
}
77
78
static __forceinline bool occluded(Precalculations& pre, RayK<K>& ray, size_t k, RayQueryContext* context, const Primitive& prim) {
79
occluded(vbool<K>(1<<int(k)),pre,ray,context,prim);
80
return ray.tfar[k] < 0.0f;
81
}
82
};
83
}
84
}
85
86