From 1fbb50ab9279db645a41bb2f18253a65031f7c0c Mon Sep 17 00:00:00 2001 From: izzy2lost Date: Tue, 13 Jan 2026 00:33:36 -0500 Subject: [PATCH] fix some graphic glitches --- Src/Graphics/New3D/New3D.cpp | 29 ++++++++++++++++--- Src/Graphics/Render2D.h | 2 +- android/app/build.gradle.kts | 18 ++++-------- android/app/src/main/cpp/native-lib.cpp | 4 +-- android/app/src/main/cpp/render2d_android.cpp | 10 ++++--- 5 files changed, 40 insertions(+), 23 deletions(-) diff --git a/Src/Graphics/New3D/New3D.cpp b/Src/Graphics/New3D/New3D.cpp index f6827de..474fe4f 100644 --- a/Src/Graphics/New3D/New3D.cpp +++ b/Src/Graphics/New3D/New3D.cpp @@ -377,7 +377,7 @@ void CNew3D::RenderFrame(void) #ifdef __ANDROID__ if (!m_new3dAccurate) { // Android/GLES: basic mesh path (no multi-pass transparency compositing yet). - for (int i = 0; i < 4; i++) { + for (int i = 0; i < 4; i++) { m_nfPairs[i].zNear = -std::numeric_limits::max(); m_nfPairs[i].zFar = std::numeric_limits::max(); } @@ -425,15 +425,17 @@ void CNew3D::RenderFrame(void) for (int pri = 0; pri <= 3; pri++) { if (SkipLayer(pri)) continue; - // Opaque pass. + // Reset depth per priority so layer ordering matches the hardware behavior. + glClear(GL_DEPTH_BUFFER_BIT); + + // Opaque pass (non-overlay). SetRenderStates(); m_r3dShader.DiscardAlpha(true); glDisable(GL_BLEND); RenderScene(pri, false, Layer::colour); - RenderScene(pri, true, Layer::colour); DisableRenderStates(); - // Translucent pass (rough): draw both layers with blending. + // Translucent pass (rough): non-overlay with blending. SetRenderStates(); m_r3dShader.DiscardAlpha(false); glEnable(GL_BLEND); @@ -441,6 +443,25 @@ void CNew3D::RenderFrame(void) glDepthMask(GL_FALSE); RenderScene(pri, false, Layer::trans1); RenderScene(pri, false, Layer::trans2); + glDepthMask(GL_TRUE); + DisableRenderStates(); + + // Clear depth so high-priority polys are not occluded by lower-priority geometry. + glClear(GL_DEPTH_BUFFER_BIT); + + // Opaque pass (overlay). + SetRenderStates(); + m_r3dShader.DiscardAlpha(true); + glDisable(GL_BLEND); + RenderScene(pri, true, Layer::colour); + DisableRenderStates(); + + // Translucent pass (overlay). + SetRenderStates(); + m_r3dShader.DiscardAlpha(false); + glEnable(GL_BLEND); + glBlendFunc(GL_SRC_ALPHA, GL_ONE_MINUS_SRC_ALPHA); + glDepthMask(GL_FALSE); RenderScene(pri, true, Layer::trans1); RenderScene(pri, true, Layer::trans2); glDepthMask(GL_TRUE); diff --git a/Src/Graphics/Render2D.h b/Src/Graphics/Render2D.h index 789110e..6821f93 100644 --- a/Src/Graphics/Render2D.h +++ b/Src/Graphics/Render2D.h @@ -53,7 +53,7 @@ public: void AttachRegisters(const uint32_t *regPtr); bool Init(unsigned xOffset, unsigned yOffset, unsigned xRes, unsigned yRes, unsigned totalXRes, unsigned totalYRes); - const uint32_t* GetFrameBufferRGBA() const { return m_frame.data(); } + const uint32_t* GetFrameBufferARGB() const { return m_frame.data(); } const uint32_t* GetTopSurfaceARGB() const { return m_topSurface.data(); } unsigned GetFrameWidth() const { return m_xPixels; } unsigned GetFrameHeight() const { return m_yPixels; } diff --git a/android/app/build.gradle.kts b/android/app/build.gradle.kts index dc8888b..1c440a0 100644 --- a/android/app/build.gradle.kts +++ b/android/app/build.gradle.kts @@ -6,16 +6,16 @@ plugins { android { namespace = "com.izzy2lost.super3" compileSdk = 36 + buildToolsVersion = "36.1.0" + ndkVersion = "29.0.14206865" defaultConfig { applicationId = "com.izzy2lost.super3" minSdk = 26 targetSdk = 36 - versionCode = 10 - versionName = "1.0.9" - - ndkVersion = "29.0.14206865" + versionCode = 11 + versionName = "1.1.0" ndk { abiFilters += listOf("arm64-v8a") @@ -54,11 +54,9 @@ android { } compileOptions { - sourceCompatibility = JavaVersion.VERSION_17 - targetCompatibility = JavaVersion.VERSION_17 + sourceCompatibility = JavaVersion.VERSION_21 + targetCompatibility = JavaVersion.VERSION_21 } - buildToolsVersion = "36.1.0" - ndkVersion = "29.0.14206865" } dependencies { @@ -69,7 +67,3 @@ dependencies { implementation("androidx.recyclerview:recyclerview:1.4.0") implementation("com.google.android.material:material:1.14.0-alpha07") } - -kotlin { - jvmToolchain(17) -} diff --git a/android/app/src/main/cpp/native-lib.cpp b/android/app/src/main/cpp/native-lib.cpp index c70321c..e436577 100644 --- a/android/app/src/main/cpp/native-lib.cpp +++ b/android/app/src/main/cpp/native-lib.cpp @@ -49,7 +49,7 @@ public: { if (m_presenter && m_render2d && m_render2d->HasFrame()) { - const uint32_t* pixels = m_render2d->GetFrameBufferRGBA(); + const uint32_t* pixels = m_render2d->GetFrameBufferARGB(); m_presenter->UpdateFrameARGB(pixels, (int)m_render2d->GetFrameWidth(), (int)m_render2d->GetFrameHeight()); m_presenter->Render(false); } @@ -1021,7 +1021,7 @@ extern "C" int SDL_main(int argc, char* argv[]) { presenter.SetStretch(wideBackground); host.RunFrame(); if (host.render2d.HasFrame()) { - const uint32_t* pixels = host.render2d.GetFrameBufferRGBA(); + const uint32_t* pixels = host.render2d.GetFrameBufferARGB(); presenter.UpdateFrameARGB(pixels, (int)host.render2d.GetFrameWidth(), (int)host.render2d.GetFrameHeight()); presenter.Render(false); } diff --git a/android/app/src/main/cpp/render2d_android.cpp b/android/app/src/main/cpp/render2d_android.cpp index 0835b35..a1acdc7 100644 --- a/android/app/src/main/cpp/render2d_android.cpp +++ b/android/app/src/main/cpp/render2d_android.cpp @@ -9,10 +9,12 @@ #include "Util/NewConfig.h" namespace { -static inline uint8_t GetA(uint32_t argb) { return static_cast(argb >> 24); } -static inline uint8_t GetR(uint32_t argb) { return static_cast(argb >> 16); } -static inline uint8_t GetG(uint32_t argb) { return static_cast(argb >> 8); } -static inline uint8_t GetB(uint32_t argb) { return static_cast(argb >> 0); } +// Palette data from Model 3 hardware is in little-endian format (ABGR when viewed as 32-bit). +// We extract and store in ARGB format (0xAARRGGBB) for the presenter. +static inline uint8_t GetA(uint32_t abgr) { return static_cast(abgr >> 24); } +static inline uint8_t GetR(uint32_t abgr) { return static_cast(abgr >> 0); } +static inline uint8_t GetG(uint32_t abgr) { return static_cast(abgr >> 8); } +static inline uint8_t GetB(uint32_t abgr) { return static_cast(abgr >> 16); } static inline uint32_t ARGB(uint8_t a, uint8_t r, uint8_t g, uint8_t b) { return (uint32_t(a) << 24) | (uint32_t(r) << 16) | (uint32_t(g) << 8) | uint32_t(b);