(#260) Fixed problem with picking faults in some rare cases

Made sure that we handle the case when an item has been hit which is not
a non-NNC item.
This commit is contained in:
Pål Hagen 2015-06-30 12:05:24 +02:00
parent c527545e4f
commit 04d70a9204

View File

@ -433,31 +433,51 @@ void RiuViewerCommands::extractIntersectionData(const cvf::HitItemCollection& hi
}
}
const cvf::Part* pickedPart = firstNonNncHitItem->part();
CVF_ASSERT(pickedPart);
*firstPart = const_cast<cvf::Part*>(pickedPart);
const cvf::Transform* xf = pickedPart->transform();
cvf::Vec3d globalPickedPoint = firstNonNncHitItem->intersectionPoint();
if (localIntersectionPoint)
if (firstNonNncHitItem)
{
if (xf)
const cvf::Part* pickedPart = firstNonNncHitItem->part();
CVF_ASSERT(pickedPart);
*firstPart = const_cast<cvf::Part*>(pickedPart);
const cvf::Transform* xf = pickedPart->transform();
cvf::Vec3d globalPickedPoint = firstNonNncHitItem->intersectionPoint();
if (localIntersectionPoint)
{
*localIntersectionPoint = globalPickedPoint.getTransformedPoint(xf->worldTransform().getInverted());
if (xf)
{
*localIntersectionPoint = globalPickedPoint.getTransformedPoint(xf->worldTransform().getInverted());
}
else
{
*localIntersectionPoint = globalPickedPoint;
}
}
else
if (firstPartFaceHit)
{
*localIntersectionPoint = globalPickedPoint;
const cvf::HitDetailDrawableGeo* detail = dynamic_cast<const cvf::HitDetailDrawableGeo*>(firstNonNncHitItem->detail());
if (detail)
{
*firstPartFaceHit = detail->faceIndex();
}
}
}
if (firstPartFaceHit)
else
{
const cvf::HitDetailDrawableGeo* detail = dynamic_cast<const cvf::HitDetailDrawableGeo*>(firstNonNncHitItem->detail());
if (detail)
if (localIntersectionPoint && nncPart && *nncPart)
{
*firstPartFaceHit = detail->faceIndex();
cvf::Vec3d globalPickedPoint = firstItemIntersectionPoint;
const cvf::Transform* xf = (*nncPart)->transform();
if (xf)
{
*localIntersectionPoint = globalPickedPoint.getTransformedPoint(xf->worldTransform().getInverted());
}
else
{
*localIntersectionPoint = globalPickedPoint;
}
}
}
}