make 3d work, broken lights

This commit is contained in:
olebeck 2025-06-27 17:20:25 +02:00
parent 5f9b9675eb
commit 4aad9a9786
7 changed files with 76 additions and 68 deletions

View File

@ -166,6 +166,7 @@ class LegoInputManager : public MxPresenter {
const bool* m_keyboardState; const bool* m_keyboardState;
MxBool m_unk0x195; // 0x195 MxBool m_unk0x195; // 0x195
SDL_JoystickID* m_joyids; SDL_JoystickID* m_joyids;
MxS32 m_numJoysticks;
SDL_Joystick* m_joystick; SDL_Joystick* m_joystick;
MxS32 m_joystickIndex; // 0x19c MxS32 m_joystickIndex; // 0x19c
MxBool m_useJoystick; // 0x334 MxBool m_useJoystick; // 0x334

View File

@ -152,12 +152,11 @@ MxResult LegoInputManager::GetJoystick()
return SUCCESS; return SUCCESS;
} }
MxS32 numJoysticks = 0;
if (m_joyids == NULL) { if (m_joyids == NULL) {
m_joyids = SDL_GetJoysticks(&numJoysticks); m_joyids = SDL_GetJoysticks(&m_numJoysticks);
} }
if (m_useJoystick != FALSE && numJoysticks != 0) { if (m_useJoystick != FALSE && m_numJoysticks != 0) {
MxS32 joyid = m_joystickIndex; MxS32 joyid = m_joystickIndex;
if (joyid >= 0) { if (joyid >= 0) {
m_joystick = SDL_OpenJoystick(m_joyids[joyid]); m_joystick = SDL_OpenJoystick(m_joyids[joyid]);
@ -166,7 +165,7 @@ MxResult LegoInputManager::GetJoystick()
} }
} }
for (joyid = 0; joyid < numJoysticks; joyid++) { for (joyid = 0; joyid < m_numJoysticks; joyid++) {
m_joystick = SDL_OpenJoystick(m_joyids[joyid]); m_joystick = SDL_OpenJoystick(m_joyids[joyid]);
if (m_joystick != NULL) { if (m_joystick != NULL) {
return SUCCESS; return SUCCESS;

View File

@ -482,28 +482,28 @@ static void CreateOrthoMatrix(float left, float right, float bottom, float top,
{ {
float near = -1.0f; float near = -1.0f;
float far = 1.0f; float far = 1.0f;
float width = right - left; float rl = right - left;
float height = top - bottom; float tb = top - bottom;
float depth = far - near; float fn = far - near;
outMatrix[0][0] = 2.0f / width; outMatrix[0][0] = 2.0f / rl;
outMatrix[0][1] = 0.0f; outMatrix[0][1] = 0.0f;
outMatrix[0][2] = 0.0f; outMatrix[0][2] = 0.0f;
outMatrix[0][3] = -(right + left) / width; // translation x outMatrix[0][3] = 0.0f;
outMatrix[1][0] = 0.0f; outMatrix[1][0] = 0.0f;
outMatrix[1][1] = 2.0f / height; outMatrix[1][1] = 2.0f / tb;
outMatrix[1][2] = 0.0f; outMatrix[1][2] = 0.0f;
outMatrix[1][3] = -(top + bottom) / height; // translation y outMatrix[1][3] = 0.0f;
outMatrix[2][0] = 0.0f; outMatrix[2][0] = 0.0f;
outMatrix[2][1] = 0.0f; outMatrix[2][1] = 0.0f;
outMatrix[2][2] = -2.0f / depth; outMatrix[2][2] = -2.0f / fn;
outMatrix[2][3] = -(far + near) / depth; // translation z outMatrix[2][3] = 0.0f;
outMatrix[3][0] = 0.0f; outMatrix[3][0] = -(right + left) / rl;
outMatrix[3][1] = 0.0f; outMatrix[3][1] = -(top + bottom) / tb;
outMatrix[3][2] = 0.0f; outMatrix[3][2] = -(far + near) / fn;
outMatrix[3][3] = 1.0f; outMatrix[3][3] = 1.0f;
} }
@ -567,7 +567,6 @@ void GXMRenderer::SetFrustumPlanes(const Plane* frustumPlanes)
void GXMRenderer::SetProjection(const D3DRMMATRIX4D& projection, D3DVALUE front, D3DVALUE back) void GXMRenderer::SetProjection(const D3DRMMATRIX4D& projection, D3DVALUE front, D3DVALUE back)
{ {
memcpy(&m_projection, projection, sizeof(D3DRMMATRIX4D)); memcpy(&m_projection, projection, sizeof(D3DRMMATRIX4D));
m_projection[1][1] *= -1.0f; // GXM is upside down
} }
struct TextureDestroyContextGXM { struct TextureDestroyContextGXM {
@ -590,22 +589,24 @@ void GXMRenderer::AddTextureDestroyCallback(Uint32 id, IDirect3DRMTexture* textu
); );
} }
static void convertTextureMetadata(SDL_Surface* surface, bool* supportedFormat, SceGxmTextureFormat* textureFormat, size_t* textureSize, size_t* textureAlignment) { static void convertTextureMetadata(SDL_Surface* surface, bool* supportedFormat, SceGxmTextureFormat* textureFormat, size_t* textureSize, size_t* textureAlignment, size_t* textureStride) {
*supportedFormat = true; *supportedFormat = true;
*textureAlignment = SCE_GXM_TEXTURE_ALIGNMENT; *textureAlignment = SCE_GXM_TEXTURE_ALIGNMENT;
switch(surface->format) { switch(surface->format) {
case SDL_PIXELFORMAT_ABGR8888: { case SDL_PIXELFORMAT_ABGR8888: {
*textureFormat = SCE_GXM_TEXTURE_FORMAT_U8U8U8U8_ABGR; *textureFormat = SCE_GXM_TEXTURE_FORMAT_U8U8U8U8_ABGR;
*textureSize = surface->h * surface->pitch; *textureSize = surface->h * surface->pitch;
*textureStride = surface->pitch;
break; break;
} }
/* crashes when opening the guestbook for some reason /*
case SDL_PIXELFORMAT_INDEX8: { case SDL_PIXELFORMAT_INDEX8: {
*textureFormat = SCE_GXM_TEXTURE_FORMAT_P8_ABGR; *textureFormat = SCE_GXM_TEXTURE_FORMAT_P8_ABGR;
int pixelsSize = surface->h * surface->pitch; int pixelsSize = surface->h * surface->pitch;
int alignBytes = ALIGNMENT(pixelsSize, SCE_GXM_PALETTE_ALIGNMENT); int alignBytes = ALIGNMENT(pixelsSize, SCE_GXM_PALETTE_ALIGNMENT);
*textureSize = pixelsSize + alignBytes + 0xff; *textureSize = pixelsSize + alignBytes + 0xff;
*textureAlignment = SCE_GXM_PALETTE_ALIGNMENT; *textureAlignment = SCE_GXM_PALETTE_ALIGNMENT;
*textureStride = surface->pitch;
break; break;
} }
*/ */
@ -615,6 +616,12 @@ static void convertTextureMetadata(SDL_Surface* surface, bool* supportedFormat,
} }
} }
void copySurfaceTo(SDL_Surface* src, void* dstData, size_t textureStride) {
SDL_Surface* dst = SDL_CreateSurfaceFrom(src->w, src->h, SDL_PIXELFORMAT_ABGR8888, dstData, textureStride);
SDL_BlitSurface(src, nullptr, dst, nullptr);
SDL_DestroySurface(dst);
}
Uint32 GXMRenderer::GetTextureId(IDirect3DRMTexture* iTexture) Uint32 GXMRenderer::GetTextureId(IDirect3DRMTexture* iTexture)
{ {
auto texture = static_cast<Direct3DRMTextureImpl*>(iTexture); auto texture = static_cast<Direct3DRMTextureImpl*>(iTexture);
@ -624,9 +631,19 @@ Uint32 GXMRenderer::GetTextureId(IDirect3DRMTexture* iTexture)
bool supportedFormat; bool supportedFormat;
size_t textureSize; size_t textureSize;
size_t textureAlignment; size_t textureAlignment;
size_t textureStride;
SceGxmTextureFormat textureFormat; SceGxmTextureFormat textureFormat;
int textureWidth = surface->m_surface->w;
int textureHeight = surface->m_surface->h;
convertTextureMetadata(surface->m_surface, &supportedFormat, &textureFormat, &textureSize, &textureAlignment); convertTextureMetadata(surface->m_surface, &supportedFormat, &textureFormat, &textureSize, &textureAlignment, &textureStride);
if(!supportedFormat) {
textureAlignment = SCE_GXM_TEXTURE_ALIGNMENT;
textureStride = textureWidth * 4;
textureSize = textureHeight * textureStride;
textureFormat = SCE_GXM_TEXTURE_FORMAT_U8U8U8U8_ABGR;
}
for (Uint32 i = 0; i < m_textures.size(); ++i) { for (Uint32 i = 0; i < m_textures.size(); ++i) {
auto& tex = m_textures[i]; auto& tex = m_textures[i];
@ -634,13 +651,7 @@ Uint32 GXMRenderer::GetTextureId(IDirect3DRMTexture* iTexture)
if (tex.version != texture->m_version) { if (tex.version != texture->m_version) {
void* textureData = sceGxmTextureGetData(&tex.gxmTexture); void* textureData = sceGxmTextureGetData(&tex.gxmTexture);
if(!supportedFormat) { if(!supportedFormat) {
SDL_ConvertPixels( copySurfaceTo(surface->m_surface, textureData, textureStride);
surface->m_surface->w, surface->m_surface->h,
surface->m_surface->format,
surface->m_surface->pixels,
surface->m_surface->pitch,
SDL_PIXELFORMAT_ABGR8888, textureData, surface->m_surface->pitch
);
} else { } else {
memcpy(textureData, surface->m_surface->pixels, textureSize); memcpy(textureData, surface->m_surface->pixels, textureSize);
} }
@ -650,32 +661,16 @@ Uint32 GXMRenderer::GetTextureId(IDirect3DRMTexture* iTexture)
} }
} }
int textureWidth = surface->m_surface->w;
int textureHeight = surface->m_surface->h;
int textureStride = surface->m_surface->pitch;
SDL_Log("Create Texture %s w=%d h=%d s=%d", SDL_Log("Create Texture %s w=%d h=%d s=%d",
SDL_GetPixelFormatName(surface->m_surface->format), textureWidth, textureHeight, textureStride); SDL_GetPixelFormatName(surface->m_surface->format), textureWidth, textureHeight, textureStride);
if(!supportedFormat) {
textureAlignment = SCE_GXM_TEXTURE_ALIGNMENT;
textureSize = textureHeight * textureStride * 4;
textureFormat = SCE_GXM_TEXTURE_FORMAT_U8U8U8U8_ABGR;
}
// allocate gpu memory // allocate gpu memory
void* textureData = sceClibMspaceMemalign(this->m_data.cdramPool, textureAlignment, textureSize); void* textureData = sceClibMspaceMemalign(this->m_data.cdramPool, textureAlignment, textureSize);
uint8_t* paletteData = nullptr; uint8_t* paletteData = nullptr;
if(!supportedFormat) { if(!supportedFormat) {
SDL_Log("unsupported SDL texture format %s, falling back on SDL_PIXELFORMAT_ABGR8888", SDL_GetPixelFormatName(surface->m_surface->format)); SDL_Log("unsupported SDL texture format %s, falling back on SDL_PIXELFORMAT_ABGR8888", SDL_GetPixelFormatName(surface->m_surface->format));
SDL_ConvertPixels( copySurfaceTo(surface->m_surface, textureData, textureStride);
surface->m_surface->w, surface->m_surface->h,
surface->m_surface->format,
surface->m_surface->pixels,
surface->m_surface->pitch,
SDL_PIXELFORMAT_ABGR8888, textureData, surface->m_surface->pitch
);
} }
else if(surface->m_surface->format == SDL_PIXELFORMAT_INDEX8) else if(surface->m_surface->format == SDL_PIXELFORMAT_INDEX8)
{ {
@ -685,6 +680,7 @@ Uint32 GXMRenderer::GetTextureId(IDirect3DRMTexture* iTexture)
int pixelsSize = surface->m_surface->w * surface->m_surface->h; int pixelsSize = surface->m_surface->w * surface->m_surface->h;
int alignBytes = ALIGNMENT(pixelsSize, SCE_GXM_PALETTE_ALIGNMENT); int alignBytes = ALIGNMENT(pixelsSize, SCE_GXM_PALETTE_ALIGNMENT);
SDL_Log("copying indexed texture data from=%p to=%p", surface->m_surface->pixels, textureData);
memcpy(textureData, surface->m_surface->pixels, pixelsSize); memcpy(textureData, surface->m_surface->pixels, pixelsSize);
paletteData = (uint8_t*)textureData + pixelsSize + alignBytes; paletteData = (uint8_t*)textureData + pixelsSize + alignBytes;
@ -692,6 +688,7 @@ Uint32 GXMRenderer::GetTextureId(IDirect3DRMTexture* iTexture)
} }
else else
{ {
SDL_Log("copying texture data from=%p to=%p", surface->m_surface->pixels, textureData);
memcpy(textureData, surface->m_surface->pixels, textureSize); memcpy(textureData, surface->m_surface->pixels, textureSize);
} }
@ -709,13 +706,14 @@ Uint32 GXMRenderer::GetTextureId(IDirect3DRMTexture* iTexture)
tex.texture = texture; tex.texture = texture;
tex.version = texture->m_version; tex.version = texture->m_version;
tex.gxmTexture = gxmTexture; tex.gxmTexture = gxmTexture;
tex.textureSize = textureSize;
AddTextureDestroyCallback(i, texture); AddTextureDestroyCallback(i, texture);
return i; return i;
} }
} }
Uint32 textureId = (Uint32) (m_textures.size() - 1);
m_textures.push_back({texture, texture->m_version, gxmTexture}); m_textures.push_back({texture, texture->m_version, gxmTexture});
Uint32 textureId = (Uint32) (m_textures.size() - 1);
AddTextureDestroyCallback(textureId, texture); AddTextureDestroyCallback(textureId, texture);
return textureId; return textureId;
} }
@ -873,10 +871,12 @@ int frames = 0;
HRESULT GXMRenderer::BeginFrame() HRESULT GXMRenderer::BeginFrame()
{ {
frames++; frames++;
if(with_razor && !razor_triggered && frames == 10) { if(with_razor) {
SDL_Log("trigger razor in 10 frames"); if(!razor_triggered && frames == 10) {
sceRazorGpuCaptureSetTriggerNextFrame("ux0:/data/capture.sgx"); SDL_Log("trigger razor");
razor_triggered = true; sceRazorGpuCaptureSetTriggerNextFrame("ux0:/data/capture.sgx");
razor_triggered = true;
}
} }
this->transparencyEnabled = false; this->transparencyEnabled = false;
@ -916,12 +916,20 @@ void GXMRenderer::EnableTransparency() {
this->transparencyEnabled = true; this->transparencyEnabled = true;
} }
void transpose4x4(const float src[4][4], float dst[4][4]) { static void transpose4x4(const float src[4][4], float dst[4][4]) {
for (int i = 0; i < 4; ++i) for (int i = 0; i < 4; ++i)
for (int j = 0; j < 4; ++j) for (int j = 0; j < 4; ++j)
dst[j][i] = src[i][j]; dst[j][i] = src[i][j];
} }
static const D3DRMMATRIX4D identity4x4 = {
{1.0, 0.0, 0.0, 0.0},
{0.0, 1.0, 0.0, 0.0},
{0.0, 0.0, 1.0, 0.0},
{0.0, 0.0, 0.0, 1.0},
};
void GXMRenderer::SubmitDraw( void GXMRenderer::SubmitDraw(
DWORD meshId, DWORD meshId,
const D3DRMMATRIX4D& modelViewMatrix, const D3DRMMATRIX4D& modelViewMatrix,
@ -948,13 +956,15 @@ void GXMRenderer::SubmitDraw(
sceGxmReserveVertexDefaultUniformBuffer(this->m_data.context, &vertUniforms); sceGxmReserveVertexDefaultUniformBuffer(this->m_data.context, &vertUniforms);
sceGxmReserveFragmentDefaultUniformBuffer(this->m_data.context, &fragUniforms); sceGxmReserveFragmentDefaultUniformBuffer(this->m_data.context, &fragUniforms);
/*
D3DRMMATRIX4D modelViewMatrixTrans; D3DRMMATRIX4D modelViewMatrixTrans;
D3DRMMATRIX4D projectionTrans; D3DRMMATRIX4D projectionTrans;
transpose4x4(modelViewMatrix, modelViewMatrixTrans); transpose4x4(modelViewMatrix, modelViewMatrixTrans);
transpose4x4(m_projection, projectionTrans); transpose4x4(m_projection, projectionTrans);
*/
SET_UNIFORM(vertUniforms, this->m_data.uModelViewMatrix, modelViewMatrixTrans); SET_UNIFORM(vertUniforms, this->m_data.uModelViewMatrix, modelViewMatrix);
SET_UNIFORM(vertUniforms, this->m_data.uProjectionMatrix, projectionTrans); SET_UNIFORM(vertUniforms, this->m_data.uProjectionMatrix, m_projection);
SET_UNIFORM(vertUniforms, this->m_data.uNormalMatrix, normalMatrix); SET_UNIFORM(vertUniforms, this->m_data.uNormalMatrix, normalMatrix);
float color[4] = { float color[4] = {
@ -1019,16 +1029,9 @@ void GXMRenderer::Clear(float r, float g, float b) {
D3DRMMATRIX4D projection; D3DRMMATRIX4D projection;
CreateOrthoMatrix(0.0, 1.0, 1.0, 0.0, projection); CreateOrthoMatrix(0.0, 1.0, 1.0, 0.0, projection);
D3DRMMATRIX4D identity;
memset(identity, 0, sizeof(identity));
identity[0][0] = 1.0f;
identity[1][1] = 1.0f;
identity[2][2] = 1.0f;
identity[3][3] = 1.0f;
Matrix3x3 normal = {{1.f, 0.f, 0.f}, {0.f, 1.f, 0.f}, {0.f, 0.f, 1.f}}; Matrix3x3 normal = {{1.f, 0.f, 0.f}, {0.f, 1.f, 0.f}, {0.f, 0.f, 1.f}};
SET_UNIFORM(vertUniforms, this->m_data.uModelViewMatrix, identity); // float4x4 SET_UNIFORM(vertUniforms, this->m_data.uModelViewMatrix, identity4x4); // float4x4
SET_UNIFORM(vertUniforms, this->m_data.uNormalMatrix, normal); // float3x3 SET_UNIFORM(vertUniforms, this->m_data.uNormalMatrix, normal); // float3x3
SET_UNIFORM(vertUniforms, this->m_data.uProjectionMatrix, projection); // float4x4 SET_UNIFORM(vertUniforms, this->m_data.uProjectionMatrix, projection); // float4x4
@ -1041,10 +1044,10 @@ void GXMRenderer::Clear(float r, float g, float b) {
float y2 = y1 + 1.0; float y2 = y1 + 1.0;
Vertex* quadVertices = this->GetQuadVertices(); Vertex* quadVertices = this->GetQuadVertices();
quadVertices[0] = Vertex{ .position = {x1, y1, 0}, .normal = {0,0,0}, .texCoord = {0,0}}; quadVertices[0] = Vertex{ .position = {x1, y1, -1.0}, .normal = {0,0,0}, .texCoord = {0,0}};
quadVertices[1] = Vertex{ .position = {x2, y1, 0}, .normal = {0,0,0}, .texCoord = {0,0}}; quadVertices[1] = Vertex{ .position = {x2, y1, -1.0}, .normal = {0,0,0}, .texCoord = {0,0}};
quadVertices[2] = Vertex{ .position = {x1, y2, 0}, .normal = {0,0,0}, .texCoord = {0,0}}; quadVertices[2] = Vertex{ .position = {x1, y2, -1.0}, .normal = {0,0,0}, .texCoord = {0,0}};
quadVertices[3] = Vertex{ .position = {x2, y2, 0}, .normal = {0,0,0}, .texCoord = {0,0}}; quadVertices[3] = Vertex{ .position = {x2, y2, -1.0}, .normal = {0,0,0}, .texCoord = {0,0}};
sceGxmSetVertexStream(this->m_data.context, 0, quadVertices); sceGxmSetVertexStream(this->m_data.context, 0, quadVertices);
sceGxmDraw( sceGxmDraw(
@ -1153,12 +1156,16 @@ void GXMRenderer::Draw2DImage(Uint32 textureId, const SDL_Rect& srcRect, const S
quadVertices[3] = Vertex{ .position = {x2, y2, 0}, .normal = {0,0,0}, .texCoord = {u2, v2}}; quadVertices[3] = Vertex{ .position = {x2, y2, 0}, .normal = {0,0,0}, .texCoord = {u2, v2}};
sceGxmSetVertexStream(this->m_data.context, 0, quadVertices); sceGxmSetVertexStream(this->m_data.context, 0, quadVertices);
sceGxmSetFrontDepthWriteEnable(this->m_data.context, SCE_GXM_DEPTH_WRITE_DISABLED);
sceGxmDraw( sceGxmDraw(
this->m_data.context, this->m_data.context,
SCE_GXM_PRIMITIVE_TRIANGLE_STRIP, SCE_GXM_PRIMITIVE_TRIANGLE_STRIP,
SCE_GXM_INDEX_FORMAT_U16, SCE_GXM_INDEX_FORMAT_U16,
this->m_data.quadIndices, 4 this->m_data.quadIndices, 4
); );
sceGxmSetFrontDepthWriteEnable(this->m_data.context, SCE_GXM_DEPTH_WRITE_ENABLED);
sceGxmPopUserMarker(this->m_data.context); sceGxmPopUserMarker(this->m_data.context);
} }
@ -1173,7 +1180,7 @@ void GXMRenderer::Download(SDL_Surface* target) {
SDL_Surface* src = SDL_CreateSurfaceFrom( SDL_Surface* src = SDL_CreateSurfaceFrom(
this->m_width, this->m_height, this->m_width, this->m_height,
SDL_PIXELFORMAT_RGBA32, SDL_PIXELFORMAT_RGBA32,
this->m_data.displayBuffers[this->backBufferIndex], VITA_GXM_SCREEN_STRIDE this->m_data.displayBuffers[this->frontBufferIndex], VITA_GXM_SCREEN_STRIDE
); );
SDL_BlitSurfaceScaled(src, &srcRect, target, nullptr, SDL_SCALEMODE_NEAREST); SDL_BlitSurfaceScaled(src, &srcRect, target, nullptr, SDL_SCALEMODE_NEAREST);
SDL_DestroySurface(src); SDL_DestroySurface(src);

View File

@ -3,9 +3,9 @@ void main(
float3 aNormal : NORMAL, float3 aNormal : NORMAL,
float2 aTexCoord : TEXCOORD0, float2 aTexCoord : TEXCOORD0,
uniform float4x4 uModelViewMatrix, column_major uniform float4x4 uModelViewMatrix,
uniform float3x3 uNormalMatrix, uniform float3x3 uNormalMatrix,
uniform float4x4 uProjectionMatrix, column_major uniform float4x4 uProjectionMatrix,
out float4 vPosition : POSITION, out float4 vPosition : POSITION,
out float3 vViewPos : TEXCOORD1, out float3 vViewPos : TEXCOORD1,

View File

@ -32,7 +32,7 @@
return ret; \ return ret; \
} }
static void printMatrix4x4(float mat[4][4]) { static void printMatrix4x4(const float mat[4][4]) {
sceClibPrintf("mat4{\n"); sceClibPrintf("mat4{\n");
for(int i = 0; i < 4; i++) { for(int i = 0; i < 4; i++) {
sceClibPrintf("%f %f %f %f\n", mat[i][0], mat[i][1], mat[i][2], mat[i][3]); sceClibPrintf("%f %f %f %f\n", mat[i][0], mat[i][1], mat[i][2], mat[i][3]);

View File

@ -20,6 +20,7 @@ struct GXMTextureCacheEntry {
IDirect3DRMTexture* texture; IDirect3DRMTexture* texture;
Uint32 version; Uint32 version;
SceGxmTexture gxmTexture; SceGxmTexture gxmTexture;
size_t textureSize;
}; };
struct GXMMeshCacheEntry { struct GXMMeshCacheEntry {