diff --git a/lib/gsys/CMakeLists.txt b/lib/gsys/CMakeLists.txt index f51725f1..bec73906 100644 --- a/lib/gsys/CMakeLists.txt +++ b/lib/gsys/CMakeLists.txt @@ -9,6 +9,7 @@ add_library(gsys OBJECT include/gsys/gsysModelNW.h include/gsys/gsysModelSceneConfig.h include/gsys/gsysModelUnit.h + include/gsys/gsysModelUnitDrawArray.h include/gsys/gsysOfxLensFlareRig.h include/gsys/gsysORUtil.h include/gsys/gsysParticleConfig.h diff --git a/lib/gsys/include/gsys/gsysModelNW.h b/lib/gsys/include/gsys/gsysModelNW.h index 5f0afbb7..0230e414 100644 --- a/lib/gsys/include/gsys/gsysModelNW.h +++ b/lib/gsys/include/gsys/gsysModelNW.h @@ -2,6 +2,10 @@ #include +namespace agl { +class DrawContext; +} + namespace gsys { // XXX: bad name. This doesn't reflect the fact that ModelNW is a ModelUnit, not a Model. @@ -10,6 +14,16 @@ class ModelNW : public ModelUnit, public nn::g3d::ICalculateWorldCallback, public sead::hostio::Node { SEAD_RTTI_OVERRIDE(ModelNW, ModelUnit) + + virtual void drawDetail(agl::DrawContext* context) const; + virtual void createRenderUnitNW(int, sead::Heap* heap); + +protected: + virtual void calcBounding_(); // NOLINT(bugprone-virtual-near-miss) + virtual void calcGPUSkinning_(); + + void Exec(nn::g3d::ICalculateWorldCallback::CallbackArg& arg, + nn::g3d::WorldMtxManip& world_mtx_manip) override; }; } // namespace gsys diff --git a/lib/gsys/include/gsys/gsysModelUnit.h b/lib/gsys/include/gsys/gsysModelUnit.h index b38210cf..085512ef 100644 --- a/lib/gsys/include/gsys/gsysModelUnit.h +++ b/lib/gsys/include/gsys/gsysModelUnit.h @@ -1,17 +1,166 @@ #pragma once +#include +#include #include +#include +#include +#include #include #include +#include +#include "gsys/gsysModelUnitDrawArray.h" + +namespace agl { +class UniformBlock; +} namespace gsys { +namespace ModelEnum { +enum class ShaderAssignType; +enum class RenderOption; +enum class RenderViewOption; +} // namespace ModelEnum + +class ModelRenderUnit; +class ModelScene; +class ModelViewData; + // TODO class ModelUnit { SEAD_RTTI_BASE(ModelUnit) public: + // TODO: is this an enum/enum class or a class? + enum class BoolType; + ModelUnit(); virtual ~ModelUnit(); + + // FIXME + virtual void createDrawArray(const ModelUnitDrawArray::CreateArg& arg, sead::Heap* heap); + + virtual sead::SafeString getName() const; + + virtual int getBoneNum() const; + virtual int searchBoneIndex(const sead::SafeString& bone_name) const; + virtual sead::SafeString getBoneName(int bone_idx) const; + virtual void setBoneLocalMatrix(const sead::Matrix34f& matrix, const sead::Vector3f& pos, + int bone_idx); + virtual void setBoneLocalRTMatrix(const sead::Matrix34f& matrix, int bone_idx); + virtual void setBoneLocalScale(const sead::Vector3f& scale, int bone_idx); + virtual void getBoneLocalMatrix(sead::Matrix34f* matrix, sead::Vector3f* pos, + int bone_idx) const; + virtual void setBoneWorldMatrix(const sead::Matrix34f& matrix, int bone_idx); + virtual void getBoneWorldMatrix(sead::Matrix34f* matrix, int bone_idx) const; + virtual sead::Matrix34f* getBoneWorldMatrixPtr(int bone_idx) const; + virtual void safeGetBoneWorldMatrix(sead::Matrix34f* matrix, int bone_idx) const; + virtual void setBoneVisible(int bone_idx, bool visible); + virtual bool isBoneVisible(int bone_idx) const; + virtual int getBoneParentIndex(int bone_idx) const; + virtual void copyBoneLocalMatrixTo(gsys::ModelUnit* target) const; + virtual void copyBoneWorldMatrixTo(gsys::ModelUnit* target) const; + virtual void clearBoneLocalMatrix(); + + virtual int getMaterialNum() const = 0; + virtual int searchMaterialIndex(const sead::SafeString& material_name) const; + virtual sead::SafeString getMaterialName(int material_idx) const; + + virtual int searchMaterialParamIndex(int material_idx, + const sead::SafeString& param_name) const; + virtual sead::SafeString getMaterialParamName(int material_idx, int param_idx) const; + + virtual bool getMaterialParamBool(int material_idx, int param_idx) const; + virtual void setMaterialParamBool(int material_idx, int param_idx, bool value); + + virtual int getMaterialParamInt(int material_idx, int param_idx) const; + virtual void setMaterialParamInt(int material_idx, int param_idx, int value); + + virtual u32 getMaterialParamU32(int material_idx, int param_idx) const; + virtual void setMaterialParamU32(int material_idx, int param_idx, u32 value); + + virtual float getMaterialParamF32(int material_idx, int param_idx) const; + virtual void setMaterialParamF32(int material_idx, int param_idx, float value); + + virtual const sead::Vector2f& getMaterialParamVector2f(int material_idx, int param_idx) const; + virtual void setMaterialParamVector2f(int material_idx, int param_idx, + const sead::Vector2f& value); + + virtual const sead::Vector3f& getMaterialParamVector3f(int material_idx, int param_idx) const; + virtual void setMaterialParamVector3f(int material_idx, int param_idx, + const sead::Vector3f& value); + + virtual const sead::Vector4f& getMaterialParamVector4f(int material_idx, int param_idx) const; + virtual void setMaterialParamVector4f(int material_idx, int param_idx, + const sead::Vector4f& value); + + virtual const sead::Color4f& getMaterialParamColor4f(int material_idx, int param_idx) const; + virtual void setMaterialParamColor4f(int material_idx, int param_idx, + const sead::Color4f& value); + + virtual const sead::Color4f& getMaterialParamColor3f(int material_idx, int param_idx) const; + virtual void setMaterialParamColor3f(int material_idx, int param_idx, + const sead::Color4f& value); + + virtual void getMaterialParamTexSRT(int material_idx, int param_idx, sead::Vector2f* scale, + float* rotate, sead::Vector2f* translate) const; + virtual void setMaterialParamTexSRT(int material_idx, int param_idx, + const sead::Vector2f& scale, float rotate, + const sead::Vector2f& translate); + + virtual sead::Matrix34f* getMaterialParamEffectMatrixPtr(int material_idx, int param_idx) const; + virtual void setMaterialParamEffectMatrixPtr(int material_idx, int param_idx, + sead::Matrix34f* matrix); + + virtual float getMaterialParamXluAlpha(int material_idx, int param_idx) const; + virtual void setMaterialParamXluAlpha(int material_idx, int param_idx, float xlu_alpha); + + virtual void clearMaterialParameter(int material_idx); + virtual void clearTexture(int unk); + + virtual void setMaterialVisible(int material_idx, bool visible); + virtual bool isMaterialVisible(int material_idx) const; + + virtual void setMaterialShaderAssignVariation(int material_idx, + ModelEnum::ShaderAssignType assign_type, int); + + virtual int getShapeNum() const = 0; + + // TODO: reference or pointer? + virtual ModelRenderUnit* getModelRenderUnit(int idx) = 0; + virtual const ModelRenderUnit* getModelRenderUnit(int idx) const = 0; + + virtual void* createSubMeshRangeBuffer(sead::Heap* heap) const; + virtual void setSubMeshRangeBuffer(int, void*); + virtual void setSubMeshRangeBufferVisible(int, int, const bool*); + + virtual int countPolygonNum() const; + + virtual int getViewNum() const; + virtual void calcBoundAABB(sead::BoundBox3f* aabb, bool) const; + + virtual bool isDefaultRenderOptionEnabled(int, ModelEnum::RenderOption) const; + virtual bool isDefaultRenderViewOptionEnabled(int, ModelEnum::RenderViewOption, int) const; + + virtual void setUserUniformBlock(int, agl::UniformBlock* block); + + virtual void enableReverseCulling(int, bool enable); + virtual bool isReverseCullingEnabled(int) const; + + virtual void setLodLevelNum(int lod_level_num); + + virtual void check(BoolType) const; + virtual void calcBounding(); + virtual void bind(const ModelScene* scene); + virtual void bindResource(); + virtual void syncResource(); + virtual void unbindResource(); + virtual void calcWorld(const sead::Matrix34f&, const sead::Vector3f&); + virtual void postCalcWorld(const ModelScene* scene, u32, u32, + const ModelViewData* model_view_data, int); + virtual void calcBeforeDraw(ModelScene* scene, const gsys::ModelViewData* model_view_data, int); + virtual void forceCalcDrawSetup(); + virtual void setUpMaterialImpl(int, sead::Heap* heap); }; } // namespace gsys diff --git a/lib/gsys/include/gsys/gsysModelUnitDrawArray.h b/lib/gsys/include/gsys/gsysModelUnitDrawArray.h new file mode 100644 index 00000000..1d932a20 --- /dev/null +++ b/lib/gsys/include/gsys/gsysModelUnitDrawArray.h @@ -0,0 +1,18 @@ +#pragma once + +#include + +namespace gsys { + +// TODO +class ModelUnitDrawArray : public sead::hostio::Node { +public: + struct CreateArg { + CreateArg(); + }; + + ModelUnitDrawArray(); + virtual ~ModelUnitDrawArray(); +}; + +} // namespace gsys