diff options
-rw-r--r-- | include/g3dhax.h | 26 | ||||
-rwxr-xr-x | include/game.h | 130 | ||||
-rwxr-xr-x | include/rvl/GXVert.h | 38 | ||||
-rw-r--r-- | kamek_pal.x | 41 | ||||
-rw-r--r-- | src/fileload.cpp | 8 |
5 files changed, 209 insertions, 34 deletions
diff --git a/include/g3dhax.h b/include/g3dhax.h index b016e55..d358436 100644 --- a/include/g3dhax.h +++ b/include/g3dhax.h @@ -161,6 +161,8 @@ class mAllocator_c : public EGG::Allocator { mAllocator_c(); ~mAllocator_c(); + bool setup(/*EGG::Heap*/void *heap, s32 align); + void *alloc(u32 size); void free(void *block); }; @@ -182,19 +184,15 @@ namespace m3d { void DisableIndirectTexturing(); void InitTexObjWithResTex(GXTexObj *obj, /* ResTex */ void *resTex, GXTexWrapMode wrapS, GXTexWrapMode wrapT, GXTexFilter minFilt, GXTexFilter magFilt); - // I need to do scnLeaf_c some time... - class proc_c { + class scnLeaf_c { public: - proc_c(); - virtual ~proc_c(); + scnLeaf_c(); + virtual ~scnLeaf_c(); - void setup(void *allocator = 0, u32 *size = 0); virtual int returnUnknown(); virtual void free(); virtual bool scheduleForDrawing(); - virtual void drawOpa(); - virtual void drawXlu(); void setScnObjOption(ulong, ulong); bool getScnObjOption(ulong, ulong*); @@ -214,8 +212,20 @@ namespace m3d { void *scnObj; }; - class banm_c; + class proc_c : public scnLeaf_c { + public: + bool setup(void *allocator = 0, u32 *size = 0); + + int returnUnknown() { return 2; } + virtual void drawOpa() = 0; + virtual void drawXlu() = 0; + }; + + + + // TODO: bmdl_c/smdl_c + class banm_c; class mdl_c { public: mdl_c(); diff --git a/include/game.h b/include/game.h index 8e7d86a..0871eb1 100755 --- a/include/game.h +++ b/include/game.h @@ -11,8 +11,17 @@ #define offsetof(type, member) ((u32) &(((type *) 0)->member))
+template <typename T>
+inline T min(T one, T two) { return (one < two) ? one : two; }
+template <typename T>
+inline T max(T one, T two) { return (one > two) ? one : two; }
+template <typename T>
+inline T clamp(T value, T one, T two) { return (value < one) ? one : ((value > two) ? two : value); }
+
+
extern "C" {
int strlen(const char *str);
+char *strcpy(char *dest, const char *src);
float atan(float x);
float atan2(float y, float x);
@@ -761,8 +770,15 @@ namespace G3DState { }
+VEC2 GetSomeSizeRelatedBULLSHIT();
+Vec CalculateSomethingAboutRatio(float, float, float, float);
+float CalculateSomethingElseAboutRatio();
+
nw4r::g3d::CameraData *GetCameraByID(int id);
+namespace EGG { class Screen; };
+void DoSomethingCameraRelatedWithEGGScreen(int id, EGG::Screen *screen);
+
int GetCurrentCameraID(); // 80164C80
void SetCurrentCameraID(int id); // 80164C90
@@ -777,6 +793,7 @@ void DrawOpa(); // 80164F70 void DrawXlu(); // 80164F80
bool ChangeAlphaUpdate(bool enable); // 802D3270
+bool ChangeColorUpdate(bool enable); // 802D3210
void DoSpecialDrawing1(); // 8006CAE0
void DoSpecialDrawing2(); // 8006CB40
@@ -784,6 +801,7 @@ void DoSpecialDrawing2(); // 8006CB40 void SetupLYTDrawing(); // 80163360
void ClearLayoutDrawList(); // 801632B0
+void RenderAllLayouts(); // 800067A0
void DrawAllLayoutsBeforeX(int x); // 80163440
void DrawAllLayoutsAfterX(int x); // 801634D0
void DrawAllLayoutsAfterXandBeforeY(int x, int y); // 80163560
@@ -837,7 +855,7 @@ namespace m2d { namespace EGG {
class Frustum {
public:
- GXProjectionType projType;
+ int projType; // 0 = ortho, 1 = perspective.. who needs GXEnum.h anyway
int isCentered;
float width;
float height;
@@ -847,8 +865,8 @@ namespace EGG { float far;
float center_x_maybe;
float center_y_maybe;
- float x_direction;
- float unk2;
+ float horizontalMultiplier;
+ float verticalMultiplier;
float unk3;
short some_flag_bit;
@@ -876,8 +894,8 @@ namespace EGG { void copyAllFields(Frustum &f); // 802C6EE0
- void saveSomething(float f1, float f2, float f3, float f4); // 802C70C0
- void loadSomething(float *f1, float *f2, float *f3, float *f4); // 802C70E0
+ static void saveSomething(float f1, float f2, float f3, float f4); // 802C70C0
+ static void restoreSomething(float *f1, float *f2, float *f3, float *f4); // 802C70E0
void loadPerspective(); // 802C7110
void loadOrtho(); // 802C7140
@@ -891,6 +909,97 @@ namespace EGG { void getOrthoVars(float *top, float *bottom, float *left, float *right); // 802C7480
};
+
+
+ class Screen : public Frustum {
+ public:
+ struct Info {
+ float viewportX, viewportY, viewportWidth, viewportHeight;
+ float viewportNearZ, viewportFarZ;
+
+ int scissorX, scissorY, scissorWidth, scissorHeight;
+ int scissorOffsetX, scissorOffsetY;
+ };
+
+ Screen(); // 802D0FB0; creates perspective screen with basic settings
+ Screen(Screen *pParent, bool isCentered, float m40, float m44, float width, float height); // 802D1080
+ Screen(Screen &s); // 802D1140
+
+ ~Screen(); // not called by the retail game.. dunno how to make CodeWarrior do this, who gives a fuck
+
+ void loadDirectly();
+ void loadIntoCamera(nw4r::g3d::Camera cam);
+
+ void setSomeVars(bool isCentered, float m40, float m44, float width, float height); // 802D1500
+
+ Info *getStructContainingInfo(); // 802D1AB0
+
+ void doSomethingWithAPassedMatrix(Mtx m, float f1, float f2, float f3, float f4); // 802D1B40
+
+ //protected:
+ void copyAllFields(Screen &s); // 802D1430
+ void setParent(Screen *pParent = 0); // 802D1540
+
+ void useScreenWidth640(); // 802D15A0
+ void calculateCrap(); // 802D15D0
+
+ bool checkIfFlag1IsSet(); // 802D1B10
+
+
+ Screen *parent; // I think it's the parent screen, anyway ...
+ float _40, _44, _48, _4C, _50, _54;
+ Info info;
+ };
+
+
+ class LookAtCamera /* : public BaseCamera */ {
+ public:
+ virtual Mtx *getMatrix();
+ virtual Mtx *getMatrixAgain();
+ virtual void callCalculateMatrix();
+ virtual void calculateMatrix();
+ virtual void loadMatricesIntoGX();
+ virtual void _vf1C(); // null
+ virtual Vec getCamPos();
+ virtual void doStuffInvolvingVfsAndOtherObject(void *unkType);
+ virtual void _vf28(); // null
+ virtual Mtx *getPreviousMatrix();
+
+ void assignToNW4RCamera(nw4r::g3d::Camera &cam); // 802BEB70
+ Vec getStuffFromMatrix(); // 802BEBC0
+ Vec getMoreStuffFromMatrix(); // 802BEC20
+ Vec getEvenMoreStuffFromMatrix(); // 802BEC80
+
+ private:
+ Mtx matrix;
+ Mtx previousMatrix;
+
+ public:
+ Vec camPos, target, camUp;
+ };
+
+ class ProjectOrtho /* : public something? */ {
+ public:
+ virtual GXProjectionType getProjectionType();
+ virtual void setGXProjection();
+ virtual void _vf10(); // null
+ virtual VEC2 _vf14(VEC2 *something);
+ virtual Vec _vf18(float something, /*BaseCamera?*/ LookAtCamera *camera);
+ virtual Vec _vf1C(float something, /*BaseCamera?*/ LookAtCamera *camera);
+ virtual Vec _vf20(VEC2 *something);
+ virtual void _vf24();
+ virtual void setOrthoOntoCamera(nw4r::g3d::Camera &cam);
+ virtual void _vf2C(); // null
+ virtual void setGXProjectionUnscaled(); // does not take aspect ratio into account
+
+ ProjectOrtho(); // 802BF6C0
+ void setVolume(float top, float bottom, float left, float right); // 802BF710
+ void setDefaults(); // I think? 802BF830
+
+ Mtx44 matrix; // unused? dunno
+ void *_44; // dunno type
+ float near, far, top, bottom, left, right;
+ };
}
@@ -2337,5 +2446,16 @@ inline u8 *getResource(const char *arcName, const char *fileName) { inline void scaleDown(Vec* scale, float amt) { scale->x -= amt; scale->y -= amt; scale->z -= amt; }
inline void scaleUp(Vec* scale, float amt) { scale->x -= amt; scale->y -= amt; scale->z -= amt; }
+
+
+
+
+struct SSM { short width, height; float xScale, yScale; };
+extern SSM ScreenSizesAndMultipliers[3];
+extern int currentScreenSizeID;
+
+extern float GlobalScreenWidth, GlobalScreenHeight;
+
+
#endif
diff --git a/include/rvl/GXVert.h b/include/rvl/GXVert.h index 8564563..41587c5 100755 --- a/include/rvl/GXVert.h +++ b/include/rvl/GXVert.h @@ -24,10 +24,24 @@ extern "C" { #else // MINNOW
#define GXFIFO_ADDR 0x1C008000
#endif// MINNOW
+typedef union uPPCWGPipe
+{
+ u8 u8;
+ u16 u16;
+ u32 u32;
+ u64 u64;
+ s8 s8;
+ s16 s16;
+ s32 s32;
+ s64 s64;
+ f32 f32;
+ f64 f64;
+} PPCWGPipe;
+
// SN-Phil: removed 'extern', added AT_ADDRESS
-//volatile PPCWGPipe GXWGFifo AT_ADDRESS(GXFIFO_ADDR) ;
-extern volatile PPCWGPipe GXWGFifo;
+volatile PPCWGPipe GXWGFifo : (GXFIFO_ADDR) ;
+//extern volatile PPCWGPipe GXWGFifo;
#endif // !EMU
/*---------------------------------------------------------------------------*/
@@ -76,7 +90,7 @@ extern volatile PPCWGPipe GXWGFifo; #define __GXCDEF1(func,ts,td) \
static inline void func(const ts x) \
{ \
- GXWGFifo._##td = (td) x; \
+ GXWGFifo.td = (td) x; \
return; \
}
@@ -84,8 +98,8 @@ extern volatile PPCWGPipe GXWGFifo; #define __GXCDEF2(func,ts,td) \
static inline void func(const ts x, const ts y) \
{ \
- GXWGFifo._##td = (td) x; \
- GXWGFifo._##td = (td) y; \
+ GXWGFifo.td = (td) x; \
+ GXWGFifo.td = (td) y; \
return; \
}
@@ -93,9 +107,9 @@ extern volatile PPCWGPipe GXWGFifo; #define __GXCDEF3(func,ts,td) \
static inline void func(const ts x, const ts y, const ts z) \
{ \
- GXWGFifo._##td = (td) x; \
- GXWGFifo._##td = (td) y; \
- GXWGFifo._##td = (td) z; \
+ GXWGFifo.td = (td) x; \
+ GXWGFifo.td = (td) y; \
+ GXWGFifo.td = (td) z; \
return; \
}
@@ -103,10 +117,10 @@ extern volatile PPCWGPipe GXWGFifo; #define __GXCDEF4(func,ts,td) \
static inline void func(const ts x, const ts y, const ts z, const ts w) \
{ \
- GXWGFifo._##td = (td) x; \
- GXWGFifo._##td = (td) y; \
- GXWGFifo._##td = (td) z; \
- GXWGFifo._##td = (td) w; \
+ GXWGFifo.td = (td) x; \
+ GXWGFifo.td = (td) y; \
+ GXWGFifo.td = (td) z; \
+ GXWGFifo.td = (td) w; \
return; \
}
diff --git a/kamek_pal.x b/kamek_pal.x index c46bb81..4f5e7e6 100644 --- a/kamek_pal.x +++ b/kamek_pal.x @@ -506,6 +506,28 @@ SECTIONS { OSReport__FPCce = 0x8015F870; _Z7OSFatal7GXColorS_PKc = 0x801AF710; + GetSomeSizeRelatedBULLSHIT__Fv = 0x800E2670; + CalculateSomethingAboutRatio__Fffff = 0x800E27E0; + CalculateSomethingElseAboutRatio__Fv = 0x800E28B0; + DoSomethingCameraRelatedWithEGGScreen__FiPQ23EGG6Screen = 0x80169360; + + GlobalScreenWidth = 0x8042A3CC; + GlobalScreenHeight = 0x8042A3D0; + + currentScreenSizeID = 0x8042B1E8; + ScreenSizesAndMultipliers = 0x80350820; + + setOrtho__Q23EGG7FrustumFffffff = 0x802C6DD0; + + __ct__Q23EGG6ScreenFv = 0x802D0FB0; + __dt__Q23EGG6ScreenFv = 0x802D0D90; + + __vt__Q23EGG12LookAtCamera = 0x803503B8; + assignToNW4RCamera__Q23EGG12LookAtCameraFRQ34nw4r3g3d6Camera = 0x802BEB70; + + __ct__Q23EGG12ProjectOrthoFv = 0x802BF6C0; + setVolume__Q23EGG12ProjectOrthoFffff = 0x802BF710; + GetCameraByID__Fi = 0x80164C60; GetCurrentCameraID__Fv = 0x80164C80; SetCurrentCameraID__Fi = 0x80164C90; @@ -521,6 +543,7 @@ SECTIONS { DrawXlu__Fv = 0x80164F80; ChangeAlphaUpdate__Fb = 0x802D3270; + ChangeColorUpdate__Fb = 0x802D3210; DoSpecialDrawing1__Fv = 0x8006CAE0; DoSpecialDrawing2__Fv = 0x8006CB40; @@ -528,6 +551,7 @@ SECTIONS { SetupLYTDrawing__Fv = 0x80163360; ClearLayoutDrawList__Fv = 0x801632B0; + RenderAllLayouts__Fv = 0x800067A0; DrawAllLayoutsBeforeX__Fi = 0x80163440; DrawAllLayoutsAfterX__Fi = 0x801634D0; DrawAllLayoutsAfterXandBeforeY__Fii = 0x80163560; @@ -581,12 +605,13 @@ SECTIONS { /* This is preliminary and kinda strange, most of these just point to ScnLeaf for now */ setup__Q23m3d6proc_cFPvPUi = 0x80165110; - __ct__Q23m3d6proc_cFv = 0x8016A150; - __dt__Q23m3d6proc_cFv = 0x8016A170; - free__Q23m3d6proc_cFv = 0x8016A1D0; - scheduleForDrawing__Q23m3d6proc_cFv = 0x8016A220; - getViewMatrix__Q23m3d6proc_cFPA3_A4_f = 0x8016A2D0; returnUnknown__Q23m3d6proc_cFv = 0x8000F720; + + __ct__Q23m3d9scnLeaf_cFv = 0x8016A150; + __dt__Q23m3d9scnLeaf_cFv = 0x8016A170; + free__Q23m3d9scnLeaf_cFv = 0x8016A1D0; + scheduleForDrawing__Q23m3d9scnLeaf_cFv = 0x8016A220; + getViewMatrix__Q23m3d9scnLeaf_cFPA3_A4_f = 0x8016A2D0; /* End preliminary section */ __vt__Q23m3d5mdl_c = 0x80329984; @@ -858,6 +883,7 @@ SECTIONS { _Z6strlenPKc = 0x802DC98C; strlen__FPCc = 0x802DC98C; strlen = 0x802DC98C; + strcpy = 0x802E1C28; atan = 0x802E7F04; atan2 = 0x802E8900; @@ -994,6 +1020,7 @@ SECTIONS { GXInitTexObjWrapMode = 0x801C7240; GXLoadTexObj = 0x801C7600; GXInvalidateTexAll = 0x801C7800; + GXSetNumIndStages = 0x801C8250; GXSetTevDirect = 0x801C8270; GXSetTevOp = 0x801C8390; GXSetTevColorIn = 0x801C8430; @@ -1013,9 +1040,12 @@ SECTIONS { GXSetFog = 0x801C8A60; GXSetFogRangeAdj = 0x801C8DF0; GXSetBlendMode = 0x801C8F00; + GXSetColorUpdate = 0x801C8F50; + GXSetAlphaUpdate = 0x801C8F80; GXSetZMode = 0x801C8FB0; GXSetZCompLoc = 0x801C8FF0; GXSetDither = 0x801C90D0; + GXSetDstAlpha = 0x801C9100; GXCallDisplayList = 0x801C9720; GXSetProjection = 0x801C9980; GXLoadPosMtxImm = 0x801C9A80; @@ -1050,6 +1080,7 @@ SECTIONS { __ct__12mAllocator_cFv = 0x8016a720; __vt__12mAllocator_c = 0x80329a04; __dt__12mAllocator_cFv = 0x8016a770; + setup__12mAllocator_cFPvi = 0x8016A7D0; __vt__Q23m3d6banm_c = 0x80329920; __dt__Q23m3d6banm_cFv = 0x80168000; diff --git a/src/fileload.cpp b/src/fileload.cpp index fac7576..e672863 100644 --- a/src/fileload.cpp +++ b/src/fileload.cpp @@ -26,7 +26,7 @@ void *LoadFile(FileHandle *handle, const char *name) { return handle->filePtr; } -void *LoadCompressedFile(FileHandle *handle, const char *name) { +/*void *LoadCompressedFile(FileHandle *handle, const char *name) { OSReport("[LoadCompressedFile %s]\n", name); int entryNum = DVDConvertPathToEntrynum(name); @@ -57,7 +57,7 @@ void *LoadCompressedFile(FileHandle *handle, const char *name) { OSReport("[Success %p]\n", handle->filePtr); return handle->filePtr; -} +}*/ bool FreeFile(FileHandle *handle) { if (!handle) return false; @@ -95,7 +95,7 @@ bool File::open(const char *filename) { return (ret != 0); } -bool File::openCompressed(const char *filename) { +/*bool File::openCompressed(const char *filename) { if (m_loaded) close(); @@ -104,7 +104,7 @@ bool File::openCompressed(const char *filename) { m_loaded = true; return (ret != 0); -} +}*/ void File::close() { if (!m_loaded) |