Compare commits

...
180 Commits
Author SHA1 Message Date
Gustaf Alhäll 89cecb88f5 Update license info 2025-12-06 19:45:35 +01:00
Gustaf Alhäll baf5c8d66b Fix music looping on digital 2025-12-06 19:45:32 +01:00
Gustaf Alhäll 72000c4546 Fix memory leak in AATree string trees 2025-12-06 19:45:29 +01:00
Gustaf Alhäll 82b774b2c3 Fix use-after-free when mobj is removed while still playing sounds 2025-12-06 19:45:27 +01:00
Gustaf Alhäll 3818b9ad1a Limit audio channels to 2 2025-12-05 00:22:09 +01:00
Alug ca8e811bd9 sdl_sound: attempt to fix sounds cutting off
i suck at explaining so just trust. :chonkbuncle:
Game sound handling has no idea which sound it is playing/checking, so a sound that ended frees its slot and it might get occupied again without the game knowing
so just encode the channel number into the sound so we can actually check
2025-12-04 17:52:38 +01:00
Alug 97ca034037 sdl_sound: handle explicit float conversions 2025-12-04 17:52:35 +01:00
Alug ac46f7ed00 add missing Fluidsynth ifdefs 2025-12-04 17:52:32 +01:00
Gustaf Alhäll 0afed59329 Fix MIDI music looping 2025-12-04 17:52:30 +01:00
Gustaf Alhäll ec3a1fee70 Tweak audio settings 2025-12-04 17:52:25 +01:00
Alug 5e8c0c3806 Add chorus and reverb settings to MIDI 2025-12-04 17:52:22 +01:00
Gustaf Alhäll 05ea898345 Fix Haiku build 2025-12-04 17:52:11 +01:00
Gustaf Alhäll 0c1fdc0be8 Fine-tune volume settings 2025-12-04 17:52:08 +01:00
Gustaf Alhäll 0e4c72e6f6 Implement MIDI seeking 2025-12-04 17:52:05 +01:00
Alug 29b83903ef delet the bird music resynching stuff
idk who even wants this, its pain, and even more pain to adapt
2025-12-04 17:52:03 +01:00
Alug 1cae09fa11 sdl_audio: use float M_PI for S_CURVE
meant for floats, prevents implicit double conversions
2025-12-04 17:51:59 +01:00
Alug 4a56819bc3 makefile: move openmpt stuff to before sdl stuff
seems to fix linking openmpt without mixer for some reason oh well
2025-12-01 16:49:11 +01:00
Alug 567a48aac3 sdl_sound: fix -Wmaybe-uninitialized warning 2025-12-01 16:49:08 +01:00
Alug d100401c5f this shouldnt be in sourcefile oops 2025-12-01 16:49:05 +01:00
Alug 6dee9fa561 add back "nearest" resampling from mixer
sdls own resampler uses linear interpolation, which sounds super muffled to me
some may like this, but i dont want to change how the game "sounds"
2025-12-01 16:49:01 +01:00
Alug 5bd7a09d9f force 44100khz sample rate
sounds better to me honestly
2025-12-01 16:48:56 +01:00
Alug 47477c2d03 make gme and tracker music slightly louder
prob needs some adjustment, but both were always quite quiet
2025-12-01 16:48:53 +01:00
Alug cd128a1084 lock audio stream in I_PlaySong
seems to fix weird crashes with gme
2025-12-01 16:48:49 +01:00
Alug 34f2afa3d9 add "audiobuffersize" handling
uses the SDL_AUDIO_DEVICE_SAMPLE_FRAMES hint
2025-12-01 16:48:46 +01:00
Alug 22f285edec disable sound precache for sdl sound 2025-12-01 16:48:43 +01:00
Alug 592abdef96 pitch is a float 2025-12-01 16:48:40 +01:00
Alug a27eee8e2f add few missing audiostream unlocks 2025-12-01 16:48:37 +01:00
Alug 904019d24b fix startup playing a super loud bit of music 2025-12-01 16:48:32 +01:00
Alug c6ca5a6f0f i_video: few type fixes for sdl3 2025-12-01 16:48:29 +01:00
Alug 2392f0484c remove hwr_shutdown call
honestly this didnt help with the issue i had, game should already release all the memory on quit anyways.
this just makes it take longer to quit
2025-12-01 16:48:26 +01:00
Alug 986a131a36 fix a few warnings 2025-12-01 16:48:23 +01:00
Alug e9685ef3e8 port srb2classics sdl audio system
still needs a little work reimplementing everything we got

from: https://codeberg.org/srb2classic/srb2classic/pulls/177
2025-12-01 16:48:18 +01:00
Alug 59f194cb9d fuckit SDL3 2025-12-01 16:48:15 +01:00
Alug 99d5590435 Merge branch 'Saturn-Next' into Saturn-Testing 2025-11-30 19:34:36 +01:00
Alug 22a6be76b5 OpenGL: fix frustum culling not accounting for spritescales
also rename "this_scale" to "thing_scale" to be more descriptive

Fixes the comically large tree disappearing when it shouldnt on "Ethereal Crystal"
2025-11-30 14:47:02 +01:00
Alug d3d25df3c5 hw_main: cleanup HWR_RenderX stuff a bit 2025-11-30 14:46:30 +01:00
Alug 2a3f9e9ee6 hw_cache:rename some stuff
more in line with the rest of the code
2025-11-30 14:45:37 +01:00
Alug 31f01fd5da Revert "Provide our own SDL2 dll files"
This reverts commit 91530c61ad.

i hate windows, i hate sdl breaking with every single update
2025-11-30 14:37:00 +01:00
indev bb9a4a0da0 Add listemotes command, also fix few emote warnings not printing newlines 2025-11-30 00:36:36 +03:00
Alug 3bac722562 m_menu: cleanup gamepad menu stuff a little 2025-11-29 19:13:12 +01:00
Alug 3769ab74ac m_menu: move onchages back to m_menu, get rid of nextmap onchange hack 2025-11-29 19:07:01 +01:00
Alug c3d6cdd272 ensure modelMatrix is initialized 2025-11-29 14:26:08 +01:00
Alug 093602fd6b comment out unused dynslope member from levelinterpolator_t struct
this wont ever work with our thinkerless dynslopes
2025-11-29 14:26:05 +01:00
Alug 9b2cfe51d6 Merge branch 'Saturn-Next' into Saturn-Testing 2025-11-28 18:24:07 +01:00
James R a80d119c58 Rename strcasestr to nongnu_strcasestr, macro strcasestr ifndef _GNU_SOURCE
Fix for GCC C++ compiler, which always defines _GNU_SOURCE.
2025-11-28 18:23:25 +01:00
Alug 66619f42f9 Merge branch 'Saturn-Next' into Saturn-Testing 2025-11-28 18:07:35 +01:00
Alug 1cdc92a62b HWR_Precache: lookup for flats that already have been precached
yes i used c++ unordered_set here, yes i suck with linked lists, lol
maybe speeds this process up a little
2025-11-28 18:07:21 +01:00
Alug 6b8de308b7 HWR_Precache: check against gl_numtextures not numtextures
in practice those should mostly be the same but the variable is for gl so
2025-11-28 16:53:12 +01:00
Alug 310e64d8be OpenGL: add a little more checks during texture free
prob not necessary but feels better
2025-11-28 16:53:10 +01:00
Alug 890677e2b5 Merge branch 'Saturn-Next' into Saturn-Testing 2025-11-27 23:33:28 +01:00
Alug d2d3afc7f4 software: clip sprites that are out of view
similar to what the frustum cull does in opengl, clips sprites that are out of view in vertical direction
2025-11-27 22:53:12 +01:00
Alug c26d2faee9 OpenGL: fixup spherefrustum culling and use it for sprites
clips sprites that are out of our view, especially with precip this may lead to significant speedup in certain cases
huge thanks to indev for helping with this <3
huge thanks to dsda-doom for the maths needed!
2025-11-27 22:53:12 +01:00
Alug 1c82c338a5 sprite gzt is float in opengl render........ 2025-11-27 18:57:21 +01:00
Alug c81cd48552 R_ProjectSprite: move fakeflat clipping before light maths
so if applicable we have slightly less work
2025-11-27 17:43:40 +01:00
Alug 306f7d455e tiny optimizations k_kart 2025-11-27 17:43:36 +01:00
indev dc40befa88 Use I_GetTime for animated emotes, so anim argument in M_DrawEmote is not needed 2025-11-27 18:49:43 +03:00
Alug 2222272d6f remove more unused/uneeded things
- delet hw_dll
- remove sector_t ceilspeed and floorspeed
- remove a bunch of stuff from viewvars_s
2025-11-27 16:49:50 +01:00
Alug 1849d5aade R_ProjectSprite: make sprite clipping work with sloped fake floors/ceilings
from eternity engine
2025-11-27 16:49:47 +01:00
Alug 3878c2f72a DoAddLine: add fast check for lines with same front and back sectors without middle tex
taken from dsda-doom
2025-11-27 16:49:44 +01:00
Alug 7cf3bceaff HWR_Subsector: avoid calling HWR_AddSprites on already processed sectors 2025-11-27 16:49:41 +01:00
Alug 1e394b0530 pass frontsector ceiling z to R_Prep3DFloors
in both cases "R_Subsector" already got the frontsectors ceiling z, so no need to get it again within R_Prep3DFloors
should save some P_GetSectorCeilingZAt per frame
2025-11-27 16:49:38 +01:00
Alug b09660204a r_bsp: move polyobj renderside check into R_AddPolyObjects
uneeded within R_AddLine as outside R_AddPolyObjects this will never be called if currecnt seg is a polyseg
2025-11-27 16:49:35 +01:00
indev 7b4592377e Make emote search case insensetive (emotes themself still are case sensetive) 2025-11-27 18:40:52 +03:00
indev 45ba69a45a Discordify emotes a bit more :chonkbunckle:
- When autocompleting emote with enter, don't send it immediately
- Don't autocomplete after typing 1 character after : (allows text emotes like ":c")
2025-11-26 22:56:04 +03:00
indev 4d9c345202 Add support for emotes in console chat mode (and support for emotes in console in general) 2025-11-26 22:45:03 +03:00
Alug 1105526eb1 fix perfstats freaking out 2025-11-26 10:10:14 +01:00
Alug d963df36f1 Merge branch 'Saturn-Next' into Saturn-Testing 2025-11-26 10:10:12 +01:00
Alug 0437952027 mark checkcoord as const 2025-11-26 10:09:55 +01:00
Alug d188839d0b move R_QuickCamDist to r_main
also mark it with PUREFUNC and R_QuickDist with FUNCMATH, so compiler may optimze it more agressively
2025-11-26 10:09:52 +01:00
Alug 86ac11f877 replace localangle assignments with P_ForceLocalAngle
just a little neater, there also was a function to force the player angle, but this most likely wouldve changed behavior
2025-11-25 22:53:30 +01:00
Alug 0f59e0e270 some mobj interp fixes
copy pasted from RR thx
2025-11-25 22:53:27 +01:00
Alug cd32270ec0 . W
:mompie:
2025-11-25 20:25:29 +01:00
Alug f2a7f9ccaa fix compile with HAVE_DISCORDRPC 2025-11-25 20:21:23 +01:00
Alug 846967cb91 fix compile with HAVE_DISCORDRPC 2025-11-25 20:21:15 +01:00
Alug 6c8862ee4b Merge branch 'Saturn-Next' into Saturn-Testing 2025-11-25 20:16:18 +01:00
Alug 2c2ffe36d7 init a few more globals that were missed
i love globals that are in the middle of files.....
2025-11-25 20:15:27 +01:00
Alug 951b880acb d_netcmd: use cleanup macro for map and localskin command
did Command_Map_f really leak memory all the time? lul
2025-11-25 19:19:19 +01:00
Alug ecfa973e6b move M_ResetDemoList hack to G_InitNew 2025-11-25 19:19:17 +01:00
Alug 749b87b4ca bring back addon name scroll that was lost
oopsie
2025-11-25 17:46:58 +01:00
Alug 7f671e4e30 clean and fixup addon menu
Hopefully should finally fix addons not showing as loaded sometimes and other issues with warning windows being unclosable, etc

lets pray this doesent cause any issues....

add a tickroutine for menus aswell, which will be called in M_Ticker

courtesy of Ring Racers
https://gitlab.com/kart-krew-dev/ring-racers/-/commit/bc9f9d740a0262c249917a37e250ef0209185b12
https://gitlab.com/kart-krew-dev/ring-racers/-/commit/8312f12d6cae934ae8de7e46da231c311f4b4fde
https://gitlab.com/kart-krew-dev/ring-racers/-/commit/6e671d4894e56cd3af09d6e9af2635f030817361
2025-11-25 17:42:01 +01:00
indev ee0e4836f5 Fix race condition in server list search 2025-11-25 19:06:02 +03:00
Alug a01cd628ab do some more cleanup when shutting down graphics system
make sure we free all our opengl allocated stuff by calling HWR_Shutdown
make sure we also destroy our sdl texture, renderer and window if the exist
2025-11-25 16:38:19 +01:00
Alug 4a4e668d21 delet more unused/empty sdl stuff
I_WaitVBL, I_BeginRead and I_EndReada
2025-11-25 16:38:16 +01:00
Alug 03c579769c delet some duped declarations 2025-11-25 13:15:53 +01:00
Alug 2e88b6a1dd fix portal contents being culled erroneously also in software
also dont rember commenting those out in gl lul
2025-11-25 02:18:23 +01:00
Alug a49ea4defd Merge branch 'Saturn-Next' into Saturn-Testing 2025-11-24 22:43:26 +01:00
Alug 5265b147f5 HWR_BlendMidtextureSurface: add extra guard to check linedef alpha 2025-11-24 22:42:53 +01:00
Alug b4a37a2fa4 fix performance regression in certain cases due to changed polygon order
wonky, needs testing as this may slow down other parts
2025-11-24 22:42:50 +01:00
Alug 93eb2b336d Dedicated: dont create or destroy ANY lua hud drawlist
not needed at all in dedi
2025-11-24 21:32:26 +01:00
Alug 30acdca9d3 cache SRB2BACK patch on startup
this is used in a bunch of places while being pretty small, so just cache it on start
2025-11-24 21:26:07 +01:00
Alug 677b34c174 dont free PU_PATCH_LOWPRIORITY patches in render_none
also dont cache them either!
simply not needed at all
so save us a little work
2025-11-24 21:16:17 +01:00
Alug 3c776b321d Optimize: move a few strlen calls out of loops
when applicable and the input does not get modified within the loop
needs some testing incase i oversaw something
2025-11-24 20:52:03 +01:00
Alug 1ed9bfc9b4 Merge branch 'vidmodestuff' into Saturn-Testing 2025-11-24 20:50:04 +01:00
Alug a05413d925 fix erronous "Could not set custom resolution" warning on startup
the cvars may have not been initialised yet to anything
just return -2 and ignore
2025-11-24 20:49:45 +01:00
Alug fa9637fba4 Merge branch 'Saturn-Next' into Saturn-Testing 2025-11-24 18:29:05 +01:00
Alug b3be7bcedc Player Infoscreen: if availible, display player names in their skincolor
we hijack the playerinfo data field for this, and pray to the kart gods this is unused on the ms
2025-11-24 18:20:00 +01:00
Alug 19c10be76b R_QuickCamDist & R_QuickDist: turn into function and make it fixed point
since we mostly use it in fixed point maths, this just makes alot more sense
moving it into inline functions ensures that in C code this wont evaluate its arguments multiple times
2025-11-24 17:44:20 +01:00
Alug 60222f2f00 R_AllocateTextures: remove "reallocuser"
this just does... what Z_Realloc does anyways...
Z_Realloc already zeroes out the new memory it allocates
2025-11-24 17:44:16 +01:00
Alug 34edd0a2e3 some misc cleanups
also account for a few more double evluations from min/max macros
and save a few angle to fixed conversions in spb handling
2025-11-24 17:44:13 +01:00
Alug 46b485df14 Server Infoscreen: Show server kart speed instead of "Cheats"
effectively almost all servers will get flagges as having cheats enabled, so instead show the game speed
2025-11-24 16:57:50 +01:00
Alug 8d3632caca ensure all our savebuffers are initialized
just some safety
2025-11-24 03:16:50 +01:00
Alug b5ae9ba733 remove erronous P_RunDynamicSlopes call in P_PreTicker
we dont run preticker when we netjoin so.....
2025-11-24 01:03:44 +01:00
Alug 7f50a09bcd Merge branch 'Saturn-Next' into Saturn-Testing 2025-11-24 00:35:31 +01:00
Alug 2a823ecd60 move K_KartPlayerHUDUpdate to k_hud
how tf did i miss that lul
2025-11-24 00:35:25 +01:00
Alug 940327210f p_setup: move interpolator reset into P_FreeLevelState 2025-11-24 00:35:23 +01:00
Alug e25191d7df Merge branch 'Saturn-Next' into Saturn-Testing 2025-11-24 00:30:49 +01:00
Alug 20a08df1e1 K_PlayerEffectsShouldBlend: also apply when player has invulnerability 2025-11-24 00:30:28 +01:00
Alug 4cf27d40e9 apply additive blending to ghosts aswell when using "playerblendeffects"
same conditions as the others
either be in sneakerboost, or go fast enough
2025-11-24 00:28:31 +01:00
Alug d18c9a257a remove erronous ";" 2025-11-24 00:15:59 +01:00
Alug f4d8a903e8 Merge branch 'vidmodestuff' into Saturn-Testing 2025-11-23 23:21:54 +01:00
Alug 8a8cbffd12 I_CheckDesktopRes: use SDL_GetCurrentDisplayMode
instead of SDL_GetDesktopDisplayMode, as the former only returns the display mode from when the window was created, which might not reflect the actual current desktop mode.
Maybe fixes some resolutions being incorrectly reported asa having visual issues
2025-11-23 23:21:47 +01:00
Alug 0adf356325 HACK: abuse batching system for sprites and drawnodes
use batching system without sorting for order sensitive things like sprites and transparent stuff
even despite not being "optimally" sorted, drawing them in one go, instead of directly still gives a nice speed increase in certain cases (on my ryzen 5600 i get around 120fps+ on teiai towers starting area!)
2025-11-23 23:08:09 +01:00
Alug 0fef290858 Merge branch 'Saturn-Next' into Saturn-Testing 2025-11-23 22:52:10 +01:00
Alug 65dc5bb1fd dont free our titlescreen patches
ever...
Fixes a crash when you take ages on server join and timeout due to it.
2025-11-23 22:31:29 +01:00
Alug e18be33c91 F_IntroDrawer: remove "highres" variable
this was ALWAYS true anyways
2025-11-23 22:02:01 +01:00
Alug 9ad6751719 make Controller Rumble strength user changable
range from 0.25 to 4
to account for all types of controllers and such
base 1 was set around what felt good on my dualsense, not entirely sure if this is the best baseline to go with
otherwise it could still be adjusted
2025-11-23 18:49:40 +01:00
Alug 86ab994408 G_DeviceRumbleTick: get rid of magic numbers
use named constants instead
2025-11-23 18:01:30 +01:00
Alug 21f0d603c3 move gamepad led and rumble tickers into g_input
not entirely sure why i placed them in d_main and p_tick respectively
but they should be here
thx neppy for making me question this lul
2025-11-23 17:59:51 +01:00
Alug 971513e7d3 HWR_BlendMidtextureSurface: fix major performance regression
big oopsie from my side
this caused textures that werent translucent to be marked with translucent in a bunch of cases, which led to them being rendered in a slower path
2025-11-23 15:47:03 +01:00
indev 03929e551f emotes: change autocompletion behavior to work like console 2025-11-23 01:31:38 +03:00
Alug db5ae247b6 LoadMobjThinker: revert faulty local player check 2025-11-22 21:54:54 +01:00
Alug d46beab34e fix signed integer overflow in polygon hash calculation
also gives a speedup on some maps lul
2025-11-22 21:47:45 +01:00
Alug 2516873ba1 fix signed integer overflow in polygon hash calculation
also gives a speedup on some maps lul
2025-11-22 18:55:30 +01:00
Alug c650394c31 Merge branch 'Saturn-Next' into Saturn-Testing 2025-11-22 18:13:54 +01:00
Alug 9a794232d7 HWR_ProcessSeg: fix cliphigh overflow 2025-11-21 19:51:00 +01:00
Alug db635e5c5b K_GetScreenCoords: fix signed overflow
why even cast that to signed......
2025-11-21 19:41:46 +01:00
indev 8a105a9679 If there is only 1 emote suggestion and user presses enter, autocomplete emote 2025-11-21 20:39:33 +03:00
indev 46b968a351 Fix autocomplete messing up emote in few cases 2025-11-21 20:34:34 +03:00
indev a9836307b2 Allow suggesting emotes if currently typed part matches inside emote, not only at beginning 2025-11-21 20:16:19 +03:00
Alug b6515bb0ae fix Wimplicit-const-int-float-conversion warning 2025-11-21 15:16:39 +01:00
Alug b8257e9037 fix memoryleak when searching for iwads
I_LocateWad returns mallocd memory that needs to be freed
and our home search does not need a tmp ptr
just do as we did before and sprintf it into returnwadpath
also check home directory before the hardcoded lists like before (might speed up startup a little on nix)
also cleanup iwad search in dedi builds and apply everything there aswell
2025-11-21 14:47:13 +01:00
Alug 1fb6c63097 fix dedi compile 2025-11-21 14:45:44 +01:00
Alug e95382075c Merge branch 'Saturn-Next' into Saturn-Testing 2025-11-21 00:00:29 +01:00
Alug 416a2565f9 hw_batching: use polygon hash signbit to detect skywalls/horizonlines
in comparepolygons
gives a nice little performance bump of around 10-15fps in heavy cases
2025-11-20 17:52:14 +01:00
Alug fa75ad4cdd r_opengl: smol micro optimizations
not much, mostly just avoiding redoing things
2025-11-20 17:52:10 +01:00
Alug cedddaadfc r_opengl: delet byte2float lookup
just do direct division
no performance difference at all, but gets rid of that huge ass table
2025-11-20 17:52:07 +01:00
Alug 43ec517cdd small fixes for gamepad indicator led stuff
- skincolors are uint8 type not uint16
- ensure desired colour is within skincolor range
- rename G_GetSkinColor to G_GetSkinColorForGamepad
- replace pointless array with single variable for current color in D_DeviceLEDTick
- remove pointless call to G_GetSkinColorForGamepad when hotplugging gamepads (G_SetPlayerGamepadIndicatorColor will call it itself when 0/skincolor_none is passed)
2025-11-19 23:38:29 +01:00
Alug 495ad5ce06 move this back oop 2025-11-19 22:44:38 +01:00
indev 31ce643311 Check if mobj was actually spawned before setting islocal 2025-11-19 22:07:55 +03:00
Alug 2d9776d792 OpenGL: keep around our drawnodes memory
no need to constantly reallocate new memory
we dont have renderer switch, and the next level will render drawnodes anyways
those wont grow super big also, so theres no big worry about wasting tons of memory
yes i like ceepeepee vectors, how can you tell
2025-11-19 19:27:36 +01:00
Alug 7fa3d119e8 Merge branch 'Saturn-Next' into Saturn-Testing 2025-11-19 19:26:41 +01:00
Alug b5c1f21ac1 mark all batching variables with static
they are only used within this file, no need to advertise them as global
2025-11-19 18:13:32 +01:00
Alug 86c1b2cbef simplify the vector buffer stuff
honestly doesent make that much sense in most cases to grow capacity * 2 (slightly misunderstood some stuff on implementation)
and in other cases dont need to manually check for resize
2025-11-19 18:12:20 +01:00
Alug ad828b8f4b reduce scope of some fps counter vars 2025-11-19 00:26:07 +01:00
Alug 5dda681c8a clean up some more render float maths
- dont use M_PIl in double or float maths
- dont use M_PI in float maths (use M_PIf)
- use tanf instead of tan
2025-11-19 00:26:03 +01:00
Alug 92df8ffe01 remove thread.h include, use "thread_local" for everything
we enforce c++ 17, thread_local is a c++11 extension, so this should work everywhere
2025-11-18 22:38:37 +01:00
Alug 2ee8dc09d1 fix opengl portals (and its contents) being culled in some cases they shouldnt be
we do culling per our viewmatrix since a while, which wasnt properly set up for portals beforehand and used whatever was last which was then incorrectly applied to portal culling :chaobaba:
2025-11-18 22:38:32 +01:00
Alug b8f9392efd delet I_UpdateNoBlit
this didnt do anything anymore
2025-11-18 22:38:30 +01:00
Alug e65741acaa Merge branch 'Saturn-Next' into Saturn-Testing 2025-11-18 16:33:38 +01:00
Alug b36ab31a56 Merge remote-tracking branch 'origin/vidmodestuff' into Saturn-Testing 2025-11-18 16:33:35 +01:00
Alug 99f1166eb1 p_mobj: check for common mobjs first
players first, then kart items, shadows and then some srb2 things that are commonly used
makes more sense to check for all of those first everywhere, so we may skip a crapton of pointless checks in many cases
2025-11-18 16:23:27 +01:00
Alug a335da3473 Merge branch 'Saturn-Next' into Saturn-Testing 2025-11-18 16:21:05 +01:00
indev 7ab8bf1bbf Emotes: only print 'too many frames' warning if we actually get non-empty frame 2025-11-18 12:20:33 +03:00
Alug c312380944 check if our desired screen res already is in the videomode list
before deciding to rebuild the whole list when changing the resolution cvars
2025-11-18 05:22:50 +01:00
Alug b5bb2b42bf I_FillScreenResolutionsList: shrink list if it is too large
we check against MAXMODEDESCS, which is the maximum of modes the videomode can list
just in case we really get a display with a fuckton of resolutions, which most likely wont ever be the case though
this just removes the smallest modes from the list (accounting for the canonicals), to keep things simple
2025-11-18 04:55:50 +01:00
Alug d074f375ca M_VideoModeMenu: make sure red marked modes take precedence 2025-11-18 04:55:45 +01:00
Alug 6fd14f0a80 M_VideoModeMenu: remove old video mode dupe check 2025-11-18 04:55:41 +01:00
Alug d6bbb2c1b3 use static buffer for windowedModes names
no need to worry about memory management here :chaosleep:
2025-11-18 04:55:36 +01:00
Alug fa66b87965 cmp_resolutions: compare by numbers directly
instead by comparing it with strings
2025-11-18 04:55:30 +01:00
Alug c59d5db03e Merge remote-tracking branch 'origin/Saturn-Next' into vidmodestuff 2025-11-18 04:55:22 +01:00
Alug a994d7c050 G_DoPlayDemo: fix maybe unitialized warning
in this case this wouldve been fine, tho variables using the cleanup macro should always be initzialized for safety
2025-11-17 21:59:21 +01:00
Alug d2f3d5aa4d anew the testing branch
wiped it out completely
2025-11-17 20:26:49 +01:00
Alug 913b8878d8 Optimize: Use doomednum lookup also when (re)spawning mapthings
not just for loading savegame thinkers
Actually even provides slight runtime performance improvement, but mostly makes levelload faster
2025-11-17 20:26:07 +01:00
Alug f02b9f953e Merge branch 'vidmodestuff' into Saturn-Testing 2025-11-17 20:25:49 +01:00
Alug e46d548080 testing test 2025-11-17 20:23:58 +01:00
Alug 3a7108ecfa Merge branch 'Saturn' into Saturn-Next 2025-11-17 20:23:23 +01:00
Alug b6edc90553 mark resolutions listed above the current dektop resolution in red
as they lead to visual errors in openglmode without fbo support
2025-11-09 22:20:57 +01:00
Alug 23735121ff raise MAXWINMODES to 128
YES WINDOWS THANKS VERY MUCH SUPER COOL OF YOU
2025-11-09 20:40:03 +01:00
Alug 20950b698f make sure the default 320x200 mode exists 2025-11-09 20:39:58 +01:00
Alug 44df85d6a4 reduce the scope of this 2025-11-09 20:41:24 +01:00
Alug 42d53f1f6f Merge branch 'Saturn-Next' into vidmodestuff 2025-11-09 20:36:00 +01:00
Alug 48f2d0ff83 make sure our custom res fits within MAXVIDMODES
33 are alot so this probably will never be the case (i hope)
2025-11-09 20:21:30 +01:00
Alug 517723f9c1 handle custom res differently + make VID_NumModes return actual vidmodes
custom resolutions now will be put into the resolution list
which means they are selectable from the menu
2025-11-09 20:16:44 +01:00
Alug 6915077e0f refresh the video menu list if our resolution list changes
if you move the gamewindow to a different display, the video menu will now upadate to the new resolutions
2025-11-09 19:16:36 +01:00
Alug 406dbf333d use a video_mode_t thing for our custom resolution
perhaps we may merge it into windowedmodes? not sure
but this works for now
2025-11-09 19:13:38 +01:00
Alug a730dfd212 fix checking for if display changed 2025-11-09 19:13:35 +01:00
Alug 3058d365f3 no need to call I_FillScreenResolutionsList everywhere
its fine after startup, and when we move our window
2025-11-09 19:13:31 +01:00
Alug ccc453e0b0 fix windowmoved never resetting 2025-11-09 19:13:28 +01:00
Alug c3d02090e4 WIP: remove hardcoded resolutions
much thanks dsda-doom for most of the code for this
TODO:
- resolution menu needs to refresh if the list changes
- clean up
- handle custom resolutions more sane
- figure out the best maximum resolution list size the menu can display
2025-11-09 19:13:25 +01:00
Alug 20cd7621c3 delet numVidModes
wasnt doing anything
2025-11-09 19:13:22 +01:00
111 changed files with 6164 additions and 3990 deletions

No files matched your search

+10 -6
View File
@@ -972,6 +972,14 @@ Public License instead of this License. But first, please read
Copyright (C) 1995-2018 Free Software Foundation, Inc.
https://www.gnu.org/software/gettext/
- FluidSynth
Copyright (C) 2000-2025 Peter Hanappe and others.
https://www.fluidsynth.org/
- libsndfile
Copyright (C) 1999-2016 Erik de Castro Lopo
https://libsndfile.github.io/libsndfile/
- mpg123
Copyright (c) 1995-2013 by Michael Hipp and others,
free software under the terms of the LGPL v2.1
@@ -1699,12 +1707,8 @@ SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
zlib License
applies to:
- Simple DirectMedia Layer
Copyright (C) 1997-2018 Sam Lantinga <slouken@libsdl.org>
https://www.libsdl.org/hg.php
- SDL_mixer: An audio mixer library based on the SDL library
Copyright (C) 1997-2018 Sam Lantinga <slouken@libsdl.org>
https://www.libsdl.org/projects/SDL_mixer/
Copyright (C) 1997-2025 Sam Lantinga <slouken@libsdl.org>
https://libsdl.org/
- zlib
Copyright (C) 1995-2017 Jean-loup Gailly and Mark Adler
+41
View File
@@ -0,0 +1,41 @@
# Find FluidSynth
# Once done, this will define
#
# FLUIDSYNTH_FOUND - system has FluidSynth
# FLUIDSYNTH_INCLUDE_DIRS - FluidSynth include directories
# FLUIDSYNTH_LIBRARIES - link libraries
include(LibFindMacros)
libfind_pkg_check_modules(FLUIDSYNTH_PKGCONF FLUIDSYNTH)
# includes
find_path(FLUIDSYNTH_INCLUDE_DIR
NAMES fluidsynth.h
PATHS
${FLUIDSYNTH_PKGCONF_INCLUDE_DIRS}
)
# library
find_library(FLUIDSYNTH_LIBRARY
NAMES fluidsynth
PATHS
${FLUIDSYNTH_PKGCONF_LIBRARY_DIRS}
"/usr/lib"
"/usr/local/lib"
)
# set include dir variables
set(FLUIDSYNTH_PROCESS_INCLUDES FLUIDSYNTH_INCLUDE_DIR)
set(FLUIDSYNTH_PROCESS_LIBS FLUIDSYNTH_LIBRARY)
libfind_process(FLUIDSYNTH)
if(FLUIDSYNTH_FOUND AND NOT TARGET FluidSynth::libfluidsynth)
add_library(FluidSynth::libfluidsynth UNKNOWN IMPORTED)
set_target_properties(
FluidSynth::libfluidsynth
PROPERTIES
IMPORTED_LOCATION "${FLUIDSYNTH_LIBRARY}"
INTERFACE_INCLUDE_DIRECTORIES "${FLUIDSYNTH_INCLUDE_DIR}"
)
endif()
+15 -20
View File
@@ -1,20 +1,15 @@
# SDL Development Libaries
Download both the VC and MinGW packages and extract them here.
https://www.libsdl.org/download-2.0.php
## VC Package
* include
* lib
## MinGW Package
* i686-w64-mingw32
* x86_64-w64-mingw32
# SRB2Kart Saturn note:
Due to a good amount of issues with newer SDL releases, we decided to ship our own Version of the library.
This version is just the 2.28.5 release with a fix backported for non US keyboard layouts that prevented the right ALT GR key from working properly.
It can be found under: https://github.com/alufolie91/SDL/tree/backportaltgrfix
# SDL Development Libaries
Download both the VC and MinGW packages and extract them here.
https://www.libsdl.org/download-2.0.php
## VC Package
* include
* lib
## MinGW Package
* i686-w64-mingw32
* x86_64-w64-mingw32
Binary file not shown.
+65 -65
View File
@@ -1,65 +1,65 @@
#!/bin/sh
# Get the canonical path of the folder containing this script
bindir=$(cd -P -- "$(dirname -- "$0")" && printf '%s\n' "$(pwd -P)")
# Calculate the canonical path of the prefix, relative to the folder of this script
prefix=$(cd -P -- "$bindir/.." && printf '%s\n' "$(pwd -P)")
exec_prefix=${prefix}
exec_prefix_set=no
libdir=${exec_prefix}/lib
#usage="\
#Usage: $0 [--prefix[=DIR]] [--exec-prefix[=DIR]] [--version] [--cflags] [--libs]"
usage="\
Usage: $0 [--prefix[=DIR]] [--exec-prefix[=DIR]] [--version] [--cflags] [--libs] [--static-libs]"
if test $# -eq 0; then
echo "${usage}" 1>&2
exit 1
fi
while test $# -gt 0; do
case "$1" in
-*=*) optarg=`echo "$1" | sed 's/[-_a-zA-Z0-9]*=//'` ;;
*) optarg= ;;
esac
case $1 in
--prefix=*)
prefix=$optarg
if test $exec_prefix_set = no ; then
exec_prefix=$optarg
fi
;;
--prefix)
echo $prefix
;;
--exec-prefix=*)
exec_prefix=$optarg
exec_prefix_set=yes
;;
--exec-prefix)
echo $exec_prefix
;;
--version)
echo 2.28.5
;;
--cflags)
echo -I${prefix}/include/SDL2 -Dmain=SDL_main
;;
--libs)
echo -L${exec_prefix}/lib -lmingw32 -lSDL2main -lSDL2 -mwindows
;;
--static-libs)
# --libs|--static-libs)
sdl_static_libs=$(echo "-lmingw32 -lSDL2main -lSDL2 -mwindows -Wl,--dynamicbase -Wl,--nxcompat -lm -ldinput8 -ldxguid -ldxerr8 -luser32 -lgdi32 -lwinmm -limm32 -lole32 -loleaut32 -lshell32 -lsetupapi -lversion -luuid" | sed -E "s#-lSDL2[ $]#$libdir/libSDL2.a #g")
echo -L${exec_prefix}/lib $sdl_static_libs
;;
*)
echo "${usage}" 1>&2
exit 1
;;
esac
shift
done
#!/bin/sh
# Get the canonical path of the folder containing this script
bindir=$(cd -P -- "$(dirname -- "$0")" && printf '%s\n' "$(pwd -P)")
# Calculate the canonical path of the prefix, relative to the folder of this script
prefix=$(cd -P -- "$bindir/.." && printf '%s\n' "$(pwd -P)")
exec_prefix=${prefix}
exec_prefix_set=no
libdir=${exec_prefix}/lib
#usage="\
#Usage: $0 [--prefix[=DIR]] [--exec-prefix[=DIR]] [--version] [--cflags] [--libs]"
usage="\
Usage: $0 [--prefix[=DIR]] [--exec-prefix[=DIR]] [--version] [--cflags] [--libs] [--static-libs]"
if test $# -eq 0; then
echo "${usage}" 1>&2
exit 1
fi
while test $# -gt 0; do
case "$1" in
-*=*) optarg=`echo "$1" | sed 's/[-_a-zA-Z0-9]*=//'` ;;
*) optarg= ;;
esac
case $1 in
--prefix=*)
prefix=$optarg
if test $exec_prefix_set = no ; then
exec_prefix=$optarg
fi
;;
--prefix)
echo $prefix
;;
--exec-prefix=*)
exec_prefix=$optarg
exec_prefix_set=yes
;;
--exec-prefix)
echo $exec_prefix
;;
--version)
echo 2.28.5
;;
--cflags)
echo -I${prefix}/include/SDL2 -Dmain=SDL_main
;;
--libs)
echo -L${exec_prefix}/lib -lmingw32 -lSDL2main -lSDL2 -mwindows
;;
--static-libs)
# --libs|--static-libs)
sdl_static_libs=$(echo "-lmingw32 -lSDL2main -lSDL2 -mwindows -Wl,--dynamicbase -Wl,--nxcompat -lm -ldinput8 -ldxguid -ldxerr8 -luser32 -lgdi32 -lwinmm -limm32 -lole32 -loleaut32 -lshell32 -lsetupapi -lversion -luuid" | sed -E "s#-lSDL2[ $]#$libdir/libSDL2.a #g")
echo -L${exec_prefix}/lib $sdl_static_libs
;;
*)
echo "${usage}" 1>&2
exit 1
;;
esac
shift
done
Binary file not shown.
+65 -65
View File
@@ -1,65 +1,65 @@
#!/bin/sh
# Get the canonical path of the folder containing this script
bindir=$(cd -P -- "$(dirname -- "$0")" && printf '%s\n' "$(pwd -P)")
# Calculate the canonical path of the prefix, relative to the folder of this script
prefix=$(cd -P -- "$bindir/.." && printf '%s\n' "$(pwd -P)")
exec_prefix=${prefix}
exec_prefix_set=no
libdir=${exec_prefix}/lib
#usage="\
#Usage: $0 [--prefix[=DIR]] [--exec-prefix[=DIR]] [--version] [--cflags] [--libs]"
usage="\
Usage: $0 [--prefix[=DIR]] [--exec-prefix[=DIR]] [--version] [--cflags] [--libs] [--static-libs]"
if test $# -eq 0; then
echo "${usage}" 1>&2
exit 1
fi
while test $# -gt 0; do
case "$1" in
-*=*) optarg=`echo "$1" | sed 's/[-_a-zA-Z0-9]*=//'` ;;
*) optarg= ;;
esac
case $1 in
--prefix=*)
prefix=$optarg
if test $exec_prefix_set = no ; then
exec_prefix=$optarg
fi
;;
--prefix)
echo $prefix
;;
--exec-prefix=*)
exec_prefix=$optarg
exec_prefix_set=yes
;;
--exec-prefix)
echo $exec_prefix
;;
--version)
echo 2.28.5
;;
--cflags)
echo -I${prefix}/include/SDL2 -Dmain=SDL_main
;;
--libs)
echo -L${exec_prefix}/lib -lmingw32 -lSDL2main -lSDL2 -mwindows
;;
--static-libs)
# --libs|--static-libs)
sdl_static_libs=$(echo "-lmingw32 -lSDL2main -lSDL2 -mwindows -Wl,--dynamicbase -Wl,--nxcompat -Wl,--high-entropy-va -lm -ldinput8 -ldxguid -ldxerr8 -luser32 -lgdi32 -lwinmm -limm32 -lole32 -loleaut32 -lshell32 -lsetupapi -lversion -luuid" | sed -E "s#-lSDL2[ $]#$libdir/libSDL2.a #g")
echo -L${exec_prefix}/lib $sdl_static_libs
;;
*)
echo "${usage}" 1>&2
exit 1
;;
esac
shift
done
#!/bin/sh
# Get the canonical path of the folder containing this script
bindir=$(cd -P -- "$(dirname -- "$0")" && printf '%s\n' "$(pwd -P)")
# Calculate the canonical path of the prefix, relative to the folder of this script
prefix=$(cd -P -- "$bindir/.." && printf '%s\n' "$(pwd -P)")
exec_prefix=${prefix}
exec_prefix_set=no
libdir=${exec_prefix}/lib
#usage="\
#Usage: $0 [--prefix[=DIR]] [--exec-prefix[=DIR]] [--version] [--cflags] [--libs]"
usage="\
Usage: $0 [--prefix[=DIR]] [--exec-prefix[=DIR]] [--version] [--cflags] [--libs] [--static-libs]"
if test $# -eq 0; then
echo "${usage}" 1>&2
exit 1
fi
while test $# -gt 0; do
case "$1" in
-*=*) optarg=`echo "$1" | sed 's/[-_a-zA-Z0-9]*=//'` ;;
*) optarg= ;;
esac
case $1 in
--prefix=*)
prefix=$optarg
if test $exec_prefix_set = no ; then
exec_prefix=$optarg
fi
;;
--prefix)
echo $prefix
;;
--exec-prefix=*)
exec_prefix=$optarg
exec_prefix_set=yes
;;
--exec-prefix)
echo $exec_prefix
;;
--version)
echo 2.28.5
;;
--cflags)
echo -I${prefix}/include/SDL2 -Dmain=SDL_main
;;
--libs)
echo -L${exec_prefix}/lib -lmingw32 -lSDL2main -lSDL2 -mwindows
;;
--static-libs)
# --libs|--static-libs)
sdl_static_libs=$(echo "-lmingw32 -lSDL2main -lSDL2 -mwindows -Wl,--dynamicbase -Wl,--nxcompat -Wl,--high-entropy-va -lm -ldinput8 -ldxguid -ldxerr8 -luser32 -lgdi32 -lwinmm -limm32 -lole32 -loleaut32 -lshell32 -lsetupapi -lversion -luuid" | sed -E "s#-lSDL2[ $]#$libdir/libSDL2.a #g")
echo -L${exec_prefix}/lib $sdl_static_libs
;;
*)
echo "${usage}" 1>&2
exit 1
;;
esac
shift
done
Binary file not shown.
Binary file not shown.
+1 -1
View File
@@ -8,6 +8,7 @@ passthru_opts+=\
HAVE_MINIUPNPC\
HAVE_DISCORDRPC DEVELOP\
NOHOLEPUNCH\
NOOPENMPT\
# build with debugging information
ifdef DEBUGMODE
@@ -91,7 +92,6 @@ endif
default_packages:=\
LIBGME/libgme/LIBGME\
OPENMPT/libopenmpt/LIBOPENMPT\
ZLIB/zlib\
$(foreach p,$(default_packages),\
+13 -9
View File
@@ -29,8 +29,19 @@ ifndef NOHW
sources+=sdl/ogl_sdl.c
endif
ifndef NOOPENMPT
LIBOPENMPT_PKGCONFIG?=libopenmpt
$(eval $(call Use_pkg_config,LIBOPENMPT))
opts+=-DHAVE_OPENMPT
endif
NOMIXER=1
ifdef NOMIXER
sources+=sdl/dummy_sound.c
#sources+=sdl/dummy_sound.c
sources+=sdl/sdl_sound.c
SNDFILE_PKGCONFIG?=sndfile
$(eval $(call Use_pkg_config,SNDFILE))
else
opts+=-DHAVE_MIXER
sources+=sdl/mixer_sound.c
@@ -45,15 +56,8 @@ opts+=-DHAVE_THREADS
sources+=sdl/i_threads.c
endif
ifdef SDL_PKGCONFIG
SDL_PKGCONFIG?=sdl3
$(eval $(call Use_pkg_config,SDL))
else
SDL_CONFIG?=$(call Prefix,sdl2-config)
SDL_CFLAGS?=$(shell $(SDL_CONFIG) --cflags)
SDL_LDFLAGS?=$(shell $(SDL_CONFIG) \
$(if $(STATIC),--static-libs,--libs))
$(eval $(call Propogate_flags,SDL))
endif
ifdef MINGW
ifndef NOSDLMAIN
+3 -3
View File
@@ -79,14 +79,14 @@ $(eval $(call _set,LIBOPENMPT))
lib:=../libs/SDL2_mixer/$(mingw)
ifdef SDL
mixer_opts:=-I$(lib)/include/SDL2
mixer_opts:=-I$(lib)/include/SDL3
mixer_libs:=-L$(lib)/lib
lib:=../libs/SDL2/$(mingw)
SDL_opts:=-I$(lib)/include/SDL2\
SDL_opts:=-I$(lib)/include/SDL3\
$(mixer_opts) -Dmain=SDL_main
SDL_libs:=-L$(lib)/lib $(mixer_libs)\
-lmingw32 -lSDL2main -lSDL2 -mwindows
-lmingw32 -lSDL3main -lSDL3 -mwindows
$(eval $(call _set,SDL))
endif
+2 -12
View File
@@ -50,25 +50,15 @@ const char *VID_GetModeName(INT32 modenum)
return "A320x240";
}
void I_UpdateNoBlit(void){}
void I_FinishUpdate(void) {
void I_FinishUpdate(void)
{
LOGD("FRAME!");
(*jni_env)->CallVoidMethod(jni_env, androidVideo, videoFrameCB);
}
void I_UpdateNoVsync(void) {}
void I_WaitVBL(INT32 count)
{
(void)count;
}
void I_ReadScreen(UINT8 * restrict scr, INT32 scale)
{
(void)scr;
}
void I_BeginRead(void){}
void I_EndRead(void){}
+5 -3
View File
@@ -57,7 +57,6 @@ static void CV_EnforceExecVersion(void);
static boolean CV_FilterVarByVersion(consvar_t *v, const char *valstr);
static boolean CV_Command(void);
consvar_t *CV_FindVar(const char *name);
static const char *CV_StringValue(const char *var_name);
static consvar_t *consvar_vars; // list of registered console variables
@@ -238,10 +237,13 @@ void COM_ImmedExecute(const char *ptext)
char line[1024] = "";
INT32 quotes;
while (i < strlen(ptext))
const size_t txtlength = strlen(ptext);
while (i < txtlength)
{
quotes = 0;
for (j = 0; i < strlen(ptext); i++,j++)
for (j = 0; i < txtlength; i++,j++)
{
if (ptext[i] == '\"' && !quotes && i > 0 && ptext[i-1] != ' ') // Malformed command
return;
+27 -2
View File
@@ -33,6 +33,8 @@
#include "d_main.h"
#include "m_menu.h"
#include "m_textinput.h"
#include "m_emotes.h"
#include "i_time.h"
#include "filesrch.h"
#ifdef HWRENDER
@@ -1453,7 +1455,18 @@ static void CON_DrawHudlines(void)
}
if (c >= con_width)
break;
if (*p < HU_FONTSTART)
int emotelen;
emote_t *emote;
if ((emote = M_VerifyEmote((const char *)p, &emotelen)))
{
M_DrawScaledEmote(x<<FRACBITS, (y+2*con_scalefactor)<<FRACBITS, charwidth*FRACUNIT/EMOTEWIDTH, emote, V_NOSCALESTART|V_NOSCALEPATCH);
p += emotelen-1;
c += emotelen-1;
continue;
}
else if (*p < HU_FONTSTART)
;//charwidth = 4 * con_scalefactor;
else
{
@@ -1485,7 +1498,7 @@ static void CON_DrawConsole(void)
// draw console background
if (cons_backpic.value || con_forcepic)
{
patch_t *con_backpic = W_CachePatchName("KARTKREW", PU_PATCH_LOWPRIORITY);
patch_t *con_backpic = W_CachePatchName("KARTKREW", PU_PATCH);
// Jimita: CON_DrawBackpic just called V_DrawScaledPatch
V_DrawFixedPatch(0, 0, FRACUNIT/2, 0, con_backpic, NULL);
@@ -1527,8 +1540,20 @@ static void CON_DrawConsole(void)
p++;
c++;
}
if (c >= con_width)
break;
int emotelen;
emote_t *emote;
if ((emote = M_VerifyEmote((const char *)p, &emotelen)))
{
M_DrawScaledEmote(x<<FRACBITS, (y+2*con_scalefactor)<<FRACBITS, charwidth*FRACUNIT/EMOTEWIDTH, emote, V_NOSCALESTART|V_NOSCALEPATCH);
p += emotelen-1;
c += emotelen-1;
continue;
}
V_DrawCharacter(x, y, (INT32)(*p) | charflags | cv_constextsize.value | V_NOSCALESTART, !cv_allcaps.value);
}
}
+49 -22
View File
@@ -53,6 +53,8 @@
#include "m_perfstats.h"
#include "d_main.h"
#include "r_fps.h"
#include "filesrch.h" // refreshdirmenu
// cl loading screen
#include "v_video.h"
@@ -121,7 +123,7 @@ UINT32 realpingtable[MAXPLAYERS] = {}; //the base table of ping where an average
UINT32 playerpingtable[MAXPLAYERS] = {}; //table of player latency values.
#define GENTLEMANSMOOTHING (TICRATE)
static tic_t reference_lag;
static tic_t reference_lag = 0;
static UINT8 spike_time;
tic_t lowest_lag = 0;
tic_t simulated_lag = 0;
@@ -505,10 +507,12 @@ static void ExtraDataTicker(void)
}
// If you are a client, you can safely forget the net commands for this tic
// If you are the server, you need to remember them until every client has been aknowledged,
// because if you need to resend a PT_SERVERTICS packet, you need to put the commands in it
// If you are the server, you need to remember them until every client has been acknowledged,
// because if you need to resend a PT_SERVERTICS packet, you will need to put the commands in it
if (client)
{
D_FreeTextcmd(gametic);
}
}
static void D_Clearticcmd(tic_t tic)
@@ -1367,10 +1371,19 @@ static inline void CL_DrawConnectionStatus(void)
V_DrawThinString(12 + 80, 58, V_ALLOWLOWERCASE|V_YELLOWMAP, "Vanilla");
}
if (serverlist[joinnode].info.cheatsenabled)
const UINT8 serverkartspeed = (serverlist[joinnode].info.kartvars & SV_SPEEDMASK);
if (serverkartspeed == 2)
V_DrawRightAlignedThinString(BASEVIDWIDTH - 12, 58, V_ALLOWLOWERCASE|V_REDMAP, "Hard Speed");
else if (serverkartspeed == 1)
V_DrawRightAlignedThinString(BASEVIDWIDTH - 12, 58, V_ALLOWLOWERCASE|V_BLUEMAP, "Normal Speed");
else
V_DrawRightAlignedThinString(BASEVIDWIDTH - 12, 58, V_ALLOWLOWERCASE|V_GREENMAP, "Easy Speed");
/*if (serverlist[joinnode].info.cheatsenabled)
{
V_DrawRightAlignedThinString(BASEVIDWIDTH - 12, 58, V_ALLOWLOWERCASE|V_GREENMAP, "Cheats");
}
}*/
V_DrawFill(8, 72, BASEVIDWIDTH - 16, 112, 239);
@@ -1390,10 +1403,16 @@ static inline void CL_DrawConnectionStatus(void)
if (playerinfo[i].node < 255)
{
strncpy(player_name, playerinfo[i].name, MAXPLAYERNAME);
V_DrawThinString(x + 10, y, V_ALLOWLOWERCASE|V_6WIDTHSPACE, player_name);
// if we get a skin color
// try to colourize the player name
if (playerinfo[i].data > 0 && playerinfo[i].data < MAXSKINCOLORS)
V_DrawThinString(x + 10, y, V_ALLOWLOWERCASE|V_6WIDTHSPACE, va("%s%s ", HU_SkinColorToConsoleColor(playerinfo[i].data), player_name));
else
V_DrawThinString(x + 10, y, V_ALLOWLOWERCASE|V_6WIDTHSPACE, player_name);
if (playerinfo[i].team == 0) { statuscolor = 184; } // playing
if (playerinfo[i].data & 0x20) { statuscolor = 86; } // tag IT
//if (playerinfo[i].data & 0x20) { statuscolor = 86; } // tag IT
if (playerinfo[i].team == 1) { statuscolor = 128; } // ctf red team
if (playerinfo[i].team == 2) { statuscolor = 232; } // ctf blue team
if (playerinfo[i].team == 255) { statuscolor = 16; } // spectator or non-team
@@ -1438,12 +1457,14 @@ static inline void CL_DrawConnectionStatus(void)
V_DrawFill(BASEVIDWIDTH/2-128, BASEVIDHEIGHT-58, dldlength, 8, 160);
memset(tempname, 0, sizeof(tempname));
// offset filename to just the name only part
filename += strlen(filename) - nameonlylength(filename);
const size_t filenamelength = strlen(filename);
if (strlen(filename) > sizeof(tempname)-1) // too long to display fully
if (filenamelength > sizeof(tempname)-1) // too long to display fully
{
size_t endhalfpos = strlen(filename)-10;
size_t endhalfpos = filenamelength-10;
// display as first 14 chars + ... + last 10 chars
// which should add up to 27 if our math(s) is correct
snprintf(tempname, sizeof(tempname), "%.14s...%.10s", filename, filename+endhalfpos);
@@ -1736,16 +1757,19 @@ static void SV_SendPlayerInfo(INT32 node)
// Extra data
// Kart has extra skincolors, so we can't use this
netbuffer->u.playerinfo[i].data = 0; //netbuffer->u.playerinfo[i].data = players[i].skincolor;
//netbuffer->u.playerinfo[i].data = 0; //netbuffer->u.playerinfo[i].data = players[i].skincolor;
if (players[i].pflags & PF_TAGIT)
netbuffer->u.playerinfo[i].data |= 0x20;
// well why not, we only got like 100 of these?
netbuffer->u.playerinfo[i].data = players[i].skincolor;
if (players[i].gotflag)
netbuffer->u.playerinfo[i].data |= 0x40;
//if (players[i].pflags & PF_TAGIT)
//netbuffer->u.playerinfo[i].data |= 0x20;
if (players[i].powers[pw_super])
netbuffer->u.playerinfo[i].data |= 0x80;
//if (players[i].gotflag)
//netbuffer->u.playerinfo[i].data |= 0x40;
//if (players[i].powers[pw_super])
//netbuffer->u.playerinfo[i].data |= 0x80;
}
HSendPacket(node, false, 0, sizeof(plrinfo) * MSCOMPAT_MAXPLAYERS);
@@ -1928,7 +1952,7 @@ static boolean SV_ResendingSavegameToAnyone(void)
static void SV_SendSaveGame(INT32 node, boolean resending)
{
size_t length, compressedlen;
savebuffer_t save;
savebuffer_t save = {0};
UINT8 *compressedsave;
UINT8 *buffertosend;
@@ -1998,7 +2022,7 @@ static consvar_t cv_dumpconsistency = {"dumpconsistency", "Off", CV_NETVAR, CV_O
static void SV_SavedGame(void)
{
size_t length;
savebuffer_t save;
savebuffer_t save = {0};
char tmpsave[264];
if (!cv_dumpconsistency.value)
@@ -2038,7 +2062,7 @@ static void SV_SavedGame(void)
static void CL_LoadReceivedSavegame(boolean reloading)
{
savebuffer_t save;
savebuffer_t save = {0};
size_t length, decompressedlen;
char tmpsave[264];
@@ -2130,7 +2154,7 @@ static void CL_ReloadReceivedSavegame(void)
// we dont have P_ForceLocalAngle so were setting it manually here
for (i = 0; i <= splitscreen; i++)
{
localangle[i] = (angle_t)(players[displayplayers[i]].cmd.angleturn << 16);
P_ForceLocalAngle(&players[displayplayers[i]], (angle_t)(players[displayplayers[i]].cmd.angleturn << 16));
}
for (i = 0; i < MAXSPLITSCREENPLAYERS; i++)
@@ -4503,6 +4527,8 @@ static void Got_AddPlayer(const UINT8 **p, INT32 playernum)
DEBFILE("spawning me\n");
}
P_ForceLocalAngle(&players[newplayernum], (angle_t)(players[newplayernum].cmd.angleturn << 16));
D_SendPlayerConfig();
addedtogame = true;
}
@@ -7175,6 +7201,7 @@ void NetUpdate(void)
I_lock_mutex(&m_menu_mutex);
#endif
M_Ticker();
refreshdirmenu = 0;
#ifdef HAVE_THREADS
I_unlock_mutex(m_menu_mutex);
#endif
@@ -7221,7 +7248,7 @@ void CL_ClearRewinds(void)
rewind_t *CL_SaveRewindPoint(size_t demopos)
{
savebuffer_t save;
savebuffer_t save = {0};
rewind_t *rewind;
if (rewindhead && rewindhead->leveltime + REWIND_POINT_INTERVAL > leveltime)
@@ -7244,7 +7271,7 @@ rewind_t *CL_SaveRewindPoint(size_t demopos)
rewind_t *CL_RewindToTime(tic_t time)
{
savebuffer_t save;
savebuffer_t save = {0};
rewind_t *rewind;
while (rewindhead && rewindhead->leveltime > time)
+11 -47
View File
@@ -46,6 +46,7 @@
#include "i_time.h"
#include "i_threads.h"
#include "i_video.h"
#include "hu_stuff.h"
#include "m_argv.h"
#include "m_menu.h"
#include "m_misc.h"
@@ -69,7 +70,7 @@
#include "fastcmp.h"
#include "r_fps.h" // Frame interpolation/uncapped
#include "keys.h"
#include "filesrch.h" // refreshdirmenu, pathisdirectory
#include "filesrch.h" // pathisdirectory
#include "d_protocol.h"
#include "m_perfstats.h"
#include "k_kart.h"
@@ -166,38 +167,6 @@ UINT8 ctrldown = 0; // 0x1 left, 0x2 right
UINT8 altdown = 0; // 0x1 left, 0x2 right
boolean capslock = 0; // gee i wonder what this does.
static UINT16 curcolor[MAXSPLITSCREENPLAYERS] = {};
static void D_DeviceLEDTick(void)
{
UINT8 i;
static UINT16 color[MAXSPLITSCREENPLAYERS] = {};
if (numcontrollers == 0)
{
return;
}
for (i = 0; i <= splitscreen; i++)
{
if (!cv_usejoystick[i].value || !cv_gamepadled[i].value)
continue;
color[i] = G_GetSkinColor(i);
if (curcolor[i] == color[i]) // dont update if same colour
continue;
G_SetPlayerGamepadIndicatorColor(i, color[i]);
curcolor[i] = color[i];
}
}
void D_ResetDeviceLED(void)
{
memset(curcolor, 0, sizeof(curcolor));
}
//
// D_ProcessEvents
// Send all the events of the given timestamp down the responder chain
@@ -359,13 +328,12 @@ static void D_Renderview(void)
if (splitscreen == 2)
{
// V_DrawPatchFill, but for the fourth screen only
patch_t *pat = W_CachePatchName("SRB2BACK", PU_PATCH);
INT32 x, y, pw = SHORT(pat->width) * vid.dup, ph = SHORT(pat->height) * vid.dup;
INT32 x, y, pw = SHORT(srb2back->width) * vid.dup, ph = SHORT(srb2back->height) * vid.dup;
for (x = vid.width>>1; x < vid.width; x += pw)
{
for (y = vid.height>>1; y < vid.height; y += ph)
V_DrawScaledPatch(x, y, V_NOSCALESTART, pat);
V_DrawScaledPatch(x, y, V_NOSCALESTART, srb2back);
}
}
@@ -407,10 +375,6 @@ static boolean D_Display(void)
R_ExecuteSetViewSize();
forcerefresh = true; // force background redraw
}
// draw buffered stuff to screen
// Used only by linux GGI version
I_UpdateNoBlit();
}
// save the current screen if about to wipe
@@ -708,7 +672,7 @@ void D_SRB2Loop(void)
COM_ImmedExecute("cls;version");
if (rendermode == render_soft)
V_DrawFixedPatch(0, 0, FRACUNIT/2, 0, W_CachePatchNum(W_GetNumForName("KARTKREW"), PU_PATCH_LOWPRIORITY), NULL);
V_DrawFixedPatch(0, 0, FRACUNIT/2, 0, W_CachePatchNum(W_GetNumForName("KARTKREW"), PU_PATCH), NULL);
I_FinishUpdate(); // page flip or blit buffer
precision = I_GetPrecisePrecision();
@@ -761,8 +725,6 @@ void D_SRB2Loop(void)
renderisnewtic = (realtics > 0 || singletics);
refreshdirmenu = 0; // not sure where to put this, here as good as any?
if (renderisnewtic)
{
// don't skip more than 10 frames at a time
@@ -799,7 +761,7 @@ void D_SRB2Loop(void)
if (!dedicated)
{
D_DeviceLEDTick();
G_DeviceLEDTick();
}
}
@@ -977,7 +939,7 @@ void D_ClearState(void)
M_ClearMenus(true);
// map palettes affect this
D_ResetDeviceLED();
G_ResetDeviceLED();
}
//
@@ -1218,8 +1180,10 @@ static void IdentifyVersion(void)
const char *srb2waddir = NULL;
#if defined (__unix__) || defined (UNIXCOMMON) || defined (HAVE_SDL)
CLEANUP(pfree) const char *allocwaddir = NULL; // here so we dont potentially free stack memory
// change to the directory where 'srb2.srb' is found
srb2waddir = I_LocateWad();
allocwaddir = I_LocateWad();
srb2waddir = allocwaddir;
#endif
char tempsrb2path[256] = ".";
@@ -1300,7 +1264,7 @@ static void IdentifyVersion(void)
if (AddIWAD("extra3.kart", srb2waddir))
found_extra3_kart = true;
#if !defined (HAVE_SDL) || defined (HAVE_MIXER)
#if defined (HAVE_SDL)
#define MUSICTEST(str) \
musicpath = va(pandf, srb2waddir, str);\
handle = W_OpenWadFile(&musicpath, false); \
-2
View File
@@ -80,8 +80,6 @@ void D_ProcessEvents(void);
const char *D_Home(void);
void D_ResetDeviceLED(void);
//
// BASE LEVEL
//
+10 -27
View File
@@ -274,7 +274,7 @@ consvar_t cv_showlocalskinmenus = {"showlocalskinmenus", "Yes", CV_SAVE, CV_YesN
consvar_t cv_skipmapcheck = {"skipmapcheck", "Off", CV_SAVE, CV_OnOff, NULL, 0, NULL, NULL, 0, 0, NULL};
INT32 cv_debug;
INT32 cv_debug = 0;
static void UseMouse_OnChange(void);
consvar_t cv_usemouse = {"use_mouse", "Off", CV_SAVE|CV_CALL, usemouse_cons_t, UseMouse_OnChange, 0, NULL, NULL, 0, 0, NULL};
@@ -531,7 +531,7 @@ boolean forceresetplayers = false;
boolean deferencoremode = false;
UINT8 splitscreen = 0;
boolean circuitmap = true; // SRB2kart
INT32 adminplayers[MAXPLAYERS];
INT32 adminplayers[MAXPLAYERS] = {};
/// \warning Keep this up-to-date if you add/remove/rename net text commands
const char *netxcmdnames[MAXNETXCMD - 1] =
@@ -997,6 +997,7 @@ void D_RegisterClientCommands(void)
CV_RegisterVar(&cv_usejoystick[i]);
CV_RegisterVar(&cv_joyscale[i]);
CV_RegisterVar(&cv_rumble[i]);
CV_RegisterVar(&cv_rumblestrength[i]);
CV_RegisterVar(&cv_gamepadled[i]);
}
@@ -2588,8 +2589,7 @@ void D_PickVote(void)
SendNetXCmd(XD_PICKVOTE, &buf, 2);
}
static char *
ConcatCommandArgv (int start, int end)
static char *ConcatCommandArgv(int start, int end)
{
char *final;
@@ -2662,8 +2662,8 @@ static void Command_Map_f(void)
INT32 newmapnum;
char * mapname;
char *realmapname = NULL;
CLEANUP(Z_Pfree) char * mapname = NULL;
CLEANUP(Z_Pfree) char *realmapname = NULL;
INT32 newgametype = gametype;
boolean newencoremode = cv_kartencore.value;
@@ -2732,7 +2732,6 @@ static void Command_Map_f(void)
if (newmapnum == 0)
{
CONS_Alert(CONS_ERROR, M_GetText("Could not find any map described as '%s'.\n"), mapname);
Z_Free(mapname);
return;
}
@@ -2764,8 +2763,6 @@ static void Command_Map_f(void)
" 0 and %d inclusive. ...Or just use the name. :v\n",
d,
NUMGAMETYPES-1);
Z_Free(realmapname);
Z_Free(mapname);
return;
}
}
@@ -2774,8 +2771,6 @@ static void Command_Map_f(void)
CONS_Alert(CONS_ERROR,
"'%s' is not a gametype.\n",
gametypename);
Z_Free(realmapname);
Z_Free(mapname);
return;
}
}
@@ -2793,8 +2788,6 @@ static void Command_Map_f(void)
if (!mapheaderinfo[newmapnum-1])
{
CONS_Alert(CONS_WARNING, M_GetText("Invalid mapheaderinfo for Course %s (%s)\n"), realmapname, G_BuildMapName(newmapnum));
Z_Free(realmapname);
Z_Free(mapname);
return;
}
@@ -2802,8 +2795,6 @@ static void Command_Map_f(void)
{
CONS_Alert(CONS_WARNING, M_GetText("Course %s (%s) doesn't support %s mode!\n(Use -force to override)\n"), realmapname, G_BuildMapName(newmapnum),
(multiplayer ? gametype_cons_t[newgametype].strvalue : "Single Player"));
Z_Free(realmapname);
Z_Free(mapname);
return;
}
}
@@ -2815,8 +2806,6 @@ static void Command_Map_f(void)
if (!dedicated && M_MapLocked(newmapnum))
{
CONS_Alert(CONS_NOTICE, M_GetText("You need to unlock this level before you can warp to it!\n"));
Z_Free(realmapname);
Z_Free(mapname);
return;
}
@@ -2842,8 +2831,6 @@ static void Command_Map_f(void)
fromlevelselect = false;
D_MapChange(newmapnum, newgametype, newencoremode, newresetplayers, 0, false, false);
Z_Free(realmapname);
}
/** Receives a map command and changes the map.
@@ -3911,6 +3898,7 @@ static void Got_Teamchange(const UINT8 **cp, INT32 playernum)
if (G_BattleGametype()) // SRB2kart
{
players[playernum].marescore = 0;
if (K_IsPlayerWanted(&players[playernum]))
K_CalculateBattleWanted();
}
@@ -4508,7 +4496,7 @@ static void Command_Addskins(void)
CONS_Printf("addskins has been deprecated\nuse addfilelocal instead!\n");
}
static void Command_GLocalSkin (void)
static void Command_GLocalSkin(void)
{
size_t first_option;
size_t option_display;
@@ -4519,7 +4507,7 @@ static void Command_GLocalSkin (void)
option_display = COM_CheckPartialParm("-d");
option_all = COM_CheckPartialParm("-a");
char* fuck; // local skin name
CLEANUP(Z_Pfree) char* fuck = NULL; // local skin name
if (!(first_option = COM_FirstOption()))
first_option = COM_Argc();
@@ -4560,7 +4548,6 @@ static void Command_GLocalSkin (void)
CONS_Printf("Successfully applied localskin to displayed player.\n");
Z_Free(fuck);
return;
}
else if (option_all) // -all
@@ -4575,7 +4562,6 @@ static void Command_GLocalSkin (void)
}
CONS_Printf("Successfully applied localskin to all players.\n");
Z_Free(fuck);
return;
}
else // -player or no other arguments
@@ -4592,7 +4578,6 @@ static void Command_GLocalSkin (void)
}
CONS_Printf("Successfully applied localskin to specified player.\n");
Z_Free(fuck);
return;
}
else
@@ -4600,13 +4585,11 @@ static void Command_GLocalSkin (void)
SetLocalPlayerSkin(consoleplayer, fuck, &cv_localskin);
CONS_Printf("Successfully applied localskin.\n");
Z_Free(fuck);
return;
}
CONS_Printf("Could not apply localskin.\n");
Z_Free(fuck);
return;
}
}
@@ -5689,7 +5672,7 @@ static void Command_Togglemodified_f(void)
static void Command_Archivetest_f(void)
{
savebuffer_t save;
savebuffer_t save = {0};
UINT32 i, wrote;
thinker_t *th;
if (gamestate != GS_LEVEL)
+6 -6
View File
@@ -64,7 +64,6 @@
static boolean SV_SendFile(INT32 node, const char *filename, UINT8 fileid);
#ifdef HAVE_CURL
size_t curlwrite_data(void *ptr, size_t size, size_t nmemb, FILE *stream);
#if (LIBCURL_VERSION_MAJOR <= 7) && (LIBCURL_VERSION_MINOR < 35)
static int curlprogress_callback(void *clientp, double dltotal, double dlnow, double ultotal, double ulnow);
#else
@@ -1080,12 +1079,14 @@ void CloseNetFile(void)
// Receiving a file?
for (i = 0; i < MAX_WADFILES; i++)
{
if (fileneeded[i].status == FS_DOWNLOADING && fileneeded[i].file)
{
fclose(fileneeded[i].file);
// File is not complete delete it
remove(fileneeded[i].filename);
}
}
// Remove PT_FILEFRAGMENT from acknowledge list
Net_AbortPacketType(PT_FILEFRAGMENT);
@@ -1099,17 +1100,16 @@ void nameonly(char *s)
void *ns;
for (j = strlen(s); j != (size_t)-1; j--)
{
if ((s[j] == '\\') || (s[j] == ':') || (s[j] == '/'))
{
ns = &(s[j+1]);
len = strlen(ns);
#if 0
memcpy(s, ns, len+1);
#else
memmove(s, ns, len+1);
#endif
memmove(s, ns, len+1);
return;
}
}
}
// Returns the length in characters of the last element of a path.
+58 -126
View File
@@ -127,16 +127,32 @@ typedef LPVOID (WINAPI *p_MapViewOfFile) (HANDLE, DWORD, DWORD, DWORD, SIZE_T);
#include <time.h>
// Locations for searching the srb2.srb
/// Locations to directly check for srb2.srb in
const char *wadDefaultPaths[] = {
#if defined (__unix__) || defined(__APPLE__) || defined (UNIXCOMMON)
#define DEFAULTWADLOCATION1 "/usr/local/share/games/SRB2Kart"
#define DEFAULTWADLOCATION2 "/usr/local/games/SRB2Kart"
#define DEFAULTWADLOCATION3 "/usr/share/games/SRB2Kart"
#define DEFAULTWADLOCATION4 "/usr/games/SRB2Kart"
#define DEFAULTSEARCHPATH1 "/usr/local/games"
#define DEFAULTSEARCHPATH2 "/usr/games"
#define DEFAULTSEARCHPATH3 "/usr/local"
"/usr/local/share/games/SRB2Kart",
"/usr/local/games/SRB2Kart",
"/usr/share/games/SRB2Kart",
"/usr/games/SRB2Kart",
#elif defined (_WIN32)
"c:\\games\\srb2kart",
"\\games\\srb2kart",
#endif
NULL
};
// Folders to recurse through looking for srb2.srb
const char *wadSearchPaths[] = {
#if defined (__unix__) || defined(__APPLE__) || defined (UNIXCOMMON)
"/usr/local/games",
"/usr/games",
"/usr/local",
#elif defined (_WIN32)
"c:\\games",
"\\games",
#endif
NULL
};
/** \brief WAD file to look for
*/
@@ -1423,20 +1439,6 @@ death:
exit(0);
}
void I_WaitVBL(INT32 count)
{
count = 1;
I_Sleep(count);
}
void I_BeginRead(void)
{
}
void I_EndRead(void)
{
}
//
// I_Error
//
@@ -1827,16 +1829,23 @@ static const char *searchWad(const char *searchDir)
return tempsw;
}
strcpy(tempsw, WADKEYWORD2);
fstemp = filesearch(tempsw, searchDir, NULL, true, 20);
if (fstemp == FS_FOUND)
{
pathonly(tempsw);
return tempsw;
}
return NULL;
}
#define CHECKWADPATH(ret) \
do { \
I_OutputMsg(",%s", ret); \
if (isWadPathOk(ret)) \
return ret; \
} while (0)
#define SEARCHWAD(str) \
do { \
WadPath = searchWad(str); \
if (WadPath) \
return WadPath; \
} while (0)
/** \brief go through all possible paths and look for srb2.srb
\return path to srb2.srb if any
@@ -1845,6 +1854,7 @@ static const char *locateWad(void)
{
const char *envstr;
const char *WadPath;
int i;
I_OutputMsg("SRB2WADDIR");
// does SRB2WADDIR exist?
@@ -1852,132 +1862,51 @@ static const char *locateWad(void)
return envstr;
#ifndef NOCWD
I_OutputMsg(",.");
// examine current dir
strcpy(returnWadPath, ".");
I_OutputMsg(",%s", returnWadPath);
if (isWadPathOk(returnWadPath))
return NULL;
#endif
#ifndef NOHOME
#ifdef DEFAULTDIR
I_OutputMsg(",HOME/" DEFAULTDIR);
// examine user jart directory
if ((envstr = I_GetEnv("HOME")) != NULL)
{
sprintf(returnWadPath, "%s" PATHSEP DEFAULTDIR, envstr);
if (isWadPathOk(returnWadPath))
return returnWadPath;
}
#endif
#ifdef CMAKECONFIG
#ifndef NDEBUG
I_OutputMsg(","CMAKE_ASSETS_DIR);
strcpy(returnWadPath, CMAKE_ASSETS_DIR);
if (isWadPathOk(returnWadPath))
{
return returnWadPath;
CHECKWADPATH(returnWadPath);
}
#endif
#endif
#ifdef __APPLE__
OSX_GetResourcesPath(returnWadPath);
I_OutputMsg(",%s", returnWadPath);
if (isWadPathOk(returnWadPath))
{
return returnWadPath;
}
CHECKWADPATH(returnWadPath);
#endif
// examine default dirs
#ifdef DEFAULTWADLOCATION1
I_OutputMsg(","DEFAULTWADLOCATION1);
strcpy(returnWadPath, DEFAULTWADLOCATION1);
if (isWadPathOk(returnWadPath))
return returnWadPath;
#endif
#ifdef DEFAULTWADLOCATION2
I_OutputMsg(","DEFAULTWADLOCATION2);
strcpy(returnWadPath, DEFAULTWADLOCATION2);
if (isWadPathOk(returnWadPath))
return returnWadPath;
#endif
#ifdef DEFAULTWADLOCATION3
I_OutputMsg(","DEFAULTWADLOCATION3);
strcpy(returnWadPath, DEFAULTWADLOCATION3);
if (isWadPathOk(returnWadPath))
return returnWadPath;
#endif
#ifdef DEFAULTWADLOCATION4
I_OutputMsg(","DEFAULTWADLOCATION4);
strcpy(returnWadPath, DEFAULTWADLOCATION4);
if (isWadPathOk(returnWadPath))
return returnWadPath;
#endif
#ifdef DEFAULTWADLOCATION5
I_OutputMsg(","DEFAULTWADLOCATION5);
strcpy(returnWadPath, DEFAULTWADLOCATION5);
if (isWadPathOk(returnWadPath))
return returnWadPath;
#endif
#ifdef DEFAULTWADLOCATION6
I_OutputMsg(","DEFAULTWADLOCATION6);
strcpy(returnWadPath, DEFAULTWADLOCATION6);
if (isWadPathOk(returnWadPath))
return returnWadPath;
#endif
#ifdef DEFAULTWADLOCATION7
I_OutputMsg(","DEFAULTWADLOCATION7);
strcpy(returnWadPath, DEFAULTWADLOCATION7);
if (isWadPathOk(returnWadPath))
return returnWadPath;
#endif
#ifndef NOHOME
// find in $HOME
I_OutputMsg(",HOME/" DEFAULTDIR);
if ((envstr = I_GetEnv("HOME")) != NULL)
for (i = 0; wadDefaultPaths[i]; i++)
{
char *tmp = malloc(strlen(envstr) + sizeof(PATHSEP) + sizeof(DEFAULTDIR));
strcpy(tmp, envstr);
strcat(tmp, PATHSEP);
strcat(tmp, DEFAULTDIR);
WadPath = searchWad(tmp);
free(tmp);
if (WadPath)
return WadPath;
strcpy(returnWadPath, wadDefaultPaths[i]);
CHECKWADPATH(returnWadPath);
}
#endif
#ifdef DEFAULTSEARCHPATH1
// find in /usr/local
I_OutputMsg(", in:"DEFAULTSEARCHPATH1);
WadPath = searchWad(DEFAULTSEARCHPATH1);
if (WadPath)
return WadPath;
#endif
#ifdef DEFAULTSEARCHPATH2
// find in /usr/games
I_OutputMsg(", in:"DEFAULTSEARCHPATH2);
WadPath = searchWad(DEFAULTSEARCHPATH2);
if (WadPath)
return WadPath;
#endif
#ifdef DEFAULTSEARCHPATH3
// find in ???
I_OutputMsg(", in:"DEFAULTSEARCHPATH3);
WadPath = searchWad(DEFAULTSEARCHPATH3);
if (WadPath)
return WadPath;
#endif
// search paths
for (i = 0; wadSearchPaths[i]; i++)
{
I_OutputMsg(", in:%s", wadSearchPaths[i]);
SEARCHWAD(wadSearchPaths[i]);
}
// if nothing was found
return NULL;
}
const char *I_LocateWad(void)
{
const char *waddir;
const char *waddir = NULL;
I_OutputMsg("Looking for WADs in: ");
waddir = locateWad();
@@ -1987,12 +1916,15 @@ const char *I_LocateWad(void)
{
// change to the directory where we found srb2.srb
#if defined (_WIN32)
waddir = _fullpath(NULL, waddir, MAX_PATH);
SetCurrentDirectoryA(waddir);
#else
waddir = realpath(waddir, NULL);
if (waddir == NULL || chdir(waddir) == -1)
I_OutputMsg("Couldn't change working directory\n");
#endif
}
return waddir;
}
+4 -7
View File
@@ -65,13 +65,6 @@ void I_OsPolling(void)
I_GetConsoleEvents();
}
//
// I_UpdateNoBlit
//
void I_UpdateNoBlit(void)
{
}
//
// I_FinishUpdate
//
@@ -122,6 +115,10 @@ INT32 VID_GetModeForSize(INT32 w, INT32 h)
return -1;
}
void VID_RefreshModeList(void)
{
}
void VID_PrepareModeList(void)
{
}
+10 -5
View File
@@ -20,6 +20,7 @@
// but I can't stand that gibberish. D:
#define SOUND_DUMMY 0
#define SOUND_MIXER 1
#define SOUND_SDL 2
#ifndef SOUND
#ifdef HAVE_SDL
@@ -27,7 +28,7 @@
#ifdef HAVE_MIXER
#define SOUND SOUND_MIXER
#else
#define SOUND SOUND_DUMMY
#define SOUND SOUND_SDL
#endif
#else
#define SOUND SOUND_DUMMY
@@ -107,10 +108,10 @@ extern char logfilename[1024];
#else
#define VERSION 1 // Game version
#define SUBVERSION 6 // more precise version number
#define VERSIONSTRING "Saturn v9.1"
#define VERSIONSTRINGW L"Saturn v9.1"
#define VERSIONSTRING "Saturn v9.x - Testing"
#define VERSIONSTRINGW L"Saturn v9.x - Testing "
//#define SATURN_TESTING // comment out for saturn release builds!
#define SATURN_TESTING // comment out for saturn release builds!
// Hey! If you change this, add 1 to the MODVERSION below! Otherwise we can't force updates!
// And change CMakeLists.txt (not src/, but in root), for CMake users!
@@ -477,7 +478,7 @@ extern INT32 cv_debug;
// Misc stuff for later...
// =======================
#define ANG2RAD(angle) ((float)((angle)*M_PI)/ANGLE_180)
#define ANG2RAD(angle) ((float)((angle)*M_PIf) / (float)ANGLE_180)
// Modifier key variables, accessible anywhere
extern UINT8 shiftdown, ctrldown, altdown;
@@ -526,6 +527,10 @@ UINT32 quickncasehash (const char *p, size_t n)
#define M_PIl 3.1415926535897932384626433832795029L
#endif
#ifndef M_PIf
#define M_PIf 3.14159265f
#endif
// Floating point comparison epsilons from float.h
#ifndef FLT_EPSILON
#define FLT_EPSILON 1.1920928955078125e-7f
+5 -3
View File
@@ -68,11 +68,13 @@ extern "C" {
#define strnicmp(x,y,n) strncasecmp(x,y,n)
#endif
#ifndef __cplusplus
char *strcasestr(const char *in, const char *what);
#define stristr strcasestr
char *nongnu_strcasestr(const char *in, const char *what);
#ifndef _GNU_SOURCE
#define strcasestr nongnu_strcasestr
#endif
#define stristr strcasestr
#if defined (macintosh) //|| defined (__APPLE__) //skip all boolean/Boolean crap
#define true 1
#define false 0
+31 -37
View File
@@ -166,8 +166,8 @@ static void F_SkyScroll(INT32 scrollspeed)
patch_t *pat, *pat2;
INT32 anim2 = 0;
pat = W_CachePatchName("TITLEBG1", PU_PATCH_LOWPRIORITY);
pat2 = W_CachePatchName("TITLEBG2", PU_PATCH_LOWPRIORITY);
pat = W_CachePatchName("TITLEBG1", PU_PATCH);
pat2 = W_CachePatchName("TITLEBG2", PU_PATCH);
w = (vid.scaledwidth << FRACBITS);
@@ -215,9 +215,6 @@ static tic_t introscenetime[NUMINTROSCENES] =
4*TICRATE, // KART KR(eW
};
// custom intros
void F_StartCustomCutscene(INT32 cutscenenum, boolean precutscene, boolean resetplayer);
void F_StartIntro(void)
{
if (gamestate)
@@ -257,26 +254,21 @@ void F_StartIntro(void)
//
void F_IntroDrawer(void)
{
boolean highres = false;
INT32 cx = 8, cy = 128;
patch_t *background = NULL;
INT32 bgxoffs = 0;
V_DrawFill(0, 0, BASEVIDWIDTH, BASEVIDHEIGHT, 120);
// DRAW A FULL PIC INSTEAD OF FLAT!
if (intro_scenenum == 0)
{
background = W_CachePatchName("KARTKREW", PU_PATCH_LOWPRIORITY);
highres = true;
}
background = W_CachePatchName("KARTKREW", PU_PATCH);
V_DrawFill(0, 0, BASEVIDWIDTH, BASEVIDHEIGHT, 120);
if (background)
{
if (highres)
if (background)
{
V_DrawSmallScaledPatch(bgxoffs, 0, 0, background);
else
V_DrawScaledPatch(bgxoffs, 0, 0, background);
}
}
W_UnlockCachedPatch(background);
@@ -324,6 +316,7 @@ void F_IntroTicker(void)
D_StartTitle();
return;
}
if (finalecount == 8)
S_StartSound(NULL, sfx_vroom);
else if (finalecount == 47)
@@ -626,7 +619,6 @@ void F_StartCredits(void)
timetonext = 2*TICRATE;
}
void F_CreditDrawer(void)
{
UINT16 i;
@@ -652,7 +644,7 @@ void F_CreditDrawer(void)
sc = FRACUNIT; // quick hack so I don't have to add another field to credits_pics
}
V_DrawFixedPatch(credits_pics[i].x<<FRACBITS, (credits_pics[i].y<<FRACBITS) - 4*(animtimer<<FRACBITS)/5, sc, 0, W_CachePatchName(credits_pics[i].patch, PU_PATCH), colormap);
V_DrawFixedPatch(credits_pics[i].x<<FRACBITS, (credits_pics[i].y<<FRACBITS) - 4*(animtimer<<FRACBITS)/5, sc, 0, W_CachePatchName(credits_pics[i].patch, PU_PATCH_LOWPRIORITY), colormap);
}
// Dim the background
@@ -661,22 +653,23 @@ void F_CreditDrawer(void)
// Draw credits text on top
for (i = 0; credits[i]; i++)
{
switch(credits[i][0])
switch (credits[i][0])
{
case 0:
y += 80<<FRACBITS;
break;
case 1:
if (y>>FRACBITS > -20)
V_DrawCreditString((160 - (V_CreditStringWidth(&credits[i][1])>>1))<<FRACBITS, y, 0, &credits[i][1]);
y += 30<<FRACBITS;
break;
default:
if (y>>FRACBITS > -10)
V_DrawStringAtFixed(32<<FRACBITS, y, V_ALLOWLOWERCASE, credits[i]);
y += 12<<FRACBITS;
break;
case 0:
y += 80<<FRACBITS;
break;
case 1:
if (y>>FRACBITS > -20)
V_DrawCreditString((160 - (V_CreditStringWidth(&credits[i][1])>>1))<<FRACBITS, y, 0, &credits[i][1]);
y += 30<<FRACBITS;
break;
default:
if (y>>FRACBITS > -10)
V_DrawStringAtFixed(32<<FRACBITS, y, V_ALLOWLOWERCASE, credits[i]);
y += 12<<FRACBITS;
break;
}
if (((y>>FRACBITS) * vid.dup) > vid.height)
break;
}
@@ -701,7 +694,7 @@ void F_CreditTicker(void)
// Draw credits text on top
for (i = 0; credits[i]; i++)
{
switch(credits[i][0])
switch (credits[i][0])
{
case 0: y += 80<<FRACBITS; break;
case 1: y += 30<<FRACBITS; break;
@@ -979,10 +972,10 @@ void F_StartTitleScreen(void)
demoDelayLeft = demoDelayTime;
demoIdleLeft = demoIdleTime;
ttbanner = W_CachePatchName("TTKBANNR", PU_PATCH_LOWPRIORITY);
ttkart = W_CachePatchName("TTKART", PU_PATCH_LOWPRIORITY);
ttcheckers = W_CachePatchName("TTCHECK", PU_PATCH_LOWPRIORITY);
ttkflash = W_CachePatchName("TTKFLASH", PU_PATCH_LOWPRIORITY);
ttbanner = W_CachePatchName("TTKBANNR", PU_PATCH);
ttkart = W_CachePatchName("TTKART", PU_PATCH);
ttcheckers = W_CachePatchName("TTCHECK", PU_PATCH);
ttkflash = W_CachePatchName("TTKFLASH", PU_PATCH);
}
// (no longer) De-Demo'd Title Screen
@@ -1419,6 +1412,7 @@ void F_EndCutScene(void)
}
}
// custom intros
void F_StartCustomCutscene(INT32 cutscenenum, boolean precutscene, boolean resetplayer)
{
if (!cutscenes[cutscenenum])
-1
View File
@@ -384,7 +384,6 @@ void F_RunWipe(UINT8 wipetype, boolean drawMenu)
F_DoWipe(fmask);
I_OsPolling();
I_UpdateNoBlit();
if (rendermode != render_none && drawMenu)
{
+2 -1
View File
@@ -484,6 +484,7 @@ void G_ReadDemoTiccmd(ticcmd_t *cmd, INT32 playernum)
G_CopyTiccmd(cmd, &oldcmd[playernum], 1);
// what in the actual fuck is this???
// SRB2kart: Copy-pasted from ticcmd building, removes that crappy demo cam
if (((players[displayplayers[0]].mo && players[displayplayers[0]].speed > 0) // Moving
|| (leveltime > starttime && (cmd->buttons & BT_ACCELERATE && cmd->buttons & BT_BRAKE)) // Rubber-burn turn
@@ -2536,7 +2537,7 @@ void G_DoPlayDemo(char *defdemoname)
UINT8 i, p;
lumpnum_t l;
char skin[17], color[17], *n;
CLEANUP(Z_Pfree) char *pdemoname;
CLEANUP(Z_Pfree) char *pdemoname = NULL;
UINT8 version, subversion;
UINT32 randseed;
char msg[1024];
+12 -11
View File
@@ -276,12 +276,6 @@ UINT32 timesBeatenWithEmeralds = 0;
INT16 prevmap = 0, nextmap = 0;
// Analog Control
void SendWeaponPref(void);
void SendWeaponPref2(void);
void SendWeaponPref3(void);
void SendWeaponPref4(void);
// don't mind me putting these here, I was lazy to figure out where else I could put those without blowing up the compiler.
// chat timer thingy
@@ -3025,7 +3019,8 @@ tryagain:
void G_AddMapToBuffer(INT16 map)
{
INT16 bufx, refreshnum = max(0, TOLMaps(G_TOLFlag(gametype))-3);
const INT32 tolmaps = TOLMaps(G_TOLFlag(gametype));
INT16 bufx, refreshnum = max(0, tolmaps-3);
// Add the map to the buffer.
for (bufx = NUMMAPS-1; bufx > 0; bufx--)
@@ -3438,7 +3433,7 @@ void G_LoadGameData(void)
INT32 i, j;
UINT8 modded = false;
UINT8 rtemp;
savebuffer_t save;
savebuffer_t save = {0};
//For records
tic_t rectime;
@@ -3571,7 +3566,7 @@ void G_SaveGameData(boolean force)
size_t length;
INT32 i, j;
UINT8 btemp;
savebuffer_t save;
savebuffer_t save = {0};
(void)force;
char backupfile[MAX_WADPATH+4];
@@ -3742,7 +3737,7 @@ void G_LoadGame(UINT32 slot, INT16 mapoverride)
size_t length;
char vcheck[VERSIONSIZE];
char savename[255];
savebuffer_t save;
savebuffer_t save = {0};
// memset savedata to all 0, fixes calling perfectly valid saves corrupt because of bots
memset(&savedata, 0, sizeof(savedata));
@@ -3828,7 +3823,7 @@ void G_SaveGame(UINT32 savegameslot)
boolean saved;
char savename[256] = "";
const char *backup;
savebuffer_t save;
savebuffer_t save = {0};
sprintf(savename, savegamename, savegameslot);
backup = va("%s",savename);
@@ -4012,6 +4007,12 @@ void G_InitNew(UINT8 pencoremode, const char *mapname, boolean resetplayer, bool
automapactive = false;
imcontinuing = false;
// HACK: this doesent reset if you change the map from within a replay and may cause crashes or the replayhut to be non functional
if (!demo.playback && demo.inreplayhut)
{
M_ResetDemoList();
}
if (!skipprecutscene && mapheaderinfo[gamemap-1]->precutscenenum && !modeattacking) // Start a custom cutscene.
F_StartCustomCutscene(mapheaderinfo[gamemap-1]->precutscenenum-1, true, resetplayer);
else
+1 -1
View File
@@ -160,7 +160,7 @@ typedef enum
const char *G_BuildMapName(INT32 map);
void G_BuildTiccmd(ticcmd_t *cmd, INT32 realtics, UINT8 ssplayer);
// copy ticcmd_t to and fro the normal way
// copy ticcmd_t to and from the normal way
ticcmd_t *G_CopyTiccmd(ticcmd_t* dest, const ticcmd_t* src, const size_t n);
// copy ticcmd_t to and fro network packets
ticcmd_t *G_MoveTiccmd(ticcmd_t* dest, const ticcmd_t* src, const size_t n);
+186 -11
View File
@@ -58,12 +58,21 @@ static void led_off_handle3(void);
static void led_off_handle4(void);
consvar_t cv_rumble[MAXSPLITSCREENPLAYERS] = {
{"rumble", "Off", CV_SAVE|CV_CALL|CV_NOINIT, CV_OnOff, rumble_off_handle, 0, NULL, NULL, 0, 0, NULL},
{"rumble", "Off", CV_SAVE|CV_CALL|CV_NOINIT, CV_OnOff, rumble_off_handle, 0, NULL, NULL, 0, 0, NULL},
{"rumble2", "Off", CV_SAVE|CV_CALL|CV_NOINIT, CV_OnOff, rumble_off_handle2, 0, NULL, NULL, 0, 0, NULL},
{"rumble3", "Off", CV_SAVE|CV_CALL|CV_NOINIT, CV_OnOff, rumble_off_handle3, 0, NULL, NULL, 0, 0, NULL},
{"rumble4", "Off", CV_SAVE|CV_CALL|CV_NOINIT, CV_OnOff, rumble_off_handle4, 0, NULL, NULL, 0, 0, NULL}
};
static CV_PossibleValue_t rumblestrength_cons_t[] = {{FRACUNIT/4, "MIN"}, {FRACUNIT*4, "MAX"}, {0, NULL}};
consvar_t cv_rumblestrength[MAXSPLITSCREENPLAYERS] = {
{"rumblestrength", "1.0", CV_SAVE|CV_FLOAT, rumblestrength_cons_t, NULL, 0, NULL, NULL, 0, 0, NULL},
{"rumblestrength2", "1.0", CV_SAVE|CV_FLOAT, rumblestrength_cons_t, NULL, 0, NULL, NULL, 0, 0, NULL},
{"rumblestrength3", "1.0", CV_SAVE|CV_FLOAT, rumblestrength_cons_t, NULL, 0, NULL, NULL, 0, 0, NULL},
{"rumblestrength4", "1.0", CV_SAVE|CV_FLOAT, rumblestrength_cons_t, NULL, 0, NULL, NULL, 0, 0, NULL}
};
static CV_PossibleValue_t gamepadled_cons_t[] = {{0, "Off"}, {1, "Skincolor"}, {2, "Mobjcolor"}, {0, NULL}};
consvar_t cv_gamepadled[MAXSPLITSCREENPLAYERS] = {
{"gamepadled", "Skincolor", CV_SAVE|CV_CALL|CV_NOINIT, gamepadled_cons_t, led_off_handle, 0, NULL, NULL, 0, 0, NULL},
@@ -875,11 +884,13 @@ static const char *gamecontrolname[num_gamecontrols] =
#include "k_kart.h"
UINT16 G_GetSkinColor(INT32 playernum)
UINT8 G_GetSkinColorForGamepad(INT32 playernum)
{
I_Assert(playernum >= 0 && playernum < MAXSPLITSCREENPLAYERS);
if (gamestate == GS_LEVEL)
{
player_t *player = &players[displayplayers[playernum]];
const player_t *player = &players[displayplayers[playernum]];
if (player)
{
@@ -897,13 +908,13 @@ UINT16 G_GetSkinColor(INT32 playernum)
switch (playernum)
{
case 0:
return cv_playercolor.value;
return (UINT8)cv_playercolor.value;
case 1:
return cv_playercolor2.value;
return (UINT8)cv_playercolor2.value;
case 2:
return cv_playercolor3.value;
return (UINT8)cv_playercolor3.value;
case 3:
return cv_playercolor4.value;
return (UINT8)cv_playercolor4.value;
default:
return 0;
}
@@ -911,19 +922,23 @@ UINT16 G_GetSkinColor(INT32 playernum)
return 0;
}
void G_SetPlayerGamepadIndicatorColor(INT32 playernum, UINT16 color)
// Sets the Indicator LED on supported gamepads to a desired skincolor
// pass SKINCOLOR_NONE/0 to set the players skin color
void G_SetPlayerGamepadIndicatorColor(INT32 playernum, UINT8 color)
{
UINT16 skincolor;
UINT8 skincolor;
byteColor_t byte_color;
I_Assert(playernum >= 0 && playernum < MAXSPLITSCREENPLAYERS);
if (cv_gamepadled[playernum].value == 0)
if (cv_gamepadled[playernum].value == 0
|| color >= MAXTRANSLATIONS)
{
return;
}
skincolor = color ? color : G_GetSkinColor(playernum);
// so we can override this
skincolor = color ? color : G_GetSkinColorForGamepad(playernum);
byte_color = V_GetColor(colortranslations[skincolor][8]).s;
I_SetGamepadIndicatorColor(playernum, byte_color.red, byte_color.green, byte_color.blue);
@@ -936,7 +951,41 @@ static void G_ResetPlayerGamepadIndicatorColor(INT32 playernum)
I_SetGamepadIndicatorColor(playernum, 0, 0, 255);
}
else
{
G_SetPlayerGamepadIndicatorColor(playernum, 0);
}
}
static UINT8 curcolor[MAXSPLITSCREENPLAYERS] = {};
void G_DeviceLEDTick(void)
{
UINT8 i, newcolor;
if (numcontrollers == 0)
{
return;
}
for (i = 0; i <= splitscreen; i++)
{
if (!cv_usejoystick[i].value || !cv_gamepadled[i].value)
continue;
newcolor = G_GetSkinColorForGamepad(i);
if (curcolor[i] == newcolor) // dont update if same colour
continue;
G_SetPlayerGamepadIndicatorColor(i, newcolor);
curcolor[i] = newcolor;
}
}
// ensures next call to G_DeviceLEDTick will refresh the gamepad led
void G_ResetDeviceLED(void)
{
memset(curcolor, 0, sizeof(curcolor));
}
static void G_ResetPlayerDeviceRumble(INT32 playernum)
@@ -963,9 +1012,135 @@ void G_PlayerDeviceRumble(INT32 playernum, UINT16 low_strength, UINT16 high_stre
return;
}
// doesent need to be super precise
// but ensure this is within range (0-65535)
// placed here so it applies to lua aswell
low_strength = (UINT16)min(FixedMul(low_strength, cv_rumblestrength[playernum].value), UINT16_MAX);
high_strength = (UINT16)min(FixedMul(high_strength, cv_rumblestrength[playernum].value), UINT16_MAX);
I_GamepadRumble(playernum, low_strength, high_strength, duration);
}
// rumble strengths
enum
{
RUMBLE_VERYSTRONG = FRACUNIT / 4, // 16384
RUMBLE_STRONG = FRACUNIT / 8, // 8192
RUMBLE_MODERATE = FRACUNIT / 64, // 1024
RUMBLE_WEAK = FRACUNIT / 128, // 512
RUMBLE_VERYWEAK = FRACUNIT / 256, // 256
};
// Controller rumble!
// this keeps track of a bunch of things
// and makes your controller rumble accordingly
void G_DeviceRumbleTick(void)
{
UINT8 i;
if (dedicated || numcontrollers == 0 || gamestate != GS_LEVEL)
{
return;
}
for (i = 0; i <= splitscreen; i++)
{
if (!cv_usejoystick[i].value || !cv_rumble[i].value)
{
continue;
}
if (camera[i].freecam)
{
continue;
}
// SDL rumble strength goes from a range or 0-65535 respectively
// the higher, the stronger it is
UINT16 low = 0, high = 0;
// for how long the action should rumble, in ms
UINT16 lenght = 57; // 57ms is a short pulse, matches super well with this updating once per tic
const player_t *player = P_GetLocalPlayerForNum(i);
// allow lua to do some crap for spectators
if (player->spectator || !player->mo)
{
continue;
}
// reset the rumble if you exit or are ded lel
if (player->exiting ||
player->playerstate == PST_DEAD ||
player->kartstuff[k_respawn] > 1)
{
G_PlayerDeviceRumble(i, low, high, 0);
continue;
}
if (player->kartstuff[k_spinouttimer])
{
//low = high = FRACUNIT / 6;
low = high = FixedMul((RUMBLE_VERYSTRONG), (FixedDiv(player->kartstuff[k_spinouttimer], (3*TICRATE / 2)))); // try do some some kinda fadeout, 3*TICRATE / 2 is the "default" spinout time
}
else if (player->kartstuff[k_sneakertimer] > (sneakertime-(TICRATE/2)))
{
low = high = RUMBLE_STRONG;
}
else if ((player->kartstuff[k_offroad])
&& player->speed != 0
&& P_IsObjectOnGround(player->mo))
{
// weaken this depending on if you got hyu or invinc
if (player->kartstuff[k_hyudorotimer])
{
high = RUMBLE_WEAK;
}
else if (player->kartstuff[k_invincibilitytimer])
{
high = RUMBLE_MODERATE;
}
else
{
low = high = RUMBLE_MODERATE;
}
}
else if ((player->kartstuff[k_bananadrag] > TICRATE)
&& player->speed != 0
&& P_IsObjectOnGround(player->mo))
{
if (leveltime & 1) // this is actually funny lel
high = RUMBLE_MODERATE;
}
if (player->kartstuff[k_brakedrift])
{
high = CLAMP((high + RUMBLE_VERYWEAK), 0, UINT16_MAX);
}
// pulse when gettin new driftlevel
// let this come last
if (player->kartstuff[k_driftcharge]
&& player->driftlevel)
{
high = CLAMP((high + RUMBLE_VERYWEAK), 0, UINT16_MAX);
if (player->driftlevel == 2)
lenght = 114;
else if (player->driftlevel == 3)
lenght = 174;
}
// hack alert! i just dont want this thing constantly resetting the rumble lol
if (low == 0 && high == 0)
{
continue;
}
G_PlayerDeviceRumble(i, low, high, lenght);
}
}
//
// Detach any keys associated to the given game control
// - pass the pointer to the gamecontrol table for the player being edited
+9 -4
View File
@@ -113,6 +113,7 @@ extern consvar_t cv_mousesens, cv_mouseysens;
extern consvar_t cv_controlperkey;
extern consvar_t cv_turnsmooth[MAXSPLITSCREENPLAYERS];
extern consvar_t cv_rumble[MAXSPLITSCREENPLAYERS];
extern consvar_t cv_rumblestrength[MAXSPLITSCREENPLAYERS];
extern consvar_t cv_gamepadled[MAXSPLITSCREENPLAYERS];
extern INT32 mousex, mousey;
@@ -131,13 +132,17 @@ extern INT32 gamecontrol[MAXSPLITSCREENPLAYERS][num_gamecontrols][2];
#define PLAYER3INPUTDOWN(gc) (gamekeydown[gamecontrol[2][gc][0]] || gamekeydown[gamecontrol[2][gc][1]])
#define PLAYER4INPUTDOWN(gc) (gamekeydown[gamecontrol[3][gc][0]] || gamekeydown[gamecontrol[3][gc][1]])
// peace to my little coder fingers!
// check a gamecontrol being active or not
UINT8 G_GetSkinColorForGamepad(INT32 playernum);
void G_SetPlayerGamepadIndicatorColor(INT32 playernum, UINT8 color);
void G_DeviceLEDTick(void);
void G_ResetDeviceLED(void);
UINT16 G_GetSkinColor(INT32 playernum);
void G_SetPlayerGamepadIndicatorColor(INT32 playernum, UINT16 color);
void G_ResetAllDeviceRumbles(void);
void G_PlayerDeviceRumble(INT32 playernum, UINT16 low_strength, UINT16 high_strength, UINT32 duration);
void G_DeviceRumbleTick(void);
// peace to my little coder fingers!
// check a gamecontrol being active or not
// remaps the input event to a game control.
void G_MapEventsToControls(event_t *ev);
+42 -30
View File
@@ -21,28 +21,28 @@
// The texture for the next polygon given to HWR_ProcessPolygon.
// Set with HWR_SetCurrentTexture.
GLMipmap_t *current_texture = NULL;
static GLMipmap_t *current_texture = NULL;
boolean currently_batching = false;
static boolean currently_batching = false;
FOutVector* finalVertexArray = NULL;// contains subset of sorted vertices and texture coordinates to be sent to gpu
UINT32* finalVertexIndexArray = NULL;// contains indexes for glDrawElements, taking into account fan->triangles conversion
static FOutVector* finalVertexArray = NULL;// contains subset of sorted vertices and texture coordinates to be sent to gpu
static UINT32* finalVertexIndexArray = NULL;// contains indexes for glDrawElements, taking into account fan->triangles conversion
// NOTE have this alloced as 3x finalVertexArray size
int finalVertexArrayAllocSize = 65536;
static int finalVertexArrayAllocSize = 65536;
//GLubyte* colorArray = NULL;// contains color data to be sent to gpu, if needed
//int colorArrayAllocSize = 65536;
// not gonna use this for now, just sort by color and change state when it changes
// later maybe when using vertex attributes if it's needed
PolygonArrayEntry* polygonArray = NULL ;// contains the polygon data from DrawPolygon, waiting to be processed
PolygonArrayEntry **polygonArraySorted = NULL; // contains sorted pointers to polygonArray
int polygonArraySize = 0;
int polygonArrayAllocSize = 65536;
static PolygonArrayEntry* polygonArray = NULL ;// contains the polygon data from DrawPolygon, waiting to be processed
static PolygonArrayEntry **polygonArraySorted = NULL; // contains sorted pointers to polygonArray
static int polygonArraySize = 0;
static int polygonArrayAllocSize = 65536;
FOutVector* unsortedVertexArray = NULL; // contains unsorted vertices and texture coordinates from DrawPolygon
int unsortedVertexArraySize = 0;
int unsortedVertexArrayAllocSize = 65536;
static FOutVector* unsortedVertexArray = NULL; // contains unsorted vertices and texture coordinates from DrawPolygon
static int unsortedVertexArraySize = 0;
static int unsortedVertexArrayAllocSize = 65536;
// Enables batching mode. HWR_ProcessPolygon will collect polygons instead of passing them directly to the rendering backend.
// Call HWR_RenderBatches to render all the collected geometry.
@@ -126,8 +126,9 @@ void HWR_ProcessPolygon(FSurfaceInfo *pSurf, FOutVector *pOutVerts, FUINT iNumPt
if (!(PolyFlags & PF_NoTexture) && !horizonSpecial)
{
// use FNV-1a to hash polygons for later sorting.
INT32 hash = 0x811c9dc5;
#define DIGEST(h, x) h ^= (x); h *= 0x01000193
UINT32 hash = 0x811c9dc5;
UINT32 prime = 0x1000193;
#define DIGEST(h, x) h ^= ((UINT32)(x)); h *= prime
if (current_texture)
{
DIGEST(hash, current_texture->downloaded);
@@ -148,7 +149,7 @@ void HWR_ProcessPolygon(FSurfaceInfo *pSurf, FOutVector *pOutVerts, FUINT iNumPt
}
#undef DIGEST
// remove the sign bit to ensure that skybox and horizon line comes first.
polygonArray[polygonArraySize-1].hash = (hash & INT32_MAX);
polygonArray[polygonArraySize-1].hash = (INT32)(hash & INT32_MAX);
}
memcpy(&unsortedVertexArray[unsortedVertexArraySize], pOutVerts, iNumPts * sizeof(FOutVector));
@@ -168,8 +169,10 @@ static int comparePolygons(const void *p1, const void *p2)
const PolygonArrayEntry *poly1 = *(PolygonArrayEntry *const *)p1;
const PolygonArrayEntry *poly2 = *(PolygonArrayEntry *const *)p2;
const int shader1 = (poly1->polyFlags & PF_NoTexture || poly1->horizonSpecial) ? -1 : poly1->shader;
const int shader2 = (poly2->polyFlags & PF_NoTexture || poly2->horizonSpecial) ? -1 : poly2->shader;
// special case with signedness to prevent overflowing
// FIXME: check for prediction slowdowns!
const int shader1 = poly1->hash & 0x80000000 ? -1 : poly1->shader;
const int shader2 = poly2->hash & 0x80000000 ? -1 : poly2->shader;
// skywalls and horizon lines must retain their order for horizon lines to work
if (shader1 == -1 && shader2 == -1)
@@ -210,8 +213,8 @@ static int comparePolygonsNoShaders(const void *p1, const void *p2)
const PolygonArrayEntry *poly1 = *(PolygonArrayEntry *const *)p1;
const PolygonArrayEntry *poly2 = *(PolygonArrayEntry *const *)p2;
const GLMipmap_t *texture1 = (poly1->polyFlags & PF_NoTexture || poly1->horizonSpecial) ? NULL : poly1->texture;
const GLMipmap_t *texture2 = (poly2->polyFlags & PF_NoTexture || poly2->horizonSpecial) ? NULL : poly2->texture;
const GLMipmap_t *texture1 = poly1->hash & 0x80000000 ? NULL : poly1->texture;
const GLMipmap_t *texture2 = poly1->hash & 0x80000000 ? NULL : poly2->texture;
// skywalls and horizon lines must retain their order for horizon lines to work
if (!texture1 && !texture2)
@@ -219,6 +222,7 @@ static int comparePolygonsNoShaders(const void *p1, const void *p2)
UINT32 downloaded1 = texture1 ? texture1->downloaded : 0; // there should be a opengl texture name here, usable for comparisons
UINT32 downloaded2 = texture2 ? texture2->downloaded : 0;
diff64 = downloaded1 - downloaded2;
if (diff64 != 0) return diff64;
@@ -233,7 +237,7 @@ static int comparePolygonsNoShaders(const void *p1, const void *p2)
// This function organizes the geometry collected by HWR_ProcessPolygon calls into batches and uses
// the rendering backend to draw them.
void HWR_RenderBatches(void)
void HWR_RenderBatches(boolean sort)
{
int finalVertexWritePos = 0; // position in finalVertexArray
int finalIndexWritePos = 0; // position in finalVertexIndexArray
@@ -260,7 +264,7 @@ void HWR_RenderBatches(void)
nextSurfaceInfo.LightInfo.light_level = 0;
nextSurfaceInfo.LightInfo.directional = false;
currently_batching = false;// no longer collecting batches
currently_batching = false; // no longer collecting batches
if (!polygonArraySize)
{
@@ -270,6 +274,8 @@ void HWR_RenderBatches(void)
return;// nothing to draw
}
const boolean useshader = HWR_UseShader();
// init stats vars
ps_hw_numpolys.value.i = polygonArraySize;
ps_hw_numcalls.value.i = ps_hw_numverts.value.i = 0;
@@ -282,10 +288,13 @@ void HWR_RenderBatches(void)
polygonArraySorted[i] = &polygonArray[i];
}
// sort polygons
PS_START_TIMING(ps_hw_batchsorttime);
qs22j(polygonArraySorted, polygonArraySize, sizeof(PolygonArrayEntry *), (HWR_UseShader() ? comparePolygons : comparePolygonsNoShaders));
PS_STOP_TIMING(ps_hw_batchsorttime);
if (sort)
{
// sort polygons
PS_START_TIMING(ps_hw_batchsorttime);
qs22j(polygonArraySorted, polygonArraySize, sizeof(PolygonArrayEntry *), (useshader ? comparePolygons : comparePolygonsNoShaders));
PS_STOP_TIMING(ps_hw_batchsorttime);
}
// sort order
// 1. shader
@@ -294,7 +303,9 @@ void HWR_RenderBatches(void)
// 4. colors + light level
// not sure about what order of the last 2 should be, or if it even matters
PS_START_TIMING(ps_hw_batchdrawtime);
// dont overwrite this on consecutive calls
if (!sort)
PS_START_TIMING(ps_hw_batchdrawtime);
currentShader = polygonArraySorted[0]->shader;
currentTexture = polygonArraySorted[0]->texture;
@@ -305,7 +316,7 @@ void HWR_RenderBatches(void)
// set state for first batch
if (HWR_UseShader())
if (useshader)
{
GL_SetShader(currentShader);
}
@@ -387,7 +398,7 @@ void HWR_RenderBatches(void)
if (nextPolyFlags & PF_NoTexture)
nextTexture = 0;
if (currentShader != nextShader && HWR_UseShader())
if (useshader && currentShader != nextShader)
{
changeState = true;
changeShader = true;
@@ -405,7 +416,7 @@ void HWR_RenderBatches(void)
changePolyFlags = true;
}
if (HWR_UseShader())
if (useshader)
{
if (currentSurfaceInfo.PolyColor.rgba != nextSurfaceInfo.PolyColor.rgba ||
currentSurfaceInfo.TintColor.rgba != nextSurfaceInfo.TintColor.rgba ||
@@ -489,7 +500,8 @@ void HWR_RenderBatches(void)
polygonArraySize = 0;
unsortedVertexArraySize = 0;
PS_STOP_TIMING(ps_hw_batchdrawtime);
if (!sort)
PS_STOP_TIMING(ps_hw_batchdrawtime);
}
#endif // HWRENDER
+1 -1
View File
@@ -37,7 +37,7 @@ typedef struct
void HWR_StartBatching(void);
void HWR_SetCurrentTexture(GLMipmap_t *texture);
void HWR_ProcessPolygon(FSurfaceInfo *pSurf, FOutVector *pOutVerts, FUINT iNumPts, FBITFIELD PolyFlags, int shader, boolean horizonSpecial);
void HWR_RenderBatches(void);
void HWR_RenderBatches(boolean sort);
#ifdef __cplusplus
} // extern "C"
+1 -1
View File
@@ -538,7 +538,7 @@ static void loading_status(void)
x = BASEVIDWIDTH/2;
y = BASEVIDHEIGHT/2;
V_DrawFill(0, 0, BASEVIDWIDTH, BASEVIDHEIGHT, 31); // Black background to match fade in effect
//V_DrawPatchFill(W_CachePatchName("SRB2BACK", PU_PATCH)); // SRB2 background, ehhh too bright.
//V_DrawPatchFill(srb2back); // SRB2 background, ehhh too bright.
M_DrawTextBox(x-58, y-8, 13, 1);
V_DrawString(x-50, y, V_YELLOWMAP, "Loading...");
V_DrawRightAlignedString(x+50, y, V_YELLOWMAP, s);
@@ -15,6 +15,8 @@
#ifdef HWRENDER
#include <unordered_set>
#include "hw_main.h"
#include "hw_glob.h"
#include "hw_gl.h"
@@ -36,7 +38,7 @@
INT32 patchformat = GL_TEXFMT_AP_88; // use alpha for holes
INT32 textureformat = GL_TEXFMT_P_8; // use chromakey for hole
RGBA_t mapPalette[256] = {0}; // the palette for the currently loaded level or menu etc.
RGBA_t mapPalette[256] = {}; // the palette for the currently loaded level or menu etc.
static void HWR_FreeTextureColormaps(patch_t *patch);
@@ -98,7 +100,7 @@ static void HWR_DrawColumnInCache(const column_t *patchcol, UINT8 *block, GLMipm
position = 0;
}
position = max(((position * scale_y) + (FRACUNIT/2)) >> FRACBITS, 0);
position = std::max(((position * scale_y) + (FRACUNIT/2)) >> FRACBITS, 0);
if (position + count >= pblockheight)
count = pblockheight - position;
@@ -162,7 +164,7 @@ static void HWR_DrawPatchInCache(GLMipmap_t *mipmap,
fixed_t xfrac, xfracstep;
fixed_t yfracstep, scale_y;
const column_t *patchcol;
UINT8 *block = mipmap->data;
UINT8 *block = static_cast<UINT8 *>(mipmap->data);
INT32 bpp;
INT32 blockmodulo;
RGBA_t *palette;
@@ -212,7 +214,7 @@ static void HWR_DrawTexturePatchInCache(GLMipmap_t *mipmap,
fixed_t xfrac, xfracstep;
fixed_t yfracstep, scale_y;
const column_t *patchcol;
UINT8 *block = mipmap->data;
UINT8 *block = static_cast<UINT8 *>(mipmap->data);
INT32 bpp;
INT32 blockmodulo;
INT32 width, height;
@@ -287,8 +289,8 @@ static UINT8 *MakeBlock(GLMipmap_t *glMipmap)
UINT16 bu16 = ((0x00 <<8) | HWR_PATCHES_CHROMAKEY_COLORINDEX);
INT32 blocksize = (glMipmap->width * glMipmap->height);
bpp = format2bpp(glMipmap->format);
block = Z_Malloc(blocksize*bpp, PU_HWRCACHE, &(glMipmap->data));
bpp = format2bpp(glMipmap->format);
block = static_cast<UINT8 *>(Z_Malloc(blocksize*bpp, PU_HWRCACHE, &(glMipmap->data)));
switch (bpp)
{
@@ -325,7 +327,7 @@ static void HWR_GenerateTexture(INT32 texnum, GLMapTexture_t *gltex, boolean noe
texture = textures[texnum];
gltex->mipmap.flags = TF_CHROMAKEYED | TF_WRAPXY;
gltex->mipmap.format = textureformat;
gltex->mipmap.format = static_cast<GLTextureFormat_t>(textureformat);
// hack the Legacy skies..
if (UNLIKELY(memcmp(texture->name, "SKY", 3) == 0 &&
@@ -344,7 +346,7 @@ static void HWR_GenerateTexture(INT32 texnum, GLMapTexture_t *gltex, boolean noe
colormap += COLORMAP_REMAPOFFSET;
#endif
gltex->mipmap.colormap = Z_Calloc(sizeof(*gltex->mipmap.colormap), PU_HWRPATCHCOLMIPMAP, NULL);
gltex->mipmap.colormap = static_cast<GLColormap_t *>(Z_Calloc(sizeof(*gltex->mipmap.colormap), PU_HWRPATCHCOLMIPMAP, NULL));
gltex->mipmap.colormap->source = colormap;
memcpy(gltex->mipmap.colormap->data, colormap, 256 * sizeof(UINT8));
@@ -377,7 +379,7 @@ static void HWR_GenerateTexture(INT32 texnum, GLMapTexture_t *gltex, boolean noe
// Composite the columns together.
for (i = 0, patch = texture->patches; i < texture->patchcount; i++, patch++)
{
pdata = W_CacheLumpNumPwad(patch->wad, patch->lump, PU_LEVEL);
pdata = static_cast<UINT8 *>(W_CacheLumpNumPwad(patch->wad, patch->lump, PU_LEVEL));
realpatch = (softwarepatch_t *)pdata;
HWR_DrawTexturePatchInCache(&gltex->mipmap, blockwidth, blockheight, texture, patch, realpatch);
@@ -413,7 +415,7 @@ void HWR_MakePatch(const patch_t *patch, GLPatch_t *glPatch, GLMipmap_t *glMipma
glMipmap->flags = 0;
// setup the texture info
glMipmap->format = patchformat;
glMipmap->format = static_cast<GLTextureFormat_t>(patchformat);
glPatch->max_s = (float)patch->width / (float)glMipmap->width;
glPatch->max_t = (float)patch->height / (float)glMipmap->height;
@@ -455,12 +457,13 @@ static void HWR_FreeTextureData(patch_t *patch)
if (!patch || !patch->hardware)
return;
glPatch = patch->hardware;
glPatch = static_cast<GLPatch_t *>(patch->hardware);
if (vid.glstate == VID_GL_LIBRARY_LOADED)
GL_DeleteTexture(glPatch->mipmap);
Z_Free(glPatch->mipmap->data);
glPatch->mipmap->data = NULL;
}
void HWR_FreeTexture(patch_t *patch)
@@ -470,7 +473,7 @@ void HWR_FreeTexture(patch_t *patch)
if (patch->hardware)
{
GLPatch_t *glPatch = patch->hardware;
GLPatch_t *glPatch = static_cast<GLPatch_t *>(patch->hardware);
HWR_FreeTextureColormaps(patch);
@@ -478,6 +481,7 @@ void HWR_FreeTexture(patch_t *patch)
{
HWR_FreeTextureData(patch);
Z_Free(glPatch->mipmap);
glPatch->mipmap = NULL;
}
Z_Free(patch->hardware);
@@ -495,7 +499,7 @@ static void HWR_FreeTextureColormaps(patch_t *patch)
if (!patch)
return;
pat = patch->hardware;
pat = static_cast<GLPatch_t *>(patch->hardware);
if (!pat)
return;
@@ -577,6 +581,9 @@ void HWR_InitMapTextures(void)
static void FreeMapTexture(GLMapTexture_t *tex)
{
if (!tex)
return;
GL_DeleteTexture(&tex->mipmap);
Z_Free(tex->mipmap.data);
tex->mipmap.data = NULL;
@@ -586,6 +593,12 @@ void HWR_FreeMapTextures(void)
{
size_t i;
if (!gl_textures)
{
gl_numtextures = 0;
return;
}
for (i = 0; i < gl_numtextures; i++)
{
FreeMapTexture(&gl_textures[i].normal);
@@ -596,18 +609,30 @@ void HWR_FreeMapTextures(void)
// now the heap don't have any 'user' pointing to our
// texturecache info, we can free it
if (gl_textures)
free(gl_textures);
free(gl_textures);
gl_textures = NULL;
gl_numtextures = 0;
}
static void HWR_PrecacheLevelFlats(void)
{
// lookup for flats that may´ve been already loaded
// too lazy to make a hashtable or smth so unordered set will do :carbuncle:
std::unordered_set<UINT32> flatpresent;
lumpnum_t lump;
size_t i, j;
INT32 k;
auto load_flat = [&](lumpnum_t lump, boolean noencoremap)
{
// flat already loaded?
if (flatpresent.count(lump) == 0)
{
HWR_GetFlat(lump, noencoremap);
flatpresent.insert(lump);
}
};
// special case for encore
#ifdef GLENCORE
if (encoremap)
@@ -624,16 +649,16 @@ static void HWR_PrecacheLevelFlats(void)
const INT32 pic = ceiling ? sec->ceilingpic : sec->floorpic;
const levelflat_t *levelflat = &levelflats[pic];
lump = levelflat->lumpnum;
HWR_GetFlat(lump, R_NoEncore(sec, ceiling));
if (levelflat->speed) // it is an animated flat
load_flat(lump, R_NoEncore(sec, ceiling));
if (levelflat->speed) // is it an animated flat ?
{
for (k = 1; k < levelflat->numpics; k++)
// start from 0, occasionally basenumlump != flat->lumpnum
for (k = 0; k < levelflat->numpics; k++)
{
lump = levelflat->baselumpnum + k;
HWR_GetFlat(lump, R_NoEncore(sec, ceiling));
load_flat(levelflat->baselumpnum + k, R_NoEncore(sec, ceiling));
}
}
}
@@ -649,15 +674,15 @@ static void HWR_PrecacheLevelFlats(void)
const levelflat_t *levelflat = &levelflats[i];
lump = levelflat->lumpnum;
HWR_GetFlat(lump, false);
load_flat(lump, false);
if (!levelflat->speed) // is it an animated flat ?
continue;
for (k = 1; k < levelflat->numpics; k++)
if (levelflat->speed) // is it an animated flat ?
{
lump = levelflat->baselumpnum + k;
HWR_GetFlat(lump, false);
// start from 0, occasionally basenumlump != flat->lumpnum
for (k = 0; k < levelflat->numpics; k++)
{
load_flat(levelflat->baselumpnum + k, false);
}
}
}
}
@@ -670,7 +695,7 @@ static void HWR_PrecacheLevelTextures(void)
size_t i, j, f;
INT32 h;
texturepresent = calloc(numtextures, sizeof (*texturepresent));
texturepresent = static_cast<char *>(calloc(gl_numtextures, sizeof(*texturepresent)));
if (texturepresent == NULL)
I_Error("%s: Out of memory looking up textures", "HWR_PrecacheLevel");
@@ -701,7 +726,10 @@ static void HWR_PrecacheLevelTextures(void)
{
const INT32 texnum = sidetex[f];
if (texnum < 0 || texnum >= numtextures || texturepresent[texnum])
if (texnum < 0 || texnum >= (signed)gl_numtextures)
continue;
if (texturepresent[texnum])
continue;
#ifdef GLENCORE
texturepresent[texnum] = 1|noencoremap;
@@ -729,14 +757,16 @@ static void HWR_PrecacheLevelTextures(void)
for (h = 1; h < anim->numpics; h++)
{
const INT32 animtexnum = anim->basepic+h;
if (texpresent & 1)
{
HWR_GetTexture(anim->basepic+h, false);
HWR_GetTexture(animtexnum, false);
}
#ifdef GLENCORE
if (texpresent & 2)
{
HWR_GetTexture(anim->basepic+h, true);
HWR_GetTexture(animtexnum, true);
}
#endif
}
@@ -840,7 +870,7 @@ void HWR_LoadMapTextures(size_t pnumtextures)
HWR_FreeMapTextures();
gl_numtextures = pnumtextures;
gl_textures = calloc(gl_numtextures, sizeof(*gl_textures)); // *2 - 1 for encore-remapped texture and another for noencore texture (unused when not in encore), see: GLMapTextureSet_t
gl_textures = static_cast<GLMapTextureSet_t *>(calloc(gl_numtextures, sizeof(*gl_textures))); // *2 - 1 for encore-remapped texture and another for noencore texture (unused when not in encore), see: GLMapTextureSet_t
if (gl_textures == NULL)
I_Error("HWR_LoadMapTextures: ran out of memory for OpenGL textures. Sad!");
@@ -852,6 +882,7 @@ void HWR_LoadMapTextures(size_t pnumtextures)
GLMapTexture_t *HWR_GetTexture(INT32 tex, boolean noencore)
{
GLMapTexture_t *gltex;
GLMipmap_t *glMipmap;
if (tex < 0 || tex >= (signed)gl_numtextures)
{
@@ -870,19 +901,22 @@ GLMapTexture_t *HWR_GetTexture(INT32 tex, boolean noencore)
gltex = &gl_textures[tex];
#endif
glMipmap = &gltex->mipmap;
// Generate texture if missing from the cache
if (!gltex->mipmap.downloaded)
if (!glMipmap->downloaded)
{
if (!gltex->mipmap.data)
HWR_GenerateTexture(tex, gltex, noencore);
// If hardware does not have the texture, then call GL_SetTexture to upload it
GL_SetTexture(&gltex->mipmap);
GL_SetTexture(glMipmap);
}
HWR_SetCurrentTexture(&gltex->mipmap);
HWR_SetCurrentTexture(glMipmap);
// The system-memory data can be purged now.
Z_ChangeTag(gltex->mipmap.data, PU_HWRCACHE_UNLOCKED);
Z_ChangeTag(glMipmap->data, PU_HWRCACHE_UNLOCKED);
return gltex;
}
@@ -933,7 +967,7 @@ static void HWR_CacheFlat(GLMipmap_t *glMipmap, lumpnum_t flatlumpnum)
W_ReadLump(flatlumpnum, Z_Malloc(size, PU_HWRCACHE, &glMipmap->data));
#ifdef GLENCORE
flat = glMipmap->data;
flat = static_cast<UINT8 *>(glMipmap->data);
for (steppy = 0; steppy < size; steppy++)
{
if (flat[steppy] == HWR_PATCHES_CHROMAKEY_COLORINDEX)
@@ -977,7 +1011,7 @@ void HWR_GetFlat(lumpnum_t flatlumpnum, boolean noencoremap)
if (!noencoremap && encoremap)
colormap += COLORMAP_REMAPOFFSET;
#endif
glMipmap->colormap = Z_Calloc(sizeof(*glMipmap->colormap), PU_HWRPATCHCOLMIPMAP, NULL);
glMipmap->colormap = static_cast<GLColormap_t *>(Z_Calloc(sizeof(*glMipmap->colormap), PU_HWRPATCHCOLMIPMAP, NULL));
glMipmap->colormap->source = colormap;
memcpy(glMipmap->colormap->data, colormap, 256 * sizeof(UINT8));
}
@@ -1001,7 +1035,7 @@ void HWR_GetFlat(lumpnum_t flatlumpnum, boolean noencoremap)
// --------------------+
static void HWR_LoadPatchMipmap(patch_t *patch, GLMipmap_t *glMipmap)
{
GLPatch_t *glPatch = patch->hardware;
GLPatch_t *glPatch = static_cast<GLPatch_t *>(patch->hardware);
if (!glMipmap->downloaded)
{
@@ -1022,8 +1056,8 @@ static void HWR_LoadPatchMipmap(patch_t *patch, GLMipmap_t *glMipmap)
// ----------------------+
static void HWR_UpdatePatchMipmap(patch_t *patch, GLMipmap_t *glMipmap)
{
GLPatch_t *grPatch = patch->hardware;
HWR_MakePatch(patch, grPatch, glMipmap, true);
GLPatch_t *glPatch = static_cast<GLPatch_t *>(patch->hardware);
HWR_MakePatch(patch, glPatch, glMipmap, true);
// If hardware does not have the texture, then call GL_SetTexture to upload it
// If it does have the texture, then call GL_UpdateTexture to update it
@@ -1031,6 +1065,7 @@ static void HWR_UpdatePatchMipmap(patch_t *patch, GLMipmap_t *glMipmap)
GL_SetTexture(glMipmap);
else
GL_UpdateTexture(glMipmap);
HWR_SetCurrentTexture(glMipmap);
// The system-memory data can be purged now.
@@ -1057,7 +1092,7 @@ void HWR_GetMappedPatch(patch_t *patch, const UINT8 *colormap)
if (!patch->hardware)
Patch_CreateGL(patch);
glPatch = patch->hardware;
glPatch = static_cast<GLPatch_t *>(patch->hardware);
// Blatant hack for encore colormapping aside...
if (colormap == colormaps || colormap == NULL || colormap == (const UINT8*)(COLORMAP_REMAPOFFSET))
@@ -1093,12 +1128,12 @@ void HWR_GetMappedPatch(patch_t *patch, const UINT8 *colormap)
// (it have a liste of mipmap)
// this malloc is cleared in HWR_FreeColormapCache
// (...) unfortunately z_malloc fragment alot the memory :(so malloc is better
newMipmap = calloc(1, sizeof (*newMipmap));
newMipmap = static_cast<GLMipmap_t *>(calloc(1, sizeof (*newMipmap)));
if (newMipmap == NULL)
I_Error("%s: Out of memory", "HWR_GetMappedPatch");
glMipmap->nextcolormap = newMipmap;
newMipmap->colormap = Z_Calloc(sizeof(*newMipmap->colormap), PU_HWRPATCHCOLMIPMAP, NULL);
newMipmap->colormap = static_cast<GLColormap_t *>(Z_Calloc(sizeof(*newMipmap->colormap), PU_HWRPATCHCOLMIPMAP, NULL));
newMipmap->colormap->source = colormap;
memcpy(newMipmap->colormap->data, colormap, 256 * sizeof(UINT8));
@@ -1121,7 +1156,7 @@ patch_t *HWR_GetCachedGLPatchPwad(UINT16 wadnum, UINT16 lumpnum)
{
void *ptr = Z_Calloc(sizeof(patch_t), PU_PATCH, &lumpcache[lumpnum]);
Patch_Create(NULL, 0, ptr);
Patch_AllocateHardwarePatch(ptr);
Patch_AllocateHardwarePatch(static_cast<patch_t *>(ptr));
}
return (patch_t *)(lumpcache[lumpnum]);
@@ -1138,7 +1173,7 @@ static void HWR_DrawFadeMaskInCache(GLMipmap_t *mipmap, INT32 pblockwidth, INT32
{
INT32 i,j;
fixed_t posx, posy, stepx, stepy;
UINT8 *block = mipmap->data; // places the data directly into here
UINT8 *block = static_cast<UINT8 *>(mipmap->data); // places the data directly into here
UINT8 *flat;
UINT8 *dest, *src, texel;
RGBA_t col;
@@ -1294,9 +1329,9 @@ void HWR_SetPalette(RGBA_t *palette)
static void HWR_SetPaletteLookup(RGBA_t *palette)
{
int r, g, b;
UINT8 *lut = Z_Malloc(
UINT8 *lut = static_cast<UINT8 *>(Z_Malloc(
HWR_PALETTE_LUT_SIZE*HWR_PALETTE_LUT_SIZE*HWR_PALETTE_LUT_SIZE*sizeof(UINT8),
PU_STATIC, NULL);
PU_STATIC, NULL));
#define STEP_SIZE (256/HWR_PALETTE_LUT_SIZE)
for (b = 0; b < HWR_PALETTE_LUT_SIZE; b++)
{
@@ -1339,7 +1374,7 @@ void HWR_SetMapPalette(void)
if (palsize < 768) // 256 * 3
I_Error("HWR_SetMapPalette: A programmer assumed palette lumps are at least 768 bytes long, but apparently this was a wrong assumption!\n");
RGB_data = W_CacheLumpNum(lumpnum, PU_CACHE);
RGB_data = static_cast<UINT8 *>(W_CacheLumpNum(lumpnum, PU_CACHE));
// we got the RGB palette now, but we need it in RGBA format.
for (i = 0; i < 256; i++)
{
@@ -1374,7 +1409,7 @@ static UINT32 HWR_CreateLightTable(UINT8 *lighttable)
{
UINT32 i, id;
RGBA_t *palette = HWR_GetTexturePalette();
RGBA_t *hw_lighttable = Z_Malloc(256 * 32 * sizeof(RGBA_t), PU_STATIC, NULL);
RGBA_t *hw_lighttable = static_cast<RGBA_t *>(Z_Malloc(256 * 32 * sizeof(RGBA_t), PU_STATIC, NULL));
// To make the palette index -> RGBA mapping easier for the shader,
// the hardware lighttable is composed of RGBA colors instead of palette indices.
+20 -20
View File
@@ -166,6 +166,7 @@ static void gld_clipper_RemoveRange(clipnode_t *range)
{
range->prev->next = range->next;
}
if (range->next)
{
range->next->prev = range->prev;
@@ -177,7 +178,7 @@ static void gld_clipper_RemoveRange(clipnode_t *range)
void gld_clipper_SafeAddClipRange(angle_t startangle, angle_t endangle)
{
if(startangle > endangle)
if (startangle > endangle)
{
// The range has to added in two parts.
gld_clipper_AddClipRange(startangle, ANGLE_MAX);
@@ -319,7 +320,7 @@ angle_t gld_FrustumAngle(angle_t tiltangle)
double floatangle;
angle_t a1;
float tilt = (float)fabs(((double)(int)tiltangle) / ANG1);
float tilt = fabsf(((float)(int)tiltangle) / (float)ANG1);
if (tilt > 90.0f)
tilt = 90.0f;
@@ -330,7 +331,7 @@ angle_t gld_FrustumAngle(angle_t tiltangle)
// ok, this is a gross hack that barely works...
// but at least it doesn't overestimate too much...
clipfov = atan(1 / (GLdouble)projMatrix[0]) * 360.0 / M_PIl;
clipfov = atan(1 / (GLdouble)projMatrix[0]) * 360.0 / M_PI;
floatangle = 2.0 + (45.0 + ((double)tilt / 1.9)) * clipfov / 90.0;
if (floatangle >= 180.0)
return 0xffffffff;
@@ -348,33 +349,32 @@ angle_t gld_FrustumAngle(angle_t tiltangle)
// gld_FrustumSetup
//
static GLdouble viewMatrix[16];
static GLdouble projMatrix[16];
float frustum[6][4];
static float frustum[6][4];
#define CALCMATRIX(a, b, c, d, e, f, g, h)\
(float)(viewMatrix[a] * projMatrix[b] + \
viewMatrix[c] * projMatrix[d] + \
viewMatrix[e] * projMatrix[f] + \
viewMatrix[g] * projMatrix[h])
(modelMatrix[a] * projMatrix[b] + \
modelMatrix[c] * projMatrix[d] + \
modelMatrix[e] * projMatrix[f] + \
modelMatrix[g] * projMatrix[h])
#define NORMALIZE_PLANE(i)\
t = (float)sqrt(\
frustum[i][0] * frustum[i][0] + \
frustum[i][1] * frustum[i][1] + \
frustum[i][2] * frustum[i][2]); \
frustum[i][0] /= t; \
frustum[i][1] /= t; \
frustum[i][2] /= t; \
frustum[i][3] /= t
t = sqrtf(\
frustum[i][0] * frustum[i][0] + \
frustum[i][1] * frustum[i][1] + \
frustum[i][2] * frustum[i][2]); \
frustum[i][0] /= t; \
frustum[i][1] /= t; \
frustum[i][2] /= t; \
frustum[i][3] /= t
void gld_FrustumSetup(void)
{
float t;
float clip[16];
pglGetFloatv(GL_PROJECTION_MATRIX, projMatrix);
pglGetFloatv(GL_MODELVIEW_MATRIX, viewMatrix);
// HWR_SetTransform will take care of this!
//pglGetFloatv(GL_PROJECTION_MATRIX, projMatrix);
//pglGetFloatv(GL_MODELVIEW_MATRIX, modelMatrix);
clip[0] = CALCMATRIX(0, 0, 1, 4, 2, 8, 3, 12);
clip[1] = CALCMATRIX(0, 1, 1, 5, 2, 9, 3, 13);
+1 -1
View File
@@ -16,7 +16,7 @@ extern "C" {
#include "../tables.h"
#include "../doomtype.h"
//#define HAVE_SPHEREFRUSTRUM // enable if you want gld_SphereInFrustum and related code
#define HAVE_SPHEREFRUSTRUM // enable if you want gld_SphereInFrustum and related code
boolean gld_clipper_SafeCheckRange(angle_t startAngle, angle_t endAngle);
void gld_clipper_SafeAddClipRange(angle_t startangle, angle_t endangle);
+2 -2
View File
@@ -65,7 +65,7 @@ typedef struct GLMipmap_s GLMipmap_t;
struct GLMapTexture_s
{
GLMipmap_t mipmap;
float scaleX; //used for scaling textures on walls
float scaleX; // used for scaling textures on walls
float scaleY;
};
typedef struct GLMapTexture_s GLMapTexture_t;
@@ -74,7 +74,7 @@ typedef struct GLMapTexture_s GLMapTexture_t;
struct GLPatch_s
{
GLMipmap_t *mipmap;
float max_s,max_t;
float max_s, max_t;
};
typedef struct GLPatch_s GLPatch_t;
+4 -4
View File
@@ -79,7 +79,7 @@ typedef struct FColorARGB FColorARGB;
// Simple 2D coordinate
typedef struct
{
FLOAT x,y;
FLOAT x, y;
} F2DCoord, v2d_t;
// ======================
@@ -142,8 +142,8 @@ enum
// Transformed vector, as passed to HWR API
typedef struct
{
FLOAT x,y,z;
FLOAT s,t;
FLOAT x, y, z;
FLOAT s, t;
} FOutVector;
typedef struct vbo_vertex_s
@@ -173,7 +173,7 @@ typedef struct
int rows, columns;
int loopcount;
int detail, vertex_count;
int vertex_count;
int texture, width, height;
boolean rebuild; // VBO needs to be rebuilt
-67
View File
@@ -1,67 +0,0 @@
// Emacs style mode select -*- C++ -*-
//-----------------------------------------------------------------------------
//
// Copyright (C) 2005 by SRB2 Jr. Team.
//
// This program is free software; you can redistribute it and/or
// modify it under the terms of the GNU General Public License
// as published by the Free Software Foundation; either version 2
// of the License, or (at your option) any later version.
//
// This program is distributed in the hope that it will be useful,
// but WITHOUT ANY WARRANTY; without even the implied warranty of
// MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
// GNU General Public License for more details.
//-----------------------------------------------------------------------------
/// \file
/// \brief Win32 DLL and Shared Objects API definitions
#ifndef __HWR_DLL_H__
#define __HWR_DLL_H__
// Function declaration for exports from the DLL :
// EXPORT <return-type> HWRAPI(<function-name>) (<arguments>);
// If _CREATE_DLL_ is defined the above declaration translates to :
// __declspec(dllexport) <return-type> WINAPI <function-name> (<arguments>);
// If _CREATE_DLL_ is NOT DEFINED the above declaration translates to :
// __declspec(dllexport) <return->type> (WINAPI *<function-name>) (<arguments>);
#ifdef _CREATE_DLL_
#ifdef __cplusplus
#define EXPORT extern "C"
#else
#define EXPORT
#endif
#ifdef _WIN32
#define HWRAPI(fn) WINAPI fn
#else
#define HWRAPI(fn) fn
#endif
#else // _CREATE_DLL_
#define EXPORT typedef
#ifdef _WIN32
#define HWRAPI(fn) (WINAPI *fn)
#else
#define HWRAPI(fn) (*fn)
#endif
#endif
// ==========================================================================
// MATHS
// ==========================================================================
// Constants
#define DEGREE (0.017453292519943295769236907684883l) // 2*PI/360
void GL_DBG_Printf(const char *format, ...) /*FUNCPRINTF*/;
#define DBG_Printf GL_DBG_Printf
#if defined (__CYGWIN__)
void _init() __attribute__((constructor));
void _fini() __attribute__((destructor));
#else
void _init();
void _fini();
#endif
#endif
+278 -182
View File
@@ -14,6 +14,7 @@
#ifdef HWRENDER
#include <algorithm>
#include <vector>
#include "../doomstat.h"
#include "../doomdef.h"
@@ -83,6 +84,13 @@ float gl_viewsin = 0.0f, gl_viewcos = 0.0f;
static float gl_viewludsin, gl_viewludcos;
static angle_t gl_aimingangle;
static float yaw = 0.0f;
static float inv_yaw = 0.0f;
static float cos_inv_yaw = 0.0f;
static float sin_inv_yaw = 0.0f;
static constexpr float deg2radians = (M_PIf / 180.0f);
seg_t *gl_curline = NULL;
side_t *gl_sidedef = NULL;
line_t *gl_linedef = NULL;
@@ -138,7 +146,7 @@ static void HWR_ProjectPrecipitationSprite(precipmobj_t *thing);
static void HWR_SetTransformAiming(FTransform *trans);
static void HWR_RollTransform(FTransform *tr, angle_t roll);
static void HWR_DoPostProcessor(player_t *player);
static void HWR_DoPostProcessor(void);
static void HWR_SetShaderState(void);
static void HWR_TogglePaletteRendering(void);
@@ -260,7 +268,8 @@ static void CV_screentextures_OnChange(void)
static void CV_glframebuffer_OnChange(void)
{
ONLY_IF_GL_LOADED
if ((cv_glframebuffer.value != 0 && cv_glscreentextures.value != 2) || (!supportFBO && cv_glframebuffer.value != 0)) // screen FBO needs screen textures
if ((cv_glframebuffer.value != 0 && cv_glscreentextures.value != 2)
|| (!supportFBO && cv_glframebuffer.value != 0)) // screen FBO needs screen textures
CV_SetValue(&cv_glframebuffer, 0);
I_DownSample();
@@ -379,7 +388,7 @@ void HWR_ObjectLightLevelPost(gl_vissprite_t *spr, const sector_t *sector, INT32
extralight = FixedMul(extralight, std::min(std::max(0, *lightlevel), 255) * FRACUNIT / 255);
// simple OGL approximation
fixed_t tr = R_QuickCamDist(spr->mobj->x, spr->mobj->y) << FRACBITS;
fixed_t tr = R_QuickCamDist(spr->mobj->x, spr->mobj->y);
fixed_t xscale = FixedDiv((vid.width / 2) << FRACBITS, tr);
// Less change in contrast at further distances, to counteract DOOM diminished light
@@ -1233,6 +1242,9 @@ static inline boolean HWR_BlendMidtextureSurface(FSurfaceInfo *pSurf)
if (LIKELY(!gl_curline->polyseg))
{
// check if linedef alpha is within range
const boolean linealpha = (gl_linedef->alpha >= 0 && gl_linedef->alpha < FRACUNIT);
// set alpha for transparent walls
switch (gl_linedef->special)
{
@@ -1247,19 +1259,23 @@ static inline boolean HWR_BlendMidtextureSurface(FSurfaceInfo *pSurf)
case 221:
case 253:
case 256:
if (gl_linedef->blendmode)
if (gl_linedef->blendmode && linealpha)
blendmode = HWR_SurfaceBlend(gl_linedef->blendmode, R_GetLinedefTransTable(gl_linedef->alpha), pSurf);
else
blendmode = PF_Translucent;
break;
default:
if (gl_linedef->blendmode)
{
if (gl_linedef->alpha >= 0 && gl_linedef->alpha < FRACUNIT)
if (linealpha)
blendmode = HWR_SurfaceBlend(gl_linedef->blendmode, R_GetLinedefTransTable(gl_linedef->alpha), pSurf);
else
blendmode = HWR_GetBlendModeFlag(gl_linedef->blendmode);
}
else if (gl_linedef->alpha >= 0 && gl_linedef->alpha < FRACUNIT)
else if (linealpha)
blendmode = HWR_TranstableToAlpha(R_GetLinedefTransTable(gl_linedef->alpha), pSurf);
else
blendmode = PF_Masked;
break;
}
}
@@ -1351,7 +1367,7 @@ void HWR_ProcessSeg(void) // Sort of like GLWall::Process in GZDoom
// x offset the texture
const fixed_t texturehpeg = gl_sidedef->textureoffset + gl_curline->offset;
const float cliplow = (float)texturehpeg;
const float cliphigh = (float)(texturehpeg + gl_curline->length);
const float cliphigh = ((float)texturehpeg + (float)gl_curline->length);
FUINT lightnum = gl_frontsector->lightlevel;
extracolormap_t *colormap = gl_frontsector->extra_colormap;
@@ -1365,8 +1381,8 @@ void HWR_ProcessSeg(void) // Sort of like GLWall::Process in GZDoom
const INT32 gl_midtexture = R_GetTextureNum(gl_sidedef->midtexture);
GLMapTexture_t *glTex = NULL;
static constexpr float FLOATMAX = INT32_MAX / (float)FRACUNIT;
static constexpr float FLOATMIN = INT32_MIN / (float)FRACUNIT;
static constexpr float FLOATMAX = (float)INT32_MAX / (float)FRACUNIT;
static constexpr float FLOATMIN = (float)INT32_MIN / (float)FRACUNIT;
// two sided line
if (gl_backsector)
@@ -2339,12 +2355,22 @@ static inline void DoAddLine(seg_t* line, angle_t angle1, angle_t angle2)
static sector_t tempsec;
auto do_addline = [&](bool dontdraw) {
// Single sided line?
if (!line->backsector)
{
gld_clipper_SafeAddClipRange(angle2, angle1);
}
else
{
if (line->frontsector == line->backsector)
{
if (R_GetTextureNum(line->sidedef->midtexture) == 0)
{
//e6y: nothing to do here!
return;
}
}
gl_backsector = R_FakeFlat(gl_backsector, &tempsec, NULL, NULL, true);
if (CheckClip(gl_frontsector, gl_backsector))
@@ -2511,25 +2537,25 @@ static boolean HWR_CheckBBox(const fixed_t *bspcoord)
// one if statement will split the space in two for one coordinate
// for example:
// x < BOXLEFT || BOXLEFT || !(x < BOXLEFT) <-- (same as x >= BOXLEFT)
fixed_t mindist;// = min(min(mindist1, mindist2), min(mindist3, mindist4));
fixed_t mindist = 0;// = min(min(mindist1, mindist2), min(mindist3, mindist4));
// new thing
// calculate distance to axis aligned bounding box.
if (viewx < bspcoord[BOXLEFT]) // 1,4,6
{
if (viewy > bspcoord[BOXTOP]) // 1
mindist = R_QuickCamDist(bspcoord[BOXLEFT], bspcoord[BOXTOP]) << FRACBITS;
mindist = R_QuickCamDist(bspcoord[BOXLEFT], bspcoord[BOXTOP]);
else if (viewy < bspcoord[BOXBOTTOM]) // 6
mindist = R_QuickCamDist(bspcoord[BOXLEFT], bspcoord[BOXBOTTOM]) << FRACBITS;
mindist = R_QuickCamDist(bspcoord[BOXLEFT], bspcoord[BOXBOTTOM]);
else // 4
mindist = bspcoord[BOXLEFT] - viewx;
}
else if (viewx > bspcoord[BOXRIGHT]) // 3,5,8
{
if (viewy > bspcoord[BOXTOP]) // 3
mindist = R_QuickCamDist(bspcoord[BOXRIGHT], bspcoord[BOXTOP]) << FRACBITS;
mindist = R_QuickCamDist(bspcoord[BOXRIGHT], bspcoord[BOXTOP]);
else if (viewy < bspcoord[BOXBOTTOM]) // 8
mindist = R_QuickCamDist(bspcoord[BOXRIGHT], bspcoord[BOXBOTTOM]) << FRACBITS;
mindist = R_QuickCamDist(bspcoord[BOXRIGHT], bspcoord[BOXBOTTOM]);
else // 5
mindist = viewx - bspcoord[BOXRIGHT];
}
@@ -2956,7 +2982,7 @@ static void HWR_Subsector(size_t num)
if (anyMoved == true)
{
gl_frontsector->numlights = sub->sector->numlights = 0;
R_Prep3DFloors(gl_frontsector);
R_Prep3DFloors(gl_frontsector, locCeilingHeight);
sub->sector->lightlist = gl_frontsector->lightlist;
sub->sector->numlights = gl_frontsector->numlights;
sub->sector->moved = gl_frontsector->moved = false;
@@ -3004,7 +3030,7 @@ static void HWR_Subsector(size_t num)
// Hack to make things continue to work around slopes.
locCeilingHeight == cullCeilingHeight ? locCeilingHeight : gl_frontsector->ceilingheight,
// We now return you to your regularly scheduled rendering.
PF_Occlude, ceilinglightlevel, levelflats[gl_frontsector->ceilingpic].lumpnum,NULL, 255, ceilingcolormap);
PF_Occlude, ceilinglightlevel, levelflats[gl_frontsector->ceilingpic].lumpnum, NULL, 255, ceilingcolormap);
}
}
}
@@ -3036,8 +3062,8 @@ static void HWR_Subsector(size_t num)
centerHeight = P_GetFFloorBottomZAt(rover, gl_frontsector->soundorg.x, gl_frontsector->soundorg.y);
if (centerHeight <= locCeilingHeight && centerHeight >= locFloorHeight &&
((viewz < bottomCullHeight && !(rover->flags & FF_INVERTPLANES)) ||
(viewz > bottomCullHeight && (rover->flags & FF_BOTHPLANES || rover->flags & FF_INVERTPLANES))))
((viewz < bottomCullHeight && !(rover->flags & FF_INVERTPLANES)) ||
(viewz > bottomCullHeight && (rover->flags & FF_BOTHPLANES || rover->flags & FF_INVERTPLANES))))
{
if (rover->flags & FF_FOG)
{
@@ -3081,9 +3107,9 @@ static void HWR_Subsector(size_t num)
centerHeight = P_GetFFloorTopZAt(rover, gl_frontsector->soundorg.x, gl_frontsector->soundorg.y);
if (centerHeight >= locFloorHeight &&
centerHeight <= locCeilingHeight &&
((viewz > topCullHeight && !(rover->flags & FF_INVERTPLANES)) ||
(viewz < topCullHeight && (rover->flags & FF_BOTHPLANES || rover->flags & FF_INVERTPLANES))))
centerHeight <= locCeilingHeight &&
((viewz > topCullHeight && !(rover->flags & FF_INVERTPLANES)) ||
(viewz < topCullHeight && (rover->flags & FF_BOTHPLANES || rover->flags & FF_INVERTPLANES))))
{
if (rover->flags & FF_FOG)
{
@@ -3162,12 +3188,15 @@ doaddline:
// hurdler: false: we only add the sprites, the walls are drawn first
if (line)
{
// draw sprites first, coz they are clipped to the solidsegs of
// subsectors more 'in front'
if (cv_drawdist.value || current_bsp_culling_distance)
HWR_AddSprites<AddSpritesType::kLimitDist>(gl_frontsector);
else
HWR_AddSprites<AddSpritesType::kNoLimitDist>(gl_frontsector);
if (sub->sector->validcount != validcount)
{
// draw sprites first, coz they are clipped to the solidsegs of
// subsectors more 'in front'
if (cv_drawdist.value || current_bsp_culling_distance)
HWR_AddSprites<AddSpritesType::kLimitDist>(gl_frontsector);
else
HWR_AddSprites<AddSpritesType::kNoLimitDist>(gl_frontsector);
}
//Hurdler: at this point validcount must be the same, but is not because
// gl_frontsector doesn't point anymore to sub->sector due to
@@ -4157,6 +4186,7 @@ static int CompareVisSprites(const void *p1, const void *p2)
static void HWR_SortVisSprites(void)
{
UINT32 i;
for (i = 0; i < gl_visspritecount; i++)
{
gl_vsprorder[i] = HWR_GetVisSprite(i);
@@ -4225,38 +4255,29 @@ typedef struct
// initial size of drawnode array
#define DRAWNODES_INIT_SIZE 64
gl_drawnode_t *drawnodes = NULL;
INT32 numdrawnodes = 0;
INT32 alloceddrawnodes = 0;
// no reason to waste all the allocations since every map will have atleast one translucent thing
static std::vector<gl_drawnode_t> drawnodes;
static void *HWR_CreateDrawNode(gl_drawnode_type_t type)
{
gl_drawnode_t *drawnode;
// if we didnt alloc anything yet, reserve atleast 64 nodes
// dont declare with it as we want our size to be 0!
drawnodes.reserve(DRAWNODES_INIT_SIZE);
if (!drawnodes)
{
alloceddrawnodes = DRAWNODES_INIT_SIZE;
drawnodes = static_cast<gl_drawnode_t*>(Z_Malloc(alloceddrawnodes * sizeof(gl_drawnode_t), PU_LEVEL, &drawnodes));
}
else if (numdrawnodes >= alloceddrawnodes)
{
alloceddrawnodes *= 2;
Z_Realloc(drawnodes, alloceddrawnodes * sizeof(gl_drawnode_t), PU_LEVEL, &drawnodes);
}
drawnode = &drawnodes[numdrawnodes++];
drawnode->type = type;
drawnodes.emplace_back();
drawnodes.back().type = type;
// not sure if returning different pointers to a union is necessary
switch (type)
{
case DRAWNODE_PLANE:
return &drawnode->u.plane;
return &drawnodes.back().u.plane;
case DRAWNODE_POLYOBJECT_PLANE:
return &drawnode->u.polyplane;
return &drawnodes.back().u.polyplane;
case DRAWNODE_WALL:
return &drawnode->u.wall;
return &drawnodes.back().u.wall;
}
return NULL;
}
@@ -4320,11 +4341,15 @@ static int CompareDrawNodePlanes(const void *p1, const void *p2)
// Sorts and renders the list of drawnodes for the scene being rendered.
static void HWR_RenderDrawNodes(void)
{
INT32 i = 0, run_start = 0;
size_t i = 0, run_start = 0;
static std::vector<INT32> sortindex;
sortindex.reserve(DRAWNODES_INIT_SIZE);
// Array for storing the rendering order.
// A list of indices into the drawnodes array.
INT32 *sortindex;
const size_t numdrawnodes = drawnodes.size();
if (!numdrawnodes)
return;
@@ -4333,7 +4358,7 @@ static void HWR_RenderDrawNodes(void)
PS_START_TIMING(ps_hw_nodesorttime);
sortindex = static_cast<INT32*>(Z_Malloc(sizeof(INT32) * numdrawnodes, PU_STATIC, NULL));
sortindex.resize(numdrawnodes);
// Reversed order
for (i = 0; i < numdrawnodes; i++)
@@ -4349,7 +4374,7 @@ static void HWR_RenderDrawNodes(void)
if (drawnodes[sortindex[run_start]].type == DRAWNODE_PLANE)
{
// found it, now look for run end
INT32 run_end; // (inclusive)
size_t run_end; // (inclusive)
for (i = run_start+1; i < numdrawnodes; i++)
{
@@ -4362,7 +4387,7 @@ static void HWR_RenderDrawNodes(void)
if (run_end > run_start) // if there are multiple consecutive planes, not just one
{
// consecutive run of planes found, now sort it
qs22j(sortindex + run_start, run_end - run_start + 1, sizeof(INT32), CompareDrawNodePlanes);
qs22j(sortindex.data() + run_start, run_end - run_start + 1, sizeof(INT32), CompareDrawNodePlanes);
}
run_start = run_end + 1; // continue looking for runs coming right after this one
@@ -4381,6 +4406,9 @@ static void HWR_RenderDrawNodes(void)
// Okay! Let's draw it all! Woo!
GL_SetTransform(&atransform);
if (LIKELY(cv_glbatching.value))
HWR_StartBatching();
for (i = 0; i < numdrawnodes; i++)
{
gl_drawnode_t *drawnode = &drawnodes[sortindex[i]];
@@ -4434,9 +4462,10 @@ static void HWR_RenderDrawNodes(void)
PS_STOP_TIMING(ps_hw_nodedrawtime);
numdrawnodes = 0;
if (LIKELY(cv_glbatching.value))
HWR_RenderBatches(false);
Z_Free(sortindex);
drawnodes.clear(); // clear so our size is 0 again!
}
@@ -4624,9 +4653,10 @@ static void HWR_ProjectSprite(mobj_t *thing)
float tr_x, tr_y;
float tz;
float x1, x2;
float y1, y2;
float z1, z2;
float rightsin, rightcos;
float this_scale;
float thing_scale;
float spritexscale, spriteyscale;
float gz, gzt;
spritedef_t *sprdef;
@@ -4695,10 +4725,6 @@ static void HWR_ProjectSprite(mobj_t *thing)
const boolean vflip = (thing->eflags & MFE_VERTICALFLIP);
const boolean hflip = (!(thing->frame & FF_HORIZONTALFLIP) != !mirrored);
this_scale = FixedToFloat(interp.scale);
spritexscale = FixedToFloat(interp.spritexscale);
spriteyscale = FixedToFloat(interp.spriteyscale);
// decide which patch to use for sprite relative to player
#ifdef RANGECHECK
if ((unsigned)thing->sprite >= numsprites)
@@ -4799,9 +4825,6 @@ static void HWR_ProjectSprite(mobj_t *thing)
flip ^= (1<<rot);
}
if (sprskin && (sprskin->flags & SF_HIRES))
this_scale *= FixedToFloat(sprskin->highresscale);
spr_width = spritecachedinfo[lumpoff].width;
spr_height = spritecachedinfo[lumpoff].height;
spr_offset = spritecachedinfo[lumpoff].offset;
@@ -4846,19 +4869,13 @@ static void HWR_ProjectSprite(mobj_t *thing)
spr_offset += interp.spritexoffset;
spr_topoffset += interp.spriteyoffset;
if (papersprite)
{
rightsin = FixedToFloat(FINESINE(interp.angle >> ANGLETOFINESHIFT));
rightcos = FixedToFloat(FINECOSINE(interp.angle >> ANGLETOFINESHIFT));
}
else
{
rightsin = FixedToFloat(FINESINE((viewangle + ANGLE_90)>>ANGLETOFINESHIFT));
rightcos = FixedToFloat(FINECOSINE((viewangle + ANGLE_90)>>ANGLETOFINESHIFT));
}
thing_scale = FixedToFloat(interp.scale);
spritexscale *= this_scale;
spriteyscale *= this_scale;
if (sprskin && (sprskin->flags & SF_HIRES))
thing_scale *= FixedToFloat(sprskin->highresscale);
spritexscale = FixedToFloat(interp.spritexscale) * thing_scale;
spriteyscale = FixedToFloat(interp.spriteyscale) * thing_scale;
flip = !flip != !hflip;
@@ -4873,19 +4890,17 @@ static void HWR_ProjectSprite(mobj_t *thing)
x2 = (FixedToFloat(spr_width - spr_offset) * spritexscale);
}
z1 = tr_y + x1 * rightsin;
z2 = tr_y - x2 * rightsin;
x1 = tr_x + x1 * rightcos;
x2 = tr_x - x2 * rightcos;
y1 = (FixedToFloat(spr_topoffset) * spriteyscale);
y2 = (FixedToFloat(spr_height - spr_topoffset) * spriteyscale);
if (vflip)
{
gz = FixedToFloat(interp.z + thing->height) - (FixedToFloat(spr_topoffset) * spriteyscale);
gz = FixedToFloat(interp.z + thing->height) - y1;
gzt = gz + (FixedToFloat(spr_height) * spriteyscale);
}
else
{
gzt = FixedToFloat(interp.z) + (FixedToFloat(spr_topoffset) * spriteyscale);
gzt = FixedToFloat(interp.z) + y1;
gz = gzt - (FixedToFloat(spr_height) * spriteyscale);
}
@@ -4895,6 +4910,18 @@ static void HWR_ProjectSprite(mobj_t *thing)
return;
}
// if the sprite is out of our view, dont need to draw it X)
if (!gld_SphereInFrustum(
(FixedToFloat(interp.x)) + cos_inv_yaw * (x1 + x2) / 2.0f,
FixedToFloat(interp.z) + (y1 + y2) / 2.0f,
FixedToFloat(interp.y) - sin_inv_yaw * (x1 + x2) / 2.0f,
//1.5 == sqrt(2) + small delta for MF_FOREGROUND
std::max<float>(FixedToFloat(spr_width) * spritexscale,
FixedToFloat(spr_height) * spriteyscale) / 2.0f * 1.5f))
{
return;
}
heightsec = thing->subsector->sector->heightsec;
if (viewplayer && viewplayer->mo && viewplayer->mo->subsector)
phs = viewplayer->mo->subsector->sector->heightsec;
@@ -4903,16 +4930,39 @@ static void HWR_ProjectSprite(mobj_t *thing)
if (heightsec != -1 && phs != -1) // only clip things which are in special sectors
{
if (gl_viewz < FixedToFloat(sectors[phs].floorheight) ?
FixedToFloat(interp.z) >= FixedToFloat(sectors[heightsec].floorheight) :
gzt < FixedToFloat(sectors[heightsec].floorheight))
fixed_t secheight;
secheight = P_GetSectorFloorZAt(&sectors[heightsec], viewx, viewy);
if (viewz < P_GetSectorFloorZAt(&sectors[phs], interp.x, interp.y) ?
interp.z >= secheight :
FloatToFixed(gzt) < secheight)
return;
if (gl_viewz > FixedToFloat(sectors[phs].ceilingheight) ?
gzt < FixedToFloat(sectors[heightsec].ceilingheight) && gl_viewz >= FixedToFloat(sectors[heightsec].ceilingheight) :
FixedToFloat(interp.z) >= FixedToFloat(sectors[heightsec].ceilingheight))
secheight = P_GetSectorCeilingZAt(&sectors[heightsec], viewx, viewy);
if (viewz > P_GetSectorCeilingZAt(&sectors[phs], interp.x, interp.y) ?
FloatToFixed(gzt) < secheight && viewz >= secheight :
interp.z >= secheight)
return;
}
if (papersprite)
{
rightsin = FixedToFloat(FINESINE(interp.angle >> ANGLETOFINESHIFT));
rightcos = FixedToFloat(FINECOSINE(interp.angle >> ANGLETOFINESHIFT));
}
else
{
rightsin = FixedToFloat(FINESINE((viewangle + ANGLE_90)>>ANGLETOFINESHIFT));
rightcos = FixedToFloat(FINECOSINE((viewangle + ANGLE_90)>>ANGLETOFINESHIFT));
}
z1 = tr_y + x1 * rightsin;
z2 = tr_y - x2 * rightsin;
x1 = tr_x + x1 * rightcos;
x2 = tr_x - x2 * rightcos;
//y1 = tr_y + y1 * rightcos;
//y2 = tr_y - y2 * rightcos;
// store information in a vissprite
vis = HWR_NewVisSprite();
vis->x1 = x1;
@@ -4925,7 +4975,7 @@ static void HWR_ProjectSprite(mobj_t *thing)
vis->dispoffset = thing->info->dispoffset; // Monster Iestyn: 23/11/15: HARDWARE SUPPORT AT LAST
vis->flip = flip;
vis->scale = this_scale;
vis->scale = thing_scale;
vis->spritexscale = spritexscale;
vis->spriteyscale = spriteyscale;
vis->spritexoffset = FixedToFloat(spr_offset);
@@ -4933,10 +4983,10 @@ static void HWR_ProjectSprite(mobj_t *thing)
#ifdef ROTSPRITE
if (rotsprite != NULL)
vis->gpatch = (patch_t *)rotsprite;
vis->gpatch = static_cast<patch_t *>(rotsprite);
else
#endif
vis->gpatch = (patch_t *)W_CachePatchNum(sprframe->lumppat[rot], PU_SPRITE);
vis->gpatch = static_cast<patch_t *>(W_CachePatchNum(sprframe->lumppat[rot], PU_SPRITE));
vis->mobj = thing;
@@ -4988,12 +5038,16 @@ static void HWR_ProjectPrecipitationSprite(precipmobj_t *thing)
float tr_x, tr_y;
float tz;
float x1, x2;
float y1, y2;
float z1, z2;
float gz, gzt;
float rightsin, rightcos;
float this_scale;
float thing_scale;
spritedef_t *sprdef;
spriteframe_t *sprframe;
size_t lumpoff;
fixed_t spr_width, spr_height;
fixed_t spr_offset, spr_topoffset;
unsigned rot = 0;
UINT8 flip;
@@ -5024,7 +5078,7 @@ static void HWR_ProjectPrecipitationSprite(precipmobj_t *thing)
return;
// decide which patch to use for sprite relative to player
if ((unsigned)thing->sprite >= numsprites)
if (static_cast<unsigned>(thing->sprite) >= numsprites)
{
#ifdef RANGECHECK
I_Error("HWR_ProjectPrecipitationSprite: invalid sprite number %i ",
@@ -5036,7 +5090,7 @@ static void HWR_ProjectPrecipitationSprite(precipmobj_t *thing)
sprdef = &sprites[thing->sprite];
if ((size_t)(thing->frame&FF_FRAMEMASK) >= sprdef->numframes)
if (static_cast<size_t>((thing->frame&FF_FRAMEMASK)) >= sprdef->numframes)
{
#ifdef RANGECHECK
I_Error("HWR_ProjectPrecipitationSprite: invalid sprite frame %i : %i for %s",
@@ -5046,7 +5100,7 @@ static void HWR_ProjectPrecipitationSprite(precipmobj_t *thing)
#endif
}
this_scale = FixedToFloat(interp.scale);
thing_scale = FixedToFloat(interp.scale);
sprframe = &sprdef->spriteframes[thing->frame & FF_FRAMEMASK];
@@ -5054,22 +5108,46 @@ static void HWR_ProjectPrecipitationSprite(precipmobj_t *thing)
lumpoff = sprframe->lumpid[0];
flip = sprframe->flip; // Will only be 0x00 or 0xFF
rightsin = FixedToFloat(FINESINE((viewangle + ANGLE_90)>>ANGLETOFINESHIFT));
rightcos = FixedToFloat(FINECOSINE((viewangle + ANGLE_90)>>ANGLETOFINESHIFT));
spr_width = spritecachedinfo[lumpoff].width;
spr_height = spritecachedinfo[lumpoff].height;
spr_offset = spritecachedinfo[lumpoff].offset;
spr_topoffset = spritecachedinfo[lumpoff].topoffset;
if (flip)
{
x1 = FixedToFloat(spritecachedinfo[lumpoff].width - spritecachedinfo[lumpoff].offset);
x2 = FixedToFloat(spritecachedinfo[lumpoff].offset);
x1 = FixedToFloat(spr_width - spr_offset);
x2 = FixedToFloat(spr_offset);
}
else
{
x1 = FixedToFloat(spritecachedinfo[lumpoff].offset);
x2 = FixedToFloat(spritecachedinfo[lumpoff].width - spritecachedinfo[lumpoff].offset);
x1 = x2 = FixedToFloat(spr_offset);
}
x1 *= this_scale;
x2 *= this_scale;
y1 = (FixedToFloat(spr_topoffset));
y2 = (FixedToFloat(spr_height - spr_topoffset));
x1 *= thing_scale;
x2 *= thing_scale;
y1 *= thing_scale;
y2 *= thing_scale;
if (!gld_SphereInFrustum(
(FixedToFloat(interp.x)) + cos_inv_yaw * (x1 + x2) / 2.0f,
FixedToFloat(interp.z) + (y1 + y2) / 2.0f,
FixedToFloat(interp.y) - sin_inv_yaw * (x1 + x2) / 2.0f,
//1.5 == sqrt(2) + small delta for MF_FOREGROUND
std::max<float>(FixedToFloat(spr_width) * thing_scale,
FixedToFloat(spr_height) * thing_scale) / 2.0f * 1.5f))
{
return;
}
// set top/bottom coords
gzt = FixedToFloat(interp.z) + y1;
gz = gzt - (FixedToFloat(spr_height) * thing_scale);
rightsin = FixedToFloat(FINESINE((viewangle + ANGLE_90)>>ANGLETOFINESHIFT));
rightcos = FixedToFloat(FINECOSINE((viewangle + ANGLE_90)>>ANGLETOFINESHIFT));
z1 = tr_y + x1 * rightsin;
z2 = tr_y - x2 * rightsin;
@@ -5086,7 +5164,7 @@ static void HWR_ProjectPrecipitationSprite(precipmobj_t *thing)
vis->z2 = z2;
vis->tz = tz;
vis->dispoffset = 0; // Monster Iestyn: 23/11/15: HARDWARE SUPPORT AT LAST
vis->gpatch = (patch_t *)W_CachePatchNum(sprframe->lumppat[rot], PU_SPRITE);
vis->gpatch = static_cast<patch_t *>(W_CachePatchNum(sprframe->lumppat[rot], PU_SPRITE));
vis->flip = flip;
vis->mobj = NULL;
@@ -5098,8 +5176,8 @@ static void HWR_ProjectPrecipitationSprite(precipmobj_t *thing)
#endif
// set top/bottom coords
vis->gzt = FixedToFloat(interp.z) + (FixedToFloat(spritecachedinfo[lumpoff].topoffset) * this_scale);
vis->gz = vis->gzt - (FixedToFloat(spritecachedinfo[lumpoff].height) * this_scale);
vis->gzt = gzt;
vis->gz = gz;
vis->precip = thing;
}
@@ -5113,11 +5191,10 @@ static gl_sky_t gl_sky;
static void HWR_SkyDomeVertex(gl_sky_t *sky, gl_skyvertex_t *vbo, int r, int c, signed char yflip, float delta, boolean foglayer)
{
static constexpr float radians = (float)(M_PIl / 180.0f);
static constexpr float scale = 10000.0f;
static constexpr float maxSideAngle = 60.0f * radians;
static constexpr float maxSideAngle = 60.0f * deg2radians;
float topAngle = ((float)c / (float)sky->columns * 360.0f) * radians;
float topAngle = ((float)c / (float)sky->columns * 360.0f) * deg2radians;
float sideAngle = (maxSideAngle * (float)(sky->rows - r) / (float)sky->rows);
float height = sinf(sideAngle);
float realRadius = (scale * cosf(sideAngle));
@@ -5175,7 +5252,6 @@ void HWR_ClearSkyDome(void)
sky->rows = sky->columns = 0;
sky->loopcount = 0;
sky->detail = 0;
sky->texture = -1;
sky->width = sky->height = 0;
@@ -5194,8 +5270,7 @@ void HWR_BuildSkyDome(void)
gl_skyvertex_t *vertex_p;
const texture_t *texture = textures[texturetranslation[skytexture]];
sky->detail = 16;
col_count *= sky->detail;
col_count *= 16;
if ((sky->columns != col_count) || (sky->rows != row_count))
HWR_ClearSkyDome();
@@ -5255,8 +5330,6 @@ void HWR_BuildSkyDome(void)
}
}
static boolean drewsky = false;
// precompute to save a bit of division
static constexpr float FINEDEGREE = (360.0f/(float)FINEANGLES);
@@ -5264,7 +5337,7 @@ static void HWR_DrawSkyBackground(void)
{
FTransform dometransform;
if (drewsky || HWR_IsWireframeMode())
if (HWR_IsWireframeMode())
return;
GL_SetBlend(PF_Translucent|PF_NoDepthTest|PF_Modulated);
@@ -5358,6 +5431,12 @@ void HWR_SetTransform(float fpov)
HWR_SetTransformAiming(&atransform);
atransform.angley = (float)(viewangle>>ANGLETOFINESHIFT)*(FINEDEGREE);
yaw = 270.0f - atransform.angley;
inv_yaw = 180.0f - yaw;
const float inv_yaw_radians = inv_yaw * deg2radians;
cos_inv_yaw = cosf(inv_yaw_radians);
sin_inv_yaw = sinf(inv_yaw_radians);
// only needed for sprite billboarding
if (cv_glspritebillboarding.value && !cv_glshearing.value)
{
@@ -5390,6 +5469,7 @@ void HWR_SetTransform(float fpov)
void HWR_ClearClipper(void)
{
const angle_t a1 = gld_FrustumAngle(gl_aimingangle);
gld_clipper_Clear();
gld_clipper_SafeAddClipRange(viewangle + a1, viewangle - a1);
#ifdef HAVE_SPHEREFRUSTRUM
@@ -5415,15 +5495,22 @@ namespace
};
template <RenderViewpointType Type>
void HWR_RenderViewpoint(gl_portal_t *rootportal, player_t *player, int stencil_level, boolean allow_portals)
static void HWR_RenderViewpoint(gl_portal_t *rootportal, int stencil_level, boolean allow_portals)
{
gl_portallist_t portallist;
const float fpov = FixedToFloat(R_GetPlayerFov(player));
const boolean skybox = (skyboxmo[0] && cv_skybox.value);
player_t *viewplayer = &players[displayplayers[viewssnum]];
const float fpov = FixedToFloat(R_GetPlayerFov(viewplayer));
auto reset_viewstate = [&](const float fpov)
{
HWR_SetTransform(fpov);
HWR_ClearSprites();
HWR_ClearClipper();
};
portallist.base = portallist.cap = NULL;
HWR_SetPortalState(GLPORTAL_OFF); // there may be portals and they need to be drawn as regural walls
HWR_SetPortalState(GLPORTAL_OFF); // there may be portals and they need to be drawn as regular walls
if constexpr (Type == RenderViewpointType::kPortal)
{
@@ -5435,10 +5522,12 @@ void HWR_RenderViewpoint(gl_portal_t *rootportal, player_t *player, int stencil_
currentportallist = &portallist;
HWR_SetPortalState(GLPORTAL_SEARCH);
HWR_ClearClipper();
reset_viewstate(fpov);
if (rootportal)
{
HWR_PortalClipping(rootportal);
}
validcount++;
@@ -5449,7 +5538,7 @@ void HWR_RenderViewpoint(gl_portal_t *rootportal, player_t *player, int stencil_
// note: if necessary, could sort the portals here?
for (portal = portallist.base; portal; portal = portal->next)
{
HWR_RenderPortal(portal, rootportal, fpov, player, stencil_level);
HWR_RenderPortal(portal, rootportal, fpov, stencil_level);
}
HWR_SetPortalState(GLPORTAL_INSIDE); // when portal walls are encountered in following bsp traversal, nothing should be drawn
@@ -5459,16 +5548,13 @@ void HWR_RenderViewpoint(gl_portal_t *rootportal, player_t *player, int stencil_
// draw normal things in current frame in current incremented stencil buffer area
HWR_SetStencilState(HWR_STENCIL_NORMAL, stencil_level);
HWR_SetTransform(fpov);
HWR_ClearSprites();
HWR_ClearClipper();
reset_viewstate(fpov);
if constexpr (Type == RenderViewpointType::kPortal)
{
if (allow_portals && rootportal)
{
HWR_PortalFrame(rootportal);// for portalclipsector, it could have gone null from search
HWR_PortalFrame(rootportal); // for portalclipsector, it could have gone null from search
HWR_PortalClipping(rootportal);
}
}
@@ -5476,6 +5562,7 @@ void HWR_RenderViewpoint(gl_portal_t *rootportal, player_t *player, int stencil_
if (HWR_IsWireframeMode())
GL_SetSpecialState(HWD_SET_WIREFRAME, 1);
// FIXME: perfstats does not account for portal rendering!
ps_numbspcalls.value.i = 0;
ps_numpolyobjects.value.i = 0;
PS_START_TIMING(ps_bsptime);
@@ -5487,8 +5574,7 @@ void HWR_RenderViewpoint(gl_portal_t *rootportal, player_t *player, int stencil_
if constexpr (Type == RenderViewpointType::kPortal)
{
if (allow_portals && !rootportal && portallist.base && !skybox) // if portals have been drawn in the main view, then render skywalls differently
gl_collect_skywalls = true;
gl_collect_skywalls = (allow_portals && !rootportal && portallist.base && (!skyboxmo[0] || !cv_skybox.value)); // if portals have been drawn in the main view, then render skywalls differently
// HAYA: Save the old portal state, and turn portals off while normally rendering the BSP tree.
// This fixes specific effects not working, such as horizon lines.
@@ -5518,7 +5604,10 @@ void HWR_RenderViewpoint(gl_portal_t *rootportal, player_t *player, int stencil_
PS_STOP_TIMING(ps_bsptime);
if (LIKELY(cv_glbatching.value))
HWR_RenderBatches();
HWR_RenderBatches(true);
// Check for new console commands.
NetUpdate();
if constexpr (Type == RenderViewpointType::kPortal)
{
@@ -5528,13 +5617,13 @@ void HWR_RenderViewpoint(gl_portal_t *rootportal, player_t *player, int stencil_
HWR_DrawSkyWallList();
HWR_SkyWallList_Clear();
HWR_SetStencilState(HWR_STENCIL_NORMAL, 1);
drewsky = false;
HWR_DrawSkyBackground();
HWR_SetStencilState(HWR_STENCIL_NORMAL, 0);
GL_ClearBuffer(false, false, true, NULL);// clear skywall markings from the stencil buffer
HWR_SetTransform(fpov);// restore transform
GL_ClearBuffer(false, false, true, NULL); // clear skywall markings from the stencil buffer
HWR_SetTransform(fpov); // restore transform
}
}
gl_collect_skywalls = false;
ps_numsprites.value.i = gl_visspritecount;
@@ -5542,15 +5631,20 @@ void HWR_RenderViewpoint(gl_portal_t *rootportal, player_t *player, int stencil_
HWR_SortVisSprites();
PS_STOP_TIMING(ps_hw_spritesorttime);
PS_START_TIMING(ps_hw_spritedrawtime);
if (LIKELY(cv_glbatching.value))
HWR_StartBatching();
if (UNLIKELY(cv_glmdls.value))
HWR_DrawSprites<DrawSpritesType::kModels>();
else
HWR_DrawSprites<DrawSpritesType::kSprites>();
PS_STOP_TIMING(ps_hw_spritedrawtime);
if (LIKELY(cv_glbatching.value))
HWR_RenderBatches(false);
ps_numdrawnodes.value.i = 0;
ps_hw_nodesorttime.value.p = 0;
ps_hw_nodedrawtime.value.p = 0;
HWR_RenderDrawNodes();
if (HWR_IsWireframeMode())
@@ -5561,26 +5655,22 @@ void HWR_RenderViewpoint(gl_portal_t *rootportal, player_t *player, int stencil_
};
extern "C" {
void HWR_RenderPortalViewpoint(gl_portal_t *rootportal, player_t *player, int stencil_level, boolean allow_portals) {
HWR_RenderViewpoint<RenderViewpointType::kPortal>(rootportal, player, stencil_level, allow_portals);
void HWR_RenderPortalViewpoint(gl_portal_t *rootportal, int stencil_level, boolean allow_portals) {
HWR_RenderViewpoint<RenderViewpointType::kPortal>(rootportal, stencil_level, allow_portals);
}
}
// ==========================================================================
// Render the current frame.
// ==========================================================================
static void HWR_RenderFrame(player_t *player, boolean skybox)
static void HWR_RenderFrame(boolean skybox, boolean drawsky)
{
// check for new console commands.
NetUpdate();
// Clear view, set viewport (glViewport), set perspective...
HWR_ClearView();
// Draw the sky background.
HWR_DrawSkyBackground();
if (skybox)
drewsky = true;
if (drawsky)
HWR_DrawSkyBackground();
current_bsp_culling_distance = 0;
@@ -5596,26 +5686,17 @@ static void HWR_RenderFrame(player_t *player, boolean skybox)
current_bsp_culling_distance = bsp_culling_distances[renderdist- 1];
}
portalclipline = NULL;
if (UNLIKELY(HWR_UsePortals()))
HWR_RenderViewpoint<RenderViewpointType::kPortal>(NULL, player, 0, !skybox);
else
HWR_RenderViewpoint<RenderViewpointType::kNormal>(NULL, player, 0, !skybox);
// Unset transform and shader
GL_SetTransform(NULL);
GL_UnSetShader();
// Run post processor effects
if (!skybox)
HWR_DoPostProcessor(player);
// Check for new console commands.
NetUpdate();
// added by Hurdler for correct splitscreen
// moved here by hurdler so it works with the new near clipping plane
GL_GClipRect(0, 0, vid.width, vid.height, NZCLIP_PLANE, FAR_ZCLIP_DEFAULT);
portalclipline = NULL;
if (UNLIKELY(HWR_UsePortals()))
HWR_RenderViewpoint<RenderViewpointType::kPortal>(NULL, 0, !skybox);
else
HWR_RenderViewpoint<RenderViewpointType::kNormal>(NULL, 0, !skybox);
// Check for new console commands.
NetUpdate();
}
// ==========================================================================
@@ -5665,22 +5746,31 @@ void HWR_RenderPlayerView(void)
if (viewssnum > 3)
return;
player_t * player = &players[displayplayers[viewssnum]];
const boolean skybox = (skyboxmo[0] && cv_skybox.value); // True if there's a skybox object and skyboxes are on
// Render the skybox if there is one.
PS_START_TIMING(ps_skyboxtime);
drewsky = false;
if (skybox)
{
R_SkyboxFrame(viewssnum);
HWR_RenderFrame(player, true);
HWR_RenderFrame(true, true);
}
PS_STOP_TIMING(ps_skyboxtime);
R_SetupFrame(viewssnum, false); // This can stay false because it is only used to set viewsky in r_main.c, which isn't used here
framecount++; // for timedemo
HWR_RenderFrame(player, false);
HWR_RenderFrame(false, !skybox);
// Unset transform and shader
GL_SetTransform(NULL);
GL_UnSetShader();
// Run post processor effects
HWR_DoPostProcessor();
// added by Hurdler for correct splitscreen
// moved here by hurdler so it works with the new near clipping plane
GL_GClipRect(0, 0, vid.width, vid.height, NZCLIP_PLANE, FAR_ZCLIP_DEFAULT);
}
void HWR_LoadLevel(void)
@@ -5891,6 +5981,7 @@ void HWR_Shutdown(void)
HWR_FreeExtraSubsectors();
HWR_FreeMapTextures();
GL_FlushScreenTextures();
HWR_ClearAllTextures();
#ifdef USE_FBO_OGL
GL_Framebuffer_Disable();
#endif
@@ -5933,35 +6024,40 @@ static void HWR_RenderWall(FOutVector *wallVerts, FSurfaceInfo *pSurf, FBITFIELD
#endif
}
static void HWR_DoPostProcessor(player_t *player)
static void HWR_DoPostProcessor(void)
{
GL_UnSetShader();
// Armageddon Blast Flash!
// Could this even be considered postprocessor?
if (!HWR_PalRenderFlashpal() && player->flashcount)
if (!HWR_PalRenderFlashpal())
{
FOutVector v[4];
FSurfaceInfo Surf;
const player_t *player = &players[displayplayers[viewssnum]];
v[0].x = v[2].y = v[3].x = v[3].y = -4.0f;
v[0].y = v[1].x = v[1].y = v[2].x = 4.0f;
v[0].z = v[1].z = v[2].z = v[3].z = 4.0f; // 4.0 because of the same reason as with the sky, just after the screen is cleared so near clipping plane is 3.99
// This won't change if the flash palettes are changed unfortunately, but it works for its purpose
if (player->flashpal == PAL_NUKE)
if (player->flashcount)
{
Surf.PolyColor.s.red = 0xff;
Surf.PolyColor.s.green = Surf.PolyColor.s.blue = 0x7F; // The nuke palette is kind of pink-ish
static FOutVector v[4] = {
{-4.0f, 4.0f, 4.0f, 0.0f, 0.0f},
{ 4.0f, 4.0f, 4.0f, 0.0f, 0.0f}, // 4.0 because of the same reason as with the sky, just after the screen is cleared so near clipping plane is 3.99
{ 4.0f, -4.0f, 4.0f, 0.0f, 0.0f},
{-4.0f, -4.0f, 4.0f, 0.0f, 0.0f}
};
FSurfaceInfo Surf;
// This won't change if the flash palettes are changed unfortunately, but it works for its purpose
if (player->flashpal == PAL_NUKE)
{
Surf.PolyColor.s.red = 0xff;
Surf.PolyColor.s.green = Surf.PolyColor.s.blue = 0x7F; // The nuke palette is kind of pink-ish
}
else
Surf.PolyColor.s.red = Surf.PolyColor.s.green = Surf.PolyColor.s.blue = 0xff;
Surf.PolyColor.s.alpha = 0xc0; // match software mode
V_CubeApply(&Surf.PolyColor);
GL_DrawPolygon(&Surf, v, 4, PF_Modulated|PF_Translucent|PF_NoTexture|PF_NoDepthTest);
}
else
Surf.PolyColor.s.red = Surf.PolyColor.s.green = Surf.PolyColor.s.blue = 0xff;
Surf.PolyColor.s.alpha = 0xc0; // match software mode
V_CubeApply(&Surf.PolyColor);
GL_DrawPolygon(&Surf, v, 4, PF_Modulated|PF_Translucent|PF_NoTexture|PF_NoDepthTest);
}
if (cv_glscreentextures.value != 2) // screen textures are needed for the rest of the effects
+1 -2
View File
@@ -102,8 +102,7 @@ void HWR_SetViewSize(void);
void HWR_AddCommands(void);
void HWR_RenderPlayerView(void);
void HWR_RenderViewpoint(gl_portal_t *rootportal, player_t *player, int stencil_level, boolean allow_portals);
void HWR_RenderPortalViewpoint(gl_portal_t *rootportal, player_t *player, int stencil_level, boolean allow_portals);
void HWR_RenderPortalViewpoint(gl_portal_t *rootportal, int stencil_level, boolean allow_portals);
void HWR_ClearSkyDome(void);
void HWR_BuildSkyDome(void);
+5 -5
View File
@@ -38,7 +38,7 @@ void HWR_PortalClipping(gl_portal_t *portal)
gld_clipper_SafeAddClipRange(portal->angle1, portal->angle2);
}
static gl_portal_t* HWR_Portal_Add (seg_t *seg)
static gl_portal_t* HWR_Portal_Add(seg_t *seg)
{
gl_portal_t *portal = Z_Malloc(sizeof(gl_portal_t), PU_STATIC, NULL);
@@ -120,8 +120,8 @@ void HWR_PortalFrame(gl_portal_t* portal)
viewz = portal->viewz;
viewangle = portal->viewangle;
//viewsin = FINESINE(viewangle>>ANGLETOFINESHIFT);
//viewcos = FINECOSINE(viewangle>>ANGLETOFINESHIFT);
viewsin = FINESINE(viewangle>>ANGLETOFINESHIFT);
viewcos = FINECOSINE(viewangle>>ANGLETOFINESHIFT);
if (portal->clipline != -1)
{
@@ -157,7 +157,7 @@ static void HWR_RenderPortalSeg(gl_portal_t* portal, SINT8 state)
}
// Renders a single portal from the current viewpoint.
void HWR_RenderPortal(gl_portal_t* portal, gl_portal_t* rootportal, const float fpov, player_t *player, int stencil_level)
void HWR_RenderPortal(gl_portal_t* portal, gl_portal_t* rootportal, const float fpov, int stencil_level)
{
// draw portal seg to stencil buffer with increment
HWR_SetTransform(fpov);
@@ -170,7 +170,7 @@ void HWR_RenderPortal(gl_portal_t* portal, gl_portal_t* rootportal, const float
HWR_PortalFrame(portal);
// call HWR_RenderViewpoint
HWR_RenderPortalViewpoint(portal, player, stencil_level + 1, true);
HWR_RenderPortalViewpoint(portal, stencil_level + 1, true);
// return to current frame
if (rootportal)
+2 -2
View File
@@ -65,7 +65,7 @@ extern SINT8 gl_portal_state;
// new thing
extern gl_portallist_t *currentportallist;
static inline void HWR_SetPortalState (SINT8 state)
static inline void HWR_SetPortalState(SINT8 state)
{
gl_portal_state = state;
}
@@ -75,7 +75,7 @@ void HWR_PortalClipping(gl_portal_t *portal);
void HWR_Portal_Add2Lines(const INT32 line1, const INT32 line2, seg_t *seg);
void HWR_PortalFrame(gl_portal_t* portal);
void HWR_RenderPortal(gl_portal_t* portal, gl_portal_t* rootportal, const float fpov, player_t *player, int stencil_level);
void HWR_RenderPortal(gl_portal_t* portal, gl_portal_t* rootportal, const float fpov, int stencil_level);
void HWR_FreePortalList(gl_portallist_t portallist);
boolean HWR_PortalCheckPointSide(fixed_t x, fixed_t y);
+88 -134
View File
@@ -127,7 +127,7 @@ GLuint gl_num_extensions;
int majorGL = 0, minorGL = 0;
//Hurdler: 04/10/2000: added for the kick ass coronas as Boris wanted;-)
static GLfloat modelMatrix[16];
GLfloat modelMatrix[16] = {0};
GLfloat projMatrix[16] = {0};
static GLint viewport[4];
@@ -173,41 +173,7 @@ boolean supportstencil = false;
// can know when the textures aren't there, as textures are always considered resident in their virtual memory
static GLuint screenTextures[NUMSCREENTEXTURES] = {0};
// shortcut for ((float)1/i)
static const GLfloat byte2float[256] = {
0.000000f, 0.003922f, 0.007843f, 0.011765f, 0.015686f, 0.019608f, 0.023529f, 0.027451f,
0.031373f, 0.035294f, 0.039216f, 0.043137f, 0.047059f, 0.050980f, 0.054902f, 0.058824f,
0.062745f, 0.066667f, 0.070588f, 0.074510f, 0.078431f, 0.082353f, 0.086275f, 0.090196f,
0.094118f, 0.098039f, 0.101961f, 0.105882f, 0.109804f, 0.113725f, 0.117647f, 0.121569f,
0.125490f, 0.129412f, 0.133333f, 0.137255f, 0.141176f, 0.145098f, 0.149020f, 0.152941f,
0.156863f, 0.160784f, 0.164706f, 0.168627f, 0.172549f, 0.176471f, 0.180392f, 0.184314f,
0.188235f, 0.192157f, 0.196078f, 0.200000f, 0.203922f, 0.207843f, 0.211765f, 0.215686f,
0.219608f, 0.223529f, 0.227451f, 0.231373f, 0.235294f, 0.239216f, 0.243137f, 0.247059f,
0.250980f, 0.254902f, 0.258824f, 0.262745f, 0.266667f, 0.270588f, 0.274510f, 0.278431f,
0.282353f, 0.286275f, 0.290196f, 0.294118f, 0.298039f, 0.301961f, 0.305882f, 0.309804f,
0.313726f, 0.317647f, 0.321569f, 0.325490f, 0.329412f, 0.333333f, 0.337255f, 0.341176f,
0.345098f, 0.349020f, 0.352941f, 0.356863f, 0.360784f, 0.364706f, 0.368627f, 0.372549f,
0.376471f, 0.380392f, 0.384314f, 0.388235f, 0.392157f, 0.396078f, 0.400000f, 0.403922f,
0.407843f, 0.411765f, 0.415686f, 0.419608f, 0.423529f, 0.427451f, 0.431373f, 0.435294f,
0.439216f, 0.443137f, 0.447059f, 0.450980f, 0.454902f, 0.458824f, 0.462745f, 0.466667f,
0.470588f, 0.474510f, 0.478431f, 0.482353f, 0.486275f, 0.490196f, 0.494118f, 0.498039f,
0.501961f, 0.505882f, 0.509804f, 0.513726f, 0.517647f, 0.521569f, 0.525490f, 0.529412f,
0.533333f, 0.537255f, 0.541177f, 0.545098f, 0.549020f, 0.552941f, 0.556863f, 0.560784f,
0.564706f, 0.568627f, 0.572549f, 0.576471f, 0.580392f, 0.584314f, 0.588235f, 0.592157f,
0.596078f, 0.600000f, 0.603922f, 0.607843f, 0.611765f, 0.615686f, 0.619608f, 0.623529f,
0.627451f, 0.631373f, 0.635294f, 0.639216f, 0.643137f, 0.647059f, 0.650980f, 0.654902f,
0.658824f, 0.662745f, 0.666667f, 0.670588f, 0.674510f, 0.678431f, 0.682353f, 0.686275f,
0.690196f, 0.694118f, 0.698039f, 0.701961f, 0.705882f, 0.709804f, 0.713726f, 0.717647f,
0.721569f, 0.725490f, 0.729412f, 0.733333f, 0.737255f, 0.741177f, 0.745098f, 0.749020f,
0.752941f, 0.756863f, 0.760784f, 0.764706f, 0.768627f, 0.772549f, 0.776471f, 0.780392f,
0.784314f, 0.788235f, 0.792157f, 0.796078f, 0.800000f, 0.803922f, 0.807843f, 0.811765f,
0.815686f, 0.819608f, 0.823529f, 0.827451f, 0.831373f, 0.835294f, 0.839216f, 0.843137f,
0.847059f, 0.850980f, 0.854902f, 0.858824f, 0.862745f, 0.866667f, 0.870588f, 0.874510f,
0.878431f, 0.882353f, 0.886275f, 0.890196f, 0.894118f, 0.898039f, 0.901961f, 0.905882f,
0.909804f, 0.913726f, 0.917647f, 0.921569f, 0.925490f, 0.929412f, 0.933333f, 0.937255f,
0.941177f, 0.945098f, 0.949020f, 0.952941f, 0.956863f, 0.960784f, 0.964706f, 0.968628f,
0.972549f, 0.976471f, 0.980392f, 0.984314f, 0.988235f, 0.992157f, 0.996078f, 1.000000f
};
#define byte2float(byte) (GLfloat)(byte / 255.0f)
// -----------------+
// GL_DBG_Printf : Output debug messages to debug log if DEBUG_TO_FILE is defined,
@@ -1023,11 +989,9 @@ boolean GL_CompileShader(int slot)
{
return true;
}
else
{
gl_shaders[slot].program = 0;
return false;
}
gl_shaders[slot].program = 0;
return false;
}
//
@@ -1069,6 +1033,7 @@ void GL_SetShader(int slot)
GL_UnSetShader();
return;
}
if (gl_allowshaders)
{
gl_shader_t *next_shader = &gl_shaders[slot]; // the gl_shader_t we are going to switch to
@@ -1130,7 +1095,7 @@ static void GL_SetNoTexture(void)
// -----------------+
static void GL_Perspective(GLfloat fovy, GLfloat aspect)
{
GLfloat m[4][4] =
static GLfloat m[4][4] =
{
{ 1.0f, 0.0f, 0.0f, 0.0f},
{ 0.0f, 1.0f, 0.0f, 0.0f},
@@ -1145,7 +1110,7 @@ static void GL_Perspective(GLfloat fovy, GLfloat aspect)
return;
}
const GLfloat focallength = (GLfloat)(1.0f / (GLfloat)tan(fovy * (GLfloat)M_PIl / 360.0f));
const GLfloat focallength = (1.0f / tanf(fovy * M_PIf / 360.0f));
m[0][0] = focallength / aspect;
m[1][1] = focallength;
@@ -1160,7 +1125,7 @@ static void GL_Perspective(GLfloat fovy, GLfloat aspect)
// -----------------+
void GL_SetModelView(GLint w, GLint h)
{
GLint maxtexsize = 0;
static GLint maxtexsize = 0;
//GL_DBG_Printf("SetModelView(): %dx%d\n", (int)w, (int)h);
// The screen textures need to be flushed if the width or height change so that they be remade for the correct size
@@ -1193,7 +1158,9 @@ void GL_SetModelView(GLint w, GLint h)
screen_texsizeh <<= 1;
}
pglGetIntegerv(GL_MAX_TEXTURE_SIZE, &maxtexsize); // Get the maximum supported texture size
if (!maxtexsize)
pglGetIntegerv(GL_MAX_TEXTURE_SIZE, &maxtexsize); // Get the maximum supported texture size
if ((screen_texsizew > maxtexsize || screen_texsizeh > maxtexsize) && maxtexsize > 0)
{
// The desired screen texture resolution is too big for the player's GPU!
@@ -1339,7 +1306,8 @@ void GL_DeleteTexture(GLMipmap_t *pTexInfo)
if (!pTexInfo)
return;
else if (pTexInfo->downloaded)
if (pTexInfo->downloaded)
pglDeleteTextures(1, (GLuint *)&pTexInfo->downloaded);
while (head)
@@ -1393,7 +1361,8 @@ void GL_Flush(void)
TexCacheTail = TexCacheHead = NULL; //Hurdler: well, TexCacheHead is already NULL
tex_downloaded = 0;
free(textureBuffer);
if (textureBuffer)
free(textureBuffer);
textureBuffer = NULL;
textureBufferSize = 0;
}
@@ -1547,6 +1516,7 @@ void GL_ClearBuffer(FBOOLEAN ColorMask, FBOOLEAN DepthMask, FBOOLEAN StencilMask
ClearMask |= GL_COLOR_BUFFER_BIT;
}
if (DepthMask)
{
pglClearDepth(1.0f); //Hurdler: all that are permanen states
@@ -1558,7 +1528,7 @@ void GL_ClearBuffer(FBOOLEAN ColorMask, FBOOLEAN DepthMask, FBOOLEAN StencilMask
GL_SetBlend(DepthMask ? PF_Occlude | CurrentPolyFlags : CurrentPolyFlags&~PF_Occlude);
if (StencilMask)
ClearMask |= GL_STENCIL_BUFFER_BIT;// looks like sometimes stencil buffer needs clearing? had a problem with random black screens
ClearMask |= GL_STENCIL_BUFFER_BIT; // looks like sometimes stencil buffer needs clearing? had a problem with random black screens
pglClear(ClearMask);
pglEnableClientState(GL_VERTEX_ARRAY); // We always use this one
@@ -1602,18 +1572,21 @@ void GL_Draw2DLine(F2DCoord * v1, F2DCoord * v2, RGBA_t Color)
pglEnableClientState(GL_TEXTURE_COORD_ARRAY);
pglEnable(GL_TEXTURE_2D);
}
static inline void Clamp2D(GLenum pname)
{
#ifdef GL_CLAMP_TO_EDGE
pglTexParameteri(GL_TEXTURE_2D, pname, GL_CLAMP_TO_EDGE);
#else
pglTexParameteri(GL_TEXTURE_2D, pname, GL_CLAMP); // fallback clamp
#endif
}
// -----------------+
// SetBlend : Set render mode
// -----------------+
// PF_Masked - we could use an ALPHA_TEST of GL_EQUAL, and alpha ref of 0,
// is it faster when pixels are discarded ?
static void Clamp2D(GLenum pname)
{
pglTexParameteri(GL_TEXTURE_2D, pname, GL_CLAMP); // fallback clamp
#ifdef GL_CLAMP_TO_EDGE
pglTexParameteri(GL_TEXTURE_2D, pname, GL_CLAMP_TO_EDGE);
#endif
}
static void GL_SetBlendEquation(GLenum mode)
{
@@ -1762,14 +1735,6 @@ void GL_SetBlend(FBITFIELD PolyFlags)
if (Xor & PF_Modulated)
{
#if defined (__unix__) || defined (UNIXCOMMON)
if (oglflags & GLF_NOTEXENV)
{
if (!(PolyFlags & PF_Modulated))
pglColor4ubv(white);
}
else
#endif
if (PolyFlags & PF_Modulated)
{ // mix texture colour with Surface->PolyColor
pglTexEnvi(GL_TEXTURE_ENV, GL_TEXTURE_ENV_MODE, GL_MODULATE);
@@ -2143,7 +2108,8 @@ void GL_SetTexture(GLMipmap_t *pTexInfo)
GL_SetNoTexture();
return;
}
else if (pTexInfo->downloaded)
if (pTexInfo->downloaded)
{
if (pTexInfo->downloaded != tex_downloaded)
{
@@ -2419,38 +2385,38 @@ static void GL_PreparePolygon(FSurfaceInfo *pSurf, FBITFIELD PolyFlags)
if (pSurf)
{
// If modulated, mix the surface colour to the texture
if (CurrentPolyFlags & PF_Modulated)
pglColor4ubv((GLubyte*)&pSurf->PolyColor.s);
// If the surface is either modulated or colormapped, or both
if (CurrentPolyFlags & (PF_Modulated | PF_ColorMapped))
{
poly.red = byte2float[pSurf->PolyColor.s.red];
poly.green = byte2float[pSurf->PolyColor.s.green];
poly.blue = byte2float[pSurf->PolyColor.s.blue];
poly.alpha = byte2float[pSurf->PolyColor.s.alpha];
}
// If modulated, mix the surface colour to the texture
if (CurrentPolyFlags & PF_Modulated)
pglColor4ubv((GLubyte*)&pSurf->PolyColor.s);
// Only if the surface is colormapped
if (CurrentPolyFlags & PF_ColorMapped)
{
tint.red = byte2float[pSurf->TintColor.s.red];
tint.green = byte2float[pSurf->TintColor.s.green];
tint.blue = byte2float[pSurf->TintColor.s.blue];
tint.alpha = byte2float[pSurf->TintColor.s.alpha];
poly.red = byte2float(pSurf->PolyColor.s.red);
poly.green = byte2float(pSurf->PolyColor.s.green);
poly.blue = byte2float(pSurf->PolyColor.s.blue);
poly.alpha = byte2float(pSurf->PolyColor.s.alpha);
fade.red = byte2float[pSurf->FadeColor.s.red];
fade.green = byte2float[pSurf->FadeColor.s.green];
fade.blue = byte2float[pSurf->FadeColor.s.blue];
fade.alpha = byte2float[pSurf->FadeColor.s.alpha];
if (pSurf->LightTableId && pSurf->LightTableId != lt_downloaded)
// Only if the surface is colormapped
if (CurrentPolyFlags & PF_ColorMapped)
{
pglActiveTexture(GL_TEXTURE2);
pglBindTexture(GL_TEXTURE_2D, pSurf->LightTableId);
pglActiveTexture(GL_TEXTURE0);
lt_downloaded = pSurf->LightTableId;
tint.red = byte2float(pSurf->TintColor.s.red);
tint.green = byte2float(pSurf->TintColor.s.green);
tint.blue = byte2float(pSurf->TintColor.s.blue);
tint.alpha = byte2float(pSurf->TintColor.s.alpha);
fade.red = byte2float(pSurf->FadeColor.s.red);
fade.green = byte2float(pSurf->FadeColor.s.green);
fade.blue = byte2float(pSurf->FadeColor.s.blue);
fade.alpha = byte2float(pSurf->FadeColor.s.alpha);
if (pSurf->LightTableId && pSurf->LightTableId != lt_downloaded)
{
pglActiveTexture(GL_TEXTURE2);
pglBindTexture(GL_TEXTURE_2D, pSurf->LightTableId);
pglActiveTexture(GL_TEXTURE0);
lt_downloaded = pSurf->LightTableId;
}
}
}
}
@@ -2962,24 +2928,24 @@ void GL_DrawModelEx(model_t *model, INT32 frameIndex, float duration, float tics
pol = 0.0f;
}
poly.red = byte2float[Surface->PolyColor.s.red];
poly.green = byte2float[Surface->PolyColor.s.green];
poly.blue = byte2float[Surface->PolyColor.s.blue];
poly.alpha = byte2float[Surface->PolyColor.s.alpha];
poly.red = byte2float(Surface->PolyColor.s.red);
poly.green = byte2float(Surface->PolyColor.s.green);
poly.blue = byte2float(Surface->PolyColor.s.blue);
poly.alpha = byte2float(Surface->PolyColor.s.alpha);
pglColor4ubv((GLubyte*)&Surface->PolyColor.s);
GL_SetBlend(((poly.alpha < 1) ? Surface->PolyFlags : (PF_Masked|PF_Occlude))|PF_Modulated);
tint.red = byte2float[Surface->TintColor.s.red];
tint.green = byte2float[Surface->TintColor.s.green];
tint.blue = byte2float[Surface->TintColor.s.blue];
tint.alpha = byte2float[Surface->TintColor.s.alpha];
tint.red = byte2float(Surface->TintColor.s.red);
tint.green = byte2float(Surface->TintColor.s.green);
tint.blue = byte2float(Surface->TintColor.s.blue);
tint.alpha = byte2float(Surface->TintColor.s.alpha);
fade.red = byte2float[Surface->FadeColor.s.red];
fade.green = byte2float[Surface->FadeColor.s.green];
fade.blue = byte2float[Surface->FadeColor.s.blue];
fade.alpha = byte2float[Surface->FadeColor.s.alpha];
fade.red = byte2float(Surface->FadeColor.s.red);
fade.green = byte2float(Surface->FadeColor.s.green);
fade.blue = byte2float(Surface->FadeColor.s.blue);
fade.alpha = byte2float(Surface->FadeColor.s.alpha);
if (Surface->LightTableId && Surface->LightTableId != lt_downloaded)
{
@@ -3196,11 +3162,13 @@ void GL_SetTransform(FTransform *stransform)
if (special_splitscreen)
{
used_fov = (atanf(tanf(used_fov * (float)M_PI / 360.0f) * 0.8f) * 360.0f / (float)M_PI);
used_fov = (atanf(tanf(used_fov * M_PIf / 360.0f) * 0.8f) * 360.0f / M_PIf);
GL_Perspective(used_fov, 2*ASPECT_RATIO);
}
else
{
GL_Perspective(used_fov, ASPECT_RATIO);
}
pglGetFloatv(GL_PROJECTION_MATRIX, projMatrix); // added for new coronas' code (without depth buffer)
pglMatrixMode(GL_MODELVIEW);
@@ -3334,8 +3302,8 @@ void GL_Framebuffer_Disable(void)
// delet our fbo
if (framebufferobject.fboobj)
pglDeleteFramebuffers(1, &framebufferobject.fboobj);
framebufferobject.fboobj = 0;
GL_Framebuffer_DeleteAttachments();
}
#endif
@@ -3465,7 +3433,7 @@ void GL_FlushScreenTextures(void)
void GL_DrawScreenTexture(int tex, FSurfaceInfo *surf, FBITFIELD polyflags)
{
float fix[8];
static float fix[8];
float xfix, yfix;
if (gl_enable_screen_textures != 2)
@@ -3474,14 +3442,8 @@ void GL_DrawScreenTexture(int tex, FSurfaceInfo *surf, FBITFIELD polyflags)
xfix = 1/((float)screen_texsizew/(float)screen_width);
yfix = 1/((float)screen_texsizeh/(float)screen_height);
fix[0] = 0.0f;
fix[1] = 0.0f;
fix[2] = 0.0f;
fix[3] = yfix;
fix[4] = xfix;
fix[5] = yfix;
fix[6] = xfix;
fix[7] = 0.0f;
fix[3] = fix[5] = yfix;
fix[4] = fix[6] = xfix;
pglClear(GL_COLOR_BUFFER_BIT|GL_DEPTH_BUFFER_BIT);
@@ -3715,7 +3677,13 @@ void GL_DrawScreenFinalTexture(int tex, INT32 width, INT32 height, boolean usesh
float origaspect, newaspect;
float xoff = 1, yoff = 1; // xoffset and yoffset for the polygon to have black bars around the screen
static float off[12];
static float off[12] =
{
1.0f, 1.0f, 1.0f, 1.0f,
1.0f, 1.0f, 1.0f, 1.0f,
1.0f, 1.0f, 1.0f, 1.0f
};
static float fix[8];
if (gl_enable_screen_textures != 2)
@@ -3739,28 +3707,14 @@ void GL_DrawScreenFinalTexture(int tex, INT32 width, INT32 height, boolean usesh
}
// float off[12];
off[0] = -xoff;
off[1] = -yoff;
off[2] = 1.0f;
off[3] = -xoff;
off[4] = yoff;
off[5] = 1.0f;
off[6] = xoff;
off[7] = yoff;
off[8] = 1.0f;
off[9] = xoff;
off[10] = -yoff;
off[11] = 1.0f;
off[0] = off[3] = -xoff;
off[1] = off[10] = -yoff;
off[4] = off[7] = yoff;
off[6] = off[9] = xoff;
// float fix[8];
fix[0] = 0.0f;
fix[1] = 0.0f;
fix[2] = 0.0f;
fix[3] = yfix;
fix[4] = xfix;
fix[5] = yfix;
fix[6] = xfix;
fix[7] = 0.0f;
fix[3] = fix[5] = yfix;
fix[4] = fix[6] = xfix;
pglViewport(0, 0, width, height);
+2 -14
View File
@@ -27,7 +27,7 @@ extern "C" {
#ifdef HAVE_SDL
#define _MATH_DEFINES_DEFINED
#include "SDL_opengl.h" //Alam_GBC: Simple, yes?
#include <SDL3/SDL_opengl.h> //Alam_GBC: Simple, yes?
#else
#include <GL/gl.h>
@@ -38,8 +38,6 @@ extern "C" {
#endif
#endif
#define _CREATE_DLL_ // necessary for Unix AND Windows
#include "../../doomdef.h"
#include "../hw_gl.h"
#include "../../z_zone.h"
@@ -69,7 +67,6 @@ extern boolean supportstencil;
void *GetGLFunc(const char *proc);
boolean SetupGLfunc(void);
void SetupGLFunc4(void);
void GL_Flush(void);
INT32 GL_isExtAvailable(const char *extension, const GLubyte *start);
void GL_SetModelView(GLint w, GLint h);
void GL_SetStates(void);
@@ -127,18 +124,9 @@ extern GLint maximumAnisotropy;
extern boolean supportNPO2tex;
extern boolean supportMipMap;
/** \brief OpenGL flags for video driver
*/
extern INT32 oglflags;
extern GLfloat modelMatrix[16];
extern GLfloat projMatrix[16];
typedef enum
{
GLF_NOZBUFREAD = 0x01,
GLF_NOTEXENV = 0x02,
} oglflags_t;
#ifdef __cplusplus
} // extern "C"
#endif
+101 -52
View File
@@ -88,6 +88,8 @@ patch_t *ranknum[10] = {}; // rank numbers
patch_t *framecounter = NULL;
patch_t *frameslash = NULL; // framerate stuff. Used in screen.c
patch_t *srb2back = NULL;
static player_t *plr = NULL;
boolean chat_on = false; // entering a chat message?
static char w_chat_buf[HU_MAXMSGLEN + 1];
@@ -96,10 +98,9 @@ static boolean headsupactive = false;
boolean hu_showscores = false; // draw rankings
static char hu_tick;
static tic_t hu_emoteanim = 0;
#define MAXEMOTESUGGESTIONS 8
static emote_t *emote_suggestions[MAXEMOTESUGGESTIONS] = {0};
emote_autocomplete_t emote_autocomplete = {0};
static huddrawlist_h luahuddrawlist_scores;
static huddrawlist_h luahuddrawlist_scores = NULL;
patch_t *rflagico = NULL;
patch_t *bflagico = NULL;
@@ -291,6 +292,7 @@ void HU_LoadGraphics(void)
return;
j = HU_FONTSTART;
for (i = 0; i < HU_FONTSIZE; i++, j++)
{
// cache the heads-up font for entire game execution
@@ -361,21 +363,21 @@ void HU_LoadGraphics(void)
cred_font[i] = (patch_t *)W_CachePatchName(buffer, PU_HUDGFX);
}
//cache numbers too!
// cache numbers too!
for (i = 0; i < 10; i++)
{
sprintf(buffer, "STTNUM%d", i);
tallnum[i] = (patch_t *)W_CachePatchName(buffer, PU_HUDGFX);
sprintf(buffer, "PINGN%d", i);
pingnum[i] = (patch_t *) W_CachePatchName(buffer, PU_HUDGFX);
pingnum[i] = (patch_t *)W_CachePatchName(buffer, PU_HUDGFX);
sprintf(buffer, "OPPRNK0%d", i);
ranknum[i] = (patch_t *) W_CachePatchName(buffer, PU_HUDGFX);
ranknum[i] = (patch_t *)W_CachePatchName(buffer, PU_HUDGFX);
}
// minus for negative tallnums
tallminus = (patch_t *)W_CachePatchName("STTMINUS", PU_HUDGFX);
songcreditbg = W_CachePatchName("K_SONGCR", PU_HUDGFX);
songcreditbg = (patch_t *)W_CachePatchName("K_SONGCR", PU_HUDGFX);
// cache ping gfx:
for (i = 0; i < 5; i++)
@@ -384,12 +386,15 @@ void HU_LoadGraphics(void)
pinggfx[i] = (patch_t *)W_CachePatchName(buffer, PU_HUDGFX);
}
pingmeasure[0] = W_CachePatchName("PINGD", PU_HUDGFX);
pingmeasure[1] = W_CachePatchName("PINGMS", PU_HUDGFX);
pingmeasure[0] = (patch_t *)W_CachePatchName("PINGD", PU_HUDGFX);
pingmeasure[1] = (patch_t *)W_CachePatchName("PINGMS", PU_HUDGFX);
// fps stuff
framecounter = W_CachePatchName("FRAMER", PU_HUDGFX);
frameslash = W_CachePatchName("FRAMESL", PU_HUDGFX);;
framecounter = (patch_t *)W_CachePatchName("FRAMER", PU_HUDGFX);
frameslash = (patch_t *)W_CachePatchName("FRAMESL", PU_HUDGFX);
// idk where else to put this lul
srb2back = (patch_t *)W_CachePatchName("SRB2BACK", PU_HUDGFX);
}
// Initialise Heads up
@@ -406,8 +411,10 @@ void HU_Init(void)
// set shift translation table
shiftxform = english_shiftxform;
luahuddrawlist_scores = LUA_HUD_CreateDrawList();
if (dedicated || rendermode == render_none)
return;
luahuddrawlist_scores = LUA_HUD_CreateDrawList();
HU_LoadGraphics();
}
@@ -589,12 +596,12 @@ static void DoSayCommand(SINT8 target, size_t usedargs, UINT8 flags)
}
// Only servers/admins can CSAY.
if(!server && !(IsPlayerAdmin(consoleplayer)))
if (!server && !(IsPlayerAdmin(consoleplayer)))
flags &= ~HU_CSAY;
// We handle HU_SERVER_SAY, not the caller.
flags &= ~HU_SERVER_SAY;
if(dedicated && !(flags & HU_CSAY))
if (dedicated && !(flags & HU_CSAY))
flags |= HU_SERVER_SAY;
buf[0] = target;
@@ -608,17 +615,20 @@ static void DoSayCommand(SINT8 target, size_t usedargs, UINT8 flags)
strlcat(msg, COM_Argv(ix + usedargs), msgspace);
}
if (strlen(msg) > 4 && strnicmp(msg, "/pm", 3) == 0) // used /pm
const size_t msglength = strlen(msg);
if (msglength > 4 && strnicmp(msg, "/pm", 3) == 0) // used /pm
{
// what we're gonna do now is check if the node exists
// with that logic, characters 4 and 5 are our numbers:
const char *newmsg;
INT32 spc = 1; // used if nodenum[1] is a space.
char *nodenum = (char*) malloc(3);
CLEANUP(pfree) char *nodenum = (char*) malloc(3);
memcpy(nodenum, msg+3, 2);
nodenum[2] = '\0';
// check for undesirable characters in our "number"
if (((nodenum[0] < '0') || (nodenum[0] > '9')) || ((nodenum[1] < '0') || (nodenum[1] > '9')))
if (((nodenum[0] < '0') || (nodenum[0] > '9')) || ((nodenum[1] < '0') || (nodenum[1] > '9')))
{
// check if nodenum[1] is a space
if (nodenum[1] == ' ')
@@ -627,23 +637,21 @@ static void DoSayCommand(SINT8 target, size_t usedargs, UINT8 flags)
else
{
HU_AddChatText("\x82NOTICE: \x80Invalid command format. Correct format is \'/pm<node> \'.", false);
free(nodenum);
return;
}
}
// I'm very bad at C, I swear I am, additional checks eww!
if (spc != 0)
{
if (msg[5] != ' ')
{
HU_AddChatText("\x82NOTICE: \x80Invalid command format. Correct format is \'/pm<node> \'.", false);
free(nodenum);
return;
}
}
target = atoi((const char*) nodenum); // turn that into a number
free(nodenum);
//CONS_Printf("%d\n", target);
// check for target player, if it doesn't exist then we can't send the message!
@@ -654,12 +662,13 @@ static void DoSayCommand(SINT8 target, size_t usedargs, UINT8 flags)
HU_AddChatText(va("\x82NOTICE: \x80Player %d does not exist.", target), false); // same
return;
}
buf[0] = target;
newmsg = msg+5+spc;
strlcpy(msg, newmsg, HU_MAXMSGLEN + 1);
}
SendNetXCmd(XD_SAY, buf, strlen(msg) + 1 + msg-buf);
SendNetXCmd(XD_SAY, buf, msglength + 1 + msg-buf);
}
/** Send a message to everyone.
@@ -910,10 +919,12 @@ static void Got_Saycmd(const UINT8 **p, INT32 playernum)
return;
}
const size_t msglength = strlen(msg);
//check for invalid characters (0x80 or above)
{
size_t i;
const size_t j = strlen(msg);
const size_t j = msglength;
for (i = 0; i < j; i++)
{
if (msg[i] & 0x80)
@@ -960,7 +971,7 @@ static void Got_Saycmd(const UINT8 **p, INT32 playernum)
}
// Handle "/me" actions, but only in messages to everyone.
if (target == 0 && strlen(msg) > 4 && strnicmp(msg, "/me ", 4) == 0)
if (target == 0 && msglength > 4 && strnicmp(msg, "/me ", 4) == 0)
{
msg += 4;
action = true;
@@ -1142,10 +1153,12 @@ static boolean HU_clearChatSpaces(void)
size_t i = 0; // Used to just check our message
char c; // current character we're iterating.
boolean nothingbutspaces = true;
const size_t chatlength = strlen(w_chat_buf);
for (; i < strlen(w_chat_buf); i++) // iterate through message and eradicate all spaces that don't belong.
for (; i < chatlength; i++) // iterate through message and eradicate all spaces that don't belong.
{
c = w_chat_buf[i];
if (!c)
break; // if there's nothing, it's safe to assume our message has ended, so let's not waste any more time here.
@@ -1154,6 +1167,7 @@ static boolean HU_clearChatSpaces(void)
nothingbutspaces = false;
}
}
return nothingbutspaces;
}
@@ -1200,11 +1214,11 @@ static void HU_SendChatMessage(void)
return;
}
size_t len = strlen(msg);
const size_t msglength = strlen(msg);
if (len >= 5 && strnicmp(msg, "/mute", 5) == 0) // Used /mute
if (msglength >= 5 && strnicmp(msg, "/mute", 5) == 0) // Used /mute
{
if (len > 6)
if (msglength > 6)
DoMute(msg+6);
else
HU_AddChatText("\x82NOTICE: \x80Usage: /mute <name|node>", false);
@@ -1212,7 +1226,7 @@ static void HU_SendChatMessage(void)
return;
}
if (len > 4 && strnicmp(msg, "/pm", 3) == 0) // used /pm
if (msglength > 4 && strnicmp(msg, "/pm", 3) == 0) // used /pm
{
INT32 spc = 1; // used if nodenum[1] is a space.
const char *newmsg;
@@ -1334,6 +1348,7 @@ boolean HU_Responder(event_t *ev)
chat_on = true;
w_chat_buf[0] = 0;
M_TextInputInit(&w_chat, w_chat_buf, sizeof w_chat_buf);
memset(&emote_autocomplete, 0, sizeof(emote_autocomplete));
teamtalk = false;
chat_scrollmedown = true;
typelines = 1;
@@ -1346,6 +1361,7 @@ boolean HU_Responder(event_t *ev)
chat_on = true;
w_chat_buf[0] = 0;
M_TextInputInit(&w_chat, w_chat_buf, sizeof w_chat_buf);
memset(&emote_autocomplete, 0, sizeof(emote_autocomplete));
teamtalk = G_GametypeHasTeams(); // Don't teamtalk if we don't have teams.
chat_scrollmedown = true;
typelines = 1;
@@ -1371,9 +1387,9 @@ boolean HU_Responder(event_t *ev)
&& ev->data1 != gamecontrol[0][gc_talkkey][1]))
return false;
M_TextInputHandleEmotes(&w_chat, c, emote_suggestions, MAXEMOTESUGGESTIONS);
if (c == KEY_ENTER)
if (M_TextInputHandleEmotes(&w_chat, c, &emote_autocomplete))
; // Do nothing
else if (c == KEY_ENTER)
{
chat_on = false;
chat_scrollmedown = true; // you hit enter, so you might wanna autoscroll to see what you just sent. :)
@@ -1410,8 +1426,6 @@ boolean HU_Responder(event_t *ev)
// HEADS UP DRAWING
//======================================================================
#define HU_DrawEmote(x, y, emote, flags) M_DrawEmote((x), (y), (emote), hu_emoteanim, (flags))
// Precompile a wordwrapped string to any given width.
// This is a muuuch better method than V_WORDWRAP.
// again stolen and modified a bit from video.c, don't mind me, will need to rearrange this one day.
@@ -1614,7 +1628,7 @@ static void HU_drawMiniChat(void)
if (cv_chatbacktint.value) // on request of wolfy
V_DrawFillConsoleMap(x + dx + 2, y+dy, EMOTEWIDTH, charheight, 239|V_SNAPTOBOTTOM|V_SNAPTOLEFT);
HU_DrawEmote(x+dx+2, y+dy, emote, V_SNAPTOBOTTOM|V_SNAPTOLEFT|transflag);
M_DrawEmote(x+dx+2, y+dy, emote, V_SNAPTOBOTTOM|V_SNAPTOLEFT|transflag);
dx += EMOTEWIDTH - charwidth;
j += emotelen;
@@ -1724,7 +1738,7 @@ static void HU_drawChatLog(INT32 offset)
{
if ((y+dy+2 >= chat_topy) && (y+dy < (chat_bottomy)))
{
HU_DrawEmote(x+dx+2, y+dy, emote, V_SNAPTOBOTTOM|V_SNAPTOLEFT);
M_DrawEmote(x+dx+2, y+dy, emote, V_SNAPTOBOTTOM|V_SNAPTOLEFT);
dx += EMOTEWIDTH - charwidth;
}
j += emotelen;
@@ -1864,7 +1878,7 @@ static void HU_DrawChat(void)
if ((emote = M_VerifyEmote(w_chat_buf+i, &emotelen)))
{
HU_DrawEmote(chatx + c + 2, y-1, emote, V_SNAPTOBOTTOM|V_SNAPTOLEFT|t);
M_DrawEmote(chatx + c + 2, y-1, emote, V_SNAPTOBOTTOM|V_SNAPTOLEFT|t);
c += EMOTEWIDTH - charwidth;
i += emotelen-1;
drawwidth = EMOTEWIDTH;
@@ -1901,17 +1915,37 @@ static void HU_DrawChat(void)
}
}
if (emote_suggestions[0])
if (emote_autocomplete.emotestart != -1 && (emote_autocomplete.complete[0] || (w_chat.cursor - emote_autocomplete.emotestart) > 1))
{
emote_t *suggest;
int skip = 0;
const char *complete;
int complete_len;
if (emote_autocomplete.complete[0])
{
complete = emote_autocomplete.complete;
complete_len = strlen(complete);
}
else
{
complete = &w_chat_buf[emote_autocomplete.emotestart];
complete_len = w_chat.cursor - emote_autocomplete.emotestart;
}
// A bit of copy-paste from /pm code :p
INT32 suggesty = chaty - charheight - 1;
size_t longest_suggestion_length = 0;
for (i = 0; i < MAXEMOTESUGGESTIONS && emote_suggestions[i]; ++i)
while ((suggest = M_FindEmote(complete, complete_len, skip)) != NULL)
{
longest_suggestion_length = max(longest_suggestion_length, strlen(emote_suggestions[i]->name));
longest_suggestion_length = max(longest_suggestion_length, strlen(suggest->name));
++skip;
}
skip = 0;
#ifdef NETSPLITSCREEN
if (splitscreen)
{
@@ -1923,11 +1957,19 @@ static void HU_DrawChat(void)
#endif
suggesty -= (cv_kartspeedometer.value ? 16 : 0);
for (i = 0; i < MAXEMOTESUGGESTIONS && emote_suggestions[i]; ++i)
while ((suggest = M_FindEmote(complete, complete_len, skip)) != NULL)
{
V_DrawFillConsoleMap(chatx + boxw + 2, suggesty - (7*i), (longest_suggestion_length+2)*4 + EMOTEWIDTH, 6, 239|V_SNAPTOBOTTOM|V_SNAPTOLEFT);
V_DrawSmallString(chatx + boxw + 4 + EMOTEWIDTH, suggesty - (7*i), V_SNAPTOBOTTOM|V_SNAPTOLEFT|V_ALLOWLOWERCASE, va(":%s:", emote_suggestions[i]->name));
HU_DrawEmote(chatx + boxw + 2, suggesty - i*7, emote_suggestions[i], V_SNAPTOBOTTOM|V_SNAPTOLEFT);
V_DrawFillConsoleMap(chatx + boxw + 2, suggesty - (7*skip), (longest_suggestion_length+2)*4 + EMOTEWIDTH, 6, V_SNAPTOBOTTOM|V_SNAPTOLEFT);
// Highlight currently suggested emote
int hlflag = 0;
if (skip == emote_autocomplete.skip && emote_autocomplete.complete[0])
hlflag = V_YELLOWMAP;
V_DrawSmallString(chatx + boxw + 4 + EMOTEWIDTH, suggesty - (7*skip), hlflag|V_SNAPTOBOTTOM|V_SNAPTOLEFT|V_ALLOWLOWERCASE, va(":%s:", suggest->name));
M_DrawEmote(chatx + boxw + 2, suggesty - skip*7, suggest, V_SNAPTOBOTTOM|V_SNAPTOLEFT);
++skip;
}
}
@@ -1956,7 +1998,7 @@ static void HU_DrawChat(void)
longest_name_length = max(longest_name_length, strlen(player_names[i]));
}
for(i = 0; i < MAXPLAYERS; i++)
for (i = 0; i < MAXPLAYERS; i++)
{
if (!playeringame[i])
continue;
@@ -2062,15 +2104,15 @@ static void HU_DrawChat_Old(void)
i = 0;
while (w_chat_buf[i])
{
if (w_chat.cursor == (i+1) && hu_tick < 4)
{
INT32 cursorx = (HU_INPUTX+c+charwidth < vid.width) ? (HU_INPUTX + c + charwidth) : (HU_INPUTX); // we may have to go down.
INT32 cursory = (cursorx != HU_INPUTX) ? (y) : (y+charheight);
V_DrawCharacter(cursorx, cursory+2*con_scalefactor, '_' |cv_constextsize.value | V_NOSCALESTART|t, !cv_allcaps.value);
}
int emotelen;
emote_t *emote;
//Hurdler: isn't it better like that?
if (w_chat_buf[i] >= HU_FONTSTART)
if ((emote = M_VerifyEmote(w_chat_buf+i, &emotelen)))
{
M_DrawScaledEmote((HU_INPUTX + c)<<FRACBITS, (y+con_scalefactor*2)<<FRACBITS, charwidth*FRACUNIT/EMOTEWIDTH, emote, V_NOSCALESTART | V_NOSCALEPATCH | t);
i += emotelen-1;
}
else if (w_chat_buf[i] >= HU_FONTSTART) //Hurdler: isn't it better like that?
{
//charwidth = hu_font[w_chat[i]-HU_FONTSTART]->width * con_scalefactor;
V_DrawCharacter(HU_INPUTX + c, y, w_chat_buf[i] | cv_constextsize.value | V_NOSCALESTART | t, !cv_allcaps.value);
@@ -2082,6 +2124,13 @@ static void HU_DrawChat_Old(void)
++i;
if (w_chat.cursor == i && hu_tick < 4)
{
INT32 cursorx = (HU_INPUTX+c+charwidth < vid.width) ? (HU_INPUTX + c + charwidth) : (HU_INPUTX); // we may have to go down.
INT32 cursory = (cursorx != HU_INPUTX) ? (y) : (y+charheight);
V_DrawCharacter(cursorx, cursory+2*con_scalefactor, '_' |cv_constextsize.value | V_NOSCALESTART|t, !cv_allcaps.value);
}
c += charwidth;
if (c >= vid.width)
{
+1
View File
@@ -90,6 +90,7 @@ extern patch_t *pinggfx[5];
extern patch_t *ranknum[10];
extern patch_t *framecounter;
extern patch_t *frameslash;
extern patch_t *srb2back;
extern patch_t *lt_font[LT_FONTSIZE];
extern patch_t *cred_font[CRED_FONTSIZE];
extern patch_t *rflagico;
-2
View File
@@ -158,8 +158,6 @@ UINT32 I_GetSongLoopPoint(void);
boolean I_SetSongPosition(UINT32 position);
UINT32 I_GetSongPosition(void);
void I_UpdateSongLagThreshold (void);
/// ------------------------
// MUSIC PLAYBACK
/// ------------------------
+2 -18
View File
@@ -95,16 +95,13 @@ INT32 VID_SetMode(INT32 modenum);
*/
const char *VID_GetModeName(INT32 modenum);
void VID_RefreshModeList(void);
void VID_PrepareModeList(void);
/** \brief can video system do fullscreen
*/
extern boolean allow_fullscreen;
/** \brief Update video system without updating frame
*/
void I_UpdateNoBlit(void);
/** \brief Update video system with updating frame
*/
void I_FinishUpdate(void);
@@ -113,13 +110,6 @@ void I_FinishUpdate(void);
*/
void I_UpdateNoVsync(void);
/** \brief Wait for vertical retrace or pause a bit.
\param count max wait
\return void
*/
void I_WaitVBL(INT32 count);
/** \brief The I_ReadScreen function
@@ -129,16 +119,10 @@ void I_WaitVBL(INT32 count);
*/
void I_ReadScreen(UINT8 * restrict scr, INT32 scale);
/** \brief Start disk icon
*/
void I_BeginRead(void);
/** \brief Stop disk icon
*/
void I_EndRead(void);
UINT32 I_GetRefreshRate(void);
boolean I_CheckAboveDesktopRes(INT32 width, INT32 height);
boolean I_CheckNativeRes(void);
void I_SetBorderlessWindow(void);
+51 -4
View File
@@ -1076,6 +1076,49 @@ static void K_initKartHUD(void)
R_InterpolateView(R_GetTimeFrac(RTF_CAMERA), !cv_uncappedhud.value);
}
void K_KartPlayerHUDUpdate(player_t *player)
{
if (player->kartstuff[k_lapanimation])
player->kartstuff[k_lapanimation]--;
if (player->kartstuff[k_yougotem])
player->kartstuff[k_yougotem]--;
if (G_BattleGametype() && (player->exiting || player->kartstuff[k_comebacktimer]))
{
if (player->exiting)
{
if (player->exiting < 6*TICRATE)
player->kartstuff[k_cardanimation] += ((164-player->kartstuff[k_cardanimation])/8)+1;
else if (player->exiting == 6*TICRATE)
player->kartstuff[k_cardanimation] = 0;
else if (player->kartstuff[k_cardanimation] < 2*TICRATE)
player->kartstuff[k_cardanimation]++;
}
else
{
if (player->kartstuff[k_comebacktimer] < 6*TICRATE)
player->kartstuff[k_cardanimation] -= ((164-player->kartstuff[k_cardanimation])/8)+1;
else if (player->kartstuff[k_comebacktimer] < 9*TICRATE)
player->kartstuff[k_cardanimation] += ((164-player->kartstuff[k_cardanimation])/8)+1;
}
if (player->kartstuff[k_cardanimation] > 164)
player->kartstuff[k_cardanimation] = 164;
if (player->kartstuff[k_cardanimation] < 0)
player->kartstuff[k_cardanimation] = 0;
}
else if (G_RaceGametype() && player->exiting)
{
if (player->kartstuff[k_cardanimation] < 2*TICRATE)
player->kartstuff[k_cardanimation]++;
}
else
{
player->kartstuff[k_cardanimation] = 0;
}
}
UINT8 K_GetHudColor(void)
{
if (cv_colorizedhud.value && cv_colorizedhudcolor.value)
@@ -2860,7 +2903,7 @@ static boolean K_GetScreenCoords(vector2_t *vec, player_t *player, mobj_t *targe
// X coordinate
// get difference between camangle and angle towards target
x = (INT32)viewangle - (INT32)R_PointToAngle(targx, targy);
x = (fixed_t)(viewangle - R_PointToAngle(targx, targy));
distfact = FINECOSINE((x>>ANGLETOFINESHIFT) & FINEMASK);
if (!distfact) distfact = 1;
@@ -4387,8 +4430,10 @@ static void K_drawLapStartAnim(void)
UINT8 *colormap = R_GetTranslationColormap(TC_DEFAULT, K_GetHudColor(), GTC_CACHE);
INT32 vflags = V_SNAPTOTOP|V_HUDTRANS;
fixed_t slideout = max(0, 32*(((progress - 76)*FRACUNIT) + R_GetTimeFrac(RTF_LEVEL)));
fixed_t slidein = max(0, 32*(((stplyr->kartstuff[k_lapanimation] - 76)*FRACUNIT) - R_GetTimeFrac(RTF_LEVEL)));
fixed_t slideout = 32*(((progress - 76)*FRACUNIT) + R_GetTimeFrac(RTF_LEVEL));
slideout = max(0, slideout);
fixed_t slidein = 32*(((stplyr->kartstuff[k_lapanimation] - 76)*FRACUNIT) - R_GetTimeFrac(RTF_LEVEL));
slidein = max(0, slidein);
// First, draw the emblem and hand
INT32 emblemx = (BASEVIDWIDTH << (FRACBITS - 1)) + slidein;
@@ -4423,7 +4468,9 @@ static void K_drawLapStartAnim(void)
V_DrawFixedPatch(leftx, y, FRACUNIT, vflags, kp_lapanim_lap[min(progress/2, 6)], NULL);
char *lapnum = va("%02d", stplyr->laps + 1);
for (int i = 0; i < (int)strlen(lapnum); i++)
const size_t laplength = strlen(lapnum);
for (int i = 0; i < (int)laplength; i++)
{
int digit = lapnum[i] - '0';
int frame = min(2, progress/2 - 8 - (i*2));
+2 -2
View File
@@ -24,7 +24,6 @@ extern "C" {
UINT8 K_GetHudColor(void);
boolean K_UseColorHud(void);
boolean K_UseHighResPortraits(void);
patch_t *K_GetFacePrefix(player_t *player, INT32 skinnum);
void K_RegisterKartHudStuff(void);
@@ -35,7 +34,6 @@ extern consvar_t cv_colorizedhud,
extern consvar_t cv_darkitembox;
extern consvar_t cv_biglaps;
extern consvar_t cv_highresportrait;
extern consvar_t cv_stat_xoffset, cv_stat_yoffset;
extern consvar_t cv_showstats;
extern consvar_t cv_fancyroulette;
extern consvar_t cv_showlaptimes;
@@ -52,6 +50,8 @@ extern CV_PossibleValue_t inputdisplay_cons_t[NUMINPUTDISPLAYSTUFF];
#define NUMMINIMAPDOTSTUFF 5
extern CV_PossibleValue_t minimapdot_cons_t[NUMMINIMAPDOTSTUFF];
void K_KartPlayerHUDUpdate(player_t *player);
const char *K_GetItemPatch(UINT8 item, boolean tiny);
INT32 K_calcSplitFlags(INT32 snapflags);
void K_LoadKartHUDGraphics(void);
+46 -70
View File
@@ -98,8 +98,6 @@ static void saltyhop_onchange(void)
}
}
static boolean K_SpeedLinesShouldBlend(player_t *player);
// SOME IMPORTANT VARIABLES DEFINED IN DOOMDEF.H:
// gamespeed is cc (0 for easy, 1 for normal, 2 for hard)
// franticitems is Frantic Mode items, bool
@@ -811,8 +809,10 @@ boolean K_IsPlayerLosing(player_t *player)
boolean K_IsPlayerWanted(player_t *player)
{
UINT8 i;
if (!(G_BattleGametype()))
if (!G_BattleGametype())
return false;
for (i = 0; i < 4; i++)
{
if (battlewanted[i] == -1)
@@ -820,6 +820,7 @@ boolean K_IsPlayerWanted(player_t *player)
if (player == &players[battlewanted[i]])
return true;
}
return false;
}
@@ -1244,7 +1245,9 @@ static void K_KartItemRoulette(player_t *player, ticcmd_t *cmd)
{
if (!playeringame[i] || players[i].spectator)
continue;
pingame++;
if (players[i].exiting)
dontforcespb = true;
if (players[i].kartstuff[k_bumper] > bestbumper)
@@ -1258,13 +1261,11 @@ static void K_KartItemRoulette(player_t *player, ticcmd_t *cmd)
// This makes the roulette produce the random noises.
if ((player->kartstuff[k_itemroulette] % 3) == 1 && P_IsDisplayPlayer(player))
{
#define PLAYROULETTESND S_StartSound(NULL, sfx_itrol1 + ((player->kartstuff[k_itemroulette] / 3) % 8))
for (i = 0; i <= splitscreen; i++)
{
if (player == &players[displayplayers[i]] && players[displayplayers[i]].kartstuff[k_itemroulette])
PLAYROULETTESND;
S_StartSound(NULL, sfx_itrol1 + ((player->kartstuff[k_itemroulette] / 3) % 8));
}
#undef PLAYROULETTESND
}
roulettestop = TICRATE + (3*(pingame - player->kartstuff[k_position]));
@@ -1363,8 +1364,9 @@ static fixed_t K_GetMobjWeight(mobj_t *mobj, mobj_t *against)
else
{
weight = (mobj->player->kartweight)<<FRACBITS;
if (mobj->player->speed > K_GetKartSpeed(mobj->player, false))
weight += (mobj->player->speed - K_GetKartSpeed(mobj->player, false))/8;
const fixed_t kartspeed = K_GetKartSpeed(mobj->player, false);
if (mobj->player->speed > kartspeed)
weight += (mobj->player->speed - kartspeed)/8;
}
break;
case MT_FALLINGROCK:
@@ -1486,9 +1488,9 @@ void K_KartBouncing(mobj_t *mobj1, mobj_t *mobj2, boolean bounce, boolean solid)
}
// if the speed difference is less than this let's assume they're going proportionately faster from each other
if (P_AproxDistance(momdifx, momdify) < (25*mapobjectscale))
const fixed_t momdiflength = P_AproxDistance(momdifx, momdify);
if (momdiflength < (25*mapobjectscale))
{
fixed_t momdiflength = P_AproxDistance(momdifx, momdify);
fixed_t normalisedx = FixedDiv(momdifx, momdiflength);
fixed_t normalisedy = FixedDiv(momdify, momdiflength);
momdifx = FixedMul((25*mapobjectscale), normalisedx);
@@ -1652,7 +1654,7 @@ static void K_UpdateOffroad(player_t *player)
// If you are in offroad, a timer starts.
if (offroadstrength)
{
if (/*K_CheckOffroadCollide(player->mo) &&*/ player->kartstuff[k_offroad] == 0) // With the way offroad is detected now that first check is no longer necessary. -Lat'
if (/*K_CheckOffroadCollide(player->mo) &&*/ player->kartstuff[k_offroad] == 0) // With the way offroad is detected now that first check is no longer necessary. -Lat'
player->kartstuff[k_offroad] = (TICRATE/2);
if (player->kartstuff[k_offroad] > 0)
@@ -2396,7 +2398,7 @@ void K_SpinPlayer(player_t *player, mobj_t *source, INT32 type, mobj_t *inflicto
|| player->kartstuff[k_invincibilitytimer] > 0 || player->kartstuff[k_growshrinktimer] > 0 || player->kartstuff[k_hyudorotimer] > 0
|| (G_BattleGametype() && ((player->kartstuff[k_bumper] <= 0 && player->kartstuff[k_comebacktimer]) || player->kartstuff[k_comebackmode] == 1)))
{
if (!force) // if shoulddamage force, we go THROUGH that.
if (!force) // if shoulddamage force, we go THROUGH that.
{
K_DoInstashield(player);
return;
@@ -2441,6 +2443,7 @@ void K_SpinPlayer(player_t *player, mobj_t *source, INT32 type, mobj_t *inflicto
P_SetScale(karmahitbox, player->mo->scale);
CONS_Printf(M_GetText("%s lost all of their bumpers!\n"), player_names[player-players]);
}
player->kartstuff[k_bumper]--;
if (K_IsPlayerWanted(player))
K_CalculateBattleWanted();
@@ -2575,6 +2578,7 @@ void K_SquishPlayer(player_t *player, mobj_t *source, mobj_t *inflictor)
P_SetScale(karmahitbox, player->mo->scale);
CONS_Printf(M_GetText("%s lost all of their bumpers!\n"), player_names[player-players]);
}
player->kartstuff[k_bumper]--;
if (K_IsPlayerWanted(player))
K_CalculateBattleWanted();
@@ -2694,6 +2698,7 @@ void K_ExplodePlayer(player_t *player, mobj_t *source, mobj_t *inflictor) // A b
P_SetScale(karmahitbox, player->mo->scale);
CONS_Printf(M_GetText("%s lost all of their bumpers!\n"), player_names[player-players]);
}
player->kartstuff[k_bumper]--;
if (K_IsPlayerWanted(player))
K_CalculateBattleWanted();
@@ -2854,9 +2859,9 @@ void K_SpawnKartExplosion(fixed_t x, fixed_t y, fixed_t z, fixed_t radius, INT32
for (i = 0; i < number; i++)
{
fa = (i*degrees);
v[0] = FixedMul(FINECOSINE(fa),radius);
v[0] = FixedMul(FINECOSINE(fa), radius);
v[1] = 0;
v[2] = FixedMul(FINESINE(fa),radius);
v[2] = FixedMul(FINESINE(fa), radius);
v[3] = FRACUNIT;
res = VectorMatrixMultiply(v, *RotateXMatrix(rotangle));
@@ -3425,7 +3430,7 @@ boolean K_CheckSlopeRollDist(mobj_t *mobj)
return true;
const fixed_t rolldist = (cv_sloperolldist.value * mapobjectscale);
const fixed_t m_dist = (R_QuickCamDist(mobj->x, mobj->y) << FRACBITS);
const fixed_t m_dist = R_QuickCamDist(mobj->x, mobj->y);
return (m_dist <= rolldist);
}
@@ -3606,7 +3611,7 @@ void K_SpawnSparkleTrail(mobj_t *mo)
sparkle->color = mo->color;
if (cv_playerblendeffects.value && mo->player && K_SpeedLinesShouldBlend(mo->player))
if (mo->player && K_PlayerEffectsShouldBlend(mo->player))
sparkle->blendmode = AST_ADD;
}
@@ -3980,15 +3985,19 @@ void K_PuntMine(mobj_t *thismine, mobj_t *punter)
mine->floorz = thismine->floorz;
mine->ceilingz = thismine->ceilingz;
//Since we aren't using P_KillMobj, we need to clean up the hnext reference
{
P_SetTarget(&thismine->target->hnext, NULL); //target is the player who owns the mine
thismine->target->player->kartstuff[k_bananadrag] = 0;
thismine->target->player->kartstuff[k_itemheld] = 0;
// Copy interp data
mine->old_angle = thismine->old_angle;
mine->old_x = thismine->old_x;
mine->old_y = thismine->old_y;
mine->old_z = thismine->old_z;
if (--thismine->target->player->kartstuff[k_itemamount] <= 0)
thismine->target->player->kartstuff[k_itemtype] = KITEM_NONE;
}
// Since we aren't using P_KillMobj, we need to clean up the hnext reference
P_SetTarget(&thismine->target->hnext, NULL); // target is the player who owns the mine
thismine->target->player->kartstuff[k_bananadrag] = 0;
thismine->target->player->kartstuff[k_itemheld] = 0;
if (--thismine->target->player->kartstuff[k_itemamount] <= 0)
thismine->target->player->kartstuff[k_itemtype] = KITEM_NONE;
P_RemoveMobj(thismine);
@@ -4424,6 +4433,12 @@ void K_DropHnextList(player_t *player)
dropwork->floorz = work->floorz;
dropwork->ceilingz = work->ceilingz;
// Copy interp data
dropwork->old_angle = work->old_angle;
dropwork->old_x = work->old_x;
dropwork->old_y = work->old_y;
dropwork->old_z = work->old_z;
if (ponground)
{
// floorz and ceilingz aren't properly set to account for FOFs and Polyobjects on spawn
@@ -4506,7 +4521,7 @@ void K_DropItems(player_t *player)
{
mobj_t *drop = P_SpawnMobj(player->mo->x, player->mo->y, player->mo->z + player->mo->height/2, MT_FLOATINGITEM);
P_SetScale(drop, drop->scale>>4);
drop->destscale = (3*drop->destscale)/2;;
drop->destscale = (3*drop->destscale)/2;
drop->angle = player->mo->angle + ANGLE_90;
P_Thrust(drop,
@@ -5329,53 +5344,13 @@ static void K_UpdateInvincibilitySounds(player_t *player)
#undef STOPTHIS
}
void K_KartPlayerHUDUpdate(player_t *player)
{
if (player->kartstuff[k_lapanimation])
player->kartstuff[k_lapanimation]--;
if (player->kartstuff[k_yougotem])
player->kartstuff[k_yougotem]--;
if (G_BattleGametype() && (player->exiting || player->kartstuff[k_comebacktimer]))
{
if (player->exiting)
{
if (player->exiting < 6*TICRATE)
player->kartstuff[k_cardanimation] += ((164-player->kartstuff[k_cardanimation])/8)+1;
else if (player->exiting == 6*TICRATE)
player->kartstuff[k_cardanimation] = 0;
else if (player->kartstuff[k_cardanimation] < 2*TICRATE)
player->kartstuff[k_cardanimation]++;
}
else
{
if (player->kartstuff[k_comebacktimer] < 6*TICRATE)
player->kartstuff[k_cardanimation] -= ((164-player->kartstuff[k_cardanimation])/8)+1;
else if (player->kartstuff[k_comebacktimer] < 9*TICRATE)
player->kartstuff[k_cardanimation] += ((164-player->kartstuff[k_cardanimation])/8)+1;
}
if (player->kartstuff[k_cardanimation] > 164)
player->kartstuff[k_cardanimation] = 164;
if (player->kartstuff[k_cardanimation] < 0)
player->kartstuff[k_cardanimation] = 0;
}
else if (G_RaceGametype() && player->exiting)
{
if (player->kartstuff[k_cardanimation] < 2*TICRATE)
player->kartstuff[k_cardanimation]++;
}
else
player->kartstuff[k_cardanimation] = 0;
}
static boolean K_SpeedLinesShouldBlend(player_t *player)
boolean K_PlayerEffectsShouldBlend(player_t *player)
{
if (!cv_playerblendeffects.value || !player->mo)
return false;
if (player->kartstuff[k_sneakertimer])
if (player->kartstuff[k_sneakertimer] ||
player->kartstuff[k_invincibilitytimer])
return true;
// this is how the percentage speedometer calcs, i suck at maths so this was the easiest thing to do lmao
@@ -5460,7 +5435,7 @@ FUNCINLINE static ATTRINLINE void K_SpawnNormalSpeedLines(player_t *player, bool
fast->colorized = true;
}
if (colorSpeed && K_SpeedLinesShouldBlend(player))
if (colorSpeed && K_PlayerEffectsShouldBlend(player))
fast->blendmode = AST_ADD;
}
}
@@ -6128,6 +6103,7 @@ static void K_KartDrift(player_t *player, boolean onground)
else
player->kartstuff[k_brakedrift] = 0;
}
//
// K_KartUpdatePosition
//
@@ -6316,7 +6292,7 @@ void K_MoveKartPlayer(player_t *player, boolean onground)
K_KartUpdatePosition(player);
if (LIKELY(!player->exiting))
if (!player->exiting)
{
if (player->kartstuff[k_oldposition] < player->kartstuff[k_position]) // But first, if you lost a place,
{
+1 -1
View File
@@ -41,7 +41,7 @@ void K_FlipFromObject(mobj_t *mo, mobj_t *master);
void K_MatchGenericExtraFlags(mobj_t *mo, mobj_t *master);
void K_RespawnChecker(player_t *player);
void K_KartMoveAnimation(player_t *player);
void K_KartPlayerHUDUpdate(player_t *player);
boolean K_PlayerEffectsShouldBlend(player_t *player);
void K_KartPlayerThink(player_t *player, ticcmd_t *cmd);
void K_KartPlayerAfterThink(player_t *player);
void K_DoInstashield(player_t *player);
+17 -8
View File
@@ -385,7 +385,7 @@ static int lib_pSpawnMobj(lua_State *L)
if (type >= NUMMOBJTYPES)
return luaL_error(L, "mobj type %d out of range (0 - %d)", type, NUMMOBJTYPES-1);
mobj_t *th = P_SpawnMobj(x, y, z, type);
th->islocal = !hook_important;
if (!P_MobjWasRemoved(th)) th->islocal = !hook_important;
LUA_PushUserdata(L, th, META_MOBJ);
return 1;
}
@@ -413,7 +413,7 @@ static int lib_pSpawnMissile(lua_State *L)
if (type >= NUMMOBJTYPES)
return luaL_error(L, "mobj type %d out of range (0 - %d)", type, NUMMOBJTYPES-1);
mobj_t *th = P_SpawnMissile(source, dest, type);
th->islocal = !hook_important;
if (!P_MobjWasRemoved(th)) th->islocal = !hook_important;
LUA_PushUserdata(L, th, META_MOBJ);
return 1;
}
@@ -432,7 +432,7 @@ static int lib_pSpawnXYZMissile(lua_State *L)
if (type >= NUMMOBJTYPES)
return luaL_error(L, "mobj type %d out of range (0 - %d)", type, NUMMOBJTYPES-1);
mobj_t *th = P_SpawnXYZMissile(source, dest, type, x, y, z);
th->islocal = !hook_important;
if (!P_MobjWasRemoved(th)) th->islocal = !hook_important;
LUA_PushUserdata(L, th, META_MOBJ);
return 1;
}
@@ -453,7 +453,7 @@ static int lib_pSpawnPointMissile(lua_State *L)
if (type >= NUMMOBJTYPES)
return luaL_error(L, "mobj type %d out of range (0 - %d)", type, NUMMOBJTYPES-1);
mobj_t *th = P_SpawnPointMissile(source, xa, ya, za, type, x, y, z);
th->islocal = !hook_important;
if (!P_MobjWasRemoved(th)) th->islocal = !hook_important;
LUA_PushUserdata(L, th, META_MOBJ);
return 1;
}
@@ -472,7 +472,7 @@ static int lib_pSpawnAlteredDirectionMissile(lua_State *L)
if (type >= NUMMOBJTYPES)
return luaL_error(L, "mobj type %d out of range (0 - %d)", type, NUMMOBJTYPES-1);
mobj_t *th = P_SpawnAlteredDirectionMissile(source, type, x, y, z, shiftingAngle);
th->islocal = !hook_important;
if (!P_MobjWasRemoved(th)) th->islocal = !hook_important;
LUA_PushUserdata(L, th, META_MOBJ);
return 1;
}
@@ -503,7 +503,7 @@ static int lib_pSPMAngle(lua_State *L)
if (type >= NUMMOBJTYPES)
return luaL_error(L, "mobj type %d out of range (0 - %d)", type, NUMMOBJTYPES-1);
mobj_t *th = P_SPMAngle(source, type, angle, allowaim, flags2);
th->islocal = !hook_important;
if (!P_MobjWasRemoved(th)) th->islocal = !hook_important;
LUA_PushUserdata(L, th, META_MOBJ);
return 1;
}
@@ -519,7 +519,7 @@ static int lib_pSpawnPlayerMissile(lua_State *L)
if (type >= NUMMOBJTYPES)
return luaL_error(L, "mobj type %d out of range (0 - %d)", type, NUMMOBJTYPES-1);
mobj_t *th = P_SpawnPlayerMissile(source, type, flags2);
th->islocal = !hook_important;
if (!P_MobjWasRemoved(th)) th->islocal = !hook_important;
LUA_PushUserdata(L, th, META_MOBJ);
return 1;
}
@@ -3056,7 +3056,13 @@ static int lib_gSetPlayerGamepadIndicatorColor(lua_State *L)
{
INT32 player = -1;
player_t *plr = *((player_t **)luaL_checkudata(L, 1, META_PLAYER)); // retrieve player
UINT16 color = (UINT16)luaL_checkinteger(L, 2); // skincolor
UINT8 color = (UINT8)luaL_checkinteger(L, 2); // skincolor
if (!plr)
return LUA_ErrInvalid(L, "player_t");
if (color >= MAXTRANSLATIONS)
return luaL_error(L, "color %d out of range (0 - %d).", color, MAXTRANSLATIONS-1);
for (int i = 0; i < MAXSPLITSCREENPLAYERS; ++i)
{
@@ -3084,6 +3090,9 @@ static int lib_gPlayerDeviceRumble(lua_State *L)
UINT16 high_strength = (UINT16)luaL_checkinteger(L, 3); // high frequency rumble motor strenght
UINT32 duration = (UINT32)luaL_optinteger(L, 4, 84); // duration of rumble in ms
if (!plr)
return LUA_ErrInvalid(L, "player_t");
for (int i = 0; i < MAXSPLITSCREENPLAYERS; ++i)
{
if (plr - players == displayplayers[i])
+2 -8
View File
@@ -251,14 +251,8 @@ int mobj_angle_setter(lua_State *L)
mobj_t *mo = GETMO();
mo->angle = luaL_checkangle(L, 2);
for (UINT8 i = 0; i <= splitscreen; i++)
{
if (mo->player == P_GetLocalPlayerForNum(i))
{
localangle[i] = mo->angle;
break;
}
}
if (mo->player)
P_ForceLocalAngle(mo->player, mo->angle);
return 0;
}
+6 -4
View File
@@ -49,17 +49,19 @@ aatree_t *M_AATreeAlloc(UINT32 flags)
return aatree;
}
static void M_AATreeFree_Node(aatree_node_t *node)
static void M_AATreeFree_Node(aatree_node_t *node, bool is_string)
{
if (node->left) M_AATreeFree_Node(node->left);
if (node->right) M_AATreeFree_Node(node->right);
if (node->left) M_AATreeFree_Node(node->left, is_string);
if (node->right) M_AATreeFree_Node(node->right, is_string);
if (is_string)
Z_Free(node->value);
Z_Free(node);
}
void M_AATreeFree(aatree_t *aatree)
{
if (aatree->root)
M_AATreeFree_Node(aatree->root);
M_AATreeFree_Node(aatree->root, (aatree->flags & AATREE_STRING) == AATREE_STRING);
Z_Free(aatree);
}
+57 -20
View File
@@ -10,20 +10,25 @@
/// \brief Chat emotes handling
#include <map>
#include <list>
#include <string>
#include <sstream>
#include <cstring>
#include "m_emotes.h"
#include "i_time.h" // I_GetTime
extern "C" {
#include "w_wad.h"
#include "z_zone.h"
#include "hu_stuff.h"
#include "v_video.h"
#include "command.h"
}
consvar_t cv_emotes = {"emotes", "On", CV_SAVE, CV_OnOff, NULL, 0, NULL, NULL, 0, 0, NULL};;
static void Command_ListEmotes_f(void);
consvar_t cv_emotes = {"emotes", "On", CV_SAVE, CV_OnOff, NULL, 0, NULL, NULL, 0, 0, NULL};
static std::map<std::string, emote_t> emotes;
@@ -117,12 +122,6 @@ void M_LoadEmotes(UINT16 wadnum)
UINT8 numframes = 0;
auto copy_frame = [&] {
if (numframes == MAXEMOTEFRAMES)
{
CONS_Alert(CONS_WARNING, "EMOTES: Too many frames. (file %s, line %d)", wadfiles[wadnum]->filename, linenum);
return false;
}
size_t list_split = value.find(',');
std::string framelumpname = value.substr(0, list_split);
trim(framelumpname);
@@ -136,9 +135,16 @@ void M_LoadEmotes(UINT16 wadnum)
if (framelumpname.size() == 0)
return false;
// Only print this warning if we actually got new frame
if (numframes == MAXEMOTEFRAMES)
{
CONS_Alert(CONS_WARNING, "EMOTES: Too many frames. (file %s, line %d)\n", wadfiles[wadnum]->filename, linenum);
return false;
}
if (framelumpname.size() > 8)
{
CONS_Alert(CONS_WARNING, "EMOTES: Frame %d name is too long. (file %s, line %d)", numframes, wadfiles[wadnum]->filename, linenum);
CONS_Alert(CONS_WARNING, "EMOTES: Frame %d name is too long. (file %s, line %d)\n", numframes, wadfiles[wadnum]->filename, linenum);
framelumpname.resize(8);
}
@@ -153,7 +159,7 @@ void M_LoadEmotes(UINT16 wadnum)
if (numframes == 0)
{
CONS_Alert(CONS_WARNING, "EMOTES: Expected list of frames. (file %s, line %d)", wadfiles[wadnum]->filename, linenum);
CONS_Alert(CONS_WARNING, "EMOTES: Expected list of frames. (file %s, line %d)\n", wadfiles[wadnum]->filename, linenum);
}
emote->numframes = numframes;
@@ -165,12 +171,12 @@ void M_LoadEmotes(UINT16 wadnum)
if (emote->timeperframe <= 0)
{
emote->timeperframe = 1;
CONS_Alert(CONS_WARNING, "EMOTES: Bad value for 'timeperframe'. (file %s, line %d)", wadfiles[wadnum]->filename, linenum);
CONS_Alert(CONS_WARNING, "EMOTES: Bad value for 'timeperframe'. (file %s, line %d)\n", wadfiles[wadnum]->filename, linenum);
}
}
else
{
CONS_Alert(CONS_WARNING, "EMOTES: Unrecognized field '%s'. (file %s, line %d)", field.c_str(), wadfiles[wadnum]->filename, linenum);
CONS_Alert(CONS_WARNING, "EMOTES: Unrecognized field '%s'. (file %s, line %d)\n", field.c_str(), wadfiles[wadnum]->filename, linenum);
}
}
else
@@ -187,6 +193,8 @@ void M_InitEmotes(void)
UINT16 i;
for (i = 0; i < numwadfiles; i++)
M_LoadEmotes(i);
COM_AddCommand("listemotes", Command_ListEmotes_f);
}
emote_t *M_FindEmote(const char *name, int len, int skip)
@@ -199,7 +207,7 @@ emote_t *M_FindEmote(const char *name, int len, int skip)
for (auto &pair: emotes)
{
if (pair.first.rfind(query, 0, std::min(len, MAXEMOTENAME)) != 0)
if (strcasestr(pair.first.c_str(), query) == NULL)
continue;
if (skip > 0)
@@ -247,23 +255,18 @@ emote_t *M_VerifyEmote(const char *name, int *emotelen)
return match;
}
void M_DrawEmote(INT32 x, INT32 y, emote_t *emote, tic_t anim, INT32 flags)
void M_DrawScaledEmote(fixed_t x, fixed_t y, fixed_t scale, emote_t *emote, INT32 flags)
{
if (emote->numframes == 0)
return;
const char *lumpname = emote->frames[(anim/emote->timeperframe) % emote->numframes];
const char *lumpname = emote->frames[(I_GetTime()/emote->timeperframe) % emote->numframes];
patch_t *emotepatch = (patch_t*)W_CachePatchName(lumpname, PU_CACHE);
const int CHARHEIGHT = 6;
fixed_t scale = FRACUNIT;
x *= FRACUNIT;
y *= FRACUNIT;
if (emotepatch->width > EMOTEWIDTH)
scale = (FRACUNIT/emotepatch->width)*EMOTEWIDTH;
scale = FixedMul(scale, (FRACUNIT/emotepatch->width)*EMOTEWIDTH);
else if (emotepatch->width < EMOTEWIDTH)
x += (EMOTEWIDTH-emotepatch->width)*FRACUNIT/2;
@@ -271,3 +274,37 @@ void M_DrawEmote(INT32 x, INT32 y, emote_t *emote, tic_t anim, INT32 flags)
V_DrawFixedPatch(x, y, scale, flags, emotepatch, NULL);
}
static void Command_ListEmotes_f(void)
{
const int EMOTES_PER_PAGE = 24;
const int NUMPAGES = std::max<int>(emotes.size()/EMOTES_PER_PAGE, 1);
int page = 1;
if (COM_Argc() > 1)
page = std::atoi(COM_Argv(1));
if (page <= 0 || page > NUMPAGES)
{
if (NUMPAGES > 1)
CONS_Printf("Enter page number between 1 and %d\n", NUMPAGES);
else
CONS_Printf("Bad page number, try using this command without arguments\n");
return;
}
int i = 0;
for (auto &pair: emotes)
{
++i;
if (i <= (page-1)*EMOTES_PER_PAGE)
continue;
if (i > page*EMOTES_PER_PAGE)
break;
CONS_Printf("%s - :%s:\n", pair.first.c_str(), pair.first.c_str());
}
CONS_Printf("Page %d/%d\n", page, NUMPAGES);
}
+4 -3
View File
@@ -17,6 +17,7 @@ extern "C" {
#endif
#include "doomdef.h"
#include "m_fixed.h"
#include "command.h"
extern consvar_t cv_emotes;
@@ -48,9 +49,9 @@ emote_t *M_FindEmote(const char *name, int len, int skips);
// needs to be skipped to get past emote name
emote_t *M_VerifyEmote(const char *name, int *emotelen);
// Draw the emote, anim should be some kind of timer ticking every game tic
// for animated emotes
void M_DrawEmote(INT32 x, INT32 y, emote_t *emote, tic_t anim, INT32 flags);
// Draw the emote, animation for animated emotes is done via I_GetTime
#define M_DrawEmote(x, y, emote, flags) M_DrawScaledEmote((x)<<FRACBITS, (y)<<FRACBITS, FRACUNIT, emote, flags)
void M_DrawScaledEmote(fixed_t x, fixed_t y, fixed_t scale, emote_t *emote, INT32 flags);
#ifdef __cplusplus
} // extern "C"
+398 -197
View File
File diff suppressed because it is too large. Load diff
+15
View File
@@ -204,6 +204,7 @@ typedef struct menu_s
struct menu_s *prevMenu; // previous menu
menuitem_t *menuitems; // menu items
void (*drawroutine)(void); // draw routine
void (*tickroutine)(void); // ticker routine
INT16 x, y; // x, y of menu
INT16 lastOn; // last item user was on in menu
boolean (*quitroutine)(void); // called before quit a menu return true if we can
@@ -222,6 +223,11 @@ extern menu_t *currentMenu;
extern menu_t MainDef;
extern menu_t SP_LoadDef;
#define MAXCOLUMNMODES 12 //max modes displayed in one column
#define MAXMODEDESCS (MAXCOLUMNMODES*3)
extern menu_t OP_VideoModeDef;
void M_VideoModeMenu(INT32 choice);
// Call upon joystick hotplug
void M_SetupJoystickMenu(INT32 choice);
extern menu_t OP_JoystickSetDef;
@@ -308,6 +314,8 @@ void M_ResetDemoList(void);
void M_ReplayHut(INT32 choice);
void M_SetPlaybackMenuPointer(void);
void Nextmap_OnChange(void);
void M_RefreshPauseMenu(void);
INT32 HU_GetHighlightColor(void);
@@ -328,6 +336,7 @@ void M_SlotCvarIntoModMenu(consvar_t* cvar, const char* category, const char* na
prev,\
source,\
M_DrawGenericMenu,\
NULL,\
x, y,\
0,\
NULL,\
@@ -341,6 +350,7 @@ void M_SlotCvarIntoModMenu(consvar_t* cvar, const char* category, const char* na
prev,\
source,\
M_DrawGenericScrollMenu,\
NULL,\
x, y,\
0,\
NULL,\
@@ -355,6 +365,7 @@ void M_SlotCvarIntoModMenu(consvar_t* cvar, const char* category, const char* na
NULL,\
source,\
M_DrawPauseMenu,\
NULL,\
x, y,\
0,\
NULL,\
@@ -368,6 +379,7 @@ void M_SlotCvarIntoModMenu(consvar_t* cvar, const char* category, const char* na
prev,\
source,\
M_DrawCenteredMenu,\
NULL,\
BASEVIDWIDTH/2, y,\
0,\
NULL,\
@@ -381,6 +393,7 @@ void M_SlotCvarIntoModMenu(consvar_t* cvar, const char* category, const char* na
prev,\
source,\
M_DrawServerMenu,\
NULL,\
24,40,\
0,\
NULL,\
@@ -394,6 +407,7 @@ void M_SlotCvarIntoModMenu(consvar_t* cvar, const char* category, const char* na
prev,\
source,\
M_DrawControl,\
NULL,\
26, 40,\
0,\
NULL,\
@@ -407,6 +421,7 @@ void M_SlotCvarIntoModMenu(consvar_t* cvar, const char* category, const char* na
NULL,\
source,\
M_DrawImageDef,\
NULL,\
0, 0,\
0,\
NULL,\
+58 -211
View File
@@ -735,26 +735,27 @@ static menuitem_t OP_AllControlsMenu[] =
#define OP_JOYMENU(pnum) \
{IT_HEADER, NULL, "Gameplay Controls", NULL, 7}, \
{IT_STRING | IT_CVAR, NULL, "Aim Forward/Back" , &cv_aimaxis[pnum] , 15}, \
{IT_STRING | IT_CVAR, NULL, "Turn Left/Right" , &cv_turnaxis[pnum] , 20}, \
{IT_STRING | IT_CVAR, NULL, "Accelerate" , &cv_moveaxis[pnum] , 25}, \
{IT_STRING | IT_CVAR, NULL, "Brake" , &cv_brakeaxis[pnum] , 30}, \
{IT_STRING | IT_CVAR, NULL, "Drift" , &cv_driftaxis[pnum] , 35}, \
{IT_STRING | IT_CVAR, NULL, "Use Item" , &cv_fireaxis[pnum] , 40}, \
{IT_STRING | IT_CVAR, NULL, "Look Backward" , &cv_lookbackaxis[pnum] , 45}, \
{IT_STRING | IT_CVAR, NULL, "Custom Button 1" , &cv_custom1axis[pnum] , 50}, \
{IT_STRING | IT_CVAR, NULL, "Custom Button 2" , &cv_custom2axis[pnum] , 55}, \
{IT_STRING | IT_CVAR, NULL, "Custom Button 3" , &cv_custom3axis[pnum] , 60}, \
{IT_STRING | IT_CVAR, NULL, "Aim Forward/Back" , &cv_aimaxis[pnum] , 15}, \
{IT_STRING | IT_CVAR, NULL, "Turn Left/Right" , &cv_turnaxis[pnum] , 20}, \
{IT_STRING | IT_CVAR, NULL, "Accelerate" , &cv_moveaxis[pnum] , 25}, \
{IT_STRING | IT_CVAR, NULL, "Brake" , &cv_brakeaxis[pnum] , 30}, \
{IT_STRING | IT_CVAR, NULL, "Drift" , &cv_driftaxis[pnum] , 35}, \
{IT_STRING | IT_CVAR, NULL, "Use Item" , &cv_fireaxis[pnum] , 40}, \
{IT_STRING | IT_CVAR, NULL, "Look Backward" , &cv_lookbackaxis[pnum] , 45}, \
{IT_STRING | IT_CVAR, NULL, "Custom Button 1" , &cv_custom1axis[pnum] , 50}, \
{IT_STRING | IT_CVAR, NULL, "Custom Button 2" , &cv_custom2axis[pnum] , 55}, \
{IT_STRING | IT_CVAR, NULL, "Custom Button 3" , &cv_custom3axis[pnum] , 60}, \
{IT_HEADER, NULL, "Camera Controls", NULL, 67}, \
{IT_STRING | IT_CVAR, NULL, "Look Up/Down" , &cv_lookaxis[pnum] , 75}, \
{IT_STRING | IT_CVAR, NULL, "Turn Left/Right" , &cv_camturnaxis[pnum] , 80}, \
{IT_STRING | IT_CVAR, NULL, "Strafe Left/Right" , &cv_camstrafeaxis[pnum] , 85}, \
{IT_STRING | IT_CVAR, NULL, "Look Up/Down" , &cv_lookaxis[pnum] , 75}, \
{IT_STRING | IT_CVAR, NULL, "Turn Left/Right" , &cv_camturnaxis[pnum] , 80}, \
{IT_STRING | IT_CVAR, NULL, "Strafe Left/Right" , &cv_camstrafeaxis[pnum] , 85}, \
{IT_HEADER, NULL, "Deadzones", NULL, 92}, \
{IT_STRING | IT_CVAR, NULL, "X deadzone" , &cv_xdeadzone[pnum] , 100}, \
{IT_STRING | IT_CVAR, NULL, "Y deadzone" , &cv_ydeadzone[pnum] , 105}, \
{IT_STRING | IT_CVAR, NULL, "X deadzone" , &cv_xdeadzone[pnum] , 100}, \
{IT_STRING | IT_CVAR, NULL, "Y deadzone" , &cv_ydeadzone[pnum] , 105}, \
{IT_HEADER, NULL, "Miscellaneous", NULL, 112}, \
{IT_STRING | IT_CVAR, NULL, "Controller Rumble" , &cv_rumble[pnum] , 120}, \
{IT_STRING | IT_CVAR, NULL, "Set LED to Player color", &cv_gamepadled[pnum] , 125},
{IT_STRING | IT_CVAR, NULL, "Controller Rumble" , &cv_rumble[pnum] , 120}, \
{IT_STRING | IT_CVAR, NULL, "Controller Rumble Strength" , &cv_rumblestrength[pnum] , 125}, \
{IT_STRING | IT_CVAR, NULL, "Set LED to Player color" , &cv_gamepadled[pnum] , 130},
static menuitem_t OP_Joystick1Menu[] =
{
@@ -1152,6 +1153,13 @@ static menuitem_t OP_SoundAdvancedMenu[] =
{IT_STRING | IT_CVAR, NULL, "Stereo Seperation", &cv_stereosep, 35},
#endif
#ifdef HAVE_FLUIDSYNTH
{IT_HEADER, NULL, "MIDI Settings", NULL, NULL, OPENMPT_MENUOFFSET},
{IT_STRING | IT_CVAR | IT_CV_STRING, NULL, "Sound Font File", NULL, &cv_midisoundfontpath, OPENMPT_MENUOFFSET+12},
{IT_STRING | IT_CVAR | IT_CV_SLIDER, NULL, "Chorus", NULL, &cv_midichorus, OPENMPT_MENUOFFSET+40},
{IT_STRING | IT_CVAR | IT_CV_SLIDER, NULL, "Reverb", NULL, &cv_midireverb, OPENMPT_MENUOFFSET+50},
#endif
{IT_HEADER, NULL, "Misc", NULL, 45},
{IT_STRING | IT_CVAR, NULL, "Same Sound Limit", &cv_samesoundlimit, 55},
@@ -1179,6 +1187,11 @@ static const char* OP_SoundAdvancedTooltips[] =
"Which Amiga should be used for .mod playback?",
#endif
"How far should the four channels in .mod be panned?",
#endif
#ifdef HAVE_FLUIDSYNTH
"Which MIDI soundfont to use",
"Controls the chorus of MIDI playback\n setting this too high might cause some instruments to be overexposed",
"Controls the reverb of MIDI playback\n setting this too high might cause notes to be drawn out",
#endif
NULL,
"How many times is the same sound allowed to play at once?\nIf 0 theres no limit.",
@@ -1873,7 +1886,7 @@ static const char* OP_SaturnHudTooltips[] =
"Disable the animation of the Positionnumber\nwhen overtaking someone.",
"Flash current Lap Time when doing a Lap on the Timer.",
"Use extra graphics for multiple sneakers, bananas and jawz.",
"Change when the item amount is to be displayed\nMultiple will always display the number.\nwhen you have multiple of the same Item.\nAlways will always display the number regardless of Item amount.",
"Change when the item amount is to be displayed.\nMultiple will always display the number.\nWhen you have multiple of the same Item.\nAlways will always display the number regardless of Item amount.",
"Enables an animation while the roulette is active.",
"Show the big 'LAP' text on a lap change.",
"Show the big Cecho Messages.",
@@ -2179,9 +2192,6 @@ static menuitem_t OP_AdvancedBirdMenu[] =
{IT_STRING | IT_CVAR, NULL, "Fade Back from Grow", &cv_growmusicfade, 20},
{IT_STRING | IT_CVAR, NULL, "Fade Out Before Respawning", &cv_respawnfademusicout, 30},
{IT_STRING | IT_CVAR, NULL, "Fade Back In While Respawning", &cv_respawnfademusicback, 40},
{IT_STRING | IT_CVAR, NULL, "Resync Threshold", &cv_music_resync_threshold, 60},
{IT_STRING | IT_CVAR, NULL, "Resync Special Music Only", &cv_music_resync_powerups_only, 70},
};
static const char* OP_AdvancedBirdTooltips[] =
@@ -2191,8 +2201,6 @@ static const char* OP_AdvancedBirdTooltips[] =
"Fade in music after Grow.",
"Fade out music before respawning.",
"Fade in music while respawning.",
"Threshold for syncing music.",
"Only sync special music.",
};
enum
@@ -2202,8 +2210,6 @@ enum
fadegrow,
respawnfadeout,
respawnfadein,
syncthreshold,
syncspecialonly,
};
menuitem_t OP_CustomCvarMenu[MAXMENUCCVARS];
@@ -2222,6 +2228,7 @@ menu_t MISC_AddonsDef =
&OP_DataOptionsDef,
MISC_AddonsMenu,
M_DrawAddons,
M_AddonsRefresh,
50, 28,
0,
NULL,
@@ -2235,6 +2242,7 @@ menu_t MISC_ReplayHutDef =
NULL,
MISC_ReplayHutMenu,
M_DrawReplayHut,
NULL,
30, 80,
0,
M_QuitReplayHut,
@@ -2248,6 +2256,7 @@ menu_t MISC_ReplayOptionsDef =
&OP_DataOptionsDef,
MISC_ReplayOptionsMenu,
M_DrawGenericMenu,
NULL,
27, 40,
0,
NULL,
@@ -2261,6 +2270,7 @@ menu_t MISC_ReplayStartDef =
&MISC_ReplayHutDef,
MISC_ReplayStartMenu,
M_DrawReplayStartMenu,
NULL,
30, 90,
0,
NULL,
@@ -2273,6 +2283,7 @@ menu_t PlaybackMenuDef = {
NULL,
PlaybackMenu,
M_DrawPlaybackMenu,
NULL,
//BASEVIDWIDTH/2 - 94, 2,
BASEVIDWIDTH/2 - 88, 2,
0,
@@ -2291,6 +2302,7 @@ menu_t MISC_DiscordRequestsDef = {
&MPauseDef,
MISC_DiscordRequestsMenu,
M_DrawDiscordRequests,
NULL,
0, 0,
0,
NULL,
@@ -2315,6 +2327,7 @@ menu_t SR_UnlockChecklistDef =
&SR_MainDef,
SR_UnlockChecklistMenu,
M_DrawChecklist,
NULL,
280, 185,
0,
NULL,
@@ -2328,6 +2341,7 @@ menu_t SR_MusicTestDef =
&OP_SoundOptionsDef,
SR_MusicTestMenu,
M_DrawMusicTest,
NULL,
60, 150,
0,
NULL,
@@ -2344,6 +2358,7 @@ menu_t SP_LevelStatsDef =
&SR_MainDef,
SP_LevelStatsMenu,
M_DrawLevelStats,
NULL,
280, 185,
0,
NULL,
@@ -2357,6 +2372,7 @@ static menu_t SP_TimeAttackDef =
&MainDef, // Doesn't matter.
SP_TimeAttackMenu,
M_DrawTimeAttackMenu,
NULL,
34, 40,
0,
M_QuitTimeAttackMenu,
@@ -2369,6 +2385,7 @@ static menu_t SP_ReplayDef =
&SP_TimeAttackDef,
SP_ReplayMenu,
M_DrawTimeAttackMenu,
NULL,
34, 40,
0,
NULL,
@@ -2381,6 +2398,7 @@ static menu_t SP_GuestReplayDef =
&SP_TimeAttackDef,
SP_GuestReplayMenu,
M_DrawTimeAttackMenu,
NULL,
34, 40,
0,
NULL,
@@ -2393,6 +2411,7 @@ static menu_t SP_GhostDef =
&SP_TimeAttackDef,
SP_GhostMenu,
M_DrawTimeAttackMenu,
NULL,
34, 40,
0,
NULL,
@@ -2407,6 +2426,7 @@ menu_t MP_MainDef =
&MainDef,
MP_MainMenu,
M_DrawMPMainMenu,
NULL,
42, 30,
0,
M_CancelConnect,
@@ -2424,6 +2444,7 @@ menu_t MP_ConnectDef =
&MP_MainDef,
MP_ConnectMenu,
M_DrawConnectMenu,
NULL,
27,24,
0,
M_CancelConnect,
@@ -2437,6 +2458,7 @@ menu_t MP_PlayerSetupDef =
&MP_MainDef,
MP_PlayerSetupMenu,
M_DrawSetupMultiPlayerMenu,
NULL,
36, 14,
0,
M_QuitMultiPlayerMenu,
@@ -2451,6 +2473,7 @@ menu_t OP_MainDef =
&MainDef,
OP_MainMenu,
M_DrawGenericMenu,
NULL,
60, 25,
0,
NULL,
@@ -2473,6 +2496,7 @@ menu_t OP_JoystickSetDef =
&OP_Joystick1Def,
OP_JoystickSetMenu,
M_DrawJoystick,
NULL,
50, 40,
0,
NULL,
@@ -2486,6 +2510,7 @@ menu_t OP_VideoOptionsDef =
&OP_MainDef,
OP_VideoOptionsMenu,
M_DrawVideoMenu,
NULL,
30, 15,
0,
NULL,
@@ -2499,6 +2524,7 @@ menu_t OP_VideoModeDef =
&OP_VideoOptionsDef,
OP_VideoModeMenu,
M_DrawVideoMode,
NULL,
48, 26,
0,
NULL,
@@ -2512,6 +2538,7 @@ menu_t OP_ColorOptionsDef =
&OP_VideoOptionsDef,
OP_ColorOptionsMenu,
M_DrawColorMenu,
NULL,
30, 30,
0,
NULL,
@@ -2525,6 +2552,7 @@ menu_t OP_SoundOptionsDef =
&OP_MainDef,
OP_SoundOptionsMenu,
M_DrawSkyRoom,
NULL,
30, 20,
0,
NULL,
@@ -2539,6 +2567,7 @@ menu_t OP_HUDOptionsDef =
&OP_MainDef,
OP_HUDOptionsMenu,
M_DrawHUDOptions,
NULL,
30, 20,
0,
NULL,
@@ -2568,6 +2597,7 @@ menu_t OP_MonitorToggleDef =
&OP_GameOptionsDef,
OP_MonitorToggleMenu,
M_DrawMonitorToggles,
NULL,
47, 30,
0,
NULL,
@@ -2615,6 +2645,7 @@ menu_t OP_ForkedBirdDef = {
&OP_MainDef,
OP_ForkedBirdMenu,
M_DrawLocalSkinMenu,
NULL,
30, 6,
0,
NULL,
@@ -2623,191 +2654,7 @@ menu_t OP_ForkedBirdDef = {
menu_t OP_LocalSkinDef = DEFAULTMENUSTYLE(NULL, OP_TiltMenu, &OP_ForkedBirdDef, 30, 60, NULL);
// ==========================================================================
// CVAR ONCHANGE EVENTS GO HERE
// ==========================================================================
// (there's only a couple anyway)
// Nextmap. Used for Time Attack.
static void Nextmap_OnChange(void)
{
char *leveltitle;
UINT8 active;
// Update the string in the consvar.
Z_Free(cv_nextmap.zstring);
leveltitle = G_BuildMapTitle(cv_nextmap.value);
cv_nextmap.string = cv_nextmap.zstring = leveltitle ? leveltitle : Z_StrDup(G_BuildMapName(cv_nextmap.value));
if (currentMenu == &SP_TimeAttackDef)
{
// see also p_setup.c's P_LoadRecordGhosts
const size_t glen = strlen(srb2home)+1+strlen("replay")+1+strlen(timeattackfolder)+1+strlen("MAPXX")+1;
char *gpath = malloc(glen);
INT32 i;
if (!gpath)
return;
sprintf(gpath,"%s"PATHSEP"replay"PATHSEP"%s"PATHSEP"%s", srb2home, timeattackfolder, G_BuildMapName(cv_nextmap.value));
CV_StealthSetValue(&cv_dummystaff, 0);
active = false;
SP_TimeAttackMenu[taguest].status = IT_DISABLED;
SP_TimeAttackMenu[tareplay].status = IT_DISABLED;
// Check if file exists, if not, disable REPLAY option
for (i = 0; i < 4; i++)
{
SP_ReplayMenu[i].status = IT_DISABLED;
SP_GuestReplayMenu[i].status = IT_DISABLED;
}
SP_ReplayMenu[4].status = IT_DISABLED;
SP_GhostMenu[3].status = IT_DISABLED;
SP_GhostMenu[4].status = IT_DISABLED;
if (FIL_FileExists(va("%s-%s-time-best.lmp", gpath, cv_chooseskin.string))) {
SP_ReplayMenu[0].status = IT_WHITESTRING|IT_CALL;
SP_GuestReplayMenu[0].status = IT_WHITESTRING|IT_CALL;
active |= 3;
}
if (FIL_FileExists(va("%s-%s-lap-best.lmp", gpath, cv_chooseskin.string))) {
SP_ReplayMenu[1].status = IT_WHITESTRING|IT_CALL;
SP_GuestReplayMenu[1].status = IT_WHITESTRING|IT_CALL;
active |= 3;
}
if (FIL_FileExists(va("%s-%s-last.lmp", gpath, cv_chooseskin.string))) {
SP_ReplayMenu[2].status = IT_WHITESTRING|IT_CALL;
SP_GuestReplayMenu[2].status = IT_WHITESTRING|IT_CALL;
active |= 3;
}
if (FIL_FileExists(va("%s-guest.lmp", gpath)))
{
SP_ReplayMenu[3].status = IT_WHITESTRING|IT_CALL;
SP_GuestReplayMenu[3].status = IT_WHITESTRING|IT_CALL;
SP_GhostMenu[3].status = IT_STRING|IT_CVAR;
active |= 3;
}
CV_SetValue(&cv_dummystaff, 1);
if (cv_dummystaff.value)
{
SP_ReplayMenu[4].status = IT_WHITESTRING|IT_KEYHANDLER;
SP_GhostMenu[4].status = IT_STRING|IT_CVAR;
CV_StealthSetValue(&cv_dummystaff, 1);
active |= 1;
}
if (active) {
if (active & 1)
SP_TimeAttackMenu[tareplay].status = IT_WHITESTRING|IT_SUBMENU;
if (active & 2)
SP_TimeAttackMenu[taguest].status = IT_WHITESTRING|IT_SUBMENU;
}
else if (itemOn == tareplay) // Reset lastOn so replay isn't still selected when not available.
{
currentMenu->lastOn = itemOn;
itemOn = tastart;
}
if (mapheaderinfo[cv_nextmap.value-1] && mapheaderinfo[cv_nextmap.value-1]->forcecharacter[0] != '\0')
CV_Set(&cv_chooseskin, mapheaderinfo[cv_nextmap.value-1]->forcecharacter);
free(gpath);
}
}
static void Dummymenuplayer_OnChange(void)
{
if (cv_dummymenuplayer.value < 1)
CV_StealthSetValue(&cv_dummymenuplayer, splitscreen+1);
else if (cv_dummymenuplayer.value > splitscreen+1)
CV_StealthSetValue(&cv_dummymenuplayer, 1);
}
char dummystaffname[22];
static void Dummystaff_OnChange(void)
{
lumpnum_t l;
dummystaffname[0] = '\0';
if ((l = W_CheckNumForName(va("%sS01",G_BuildMapName(cv_nextmap.value)))) == LUMPERROR)
{
CV_StealthSetValue(&cv_dummystaff, 0);
return;
}
else
{
char *temp = dummystaffname;
UINT8 numstaff = 1;
while (numstaff < 99 && (l = W_CheckNumForName(va("%sS%02u",G_BuildMapName(cv_nextmap.value),numstaff+1))) != LUMPERROR)
numstaff++;
if (cv_dummystaff.value < 1)
CV_StealthSetValue(&cv_dummystaff, numstaff);
else if (cv_dummystaff.value > numstaff)
CV_StealthSetValue(&cv_dummystaff, 1);
if ((l = W_CheckNumForName(va("%sS%02u",G_BuildMapName(cv_nextmap.value), cv_dummystaff.value))) == LUMPERROR)
return; // shouldn't happen but might as well check...
G_UpdateStaffGhostName(l);
while (*temp)
temp++;
sprintf(temp, " - %d", cv_dummystaff.value);
}
}
// Newgametype. Used for gametype changes.
static void Newgametype_OnChange(void)
{
if (cv_nextmap.value && menuactive)
{
if (!mapheaderinfo[cv_nextmap.value-1])
P_AllocMapHeader((INT16)(cv_nextmap.value-1));
if ((cv_newgametype.value == GT_RACE && !(mapheaderinfo[cv_nextmap.value-1]->typeoflevel & TOL_RACE)) || // SRB2kart
((cv_newgametype.value == GT_MATCH || cv_newgametype.value == GT_TEAMMATCH) && !(mapheaderinfo[cv_nextmap.value-1]->typeoflevel & TOL_MATCH)))
{
INT32 value = 0;
switch (cv_newgametype.value)
{
case GT_COOP:
value = TOL_RACE; // SRB2kart
break;
case GT_COMPETITION:
value = TOL_COMPETITION;
break;
case GT_RACE:
value = TOL_RACE;
break;
case GT_MATCH:
case GT_TEAMMATCH:
value = TOL_MATCH;
break;
case GT_TAG:
case GT_HIDEANDSEEK:
value = TOL_TAG;
break;
case GT_CTF:
value = TOL_CTF;
break;
}
CV_SetValue(&cv_nextmap, M_FindFirstMap(value));
}
}
}
// Onchange functions to show/hide/move things in menus
void Screenshot_option_Onchange(void)
{
OP_ScreenshotOptionsMenu[op_screenshot_folder].status =
@@ -2884,7 +2731,7 @@ void Bird_menu_Onchange(void)
OP_AdvancedBirdMenu[respawnfadein].status = status;
}
//menu code is nice
// menu code is nice
void SaturnHud_menu_Onchange(void)
{
UINT16 status;
+7 -6
View File
@@ -1693,22 +1693,23 @@ char *M_GetToken(const char *inputString)
}
const char * M_Ftrim (double f)
const char * M_Ftrim(double f)
{
static char dig[9];/* "0." + 6 digits (6 is printf's default) */
int i;
/* I know I said it's the default, but just in case... */
sprintf(dig, "%.6f", fabs(modf(f, &f)));
/* trim trailing zeroes */
for (i = strlen(dig)-1; dig[i] == '0'; --i)
;
if (dig[i] == '.')/* :NOTHING: */
return "";
else
{
dig[i + 1] = '\0';
return &dig[1];/* skip the 0 */
}
dig[i + 1] = '\0';
return &dig[1];/* skip the 0 */
}
/** Count bits in a number.
+79 -56
View File
@@ -411,21 +411,13 @@ boolean M_TextInputHandle(textinput_t *input, INT32 key)
return M_TextInputHandleBase(input, key, false);
}
boolean M_TextInputHandleEmotes(textinput_t *input, INT32 key, emote_t *suggestions[], int maxsuggestions)
static int M_TextInputEmoteStart(textinput_t *input)
{
boolean ret = M_TextInputHandleBase(input, key, true);
if (input->cursor == 0)
return -1;
// After this handled key we ended up inside an emote, lets fix that
if (M_TextInputCheckEmote(input))
M_TextInputToWordEnd(input, !shiftdown);
int emotestart = -1;
// Always clear the first entry
suggestions[0] = NULL;
// For autocomplete
int emotestart = 0;
// Try find suggestions for emote names
for (int i = input->cursor-1; i >= 0 && input->cursor-i <= MAXEMOTENAME; --i)
{
// Space can't be part of emote name
@@ -436,62 +428,93 @@ boolean M_TextInputHandleEmotes(textinput_t *input, INT32 key, emote_t *suggesti
if (input->buffer[i] == ':')
{
emotestart = i+1;
// ...But only if we typed at least something
if ((int)input->cursor-(i-1) < 3)
break;
for (int skip = 0; skip < maxsuggestions; ++skip)
{
suggestions[skip] = M_FindEmote(input->buffer+i+1, input->cursor-i-1, skip);
// No more suggestions
if (!suggestions[skip])
break;
}
// In any case, we found what we wanted, can exit the loop now
break;
}
}
// If we suggest emotes, try autocomplete
if (key == '\t' && suggestions[0])
return emotestart;
}
static boolean M_TextInputCompleteEmote(textinput_t *input, emote_autocomplete_t *autocomplete)
{
if (input->cursor == 0)
return false;
// If we're in "autocomplete" state, delete ':' for latest autocompleted emote
if (autocomplete->complete[0])
{
int pos = (input->cursor-emotestart);
boolean autocomplete = true;
while (autocomplete)
if (input->buffer[input->cursor-1] == ':')
{
// Check if current character matches for all suggestions
char c = suggestions[0]->name[pos];
// End of string reached
if (!c)
break;
for (int i = 1; i < maxsuggestions && suggestions[i]; ++i)
{
if (suggestions[i]->name[pos] != c)
{
autocomplete = false;
break;
}
}
++pos;
if (autocomplete)
M_TextInputAddChar(input, c);
M_TextInputDelChar(input);
}
// This was the only suggestion, finish autocomplete with a ':' and clear suggestions
if (maxsuggestions == 1 || !suggestions[1])
autocomplete->skip++;
}
else
{
// Try to find emote to autocomplete
int emotestart = autocomplete->emotestart;
// No emote - no autocomplete
if (emotestart == -1 || input->cursor - emotestart < 2)
return false;
strlcpy(autocomplete->complete, &input->buffer[emotestart], input->cursor-emotestart+1);
}
emote_t *completed = M_FindEmote(autocomplete->complete, strlen(autocomplete->complete), autocomplete->skip);
// We hit end of list of suggested emotes
if (completed == NULL)
{
autocomplete->skip = 0;
completed = M_FindEmote(autocomplete->complete, strlen(autocomplete->complete), autocomplete->skip);
// NULL again, list was empty to begin with
if (completed == NULL)
{
M_TextInputAddChar(input, ':');
suggestions[0] = NULL;
// Clear autocompletion state
autocomplete->complete[0] = 0;
return false;
}
}
// Erase previously typed emote. Not really efficent but too lazy to count chars and do M_TextInputDel()
while (input->buffer[input->cursor-1] != ':')
{
M_TextInputDelChar(input);
}
M_TextInputAddString(input, completed->name);
M_TextInputAddChar(input, ':');
return true;
}
boolean M_TextInputHandleEmotes(textinput_t *input, INT32 key, emote_autocomplete_t *autocomplete)
{
boolean ret = M_TextInputHandleBase(input, key, true);
// After this handled key we ended up inside an emote, lets fix that
if (M_TextInputCheckEmote(input))
M_TextInputToWordEnd(input, !shiftdown);
// Always update it
autocomplete->emotestart = M_TextInputEmoteStart(input);
if (key == '\t' || (autocomplete->complete[0] == 0 && key == KEY_ENTER))
{
if (M_TextInputCompleteEmote(input, autocomplete) && key == KEY_ENTER) // Don't send message if we've autocompleted an emote
ret = true;
}
else
{
// Reset state just in case
autocomplete->complete[0] = 0;
autocomplete->skip = 0;
}
return ret;
}
+7 -1
View File
@@ -26,6 +26,12 @@ typedef struct textinput_s {
unsigned skull;
} textinput_t;
typedef struct emote_autocomplete_s {
char complete[MAXEMOTENAME+1];
int skip;
int emotestart;
} emote_autocomplete_t;
void M_TextInputInit(textinput_t *input, char *buffer, size_t buffer_size);
void M_TextInputClear(textinput_t *input);
@@ -36,7 +42,7 @@ boolean M_TextInputHandle(textinput_t *input, INT32 key);
// Does everything same as M_TextInputHandle, but also handles emotes in input string
// If currently typing something that looks like an existing emote, return suggestions for it
boolean M_TextInputHandleEmotes(textinput_t *input, INT32 key, emote_t *suggestions[], int maxsuggestions);
boolean M_TextInputHandleEmotes(textinput_t *input, INT32 key, emote_autocomplete_t *autocomplete);
#define M_DrawTextInput(x, y, input, flags) M_DrawTextInputScroll((x), (y), (input), (flags), ((input)->buffer_size-1)*8)
void M_DrawTextInputScroll(INT32 x, INT32 y, textinput_t *input, INT32 flags, INT32 MAXINPUTWIDTH);
-21
View File
@@ -33,7 +33,6 @@
void T_MoveCeiling(ceiling_t *ceiling)
{
result_e res;
boolean dontupdate = false;
if (ceiling->delaytimer)
{
@@ -69,9 +68,7 @@ void T_MoveCeiling(ceiling_t *ceiling)
case instantMoveCeilingByFrontSector:
ceiling->sector->ceilingpic = ceiling->texture;
ceiling->sector->ceilingdata = NULL;
ceiling->sector->ceilspeed = 0;
P_RemoveThinker(&ceiling->thinker);
dontupdate = true;
break;
case moveCeilingByFrontSector:
if (ceiling->texture < -1) // chained linedef executing
@@ -83,9 +80,7 @@ void T_MoveCeiling(ceiling_t *ceiling)
// case raiseCeilingByLine:
case moveCeilingByFrontTexture:
ceiling->sector->ceilingdata = NULL;
ceiling->sector->ceilspeed = 0;
P_RemoveThinker(&ceiling->thinker);
dontupdate = true;
break;
case fastCrushAndRaise:
@@ -189,9 +184,7 @@ void T_MoveCeiling(ceiling_t *ceiling)
case instantMoveCeilingByFrontSector:
ceiling->sector->ceilingpic = ceiling->texture;
ceiling->sector->ceilingdata = NULL;
ceiling->sector->ceilspeed = 0;
P_RemoveThinker(&ceiling->thinker);
dontupdate = true;
break;
case moveCeilingByFrontSector:
@@ -209,9 +202,7 @@ void T_MoveCeiling(ceiling_t *ceiling)
// case lowerCeilingByLine:
case moveCeilingByFrontTexture:
ceiling->sector->ceilingdata = NULL;
ceiling->sector->ceilspeed = 0;
P_RemoveThinker(&ceiling->thinker);
dontupdate = true;
break;
case bounceCeiling:
{
@@ -290,10 +281,6 @@ void T_MoveCeiling(ceiling_t *ceiling)
}
break;
}
if (!dontupdate)
ceiling->sector->ceilspeed = ceiling->speed*ceiling->direction;
else
ceiling->sector->ceilspeed = 0;
}
/** Moves a ceiling crusher.
@@ -335,12 +322,9 @@ void T_CrushCeiling(ceiling_t *ceiling)
switch(ceiling->type)
{
case crushCeilOnce:
ceiling->sector->ceilspeed = 0;
ceiling->sector->ceilingdata = NULL;
break;
case crushBothOnce:
ceiling->sector->floorspeed = 0;
ceiling->sector->ceilspeed = 0;
ceiling->sector->ceilingdata = NULL;
break;
default:
@@ -377,11 +361,6 @@ void T_CrushCeiling(ceiling_t *ceiling)
}
break;
}
if (ceiling->type == crushBothOnce)
ceiling->sector->floorspeed = ceiling->speed*(-ceiling->direction);
ceiling->sector->ceilspeed = ceiling->speed*ceiling->direction;
}
/** Starts a ceiling mover.
+19 -8
View File
@@ -8176,13 +8176,16 @@ void A_SPBChase(void *thing)
// Smoothly rotate horz angle
angle_t input = hang - actor->angle;
boolean invert = (input > ANGLE_180);
fixed_t fixedinput;
if (invert)
input = InvAngle(input);
fixedinput = AngleFixed(input);
// Slow down when turning; it looks better and makes U-turns not unfair
xyspeed = FixedMul(actor->cvmem, max(0, (((180<<FRACBITS) - AngleFixed(input)) / 90) - FRACUNIT));
xyspeed = (((180<<FRACBITS) - fixedinput) / 90) - FRACUNIT;
xyspeed = FixedMul(actor->cvmem, max(0, xyspeed));
input = FixedAngle(AngleFixed(input)/4);
input = FixedAngle(fixedinput/4);
if (invert)
input = InvAngle(input);
@@ -8193,11 +8196,13 @@ void A_SPBChase(void *thing)
invert = (input > ANGLE_180);
if (invert)
input = InvAngle(input);
fixedinput = AngleFixed(input);
// Slow down when turning; might as well do it for momz, since we do it above too
zspeed = FixedMul(actor->cvmem, max(0, (((180<<FRACBITS) - AngleFixed(input)) / 90) - FRACUNIT));
zspeed = (((180<<FRACBITS) - fixedinput) / 90) - FRACUNIT;
zspeed = FixedMul(actor->cvmem, max(0, zspeed));
input = FixedAngle(AngleFixed(input)/4);
input = FixedAngle(fixedinput/4);
if (invert)
input = InvAngle(input);
@@ -8301,13 +8306,17 @@ void A_SPBChase(void *thing)
// Smoothly rotate horz angle
angle_t input = hang - actor->angle;
boolean invert = (input > ANGLE_180);
fixed_t fixedinput;
if (invert)
input = InvAngle(input);
fixedinput = AngleFixed(input);
// Slow down when turning; it looks better and makes U-turns not unfair
xyspeed = FixedMul(wspeed, max(0, (((180<<FRACBITS) - AngleFixed(input)) / 90) - FRACUNIT));
xyspeed = (((180<<FRACBITS) - fixedinput) / 90) - FRACUNIT;
xyspeed = FixedMul(wspeed, max(0, xyspeed));
input = FixedAngle(AngleFixed(input)/4);
input = FixedAngle(fixedinput/4);
if (invert)
input = InvAngle(input);
@@ -8318,11 +8327,13 @@ void A_SPBChase(void *thing)
invert = (input > ANGLE_180);
if (invert)
input = InvAngle(input);
fixedinput = AngleFixed(input);
// Slow down when turning; might as well do it for momz, since we do it above too
zspeed = FixedMul(wspeed, max(0, (((180<<FRACBITS) - AngleFixed(input)) / 90) - FRACUNIT));
zspeed = max(0, (((180<<FRACBITS) - fixedinput) / 90) - FRACUNIT);
zspeed = FixedMul(wspeed, zspeed);
input = FixedAngle(AngleFixed(input)/4);
input = FixedAngle(fixedinput/4);
if (invert)
input = InvAngle(input);
+2 -90
View File
@@ -279,7 +279,6 @@ result_e T_MovePlane(sector_t *sector, fixed_t speed, fixed_t dest, boolean crus
void T_MoveFloor(floormove_t *movefloor)
{
result_e res = 0;
boolean dontupdate = false;
if (movefloor->delaytimer)
{
@@ -325,7 +324,6 @@ void T_MoveFloor(floormove_t *movefloor)
else
movefloor->floordestheight = lines[movefloor->texture].frontsector->floorheight;
movefloor->direction = (movefloor->floordestheight < movefloor->sector->floorheight) ? -1 : 1;
movefloor->sector->floorspeed = movefloor->speed * movefloor->direction;
movefloor->delaytimer = movefloor->delay;
movefloor->sector->moved = true;
return; // not break, why did this work? Graue 04-03-2004
@@ -341,7 +339,6 @@ void T_MoveFloor(floormove_t *movefloor)
movefloor->speed = movefloor->origspeed = FixedDiv(abs(lines[movefloor->texture].dx),4*FRACUNIT); // forward again, use dx
}
movefloor->direction = (movefloor->floordestheight < movefloor->sector->floorheight) ? -1 : 1;
movefloor->sector->floorspeed = movefloor->speed * movefloor->direction;
movefloor->delaytimer = movefloor->delay;
movefloor->sector->moved = true;
return; // not break, why did this work? Graue 04-03-2004
@@ -374,7 +371,6 @@ void T_MoveFloor(floormove_t *movefloor)
else
movefloor->floordestheight = lines[movefloor->texture].frontsector->floorheight;
movefloor->direction = (movefloor->floordestheight < movefloor->sector->floorheight) ? -1 : 1;
movefloor->sector->floorspeed = movefloor->speed * movefloor->direction;
movefloor->delaytimer = movefloor->delay;
movefloor->sector->moved = true;
return; // not break, why did this work? Graue 04-03-2004
@@ -390,14 +386,12 @@ void T_MoveFloor(floormove_t *movefloor)
movefloor->speed = movefloor->origspeed = FixedDiv(abs(lines[movefloor->texture].dx),4*FRACUNIT); // forward again, use dx
}
movefloor->direction = (movefloor->floordestheight < movefloor->sector->floorheight) ? -1 : 1;
movefloor->sector->floorspeed = movefloor->speed * movefloor->direction;
movefloor->delaytimer = movefloor->delay;
movefloor->sector->moved = true;
return; // not break, why did this work? Graue 04-03-2004
case crushFloorOnce:
movefloor->sector->floordata = NULL; // Clear up the thinker so others can use it
P_RemoveThinker(&movefloor->thinker);
movefloor->sector->floorspeed = 0;
movefloor->sector->moved = true;
return;
default:
@@ -406,14 +400,8 @@ void T_MoveFloor(floormove_t *movefloor)
}
movefloor->sector->floordata = NULL; // Clear up the thinker so others can use it
movefloor->sector->floorspeed = 0;
P_RemoveThinker(&movefloor->thinker);
dontupdate = true;
}
if (!dontupdate)
movefloor->sector->floorspeed = movefloor->speed*movefloor->direction;
else
movefloor->sector->floorspeed = 0;
movefloor->sector->moved = true;
}
@@ -623,22 +611,13 @@ void T_MoveElevator(elevator_t *elevator)
{
elevator->sector->floordata = NULL; //jff 2/22/98
elevator->sector->ceilingdata = NULL; //jff 2/22/98
elevator->sector->ceilspeed = 0;
elevator->sector->floorspeed = 0;
P_RemoveThinker(&elevator->thinker); // remove elevator from actives
dontupdate = true;
}
}
if (!dontupdate)
if (dontupdate)
{
elevator->sector->floorspeed = elevator->speed*elevator->direction;
elevator->sector->ceilspeed = 42;
}
else
{
elevator->sector->floorspeed = 0;
elevator->sector->ceilspeed = 0;
elevator->sector->floordata = NULL;
elevator->sector->ceilingdata = NULL;
}
@@ -695,8 +674,6 @@ void T_ContinuousFalling(levelspecthink_t *faller)
}
}
faller->sector->floorspeed = faller->speed*faller->direction;
faller->sector->ceilspeed = 42;
faller->sector->moved = true;
#undef speed
#undef direction
@@ -767,9 +744,7 @@ void T_BounceCheese(levelspecthink_t *bouncer)
{
bouncer->sector->crumblestate = 1;
bouncer->sector->ceilingdata = NULL;
bouncer->sector->ceilspeed = 0;
bouncer->sector->floordata = NULL;
bouncer->sector->floorspeed = 0;
P_RemoveThinker(&bouncer->thinker); // remove bouncer from actives
return;
}
@@ -795,8 +770,6 @@ void T_BounceCheese(levelspecthink_t *bouncer)
T_MovePlane(bouncer->sector, 0, bouncer->sector->floorheight, 0, 0, -1); // update things on floor
bouncer->sector->ceilingdata = NULL;
bouncer->sector->floordata = NULL;
bouncer->sector->floorspeed = 0;
bouncer->sector->ceilspeed = 0;
bouncer->sector->moved = true;
P_RemoveThinker(&bouncer->thinker); // remove bouncer from actives
return;
@@ -810,8 +783,6 @@ void T_BounceCheese(levelspecthink_t *bouncer)
T_MovePlane(bouncer->sector, 0, bouncer->sector->floorheight, 0, 0, -1); // update things on floor
bouncer->sector->ceilingdata = NULL;
bouncer->sector->floordata = NULL;
bouncer->sector->floorspeed = 0;
bouncer->sector->ceilspeed = 0;
bouncer->sector->moved = true;
P_RemoveThinker(&bouncer->thinker); // remove bouncer from actives
return;
@@ -827,9 +798,6 @@ void T_BounceCheese(levelspecthink_t *bouncer)
T_MovePlane(bouncer->sector, bouncer->speed/2, bouncer->sector->floorheight - 70*FRACUNIT,
0, 0, -1); // move floor
bouncer->sector->floorspeed = -bouncer->speed/2;
bouncer->sector->ceilspeed = 42;
if (bouncer->sector->ceilingheight < bouncer->ceilingwasheight && bouncer->low == 0) // Down
{
if (abs(bouncer->speed) < 6*FRACUNIT)
@@ -878,9 +846,7 @@ void T_BounceCheese(levelspecthink_t *bouncer)
T_MovePlane(bouncer->sector, 0, bouncer->sector->ceilingheight, 0, 1, -1); // update things on ceiling
T_MovePlane(bouncer->sector, 0, bouncer->sector->floorheight, 0, 0, -1); // update things on floor
bouncer->sector->ceilingdata = NULL;
bouncer->sector->floordata = NULL;
bouncer->sector->floorspeed = 0;
bouncer->sector->ceilspeed = 0;
bouncer->sector->floordata = NULL;;
bouncer->sector->moved = true;
P_RemoveThinker(&bouncer->thinker); // remove bouncer from actives
}
@@ -920,8 +886,6 @@ void T_StartCrumble(elevator_t *elevator)
|| (elevator->floordestheight == 0 && elevator->direction == 1))
&& elevator->type == elevateContinuous) // No return crumbler
{
elevator->sector->ceilspeed = 0;
elevator->sector->floorspeed = 0;
return;
}
@@ -934,9 +898,6 @@ void T_StartCrumble(elevator_t *elevator)
elevator->distance = -15*TICRATE; // Timer until platform returns to original position.
else
{
// Timer isn't up yet, so just keep waiting.
elevator->sector->ceilspeed = 0;
elevator->sector->floorspeed = 0;
return;
}
}
@@ -965,8 +926,6 @@ void T_StartCrumble(elevator_t *elevator)
else
elevator->direction = 1;
elevator->sector->ceilspeed = 0;
elevator->sector->floorspeed = 0;
return;
}
@@ -1050,9 +1009,6 @@ void T_StartCrumble(elevator_t *elevator)
0, // move ceiling
elevator->direction
);
elevator->sector->ceilspeed = 42;
elevator->sector->floorspeed = elevator->speed*elevator->direction;
}
}
}
@@ -1063,8 +1019,6 @@ void T_StartCrumble(elevator_t *elevator)
elevator->sector->floorheight = elevator->floorwasheight;
elevator->sector->floordata = NULL;
elevator->sector->ceilingdata = NULL;
elevator->sector->ceilspeed = 0;
elevator->sector->floorspeed = 0;
elevator->sector->moved = true;
P_RemoveThinker(&elevator->thinker);
}
@@ -1121,8 +1075,6 @@ void T_MarioBlock(levelspecthink_t *block)
P_RemoveThinker(&block->thinker);
block->sector->floordata = NULL;
block->sector->ceilingdata = NULL;
block->sector->floorspeed = 0;
block->sector->ceilspeed = 0;
}
for (i = -1; (i = P_FindSectorFromTag((INT16)block->vars[0], i)) >= 0 ;)
@@ -1365,8 +1317,6 @@ wegotit:
{
bridge->sector->floorheight = LOWCEILINGHEIGHT - (bridge->sector->ceilingheight - bridge->sector->floorheight);
bridge->sector->ceilingheight = LOWCEILINGHEIGHT;
bridge->sector->ceilspeed = 0;
bridge->sector->floorspeed = 0;
goto dorest;
}
@@ -1422,9 +1372,6 @@ wegotit:
DIRECTION // direction
);
bridge->sector->ceilspeed = 42;
bridge->sector->floorspeed = CURSPEED*DIRECTION;
dorest:
// Adjust joined sector heights
{
@@ -1463,8 +1410,6 @@ wegotit:
{
bridge->sector->floorheight = ORIGCEILINGHEIGHT - (bridge->sector->ceilingheight - bridge->sector->floorheight);
bridge->sector->ceilingheight = ORIGCEILINGHEIGHT;
bridge->sector->ceilspeed = 0;
bridge->sector->floorspeed = 0;
continue;
}
@@ -1519,9 +1464,6 @@ wegotit:
0, // floor or ceiling (0 for floor)
DIRECTION // direction
);
bridge->sector->ceilspeed = 42;
bridge->sector->floorspeed = CURSPEED*DIRECTION;
}
}
}
@@ -1558,8 +1500,6 @@ wegotit:
{
bridge->sector->floorheight = ORIGCEILINGHEIGHT - (bridge->sector->ceilingheight - bridge->sector->floorheight);
bridge->sector->ceilingheight = ORIGCEILINGHEIGHT;
bridge->sector->ceilspeed = 0;
bridge->sector->floorspeed = 0;
continue;
}
@@ -1614,9 +1554,6 @@ wegotit:
0, // floor or ceiling (0 for floor)
DIRECTION // direction
);
bridge->sector->ceilspeed = 42;
bridge->sector->floorspeed = CURSPEED*DIRECTION;
}
}
}
@@ -1642,8 +1579,6 @@ wegotit:
{
bridge->sector->floorheight = ORIGCEILINGHEIGHT - (bridge->sector->ceilingheight - bridge->sector->floorheight);
bridge->sector->ceilingheight = ORIGCEILINGHEIGHT;
bridge->sector->ceilspeed = 0;
bridge->sector->floorspeed = 0;
continue;
}
@@ -1698,9 +1633,6 @@ wegotit:
0, // floor or ceiling (0 for floor)
DIRECTION // direction
);
bridge->sector->ceilspeed = 42;
bridge->sector->floorspeed = CURSPEED*DIRECTION;
}
}
// Update precip
@@ -1875,9 +1807,6 @@ void T_ThwompSector(levelspecthink_t *thwomp)
if (res == pastdest)
thwomp->direction = 0; // stop moving
thwomp->sector->ceilspeed = 42;
thwomp->sector->floorspeed = thwomp->speed*thwomp->direction;
}
else if (thwomp->direction < 0) // Crashing down!
{
@@ -1932,16 +1861,10 @@ void T_ThwompSector(levelspecthink_t *thwomp)
thwomp->direction = 1; // start heading back up
thwomp->distance = TICRATE; // but only after a small delay
}
thwomp->sector->ceilspeed = 42;
thwomp->sector->floorspeed = thwomp->speed*thwomp->direction;
}
else // Not going anywhere, so look for players.
{
thwomp->direction = -1;
thwomp->sector->ceilspeed = 0;
thwomp->sector->floorspeed = 0;
}
actionsector->moved = true;
@@ -2355,8 +2278,6 @@ void T_RaiseSector(levelspecthink_t *raise)
{
raise->sector->floorheight = raise->vars[7] - (raise->sector->ceilingheight - raise->sector->floorheight);
raise->sector->ceilingheight = raise->vars[7];
raise->sector->ceilspeed = 0;
raise->sector->floorspeed = 0;
return;
}
@@ -2370,8 +2291,6 @@ void T_RaiseSector(levelspecthink_t *raise)
{
raise->sector->floorheight = raise->vars[5] - (raise->sector->ceilingheight - raise->sector->floorheight);
raise->sector->ceilingheight = raise->vars[5];
raise->sector->ceilspeed = 0;
raise->sector->floorspeed = 0;
return;
}
@@ -2390,8 +2309,6 @@ void T_RaiseSector(levelspecthink_t *raise)
{
raise->sector->floorheight = raise->vars[5] - (raise->sector->ceilingheight - raise->sector->floorheight);
raise->sector->ceilingheight = raise->vars[5];
raise->sector->ceilspeed = 0;
raise->sector->floorspeed = 0;
return;
}
raise->vars[8] = 1;
@@ -2404,8 +2321,6 @@ void T_RaiseSector(levelspecthink_t *raise)
{
raise->sector->floorheight = raise->vars[7] - (raise->sector->ceilingheight - raise->sector->floorheight);
raise->sector->ceilingheight = raise->vars[7];
raise->sector->ceilspeed = 0;
raise->sector->floorspeed = 0;
return;
}
raise->vars[8] = -1;
@@ -2460,9 +2375,6 @@ void T_RaiseSector(levelspecthink_t *raise)
raise->vars[8] // direction
);
raise->sector->ceilspeed = 42;
raise->sector->floorspeed = raise->vars[3]*raise->vars[8];
for (i = -1; (i = P_FindSectorFromTag(raise->sourceline->tag, i)) >= 0 ;)
sectors[i].moved = true;
}
+3 -8
View File
@@ -869,14 +869,7 @@ void P_TouchSpecialThing(mobj_t *special, mobj_t *toucher, boolean heightcheck)
toucher->angle = special->angle;
for (i = 0; i <= splitscreen; i++)
{
if (player == P_GetLocalPlayerForNum(i))
{
localangle[i] = toucher->angle;
break;
}
}
P_ForceLocalAngle(player, toucher->angle);
P_ResetPlayer(player);
@@ -2171,7 +2164,9 @@ static void P_KillPlayer(player_t *player, mobj_t *source)
P_SetScale(karmahitbox, player->mo->scale);
CONS_Printf(M_GetText("%s lost all of their bumpers!\n"), player_names[player-players]);
}
player->kartstuff[k_bumper]--;
if (K_IsPlayerWanted(player))
K_CalculateBattleWanted();
}
+7 -1
View File
@@ -192,6 +192,7 @@ void P_DoPlayerPain(player_t *player, mobj_t *source, mobj_t *inflictor);
void P_ResetPlayer(player_t *player);
player_t *P_GetLocalPlayerForNum(UINT8 pnum);
INT32 P_GetLocalPlayerNumForNum(UINT8 pnum);
INT32 P_GetLocalPlayerNumForPlayer(const player_t *player);
boolean P_IsLocalPlayer(const player_t *player);
boolean P_IsLocalPlayerNum(UINT8 pnum);
boolean P_IsDisplayPlayer(const player_t *player);
@@ -226,7 +227,9 @@ void P_PlayerThink(player_t *player);
void P_PlayerAfterThink(player_t *player);
void P_DoPlayerExit(player_t *player);
void P_DoTimeOver(player_t *player);
//void P_NightserizePlayer(player_t *player, INT32 ptime);
angle_t P_GetLocalAngle(player_t *player);
void P_ForceLocalAngle(player_t *player, angle_t angle);
void P_InstaThrust(mobj_t *mo, angle_t angle, fixed_t move);
fixed_t P_ReturnThrustX(mobj_t *mo, angle_t angle, fixed_t move);
@@ -269,6 +272,9 @@ extern consvar_t cv_gravity;
void P_RespawnSpecials(void);
extern mobjtype_t g_doomednum_to_mobjtype[UINT16_MAX];
void CalculateDoomednumToMobjtype(void);
mobj_t *P_AllocateMobj(void);
mobj_t *P_SpawnMobj(fixed_t x, fixed_t y, fixed_t z, mobjtype_t type);
+1 -8
View File
@@ -223,14 +223,7 @@ boolean P_DoSpring(mobj_t *spring, mobj_t *object)
if (!demo.playback || P_AnalogMove(object->player))
{
for (UINT8 j = 0; j <= splitscreen; ++j)
{
if (object->player == P_GetLocalPlayerForNum(j))
{
localangle[j] = spring->angle;
break;
}
}
P_ForceLocalAngle(object->player, spring->angle);
}
}
+3 -3
View File
@@ -230,8 +230,8 @@ PUREFUNC fixed_t P_InterceptVector(divline_t *v2, divline_t *v1)
// Sets opentop and openbottom to the window through a two sided line.
// OPTIMIZE: keep this precalculated
//
fixed_t opentop, openbottom, openrange, lowfloor, highceiling;
pslope_t *opentopslope, *openbottomslope;
fixed_t opentop = 0, openbottom = 0, openrange = 0, lowfloor = 0, highceiling = 0;
pslope_t *opentopslope = NULL, *openbottomslope = NULL;
// P_CameraLineOpening
// P_LineOpening, but for camera
@@ -985,7 +985,7 @@ boolean P_BlockThingsIterator(INT32 x, INT32 y, boolean (*func)(mobj_t *))
static intercept_t *intercepts = NULL;
static intercept_t *intercept_p = NULL;
divline_t trace;
divline_t trace = {};
static boolean earlyout;
//SoM: 4/6/2000: Remove limit on intercepts.
+1109 -1102
View File
File diff suppressed because it is too large. Load diff
+3 -6
View File
@@ -1383,13 +1383,10 @@ static void Polyobj_rotateThings(polyobj_t *po, vector2_t origin, angle_t delta,
{
mo->angle += delta;
for (UINT8 i = 0; i <= splitscreen; i++)
if (mo->player)
{
if (mo->player == P_GetLocalPlayerForNum(i))
{
localangle[i] += delta;
break;
}
angle_t localangle = P_GetLocalAngle(mo->player);
P_ForceLocalAngle(mo->player, localangle + delta);
}
}
}
+7 -32
View File
@@ -339,7 +339,7 @@ static void P_NetUnArchivePlayers(savebuffer_t *save, boolean reloading)
for (j = 0; j < NUMKARTSTUFF; j++)
player->kartstuff[j] = READINT32(save->p);
player->frameangle = READANGLE(save->p);
player->frameangle = player->old_frameangle = READANGLE(save->p);
player->playerstate = READUINT8(save->p);
player->pflags = READUINT32(save->p);
@@ -1965,21 +1965,6 @@ FUNCINLINE static ATTRINLINE player_t *LoadPlayer(UINT32 player)
// Loads a mobj_t from a save game
//
static mobjtype_t g_doomednum_to_mobjtype[UINT16_MAX];
static void CalculateDoomednumToMobjtype(void)
{
memset(g_doomednum_to_mobjtype, MT_NULL, sizeof(g_doomednum_to_mobjtype));
for (size_t i = MT_NULL+1; i < NUMMOBJTYPES; i++)
{
if (mobjinfo[i].doomednum > 0 && mobjinfo[i].doomednum <= UINT16_MAX)
{
g_doomednum_to_mobjtype[ mobjinfo[i].doomednum ] = i;
}
}
}
static void LoadMobjThinker(savebuffer_t *save, actionf_p1 thinker)
{
mobj_t *mobj;
@@ -2052,15 +2037,15 @@ static void LoadMobjThinker(savebuffer_t *save, actionf_p1 thinker)
if (diff & MD_POS)
{
mobj->x = READFIXED(save->p);
mobj->y = READFIXED(save->p);
mobj->angle = READANGLE(save->p);
mobj->x = mobj->old_x = READFIXED(save->p);
mobj->y = mobj->old_y = READFIXED(save->p);
mobj->angle = mobj->old_angle = READANGLE(save->p);
}
else
{
mobj->x = mobj->spawnpoint->x << FRACBITS;
mobj->y = mobj->spawnpoint->y << FRACBITS;
mobj->angle = FixedAngle(mobj->spawnpoint->angle*FRACUNIT);
mobj->x = mobj->old_x = mobj->spawnpoint->x << FRACBITS;
mobj->y = mobj->old_y = mobj->spawnpoint->y << FRACBITS;
mobj->angle = mobj->old_angle = FixedAngle(mobj->spawnpoint->angle*FRACUNIT);
}
if (diff & MD_MOM)
@@ -2122,12 +2107,6 @@ static void LoadMobjThinker(savebuffer_t *save, actionf_p1 thinker)
i = READUINT8(save->p);
mobj->player = &players[i];
mobj->player->mo = mobj;
// added for angle prediction
if (i == P_GetLocalPlayerNumForNum(i))
{
localangle[i] = mobj->angle;
}
}
if (diff & MD_MOVEDIR)
mobj->movedir = READANGLE(save->p);
@@ -2885,10 +2864,6 @@ static void P_NetUnArchiveThinkers(savebuffer_t *save)
if (READUINT32(save->p) != ARCHIVEBLOCK_THINKERS)
I_Error("Bad $$$.sav at archive block Thinkers");
// Pre-calculate this lookup, because it was wasting
// a shit ton of time loading mobj thinkers.
CalculateDoomednumToMobjtype();
// remove all the current thinkers
for (currentthinker = thinkercap.next; currentthinker != &thinkercap; currentthinker = next)
{
+24 -18
View File
@@ -15,6 +15,7 @@
#include "d_main.h"
#include "byteptr.h"
#include "g_game.h"
#include "g_input.h"
#include "p_local.h"
#include "p_setup.h"
@@ -596,8 +597,8 @@ FUNCINLINE static ATTRINLINE void P_LoadSubsectors(void *data)
//
#define MAXLEVELFLATS 256
size_t numlevelflats;
levelflat_t *levelflats;
size_t numlevelflats = 0;
levelflat_t *levelflats = NULL;
//SoM: Other files want this info.
size_t P_PrecacheLevelFlats(void)
@@ -811,6 +812,8 @@ static void P_LoadSectors(UINT8 *data)
ss->tag = SHORT(ms->tag);
ss->flags |= SF_FLIPSPECIAL_FLOOR;
ss->soundorg.thinker.function = (actionf_p1)P_MobjThinker;
}
// set the sky flat num
@@ -1021,7 +1024,7 @@ void P_WriteThings(lumpnum_t lumpnum)
size_t i, length;
mapthing_t *mt;
UINT8 *data;
savebuffer_t save;
savebuffer_t save = {0};
INT16 temp;
data = W_CacheLumpNum(lumpnum, PU_LEVEL);
@@ -2029,8 +2032,8 @@ void P_SetupLevelSky(INT32 skynum, boolean global)
R_SetupSkyDraw();
}
static const char *maplumpname;
lumpnum_t lastloadedmaplumpnum; // for comparative savegame
static const char *maplumpname = NULL;
lumpnum_t lastloadedmaplumpnum = LUMPERROR; // for comparative savegame
//
// P_LevelInitStuff
@@ -2414,7 +2417,7 @@ static void P_InitCamera(void)
displayplayers[0] = consoleplayer; // Start with your OWN view, please!
}
struct minimapinfo minimapinfo;
struct minimapinfo minimapinfo = {};
static void P_InitMinimapInfo(void)
{
lumpnum_t lumpnum;
@@ -2708,8 +2711,12 @@ void P_FreeLevelState(void)
G_FreeGhosts(); // ghosts are allocated with PU_LEVEL
Patch_FreeTag(PU_PATCH_LOWPRIORITY);
//Patch_FreeTag(PU_PATCH_ROTATED); // we keep those ty!
if (rendermode != render_none)
{
Patch_FreeTag(PU_PATCH_LOWPRIORITY);
//Patch_FreeTag(PU_PATCH_ROTATED); // we keep those ty!
}
Z_FreeTags(PU_LEVEL, PU_PURGELEVEL - 1);
Y_VoteClear();
@@ -2718,6 +2725,9 @@ void P_FreeLevelState(void)
// clear the splats from previous level
R_ClearLevelSplats();
#endif
R_InitMobjInterpolators();
R_InitializeLevelInterpolators();
}
/** Loads a level from a lump or external wad.
@@ -2735,13 +2745,8 @@ boolean P_SetupLevel(boolean fromnetsave, boolean reloadinggamestate)
lumpnum_t encoreLump = LUMPERROR;
UINT8 levelfadecol;
// HACK: this doesent reset if you change the map from within a replay and may cause crashes or the replayhut to be non functional
if (!demo.playback && demo.inreplayhut)
{
M_ResetDemoList();
}
midgamejoin = fromnetsave; // makes dynslopes run in P_Ticker/P_PreTicker to avoid synch issues and other stuff
midgamejoin = fromnetsave; // makes dynslopes run in P_Ticker to avoid synch issues and other stuff
levelloading = true;
@@ -2827,10 +2832,7 @@ boolean P_SetupLevel(boolean fromnetsave, boolean reloadinggamestate)
P_FreeLevelState();
R_InitializeLevelInterpolators();
P_InitThinkers();
R_InitMobjInterpolators();
P_InitCachedActions();
// internal game map
@@ -2861,6 +2863,10 @@ boolean P_SetupLevel(boolean fromnetsave, boolean reloadinggamestate)
P_ResetDynamicSlopes();
// Pre-calculate this lookup, because it was wasting
// a shit ton of time loading mobj thinkers.
CalculateDoomednumToMobjtype();
P_SpawnMapThings();
P_SpawnEmblems(!fromnetsave);
@@ -2979,7 +2985,7 @@ boolean P_SetupLevel(boolean fromnetsave, boolean reloadinggamestate)
G_AddMapToBuffer(gamemap-1);
D_ResetDeviceLED();
G_ResetDeviceLED();
return true;
}
+13 -13
View File
@@ -338,19 +338,12 @@ void P_SpawnSlope_Line(int linenum)
vector3_t origin, point;
vector2_t direction;
fixed_t nx, ny, dz, extent;
boolean frontfloor = (special == 700 || special == 702 || special == 703);
boolean backfloor = (special == 710 || special == 712 || special == 713);
boolean frontceil = (special == 701 || special == 702 || special == 713);
boolean backceil = (special == 711 || special == 712 || special == 703);
UINT8 flags = 0; // Slope flags
if (line->flags & ML_NOSONIC)
flags |= SL_NOPHYSICS;
if (!(line->flags & ML_NOTAILS))
flags |= SL_NODYNAMIC;
if (line->flags & ML_NOKNUX)
flags |= SL_ANCHORVERTEX;
const boolean frontfloor = (special == 700 || special == 702 || special == 703);
const boolean backfloor = (special == 710 || special == 712 || special == 713);
const boolean frontceil = (special == 701 || special == 702 || special == 713);
const boolean backceil = (special == 711 || special == 712 || special == 703);
if (!frontfloor && !backfloor && !frontceil && !backceil)
{
@@ -364,6 +357,13 @@ void P_SpawnSlope_Line(int linenum)
return;
}
if (line->flags & ML_NOSONIC)
flags |= SL_NOPHYSICS;
if (!(line->flags & ML_NOTAILS))
flags |= SL_NODYNAMIC;
if (line->flags & ML_NOKNUX)
flags |= SL_ANCHORVERTEX;
fixed_t len = R_PointToDist2(0, 0, line->dx, line->dy);
nx = FixedDiv(line->dy, len);
ny = -FixedDiv(line->dx, len);
@@ -809,7 +809,7 @@ void P_ResetDynamicSlopes(void)
if (lines[i].flags & ML_NOKNUX)
*slopetoset = P_NewVertexSlope(lines[i].tag, sides[lines[i].sidenum[which]].textureoffset >> FRACBITS,
sides[lines[i].sidenum[which]].rowoffset >> FRACBITS, flags);
sides[lines[i].sidenum[which]].rowoffset >> FRACBITS, flags);
else
*slopetoset = P_NewVertexSlope(lines[i].tag, lines[i].tag, lines[i].tag, flags);
+24 -29
View File
@@ -1978,13 +1978,11 @@ static void P_ProcessLineSpecial(line_t *line, mobj_t *mo, sector_t *callsec)
{
P_RemoveThinker(&((elevator_t *)sectors[secnum].floordata)->thinker);
sectors[secnum].floordata = sectors[secnum].ceilingdata = NULL;
sectors[secnum].floorspeed = sectors[secnum].ceilspeed = 0;
}
else // floormove
{
P_RemoveThinker(&((floormove_t *)sectors[secnum].floordata)->thinker);
sectors[secnum].floordata = NULL;
sectors[secnum].floorspeed = 0;
}
}
@@ -1992,7 +1990,6 @@ static void P_ProcessLineSpecial(line_t *line, mobj_t *mo, sector_t *callsec)
{
P_RemoveThinker(&((ceiling_t *)sectors[secnum].ceilingdata)->thinker);
sectors[secnum].ceilingdata = NULL;
sectors[secnum].ceilspeed = 0;
}
}
break;
@@ -2087,13 +2084,17 @@ static void P_ProcessLineSpecial(line_t *line, mobj_t *mo, sector_t *callsec)
// Seek offset from current song position
if (line->flags & ML_EFFECT1)
{
const UINT32 muslength = S_GetMusicLength();
const UINT32 muspos = S_GetMusicPosition();
const UINT32 muslooppoint = S_GetMusicLoopPoint();
// adjust for loop point if subtracting
if (position < 0 && S_GetMusicLength() &&
S_GetMusicPosition() > S_GetMusicLoopPoint() &&
S_GetMusicPosition() + position < S_GetMusicLoopPoint())
position = max(S_GetMusicLength() - (S_GetMusicLoopPoint() - (S_GetMusicPosition() + position)), 0);
if (position < 0 && muslength &&
muspos > muslooppoint &&
muspos + position < muslooppoint)
position = max(muslength - (muslooppoint - (muspos + position)), 0);
else
position = max(S_GetMusicPosition() + position, 0);
position = max(muspos + position, 0);
}
// Fade current music to target volume (if music won't be changed)
@@ -2160,11 +2161,13 @@ static void P_ProcessLineSpecial(line_t *line, mobj_t *mo, sector_t *callsec)
if (sfxnum == sfx_None)
return; // Do nothing!
if (sfxnum < sfx_None || sfxnum >= NUMSFX)
{
CONS_Debug(DBG_GAMELOGIC, "Line type 414 Executor: sfx number %d is invalid!\n", sfxnum);
return;
}
if (line->tag != 0) // Do special stuff only if a non-zero linedef tag is set
{
if (line->flags & ML_EFFECT5) // Repeat Midtexture
@@ -3553,14 +3556,7 @@ DoneSection2:
if (!demo.playback || P_AnalogMove(player))
{
for (UINT8 j = 0; j <= splitscreen; ++j)
{
if (player == P_GetLocalPlayerForNum(j))
{
localangle[j] = player->mo->angle;
break;
}
}
P_ForceLocalAngle(player, player->mo->angle);
}
if (!(lines[i].flags & ML_EFFECT4))
@@ -3990,7 +3986,12 @@ DoneSection2:
player->tossdelay = 3;
}
#if 0
// Event - Final Lap
// Still works for GME, but disabled for consistency
if (G_RaceGametype() && player->laps >= (UINT8)(cv_numlaps.value - 1))
S_SpeedMusic(1.2f);
#endif
if (player->laps >= (unsigned)cv_numlaps.value)
{
if (P_IsLocalPlayer(player))
@@ -7511,22 +7512,16 @@ void T_Pusher(pusher_t *p)
thing->player->pflags |= PF_JUMPED;
thing->player->pflags |= PF_SLIDING;
thing->angle = R_PointToAngle2 (0, 0, xspeed<<(FRACBITS-PUSH_FACTOR), yspeed<<(FRACBITS-PUSH_FACTOR));
thing->angle = R_PointToAngle2(0, 0, xspeed<<(FRACBITS-PUSH_FACTOR), yspeed<<(FRACBITS-PUSH_FACTOR));
if (!demo.playback || P_AnalogMove(thing->player))
{
for (UINT8 i = 0; i <= splitscreen; ++i)
{
if (thing->player == P_GetLocalPlayerForNum(i))
{
if (thing->angle - localangle[i] > ANGLE_180)
localangle[i] -= (localangle[i] - thing->angle) / 8;
else
localangle[i] += (thing->angle - localangle[i]) / 8;
angle_t angle = P_GetLocalAngle(thing->player);
break;
}
}
if (thing->angle - angle > ANGLE_180)
P_ForceLocalAngle(thing->player, angle - (angle - thing->angle) / 8);
else
P_ForceLocalAngle(thing->player, angle + (thing->angle - angle) / 8);
}
}
+4 -10
View File
@@ -65,14 +65,7 @@ void P_MixUp(mobj_t *thing, fixed_t x, fixed_t y, fixed_t z, angle_t angle,
thing->reactiontime = TICRATE/2; // don't move for about half a second
// absolute angle position
for (i = 0; i <= splitscreen; i++)
{
if (thing == P_GetLocalPlayerForNum(i)->mo)
{
localangle[i] = angle;
break;
}
}
P_ForceLocalAngle(thing->player, angle);
// move chasecam at new player location
for (i = 0; i <= splitscreen; i++)
@@ -106,6 +99,7 @@ void P_MixUp(mobj_t *thing, fixed_t x, fixed_t y, fixed_t z, angle_t angle,
P_FlashPal(thing->player, PAL_MIXUP, 10);
}
thing->old_angle += (angle-thing->angle);
thing->angle = angle;
thing->momx = thing->momy = thing->momz = 0;
@@ -150,18 +144,18 @@ boolean P_Teleport(mobj_t *thing, fixed_t x, fixed_t y, fixed_t z, angle_t angle
thing->reactiontime = TICRATE/2; // don't move for about half a second
// absolute angle position
P_ForceLocalAngle(thing->player, angle);
// move chasecam at new player location
for (i = 0; i <= splitscreen; i++)
{
if (thing->player != &players[displayplayers[i]])
continue;
localangle[i] = angle;
if (camera[i].chase)
P_ResetCamera(thing->player, &camera[i]);
R_ResetViewInterpolation(i + 1);
break;
}
// don't run in place after a teleport
+1 -112
View File
@@ -457,113 +457,6 @@ static inline void P_RunThinkers(void)
}
}
// Controller rumble!
// this keeps track of a bunch of things
// and makes your controller rumble accordingly
static void P_DeviceRumbleTick(void)
{
UINT8 i;
if (dedicated || numcontrollers == 0 || gamestate != GS_LEVEL)
{
return;
}
for (i = 0; i <= splitscreen; i++)
{
if (!cv_usejoystick[i].value || !cv_rumble[i].value)
{
continue;
}
if (camera[i].freecam)
{
continue;
}
UINT16 low = 0, high = 0;
UINT16 lenght = 57; // in ms
const player_t *player = P_GetLocalPlayerForNum(i);
// allow lua to do some crap for spectators
if (player->spectator || !player->mo)
{
continue;
}
// reset the rumble if you exit or are ded lel
if (player->exiting ||
player->playerstate == PST_DEAD ||
player->kartstuff[k_respawn] > 1)
{
G_PlayerDeviceRumble(i, low, high, 0);
continue;
}
if (player->kartstuff[k_spinouttimer])
{
//low = high = FRACUNIT / 6;
low = high = FixedMul((FRACUNIT / 4), (FixedDiv(player->kartstuff[k_spinouttimer], (3*TICRATE / 2)))); // try do some some kinda fadeout
}
else if (player->kartstuff[k_sneakertimer] > (sneakertime-(TICRATE/2)))
{
low = high = FRACUNIT / 8;
}
else if ((player->kartstuff[k_offroad])
&& player->speed != 0
&& P_IsObjectOnGround(player->mo))
{
// weaken this depending on if you got hyu or invinc
if (player->kartstuff[k_hyudorotimer])
{
high = FRACUNIT / 128;
}
else if (player->kartstuff[k_invincibilitytimer])
{
high = FRACUNIT / 64;
}
else
{
low = high = FRACUNIT / 64;
}
}
else if ((player->kartstuff[k_bananadrag] > TICRATE)
&& player->speed != 0
&& P_IsObjectOnGround(player->mo))
{
if (leveltime & 1) // this is actually funny lel
high = FRACUNIT / 64;
}
if (player->kartstuff[k_brakedrift])
{
high = CLAMP((high + FRACUNIT / 256), 0, UINT16_MAX);
}
// pulse when gettin new driftlevel
// let this come last
if (player->kartstuff[k_driftcharge]
&& player->driftlevel)
{
high = CLAMP((high + FRACUNIT / 256), 0, UINT16_MAX);
if (player->driftlevel == 2)
lenght = 114;
else if (player->driftlevel == 3)
lenght = 174;
}
// hack alert! i just dont want this thing constantly resetting the rumble lol
if (low == 0 && high == 0)
{
continue;
}
G_PlayerDeviceRumble(i, low, high, lenght);
}
}
void P_RunChaseCameras(void)
{
UINT8 i;
@@ -763,7 +656,7 @@ void P_Ticker(boolean run)
// Apply rumble to local players
if (!demo.playback)
{
P_DeviceRumbleTick();
G_DeviceRumbleTick();
}
PS_START_TIMING(ps_lua_thinkframe_time);
@@ -943,10 +836,6 @@ void P_PreTicker(INT32 frames)
}
}
// Dynamic slopeness
if (midgamejoin)
P_RunDynamicSlopes();
P_RunThinkers();
// Run any "after all the other thinkers" stuff
+69 -40
View File
@@ -47,6 +47,7 @@
// SRB2kart
#include "m_cond.h" // M_UpdateUnlockablesAndExtraEmblems
#include "k_kart.h"
#include "k_hud.h"
#include "console.h" // CON_LogMessage
#include "m_menu.h"
@@ -213,12 +214,11 @@ UINT8 P_GetNextEmerald(void)
if (!(emeralds & EMERALD6)) return 5;
return 6;
}
else // Depends on stage
{
if (gamemap < sstage_start || gamemap > sstage_end)
return 0;
return (UINT8)(gamemap - sstage_start);
}
// Depends on stage
if (gamemap < sstage_start || gamemap > sstage_end)
return 0;
return (UINT8)(gamemap - sstage_start);
}
//
@@ -434,8 +434,8 @@ void P_GivePlayerRings(player_t *player, INT32 num_rings)
if (!player->mo)
return;
player->mo->health += num_rings;
player->health += num_rings;
//player->mo->health += num_rings;
//player->health += num_rings;
player->totalring += num_rings;
//{ SRB2kart - rings don't really do anything, but we don't want the player spilling them later.
@@ -581,7 +581,8 @@ static boolean isPlayerLosing(player_t *player)
if (players[i].marescore > player->marescore)
++pos;
maxpos = max(getPlayerPos(&players[i]), maxpos);
const UINT8 playerpos = getPlayerPos(&players[i]);
maxpos = max(playerpos, maxpos);
}
if (maxpos == 1)
@@ -995,6 +996,19 @@ INT32 P_GetLocalPlayerNumForNum(UINT8 pnum)
return (pnum == 0 ? consoleplayer : displayplayers[pnum]);
}
INT32 P_GetLocalPlayerNumForPlayer(const player_t *player)
{
for (UINT8 i = 0; i <= splitscreen; i++)
{
if (player == P_GetLocalPlayerForNum(i))
{
return i;
}
}
return -1;
}
//
// P_IsLocalPlayer
//
@@ -1161,6 +1175,9 @@ mobj_t *P_SpawnGhostMobj(mobj_t *mobj)
ghost = P_SpawnMobj(mobj->x, mobj->y, mobj->z, MT_GHOST);
// not sure if this is safe to do...........
//P_SetTarget(&ghost->target, mobj);
P_SetScale(ghost, mobj->scale);
ghost->scalespeed = mobj->scalespeed;
ghost->destscale = mobj->scale;
@@ -1174,10 +1191,7 @@ mobj_t *P_SpawnGhostMobj(mobj_t *mobj)
ghost->color = mobj->color;
ghost->colorized = mobj->colorized; // Kart: they should also be colorized if their origin is
if (mobj->player)
ghost->angle = mobj->player->frameangle;
else
ghost->angle = mobj->angle;
ghost->angle = (mobj->player ? mobj->player->frameangle : mobj->angle);
ghost->sprite = mobj->sprite;
ghost->frame = mobj->frame;
@@ -1190,11 +1204,17 @@ mobj_t *P_SpawnGhostMobj(mobj_t *mobj)
ghost->localskin = mobj->localskin;
ghost->skinlocal = mobj->skinlocal;
// same deal...
//ghost->standingslope = mobj->standingslope;
ghost->spritexscale = mobj->spritexscale;
ghost->spriteyscale = mobj->spriteyscale;
ghost->spritexoffset = mobj->spritexoffset;
ghost->spriteyoffset = mobj->spriteyoffset;
if (mobj->player && K_PlayerEffectsShouldBlend(mobj->player))
ghost->blendmode = AST_ADD;
ghost->pitch = mobj->pitch;
ghost->roll = mobj->roll;
ghost->sloperoll = mobj->sloperoll;
@@ -1859,7 +1879,6 @@ boolean P_AnalogMove(player_t *player)
return player->pflags & PF_ANALOGMODE;
}
//#define OLD_MOVEMENT_CODE 1
static void P_3dMovement(player_t *player)
{
@@ -2597,15 +2616,7 @@ static void P_DoZoomTube(player_t *player)
if (player->mo->tracer)
{
player->mo->angle = R_PointToAngle2(player->mo->x, player->mo->y, player->mo->tracer->x, player->mo->tracer->y);
for (UINT8 i = 0; i <= splitscreen; i++)
{
if (player == P_GetLocalPlayerForNum(i))
{
localangle[i] = player->mo->angle;
break;
}
}
P_ForceLocalAngle(player, player->mo->angle);
}
}
@@ -2791,14 +2802,7 @@ void P_HomingAttack(mobj_t *source, mobj_t *enemy) // Home in on your target
if (source->player)
{
for (UINT8 i = 0; i <= splitscreen; i++)
{
if (source->player == P_GetLocalPlayerForNum(i))
{
localangle[i] = source->angle;
break;
}
}
P_ForceLocalAngle(source->player, source->angle);
}
// change slope
@@ -2927,7 +2931,7 @@ notrealplayer:
// P_MoveCamera: make sure the camera is not outside the world and looks at the player avatar
//
camera_t camera[MAXSPLITSCREENPLAYERS]; // Four cameras, three for splitscreen
camera_t camera[MAXSPLITSCREENPLAYERS] = {}; // Four cameras, three for splitscreen
static void CV_CamRotate_OnChange(void)
{
@@ -5194,14 +5198,8 @@ void P_PlayerAfterThink(player_t *player)
player->mo->tracer->target->health += cmd->sidemove;
player->mo->angle += cmd->sidemove << ANGLETOFINESHIFT; // 2048 --> ANGLE_MAX
for (i = 0; i <= splitscreen; i++)
{
if (player == P_GetLocalPlayerForNum(i))
{
localangle[i] = player->mo->angle; // Adjust the local control angle.
break;
}
}
// Adjust the local control angle.
P_ForceLocalAngle(player, player->mo->angle);
}
}
@@ -5240,3 +5238,34 @@ void P_PlayerAfterThink(player_t *player)
K_KartPlayerAfterThink(player);
}
angle_t P_GetLocalAngle(player_t *player)
{
// this function is from vanilla srb2. can you tell?
// (hint: they have separate variables for all of this shit instead of arrays)
UINT8 i;
for (i = 0; i <= splitscreen; i++)
{
if (player == &players[displayplayers[i]])
return localangle[i];
}
return 0;
}
void P_ForceLocalAngle(player_t *player, angle_t angle)
{
UINT8 i;
angle = angle & ~UINT16_MAX;
for (i = 0; i <= splitscreen; i++)
{
if (player == &players[displayplayers[i]])
{
localangle[i] = angle;
}
}
}
+19 -11
View File
@@ -322,9 +322,6 @@ static void R_AddLine(seg_t *line)
g_portal = NULL;
if (line->polyseg && !(line->polyseg->flags & POF_RENDERSIDES))
return;
// big room fix
angle1 = R_PointToAngle64(line->v1->x, line->v1->y);
angle2 = R_PointToAngle64(line->v2->x, line->v2->y);
@@ -500,7 +497,7 @@ clipsolid:
// 0 | 0 | 1 | 2
// 1 | 4 | 5 | 6
// 2 | 8 | 9 | A
INT32 checkcoord[12][4] =
const INT32 checkcoord[12][4] =
{
{3, 0, 2, 1},
{3, 0, 2, 0},
@@ -722,6 +719,8 @@ static void R_AddPolyObjects(subsector_t *sub)
po = (polyobj_t *)(po->link.next);
}
g_portal = NULL;
// for render stats
ps_numpolyobjects.value.i += numpolys;
@@ -732,8 +731,16 @@ static void R_AddPolyObjects(subsector_t *sub)
for (i = 0; i < numpolys; ++i)
{
qs22j(po_ptrs[i]->segs, po_ptrs[i]->segCount, sizeof(seg_t *), R_PolysegCompare);
for (j = 0; j < po_ptrs[i]->segCount; ++j)
R_AddLine(po_ptrs[i]->segs[j]);
{
seg_t *seg = po_ptrs[i]->segs[j];
if (!(seg->polyseg->flags & POF_RENDERSIDES))
continue;
R_AddLine(seg);
}
}
}
@@ -805,7 +812,7 @@ static void R_Subsector(size_t num)
if (anyMoved == true)
{
frontsector->numlights = sub->sector->numlights = 0;
R_Prep3DFloors(frontsector);
R_Prep3DFloors(frontsector, ceilingcenterz);
sub->sector->lightlist = frontsector->lightlist;
sub->sector->numlights = frontsector->numlights;
sub->sector->moved = frontsector->moved = false;
@@ -1055,7 +1062,7 @@ static void R_Subsector(size_t num)
//
// This function creates the lightlists that the given sector uses to light
// floors/ceilings/walls according to the 3D floors.
void R_Prep3DFloors(sector_t *sector)
void R_Prep3DFloors(sector_t *sector, fixed_t secceilz)
{
ffloor_t *rover;
ffloor_t *best;
@@ -1081,13 +1088,13 @@ void R_Prep3DFloors(sector_t *sector)
if (count != sector->numlights)
{
Z_Free(sector->lightlist);
sector->lightlist = static_cast<lightlist_t*>(Z_Calloc(sizeof (*sector->lightlist) * count, PU_LEVEL, NULL));
sector->lightlist = static_cast<lightlist_t*>(Z_Malloc(sizeof(*sector->lightlist) * count, PU_LEVEL, NULL));
sector->numlights = count;
}
else
memset(sector->lightlist, 0, sizeof (lightlist_t) * count);
heighttest = P_GetSectorCeilingZAt(sector, sector->soundorg.x, sector->soundorg.y);
memset(sector->lightlist, 0, sizeof(lightlist_t) * count);
heighttest = secceilz; // sector ceiling z
sector->lightlist[0].height = heighttest + 1;
sector->lightlist[0].slope = sector->c_slope;
@@ -1117,6 +1124,7 @@ void R_Prep3DFloors(sector_t *sector)
bestslope = *rover->t_slope;
continue;
}
if (rover->flags & FF_DOUBLESHADOW)
{
heighttest = P_GetFFloorBottomZAt(rover, sector->soundorg.x, sector->soundorg.y);
+2 -2
View File
@@ -34,7 +34,7 @@ extern portal_t *g_portal; // is curline a portal seg?
// drawsegs are allocated on the fly... see r_segs.c
extern INT32 checkcoord[12][4];
extern const INT32 checkcoord[12][4];
extern drawseg_t *curdrawsegs;
extern drawseg_t *drawsegs;
@@ -65,7 +65,7 @@ sector_t *R_FakeFlat(sector_t *sec, sector_t *tempsec, INT32 *floorlightlevel,
boolean R_IsEmptyLine(seg_t *line, const sector_t *front, const sector_t *back);
INT32 R_GetPlaneLight(sector_t *sector, fixed_t planeheight, boolean underside);
void R_Prep3DFloors(sector_t *sector);
void R_Prep3DFloors(sector_t *sector, fixed_t secceilz);
#ifdef __cplusplus
} // extern "C"
+14 -113
View File
@@ -307,10 +307,10 @@ static boolean R_CheckTextureLumpLength(texture_t *texture, size_t patch)
CONS_Alert(
CONS_ERROR,
"%.8s: texture lump data is too small. Expected %s bytes, got %s. (%s)\n",
texture->name,
sizeu1(offsetof(softwarepatch_t, columnofs)),
sizeu2(lumplength),
wadfiles[wadnum]->lumpinfo[lumpnum].fullname
texture->name,
sizeu1(offsetof(softwarepatch_t, columnofs)),
sizeu2(lumplength),
wadfiles[wadnum]->lumpinfo[lumpnum].fullname
);
return false;
@@ -717,38 +717,25 @@ static INT32 R_CountTextures(UINT16 wadnum)
return count;
}
static void
recallocuser
( void * user,
size_t old,
size_t new)
{
char *p = Z_Realloc(*(void**)user,
new, PU_STATIC, user);
if (new > old)
memset(&p[old], 0, (new - old));
}
static void R_AllocateTextures(INT32 add)
{
const INT32 newtextures = (numtextures + add);
const size_t newsize = newtextures * sizeof (void*);
const size_t oldsize = numtextures * sizeof (void*);
//const size_t oldsize = numtextures * sizeof (void*);
INT32 i;
// Allocate memory and initialize to 0 for all the textures we are initialising.
recallocuser(&textures, oldsize, newsize);
Z_Realloc(textures, newsize, PU_STATIC, &textures);
// Allocate texture column offset table.
recallocuser(&texturecolumnofs, oldsize, newsize);
Z_Realloc(texturecolumnofs, newsize, PU_STATIC, &texturecolumnofs);
// Allocate texture referencing cache.
recallocuser(&texturecache, oldsize, newsize);
Z_Realloc(texturecache, newsize, PU_STATIC, &texturecache);
// Allocate texture width table.
recallocuser(&texturewidth, oldsize, newsize);
Z_Realloc(texturewidth, newsize, PU_STATIC, &texturewidth);
// Allocate texture height table.
recallocuser(&textureheight, oldsize, newsize);
Z_Realloc(textureheight, newsize, PU_STATIC, &textureheight);
// Create translation table for global animation.
Z_Realloc(texturetranslation, (newtextures + 1) * sizeof(*texturetranslation), PU_STATIC, &texturetranslation);
@@ -853,6 +840,7 @@ static texpatch_t *R_ParsePatch(boolean actuallyLoadPatch)
{
Z_Free(patchName);
}
patchName = (char *)Z_Malloc((texturesTokenLength+1)*sizeof(char),PU_STATIC,NULL);
memcpy(patchName,texturesToken,texturesTokenLength*sizeof(char));
patchName[texturesTokenLength] = '\0';
@@ -1249,60 +1237,6 @@ void R_ParseTEXTURESLump(UINT16 wadNum, UINT16 lumpNum, INT32 *texindex)
Z_Free((void *)texturesText);
}
/*
static inline lumpnum_t R_CheckNumForNameList(const char *name, lumplist_t *list, size_t listsize) // SRB2kart - unused.
{
size_t i;
UINT16 lump;
for (i = listsize - 1; i < INT16_MAX; i--)
{
lump = W_CheckNumForNamePwad(name, list[i].wadfile, list[i].firstlump);
if (lump == INT16_MAX || lump > (list[i].firstlump + list[i].numlumps))
continue;
else
return (list[i].wadfile<<16)+lump;
}
return LUMPERROR;
}
*/
/*static lumplist_t *colormaplumps = NULL; ///\todo free leak
static size_t numcolormaplumps = 0;
static void R_InitExtraColormaps(void)
{
lumpnum_t startnum, endnum;
UINT16 cfile, clump;
static size_t maxcolormaplumps = 16;
for (cfile = clump = 0; cfile < numwadfiles; cfile++, clump = 0)
{
startnum = W_CheckNumForNamePwad("C_START", cfile, clump);
if (startnum == INT16_MAX)
continue;
endnum = W_CheckNumForNamePwad("C_END", cfile, clump);
if (endnum == INT16_MAX)
I_Error("R_InitExtraColormaps: C_START without C_END\n");
// This shouldn't be possible when you use the Pwad function, silly
//if (WADFILENUM(startnum) != WADFILENUM(endnum))
//I_Error("R_InitExtraColormaps: C_START and C_END in different wad files!\n");
if (numcolormaplumps >= maxcolormaplumps)
maxcolormaplumps *= 2;
colormaplumps = Z_Realloc(colormaplumps,
sizeof (*colormaplumps) * maxcolormaplumps, PU_STATIC, NULL);
colormaplumps[numcolormaplumps].wadfile = cfile;
colormaplumps[numcolormaplumps].firstlump = startnum+1;
colormaplumps[numcolormaplumps].numlumps = endnum - (startnum + 1);
numcolormaplumps++;
}
CONS_Printf(M_GetText("Number of Extra Colormaps: %s\n"), sizeu1(numcolormaplumps));
}*/
// Search for flat name.
lumpnum_t R_GetFlatNumForName(const char *name)
{
@@ -1430,7 +1364,7 @@ void R_ReInitColormaps(UINT16 num, lumpnum_t newencoremap)
encoremap = Z_Malloc(256 + 10, PU_LEVEL, NULL);
W_ReadLump(newencoremap, encoremap);
colormap_p = colormap_p2 = colormaps;
colormap_p += (256 * 32);
colormap_p += COLORMAP_REMAPOFFSET;
for (p = 0; p < 32; p++)
{
@@ -1439,6 +1373,7 @@ void R_ReInitColormaps(UINT16 num, lumpnum_t newencoremap)
*colormap_p = colormap_p2[encoremap[i]];
colormap_p++;
}
colormap_p2 += 256;
}
}
@@ -1465,43 +1400,9 @@ void R_ClearColormaps(void)
for (i = 0; i < MAXCOLORMAPS; i++)
foundcolormaps[i] = LUMPERROR;
memset(extra_colormaps, 0, sizeof (extra_colormaps));
memset(extra_colormaps, 0, sizeof(extra_colormaps));
}
/*INT32 R_ColormapNumForName(char *name)
{
lumpnum_t lump, i;
if (num_extra_colormaps == MAXCOLORMAPS)
I_Error("R_ColormapNumForName: Too many colormaps! the limit is %d\n", MAXCOLORMAPS);
lump = R_CheckNumForNameList(name, colormaplumps, numcolormaplumps);
if (lump == LUMPERROR)
I_Error("R_ColormapNumForName: Cannot find colormap lump %.8s\n", name);
for (i = 0; i < num_extra_colormaps; i++)
if (lump == foundcolormaps[i])
return i;
foundcolormaps[num_extra_colormaps] = lump;
// aligned on 8 bit for asm code
extra_colormaps[num_extra_colormaps].colormap = Z_Malloc(W_LumpLength(lump), PU_LEVEL, NULL);
W_ReadLump(lump, extra_colormaps[num_extra_colormaps].colormap);
// We set all params of the colormap to normal because there
// is no real way to tell how GL should handle a colormap lump anyway..
extra_colormaps[num_extra_colormaps].maskcolor = 0xffff;
extra_colormaps[num_extra_colormaps].fadecolor = 0x0;
extra_colormaps[num_extra_colormaps].maskamt = 0x0;
extra_colormaps[num_extra_colormaps].fadestart = 0;
extra_colormaps[num_extra_colormaps].fadeend = 31;
extra_colormaps[num_extra_colormaps].fog = 0;
num_extra_colormaps++;
return (INT32)num_extra_colormaps - 1;
}*/
//
// R_CreateColormap
//
+2 -7
View File
@@ -397,9 +397,6 @@ typedef struct sector_s
// Sprite culling feature
struct line_s *cullheight;
// Current speed of ceiling/floor. For Knuckles to hold onto stuff.
fixed_t floorspeed, ceilspeed;
// Eternity engine slope
boolean hasslope; // The sector, or one of its visible FOFs, contains a slope
} sector_t;
@@ -549,12 +546,10 @@ typedef struct seg_s
sector_t *backsector;
fixed_t length; // precalculated seg length
#ifdef HWRENDER
floatvertex_t fv1;
floatvertex_t fv2;
floatvertex_t fv1; // v1 in floats - precalculated
floatvertex_t fv2; // v2 in floats - precalculated
#endif
polyobj_t *polyseg;
// Fake contrast calculated on level load
+29 -17
View File
@@ -355,13 +355,14 @@ UINT8 *R_GetBlendTable(int style, INT32 alphalevel)
// Return a normal translucency table
if (--alphalevel >= 0)
return transtables + (ClipTransLevel(alphalevel) << FF_TRANSSHIFT);
else
return NULL;
return NULL;
}
boolean R_BlendLevelVisible(INT32 blendmode, INT32 alphalevel)
{
if (blendmode <= AST_COPY || blendmode == AST_SUBTRACT || blendmode == AST_MODULATE || blendmode >= AST_OVERLAY)
if (blendmode <= AST_COPY || blendmode == AST_SUBTRACT ||
blendmode == AST_MODULATE || blendmode >= AST_OVERLAY)
return true;
return (alphalevel < BlendTab_Count[BlendTab_FromStyle[blendmode]]);
@@ -412,7 +413,8 @@ static UINT8* RGetTranslationColormap(INT32 skinnum, skincolors_t color, UINT8 f
// Get colormap
ret = tt[skintableindex][color];
}
else ret = NULL;
else
ret = NULL;
// Generate the colormap if necessary
if (!ret)
@@ -435,36 +437,46 @@ UINT8* R_GetTranslationColormap(INT32 skinnum, skincolors_t color, UINT8 flags)
UINT8* R_GetLocalTranslationColormap(skin_t *skin, skin_t *localskin, skincolors_t color, UINT8 flags, boolean local)
{
if (localskin)
return RGetTranslationColormap(localskin - K_GetSkinArray(local), color, flags, local);
else
return RGetTranslationColormap((skin - skins), color, flags, false);
const INT32 skinnum = localskin ? (localskin - K_GetSkinArray(local)) : (skin - skins);
return RGetTranslationColormap(skinnum, color, flags, (localskin && local));
}
patch_t* R_GetSkinFaceRank(player_t* ply)
{
if (ply->skinlocal && ply->localskin)
return localfacerankprefix[ply->localskin - 1];
else if (ply->localskin)
if (ply->localskin)
{
if (ply->skinlocal)
return localfacerankprefix[ply->localskin - 1];
return facerankprefix[ply->localskin - 1];
}
return facerankprefix[ply->skin];
}
patch_t* R_GetSkinFaceWant(player_t* ply)
{
if (ply->skinlocal && ply->localskin)
return localfacewantprefix[ply->localskin - 1];
else if (ply->localskin)
if (ply->localskin)
{
if (ply->skinlocal)
return localfacewantprefix[ply->localskin - 1];
return facewantprefix[ply->localskin - 1];
}
return facewantprefix[ply->skin];
}
patch_t* R_GetSkinFaceMini(player_t* ply)
{
if (ply->skinlocal && ply->localskin)
return localfacemmapprefix[ply->localskin - 1];
else if (ply->localskin)
if (ply->localskin)
{
if (ply->skinlocal)
return localfacemmapprefix[ply->localskin - 1];
return facemmapprefix[ply->localskin - 1];
}
return facemmapprefix[ply->skin];
}
+2 -12
View File
@@ -14,13 +14,7 @@
/// \note no includes because this is included as part of r_draw.cpp
#ifdef HAVE_THREADS
#ifdef _WIN32
#include <windows.h>
#define local_for_thread static __thread
#else
#include <threads.h>
#define local_for_thread thread_local static
#endif
#define local_for_thread static thread_local
#else
#define local_for_thread static
#endif
@@ -221,11 +215,7 @@ static void R_GetTiltedLighting(std::vector<INT32>& tiltlighting, const drawspan
const float planelightfloat = PLANELIGHTFLOAT;
const fixed_t lightstart = FloatToFixed(iz * planelightfloat);
const fixed_t lightend = FloatToFixed((iz + ds->szp.x * width) * planelightfloat);
if (tiltlighting.size() != (size_t)viewwidth)
{
tiltlighting.resize(viewwidth);
}
tiltlighting.resize((size_t)viewwidth);
R_CalcTiltedLighting(tiltlighting, ds->x1, ds->x2, lightstart, lightend);
//CONS_Printf("tilted lighting %f to %f (foc %f)\n", FixedToFloat(lightstart), FixedToFloat(lightend), focallengthf);
+2 -6
View File
@@ -75,15 +75,11 @@ typedef struct {
fixed_t y;
fixed_t z;
boolean sky;
sector_t *sector;
player_t *player;
angle_t angle;
angle_t aim;
angle_t roll;
fixed_t cos;
fixed_t sin;
mobj_t *mobj;
} viewvars_t;
extern viewvars_t *newview;
@@ -142,12 +138,12 @@ typedef struct levelinterpolator_s {
fixed_t oldcx, oldcy, bakcx, bakcy;
angle_t oldangle, bakangle;
} polyobj;
struct {
/*struct {
pslope_t *slope;
vector3_t oldo, bako;
vector2_t oldd, bakd;
fixed_t oldzdelta, bakzdelta;
} dynslope;
} dynslope;*/
};
} levelinterpolator_t;
+28 -47
View File
@@ -433,10 +433,7 @@ fixed_t R_ScaleFromGlobalAngle(angle_t visangle)
if (den > num>>16)
{
num = FixedDiv(num, den);
if (num > 64*FRACUNIT)
return 64*FRACUNIT;
if (num < 256)
return 256;
num = CLAMP(num, 256, 64*FRACUNIT);
return num;
}
return 64*FRACUNIT;
@@ -449,8 +446,8 @@ line_t *R_GetFFloorLine(const line_t *line, const ffloor_t *pfloor, const sector
size_t linenum = std::min<size_t>((size_t)(line - sector->lines[0]), pfloor->master->frontsector->linecount);
return pfloor->master->frontsector->lines[0] + linenum;
}
else
return pfloor->master;
return pfloor->master;
}
side_t *R_GetFFloorSide(const line_t *line, const ffloor_t *pfloor, const sector_t *sector)
@@ -460,8 +457,8 @@ side_t *R_GetFFloorSide(const line_t *line, const ffloor_t *pfloor, const sector
line_t *newline = R_GetFFloorLine(line, pfloor, sector);
return &sides[newline->sidenum[0]];
}
else
return &sides[pfloor->master->sidenum[0]];
return &sides[pfloor->master->sidenum[0]];
}
//
@@ -1095,9 +1092,9 @@ subsector_t *R_IsPointInSubsector(fixed_t x, fixed_t y)
// R_SetupFrame
//
mobj_t *viewmobj;
mobj_t *viewmobj = NULL;
static void R_SetupCommonFrame(player_t * player, sector_t * sector)
static void R_SetupCommonFrame(player_t * player)
{
newview->player = player;
@@ -1107,11 +1104,6 @@ static void R_SetupCommonFrame(player_t * player, sector_t * sector)
newview->roll = R_ViewRollAngle(player);
if (sector != NULL)
newview->sector = sector;
else
newview->sector = R_PointInSubsectorFast(newview->x, newview->y)->sector;
R_InterpolateView(R_GetTimeFrac(RTF_CAMERA), false);
}
@@ -1210,7 +1202,6 @@ void R_SkyboxFrame(UINT8 pnum)
{
player_t *player = &players[displayplayers[pnum]];
camera_t *thiscam = &camera[pnum];
sector_t *viewsec = NULL;
mapheader_t *mh = mapheaderinfo[gamemap-1];
R_SetViewContext(static_cast<viewcontext_e>(VIEWCONTEXT_SKY1 + pnum));
@@ -1236,9 +1227,6 @@ void R_SkyboxFrame(UINT8 pnum)
newview->x = viewmobj->x;
newview->y = viewmobj->y;
newview->z = (viewmobj->spawnpoint) ? (((fixed_t)viewmobj->spawnpoint->angle) << FRACBITS) : 0;
if (viewmobj->subsector)
viewsec = viewmobj->subsector->sector;
}
if (mh)
@@ -1246,7 +1234,7 @@ void R_SkyboxFrame(UINT8 pnum)
R_SetupSkyScale(player, thiscam, mh);
}
R_SetupCommonFrame(player, viewsec);
R_SetupCommonFrame(player);
}
void R_SetupFrame(UINT8 pnum, boolean skybox)
@@ -1254,17 +1242,10 @@ void R_SetupFrame(UINT8 pnum, boolean skybox)
player_t *player = &players[displayplayers[pnum]];
camera_t *thiscam = &camera[pnum];
boolean chasecam = (cv_chasecam[pnum].value);
sector_t *viewsec = NULL;
R_SetViewContext(static_cast<viewcontext_e>(VIEWCONTEXT_PLAYER1 + pnum));
if (thiscam->reset)
{
R_ResetViewInterpolation(pnum);
thiscam->reset = false;
}
if (player->spectator || thiscam->freecam)
if (player->spectator || (thiscam && thiscam->freecam))
{
// Free flying spectator uses demo freecam. This
// requires chasecam to be enabled.
@@ -1274,13 +1255,22 @@ void R_SetupFrame(UINT8 pnum, boolean skybox)
if (player->playerstate == PST_DEAD || player->exiting)
chasecam = true; // force chasecam on
if (chasecam && (thiscam && !thiscam->chase))
if (thiscam)
{
P_ResetCamera(player, thiscam);
thiscam->chase = true;
if (thiscam->reset)
{
R_ResetViewInterpolation(pnum);
thiscam->reset = false;
}
if (chasecam && !thiscam->chase)
{
P_ResetCamera(player, thiscam);
thiscam->chase = true;
}
else if (!chasecam)
thiscam->chase = false;
}
else if (thiscam && !chasecam)
thiscam->chase = false;
newview->sky = !skybox;
@@ -1295,10 +1285,7 @@ void R_SetupFrame(UINT8 pnum, boolean skybox)
newview->y = viewmobj->y;
newview->z = viewmobj->z + 20*FRACUNIT;
if (viewmobj->subsector)
viewsec = viewmobj->subsector->sector;
R_SetupCommonFrame(player, viewsec);
R_SetupCommonFrame(player);
}
else if (thiscam && chasecam) // use outside cam view
{
@@ -1309,10 +1296,7 @@ void R_SetupFrame(UINT8 pnum, boolean skybox)
newview->y = thiscam->y;
newview->z = thiscam->z + (thiscam->height>>1);
if (thiscam->subsector)
viewsec = thiscam->subsector->sector;
R_SetupCommonFrame(player, viewsec);
R_SetupCommonFrame(player);
}
else if (player->mo) // use the player's eyes view
{
@@ -1323,10 +1307,7 @@ void R_SetupFrame(UINT8 pnum, boolean skybox)
newview->y = viewmobj->y;
newview->z = player->viewz;
if (viewmobj->subsector)
viewsec = viewmobj->subsector->sector;
R_SetupCommonFrame(player, viewsec);
R_SetupCommonFrame(player);
}
}
@@ -1337,8 +1318,8 @@ static void R_PortalFrame(portal_t *portal)
viewz = portal->viewz;
viewangle = portal->viewangle;
//viewsin = FINESINE(viewangle>>ANGLETOFINESHIFT);
//viewcos = FINECOSINE(viewangle>>ANGLETOFINESHIFT);
viewsin = FINESINE(viewangle>>ANGLETOFINESHIFT);
viewcos = FINECOSINE(viewangle>>ANGLETOFINESHIFT);
portalclipstart = portal->start;
portalclipend = portal->end;
+20
View File
@@ -150,6 +150,26 @@ subsector_t *R_IsPointInSubsector(fixed_t x, fixed_t y);
#define R_PointToDist(x, y) R_PointToDist2(viewx, viewy, x, y)
#define R_PointToDist2(px2, py2, px1, py1) FixedHypot((px1) - (px2), (py1) - (py2))
FUNCMATH FUNCINLINE static ATTRINLINE fixed_t R_QuickDist(fixed_t x1, fixed_t y1, fixed_t x, fixed_t y)
{
const fixed_t absx = abs(x - x1);
const fixed_t absy = abs(y - y1);
#ifdef __cplusplus
return std::max<fixed_t>(absx, absy);
#else
return max(absx, absy);
#endif
}
// Takes 2 fixed-point coordinates, returns "distance" between them and camera,
// as an fixed-point integer.
// It is very rough, tho it is used only for optimizing out unnecessary
// interpolation, so it is kinda ok on big distances.
FUNCINLINE static ATTRINLINE PUREFUNC fixed_t R_QuickCamDist(fixed_t x, fixed_t y)
{
return R_QuickDist(viewx, viewy, x, y);
}
line_t *R_GetFFloorLine(const line_t *line, const ffloor_t *pfloor, const sector_t *sector);
side_t *R_GetFFloorSide(const line_t *line, const ffloor_t *pfloor, const sector_t *sector);
+2 -8
View File
@@ -487,11 +487,8 @@ void *R_PixelsToPatch(UINT8 *raw, INT16 width, INT16 height, INT16 leftoffset, I
size_t maxoutsize = maxcolumnsize * width + (8 + 4 * width);
// so, a 512x512 flat should maximally need 393,760 (384.53 KiB) bytes.
// quite a bit smaller than 64 megabytes, and much less annoying to the windows debug allocator!
while (imgbuf.size() < maxoutsize)
{
imgbuf.resize(imgbuf.size() * 2);
}
imgbuf.resize(maxoutsize);
imgptr = imgbuf.data();
// Write image size and offset
@@ -621,11 +618,8 @@ void *R_MaskedFlatToPatch(UINT16 *raw, INT16 width, INT16 height, INT16 leftoffs
size_t maxoutsize = maxcolumnsize * width + (8 + 4 * width);
// so, a 512x512 flat should maximally need 393,760 (384.53 KiB) bytes.
// quite a bit smaller than 64 megabytes, and much less annoying to the windows debug allocator!
while (imgbuf.size() < maxoutsize)
{
imgbuf.resize(imgbuf.size() * 2);
}
imgbuf.resize(maxoutsize);
imgptr = imgbuf.data();
// Write image size and offset
+2 -5
View File
@@ -128,7 +128,7 @@ void RotatedPatch_DoRotation(rotsprite_t *rotsprite, patch_t *patch, INT32 angle
UINT32 i;
patch_t *rotated;
static std::vector<UINT16> rawdst(1024 * 1024), rawconv(1024 * 1024); // 1 MB should be enough for most cases
static std::vector<UINT16> rawdst(512 * 1024), rawconv(512 * 1024); // 1 MB should be enough for most cases
UINT16 *rawout;
size_t size;
@@ -185,10 +185,7 @@ void RotatedPatch_DoRotation(rotsprite_t *rotsprite, patch_t *patch, INT32 angle
if (!size)
size = (width * height);
while (rawdst.size() < size)
{
rawdst.resize(rawdst.size() * 2);
}
rawdst.resize(size);
for (i = 0; i < size; i++)
rawdst[i] = 0xFF00;
+5 -6
View File
@@ -220,21 +220,20 @@ static void Portal_ClipVisplane (const visplane_t* plane, portal_t* portal)
for (i = 0; i < end - start; i++)
{
// Invalid column.
if (plane->top[i + start] == 65535)
if (plane->top[i + start] == UINT16_MAX)
{
portal->ceilingclip[i] = -1;
portal->floorclip[i] = -1;
continue;
}
portal->ceilingclip[i] = plane->top[i + start] - 1;
portal->floorclip[i] = plane->bottom[i + start] + 1;
portal->frontscale[i] = INT32_MAX;
}
}
extern INT32 viewwidth;
static boolean TrimVisplaneBounds (const visplane_t* plane, INT16* start, INT16* end)
static boolean TrimVisplaneBounds(const visplane_t* plane, INT16* start, INT16* end)
{
*start = plane->minx;
*end = plane->maxx + 1;
@@ -255,13 +254,13 @@ static boolean TrimVisplaneBounds (const visplane_t* plane, INT16* start, INT16*
* valid area.
*/
while (plane->bottom[*start] == 0 && plane->top[*start] == 65535 && *start < *end)
while (plane->bottom[*start] == 0 && plane->top[*start] == UINT16_MAX && *start < *end)
{
(*start)++;
}
while (plane->bottom[*end - 1] == 0 && plane->top[*start] == 65535 && *end > *start)
while (plane->bottom[*end - 1] == 0 && plane->top[*start] == UINT16_MAX && *end > *start)
{
(*end)--;
}
+54 -20
View File
@@ -1612,6 +1612,47 @@ static void R_ProjectSprite(mobj_t *thing)
return;
}
if (!papersprite)
{
// killough 4/9/98: clip things which are out of view due to height
// e6y: fix of hanging decoration disappearing in Batman Doom MAP02
// centeryfrac -> viewheightfrac
// [kb] add +1 so sprites are shown even with the extended freelook
// lug: attempt to account for freelook properly
if (interp.z > viewz + FixedMul(FixedDiv(centeryfrac, projectiony), tz) ||
gzt < viewz + FixedMul(FixedDiv(centeryfrac - (viewheight << FRACBITS), projectiony), tz))
{
return;
}
}
// killough 3/27/98: exclude things totally separated
// from the viewer, by either water or fake ceilings
// killough 4/11/98: improve sprite clipping for underwater/fake ceilings
heightsec = thing->subsector->sector->heightsec;
if (viewplayer && viewplayer->mo && viewplayer->mo->subsector)
phs = viewplayer->mo->subsector->sector->heightsec;
else
phs = -1;
if (heightsec != -1 && phs != -1) // only clip things which are in special sectors
{
fixed_t secheight;
secheight = P_GetSectorFloorZAt(&sectors[heightsec], viewx, viewy);
if (viewz < P_GetSectorFloorZAt(&sectors[phs], interp.x, interp.y) ?
interp.z >= secheight :
gzt < secheight)
return;
secheight = P_GetSectorCeilingZAt(&sectors[heightsec], viewx, viewy);
if (viewz > P_GetSectorCeilingZAt(&sectors[phs], interp.x, interp.y) ?
gzt < secheight && viewz >= secheight :
interp.z >= secheight)
return;
}
if (thing->frame & FF_ABSOLUTELIGHTLEVEL)
{
const UINT8 n = R_ThingLightLevel(thing);
@@ -1689,24 +1730,6 @@ static void R_ProjectSprite(mobj_t *thing)
lights_array = scalelight[lightnum];
}
heightsec = thing->subsector->sector->heightsec;
if (viewplayer && viewplayer->mo && viewplayer->mo->subsector)
phs = viewplayer->mo->subsector->sector->heightsec;
else
phs = -1;
if (heightsec != -1 && phs != -1) // only clip things which are in special sectors
{
if (viewz < sectors[phs].floorheight ?
interp.z >= sectors[heightsec].floorheight :
gzt < sectors[heightsec].floorheight)
return;
if (viewz > sectors[phs].ceilingheight ?
gzt < sectors[heightsec].ceilingheight && viewz >= sectors[heightsec].ceilingheight :
interp.z >= sectors[heightsec].ceilingheight)
return;
}
// store information in a vissprite
vis = R_NewVisSprite();
vis->heightsec = heightsec; //SoM: 3/17/2000
@@ -1952,6 +1975,17 @@ static void R_ProjectPrecipitationSprite(precipmobj_t *thing)
return;
}
// killough 4/9/98: clip things which are out of view due to height
// e6y: fix of hanging decoration disappearing in Batman Doom MAP02
// centeryfrac -> viewheightfrac
// [kb] add +1 so sprites are shown even with the extended freelook
// lug: attempt to account for freelook properly
if (interp.z > viewz + FixedMul(FixedDiv(centeryfrac, projectiony), tz) ||
gzt < viewz + FixedMul(FixedDiv(centeryfrac - (viewheight << FRACBITS), projectiony), tz))
{
return;
}
// aspect ratio stuff :
yscale = FixedDiv(projectiony, tz);
@@ -2908,7 +2942,7 @@ boolean R_ThingWithinDist(mobj_t *thing, INT32 limit_dist)
{
if (limit_dist)
{
if ((R_QuickCamDist(thing->x, thing->y) << FRACBITS)/mapobjectscale > limit_dist)
if (R_QuickCamDist(thing->x, thing->y)/mapobjectscale > limit_dist)
{
return false;
}
@@ -2952,7 +2986,7 @@ static boolean R_CheckInterpDist(T *thing)
if (!R_UsingFrameInterpolation())
return false;
const INT32 dist = R_QuickCamDist(thing->x, thing->y);
const INT32 dist = R_QuickCamDist(thing->x, thing->y) >> FRACBITS;
return (dist < cv_maxinterpdist.value);
}
+1 -13
View File
@@ -35,19 +35,6 @@ extern "C" {
#define FEETADJUST (4<<FRACBITS) // R_AddSingleSpriteDef
// Takes 2 fixed-point coordinates, returns "distance" between them and camera,
// as an non-fixed-point integer.
// It is very rough, tho it is used only for optimizing out unnecessary
// interpolation, so it is kinda ok on big distances.
#ifdef __cplusplus
#define R_QuickCamDist(x, y) std::max(std::abs(((x)>>FRACBITS) - (viewx>>FRACBITS)), std::abs(((y)>>FRACBITS) - (viewy>>FRACBITS)))
#define R_QuickDist(x1, y1, x, y) std::max(std::abs(((x)>>FRACBITS) - (x1>>FRACBITS)), std::abs(((y)>>FRACBITS) - (y1>>FRACBITS)))
#else
#define R_QuickCamDist(x, y) max(abs(((x)>>FRACBITS) - (viewx>>FRACBITS)), abs(((y)>>FRACBITS) - (viewy>>FRACBITS)))
#define R_QuickDist(x1, y1, x, y) max(abs(((x)>>FRACBITS) - (x1>>FRACBITS)), abs(((y)>>FRACBITS) - (y1>>FRACBITS)))
#endif
// Constant arrays used for psprite clipping
// and initializing clipping.
extern INT16 *negonearray;
@@ -67,6 +54,7 @@ FUNCINLINE static ATTRINLINE INT32 R_ThingLightLevel(mobj_t* thing)
{
return (INT32)thing->lightlevel;
}
fixed_t R_GetSpriteDirectionalLighting(angle_t angle);
fixed_t R_GetShadowZ(mobj_t *thing, pslope_t **shadowslope);
+23 -25
View File
@@ -58,7 +58,7 @@ static void AmigaType_OnChange(void);
#endif
static CV_PossibleValue_t audbuffersize_cons_t[] = {{128, "128"}, {256, "256"}, {512, "512"}, {1024, "1024"}, {2048, "2048"}, {4096, "4096"}, {0, NULL}};
consvar_t cv_audbuffersize = {"audiobuffersize", "2048", CV_SAVE|CV_CALL, audbuffersize_cons_t, BufferSize_OnChange, 0, NULL, NULL, 0, 0, NULL};
consvar_t cv_audbuffersize = {"audiobuffersize", "2048", CV_SAVE|CV_CALL|CV_NOINIT, audbuffersize_cons_t, BufferSize_OnChange, 0, NULL, NULL, 0, 0, NULL};
// stereo reverse
consvar_t stereoreverse = {"stereoreverse", "Off", CV_SAVE, CV_OnOff, NULL, 0, NULL, NULL, 0, 0, NULL};
@@ -94,15 +94,6 @@ consvar_t cv_playsoundifunfocused = {"playsoundsifunfocused", "No", CV_SAVE, CV_
consvar_t cv_pausemusic = {"playmusicifpaused", "No", CV_SAVE, CV_YesNo, NULL, 0, NULL, NULL, 0, 0, NULL};
//bird music stuff
static CV_PossibleValue_t music_resync_threshold_cons_t[] = {
{0, "MIN"},
{1000, "MAX"},
{0}
};
consvar_t cv_music_resync_threshold = {"music_resync_threshold", "0", CV_SAVE|CV_CALL, music_resync_threshold_cons_t, I_UpdateSongLagThreshold, 0, NULL, NULL, 0, 0, NULL};
consvar_t cv_music_resync_powerups_only = {"music_resync_powerups_only", "No", CV_SAVE|CV_CALL, CV_YesNo, I_UpdateSongLagThreshold, 0, NULL, NULL, 0, 0, NULL};
consvar_t cv_invincmusicfade = {"invincmusicfade", "300", CV_SAVE, CV_Unsigned, NULL, 0, NULL, NULL, 0, 0, NULL};
consvar_t cv_growmusicfade = {"growmusicfade", "500", CV_SAVE, CV_Unsigned, NULL, 0, NULL, NULL, 0, 0, NULL};
consvar_t cv_respawnfademusicout = {"respawnfademusicout", "1000", CV_SAVE, CV_Unsigned, NULL, 0, NULL, NULL, 0, 0, NULL};
@@ -282,6 +273,12 @@ void S_RegisterSoundStuff(void)
CV_RegisterVar(&cv_gamesounds);
CV_RegisterVar(&cv_gamedigimusic);
#ifdef HAVE_FLUIDSYNTH
CV_RegisterVar(&cv_midisoundfontpath);
CV_RegisterVar(&cv_midichorus);
CV_RegisterVar(&cv_midireverb);
#endif
CV_RegisterVar(&cv_samesoundlimit);
// bird music stuff
@@ -289,9 +286,6 @@ void S_RegisterSoundStuff(void)
CV_RegisterVar(&cv_playsoundifunfocused);
CV_RegisterVar(&cv_pausemusic);
CV_RegisterVar(&cv_music_resync_threshold);
CV_RegisterVar(&cv_music_resync_powerups_only);
CV_RegisterVar(&cv_invincmusicfade);
CV_RegisterVar(&cv_growmusicfade);
@@ -363,6 +357,7 @@ boolean S_SoundDisabled(void)
int S_CacheSound(void)
{
#if SOUND == SOUND_MIXER
if (sound_disabled)
return SOUNDCACHE_OFF;
@@ -370,6 +365,9 @@ int S_CacheSound(void)
return SOUNDCACHE_PRECACHE;
return cv_cachesound.value;
#else
return SOUNDCACHE_OFF;
#endif
}
// Stop all sounds, load level info, THEN start sounds.
@@ -773,9 +771,14 @@ void S_UpdateSounds(void)
volume = c->volume; // 8 bits internal volume precision
sep = NORM_SEP;
if (P_MobjWasRemoved(c->origin))
{
// origin was removed, stop the music
S_StopChannel(cnum);
}
// check non-local sounds for distance clipping
// or modify their params
if (c->origin)
else
{
boolean itsUs = false;
@@ -1643,7 +1646,7 @@ UINT32 S_GetMusicPosition(void)
static lumpnum_t S_GetMusicLumpNum(const char *mname)
{
if (S_MusicExists(mname, false, true)) // check non midis first
return W_GetNumForName(va("o_%s", mname));
return W_GetNumForName(va("O_%s", mname));
if (S_MusicExists(mname, true, false))
{
@@ -1651,7 +1654,7 @@ static lumpnum_t S_GetMusicLumpNum(const char *mname)
CONS_Alert(CONS_ERROR, "A MIDI music lump %.6s was found,\nbut SRB2Kart does not support MIDI output.\nWe apologise for the inconvenience.\n", mname);
return LUMPERROR;
#else
return W_GetNumForName(va("d_%s", mname));
return W_GetNumForName(va("D_%s", mname));
#endif
}
@@ -1710,8 +1713,6 @@ static boolean S_PlayMusic(boolean looping, UINT32 fadeinms)
if (S_MusicDisabled())
return false;
I_UpdateSongLagThreshold();
if ((!fadeinms && !I_PlaySong(looping)) ||
(fadeinms && !I_FadeInPlaySong(fadeinms, looping)))
{
@@ -1951,13 +1952,13 @@ static const char *musicexception_list[] = {
// check if the current music is smth we dont want to keep (vote music, etc)
static boolean S_CheckMusicException(void)
{
if (!fasticmp(music.name, mapmusic.name))
return true;
// dumb hack but dont keepmusic music that is supposed to reset
if (music.flags & MUSIC_RELOADRESET)
return true;
if (!fasticmp(music.name, mapmusic.name))
return true;
// in case somehow the mapmusic was replaced with smth we dont want to keep
for (size_t i = 0; i < sizeof(musicexception_list)/sizeof(musicexception_list[0]); i++)
{
@@ -2050,16 +2051,13 @@ static boolean S_SkipIntroMusic(void)
if (fasticmp(music.name, "titles"))
return false;
char *maptitle = G_BuildMapTitle(gamemap); // Zzz...
CLEANUP(Z_Pfree) char *maptitle = G_BuildMapTitle(gamemap); // Zzz...
if (maptitle && fasticmp(maptitle, "Wandering Falls")) // wandering balls changes its song when the race starts Zzz...
{
Z_Free(maptitle);
return false;
}
Z_Free(maptitle);
return true;
}
+6 -3
View File
@@ -54,10 +54,13 @@ extern consvar_t cv_amigatype;
#endif
#endif
//bird music stuff
extern consvar_t cv_music_resync_threshold;
extern consvar_t cv_music_resync_powerups_only;
#ifdef HAVE_FLUIDSYNTH
extern consvar_t cv_midisoundfontpath;
extern consvar_t cv_midichorus;
extern consvar_t cv_midireverb;
#endif
//bird music stuff
extern consvar_t cv_invincmusicfade;
extern consvar_t cv_growmusicfade;
+6 -8
View File
@@ -42,8 +42,8 @@ INT32 setmodeneeded = 0; // video mode change needed if > 0 (the mode number to
static CV_PossibleValue_t shittyscreen_cons_t[] = {{0, "Okay"}, {1, "Shitty"}, {2, "Extra Shitty"}, {0, NULL}};
//added : 03-02-98: default screen mode, as loaded/saved in config
consvar_t cv_scr_width = {"scr_width", "1280", CV_SAVE, CV_Unsigned, NULL, 0, NULL, NULL, 0, 0, NULL};
consvar_t cv_scr_height = {"scr_height", "800", CV_SAVE, CV_Unsigned, NULL, 0, NULL, NULL, 0, 0, NULL};
consvar_t cv_scr_width = {"scr_width", "1280", CV_SAVE|CV_CALL, CV_Unsigned, VID_RefreshModeList, 0, NULL, NULL, 0, 0, NULL};
consvar_t cv_scr_height = {"scr_height", "800", CV_SAVE|CV_CALL, CV_Unsigned, VID_RefreshModeList, 0, NULL, NULL, 0, 0, NULL};
consvar_t cv_renderview = {"renderview", "On", 0, CV_OnOff, NULL, 0, NULL, NULL, 0, 0, NULL};
consvar_t cv_frameskip = {"frameskip", "On", CV_SAVE, CV_OnOff, NULL, 0, NULL, NULL, 0, 0, NULL};
@@ -343,8 +343,6 @@ boolean SCR_IsAspectCorrect(INT32 width, INT32 height)
return (width % BASEVIDWIDTH == 0 && height % BASEVIDHEIGHT == 0 && width / BASEVIDWIDTH == height / BASEVIDHEIGHT);
}
double averageFPS = 0.0f;
#define USE_FPS_SAMPLES
#ifdef USE_FPS_SAMPLES
@@ -352,16 +350,16 @@ double averageFPS = 0.0f;
#define NUM_FPS_SAMPLES (32) // Number of samples to store
static double total_frame_time = 0.0;
static int frame_index;
static double fps_samples[NUM_FPS_SAMPLES];
#endif
static boolean fps_init = false;
static precise_t fps_enter = 0;
static double averageFPS = 0.0f;
void SCR_CalculateFPS(void)
{
static boolean fps_init = false;
static int frame_index = 0;
static precise_t fps_enter = 0;
precise_t fps_finish = 0;
double frameElapsed = 0.0;
+25 -24
View File
@@ -46,8 +46,8 @@
#include "SDL_image.h"
#else
// SDLCALL terms removed from original SDL_image declarations
int IMG_isXPM(SDL_RWops *src);
SDL_Surface *IMG_LoadXPM_RW(SDL_RWops *src);
int IMG_isXPM(SDL_IOStream *src);
SDL_Surface *IMG_LoadXPM_RW(SDL_IOStream *src);
SDL_Surface *IMG_ReadXPMFromArray(const char **xpm);
#define IMG_SetError SDL_SetError
#define IMG_GetError SDL_GetError
@@ -56,7 +56,7 @@ SDL_Surface *IMG_ReadXPMFromArray(const char **xpm);
#ifdef LOAD_XPM
/* See if an image is contained in a data source */
int IMG_isXPM(SDL_RWops *src)
int IMG_isXPM(SDL_IOStream *src)
{
Sint64 start;
int is_XPM;
@@ -64,14 +64,14 @@ int IMG_isXPM(SDL_RWops *src)
if ( !src )
return 0;
start = SDL_RWtell(src);
start = SDL_TellIO(src);
is_XPM = 0;
if ( SDL_RWread(src, magic, sizeof(magic), 1) ) {
if ( SDL_ReadIO(src, magic, sizeof(magic)) ) {
if ( SDL_memcmp(magic, "/* XPM */", sizeof(magic)) == 0 ) {
is_XPM = 1;
}
}
SDL_RWseek(src, start, RW_SEEK_SET);
SDL_SeekIO(src, start, SDL_IO_SEEK_SET);
return(is_XPM);
}
@@ -933,7 +933,7 @@ static const char *error;
* If len > 0, it's assumed to be at least len chars (for efficiency).
* Return NULL and set error upon EOF or parse error.
*/
static const char *get_next_line(const char ***lines, SDL_RWops *src, int len)
static const char *get_next_line(const char ***lines, SDL_IOStream *src, int len)
{
char *linebufnew;
@@ -943,7 +943,7 @@ static const char *get_next_line(const char ***lines, SDL_RWops *src, int len)
char c;
int n;
do {
if (SDL_RWread(src, &c, 1, 1) <= 0) {
if (SDL_ReadIO(src, &c, 1) <= 0) {
error = "Premature end of data";
return NULL;
}
@@ -960,7 +960,7 @@ static const char *get_next_line(const char ***lines, SDL_RWops *src, int len)
}
linebuf = linebufnew;
}
if (SDL_RWread(src, linebuf, len - 1, 1) <= 0) {
if (SDL_ReadIO(src, linebuf, len - 1) <= 0) {
error = "Premature end of data";
return NULL;
}
@@ -980,7 +980,7 @@ static const char *get_next_line(const char ***lines, SDL_RWops *src, int len)
}
linebuf = linebufnew;
}
if (SDL_RWread(src, linebuf + n, 1, 1) <= 0) {
if (SDL_ReadIO(src, linebuf + n, 1) <= 0) {
error = "Premature end of data";
return NULL;
}
@@ -1005,7 +1005,7 @@ do { \
} while (0)
/* read XPM from either array or RWops */
static SDL_Surface *load_xpm(const char **xpm, SDL_RWops *src)
static SDL_Surface *load_xpm(const char **xpm, SDL_IOStream *src)
{
Sint64 start = 0;
SDL_Surface *image = NULL;
@@ -1027,7 +1027,7 @@ static SDL_Surface *load_xpm(const char **xpm, SDL_RWops *src)
buflen = 0;
if (src)
start = SDL_RWtell(src);
start = SDL_TellIO(src);
if (xpm)
xpmlines = &xpm;
@@ -1065,14 +1065,15 @@ static SDL_Surface *load_xpm(const char **xpm, SDL_RWops *src)
/* Create the new surface */
if (ncolors <= 256) {
indexed = 1;
image = SDL_CreateRGBSurface(SDL_SWSURFACE, w, h, 8,
0, 0, 0, 0);
im_colors = image->format->palette->colors;
image->format->palette->ncolors = ncolors;
image = SDL_CreateSurface(w, h,
SDL_PIXELFORMAT_INDEX8);
SDL_Palette *palette = SDL_CreateSurfacePalette(image);
im_colors = palette->colors;
palette->ncolors = ncolors;
} else {
indexed = 0;
image = SDL_CreateRGBSurface(SDL_SWSURFACE, w, h, 32,
0xff0000, 0x00ff00, 0x0000ff, 0);
image = SDL_CreateSurface(w, h,
SDL_GetPixelFormatForMasks(32, 0xff0000, 0x00ff00, 0x0000ff, 0));
}
if (!image) {
/* Hmm, some SDL error (out of memory?) */
@@ -1128,7 +1129,7 @@ static SDL_Surface *load_xpm(const char **xpm, SDL_RWops *src)
add_colorhash(colors, nextkey, cpp, pixel);
nextkey += cpp;
if (rgb == 0xffffffff)
SDL_SetColorKey(image, SDL_TRUE, pixel);
SDL_SetSurfaceColorKey(image, true, pixel);
break;
}
}
@@ -1164,9 +1165,9 @@ static SDL_Surface *load_xpm(const char **xpm, SDL_RWops *src)
done:
if (error) {
if ( src )
SDL_RWseek(src, start, RW_SEEK_SET);
SDL_SeekIO(src, start, SDL_IO_SEEK_SET);
if ( image ) {
SDL_FreeSurface(image);
SDL_DestroySurface(image);
image = NULL;
}
IMG_SetError("%s", error);
@@ -1180,7 +1181,7 @@ done:
}
/* Load a XPM type image from an RWops datasource */
SDL_Surface *IMG_LoadXPM_RW(SDL_RWops *src)
SDL_Surface *IMG_LoadXPM_RW(SDL_IOStream *src)
{
if ( !src ) {
/* The error message has been set in SDL_RWFromFile */
@@ -1203,14 +1204,14 @@ SDL_Surface *IMG_ReadXPMFromArray(const char **xpm)
#else /* not LOAD_XPM */
/* See if an image is contained in a data source */
int IMG_isXPM(SDL_RWops *src)
int IMG_isXPM(SDL_IOStream *src)
{
return(0);
}
/* Load a XPM type image from an SDL datasource */
SDL_Surface *IMG_LoadXPM_RW(SDL_RWops *src)
SDL_Surface *IMG_LoadXPM_RW(SDL_IOStream *src)
{
return(NULL);
}
+2 -2
View File
@@ -27,10 +27,10 @@
#ifdef HAVE_SDL
#include "SDL.h"
#include <SDL3/SDL.h>
#ifndef NOLOADSO
#include "SDL_loadso.h"
#include <SDL3/SDL_loadso.h>
#endif
#define _CREATE_DLL_ // necessary for Unix AND Windows
Loaded 100 of 111 files, more files were not shown because too many files have changed in this diff. Show more