diff --git a/LEGO1/lego/legoomni/src/video/legoanimpresenter.cpp b/LEGO1/lego/legoomni/src/video/legoanimpresenter.cpp
index 747cbf4e..b463240c 100644
--- a/LEGO1/lego/legoomni/src/video/legoanimpresenter.cpp
+++ b/LEGO1/lego/legoomni/src/video/legoanimpresenter.cpp
@@ -1129,7 +1129,8 @@ MxU32 LegoAnimPresenter::VTable0x94(Vector3& p_vec1, Vector3& p_vec2, float p_f1
 		return TRUE;
 	}
 
-	if (m_unk0xa4 + p_f2 >= sqrt(len) && m_roiMapSize != 0 && m_roiMap != NULL) {
+	len = sqrt(len);
+	if (len <= m_unk0xa4 + p_f2 && m_roiMapSize != 0 && m_roiMap != NULL) {
 		for (MxU32 i = 1; i <= m_roiMapSize; i++) {
 			if (m_roiMap[i]->GetLODCount() != 0 &&
 				m_roiMap[i]->FUN_100a9410(p_vec1, p_vec2, p_f1, p_f2, p_vec3, FALSE)) {
diff --git a/LEGO1/lego/sources/roi/legoroi.cpp b/LEGO1/lego/sources/roi/legoroi.cpp
index 33fbbb8e..35e0231a 100644
--- a/LEGO1/lego/sources/roi/legoroi.cpp
+++ b/LEGO1/lego/sources/roi/legoroi.cpp
@@ -551,9 +551,143 @@ LegoResult LegoROI::GetTexture(LegoTextureInfo*& p_textureInfo)
 	return FAILURE;
 }
 
-// STUB: LEGO1 0x100a9410
-LegoU32 LegoROI::FUN_100a9410(Vector3&, Vector3&, float, float, Vector3&, LegoBool)
+// FUNCTION: LEGO1 0x100a9410
+// FUNCTION: BETA10 0x1018b324
+LegoU32 LegoROI::FUN_100a9410(
+	Vector3& p_v1,
+	Vector3& p_v2,
+	float p_f1,
+	float p_f2,
+	Vector3& p_v3,
+	LegoBool p_collideBox
+)
 {
+	if (p_collideBox) {
+		Mx3DPointFloat v2(p_v1);
+		((Vector3&) v2).Mul(p_f1);
+		((Vector3&) v2).Add(&p_v1);
+
+		Mx4DPointFloat localc0;
+		Mx4DPointFloat local9c;
+		Mx4DPointFloat local168;
+		Mx4DPointFloat local70;
+		Mx4DPointFloat local150[6];
+
+		Vector3 local58(&localc0[0]);
+		Vector3 locala8(&local9c[0]);
+		Vector3 local38(&local168[0]);
+
+		Mx3DPointFloat local4c(p_v1);
+
+		local58 = m_unk0x80.Min();
+		locala8 = m_unk0x80.Max();
+
+		localc0[3] = local9c[3] = local168[3] = 1.0f;
+
+		local38 = local58;
+		((Vector3&) local38).Add(&locala8);
+		((Vector3&) local38).Mul(0.5f);
+
+		local70 = localc0;
+		localc0.SetMatrixProduct(&local70, (float*) m_local2world.GetData());
+
+		local70 = local9c;
+		local9c.SetMatrixProduct(&local70, (float*) m_local2world.GetData());
+
+		local70 = local168;
+		local168.SetMatrixProduct(&local70, (float*) m_local2world.GetData());
+
+		p_v3 = m_local2world[3];
+
+		LegoS32 i;
+		for (i = 0; i < 6; i++) {
+			local150[i] = m_local2world[i % 3];
+
+			if (i > 2) {
+				local150[i][3] = -local58.Dot(&local58, &local150[i]);
+			}
+			else {
+				local150[i][3] = -locala8.Dot(&locala8, &local150[i]);
+			}
+
+			if (local150[i][3] + local38.Dot(&local38, &local150[i]) < 0.0f) {
+				((Vector4&) local150[i]).Mul(-1.0f);
+			}
+		}
+
+		for (i = 0; i < 6; i++) {
+			float local50 = p_v2.Dot(&p_v2, &local150[i]);
+
+			if (local50 >= 0.01 || local50 < -0.01) {
+				local50 = -((local150[i][3] + local4c.Dot(&local4c, &local150[i])) / local50);
+
+				if (local50 >= 0.0f && local50 <= p_f1) {
+					Mx3DPointFloat local17c(p_v2);
+					((Vector3&) local17c).Mul(local50);
+					((Vector3&) local17c).Add(&local4c);
+
+					LegoS32 j;
+					for (j = 0; j < 6; j++) {
+						if (i != j && i - j != 3 && j - i != 3) {
+							if (local150[j][3] + local17c.Dot(&local17c, &local150[j]) < 0.0f) {
+								break;
+							}
+						}
+					}
+
+					if (j == 6) {
+						return 1;
+					}
+				}
+			}
+		}
+	}
+	else {
+		Mx3DPointFloat v1(p_v1);
+		((Vector3&) v1).Sub(&GetWorldBoundingSphere().Center());
+
+		float local10 = GetWorldBoundingSphere().Radius();
+		float local8 = p_v2.Dot(&p_v2, &p_v2);
+		float localc = p_v2.Dot(&p_v2, &v1) * 2.0f;
+		float local14 = v1.Dot(&v1, &v1) - (local10 * local10);
+
+		if (local8 >= 0.001 || local8 <= -0.001) {
+			float local1c = -1.0f;
+			float local18 = (localc * localc) - (local14 * local8 * 4.0f);
+
+			if (local18 >= -0.001) {
+				local8 *= 2.0f;
+				localc = -localc;
+
+				if (local18 > 0.0f) {
+					local18 = sqrt(local18);
+					float local184 = (localc + local18) / local8;
+					float local188 = (localc - local18) / local8;
+
+					if (local184 > 0.0f && local188 > local184) {
+						local1c = local184;
+					}
+					else if (local188 > 0.0f) {
+						local1c = local188;
+					}
+					else {
+						return 0;
+					}
+				}
+				else {
+					local1c = localc / local8;
+				}
+
+				if (local1c >= 0.0f && p_f1 <= local1c) {
+					p_v3 = p_v2;
+					p_v3.Mul(local1c);
+					p_v3.Add(&p_v1);
+					return 1;
+				}
+			}
+		}
+	}
+
 	return 0;
 }
 
@@ -609,7 +743,7 @@ LegoBool LegoROI::FUN_100a9bf0(const LegoChar* p_param, float& p_red, float& p_g
 // FUNCTION: LEGO1 0x100a9c50
 LegoBool LegoROI::ColorAliasLookup(const LegoChar* p_param, float& p_red, float& p_green, float& p_blue, float& p_alpha)
 {
-	for (MxU32 i = 0; i < sizeOfArray(g_roiColorAliases); i++) {
+	for (LegoU32 i = 0; i < sizeOfArray(g_roiColorAliases); i++) {
 		if (strcmpi(g_roiColorAliases[i].m_name, p_param) == 0) {
 			p_red = g_roiColorAliases[i].m_red / 255.0;
 			p_green = g_roiColorAliases[i].m_green / 255.0;
diff --git a/LEGO1/lego/sources/roi/legoroi.h b/LEGO1/lego/sources/roi/legoroi.h
index 64002d30..f00bcf36 100644
--- a/LEGO1/lego/sources/roi/legoroi.h
+++ b/LEGO1/lego/sources/roi/legoroi.h
@@ -38,7 +38,7 @@ public:
 	LegoResult FUN_100a9170(LegoFloat p_red, LegoFloat p_green, LegoFloat p_blue, LegoFloat p_alpha);
 	LegoResult FUN_100a9210(LegoTextureInfo* p_textureInfo);
 	LegoResult GetTexture(LegoTextureInfo*& p_textureInfo);
-	LegoU32 FUN_100a9410(Vector3&, Vector3&, float, float, Vector3&, LegoBool);
+	LegoU32 FUN_100a9410(Vector3& p_v1, Vector3& p_v2, float p_f1, float p_f2, Vector3& p_v3, LegoBool p_collideBox);
 	void SetName(const LegoChar* p_name);
 
 	float IntrinsicImportance() const override; // vtable+0x04