mirror of
https://github.com/whoahq/whoa.git
synced 2026-02-01 00:02:45 +03:00
181 lines
6.8 KiB
C++
181 lines
6.8 KiB
C++
#ifndef MODEL_C_M2_MODEL_HPP
|
|
#define MODEL_C_M2_MODEL_HPP
|
|
|
|
#include "gx/Camera.hpp"
|
|
#include "gx/Texture.hpp"
|
|
#include "model/CM2Lighting.hpp"
|
|
#include <cstdint>
|
|
#include <tempest/Matrix.hpp>
|
|
#include <tempest/Vector.hpp>
|
|
|
|
class CAaBox;
|
|
class CM2Scene;
|
|
class CM2Shared;
|
|
struct M2Batch;
|
|
struct M2Data;
|
|
struct M2ModelBone;
|
|
struct M2ModelBoneSeq;
|
|
struct M2ModelCamera;
|
|
struct M2ModelColor;
|
|
struct M2ModelLight;
|
|
struct M2ModelTextureWeight;
|
|
struct M2SequenceFallback;
|
|
struct M2TrackBase;
|
|
|
|
struct CM2ModelCall {
|
|
uint32_t type = -1;
|
|
CM2ModelCall* modelCallNext;
|
|
uint32_t time;
|
|
uint32_t args[8];
|
|
};
|
|
|
|
class CM2Model {
|
|
public:
|
|
// Static variables
|
|
static uint32_t s_loadingSequence;
|
|
static uint8_t* s_sequenceBase;
|
|
static uint32_t s_sequenceBaseSize;
|
|
static uint32_t s_skinProfileBoneCountMax[];
|
|
|
|
// Static functions
|
|
static CM2Model* AllocModel(uint32_t* heapId);
|
|
static bool Sub825E00(M2Data* data, uint32_t a2);
|
|
static uint16_t Sub8260C0(M2Data* data, uint32_t sequenceId, int32_t a3);
|
|
|
|
// Member variables
|
|
uint32_t m_refCount = 1;
|
|
uint32_t m_flags = 0;
|
|
CM2Model** m_scenePrev = nullptr;
|
|
CM2Model* m_sceneNext = nullptr;
|
|
uint32_t m_loaded : 1;
|
|
uint32_t m_flag2 : 1;
|
|
uint32_t m_flag4 : 1;
|
|
uint32_t m_flag8 : 1;
|
|
uint32_t m_flag10 : 1;
|
|
uint32_t m_flag20 : 1;
|
|
uint32_t m_flag40 : 1;
|
|
uint32_t m_flag80 : 1;
|
|
uint32_t m_flag100 : 1;
|
|
uint32_t m_flag200 : 1;
|
|
uint32_t m_flag400 : 1;
|
|
uint32_t m_flag800 : 1;
|
|
uint32_t m_flag1000 : 1;
|
|
uint32_t m_flag2000 : 1;
|
|
uint32_t m_flag4000 : 1;
|
|
uint32_t m_flag8000 : 1;
|
|
uint32_t m_flag10000 : 1;
|
|
uint32_t m_flag20000 : 1;
|
|
uint32_t m_flag40000 : 1;
|
|
uint32_t m_flag80000 : 1;
|
|
uint32_t m_flag100000 : 1;
|
|
uint32_t m_flag200000 : 1;
|
|
uint32_t m_flag400000 : 1;
|
|
CM2Model** m_callbackPrev = nullptr;
|
|
CM2Model* m_callbackNext = nullptr;
|
|
void (*m_loadedCallback)(CM2Model*, void*) = nullptr;
|
|
void* m_loadedArg = nullptr;
|
|
CM2Scene* m_scene = nullptr;
|
|
CM2Shared* m_shared = nullptr;
|
|
CM2Model* model30 = nullptr;
|
|
CM2ModelCall* m_modelCallList = nullptr;
|
|
CM2ModelCall** m_modelCallTail = nullptr;
|
|
CM2Model** m_animatePrev = nullptr;
|
|
CM2Model* m_animateNext = nullptr;
|
|
CM2Model* m_attachParent = nullptr;
|
|
uint32_t m_time = 0;
|
|
CM2Model** m_drawPrev = nullptr;
|
|
CM2Model* m_drawNext = nullptr;
|
|
uint32_t* m_loops = nullptr;
|
|
uint32_t uint74 = 0;
|
|
float float88 = 0.0f;
|
|
uint32_t uint90 = 0;
|
|
M2ModelBone* m_bones = nullptr;
|
|
C44Matrix* m_boneMatrices = nullptr;
|
|
M2ModelColor* m_colors = nullptr;
|
|
HTEXTURE* m_textures = nullptr;
|
|
M2ModelTextureWeight* m_textureWeights = nullptr;
|
|
C44Matrix* m_textureMatrices = nullptr;
|
|
C44Matrix matrixB4;
|
|
C44Matrix matrixF4;
|
|
float float198 = 1.0f;
|
|
float alpha19C = 1.0f;
|
|
C3Vector m_currentDiffuse = { 1.0f, 1.0f, 1.0f };
|
|
C3Vector m_currentEmissive = { 0.0f, 0.0f, 0.0f };
|
|
M2ModelLight* m_lights;
|
|
CM2Lighting m_lighting;
|
|
CM2Lighting* m_currentLighting = nullptr;
|
|
void (*m_lightingCallback)(CM2Model*, CM2Lighting*, void*) = nullptr;
|
|
void* m_lightingArg = nullptr;
|
|
M2ModelCamera* m_cameras = nullptr;
|
|
void* ptr2D0 = nullptr;
|
|
|
|
// Member functions
|
|
CM2Model()
|
|
: m_loaded(0)
|
|
, m_flag2(0)
|
|
, m_flag4(0)
|
|
, m_flag8(0)
|
|
, m_flag10(0)
|
|
, m_flag20(0)
|
|
, m_flag40(1)
|
|
, m_flag80(0)
|
|
, m_flag100(1)
|
|
, m_flag200(1)
|
|
, m_flag400(0)
|
|
, m_flag800(0)
|
|
, m_flag1000(0)
|
|
, m_flag2000(0)
|
|
, m_flag4000(0)
|
|
, m_flag8000(0)
|
|
, m_flag10000(0)
|
|
, m_flag20000(0)
|
|
, m_flag40000(0)
|
|
, m_flag80000(0)
|
|
, m_flag100000(0)
|
|
, m_flag200000(0)
|
|
, m_flag400000(0)
|
|
{};
|
|
void Animate(void);
|
|
void AnimateCamerasST(void);
|
|
void AnimateMT(const C44Matrix* view, const C3Vector& a3, const C3Vector& a4, float a5, float a6);
|
|
void AnimateMTSimple(const C44Matrix* view, const C3Vector& a3, const C3Vector& a4, float a5, float a6);
|
|
void AnimateST(void);
|
|
void AttachToScene(CM2Scene* scene);
|
|
void CancelDeferredSequences(uint32_t boneIndex, bool a3);
|
|
void DetachFromScene(void);
|
|
void FindKey(M2ModelBoneSeq* sequence, const M2TrackBase& track, uint32_t& currentKey, uint32_t& nextKey, float& ratio);
|
|
CAaBox& GetBoundingBox(CAaBox& bounds);
|
|
HCAMERA GetCameraByIndex(uint32_t index);
|
|
C3Vector GetPosition(void);
|
|
int32_t Initialize(CM2Scene* scene, CM2Shared* shared, CM2Model* a4, uint32_t flags);
|
|
int32_t InitializeLoaded(void);
|
|
int32_t IsBatchDoodadCompatible(M2Batch* batch);
|
|
int32_t IsDrawable(int32_t a2, int32_t a3);
|
|
int32_t IsLoaded(int32_t a2, int32_t attachments);
|
|
void LinkToCallbackListTail(void);
|
|
int32_t ProcessCallbacks();
|
|
void ProcessCallbacksRecursive(void);
|
|
void Release(void);
|
|
void SetAnimating(int32_t animating);
|
|
void SetBoneSequence(uint32_t boneId, uint32_t sequenceId, uint32_t a4, uint32_t time, float a6, int32_t a7, int32_t a8);
|
|
void SetBoneSequenceDeferred(uint16_t a2, M2Data* data, uint16_t boneIndex, uint32_t time, float a6, M2SequenceFallback fallback, int32_t a8, int32_t a9, int32_t a10);
|
|
void SetIndices(void);
|
|
void SetLightingCallback(void (*lightingCallback)(CM2Model*, CM2Lighting*, void*), void* lightingArg);
|
|
void SetLoadedCallback(void (*loadedCallback)(CM2Model*, void*), void* loadedArg);
|
|
void SetPrimaryBoneSequence(uint16_t sequenceIndex, uint16_t boneIndex, M2SequenceFallback fallback, uint32_t time, float a6, int32_t a7);
|
|
void SetSecondaryBoneSequence(uint16_t a2, uint16_t boneIndex, M2SequenceFallback fallback, uint32_t time, float a6);
|
|
void SetupBoneSequence(uint16_t sequenceIndex, M2SequenceFallback fallback, uint32_t a4, float a5, M2ModelBoneSeq* boneSequence);
|
|
void SetupLighting(void);
|
|
void SetVisible(int32_t visible);
|
|
void SetWorldTransform(const C3Vector& position, float orientation, float scale);
|
|
void Sub826350(M2SequenceFallback& fallback, uint32_t sequenceId);
|
|
int32_t Sub8269C0(uint32_t boneId, uint16_t boneIndex);
|
|
void Sub826E60(uint32_t* a2, uint32_t* a3);
|
|
void UnlinkFromCallbackList(void);
|
|
void UnsetBoneSequence(uint32_t boneId, int32_t a3, int32_t a4);
|
|
void UpdateLoaded(void);
|
|
void WaitForLoad(const char* a2);
|
|
};
|
|
|
|
#endif
|