1#include "ObjectBase.hh"
3#include "game/field/ObjectDirector.hh"
5#include "game/system/CourseMap.hh"
6#include "game/system/ResourceManager.hh"
7#include "game/system/map/MapdataPointInfo.hh"
9#include <egg/math/Math.hh>
17 : m_drawMdl(nullptr), m_resFile(nullptr), m_id(static_cast<ObjectId>(params.id())),
18 m_railInterpolator(nullptr), m_pos(params.pos()), m_scale(params.scale()),
19 m_rot(params.rot() * DEG2RAD), m_rotLock(true), m_transform(
EGG::Matrix34f::ident),
21 m_flags.setBit(eFlags::Position, eFlags::Rotation, eFlags::Scale);
27 : m_drawMdl(nullptr), m_resFile(nullptr), m_railInterpolator(nullptr), m_pos(pos),
28 m_scale(scale), m_rot(rot), m_rotLock(true), m_transform(
EGG::Matrix34f::ident),
30 m_flags.setBit(eFlags::Position, eFlags::Rotation, eFlags::Scale);
31 m_id = ObjectDirector::Instance()->flowTable().getIdFromName(name);
35ObjectBase::~ObjectBase() {
38 delete m_railInterpolator;
42void ObjectBase::calcModel() {
47const char *ObjectBase::getResources()
const {
48 const auto &flowTable = ObjectDirector::Instance()->flowTable();
49 const auto *collisionSet = flowTable.set(flowTable.slot(
id()));
51 return collisionSet->resources;
55void ObjectBase::loadGraphics() {
56 const char *name = getResources();
57 if (strcmp(name,
"-") == 0) {
62 snprintf(filename,
sizeof(filename),
"%s.brres", name);
64 auto *resMgr = System::ResourceManager::Instance();
65 const void *resFile = resMgr->getFile(filename,
nullptr, System::ArchiveId::Course);
73void ObjectBase::loadRail() {
78 s16 pathId = m_mapObj->pathId();
84 auto *point = System::CourseMap::Instance()->getPointInfo(pathId);
85 f32 speed =
static_cast<f32
>(m_mapObj->setting(0));
87 if (point->setting(0) == 0) {
88 m_railInterpolator =
new RailLinearInterpolator(speed, pathId);
90 m_railInterpolator =
new RailSmoothInterpolator(speed, pathId);
95[[nodiscard]]
const char *ObjectBase::getName()
const {
96 const auto &flowTable = ObjectDirector::Instance()->flowTable();
97 const auto *collisionSet = flowTable.set(flowTable.slot(
id()));
99 return collisionSet->name;
103const char *ObjectBase::getKclName()
const {
104 const auto &flowTable = ObjectDirector::Instance()->flowTable();
105 const auto *collisionSet = flowTable.set(flowTable.slot(
id()));
106 ASSERT(collisionSet);
107 return collisionSet->resources;
111void ObjectBase::calcTransform() {
112 if (m_flags.onBit(eFlags::Rotation)) {
113 m_transform.makeRT(m_rot, m_pos);
114 m_flags.resetBit(eFlags::Rotation, eFlags::Position);
115 }
else if (m_flags.onBit(eFlags::Position)) {
116 m_transform.setBase(3, m_pos);
117 m_flags.setBit(eFlags::Matrix);
121void ObjectBase::calcRotLock() {
124 m_rot = m_transform.calcRPY();
129void ObjectBase::linkAnims(
const std::span<const char *> &names,
130 const std::span<Render::AnmType> types) {
135 ASSERT(names.size() == types.size());
137 for (
size_t i = 0; i < names.size(); ++i) {
138 m_drawMdl->linkAnims(i, m_resFile, names[i], types[i]);
145 m_flags.setBit(eFlags::Matrix);
146 SetRotTangentHorizontal(m_transform, up, tangent);
147 m_transform.setBase(3, m_pos);
151void ObjectBase::setMatrixFromOrthonormalBasisAndPos(
const EGG::Vector3f &v) {
152 m_flags.setBit(eFlags::Matrix);
153 m_transform = OrthonormalBasis(v);
154 m_transform.setBase(3, m_pos);
161 return (b.x - a.x) * (point.z - a.z) - (point.x - a.x) * (b.z - a.z);
167 f32 y = EGG::Mathf::SinFIdx(RAD2FIDX * (0.5f * angle));
168 f32 w = EGG::Mathf::CosFIdx(RAD2FIDX * (0.5f * angle));
177 mat.
setBase(3, EGG::Vector3f::zero);
197 if (EGG::Mathf::abs(z.y) < 0.001f) {
208 mat.
setBase(3, EGG::Vector3f::zero);
217EGG::Matrix34f ObjectBase::RailOrthonormalBasis(
const RailInterpolator &railInterpolator) {
218 EGG::Matrix34f mat = OrthonormalBasis(railInterpolator.curTangentDir());
219 mat.
setBase(3, railInterpolator.curPos());
224EGG::Vector3f ObjectBase::AdjustVecForward(f32 sidewaysScalar, f32 forwardScalar, f32 minSpeed,
226 if (forward.y > 0.0f) {
228 auto [mag, tmp] = forward.ps_normalized();
242 newForward = forward * minSpeed;
245 return sideways + newForward;
Represents a binary resource file which contains object models, textures, and animations.
void setBase(size_t col, const Vector3f &base)
Sets one column of a matrix.
void setAxisRotation(f32 angle, const Vector3f &axis)
Rotates the matrix about an axis.
Vector3f ps_multVector(const Vector3f &vec) const
Paired-singles impl. of multVector.
A quaternion, used to represent 3D rotation.
Vector3f rotateVector(const Vector3f &vec) const
Rotates a vector based on the quat.
f32 dot(const Vector3f &rhs) const
The dot product between two vectors.
f32 squaredLength() const
The dot product between the vector and itself.
f32 ps_dot() const
Paired-singles dot product implementation.