46 QSSGRenderRay() =
default;
47 QSSGRenderRay(
const QVector3D &inOrigin,
const QVector3D &inDirection)
48 : origin(inOrigin), direction(inDirection)
52 static std::optional<QVector3D> intersect(
const QSSGPlane &inPlane,
const QSSGRenderRay &ray);
55 static bool triangleIntersect(
const QSSGRenderRay &ray,
62 QSSGCullFaceMode cullMode = QSSGCullFaceMode::Back);
64 struct IntersectionResult
66 bool intersects =
false;
67 float rayLengthSquared = 0.;
69 QVector3D scenePosition;
70 QVector3D localPosition;
72 QVector3D sceneFaceNormal;
73 IntersectionResult() =
default;
74 inline constexpr IntersectionResult(
float rl,
75 const QVector2D &relxy,
76 const QVector3D &scenePosition,
77 const QVector3D &localPosition,
78 const QVector3D &normal,
79 const QVector3D &sceneNormal)
81 , rayLengthSquared(rl)
83 , scenePosition(scenePosition)
84 , localPosition(localPosition)
86 , sceneFaceNormal(sceneNormal)
94 const QSSGBounds3 *bounds;
95 inline bool intersects()
const {
return bounds && max >= std::max(min, 0.0f); }
100 enum class DirectionOp : quint8
107 const QMatrix4x4 &globalTransform;
108 const QSSGRenderRay &ray;
110 const QVector3D origin;
111 const QVector3D directionInvers;
112 const QVector3D direction;
113 const DirectionOp dirOp[3];
116 static RayData createRayData(
const QMatrix4x4 &globalTransform,
117 const QSSGRenderRay &ray);
118 static IntersectionResult createIntersectionResult(
const RayData &data,
119 const HitResult &hit);
121 static HitResult intersectWithAABBv2(
const RayData &data,
122 const QSSGBounds3 &bounds);
124 static void intersectWithBVH(
const RayData &data,
125 const QSSGMeshBVHNode *bvh,
126 const QSSGRenderMesh *mesh,
127 QVector<IntersectionResult> &intersections,
128 QSSGCullFaceMode cullMode = QSSGCullFaceMode::Back,
131 static QVector<IntersectionResult> intersectWithBVHTriangles(
const RayData &data,
132 const std::vector<QSSGMeshBVHTriangle> &bvhTriangles,
135 QSSGCullFaceMode cullMode = QSSGCullFaceMode::Back);
137 std::optional<QVector2D> relative(
const QMatrix4x4 &inGlobalTransform,
138 const QSSGBounds3 &inBounds,
139 QSSGRenderBasisPlanes inPlane)
const;
141 std::optional<QVector2D> relativeXY(
const QMatrix4x4 &inGlobalTransform,
const QSSGBounds3 &inBounds)
const
143 return relative(inGlobalTransform, inBounds, QSSGRenderBasisPlanes::XY);