mirror of
https://github.com/emu-russia/pureikyubu.git
synced 2025-04-02 10:42:15 -04:00
298 lines
10 KiB
C++
298 lines
10 KiB
C++
// Transform Unit registers definitions
|
|
|
|
#pragma once
|
|
|
|
namespace GX
|
|
{
|
|
|
|
// XF Registers
|
|
|
|
enum class XFRegister
|
|
{
|
|
// 0x0000...0x03FF - ModelView/Texture Matrix memory. This block is formed by the matrix memory. Its address range is 0 to 1k, but only 256 entries are used. This memory is organized in a 64 entry by four 32b words.
|
|
|
|
XF_MATRIX_MEMORY_ID = 0x0000,
|
|
XF_MATRIX_MEMORY_SIZE = (64 * 4),
|
|
|
|
// 0x0400...0x04FF - Normal matrix memory. This block of memory is the normal matrix memory. It is organized as 32 rows of 3 words.
|
|
|
|
XF_NORMAL_MATRIX_MEMORY_ID = 0x0400,
|
|
XF_NORMAL_MATRIX_MEMORY_SIZE = (32 * 3),
|
|
|
|
// 0x0500...0x05FF - Texture post-transform matrix memory. This block of memory holds the dual texture transform matrices. The format is identical to the first block of matrix memory.
|
|
// There are also 64 rows of 4 words for these matrices
|
|
|
|
XF_DUALTEX_MATRIX_MEMORY_ID = 0x0500,
|
|
XF_DUALTEX_MATRIX_MEMORY_SIZE = (64 * 4),
|
|
|
|
// Lighting parameters memory
|
|
|
|
XF_LIGHT_MEMORY_ID = 0x0600,
|
|
XF_LIGHT_DATA_SIZE = 0x10,
|
|
XF_LIGHT_MEMORY_SIZE = (XF_LIGHT_DATA_SIZE * 8),
|
|
|
|
// Light0 parameters
|
|
|
|
XF_LIGHT0_ID = 0x0600, // reserved
|
|
XF_LIGHT0_Reserved1 = 0x0601, // reserved
|
|
XF_LIGHT0_Reserved2 = 0x0602, // reserved
|
|
XF_LIGHT0_RGBA_ID = 0x0603, // RGBA (8b/comp)
|
|
XF_LIGHT0_A0_ID = 0x0604, // cos atten a0
|
|
XF_LIGHT0_A1_ID = 0x0605, // cos atten a1
|
|
XF_LIGHT0_A2_ID = 0x0606, // cos atten a2
|
|
XF_LIGHT0_K0_ID = 0x0607, // dist atten k0
|
|
XF_LIGHT0_K1_ID = 0x0608, // dist atten k1
|
|
XF_LIGHT0_K2_ID = 0x0609, // dist atten k2
|
|
XF_LIGHT0_LPX_ID = 0x060A, // x light pos, or inf ldir x
|
|
XF_LIGHT0_LPY_ID = 0x060B, // y light pos, or inf ldir y
|
|
XF_LIGHT0_LPZ_ID = 0x060C, // z light pos, or inf ldir z
|
|
XF_LIGHT0_DHX_ID = 0x060D, // light dir x, or 1/2 angle x
|
|
XF_LIGHT0_DHY_ID = 0x060E, // light dir y, or 1/2 angle y
|
|
XF_LIGHT0_DHZ_ID = 0x060F, // light dir z, or 1/2 angle z
|
|
|
|
// 0x0610-0x067f: Parameters for Light1-Light7. See Light0 data.
|
|
|
|
XF_LIGHT1_ID = 0x0610,
|
|
XF_LIGHT2_ID = 0x0620,
|
|
XF_LIGHT3_ID = 0x0630,
|
|
XF_LIGHT4_ID = 0x0640,
|
|
XF_LIGHT5_ID = 0x0650,
|
|
XF_LIGHT6_ID = 0x0660,
|
|
XF_LIGHT7_ID = 0x0670,
|
|
|
|
// XF 0x0680...0x07FF are reserved
|
|
|
|
// Other general XF parameters (>= 0x1000)
|
|
|
|
XF_ERROR_ID = 0x1000,
|
|
XF_DIAGNOSTICS_ID = 0x1001,
|
|
XF_STATE0_ID = 0x1002,
|
|
XF_STATE1_ID = 0x1003,
|
|
XF_CLOCK_ID = 0x1004,
|
|
XF_CLIP_DISABLE_ID = 0x1005,
|
|
XF_PERF0_ID = 0x1006,
|
|
XF_PERF1_ID = 0x1007,
|
|
|
|
XF_INVTXSPEC_ID = 0x1008,
|
|
XF_NUMCOLS_ID = 0x1009, // Selects the number of output colors
|
|
XF_AMBIENT0_ID = 0x100A, // RGBA (8b/comp) ambient color 0
|
|
XF_AMBIENT1_ID = 0x100B, // RGBA (8b/comp) ambient color 1
|
|
XF_MATERIAL0_ID = 0x100C, // RGBA (8b/comp) material color 0
|
|
XF_MATERIAL1_ID = 0x100D, // RGBA (8b/comp) material color 1
|
|
XF_COLOR0CNTL_ID = 0x100E, // COLOR0 channel control
|
|
XF_COLOR1CNTL_ID = 0x100F, // COLOR1 channel control
|
|
XF_ALPHA0CNTL_ID = 0x1010, // ALPHA0 channel control
|
|
XF_ALPHA1CNTL_ID = 0x1011, // ALPHA1 channel control
|
|
|
|
XF_DUALTEX_ID = 0x1012, // enable tex post-transform
|
|
XF_MATINDEX_A_ID = 0x1018, // Position / Tex coord 0-3 mat index
|
|
XF_MATINDEX_B_ID = 0x1019, // Tex coord 4-7 mat index
|
|
XF_VIEWPORT_SCALE_X_ID = 0x101A,
|
|
XF_VIEWPORT_SCALE_Y_ID = 0x101B,
|
|
XF_VIEWPORT_SCALE_Z_ID = 0x101C,
|
|
XF_VIEWPORT_OFFSET_X_ID = 0x101D,
|
|
XF_VIEWPORT_OFFSET_Y_ID = 0x101E,
|
|
XF_VIEWPORT_OFFSET_Z_ID = 0x101F,
|
|
|
|
// Projection matrix parameters
|
|
|
|
XF_PROJECTION_A_ID = 0x1020,
|
|
XF_PROJECTION_B_ID = 0x1021,
|
|
XF_PROJECTION_C_ID = 0x1022,
|
|
XF_PROJECTION_D_ID = 0x1023,
|
|
XF_PROJECTION_E_ID = 0x1024,
|
|
XF_PROJECTION_F_ID = 0x1025,
|
|
XF_PROJECT_ORTHO_ID = 0x1026,
|
|
|
|
XF_NUMTEX_ID = 0x103F, // active texgens
|
|
XF_TEXGEN0_ID = 0x1040,
|
|
XF_TEXGEN1_ID = 0x1041,
|
|
XF_TEXGEN2_ID = 0x1042,
|
|
XF_TEXGEN3_ID = 0x1043,
|
|
XF_TEXGEN4_ID = 0x1044,
|
|
XF_TEXGEN5_ID = 0x1045,
|
|
XF_TEXGEN6_ID = 0x1046,
|
|
XF_TEXGEN7_ID = 0x1047,
|
|
|
|
// Dual texgen setup
|
|
|
|
XF_DUALGEN0_ID = 0x1050,
|
|
XF_DUALGEN1_ID = 0x1051,
|
|
XF_DUALGEN2_ID = 0x1052,
|
|
XF_DUALGEN3_ID = 0x1053,
|
|
XF_DUALGEN4_ID = 0x1054,
|
|
XF_DUALGEN5_ID = 0x1055,
|
|
XF_DUALGEN6_ID = 0x1056,
|
|
XF_DUALGEN7_ID = 0x1057,
|
|
};
|
|
|
|
#pragma pack(push, 1)
|
|
|
|
union ClipDisable
|
|
{
|
|
struct
|
|
{
|
|
bool disableDetection : 1; // When set, disables clipping detection
|
|
bool disableTrivialReject : 1; // When set, disables trivial rejection
|
|
bool disablePolyAccel : 1; // When set, disables cpoly clipping acceleration
|
|
};
|
|
uint32_t bits;
|
|
};
|
|
|
|
union InVertexSpec
|
|
{
|
|
struct
|
|
{
|
|
int color0Usage : 2; // 0: No host supplied color information 1: Host supplied color0 2: Host supplied color0 and color1
|
|
int normalUsage : 2; // 0: No host supplied normal 1: Host supplied normal 2: Host supplied normal and binormals
|
|
int texCoords : 4; // 0: No host supplied textures 1: 1 host supplied texture pair (S0, T0) 2-8: 2-8 host supplied texturepairs; 9-15: Reserved
|
|
};
|
|
uint32_t bits;
|
|
};
|
|
|
|
// Light parameters
|
|
|
|
union Color
|
|
{
|
|
struct
|
|
{
|
|
uint8_t a, b, g, r;
|
|
};
|
|
uint32_t rgba;
|
|
};
|
|
|
|
struct Light
|
|
{
|
|
uint32_t Reserved[3];
|
|
Color rgba; // RGBA (8b/comp)
|
|
float a[3]; // Post-processed cos atten
|
|
float k[3]; // Post-processed dist atten
|
|
float lpx[3]; // Post-processed x,y,z light pos, or inf ldir x,y,z
|
|
float dhx[3]; // Post-processed x,y,z light dir, or 1/2 angle x,y,z
|
|
};
|
|
|
|
union ColorAlphaControl
|
|
{
|
|
struct
|
|
{
|
|
unsigned MatSrc : 1; // Material source. 0: use register, 1: Use CP supplied Vertex color/alpha
|
|
unsigned LightFunc : 1; // LightFunc. 0: Use 1.0, 1: Use Illum0
|
|
bool Light0 : 1; // 1: use light
|
|
bool Light1 : 1; // 1: use light
|
|
bool Light2 : 1; // 1: use light
|
|
bool Light3 : 1; // 1: use light
|
|
unsigned AmbSrc : 1; // Ambient source. 0: use register, 1: Use CP supplied Vertex color/alpha
|
|
unsigned DiffuseAtten : 2; // DiffuseAtten function. 0: Use 1.0, 1: N.L signed, 2: N.L clamped to [0,1.0]
|
|
unsigned Atten : 1; // AttenEnable function. 0: Select 1.0, 1: Select Attenuation fraction
|
|
unsigned AttenSelect : 1; // AttenSelect function. 0: Select specular (N.H) attenuation, 1: Select diffuse spotlight (L.Ldir) attenuation
|
|
bool Light4 : 1; // 1: use light
|
|
bool Light5 : 1; // 1: use light
|
|
bool Light6 : 1; // 1: use light
|
|
bool Light7 : 1; // 1: use light
|
|
};
|
|
uint32_t bits;
|
|
};
|
|
|
|
union MatrixIndex0
|
|
{
|
|
struct
|
|
{
|
|
int PosNrmMatIdx : 6; // Geometry matrix index
|
|
int Tex0MatIdx : 6; // Tex0 matrix index
|
|
int Tex1MatIdx : 6; // Tex1 matrix index
|
|
int Tex2MatIdx : 6; // Tex2 matrix index
|
|
int Tex3MatIdx : 6; // Tex3 matrix index
|
|
};
|
|
uint32_t bits;
|
|
};
|
|
|
|
union MatrixIndex1
|
|
{
|
|
struct
|
|
{
|
|
int Tex4MatIdx : 6; // Tex4 matrix index
|
|
int Tex5MatIdx : 6; // Tex5 matrix index
|
|
int Tex6MatIdx : 6; // Tex6 matrix index
|
|
int Tex7MatIdx : 6; // Tex7 matrix index
|
|
};
|
|
uint32_t bits;
|
|
};
|
|
|
|
// Texgen inrow enum
|
|
enum class TexGenInrow
|
|
{
|
|
XF_TEXGEN_INROW_POSMTX = 0,
|
|
XF_TEXGEN_INROW_NORMAL,
|
|
XF_TEXGEN_INROW_COLORS,
|
|
XF_TEXGEN_INROW_BINORMAL_T,
|
|
XF_TEXGEN_INROW_BINORMAL_B,
|
|
XF_TEXGEN_INROW_TEX0,
|
|
XF_TEXGEN_INROW_TEX1,
|
|
XF_TEXGEN_INROW_TEX2,
|
|
XF_TEXGEN_INROW_TEX3,
|
|
XF_TEXGEN_INROW_TEX4,
|
|
XF_TEXGEN_INROW_TEX5,
|
|
XF_TEXGEN_INROW_TEX6,
|
|
XF_TEXGEN_INROW_TEX7
|
|
};
|
|
|
|
union TexGenParam
|
|
{
|
|
struct
|
|
{
|
|
unsigned Reserved : 1;
|
|
unsigned projection : 1; // texture projection 0: (s,t): texmul is 2x4 1: (s,t,q): texmul is 3x4
|
|
unsigned in_form : 1; // input form (format of source input data for regular textures) 0: (A, B, 1.0, 1.0) (used for regular texture source) 1: (A, B, C, 1.0) (used for geometry or normal source)
|
|
unsigned Reserved2 : 1;
|
|
unsigned type : 3; // texgen type 0: Regular transformation (transform incoming data), 1: texgen bump mapping, 2: Color texgen: (s,t)=(r,g:b) (g and b are concatenated), color0, 3: Color texgen: (s,t)=(r,g:b) (g and b are concatenated), color 1
|
|
TexGenInrow src_row : 5; // regular texture source row
|
|
unsigned bump_src : 3; // bump mapping source texture: n: use regular transformed tex(n) for bump mapping source
|
|
unsigned bump_light : 3; // Bump mapping source light: n: use light #n for bump map direction source (10 to 17)
|
|
};
|
|
uint32_t bits;
|
|
};
|
|
|
|
union DualGenParam
|
|
{
|
|
struct
|
|
{
|
|
unsigned dualidx : 6; // Indicates which is the base row of the dual transform matrix for regular texture coordinate
|
|
unsigned unused : 2;
|
|
unsigned norm : 1; // specifies if texture coordinate should be normalized before send transform
|
|
};
|
|
uint32_t bits;
|
|
};
|
|
|
|
struct XFState
|
|
{
|
|
// Matrix memory
|
|
|
|
float mvTexMtx[(size_t)XFRegister::XF_MATRIX_MEMORY_SIZE]; // 0x0000-0x00ff (IndexA)
|
|
float nrmMtx[(size_t)XFRegister::XF_NORMAL_MATRIX_MEMORY_SIZE]; // 0x0400-0x045f (IndexB)
|
|
float dualTexMtx[(size_t)XFRegister::XF_DUALTEX_MATRIX_MEMORY_SIZE]; // 0x0500-0x05ff (IndexC)
|
|
Light light[8]; // 0x0600-0x067f (IndexD)
|
|
|
|
// Other registers
|
|
|
|
ClipDisable clipDisable; // 0x1005
|
|
InVertexSpec vtxSpec; // 0x1008
|
|
uint32_t numColors; // 0x1009. Specifies the number of colors to output: 0: No xform colors active, 1: Xform supplies 1 color (host supplied or computed), 2: Xform supplies 2 colors (host supplied or computed)
|
|
Color ambient[2]; // 0x100a, 0x100b. 32b: RGBA (8b/comp) Ambient color0/1 specifications
|
|
Color material[2]; // 0x100c, 0x100d. 32b: RGBA (8b/comp) global color0/1 material specifications
|
|
ColorAlphaControl colorControl[2]; // 0x100e, 0x100f
|
|
ColorAlphaControl alphaControl[2]; // 0x1010, 0x1011
|
|
uint32_t dualTexTran; // 0x1012, B[0]: When set(1), enables dual transform for all texture coordinates. When reset (0), disables dual texture transform feature [rev B]
|
|
MatrixIndex0 matIdxA; // 0x1018
|
|
MatrixIndex1 matIdxB; // 0x1019
|
|
float viewportScale[3]; // 0x101a-0x101c. Viewport scale X,Y,Z
|
|
float viewportOffset[3]; // 0x101d-0x101f. Viewport offset X,Y,Z
|
|
float projectionParam[6]; // 0x1020-0x1025
|
|
bool projectOrtho; // 0x1026. If set selects orthographic otherwise non-orthographic
|
|
uint32_t numTex; // 0x103f. Number of active textures
|
|
TexGenParam tex[8]; // 0x1040-0x1047
|
|
DualGenParam dualTex[8]; // 0x1050-0x1057
|
|
};
|
|
|
|
#pragma pack(pop)
|
|
|
|
}
|