Skip to content

Commit 316882d

Browse files
committed
Added bounding box check to light rubber band selection.
1 parent f3f76d2 commit 316882d

File tree

1 file changed

+57
-9
lines changed

1 file changed

+57
-9
lines changed

common/light.cpp

Lines changed: 57 additions & 9 deletions
Original file line numberDiff line numberDiff line change
@@ -399,22 +399,70 @@ void lcLight::BoxTest(lcObjectBoxTest& ObjectBoxTest) const
399399
ObjectBoxTest.Objects.emplace_back(const_cast<lcLight*>(this));
400400
return;
401401
}
402-
403-
lcVector3 Min(-LC_LIGHT_POSITION_EDGE, -LC_LIGHT_POSITION_EDGE, -LC_LIGHT_POSITION_EDGE); // todo: fix light box test
404-
lcVector3 Max( LC_LIGHT_POSITION_EDGE, LC_LIGHT_POSITION_EDGE, LC_LIGHT_POSITION_EDGE);
405402

403+
lcMatrix44 InverseWorldMatrix = lcMatrix44AffineInverse(mWorldMatrix);
406404
lcVector4 LocalPlanes[6];
407405

408-
for (int PlaneIdx = 0; PlaneIdx < 6; PlaneIdx++)
406+
for (int PlaneIndex = 0; PlaneIndex < 6; PlaneIndex++)
409407
{
410-
const lcVector3 Normal = lcMul30(ObjectBoxTest.Planes[PlaneIdx], mWorldMatrix);
411-
LocalPlanes[PlaneIdx] = lcVector4(Normal, ObjectBoxTest.Planes[PlaneIdx][3] - lcDot3(mWorldMatrix[3], Normal));
408+
const lcVector3 PlaneNormal = lcMul30(ObjectBoxTest.Planes[PlaneIndex], InverseWorldMatrix);
409+
LocalPlanes[PlaneIndex] = lcVector4(PlaneNormal, ObjectBoxTest.Planes[PlaneIndex][3] - lcDot3(InverseWorldMatrix[3], PlaneNormal));
412410
}
413411

414-
if (lcBoundingBoxIntersectsVolume(Min, Max, LocalPlanes))
412+
// TODO: Check meshes after the bounding fox test.
413+
if (mLightType == lcLightType::Spot)
415414
{
416-
ObjectBoxTest.Objects.emplace_back(const_cast<lcLight*>(this));
417-
return;
415+
lcVector3 Min(-LC_LIGHT_SPOT_CONE_RADIUS, -LC_LIGHT_SPOT_CONE_RADIUS, 0);
416+
lcVector3 Max( LC_LIGHT_SPOT_CONE_RADIUS, LC_LIGHT_SPOT_CONE_RADIUS, LC_LIGHT_SPOT_CONE_HEIGHT);
417+
418+
if (lcBoundingBoxIntersectsVolume(Min, Max, LocalPlanes))
419+
{
420+
ObjectBoxTest.Objects.emplace_back(const_cast<lcLight*>(this));
421+
return;
422+
}
423+
}
424+
else if (mLightType == lcLightType::Area)
425+
{
426+
lcVector3 Min(-mAreaSizeX / 2.0f, -mAreaSizeY / 2.0f, 0);
427+
lcVector3 Max( mAreaSizeX / 2.0f, mAreaSizeY / 2.0f, 0);
428+
429+
if (lcBoundingBoxIntersectsVolume(Min, Max, LocalPlanes))
430+
{
431+
ObjectBoxTest.Objects.emplace_back(const_cast<lcLight*>(this));
432+
return;
433+
}
434+
}
435+
else if (mLightType == lcLightType::Directional)
436+
{
437+
lcVector3 Min(-LC_LIGHT_DIRECTIONAL_RADIUS, -LC_LIGHT_DIRECTIONAL_RADIUS, 0);
438+
lcVector3 Max( LC_LIGHT_DIRECTIONAL_RADIUS, LC_LIGHT_DIRECTIONAL_RADIUS, LC_LIGHT_DIRECTIONAL_HEIGHT);
439+
440+
if (lcBoundingBoxIntersectsVolume(Min, Max, LocalPlanes))
441+
{
442+
ObjectBoxTest.Objects.emplace_back(const_cast<lcLight*>(this));
443+
return;
444+
}
445+
}
446+
447+
if (IsSelected())
448+
{
449+
lcVector3 TargetPosition = lcMul31(lcVector3(0.0f, 0.0f, -mTargetDistance), mWorldMatrix);
450+
bool Outside = false;
451+
452+
for (int PlaneIdx = 0; PlaneIdx < 6; PlaneIdx++)
453+
{
454+
if (lcDot3(TargetPosition, ObjectBoxTest.Planes[PlaneIdx]) + ObjectBoxTest.Planes[PlaneIdx][3] > LC_LIGHT_TARGET_RADIUS)
455+
{
456+
Outside = true;
457+
break;
458+
}
459+
}
460+
461+
if (!Outside)
462+
{
463+
ObjectBoxTest.Objects.emplace_back(const_cast<lcLight*>(this));
464+
return;
465+
}
418466
}
419467
}
420468

0 commit comments

Comments
 (0)