diff --git a/.gitignore b/.gitignore
index 38ad5d7..296cd6a 100644
--- a/.gitignore
+++ b/.gitignore
@@ -1,3 +1,8 @@
+.cproject
+.project
+*.bat
+*.sis
+
## Ignore Visual Studio temporary files, build results, and
## files generated by popular Visual Studio add-ons.
##
diff --git a/README.md b/README.md
new file mode 100644
index 0000000..6e0fc97
--- /dev/null
+++ b/README.md
@@ -0,0 +1,24 @@
+# re3-symbian
+
+Work-in-progress port of GTA III for Symbian^3 using GLES 2.0
+
+Based on re3, uses some code from [Dreamcast](https://gitlab.com/skmp/dca3-game) and [Vita](https://github.com/Rinnegatamante/librw-vita) ports.
+
+## State
+
+Currently compiles and runs normally on Nokia 700 (Belle FP1), and with texture glitches on Nokia N8 (Symbian Anna) and Nokia E7 (Belle Refresh).
+
+See [TODO.md](/TODO.md) for more details on project state
+
+## Building
+
+Import bld.inf in Carbide.c++ with Symbian^3 or newer SDK, add PKG file to SIS Builder and build the project.
+
+I use Carbide.c++ 3.2, Symbian Belle SDK with sbsv2 from QtSDK and RVCT 4.0, but it should also work with GCCE 4.4.1.
+
+## License (copied from original README)
+
+We don't feel like we're in a position to give this code a license.\
+The code should only be used for educational, documentation and modding purposes.\
+We do not encourage piracy or commercial use.\
+Please keep derivate work open source and give proper credit.
diff --git a/TODO.md b/TODO.md
new file mode 100644
index 0000000..af22fd2
--- /dev/null
+++ b/TODO.md
@@ -0,0 +1,15 @@
+- [x] Make it compile
+- [x] Window implementation
+- [x] Fix shader compilation
+- [x] Downscale textures
+- [x] Optimize to always run 10+ fps
+- [x] Fit in 32MB VRAM to run on N8, E7, E6, etc.
+- [ ] Optimize to always run 20+ fps
+- [ ] Fix skinning shader (cutscene heads require it)
+- [ ] Use etc1 compression
+- [ ] Touch controls
+- [ ] Keyboard controls
+
+S60v3 (?):
+- [ ] Backport to STLport v4
+- [ ] GLES 1.1 engine
\ No newline at end of file
diff --git a/group/Icons_scalable_dc.mk b/group/Icons_scalable_dc.mk
new file mode 100644
index 0000000..b28211c
--- /dev/null
+++ b/group/Icons_scalable_dc.mk
@@ -0,0 +1,47 @@
+ifeq (WINS,$(findstring WINS, $(PLATFORM)))
+ZDIR=$(EPOCROOT)epoc32\release\$(PLATFORM)\$(CFG)\Z
+else
+ZDIR=$(EPOCROOT)epoc32\data\z
+endif
+
+TARGETDIR=$(ZDIR)\resource\apps
+ICONTARGETFILENAME=$(TARGETDIR)\re3_icon.mif
+
+ICONDIR=.
+
+do_nothing :
+ @rem do_nothing
+
+MAKMAKE : do_nothing
+
+BLD : do_nothing
+
+CLEAN :
+ @echo ...Deleting $(ICONTARGETFILENAME)
+ del /q /f $(ICONTARGETFILENAME)
+
+LIB : do_nothing
+
+CLEANLIB : do_nothing
+
+# ----------------------------------------------------------------------------
+# NOTE: if you have JUSTINTIME enabled for your S60 3rd FP1 or newer SDK
+# and this command crashes, consider adding "/X" to the command line.
+# See
+# ----------------------------------------------------------------------------
+
+RESOURCE : $(ICONTARGETFILENAME)
+
+$(ICONTARGETFILENAME) : $(ICONDIR)\qgn_menu_re3.svg
+ mifconv $(ICONTARGETFILENAME) \
+ /c32 $(ICONDIR)\qgn_menu_re3.svg
+
+FREEZE : do_nothing
+
+SAVESPACE : do_nothing
+
+RELEASABLES :
+ @echo $(ICONTARGETFILENAME)
+
+FINAL : do_nothing
+
diff --git a/group/bld.inf b/group/bld.inf
new file mode 100644
index 0000000..abf4d0e
--- /dev/null
+++ b/group/bld.inf
@@ -0,0 +1,8 @@
+PRJ_PLATFORMS
+DEFAULT ARMV6
+
+PRJ_MMPFILES
+gnumakefile Icons_scalable_dc.mk
+gnumakefile shaders.mk
+librw.mmp
+re3.mmp
diff --git a/group/common.mmh b/group/common.mmh
new file mode 100644
index 0000000..48e8aaa
--- /dev/null
+++ b/group/common.mmh
@@ -0,0 +1,28 @@
+SYSTEMINCLUDE /epoc32/include
+SYSTEMINCLUDE /epoc32/include/stdapis/stlportv5
+SYSTEMINCLUDE /epoc32/include/stdapis
+SYSTEMINCLUDE /epoc32/include/mw
+SYSTEMINCLUDE /epoc32/include/platform
+SYSTEMINCLUDE /epoc32/include/platform/mw
+SYSTEMINCLUDE /epoc32/include/gles
+
+USERINCLUDE .
+
+MACRO LIBRW
+MACRO RW_GL3
+MACRO MASTER
+
+DEBUGGABLE
+#ifdef _DEBUG
+SRCDBG
+#endif
+
+OPTION ARMCC --gnu -Otime --diag_suppress 1,68,111,174,381,1293
+OPTION_REPLACE ARMCC --cpu 6
+OPTION_REPLACE ARMCC --fpu softvfp+vfpv2 --fpmode fast
+OPTION_REPLACE ARMCC -O2 -O3
+#ifdef ARMCC
+ALWAYS_BUILD_AS_ARM
+#endif
+
+STDCPP
diff --git a/group/librw.mmp b/group/librw.mmp
new file mode 100644
index 0000000..b7f216c
--- /dev/null
+++ b/group/librw.mmp
@@ -0,0 +1,28 @@
+#include "common.mmh"
+
+TARGET librw.lib
+TARGETTYPE lib
+
+
+USERINCLUDE ../vendor/librw
+USERINCLUDE ../vendor/librw/src
+
+SOURCEPATH ../vendor/librw/src
+SOURCE anim.cpp base.cpp bmp.cpp camera.cpp charset.cpp clump.cpp
+SOURCEPATH ../vendor/librw/src/d3d
+SOURCE d3d.cpp d3d8.cpp d3d8matfx.cpp d3d8render.cpp d3d8skin.cpp d3d9.cpp d3d9matfx.cpp d3d9render.cpp d3d9skin.cpp d3ddevice.cpp d3dimmed.cpp d3drender.cpp xbox.cpp xboxmatfx.cpp xboxskin.cpp xboxvfmt.cpp
+SOURCEPATH ../vendor/librw/src
+SOURCE engine.cpp error.cpp frame.cpp geometry.cpp geoplg.cpp
+SOURCEPATH ../vendor/librw/src/gl
+SOURCE gl3.cpp gl3device.cpp gl3immed.cpp gl3matfx.cpp gl3pipe.cpp gl3raster.cpp gl3render.cpp gl3shader.cpp gl3skin.cpp wdgl.cpp
+SOURCEPATH ../vendor/librw/src
+SOURCE hanim.cpp image.cpp light.cpp
+SOURCEPATH ../vendor/librw/src/lodepng
+SOURCE lodepng.cpp
+SOURCEPATH ../vendor/librw/src
+SOURCE matfx.cpp pipeline.cpp plg.cpp png.cpp prim.cpp
+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
diff --git a/group/qgn_menu_re3.svg b/group/qgn_menu_re3.svg
new file mode 100644
index 0000000..c7b2140
--- /dev/null
+++ b/group/qgn_menu_re3.svg
@@ -0,0 +1,10 @@
+
+
diff --git a/group/re3.mmp b/group/re3.mmp
new file mode 100644
index 0000000..f076f56
--- /dev/null
+++ b/group/re3.mmp
@@ -0,0 +1,113 @@
+#include "common.mmh"
+
+TARGET re3.exe
+TARGETTYPE exe
+UID 0 0xe0d67647
+
+LIBRARY euser.lib
+LIBRARY libstdcppv5.lib
+LIBRARY libc.lib
+LIBRARY libm.lib
+LIBRARY libpthread.lib
+LIBRARY libglesv2.lib
+LIBRARY libegl.lib
+LIBRARY apparc.lib
+LIBRARY cone.lib
+LIBRARY eikcore.lib
+LIBRARY avkon.lib
+LIBRARY ws32.lib
+LIBRARY hal.lib
+
+EPOCSTACKSIZE 0x14000
+EPOCHEAPSIZE 0x80000 0x4000000
+
+STATICLIBRARY librw.lib
+
+SYSTEMINCLUDE ../vendor/librw
+
+SOURCEPATH .
+START RESOURCE re3.rss
+HEADER
+TARGETPATH \resource\apps
+LANG SC
+END
+
+START RESOURCE re3_reg.rss
+TARGETPATH \private\10003a3f\import\apps
+END
+
+CAPABILITY NetworkServices ReadUserData WriteUserData
+
+USERINCLUDE ../src
+USERINCLUDE ../src/animation
+USERINCLUDE ../src/audio
+USERINCLUDE ../src/buildings
+USERINCLUDE ../src/collision
+USERINCLUDE ../src/control
+USERINCLUDE ../src/core
+USERINCLUDE ../src/entities
+USERINCLUDE ../src/extras
+USERINCLUDE ../src/fakerw
+USERINCLUDE ../src/math
+USERINCLUDE ../src/modelinfo
+USERINCLUDE ../src/objects
+USERINCLUDE ../src/peds
+USERINCLUDE ../src/renderer
+USERINCLUDE ../src/rw
+USERINCLUDE ../src/save
+USERINCLUDE ../src/skel
+USERINCLUDE ../src/text
+USERINCLUDE ../src/vehicles
+USERINCLUDE ../src/weapons
+
+SOURCEPATH ../src/animation
+SOURCE AnimBlendAssocGroup.cpp AnimBlendAssociation.cpp AnimBlendClumpData.cpp AnimBlendHierarchy.cpp AnimBlendNode.cpp AnimBlendSequence.cpp AnimManager.cpp Bones.cpp CutsceneMgr.cpp FrameUpdate.cpp RpAnimBlend.cpp
+SOURCEPATH ../src/audio
+SOURCE AudioCollision.cpp AudioLogic.cpp AudioManager.cpp AudioScriptObject.cpp DMAudio.cpp MusicManager.cpp PolRadio.cpp
+SOURCEPATH ../src/audio/oal
+SOURCE aldlist.cpp channel.cpp oal_utils.cpp stream.cpp
+SOURCEPATH ../src/audio
+SOURCE sampman_miles.cpp sampman_null.cpp sampman_oal.cpp
+SOURCEPATH ../src/buildings
+SOURCE Building.cpp Treadable.cpp
+SOURCEPATH ../src/collision
+SOURCE ColBox.cpp ColLine.cpp ColModel.cpp ColPoint.cpp ColSphere.cpp ColTriangle.cpp Collision.cpp TempColModels.cpp VuCollision.cpp
+SOURCEPATH ../src/control
+SOURCE AutoPilot.cpp Bridge.cpp CarAI.cpp CarCtrl.cpp Curves.cpp Darkel.cpp GameLogic.cpp Garages.cpp NameGrid.cpp OnscreenTimer.cpp PathFind.cpp Phones.cpp Pickups.cpp PowerPoints.cpp Record.cpp Remote.cpp Replay.cpp Restart.cpp RoadBlocks.cpp SceneEdit.cpp Script.cpp Script2.cpp Script3.cpp Script4.cpp Script5.cpp Script6.cpp ScriptDebug.cpp TrafficLights.cpp
+SOURCEPATH ../src/core
+SOURCE Accident.cpp AnimViewer.cpp Cam.cpp Camera.cpp CdStream.cpp CdStreamPosix.cpp Clock.cpp ControllerConfig.cpp Debug.cpp Directory.cpp EventList.cpp FileLoader.cpp FileMgr.cpp Fire.cpp FrontEndControls.cpp Frontend.cpp Frontend_PS2.cpp Game.cpp IniFile.cpp Lists.cpp MenuScreens.cpp MenuScreensCustom.cpp Pad.cpp Placeable.cpp PlayerInfo.cpp Pools.cpp Profile.cpp Radar.cpp Range2D.cpp Range3D.cpp References.cpp Stats.cpp Streaming.cpp SurfaceTable.cpp TimeStep.cpp Timer.cpp User.cpp Wanted.cpp World.cpp ZoneCull.cpp Zones.cpp main.cpp obrstr.cpp re3.cpp timebars.cpp
+SOURCEPATH ../src/entities
+SOURCE Dummy.cpp Entity.cpp Physical.cpp
+SOURCEPATH ../src/extras
+SOURCE custompipes.cpp custompipes_d3d9.cpp custompipes_gl.cpp debugmenu.cpp frontendoption.cpp postfx.cpp screendroplets.cpp
+SOURCEPATH ../src/fakerw
+SOURCE fake.cpp
+SOURCEPATH ../src/math
+SOURCE Matrix.cpp Quaternion.cpp Rect.cpp Vector.cpp math.cpp
+SOURCEPATH ../src/modelinfo
+SOURCE BaseModelInfo.cpp ClumpModelInfo.cpp MloModelInfo.cpp ModelIndices.cpp ModelInfo.cpp PedModelInfo.cpp SimpleModelInfo.cpp TimeModelInfo.cpp VehicleModelInfo.cpp
+SOURCEPATH ../src/objects
+SOURCE CutsceneHead.cpp CutsceneObject.cpp DummyObject.cpp Object.cpp ObjectData.cpp ParticleObject.cpp Projectile.cpp
+SOURCEPATH ../src/peds
+SOURCE CivilianPed.cpp CopPed.cpp EmergencyPed.cpp Gangs.cpp Ped.cpp PedAI.cpp PedChat.cpp PedDebug.cpp PedFight.cpp PedIK.cpp PedPlacement.cpp PedRoutes.cpp PedType.cpp PlayerPed.cpp Population.cpp
+SOURCEPATH ../src/renderer
+SOURCE Antennas.cpp Clouds.cpp Console.cpp Coronas.cpp Credits.cpp Draw.cpp Fluff.cpp Font.cpp Glass.cpp Hud.cpp Instance.cpp Lines.cpp MBlur.cpp Particle.cpp ParticleMgr.cpp PlayerSkin.cpp PointLights.cpp RenderBuffer.cpp Renderer.cpp Rubbish.cpp Shadows.cpp Skidmarks.cpp SpecialFX.cpp Sprite.cpp Sprite2d.cpp TexList.cpp Timecycle.cpp WaterCannon.cpp WaterLevel.cpp Weather.cpp
+SOURCEPATH ../src/rw
+SOURCE ClumpRead.cpp Lights.cpp MemoryHeap.cpp MemoryMgr.cpp NodeName.cpp RwHelper.cpp RwMatFX.cpp RwPS2AlphaTest.cpp TexRead.cpp TexturePools.cpp TxdStore.cpp VisibilityPlugins.cpp
+SOURCEPATH ../src/save
+SOURCE Date.cpp GenericGameStorage.cpp MemoryCard.cpp PCSave.cpp
+SOURCEPATH ../src/skel
+SOURCE crossplatform.cpp events.cpp
+SOURCEPATH ../src/skel
+SOURCE skeleton.cpp
+SOURCEPATH ../src/skel/symbian
+SOURCE symbian.cpp
+SOURCEPATH ../src/text
+SOURCE Messages.cpp Pager.cpp Text.cpp
+SOURCEPATH ../src/vehicles
+SOURCE Automobile.cpp Boat.cpp CarGen.cpp Cranes.cpp DamageManager.cpp Door.cpp Floater.cpp HandlingMgr.cpp Heli.cpp Plane.cpp Train.cpp Transmission.cpp Vehicle.cpp
+SOURCEPATH ../src/weapons
+SOURCE BulletInfo.cpp Explosion.cpp ProjectileInfo.cpp ShotInfo.cpp Weapon.cpp WeaponEffects.cpp WeaponInfo.cpp
+
+SOURCEPATH ../vendor/librw/src
+SOURCE assert.cpp
diff --git a/group/re3.rss b/group/re3.rss
new file mode 100644
index 0000000..6c02747
--- /dev/null
+++ b/group/re3.rss
@@ -0,0 +1,78 @@
+NAME GTA3
+
+#include
+#include
+#include
+#include
+#include
+
+RESOURCE RSS_SIGNATURE { }
+RESOURCE TBUF { buf="gta3"; }
+
+RESOURCE EIK_APP_INFO { }
+
+rls_string STRING_app_caption_string "GTA III"
+rls_string STRING_app_short_caption_string "GTA III"
+
+RESOURCE LOCALISABLE_APP_INFO r_RE3_localisable_app_info
+{
+ short_caption = STRING_app_short_caption_string;
+ caption_and_icon = CAPTION_AND_ICON_INFO
+ {
+ caption = STRING_app_caption_string;
+ number_of_icons = 1;
+ icon_file = "\\resource\\apps\\re3_icon.mif";
+ };
+}
+
+RESOURCE DIALOG r_query_dialog
+{
+ flags = EGeneralQueryFlags | EEikDialogFlagNoBorder | EEikDialogFlagNoShadow;
+ buttons = R_AVKON_SOFTKEYS_OK_EMPTY;
+ items =
+ {
+ DLG_LINE
+ {
+ type = EAknCtPopupHeadingPane;
+ id = EAknMessageQueryHeaderId;
+ itemflags = EEikDlgItemNonFocusing;
+ control = AVKON_HEADING
+ {
+ };
+ },
+ DLG_LINE
+ {
+ type = EAknCtMessageQuery;
+ id = EAknMessageQueryContentId;
+ control = AVKON_MESSAGE_QUERY
+ {
+ };
+ }
+ };
+}
+
+RESOURCE DIALOG r_text_query
+{
+ flags = EEikDialogFlagNoDrag | EEikDialogFlagNoTitleBar | EEikDialogFlagCbaButtons;
+ buttons = R_AVKON_SOFTKEYS_OK_CANCEL;
+ items =
+ {
+ DLG_LINE
+ {
+ type = EAknCtQuery;
+ id = EGeneralQuery;
+ control = AVKON_DATA_QUERY
+ {
+ layout = EDataLayout;
+ control = EDWIN
+ {
+ width = 128;
+ lines = 1;
+ maxlength = 510;
+ default_case = EAknEditorLowerCase;
+ allowed_case_modes = EAknEditorAllCaseModes;
+ };
+ };
+ }
+ };
+}
diff --git a/group/re3_reg.rss b/group/re3_reg.rss
new file mode 100644
index 0000000..d62704a
--- /dev/null
+++ b/group/re3_reg.rss
@@ -0,0 +1,17 @@
+#include
+#include
+
+UID2 KUidAppRegistrationResourceFile
+UID3 0xe0d67647
+
+RESOURCE APP_REGISTRATION_INFO
+{
+ app_file="re3";
+
+ localisable_resource_file="\\resource\\apps\\re3";
+ localisable_resource_id=R_RE3_LOCALISABLE_APP_INFO;
+
+ embeddability=KAppNotEmbeddable;
+ newfile=KAppDoesNotSupportNewFile;
+}
+
diff --git a/group/shaders.mk b/group/shaders.mk
new file mode 100644
index 0000000..7e321f2
--- /dev/null
+++ b/group/shaders.mk
@@ -0,0 +1,26 @@
+MAKE = G:\Progs\MinGW\bin\mingw32-make
+
+do_nothing :
+ @rem do_nothing
+
+MAKMAKE: do_nothing
+
+BLD: do_nothing
+
+CLEAN:
+ rm ../vendor/librw/src/gl/shaders/*.inc
+
+LIB: do_nothing
+
+CLEANLIB: do_nothing
+
+RESOURCE:
+ $(MAKE) -C ../vendor/librw/src/gl/shaders/ -f Makefile all
+
+FREEZE: do_nothing
+
+SAVESPACE: do_nothing
+
+RELEASABLES: do_nothing
+
+FINAL: do_nothing
diff --git a/res/images/logo.svg b/res/images/logo.svg
deleted file mode 100644
index 9db8447..0000000
--- a/res/images/logo.svg
+++ /dev/null
@@ -1,88 +0,0 @@
-
-
diff --git a/res/images/logo_1024.png b/res/images/logo_1024.png
deleted file mode 100644
index 50ae869..0000000
Binary files a/res/images/logo_1024.png and /dev/null differ
diff --git a/res/images/logo_256.jpg b/res/images/logo_256.jpg
deleted file mode 100644
index 595d2c3..0000000
Binary files a/res/images/logo_256.jpg and /dev/null differ
diff --git a/sis/re3.pkg b/sis/re3.pkg
new file mode 100644
index 0000000..0d9811b
--- /dev/null
+++ b/sis/re3.pkg
@@ -0,0 +1,11 @@
+#{"GTA III"},(0xe0d67647),1,0,0
+
+[0x20022E6D], 0, 0, 0, {"S60ProductID"}
+
+%{"nnproject"}
+:"nnproject"
+
+"$(EPOCROOT)epoc32\release\$(PLATFORM)\$(TARGET)\re3.exe"-"!:\sys\bin\re3.exe"
+"$(EPOCROOT)\epoc32\data\z\private\10003a3f\import\apps\re3_reg.rsc" - "!:\private\10003a3f\import\apps\re3_reg.rsc"
+"$(EPOCROOT)\epoc32\data\z\resource\apps\re3.rsc" - "!:\resource\apps\re3.rsc"
+"$(EPOCROOT)\epoc32\data\z\resource\apps\re3_icon.mif" - "!:\resource\apps\re3_icon.mif"
diff --git a/src/collision/ColModel.cpp b/src/collision/ColModel.cpp
index fb90e7d..704b85d 100644
--- a/src/collision/ColModel.cpp
+++ b/src/collision/ColModel.cpp
@@ -29,11 +29,11 @@ void
CColModel::RemoveCollisionVolumes(void)
{
if(ownsCollisionVolumes){
- RwFree(spheres);
- RwFree(lines);
- RwFree(boxes);
- RwFree(vertices);
- RwFree(triangles);
+ if (spheres) RwFree(spheres);
+ if (lines) RwFree(lines);
+ if (boxes) RwFree(boxes);
+ if (vertices) RwFree(vertices);
+ if (triangles) RwFree(triangles);
}
numSpheres = 0;
numLines = 0;
@@ -63,7 +63,7 @@ CColModel::CalculateTrianglePlanes(void)
void
CColModel::RemoveTrianglePlanes(void)
{
- RwFree(trianglePlanes);
+ if (trianglePlanes) RwFree(trianglePlanes);
trianglePlanes = nil;
}
diff --git a/src/control/Replay.h b/src/control/Replay.h
index 68da9cc..a395b6d 100644
--- a/src/control/Replay.h
+++ b/src/control/Replay.h
@@ -121,7 +121,7 @@ class CReplay
uint8 hours;
uint8 minutes;
private:
- uint8 __align;
+ uint8 __align1;
};
VALIDATE_SIZE(tClockPacket, 4);
@@ -148,7 +148,9 @@ class CReplay
uint16 mi;
uint8 pedtype;
private:
- uint8 __align[3];
+ uint8 __align1;
+ uint8 __align2;
+ uint8 __align3;
};
VALIDATE_SIZE(tPedHeaderPacket, 8);
@@ -167,7 +169,9 @@ class CReplay
{
uint8 type;
private:
- uint8 __align[3];
+ uint8 __align1;
+ uint8 __align2;
+ uint8 __align3;
};
VALIDATE_SIZE(tEndOfFramePacket, 4);
diff --git a/src/core/Cam.cpp b/src/core/Cam.cpp
index d4be858..53eb7cb 100644
--- a/src/core/Cam.cpp
+++ b/src/core/Cam.cpp
@@ -3813,7 +3813,9 @@ CCam::Process_Debug(const CVector&, float, float, float)
Front.Normalise();
Source = Source + Front*Speed;
- Up = CVector{ 0.0f, 0.0f, 1.0f };
+ Up.x = 0.0f;
+ Up.y = 0.0f;
+ Up.z = 1.0f;
CVector Right = CrossProduct(Front, Up);
Up = CrossProduct(Right, Front);
Source = Source + Up*PanSpeedY + Right*PanSpeedX;
diff --git a/src/core/CdStreamPosix.cpp b/src/core/CdStreamPosix.cpp
index bc9129e..9e1e551 100644
--- a/src/core/CdStreamPosix.cpp
+++ b/src/core/CdStreamPosix.cpp
@@ -7,7 +7,9 @@
#include
#include
#include
+#ifndef __SYMBIAN32__
#include
+#endif
#include
#include
#include
@@ -38,7 +40,8 @@ re3_sem_open(void)
{
sem_t* sem = (sem_t*)malloc(sizeof(sem_t));
if (sem_init(sem, 0, 1) == -1) {
- sem = SEM_FAILED;
+ free(sem);
+ sem = (sem_t*)SEM_FAILED;
}
return sem;
@@ -135,7 +138,7 @@ CdStreamInitThread(void)
gCdStreamSema = RE3_SEM_OPEN("/semaphore_cd_stream");
- if (gCdStreamSema == SEM_FAILED) {
+ if (gCdStreamSema == (sem_t*)SEM_FAILED) {
CDTRACE("failed to create stream semaphore");
ASSERT(0);
return;
@@ -148,7 +151,7 @@ CdStreamInitThread(void)
{
gpReadInfo[i].pDoneSemaphore = RE3_SEM_OPEN("/semaphore_done%d", i);
- if (gpReadInfo[i].pDoneSemaphore == SEM_FAILED)
+ if (gpReadInfo[i].pDoneSemaphore == (sem_t*)SEM_FAILED)
{
CDTRACE("failed to create sync semaphore");
ASSERT(0);
@@ -158,7 +161,7 @@ CdStreamInitThread(void)
#ifdef ONE_THREAD_PER_CHANNEL
gpReadInfo[i].pStartSemaphore = RE3_SEM_OPEN("/semaphore_start%d", i);
- if (gpReadInfo[i].pStartSemaphore == SEM_FAILED)
+ if (gpReadInfo[i].pStartSemaphore == (sem_t*)SEM_FAILED)
{
CDTRACE("failed to create start semaphore");
ASSERT(0);
@@ -198,6 +201,7 @@ CdStreamInitThread(void)
void
CdStreamInit(int32 numChannels)
{
+#if !defined __SYMBIAN32__
struct statvfs fsInfo;
if((statvfs("models/gta3.img", &fsInfo)) < 0)
@@ -206,6 +210,7 @@ CdStreamInit(int32 numChannels)
ASSERT(0);
return;
}
+#endif
#ifdef __linux__
_gdwCdStreamFlags = O_RDONLY | O_NOATIME;
#else
@@ -219,8 +224,10 @@ CdStreamInit(int32 numChannels)
debug("Using no buffered loading for streaming\n");
}
*/
+#if !defined __SYMBIAN32__
void *pBuffer = (void *)RwMallocAlign(CDSTREAM_SECTOR_SIZE, (RwUInt32)fsInfo.f_bsize);
ASSERT( pBuffer != nil );
+#endif
gNumImages = 0;
@@ -234,8 +241,10 @@ CdStreamInit(int32 numChannels)
CdStreamInitThread();
+#if !defined __SYMBIAN32__
ASSERT( pBuffer != nil );
RwFreeAlign(pBuffer);
+#endif
}
uint32
@@ -531,6 +540,7 @@ void *CdStreamThread(void *param)
free(gpReadInfo);
gpReadInfo = nil;
pthread_exit(nil);
+ return NULL;
}
bool
diff --git a/src/core/ControllerConfig.cpp b/src/core/ControllerConfig.cpp
index 8775792..33662ac 100644
--- a/src/core/ControllerConfig.cpp
+++ b/src/core/ControllerConfig.cpp
@@ -45,6 +45,10 @@ void CControllerConfigManager::MakeControllerActionsBlank()
#ifdef RW_GL3
int MapIdToButtonId(int mapId) {
+#ifdef __SYMBIAN32__
+ // TODO
+ return mapId + 1;
+#else
switch (mapId) {
case GLFW_GAMEPAD_BUTTON_A: // Cross
return 2;
@@ -82,6 +86,7 @@ int MapIdToButtonId(int mapId) {
default:
return 0;
}
+#endif
}
#endif
@@ -2771,8 +2776,10 @@ void CControllerConfigManager::UpdateJoyButtonState(int32 padnumber)
#elif defined RW_GL3
if (m_NewState.isGamepad) {
for (int32 i = 0; i < MAX_BUTTONS; i++) {
+#if !defined __SYMBIAN32__
if (i == GLFW_GAMEPAD_BUTTON_GUIDE)
continue;
+#endif
m_aButtonStates[MapIdToButtonId(i)-1] = m_NewState.mappedButtons[i];
}
diff --git a/src/core/FileLoader.cpp b/src/core/FileLoader.cpp
index afa2a66..a93ac7d 100644
--- a/src/core/FileLoader.cpp
+++ b/src/core/FileLoader.cpp
@@ -1447,9 +1447,9 @@ CFileLoader::Load2dEffect(const char *line)
sscanf(line, "%d %f %f %f %d %d %d %d %d %d %f %f %f %f",
&id, &x, &y, &z, &r, &g, &b, &a, &type,
&effect->particle.particleType,
- &effect->particle.dir.x,
- &effect->particle.dir.y,
- &effect->particle.dir.z,
+ &effect->particle.dirX,
+ &effect->particle.dirY,
+ &effect->particle.dirZ,
&effect->particle.scale);
break;
@@ -1457,9 +1457,9 @@ CFileLoader::Load2dEffect(const char *line)
sscanf(line, "%d %f %f %f %d %d %d %d %d %d %f %f %f %d",
&id, &x, &y, &z, &r, &g, &b, &a, &type,
&flags,
- &effect->attractor.dir.x,
- &effect->attractor.dir.y,
- &effect->attractor.dir.z,
+ &effect->attractor.dirX,
+ &effect->attractor.dirY,
+ &effect->attractor.dirZ,
&probability);
effect->attractor.type = flags;
#ifdef FIX_BUGS
diff --git a/src/core/Frontend.cpp b/src/core/Frontend.cpp
index 666774f..2328075 100644
--- a/src/core/Frontend.cpp
+++ b/src/core/Frontend.cpp
@@ -34,6 +34,7 @@
#include "Messages.h"
#include "FileLoader.h"
#include "frontendoption.h"
+#include "inifile.h"
// Game has colors inlined in code.
// For easier modification we collect them here:
@@ -802,6 +803,8 @@ CMenuManager::CentreMousePointer()
Point.y = SCREEN_HEIGHT / 2;
ClientToScreen(PSGLOBAL(window), &Point);
SetCursorPos(Point.x, Point.y);
+#elif defined __SYMBIAN32__
+ // TODO
#elif defined RW_GL3
glfwSetCursorPos(PSGLOBAL(window), SCREEN_WIDTH / 2, SCREEN_HEIGHT / 2);
#endif
@@ -908,10 +911,10 @@ CMenuManager::CheckSliderMovement(int value)
break;
case MENUACTION_DRAWDIST:
if(value > 0)
- m_PrefsLOD += ((1.8f - 0.8f) / MENUSLIDER_LOGICAL_BARS);
+ m_PrefsLOD += ((1.8f - 0.4f) / MENUSLIDER_LOGICAL_BARS);
else
- m_PrefsLOD -= ((1.8f - 0.8f) / MENUSLIDER_LOGICAL_BARS);
- m_PrefsLOD = Clamp(m_PrefsLOD, 0.8f, 1.8f);
+ m_PrefsLOD -= ((1.8f - 0.4f) / MENUSLIDER_LOGICAL_BARS);
+ m_PrefsLOD = Clamp(m_PrefsLOD, 0.4f, 1.8f);
CRenderer::ms_lodDistScale = m_PrefsLOD;
break;
case MENUACTION_MUSICVOLUME:
@@ -1807,7 +1810,7 @@ CMenuManager::Draw()
ProcessSlider(m_PrefsBrightness / 512.0f, HOVEROPTION_INCREASE_BRIGHTNESS, HOVEROPTION_DECREASE_BRIGHTNESS, MENU_X_LEFT_ALIGNED(170.0f), SCREEN_WIDTH);
break;
case MENUACTION_DRAWDIST:
- ProcessSlider((m_PrefsLOD - 0.8f) * 1.0f, HOVEROPTION_INCREASE_DRAWDIST, HOVEROPTION_DECREASE_DRAWDIST, MENU_X_LEFT_ALIGNED(170.0f), SCREEN_WIDTH);
+ ProcessSlider((m_PrefsLOD - 0.4f) * 1.0f, HOVEROPTION_INCREASE_DRAWDIST, HOVEROPTION_DECREASE_DRAWDIST, MENU_X_LEFT_ALIGNED(170.0f), SCREEN_WIDTH);
break;
case MENUACTION_MUSICVOLUME:
ProcessSlider(m_PrefsMusicVolume / 128.0f, HOVEROPTION_INCREASE_MUSICVOLUME, HOVEROPTION_DECREASE_MUSICVOLUME, MENU_X_LEFT_ALIGNED(170.0f), SCREEN_WIDTH);
@@ -3752,6 +3755,7 @@ CMenuManager::LoadSettings()
#else
CMBlur::BlurOn = true;
#endif
+ CMBlur::BlurOn = false;
MousePointerStateHelper.bInvertVertically = true;
// 50 is silly
@@ -5099,9 +5103,11 @@ CMenuManager::ProcessButtonPresses(void)
m_PrefsFrameLimiter = true;
m_PrefsBrightness = 256;
m_PrefsVsyncDisp = true;
- m_PrefsLOD = 1.2f;
+ m_PrefsLOD = 0.7f;
m_PrefsVsync = true;
- CRenderer::ms_lodDistScale = 1.2f;
+ CRenderer::ms_lodDistScale = 0.7f;
+ CIniFile::PedNumberMultiplier = 0.6f;
+ CIniFile::CarNumberMultiplier = 0.6f;
#ifdef ASPECT_RATIO_SCALE
m_PrefsUseWideScreen = AR_AUTO;
#else
@@ -5139,6 +5145,8 @@ CMenuManager::ProcessButtonPresses(void)
PSGLOBAL(joy1)->GetCapabilities(&devCaps);
ControlsManager.InitDefaultControlConfigJoyPad(devCaps.dwButtons);
}
+#elif defined __SYMBIAN32__
+ // TODO
#else
if (PSGLOBAL(joy1id) != -1 && glfwJoystickPresent(PSGLOBAL(joy1id))) {
int count;
@@ -5649,7 +5657,7 @@ void
CMenuManager::ShutdownJustMenu()
{
// In case we're windowed, keep mouse centered while in game. Done in main.cpp in other conditions.
-#if defined(RW_GL3) && defined(IMPROVED_VIDEOMODE)
+#if defined(RW_GL3) && defined(IMPROVED_VIDEOMODE) && !defined(__SYMBIAN32__)
glfwSetInputMode(PSGLOBAL(window), GLFW_CURSOR, GLFW_CURSOR_DISABLED);
#endif
m_bMenuActive = false;
@@ -5758,7 +5766,7 @@ CMenuManager::SwitchMenuOnAndOff()
m_bMenuStateChanged = true;
// In case we're windowed, keep mouse centered while in game. Done in main.cpp in other conditions.
-#if defined(RW_GL3) && defined(IMPROVED_VIDEOMODE)
+#if defined(RW_GL3) && defined(IMPROVED_VIDEOMODE) && !defined(__SYMBIAN32__)
glfwSetInputMode(PSGLOBAL(window), GLFW_CURSOR, m_bMenuActive && m_nPrefsWindowed ? GLFW_CURSOR_HIDDEN : GLFW_CURSOR_DISABLED);
#endif
}
diff --git a/src/core/Frontend.h b/src/core/Frontend.h
index 6e6c40f..7339aed 100644
--- a/src/core/Frontend.h
+++ b/src/core/Frontend.h
@@ -667,6 +667,13 @@ public:
static int8 m_nPrefsMSAALevel;
static int8 m_nDisplayMSAALevel;
#endif
+
+#ifdef __SYMBIAN32__
+#undef LANGUAGE_FRENCH
+#undef LANGUAGE_GERMAN
+#undef LANGUAGE_ITALIAN
+#undef LANGUAGE_SPANISH
+#endif
enum LANGUAGE
{
diff --git a/src/core/Game.cpp b/src/core/Game.cpp
index b3dd1ed..8d9286c 100644
--- a/src/core/Game.cpp
+++ b/src/core/Game.cpp
@@ -213,7 +213,7 @@ CGame::InitialiseRenderWare(void)
return (false);
}
- RwCameraSetFarClipPlane(Scene.camera, 2000.0f); // 250.0f on PS2 but who cares
+ RwCameraSetFarClipPlane(Scene.camera, 250.0f); // 250.0f on PS2 but who cares
RwCameraSetNearClipPlane(Scene.camera, 0.9f);
CameraSize(Scene.camera, nil, DEFAULT_VIEWWINDOW, DEFAULT_ASPECT_RATIO);
diff --git a/src/core/IniFile.cpp b/src/core/IniFile.cpp
index 524632f..4ed1353 100644
--- a/src/core/IniFile.cpp
+++ b/src/core/IniFile.cpp
@@ -7,12 +7,13 @@
#include "main.h"
#include "Population.h"
-float CIniFile::PedNumberMultiplier = 1.0f;
-float CIniFile::CarNumberMultiplier = 1.0f;
+float CIniFile::PedNumberMultiplier = 0.6f;
+float CIniFile::CarNumberMultiplier = 0.6f;
void CIniFile::LoadIniFile()
{
CFileMgr::SetDir("");
+#if 0
int f = CFileMgr::OpenFile("gta3.ini", "r");
if (f){
CFileMgr::ReadLine(f, gString, 200);
@@ -23,6 +24,7 @@ void CIniFile::LoadIniFile()
CarNumberMultiplier = Min(3.0f, Max(0.5f, CarNumberMultiplier));
CFileMgr::CloseFile(f);
}
+#endif
CPopulation::MaxNumberOfPedsInUse = DEFAULT_MAX_NUMBER_OF_PEDS * PedNumberMultiplier;
CCarCtrl::MaxNumberOfCarsInUse = DEFAULT_MAX_NUMBER_OF_CARS * CarNumberMultiplier;
-}
\ No newline at end of file
+}
diff --git a/src/core/MenuScreensCustom.cpp b/src/core/MenuScreensCustom.cpp
index d33650f..fa7e859 100644
--- a/src/core/MenuScreensCustom.cpp
+++ b/src/core/MenuScreensCustom.cpp
@@ -158,12 +158,14 @@ void RestoreDefDisplay(int8 action) {
TheCamera.bFreeCam = false;
#endif
#ifdef PED_CAR_DENSITY_SLIDERS
+ CIniFile::PedNumberMultiplier = 0.6f;
+ CIniFile::CarNumberMultiplier = 0.6f;
CIniFile::LoadIniFile();
#endif
#ifdef GRAPHICS_MENU_OPTIONS // otherwise Frontend will handle those
CMenuManager::m_PrefsBrightness = 256;
- CMenuManager::m_PrefsLOD = 1.2f;
- CRenderer::ms_lodDistScale = 1.2f;
+ CMenuManager::m_PrefsLOD = 0.7f;
+ CRenderer::ms_lodDistScale = 0.7f;
CMenuManager::m_PrefsShowSubtitles = true;
FrontEndMenuManager.SaveSettings();
#endif
@@ -395,6 +397,10 @@ void ControllerTypeAfterChange(int8 before, int8 after)
}
#endif
+#ifdef GRAPHICS_MENU_OPTIONS
+CCustomScreenLayout graphicsSettingsLayout = {MENUSPRITE_MAINMENU, 50, 0, 20, FONT_HEADING, FESCREEN_LEFT_ALIGN, true, MEDIUMTEXT_X_SCALE, MEDIUMTEXT_Y_SCALE};
+#endif
+
CMenuScreenCustom aScreens[MENUPAGES] = {
// MENUPAGE_NONE = 0
{ "", MENUPAGE_DISABLED, MENUPAGE_DISABLED, nil, nil, },
@@ -891,7 +897,7 @@ CMenuScreenCustom aScreens[MENUPAGES] = {
#ifdef GRAPHICS_MENU_OPTIONS
// MENUPAGE_GRAPHICS_SETTINGS
{ "FET_GFX", MENUPAGE_OPTIONS, MENUPAGE_OPTIONS,
- new CCustomScreenLayout({MENUSPRITE_MAINMENU, 50, 0, 20, FONT_HEADING, FESCREEN_LEFT_ALIGN, true, MEDIUMTEXT_X_SCALE, MEDIUMTEXT_Y_SCALE}), GraphicsGoBack,
+ new CCustomScreenLayout(graphicsSettingsLayout), GraphicsGoBack,
#ifndef GTA_HANDHELD
MENUACTION_SCREENRES, "FED_RES", { nil, SAVESLOT_NONE, MENUPAGE_GRAPHICS_SETTINGS },
diff --git a/src/core/Pad.cpp b/src/core/Pad.cpp
index 60bb7a7..5ad6966 100644
--- a/src/core/Pad.cpp
+++ b/src/core/Pad.cpp
@@ -526,11 +526,16 @@ CMouseControllerState CMousePointerStateHelper::GetMouseSetUp()
state.WHEELUP = true;
}
}
+#elif defined __SYMBIAN32__
+ // TODO
+ state.LMB = true;
#else
// It seems there is no way to get number of buttons on mouse, so assign all buttons if we have mouse.
double xpos = 1.0f, ypos;
+#ifndef __SYMBIAN32__
glfwGetCursorPos(PSGLOBAL(window), &xpos, &ypos);
-
+#endif
+
if (xpos != 0.f) {
state.MMB = true;
state.RMB = true;
@@ -585,11 +590,17 @@ void CPad::UpdateMouse()
NewMouseControllerState = PCTempMouseControllerState;
}
}
+#else
+#if defined __SYMBIAN32__
+ if ( IsForegroundApp() /*&& PSGLOBAL(cursorIsInWindow)*/ )
#else
if ( IsForegroundApp() && PSGLOBAL(cursorIsInWindow) )
+#endif
{
double xpos = 1.0f, ypos;
+#ifndef __SYMBIAN32__
glfwGetCursorPos(PSGLOBAL(window), &xpos, &ypos);
+#endif
if (xpos == 0.f)
return;
@@ -608,12 +619,14 @@ void CPad::UpdateMouse()
PCTempMouseControllerState.x = (float)(signX * (xpos - PSGLOBAL(lastMousePos.x)));
PCTempMouseControllerState.y = (float)(signy * (ypos - PSGLOBAL(lastMousePos.y)));
+#ifndef __SYMBIAN32__
PCTempMouseControllerState.LMB = glfwGetMouseButton(PSGLOBAL(window), GLFW_MOUSE_BUTTON_LEFT);
PCTempMouseControllerState.RMB = glfwGetMouseButton(PSGLOBAL(window), GLFW_MOUSE_BUTTON_RIGHT);
PCTempMouseControllerState.MMB = glfwGetMouseButton(PSGLOBAL(window), GLFW_MOUSE_BUTTON_MIDDLE);
PCTempMouseControllerState.MXB1 = glfwGetMouseButton(PSGLOBAL(window), GLFW_MOUSE_BUTTON_4);
PCTempMouseControllerState.MXB2 = glfwGetMouseButton(PSGLOBAL(window), GLFW_MOUSE_BUTTON_5);
-
+#endif
+
if (PSGLOBAL(mouseWheel) > 0)
PCTempMouseControllerState.WHEELUP = 1;
else if (PSGLOBAL(mouseWheel) < 0)
diff --git a/src/core/PlayerInfo.cpp b/src/core/PlayerInfo.cpp
index 91bd069..8097eec 100644
--- a/src/core/PlayerInfo.cpp
+++ b/src/core/PlayerInfo.cpp
@@ -412,6 +412,8 @@ FindPlayerCoors(void)
return TheCamera.GetPosition();
#endif
CPlayerPed *ped = FindPlayerPed();
+ if (!ped)
+ return TheCamera.GetPosition();
if(ped->InVehicle())
return ped->m_pMyVehicle->GetPosition();
else
@@ -659,4 +661,4 @@ CPlayerInfo::DeletePlayerSkin()
m_pSkinTexture = nil;
}
}
-#endif
\ No newline at end of file
+#endif
diff --git a/src/core/Streaming.cpp b/src/core/Streaming.cpp
index 9ac2209..fea24dc 100644
--- a/src/core/Streaming.cpp
+++ b/src/core/Streaming.cpp
@@ -85,6 +85,8 @@ int32 islandLODcomSub;
int32 islandLODsubInd;
int32 islandLODsubCom;
+#define STREAMING_MEM_SIZE (10 * 1024 * 1024)
+
bool
CStreamingInfo::GetCdPosnAndSize(uint32 &posn, uint32 &size)
{
@@ -219,11 +221,13 @@ CStreaming::Init2(void)
#ifdef GTA_PC
#define MB (1024*1024)
- extern size_t _dwMemAvailPhys;
- ms_memoryAvailable = (_dwMemAvailPhys - 10*MB)/2;
- if(ms_memoryAvailable < 50*MB)
- ms_memoryAvailable = 50*MB;
- desiredNumVehiclesLoaded = (int32)((ms_memoryAvailable / MB - 50) / 3 + 12);
+// extern size_t _dwMemAvailPhys;
+// ms_memoryAvailable = (_dwMemAvailPhys - 10*MB)/2;
+// if(ms_memoryAvailable < 50*MB)
+// ms_memoryAvailable = 50*MB;
+// desiredNumVehiclesLoaded = (int32)((ms_memoryAvailable / MB - 50) / 3 + 12);
+ ms_memoryAvailable = STREAMING_MEM_SIZE;
+ desiredNumVehiclesLoaded = 12;
if(desiredNumVehiclesLoaded > MAXVEHICLESLOADED)
desiredNumVehiclesLoaded = MAXVEHICLESLOADED;
debug("Memory allocated to Streaming is %zuMB", ms_memoryAvailable/MB); // original modifier was %d
@@ -2687,9 +2691,10 @@ CStreaming::MakeSpaceFor(int32 size)
#ifdef FIX_BUGS
#define MB (1024 * 1024)
if(ms_memoryAvailable == 0) {
- extern size_t _dwMemAvailPhys;
- ms_memoryAvailable = (_dwMemAvailPhys - 10 * MB) / 2;
- if(ms_memoryAvailable < 50 * MB) ms_memoryAvailable = 50 * MB;
+// extern size_t _dwMemAvailPhys;
+// ms_memoryAvailable = (_dwMemAvailPhys - 10 * MB) / 2;
+// if(ms_memoryAvailable < 50 * MB) ms_memoryAvailable = 50 * MB;
+ ms_memoryAvailable = STREAMING_MEM_SIZE;
}
#undef MB
#endif
diff --git a/src/core/Timer.cpp b/src/core/Timer.cpp
index e4f5b01..2f7c0ff 100644
--- a/src/core/Timer.cpp
+++ b/src/core/Timer.cpp
@@ -278,6 +278,7 @@ void CTimer::Resume(void)
oldPcTimer += RsTimer() - suspendPcTimer;
}
+#ifndef __SYMBIAN32__
uint32 CTimer::GetCyclesPerMillisecond(void)
{
#ifdef _WIN32
@@ -287,6 +288,7 @@ uint32 CTimer::GetCyclesPerMillisecond(void)
#endif
return 1;
}
+#endif
uint32 CTimer::GetCurrentTimeInCycles(void)
{
diff --git a/src/core/Timer.h b/src/core/Timer.h
index 819bd30..c405f9d 100644
--- a/src/core/Timer.h
+++ b/src/core/Timer.h
@@ -1,6 +1,11 @@
#pragma once
+#ifdef __SYMBIAN32__
+#define CTimer CTimer2
+class CTimer2
+#else
class CTimer
+#endif
{
static uint32 m_snTimeInMilliseconds;
diff --git a/src/core/ZoneCull.cpp b/src/core/ZoneCull.cpp
index 5a76e5e..e911ea0 100644
--- a/src/core/ZoneCull.cpp
+++ b/src/core/ZoneCull.cpp
@@ -15,6 +15,10 @@
#include "Debug.h"
#include "Renderer.h"
+#if defined __ARMCC_VERSION && !defined _DEBUG
+#pragma O2
+#endif
+
int32 CCullZones::NumCullZones;
CCullZone CCullZones::aZones[NUMCULLZONES];
int32 CCullZones::NumAttributeZones;
diff --git a/src/core/common.h b/src/core/common.h
index 0d0528b..d8e795b 100644
--- a/src/core/common.h
+++ b/src/core/common.h
@@ -7,7 +7,7 @@
#pragma warning(disable: 4838) // narrowing conversion
#pragma warning(disable: 4996) // POSIX names
-#ifdef __MWERKS__
+#if defined __MWERKS__ || defined __SYMBIAN32__
#define __STDC_LIMIT_MACROS // so we get UINT32_MAX etc
#endif
@@ -363,6 +363,10 @@ __inline__ void TRACE(char *f, ...) { } // this is re3 only, and so the function
#endif
#endif
+#ifdef __SYMBIAN32__
+#undef ASSERT
+#endif
+
#ifndef MASTER
#define assert(_Expression) (void)( (!!(_Expression)) || (re3_assert(#_Expression, __FILE__, __LINE__, __FUNCTION__), 0) )
#else
@@ -370,7 +374,7 @@ __inline__ void TRACE(char *f, ...) { } // this is re3 only, and so the function
#endif
#define ASSERT assert
-#ifdef __MWERKS__
+#if defined __MWERKS__ || defined __SYMBIAN32__
#define static_assert(bool_constexpr, message)
#endif
diff --git a/src/core/config.h b/src/core/config.h
index 9f1981b..7b476f4 100644
--- a/src/core/config.h
+++ b/src/core/config.h
@@ -21,7 +21,7 @@ enum Config {
EXTRADIRSIZE = 128,
CUTSCENEDIRSIZE = 512,
- SIMPLEMODELSIZE = 5000, // 2910 on PS2
+ SIMPLEMODELSIZE = 2916, // 2910 on PS2
MLOMODELSIZE = 1,
MLOINSTANCESIZE = 1,
TIMEMODELSIZE = 30,
@@ -31,15 +31,15 @@ enum Config {
XTRACOMPSMODELSIZE = 2,
TWODFXSIZE = 2000, // 1210 on PS2
- MAXVEHICLESLOADED = 50, // 70 on mobile
+ MAXVEHICLESLOADED = 35, // 70 on mobile
NUMOBJECTINFO = 168, // object.dat
// Pool sizes
NUMPTRNODES = 30000, // 26000 on PS2
NUMENTRYINFOS = 5400, // 3200 on PS2
- NUMPEDS = 140, // 90 on PS2
- NUMVEHICLES = 110, // 70 on PS2
+ NUMPEDS = 110, // 90 on PS2
+ NUMVEHICLES = 90, // 70 on PS2
NUMBUILDINGS = 5500, // 4915 on PS2
NUMTREADABLES = 1214,
NUMOBJECTS = 450,
@@ -157,7 +157,7 @@ enum Config {
#define GTA_VERSION GTA3_PC_11
// Enable configuration for handheld console ports
-#if defined(__SWITCH__) || defined(PSP2)
+#if defined(__SWITCH__) || defined(PSP2) || defined(__SYMBIAN32__)
#define GTA_HANDHELD
#endif
@@ -170,11 +170,11 @@ enum Config {
# define PS2_MENU
#elif defined GTA_PC
# define EXTERNAL_3D_SOUND
-# define AUDIO_REFLECTIONS
+//# define AUDIO_REFLECTIONS
# ifndef GTA_HANDHELD
# define PC_PLAYER_CONTROLS // mouse player/cam mode
# endif
-# define GTA_REPLAY
+//# define GTA_REPLAY
# define GTA_SCENE_EDIT
# define PC_MENU
#elif defined GTA_XBOX
@@ -238,7 +238,7 @@ enum Config {
#if defined GTA_PC && defined GTA_PS2_STUFF
# define USE_PS2_RAND
# define RANDOMSPLASH // use random splash as on PS2
-# define PS2_MATFX
+//# define PS2_MATFX
#endif
#ifdef VU_COLLISION
@@ -263,12 +263,13 @@ enum Config {
# define CHATTYSPLASH // print what the game is loading
# define TIMEBARS // print debug timers
#endif
+#define TIMEBARS
#define FIX_BUGS // fixes bugs that we've came across during reversing. You can undefine this only on release builds.
-#define MORE_LANGUAGES // Add more translations to the game
-#define COMPATIBLE_SAVES // this allows changing structs while keeping saves compatible, and keeps saves compatible between platforms, needs to be enabled on 64bit builds!
+//#define MORE_LANGUAGES // Add more translations to the game
+//#define COMPATIBLE_SAVES // this allows changing structs while keeping saves compatible, and keeps saves compatible between platforms, needs to be enabled on 64bit builds!
#define FIX_INCOMPATIBLE_SAVES // try to fix incompatible saves, requires COMPATIBLE_SAVES
-#define LOAD_INI_SETTINGS // as the name suggests. fundamental for CUSTOM_FRONTEND_OPTIONS
+//#define LOAD_INI_SETTINGS // as the name suggests. fundamental for CUSTOM_FRONTEND_OPTIONS
#define NO_MOVIES // add option to disable intro videos
@@ -291,28 +292,28 @@ enum Config {
#endif
// Rendering/display
-//#define EXTRA_MODEL_FLAGS // from mobile to optimize rendering
-//# define HARDCODED_MODEL_FLAGS // sets the flags enabled above from hardcoded model names.
+#define EXTRA_MODEL_FLAGS // from mobile to optimize rendering
+# define HARDCODED_MODEL_FLAGS // sets the flags enabled above from hardcoded model names.
// NB: keep this enabled unless your map IDEs have these flags baked in
#define ASPECT_RATIO_SCALE // Not just makes everything scale with aspect ratio, also adds support for all aspect ratios
#define PROPER_SCALING // use original DEFAULT_SCREEN_WIDTH/DEFAULT_SCREEN_HEIGHT from PS2 instead of PC(R* changed HEIGHT here to make radar look better, but broke other hud elements aspect ratio).
#define DEFAULT_NATIVE_RESOLUTION // Set default video mode to your native resolution (fixes Windows 10 launch)
#define USE_TXD_CDIMAGE // generate and load textures from txd.img
#define PS2_ALPHA_TEST // emulate ps2 alpha test
-#define IMPROVED_VIDEOMODE // save and load videomode parameters instead of a magic number
+//#define IMPROVED_VIDEOMODE // save and load videomode parameters instead of a magic number
#define DISABLE_LOADING_SCREEN // disable the loading screen which vastly improves the loading time
#ifdef DISABLE_LOADING_SCREEN
// enable the PC splash
#undef RANDOMSPLASH
#endif
#define DISABLE_VSYNC_ON_TEXTURE_CONVERSION // make texture conversion work faster by disabling vsync
-#define ANISOTROPIC_FILTERING // set all textures to max anisotropic filtering
+//#define ANISOTROPIC_FILTERING // set all textures to max anisotropic filtering
//#define USE_TEXTURE_POOL
#ifdef LIBRW
-#define EXTENDED_COLOURFILTER // more options for colour filter (replaces mblur)
-#define EXTENDED_PIPELINES // custom render pipelines (includes Neo)
-#define SCREEN_DROPLETS // neo water droplets
-#define NEW_RENDERER // leeds-like world rendering, needs librw
+//#define EXTENDED_COLOURFILTER // more options for colour filter (replaces mblur)
+//#define EXTENDED_PIPELINES // custom render pipelines (includes Neo)
+//#define SCREEN_DROPLETS // neo water droplets
+//#define NEW_RENDERER // leeds-like world rendering, needs librw
#endif
#define FIX_SPRITES // fix sprites aspect ratio(moon, coronas, particle etc)
@@ -382,7 +383,7 @@ 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 USE_ADVANCED_SCRIPT_DEBUG_OUTPUT
@@ -427,19 +428,19 @@ enum Config {
#define FREE_CAM // Rotating cam
// Audio
-#define EXTERNAL_3D_SOUND // use external engine to simulate 3d audio spatialization. OpenAL would not work without it (because it works in a 3d space
+//#define EXTERNAL_3D_SOUND // use external engine to simulate 3d audio spatialization. OpenAL would not work without it (because it works in a 3d space
// originally and making it work in 2d only requires more resource). Will not work on PS2
-#define AUDIO_REFLECTIONS // Enable audio reflections. Disabled on mobile, didn't exist yet on PS2.
+//#define AUDIO_REFLECTIONS // Enable audio reflections. Disabled on mobile, didn't exist yet on PS2.
#define RADIO_SCROLL_TO_PREV_STATION
-#define AUDIO_CACHE
+//#define AUDIO_CACHE
#define PS2_AUDIO_CHANNELS // increases the maximum number of audio channels to PS2 value of 44 (PC has 28 originally)
#define PS2_AUDIO_PATHS // changes audio paths for cutscenes and radio to PS2 paths (needs vbdec on MSS builds)
-//#define AUDIO_OAL_USE_SNDFILE // use libsndfile to decode WAVs instead of our internal decoder
+#define AUDIO_OAL_USE_SNDFILE // use libsndfile to decode WAVs instead of our internal decoder
#define AUDIO_OAL_USE_MPG123 // use mpg123 to support mp3 files
#define PAUSE_RADIO_IN_FRONTEND // pause radio when game is paused
#define ATTACH_RELEASING_SOUNDS_TO_ENTITIES // sounds would follow ped and vehicles coordinates if not being queued otherwise
#define USE_TIME_SCALE_FOR_AUDIO // slow down/speed up sounds according to the speed of the game
-#define MULTITHREADED_AUDIO // for streams. requires C++11 or later
+//#define MULTITHREADED_AUDIO // for streams. requires C++11 or later
#ifdef AUDIO_OPUS
#define AUDIO_OAL_USE_OPUS // enable support of opus files
@@ -454,13 +455,13 @@ enum Config {
#endif
// Streaming
-#if !defined(_WIN32) && !defined(__SWITCH__)
+#if !defined(_WIN32) && !defined(__SWITCH__) && !defined __SYMBIAN32__
//#define ONE_THREAD_PER_CHANNEL // Don't use if you're not on SSD/Flash - also not utilized too much right now(see commented LoadAllRequestedModels in Streaming.cpp)
#define FLUSHABLE_STREAMING // Make it possible to interrupt reading when processing file isn't needed anymore.
#endif
#define BIG_IMG // Not complete - allows to read larger img files
-//#define SQUEEZE_PERFORMANCE
+#define SQUEEZE_PERFORMANCE
#ifdef SQUEEZE_PERFORMANCE
#undef PS2_ALPHA_TEST
#undef NO_ISLAND_LOADING
@@ -481,7 +482,7 @@ enum Config {
#define IGNORE_MOUSE_KEYBOARD // ignore mouse & keyboard input
#endif
-#ifdef __SWITCH__
+#if defined __SWITCH__ || defined __SYMBIAN32__
#define USE_UNNAMED_SEM // named semaphores are unsupported on the switch
#endif
@@ -495,4 +496,4 @@ enum Config {
#endif
#if defined(AUDIO_REFLECTIONS) && GTA_VERSION < GTA3_PC_10
#error AUDIO_REFLECTIONS cannot work with versions below GTA3_PC_10
-#endif
\ No newline at end of file
+#endif
diff --git a/src/core/main.cpp b/src/core/main.cpp
index 2a0a77c..07b3fa2 100644
--- a/src/core/main.cpp
+++ b/src/core/main.cpp
@@ -89,7 +89,7 @@ float FramesPerSecond = 30.0f;
bool gbPrintShite = false;
bool gbModelViewer;
#ifdef TIMEBARS
-bool gbShowTimebars;
+bool gbShowTimebars = true;
#endif
#ifdef DRAW_GAME_VERSION_TEXT
bool gbDrawVersionText; // Our addition, we think it was always enabled on !MASTER builds
@@ -1401,10 +1401,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();
@@ -1414,7 +1414,7 @@ RenderScene(void)
#ifndef SQUEEZE_PERFORMANCE
CRenderer::RenderVehiclesButNotBoats();
#endif
- CWeather::RenderRainStreaks();
+// CWeather::RenderRainStreaks();
POP_RENDERGROUP();
}
@@ -1446,17 +1446,17 @@ RenderEffects(void)
CGlass::Render();
CWaterCannons::Render();
CSpecialFX::Render();
- CShadows::RenderStaticShadows();
- CShadows::RenderStoredShadows();
- CSkidmarks::Render();
- CAntennas::Render();
- CRubbish::Render();
- CCoronas::Render();
- CParticle::Render();
+// CShadows::RenderStaticShadows();
+// CShadows::RenderStoredShadows();
+// CSkidmarks::Render();
+// CAntennas::Render();
+// CRubbish::Render();
+// CCoronas::Render();
+// CParticle::Render();
CPacManPickups::Render();
- CWeaponEffects::Render();
- CPointLights::RenderFogEffect();
- CMovingThings::Render();
+// CWeaponEffects::Render();
+// CPointLights::RenderFogEffect();
+// CMovingThings::Render();
CRenderer::RenderFirstPersonVehicle();
POP_RENDERGROUP();
}
diff --git a/src/core/re3.cpp b/src/core/re3.cpp
index a721c23..fd6f437 100644
--- a/src/core/re3.cpp
+++ b/src/core/re3.cpp
@@ -1160,7 +1160,7 @@ void re3_assert(const char *expr, const char *filename, unsigned int lineno, con
abort();
#else
// TODO
- printf("\nRE3 ASSERT FAILED\n\tFile: %s\n\tLine: %d\n\tFunction: %s\n\tExpression: %s\n",filename,lineno,func,expr);
+ re3_debug("\nRE3 ASSERT FAILED\n\tFile: %s\n\tLine: %d\n\tFunction: %s\n\tExpression: %s\n",filename,lineno,func,expr);
assert(false);
#endif
}
diff --git a/src/core/timebars.cpp b/src/core/timebars.cpp
index 94051b2..ac2a402 100644
--- a/src/core/timebars.cpp
+++ b/src/core/timebars.cpp
@@ -1,5 +1,5 @@
#include "common.h"
-#ifndef MASTER
+#ifdef TIMEBARS
#include "Font.h"
#include "Frontend.h"
#include "Timer.h"
@@ -96,7 +96,10 @@ void tbDisplay()
sprintf(temp, "FPS: %.2f", Diag_GetFPS());
AsciiToUnicode(temp, wtemp);
CFont::SetColor(CRGBA(255, 255, 255, 255));
- if (!CMenuManager::m_PrefsMarketing || !CMenuManager::m_PrefsDisableTutorials) {
+#ifndef MASTER
+ if (!CMenuManager::m_PrefsMarketing || !CMenuManager::m_PrefsDisableTutorials)
+#endif
+ {
CFont::PrintString(RsGlobal.maximumWidth * (4.0f / DEFAULT_SCREEN_WIDTH), RsGlobal.maximumHeight * (4.0f / DEFAULT_SCREEN_HEIGHT), wtemp);
#ifndef FINAL
@@ -105,7 +108,7 @@ void tbDisplay()
MaxTimes[i] = Max(MaxTimes[i], TimerBar.Timers[i].endTime - TimerBar.Timers[i].startTime);
sprintf(temp, "%s: %.2f", &TimerBar.Timers[i].name[0], MaxTimes[i]);
AsciiToUnicode(temp, wtemp);
- CFont::PrintString(RsGlobal.maximumWidth * (4.0f / DEFAULT_SCREEN_WIDTH), RsGlobal.maximumHeight * ((8.0f * (i + 2)) / DEFAULT_SCREEN_HEIGHT), wtemp);
+ CFont::PrintString(RsGlobal.maximumWidth * (4.0f / DEFAULT_SCREEN_WIDTH), RsGlobal.maximumHeight * ((8.0f * (i + 2)) / 200), wtemp);
}
#ifdef FRAMETIME
@@ -113,9 +116,9 @@ void tbDisplay()
sprintf(temp, "Frame Time: %.2f", MaxFrameTime);
AsciiToUnicode(temp, wtemp);
- CFont::PrintString(RsGlobal.maximumWidth * (4.0f / DEFAULT_SCREEN_WIDTH), RsGlobal.maximumHeight * ((8.0f * (TimerBar.count + 4)) / DEFAULT_SCREEN_HEIGHT), wtemp);
+ CFont::PrintString(RsGlobal.maximumWidth * (4.0f / DEFAULT_SCREEN_WIDTH), RsGlobal.maximumHeight * ((8.0f * (TimerBar.count + 4)) / 200), wtemp);
#endif // FRAMETIME
#endif // !FINAL
}
}
-#endif // !MASTER
\ No newline at end of file
+#endif // !MASTER
diff --git a/src/math/Matrix.h b/src/math/Matrix.h
index 6404b50..efcf7be 100644
--- a/src/math/Matrix.h
+++ b/src/math/Matrix.h
@@ -1,4 +1,7 @@
#pragma once
+#if defined(__ARMCC_VERSION)
+#pragma anon_unions
+#endif
class CMatrix
{
@@ -128,4 +131,4 @@ public:
class CCompressedMatrix : public CCompressedMatrixNotAligned
{
int _alignment; // no clue what would this align to
-};
\ No newline at end of file
+};
diff --git a/src/peds/Ped.cpp b/src/peds/Ped.cpp
index 6b28dcb..6a2c94f 100644
--- a/src/peds/Ped.cpp
+++ b/src/peds/Ped.cpp
@@ -7215,7 +7215,11 @@ CPed::LookForInterestingNodes(void)
if (!found)
return false;
- CVector effectFrontLocal = Multiply3x3(*objMat, effect->attractor.dir);
+ CVector dir;
+ dir.x = effect->attractor.dirX;
+ dir.y = effect->attractor.dirY;
+ dir.z = effect->attractor.dirZ;
+ CVector effectFrontLocal = Multiply3x3(*objMat, dir);
float angleToFace = CGeneral::GetRadianAngleBetweenPoints(effectFrontLocal.x, effectFrontLocal.y, 0.0f, 0.0f);
randVal = CGeneral::GetRandomNumber() % 256;
if (randVal <= m_randomSeed % 256) {
diff --git a/src/peds/PedAI.cpp b/src/peds/PedAI.cpp
index 8bd6791..3079b63 100644
--- a/src/peds/PedAI.cpp
+++ b/src/peds/PedAI.cpp
@@ -3694,7 +3694,9 @@ CPed::SetExitBoat(CVehicle *boat)
RemoveInCarAnims();
CColModel* boatCol = boat->GetColModel();
if (boat->IsUpsideDown()) {
- newPos = { 0.0f, 0.0f, boatCol->boundingBox.min.z };
+ newPos.x = 0.0f;
+ newPos.y = 0.0f;
+ newPos.z = boatCol->boundingBox.min.z;
newPos = boat->GetMatrix() * newPos;
newPos.z += 1.0f;
m_vehDoor = CAR_DOOR_RF;
@@ -5401,4 +5403,4 @@ CPed::WarpPedToNearEntityOffScreen(CEntity *warpTo)
}
m_leaveCarTimer = CTimer::GetTimeInMilliseconds() + 3000;
return teleported;
-}
\ No newline at end of file
+}
diff --git a/src/renderer/2dEffect.h b/src/renderer/2dEffect.h
index a8013b3..93d77b8 100644
--- a/src/renderer/2dEffect.h
+++ b/src/renderer/2dEffect.h
@@ -1,4 +1,7 @@
#pragma once
+#if defined(__ARMCC_VERSION)
+#pragma anon_unions
+#endif
enum {
EFFECT_LIGHT,
@@ -55,11 +58,13 @@ public:
};
struct Particle {
int particleType;
- CVector dir;
+ // CVector dir;
+ float dirX, dirY, dirZ;
float scale;
};
struct Attractor {
- CVector dir;
+ // CVector dir;
+ float dirX, dirY, dirZ;
int8 type;
uint8 probability;
};
diff --git a/src/renderer/Font.cpp b/src/renderer/Font.cpp
index 6a9944e..4ee24db 100644
--- a/src/renderer/Font.cpp
+++ b/src/renderer/Font.cpp
@@ -470,9 +470,9 @@ CFont::Shutdown(void)
void
CFont::InitPerFrame(void)
{
- Details.bank = CSprite2d::GetBank(30, Sprite[0].m_pTexture);
- CSprite2d::GetBank(15, Sprite[1].m_pTexture);
- CSprite2d::GetBank(15, Sprite[2].m_pTexture);
+ Details.bank = CSprite2d::GetBank(300, Sprite[0].m_pTexture);
+ CSprite2d::GetBank(100, Sprite[1].m_pTexture);
+ CSprite2d::GetBank(100, Sprite[2].m_pTexture);
#ifdef MORE_LANGUAGES
if (IsJapanese())
CSprite2d::GetBank(15, Sprite[3].m_pTexture);
@@ -1625,4 +1625,4 @@ CFont::character_code(uint8 c)
if(c < 128)
return c;
return foreign_table[c-128];
-}
\ No newline at end of file
+}
diff --git a/src/renderer/MBlur.cpp b/src/renderer/MBlur.cpp
index 8e5fba2..5e56e80 100644
--- a/src/renderer/MBlur.cpp
+++ b/src/renderer/MBlur.cpp
@@ -74,6 +74,7 @@ CMBlur::MotionBlurOpen(RwCamera *cam)
debug("Available video memory %d\n", avaible);
#endif
+#ifndef __SYMBIAN32__
if(BlurOn)
{
uint32 width = Pow(2.0f, int32(log2(RwRasterGetWidth (RwCameraGetRaster(cam))))+1);
@@ -123,6 +124,7 @@ CMBlur::MotionBlurOpen(RwCamera *cam)
#endif
CreateImmediateModeData(cam, &rect);
}
+#endif
else
{
rect.w = RwRasterGetWidth(RwCameraGetRaster(cam));
@@ -215,6 +217,8 @@ CMBlur::MotionBlurRender(RwCamera *cam, uint32 red, uint32 green, uint32 blue, u
if( pFrontBuffer )
OverlayRender(cam, pFrontBuffer, color, type, bluralpha);
#else
+
+#ifndef __SYMBIAN32__
if(BlurOn){
if(pFrontBuffer){
if(ms_bJustInitialised)
@@ -228,6 +232,7 @@ CMBlur::MotionBlurRender(RwCamera *cam, uint32 red, uint32 green, uint32 blue, u
}else{
OverlayRender(cam, nil, color, type, bluralpha);
}
+#endif
#endif
POP_RENDERGROUP();
#endif
diff --git a/src/renderer/Particle.cpp b/src/renderer/Particle.cpp
index 76ddde5..9eba620 100644
--- a/src/renderer/Particle.cpp
+++ b/src/renderer/Particle.cpp
@@ -601,22 +601,27 @@ CEntity::AddSteamsFromGround(CVector *unused)
if(effect->type != EFFECT_PARTICLE)
continue;
+ CVector dir;
+ dir.x = effect->particle.dirX;
+ dir.y = effect->particle.dirY;
+ dir.z = effect->particle.dirZ;
+
pos = GetMatrix() * effect->pos;
switch(effect->particle.particleType){
case 0:
- CParticleObject::AddObject(POBJECT_PAVEMENT_STEAM, pos, effect->particle.dir, effect->particle.scale, false);
+ CParticleObject::AddObject(POBJECT_PAVEMENT_STEAM, pos, dir, effect->particle.scale, false);
break;
case 1:
- CParticleObject::AddObject(POBJECT_WALL_STEAM, pos, effect->particle.dir, effect->particle.scale, false);
+ CParticleObject::AddObject(POBJECT_WALL_STEAM, pos, dir, effect->particle.scale, false);
break;
case 2:
CParticleObject::AddObject(POBJECT_DRY_ICE, pos, effect->particle.scale, false);
break;
case 3:
- CParticleObject::AddObject(POBJECT_SMALL_FIRE, pos, effect->particle.dir, effect->particle.scale, false);
+ CParticleObject::AddObject(POBJECT_SMALL_FIRE, pos, dir, effect->particle.scale, false);
break;
case 4:
- CParticleObject::AddObject(POBJECT_DARK_SMOKE, pos, effect->particle.dir, effect->particle.scale, false);
+ CParticleObject::AddObject(POBJECT_DARK_SMOKE, pos, dir, effect->particle.scale, false);
break;
}
}
diff --git a/src/renderer/Renderer.cpp b/src/renderer/Renderer.cpp
index 334f395..61894da 100644
--- a/src/renderer/Renderer.cpp
+++ b/src/renderer/Renderer.cpp
@@ -82,7 +82,7 @@ CLinkList gSortedBuildings;
CVector CRenderer::ms_vecCameraPosition;
CVehicle *CRenderer::m_pFirstPersonVehicle;
bool CRenderer::m_loadingPriority;
-float CRenderer::ms_lodDistScale = 1.2f;
+float CRenderer::ms_lodDistScale = 0.7f;
// unused
BlockedRange CRenderer::aBlockedRanges[16];
diff --git a/src/renderer/Rubbish.h b/src/renderer/Rubbish.h
index 37f895f..a372309 100644
--- a/src/renderer/Rubbish.h
+++ b/src/renderer/Rubbish.h
@@ -5,7 +5,7 @@ class CVehicle;
enum {
// NB: not all values are allowed, check the code
#ifdef SQUEEZE_PERFORMANCE
- NUM_RUBBISH_SHEETS = 32
+ NUM_RUBBISH_SHEETS = 16
#else
NUM_RUBBISH_SHEETS = 64
#endif
diff --git a/src/renderer/Shadows.h b/src/renderer/Shadows.h
index 8c909df..dcd4c63 100644
--- a/src/renderer/Shadows.h
+++ b/src/renderer/Shadows.h
@@ -1,9 +1,9 @@
#pragma once
-#define MAX_STOREDSHADOWS 48
+#define MAX_STOREDSHADOWS 12
#define MAX_POLYBUNCHES 300
-#define MAX_STATICSHADOWS 64
-#define MAX_PERMAMENTSHADOWS 48
+#define MAX_STATICSHADOWS 16
+#define MAX_PERMAMENTSHADOWS 12
class CEntity;
diff --git a/src/renderer/SpecialFX.cpp b/src/renderer/SpecialFX.cpp
index 6d96d21..485a404 100644
--- a/src/renderer/SpecialFX.cpp
+++ b/src/renderer/SpecialFX.cpp
@@ -137,10 +137,10 @@ void
CSpecialFX::Render(void)
{
PUSH_RENDERGROUP("CSpecialFX::Render");
- CMotionBlurStreaks::Render();
- CBulletTraces::Render();
- CBrightLights::Render();
- CShinyTexts::Render();
+// CMotionBlurStreaks::Render();
+// CBulletTraces::Render();
+// CBrightLights::Render();
+// CShinyTexts::Render();
CMoneyMessages::Render();
#ifdef NEW_RENDERER
if(!(gbNewRenderer && FredIsInFirstPersonCam()))
diff --git a/src/renderer/Sprite2d.cpp b/src/renderer/Sprite2d.cpp
index 5962251..846b5fe 100644
--- a/src/renderer/Sprite2d.cpp
+++ b/src/renderer/Sprite2d.cpp
@@ -12,7 +12,7 @@ int32 CSprite2d::mCurrentBank;
RwTexture *CSprite2d::mpBankTextures[10];
int32 CSprite2d::mCurrentSprite[10];
int32 CSprite2d::mBankStart[10];
-RwIm2DVertex CSprite2d::maBankVertices[500];
+RwIm2DVertex CSprite2d::maBankVertices[3000];
void
CSprite2d::SetRecipNearClip(void)
diff --git a/src/renderer/Sprite2d.h b/src/renderer/Sprite2d.h
index 0e12d44..eb2e13b 100644
--- a/src/renderer/Sprite2d.h
+++ b/src/renderer/Sprite2d.h
@@ -7,7 +7,7 @@ class CSprite2d
static RwTexture *mpBankTextures[10];
static int32 mCurrentSprite[10];
static int32 mBankStart[10];
- static RwIm2DVertex maBankVertices[500];
+ static RwIm2DVertex maBankVertices[3000];
static RwIm2DVertex maVertices[8];
public:
RwTexture *m_pTexture;
diff --git a/src/renderer/WaterLevel.cpp b/src/renderer/WaterLevel.cpp
index 7001c0c..e2f1cba 100644
--- a/src/renderer/WaterLevel.cpp
+++ b/src/renderer/WaterLevel.cpp
@@ -588,23 +588,24 @@ inline float
_GetWaterDrawDist()
{
// if z less then 15.0f return 1200.0f
- if ( TheCamera.GetPosition().z < 15.0f )
- return 1200.0f;
+// if ( TheCamera.GetPosition().z < 15.0f )
+// return 1200.0f;
// if z greater then 60.0f return 2000.0f;
if ( TheCamera.GetPosition().z > 60.0f )
- return 2000.0f;
-
- return (TheCamera.GetPosition().z + -15.0f) * 800.0f / 45.0f + 1200.0f;
+ return 700.0f;
+
+ return 4500.0f;
+// return (TheCamera.GetPosition().z + -15.0f) * 800.0f / 45.0f + 1200.0f;
}
inline float
_GetWavyDrawDist()
{
if ( FindPlayerVehicle() && FindPlayerVehicle()->IsBoat() )
- return 120.0f;
+ return 80.0f;
else
- return 70.0f;
+ return 45.0f;
}
inline void
diff --git a/src/renderer/Weather.h b/src/renderer/Weather.h
index 9c67031..b0dcf6a 100644
--- a/src/renderer/Weather.h
+++ b/src/renderer/Weather.h
@@ -58,7 +58,7 @@ public:
};
enum {
- NUM_RAIN_STREAKS = 35
+ NUM_RAIN_STREAKS = 10
};
struct tRainStreak
@@ -68,4 +68,4 @@ struct tRainStreak
uint32 timer;
};
-extern RwTexture* gpRainDropTex[4];
\ No newline at end of file
+extern RwTexture* gpRainDropTex[4];
diff --git a/src/rw/TexRead.cpp b/src/rw/TexRead.cpp
index 98e7d18..ca8945e 100644
--- a/src/rw/TexRead.cpp
+++ b/src/rw/TexRead.cpp
@@ -28,6 +28,99 @@
float texLoadTime;
int32 texNumLoaded;
+static RwImage* resizeImage(RwImage *image, int newWidth, int newHeight)
+{
+ image->convertTo32();
+
+ RwImage *resized = RwImageCreate(newWidth, newHeight, 32);
+ if (resized == nil) return nil;
+
+ RwImageAllocatePixels(resized);
+ if (resized->pixels == nil) {
+ RwImageDestroy(resized);
+ return nil;
+ }
+
+ for (int y = 0; y < newHeight; y++) {
+ uint8 *dst = resized->pixels + y*resized->stride;
+ int y0 = y*image->height/newHeight;
+ int y1 = (y + 1)*image->height/newHeight;
+ if (y1 <= y0)
+ y1 = y0 + 1;
+
+ for (int x = 0; x < newWidth; x++) {
+ int x0 = x*image->width/newWidth;
+ int x1 = (x + 1)*image->width/newWidth;
+ if (x1 <= x0)
+ x1 = x0 + 1;
+
+ uint r = 0;
+ uint g = 0;
+ uint b = 0;
+ uint a = 0;
+ uint samples = 0;
+
+ for (int sy = y0; sy < y1; sy++) {
+ const uint8 *src = image->pixels + sy*image->stride + x0*4;
+ for (int sx = x0; sx < x1; sx++) {
+ r += src[0];
+ g += src[1];
+ b += src[2];
+ a += src[3];
+ samples++;
+ src += 4;
+ }
+ }
+
+ dst[0] = r / samples;
+ dst[1] = g / samples;
+ dst[2] = b / samples;
+ dst[3] = a / samples;
+ dst += 4;
+ }
+ }
+
+ return resized;
+}
+
+
+static int clamp(int32 size)
+{
+ while (size > 32 && size > 1) {
+ size = (size + 1) / 2;
+ }
+ return size;
+}
+
+static void downscaleTexture(RwTexture *texture)
+{
+ RwRaster *oldRaster = RwTextureGetRaster(texture);
+ if (oldRaster == nil)
+ return;
+
+ int oldWidth = RwRasterGetWidth(oldRaster);
+ int oldHeight = RwRasterGetHeight(oldRaster);
+ if (oldWidth <= 32 && oldHeight <= 32) return;
+
+ int newWidth = clamp(oldWidth);
+ int newHeight = clamp(oldHeight);
+ if (newWidth == oldWidth && newHeight == oldHeight) return;
+
+ RwImage *image = oldRaster->toImage();
+ if (image == nil) return;
+
+ RwImage *resized = resizeImage(image, newWidth, newHeight);
+ RwImageDestroy(image);
+ if (resized == nil) return;
+
+ RwRaster *newRaster = rw::Raster::createFromImage(resized);
+ RwImageDestroy(resized);
+ if (newRaster == nil) return;
+
+ RwTextureSetRaster(texture, newRaster);
+ RwRasterDestroy(oldRaster);
+}
+
#ifdef LIBRW
#define READNATIVE(stream, tex, size) rwNativeTextureHackRead(stream, tex, size)
#else
@@ -164,7 +257,7 @@ RwTexDictionaryGtaStreamRead2(RwStream *stream, RwTexDictionary *texDict)
#ifdef LIBRW
-#define CAPSVERSION 0
+#define CAPSVERSION 1
struct GPUcaps
{
@@ -397,7 +490,11 @@ CreateTxdImageForVideoCard()
sprintf(filename, "%s.txd", CTxdStore::GetTxdName(i));
if (CTxdStore::GetSlot(i)->texDict) {
-
+ RwTexDictionary *texDict = CTxdStore::GetSlot(i)->texDict;
+ FORLIST(lnk, texDict->textures){
+ rw::Texture *texture = rw::Texture::fromDict(lnk);
+ downscaleTexture(texture);
+ }
int32 pos = STREAMTELL(img);
if (RwTexDictionaryStreamWrite(CTxdStore::GetSlot(i)->texDict, img) == nil) {
diff --git a/src/skel/crossplatform.cpp b/src/skel/crossplatform.cpp
index e69c22e..69c1251 100644
--- a/src/skel/crossplatform.cpp
+++ b/src/skel/crossplatform.cpp
@@ -26,35 +26,19 @@ void GetLocalTime_CP(SYSTEMTIME *out) {
// Compatible with Linux/POSIX and MinGW on Windows
#ifndef _WIN32
HANDLE FindFirstFile(const char* pathname, WIN32_FIND_DATA* firstfile) {
- char pathCopy[MAX_PATH];
- strcpy(pathCopy, pathname);
+ char newpathname[64];
+ snprintf(newpathname, sizeof(newpathname), "E:/data/gta3/%s", pathname);
+ char* path = strtok(newpathname, "\\*");
+ strncpy(firstfile->folder, path, sizeof(firstfile->folder));
- char *folder = strtok(pathCopy, "*");
- char *extension = strtok(NULL, "*");
-
- // because I remember like strtok might not return NULL for last delimiter
- if (extension && extension - folder == strlen(pathname))
- extension = nil;
-
- // Case-sensitivity and backslashes...
- // Will be freed at the bottom
- char *realFolder = casepath(folder);
- if (realFolder) {
- folder = realFolder;
- }
-
- strncpy(firstfile->folder, folder, sizeof(firstfile->folder));
-
- if (extension)
- strncpy(firstfile->extension, extension, sizeof(firstfile->extension));
+ // Both w/ extension and w/o extension is ok
+ if (strlen(path) + 2 != strlen(pathname))
+ strncpy(firstfile->extension, strtok(NULL, "\\*"), sizeof(firstfile->extension));
else
- firstfile->extension[0] = '\0';
-
- if (realFolder)
- free(realFolder);
+ strncpy(firstfile->extension, "", sizeof(firstfile->extension));
HANDLE d;
- if ((d = (HANDLE)opendir(firstfile->folder)) == NULL || !FindNextFile(d, firstfile))
+ if ((d = (HANDLE)opendir(path)) == NULL || !FindNextFile(d, firstfile))
return NULL;
return d;
@@ -67,12 +51,11 @@ bool FindNextFile(HANDLE d, WIN32_FIND_DATA* finddata) {
int extensionLen = strlen(finddata->extension);
while ((file = readdir((DIR*)d)) != NULL) {
- // We only want "DT_REG"ular Files, but reportedly some FS and OSes gives DT_UNKNOWN as type.
- if ((file->d_type == DT_UNKNOWN || file->d_type == DT_REG || file->d_type == DT_LNK) &&
- (extensionLen == 0 || strncasecmp(&file->d_name[strlen(file->d_name) - extensionLen], finddata->extension, extensionLen) == 0)) {
+ if ((extensionLen == 0 || strncmp(&file->d_name[strlen(file->d_name) - extensionLen], finddata->extension, extensionLen) == 0)) {
sprintf(relativepath, "%s/%s", finddata->folder, file->d_name);
- realpath(relativepath, path);
+ // realpath(relativepath, path);
+ strcpy(path, relativepath);
stat(path, &fileStats);
strncpy(finddata->cFileName, file->d_name, sizeof(finddata->cFileName));
finddata->ftLastWriteTime = fileStats.st_mtime;
@@ -182,115 +165,26 @@ int _caserename(const char *old_filename, const char *new_filename)
// Returned string should freed manually (if exists)
char* casepath(char const* path, bool checkPathFirst)
{
- if (checkPathFirst && access(path, F_OK) != -1) {
- // File path is correct
- return nil;
- }
+ size_t l = strlen(path);
+ char data_path[512];
+ getcwd(data_path, sizeof(data_path));
+ char* out = (char*)malloc(l + strlen(data_path) + 2);
- size_t l = strlen(path);
- char* p = (char*)alloca(l + 1);
- char* out = (char*)malloc(l + 3); // for extra ./
- strcpy(p, path);
+ if (strncmp(path, "E:", 2) == 0 || strncmp(path, "F:", 2) == 0) {
+ strcpy(out, path);
+ } else {
+ sprintf(out, "%s/%s", data_path, path);
+ }
- // my addon: linux doesn't handle filenames with spaces at the end nicely
- p = trim(p);
+ l = strlen(out);
+ for (int i = l-1; i >= 0; i--) {
+ if (out[i] == '\\' || out[i] == '/' || out[i] == ' ')
+ out[i] = '\0';
+ else
+ break;
+ }
- size_t rl = 0;
-
- DIR* d;
- char* c;
-
- #if defined(__SWITCH__) || defined(PSP2)
- if( (c = strstr(p, ":/")) != NULL) // scheme used by some environments, eg. switch, vita
- {
- size_t deviceNameOffset = c - p + 3;
- char* deviceNamePath = (char*)alloca(deviceNameOffset + 1);
- strlcpy(deviceNamePath, p, deviceNameOffset);
- deviceNamePath[deviceNameOffset] = 0;
- d = opendir(deviceNamePath);
- p = c + 1;
- }
- else
- #endif
- if (p[0] == '/' || p[0] == '\\')
- {
- d = opendir("/");
- }
- else
- {
- d = opendir(".");
- out[0] = '.';
- out[1] = 0;
- rl = 1;
- }
-
- bool cantProceed = false; // just convert slashes in what's left in string, don't correct case of letters(because we can't)
- bool mayBeTrailingSlash = false;
-
- while (c = strsep(&p, "/\\"))
- {
- // May be trailing slash(allow), slash at the start(avoid), or multiple slashes(avoid)
- if (*c == '\0')
- {
- mayBeTrailingSlash = true;
- continue;
- } else {
- mayBeTrailingSlash = false;
- }
-
- out[rl] = '/';
- rl += 1;
- out[rl] = 0;
-
- if (cantProceed)
- {
- strcpy(out + rl, c);
- rl += strlen(c);
- continue;
- }
-
- struct dirent* e;
- while (e = readdir(d))
- {
- if (strcasecmp(c, e->d_name) == 0)
- {
- strcpy(out + rl, e->d_name);
- int reportedLen = (int)strlen(e->d_name);
- rl += reportedLen;
- assert(reportedLen == strlen(c) && "casepath: This is not good at all");
-
- closedir(d);
- d = opendir(out);
-
- // Either it wasn't a folder, or permission error, I/O error etc.
- if (!d) {
- cantProceed = true;
- }
-
- break;
- }
- }
-
- if (!e)
- {
- printf("casepath couldn't find dir/file \"%s\", full path was %s\n", c, path);
- // No match, add original name and continue converting further slashes.
- strcpy(out + rl, c);
- rl += strlen(c);
- cantProceed = true;
- }
- }
-
- if (d) closedir(d);
- if (mayBeTrailingSlash) {
- out[rl] = '/'; rl += 1;
- out[rl] = '\0';
- }
-
- if (rl > l + 2) {
- printf("\n\ncasepath: Corrected path length is longer then original+2:\n\tOriginal: %s (%zu chars)\n\tCorrected: %s (%zu chars)\n\n", path, l, out, rl);
- }
- return out;
+ return out;
}
#endif
diff --git a/src/skel/crossplatform.h b/src/skel/crossplatform.h
index 67bb428..a6ed8a7 100644
--- a/src/skel/crossplatform.h
+++ b/src/skel/crossplatform.h
@@ -59,7 +59,9 @@ int _caserename(const char *old_filename, const char *new_filename);
#ifdef RW_GL3
typedef struct
{
+#ifndef __SYMBIAN32__
GLFWwindow* window;
+#endif
RwBool fullScreen;
RwV2d lastMousePos;
double mouseWheel; // glfw doesn't cache it
@@ -96,6 +98,12 @@ extern RwUInt32 gGameState;
RwBool IsForegroundApp();
+#if !defined PATH_MAX
+ #define PATH_MAX 260
+#endif
+#if !defined NAME_MAX
+ #define NAME_MAX 120
+#endif
#ifndef MAX_PATH
#if !defined _WIN32 || defined __MINGW32__
#define MAX_PATH PATH_MAX
diff --git a/src/skel/platform.h b/src/skel/platform.h
index c9a8a11..8068a62 100644
--- a/src/skel/platform.h
+++ b/src/skel/platform.h
@@ -11,7 +11,7 @@ extern "C"
{
#endif /* __cplusplus */
-#ifdef _WIN32
+#if defined(_WIN32) || defined(__SYMBIAN32__)
extern RwUInt32 psTimer(void);
#else
extern double psTimer(void);
diff --git a/src/skel/skeleton.cpp b/src/skel/skeleton.cpp
index 7889056..19a3cbd 100644
--- a/src/skel/skeleton.cpp
+++ b/src/skel/skeleton.cpp
@@ -17,7 +17,7 @@ static RwBool DefaultVideoMode = TRUE;
RsGlobalType RsGlobal;
-#ifdef _WIN32
+#if defined _WIN32 || defined __SYMBIAN32__
RwUInt32
#else
double
diff --git a/src/skel/skeleton.h b/src/skel/skeleton.h
index 380b6c0..c92df25 100644
--- a/src/skel/skeleton.h
+++ b/src/skel/skeleton.h
@@ -254,7 +254,7 @@ extern RwBool
RsInputDeviceAttach(RsInputDeviceType inputDevice,
RsInputEventHandler inputEventHandler);
-#ifdef _WIN32
+#if defined _WIN32 || defined __SYMBIAN32__
extern RwUInt32
#else
extern double
diff --git a/src/skel/symbian/symbian.cpp b/src/skel/symbian/symbian.cpp
new file mode 100644
index 0000000..8cc8261
--- /dev/null
+++ b/src/skel/symbian/symbian.cpp
@@ -0,0 +1,586 @@
+#include
+#include
+#include
+#include
+#include
+#include
+#include
+#include
+#include
+#include
+#include
+#include
+#include
+#include
+
+#include "common.h"
+#include "rwcore.h"
+#include "skel/skeleton.h"
+#include "platform.h"
+#include "crossplatform.h"
+
+#include "main.h"
+#include "FileMgr.h"
+#include "Pad.h"
+#include "DMAudio.h"
+#include "ControllerConfig.h"
+#include "Frontend.h"
+#include "Game.h"
+#include "PCSave.h"
+#include "MemoryCard.h"
+#include "Sprite2d.h"
+#include "AnimViewer.h"
+#include "MemoryMgr.h"
+#include "Text.h"
+#include "Timer.h"
+
+psGlobalType psGlobal;
+
+uint32 gGameState = 0;
+long _dwOperatingSystemVersion = 0;
+uint32 _dwMemAvailPhys = 0;
+
+static EGLDisplay eglDisplay;
+static EGLContext eglContext;
+static EGLSurface eglSurface;
+static EGLConfig eglConfig;
+
+rw::EngineOpenParams openParams;
+
+const TUid KUidRE3 = {0xe0d67647};
+
+#define JOY_A 0 // cross
+#define JOY_B 1 // circle
+#define JOY_X 2 // square
+#define JOY_Y 3 // triangle
+#define JOY_LB 6
+#define JOY_RB 7
+#define JOY_START 11
+#define JOY_DPAD_UP 12
+#define JOY_DPAD_RIGHT 13
+#define JOY_DPAD_DOWN 14
+#define JOY_DPAD_LEFT 15
+
+static uint8 virtualButtons[17] = { 0 };
+static float virtualLeftStickX = 0.0f;
+static float virtualLeftStickY = 0.0f;
+static float virtualRightStickX = 0.0f;
+static float virtualRightStickY = 0.0f;
+
+static TInt tickPeriod;
+static uint32 cyclesPerMS;
+
+static psGlobalType PsGlobal;
+
+static TBool foreground;
+
+void _InputTranslateShiftKeyUpDown(RsKeyCodes *rs) {
+}
+
+const char* _psGetUserFilesFolder() {
+ return "E:\\Data\\gta3\\";
+}
+
+void HandleExit() {
+}
+
+RwInt32 _psGetNumVideModes() {
+ return 1;
+}
+
+RwChar** _psGetVideoModeList() {
+ static RwChar* modes[] = { (RwChar*)"Native" };
+ return modes;
+}
+
+void _psSelectScreenVM(RwInt32 videoMode) {
+ RwTexDictionarySetCurrent( nil );
+ FrontEndMenuManager.UnloadTextures();
+ FrontEndMenuManager.LoadAllTextures();
+}
+
+void CapturePad(int padID) {
+ if (padID != 0) return;
+
+ if (!ControlsManager.m_bFirstCapture) {
+ memcpy(&ControlsManager.m_OldState, &ControlsManager.m_NewState, sizeof(ControlsManager.m_NewState));
+ } else {
+ memset(&ControlsManager.m_OldState, 0, sizeof(ControlsManager.m_OldState));
+ }
+
+ ControlsManager.m_NewState.buttons = virtualButtons;
+ ControlsManager.m_NewState.numButtons = 17;
+ ControlsManager.m_NewState.id = 0;
+ ControlsManager.m_NewState.isGamepad = true;
+
+ memcpy(ControlsManager.m_NewState.mappedButtons, virtualButtons, 17);
+
+ if (ControlsManager.m_bFirstCapture) {
+ memcpy(&ControlsManager.m_OldState, &ControlsManager.m_NewState, sizeof(ControlsManager.m_NewState));
+ ControlsManager.m_bFirstCapture = false;
+ }
+
+ RsPadButtonStatus bs;
+ bs.padID = padID;
+
+ RsPadEventHandler(rsPADBUTTONUP, (void *)&bs);
+
+ {
+ if (CPad::m_bMapPadOneToPadTwo)
+ bs.padID = 1;
+
+ RsPadEventHandler(rsPADBUTTONUP, (void *)&bs);
+ RsPadEventHandler(rsPADBUTTONDOWN, (void *)&bs);
+ }
+
+ CPad *pad = CPad::GetPad(0);
+ pad->PCTempJoyState.LeftStickX = (int32)(virtualLeftStickX * 128.0f);
+ pad->PCTempJoyState.LeftStickY = (int32)(virtualLeftStickY * 128.0f);
+ pad->PCTempJoyState.RightStickX = (int32)(virtualRightStickX * 128.0f);
+ pad->PCTempJoyState.RightStickY = (int32)(virtualRightStickY * 128.0f);
+}
+
+RwBool psCameraBeginUpdate(RwCamera *camera) {
+ RwCameraBeginUpdate(camera);
+ return TRUE;
+}
+
+void psCameraShowRaster(RwCamera *camera) {
+ RwCameraShowRaster(camera, NULL, 0);
+}
+
+RwMemoryFunctions* psGetMemoryFunctions(void) {
+ return nil;
+}
+
+RwImage* psGrabScreen(RwCamera *camera) {
+ return NULL;
+}
+
+RwBool psInstallFileSystem(void) {
+ return TRUE;
+}
+
+void psMouseSetPos(RwV2d *pos) {
+}
+
+RwBool psNativeTextureSupport(void) {
+ return TRUE;
+}
+
+RwBool psSelectDevice(void) {
+ return TRUE;
+}
+
+void psTerminate(void) {
+}
+
+RwBool psInitialize(void) {
+ CFileMgr::Initialise();
+ TInt memFree = 0;
+ if (HAL::Get(HALData::EMemoryRAMFree, memFree) == KErrNone) {
+ if (memFree > 40 * 1024 * 1024) {
+ _dwMemAvailPhys = 40 * 1024 * 1024;
+ } else if (memFree <= 0) {
+ _dwMemAvailPhys = 10 * 1024 * 1024;
+ } else {
+ _dwMemAvailPhys = memFree;
+ }
+ } else {
+ _dwMemAvailPhys = 40 * 1024 * 1024;
+ }
+
+ C_PcSave::SetSaveDirectory(_psGetUserFilesFolder());
+
+ return TRUE;
+}
+
+RwUInt32 psTimer(void) {
+// return (RwUInt32)User::NTickCount();
+ TTime time;
+ time.HomeTime();
+ return (RwUInt32)(time.Int64() / 1000);
+}
+
+namespace sk {
+ void SetMousePosition(int x, int y) {}
+}
+
+
+extern "C" void RDebug_Printf(const char*, ...);
+void RDebug_Printf(const char* c, ...)
+{
+ VA_LIST list;
+ VA_START(list, c);
+ TBuf8<0x100> buf;
+ TPtrC8 des((const TUint8 *)c);
+ buf.FormatList(des, list);
+ RDebug::RawPrint(buf);
+}
+
+uint32 CTimer::GetCyclesPerMillisecond(void) {
+// return cyclesPerMS;
+ return 1;
+}
+
+RwBool IsForegroundApp() {
+ return foreground;
+}
+
+class CCContainer : public CCoeControl {
+public:
+ CAknAppUi* iAppUi;
+ CPeriodic* iPeriodic;
+ RwUInt32 gGameState;
+ static TInt LoopCallBack(TAny* p) {
+ CCContainer* container = (CCContainer*) p;
+ if(RsGlobal.quit) {
+ RsEventHandler(rsRWTERMINATE, nil);
+ container->iAppUi->Exit();
+ return EFalse;
+ }
+
+ switch (container->gGameState) {
+ case GS_START_UP:
+ foreground = true;
+ if (HAL::Get(HAL::ENanoTickPeriod, tickPeriod) != KErrNone) {
+ User::Panic(_L("Could not init timer"), 0);
+ }
+ cyclesPerMS = 1000 / tickPeriod;
+ if (cyclesPerMS < 1) cyclesPerMS = 1;
+ container->gGameState = GS_INIT_ONCE;
+ break;
+ case GS_INIT_ONCE:
+ LoadingScreen(nil, nil, "loadsc0");
+ if ( !CGame::InitialiseOnceAfterRW() ) {
+ RsGlobal.quit = TRUE;
+ return ETrue;
+ }
+// container->gGameState = GS_INIT_FRONTEND;
+ container->gGameState = GS_INIT_PLAYING_GAME;
+ break;
+ case GS_INIT_FRONTEND:
+ LoadingScreen(nil, nil, "loadsc0");
+
+ FrontEndMenuManager.m_bGameNotLoaded = true;
+
+ CMenuManager::m_bStartUpFrontEndRequested = true;
+
+ container->gGameState = GS_FRONTEND;
+
+// container->gGameState = GS_INIT_PLAYING_GAME;
+ break;
+ case GS_FRONTEND:
+ RsEventHandler(rsFRONTENDIDLE, nil);
+ if ( !FrontEndMenuManager.m_bMenuActive || FrontEndMenuManager.m_bWantToLoad )
+ {
+ container->gGameState = GS_INIT_PLAYING_GAME;
+ TRACE("gGameState = GS_INIT_PLAYING_GAME;");
+ }
+ if ( FrontEndMenuManager.m_bWantToLoad )
+ {
+ InitialiseGame();
+ FrontEndMenuManager.m_bGameNotLoaded = false;
+ container->gGameState = GS_PLAYING_GAME;
+ TRACE("gGameState = GS_PLAYING_GAME;");
+ }
+ break;
+ case GS_INIT_PLAYING_GAME:
+ InitialiseGame();
+
+ FrontEndMenuManager.m_bGameNotLoaded = false;
+ container->gGameState = GS_PLAYING_GAME;
+ TRACE("gGameState = GS_PLAYING_GAME;");
+ break;
+ case GS_PLAYING_GAME:
+// float ms = (float)CTimer::GetCurrentTimeInCycles() / (float)tickPeriod; //(float)CTimer::GetCyclesPerMillisecond();
+// if ( RwInitialised )
+// {
+// if (!CMenuManager::m_PrefsFrameLimiter || (1000.0f / (float)RsGlobal.maxFPS) < ms)
+ RsEventHandler(rsIDLE, (void *)TRUE);
+// }
+ break;
+ }
+
+ if (IsForegroundApp()) {
+ User::ResetInactivityTime();
+ }
+
+ return ETrue;
+ }
+
+ void RestartTimerL(TInt aInterval) {
+ if (iPeriodic) iPeriodic->Cancel();
+ else iPeriodic = CPeriodic::NewL(CActive::EPriorityStandard);
+ iPeriodic->Start(aInterval, aInterval, TCallBack(CCContainer::LoopCallBack, this));
+ }
+
+ void ConstructL(const TRect& aRect, CAknAppUi* aAppUi) {
+ iAppUi = aAppUi;
+ CreateWindowL();
+ SetExtentToWholeScreen();
+ Window().EnableAdvancedPointers();
+ EnableDragEvents();
+ ActivateL();
+
+ TSize size = Size();
+ RsGlobal.width = size.iWidth;
+ RsGlobal.height = size.iHeight;
+
+ EGLint attribs[] = {
+ EGL_BUFFER_SIZE, 16,
+ EGL_DEPTH_SIZE, 16,
+ EGL_STENCIL_SIZE, 0,
+ EGL_SAMPLES, 0,
+ EGL_COLOR_BUFFER_TYPE, EGL_RGB_BUFFER,
+ EGL_SURFACE_TYPE, EGL_WINDOW_BIT,
+ EGL_RENDERABLE_TYPE, EGL_OPENGL_ES2_BIT,
+ EGL_NONE
+ };
+
+ eglDisplay = eglGetDisplay(EGL_DEFAULT_DISPLAY);
+ eglInitialize(eglDisplay, NULL, NULL);
+ eglBindAPI(EGL_OPENGL_ES_API);
+
+ EGLint numConfigs;
+ eglChooseConfig(eglDisplay, attribs, &eglConfig, 1, &numConfigs);
+
+ EGLint contextAttribs[ 3 ] = { EGL_CONTEXT_CLIENT_VERSION, 2, EGL_NONE };
+ eglContext = eglCreateContext(eglDisplay, eglConfig, EGL_NO_CONTEXT, contextAttribs);
+
+ RWindow& window = Window();
+ eglSurface = eglCreateWindowSurface(eglDisplay, eglConfig, &window, NULL);
+
+ eglMakeCurrent(eglDisplay, eglSurface, eglSurface, eglContext);
+
+ setlocale(LC_ALL, "");
+ setlocale(LC_CTYPE, "C");
+ setlocale(LC_COLLATE, "C");
+ setlocale(LC_NUMERIC, "C");
+
+ chdir("E:\\Data\\gta3\\");
+ gGameState = GS_START_UP;
+ FrontEndMenuManager.LoadSettings();
+ CMenuManager::OS_Language = LANG_ENGLISH;
+ CMenuManager::m_PrefsLanguage = CMenuManager::LANGUAGE_AMERICAN;
+ TheText.Unload();
+ TheText.Load();
+
+ chdir("E:\\Data\\gta3\\");
+ if(RsEventHandler(rsINITIALIZE, nil) == rsEVENTERROR) return;
+
+ openParams.width = RsGlobal.width;
+ openParams.height = RsGlobal.height;
+ openParams.windowtitle = RsGlobal.appName;
+
+ ControlsManager.MakeControllerActionsBlank();
+ ControlsManager.InitDefaultControlConfiguration();
+
+ if(RsEventHandler(rsRWINITIALIZE, &openParams) == rsEVENTERROR) return;
+
+ CPad::GetPad(0)->Clear(true);
+ CPad::GetPad(1)->Clear(true);
+
+ PsGlobal.lastMousePos.x = PsGlobal.lastMousePos.y = 0.0f;
+ RsGlobal.ps = &PsGlobal;
+
+ ControlsManager.InitDefaultControlConfigJoyPad(15);
+ ControlsManager.InitDefaultControlConfigMouse(MousePointerStateHelper.GetMouseSetUp());
+
+ {
+ RwRect r;
+
+ r.x = 0;
+ r.y = 0;
+ r.w = RsGlobal.maximumWidth;
+ r.h = RsGlobal.maximumHeight;
+
+ RsEventHandler(rsCAMERASIZE, &r);
+ }
+
+ RestartTimerL(10000);
+ }
+
+ virtual void HandlePointerEventL(const TPointerEvent& aPointerEvent) {
+ int x = aPointerEvent.iPosition.iX;
+ int y = aPointerEvent.iPosition.iY;
+ int w = RsGlobal.width;
+ int h = RsGlobal.height;
+
+// if (FrontEndMenuManager.m_bMenuActive) {
+// PSGLOBAL(lastMousePos).x = x;
+// PSGLOBAL(lastMousePos).y = y;
+// FrontEndMenuManager.m_nMouseTempPosX = x;
+// FrontEndMenuManager.m_nMouseTempPosY = y;
+//
+// if (aPointerEvent.iType == TPointerEvent::EButton1Down) {
+// CPad::GetPad(0)->PCTempMouseControllerState.LMB = true;
+// } else if (aPointerEvent.iType == TPointerEvent::EButton1Up) {
+// CPad::GetPad(0)->PCTempMouseControllerState.RMB = false;
+// }
+// CCoeControl::HandlePointerEventL(aPointerEvent);
+// return;
+// }
+
+ const TAdvancedPointerEvent* advpointer = aPointerEvent.AdvancedPointerEvent();
+ int i = advpointer != NULL ? advpointer->PointerNumber() : 0;
+
+ static int activeZone[10];
+ static int stickCenterX[10];
+ static int stickCenterY[10];
+
+ if (i > 9) {
+ CCoeControl::HandlePointerEventL(aPointerEvent);
+ return;
+ }
+
+ if (aPointerEvent.iType == TPointerEvent::EButton1Down) {
+ if (x < w / 3 && y > h / 4) {
+ // bottom left: left stick
+ activeZone[i] = 1;
+ stickCenterX[i] = x;
+ stickCenterY[i] = y;
+ } else if (x > w * 2 / 3 && y > h / 4) {
+ // bottom right: right stick
+ activeZone[i] = 2;
+ stickCenterX[i] = x;
+ stickCenterY[i] = y;
+ } else if (x > w - (w / 5) && y < h / 4) {
+ // top right: enter/exit
+ activeZone[i] = 3;
+ virtualButtons[JOY_Y] = 1;
+ } else if (x < w / 5 && y < h / 4) {
+ // top left: brake
+ activeZone[i] = 4;
+ virtualButtons[JOY_X] = 1;
+ } else {
+ // gas
+ activeZone[i] = 5;
+ virtualButtons[JOY_B] = 1;
+ }
+ }
+
+ if (aPointerEvent.iType == TPointerEvent::EDrag) {
+ if (activeZone[i] == 1 || activeZone[i] == 2) {
+ float dx = (float)(x - stickCenterX[i]) / (w / 8.0f);
+ float dy = (float)(y - stickCenterY[i]) / (h / 6.0f);
+
+ if (dx < -1.0f) dx = -1.0f;
+ if (dx > 1.0f) dx = 1.0f;
+ if (dy < -1.0f) dy = -1.0f;
+ if (dy > 1.0f) dy = 1.0f;
+
+ if (activeZone[i] == 1) {
+ virtualLeftStickX = dx;
+ virtualLeftStickY = dy;
+ } else {
+ virtualRightStickX = dx;
+ virtualRightStickY = dy;
+ }
+ }
+ }
+
+ if (aPointerEvent.iType == TPointerEvent::EButton1Up) {
+ if (activeZone[i] == 1) {
+ virtualLeftStickX = 0.0f;
+ virtualLeftStickY = 0.0f;
+ } else if (activeZone[i] == 2) {
+ virtualRightStickX = 0.0f;
+ virtualRightStickY = 0.0f;
+ } else if (activeZone[i] == 3) {
+ virtualButtons[JOY_Y] = 0;
+ } else if (activeZone[i] == 4) {
+ virtualButtons[JOY_X] = 0;
+ } else if (activeZone[i] == 5) {
+ virtualButtons[JOY_B] = 0;
+ }
+ activeZone[i] = 0;
+ }
+
+ CCoeControl::HandlePointerEventL(aPointerEvent);
+ }
+};
+
+class RE3AppUi : public CAknAppUi {
+ CCContainer* iContainer;
+public:
+ void ConstructL() {
+ BaseConstructL(CAknAppUi::EAknEnableSkin);
+ iContainer = new (ELeave) CCContainer;
+ iContainer->SetMopParent(this);
+ iContainer->ConstructL(ClientRect(), this);
+ AddToStackL(iContainer);
+ }
+ void HandleForegroundEventL(TBool aForeground) {
+ foreground = aForeground;
+ }
+
+ ~RE3AppUi() {
+ if (iContainer) {
+ RemoveFromStack(iContainer);
+ delete iContainer;
+ }
+ }
+ void HandleCommandL(TInt aCommand) {
+ if (aCommand == EAknSoftkeyBack || aCommand == EEikCmdExit) {
+ RsGlobal.quit = 1;
+ }
+ }
+};
+
+class RE3Document: public CAknDocument {
+public:
+ static RE3Document* NewL(CEikApplication& aApp);
+ virtual ~RE3Document();
+protected:
+ void ConstructL();
+public:
+ RE3Document(CEikApplication& aApp);
+private:
+ CEikAppUi* CreateAppUiL();
+};
+
+RE3Document::RE3Document(CEikApplication& aApp) : CAknDocument(aApp) {}
+
+RE3Document::~RE3Document() {}
+
+void RE3Document::ConstructL() {}
+
+RE3Document* RE3Document::NewL(CEikApplication& aApp) {
+ RE3Document* self = new (ELeave) RE3Document(aApp);
+ CleanupStack::PushL(self);
+ self->ConstructL();
+ CleanupStack::Pop();
+ return self;
+}
+
+CEikAppUi* RE3Document::CreateAppUiL() {
+ return new (ELeave) RE3AppUi;
+}
+
+class RE3App: public CAknApplication {
+private:
+ CApaDocument* CreateDocumentL();
+ TUid AppDllUid() const;
+};
+
+LOCAL_C CApaApplication* NewApplication();
+
+GLDEF_C TInt E32Main();
+
+TUid RE3App::AppDllUid() const {
+ return KUidRE3;
+}
+
+CApaDocument* RE3App::CreateDocumentL() {
+ return RE3Document::NewL(*this);
+}
+
+CApaApplication* NewApplication() {
+ return new RE3App;
+}
+
+TInt E32Main() {
+ User::SetFloatingPointMode(EFpModeRunFast);
+ return EikStart::RunApplication(NewApplication);
+}
diff --git a/vendor/librw/rw.h b/vendor/librw/rw.h
index fb9829f..c6a36ce 100644
--- a/vendor/librw/rw.h
+++ b/vendor/librw/rw.h
@@ -1,3 +1,5 @@
+#pragma once
+
#include
#include
#include
diff --git a/vendor/librw/skeleton/imgui/imgui.h b/vendor/librw/skeleton/imgui/imgui.h
index 06a610d..1b75a22 100644
--- a/vendor/librw/skeleton/imgui/imgui.h
+++ b/vendor/librw/skeleton/imgui/imgui.h
@@ -120,6 +120,8 @@ Index of this file:
#if __has_warning("-Wzero-as-null-pointer-constant")
#pragma clang diagnostic ignored "-Wzero-as-null-pointer-constant"
#endif
+#elif defined(__ARMCC_VERSION)
+
#elif defined(__GNUC__)
#pragma GCC diagnostic push
#pragma GCC diagnostic ignored "-Wpragmas" // warning: unknown option after '#pragma GCC diagnostic' kind
@@ -2836,6 +2838,8 @@ enum ImDrawCornerFlags_
#if defined(__clang__)
#pragma clang diagnostic pop
+#elif defined(__ARMCC_VERSION)
+
#elif defined(__GNUC__)
#pragma GCC diagnostic pop
#endif
diff --git a/vendor/librw/src/assert.cpp b/vendor/librw/src/assert.cpp
new file mode 100644
index 0000000..472109f
--- /dev/null
+++ b/vendor/librw/src/assert.cpp
@@ -0,0 +1,9 @@
+#ifdef _DEBUG
+#include
+#include
+#include
+
+void __assert(const char *func, const char *file, int line, const char *message) {
+ User::Panic(_L("assert"), 0);
+}
+#endif
diff --git a/vendor/librw/src/base.cpp b/vendor/librw/src/base.cpp
index fae47da..24472ea 100644
--- a/vendor/librw/src/base.cpp
+++ b/vendor/librw/src/base.cpp
@@ -18,6 +18,7 @@
#include "rwpipeline.h"
#include "rwobjects.h"
#include "rwengine.h"
+#include "fcaseopen.h"
namespace rw {
@@ -999,7 +1000,7 @@ StreamFile*
StreamFile::open(const char *path, const char *mode)
{
assert(this->file == nil);
- this->file = fopen(path, mode);
+ this->file = fcaseopen(path, mode);
if(this->file == nil){
RWERROR((ERR_FILE, path));
return nil;
@@ -1106,7 +1107,7 @@ findPointer(void *p, void **list, int32 num)
uint8*
getFileContents(const char *name, uint32 *len)
{
- FILE *cf = fopen(name, "rb");
+ FILE *cf = fcaseopen(name, "rb");
if(cf == nil)
return nil;
fseek(cf, 0, SEEK_END);
diff --git a/vendor/librw/src/engine.cpp b/vendor/librw/src/engine.cpp
index 74dae02..327c8bf 100644
--- a/vendor/librw/src/engine.cpp
+++ b/vendor/librw/src/engine.cpp
@@ -40,6 +40,7 @@ const char *allocLocation;
void *malloc_h(size_t sz, uint32 hint) { if(sz == 0) return nil; return malloc(sz); }
void *realloc_h(void *p, size_t sz, uint32 hint) { return realloc(p, sz); }
+void free_h(void *p) { free(p); }
struct MemoryBlock
{
@@ -169,7 +170,7 @@ char *strdup_LOC(const char *s, uint32 hint, const char *here) {
MemoryFunctions defaultMemfuncs = {
malloc_h,
realloc_h,
- free,
+ free_h,
nil,
nil
};
@@ -198,6 +199,12 @@ Engine::init(MemoryFunctions *memfuncs)
Engine::memfuncs = *memfuncs;
else
Engine::memfuncs = defaultMemfuncs;
+ if(Engine::memfuncs.rwmalloc == nil)
+ Engine::memfuncs.rwmalloc = malloc_h;
+ if(Engine::memfuncs.rwrealloc == nil)
+ Engine::memfuncs.rwrealloc = realloc_h;
+ if(Engine::memfuncs.rwfree == nil)
+ Engine::memfuncs.rwfree = free_h;
if(Engine::memfuncs.rwmustmalloc == nil)
Engine::memfuncs.rwmustmalloc = mustmalloc_h;
diff --git a/vendor/librw/src/fcaseopen.h b/vendor/librw/src/fcaseopen.h
new file mode 100644
index 0000000..ea94e70
--- /dev/null
+++ b/vendor/librw/src/fcaseopen.h
@@ -0,0 +1,8 @@
+#pragma once
+
+FILE *_fcaseopen(char const *filename, char const *mode);
+#if defined(_WIN32)
+#define fcaseopen fopen
+#else
+#define fcaseopen _fcaseopen
+#endif
diff --git a/vendor/librw/src/gl/gl3device.cpp b/vendor/librw/src/gl/gl3device.cpp
index 9df47ee..6cd5819 100644
--- a/vendor/librw/src/gl/gl3device.cpp
+++ b/vendor/librw/src/gl/gl3device.cpp
@@ -50,7 +50,7 @@ struct UniformScene
float32 view[16];
};
-#define MAX_LIGHTS 8
+#define MAX_LIGHTS 4
struct UniformObject
{
@@ -89,8 +89,8 @@ const char *shaderDecl100es =
"#define VSOUT varying\n"
"#define FSIN varying\n"
"#define FRAGCOLOR(c) (gl_FragColor = c)\n"
-"precision highp float;\n"
-"precision highp int;\n";
+"precision mediump float;\n"
+"precision mediump int;\n";
const char *shaderDecl310es =
"#version 310 es\n"
"#define VSIN(index) layout(location = index) in\n"
@@ -137,7 +137,7 @@ int32 u_matColor;
int32 u_surfProps;
Shader *defaultShader, *defaultShader_noAT;
-Shader *defaultShader_fullLight, *defaultShader_fullLight_noAT;
+//Shader *defaultShader_fullLight, *defaultShader_fullLight_noAT;
static bool32 stateDirty = 1;
static bool32 sceneDirty = 1;
@@ -511,7 +511,12 @@ static GLint filterConvMap_MIP[] = {
static GLint addressConvMap[] = {
0, GL_REPEAT, GL_MIRRORED_REPEAT,
+#ifdef __SYMBIAN32__
+ // TODO
+ GL_CLAMP_TO_EDGE, GL_CLAMP_TO_EDGE
+#else
GL_CLAMP_TO_EDGE, GL_CLAMP_TO_BORDER
+#endif
};
static void
@@ -524,10 +529,11 @@ setFilterMode(uint32 stage, int32 filter, int32 maxAniso = 1)
Gl3Raster *natras = PLUGINOFFSET(Gl3Raster, rwStateCache.texstage[stage].raster, nativeRasterOffset);
if(natras->filterMode != filter){
setActiveTexture(stage);
- if(natras->autogenMipmap || natras->numLevels > 1){
- glTexParameteri(GL_TEXTURE_2D, GL_TEXTURE_MIN_FILTER, filterConvMap_MIP[filter]);
- glTexParameteri(GL_TEXTURE_2D, GL_TEXTURE_MAG_FILTER, filterConvMap_NoMIP[filter]);
- }else{
+// if(natras->autogenMipmap || natras->numLevels > 1){
+// glTexParameteri(GL_TEXTURE_2D, GL_TEXTURE_MIN_FILTER, filterConvMap_MIP[filter]);
+// glTexParameteri(GL_TEXTURE_2D, GL_TEXTURE_MAG_FILTER, filterConvMap_NoMIP[filter]);
+// }else
+ {
glTexParameteri(GL_TEXTURE_2D, GL_TEXTURE_MIN_FILTER, filterConvMap_NoMIP[filter]);
glTexParameteri(GL_TEXTURE_2D, GL_TEXTURE_MAG_FILTER, filterConvMap_NoMIP[filter]);
}
@@ -625,10 +631,11 @@ setRasterStage(uint32 stage, Raster *raster)
uint32 addrU = rwStateCache.texstage[stage].addressingU;
uint32 addrV = rwStateCache.texstage[stage].addressingV;
if(natras->filterMode != filter){
- if(natras->autogenMipmap || natras->numLevels > 1){
- glTexParameteri(GL_TEXTURE_2D, GL_TEXTURE_MIN_FILTER, filterConvMap_MIP[filter]);
- glTexParameteri(GL_TEXTURE_2D, GL_TEXTURE_MAG_FILTER, filterConvMap_NoMIP[filter]);
- }else{
+// if(natras->autogenMipmap || natras->numLevels > 1){
+// glTexParameteri(GL_TEXTURE_2D, GL_TEXTURE_MIN_FILTER, filterConvMap_MIP[filter]);
+// glTexParameteri(GL_TEXTURE_2D, GL_TEXTURE_MAG_FILTER, filterConvMap_NoMIP[filter]);
+// }else
+ {
glTexParameteri(GL_TEXTURE_2D, GL_TEXTURE_MIN_FILTER, filterConvMap_NoMIP[filter]);
glTexParameteri(GL_TEXTURE_2D, GL_TEXTURE_MAG_FILTER, filterConvMap_NoMIP[filter]);
}
@@ -927,7 +934,10 @@ resetRenderState(void)
uniformState.fogStart = 0.0f;
uniformState.fogEnd = 0.0f;
uniformState.fogRange = 0.0f;
- uniformState.fogColor = { 1.0f, 1.0f, 1.0f, 1.0f };
+ uniformState.fogColor.red = 1.0f;
+ uniformState.fogColor.green = 1.0f;
+ uniformState.fogColor.blue = 1.0f;
+ uniformState.fogColor.alpha = 1.0f;
rwStateCache.gsalpha = 0;
rwStateCache.gsalpharef = 128;
stateDirty = 1;
@@ -1205,6 +1215,17 @@ setFrameBuffer(Camera *cam)
// Have to make sure depth buffer is attached to FB's fbo
bindFramebuffer(natfb->fbo);
+#ifdef __SYMBIAN32__
+ if (zbuf) {
+ if(natfb->fboMate != zbuf){
+ glFramebufferRenderbuffer(GL_FRAMEBUFFER, GL_DEPTH_ATTACHMENT, GL_RENDERBUFFER, GETGL3RASTEREXT(zbuf)->texid);
+ natfb->fboMate = zbuf;
+ }
+ } else if(natfb->fboMate) {
+ glFramebufferRenderbuffer(GL_FRAMEBUFFER, GL_DEPTH_ATTACHMENT, GL_RENDERBUFFER, 0);
+ natfb->fboMate = nil;
+ }
+#else
if(zbuf){
if(natfb->fboMate == zbuf){
// all good
@@ -1235,6 +1256,7 @@ setFrameBuffer(Camera *cam)
glFramebufferTexture2D(GL_FRAMEBUFFER, GL_DEPTH_STENCIL_ATTACHMENT, GL_TEXTURE_2D, 0, 0);
natfb->fboMate = nil;
}
+#endif
}
static Rect
@@ -1245,6 +1267,9 @@ getFramebufferRect(Raster *frameBuffer)
if(fb->type == Raster::CAMERA){
#ifdef LIBRW_SDL2
SDL_GetWindowSize(glGlobals.window, &r.w, &r.h);
+#elif defined __SYMBIAN32__
+ r.w = glGlobals.modes[0].width;
+ r.h = glGlobals.modes[0].height;
#else
glfwGetFramebufferSize(glGlobals.window, &r.w, &r.h);
#endif
@@ -1411,6 +1436,9 @@ showRaster(Raster *raster, uint32 flags)
else
SDL_GL_SetSwapInterval(0);
SDL_GL_SwapWindow(glGlobals.window);
+#elif defined __SYMBIAN32__
+ // TODO check if context is lost
+ eglSwapBuffers(eglGetCurrentDisplay(), eglGetCurrentSurface(EGL_DRAW));
#else
if(flags & Raster::FLIPWAITVSYNCH)
glfwSwapInterval(1);
@@ -1599,6 +1627,55 @@ stopSDL2(void)
SDL_DestroyWindow(glGlobals.window);
return 1;
}
+#elif defined __SYMBIAN32__
+static int
+openSymbian(EngineOpenParams *openparams)
+{
+ glGlobals.winWidth = openparams->width;
+ glGlobals.winHeight = openparams->height;
+ glGlobals.winTitle = openparams->windowtitle;
+
+ glGlobals.modes = (DisplayMode*)rwMalloc(sizeof(DisplayMode), ID_DRIVER | MEMDUR_EVENT);
+ glGlobals.modes[0].width = openparams->width;
+ glGlobals.modes[0].height = openparams->height;
+ glGlobals.modes[0].depth = 32;
+ glGlobals.modes[0].flags = VIDEOMODEEXCLUSIVE;
+
+ glGlobals.numModes = 1;
+ glGlobals.currentMode = 0;
+
+ glGlobals.numMonitors = 1;
+ glGlobals.currentMonitor = 0;
+
+ return 1;
+}
+
+static int
+closeSymbian(void)
+{
+ if(glGlobals.modes){
+ rwFree(glGlobals.modes);
+ glGlobals.modes = nil;
+ }
+ return 1;
+}
+
+static int
+startSymbian(void)
+{
+ glGlobals.presentWidth = glGlobals.winWidth;
+ glGlobals.presentHeight = glGlobals.winHeight;
+ glGlobals.presentOffX = 0;
+ glGlobals.presentOffY = 0;
+
+ return 1;
+}
+
+static int
+stopSymbian(void)
+{
+ return 1;
+}
#else
static void
@@ -1784,10 +1861,19 @@ initOpenGL(void)
// printf("%d %s\n", i, ext);
}
*/
+#ifdef __SYMBIAN32__
+ gl3Caps.dxtSupported = false;
+ gl3Caps.astcSupported = false;
+ gl3Caps.gles = true;
+ gl3Caps.glversion = 20;
+#else
gl3Caps.dxtSupported = !!GLAD_GL_EXT_texture_compression_s3tc;
gl3Caps.astcSupported = !!GLAD_GL_KHR_texture_compression_astc_ldr;
+#endif
+#ifndef __SYMBIAN32__
glGetFloatv(GL_MAX_TEXTURE_MAX_ANISOTROPY_EXT, &gl3Caps.maxAnisotropy);
+#endif
if(gl3Caps.gles){
if(gl3Caps.glversion >= 30)
@@ -1839,12 +1925,14 @@ initOpenGL(void)
resetRenderState();
+#ifndef __SYMBIAN32__
glGetFloatv(GL_MAX_TEXTURE_MAX_ANISOTROPY_EXT, &maxAnisotropy);
if(gl3Caps.glversion >= 30){
glGenVertexArrays(1, &vao);
glBindVertexArray(vao);
}
+#endif
#ifdef RW_GL_USE_UBOS
glGenBuffers(1, &ubo_state);
@@ -1880,11 +1968,11 @@ initOpenGL(void)
assert(defaultShader);
defaultShader_noAT = Shader::create(vs, fs_noAT);
assert(defaultShader_noAT);
-
- defaultShader_fullLight = Shader::create(vs_fullLight, fs);
- assert(defaultShader_fullLight);
- defaultShader_fullLight_noAT = Shader::create(vs_fullLight, fs_noAT);
- assert(defaultShader_fullLight_noAT);
+//
+// defaultShader_fullLight = Shader::create(vs_fullLight, fs);
+// assert(defaultShader_fullLight);
+// defaultShader_fullLight_noAT = Shader::create(vs_fullLight, fs_noAT);
+// assert(defaultShader_fullLight_noAT);
openIm2D();
openIm3D();
@@ -1902,10 +1990,10 @@ termOpenGL(void)
defaultShader = nil;
defaultShader_noAT->destroy();
defaultShader_noAT = nil;
- defaultShader_fullLight->destroy();
- defaultShader_fullLight = nil;
- defaultShader_fullLight_noAT->destroy();
- defaultShader_fullLight_noAT = nil;
+// defaultShader_fullLight->destroy();
+// defaultShader_fullLight = nil;
+// defaultShader_fullLight_noAT->destroy();
+// defaultShader_fullLight_noAT = nil;
glDeleteTextures(1, &whitetex);
whitetex = 0;
@@ -1983,6 +2071,82 @@ deviceSystemSDL2(DeviceReq req, void *arg, int32 n)
return 1;
}
+#elif defined __SYMBIAN32__
+static int
+deviceSystemSymbian(DeviceReq req, void *arg, int32 n)
+{
+ VideoMode *rwmode;
+
+ switch(req){
+ case DEVICEOPEN:
+ return openSymbian((EngineOpenParams*)arg);
+
+ case DEVICECLOSE:
+ return closeSymbian();
+
+ case DEVICEINIT:
+ return startSymbian() && initOpenGL();
+
+ case DEVICETERM:
+ return termOpenGL() && stopSymbian();
+
+ case DEVICEFINALIZE:
+ return finalizeOpenGL();
+
+ case DEVICEGETNUMSUBSYSTEMS:
+ return glGlobals.numMonitors;
+
+ case DEVICEGETCURRENTSUBSYSTEM:
+ return glGlobals.currentMonitor;
+
+ case DEVICESETSUBSYSTEM:
+ if(n >= glGlobals.numMonitors)
+ return 0;
+ glGlobals.currentMonitor = n;
+ return 1;
+
+ case DEVICEGETSUBSSYSTEMINFO:
+ if(n >= glGlobals.numMonitors)
+ return 0;
+ strncpy(((SubSystemInfo*)arg)->name, "Symbian Display", 80 /*sizeof(SubSystemInfo::name)*/);
+ return 1;
+
+ case DEVICEGETNUMVIDEOMODES:
+ return glGlobals.numModes;
+
+ case DEVICEGETCURRENTVIDEOMODE:
+ return glGlobals.currentMode;
+
+ case DEVICESETVIDEOMODE:
+ if(n >= glGlobals.numModes)
+ return 0;
+ glGlobals.currentMode = n;
+ return 1;
+
+ case DEVICEGETVIDEOMODEINFO:
+ rwmode = (VideoMode*)arg;
+ rwmode->width = glGlobals.modes[n].width;
+ rwmode->height = glGlobals.modes[n].height;
+ rwmode->depth = glGlobals.modes[n].depth;
+ rwmode->flags = glGlobals.modes[n].flags;
+ return 1;
+
+ case DEVICEGETMAXMULTISAMPLINGLEVELS:
+ return 1;
+
+ case DEVICEGETMULTISAMPLINGLEVELS:
+ return 1;
+
+ case DEVICESETMULTISAMPLINGLEVELS:
+ glGlobals.numSamples = 1;
+ return 1;
+
+ default:
+ assert(0 && "not implemented");
+ return 0;
+ }
+ return 1;
+}
#else
static int
@@ -2091,6 +2255,8 @@ Device renderdevice = {
gl3::im3DEnd,
#ifdef LIBRW_SDL2
gl3::deviceSystemSDL2
+#elif defined __SYMBIAN32__
+ gl3::deviceSystemSymbian
#else
gl3::deviceSystemGLFW
#endif
diff --git a/vendor/librw/src/gl/gl3immed.cpp b/vendor/librw/src/gl/gl3immed.cpp
index 3b4aae4..a99a1c9 100644
--- a/vendor/librw/src/gl/gl3immed.cpp
+++ b/vendor/librw/src/gl/gl3immed.cpp
@@ -19,17 +19,11 @@ namespace rw {
namespace gl3 {
uint32 im2DVbo, im2DIbo;
-#ifdef RW_GL_USE_VAOS
-uint32 im2DVao;
-#endif
Shader *im2dOverrideShader;
static int32 u_xform;
-#define STARTINDICES 10000
-#define STARTVERTICES 10000
-
static Shader *im2dShader;
static AttribDesc im2dattribDesc[3] = {
{ ATTRIB_POS, GL_FLOAT, GL_FALSE, 4,
@@ -62,30 +56,11 @@ openIm2D(void)
const char *fs[] = { shaderDecl, header_frag_src, simple_frag_src, nil };
im2dShader = Shader::create(vs, fs);
assert(im2dShader);
-
- glGenBuffers(1, &im2DIbo);
- glBindBuffer(GL_ELEMENT_ARRAY_BUFFER, im2DIbo);
- glBufferData(GL_ELEMENT_ARRAY_BUFFER, STARTINDICES*2, nil, GL_STREAM_DRAW);
-
- glGenBuffers(1, &im2DVbo);
- glBindBuffer(GL_ARRAY_BUFFER, im2DVbo);
- glBufferData(GL_ARRAY_BUFFER, STARTVERTICES*sizeof(Im2DVertex), nil, GL_STREAM_DRAW);
-
-#ifdef RW_GL_USE_VAOS
- glGenVertexArrays(1, &im2DVao);
- glBindVertexArray(im2DVao);
- setAttribPointers(im2dattribDesc, 3);
-#endif
}
void
closeIm2D(void)
{
- glDeleteBuffers(1, &im2DIbo);
- glDeleteBuffers(1, &im2DVbo);
-#ifdef RW_GL_USE_VAOS
- glDeleteVertexArrays(1, &im2DVao);
-#endif
im2dShader->destroy();
im2dShader = nil;
}
@@ -128,29 +103,30 @@ im2DSetXform(void)
void
im2DRenderPrimitive(PrimitiveType primType, void *vertices, int32 numVertices)
{
-#ifdef RW_GL_USE_VAOS
- glBindVertexArray(im2DVao);
-#endif
-
- glBindBuffer(GL_ARRAY_BUFFER, im2DVbo);
- glBufferData(GL_ARRAY_BUFFER, STARTVERTICES*sizeof(Im2DVertex), nil, GL_STREAM_DRAW);
- glBufferSubData(GL_ARRAY_BUFFER, 0, numVertices*sizeof(Im2DVertex), vertices);
-
if(im2dOverrideShader)
im2dOverrideShader->use();
else
im2dShader->use();
-#ifndef RW_GL_USE_VAOS
- setAttribPointers(im2dattribDesc, 3);
-#endif
-
+
im2DSetXform();
-
flushCache();
+
+ glBindBuffer(GL_ARRAY_BUFFER, 0);
+
+ glEnableVertexAttribArray(ATTRIB_POS);
+ glVertexAttribPointer(ATTRIB_POS, 4, GL_FLOAT, GL_FALSE, sizeof(Im2DVertex), (uint8*)vertices + 0);
+
+ glEnableVertexAttribArray(ATTRIB_COLOR);
+ glVertexAttribPointer(ATTRIB_COLOR, 4, GL_UNSIGNED_BYTE, GL_TRUE, sizeof(Im2DVertex), (uint8*)vertices + offsetof(Im2DVertex, r));
+
+ glEnableVertexAttribArray(ATTRIB_TEXCOORDS0);
+ glVertexAttribPointer(ATTRIB_TEXCOORDS0, 2, GL_FLOAT, GL_FALSE, sizeof(Im2DVertex), (uint8*)vertices + offsetof(Im2DVertex, u));
+
glDrawArrays(primTypeMap[primType], 0, numVertices);
-#ifndef RW_GL_USE_VAOS
- disableAttribPointers(im2dattribDesc, 3);
-#endif
+
+ glDisableVertexAttribArray(ATTRIB_POS);
+ glDisableVertexAttribArray(ATTRIB_COLOR);
+ glDisableVertexAttribArray(ATTRIB_TEXCOORDS0);
}
void
@@ -158,34 +134,31 @@ im2DRenderIndexedPrimitive(PrimitiveType primType,
void *vertices, int32 numVertices,
void *indices, int32 numIndices)
{
-#ifdef RW_GL_USE_VAOS
- glBindVertexArray(im2DVao);
-#endif
-
- glBindBuffer(GL_ELEMENT_ARRAY_BUFFER, im2DIbo);
- glBufferData(GL_ELEMENT_ARRAY_BUFFER, STARTINDICES*2, nil, GL_STREAM_DRAW);
- glBufferSubData(GL_ELEMENT_ARRAY_BUFFER, 0, numIndices*2, indices);
-
- glBindBuffer(GL_ARRAY_BUFFER, im2DVbo);
- glBufferData(GL_ARRAY_BUFFER, STARTVERTICES*sizeof(Im2DVertex), nil, GL_STREAM_DRAW);
- glBufferSubData(GL_ARRAY_BUFFER, 0, numVertices*sizeof(Im2DVertex), vertices);
-
if(im2dOverrideShader)
im2dOverrideShader->use();
else
im2dShader->use();
-#ifndef RW_GL_USE_VAOS
- setAttribPointers(im2dattribDesc, 3);
-#endif
im2DSetXform();
-
flushCache();
- glDrawElements(primTypeMap[primType], numIndices,
- GL_UNSIGNED_SHORT, nil);
-#ifndef RW_GL_USE_VAOS
- disableAttribPointers(im2dattribDesc, 3);
-#endif
+
+ glBindBuffer(GL_ARRAY_BUFFER, 0);
+ glBindBuffer(GL_ELEMENT_ARRAY_BUFFER, 0);
+
+ glEnableVertexAttribArray(ATTRIB_POS);
+ glVertexAttribPointer(ATTRIB_POS, 4, GL_FLOAT, GL_FALSE, sizeof(Im2DVertex), (uint8*)vertices + 0);
+
+ glEnableVertexAttribArray(ATTRIB_COLOR);
+ glVertexAttribPointer(ATTRIB_COLOR, 4, GL_UNSIGNED_BYTE, GL_TRUE, sizeof(Im2DVertex), (uint8*)vertices + offsetof(Im2DVertex, r));
+
+ glEnableVertexAttribArray(ATTRIB_TEXCOORDS0);
+ glVertexAttribPointer(ATTRIB_TEXCOORDS0, 2, GL_FLOAT, GL_FALSE, sizeof(Im2DVertex), (uint8*)vertices + offsetof(Im2DVertex, u));
+
+ glDrawElements(primTypeMap[primType], numIndices, GL_UNSIGNED_SHORT, indices);
+
+ glDisableVertexAttribArray(ATTRIB_POS);
+ glDisableVertexAttribArray(ATTRIB_COLOR);
+ glDisableVertexAttribArray(ATTRIB_TEXCOORDS0);
}
@@ -202,10 +175,8 @@ static AttribDesc im3dattribDesc[3] = {
sizeof(Im3DVertex), offsetof(Im3DVertex, u) },
};
static uint32 im3DVbo, im3DIbo;
-#ifdef RW_GL_USE_VAOS
-static uint32 im3DVao;
-#endif
static int32 num3DVertices; // not actually needed here
+static void* currentIm3dVertices;
void
openIm3D(void)
@@ -216,30 +187,12 @@ openIm3D(void)
const char *fs[] = { shaderDecl, header_frag_src, simple_frag_src, nil };
im3dShader = Shader::create(vs, fs);
assert(im3dShader);
-
- glGenBuffers(1, &im3DIbo);
- glBindBuffer(GL_ELEMENT_ARRAY_BUFFER, im3DIbo);
- glBufferData(GL_ELEMENT_ARRAY_BUFFER, STARTINDICES*2, nil, GL_STREAM_DRAW);
-
- glGenBuffers(1, &im3DVbo);
- glBindBuffer(GL_ARRAY_BUFFER, im3DVbo);
- glBufferData(GL_ARRAY_BUFFER, STARTVERTICES*sizeof(Im3DVertex), nil, GL_STREAM_DRAW);
-
-#ifdef RW_GL_USE_VAOS
- glGenVertexArrays(1, &im3DVao);
- glBindVertexArray(im3DVao);
- setAttribPointers(im3dattribDesc, 3);
-#endif
+ currentIm3dVertices = nil;
}
void
closeIm3D(void)
{
- glDeleteBuffers(1, &im3DIbo);
- glDeleteBuffers(1, &im3DVbo);
-#ifdef RW_GL_USE_VAOS
- glDeleteVertexArrays(1, &im3DVao);
-#endif
im3dShader->destroy();
im3dShader = nil;
}
@@ -258,46 +211,60 @@ im3DTransform(void *vertices, int32 numVertices, Matrix *world, uint32 flags)
if((flags & im3d::VERTEXUV) == 0)
SetRenderStatePtr(TEXTURERASTER, nil);
-#ifdef RW_GL_USE_VAOS
- glBindVertexArray(im2DVao);
-#endif
-
- glBindBuffer(GL_ARRAY_BUFFER, im3DVbo);
- glBufferData(GL_ARRAY_BUFFER, STARTVERTICES*sizeof(Im3DVertex), nil, GL_STREAM_DRAW);
- glBufferSubData(GL_ARRAY_BUFFER, 0, numVertices*sizeof(Im3DVertex), vertices);
-#ifndef RW_GL_USE_VAOS
- setAttribPointers(im3dattribDesc, 3);
-#endif
+ glBindBuffer(GL_ARRAY_BUFFER, 0);
+ currentIm3dVertices = vertices;
num3DVertices = numVertices;
}
void
im3DRenderPrimitive(PrimitiveType primType)
{
- glBindBuffer(GL_ELEMENT_ARRAY_BUFFER, im3DIbo);
-
flushCache();
+
+ glBindBuffer(GL_ELEMENT_ARRAY_BUFFER, 0);
+
+ glEnableVertexAttribArray(ATTRIB_POS);
+ glVertexAttribPointer(ATTRIB_POS, 3, GL_FLOAT, GL_FALSE, sizeof(Im3DVertex), (uint8*)currentIm3dVertices + 0);
+
+ glEnableVertexAttribArray(ATTRIB_COLOR);
+ glVertexAttribPointer(ATTRIB_COLOR, 4, GL_UNSIGNED_BYTE, GL_TRUE, sizeof(Im3DVertex), (uint8*)currentIm3dVertices + offsetof(Im3DVertex, r));
+
+ glEnableVertexAttribArray(ATTRIB_TEXCOORDS0);
+ glVertexAttribPointer(ATTRIB_TEXCOORDS0, 2, GL_FLOAT, GL_FALSE, sizeof(Im3DVertex), (uint8*)currentIm3dVertices + offsetof(Im3DVertex, u));
+
glDrawArrays(primTypeMap[primType], 0, num3DVertices);
+
+ glDisableVertexAttribArray(ATTRIB_POS);
+ glDisableVertexAttribArray(ATTRIB_COLOR);
+ glDisableVertexAttribArray(ATTRIB_TEXCOORDS0);
}
void
im3DRenderIndexedPrimitive(PrimitiveType primType, void *indices, int32 numIndices)
{
- glBindBuffer(GL_ELEMENT_ARRAY_BUFFER, im3DIbo);
- glBufferData(GL_ELEMENT_ARRAY_BUFFER, STARTINDICES*2, nil, GL_STREAM_DRAW);
- glBufferSubData(GL_ELEMENT_ARRAY_BUFFER, 0, numIndices*2, indices);
-
flushCache();
- glDrawElements(primTypeMap[primType], numIndices,
- GL_UNSIGNED_SHORT, nil);
+
+ glBindBuffer(GL_ELEMENT_ARRAY_BUFFER, 0);
+
+ glEnableVertexAttribArray(ATTRIB_POS);
+ glVertexAttribPointer(ATTRIB_POS, 3, GL_FLOAT, GL_FALSE, sizeof(Im3DVertex), (uint8*)currentIm3dVertices + 0);
+
+ glEnableVertexAttribArray(ATTRIB_COLOR);
+ glVertexAttribPointer(ATTRIB_COLOR, 4, GL_UNSIGNED_BYTE, GL_TRUE, sizeof(Im3DVertex), (uint8*)currentIm3dVertices + offsetof(Im3DVertex, r));
+
+ glEnableVertexAttribArray(ATTRIB_TEXCOORDS0);
+ glVertexAttribPointer(ATTRIB_TEXCOORDS0, 2, GL_FLOAT, GL_FALSE, sizeof(Im3DVertex), (uint8*)currentIm3dVertices + offsetof(Im3DVertex, u));
+
+ glDrawElements(primTypeMap[primType], numIndices, GL_UNSIGNED_SHORT, indices);
+
+ glDisableVertexAttribArray(ATTRIB_POS);
+ glDisableVertexAttribArray(ATTRIB_COLOR);
+ glDisableVertexAttribArray(ATTRIB_TEXCOORDS0);
}
void
im3DEnd(void)
{
-#ifndef RW_GL_USE_VAOS
- disableAttribPointers(im3dattribDesc, 3);
-#endif
}
}
diff --git a/vendor/librw/src/gl/gl3matfx.cpp b/vendor/librw/src/gl/gl3matfx.cpp
index 06b01c1..9044799 100644
--- a/vendor/librw/src/gl/gl3matfx.cpp
+++ b/vendor/librw/src/gl/gl3matfx.cpp
@@ -25,7 +25,7 @@ namespace gl3 {
#ifdef RW_OPENGL
static Shader *envShader, *envShader_noAT;
-static Shader *envShader_fullLight, *envShader_fullLight_noAT;
+//static Shader *envShader_fullLight, *envShader_fullLight_noAT;
static int32 u_texMatrix;
static int32 u_fxparams;
static int32 u_colorClamp;
@@ -43,17 +43,17 @@ matfxDefaultRender(InstanceDataHeader *header, InstanceData *inst, int32 vsBits,
rw::SetRenderState(VERTEXALPHA, inst->vertexAlpha || m->color.alpha != 0xFF);
- if((vsBits & VSLIGHT_MASK) == 0){
+// if((vsBits & VSLIGHT_MASK) == 0){
if(getAlphaTest())
defaultShader->use();
else
defaultShader_noAT->use();
- }else{
- if(getAlphaTest())
- defaultShader_fullLight->use();
- else
- defaultShader_fullLight_noAT->use();
- }
+// }else{
+// if(getAlphaTest())
+// defaultShader_fullLight->use();
+// else
+// defaultShader_fullLight_noAT->use();
+// }
drawInst(header, inst);
}
@@ -132,17 +132,17 @@ matfxEnvRender(InstanceDataHeader *header, InstanceData *inst, int32 vsBits, uin
rw::SetRenderState(VERTEXALPHA, 1);
rw::SetRenderState(SRCBLEND, BLENDONE);
- if((vsBits & VSLIGHT_MASK) == 0){
+// if((vsBits & VSLIGHT_MASK) == 0){
if(getAlphaTest())
envShader->use();
else
envShader_noAT->use();
- }else{
- if(getAlphaTest())
- envShader_fullLight->use();
- else
- envShader_fullLight_noAT->use();
- }
+// }else{
+// if(getAlphaTest())
+// envShader_fullLight->use();
+// else
+// envShader_fullLight_noAT->use();
+// }
drawInst(header, inst);
@@ -208,11 +208,11 @@ matfxOpen(void *o, int32, int32)
assert(envShader);
envShader_noAT = Shader::create(vs, fs_noAT);
assert(envShader_noAT);
-
- envShader_fullLight = Shader::create(vs_fullLight, fs);
- assert(envShader_fullLight);
- envShader_fullLight_noAT = Shader::create(vs_fullLight, fs_noAT);
- assert(envShader_fullLight_noAT);
+//
+// envShader_fullLight = Shader::create(vs_fullLight, fs);
+// assert(envShader_fullLight);
+// envShader_fullLight_noAT = Shader::create(vs_fullLight, fs_noAT);
+// assert(envShader_fullLight_noAT);
return o;
}
@@ -227,10 +227,10 @@ matfxClose(void *o, int32, int32)
envShader = nil;
envShader_noAT->destroy();
envShader_noAT = nil;
- envShader_fullLight->destroy();
- envShader_fullLight = nil;
- envShader_fullLight_noAT->destroy();
- envShader_fullLight_noAT = nil;
+// envShader_fullLight->destroy();
+// envShader_fullLight = nil;
+// envShader_fullLight_noAT->destroy();
+// envShader_fullLight_noAT = nil;
return o;
}
diff --git a/vendor/librw/src/gl/gl3raster.cpp b/vendor/librw/src/gl/gl3raster.cpp
index b7c3941..37beff6 100644
--- a/vendor/librw/src/gl/gl3raster.cpp
+++ b/vendor/librw/src/gl/gl3raster.cpp
@@ -68,7 +68,7 @@ rasterCreateTexture(Raster *raster)
Gl3Raster *natras = GETGL3RASTEREXT(raster);
switch(raster->format & 0xF00){
case Raster::C8888:
- natras->internalFormat = GL_RGBA8;
+ natras->internalFormat = GL_RGBA;
natras->format = GL_RGBA;
natras->type = GL_UNSIGNED_BYTE;
natras->hasAlpha = 1;
@@ -76,15 +76,32 @@ rasterCreateTexture(Raster *raster)
raster->depth = 32;
break;
case Raster::C888:
- natras->internalFormat = GL_RGB8;
+ natras->internalFormat = GL_RGB;
natras->format = GL_RGB;
natras->type = GL_UNSIGNED_BYTE;
natras->hasAlpha = 0;
natras->bpp = 3;
raster->depth = 24;
break;
+ case Raster::C565:
+ natras->internalFormat = GL_RGB;
+ natras->format = GL_RGB;
+ natras->type = GL_UNSIGNED_SHORT_5_6_5;
+ natras->hasAlpha = 0;
+ natras->bpp = 2;
+ raster->depth = 16;
+ break;
+ case Raster::C4444:
+ natras->internalFormat = GL_RGBA;
+ natras->format = GL_RGBA;
+ natras->type = GL_UNSIGNED_SHORT_4_4_4_4;
+ natras->hasAlpha = 1;
+ natras->bpp = 2;
+ raster->depth = 16;
+ break;
case Raster::C1555:
- natras->internalFormat = GL_RGB5_A1;
+// natras->internalFormat = GL_RGB5_A1;
+ natras->internalFormat = GL_RGBA;
natras->format = GL_RGBA;
natras->type = GL_UNSIGNED_SHORT_5_5_5_1;
natras->hasAlpha = 1;
@@ -97,11 +114,7 @@ rasterCreateTexture(Raster *raster)
}
if(gl3Caps.gles){
- // glReadPixels only supports GL_RGBA
- natras->internalFormat = GL_RGBA8;
- natras->format = GL_RGBA;
- natras->type = GL_UNSIGNED_BYTE;
- natras->bpp = 4;
+ natras->internalFormat = natras->format;
}
raster->stride = raster->width*natras->bpp;
@@ -123,10 +136,13 @@ rasterCreateTexture(Raster *raster)
glGenTextures(1, &natras->texid);
uint32 prev = bindTexture(natras->texid);
glTexImage2D(GL_TEXTURE_2D, 0, natras->internalFormat,
- raster->width, raster->height,
+// raster->width, raster->height,
+ 1,1,
0, natras->format, natras->type, nil);
// TODO: allocate other levels...probably
+#ifndef __SYMBIAN32__
glTexParameteri(GL_TEXTURE_2D, GL_TEXTURE_MAX_LEVEL, natras->numLevels-1);
+#endif
natras->filterMode = 0;
natras->addressU = 0;
natras->addressV = 0;
@@ -148,22 +164,37 @@ rasterCreateCameraTexture(Raster *raster)
Gl3Raster *natras = GETGL3RASTEREXT(raster);
switch(raster->format & 0xF00){
case Raster::C8888:
- natras->internalFormat = GL_RGBA8;
+ natras->internalFormat = GL_RGBA;
natras->format = GL_RGBA;
natras->type = GL_UNSIGNED_BYTE;
natras->hasAlpha = 1;
natras->bpp = 4;
break;
+ case Raster::C4444:
+ natras->internalFormat = GL_RGBA;
+ natras->format = GL_RGBA;
+ natras->type = GL_UNSIGNED_SHORT_4_4_4_4;
+ natras->hasAlpha = 1;
+ natras->bpp = 2;
+ break;
case Raster::C888:
default:
- natras->internalFormat = GL_RGB8;
+ natras->internalFormat = GL_RGB;
natras->format = GL_RGB;
natras->type = GL_UNSIGNED_BYTE;
natras->hasAlpha = 0;
natras->bpp = 3;
break;
+ case Raster::C565:
+ natras->internalFormat = GL_RGB;
+ natras->format = GL_RGB;
+ natras->type = GL_UNSIGNED_SHORT_5_6_5;
+ natras->hasAlpha = 0;
+ natras->bpp = 2;
+ break;
case Raster::C1555:
- natras->internalFormat = GL_RGB5_A1;
+// natras->internalFormat = GL_RGB5_A1;
+ natras->internalFormat = GL_RGBA;
natras->format = GL_RGBA;
natras->type = GL_UNSIGNED_SHORT_5_5_5_1;
natras->hasAlpha = 1;
@@ -173,11 +204,7 @@ rasterCreateCameraTexture(Raster *raster)
// i don't remember why this was once here...
if(gl3Caps.gles){
- // glReadPixels only supports GL_RGBA
-// natras->internalFormat = GL_RGBA8;
-// natras->format = GL_RGBA;
-// natras->type = GL_UNSIGNED_BYTE;
-// natras->bpp = 4;
+ natras->internalFormat = natras->format;
}
raster->stride = raster->width*natras->bpp;
@@ -187,7 +214,8 @@ rasterCreateCameraTexture(Raster *raster)
glGenTextures(1, &natras->texid);
uint32 prev = bindTexture(natras->texid);
glTexImage2D(GL_TEXTURE_2D, 0, natras->internalFormat,
- raster->width, raster->height,
+// raster->width, raster->height,
+ 1,1,
0, natras->format, natras->type, nil);
natras->filterMode = 0;
natras->addressU = 0;
@@ -197,10 +225,10 @@ rasterCreateCameraTexture(Raster *raster)
bindTexture(prev);
- glGenFramebuffers(1, &natras->fbo);
- bindFramebuffer(natras->fbo);
- glFramebufferTexture2D(GL_FRAMEBUFFER, GL_COLOR_ATTACHMENT0, GL_TEXTURE_2D, natras->texid, 0);
- bindFramebuffer(0);
+// glGenFramebuffers(1, &natras->fbo);
+// bindFramebuffer(natras->fbo);
+// glFramebufferTexture2D(GL_FRAMEBUFFER, GL_COLOR_ATTACHMENT0, GL_TEXTURE_2D, natras->texid, 0);
+// bindFramebuffer(0);
natras->fboMate = nil;
return raster;
@@ -214,14 +242,19 @@ rasterCreateCamera(Raster *raster)
// TODO: set/check width, height, depth, format?
// used for locking right now
- raster->format = Raster::C888;
- natras->internalFormat = GL_RGB8;
- natras->format = GL_RGB;
- natras->type = GL_UNSIGNED_BYTE;
- natras->hasAlpha = 0;
- natras->bpp = 3;
-
- natras->autogenMipmap = 0;
+// raster->format = Raster::C888;
+// natras->internalFormat = GL_RGB;
+// natras->format = GL_RGB;
+// natras->type = GL_UNSIGNED_BYTE;
+// natras->hasAlpha = 0;
+// natras->bpp = 3;
+//
+// natras->autogenMipmap = 0;
+
+ raster->originalWidth = raster->width;
+ raster->originalHeight = raster->height;
+ raster->stride = 0;
+ raster->pixels = nil;
natras->texid = 0;
natras->fbo = 0;
@@ -234,34 +267,45 @@ static Raster*
rasterCreateZbuffer(Raster *raster)
{
Gl3Raster *natras = GETGL3RASTEREXT(raster);
+
+ raster->originalWidth = raster->width;
+ raster->originalHeight = raster->height;
+ raster->stride = 0;
+ raster->pixels = nil;
- if(gl3Caps.gles){
- // have to use RBO on GLES!!
- glGenRenderbuffers(1, &natras->texid);
- glBindRenderbuffer(GL_RENDERBUFFER, natras->texid);
- glRenderbufferStorage(GL_RENDERBUFFER, GL_DEPTH24_STENCIL8, raster->width, raster->height);
- }else{
- // TODO: set/check width, height, depth, format?
- natras->internalFormat = GL_DEPTH_STENCIL;
- natras->format = GL_DEPTH_STENCIL;
- natras->type = GL_UNSIGNED_INT_24_8;
-
- natras->autogenMipmap = 0;
-
- glGenTextures(1, &natras->texid);
- uint32 prev = bindTexture(natras->texid);
- glTexImage2D(GL_TEXTURE_2D, 0, natras->internalFormat,
- raster->width, raster->height,
- 0, natras->format, natras->type, nil);
- natras->filterMode = 0;
- natras->addressU = 0;
- natras->addressV = 0;
- natras->maxAnisotropy = 1;
-
- bindTexture(prev);
- }
- natras->fbo = 0;
- natras->fboMate = nil;
+// if(gl3Caps.gles){
+// // have to use RBO on GLES!!
+// glGenRenderbuffers(1, &natras->texid);
+// glBindRenderbuffer(GL_RENDERBUFFER, natras->texid);
+//#ifdef __SYMBIAN32__
+// glRenderbufferStorage(GL_RENDERBUFFER, GL_DEPTH_COMPONENT16, raster->width, raster->height);
+//#else
+// glRenderbufferStorage(GL_RENDERBUFFER, GL_DEPTH24_STENCIL8, raster->width, raster->height);
+//#endif
+//#ifndef __SYMBIAN32__
+// }else{
+// // TODO: set/check width, height, depth, format?
+// natras->internalFormat = GL_DEPTH_STENCIL;
+// natras->format = GL_DEPTH_STENCIL;
+// natras->type = GL_UNSIGNED_INT_24_8;
+//
+// natras->autogenMipmap = 0;
+//
+// glGenTextures(1, &natras->texid);
+// uint32 prev = bindTexture(natras->texid);
+// glTexImage2D(GL_TEXTURE_2D, 0, natras->internalFormat,
+// raster->width, raster->height,
+// 0, natras->format, natras->type, nil);
+// natras->filterMode = 0;
+// natras->addressU = 0;
+// natras->addressV = 0;
+// natras->maxAnisotropy = 1;
+//
+// bindTexture(prev);
+//#endif
+// }
+// natras->fbo = 0;
+// natras->fboMate = nil;
return raster;
}
@@ -311,6 +355,7 @@ allocateDXT(Raster *raster, int32 dxt, int32 numLevels, bool32 hasAlpha)
raster->depth = 16;
natras->isCompressed = 1;
+
if(raster->format & Raster::MIPMAP)
natras->numLevels = numLevels;
natras->autogenMipmap = (raster->format & (Raster::MIPMAP|Raster::AUTOMIPMAP)) == (Raster::MIPMAP|Raster::AUTOMIPMAP);
@@ -323,7 +368,9 @@ allocateDXT(Raster *raster, int32 dxt, int32 numLevels, bool32 hasAlpha)
raster->width, raster->height,
0, natras->format, natras->type, nil);
// TODO: allocate other levels...probably
+#ifndef __SYMBIAN32__
glTexParameteri(GL_TEXTURE_2D, GL_TEXTURE_MAX_LEVEL, natras->numLevels-1);
+#endif
natras->filterMode = 0;
natras->addressU = 0;
natras->addressV = 0;
@@ -471,26 +518,33 @@ rasterLock(Raster *raster, int32 level, int32 lockMode)
memcpy(px, natras->backingStore->levels[level].data, allocSz);
}else{
// GLES is losing here
+#ifndef __SYMBIAN32__ // TODO
uint32 prev = bindTexture(natras->texid);
glGetCompressedTexImage(GL_TEXTURE_2D, level, px);
bindTexture(prev);
+#endif
}
+#ifdef __SYMBIAN32__
+ } else {
+#else
}else if(gl3Caps.gles){
+#endif
GLuint fbo;
glGenFramebuffers(1, &fbo);
bindFramebuffer(fbo);
glFramebufferTexture2D(GL_FRAMEBUFFER, GL_COLOR_ATTACHMENT0, GL_TEXTURE_2D, natras->texid, 0);
GLenum e = glCheckFramebufferStatus(GL_FRAMEBUFFER);
-assert(natras->format == GL_RGBA);
glReadPixels(0, 0, raster->width, raster->height, natras->format, natras->type, px);
//e = glGetError(); printf("GL err4 %x (%x)\n", e, natras->format);
bindFramebuffer(0);
glDeleteFramebuffers(1, &fbo);
+#ifndef __SYMBIAN32__
}else{
uint32 prev = bindTexture(natras->texid);
glPixelStorei(GL_PACK_ALIGNMENT, 1);
glGetTexImage(GL_TEXTURE_2D, level, natras->format, natras->type, px);
bindTexture(prev);
+#endif
}
}
@@ -508,7 +562,11 @@ assert(natras->format == GL_RGBA);
px = (uint8*)rwMalloc(allocSz, MEMDUR_EVENT | ID_DRIVER);
assert(raster->pixels == nil);
raster->pixels = px;
+#ifdef __SYMBIAN32__
+ memset(px, 0, allocSz);
+#else
glReadBuffer(GL_BACK);
+#endif
glReadPixels(0, 0, raster->width, raster->height, GL_RGB, GL_UNSIGNED_BYTE, px);
raster->privateFlags = lockMode;
@@ -538,6 +596,7 @@ rasterUnlock(Raster *raster, int32 level)
case Raster::TEXTURE:
case Raster::CAMERATEXTURE:
if(raster->privateFlags & Raster::LOCKWRITE){
+ if (level != 0) break;
uint32 prev = bindTexture(natras->texid);
if(natras->isCompressed){
glCompressedTexImage2D(GL_TEXTURE_2D, level, natras->internalFormat,
@@ -550,10 +609,27 @@ rasterUnlock(Raster *raster, int32 level)
natras->backingStore->levels[level].size);
}
}else{
- glPixelStorei(GL_UNPACK_ALIGNMENT, 1);
- glTexImage2D(GL_TEXTURE_2D, level, natras->internalFormat,
- raster->width, raster->height,
- 0, natras->format, natras->type, raster->pixels);
+// glPixelStorei(GL_UNPACK_ALIGNMENT, 1);
+ if (raster->pixels != nil && natras->format == GL_RGBA && natras->type == GL_UNSIGNED_BYTE) {
+ // convert to 16-bit
+ uint16_t* pixels16 = (uint16_t*)malloc(raster->width * raster->height * sizeof(uint16_t));
+ uint8_t* pixels8 = (uint8_t*)raster->pixels;
+
+ for (int i = 0; i < raster->width * raster->height; i++) {
+ uint8_t r = pixels8[i * 4 + 0];
+ uint8_t g = pixels8[i * 4 + 1];
+ uint8_t b = pixels8[i * 4 + 2];
+ uint8_t a = pixels8[i * 4 + 3];
+
+ pixels16[i] = ((r >> 4) << 12) | ((g >> 4) << 8) | ((b >> 4) << 4) | (a >> 4);
+ }
+ glTexImage2D(GL_TEXTURE_2D, level, GL_RGBA, raster->width, raster->height, 0, GL_RGBA, GL_UNSIGNED_SHORT_4_4_4_4, pixels16);
+ free(pixels16);
+ } else {
+ glTexImage2D(GL_TEXTURE_2D, level, natras->internalFormat,
+ raster->width, raster->height,
+ 0, natras->format, natras->type, raster->pixels);
+ }
}
if(level == 0 && natras->autogenMipmap)
glGenerateMipmap(GL_TEXTURE_2D);
@@ -659,9 +735,7 @@ rasterFromImage(Raster *raster, Image *image)
assert(!natras->isCompressed);
switch(image->depth){
case 32:
- if(gl3Caps.gles)
- conv = conv_RGBA8888_from_RGBA8888;
- else if(format == Raster::C8888)
+ if(format == Raster::C8888)
conv = conv_RGBA8888_from_RGBA8888;
else if(format == Raster::C888)
conv = conv_RGB888_from_RGB888;
@@ -669,9 +743,7 @@ rasterFromImage(Raster *raster, Image *image)
goto err;
break;
case 24:
- if(gl3Caps.gles)
- conv = conv_RGBA8888_from_RGB888;
- else if(format == Raster::C8888)
+ if(format == Raster::C8888)
conv = conv_RGBA8888_from_RGB888;
else if(format == Raster::C888)
conv = conv_RGB888_from_RGB888;
@@ -679,7 +751,7 @@ rasterFromImage(Raster *raster, Image *image)
goto err;
break;
case 16:
- if(gl3Caps.gles)
+ if(format == Raster::C8888)
conv = conv_RGBA8888_from_ARGB1555;
else if(format == Raster::C1555)
conv = conv_RGBA5551_from_ARGB1555;
@@ -850,7 +922,11 @@ destroyNativeRaster(void *object, int32 offset, int32)
Gl3Raster *oldfb = GETGL3RASTEREXT(natras->fboMate);
if(oldfb->fbo){
bindFramebuffer(oldfb->fbo);
+#ifdef __SYMBIAN32__
+ glFramebufferRenderbuffer(GL_FRAMEBUFFER, GL_DEPTH_ATTACHMENT, GL_RENDERBUFFER, 0);
+#else
glFramebufferTexture2D(GL_FRAMEBUFFER, GL_DEPTH_STENCIL_ATTACHMENT, GL_TEXTURE_2D, 0, 0);
+#endif
}
oldfb->fboMate = nil;
}
diff --git a/vendor/librw/src/gl/gl3render.cpp b/vendor/librw/src/gl/gl3render.cpp
index 4dd79ba..5cb201f 100644
--- a/vendor/librw/src/gl/gl3render.cpp
+++ b/vendor/librw/src/gl/gl3render.cpp
@@ -64,9 +64,9 @@ drawInst_GSemu(InstanceDataHeader *header, InstanceData *inst)
void
drawInst(InstanceDataHeader *header, InstanceData *inst)
{
- if(rw::GetRenderState(rw::GSALPHATEST))
- drawInst_GSemu(header, inst);
- else
+// if(rw::GetRenderState(rw::GSALPHATEST))
+// drawInst_GSemu(header, inst);
+// else
drawInst_simple(header, inst);
}
@@ -93,21 +93,15 @@ disableAttribPointers(AttribDesc *attribDescs, int32 numAttribs)
void
setupVertexInput(InstanceDataHeader *header)
{
-#ifdef RW_GL_USE_VAOS
- glBindVertexArray(header->vao);
-#else
glBindBuffer(GL_ELEMENT_ARRAY_BUFFER, header->ibo);
glBindBuffer(GL_ARRAY_BUFFER, header->vbo);
setAttribPointers(header->attribDesc, header->numAttribs);
-#endif
}
void
teardownVertexInput(InstanceDataHeader *header)
{
-#ifndef RW_GL_USE_VAOS
disableAttribPointers(header->attribDesc, header->numAttribs);
-#endif
}
int32
@@ -117,9 +111,9 @@ lightingCB(Atomic *atomic)
Light *directionals[8];
Light *locals[8];
lightData.directionals = directionals;
- lightData.numDirectionals = 8;
+ lightData.numDirectionals = 0; // 8;
lightData.locals = locals;
- lightData.numLocals = 8;
+ lightData.numLocals = 0; // 8;
if(atomic->geometry->flags & rw::Geometry::LIGHT){
((World*)engine->currentWorld)->enumerateLights(atomic, &lightData);
@@ -158,17 +152,17 @@ defaultRenderCB(Atomic *atomic, InstanceDataHeader *header)
rw::SetRenderState(VERTEXALPHA, inst->vertexAlpha || m->color.alpha != 0xFF);
- if((vsBits & VSLIGHT_MASK) == 0){
+// if((vsBits & VSLIGHT_MASK) == 0){
if(getAlphaTest())
defaultShader->use();
else
defaultShader_noAT->use();
- }else{
- if(getAlphaTest())
- defaultShader_fullLight->use();
- else
- defaultShader_fullLight_noAT->use();
- }
+// }else{
+// if(getAlphaTest())
+// defaultShader_fullLight->use();
+// else
+// defaultShader_fullLight_noAT->use();
+// }
drawInst(header, inst);
inst++;
diff --git a/vendor/librw/src/gl/gl3shader.cpp b/vendor/librw/src/gl/gl3shader.cpp
index 73c344e..5e37304 100644
--- a/vendor/librw/src/gl/gl3shader.cpp
+++ b/vendor/librw/src/gl/gl3shader.cpp
@@ -189,8 +189,8 @@ compileshader(GLenum type, const char **src, GLuint *shader)
glShaderSource(shdr, n, src, nil);
glCompileShader(shdr);
glGetShaderiv(shdr, GL_COMPILE_STATUS, &success);
+ printShaderSource(src);
if(!success){
- printShaderSource(src);
fprintf(stderr, "Error in %s shader\n",
type == GL_VERTEX_SHADER ? "vertex" : "fragment");
glGetShaderiv(shdr, GL_INFO_LOG_LENGTH, &len);
@@ -295,6 +295,7 @@ Shader::create(const char **vsrc, const char **fsrc)
printf("\n");
#endif
+#ifndef __SYMBIAN32__
// set uniform block binding
for(i = 0; i < uniformRegistry.numBlocks; i++){
int idx = glGetUniformBlockIndex(program,
@@ -302,6 +303,7 @@ Shader::create(const char **vsrc, const char **fsrc)
if(idx >= 0)
glUniformBlockBinding(program, idx, i);
}
+#endif
// query uniform locations
sh->program = program;
diff --git a/vendor/librw/src/gl/gl3skin.cpp b/vendor/librw/src/gl/gl3skin.cpp
index 6b69bbd..99ad989 100644
--- a/vendor/librw/src/gl/gl3skin.cpp
+++ b/vendor/librw/src/gl/gl3skin.cpp
@@ -25,7 +25,7 @@ namespace gl3 {
#ifdef RW_OPENGL
static Shader *skinShader, *skinShader_noAT;
-static Shader *skinShader_fullLight, *skinShader_fullLight_noAT;
+//static Shader *skinShader_fullLight, *skinShader_fullLight_noAT;
static int32 u_boneMatrices;
void
@@ -189,17 +189,9 @@ skinInstanceCB(Geometry *geo, InstanceDataHeader *header, bool32 reinstance)
header->totalNumVertex, a->stride);
}
-#ifdef RW_GL_USE_VAOS
- glBindVertexArray(header->vao);
- glBindBuffer(GL_ELEMENT_ARRAY_BUFFER, header->ibo);
-#endif
glBindBuffer(GL_ARRAY_BUFFER, header->vbo);
glBufferData(GL_ARRAY_BUFFER, header->totalNumVertex*attribs[0].stride,
header->vertexBuffer, GL_STATIC_DRAW);
-#ifdef RW_GL_USE_VAOS
- setAttribPointers(header->attribDesc, header->numAttribs);
- glBindVertexArray(0);
-#endif
}
void
@@ -208,7 +200,8 @@ skinUninstanceCB(Geometry *geo, InstanceDataHeader *header)
assert(0 && "can't uninstance");
}
-static float skinMatrices[64*16];
+#define MAX_BONES 24
+static float skinMatrices[MAX_BONES*16];
void
uploadSkinMatrices(Atomic *a)
@@ -218,13 +211,18 @@ uploadSkinMatrices(Atomic *a)
Matrix *m = (Matrix*)skinMatrices;
HAnimHierarchy *hier = Skin::getHierarchy(a);
+ int numBones = skin->numBones;
+ if (numBones > MAX_BONES) numBones = MAX_BONES;
+
if(hier){
Matrix *invMats = (Matrix*)skin->inverseMatrices;
Matrix tmp;
+
+ int numNodes = hier->numNodes;
+ if (numNodes > MAX_BONES) numNodes = MAX_BONES;
- assert(skin->numBones == hier->numNodes);
if(hier->flags & HAnimHierarchy::LOCALSPACEMATRICES){
- for(i = 0; i < hier->numNodes; i++){
+ for(i = 0; i < numNodes; i++){
invMats[i].flags = 0;
Matrix::mult(m, &invMats[i], &hier->matrices[i]);
m++;
@@ -232,7 +230,7 @@ uploadSkinMatrices(Atomic *a)
}else{
Matrix invAtmMat;
Matrix::invert(&invAtmMat, a->getFrame()->getLTM());
- for(i = 0; i < hier->numNodes; i++){
+ for(i = 0; i < numNodes; i++){
invMats[i].flags = 0;
Matrix::mult(&tmp, &hier->matrices[i], &invAtmMat);
Matrix::mult(m, &invMats[i], &tmp);
@@ -240,7 +238,7 @@ uploadSkinMatrices(Atomic *a)
}
}
}else{
- for(i = 0; i < skin->numBones; i++){
+ for(i = 0; i < numBones; i++){
m->setIdentity();
m++;
}
@@ -273,18 +271,20 @@ skinRenderCB(Atomic *atomic, InstanceDataHeader *header)
rw::SetRenderState(VERTEXALPHA, inst->vertexAlpha || m->color.alpha != 0xFF);
- if((vsBits & VSLIGHT_MASK) == 0){
+// if((vsBits & VSLIGHT_MASK) == 0){
if(getAlphaTest())
skinShader->use();
else
skinShader_noAT->use();
- }else{
- if(getAlphaTest())
- skinShader_fullLight->use();
- else
- skinShader_fullLight_noAT->use();
- }
+// }else{
+// if(getAlphaTest())
+// skinShader_fullLight->use();
+// else
+// skinShader_fullLight_noAT->use();
+// }
+// defaultShader->use();
+
drawInst(header, inst);
inst++;
}
@@ -295,7 +295,7 @@ static void*
skinOpen(void *o, int32, int32)
{
skinGlobals.pipelines[PLATFORM_GL3] = makeSkinPipeline();
-
+
#include "shaders/simple_fs_gl.inc"
#include "shaders/skin_gl.inc"
const char *vs[] = { shaderDecl, header_vert_src, skin_vert_src, nil };
@@ -307,11 +307,11 @@ skinOpen(void *o, int32, int32)
assert(skinShader);
skinShader_noAT = Shader::create(vs, fs_noAT);
assert(skinShader_noAT);
-
- skinShader_fullLight = Shader::create(vs_fullLight, fs);
- assert(skinShader_fullLight);
- skinShader_fullLight_noAT = Shader::create(vs_fullLight, fs_noAT);
- assert(skinShader_fullLight_noAT);
+//
+// skinShader_fullLight = Shader::create(vs_fullLight, fs);
+// assert(skinShader_fullLight);
+// skinShader_fullLight_noAT = Shader::create(vs_fullLight, fs_noAT);
+// assert(skinShader_fullLight_noAT);
return o;
}
@@ -326,10 +326,10 @@ skinClose(void *o, int32, int32)
skinShader = nil;
skinShader_noAT->destroy();
skinShader_noAT = nil;
- skinShader_fullLight->destroy();
- skinShader_fullLight = nil;
- skinShader_fullLight_noAT->destroy();
- skinShader_fullLight_noAT = nil;
+// skinShader_fullLight->destroy();
+// skinShader_fullLight = nil;
+// skinShader_fullLight_noAT->destroy();
+// skinShader_fullLight_noAT = nil;
return o;
}
@@ -337,10 +337,11 @@ skinClose(void *o, int32, int32)
void
initSkin(void)
{
- u_boneMatrices = registerUniform("u_boneMatrices", UNIFORM_MAT4, 64);
-
- Driver::registerPlugin(PLATFORM_GL3, 0, ID_SKIN,
- skinOpen, skinClose);
+ // TODO
+// u_boneMatrices = registerUniform("u_boneMatrices", UNIFORM_MAT4, MAX_BONES);
+//
+// Driver::registerPlugin(PLATFORM_GL3, 0, ID_SKIN,
+// skinOpen, skinClose);
}
ObjPipeline*
diff --git a/vendor/librw/src/gl/rwgl3.h b/vendor/librw/src/gl/rwgl3.h
index 4b138ac..0c33166 100644
--- a/vendor/librw/src/gl/rwgl3.h
+++ b/vendor/librw/src/gl/rwgl3.h
@@ -1,4 +1,14 @@
#ifdef RW_GL3
+#ifdef __SYMBIAN32__
+#include
+#include
+#include
+
+#define GL_COMPRESSED_RGB_S3TC_DXT1_EXT 0x83F0
+#define GL_COMPRESSED_RGBA_S3TC_DXT1_EXT 0x83F1
+#define GL_COMPRESSED_RGBA_S3TC_DXT3_EXT 0x83F2
+#define GL_COMPRESSED_RGBA_S3TC_DXT5_EXT 0x83F3
+#else
#include "glad/glad.h"
#ifdef LIBRW_SDL2
#include
@@ -6,6 +16,7 @@
#include
#endif
#endif
+#endif
namespace rw {
@@ -15,7 +26,7 @@ struct EngineOpenParams
#ifdef LIBRW_SDL2
SDL_Window **window;
bool32 fullscreen;
-#else
+#elif !defined(__SYMBIAN32__)
GLFWwindow **window;
#endif
int width, height;
@@ -49,12 +60,14 @@ enum AttribIndices
ATTRIB_INDICES,
ATTRIB_TEXCOORDS0,
ATTRIB_TEXCOORDS1,
+#if 0
ATTRIB_TEXCOORDS2,
ATTRIB_TEXCOORDS3,
ATTRIB_TEXCOORDS4,
ATTRIB_TEXCOORDS5,
ATTRIB_TEXCOORDS6,
ATTRIB_TEXCOORDS7,
+#endif
};
// default uniform indices
@@ -98,7 +111,7 @@ struct InstanceDataHeader : rw::InstanceDataHeader
struct Shader;
extern Shader *defaultShader, *defaultShader_noAT;
-extern Shader *defaultShader_fullLight, *defaultShader_fullLight_noAT;
+//extern Shader *defaultShader_fullLight, *defaultShader_fullLight_noAT;
struct Im3DVertex
{
diff --git a/vendor/librw/src/gl/rwgl3impl.h b/vendor/librw/src/gl/rwgl3impl.h
index 39f0050..8b44ae4 100644
--- a/vendor/librw/src/gl/rwgl3impl.h
+++ b/vendor/librw/src/gl/rwgl3impl.h
@@ -24,10 +24,15 @@ void im3DEnd(void);
struct DisplayMode
{
+#ifdef __SYMBIAN32__
+ uint32 width;
+ uint32 height;
+#else
#ifdef LIBRW_SDL2
SDL_DisplayMode mode;
#else
GLFWvidmode mode;
+#endif
#endif
int32 depth;
uint32 flags;
@@ -40,10 +45,12 @@ struct GlGlobals
SDL_Window *window;
SDL_GLContext glcontext;
#else
+#ifndef __SYMBIAN32__
GLFWwindow **pWindow;
GLFWwindow *window;
GLFWmonitor *monitor;
+#endif
int numMonitors;
int currentMonitor;
#endif
diff --git a/vendor/librw/src/gl/shaders/Makefile b/vendor/librw/src/gl/shaders/Makefile
index 6471f17..10a8580 100644
--- a/vendor/librw/src/gl/shaders/Makefile
+++ b/vendor/librw/src/gl/shaders/Makefile
@@ -2,44 +2,43 @@ all: header_vs.inc header_fs.inc im2d_gl.inc im3d_gl.inc default_vs_gl.inc simpl
header_vs.inc: header.vert
(echo 'const char *header_vert_src =';\
- sed 's/..*/"&\\n"/' header.vert;\
+ sed 's/..*/"&\\\\n"/' header.vert;\
echo ';') >header_vs.inc
header_fs.inc: header.frag
(echo 'const char *header_frag_src =';\
- sed 's/..*/"&\\n"/' header.frag;\
+ sed 's/..*/"&\\\\n"/' header.frag;\
echo ';') >header_fs.inc
im2d_gl.inc: im2d.vert
(echo 'const char *im2d_vert_src =';\
- sed 's/..*/"&\\n"/' im2d.vert;\
+ sed 's/..*/"&\\\\n"/' im2d.vert;\
echo ';') >im2d_gl.inc
im3d_gl.inc: im3d.vert
(echo 'const char *im3d_vert_src =';\
- sed 's/..*/"&\\n"/' im3d.vert;\
+ sed 's/..*/"&\\\\n"/' im3d.vert;\
echo ';') >im3d_gl.inc
default_vs_gl.inc: default.vert
(echo 'const char *default_vert_src =';\
- sed 's/..*/"&\\n"/' default.vert;\
+ sed 's/..*/"&\\\\n"/' default.vert;\
echo ';') >default_vs_gl.inc
simple_fs_gl.inc: simple.frag
(echo 'const char *simple_frag_src =';\
- sed 's/..*/"&\\n"/' simple.frag;\
+ sed 's/..*/"&\\\\n"/' simple.frag;\
echo ';') >simple_fs_gl.inc
matfx_gl.inc: matfx_env.frag matfx_env.vert
(echo 'const char *matfx_env_vert_src =';\
- sed 's/..*/"&\\n"/' matfx_env.vert;\
+ sed 's/..*/"&\\\\n"/' matfx_env.vert;\
echo ';';\
echo 'const char *matfx_env_frag_src =';\
- sed 's/..*/"&\\n"/' matfx_env.frag;\
+ sed 's/..*/"&\\\\n"/' matfx_env.frag;\
echo ';') >matfx_gl.inc
skin_gl.inc: skin.vert
(echo 'const char *skin_vert_src =';\
- sed 's/..*/"&\\n"/' skin.vert;\
- echo ';') >skin_gl.inc
-
+ sed 's/..*/"&\\\\n"/' skin.vert;\
+ echo ';') >skin_gl.inc
\ No newline at end of file
diff --git a/vendor/librw/src/gl/shaders/default.vert b/vendor/librw/src/gl/shaders/default.vert
index 8e3fad7..06002a6 100644
--- a/vendor/librw/src/gl/shaders/default.vert
+++ b/vendor/librw/src/gl/shaders/default.vert
@@ -1,8 +1,7 @@
-VSIN(ATTRIB_POS) vec3 in_pos;
+VSIN(ATTRIB_POS) vec3 in_pos;
VSOUT vec4 v_color;
-VSOUT vec2 v_tex0;
-VSOUT float v_fog;
+VSOUT vec3 v_tex0_fog;
void
main(void)
@@ -11,7 +10,7 @@ main(void)
gl_Position = u_proj * u_view * Vertex;
vec3 Normal = mat3(u_world) * in_normal;
- v_tex0 = in_tex0;
+ v_tex0_fog.xy = in_tex0;
v_color = in_color;
v_color.rgb += u_ambLight.rgb*surfAmbient;
@@ -19,5 +18,5 @@ main(void)
v_color = clamp(v_color, 0.0, 1.0);
v_color *= u_matColor;
- v_fog = DoFog(gl_Position.w);
+ v_tex0_fog.z = DoFog(gl_Position.w);
}
diff --git a/vendor/librw/src/gl/shaders/default_vs_gl.inc b/vendor/librw/src/gl/shaders/default_vs_gl.inc
index 6e3d6c4..3303d6d 100644
--- a/vendor/librw/src/gl/shaders/default_vs_gl.inc
+++ b/vendor/librw/src/gl/shaders/default_vs_gl.inc
@@ -1,9 +1,8 @@
const char *default_vert_src =
-"VSIN(ATTRIB_POS) vec3 in_pos;\n"
+"VSIN(ATTRIB_POS) vec3 in_pos;\n"
"VSOUT vec4 v_color;\n"
-"VSOUT vec2 v_tex0;\n"
-"VSOUT float v_fog;\n"
+"VSOUT vec3 v_tex0_fog;\n"
"void\n"
"main(void)\n"
@@ -12,7 +11,7 @@ const char *default_vert_src =
" gl_Position = u_proj * u_view * Vertex;\n"
" vec3 Normal = mat3(u_world) * in_normal;\n"
-" v_tex0 = in_tex0;\n"
+" v_tex0_fog.xy = in_tex0;\n"
" v_color = in_color;\n"
" v_color.rgb += u_ambLight.rgb*surfAmbient;\n"
@@ -20,6 +19,6 @@ const char *default_vert_src =
" v_color = clamp(v_color, 0.0, 1.0);\n"
" v_color *= u_matColor;\n"
-" v_fog = DoFog(gl_Position.w);\n"
+" v_tex0_fog.z = DoFog(gl_Position.w);\n"
"}\n"
;
diff --git a/vendor/librw/src/gl/shaders/header.vert b/vendor/librw/src/gl/shaders/header.vert
index bb9881f..6be1772 100644
--- a/vendor/librw/src/gl/shaders/header.vert
+++ b/vendor/librw/src/gl/shaders/header.vert
@@ -49,7 +49,7 @@ uniform mat4 u_proj;
uniform mat4 u_view;
#endif
-#define MAX_LIGHTS 8
+#define MAX_LIGHTS 4
#ifdef USE_UBOS
layout(std140) uniform Object
@@ -80,6 +80,7 @@ uniform vec4 u_surfProps; // amb, spec, diff, extra
vec3 DoDynamicLight(vec3 V, vec3 N)
{
vec3 color = vec3(0.0, 0.0, 0.0);
+/*
for(int i = 0; i < MAX_LIGHTS; i++){
if(u_lightParams[i].x == 0.0)
break;
@@ -119,6 +120,7 @@ vec3 DoDynamicLight(vec3 V, vec3 N)
#endif
;
}
+*/
return color;
}
diff --git a/vendor/librw/src/gl/shaders/header_vs.inc b/vendor/librw/src/gl/shaders/header_vs.inc
index ffa4683..c2a9969 100644
--- a/vendor/librw/src/gl/shaders/header_vs.inc
+++ b/vendor/librw/src/gl/shaders/header_vs.inc
@@ -50,7 +50,7 @@ const char *header_vert_src =
"uniform mat4 u_view;\n"
"#endif\n"
-"#define MAX_LIGHTS 8\n"
+"#define MAX_LIGHTS 4\n"
"#ifdef USE_UBOS\n"
"layout(std140) uniform Object\n"
@@ -81,6 +81,7 @@ const char *header_vert_src =
"vec3 DoDynamicLight(vec3 V, vec3 N)\n"
"{\n"
" vec3 color = vec3(0.0, 0.0, 0.0);\n"
+"/*\n"
" for(int i = 0; i < MAX_LIGHTS; i++){\n"
" if(u_lightParams[i].x == 0.0)\n"
" break;\n"
@@ -120,6 +121,7 @@ const char *header_vert_src =
"#endif\n"
" ;\n"
" }\n"
+"*/\n"
" return color;\n"
"}\n"
diff --git a/vendor/librw/src/gl/shaders/im2d.vert b/vendor/librw/src/gl/shaders/im2d.vert
index cdb9da8..be52402 100644
--- a/vendor/librw/src/gl/shaders/im2d.vert
+++ b/vendor/librw/src/gl/shaders/im2d.vert
@@ -1,18 +1,17 @@
uniform vec4 u_xform;
-VSIN(ATTRIB_POS) vec4 in_pos;
+VSIN(ATTRIB_POS) vec4 in_pos;
VSOUT vec4 v_color;
-VSOUT vec2 v_tex0;
-VSOUT float v_fog;
+VSOUT vec3 v_tex0_fog;
void
main(void)
{
gl_Position = in_pos;
gl_Position.xy = gl_Position.xy * u_xform.xy + u_xform.zw;
- v_fog = DoFog(gl_Position.w);
+ v_tex0_fog.z = DoFog(gl_Position.w);
gl_Position.xyz *= gl_Position.w;
v_color = in_color;
- v_tex0 = in_tex0;
+ v_tex0_fog.xy = in_tex0;
}
diff --git a/vendor/librw/src/gl/shaders/im2d_gl.inc b/vendor/librw/src/gl/shaders/im2d_gl.inc
index 4e1d631..475f121 100644
--- a/vendor/librw/src/gl/shaders/im2d_gl.inc
+++ b/vendor/librw/src/gl/shaders/im2d_gl.inc
@@ -1,20 +1,19 @@
const char *im2d_vert_src =
"uniform vec4 u_xform;\n"
-"VSIN(ATTRIB_POS) vec4 in_pos;\n"
+"VSIN(ATTRIB_POS) vec4 in_pos;\n"
"VSOUT vec4 v_color;\n"
-"VSOUT vec2 v_tex0;\n"
-"VSOUT float v_fog;\n"
+"VSOUT vec3 v_tex0_fog;\n"
"void\n"
"main(void)\n"
"{\n"
" gl_Position = in_pos;\n"
" gl_Position.xy = gl_Position.xy * u_xform.xy + u_xform.zw;\n"
-" v_fog = DoFog(gl_Position.w);\n"
+" v_tex0_fog.z = DoFog(gl_Position.w);\n"
" gl_Position.xyz *= gl_Position.w;\n"
" v_color = in_color;\n"
-" v_tex0 = in_tex0;\n"
+" v_tex0_fog.xy = in_tex0;\n"
"}\n"
;
diff --git a/vendor/librw/src/gl/shaders/im3d.vert b/vendor/librw/src/gl/shaders/im3d.vert
index 7088352..9d264f9 100644
--- a/vendor/librw/src/gl/shaders/im3d.vert
+++ b/vendor/librw/src/gl/shaders/im3d.vert
@@ -1,16 +1,14 @@
-VSIN(ATTRIB_POS) vec3 in_pos;
+VSIN(ATTRIB_POS) vec3 in_pos;
VSOUT vec4 v_color;
-VSOUT vec2 v_tex0;
-VSOUT float v_fog;
+VSOUT vec3 v_tex0_fog;
void
main(void)
{
vec4 Vertex = u_world * vec4(in_pos, 1.0);
- vec4 CamVertex = u_view * Vertex;
- gl_Position = u_proj * CamVertex;
+ gl_Position = u_proj * u_view * Vertex;
v_color = in_color;
- v_tex0 = in_tex0;
- v_fog = DoFog(gl_Position.w);
+ v_tex0_fog.xy = in_tex0;
+ v_tex0_fog.z = DoFog(gl_Position.w);
}
diff --git a/vendor/librw/src/gl/shaders/im3d_gl.inc b/vendor/librw/src/gl/shaders/im3d_gl.inc
index 389589b..add54e8 100644
--- a/vendor/librw/src/gl/shaders/im3d_gl.inc
+++ b/vendor/librw/src/gl/shaders/im3d_gl.inc
@@ -1,18 +1,16 @@
const char *im3d_vert_src =
-"VSIN(ATTRIB_POS) vec3 in_pos;\n"
+"VSIN(ATTRIB_POS) vec3 in_pos;\n"
"VSOUT vec4 v_color;\n"
-"VSOUT vec2 v_tex0;\n"
-"VSOUT float v_fog;\n"
+"VSOUT vec3 v_tex0_fog;\n"
"void\n"
"main(void)\n"
"{\n"
" vec4 Vertex = u_world * vec4(in_pos, 1.0);\n"
-" vec4 CamVertex = u_view * Vertex;\n"
-" gl_Position = u_proj * CamVertex;\n"
+" gl_Position = u_proj * u_view * Vertex;\n"
" v_color = in_color;\n"
-" v_tex0 = in_tex0;\n"
-" v_fog = DoFog(gl_Position.w);\n"
+" v_tex0_fog.xy = in_tex0;\n"
+" v_tex0_fog.z = DoFog(gl_Position.w);\n"
"}\n"
;
diff --git a/vendor/librw/src/gl/shaders/matfx_env.frag b/vendor/librw/src/gl/shaders/matfx_env.frag
index 0ef20d1..56aef9e 100644
--- a/vendor/librw/src/gl/shaders/matfx_env.frag
+++ b/vendor/librw/src/gl/shaders/matfx_env.frag
@@ -8,20 +8,19 @@ uniform vec4 u_fxparams;
FSIN vec4 v_color;
FSIN vec4 v_envColor;
-FSIN vec2 v_tex0;
+FSIN vec3 v_tex0_fog;
FSIN vec2 v_tex1;
-FSIN float v_fog;
void
main(void)
{
vec4 pass1 = v_color;
- pass1 *= texture(tex0, vec2(v_tex0.x, 1.0-v_tex0.y));
+ pass1 *= texture(tex0, vec2(v_tex0_fog.x, 1.0-v_tex0_fog.y));
vec4 pass2 = v_envColor*shininess*texture(tex1, vec2(v_tex1.x, 1.0-v_tex1.y));
- pass1.rgb = mix(u_fogColor.rgb, pass1.rgb, v_fog);
- pass2.rgb = mix(vec3(0.0, 0.0, 0.0), pass2.rgb, v_fog);
+ pass1.rgb = mix(u_fogColor.rgb, pass1.rgb, v_tex0_fog.z);
+ pass2.rgb = mix(vec3(0.0, 0.0, 0.0), pass2.rgb, v_tex0_fog.z);
float fba = max(pass1.a, disableFBA);
vec4 color;
diff --git a/vendor/librw/src/gl/shaders/matfx_env.vert b/vendor/librw/src/gl/shaders/matfx_env.vert
index 580a49f..1af311d 100644
--- a/vendor/librw/src/gl/shaders/matfx_env.vert
+++ b/vendor/librw/src/gl/shaders/matfx_env.vert
@@ -2,13 +2,12 @@ uniform mat4 u_texMatrix;
uniform vec4 u_colorClamp;
uniform vec4 u_envColor;
-VSIN(ATTRIB_POS) vec3 in_pos;
+VSIN(ATTRIB_POS) vec3 in_pos;
VSOUT vec4 v_color;
VSOUT vec4 v_envColor;
-VSOUT vec2 v_tex0;
+VSOUT vec3 v_tex0_fog;
VSOUT vec2 v_tex1;
-VSOUT float v_fog;
void
main(void)
@@ -17,7 +16,7 @@ main(void)
gl_Position = u_proj * u_view * Vertex;
vec3 Normal = mat3(u_world) * in_normal;
- v_tex0 = in_tex0;
+ v_tex0_fog.xy = in_tex0;
v_tex1 = (u_texMatrix * vec4(Normal, 1.0)).xy;
v_color = in_color;
@@ -27,5 +26,5 @@ main(void)
v_envColor = max(v_color, u_colorClamp) * u_envColor;
v_color *= u_matColor;
- v_fog = DoFog(gl_Position.w);
+ v_tex0_fog.z = DoFog(gl_Position.w);
}
diff --git a/vendor/librw/src/gl/shaders/matfx_gl.inc b/vendor/librw/src/gl/shaders/matfx_gl.inc
index a1dcaf8..e20ee2e 100644
--- a/vendor/librw/src/gl/shaders/matfx_gl.inc
+++ b/vendor/librw/src/gl/shaders/matfx_gl.inc
@@ -3,13 +3,12 @@ const char *matfx_env_vert_src =
"uniform vec4 u_colorClamp;\n"
"uniform vec4 u_envColor;\n"
-"VSIN(ATTRIB_POS) vec3 in_pos;\n"
+"VSIN(ATTRIB_POS) vec3 in_pos;\n"
"VSOUT vec4 v_color;\n"
"VSOUT vec4 v_envColor;\n"
-"VSOUT vec2 v_tex0;\n"
+"VSOUT vec3 v_tex0_fog;\n"
"VSOUT vec2 v_tex1;\n"
-"VSOUT float v_fog;\n"
"void\n"
"main(void)\n"
@@ -18,7 +17,7 @@ const char *matfx_env_vert_src =
" gl_Position = u_proj * u_view * Vertex;\n"
" vec3 Normal = mat3(u_world) * in_normal;\n"
-" v_tex0 = in_tex0;\n"
+" v_tex0_fog.xy = in_tex0;\n"
" v_tex1 = (u_texMatrix * vec4(Normal, 1.0)).xy;\n"
" v_color = in_color;\n"
@@ -28,7 +27,7 @@ const char *matfx_env_vert_src =
" v_envColor = max(v_color, u_colorClamp) * u_envColor;\n"
" v_color *= u_matColor;\n"
-" v_fog = DoFog(gl_Position.w);\n"
+" v_tex0_fog.z = DoFog(gl_Position.w);\n"
"}\n"
;
const char *matfx_env_frag_src =
@@ -42,20 +41,19 @@ const char *matfx_env_frag_src =
"FSIN vec4 v_color;\n"
"FSIN vec4 v_envColor;\n"
-"FSIN vec2 v_tex0;\n"
+"FSIN vec3 v_tex0_fog;\n"
"FSIN vec2 v_tex1;\n"
-"FSIN float v_fog;\n"
"void\n"
"main(void)\n"
"{\n"
" vec4 pass1 = v_color;\n"
-" pass1 *= texture(tex0, vec2(v_tex0.x, 1.0-v_tex0.y));\n"
+" pass1 *= texture(tex0, vec2(v_tex0_fog.x, 1.0-v_tex0_fog.y));\n"
" vec4 pass2 = v_envColor*shininess*texture(tex1, vec2(v_tex1.x, 1.0-v_tex1.y));\n"
-" pass1.rgb = mix(u_fogColor.rgb, pass1.rgb, v_fog);\n"
-" pass2.rgb = mix(vec3(0.0, 0.0, 0.0), pass2.rgb, v_fog);\n"
+" pass1.rgb = mix(u_fogColor.rgb, pass1.rgb, v_tex0_fog.z);\n"
+" pass2.rgb = mix(vec3(0.0, 0.0, 0.0), pass2.rgb, v_tex0_fog.z);\n"
" float fba = max(pass1.a, disableFBA);\n"
" vec4 color;\n"
diff --git a/vendor/librw/src/gl/shaders/simple.frag b/vendor/librw/src/gl/shaders/simple.frag
index 32b2afb..7f6c71b 100644
--- a/vendor/librw/src/gl/shaders/simple.frag
+++ b/vendor/librw/src/gl/shaders/simple.frag
@@ -1,14 +1,13 @@
uniform sampler2D tex0;
FSIN vec4 v_color;
-FSIN vec2 v_tex0;
-FSIN float v_fog;
+FSIN vec3 v_tex0_fog;
void
main(void)
{
- vec4 color = v_color*texture(tex0, vec2(v_tex0.x, 1.0-v_tex0.y));
- color.rgb = mix(u_fogColor.rgb, color.rgb, v_fog);
+ vec4 color = v_color*texture2D(tex0, vec2(v_tex0_fog.x, 1.0 - v_tex0_fog.y));
+ color.rgb = mix(u_fogColor.rgb, color.rgb, v_tex0_fog.z);
DoAlphaTest(color.a);
FRAGCOLOR(color);
}
diff --git a/vendor/librw/src/gl/shaders/simple_fs_gl.inc b/vendor/librw/src/gl/shaders/simple_fs_gl.inc
index a9216ca..1eef06b 100644
--- a/vendor/librw/src/gl/shaders/simple_fs_gl.inc
+++ b/vendor/librw/src/gl/shaders/simple_fs_gl.inc
@@ -2,14 +2,13 @@ const char *simple_frag_src =
"uniform sampler2D tex0;\n"
"FSIN vec4 v_color;\n"
-"FSIN vec2 v_tex0;\n"
-"FSIN float v_fog;\n"
+"FSIN vec3 v_tex0_fog;\n"
"void\n"
"main(void)\n"
"{\n"
-" vec4 color = v_color*texture(tex0, vec2(v_tex0.x, 1.0-v_tex0.y));\n"
-" color.rgb = mix(u_fogColor.rgb, color.rgb, v_fog);\n"
+" vec4 color = v_color*texture2D(tex0, vec2(v_tex0_fog.x, 1.0 - v_tex0_fog.y));\n"
+" color.rgb = mix(u_fogColor.rgb, color.rgb, v_tex0_fog.z);\n"
" DoAlphaTest(color.a);\n"
" FRAGCOLOR(color);\n"
"}\n"
diff --git a/vendor/librw/src/gl/shaders/skin.vert b/vendor/librw/src/gl/shaders/skin.vert
index 7408542..2a712d1 100644
--- a/vendor/librw/src/gl/shaders/skin.vert
+++ b/vendor/librw/src/gl/shaders/skin.vert
@@ -1,10 +1,37 @@
-uniform mat4 u_boneMatrices[64];
+uniform mat4 u_boneMatrices[24];
-VSIN(ATTRIB_POS) vec3 in_pos;
+VSIN(ATTRIB_POS) vec3 in_pos;
VSOUT vec4 v_color;
-VSOUT vec2 v_tex0;
-VSOUT float v_fog;
+VSOUT vec3 v_tex0_fog;
+
+mat4 getBoneMatrix(int idx) {
+ if(idx == 0) return u_boneMatrices[0];
+ if(idx == 1) return u_boneMatrices[1];
+ if(idx == 2) return u_boneMatrices[2];
+ if(idx == 3) return u_boneMatrices[3];
+ if(idx == 4) return u_boneMatrices[4];
+ if(idx == 5) return u_boneMatrices[5];
+ if(idx == 6) return u_boneMatrices[6];
+ if(idx == 7) return u_boneMatrices[7];
+ if(idx == 8) return u_boneMatrices[8];
+ if(idx == 9) return u_boneMatrices[9];
+ if(idx == 10) return u_boneMatrices[10];
+ if(idx == 11) return u_boneMatrices[11];
+ if(idx == 12) return u_boneMatrices[12];
+ if(idx == 13) return u_boneMatrices[13];
+ if(idx == 14) return u_boneMatrices[14];
+ if(idx == 15) return u_boneMatrices[15];
+ if(idx == 16) return u_boneMatrices[16];
+ if(idx == 17) return u_boneMatrices[17];
+ if(idx == 18) return u_boneMatrices[18];
+ if(idx == 19) return u_boneMatrices[19];
+ if(idx == 20) return u_boneMatrices[20];
+ if(idx == 21) return u_boneMatrices[21];
+ if(idx == 22) return u_boneMatrices[22];
+ if(idx == 23) return u_boneMatrices[23];
+ return u_boneMatrices[0];
+}
void
main(void)
@@ -12,15 +39,15 @@ main(void)
vec3 SkinVertex = vec3(0.0, 0.0, 0.0);
vec3 SkinNormal = vec3(0.0, 0.0, 0.0);
for(int i = 0; i < 4; i++){
- SkinVertex += (u_boneMatrices[int(in_indices[i])] * vec4(in_pos, 1.0)).xyz * in_weights[i];
- SkinNormal += (mat3(u_boneMatrices[int(in_indices[i])]) * in_normal) * in_weights[i];
+ SkinVertex += (getBoneMatrix(int(in_indices[i])) * vec4(in_pos, 1.0)).xyz * in_weights[i];
+ SkinNormal += (mat3(getBoneMatrix(int(in_indices[i]))) * in_normal) * in_weights[i];
}
vec4 Vertex = u_world * vec4(SkinVertex, 1.0);
gl_Position = u_proj * u_view * Vertex;
vec3 Normal = mat3(u_world) * SkinNormal;
- v_tex0 = in_tex0;
+ v_tex0_fog.xy = in_tex0;
v_color = in_color;
v_color.rgb += u_ambLight.rgb*surfAmbient;
@@ -28,5 +55,5 @@ main(void)
v_color = clamp(v_color, 0.0, 1.0);
v_color *= u_matColor;
- v_fog = DoFog(gl_Position.z);
+ v_tex0_fog.z = DoFog(gl_Position.z);
}
diff --git a/vendor/librw/src/gl/shaders/skin_gl.inc b/vendor/librw/src/gl/shaders/skin_gl.inc
index 7d1268e..9a264cb 100644
--- a/vendor/librw/src/gl/shaders/skin_gl.inc
+++ b/vendor/librw/src/gl/shaders/skin_gl.inc
@@ -1,11 +1,38 @@
const char *skin_vert_src =
-"uniform mat4 u_boneMatrices[64];\n"
+"uniform mat4 u_boneMatrices[24];\n"
-"VSIN(ATTRIB_POS) vec3 in_pos;\n"
+"VSIN(ATTRIB_POS) vec3 in_pos;\n"
"VSOUT vec4 v_color;\n"
-"VSOUT vec2 v_tex0;\n"
-"VSOUT float v_fog;\n"
+"VSOUT vec3 v_tex0_fog;\n"
+
+"mat4 getBoneMatrix(int idx) {\n"
+" if(idx == 0) return u_boneMatrices[0];\n"
+" if(idx == 1) return u_boneMatrices[1];\n"
+" if(idx == 2) return u_boneMatrices[2];\n"
+" if(idx == 3) return u_boneMatrices[3];\n"
+" if(idx == 4) return u_boneMatrices[4];\n"
+" if(idx == 5) return u_boneMatrices[5];\n"
+" if(idx == 6) return u_boneMatrices[6];\n"
+" if(idx == 7) return u_boneMatrices[7];\n"
+" if(idx == 8) return u_boneMatrices[8];\n"
+" if(idx == 9) return u_boneMatrices[9];\n"
+" if(idx == 10) return u_boneMatrices[10];\n"
+" if(idx == 11) return u_boneMatrices[11];\n"
+" if(idx == 12) return u_boneMatrices[12];\n"
+" if(idx == 13) return u_boneMatrices[13];\n"
+" if(idx == 14) return u_boneMatrices[14];\n"
+" if(idx == 15) return u_boneMatrices[15];\n"
+" if(idx == 16) return u_boneMatrices[16];\n"
+" if(idx == 17) return u_boneMatrices[17];\n"
+" if(idx == 18) return u_boneMatrices[18];\n"
+" if(idx == 19) return u_boneMatrices[19];\n"
+" if(idx == 20) return u_boneMatrices[20];\n"
+" if(idx == 21) return u_boneMatrices[21];\n"
+" if(idx == 22) return u_boneMatrices[22];\n"
+" if(idx == 23) return u_boneMatrices[23];\n"
+" return u_boneMatrices[0];\n"
+"}\n"
"void\n"
"main(void)\n"
@@ -13,15 +40,15 @@ const char *skin_vert_src =
" vec3 SkinVertex = vec3(0.0, 0.0, 0.0);\n"
" vec3 SkinNormal = vec3(0.0, 0.0, 0.0);\n"
" for(int i = 0; i < 4; i++){\n"
-" SkinVertex += (u_boneMatrices[int(in_indices[i])] * vec4(in_pos, 1.0)).xyz * in_weights[i];\n"
-" SkinNormal += (mat3(u_boneMatrices[int(in_indices[i])]) * in_normal) * in_weights[i];\n"
+" SkinVertex += (getBoneMatrix(int(in_indices[i])) * vec4(in_pos, 1.0)).xyz * in_weights[i];\n"
+" SkinNormal += (mat3(getBoneMatrix(int(in_indices[i]))) * in_normal) * in_weights[i];\n"
" }\n"
" vec4 Vertex = u_world * vec4(SkinVertex, 1.0);\n"
" gl_Position = u_proj * u_view * Vertex;\n"
" vec3 Normal = mat3(u_world) * SkinNormal;\n"
-" v_tex0 = in_tex0;\n"
+" v_tex0_fog.xy = in_tex0;\n"
" v_color = in_color;\n"
" v_color.rgb += u_ambLight.rgb*surfAmbient;\n"
@@ -29,6 +56,6 @@ const char *skin_vert_src =
" v_color = clamp(v_color, 0.0, 1.0);\n"
" v_color *= u_matColor;\n"
-" v_fog = DoFog(gl_Position.z);\n"
+" v_tex0_fog.z = DoFog(gl_Position.z);\n"
"}\n"
;
diff --git a/vendor/librw/src/gl/wdgl.cpp b/vendor/librw/src/gl/wdgl.cpp
index d1ac4b8..6474d2b 100644
--- a/vendor/librw/src/gl/wdgl.cpp
+++ b/vendor/librw/src/gl/wdgl.cpp
@@ -13,9 +13,14 @@
#include "../rwplugins.h"
#include "rwwdgl.h"
+#ifdef __SYMBIAN32__
+#include
+#include
+#else
#ifdef RW_OPENGL
#include "glad/glad.h"
#endif
+#endif
#define PLUGIN_ID 2
@@ -833,7 +838,11 @@ Texture::upload(void)
static GLenum wrap[] = {
0, GL_REPEAT, GL_MIRRORED_REPEAT,
+#ifdef __SYMBIAN32__
+ GL_CLAMP_TO_EDGE, GL_CLAMP_TO_EDGE
+#else
GL_CLAMP_TO_EDGE, GL_CLAMP_TO_BORDER
+#endif
};
glTexParameteri(GL_TEXTURE_2D, GL_TEXTURE_WRAP_S,
wrap[(this->filterAddressing >> 8) & 0xF]);
@@ -842,7 +851,7 @@ Texture::upload(void)
switch(r->format & 0xF00){
case Raster::C8888:
- glTexImage2D(GL_TEXTURE_2D, 0, 4, r->width, r->height,
+ glTexImage2D(GL_TEXTURE_2D, 0, GL_RGBA, r->width, r->height,
0, GL_RGBA, GL_UNSIGNED_BYTE, r->pixels);
break;
default:
diff --git a/vendor/librw/src/image.cpp b/vendor/librw/src/image.cpp
index 77adfda..c8cee64 100644
--- a/vendor/librw/src/image.cpp
+++ b/vendor/librw/src/image.cpp
@@ -14,6 +14,7 @@
#include "d3d/rwxbox.h"
#include "d3d/rwd3d8.h"
#include "d3d/rwd3d9.h"
+#include "fcaseopen.h"
#define PLUGIN_ID ID_IMAGE
@@ -937,7 +938,7 @@ Image::getFilename(const char *name)
if(g->numSearchPaths == 0){
s = rwStrdup(name, MEMDUR_EVENT);
makePath(s);
- f = fopen(s, "rb");
+ f = fcaseopen(s, "rb");
if(f){
fclose(f);
printf("found %s\n", s);
@@ -955,7 +956,7 @@ Image::getFilename(const char *name)
strcpy(s, p);
strcat(s, name);
makePath(s);
- f = fopen(s, "r");
+ f = fcaseopen(s, "r");
if(f){
fclose(f);
printf("found %s\n", name);
diff --git a/vendor/librw/src/raster.cpp b/vendor/librw/src/raster.cpp
index c7ebffe..9f040a9 100644
--- a/vendor/librw/src/raster.cpp
+++ b/vendor/librw/src/raster.cpp
@@ -535,21 +535,21 @@ Raster::convertTexToCurrentPlatform(rw::Raster *ras)
// TODO: maybe don't *always* do this?
img->unpalettize();
Raster::imageFindRasterFormat(img, Raster::TEXTURE, &width, &height, &depth, &format);
- format |= ras->format & (Raster::MIPMAP | Raster::AUTOMIPMAP);
+// format |= ras->format & (Raster::MIPMAP | Raster::AUTOMIPMAP);
Raster *newras = Raster::create(width, height, depth, format);
newras->setFromImage(img);
img->destroy();
- int numLevels = ras->getNumLevels();
- for(int i = 1; i < numLevels; i++){
- ras->lock(i, Raster::LOCKREAD);
- img = ras->toImage();
- // TODO: maybe don't *always* do this?
- img->unpalettize();
- newras->lock(i, Raster::LOCKWRITE|Raster::LOCKNOFETCH);
- newras->setFromImage(img);
- newras->unlock(i);
- ras->unlock(i);
- }
+// int numLevels = ras->getNumLevels();
+// for(int i = 1; i < numLevels; i++){
+// ras->lock(i, Raster::LOCKREAD);
+// img = ras->toImage();
+// // TODO: maybe don't *always* do this?
+// img->unpalettize();
+// newras->lock(i, Raster::LOCKWRITE|Raster::LOCKNOFETCH);
+// newras->setFromImage(img);
+// newras->unlock(i);
+// ras->unlock(i);
+// }
ras->destroy();
ras = newras;
return ras;
diff --git a/vendor/librw/src/rwanim.h b/vendor/librw/src/rwanim.h
index e6dd1d5..1c560b4 100644
--- a/vendor/librw/src/rwanim.h
+++ b/vendor/librw/src/rwanim.h
@@ -1,3 +1,5 @@
+#pragma once
+
#include
namespace rw {
diff --git a/vendor/librw/src/rwbase.h b/vendor/librw/src/rwbase.h
index 13891ca..e62325b 100644
--- a/vendor/librw/src/rwbase.h
+++ b/vendor/librw/src/rwbase.h
@@ -1,3 +1,5 @@
+#pragma once
+
#ifndef RW_PS2
#include
#endif
@@ -6,6 +8,10 @@
#define M_PI 3.14159265358979323846
#endif
+#ifdef __SYMBIAN32__
+#define stderr stdout
+#endif
+
// TODO: clean up the opengl defines
// and figure out what we even want here...
#ifdef RW_GL3
diff --git a/vendor/librw/src/rwcharset.h b/vendor/librw/src/rwcharset.h
index 3988654..bb62c19 100644
--- a/vendor/librw/src/rwcharset.h
+++ b/vendor/librw/src/rwcharset.h
@@ -1,3 +1,5 @@
+#pragma once
+
namespace rw {
struct Charset
diff --git a/vendor/librw/src/rwengine.h b/vendor/librw/src/rwengine.h
index a84aa3a..6edf295 100644
--- a/vendor/librw/src/rwengine.h
+++ b/vendor/librw/src/rwengine.h
@@ -1,3 +1,5 @@
+#pragma once
+
namespace rw {
// uhhhm..... why are these not actual functions?
diff --git a/vendor/librw/src/rwerror.h b/vendor/librw/src/rwerror.h
index 2575626..d60d17c 100644
--- a/vendor/librw/src/rwerror.h
+++ b/vendor/librw/src/rwerror.h
@@ -1,3 +1,5 @@
+#pragma once
+
namespace rw {
struct Error
diff --git a/vendor/librw/src/rwobjects.h b/vendor/librw/src/rwobjects.h
index 5cd833f..d9bc29d 100644
--- a/vendor/librw/src/rwobjects.h
+++ b/vendor/librw/src/rwobjects.h
@@ -1,3 +1,5 @@
+#pragma once
+
#include
namespace rw {
diff --git a/vendor/librw/src/rwpipeline.h b/vendor/librw/src/rwpipeline.h
index 9a0410a..3a651e8 100644
--- a/vendor/librw/src/rwpipeline.h
+++ b/vendor/librw/src/rwpipeline.h
@@ -1,3 +1,5 @@
+#pragma once
+
namespace rw {
struct Atomic;
diff --git a/vendor/librw/src/rwplg.h b/vendor/librw/src/rwplg.h
index ad2116a..417e6ba 100644
--- a/vendor/librw/src/rwplg.h
+++ b/vendor/librw/src/rwplg.h
@@ -1,3 +1,5 @@
+#pragma once
+
namespace rw {
#define PLUGINOFFSET(type, base, offset) \
diff --git a/vendor/librw/src/rwplugins.h b/vendor/librw/src/rwplugins.h
index 51696b6..928f407 100644
--- a/vendor/librw/src/rwplugins.h
+++ b/vendor/librw/src/rwplugins.h
@@ -1,3 +1,5 @@
+#pragma once
+
namespace rw {
/*
diff --git a/vendor/librw/src/rwrender.h b/vendor/librw/src/rwrender.h
index 200837a..d94283e 100644
--- a/vendor/librw/src/rwrender.h
+++ b/vendor/librw/src/rwrender.h
@@ -1,3 +1,5 @@
+#pragma once
+
namespace rw {
// Render states
diff --git a/vendor/librw/src/rwuserdata.h b/vendor/librw/src/rwuserdata.h
index 00d7355..b962f53 100644
--- a/vendor/librw/src/rwuserdata.h
+++ b/vendor/librw/src/rwuserdata.h
@@ -1,3 +1,5 @@
+#pragma once
+
namespace rw {
enum UserDataType
diff --git a/vendor/librw/src/world.cpp b/vendor/librw/src/world.cpp
index 6432b37..2a3b11a 100644
--- a/vendor/librw/src/world.cpp
+++ b/vendor/librw/src/world.cpp
@@ -178,6 +178,7 @@ World::enumerateLights(Atomic *atomic, WorldLights *lightData)
if(!normals)
return;
+ Sphere *atomsphere = atomic->getWorldBoundingSphere();
// TODO: for this we would use an atomic's world sectors, but we don't have those yet
FORLIST(lnk, this->localLights){
if(lightData->numLocals >= maxLocals)
@@ -188,7 +189,6 @@ World::enumerateLights(Atomic *atomic, WorldLights *lightData)
continue;
// check if spheres are intersecting
- Sphere *atomsphere = atomic->getWorldBoundingSphere();
V3d dist = sub(l->getFrame()->getLTM()->pos, atomsphere->center);
if(length(dist) < atomsphere->radius + l->radius)
lightData->locals[lightData->numLocals++] = l;