54 lines
1.7 KiB
C++
54 lines
1.7 KiB
C++
#include "YYCRules.hpp"
|
|
#include "Shared.hpp"
|
|
#include "SSBRules.hpp"
|
|
|
|
namespace L = LibCmo;
|
|
namespace C = LibCmo::CK2;
|
|
namespace V = LibCmo::VxMath;
|
|
namespace O = LibCmo::CK2::ObjImpls;
|
|
|
|
namespace BMapInspector::Rule {
|
|
#pragma region SSB Rule 1
|
|
|
|
constexpr char8_t SSB1[] = u8"SSB1";
|
|
constexpr L::CKFLOAT TOLERANCE = 0.001f;
|
|
|
|
SSBRule1::SSBRule1() : IRule() {}
|
|
|
|
SSBRule1::~SSBRule1() {}
|
|
|
|
std::u8string_view SSBRule1::GetRuleName() const {
|
|
return SSB1;
|
|
}
|
|
|
|
void SSBRule1::Check(Reporter::Reporter& reporter, Map::Level& level) const {
|
|
auto* ctx = level.GetCKContext();
|
|
auto physicalized_3dobjects = Shared::FetchPhysicalized3dObjects(ctx);
|
|
|
|
// Iterate all physicalized 3dobject
|
|
for (auto* physicalized_3dobject : physicalized_3dobjects) {
|
|
// Get its world matrix
|
|
const auto& matrix = physicalized_3dobject->GetWorldMatrix();
|
|
// Extract 3 columns
|
|
V::VxVector3 col1(matrix[0][0], matrix[1][0], matrix[2][0]);
|
|
V::VxVector3 col2(matrix[0][1], matrix[1][1], matrix[2][1]);
|
|
V::VxVector3 col3(matrix[0][2], matrix[1][2], matrix[2][2]);
|
|
// Compute their length, then check their value with tolerance.
|
|
bool has_scale = false;
|
|
if (!Shared::FPEqual(col1.Length(), 1.0f, TOLERANCE)) has_scale = true;
|
|
if (!Shared::FPEqual(col2.Length(), 1.0f, TOLERANCE)) has_scale = true;
|
|
if (!Shared::FPEqual(col3.Length(), 1.0f, TOLERANCE)) has_scale = true;
|
|
// If it has scale factor, report error
|
|
if (has_scale) {
|
|
reporter.FormatError(
|
|
SSB1,
|
|
u8R"(Object "%s" grouped into physicalization groups has scale factor. This will cause its collision shape is different with its render shape.)",
|
|
Shared::RenderObjectName(physicalized_3dobject));
|
|
}
|
|
}
|
|
}
|
|
|
|
#pragma endregion
|
|
|
|
} // namespace BMapInspector::Rule
|