Det hela började med att jag hittade Jon Wattes reflection kod, som gör att man kan exponera variabler för omvärlden på ett väldigt smidigt sätt. Den skapar en "prototyp" för klasser, som innebär att man får tillgång till en array med offset samt typinformation till de medlemsvariabler man anger.
Samtidigt hade jag precis börjat kolla på AntTweakBar som är ett ramverk för att tweaka variabler, där man i princip säger "här har du en void* till data som är av int typ. låt mig editera den, tack".
Jag skrev lite klisterkod som koppade ihop reflectiongrejen med anttweak, samt lite enkel load/save kod, och det blev faktiskt rätt användbart. Jag slängde ihop ett enkelt exempel, som bör funka out of the box (kräver dx9), så man kan se hur det hela funkar, innan det försvinner ner i min existerande kodbas, för att sen aldrig mer se dagens ljus. Eller nåt
Så här kan det se ut om man har en struct som heter FunkyStruct, med 4 variabler som man vill kunna editera etc.
- struct FunkyStruct
- {
- FunkyStruct()
- : int_value_(0)
- , float_value_(0)
- , v2_(0, 0)
- , v3_(0, 0, 0)
- {
- Serializer::instance().add_instance(this);
- }
- ~FunkyStruct()
- {
- Serializer::instance().remove_instance(this);
- }
- int int_value_;
- float float_value_;
- D3DXVECTOR2 v2_;
- D3DXVECTOR3 v3_;
- RTTI(FunkyStruct, MEMBER(int_value_) MEMBER(float_value_) MEMBER(v2_) MEMBER(v3_));
- };
Disclaimer: Koden är inte tänkt att vara production quality, utan väldigt mycket proof of concept (exvis så funkar inte koden för att hantera std::string som den ska), men jag tyckte det var jäkligt skoj att pilla med, och hoppas någon annan också tycker det.
Koden
