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_pos(params.pos()), m_rot(params.rot() * DEG2RAD), m_scale(params.scale()),
19 m_transform(
EGG::Matrix34f::ident), m_mapObj(¶ms) {
20 m_flags.setBit(eFlags::Position, eFlags::Rotation, eFlags::Scale);
26 : m_drawMdl(nullptr), m_resFile(nullptr), m_pos(pos), m_rot(rot), m_scale(scale),
27 m_transform(
EGG::Matrix34f::ident), m_mapObj(nullptr) {
28 m_flags.setBit(eFlags::Position, eFlags::Rotation, eFlags::Scale);
29 m_id = ObjectDirector::Instance()->flowTable().getIdfFromName(name);
33ObjectBase::~ObjectBase() {
39void ObjectBase::calcModel() {
44const char *ObjectBase::getResources()
const {
45 const auto &flowTable = ObjectDirector::Instance()->flowTable();
46 const auto *collisionSet = flowTable.set(flowTable.slot(m_id));
48 return collisionSet->resources;
52void ObjectBase::loadGraphics() {
53 const char *name = getResources();
54 if (strcmp(name,
"-") == 0) {
59 snprintf(filename,
sizeof(filename),
"%s.brres", name);
61 auto *resMgr = System::ResourceManager::Instance();
62 const void *resFile = resMgr->getFile(filename,
nullptr, System::ArchiveId::Course);
70void ObjectBase::loadRail() {
75 s16 pathId = m_mapObj->pathId();
81 auto *point = System::CourseMap::Instance()->getPointInfo(pathId);
82 f32 speed =
static_cast<f32
>(m_mapObj->setting(0));
84 if (point->setting(0) == 0) {
85 m_railInterpolator =
new RailLinearInterpolator(speed, pathId);
87 m_railInterpolator =
new RailSmoothInterpolator(speed, pathId);
92[[nodiscard]]
const char *ObjectBase::getName()
const {
93 const auto &flowTable = ObjectDirector::Instance()->flowTable();
94 const auto *collisionSet = flowTable.set(flowTable.slot(
id()));
96 return collisionSet->name;
100const char *ObjectBase::getKclName()
const {
101 const auto &flowTable = ObjectDirector::Instance()->flowTable();
102 const auto *collisionSet = flowTable.set(flowTable.slot(
id()));
103 ASSERT(collisionSet);
104 return collisionSet->resources;
108void ObjectBase::calcTransform() {
109 if (m_flags.onBit(eFlags::Rotation)) {
110 m_transform.makeRT(m_rot, m_pos);
111 m_flags.resetBit(eFlags::Rotation, eFlags::Position);
112 }
else if (m_flags.onBit(eFlags::Position)) {
113 m_transform.setBase(3, m_pos);
114 m_flags.setBit(eFlags::Matrix);
119void ObjectBase::linkAnims(
const std::span<const char *> &names,
120 const std::span<Render::AnmType> types) {
125 ASSERT(names.size() == types.size());
127 for (
size_t i = 0; i < names.size(); ++i) {
128 m_drawMdl->linkAnims(i, m_resFile, names[i], types[i]);
134 m_flags.setBit(eFlags::Matrix);
135 SetRotTangentHorizontal(m_transform, up, tangent);
136 m_transform.setBase(3, m_pos);
143 mat.
setBase(3, EGG::Vector3f::zero);
163 if (EGG::Mathf::abs(z.y) < 0.001f) {
174 mat.
setBase(3, EGG::Vector3f::zero);
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.
f32 dot(const Vector3f &rhs) const
The dot product between two vectors.