Compare commits

...

10 commits

Author SHA1 Message Date
Shinovon
653d313413 Update todo 2026-05-15 09:09:32 +05:00
Shinovon
ad5d8af63b Detect whether rendering on powervr or videocore 2026-05-14 13:53:24 +05:00
Shinovon
78e6740735 Supress logging 2026-05-14 13:52:53 +05:00
Shinovon
3bec747ea6 Check for stdcpp installation in pkg 2026-05-14 12:36:32 +05:00
Shinovon
7e3f0685a3 Update readme 2026-05-13 11:56:03 +05:00
Shinovon
0f1389bb3e Update readme 2026-05-13 11:52:05 +05:00
Shinovon
4029e8ac5d Update todo 2026-05-12 22:49:50 +05:00
Shinovon
8cdae37d6e Bump pkg version 2026-05-12 22:46:35 +05:00
Shinovon
a3847a9768 VC4 fixes
Fixed lags on specific conditions, skinning
2026-05-12 22:44:44 +05:00
Shinovon
2829feffad Enable mission retry 2026-05-12 14:02:36 +05:00
15 changed files with 78 additions and 24 deletions

View file

@ -1,7 +1,6 @@
# re3-symbian
Work-in-progress port of GTA III for Symbian devices.\
Supports S60 3rd Edition FP1, S60 5th edition Symbian^3 and later.
Work-in-progress port of GTA III for Symbian devices.
Based on re3, uses some code from [Dreamcast](https://gitlab.com/skmp/dca3-game) and [Vita](https://github.com/Rinnegatamante/librw-vita) ports.
@ -9,6 +8,13 @@ Based on re3, uses some code from [Dreamcast](https://gitlab.com/skmp/dca3-game)
See [TODO.md](/TODO.md) for more details on project state.
## Device requirements
- S60 3rd Edition FP1, S60 5th Edition (non-Nokia), Symbian^3 or later
- GPU
- 128 MB RAM with at least 50 MB free (won't run on regular 64 MB N95 unless you disable all textures)
- Functional E: drive with 400 MB of free space (will be more as it'll start to support audio)
Tested devices:
- Belle with BCM2763 (700) - GLES 2.0
- Anna/Belle with BCM2727 (E7, N8, E6) - GLES 2.0

15
TODO.md
View file

@ -10,19 +10,20 @@ Common:
- [x] Merge S60v3 and ^3 branches
- [ ] Simplify geometry
- [ ] Move map to top left corner
- [ ] Do something with sprites, they're still taking too much frame time
- [ ] Too many draw calls
- [ ] Audio
GLES 2.0 specific:
- [x] Optimize to always run 10+ fps
- [x] Fix skinning shader (cutscene heads require it)
- [x] Fix face animations in optimized builds
- [x] Disappearing background in cutscenes
- [x] Huge lag spikes on VC4
- [x] Skinning shader is still broken on VC4
- [ ] Optimize to always run 20+ fps
- [ ] Use etc1 compression
- [ ] Fix face animations in optimized builds
- [ ] Skinning shader is still broken on VC4
- [ ] Disappearing background in cutscenes
- [ ] HUD still disappearing sometimes
- [ ] Huge lag spikes on VC4
- [ ] HUD still disappearing sometimes on VC3
- [ ] Effects are slowing the render on VC4
GLES 1.1 specific:
- [x] Backport to STLport v4
@ -35,6 +36,6 @@ GLES 1.1 specific:
- [ ] Fix lighting
Issues:
- [x] Fix crash in Texture::destroy on exit
- [ ] Fix crash in Texture::destroy on exit
- [x] Save menu is too slow
- [x] Crash when picking up a bat

View file

@ -25,4 +25,4 @@ SOURCEPATH ../vendor/librw/src/ps2
SOURCE pds.cpp ps2.cpp ps2device.cpp ps2matfx.cpp ps2raster.cpp ps2skin.cpp
SOURCEPATH ../vendor/librw/src
SOURCE raster.cpp render.cpp skin.cpp texture.cpp tga.cpp tristrip.cpp userdata.cpp uvanim.cpp world.cpp
SOURCE assert.cpp
SOURCE assert.cpp printf_stub.c

View file

@ -1,4 +1,4 @@
#{"GTA III"},(0xe0d67647),1,0,2
#{"GTA III"},(0xe0d67647),1,0,3
[0x101F7961], 0, 0, 0, {"S60ProductID"} ; S60v3
[0x1028315F], 0, 0, 0, {"S60ProductID"} ; ^1

View file

@ -1,4 +1,4 @@
#{"GTA III"},(0xe0d67647),1,0,2
#{"GTA III"},(0xe0d67647),1,0,3
[0x101F7961], 0, 0, 0, {"S60ProductID"} ; S60v3
[0x1028315F], 0, 0, 0, {"S60ProductID"} ; ^1
@ -7,7 +7,7 @@
%{"nnproject"}
:"nnproject"
IF (NOT package(0x20009A80)) OR (NOT package(0x2002372A)) ; old or missing openc
IF (NOT package(0x20009A80)) OR (NOT package(0x2002372A)) OR (NOT package(0x10282872)) ; old or missing openc
"incompatible_openc.txt"-"", FT, FORCEABORT
ENDIF

View file

@ -394,9 +394,9 @@ enum Config {
#define USE_MEASUREMENTS_IN_METERS // makes game use meters instead of feet in script
#define USE_PRECISE_MEASUREMENT_CONVERTION // makes game convert feet to meeters more precisely
#ifdef PC_MENU
//# define MISSION_REPLAY // mobile feature
# define MISSION_REPLAY // mobile feature
#endif
//#define SIMPLIER_MISSIONS // apply simplifications from mobile
#define SIMPLIER_MISSIONS // apply simplifications from mobile
#define USE_ADVANCED_SCRIPT_DEBUG_OUTPUT
#define SCRIPT_LOG_FILE_LEVEL 0 // 0 == no log, 1 == overwrite every frame, 2 == full log

View file

@ -1403,10 +1403,10 @@ RenderScene(void)
}
#endif
PUSH_RENDERGROUP("RenderScene");
// CClouds::Render();
CClouds::Render();
DoRWRenderHorizon();
CRenderer::RenderRoads();
// CCoronas::RenderReflections();
CCoronas::RenderReflections();
RwRenderStateSet(rwRENDERSTATEFOGENABLE, (void*)TRUE);
CRenderer::RenderEverythingBarRoads();
CRenderer::RenderBoats();
@ -1416,7 +1416,7 @@ RenderScene(void)
#ifndef SQUEEZE_PERFORMANCE
CRenderer::RenderVehiclesButNotBoats();
#endif
// CWeather::RenderRainStreaks();
CWeather::RenderRainStreaks();
POP_RENDERGROUP();
}

View file

@ -137,10 +137,10 @@ void
CSpecialFX::Render(void)
{
PUSH_RENDERGROUP("CSpecialFX::Render");
// CMotionBlurStreaks::Render();
CMotionBlurStreaks::Render();
CBulletTraces::Render();
// CBrightLights::Render();
// CShinyTexts::Render();
CBrightLights::Render();
CShinyTexts::Render();
CMoneyMessages::Render();
#ifdef NEW_RENDERER
if(!(gbNewRenderer && FredIsInFirstPersonCam()))

View file

@ -96,6 +96,7 @@ static bool spinning;
bool qwerty;
bool touch;
bool moreVram;
bool powervr;
void _InputTranslateShiftKeyUpDown(RsKeyCodes *rs) {
}
@ -574,6 +575,17 @@ public:
eglMakeCurrent(eglDisplay, eglSurface, eglSurface, eglContext);
const char* renderer = (const char *)glGetString(GL_RENDERER);
if (strstr(renderer, "MBX") || strstr(renderer, "SGX")) {
// use pvrtc
powervr = true;
} else if (strstr(renderer, "VideoCore")) {
// use etc1
} else {
User::Leave(KErrNotSupported);
return;
}
setlocale(LC_ALL, "");
setlocale(LC_CTYPE, "C");
setlocale(LC_COLLATE, "C");

View file

@ -118,6 +118,11 @@ im2DRenderPrimitive(PrimitiveType primType, void *vertices, int32 numVertices)
glEnableVertexAttribArray(ATTRIB_TEXCOORDS0);
glVertexAttribPointer(ATTRIB_TEXCOORDS0, 2, GL_FLOAT, GL_FALSE, sizeof(Im2DVertex), (uint8*)vertices + OFFSET_OF(Im2DVertex, u));
glDisableVertexAttribArray(ATTRIB_NORMAL);
glDisableVertexAttribArray(ATTRIB_WEIGHTS);
glDisableVertexAttribArray(ATTRIB_INDICES);
glDisableVertexAttribArray(ATTRIB_TEXCOORDS1);
glDrawArrays(primTypeMap[primType], 0, numVertices);
glDisableVertexAttribArray(ATTRIB_POS);
@ -151,6 +156,11 @@ im2DRenderIndexedPrimitive(PrimitiveType primType,
glEnableVertexAttribArray(ATTRIB_TEXCOORDS0);
glVertexAttribPointer(ATTRIB_TEXCOORDS0, 2, GL_FLOAT, GL_FALSE, sizeof(Im2DVertex), (uint8*)vertices + OFFSET_OF(Im2DVertex, u));
glDisableVertexAttribArray(ATTRIB_NORMAL);
glDisableVertexAttribArray(ATTRIB_WEIGHTS);
glDisableVertexAttribArray(ATTRIB_INDICES);
glDisableVertexAttribArray(ATTRIB_TEXCOORDS1);
glDrawElements(primTypeMap[primType], numIndices, GL_UNSIGNED_SHORT, indices);
glDisableVertexAttribArray(ATTRIB_POS);
@ -221,6 +231,11 @@ im3DRenderPrimitive(PrimitiveType primType)
glEnableVertexAttribArray(ATTRIB_TEXCOORDS0);
glVertexAttribPointer(ATTRIB_TEXCOORDS0, 2, GL_FLOAT, GL_FALSE, sizeof(Im3DVertex), (uint8*)currentIm3dVertices + OFFSET_OF(Im3DVertex, u));
glDisableVertexAttribArray(ATTRIB_NORMAL);
glDisableVertexAttribArray(ATTRIB_WEIGHTS);
glDisableVertexAttribArray(ATTRIB_INDICES);
glDisableVertexAttribArray(ATTRIB_TEXCOORDS1);
glDrawArrays(primTypeMap[primType], 0, num3DVertices);
glDisableVertexAttribArray(ATTRIB_POS);
@ -245,6 +260,11 @@ im3DRenderIndexedPrimitive(PrimitiveType primType, void *indices, int32 numIndic
glEnableVertexAttribArray(ATTRIB_TEXCOORDS0);
glVertexAttribPointer(ATTRIB_TEXCOORDS0, 2, GL_FLOAT, GL_FALSE, sizeof(Im3DVertex), (uint8*)currentIm3dVertices + OFFSET_OF(Im3DVertex, u));
glDisableVertexAttribArray(ATTRIB_NORMAL);
glDisableVertexAttribArray(ATTRIB_WEIGHTS);
glDisableVertexAttribArray(ATTRIB_INDICES);
glDisableVertexAttribArray(ATTRIB_TEXCOORDS1);
glDrawElements(primTypeMap[primType], numIndices, GL_UNSIGNED_SHORT, indices);
glDisableVertexAttribArray(ATTRIB_POS);

View file

@ -189,8 +189,13 @@ compileshader(GLenum type, const char **src, GLuint *shader)
glShaderSource(shdr, n, src, nil);
glCompileShader(shdr);
glGetShaderiv(shdr, GL_COMPILE_STATUS, &success);
#ifdef _DEBUG
printShaderSource(src);
#endif
if(!success){
#ifndef _DEBUG
printShaderSource(src);
#endif
fprintf(stderr, "Error in %s shader\n",
type == GL_VERTEX_SHADER ? "vertex" : "fragment");
glGetShaderiv(shdr, GL_INFO_LOG_LENGTH, &len);

View file

@ -342,7 +342,6 @@ skinClose(void *o, int32, int32)
void
initSkin(void)
{
if (moreVram) return; // TODO
u_boneMatrices = registerUniform("u_boneMatrices", UNIFORM_MAT4, MAX_BONES);
Driver::registerPlugin(PLATFORM_GL3, 0, ID_SKIN,

View file

@ -13,7 +13,7 @@ main(void)
SkinVertex += (u_boneMatrices[int(in_indices.x)] * vec4(in_pos, 1.0)).xyz * in_weights.x;
SkinVertex += (u_boneMatrices[int(in_indices.y)] * vec4(in_pos, 1.0)).xyz * in_weights.y;
SkinVertex += (u_boneMatrices[int(in_indices.z)] * vec4(in_pos, 1.0)).xyz * in_weights.z;
SkinVertex += (u_boneMatrices[int(in_indices.w)] * vec4(in_pos, 1.0)).xyz * in_weights.w;
//SkinVertex += (u_boneMatrices[int(in_indices.w)] * vec4(in_pos, 1.0)).xyz * in_weights.w;
vec4 Vertex = u_world * vec4(SkinVertex, 1.0);
gl_Position = u_proj * u_view * Vertex;

View file

@ -14,7 +14,7 @@ const char *skin_vert_src =
" SkinVertex += (u_boneMatrices[int(in_indices.x)] * vec4(in_pos, 1.0)).xyz * in_weights.x;\n"
" SkinVertex += (u_boneMatrices[int(in_indices.y)] * vec4(in_pos, 1.0)).xyz * in_weights.y;\n"
" SkinVertex += (u_boneMatrices[int(in_indices.z)] * vec4(in_pos, 1.0)).xyz * in_weights.z;\n"
" SkinVertex += (u_boneMatrices[int(in_indices.w)] * vec4(in_pos, 1.0)).xyz * in_weights.w;\n"
" //SkinVertex += (u_boneMatrices[int(in_indices.w)] * vec4(in_pos, 1.0)).xyz * in_weights.w;\n"
" vec4 Vertex = u_world * vec4(SkinVertex, 1.0);\n"
" gl_Position = u_proj * u_view * Vertex;\n"

11
vendor/librw/src/printf_stub.c vendored Normal file
View file

@ -0,0 +1,11 @@
#ifndef _DEBUG
#include <stdio.h>
int printf(const char * __restrict s, ...) {
return 0;
}
int puts(const char *s) {
return 0;
}
#endif