50 const float maxRadius = std::max( aRadiusMin, aRadiusMax );
51 m_bbox.Set(
SFVEC3F( aCenterPoint.x - maxRadius, aCenterPoint.y - maxRadius, aZmin ),
52 SFVEC3F( aCenterPoint.x + maxRadius, aCenterPoint.y + maxRadius, aZmax ) );
71 const double Dx = aRay.
m_Dir.x;
72 const double Dy = aRay.
m_Dir.y;
73 const double Dz = aRay.
m_Dir.z;
80 const double a = Dx * Dx + Dy * Dy - k * k * Dz * Dz;
81 const double b = OCx * Dx + OCy * Dy - k * ( r0 + k * OCz ) * Dz;
82 const double c = OCx * OCx + OCy * OCy - ( r0 + k * OCz ) * ( r0 + k * OCz );
84 const double discriminant = b * b - a * c;
86 if( discriminant < 0.0 )
89 bool hitResult =
false;
90 float tHit = aHitInfo.
m_tHit;
93 const double sqrtDisc = std::sqrt( discriminant );
96 for(
int i = 0; i < 2; ++i )
104 t = -c / ( 2.0 * b );
110 t = ( -b + ( i == 0 ? -sqrtDisc : sqrtDisc ) ) / a;
113 if( t <= 0.0f || t >= tHit )
118 if( z < m_zMin || z >
m_zMax )
128 if( hitRadius > 1e-6f )
132 const float invR = 1.0f / hitRadius;
133 const float nx = -( hitPoint.x -
m_center.x ) * invR;
134 const float ny = -( hitPoint.y -
m_center.y ) * invR;
138 hitNormal = glm::normalize(
SFVEC3F( nx, ny, nz ) );
142 hitNormal =
SFVEC3F( 0.0f, 0.0f, -1.0f );
169 const double Dx = aRay.
m_Dir.x;
170 const double Dy = aRay.
m_Dir.y;
171 const double Dz = aRay.
m_Dir.z;
176 const double a = Dx * Dx + Dy * Dy - k * k * Dz * Dz;
177 const double b = OCx * Dx + OCy * Dy - k * ( r0 + k * OCz ) * Dz;
178 const double c = OCx * OCx + OCy * OCy - ( r0 + k * OCz ) * ( r0 + k * OCz );
180 const double discriminant = b * b - a * c;
182 if( discriminant < 0.0 )
185 const double sqrtDisc = std::sqrt( discriminant );
187 for(
int i = 0; i < 2; ++i )
194 t = -c / ( 2.0 * b );
200 t = ( -b + ( i == 0 ? -sqrtDisc : sqrtDisc ) ) / a;
203 if( t <= 0.0f || t >= aMaxDistance )
219 return m_bbox.Intersects( aBBox );
Defines math related functions.
OBJECT_3D(OBJECT_3D_TYPE aObjType)
const MATERIAL * m_material
bool Intersect(const RAY &aRay, HITINFO &aHitInfo) const override
bool IntersectP(const RAY &aRay, float aMaxDistance) const override
bool Intersects(const BBOX_3D &aBBox) const override
SFVEC3F GetDiffuseColor(const HITINFO &aHitInfo) const override
TRUNCATED_CONE(SFVEC2F aCenterPoint, float aZmin, float aZmax, float aRadiusMin, float aRadiusMax)
A truncated cone for raytracing, used for countersink visualization.
EDA_ANGLE abs(const EDA_ANGLE &aAngle)
Manage a bounding box defined by two SFVEC3F min max points.
Stores the hit information of a ray with a point on the surface of a object.
float m_tHit
( 4) distance
const OBJECT_3D * pHitObject
( 4) Object that was hitted
SFVEC3F m_HitNormal
(12) normal at the hit point
SFVEC3F m_HitPoint
(12) hit position
SFVEC3F at(float t) const