show flyers option. new3d. ui improvements

This commit is contained in:
izzy2lost
2025-12-25 00:19:16 -05:00
parent 6432547924
commit 62985edf4e
72 changed files with 890 additions and 74 deletions
+6 -1
View File
@@ -11,6 +11,7 @@ This app does **not** include any games, ROMs, BIOS files, or copyrighted game c
- Virtual on-screen steering wheel for driving games (when supported by the title).
- Save states (10 slots) with automatic screenshot thumbnails and tap-to-preview.
- In-game pause/resume button.
- Game flyers (front/back) in the launcher list.
## Video settings (Resolution & Widescreen)
From the main game list, open the side menu (toolbar "menu" icon) and look under **Video**.
@@ -27,6 +28,10 @@ These settings are written to `.../Android/data/<package>/files/super3/Config/Su
- Save states and thumbnails are stored under the app's user data directory in `Saves/` (for example: `.../Android/data/<package>/files/super3/Saves/`).
- The app may offer an optional "sync"/export workflow using Android's Storage Access Framework. If enabled, the app only accesses the folder(s) you explicitly choose.
## Flyers
- Flyers are installed to `.../Android/data/<package>/files/super3/Flyers/` as `<game>_front.png` and `<game>_back.png`.
- You can replace or add files in that folder to customize artwork.
## Legal / Google Play Policy Notes
- **No games included:** SUPER3 does not ship with ROMs or game data, and it is not intended to facilitate piracy.
- **You must own the games:** Only use ROMs you are legally permitted to use in your region.
@@ -34,7 +39,7 @@ These settings are written to `.../Android/data/<package>/files/super3/Config/Su
- **Not affiliated:** This project is not affiliated with or endorsed by SEGA or any arcade hardware manufacturer.
## Privacy
- SUPER3 does not require the `INTERNET` permission and is designed to run offline.
- SUPER3 is designed to run offline and does not require network access.
- The app stores emulator settings, save states, and screenshots locally on your device.
- If you opt into selecting a user folder for syncing/export, access is limited to the folder you select via the system file picker.
+42 -6
View File
@@ -3,6 +3,7 @@
#include "Vec.h"
#include <cmath>
#include <algorithm>
#include <cstdint>
#include <limits>
#include <cstring>
#include <unordered_map>
@@ -284,6 +285,40 @@ bool CNew3D::SkipLayer(int layer)
return true;
}
namespace {
struct FVertexOffsets
{
std::size_t pos;
std::size_t normal;
std::size_t texcoords;
std::size_t fixedShade;
std::size_t faceColour;
std::size_t faceNormal;
};
static void* VboOffset(std::size_t offset)
{
return reinterpret_cast<void*>(static_cast<std::uintptr_t>(offset));
}
static const FVertexOffsets& GetFVertexOffsets()
{
static const FVertexOffsets offsets = [] {
FVertex v {};
const auto* base = reinterpret_cast<const unsigned char*>(&v);
return FVertexOffsets {
static_cast<std::size_t>(reinterpret_cast<const unsigned char*>(v.pos) - base),
static_cast<std::size_t>(reinterpret_cast<const unsigned char*>(v.normal) - base),
static_cast<std::size_t>(reinterpret_cast<const unsigned char*>(v.texcoords) - base),
static_cast<std::size_t>(reinterpret_cast<const unsigned char*>(&v.fixedShade) - base),
static_cast<std::size_t>(reinterpret_cast<const unsigned char*>(v.faceColour) - base),
static_cast<std::size_t>(reinterpret_cast<const unsigned char*>(v.faceNormal) - base),
};
}();
return offsets;
}
} // namespace
void CNew3D::SetRenderStates()
{
m_vbo.Bind(true);
@@ -297,12 +332,13 @@ void CNew3D::SetRenderStates()
glEnableVertexAttribArray(5);
// before draw, specify vertex and index arrays with their offsets, offsetof is maybe evil ..
glVertexAttribPointer(m_r3dShader.GetVertexAttribPos("inVertex"), 4, GL_FLOAT, GL_FALSE, sizeof(FVertex), 0);
glVertexAttribPointer(m_r3dShader.GetVertexAttribPos("inNormal"), 3, GL_FLOAT, GL_FALSE, sizeof(FVertex), (void*)offsetof(FVertex, normal));
glVertexAttribPointer(m_r3dShader.GetVertexAttribPos("inTexCoord"), 2, GL_FLOAT, GL_FALSE, sizeof(FVertex), (void*)offsetof(FVertex, texcoords));
glVertexAttribPointer(m_r3dShader.GetVertexAttribPos("inColour"), 4, GL_UNSIGNED_BYTE, GL_TRUE, sizeof(FVertex), (void*)offsetof(FVertex, faceColour));
glVertexAttribPointer(m_r3dShader.GetVertexAttribPos("inFaceNormal"), 3, GL_FLOAT, GL_FALSE, sizeof(FVertex), (void*)offsetof(FVertex, faceNormal));
glVertexAttribPointer(m_r3dShader.GetVertexAttribPos("inFixedShade"), 1, GL_FLOAT, GL_FALSE, sizeof(FVertex), (void*)offsetof(FVertex, fixedShade));
const auto& offsets = GetFVertexOffsets();
glVertexAttribPointer(m_r3dShader.GetVertexAttribPos("inVertex"), 4, GL_FLOAT, GL_FALSE, sizeof(FVertex), VboOffset(offsets.pos));
glVertexAttribPointer(m_r3dShader.GetVertexAttribPos("inNormal"), 3, GL_FLOAT, GL_FALSE, sizeof(FVertex), VboOffset(offsets.normal));
glVertexAttribPointer(m_r3dShader.GetVertexAttribPos("inTexCoord"), 2, GL_FLOAT, GL_FALSE, sizeof(FVertex), VboOffset(offsets.texcoords));
glVertexAttribPointer(m_r3dShader.GetVertexAttribPos("inColour"), 4, GL_UNSIGNED_BYTE, GL_TRUE, sizeof(FVertex), VboOffset(offsets.faceColour));
glVertexAttribPointer(m_r3dShader.GetVertexAttribPos("inFaceNormal"), 3, GL_FLOAT, GL_FALSE, sizeof(FVertex), VboOffset(offsets.faceNormal));
glVertexAttribPointer(m_r3dShader.GetVertexAttribPos("inFixedShade"), 1, GL_FLOAT, GL_FALSE, sizeof(FVertex), VboOffset(offsets.fixedShade));
glDepthFunc (GL_LEQUAL);
glEnable (GL_DEPTH_TEST);
+1
View File
@@ -62,6 +62,7 @@ android {
dependencies {
implementation("androidx.core:core-ktx:1.15.0")
implementation("androidx.appcompat:appcompat:1.7.0")
implementation("androidx.constraintlayout:constraintlayout:2.1.4")
implementation("androidx.documentfile:documentfile:1.0.1")
implementation("androidx.recyclerview:recyclerview:1.4.0")
implementation("com.google.android.material:material:1.14.0-alpha07")
Binary file not shown.

After

Width:  |  Height:  |  Size: 238 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 350 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 464 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 351 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 436 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 358 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 438 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 398 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 459 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 452 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 364 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 347 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 432 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 518 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 376 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 305 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 417 KiB

Some files were not shown because too many files have changed in this diff Show More