mirror of
https://github.com/ClassiCube/ClassiCube.git
synced 2025-09-11 00:26:28 -04:00
Vita: Change DPAD to instead be for flying up/down and cycling hotbar slot
3DS: Use optimised twiddled index calculation
This commit is contained in:
parent
2741a33a15
commit
3ca40dae17
@ -365,44 +365,57 @@ static bool CreateNativeTexture(C3D_Tex* tex, u32 width, u32 height, int vram) {
|
|||||||
return true;
|
return true;
|
||||||
}
|
}
|
||||||
|
|
||||||
static inline cc_uint32 CalcZOrder(cc_uint32 a) {
|
|
||||||
// Simplified "Interleave bits by Binary Magic Numbers" from
|
|
||||||
// http://graphics.stanford.edu/~seander/bithacks.html#InterleaveBMN
|
|
||||||
// TODO: Simplify to array lookup?
|
|
||||||
a = (a | (a << 2)) & 0x33;
|
|
||||||
a = (a | (a << 1)) & 0x55;
|
|
||||||
return a;
|
|
||||||
// equivalent to return (a & 1) | ((a & 2) << 1) | (a & 4) << 2;
|
|
||||||
// but compiles to less instructions
|
|
||||||
}
|
|
||||||
|
|
||||||
// Pixels are arranged in a recursive Z-order curve / Morton offset
|
// Pixels are arranged in a recursive Z-order curve / Morton offset
|
||||||
// They are arranged into 8x8 tiles, where each 8x8 tile is composed of
|
// They are arranged into 8x8 tiles, where each 8x8 tile is composed of
|
||||||
// four 4x4 subtiles, which are in turn composed of four 2x2 subtiles
|
// four 4x4 subtiles, which are in turn composed of four 2x2 subtiles
|
||||||
|
// http://problemkaputt.de/gbatek-3ds-video-texture-swizzling.htm
|
||||||
|
static CC_INLINE void TwiddleCalcFactors(unsigned w, unsigned h,
|
||||||
|
unsigned* maskX, unsigned* maskY) {
|
||||||
|
*maskX = 0b010101; // 3 interleaved X bits
|
||||||
|
*maskY = 0b101010; // 3 interleaved Y bits
|
||||||
|
|
||||||
|
// Lower 3 X and Y bits are always interleaved
|
||||||
|
w >>= 4;
|
||||||
|
h >>= 4;
|
||||||
|
int shift = 6;
|
||||||
|
|
||||||
|
for (; w > 0; w >>= 1) {
|
||||||
|
*maskX += 0x01 << shift;
|
||||||
|
shift += 1;
|
||||||
|
}
|
||||||
|
|
||||||
|
for (; h > 0; h >>= 1) {
|
||||||
|
*maskY += 0x01 << shift;
|
||||||
|
shift += 1;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
static void ToMortonTexture(C3D_Tex* tex, int originX, int originY,
|
static void ToMortonTexture(C3D_Tex* tex, int originX, int originY,
|
||||||
struct Bitmap* bmp, int rowWidth) {
|
struct Bitmap* bmp, int rowWidth) {
|
||||||
unsigned int mortonX, mortonY;
|
|
||||||
unsigned int dstX, dstY, tileX, tileY;
|
|
||||||
|
|
||||||
int src_w = bmp->width, dst_w = tex->width;
|
int src_w = bmp->width, dst_w = tex->width;
|
||||||
int src_h = bmp->height, dst_h = tex->height;
|
int src_h = bmp->height, dst_h = tex->height;
|
||||||
cc_uint32* dst = tex->data;
|
cc_uint32* dst = tex->data;
|
||||||
cc_uint32* src = bmp->scan0;
|
cc_uint32* src = bmp->scan0;
|
||||||
|
|
||||||
|
unsigned maskX, maskY;
|
||||||
|
TwiddleCalcFactors(dst_w, dst_h, &maskX, &maskY);
|
||||||
|
|
||||||
|
unsigned begX = 0, begY = 0;
|
||||||
|
// Calculate start twiddled X and Y values
|
||||||
|
for (int x = 0; x < originX; x++) { begX = (begX - maskX) & maskX; }
|
||||||
|
for (int y = 0; y < originY; y++) { begY = (begY - maskY) & maskY; }
|
||||||
|
|
||||||
|
unsigned Y = begY;
|
||||||
for (int y = 0; y < src_h; y++)
|
for (int y = 0; y < src_h; y++)
|
||||||
{
|
{
|
||||||
dstY = dst_h - 1 - (y + originY);
|
unsigned X = begX;
|
||||||
tileY = dstY & ~0x07;
|
|
||||||
mortonY = CalcZOrder(dstY & 0x07) << 1;
|
|
||||||
|
|
||||||
for (int x = 0; x < src_w; x++)
|
for (int x = 0; x < src_w; x++)
|
||||||
{
|
{
|
||||||
dstX = x + originX;
|
// need to flip image vertically
|
||||||
tileX = dstX & ~0x07;
|
dst[X | (maskY - Y)] = src[x];
|
||||||
mortonX = CalcZOrder(dstX & 0x07);
|
X = (X - maskX) & maskX;
|
||||||
|
|
||||||
dst[(mortonX | mortonY) + (tileX * 8) + (tileY * dst_w)] = src[x];
|
|
||||||
}
|
}
|
||||||
|
Y = (Y - maskY) & maskY;
|
||||||
src += rowWidth;
|
src += rowWidth;
|
||||||
}
|
}
|
||||||
// TODO flush data cache GSPGPU_FlushDataCache
|
// TODO flush data cache GSPGPU_FlushDataCache
|
||||||
|
@ -142,10 +142,6 @@ void Window_DisableRawMouse(void) { Input.RawMode = false; }
|
|||||||
*-------------------------------------------------------Gamepads----------------------------------------------------------*
|
*-------------------------------------------------------Gamepads----------------------------------------------------------*
|
||||||
*#########################################################################################################################*/
|
*#########################################################################################################################*/
|
||||||
static const BindMapping vita_padbinds[BIND_COUNT] = {
|
static const BindMapping vita_padbinds[BIND_COUNT] = {
|
||||||
[BIND_FORWARD] = { CCPAD_UP },
|
|
||||||
[BIND_BACK] = { CCPAD_DOWN },
|
|
||||||
[BIND_LEFT] = { CCPAD_LEFT },
|
|
||||||
[BIND_RIGHT] = { CCPAD_RIGHT },
|
|
||||||
[BIND_JUMP] = { CCPAD_1 },
|
[BIND_JUMP] = { CCPAD_1 },
|
||||||
[BIND_SET_SPAWN] = { CCPAD_START },
|
[BIND_SET_SPAWN] = { CCPAD_START },
|
||||||
[BIND_CHAT] = { CCPAD_4 },
|
[BIND_CHAT] = { CCPAD_4 },
|
||||||
@ -154,10 +150,12 @@ static const BindMapping vita_padbinds[BIND_COUNT] = {
|
|||||||
[BIND_SPEED] = { CCPAD_2, CCPAD_L },
|
[BIND_SPEED] = { CCPAD_2, CCPAD_L },
|
||||||
[BIND_NOCLIP] = { CCPAD_2, CCPAD_3 },
|
[BIND_NOCLIP] = { CCPAD_2, CCPAD_3 },
|
||||||
[BIND_FLY] = { CCPAD_2, CCPAD_R },
|
[BIND_FLY] = { CCPAD_2, CCPAD_R },
|
||||||
[BIND_FLY_UP] = { CCPAD_2, CCPAD_UP },
|
|
||||||
[BIND_FLY_DOWN] = { CCPAD_2, CCPAD_DOWN },
|
|
||||||
[BIND_PLACE_BLOCK] = { CCPAD_L },
|
[BIND_PLACE_BLOCK] = { CCPAD_L },
|
||||||
[BIND_DELETE_BLOCK] = { CCPAD_R },
|
[BIND_DELETE_BLOCK] = { CCPAD_R },
|
||||||
|
[BIND_FLY_UP] = { CCPAD_UP },
|
||||||
|
[BIND_FLY_DOWN] = { CCPAD_DOWN },
|
||||||
|
[BIND_HOTBAR_LEFT] = { CCPAD_LEFT },
|
||||||
|
[BIND_HOTBAR_RIGHT] = { CCPAD_RIGHT },
|
||||||
|
|
||||||
};
|
};
|
||||||
static cc_bool circle_main;
|
static cc_bool circle_main;
|
||||||
|
Loading…
x
Reference in New Issue
Block a user