43 QSSGRenderRay() =
default;
44 QSSGRenderRay(
const QVector3D &inOrigin,
const QVector3D &inDirection)
45 : origin(inOrigin), direction(inDirection)
49 static std::optional<QVector3D> intersect(
const QSSGPlane &inPlane,
const QSSGRenderRay &ray);
52 static bool triangleIntersect(
const QSSGRenderRay &ray,
60 struct IntersectionResult
62 bool intersects =
false;
63 float rayLengthSquared = 0.;
65 QVector3D scenePosition;
66 QVector3D localPosition;
68 QVector3D sceneFaceNormal;
69 IntersectionResult() =
default;
70 inline constexpr IntersectionResult(
float rl,
71 const QVector2D &relxy,
72 const QVector3D &scenePosition,
73 const QVector3D &localPosition,
74 const QVector3D &normal,
75 const QVector3D &sceneNormal)
77 , rayLengthSquared(rl)
79 , scenePosition(scenePosition)
80 , localPosition(localPosition)
82 , sceneFaceNormal(sceneNormal)
90 const QSSGBounds3 *bounds;
91 inline bool intersects()
const {
return bounds && max >= std::max(min, 0.0f); }
96 enum class DirectionOp : quint8
103 const QMatrix4x4 &globalTransform;
104 const QSSGRenderRay &ray;
106 const QVector3D origin;
107 const QVector3D directionInvers;
108 const QVector3D direction;
109 const DirectionOp dirOp[3];
112 static RayData createRayData(
const QMatrix4x4 &globalTransform,
113 const QSSGRenderRay &ray);
114 static IntersectionResult createIntersectionResult(
const RayData &data,
115 const HitResult &hit);
117 static HitResult intersectWithAABBv2(
const RayData &data,
118 const QSSGBounds3 &bounds);
120 static void intersectWithBVH(
const RayData &data,
121 const QSSGMeshBVHNode *bvh,
122 const QSSGRenderMesh *mesh,
123 QVector<IntersectionResult> &intersections,
126 static QVector<IntersectionResult> intersectWithBVHTriangles(
const RayData &data,
127 const std::vector<QSSGMeshBVHTriangle> &bvhTriangles,
131 std::optional<QVector2D> relative(
const QMatrix4x4 &inGlobalTransform,
132 const QSSGBounds3 &inBounds,
133 QSSGRenderBasisPlanes inPlane)
const;
135 std::optional<QVector2D> relativeXY(
const QMatrix4x4 &inGlobalTransform,
const QSSGBounds3 &inBounds)
const
137 return relative(inGlobalTransform, inBounds, QSSGRenderBasisPlanes::XY);