46 const float maxRadius = std::max( aRadiusMin, aRadiusMax );
47 m_bbox.Set(
SFVEC3F( aCenterPoint.x - maxRadius, aCenterPoint.y - maxRadius, aZmin ),
48 SFVEC3F( aCenterPoint.x + maxRadius, aCenterPoint.y + maxRadius, aZmax ) );
67 const double Dx = aRay.
m_Dir.x;
68 const double Dy = aRay.
m_Dir.y;
69 const double Dz = aRay.
m_Dir.z;
76 const double a = Dx * Dx + Dy * Dy - k * k * Dz * Dz;
77 const double b = OCx * Dx + OCy * Dy - k * ( r0 + k * OCz ) * Dz;
78 const double c = OCx * OCx + OCy * OCy - ( r0 + k * OCz ) * ( r0 + k * OCz );
80 const double discriminant = b * b - a * c;
82 if( discriminant < 0.0 )
85 bool hitResult =
false;
86 float tHit = aHitInfo.
m_tHit;
89 const double sqrtDisc = std::sqrt( discriminant );
92 for(
int i = 0; i < 2; ++i )
100 t = -c / ( 2.0 * b );
106 t = ( -b + ( i == 0 ? -sqrtDisc : sqrtDisc ) ) / a;
109 if( t <= 0.0f || t >= tHit )
114 if( z < m_zMin || z >
m_zMax )
124 if( hitRadius > 1e-6f )
128 const float invR = 1.0f / hitRadius;
129 const float nx = -( hitPoint.x -
m_center.x ) * invR;
130 const float ny = -( hitPoint.y -
m_center.y ) * invR;
134 hitNormal = glm::normalize(
SFVEC3F( nx, ny, nz ) );
138 hitNormal =
SFVEC3F( 0.0f, 0.0f, -1.0f );
165 const double Dx = aRay.
m_Dir.x;
166 const double Dy = aRay.
m_Dir.y;
167 const double Dz = aRay.
m_Dir.z;
172 const double a = Dx * Dx + Dy * Dy - k * k * Dz * Dz;
173 const double b = OCx * Dx + OCy * Dy - k * ( r0 + k * OCz ) * Dz;
174 const double c = OCx * OCx + OCy * OCy - ( r0 + k * OCz ) * ( r0 + k * OCz );
176 const double discriminant = b * b - a * c;
178 if( discriminant < 0.0 )
181 const double sqrtDisc = std::sqrt( discriminant );
183 for(
int i = 0; i < 2; ++i )
190 t = -c / ( 2.0 * b );
196 t = ( -b + ( i == 0 ? -sqrtDisc : sqrtDisc ) ) / a;
199 if( t <= 0.0f || t >= aMaxDistance )
215 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