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() {
41void ObjectBase::calcModel() {
46const char *ObjectBase::getResources()
const {
47 const auto &flowTable = ObjectDirector::Instance()->flowTable();
48 const auto *collisionSet = flowTable.set(flowTable.slot(
id()));
50 return collisionSet->resources;
54void ObjectBase::loadGraphics() {
55 const char *name = getResources();
56 if (strcmp(name,
"-") == 0) {
61 snprintf(filename,
sizeof(filename),
"%s.brres", name);
63 auto *resMgr = System::ResourceManager::Instance();
64 const void *resFile = resMgr->getFile(filename,
nullptr, System::ArchiveId::Course);
72void ObjectBase::loadRail() {
77 s16 pathId = m_mapObj->pathId();
83 auto *point = System::CourseMap::Instance()->getPointInfo(pathId);
84 f32 speed =
static_cast<f32
>(m_mapObj->setting(0));
86 if (point->setting(0) == 0) {
87 m_railInterpolator =
new RailLinearInterpolator(speed, pathId);
89 m_railInterpolator =
new RailSmoothInterpolator(speed, pathId);
94[[nodiscard]]
const char *ObjectBase::getName()
const {
95 const auto &flowTable = ObjectDirector::Instance()->flowTable();
96 const auto *collisionSet = flowTable.set(flowTable.slot(
id()));
98 return collisionSet->name;
102const char *ObjectBase::getKclName()
const {
103 const auto &flowTable = ObjectDirector::Instance()->flowTable();
104 const auto *collisionSet = flowTable.set(flowTable.slot(
id()));
105 ASSERT(collisionSet);
106 return collisionSet->resources;
110void ObjectBase::calcTransform() {
111 if (m_flags.onBit(eFlags::Rotation)) {
112 m_transform.makeRT(m_rot, m_pos);
113 m_flags.resetBit(eFlags::Rotation, eFlags::Position);
114 }
else if (m_flags.onBit(eFlags::Position)) {
115 m_transform.setBase(3, m_pos);
116 m_flags.setBit(eFlags::Matrix);
120void ObjectBase::calcRotLock() {
123 m_rot = m_transform.calcRPY();
128void ObjectBase::linkAnims(
const std::span<const char *> &names,
129 const std::span<Render::AnmType> types) {
134 ASSERT(names.size() == types.size());
136 for (
size_t i = 0; i < names.size(); ++i) {
137 m_drawMdl->linkAnims(i, m_resFile, names[i], types[i]);
144 m_flags.setBit(eFlags::Matrix);
145 SetRotTangentHorizontal(m_transform, up, tangent);
146 m_transform.setBase(3, m_pos);
150void ObjectBase::setMatrixFromOrthonormalBasisAndPos(
const EGG::Vector3f &v) {
151 m_flags.setBit(eFlags::Matrix);
152 m_transform = OrthonormalBasis(v);
153 m_transform.setBase(3, m_pos);
160 return (b.x - a.x) * (point.z - a.z) - (point.x - a.x) * (b.z - a.z);
166 f32 y = EGG::Mathf::SinFIdx(RAD2FIDX * (0.5f * angle));
167 f32 w = EGG::Mathf::CosFIdx(RAD2FIDX * (0.5f * angle));
176 mat.
setBase(3, EGG::Vector3f::zero);
196 if (EGG::Mathf::abs(z.y) < 0.001f) {
207 mat.
setBase(3, EGG::Vector3f::zero);
216EGG::Matrix34f ObjectBase::RailOrthonormalBasis(
const RailInterpolator &railInterpolator) {
217 EGG::Matrix34f mat = OrthonormalBasis(railInterpolator.curTangentDir());
218 mat.
setBase(3, railInterpolator.curPos());
223EGG::Vector3f ObjectBase::AdjustVecForward(f32 sidewaysScalar, f32 forwardScalar, f32 minSpeed,
225 if (forward.y > 0.0f) {
227 auto [mag, tmp] = forward.ps_normalized();
241 newForward = forward * minSpeed;
244 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.