diff --git a/config/SZBE69_B8/objects.json b/config/SZBE69_B8/objects.json index ff094d11..da46dfed 100644 --- a/config/SZBE69_B8/objects.json +++ b/config/SZBE69_B8/objects.json @@ -385,6 +385,7 @@ "system/rndobj/Utl.cpp": "NonMatching", "system/rndobj/Wind.cpp": "NonMatching", + "system/rndwii/Mesh.cpp": "NonMatching", "system/rndwii/Rnd.cpp": "NonMatching", "system/synth/ADSR.cpp": "NonMatching", @@ -518,7 +519,8 @@ "system/world/LightPresetManager.cpp": "NonMatching", "system/world/Spotlight.cpp": "NonMatching", "system/world/SpotlightDrawer.cpp": "NonMatching", - "system/world/SpotlightEnder.cpp": "Matching" + "system/world/SpotlightEnder.cpp": "Matching", + "system/world/World.cpp": "NonMatching" } }, "flex": { diff --git a/src/system/math/Rot.h b/src/system/math/Rot.h index 14da0ec1..570fad55 100644 --- a/src/system/math/Rot.h +++ b/src/system/math/Rot.h @@ -5,6 +5,10 @@ #include "math/Vec.h" #include "math/Mtx.h" +#define PI 3.14159265358979323846 +#define RAD2DEG 0.01745329238474369049f +#define DEG2RAD 57.2957763671875f + void Multiply(const Transform&, const Transform&, Transform&); void MakeRotMatrix(const Vector3&, Hmx::Matrix3&, bool); void MakeEulerScale(const Hmx::Matrix3&, Vector3&, Vector3&); diff --git a/src/system/obj/Dir.h b/src/system/obj/Dir.h index 07b888ba..1f459807 100644 --- a/src/system/obj/Dir.h +++ b/src/system/obj/Dir.h @@ -215,6 +215,7 @@ class ObjectDir : public virtual Hmx::Object { }; BinStream& operator>>(BinStream& bs, ObjectDir::Viewport& vp); +void PreloadSharedSubdirs(class Symbol); extern bool gLoadingProxyFromDisk; extern const char* kNotObjectMsg; diff --git a/src/system/rndobj/Cam.cpp b/src/system/rndobj/Cam.cpp index 728cccf1..a509b895 100644 --- a/src/system/rndobj/Cam.cpp +++ b/src/system/rndobj/Cam.cpp @@ -1,12 +1,15 @@ #include "rndobj/Cam.h" +#include "math/Rot.h" #include "obj/ObjMacros.h" #include "obj/ObjPtr_p.h" #include "obj/Object.h" #include "os/Debug.h" #include "rndobj/Draw.h" +#include "rndobj/Rnd.h" #include "rndobj/Trans.h" #include "rndobj/Utl.h" #include "utl/Symbols.h" +#include "utl/Symbols2.h" RndCam* RndCam::sCurrent = 0; int CAM_REV = 12; @@ -18,6 +21,16 @@ void RndCam::WorldToScreen(const Vector3& w, Vector2& s) const { s = mZRange; } +void RndCam::Select() { + if (sCurrent && sCurrent->mTargetTex.mPtr && sCurrent != this) { + sCurrent->mTargetTex->FinishDrawTarget(); + } + if (mCache->mFlags & 1) WorldXfm_Force(); + sCurrent = this; + Rnd::Aspect a = TheRnd->mAspect; + if (mAspect != a) UpdateLocal(); +} + void RndCam::SetTargetTex(RndTex* tex){ if(sCurrent == this && mTargetTex){ mTargetTex->FinishDrawTarget(); @@ -101,13 +114,14 @@ BEGIN_HANDLERS(RndCam) END_HANDLERS DataNode RndCam::OnSetFrustum(const DataArray* da){ - float nearPlane, farPlane, yFov; + float nearPlane, farPlane, yFov, temp; if(!da->FindData(near_plane, nearPlane, false)) nearPlane = mNearPlane; if(!da->FindData(far_plane, farPlane, false)) farPlane = mFarPlane; - if(da->FindData(y_fov, yFov, false)) yFov *= 0.017453292f; - else yFov = mYFov; + if(da->FindData(y_fov, yFov, false)) temp = 0.017453292f * yFov; + else temp = mYFov; + yFov = temp; SetFrustum(nearPlane, farPlane, yFov, 1.0f); return DataNode(0); } @@ -132,8 +146,10 @@ DataNode RndCam::OnFarPlane(const DataArray*){ } BEGIN_PROPSYNCS(RndCam) - //SYNC_SUPERCLASS(RndTransformable) - SYNC_PROP_MODIFY(near_plane, mNearPlane, ) + SYNC_SUPERCLASS(RndTransformable) + SYNC_PROP_SET(near_plane, mNearPlane, SetFrustum(_val.Float(NULL), mFarPlane, mYFov, 1)) + SYNC_PROP_SET(far_plane, mFarPlane, SetFrustum(mNearPlane, _val.Float(NULL), mYFov, 1)) + SYNC_PROP_SET(y_fov, mYFov * DEG2RAD, SetFrustum(mNearPlane, mFarPlane, _val.Float(NULL) * RAD2DEG, 1)) SYNC_PROP(z_range, mZRange) - SYNC_PROP_MODIFY(screen_rect, mScreenRect, UpdateLocal()) + SYNC_PROP_MODIFY_ALT(screen_rect, mScreenRect, UpdateLocal()) END_PROPSYNCS diff --git a/src/system/rndobj/Cam.h b/src/system/rndobj/Cam.h index d0cc04d2..7f36c766 100644 --- a/src/system/rndobj/Cam.h +++ b/src/system/rndobj/Cam.h @@ -6,6 +6,7 @@ #include "math/Vec.h" #include "math/Geo.h" #include "obj/ObjPtr_p.h" +#include "rndobj/Rnd.h" #include "rndobj/Tex.h" class RndCam : public RndTransformable { @@ -39,11 +40,11 @@ class RndCam : public RndTransformable { REGISTER_OBJ_FACTORY(RndCam) } - Transform mInvWorldXfm; - Transform mLocalProjectXfm; - Transform mInvLocalProjectXfm; - Transform mWorldProjectXfm; - Transform mInvWorldProjectXfm; + Transform mInvWorldXfm; // 0x90 + Transform mLocalProjectXfm; // 0xC0 + Transform mInvLocalProjectXfm; // 0xF0 + Transform mWorldProjectXfm; // 0x120 + Transform mInvWorldProjectXfm; // 0x150 Frustum mLocalFrustum; // 0x180 Frustum mWorldFrustum; // 0x1E0 float mNearPlane; // 0x240 @@ -53,7 +54,7 @@ class RndCam : public RndTransformable { Vector2 mZRange; // 0x250 Hmx::Rect mScreenRect; // 0x258 ObjPtr mTargetTex; // 0x268 - int asdf; // 0x274 + Rnd::Aspect mAspect; // 0x274 }; #endif diff --git a/src/system/rndobj/Console.cpp b/src/system/rndobj/Console.cpp index 79243692..449810c9 100644 --- a/src/system/rndobj/Console.cpp +++ b/src/system/rndobj/Console.cpp @@ -1,7 +1,9 @@ #include "rndobj/Console.h" +#include "obj/ObjMacros.h" #include "os/Debug.h" #include "obj/Data.h" #include "obj/DataFunc.h" +#include "os/File.h" #include "os/System.h" #include "rndobj/Overlay.h" #include @@ -110,6 +112,28 @@ void RndConsole::InsertBreak(DataArray* arr, int i){ mBreakpoints.back().index = i; } +void RndConsole::List() { + if (mDebugging) { + mOutput->Clear(); + if (File* f = NewFile(mDebugging->File(), 2)) { + int i = 1; + int x = mOutput->mLines.size(); + int y = mDebugging->Line(); + int z = y - x / 2; + do { + char buf[4]; + f->Read(buf, 1); + if (i > z) *mOutput << buf[0]; + i++; + char brk = '>'; + if (i == mDebugging->mLine) brk = ':'; + *mOutput << MakeString("%3d%c", i, brk); + } while (i > y); + + delete f; + } + } else MILO_FAIL("Can't list unless debugging"); +} // // declared/defined in DataArray.cpp extern DataArray* gCallStack[100]; @@ -136,7 +160,7 @@ void RndConsole::Step(int i) { mDebugging = 0; gPreExecuteFunc = *DataBreak; - } else MILO_FAIL("can't step unless debugging"); + } else MILO_FAIL("Can't step unless debugging"); } void RndConsole::Continue() { @@ -225,3 +249,22 @@ RndConsole::RndConsole() : mShowing(0), mBuffer(), RndConsole::~RndConsole(){ TheDebug.SetReflect(0); } + +BEGIN_HANDLERS(RndConsole) + HANDLE_MESSAGE(KeyboardKeyMsg) + HANDLE_CHECK(592) +END_HANDLERS + +int RndConsole::OnMsg(const KeyboardKeyMsg& msg) { + if (!mShowing) return 0; + if (msg.mData->Int(2) == 302) SetShowing(false); + else { + if (msg.mData->Int(2) == 9) { + if (mTabLen == 0) mTabLen = strlen(mInput->CurrentLine()->c_str()); + } + } + + mTabLen = msg.mData->Int(2) == 10 ? mCursor : -1; + if (msg.mData->Int(2) != 9) mTabLen = 0; + return 0; +} diff --git a/src/system/rndobj/Console.h b/src/system/rndobj/Console.h index f0ba5e64..13fe5151 100644 --- a/src/system/rndobj/Console.h +++ b/src/system/rndobj/Console.h @@ -2,8 +2,9 @@ #define RNDOBJ_CONSOLE_H #include "obj/Object.h" -#include +#include "os/Keyboard.h" #include "utl/Str.h" +#include class RndOverlay; @@ -32,6 +33,7 @@ class RndConsole : public Hmx::Object { // 0x58 - 0x1c = 0x3c void Continue(); void Help(Symbol); void SetShowing(bool); + int OnMsg(const KeyboardKeyMsg&); void* operator new(size_t s){ return _PoolAlloc(s, sizeof(RndConsole), FastPool); diff --git a/src/system/rndobj/Mesh.cpp b/src/system/rndobj/Mesh.cpp index 54a817fa..08be41f3 100644 --- a/src/system/rndobj/Mesh.cpp +++ b/src/system/rndobj/Mesh.cpp @@ -395,4 +395,4 @@ BEGIN_PROPSYNCS(RndMesh) SYNC_PROP(geom_owner, mOwner) -END_PROPSYNCS \ No newline at end of file +END_PROPSYNCS diff --git a/src/system/rndobj/Overlay.h b/src/system/rndobj/Overlay.h index 59bf5046..eeb36dc2 100644 --- a/src/system/rndobj/Overlay.h +++ b/src/system/rndobj/Overlay.h @@ -27,6 +27,7 @@ class RndOverlay : public TextStream { void SetTimeout(float); void SetLines(int); void Clear(); + String* CurrentLine(); static void Init(); static void Terminate(); static void TogglePosition(); diff --git a/src/system/rndobj/Trans.h b/src/system/rndobj/Trans.h index 328f16e7..76c11d9b 100644 --- a/src/system/rndobj/Trans.h +++ b/src/system/rndobj/Trans.h @@ -116,9 +116,9 @@ class RndTransformable : public virtual RndHighlightable { Transform mLocalXfm; // 0x1c Transform mWorldXfm; // 0x4c DirtyCache* mCache; // 0x7c - u16 mConstraint; Constraint TransConstraint() { return (Constraint) mConstraint; } - bool mPreserveScale; - ObjPtr mTarget; + u16 mConstraint; Constraint TransConstraint() { return (Constraint) mConstraint; } // 0x80 + bool mPreserveScale; // 0x83 + ObjPtr mTarget; // 0x84 static ushort gRev; static ushort gAltRev; diff --git a/src/system/rndwii/Mesh.cpp b/src/system/rndwii/Mesh.cpp new file mode 100644 index 00000000..729620f3 --- /dev/null +++ b/src/system/rndwii/Mesh.cpp @@ -0,0 +1,49 @@ +#include "Mesh.h" +#include "obj/Data.h" +#include "obj/Object.h" +#include "os/Debug.h" +#include "revolution/GX.h" +#include "revolution/os/OSCache.h" +#include "rndwii/Rnd.h" + +bool gToggleAO = true; + +static DataNode OnToggleAO(DataArray*) { + gToggleAO = !gToggleAO; + TheDebug << MakeString("Ambient Occlusion is now %s!\n", gToggleAO ? "ON" : "OFF"); + return DataNode(); +} + +DisplayList::DisplayList() : mData(NULL), mSize(0), unk_0x8(0) {} + +DisplayList::~DisplayList() { Clear(); } + +void DisplayList::Init() { + +} + +void DisplayList::Clear() { + WiiRnd::SyncFree(mData); + mData = NULL; + mSize = 0; + unk_0x8 = 0; +} + +void DisplayList::Copy(const DisplayList& d) { + Clear(); +} + +void DisplayList::Draw(u32 u, _GXVtxFmt f) const { + MILO_ASSERT(mData, 237); + MILO_ASSERT(mSize > 0, 238); + DCStoreRange(mData, mSize); + GXCallDisplayList(mData, mSize); +} + +WiiMesh::WiiMesh() {} + +BEGIN_COPYS(WiiMesh) + COPY_SUPERCLASS(RndMesh) + CREATE_COPY(WiiMesh) + +END_COPYS diff --git a/src/system/rndwii/Mesh.h b/src/system/rndwii/Mesh.h new file mode 100644 index 00000000..396b7adc --- /dev/null +++ b/src/system/rndwii/Mesh.h @@ -0,0 +1,35 @@ +#ifndef RNDWII_MESH_H +#define RNDWII_MESH_H + +#include "obj/ObjMacros.h" +#include "obj/Object.h" +#include "revolution/gx/GXTypes.h" +#include "rndobj/Mesh.h" + +class DisplayList { // 0xC +public: + DisplayList(); + ~DisplayList(); + void Init(); + void Clear(); + void Copy(const DisplayList&); + void Draw(u32, _GXVtxFmt) const; + + void* mData; + int mSize; + int unk_0x8; +}; + +class WiiMesh : public RndMesh { // 0x198 + WiiMesh(); + + virtual void Copy(const Hmx::Object*, CopyType); + OBJ_CLASSNAME(WiiMesh) + OBJ_SET_TYPE(WiiMesh) + + NEW_OBJ(WiiMesh) + + DisplayList mDisplays; // 0x158 +}; + +#endif // RNDWII_MESH_H diff --git a/src/system/rndwii/Rnd.h b/src/system/rndwii/Rnd.h index d6346adc..a88eba8b 100644 --- a/src/system/rndwii/Rnd.h +++ b/src/system/rndwii/Rnd.h @@ -28,7 +28,9 @@ class WiiRnd : public Rnd { public: std::vector unk_0x2B4; bool unk_0x2BC; int mFramesBuffered; // 0x2C0 + static bool mUseLockedCache, mShowParticle, mShowAssetName; + static void SyncFree(void*); }; void RndGXBegin(_GXPrimitive prim, _GXVtxFmt fmt, unsigned short verts); diff --git a/src/system/world/CameraShot.h b/src/system/world/CameraShot.h index 3f0321b0..a3d8afb8 100644 --- a/src/system/world/CameraShot.h +++ b/src/system/world/CameraShot.h @@ -110,6 +110,8 @@ class CamShot : public RndAnimatable { bool mLooping : 1; // 0x120 >> 7 bool mUseDepthOfField : 1; // 0x120 >> 6 & 1 bool mPS3PerPixel : 1; // 0x120 >> 5 & 1 + + static void Init(); }; #endif diff --git a/src/system/world/ColorPalette.h b/src/system/world/ColorPalette.h index 1706d2b4..31e4c4bd 100644 --- a/src/system/world/ColorPalette.h +++ b/src/system/world/ColorPalette.h @@ -2,6 +2,7 @@ #define WORLD_COLORPALETTE_H #include "obj/Object.h" #include "math/Color.h" +#include "utl/MemMgr.h" #include class ColorSet { @@ -11,6 +12,7 @@ class ColorSet { }; class ColorPalette : public Hmx::Object { + public: ColorPalette(); virtual ~ColorPalette(){} OBJ_CLASSNAME(ColorPalette); @@ -21,7 +23,9 @@ class ColorPalette : public Hmx::Object { virtual void Copy(const Hmx::Object*, Hmx::Object::CopyType); virtual void Load(BinStream&); - DECLARE_REVS; + NEW_OVERLOAD + DECLARE_REVS + NEW_OBJ(ColorPalette) std::vector mColors; }; diff --git a/src/system/world/Dir.h b/src/system/world/Dir.h index eee33d77..f6fa2f3d 100644 --- a/src/system/world/Dir.h +++ b/src/system/world/Dir.h @@ -28,6 +28,7 @@ class WorldDir : public PanelDir { virtual bool DrawShowingBudget(float); NEW_OBJ(WorldDir) + static void Init(); ObjList mPresetOverrides; // 0x1d8 - WorldDir::PresetOverride ObjList mBitmapOverrides; // 0x1e4 - WorldDir::BitmapOverride diff --git a/src/system/world/Instance.h b/src/system/world/Instance.h index 76f4d93d..902fc78d 100644 --- a/src/system/world/Instance.h +++ b/src/system/world/Instance.h @@ -34,6 +34,9 @@ class WorldInstance : public RndDir { ObjDirPtr unk18c; int unk198; int unk19c; + + NEW_OVERLOAD + NEW_OBJ(WorldInstance) }; class SharedGroup : public RndPollable { diff --git a/src/system/world/LightHue.h b/src/system/world/LightHue.h index b685190c..4ae7c37c 100644 --- a/src/system/world/LightHue.h +++ b/src/system/world/LightHue.h @@ -21,12 +21,15 @@ class LightHue : public Hmx::Object { void Sync(); - DECLARE_REVS; + DECLARE_REVS FileLoader* mLoader; FilePath mPath; Keys mKeys; + NEW_OVERLOAD + NEW_OBJ(LightHue) + }; #endif diff --git a/src/system/world/LightPreset.h b/src/system/world/LightPreset.h index 9f13b9f8..d70663f5 100644 --- a/src/system/world/LightPreset.h +++ b/src/system/world/LightPreset.h @@ -1,5 +1,6 @@ #ifndef WORLD_LIGHTPRESET_H #define WORLD_LIGHTPRESET_H +#include "obj/Object.h" #include "rndobj/Anim.h" #include "rndobj/EventTrigger.h" #include "obj/ObjVector.h" @@ -73,6 +74,9 @@ class LightPreset : public RndAnimatable { float unk98; float unk9c; LightHue* mHue; // 0xa0 + + NEW_OVERLOAD + NEW_OBJ(LightPreset) }; #endif diff --git a/src/system/world/SpotlightDrawer.h b/src/system/world/SpotlightDrawer.h index 7c57edd2..b6bbe7bb 100644 --- a/src/system/world/SpotlightDrawer.h +++ b/src/system/world/SpotlightDrawer.h @@ -71,6 +71,8 @@ class SpotlightDrawer : public RndDrawable, public PostProcessor { static std::vector sCans; static std::vector sShadowSpots; + static void Init(); + SpotDrawParams mParams; }; diff --git a/src/system/world/SpotlightEnder.h b/src/system/world/SpotlightEnder.h index 9368cf3a..5131c045 100644 --- a/src/system/world/SpotlightEnder.h +++ b/src/system/world/SpotlightEnder.h @@ -1,5 +1,6 @@ #ifndef WORLD_SPOTLIGHTENDER_H #define WORLD_SPOTLIGHTENDER_H +#include "obj/Object.h" #include "rndobj/Draw.h" class SpotlightEnder : public RndDrawable { @@ -15,8 +16,10 @@ class SpotlightEnder : public RndDrawable { virtual void DrawShowing(); virtual ~SpotlightEnder(); - DECLARE_REVS; - DELETE_OVERLOAD; + DECLARE_REVS + NEW_OVERLOAD + DELETE_OVERLOAD + NEW_OBJ(SpotlightEnder) }; #endif diff --git a/src/system/world/World.cpp b/src/system/world/World.cpp new file mode 100644 index 00000000..4785f45f --- /dev/null +++ b/src/system/world/World.cpp @@ -0,0 +1,25 @@ +#include "obj/Dir.h" +#include "obj/Object.h" +#include "world/CameraShot.h" +#include "world/ColorPalette.h" +#include "world/Dir.h" +#include "world/Instance.h" +#include "world/LightHue.h" +#include "world/LightPreset.h" +#include "world/SpotlightDrawer.h" +#include "world/SpotlightEnder.h" + +void WorldInit() { + WorldDir::Init(); + REGISTER_OBJ_FACTORY(ColorPalette) + //REGISTER_OBJ_FACTORY(EventAnim) + //REGISTER_OBJ_FACTORY(WorldCrowd) + CamShot::Init(); + //REGISTER_OBJ_FACTORY(WorldReflection) + REGISTER_OBJ_FACTORY(LightPreset) + REGISTER_OBJ_FACTORY(LightHue) + SpotlightDrawer::Init(); + REGISTER_OBJ_FACTORY(SpotlightEnder) + REGISTER_OBJ_FACTORY(WorldInstance) + PreloadSharedSubdirs("world"); +}