From 3eb71f2cc5893de88702acf80731e2e074cce611 Mon Sep 17 00:00:00 2001 From: Shinovon Date: Wed, 29 Apr 2026 05:15:13 +0500 Subject: [PATCH] Symbian^3 port --- .gitignore | 5 + README.md | 24 + TODO.md | 15 + group/Icons_scalable_dc.mk | 47 ++ group/bld.inf | 8 + group/common.mmh | 28 + group/librw.mmp | 28 + group/qgn_menu_re3.svg | 10 + group/re3.mmp | 113 ++++ group/re3.rss | 78 +++ group/re3_reg.rss | 17 + group/shaders.mk | 26 + res/images/logo.svg | 88 --- res/images/logo_1024.png | Bin 24295 -> 0 bytes res/images/logo_256.jpg | Bin 18096 -> 0 bytes sis/re3.pkg | 11 + src/collision/ColModel.cpp | 12 +- src/control/Replay.h | 10 +- src/core/Cam.cpp | 4 +- src/core/CdStreamPosix.cpp | 18 +- src/core/ControllerConfig.cpp | 7 + src/core/FileLoader.cpp | 12 +- src/core/Frontend.cpp | 24 +- src/core/Frontend.h | 7 + src/core/Game.cpp | 2 +- src/core/IniFile.cpp | 8 +- src/core/MenuScreensCustom.cpp | 12 +- src/core/Pad.cpp | 17 +- src/core/PlayerInfo.cpp | 4 +- src/core/Streaming.cpp | 21 +- src/core/Timer.cpp | 2 + src/core/Timer.h | 5 + src/core/ZoneCull.cpp | 4 + src/core/common.h | 8 +- src/core/config.h | 59 +- src/core/main.cpp | 28 +- src/core/re3.cpp | 2 +- src/core/timebars.cpp | 13 +- src/math/Matrix.h | 5 +- src/peds/Ped.cpp | 6 +- src/peds/PedAI.cpp | 6 +- src/renderer/2dEffect.h | 9 +- src/renderer/Font.cpp | 8 +- src/renderer/MBlur.cpp | 5 + src/renderer/Particle.cpp | 13 +- src/renderer/Renderer.cpp | 2 +- src/renderer/Rubbish.h | 2 +- src/renderer/Shadows.h | 6 +- src/renderer/SpecialFX.cpp | 8 +- src/renderer/Sprite2d.cpp | 2 +- src/renderer/Sprite2d.h | 2 +- src/renderer/WaterLevel.cpp | 15 +- src/renderer/Weather.h | 4 +- src/rw/TexRead.cpp | 101 ++- src/skel/crossplatform.cpp | 164 +---- src/skel/crossplatform.h | 8 + src/skel/platform.h | 2 +- src/skel/skeleton.cpp | 2 +- src/skel/skeleton.h | 2 +- src/skel/symbian/symbian.cpp | 586 ++++++++++++++++++ vendor/librw/rw.h | 2 + vendor/librw/skeleton/imgui/imgui.h | 4 + vendor/librw/src/assert.cpp | 9 + vendor/librw/src/base.cpp | 5 +- vendor/librw/src/engine.cpp | 9 +- vendor/librw/src/fcaseopen.h | 8 + vendor/librw/src/gl/gl3device.cpp | 210 ++++++- vendor/librw/src/gl/gl3immed.cpp | 177 +++--- vendor/librw/src/gl/gl3matfx.cpp | 48 +- vendor/librw/src/gl/gl3raster.cpp | 214 ++++--- vendor/librw/src/gl/gl3render.cpp | 30 +- vendor/librw/src/gl/gl3shader.cpp | 4 +- vendor/librw/src/gl/gl3skin.cpp | 71 +-- vendor/librw/src/gl/rwgl3.h | 17 +- vendor/librw/src/gl/rwgl3impl.h | 7 + vendor/librw/src/gl/shaders/Makefile | 21 +- vendor/librw/src/gl/shaders/default.vert | 9 +- vendor/librw/src/gl/shaders/default_vs_gl.inc | 9 +- vendor/librw/src/gl/shaders/header.vert | 4 +- vendor/librw/src/gl/shaders/header_vs.inc | 4 +- vendor/librw/src/gl/shaders/im2d.vert | 9 +- vendor/librw/src/gl/shaders/im2d_gl.inc | 9 +- vendor/librw/src/gl/shaders/im3d.vert | 12 +- vendor/librw/src/gl/shaders/im3d_gl.inc | 12 +- vendor/librw/src/gl/shaders/matfx_env.frag | 9 +- vendor/librw/src/gl/shaders/matfx_env.vert | 9 +- vendor/librw/src/gl/shaders/matfx_gl.inc | 18 +- vendor/librw/src/gl/shaders/simple.frag | 7 +- vendor/librw/src/gl/shaders/simple_fs_gl.inc | 7 +- vendor/librw/src/gl/shaders/skin.vert | 43 +- vendor/librw/src/gl/shaders/skin_gl.inc | 43 +- vendor/librw/src/gl/wdgl.cpp | 11 +- vendor/librw/src/image.cpp | 5 +- vendor/librw/src/raster.cpp | 24 +- vendor/librw/src/rwanim.h | 2 + vendor/librw/src/rwbase.h | 6 + vendor/librw/src/rwcharset.h | 2 + vendor/librw/src/rwengine.h | 2 + vendor/librw/src/rwerror.h | 2 + vendor/librw/src/rwobjects.h | 2 + vendor/librw/src/rwpipeline.h | 2 + vendor/librw/src/rwplg.h | 2 + vendor/librw/src/rwplugins.h | 2 + vendor/librw/src/rwrender.h | 2 + vendor/librw/src/rwuserdata.h | 2 + vendor/librw/src/world.cpp | 2 +- 106 files changed, 2098 insertions(+), 745 deletions(-) create mode 100644 README.md create mode 100644 TODO.md create mode 100644 group/Icons_scalable_dc.mk create mode 100644 group/bld.inf create mode 100644 group/common.mmh create mode 100644 group/librw.mmp create mode 100644 group/qgn_menu_re3.svg create mode 100644 group/re3.mmp create mode 100644 group/re3.rss create mode 100644 group/re3_reg.rss create mode 100644 group/shaders.mk delete mode 100644 res/images/logo.svg delete mode 100644 res/images/logo_1024.png delete mode 100644 res/images/logo_256.jpg create mode 100644 sis/re3.pkg create mode 100644 src/skel/symbian/symbian.cpp create mode 100644 vendor/librw/src/assert.cpp create mode 100644 vendor/librw/src/fcaseopen.h 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 @@ - - - - - - - - image/svg+xml - - - - - - - - - - - - - diff --git a/res/images/logo_1024.png b/res/images/logo_1024.png deleted file mode 100644 index 50ae869051b2b808a05f999863c722cfff527a9c..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 24295 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 N^`5SNF6*2UngBw-Pj3JK diff --git a/res/images/logo_256.jpg b/res/images/logo_256.jpg deleted file mode 100644 index 595d2c3b8d03cbaf72a213c73f84fa02f2b157cc..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 18096 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 n0L%=}BjvI1_J5yy|65!A@6i0O?)NvR`` #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;