#pragma once #include #include namespace J3ML::Geometry { class Triangle { public: Vector3 V0; Vector3 V1; Vector3 V2; bool Intersects(const AABB& aabb) const; bool Intersects(const Capsule& capsule) const; AABB BoundingAABB() const; bool Contains(const Vector3&) const; void ProjectToAxis(const Vector3 &axis, float &dMin, float &dMax) const; static float IntersectLineTri(const Vector3 &linePos, const Vector3 &lineDir, const Vector3 &v0, const Vector3 &v1, const Vector3 &v2, float &u, float &v); /// Computes the closest point on the edge of this triangle to the given object. /** @param outU [out] If specified, receives the barycentric U coordinate of the returned point (in the UV convention). This pointer may be null. @param outV [out] If specified, receives the barycentric V coordinate of the returned point (in the UV convention). This pointer may be null. @param outD [out] If specified, receives the distance along the line of the closest point on the line to the edge of this triangle. @return The closest point on the edge of this triangle to the given object. @todo Add ClosestPointToTriangleEdge(Point/Ray/Triangle/Plane/Polygon/Circle/Disk/AABB/OBB/Sphere/Capsule/Frustum/Polyhedron). @see Distance(), Contains(), Intersects(), ClosestPointToTriangleEdge(), Line::GetPoint. */ Vector3 ClosestPointToTriangleEdge(const Line &line, float *outU, float *outV, float *outD) const; Vector3 ClosestPointToTriangleEdge(const LineSegment &lineSegment, float *outU, float *outV, float *outD) const; Vector3 ClosestPoint(const LineSegment &lineSegment, Vector3 *otherPt = 0) const; /// Returns the point at the given barycentric coordinates. /** This function computes the vector space point at the given barycentric coordinates. @param uvw The barycentric UVW coordinate triplet. The condition u+v+w == 1 should hold for the input coordinate. If 0 <= u,v,w <= 1, the returned point lies inside this triangle. @return u*a + v*b + w*c. */ Vector3 Point(const Vector3 &uvw) const; Vector3 Point(float u, float v, float w) const; /** These functions are an alternate form of Point(u,v,w) for the case when the barycentric coordinates are represented as a (u,v) pair and not as a (u,v,w) triplet. This function is provided for convenience and effectively just computes Point(1-u-v, u, v). @param uv The barycentric UV coordinates. If 0 <= u,v <= 1 and u+v <= 1, then the returned point lies inside this triangle. @return a + (b-a)*u + (c-a)*v. @see BarycentricUV(), BarycentricUVW(), BarycentricInsideTriangle(). */ Vector3 Point(const Vector2 &uv) const; Vector3 Point(float u, float v) const; /// Expresses the given point in barycentric (u,v,w) coordinates. /** @note There are two different conventions for representing barycentric coordinates. One uses a (u,v,w) triplet with the equation pt == u*a + v*b + w*c, and the other uses a (u,v) pair with the equation pt == a + u*(b-a) + v*(c-a). These two are equivalent. Use the mappings (u,v) -> (1-u-v, u, v) and (u,v,w)->(v,w) to convert between these two representations. @param point The point of the vector space to express in barycentric coordinates. This point should lie in the plane formed by this triangle. @return The factors (u,v,w) that satisfy the weighted sum equation point == u*a + v*b + w*c. @see BarycentricUV(), BarycentricInsideTriangle(), Point(), http://mathworld.wolfram.com/BarycentricCoordinates.html */ Vector3 BarycentricUVW(const Vector3 &point) const; /// Expresses the given point in barycentric (u,v) coordinates. /** @note There are two different conventions for representing barycentric coordinates. One uses a (u,v,w) triplet with the equation pt == u*a + v*b + w*c, and the other uses a (u,v) pair with the equation pt == a + u*(b-a) + v*(c-a). These two are equivalent. Use the mappings (u,v) -> (1-u-v, u, v) and (u,v,w)->(v,w) to convert between these two representations. @param point The point to express in barycentric coordinates. This point should lie in the plane formed by this triangle. @return The factors (u,v) that satisfy the weighted sum equation point == a + u*(b-a) + v*(c-a). @see BarycentricUVW(), BarycentricInsideTriangle(), Point(). */ Vector2 BarycentricUV(const Vector3 &point) const; Vector3 ClosestPoint(const Vector3 &p) const; Plane PlaneCCW() const; Plane PlaneCW() const; Vector3 Vertex(int i) const; LineSegment Edge(int i) const; }; }