45 QSSGRenderRay() =
default;
46 QSSGRenderRay(
const QVector3D &inOrigin,
const QVector3D &inDirection)
47 : origin(inOrigin), direction(inDirection)
51 static std::optional<QVector3D> intersect(
const QSSGPlane &inPlane,
const QSSGRenderRay &ray);
54 static bool triangleIntersect(
const QSSGRenderRay &ray,
62 struct IntersectionResult
64 bool intersects =
false;
65 float rayLengthSquared = 0.;
67 QVector3D scenePosition;
68 QVector3D localPosition;
70 QVector3D sceneFaceNormal;
71 IntersectionResult() =
default;
72 inline constexpr IntersectionResult(
float rl,
73 const QVector2D &relxy,
74 const QVector3D &scenePosition,
75 const QVector3D &localPosition,
76 const QVector3D &normal,
77 const QVector3D &sceneNormal)
79 , rayLengthSquared(rl)
81 , scenePosition(scenePosition)
82 , localPosition(localPosition)
84 , sceneFaceNormal(sceneNormal)
92 const QSSGBounds3 *bounds;
93 inline bool intersects()
const {
return bounds && max >= std::max(min, 0.0f); }
98 enum class DirectionOp : quint8
105 const QMatrix4x4 &globalTransform;
106 const QSSGRenderRay &ray;
108 const QVector3D origin;
109 const QVector3D directionInvers;
110 const QVector3D direction;
111 const DirectionOp dirOp[3];
114 static RayData createRayData(
const QMatrix4x4 &globalTransform,
115 const QSSGRenderRay &ray);
116 static IntersectionResult createIntersectionResult(
const RayData &data,
117 const HitResult &hit);
119 static HitResult intersectWithAABBv2(
const RayData &data,
120 const QSSGBounds3 &bounds);
122 static void intersectWithBVH(
const RayData &data,
123 const QSSGMeshBVHNode *bvh,
124 const QSSGRenderMesh *mesh,
125 QVector<IntersectionResult> &intersections,
128 static QVector<IntersectionResult> intersectWithBVHTriangles(
const RayData &data,
129 const std::vector<QSSGMeshBVHTriangle> &bvhTriangles,
133 std::optional<QVector2D> relative(
const QMatrix4x4 &inGlobalTransform,
134 const QSSGBounds3 &inBounds,
135 QSSGRenderBasisPlanes inPlane)
const;
137 std::optional<QVector2D> relativeXY(
const QMatrix4x4 &inGlobalTransform,
const QSSGBounds3 &inBounds)
const
139 return relative(inGlobalTransform, inBounds, QSSGRenderBasisPlanes::XY);