show flyers option. new3d. ui improvements
@@ -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.
|
||||
|
||||
|
||||
@@ -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);
|
||||
|
||||
@@ -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")
|
||||
|
||||
|
After Width: | Height: | Size: 238 KiB |
|
After Width: | Height: | Size: 350 KiB |
|
After Width: | Height: | Size: 464 KiB |
|
After Width: | Height: | Size: 351 KiB |
|
After Width: | Height: | Size: 436 KiB |
|
After Width: | Height: | Size: 358 KiB |
|
After Width: | Height: | Size: 438 KiB |
|
After Width: | Height: | Size: 398 KiB |
|
After Width: | Height: | Size: 459 KiB |
|
After Width: | Height: | Size: 452 KiB |
|
After Width: | Height: | Size: 364 KiB |
|
After Width: | Height: | Size: 347 KiB |
|
After Width: | Height: | Size: 432 KiB |
|
After Width: | Height: | Size: 518 KiB |
|
After Width: | Height: | Size: 376 KiB |
|
After Width: | Height: | Size: 305 KiB |
|
After Width: | Height: | Size: 417 KiB |