diff --git a/config/SZBE69_B8/objects.json b/config/SZBE69_B8/objects.json index d5afb136..a9503607 100644 --- a/config/SZBE69_B8/objects.json +++ b/config/SZBE69_B8/objects.json @@ -65,6 +65,8 @@ "network/net/JsonUtils.cpp": "NonMatching", + "network/ObjDup/DOFilter.cpp": "NonMatching", + "network/Plugins/ZLibPlugin.cpp": "Matching", "network/Plugins/JobGetPublicURL.cpp": "Matching", @@ -141,6 +143,7 @@ "system/bandobj/BandCamShot.cpp": "NonMatching", "system/bandobj/CrowdAudio.cpp": "NonMatching", "system/bandobj/NoteTube.cpp": "NonMatching", + "system/bandobj/StarDisplay.cpp": "NonMatching", "system/bandobj/VocalTrackDir.cpp": "NonMatching", "system/beatmatch/BaseGuitarTrackWatcherImpl.cpp": "NonMatching", @@ -444,6 +447,7 @@ "system/ui/UILabelDir.cpp": "NonMatching", "system/ui/UIList.cpp": "NonMatching", "system/ui/UIListArrow.cpp": "NonMatching", + "system/ui/UIListCustom.cpp": "NonMatching", "system/ui/UIListWidget.cpp": "NonMatching", "system/ui/UIPanel.cpp": "Matching", "system/ui/UIPicture.cpp": "NonMatching", diff --git a/src/band3/bandtrack/Gem.cpp b/src/band3/bandtrack/Gem.cpp index 72d911da..81b5e2d2 100644 --- a/src/band3/bandtrack/Gem.cpp +++ b/src/band3/bandtrack/Gem.cpp @@ -8,7 +8,7 @@ Gem::Gem(const GameGem& gg, unsigned int ui, float f1, float f2, bool b1, int i1 InitChordInfo(i2, b2); } -Gem::~Gem() { unk_0x30.clear(); } +Gem::~Gem() { mTails.clear(); } Gem& Gem::operator=(const Gem& g) { (GameGem&)(*mGameGem) = *(g.mGameGem); @@ -34,18 +34,18 @@ bool Gem::OnScreen(float) { bool Gem::UseRGChordStyle() const { bool r = false; - if (unk_0x4->IsRealGuitarChord() || unk_0x67_1 || unk_0x4->IsMuted()) r = true; + if (mGameGem->IsRealGuitarChord() || unk_0x67_1 || mGameGem->IsMuted()) r = true; return r; } void Gem::AddStrumInstance(Symbol s1, Symbol s2) { - if (unk_0x0 == NULL || unk_0x0->unk_0x0 == 0) return; - int lowString = unk_0x4->GetLowestString(); - int highString = unk_0x4->GetHighestString(); + if (mGemManager == NULL || mGemManager->unk_0x0 == 0) return; + int lowString = mGameGem->GetLowestString(); + int highString = mGameGem->GetHighestString(); MILO_ASSERT(lowString != -1, 572); MILO_ASSERT(highString != -1, 573); Symbol t0; - if (!unk_0x0->GetChordWidgetName(s1, s2, t0)) { + if (!mGemManager->GetChordWidgetName(s1, s2, t0)) { MILO_WARN("could not find widget for %s for %s chord gem in %s", t0, s1, s2); return; } @@ -66,7 +66,7 @@ void Gem::Release() { } void Gem::KillDuration() { - for (int i = 0; i < unk_0x30.size(); i++) unk_0x30[i]->Done(); + for (int i = 0; i < mTails.size(); i++) mTails[i]->Done(); } void Gem::Reset() { diff --git a/src/band3/bandtrack/Gem.h b/src/band3/bandtrack/Gem.h index 5a8b7670..4838587a 100644 --- a/src/band3/bandtrack/Gem.h +++ b/src/band3/bandtrack/Gem.h @@ -40,8 +40,7 @@ class Gem { void SetFretPos(int); void GetChordFretLabelInfo(String&, int&) const; - // GemManager* mGemManager; - int mGemManager; + GemManager* mGemManager; const GameGem* mGameGem; std::set mWidgets; float mStart, mEnd, mTailStart; diff --git a/src/network/ObjDup/DOFilter.cpp b/src/network/ObjDup/DOFilter.cpp new file mode 100644 index 00000000..09a132d1 --- /dev/null +++ b/src/network/ObjDup/DOFilter.cpp @@ -0,0 +1,8 @@ +#include "DOFilter.h" + +namespace Quazal { + DOFilter::DOFilter() { } + DOFilter::~DOFilter() { } + int DOFilter::GetMinimumValidHandle() { return 0; } + int DOFilter::GetMaximumValidHandle() { return -1; } +} diff --git a/src/network/ObjDup/DOFilter.h b/src/network/ObjDup/DOFilter.h new file mode 100644 index 00000000..1f38eb8d --- /dev/null +++ b/src/network/ObjDup/DOFilter.h @@ -0,0 +1,15 @@ +#ifndef OBJDUP_DOFILTER_H +#define OBJDUP_DOFILTER_H + +#include "Platform/RefCountedObject.h" + +namespace Quazal { + class DOFilter : public RefCountedObject { + DOFilter(); + virtual ~DOFilter(); + virtual int GetMinimumValidHandle(); // these both return a struct + virtual int GetMaximumValidHandle(); + }; +} + +#endif // OBJDUP_DOFILTER_H diff --git a/src/system/bandobj/BandLabel.h b/src/system/bandobj/BandLabel.h new file mode 100644 index 00000000..b6419faa --- /dev/null +++ b/src/system/bandobj/BandLabel.h @@ -0,0 +1,10 @@ +#ifndef BANDOBJ_BANDLABEL_H +#define BANDOBJ_BANDLABEL_H + +#include "ui/UILabel.h" + +class BandLabel : public UILabel { + +}; + +#endif // BANDOBJ_BANDLABEL_H diff --git a/src/system/bandobj/StarDisplay.cpp b/src/system/bandobj/StarDisplay.cpp new file mode 100644 index 00000000..80f99b49 --- /dev/null +++ b/src/system/bandobj/StarDisplay.cpp @@ -0,0 +1,175 @@ +#include "StarDisplay.h" +#include "obj/ObjMacros.h" +#include "obj/Object.h" +#include "os/Debug.h" +#include "rndobj/Text.h" +#include "ui/UI.h" +#include "ui/UIComponent.h" +#include "utl/Symbol.h" +#include "utl/Symbols.h" +#include "utl/Symbols2.h" +#include "utl/Symbols3.h" + +INIT_REVS(StarDisplay) + +void StarDisplay::Init() { + Hmx::Object::RegisterFactory(StaticClassName(), NewObject); + TheUI->InitResources("StarDisplay"); +} + +StarDisplay::StarDisplay() : unk_0x114(0), unk_0x115(1), unk_0x116(0), mStars(5), unk_0x11C(5), + unk_0x120(RndText::kMiddleLeft), unk_0x124(gNullStr), unk_0x128(gNullStr) { + unk_0x10C = New(); + unk_0x110 = New(); + } +StarDisplay::~StarDisplay() { + delete unk_0x10C; + delete unk_0x110; +} + +BEGIN_COPYS(StarDisplay) + UIComponent::Copy(o,ty); +END_COPYS + +void StarDisplay::CopyMembers(const UIComponent* ui, Hmx::Object::CopyType ct) { + UIComponent::CopyMembers(ui, ct); + const StarDisplay* starDisplay = dynamic_cast(ui); + MILO_ASSERT(starDisplay, 62); + mStars = starDisplay->mStars; + unk_0x11C = starDisplay->unk_0x11C; + unk_0x114 = starDisplay->unk_0x114; + unk_0x115 = starDisplay->unk_0x115; + unk_0x116 = starDisplay->unk_0x116; + unk_0x120 = starDisplay->unk_0x120; + unk_0x124 = starDisplay->unk_0x124; + unk_0x128 = starDisplay->unk_0x128; +} + +SAVE_OBJ(StarDisplay, 86) + +BEGIN_LOADS(StarDisplay) + PreLoad(bs); + PostLoad(bs); +END_LOADS + +void StarDisplay::PreLoad(BinStream& bs) { + LOAD_REVS(bs) + ASSERT_REVS(6, 0) + if (gRev != 1) bs >> mStars; + bs >> unk_0x11C; + bs >> unk_0x114; + if (gRev >= 3) { + bs >> unk_0x115; + bs >> unk_0x116; + if (gRev < 5) { + int x = 0; bs >> x; + } + } + if (gRev >= 4) bs >> (int&)unk_0x120; + if (gRev == 5) { + String s; + bs >> s; + bs >> s; + } + if (gRev >= 6) { + bs >> unk_0x124; + bs >> unk_0x128; + } + UIComponent::PreLoad(bs); +} + +void StarDisplay::PostLoad(BinStream& bs) { + UIComponent::PostLoad(bs); + Update(); +} + +void StarDisplay::Enter() { UIComponent::Enter(); UpdateDisplay(); } + +Symbol StarDisplay::GetSymbolForStarCount(int i) { + switch (i) { + case 0: + return stars_0; + case 1: + return stars_1; + case 2: + return stars_2; + case 3: + return stars_3; + case 4: + return stars_4; + case 5: + return stars_5; + case 6: + return stars_6; + default: + MILO_FAIL("Number of stars is unsupported: stars = %i", i); + return gNullStr; + } +} + +int StarDisplay::GetStarCountForSymbol(Symbol s) { + int i = 0; + Symbol* s2; + do { + s2 = &GetSymbolForStarCount(i); + if (*s2 == s) return i; + } while (++i <= 6); + MILO_FAIL("can't set star display to token %s", s.Str()); + return 0; +} + +void StarDisplay::DrawShowing() { + ObjectDir* dir = mMesh->mDir.mDir; + MILO_ASSERT(dir, 312); + unk_0x10C->SetTransParent(this, false); + unk_0x10C->Draw(); + unk_0x110->SetTransParent(this, false); + unk_0x110->Draw(); + Transform* t; + if (mCache->mFlags & 1) t = &WorldXfm_Force(); + else t = &mWorldXfm; + SetWorldXfm(*t); +} + +void StarDisplay::SetValues(int st, int max) { mStars = st; unk_0x11C = max; UpdateDisplay(); } + +void StarDisplay::SetToToken(Symbol s) { mStars = GetStarCountForSymbol(s); UpdateDisplay(); } + +void StarDisplay::SetAlignment(RndText::Alignment a) { unk_0x120 = a; UpdateDisplay(); } + +void StarDisplay::SetForceMixedMode(bool b) { unk_0x114 = b; UpdateDisplay(); } + +void StarDisplay::SetShowDenominator(bool b) { unk_0x115 = b; UpdateDisplay(); } + +void StarDisplay::Update() { + UIComponent::Update(); + DataArray* typeDef = mTypeDef; + MILO_ASSERT(typeDef, 369); + ObjectDir* dir = mMesh->mDir.mDir; + MILO_ASSERT(dir, 372); + unk_0x10C->ResourceCopy(dir->Find(typeDef->FindArray(resource_stars_label, true)->Str(1), true)); + BandLabel* bl2 = dir->Find(typeDef->FindArray(resource_stars_mixed_label, true)->Str(1), true); + unk_0x110->ResourceCopy(bl2); + UpdateDisplay(); +} + +BEGIN_HANDLERS(StarDisplay) + HANDLE_ACTION(set_values, SetValues(_msg->Int(2), _msg->Int(3))) + HANDLE_ACTION(set_to_token, SetToToken(_msg->Sym(2))) + HANDLE_SUPERCLASS(UIComponent) + HANDLE_CHECK(391) +END_HANDLERS + +BEGIN_PROPSYNCS(StarDisplay) + SYNC_PROP_MODIFY(stars, mStars, UpdateDisplay()) + SYNC_PROP_MODIFY(total_stars, unk_0x11C, UpdateDisplay()) + SYNC_PROP_MODIFY(force_mixed_mode, unk_0x114, UpdateDisplay()) + SYNC_PROP_MODIFY(show_empty_stars, unk_0x116, UpdateDisplay()) + SYNC_PROP_MODIFY(show_denominator, unk_0x115, UpdateDisplay()) + SYNC_PROP_SET(alignment, unk_0x120, SetAlignment((RndText::Alignment)_val.Int(NULL))) + SYNC_PROP_MODIFY(icon_override, unk_0x124, UpdateDisplay()) + SYNC_PROP_MODIFY(empty_icon_override, unk_0x128, UpdateDisplay()) + SYNC_PROP_SET(float_stars, (float)mStars, SetValues(_val.Float(NULL), unk_0x11C)) + SYNC_PROP_SET(float_total_stars, (float)unk_0x11C, SetValues(mStars, _val.Float(NULL))) + SYNC_SUPERCLASS(UIComponent) +END_PROPSYNCS diff --git a/src/system/bandobj/StarDisplay.h b/src/system/bandobj/StarDisplay.h new file mode 100644 index 00000000..ba2fde68 --- /dev/null +++ b/src/system/bandobj/StarDisplay.h @@ -0,0 +1,50 @@ +#ifndef BANDOBJ_STARDISPLAY_H +#define BANDOBJ_STARDISPLAY_H + +#include "bandobj/BandLabel.h" +#include "obj/Data.h" +#include "obj/ObjMacros.h" +#include "rndobj/Text.h" +#include "ui/UIComponent.h" + +class StarDisplay : public UIComponent { + StarDisplay(); + virtual DataNode Handle(DataArray*, bool); + virtual bool SyncProperty(DataNode&, DataArray*, int, PropOp); + virtual ~StarDisplay(); + OBJ_CLASSNAME(StarDisplay) + OBJ_SET_TYPE(StarDisplay) + virtual void Copy(const Hmx::Object*, Hmx::Object::CopyType); + virtual void CopyMembers(const UIComponent*, Hmx::Object::CopyType); + virtual void Save(BinStream&); + virtual void Load(BinStream&); + virtual void PreLoad(BinStream&); + virtual void PostLoad(BinStream&); + virtual void Update(); + virtual void Enter(); + + void SetValues(int, int); + void SetToToken(Symbol); + void UpdateDisplay(); + void DrawShowing(); + + static Symbol GetSymbolForStarCount(int); + static int GetStarCountForSymbol(Symbol); + static void Init(); + + DECLARE_REVS + NEW_OBJ(StarDisplay) + + BandLabel* unk_0x10C; // 0x10C + BandLabel* unk_0x110; // 0x110 + bool unk_0x114; void SetForceMixedMode(bool); // 0x114 + bool unk_0x115; void SetShowDenominator(bool b); // 0x115 + bool unk_0x116; // 0x116 + int mStars; // 0x118 + int unk_0x11C; // 0x11C + RndText::Alignment unk_0x120; void SetAlignment(RndText::Alignment); // 0x120 + Symbol unk_0x124; // 0x124 + Symbol unk_0x128; // 0x128 +}; + +#endif // BANDOBJ_STARDISPLAY_H diff --git a/src/system/char/CharInterest.cpp b/src/system/char/CharInterest.cpp index 6728332d..98def7a9 100644 --- a/src/system/char/CharInterest.cpp +++ b/src/system/char/CharInterest.cpp @@ -1,5 +1,13 @@ #include "char/CharInterest.h" #include "math/MathFuncs.h" +#include "obj/Data.h" +#include "obj/ObjMacros.h" +#include "obj/PropSync_p.h" +#include "rndobj/Trans.h" +#include "utl/Symbols2.h" +#include "utl/Symbols4.h" + +INIT_REVS(CharInterest) CharInterest::CharInterest() : mMaxViewAngle(20.0f), mPriority(1.0f), mMinLookTime(1.0f), mMaxLookTime(3.0f), mRefractoryPeriod(6.1f), mDartOverride(this, 0), mCategoryFlags(0), mOverrideMinTargetDistance(0), mMinTargetDistanceOverride(35.0f) { SyncMaxViewAngle(); @@ -15,6 +23,67 @@ void CharInterest::SyncMaxViewAngle(){ SAVE_OBJ(CharInterest, 0x52); +BEGIN_LOADS(CharInterest) + LOAD_REVS(bs) + ASSERT_REVS(6, 0) + LOAD_SUPERCLASS(Hmx::Object) + LOAD_SUPERCLASS(RndTransformable) + bs >> mMaxViewAngle; + bs >> mPriority; + bs >> mMinLookTime; + bs >> mMaxLookTime; + bs >> mRefractoryPeriod; + u32 temp = gRev + 0x10000; + if (u16(temp - 2) <= 3) { + ObjPtr obj(this, NULL); + bs >> obj; + } else if (temp > 5) { bs >> mDartOverride; } + if (gRev > 2) { + bs >> mCategoryFlags; + if (gRev == 3) { + u8 x; + bs >> x; + } + } + if (gRev > 4) { + bs >> mOverrideMinTargetDistance; + bs >> mMinTargetDistanceOverride; + } + SyncMaxViewAngle(); +END_LOADS + +BEGIN_COPYS(CharInterest) + COPY_SUPERCLASS(Hmx::Object) + COPY_SUPERCLASS(RndTransformable) + CREATE_COPY(CharInterest) + BEGIN_COPYING_MEMBERS + COPY_MEMBER(mMaxViewAngle) + COPY_MEMBER(mPriority) + COPY_MEMBER(mMinLookTime) + COPY_MEMBER(mMaxLookTime) + COPY_MEMBER(mRefractoryPeriod) + COPY_MEMBER(mDartOverride) + COPY_MEMBER(mCategoryFlags) + COPY_MEMBER(mOverrideMinTargetDistance) + COPY_MEMBER(mMinTargetDistanceOverride) + SyncMaxViewAngle(); + END_COPYING_MEMBERS +END_COPYS + +BEGIN_PROPSYNCS(CharInterest) + SYNC_PROP_MODIFY(max_view_angle, mMaxViewAngle, SyncMaxViewAngle()) + SYNC_PROP(priority, mPriority) + SYNC_PROP(min_look_time, mMinLookTime) + SYNC_PROP(max_look_time, mMaxLookTime) + SYNC_PROP(refractory_period, mRefractoryPeriod) + SYNC_PROP(dart_ruleset_override, mDartOverride) + SYNC_PROP_STATIC("category_flags", mCategoryFlags) + SYNC_PROP(overrides_min_target_dist, mOverrideMinTargetDistance) + SYNC_PROP(min_target_dist_override, mMinTargetDistanceOverride) + + SYNC_SUPERCLASS(RndTransformable) +END_PROPSYNCS + BEGIN_HANDLERS(CharInterest) HANDLE_SUPERCLASS(RndTransformable) HANDLE_SUPERCLASS(Hmx::Object) diff --git a/src/system/char/CharInterest.h b/src/system/char/CharInterest.h index e27d591b..68ebeee3 100644 --- a/src/system/char/CharInterest.h +++ b/src/system/char/CharInterest.h @@ -1,5 +1,6 @@ #ifndef CHAR_CHARINTEREST_H #define CHAR_CHARINTEREST_H +#include "obj/ObjMacros.h" #include "rndobj/Trans.h" #include "obj/ObjPtr_p.h" #include "char/CharEyeDartRuleset.h" @@ -23,16 +24,18 @@ class CharInterest : public RndTransformable { void SyncMaxViewAngle(); - float mMaxViewAngle; - float mPriority; - float mMinLookTime; - float mMaxLookTime; - float mRefractoryPeriod; - ObjPtr mDartOverride; - int mCategoryFlags; - bool mOverrideMinTargetDistance; - float mMinTargetDistanceOverride; - float mMaxViewAngleCos; + float mMaxViewAngle; // 0x90 + float mPriority; // 0x94 + float mMinLookTime; // 0x98 + float mMaxLookTime; // 0x9C + float mRefractoryPeriod; // 0xA0 + ObjPtr mDartOverride; // 0xA4 + int mCategoryFlags; // 0xB0 + bool mOverrideMinTargetDistance; // 0xB4 + float mMinTargetDistanceOverride; // 0xB8 + float mMaxViewAngleCos; // 0xBC + + DECLARE_REVS }; #endif diff --git a/src/system/math/Vec.h b/src/system/math/Vec.h index 4dc7a201..9788d074 100644 --- a/src/system/math/Vec.h +++ b/src/system/math/Vec.h @@ -8,6 +8,10 @@ class Vector2 { Vector2(){} Vector2(float xx, float yy) : x(xx), y(yy) {} void Set(float xx, float yy){ x = xx; y = yy; } + Vector2& operator*(float f) { + x *= f; y *= f; + return *this; + } float x; float y; }; @@ -71,7 +75,7 @@ class Vector3 { return *this; } - // float& operator[](int i){ return this + i; } + float& operator[](int i); // { return this + i; } // bool operator==(const Vector3 &) const; // bool operator!=(const Vector3 &) const; }; diff --git a/src/system/midi/MidiParser.cpp b/src/system/midi/MidiParser.cpp index 9d54d658..c980c682 100644 --- a/src/system/midi/MidiParser.cpp +++ b/src/system/midi/MidiParser.cpp @@ -56,7 +56,7 @@ MidiParser::~MidiParser(){ } void MidiParser::SetTypeDef(DataArray* arr){ - if(mTypeDef != arr){ + if(typeDef != arr){ Hmx::Object::SetTypeDef(arr); mInverted = false; mTrackName = Symbol(""); diff --git a/src/system/obj/MessageTimer.h b/src/system/obj/MessageTimer.h index e3214125..ec54d7ae 100644 --- a/src/system/obj/MessageTimer.h +++ b/src/system/obj/MessageTimer.h @@ -1,23 +1,22 @@ #ifndef OBJ_MESSAGETIMER_H #define OBJ_MESSAGETIMER_H #include "os/Timer.h" -#include "obj/Object.h" #include "utl/Symbol.h" class MessageTimer { public: Timer mTimer; - Hmx::Object* mObject; + class Hmx::Object* mObject; Symbol mMessage; static bool sActive; - MessageTimer(Hmx::Object* o, Symbol message) : mTimer(), mObject(o), mMessage(message) { mTimer.Restart(); } + MessageTimer(class Hmx::Object* o, Symbol message) : mTimer(), mObject(o), mMessage(message) { mTimer.Restart(); } ~MessageTimer(){ AddTime(mObject, mMessage, mTimer.SplitMs()); } static bool Active(){ return sActive; } - static void AddTime(Hmx::Object* o, Symbol msg, float ms); + static void AddTime(class Hmx::Object* o, Symbol msg, float ms); }; #endif diff --git a/src/system/obj/ObjMacros.h b/src/system/obj/ObjMacros.h index d08fe144..c1a4c1d5 100644 --- a/src/system/obj/ObjMacros.h +++ b/src/system/obj/ObjMacros.h @@ -1,11 +1,10 @@ #ifndef OBJ_OBJMACROS_H #define OBJ_OBJMACROS_H -#include "obj/Object.h" #include "os/System.h" #include "obj/PropSync_p.h" #include "obj/MessageTimer.h" -const char* PathName(const Hmx::Object*); +const char* PathName(const class Hmx::Object*); // BEGIN CLASSNAME MACRO ------------------------------------------------------------------------------- @@ -282,6 +281,16 @@ void objType::Load(BinStream& bs){ MILO_FAIL("%s can't load new %s version %d > %d", PathName(this), ClassName(), ver, rev_name); \ } +#define ASSERT_OLD_REV(ver) \ + if (gRev < ver) { \ + MILO_FAIL("%s can't load old %s version %d < %d. Use RB2 Milo to load.", PathName(this), ClassName(), gRev, (unsigned short)ver); \ + } + +#define ASSERT_OLD_ALTREV(ver) \ + if (gRev < ver) { \ + MILO_FAIL("%s can't load old %s alt version %d < %d. Use RB2 Milo to load.", PathName(this), ClassName(), gAltRev, (unsigned short)ver); \ + } + #define LOAD_SUPERCLASS(parent) \ parent::Load(bs); @@ -295,14 +304,14 @@ void objType::Load(BinStream& bs){ #define ADD_NOTIFS \ namespace {\ bool AddToNotifies(const char* str, std::list& list){\ - if(list.size() > 0x10) return false;\ - for(std::list::iterator it = list.begin(); it != list.end(); it++){\ - bool strFound = !strcmp(it->c_str(), str);\ - if(strFound) return false;\ - }\ - list.push_back(str);\ - return true;\ - }\ + if(list.size() > 0x10) return false; \ + for(std::list::iterator it = list.begin(); it != list.end(); it++){ \ + bool found = strcmp(it->c_str(), str); \ + if(!found) return false; \ + } \ + list.push_back(str); \ + return true; \ + } \ } // END ADDTONOTIFIES MACRO ----------------------------------------------------------------------------- diff --git a/src/system/os/Endian.h b/src/system/os/Endian.h index eef798b2..160affd7 100644 --- a/src/system/os/Endian.h +++ b/src/system/os/Endian.h @@ -1,10 +1,11 @@ #ifndef OS_ENDIAN_H #define OS_ENDIAN_H +#include "types.h" template void EndianSwapEq(T&); template<> void EndianSwapEq(unsigned int& i){ - i = 69; + i = i >> 0x18 | i << 0x18 | i >> 8 & 0xFF00 | (i & 0xFF00) << 8; } template<> void EndianSwapEq(short& s){ @@ -24,8 +25,10 @@ inline unsigned int EndianSwap(unsigned int i){ // the asm for this is inlined, it's in BinStream::ReadEndian and WriteEndian // could also find the standalone function asm in RB3 retail -inline unsigned long long EndianSwap(unsigned long long ull){ - return 0; +inline u64 EndianSwap(u64 ull){ + u32 hi = (ull >> 56) | (ull >> 48 | 0xFF00) | (ull >> 40 | 0xFF0000) | (ull >> 32 | 0xFF000000); + u64 lo = (ull >> 24 | 0xFF00000000) | (ull >> 16 | 0xFF0000000000) | (ull >> 8 | 0xFF000000000000) | (ull | 0xFF00000000000000); + return hi | lo; } #endif diff --git a/src/system/rndobj/Cam.cpp b/src/system/rndobj/Cam.cpp index a509b895..20c8fcbb 100644 --- a/src/system/rndobj/Cam.cpp +++ b/src/system/rndobj/Cam.cpp @@ -17,7 +17,7 @@ Transform sFlipYZ; ADD_NOTIFS -void RndCam::WorldToScreen(const Vector3& w, Vector2& s) const { +float RndCam::WorldToScreen(const Vector3& w, Vector2& s) const { s = mZRange; } diff --git a/src/system/rndobj/Cam.h b/src/system/rndobj/Cam.h index 7f36c766..e1b57a02 100644 --- a/src/system/rndobj/Cam.h +++ b/src/system/rndobj/Cam.h @@ -26,7 +26,7 @@ class RndCam : public RndTransformable { void SetFrustum(float, float, float, float); void SetTargetTex(RndTex*); - void WorldToScreen(const Vector3&, Vector2&) const; + float WorldToScreen(const Vector3&, Vector2&) const; void UpdateLocal(); DataNode OnSetFrustum(const DataArray*); DataNode OnSetZRange(const DataArray*); diff --git a/src/system/rndobj/Graph.cpp b/src/system/rndobj/Graph.cpp index 7aa27f69..1a9bb1c0 100644 --- a/src/system/rndobj/Graph.cpp +++ b/src/system/rndobj/Graph.cpp @@ -1,10 +1,14 @@ #include "rndobj/Graph.h" #include "obj/Data.h" #include "obj/DataFunc.h" +#include "rndobj/DOFProc.h" +#include "rndobj/Utl.h" #include RndGraph* sOneFrame; std::list* sGraphs; +std::list sFakes; +ObjPtr sCam(NULL, NULL); static DataNode OnGraphReset(DataArray*) { RndGraph::ResetAll(); @@ -13,7 +17,7 @@ static DataNode OnGraphReset(DataArray*) { void RndGraph::Init() { sGraphs = new std::list; - TheDebug.mExitCallbacks.push_back(RndGraph::Terminate); + TheDebug.mExitCallbacks.push_back(RndGraph::Terminate); DataRegisterFunc("graph_reset", OnGraphReset); } @@ -24,6 +28,34 @@ void RndGraph::Terminate() { sOneFrame = 0; } +void RndGraph::ResetAll() { + delete sOneFrame; + sOneFrame = NULL; + sGraphs->empty(); +} + +void RndGraph::SetCamera(RndCam* c) { sCam = c; } + +RndGraph* RndGraph::GetOneFrame() { + if (sOneFrame == NULL) sOneFrame = new RndGraph(NULL); + return sOneFrame; +} + +void RndGraph::Free(const void* id, bool b) { + if (sGraphs == NULL) return; + for (std::list::reverse_iterator it = sGraphs->rbegin(); it != sGraphs->rend(); it++) { + if (it->mId == id) { + delete &(*it); return; + } + } + for (std::list::iterator it = sFakes.begin(); it != sFakes.end(); it++) { + if (&(*it) == id) { + delete &(*it); return; + } + } + if (b) MILO_WARN("could not find line graph %x to free\n", (int)id); +} + RndGraph::RndGraph(const void* cv) : mEnable(1), mDrawFixedZ(0), mZ(0.0f), mId((void*)cv) { } @@ -66,3 +98,21 @@ void RndGraph::AddString(const char* cc, const Vector2& vec, const Hmx::Color& c void RndGraph::AddString3D(const char* text, const Vector3& worldPos, const Hmx::Color& col){ if(mEnable) mStuff.push_back(new DrawString3D(text, worldPos, col)); } + +void DrawString3D::DrawFixedZ(float) { Draw(); } + +void DrawString3D::Draw() { UtilDrawString(mText.c_str(), mPos, mCol); } + +void DrawString::DrawFixedZ(float) { Draw(); } + +void DrawString::Draw() { TheRnd->DrawString(mText.c_str(), mPos, mCol, true); } + +void DrawSphere::DrawFixedZ(float f) { UtilDrawSphere(Vector3(mCenter.X(), mCenter.Z(), f), mRadius, mCol); } + +void DrawSphere::Draw() { UtilDrawSphere(mCenter, mRadius, mCol); } + +void Line::DrawFixedZ(float f) { + TheRnd->DrawLine(Vector3(mA.X(), mA.Y(), f), Vector3(mB.X(), mB.Y(), f), mCol, mZBuf); +} + +void Line::Draw() { TheRnd->DrawLine(mA, mB, mCol, mZBuf); } diff --git a/src/system/rndobj/Graph.h b/src/system/rndobj/Graph.h index 03f32381..d4d7533d 100644 --- a/src/system/rndobj/Graph.h +++ b/src/system/rndobj/Graph.h @@ -3,8 +3,9 @@ #include #include "math/Vec.h" #include "math/Color.h" -#include "utl/Str.h" #include "obj/Object.h" +#include "rndobj/Cam.h" +#include "utl/Str.h" class Drawable { public: @@ -85,6 +86,13 @@ class RndGraph { static void Terminate(); static void ResetAll(); static RndGraph* Get(const void*); + static void Free(const void*, bool); + static void SetCamera(RndCam*); + static RndGraph* GetOneFrame(); +}; + +class FakeGraph { + }; #endif diff --git a/src/system/rndobj/Mat.cpp b/src/system/rndobj/Mat.cpp index f5be4492..170621a8 100644 --- a/src/system/rndobj/Mat.cpp +++ b/src/system/rndobj/Mat.cpp @@ -1,7 +1,8 @@ #include "rndobj/Mat.h" +#include "obj/ObjMacros.h" #include "obj/Object.h" -MatShaderOptions::MatShaderOptions() : b(0), i4(1), i1(1) { +MatShaderOptions::MatShaderOptions() : i4(1), i1(1), b(0) { } @@ -17,3 +18,35 @@ RndMat::RndMat() : mDiffuseTex(this, 0), mAlphaThresh(0), mNextPass(this, 0), mE } SAVE_OBJ(RndMat, 159) + +bool RndMat::IsNextPass(RndMat* m) { + RndMat* m2; + while (m2 != NULL){ + if (m2 == m) return true; + m2 = m2->mNextPass; + } + return false; +} + +BEGIN_LOADS(RndMat) + LOAD_REVS(bs) + ASSERT_REVS(68, 0) // SIXTY EIGHT??? + ASSERT_OLD_REV(25) + Hmx::Object::Load(bs); + int x; bs >> x; + mBlend = (Blend)x; + bs >> mColor; + bool y; bs >> y; + mColorAdjust = y; + + + bs >> mRefractNormalMap; + if (gRev < 0x41) { + mRefractStrength *= 0.15; + } else mRefractStrength = 0; +END_LOADS + + +BEGIN_PROPSYNCS(RndMat) + if (sym == "intensify") { bool x = mIntensify; return PropSync(x, _val, _prop, _i + 1, _op); } +END_PROPSYNCS diff --git a/src/system/rndobj/Mat.h b/src/system/rndobj/Mat.h index 620758d1..2e9d3a47 100644 --- a/src/system/rndobj/Mat.h +++ b/src/system/rndobj/Mat.h @@ -60,15 +60,15 @@ struct MatPerfSettings { struct MatShaderOptions { MatShaderOptions(); - int itop : 24; - int i7 : 1; - int i6 : 1; - int i5 : 1; - int i4 : 1; - int i3 : 1; - int i2 : 1; - int i1 : 1; - int i0 : 1; + uint itop : 24; + uint i7 : 1; + uint i6 : 1; + uint i5 : 1; + uint i4 : 1; + uint i3 : 1; + uint i2 : 1; + uint i1 : 1; + uint i0 : 1; bool b; }; @@ -84,6 +84,8 @@ class RndMat : public Hmx::Object { virtual void Copy(const Hmx::Object*, Hmx::Object::CopyType); virtual void Load(BinStream&); + bool IsNextPass(RndMat*); + NEW_OVERLOAD NEW_OBJ(RndMat) static void Init(){ @@ -102,22 +104,23 @@ class RndMat : public Hmx::Object { std::vector unk98; MatPerfSettings unka0; MatShaderOptions unka4; - bool mIntensify : 1; - bool mUseEnviron : 1; - bool mPreLit : 1; - bool mAlphaCut : 1; - bool mAlphaWrite : 1; - bool mCull : 1; - bool mPerPixelLit : 1; - bool mScreenAligned : 1; + bool mIntensify : 1; // 0xa9?_0 + bool mUseEnviron : 1; // 0xa9_1 + bool mPreLit : 1; // 0xa9_2 + bool mAlphaCut : 1; // 0xa9_3 + bool mAlphaWrite : 1; // 0xa9_4 + bool mCull : 1; // 0xa9_5 + bool mPerPixelLit : 1; // 0xa9_6 + bool mScreenAligned : 1; // 0xa9_7 - bool mRefractEnabled : 1; + bool mRefractEnabled : 1; // 0xaa_0 bool mPointLights : 1; bool mFog : 1; bool mFadeout : 1; bool mColorAdjust : 1; + bool unk_0xaa_5 : 3; - Blend mBlend : 8; + Blend mBlend : 8; // 0xac TexGen mTexGen : 8; // unkac also has mBlend, texgen but bit shifted? // blend = (int)(*(uint *)(this + 0xac) << 0x10 | *(uint *)(this + 0xac) >> 0x10) >> 0x18 diff --git a/src/system/rndobj/Set.cpp b/src/system/rndobj/Set.cpp index 7d30ffc0..2ca50ecd 100644 --- a/src/system/rndobj/Set.cpp +++ b/src/system/rndobj/Set.cpp @@ -20,10 +20,10 @@ bool RndSet::AllowedObject(Hmx::Object* o){ } void RndSet::SetTypeDef(DataArray* arr){ - if(mTypeDef != arr){ + if(typeDef != arr){ Hmx::Object::SetTypeDef(arr); if(arr){ - DataArray* cfg = mTypeDef->FindArray("editor", true); + DataArray* cfg = typeDef->FindArray("editor", true); mProps.resize(cfg->Size() - 1); for(int i = 1; i < cfg->Size(); i++){ const DataArray* thisArr = cfg->Array(i); diff --git a/src/system/rndobj/Trans.cpp b/src/system/rndobj/Trans.cpp index d6aafbda..d2abc558 100644 --- a/src/system/rndobj/Trans.cpp +++ b/src/system/rndobj/Trans.cpp @@ -1,5 +1,12 @@ #include "rndobj/Trans.h" #include "math/Rot.h" +#include "obj/Data.h" +#include "obj/Dir.h" +#include "obj/ObjMacros.h" +#include "obj/ObjPtr_p.h" +#include "obj/Object.h" +#include "obj/PropSync_p.h" +#include "os/Debug.h" #include "rndobj/Utl.h" #include "utl/Symbols.h" @@ -99,6 +106,28 @@ void RndTransformable::Highlight(){ SAVE_OBJ(RndTransformable, 586) +BEGIN_LOADS(RndTransformable) + LOAD_REVS(bs) + ASSERT_REVS(9, 0) + if (ClassName() == StaticClassName()) Hmx::Object::Load(bs); + if (gLoadingProxyFromDisk) { + Transform t; + bs >> t >> t; + } else { + bs >> mLocalXfm >> mWorldXfm; + } + if (gRev < 9) { + ObjPtrList l(this, kObjListNoNull); + bs >> l; + for (ObjPtrList::iterator it = l.begin(); it != l.end(); ++it) { + (*it)->SetTransParent(this, false); + } + } + + + if (TransConstraint() == kParentWorld) SetTransParent(mTarget, false); +END_LOADS + #pragma push #pragma dont_inline on BEGIN_HANDLERS(RndTransformable) @@ -133,6 +162,54 @@ BEGIN_HANDLERS(RndTransformable) END_HANDLERS #pragma pop +DataNode RndTransformable::OnGetWorldPos(const DataArray* da) { + Transform* t; + if (mCache->mFlags & 1) t = &WorldXfm_Force(); + else t = &mWorldXfm; + *da->Var(2) = t->v.X(); + if (mCache->mFlags & 1) t = &WorldXfm_Force(); + else t = &mWorldXfm; + *da->Var(3) = t->v.Y(); + if (mCache->mFlags & 1) t = &WorldXfm_Force(); + else t = &mWorldXfm; + *da->Var(4) = t->v.Z(); + return DataNode(); +} + +DataNode RndTransformable::OnGetLocalPos(const DataArray* da) { + *da->Var(2) = mLocalXfm.v.X(); + *da->Var(3) = mLocalXfm.v.Y(); + *da->Var(4) = mLocalXfm.v.Z(); + return DataNode(); +} + +DataNode RndTransformable::OnGetLocalPosIndex(const DataArray* a) { + MILO_ASSERT(a->Int(2) < 3, 896); + return DataNode(mLocalXfm.v[a->Int(2)]); +} + +DataNode RndTransformable::OnSetLocalPos(const DataArray* da) { + mLocalXfm.v.Set(da->Float(2), da->Float(3), da->Float(4)); + mCache->SetDirty(); + return DataNode(); +} + +DataNode RndTransformable::OnSetLocalPosIndex(const DataArray* a) { + MILO_ASSERT(a->Int(2) < 3, 943); + mLocalXfm.v[a->Int(2)] = a->Float(3); + mCache->SetDirty(); +} + +void RndTransformable::SetLocalRot(Vector3) { + +} + +DataNode RndTransformable::OnSetLocalRot(const DataArray* da) { + Vector3 v(da->Float(2), da->Float(3), da->Float(4)); + SetLocalRot(v); + return DataNode(); +} + BEGIN_PROPSYNCS(RndTransformable) SYNC_PROP_SET(trans_parent, mParent, SetTransParent(_val.Obj(0), true)) SYNC_PROP_SET(trans_constraint, mConstraint, SetTransConstraint((Constraint)_val.Int(0), mTarget, mPreserveScale)) diff --git a/src/system/rndobj/Trans.h b/src/system/rndobj/Trans.h index 76c11d9b..89bca10e 100644 --- a/src/system/rndobj/Trans.h +++ b/src/system/rndobj/Trans.h @@ -77,6 +77,7 @@ class RndTransformable : public virtual RndHighlightable { RndTransformable* TransParent() const; void DistributeChildren(bool, float); Transform& WorldXfm_Force(); + void SetLocalRot(Vector3); Transform& DirtyLocalXfm(){ mCache->SetDirty(); @@ -117,7 +118,7 @@ class RndTransformable : public virtual RndHighlightable { Transform mWorldXfm; // 0x4c DirtyCache* mCache; // 0x7c u16 mConstraint; Constraint TransConstraint() { return (Constraint) mConstraint; } // 0x80 - bool mPreserveScale; // 0x83 + bool mPreserveScale; // 0x82 ObjPtr mTarget; // 0x84 static ushort gRev; diff --git a/src/system/rndobj/Utl.cpp b/src/system/rndobj/Utl.cpp index c091ed08..e26b6f8e 100644 --- a/src/system/rndobj/Utl.cpp +++ b/src/system/rndobj/Utl.cpp @@ -6,11 +6,13 @@ #include "obj/Object.h" #include "os/Debug.h" #include "os/System.h" +#include "rndobj/Cam.h" #include "rndobj/Draw.h" #include "rndobj/Env.h" #include "rndobj/Group.h" #include "rndobj/Mesh.h" #include "rndobj/MultiMesh.h" +#include "rndobj/Rnd.h" #include "utl/Loader.h" #include @@ -44,6 +46,15 @@ void CalcBox(RndMesh* m, Box& b) { m->mOwner->mOwner; } +void UtilDrawString(const char* c, const Vector3& v, const Hmx::Color& col) { + Vector2 v2; + if (RndCam::sCurrent->WorldToScreen(v, v2) > 0) { + v2.x *= (float)TheRnd->mWidth; + v2.y *= (float)TheRnd->mHeight; + TheRnd->DrawString(c, v2, col, true); + } +} + void SortXfms(RndMultiMesh*, const Vector3&) { MILO_ASSERT(0, 3150); } diff --git a/src/system/rndobj/Utl.h b/src/system/rndobj/Utl.h index a5de7aad..3eca170d 100644 --- a/src/system/rndobj/Utl.h +++ b/src/system/rndobj/Utl.h @@ -9,6 +9,7 @@ float ConvertFov(float a, float b); void SetLocalScale(RndTransformable*, const Vector3&); void AttachMesh(RndMesh*, RndMesh*); void UtilDrawSphere(const Vector3&, float, const Hmx::Color&); +void UtilDrawString(const char*, const Vector3&, const Hmx::Color&); void UtilDrawAxes(const Transform&, float, const Hmx::Color&); void TransformKeys(class RndTransAnim*, const Transform&); void TestTextureSize(ObjectDir*, int, int, int, int, int); diff --git a/src/system/ui/ScrollSelect.h b/src/system/ui/ScrollSelect.h index eb8f9c98..9e5b8a9c 100644 --- a/src/system/ui/ScrollSelect.h +++ b/src/system/ui/ScrollSelect.h @@ -6,10 +6,11 @@ #include "utl/PoolAlloc.h" class ScrollSelect { + public: ScrollSelect(); virtual DataNode Handle(DataArray*, bool); virtual bool SyncProperty(DataNode&, DataArray*, int, PropOp); - virtual ~ScrollSelect(); + virtual ~ScrollSelect(){} virtual int SelectedAux() const = 0; virtual void SetSelectedAux(int) = 0; diff --git a/src/system/ui/UIComponent.cpp b/src/system/ui/UIComponent.cpp index e0bf2e12..2bb159ef 100644 --- a/src/system/ui/UIComponent.cpp +++ b/src/system/ui/UIComponent.cpp @@ -68,7 +68,7 @@ void UIComponent::SetTypeDef(DataArray* da) { } } } - if(mTypeDef != da){ + if(typeDef != da){ Hmx::Object::SetTypeDef(da); UpdateResource(); } diff --git a/src/system/ui/UIComponent.h b/src/system/ui/UIComponent.h index 9dc3b0e8..8765d7fe 100644 --- a/src/system/ui/UIComponent.h +++ b/src/system/ui/UIComponent.h @@ -70,7 +70,7 @@ class UIComponent : public RndDrawable, public RndTransformable, public RndPolla ObjPtr mNavDown; int test1; // 0xD0 int unk_0xD4; // 0xD4 - UIResource* mMesh; // 0xD8 + UIResource* mResource; // 0xD8 std::vector unk_0xDC; // 0xDC class String mResourceName; // 0xE4 ObjDirPtr mObjDir; // 0xF0 diff --git a/src/system/ui/UIList.cpp b/src/system/ui/UIList.cpp index 4d71b845..350e1b89 100644 --- a/src/system/ui/UIList.cpp +++ b/src/system/ui/UIList.cpp @@ -1,9 +1,99 @@ +#include "UIList.h" +#include "obj/ObjMacros.h" #include "obj/Object.h" #include "obj/ObjPtr_p.h" +#include "os/Debug.h" +#include "ui/UI.h" +#include "ui/UIComponent.h" +#include "ui/UIListArrow.h" +#include "ui/UITransitionHandler.h" +#include "utl/Loader.h" +#include #include "decomp.h" -// Here to test ObjPtrList -DECOMP_FORCEBLOCK(UIList, (ObjPtrList* plist, BinStream& bs), - bs >> *plist; -) +static bool gGCNewLists = true; +static bool gLoading = false; + +INIT_REVS(UIList) + +UIList::UIList() : UITransitionHandler(this), unk_0x140(0), unk_0x14C(this, this), unk_0x194(0), + unk_0x198(100), unk_0x19C(0), unk_0x1A0(0), unk_0x1A4(this, kObjListNoNull), + unk_0x1B4(this, kObjListNoNull), unk_0x1C4(this, kObjListNoNull), unk_0x1D4(0), unk_0x1D8(1), + unk_0x1DC(-1), unk_0x1E1(0), unk_0x1E2(0), unk_0x1E3(0), unk_0x1E4(0), unk_0x1E5(0), + unk_0x1E6(0), unk_0x1E7(0) {} + +UIList::~UIList() {} + +void UIList::Init() { + TheUI->InitResources("UIList"); + REGISTER_OBJ_FACTORY(UIList) + REGISTER_OBJ_FACTORY(UIListArrow) + REGISTER_OBJ_FACTORY(UIListCustom) + // REGISTER_OBJ_FACTORY(UIListDir) + // REGISTER_OBJ_FACTORY(UIListHighlight) + // REGISTER_OBJ_FACTORY(UIListLabel) + // REGISTER_OBJ_FACTORY(UIListMesh) + REGISTER_OBJ_FACTORY(UIListSlot) + // REGISTER_OBJ_FACTORY(UIListSubList) + REGISTER_OBJ_FACTORY(UIListWidget) +} + +BEGIN_COPYS(UIList) + CREATE_COPY_AS(UIList, l) + MILO_ASSERT(l, 103); + COPY_SUPERCLASS(UIList) +END_COPYS + +SAVE_OBJ(UIList, 138) + +BEGIN_LOADS(UIList) + PreLoad(bs); + PostLoad(bs); +END_LOADS + +void UIList::PreLoad(BinStream& bs) { + LOAD_REVS(bs) + ASSERT_REVS(19, 0) + PreLoadWithRev(bs, gRev); +} + +void UIList::PreLoadWithRev(BinStream& bs, int rev) { + mRev = rev; + if (mRev > 19) { + MILO_FAIL("%s can't load new %s version %d > %d", PathName(this), ClassName(), mRev, (unsigned short)19); + } + UIComponent::PreLoad(bs); +} + +void UIList::PostLoad(BinStream& bs) { + UIComponent::PostLoad(bs); + unk_0x1E7 = gGCNewLists; + + + if (mRev >= 12) bs >> unk_0x198; + if (mRev >= 14) bs >> unk_0x1D4; + if (mRev < 19) unk_0x1E2 = true; + else bs >> unk_0x1E2; + if (mRev >= 10) { + bs >> unk_0x1A4; + bs >> unk_0x1B4; + bs >> unk_0x1C4; + } + if (mRev >= 17) UITransitionHandler::LoadHandlerData(bs); + gLoading = false; + Update(); +} + +void UIList::Update() { + if (!gLoading) { + unk_0x1E6 = false; + UIComponent::Update(); + MILO_ASSERT(mResource && mResource->Dir(), 566); + if (unk_0x1E7) { + + } + + if (TheLoadMgr.EditMode()) Refresh(false); + } +} diff --git a/src/system/ui/UIList.h b/src/system/ui/UIList.h new file mode 100644 index 00000000..a4475560 --- /dev/null +++ b/src/system/ui/UIList.h @@ -0,0 +1,64 @@ +#ifndef UI_UILIST_H +#define UI_UILIST_H + +#include "obj/ObjMacros.h" +#include "obj/Object.h" +#include "types.h" +#include "ui/ScrollSelect.h" +#include "ui/UIComponent.h" +#include "ui/UILabel.h" +#include "ui/UIListProvider.h" +#include "ui/UIListState.h" +#include "ui/UITransitionHandler.h" +#include "utl/BinStream.h" +#include "utl/MemMgr.h" + +class UIList : public UIComponent, public UIListProvider, public ScrollSelect, public UIListStateCallback, public UITransitionHandler { + public: + UIList(); + virtual ~UIList(); + OBJ_CLASSNAME(UIList) + OBJ_SET_TYPE(UIList) + virtual void Copy(const Hmx::Object*, CopyType); + virtual void Save(BinStream&); + virtual void Load(BinStream&); + virtual void PreLoad(BinStream&); + virtual void PostLoad(BinStream&); + + virtual void Update(); + + virtual short NumData() const; + + virtual bool IsEmptyValue() const; + + virtual int SelectedAux() const; + virtual void SetSelectedAux(int); + + void PreLoadWithRev(BinStream&, int); + void Refresh(bool); + + int unk_0x140; + std::vector unk_0x144; + UIListState unk_0x14C; + int mRev; // 0x190 + int unk_0x194, unk_0x198, unk_0x19C, unk_0x1A0; + + + ObjPtrList unk_0x1A4; + ObjPtrList unk_0x1B4; + ObjPtrList unk_0x1C4; + float unk_0x1D4; + int unk_0x1D8; + float unk_0x1DC; + u8 unk_0x1E0, unk_0x1E1; + bool unk_0x1E2; + u8 unk_0x1E3, unk_0x1E4, unk_0x1E5, unk_0x1E6, unk_0x1E7; + + DELETE_OVERLOAD + DECLARE_REVS + + static void Init(); + NEW_OBJ(UIList) +}; + +#endif // UI_UILIST_H diff --git a/src/system/ui/UIListArrow.h b/src/system/ui/UIListArrow.h index 93e1ef1b..1fb0b734 100644 --- a/src/system/ui/UIListArrow.h +++ b/src/system/ui/UIListArrow.h @@ -35,6 +35,7 @@ class UIListArrow : public UIListWidget { DECLARE_REVS DELETE_OVERLOAD + NEW_OBJ(UIListArrow) }; diff --git a/src/system/ui/UIListCustom.cpp b/src/system/ui/UIListCustom.cpp new file mode 100644 index 00000000..968bf2b1 --- /dev/null +++ b/src/system/ui/UIListCustom.cpp @@ -0,0 +1,79 @@ +#include "UIListCustom.h" +#include "decomp.h" +#include "obj/ObjMacros.h" +#include "obj/Object.h" +#include "os/Debug.h" +#include "rndobj/Draw.h" +#include "rndobj/Trans.h" +#include "ui/UIComponent.h" +#include "ui/UILabel.h" +#include "ui/UIListProvider.h" +#include "ui/UIListSlot.h" +#include "utl/Symbols.h" + +INIT_REVS(UIListCustom) + +DECOMP_FORCEACTIVE(UIListCustom, __FILE__, "( 0) <= (display) && (display) < ( mElements.size())", "le") + +inline void UIListCustomElement::Draw(const Transform& tf, float, UIColor*, Box*) { + RndTransformable* t = dynamic_cast(mPtr); + MILO_ASSERT(t, 34); + t->SetWorldXfm(tf); + RndDrawable* d = dynamic_cast(mPtr); + MILO_ASSERT(d, 49); + d->Draw(); +} + +UIListCustom::UIListCustom() : mObject(this, NULL) {} + +void UIListCustom::SetObject(Hmx::Object* o) { + if (o) { + RndTransformable* is_t = dynamic_cast(o); + RndDrawable* is_d = dynamic_cast(o); + if (!is_t) MILO_WARN("Object is not transformable"); + if (!is_d) MILO_WARN("Object is not drawable"); + if (!is_t || !is_d) o = NULL; + } + mObject = o; +} + +void UIListCustom::CreateElement(UIList*) { + MILO_ASSERT(mObject, 105); + Hmx::Object* c = Hmx::Object::NewObject(mObject->ClassName()); + if (UIComponent* d = dynamic_cast(c)) { + d->ResourceCopy(dynamic_cast(mObject.mPtr)); + } else { + c->Copy(mObject.mPtr, kCopyDeep); + } + new UIListCustomElement(this, c); +} + +RndTransformable* UIListCustom::RootTrans() { return dynamic_cast(mObject.mPtr); } + +SAVE_OBJ(UIListCustom, 127) + +BEGIN_LOADS(UIListCustom) + LOAD_REVS(bs) + ASSERT_REVS(0, 0) + UIListSlot::Load(bs); + bs >> mObject; +END_LOADS + +BEGIN_COPYS(UIListCustom) + COPY_SUPERCLASS(UIListSlot) + CREATE_COPY_AS(UIListCustom, c) + MILO_ASSERT(c, 143); + COPY_MEMBER(mObject) +END_COPYS + +BEGIN_HANDLERS(UIListCustom) + HANDLE_SUPERCLASS(UIListSlot) + HANDLE_CHECK(149) +END_HANDLERS + +BEGIN_PROPSYNCS(UIListCustom) + SYNC_PROP_SET(object, mObject, SetObject(_val.GetObj(NULL))) + SYNC_SUPERCLASS(UIListSlot) +END_PROPSYNCS + +DECOMP_FORCEBLOCK(UIListCustom, (UIListCustomElement* ce), ce->Draw(Transform(), 0, NULL, NULL); ce->Poll();) diff --git a/src/system/ui/UIListCustom.h b/src/system/ui/UIListCustom.h new file mode 100644 index 00000000..cba4d13a --- /dev/null +++ b/src/system/ui/UIListCustom.h @@ -0,0 +1,46 @@ +#ifndef UI_UILISTCUSTOM_H +#define UI_UILISTCUSTOM_H + +#include "obj/Dir.h" +#include "obj/ObjMacros.h" +#include "obj/ObjPtr_p.h" +#include "obj/Object.h" +#include "rndobj/Trans.h" +#include "ui/UIComponent.h" +#include "ui/UIListProvider.h" +#include "ui/UIListSlot.h" + +class UIListCustomElement : public UIListSlotElement { + public: + UIListCustomElement(class UIListCustom* own, Hmx::Object* ptr) : mOwner(own), mPtr(ptr) {} + virtual ~UIListCustomElement() { delete mPtr; } + virtual void Fill(const UIListProvider& p, int i1, int i2) { p.Custom(i1, i2, mOwner, mPtr); } + virtual void Draw(const Transform&, float, UIColor*, Box*); + + class UIListCustom* mOwner; + Hmx::Object* mPtr; +}; + +class UIListCustom : public UIListSlot { +public: + UIListCustom(); + virtual DataNode Handle(DataArray*, bool); + virtual bool SyncProperty(DataNode&, DataArray*, int, PropOp); + OBJ_CLASSNAME(UIListCustom) + virtual ~UIListCustom() {} + OBJ_SET_TYPE(UIListCustom) + virtual void Save(BinStream&); + virtual void Copy(const Hmx::Object*, CopyType); + virtual void Load(BinStream&); + + void SetObject(Hmx::Object*); + void CreateElement(UIList*); + RndTransformable* RootTrans(); + + ObjPtr mObject; + + NEW_OBJ(UIListCustom) + DECLARE_REVS +}; + +#endif // UI_UILISTCUSTOM_H diff --git a/src/system/ui/UIListProvider.h b/src/system/ui/UIListProvider.h index f72a4f7a..8d2d318f 100644 --- a/src/system/ui/UIListProvider.h +++ b/src/system/ui/UIListProvider.h @@ -2,22 +2,13 @@ #define UI_UILISTPROVIDER_H #include "utl/Symbol.h" #include "ui/UIComponent.h" +#include "ui/UIColor.h" #include "ui/UIEnums.h" +#include "ui/UILabel.h" -// holy guacamole that's a lot of forward decs -class RndMesh; -class RndDir; class UIListLabel; -class UILabel; class UIListMesh; -class UIListSlot; class UIListSubList; -class UIListCustom; -class UIListWidget; -class UIColor; -namespace Hmx { - class Object; -} class UIListProvider { public: @@ -26,7 +17,7 @@ class UIListProvider { virtual void Text(int, int, UIListLabel*, UILabel*) const; virtual int Mat(int, int, UIListMesh*) const; // return type probably not an int, fix this virtual int Provider(int, int, UIListSubList*) const { return 0; } // return type also probably not an int - virtual void Custom(int, int, UIListCustom*, Hmx::Object*) const {} + virtual void Custom(int, int, class UIListCustom*, Hmx::Object*) const {} virtual void UpdateExtendedText(int, int, UILabel*) const; virtual void UpdateExtendedMesh(int, int, RndMesh*) const; virtual void UpdateExtendedCustom(int, int, Hmx::Object*) const; @@ -39,8 +30,8 @@ class UIListProvider { virtual float GapSize(int, int, int, int) const { return 0.0f; } virtual UIComponent::State ComponentStateOverride(int, int, UIComponent::State s) const { return s; } virtual UIListWidgetState ElementStateOverride(int, int, UIListWidgetState s) const { return s; } - virtual UIListWidgetState SlotElementStateOverride(int, int, UIListWidget*, UIListWidgetState s) const { return s; } - virtual UIColor* SlotColorOverride(int, int, UIListWidget*, UIColor* c) const { return c; } + virtual UIListWidgetState SlotElementStateOverride(int, int, class UIListWidget*, UIListWidgetState s) const { return s; } + virtual UIColor* SlotColorOverride(int, int, class UIListWidget*, UIColor* c) const { return c; } virtual void PreDraw(int, int, UIListSlot*) const {} virtual int SnappableAtOrBeforeData(int) const { return -1; } virtual bool IsSnappableAtData(int) const { return false; } diff --git a/src/system/ui/UIListSlot.h b/src/system/ui/UIListSlot.h new file mode 100644 index 00000000..f738a28e --- /dev/null +++ b/src/system/ui/UIListSlot.h @@ -0,0 +1,41 @@ +#ifndef UI_UILISTSLOT_H +#define UI_UILISTSLOT_H + +#include "UIListWidget.h" +#include "obj/ObjMacros.h" +#include "obj/Object.h" +#include "utl/MemMgr.h" +#include "utl/Str.h" +#include + +class UIListSlotElement { + public: + UIListSlotElement() {} + virtual ~UIListSlotElement() {} + virtual void Fill(const UIListProvider&, int, int) = 0; + virtual void Draw(const Transform&, float, UIColor*, Box*) = 0; + virtual void Poll() {} +}; + +class UIListSlot : public UIListWidget { +public: + UIListSlot(); + virtual DataNode Handle(DataArray*, bool); + virtual bool SyncProperty(DataNode&, DataArray*, int, PropOp); + OBJ_CLASSNAME(UIListSlot) + OBJ_SET_TYPE(UIListSlot) + virtual ~UIListSlot(); + virtual void Copy(const Hmx::Object*, CopyType); + virtual void Load(BinStream&); + + std::vector unk_0x40; + int unk_0x48, unk_0x4C; + String unk_0x50; + + DECLARE_REVS + DELETE_OVERLOAD + + NEW_OBJ(UIListSlot) +}; + +#endif // UI_UILISTSLOT_H diff --git a/src/system/ui/UIListState.h b/src/system/ui/UIListState.h index ae673fd4..b9d1eeb8 100644 --- a/src/system/ui/UIListState.h +++ b/src/system/ui/UIListState.h @@ -1,13 +1,31 @@ #ifndef UI_UILISTSTATE_H #define UI_UILISTSTATE_H -class UIListState { +#include "types.h" +#include +class UIListStateCallback { + public: + UIListStateCallback() {} + virtual ~UIListStateCallback() {} +}; + +class UIListState { // 0x48 public: - UIListState(class UIListProvider*, class UIListStateCallback*); + UIListState(class UIListProvider*, UIListStateCallback*); - bool mCircular; - int mNumDisplay; - int mGridSpan; + bool mCircular; // 0x0 + int mNumDisplay; // 0x4 + int mGridSpan; // 0x8 + float unk_0xC; + int unk_0x10; + u8 unk_0x14; + int unk_0x18; + u8 unk_0x1C; + int unk_0x20; + std::vector unk_0x24; + int unk_0x2C, unk_0x30, unk_0x34; + float unk_0x38, unk_0x3C; + int unk_0x40; // TODO: fill out the rest }; diff --git a/src/system/ui/UIListWidget.h b/src/system/ui/UIListWidget.h index ee3baa14..e170e750 100644 --- a/src/system/ui/UIListWidget.h +++ b/src/system/ui/UIListWidget.h @@ -5,9 +5,9 @@ #include "math/Vec.h" #include "ui/UIComponent.h" #include "ui/UIListState.h" -#include "ui/UIListProvider.h" #include "ui/UIEnums.h" #include "obj/ObjPtr_p.h" +#include "utl/MemMgr.h" #include class UIList; @@ -37,7 +37,7 @@ class UIListWidget : public Hmx::Object { virtual void ResourceCopy(const UIListWidget*); virtual void CreateElements(UIList*, int){} virtual void Draw(const UIListWidgetDrawState&, const UIListState&, const Transform&, UIComponent::State, Box*, DrawCommand){} - virtual void Fill(const UIListProvider&, int, int, int){} + virtual void Fill(const class UIListProvider&, int, int, int){} virtual void StartScroll(int, bool){} virtual void CompleteScroll(const UIListState&, int){} virtual void Poll(){} @@ -51,7 +51,9 @@ class UIListWidget : public Hmx::Object { void SetColor(UIListWidgetState, UIComponent::State, UIColor*); void SetParentList(UIList*); - DECLARE_REVS; + NEW_OVERLOAD + DECLARE_REVS + NEW_OBJ(UIListWidget) float mDrawOrder; // 0x1c float mDisabledAlphaScale; // 0x20 diff --git a/src/system/ui/UIResource.h b/src/system/ui/UIResource.h index fbf1c6da..6f6b6121 100644 --- a/src/system/ui/UIResource.h +++ b/src/system/ui/UIResource.h @@ -10,7 +10,7 @@ class UIResource { public: int mRefCount; // 0x0 FilePath mResourcePath; // 0x4 - ObjDirPtr mDir; // 0x10 + ObjDirPtr mDir; RndDir* Dir() { return mDir.mDir; } // 0x10 UIResource(const FilePath&); void Load(bool); diff --git a/src/system/ui/UITransitionHandler.cpp b/src/system/ui/UITransitionHandler.cpp index 3c1542a7..6ad94c37 100644 --- a/src/system/ui/UITransitionHandler.cpp +++ b/src/system/ui/UITransitionHandler.cpp @@ -9,7 +9,8 @@ DECOMP_FORCEACTIVE(UITransitionHandler, "0" ) -UITransitionHandler::UITransitionHandler(Hmx::Object* obj) : mInAnim(obj, 0), mOutAnim(obj, 0), mAnimationState(0), mChangePending(0), b3(0) { +UITransitionHandler::UITransitionHandler(Hmx::Object* obj) : mInAnim(obj, 0), mOutAnim(obj, 0), + mAnimationState(0), mChangePending(0), b3(0) { } diff --git a/src/system/ui/UITransitionHandler.h b/src/system/ui/UITransitionHandler.h index d84a15ea..a6e3cbe8 100644 --- a/src/system/ui/UITransitionHandler.h +++ b/src/system/ui/UITransitionHandler.h @@ -3,6 +3,7 @@ #include "obj/Object.h" #include "obj/ObjPtr_p.h" #include "rndobj/Anim.h" +#include "types.h" enum UITransitionAnimationState { kUITransitionAnimationInvalid, @@ -33,7 +34,7 @@ class UITransitionHandler { ObjPtr mInAnim; ObjPtr mOutAnim; - unsigned char mAnimationState; // make this the enum above but only take up 1 byte? + u8 mAnimationState; // make this the enum above but only take up 1 byte? bool mChangePending, b3; // mChangePending, mOutAnimStartedThisFrame }; diff --git a/src/system/utl/BinStream.cpp b/src/system/utl/BinStream.cpp index 4718971e..ffe15547 100644 --- a/src/system/utl/BinStream.cpp +++ b/src/system/utl/BinStream.cpp @@ -1,5 +1,7 @@ #include "utl/BinStream.h" +#include "decomp.h" #include "math/Rand.h" +#include "types.h" #include "utl/Str.h" #include "utl/Symbol.h" #include "utl/TextStream.h" @@ -123,93 +125,34 @@ void BinStream::Read(void* data, int bytes){ } void BinStream::Write(const void* void_data, int bytes){ - const unsigned char* data; - char crypt[512]; - int buf_size, i; - unsigned char c; if(Fail()){ + static char _dw[256]; const char* str = MakeString("Stream error: Can't write to %s\n", Name()); -// pcVar3 = (char *)(**(code **)((int)this->vtable + 0x1c))(this); -// pcVar3 = ::MakeString(s_Stream_error:_Can't_write_to_%s_80bba789,pcVar3); -// iVar2 = strcmp(@LOCAL@Write__9BinStreamFPCvi@_dw,pcVar3); -// if (iVar2 != 0) { -// strcpy(@LOCAL@Write__9BinStreamFPCvi@_dw,pcVar3); -// Debug::Print((Debug *)TheDebug,pcVar3); -// } + if (strcmp(_dw, str) != 0) { + strcpy(_dw, str); + TheDebug.Print(str); + } + } else { + const unsigned char* data = (u8*)void_data; + if (!mCrypto) { + WriteImpl(void_data, bytes); + } else { + u8 crypt[512]; + while (bytes > 0) { + int x = bytes < 512 ? bytes : 512; + u8* crypt_p = crypt; + for (int i = 0; i < x; i++) { + u8 bastard = mCrypto->Int(); + *crypt_p++ = data[i] ^ bastard; + } + WriteImpl(crypt, x); + bytes -= 512; + data += 512; + } + } } } -// void __thiscall BinStream::Write(BinStream *this,void *param_1,int param_2) - -// { -// byte bVar1; -// int iVar2; -// char *pcVar3; -// byte bVar4; -// int iVar5; -// byte *pbVar6; -// byte *pbVar7; -// byte local_228 [524]; - -// iVar2 = (**(code **)((int)this->vtable + 0x18))(); -// if (iVar2 == 0) { -// if (this->mCrypto == (Rand2 *)0x0) { -// (**(code **)((int)this->vtable + 0x2c))(this,param_1,param_2); -// } -// else { -// for (; 0 < param_2; param_2 = param_2 + -0x200) { -// iVar2 = 0x200; -// if (param_2 < 0x200) { -// iVar2 = param_2; -// } -// pbVar6 = local_228; -// pbVar7 = (byte *)param_1; -// for (iVar5 = 0; iVar5 < iVar2; iVar5 = iVar5 + 1) { -// bVar4 = Rand2::Int(this->mCrypto); -// bVar1 = *pbVar7; -// pbVar7 = pbVar7 + 1; -// *pbVar6 = bVar4 ^ bVar1; -// pbVar6 = pbVar6 + 1; -// } -// (**(code **)((int)this->vtable + 0x2c))(this,local_228,iVar2); -// param_1 = (void *)((int)param_1 + 0x200); -// } -// } -// } -// else { -// pcVar3 = (char *)(**(code **)((int)this->vtable + 0x1c))(this); -// pcVar3 = ::MakeString(s_Stream_error:_Can't_write_to_%s_80bba789,pcVar3); -// iVar2 = strcmp(@LOCAL@Write__9BinStreamFPCvi@_dw,pcVar3); -// if (iVar2 != 0) { -// strcpy(@LOCAL@Write__9BinStreamFPCvi@_dw,pcVar3); -// Debug::Print((Debug *)TheDebug,pcVar3); -// } -// } -// return; -// } - -// void BinStream::Write(const void *v, int i) { -// unsigned char sp8[512]; -// if (Fail() != 0) { -// Name(); -// return; -// } -// if (mCrypto == nullptr) { -// WriteImpl((void *)v, i); -// return; -// } -// while (i > 0) { -// int temp_r29 = Minimum(0x200, i); -// for (int j = 0; j < temp_r29; j++) { -// unsigned char x = (unsigned char)mCrypto->Int(); -// sp8[j] = x ^ ((const char *)v)[j]; -// } -// WriteImpl(&sp8, temp_r29); -// i -= 0x200; -// (char *)v += 0x200; -// } -// } - void BinStream::Seek(int offset, SeekType type){ MILO_ASSERT(!Fail(), 0xDF); MILO_ASSERT(!mCrypto, 0xE2); @@ -272,8 +215,11 @@ void BinStream::ReadEndian(void* data, int bytes){ void BinStream::WriteEndian(const void* void_data, int bytes){ char buf[16]; if(mLittleEndian){ - // SwapData((void*)void_data, buf, bytes); + SwapData((void*)void_data, buf, bytes); Write(buf, bytes); } else Write(void_data, bytes); } + +DECOMP_FORCEACTIVE(BinStream, "BinStream::AddSharedInlined is a PC dev tool only !!") +//void BinStream::AddSharedInlined() {}