Merge branch 'master' into newcontrols

# Conflicts:
#	src/d_netcmd.c
#	src/g_game.c
#	src/g_game.h
#	src/m_menu.c
This commit is contained in:
fickleheart 2019-12-30 10:47:09 -06:00
commit a9b80bf1f0
75 changed files with 3952 additions and 1885 deletions

View File

@ -459,11 +459,15 @@ matrix:
- os: linux - os: linux
addons: addons:
apt: apt:
sources:
- ubuntu-toolchain-r-test
- sourceline: 'ppa:stjr/srb2'
packages: packages:
- libsdl2-mixer-dev - libsdl2-mixer-dev
- libpng-dev - libpng-dev
- libgl1-mesa-dev - libgl1-mesa-dev
- libgme-dev - libgme-dev
- libopenmpt-dev
- p7zip-full - p7zip-full
- gcc-4.8 - gcc-4.8
compiler: gcc-4.8 compiler: gcc-4.8
@ -473,43 +477,24 @@ matrix:
AND env(DPL_TERMINATE_MAIN) != "1" AND env(DPL_TERMINATE_MAIN) != "1"
env: env:
- _DPL_JOB_ENABLED=1 - _DPL_JOB_ENABLED=1
- _DPL_JOB_NAME=bionic - _DPL_JOB_NAME=eoan
- _DPL_DPUT_TARGET=1 - _DPL_DPUT_TARGET=1
- _DPL_PACKAGE_SOURCE=1 - _DPL_PACKAGE_SOURCE=1
- PACKAGE_DISTRO=bionic - PACKAGE_DISTRO=eoan
- PACKAGE_SUBVERSION=~18.04bionic - PACKAGE_SUBVERSION=~19.10eoan
#gcc-4.8 (Ubuntu 4.8.5-2ubuntu1~14.04.1) 4.8.5
- os: linux
addons:
apt:
packages:
- libsdl2-mixer-dev
- libpng-dev
- libgl1-mesa-dev
- libgme-dev
- p7zip-full
- gcc-4.8
compiler: gcc-4.8
dist: trusty
if: env(DPL_ENABLED) = "1" AND (env(_DPL_JOB_ENABLED) = "1" OR env(DPL_JOB_ENABLE_ALL) = "1")
AND (branch =~ /^.*deployer.*$/ OR (tag IS present AND env(DPL_TAG_ENABLED) = "1"))
AND env(DPL_TERMINATE_MAIN) != "1"
env:
- _DPL_JOB_ENABLED=1
- _DPL_JOB_NAME=trusty
- _DPL_DPUT_TARGET=1
- _DPL_PACKAGE_SOURCE=1
- PACKAGE_DISTRO=trusty
- PACKAGE_SUBVERSION=~14.04trusty
#gcc-4.8 (Ubuntu 4.8.5-2ubuntu1~14.04.1) 4.8.5 #gcc-4.8 (Ubuntu 4.8.5-2ubuntu1~14.04.1) 4.8.5
- os: linux - os: linux
addons: addons:
apt: apt:
sources:
- ubuntu-toolchain-r-test
- sourceline: 'ppa:stjr/srb2'
packages: packages:
- libsdl2-mixer-dev - libsdl2-mixer-dev
- libpng-dev - libpng-dev
- libgl1-mesa-dev - libgl1-mesa-dev
- libgme-dev - libgme-dev
- libopenmpt-dev
- p7zip-full - p7zip-full
- gcc-4.8 - gcc-4.8
compiler: gcc-4.8 compiler: gcc-4.8
@ -528,11 +513,15 @@ matrix:
- os: linux - os: linux
addons: addons:
apt: apt:
sources:
- ubuntu-toolchain-r-test
- sourceline: 'ppa:stjr/srb2'
packages: packages:
- libsdl2-mixer-dev - libsdl2-mixer-dev
- libpng-dev - libpng-dev
- libgl1-mesa-dev - libgl1-mesa-dev
- libgme-dev - libgme-dev
- libopenmpt-dev
- p7zip-full - p7zip-full
- gcc-4.8 - gcc-4.8
compiler: gcc-4.8 compiler: gcc-4.8
@ -542,20 +531,24 @@ matrix:
AND env(DPL_TERMINATE_MAIN) != "1" AND env(DPL_TERMINATE_MAIN) != "1"
env: env:
- _DPL_JOB_ENABLED=1 - _DPL_JOB_ENABLED=1
- _DPL_JOB_NAME=cosmic - _DPL_JOB_NAME=bionic
- _DPL_DPUT_TARGET=1 - _DPL_DPUT_TARGET=1
- _DPL_PACKAGE_SOURCE=1 - _DPL_PACKAGE_SOURCE=1
- PACKAGE_DISTRO=cosmic - PACKAGE_DISTRO=bionic
- PACKAGE_SUBVERSION=~18.10cosmic - PACKAGE_SUBVERSION=~18.04bionic
#gcc-4.8 (Ubuntu 4.8.5-2ubuntu1~14.04.1) 4.8.5 #gcc-4.8 (Ubuntu 4.8.5-2ubuntu1~14.04.1) 4.8.5
- os: linux - os: linux
addons: addons:
apt: apt:
sources:
- ubuntu-toolchain-r-test
- sourceline: 'ppa:stjr/srb2'
packages: packages:
- libsdl2-mixer-dev - libsdl2-mixer-dev
- libpng-dev - libpng-dev
- libgl1-mesa-dev - libgl1-mesa-dev
- libgme-dev - libgme-dev
- libopenmpt-dev
- p7zip-full - p7zip-full
- gcc-4.8 - gcc-4.8
compiler: gcc-4.8 compiler: gcc-4.8
@ -571,6 +564,33 @@ matrix:
- PACKAGE_DISTRO=xenial - PACKAGE_DISTRO=xenial
- PACKAGE_SUBVERSION=~16.04xenial - PACKAGE_SUBVERSION=~16.04xenial
#gcc-4.8 (Ubuntu 4.8.5-2ubuntu1~14.04.1) 4.8.5 #gcc-4.8 (Ubuntu 4.8.5-2ubuntu1~14.04.1) 4.8.5
- os: linux
addons:
apt:
sources:
- ubuntu-toolchain-r-test
- sourceline: 'ppa:stjr/srb2'
packages:
- libsdl2-mixer-dev
- libpng-dev
- libgl1-mesa-dev
- libgme-dev
- libopenmpt-dev
- p7zip-full
- gcc-4.8
compiler: gcc-4.8
dist: trusty
if: env(DPL_ENABLED) = "1" AND (env(_DPL_JOB_ENABLED) = "1" OR env(DPL_JOB_ENABLE_ALL) = "1")
AND (branch =~ /^.*deployer.*$/ OR (tag IS present AND env(DPL_TAG_ENABLED) = "1"))
AND env(DPL_TERMINATE_MAIN) != "1"
env:
- _DPL_JOB_ENABLED=1
- _DPL_JOB_NAME=trusty
- _DPL_DPUT_TARGET=1
- _DPL_PACKAGE_SOURCE=1
- PACKAGE_DISTRO=trusty
- PACKAGE_SUBVERSION=~14.04trusty
#gcc-4.8 (Ubuntu 4.8.5-2ubuntu1~14.04.1) 4.8.5
allow_failures: allow_failures:
- compiler: clang-3.5 - compiler: clang-3.5
- compiler: clang-3.6 - compiler: clang-3.6

View File

@ -95,7 +95,6 @@ set(CMAKE_PDB_OUTPUT_DIRECTORY "${CMAKE_BINARY_DIR}/bin")
# Set EXE names so the assets CMakeLists can refer to its target # Set EXE names so the assets CMakeLists can refer to its target
set(SRB2_SDL2_EXE_NAME srb2 CACHE STRING "Executable binary output name") set(SRB2_SDL2_EXE_NAME srb2 CACHE STRING "Executable binary output name")
set(SRB2_WIN_EXE_NAME srb2dd CACHE STRING "Executable binary output name for DirectDraw build")
include_directories(${CMAKE_CURRENT_BINARY_DIR}/src) include_directories(${CMAKE_CURRENT_BINARY_DIR}/src)

View File

@ -1,145 +1,145 @@
version: 2.1.25.{branch}-{build} version: 2.2.0.{branch}-{build}
os: MinGW os: MinGW
environment: environment:
CC: ccache CC: ccache
CCACHE_CC: i686-w64-mingw32-gcc CCACHE_CC: i686-w64-mingw32-gcc
CCACHE_CC_64: x86_64-w64-mingw32-gcc CCACHE_CC_64: x86_64-w64-mingw32-gcc
WINDRES: windres WINDRES: windres
# c:\mingw-w64 i686 has gcc 6.3.0, so use c:\msys64 7.3.0 instead # c:\mingw-w64 i686 has gcc 6.3.0, so use c:\msys64 7.3.0 instead
MINGW_SDK: c:\msys64\mingw32 MINGW_SDK: c:\msys64\mingw32
# c:\msys64 x86_64 has gcc 8.2.0, so use c:\mingw-w64 7.3.0 instead # c:\msys64 x86_64 has gcc 8.2.0, so use c:\mingw-w64 7.3.0 instead
MINGW_SDK_64: C:\mingw-w64\x86_64-7.3.0-posix-seh-rt_v5-rev0\mingw64 MINGW_SDK_64: C:\mingw-w64\x86_64-7.3.0-posix-seh-rt_v5-rev0\mingw64
CFLAGS: -Wall -W -Werror -Wno-error=implicit-fallthrough -Wimplicit-fallthrough=3 -Wno-tautological-compare -Wno-error=suggest-attribute=noreturn CFLAGS: -Wall -W -Werror -Wno-error=implicit-fallthrough -Wimplicit-fallthrough=3 -Wno-tautological-compare -Wno-error=suggest-attribute=noreturn
NASM_ZIP: nasm-2.12.01 NASM_ZIP: nasm-2.12.01
NASM_URL: http://www.nasm.us/pub/nasm/releasebuilds/2.12.01/win64/nasm-2.12.01-win64.zip NASM_URL: http://www.nasm.us/pub/nasm/releasebuilds/2.12.01/win64/nasm-2.12.01-win64.zip
UPX_ZIP: upx391w UPX_ZIP: upx391w
UPX_URL: http://upx.sourceforge.net/download/upx391w.zip UPX_URL: http://upx.sourceforge.net/download/upx391w.zip
CCACHE_EXE: ccache.exe CCACHE_EXE: ccache.exe
CCACHE_URL: http://alam.srb2.org/ccache.exe CCACHE_URL: http://alam.srb2.org/ccache.exe
CCACHE_COMPRESS: true CCACHE_COMPRESS: true
CCACHE_DIR: C:\Users\appveyor\.ccache CCACHE_DIR: C:\Users\appveyor\.ccache
# Disable UPX by default. The user can override this in their Appveyor project settings # Disable UPX by default. The user can override this in their Appveyor project settings
NOUPX: 1 NOUPX: 1
############################## ##############################
# DEPLOYER VARIABLES # DEPLOYER VARIABLES
# DPL_ENABLED=1 builds installers for branch names starting with `deployer`. # DPL_ENABLED=1 builds installers for branch names starting with `deployer`.
# DPL_TAG_ENABLED=1 will also build installers for release tags. DPL_ENABLED=1 must also be set. # DPL_TAG_ENABLED=1 will also build installers for release tags. DPL_ENABLED=1 must also be set.
# Set these in the Appveyor project settings # Set these in the Appveyor project settings
############################## ##############################
DPL_ENABLED: 0 DPL_ENABLED: 0
DPL_TAG_ENABLED: 0 DPL_TAG_ENABLED: 0
DPL_INSTALLER_NAME: SRB2-v2123 DPL_INSTALLER_NAME: SRB2-v220
# Asset handling is barebones vs. Travis Deployer. We operate on 7z only. # Asset handling is barebones vs. Travis Deployer. We operate on 7z only.
# Include the README files and the OpenGL batch in the main and patch archives. # Include the README files and the OpenGL batch in the main and patch archives.
# The x86/x64 archives contain the DLL binaries. # The x86/x64 archives contain the DLL binaries.
ASSET_ARCHIVE_PATH: https://github.com/mazmazz/SRB2/releases/download/SRB2_assets/SRB2-v2122-assets.7z ASSET_ARCHIVE_PATH: https://github.com/mazmazz/SRB2/releases/download/SRB2_assets_220/SRB2-v220-assets.7z
ASSET_ARCHIVE_PATCH_PATH: https://github.com/mazmazz/SRB2/releases/download/SRB2_assets/SRB2-v2122-patch-assets.7z ASSET_ARCHIVE_PATCH_PATH: https://github.com/mazmazz/SRB2/releases/download/SRB2_assets_220/SRB2-v220-patch-assets.7z
ASSET_ARCHIVE_X86_PATH: https://github.com/mazmazz/SRB2/releases/download/SRB2_assets/SRB2-v2122-x86-assets.7z ASSET_ARCHIVE_X86_PATH: https://github.com/mazmazz/SRB2/releases/download/SRB2_assets_220/SRB2-v220-x86-assets.7z
ASSET_ARCHIVE_X64_PATH: https://github.com/mazmazz/SRB2/releases/download/SRB2_assets/SRB2-v2122-x64-assets.7z ASSET_ARCHIVE_X64_PATH: https://github.com/mazmazz/SRB2/releases/download/SRB2_assets_220/SRB2-v220-x64-assets.7z
ASSET_ARCHIVE_OPTIONAL_PATH: https://github.com/mazmazz/SRB2/releases/download/SRB2_assets/SRB2-v2122-optional-assets.7z ASSET_ARCHIVE_OPTIONAL_PATH: https://github.com/mazmazz/SRB2/releases/download/SRB2_assets_220/SRB2-v220-optional-assets.7z
# This is overridden to 1 for release tag builds # This is overridden to 1 for release tag builds
ASSET_FILES_OPTIONAL_GET: 0 ASSET_FILES_OPTIONAL_GET: 0
# For patches, also include the X86/X64 DLLs. # For patches, also include the X86/X64 DLLs.
PACKAGE_PATCH_DLL_GET: 0 PACKAGE_PATCH_DLL_GET: 0
# Delete all asset downloads so they can be redownloaded # Delete all asset downloads so they can be redownloaded
ASSET_CLEAN: 0 ASSET_CLEAN: 0
cache: cache:
- nasm-2.12.01.zip - nasm-2.12.01.zip
- upx391w.zip - upx391w.zip
- ccache.exe - ccache.exe
- C:\Users\appveyor\.ccache - C:\Users\appveyor\.ccache
- C:\Users\appveyor\srb2_cache - C:\Users\appveyor\srb2_cache
install: install:
- if [%CONFIGURATION%] == [SDL64] ( set "X86_64=1" ) - if [%CONFIGURATION%] == [SDL64] ( set "X86_64=1" )
- if [%CONFIGURATION%] == [SDL64] ( set "CONFIGURATION=SDL" ) - if [%CONFIGURATION%] == [SDL64] ( set "CONFIGURATION=SDL" )
- if [%CONFIGURATION%] == [DD64] ( set "X86_64=1" ) - if [%CONFIGURATION%] == [DD64] ( set "X86_64=1" )
- if [%CONFIGURATION%] == [DD64] ( set "CONFIGURATION=DD" ) - if [%CONFIGURATION%] == [DD64] ( set "CONFIGURATION=DD" )
- if [%X86_64%] == [1] ( set "MINGW_SDK=%MINGW_SDK_64%" ) - if [%X86_64%] == [1] ( set "MINGW_SDK=%MINGW_SDK_64%" )
- if [%X86_64%] == [1] ( set "CCACHE_CC=%CCACHE_CC_64%" ) - if [%X86_64%] == [1] ( set "CCACHE_CC=%CCACHE_CC_64%" )
- if not exist "%NASM_ZIP%.zip" appveyor DownloadFile "%NASM_URL%" -FileName "%NASM_ZIP%.zip" - if not exist "%NASM_ZIP%.zip" appveyor DownloadFile "%NASM_URL%" -FileName "%NASM_ZIP%.zip"
- 7z x -y "%NASM_ZIP%.zip" -o%TMP% >null - 7z x -y "%NASM_ZIP%.zip" -o%TMP% >null
- robocopy /S /xx /ns /nc /nfl /ndl /np /njh /njs "%TMP%\%NASM_ZIP%" "%MINGW_SDK%\bin" nasm.exe || exit 0 - robocopy /S /xx /ns /nc /nfl /ndl /np /njh /njs "%TMP%\%NASM_ZIP%" "%MINGW_SDK%\bin" nasm.exe || exit 0
- if not exist "%UPX_ZIP%.zip" appveyor DownloadFile "%UPX_URL%" -FileName "%UPX_ZIP%.zip" - if not exist "%UPX_ZIP%.zip" appveyor DownloadFile "%UPX_URL%" -FileName "%UPX_ZIP%.zip"
- 7z x -y "%UPX_ZIP%.zip" -o%TMP% >null - 7z x -y "%UPX_ZIP%.zip" -o%TMP% >null
- robocopy /S /xx /ns /nc /nfl /ndl /np /njh /njs "%TMP%\%UPX_ZIP%" "%MINGW_SDK%\bin" upx.exe || exit 0 - robocopy /S /xx /ns /nc /nfl /ndl /np /njh /njs "%TMP%\%UPX_ZIP%" "%MINGW_SDK%\bin" upx.exe || exit 0
- if not exist "%CCACHE_EXE%" appveyor DownloadFile "%CCACHE_URL%" -FileName "%CCACHE_EXE%" - if not exist "%CCACHE_EXE%" appveyor DownloadFile "%CCACHE_URL%" -FileName "%CCACHE_EXE%"
- ccache -M 99M - ccache -M 99M
- xcopy /Y /V /I ccache.exe "%MINGW_SDK%\bin" - xcopy /Y /V /I ccache.exe "%MINGW_SDK%\bin"
configuration: configuration:
- SDL - SDL
- SDL64 - SDL64
- DD - DD
- DD64 - DD64
matrix: matrix:
allow_failures: allow_failures:
- configuration: DD - configuration: DD
- configuration: DD64 - configuration: DD64
before_build: before_build:
- set "Path=%MINGW_SDK%\bin;%Path%" - set "Path=%MINGW_SDK%\bin;%Path%"
- if [%X86_64%] == [1] ( x86_64-w64-mingw32-gcc --version ) else ( i686-w64-mingw32-gcc --version ) - if [%X86_64%] == [1] ( x86_64-w64-mingw32-gcc --version ) else ( i686-w64-mingw32-gcc --version )
- mingw32-make --version - mingw32-make --version
- if not [%X86_64%] == [1] ( nasm -v ) - if not [%X86_64%] == [1] ( nasm -v )
- if not [%NOUPX%] == [1] ( upx -V ) - if not [%NOUPX%] == [1] ( upx -V )
- ccache -V - ccache -V
- ccache -s - ccache -s
- if [%NOUPX%] == [1] ( set "NOUPX=NOUPX=1" ) else ( set "NOUPX=" ) - if [%NOUPX%] == [1] ( set "NOUPX=NOUPX=1" ) else ( set "NOUPX=" )
- set "SRB2_MFLAGS=-C src WARNINGMODE=1 CCACHE=1 GCC73=1 NOOBJDUMP=1 %NOUPX%" - set "SRB2_MFLAGS=-C src WARNINGMODE=1 CCACHE=1 GCC73=1 NOOBJDUMP=1 %NOUPX%"
- if [%X86_64%] == [1] ( set "MINGW_FLAGS=MINGW64=1 X86_64=1" ) else ( set "MINGW_FLAGS=MINGW=1 GCC91=1" ) - if [%X86_64%] == [1] ( set "MINGW_FLAGS=MINGW64=1 X86_64=1" ) else ( set "MINGW_FLAGS=MINGW=1 GCC91=1" )
- set "SRB2_MFLAGS=%SRB2_MFLAGS% %MINGW_FLAGS% %CONFIGURATION%=1" - set "SRB2_MFLAGS=%SRB2_MFLAGS% %MINGW_FLAGS% %CONFIGURATION%=1"
build_script: build_script:
- cmd: mingw32-make.exe %SRB2_MFLAGS% clean - cmd: mingw32-make.exe %SRB2_MFLAGS% clean
- cmd: mingw32-make.exe %SRB2_MFLAGS% ERRORMODE=1 -k - cmd: mingw32-make.exe %SRB2_MFLAGS% ERRORMODE=1 -k
after_build: after_build:
- if [%X86_64%] == [1] ( - if [%X86_64%] == [1] (
set "BUILD_PATH=bin\Mingw64\Release" set "BUILD_PATH=bin\Mingw64\Release"
) else ( ) else (
set "BUILD_PATH=bin\Mingw\Release" set "BUILD_PATH=bin\Mingw\Release"
) )
- if [%X86_64%] == [1] ( set "CONFIGURATION=%CONFIGURATION%64" ) - if [%X86_64%] == [1] ( set "CONFIGURATION=%CONFIGURATION%64" )
- ccache -s - ccache -s
- cmd: git rev-parse --short %APPVEYOR_REPO_COMMIT%>%TMP%/gitshort.txt - cmd: git rev-parse --short %APPVEYOR_REPO_COMMIT%>%TMP%/gitshort.txt
- cmd: set /P GITSHORT=<%TMP%/gitshort.txt - cmd: set /P GITSHORT=<%TMP%/gitshort.txt
- set BUILD_ARCHIVE=%APPVEYOR_REPO_BRANCH%-%GITSHORT%-%CONFIGURATION%.7z - set BUILD_ARCHIVE=%APPVEYOR_REPO_BRANCH%-%GITSHORT%-%CONFIGURATION%.7z
- set BUILDSARCHIVE=%APPVEYOR_REPO_BRANCH%-%CONFIGURATION%.7z - set BUILDSARCHIVE=%APPVEYOR_REPO_BRANCH%-%CONFIGURATION%.7z
- cmd: 7z a %BUILD_ARCHIVE% %BUILD_PATH% -xr!.gitignore - cmd: 7z a %BUILD_ARCHIVE% %BUILD_PATH% -xr!.gitignore
- appveyor PushArtifact %BUILD_ARCHIVE% - appveyor PushArtifact %BUILD_ARCHIVE%
- cmd: copy %BUILD_ARCHIVE% %BUILDSARCHIVE% - cmd: copy %BUILD_ARCHIVE% %BUILDSARCHIVE%
- appveyor PushArtifact %BUILDSARCHIVE% - appveyor PushArtifact %BUILDSARCHIVE%
############################## ##############################
# DEPLOYER SCRIPT # DEPLOYER SCRIPT
############################## ##############################
- if [%DPL_ENABLED%] == [1] ( call "deployer\appveyor\deployer.bat" ) - if [%DPL_ENABLED%] == [1] ( call "deployer\appveyor\deployer.bat" )
test: off test: off
#deploy: #deploy:
# - provider: FTP # - provider: FTP
# protocol: ftps # protocol: ftps
# host: # host:
# secure: NsLJEPIBvmwCOj8Tg8RoRQ== # secure: NsLJEPIBvmwCOj8Tg8RoRQ==
# username: # username:
# secure: ejxi5mvk7oLYu7QtbYojajEPigMy0mokaKhuEVuDZcA= # secure: ejxi5mvk7oLYu7QtbYojajEPigMy0mokaKhuEVuDZcA=
# password: # password:
# secure: Hbn6Uy3lT0YZ88yFJ3aW4w== # secure: Hbn6Uy3lT0YZ88yFJ3aW4w==
# folder: appveyor # folder: appveyor
# application: # application:
# active_mode: false # active_mode: false
# on: # on:
# branch: master # branch: master
# appveyor_repo_tag: true # appveyor_repo_tag: true
on_finish: on_finish:
#- cmd: echo xfreerdp /u:appveyor /cert-ignore +clipboard /v:<ip>:<port> #- cmd: echo xfreerdp /u:appveyor /cert-ignore +clipboard /v:<ip>:<port>
#- ps: $blockRdp = $true; iex ((new-object net.webclient).DownloadString('https://raw.githubusercontent.com/appveyor/ci/master/scripts/enable-rdp.ps1')) #- ps: $blockRdp = $true; iex ((new-object net.webclient).DownloadString('https://raw.githubusercontent.com/appveyor/ci/master/scripts/enable-rdp.ps1'))

View File

@ -12,6 +12,10 @@ ENDFUNCTION(PREPEND)
set(SRB2_ASSET_DIRECTORY "${CMAKE_CURRENT_SOURCE_DIR}/installer" set(SRB2_ASSET_DIRECTORY "${CMAKE_CURRENT_SOURCE_DIR}/installer"
CACHE STRING "Path to directory that contains all asset files for the installer.") CACHE STRING "Path to directory that contains all asset files for the installer.")
####################
# POST-V2.2 NOTE: Do not forget to add patch.pk3 to the end of this list!
####################
set(SRB2_ASSET_HASHED set(SRB2_ASSET_HASHED
"srb2.pk3;\ "srb2.pk3;\
player.dta;\ player.dta;\
@ -22,7 +26,8 @@ zones.pk3"
set(SRB2_ASSET_DOCS set(SRB2_ASSET_DOCS
"README.txt;\ "README.txt;\
LICENSE.txt;\ LICENSE.txt;\
LICENSE-3RD-PARTY.txt" LICENSE-3RD-PARTY.txt;\
README-SDL.txt"
CACHE STRING "Documentation filenames. In OS X, these are packaged separately from other assets. No spaces between entries!" CACHE STRING "Documentation filenames. In OS X, these are packaged separately from other assets. No spaces between entries!"
) )

View File

@ -10,6 +10,7 @@ Build-Depends: debhelper (>= 7.0.50~),
libpng-dev | libpng16-dev | libpng12-dev (>= 1.2.7), libpng-dev | libpng16-dev | libpng12-dev (>= 1.2.7),
zlib1g-dev, zlib1g-dev,
libgme-dev, libgme-dev,
libopenmpt-dev,
libglu1-dev | libglu-dev, libglu1-dev | libglu-dev,
libosmesa6-dev | libgl-dev, libosmesa6-dev | libgl-dev,
nasm [i386] nasm [i386]
@ -24,6 +25,7 @@ Depends: ${SHLIBS_DEPENDS}, ${MISC_DEPENDS},
libsdl2-mixer-2.0-0, libsdl2-mixer-2.0-0,
zlib1g, zlib1g,
libgme0, libgme0,
libopenmpt | libopenmpt0,
libpng | libpng16-16 | libpng12-0 libpng | libpng16-16 | libpng12-0
Description: A cross-platform 3D Sonic fangame Description: A cross-platform 3D Sonic fangame
Sonic Robo Blast 2 is a 3D open-source Sonic the Hedgehog Sonic Robo Blast 2 is a 3D open-source Sonic the Hedgehog

View File

@ -27,10 +27,10 @@
: ${_DPL_PACKAGE_ASSET} # Build asset installation package. Linux only. : ${_DPL_PACKAGE_ASSET} # Build asset installation package. Linux only.
# Asset File Parameters # Asset File Parameters
: ${ASSET_ARCHIVE_PATH:=https://github.com/mazmazz/SRB2/releases/download/SRB2_assets/SRB2-v2122-assets.7z} : ${ASSET_ARCHIVE_PATH:=https://github.com/mazmazz/SRB2/releases/download/SRB2_assets_220/SRB2-v220-assets.7z}
: ${ASSET_ARCHIVE_OPTIONAL_PATH:=https://github.com/mazmazz/SRB2/releases/download/SRB2_assets/SRB2-v2122-optional-assets.7z} : ${ASSET_ARCHIVE_OPTIONAL_PATH:=https://github.com/mazmazz/SRB2/releases/download/SRB2_assets_220/SRB2-v220-optional-assets.7z}
: ${ASSET_FILES_HASHED:=srb2.srb zones.dta player.dta rings.dta patch.dta} : ${ASSET_FILES_HASHED:=srb2.pk3 zones.pk3 player.dta} # POST v2.2 NOTE: Don't forget to add patch.pk3!
: ${ASSET_FILES_DOCS:=README.txt LICENSE.txt LICENSE-3RD-PARTY.txt} : ${ASSET_FILES_DOCS:=README.txt LICENSE.txt LICENSE-3RD-PARTY.txt README-SDL.txt}
: ${ASSET_FILES_OPTIONAL_GET:=0} : ${ASSET_FILES_OPTIONAL_GET:=0}
# FTP Parameters # FTP Parameters
@ -51,7 +51,7 @@
# Package Parameters # Package Parameters
: ${PACKAGE_NAME:=srb2} : ${PACKAGE_NAME:=srb2}
: ${PACKAGE_VERSION:=2.1.23} : ${PACKAGE_VERSION:=2.2.0}
: ${PACKAGE_SUBVERSION} # Highly recommended to set this to reflect the distro series target (e.g., ~18.04bionic) : ${PACKAGE_SUBVERSION} # Highly recommended to set this to reflect the distro series target (e.g., ~18.04bionic)
: ${PACKAGE_REVISION} # Defaults to UTC timestamp : ${PACKAGE_REVISION} # Defaults to UTC timestamp
: ${PACKAGE_INSTALL_PATH:=/usr/games/SRB2} : ${PACKAGE_INSTALL_PATH:=/usr/games/SRB2}
@ -62,12 +62,12 @@
: ${PACKAGE_GROUP_NAME_EMAIL:=Sonic Team Junior <stjr@srb2.org>} : ${PACKAGE_GROUP_NAME_EMAIL:=Sonic Team Junior <stjr@srb2.org>}
: ${PACKAGE_WEBSITE:=<http://www.srb2.org>} : ${PACKAGE_WEBSITE:=<http://www.srb2.org>}
: ${PACKAGE_ASSET_MINVERSION:=2.1.21} # Number this the version BEFORE the actual required version, because we do a > check : ${PACKAGE_ASSET_MINVERSION:=2.1.26} # Number this the version BEFORE the actual required version, because we do a > check
: ${PACKAGE_ASSET_MAXVERSION:=2.1.24} # Number this the version AFTER the actual required version, because we do a < check : ${PACKAGE_ASSET_MAXVERSION:=2.2.1} # Number this the version AFTER the actual required version, because we do a < check
: ${PROGRAM_NAME:=Sonic Robo Blast 2} : ${PROGRAM_NAME:=Sonic Robo Blast 2}
: ${PROGRAM_VENDOR:=Sonic Team Junior} : ${PROGRAM_VENDOR:=Sonic Team Junior}
: ${PROGRAM_VERSION:=2.1.23} : ${PROGRAM_VERSION:=2.2.0}
: ${PROGRAM_DESCRIPTION:=A free 3D Sonic the Hedgehog fangame closely inspired by the original Sonic games on the Sega Genesis.} : ${PROGRAM_DESCRIPTION:=A free 3D Sonic the Hedgehog fangame closely inspired by the original Sonic games on the Sega Genesis.}
: ${PROGRAM_FILENAME:=srb2} : ${PROGRAM_FILENAME:=srb2}

View File

@ -690,9 +690,9 @@ linedeftypes
title = "Chain Parameters"; title = "Chain Parameters";
prefix = "(9)"; prefix = "(9)";
flags32text = "[5] Swing instead of spin"; flags32text = "[5] Swing instead of spin";
flags128text = "[7] Make chain from end item";
flags64text = "[6] Player-turnable chain"; flags64text = "[6] Player-turnable chain";
flags128text = "[7] Make chain from maces"; flags256text = "[8] Spawn link at origin";
flags256text = "[8] Spawn mace at origin";
flags512text = "[9] Don't clip inside ground"; flags512text = "[9] Don't clip inside ground";
flags1024text = "[10] No distance check"; flags1024text = "[10] No distance check";
} }
@ -3389,14 +3389,14 @@ thingtypes
} }
118 118
{ {
title = "CastleBot FaceStabber"; title = "Lance-a-Bot";
sprite = "CBFSA1"; sprite = "CBFSA1";
width = 32; width = 32;
height = 72; height = 72;
} }
1113 1113
{ {
title = "Suspicious FaceStabber Statue"; title = "Suspicious Lance-a-Bot Statue";
sprite = "CBBSA1"; sprite = "CBBSA1";
width = 32; width = 32;
height = 72; height = 72;
@ -5006,7 +5006,7 @@ thingtypes
{ {
arrow = 1; arrow = 1;
blocking = 2; blocking = 2;
title = "FaceStabber Statue"; title = "Lance-a-Bot Statue";
sprite = "CBBSA1"; sprite = "CBBSA1";
width = 32; width = 32;
height = 72; height = 72;

View File

@ -518,10 +518,6 @@ add_definitions(-DCMAKECONFIG)
add_subdirectory(sdl) add_subdirectory(sdl)
if(${CMAKE_SYSTEM} MATCHES Windows) if(NOT ${SRB2_SDL2_AVAILABLE})
add_subdirectory(win32)
endif()
if(NOT ${SRB2_SDL2_AVAILABLE} AND NOT ${SRB2_WIN32_AVAILABLE})
message(FATAL_ERROR "There are no targets available to build an SRB2 executable. :(") message(FATAL_ERROR "There are no targets available to build an SRB2 executable. :(")
endif() endif()

View File

@ -70,7 +70,7 @@
boolean server = true; // true or false but !server == client boolean server = true; // true or false but !server == client
#define client (!server) #define client (!server)
boolean nodownload = false; boolean nodownload = false;
static boolean serverrunning = false; boolean serverrunning = false;
INT32 serverplayer = 0; INT32 serverplayer = 0;
char motd[254], server_context[8]; // Message of the Day, Unique Context (even without Mumble support) char motd[254], server_context[8]; // Message of the Day, Unique Context (even without Mumble support)
@ -1301,6 +1301,8 @@ static void SV_SendServerInfo(INT32 node, tic_t servertime)
M_Memcpy(netbuffer->u.serverinfo.mapmd5, mapmd5, 16); M_Memcpy(netbuffer->u.serverinfo.mapmd5, mapmd5, 16);
memset(netbuffer->u.serverinfo.maptitle, 0, sizeof netbuffer->u.serverinfo.maptitle);
if (mapheaderinfo[gamemap-1] && *mapheaderinfo[gamemap-1]->lvlttl) if (mapheaderinfo[gamemap-1] && *mapheaderinfo[gamemap-1]->lvlttl)
{ {
char *read = mapheaderinfo[gamemap-1]->lvlttl, *writ = netbuffer->u.serverinfo.maptitle; char *read = mapheaderinfo[gamemap-1]->lvlttl, *writ = netbuffer->u.serverinfo.maptitle;
@ -1319,8 +1321,6 @@ static void SV_SendServerInfo(INT32 node, tic_t servertime)
else else
strncpy(netbuffer->u.serverinfo.maptitle, "UNKNOWN", 32); strncpy(netbuffer->u.serverinfo.maptitle, "UNKNOWN", 32);
netbuffer->u.serverinfo.maptitle[32] = '\0';
if (mapheaderinfo[gamemap-1] && !(mapheaderinfo[gamemap-1]->levelflags & LF_NOZONE)) if (mapheaderinfo[gamemap-1] && !(mapheaderinfo[gamemap-1]->levelflags & LF_NOZONE))
netbuffer->u.serverinfo.iszone = 1; netbuffer->u.serverinfo.iszone = 1;
else else

View File

@ -274,7 +274,10 @@ static void D_Display(void)
&& wipetypepre != UINT8_MAX) && wipetypepre != UINT8_MAX)
{ {
F_WipeStartScreen(); F_WipeStartScreen();
F_WipeColorFill(31); // Check for Mega Genesis fade
wipestyleflags = WSF_FADEOUT;
if (F_TryColormapFade(31))
wipetypepost = -1; // Don't run the fade below this one
F_WipeEndScreen(); F_WipeEndScreen();
F_RunWipe(wipetypepre, gamestate != GS_TIMEATTACK && gamestate != GS_TITLESCREEN); F_RunWipe(wipetypepre, gamestate != GS_TIMEATTACK && gamestate != GS_TITLESCREEN);
} }
@ -488,6 +491,7 @@ static void D_Display(void)
if (rendermode != render_none) if (rendermode != render_none)
{ {
F_WipeEndScreen(); F_WipeEndScreen();
// Funny. // Funny.
if (WipeStageTitle && st_overlay) if (WipeStageTitle && st_overlay)
{ {
@ -497,6 +501,14 @@ static void D_Display(void)
V_DrawFill(0, 0, BASEVIDWIDTH, BASEVIDHEIGHT, levelfadecol); V_DrawFill(0, 0, BASEVIDWIDTH, BASEVIDHEIGHT, levelfadecol);
F_WipeStartScreen(); F_WipeStartScreen();
} }
// Check for Mega Genesis fade
if (F_ShouldColormapFade())
{
wipestyleflags |= WSF_FADEIN;
wipestyleflags &= ~WSF_FADEOUT;
}
F_RunWipe(wipetypepost, gamestate != GS_TIMEATTACK && gamestate != GS_TITLESCREEN); F_RunWipe(wipetypepost, gamestate != GS_TIMEATTACK && gamestate != GS_TITLESCREEN);
} }
@ -562,9 +574,6 @@ void D_SRB2Loop(void)
// Pushing of + parameters is now done back in D_SRB2Main, not here. // Pushing of + parameters is now done back in D_SRB2Main, not here.
CONS_Printf("I_StartupKeyboard()...\n");
I_StartupKeyboard();
#ifdef _WINDOWS #ifdef _WINDOWS
CONS_Printf("I_StartupMouse()...\n"); CONS_Printf("I_StartupMouse()...\n");
I_DoStartupMouse(); I_DoStartupMouse();
@ -1193,6 +1202,13 @@ void D_SRB2Main(void)
CONS_Printf("I_StartupGraphics()...\n"); CONS_Printf("I_StartupGraphics()...\n");
I_StartupGraphics(); I_StartupGraphics();
#ifdef HWRENDER
// Lactozilla: Add every hardware mode CVAR and CCMD.
// Has to be done before the configuration file loads,
// but after the OpenGL library loads.
HWR_AddCommands();
#endif
//--------------------------------------------------------- CONSOLE //--------------------------------------------------------- CONSOLE
// setup loading screen // setup loading screen
SCR_Startup(); SCR_Startup();
@ -1281,9 +1297,10 @@ void D_SRB2Main(void)
I_StartupSound(); I_StartupSound();
I_InitMusic(); I_InitMusic();
S_InitSfxChannels(cv_soundvolume.value); S_InitSfxChannels(cv_soundvolume.value);
S_InitMusicDefs();
} }
S_InitMusicDefs();
CONS_Printf("ST_Init(): Init status bar.\n"); CONS_Printf("ST_Init(): Init status bar.\n");
ST_Init(); ST_Init();

View File

@ -40,6 +40,8 @@ extern SINT8 nodetoplayer2[MAXNETNODES]; // Say the numplayer for this node if a
extern UINT8 playerpernode[MAXNETNODES]; // Used specially for splitscreen extern UINT8 playerpernode[MAXNETNODES]; // Used specially for splitscreen
extern boolean nodeingame[MAXNETNODES]; // Set false as nodes leave game extern boolean nodeingame[MAXNETNODES]; // Set false as nodes leave game
extern boolean serverrunning;
INT32 Net_GetFreeAcks(boolean urgent); INT32 Net_GetFreeAcks(boolean urgent);
void Net_AckTicker(void); void Net_AckTicker(void);

View File

@ -1931,7 +1931,7 @@ static void Command_Map_f(void)
} }
} }
if (newmapnum == 0 || !mapheaderinfo[newmapnum-1]) if (newmapnum == 0)
{ {
CONS_Alert(CONS_ERROR, M_GetText("Could not find any map described as '%s'.\n"), mapname); CONS_Alert(CONS_ERROR, M_GetText("Could not find any map described as '%s'.\n"), mapname);
Z_Free(mapname); Z_Free(mapname);

View File

@ -242,6 +242,7 @@ INT32 flags; Bits = 3232 MF_SOLID|MF_SHOOTABLE|MF_DROPOFF|M
INT32 raisestate; Respawn frame = 32 S_NULL // raisestate INT32 raisestate; Respawn frame = 32 S_NULL // raisestate
}, */ }, */
#ifdef HWRENDER
static INT32 searchvalue(const char *s) static INT32 searchvalue(const char *s)
{ {
while (s[0] != '=' && s[0]) while (s[0] != '=' && s[0])
@ -255,7 +256,6 @@ static INT32 searchvalue(const char *s)
} }
} }
#ifdef HWRENDER
static float searchfvalue(const char *s) static float searchfvalue(const char *s)
{ {
while (s[0] != '=' && s[0]) while (s[0] != '=' && s[0])
@ -886,7 +886,9 @@ static void readspriteinfo(MYFILE *f, INT32 num, boolean sprite2)
char *s = Z_Malloc(MAXLINELEN, PU_STATIC, NULL); char *s = Z_Malloc(MAXLINELEN, PU_STATIC, NULL);
char *word, *word2; char *word, *word2;
char *tmp; char *tmp;
#ifdef HWRENDER
INT32 value; INT32 value;
#endif
char *lastline; char *lastline;
INT32 skinnumbers[MAXSKINS]; INT32 skinnumbers[MAXSKINS];
INT32 foundskins = 0; INT32 foundskins = 0;
@ -947,9 +949,9 @@ static void readspriteinfo(MYFILE *f, INT32 num, boolean sprite2)
break; break;
} }
strupr(word); strupr(word);
#ifdef HWRENDER
value = atoi(word2); // used for numerical settings value = atoi(word2); // used for numerical settings
#ifdef HWRENDER
if (fastcmp(word, "LIGHTTYPE")) if (fastcmp(word, "LIGHTTYPE"))
{ {
if (sprite2) if (sprite2)
@ -4460,20 +4462,34 @@ static void DEH_LoadDehackedFile(MYFILE *f, boolean mainfile)
ignorelines(f); ignorelines(f);
} }
} }
// Last I heard this crashes the game if you try to use it else if (fastcmp(word, "SRB2"))
// so this is disabled for now
// -- Monster Iestyn
/* else if (fastcmp(word, "SRB2"))
{ {
INT32 ver = searchvalue(strtok(NULL, "\n")); if (isdigit(word2[0]))
if (ver != PATCHVERSION) {
deh_warning("Patch is for SRB2 version %d,\nonly version %d is supported", ver, PATCHVERSION); i = atoi(word2);
if (i != PATCHVERSION)
{
deh_warning(
"Patch is for SRB2 version %d, "
"only version %d is supported",
i,
PATCHVERSION
);
}
}
else
{
deh_warning(
"SRB2 version definition has incorrect format, "
"use \"SRB2 %d\"",
PATCHVERSION
);
}
} }
// Clear all data in certain locations (mostly for unlocks) // Clear all data in certain locations (mostly for unlocks)
// Unless you REALLY want to piss people off, // Unless you REALLY want to piss people off,
// define a custom gamedata /before/ doing this!! // define a custom gamedata /before/ doing this!!
// (then again, modifiedgame will prevent game data saving anyway) // (then again, modifiedgame will prevent game data saving anyway)
*/
else if (fastcmp(word, "CLEAR")) else if (fastcmp(word, "CLEAR"))
{ {
boolean clearall = (fastcmp(word2, "ALL")); boolean clearall = (fastcmp(word2, "ALL"));

View File

@ -47,7 +47,7 @@ extern const char *superactions[MAXRECURSION];
extern UINT8 superstack; extern UINT8 superstack;
// If the dehacked patch does not match this version, we throw a warning // If the dehacked patch does not match this version, we throw a warning
#define PATCHVERSION 210 #define PATCHVERSION 220
#define MAXLINELEN 1024 #define MAXLINELEN 1024

View File

@ -127,6 +127,7 @@
#ifdef LOGMESSAGES #ifdef LOGMESSAGES
extern FILE *logstream; extern FILE *logstream;
extern char logfilename[1024];
#endif #endif
//#define DEVELOP // Disable this for release builds to remove excessive cheat commands and enable MD5 checking and stuff, all in one go. :3 //#define DEVELOP // Disable this for release builds to remove excessive cheat commands and enable MD5 checking and stuff, all in one go. :3
@ -628,8 +629,12 @@ extern const char *compdate, *comptime, *comprevision, *compbranch;
#define ROTANGLES 24 // Needs to be a divisor of 360 (45, 60, 90, 120...) #define ROTANGLES 24 // Needs to be a divisor of 360 (45, 60, 90, 120...)
#define ROTANGDIFF (360 / ROTANGLES) #define ROTANGDIFF (360 / ROTANGLES)
/// PNG support
#ifndef HAVE_PNG #ifndef HAVE_PNG
#define NO_PNG_LUMPS #define NO_PNG_LUMPS
#endif #endif
/// Render flats on walls
#define WALLFLATS
#endif // __DOOMDEF__ #endif // __DOOMDEF__

View File

@ -917,8 +917,9 @@ void F_IntroDrawer(void)
{ {
if (rendermode != render_none) if (rendermode != render_none)
{ {
wipestyleflags = WSF_FADEOUT;
F_WipeStartScreen(); F_WipeStartScreen();
F_WipeColorFill(31); F_TryColormapFade(31);
F_WipeEndScreen(); F_WipeEndScreen();
F_RunWipe(99,true); F_RunWipe(99,true);
} }
@ -927,12 +928,11 @@ void F_IntroDrawer(void)
} }
else if (intro_scenenum == 10) else if (intro_scenenum == 10)
{ {
// The only fade to white in the entire damn game.
// (not true)
if (rendermode != render_none) if (rendermode != render_none)
{ {
wipestyleflags = (WSF_FADEOUT|WSF_TOWHITE);
F_WipeStartScreen(); F_WipeStartScreen();
F_WipeColorFill(0); F_TryColormapFade(0);
F_WipeEndScreen(); F_WipeEndScreen();
F_RunWipe(99,true); F_RunWipe(99,true);
} }
@ -941,8 +941,9 @@ void F_IntroDrawer(void)
{ {
if (rendermode != render_none) if (rendermode != render_none)
{ {
wipestyleflags = WSF_FADEOUT;
F_WipeStartScreen(); F_WipeStartScreen();
F_WipeColorFill(31); F_TryColormapFade(31);
F_WipeEndScreen(); F_WipeEndScreen();
F_RunWipe(99,true); F_RunWipe(99,true);
} }
@ -977,6 +978,7 @@ void F_IntroDrawer(void)
F_WipeStartScreen(); F_WipeStartScreen();
wipegamestate = -1; wipegamestate = -1;
wipestyleflags = WSF_CROSSFADE;
animtimer = stoptimer = 0; animtimer = stoptimer = 0;
} }
@ -3596,6 +3598,8 @@ void F_StartContinue(void)
return; return;
} }
wipestyleflags = WSF_FADEOUT;
F_TryColormapFade(31);
G_SetGamestate(GS_CONTINUING); G_SetGamestate(GS_CONTINUING);
gameaction = ga_nothing; gameaction = ga_nothing;

View File

@ -146,7 +146,7 @@ extern boolean WipeStageTitle;
typedef enum typedef enum
{ {
WIPESTYLE_NORMAL, WIPESTYLE_NORMAL,
WIPESTYLE_LEVEL WIPESTYLE_COLORMAP
} wipestyle_t; } wipestyle_t;
extern wipestyle_t wipestyle; extern wipestyle_t wipestyle;
@ -159,6 +159,11 @@ typedef enum
} wipestyleflags_t; } wipestyleflags_t;
extern wipestyleflags_t wipestyleflags; extern wipestyleflags_t wipestyleflags;
// Even my function names are borderline
boolean F_ShouldColormapFade(void);
boolean F_TryColormapFade(UINT8 wipecolor);
void F_DecideWipeStyle(void);
#define FADECOLORMAPDIV 8 #define FADECOLORMAPDIV 8
#define FADECOLORMAPROWS (256/FADECOLORMAPDIV) #define FADECOLORMAPROWS (256/FADECOLORMAPDIV)

View File

@ -56,7 +56,7 @@ UINT8 wipedefs[NUMWIPEDEFS] = {
0, // wipe_level_toblack 0, // wipe_level_toblack
UINT8_MAX, // wipe_intermission_toblack UINT8_MAX, // wipe_intermission_toblack
UINT8_MAX, // wipe_continuing_toblack 0, // wipe_continuing_toblack
0, // wipe_titlescreen_toblack 0, // wipe_titlescreen_toblack
0, // wipe_timeattack_toblack 0, // wipe_timeattack_toblack
99, // wipe_credits_toblack 99, // wipe_credits_toblack
@ -161,7 +161,7 @@ static fademask_t *F_GetFadeMask(UINT8 masknum, UINT8 scrnnum) {
{ {
// Determine pixel to use from fademask // Determine pixel to use from fademask
pcolor = &pMasterPalette[*lump++]; pcolor = &pMasterPalette[*lump++];
if (wipestyle == WIPESTYLE_LEVEL) if (wipestyle == WIPESTYLE_COLORMAP)
*mask++ = pcolor->s.red / FADECOLORMAPDIV; *mask++ = pcolor->s.red / FADECOLORMAPDIV;
else else
*mask++ = FixedDiv((pcolor->s.red+1)<<FRACBITS, paldiv)>>FRACBITS; *mask++ = FixedDiv((pcolor->s.red+1)<<FRACBITS, paldiv)>>FRACBITS;
@ -191,7 +191,7 @@ void F_WipeStageTitle(void)
{ {
// draw level title // draw level title
if ((WipeStageTitle && st_overlay) if ((WipeStageTitle && st_overlay)
&& (wipestyle == WIPESTYLE_LEVEL) && (wipestyle == WIPESTYLE_COLORMAP)
&& !(mapheaderinfo[gamemap-1]->levelflags & LF_NOTITLECARD) && !(mapheaderinfo[gamemap-1]->levelflags & LF_NOTITLECARD)
&& *mapheaderinfo[gamemap-1]->lvlttl != '\0') && *mapheaderinfo[gamemap-1]->lvlttl != '\0')
{ {
@ -282,7 +282,7 @@ static void F_DoWipe(fademask_t *fademask)
relativepos += vid.width; relativepos += vid.width;
} }
} }
else if (*mask >= ((wipestyle == WIPESTYLE_LEVEL) ? FADECOLORMAPROWS : 10)) else if (*mask >= 10)
{ {
// shortcut - memcpy target to work // shortcut - memcpy target to work
while (draw_linestogo--) while (draw_linestogo--)
@ -293,25 +293,8 @@ static void F_DoWipe(fademask_t *fademask)
} }
else else
{ {
if (wipestyle == WIPESTYLE_LEVEL) // pointer to transtable that this mask would use
{ transtbl = transtables + ((9 - *mask)<<FF_TRANSSHIFT);
int nmask;
UINT8 *fade = fadecolormap;
if (wipestyleflags & WSF_TOWHITE)
fade = fadecolormap + (FADECOLORMAPROWS * 256);
nmask = *mask;
if (wipestyleflags & WSF_FADEIN)
nmask = (FADECOLORMAPROWS-1) - nmask;
transtbl = fade + (nmask * 256);
}
else
{
// pointer to transtable that this mask would use
transtbl = transtables + ((9 - *mask)<<FF_TRANSSHIFT);
}
// DRAWING LOOP // DRAWING LOOP
while (draw_linestogo--) while (draw_linestogo--)
@ -321,16 +304,113 @@ static void F_DoWipe(fademask_t *fademask)
e = e_base + relativepos; e = e_base + relativepos;
draw_rowstogo = draw_rowend - draw_rowstart; draw_rowstogo = draw_rowend - draw_rowstart;
if (wipestyle == WIPESTYLE_LEVEL) while (draw_rowstogo--)
{ *w++ = transtbl[ ( *e++ << 8 ) + *s++ ];
while (draw_rowstogo--)
*w++ = transtbl[*e++]; relativepos += vid.width;
} }
else // END DRAWING LOOP
{ }
while (draw_rowstogo--)
*w++ = transtbl[ ( *e++ << 8 ) + *s++ ]; if (++maskx >= fademask->width)
} ++masky, maskx = 0;
} while (++mask < maskend);
free(scrxpos);
free(scrypos);
}
}
static void F_DoColormapWipe(fademask_t *fademask, UINT8 *colormap)
{
// Lactozilla: F_DoWipe for WIPESTYLE_COLORMAP
{
// wipe screen, start, end
UINT8 *w = wipe_scr;
const UINT8 *s = wipe_scr_start;
const UINT8 *e = wipe_scr_end;
// first pixel for each screen
UINT8 *w_base = w;
const UINT8 *s_base = s;
const UINT8 *e_base = e;
// mask data, end
UINT8 *transtbl;
const UINT8 *mask = fademask->mask;
const UINT8 *maskend = mask + fademask->size;
// rectangle draw hints
UINT32 draw_linestart, draw_rowstart;
UINT32 draw_lineend, draw_rowend;
UINT32 draw_linestogo, draw_rowstogo;
// rectangle coordinates, etc.
UINT16* scrxpos = (UINT16*)malloc((fademask->width + 1) * sizeof(UINT16));
UINT16* scrypos = (UINT16*)malloc((fademask->height + 1) * sizeof(UINT16));
UINT16 maskx, masky;
UINT32 relativepos;
// ---
// Screw it, we do the fixed point math ourselves up front.
scrxpos[0] = 0;
for (relativepos = 0, maskx = 1; maskx < fademask->width; ++maskx)
scrxpos[maskx] = (relativepos += fademask->xscale)>>FRACBITS;
scrxpos[fademask->width] = vid.width;
scrypos[0] = 0;
for (relativepos = 0, masky = 1; masky < fademask->height; ++masky)
scrypos[masky] = (relativepos += fademask->yscale)>>FRACBITS;
scrypos[fademask->height] = vid.height;
// ---
maskx = masky = 0;
do
{
draw_rowstart = scrxpos[maskx];
draw_rowend = scrxpos[maskx + 1];
draw_linestart = scrypos[masky];
draw_lineend = scrypos[masky + 1];
relativepos = (draw_linestart * vid.width) + draw_rowstart;
draw_linestogo = draw_lineend - draw_linestart;
if (*mask == 0)
{
// shortcut - memcpy source to work
while (draw_linestogo--)
{
M_Memcpy(w_base+relativepos, s_base+relativepos, draw_rowend-draw_rowstart);
relativepos += vid.width;
}
}
else if (*mask >= FADECOLORMAPROWS)
{
// shortcut - memcpy target to work
while (draw_linestogo--)
{
M_Memcpy(w_base+relativepos, e_base+relativepos, draw_rowend-draw_rowstart);
relativepos += vid.width;
}
}
else
{
int nmask = *mask;
if (wipestyleflags & WSF_FADEIN)
nmask = (FADECOLORMAPROWS-1) - nmask;
transtbl = colormap + (nmask * 256);
// DRAWING LOOP
while (draw_linestogo--)
{
w = w_base + relativepos;
s = s_base + relativepos;
e = e_base + relativepos;
draw_rowstogo = draw_rowend - draw_rowstart;
while (draw_rowstogo--)
*w++ = transtbl[*e++];
relativepos += vid.width; relativepos += vid.width;
} }
@ -382,6 +462,62 @@ void F_WipeEndScreen(void)
#endif #endif
} }
/** Verifies every condition for a colormapped fade.
*/
boolean F_ShouldColormapFade(void)
{
if ((wipestyleflags & (WSF_FADEIN|WSF_FADEOUT)) // only if one of those wipestyleflags are actually set
&& !(wipestyleflags & WSF_CROSSFADE)) // and if not crossfading
{
// World
return (gamestate == GS_LEVEL
|| gamestate == GS_TITLESCREEN
// Finales
|| gamestate == GS_CONTINUING
|| gamestate == GS_CREDITS
|| gamestate == GS_EVALUATION
|| gamestate == GS_INTRO
|| gamestate == GS_ENDING
// Menus
|| gamestate == GS_TIMEATTACK);
}
return false;
}
/** Decides what wipe style to use.
*/
void F_DecideWipeStyle(void)
{
// Set default wipe style
wipestyle = WIPESTYLE_NORMAL;
// Check for colormap wipe style
if (F_ShouldColormapFade())
wipestyle = WIPESTYLE_COLORMAP;
}
/** Attempt to run a colormap fade,
provided all the conditionals were properly met.
Returns true if so.
I demand you call F_RunWipe after this function.
*/
boolean F_TryColormapFade(UINT8 wipecolor)
{
if (F_ShouldColormapFade())
{
#ifdef HWRENDER
if (rendermode == render_opengl)
F_WipeColorFill(wipecolor);
#endif
return true;
}
else
{
F_WipeColorFill(wipecolor);
return false;
}
}
/** After setting up the screens you want to wipe, /** After setting up the screens you want to wipe,
* calling this will do a 'typical' wipe. * calling this will do a 'typical' wipe.
*/ */
@ -399,18 +535,10 @@ void F_RunWipe(UINT8 wipetype, boolean drawMenu)
paldiv = FixedDiv(257<<FRACBITS, 11<<FRACBITS); paldiv = FixedDiv(257<<FRACBITS, 11<<FRACBITS);
// Init the wipe // Init the wipe
F_DecideWipeStyle();
WipeInAction = true; WipeInAction = true;
wipe_scr = screens[0]; wipe_scr = screens[0];
// don't know where else to put this.
// this any good?
if ((gamestate == GS_LEVEL || gamestate == GS_TITLESCREEN)
&& (wipestyleflags & (WSF_FADEIN|WSF_FADEOUT)) // only if one of those wipestyleflags are actually set
&& !(wipestyleflags & WSF_CROSSFADE)) // and if not crossfading
wipestyle = WIPESTYLE_LEVEL;
else
wipestyle = WIPESTYLE_NORMAL;
// lastwipetic should either be 0 or the tic we last wiped // lastwipetic should either be 0 or the tic we last wiped
// on for fade-to-black // on for fade-to-black
for (;;) for (;;)
@ -425,21 +553,39 @@ void F_RunWipe(UINT8 wipetype, boolean drawMenu)
I_Sleep(); I_Sleep();
lastwipetic = nowtime; lastwipetic = nowtime;
#ifdef HWRENDER // Wipe styles
if (rendermode == render_opengl) if (wipestyle == WIPESTYLE_COLORMAP)
{ {
// send in the wipe type and wipe frame because we need to cache the graphic #ifdef HWRENDER
if (wipestyle == WIPESTYLE_LEVEL) if (rendermode == render_opengl)
{
// send in the wipe type and wipe frame because we need to cache the graphic
HWR_DoTintedWipe(wipetype, wipeframe-1); HWR_DoTintedWipe(wipetype, wipeframe-1);
}
else else
HWR_DoWipe(wipetype, wipeframe-1); #endif
{
UINT8 *colormap = fadecolormap;
if (wipestyleflags & WSF_TOWHITE)
colormap += (FADECOLORMAPROWS * 256);
F_DoColormapWipe(fmask, colormap);
}
// Draw the title card above the wipe
F_WipeStageTitle();
} }
else else
{
#ifdef HWRENDER
if (rendermode == render_opengl)
{
// send in the wipe type and wipe frame because we need to cache the graphic
HWR_DoWipe(wipetype, wipeframe-1);
}
else
#endif #endif
F_DoWipe(fmask); F_DoWipe(fmask);
}
if (wipestyle == WIPESTYLE_LEVEL)
F_WipeStageTitle();
I_OsPolling(); I_OsPolling();
I_UpdateNoBlit(); I_UpdateNoBlit();

View File

@ -275,6 +275,12 @@ static UINT8 *metalbuffer = NULL;
static UINT8 *metal_p; static UINT8 *metal_p;
static UINT16 metalversion; static UINT16 metalversion;
typedef struct joystickvector2_s
{
INT32 xaxis;
INT32 yaxis;
} joystickvector2_t;
// extra data stuff (events registered this frame while recording) // extra data stuff (events registered this frame while recording)
static struct { static struct {
UINT8 flags; // EZT flags UINT8 flags; // EZT flags
@ -453,7 +459,6 @@ typedef enum
AXISMOVE, AXISMOVE,
AXISLOOK, AXISLOOK,
AXISSTRAFE, AXISSTRAFE,
AXISDEAD, //Axises that don't want deadzones
AXISJUMP, AXISJUMP,
AXISSPIN, AXISSPIN,
AXISFIRE, AXISFIRE,
@ -938,12 +943,14 @@ static INT32 JoyAxis(axis_input_e axissel)
retaxis = -JOYAXISRANGE; retaxis = -JOYAXISRANGE;
if (retaxis > (+JOYAXISRANGE)) if (retaxis > (+JOYAXISRANGE))
retaxis = +JOYAXISRANGE; retaxis = +JOYAXISRANGE;
if (!Joystick.bGamepadStyle)
if (!Joystick.bGamepadStyle && axissel > AXISDIGITAL)
{ {
const INT32 jdeadzone = ((JOYAXISRANGE-1) * ((axissel < AXISDEAD) ? cv_deadzone.value : cv_digitaldeadzone.value)) >> FRACBITS; const INT32 jdeadzone = ((JOYAXISRANGE-1) * cv_digitaldeadzone.value) >> FRACBITS;
if (-jdeadzone < retaxis && retaxis < jdeadzone) if (-jdeadzone < retaxis && retaxis < jdeadzone)
return 0; return 0;
} }
if (flp) retaxis = -retaxis; //flip it around if (flp) retaxis = -retaxis; //flip it around
return retaxis; return retaxis;
} }
@ -1011,18 +1018,87 @@ static INT32 Joy2Axis(axis_input_e axissel)
retaxis = -JOYAXISRANGE; retaxis = -JOYAXISRANGE;
if (retaxis > (+JOYAXISRANGE)) if (retaxis > (+JOYAXISRANGE))
retaxis = +JOYAXISRANGE; retaxis = +JOYAXISRANGE;
if (!Joystick2.bGamepadStyle)
if (!Joystick2.bGamepadStyle && axissel > AXISDIGITAL)
{ {
const INT32 jdeadzone = ((JOYAXISRANGE-1) * ((axissel < AXISDEAD) ? cv_deadzone2.value : cv_digitaldeadzone2.value)) >> FRACBITS; const INT32 jdeadzone = ((JOYAXISRANGE-1) * cv_digitaldeadzone2.value) >> FRACBITS;
if (-jdeadzone < retaxis && retaxis < jdeadzone) if (-jdeadzone < retaxis && retaxis < jdeadzone)
return 0; return 0;
} }
if (flp) retaxis = -retaxis; //flip it around if (flp) retaxis = -retaxis; //flip it around
return retaxis; return retaxis;
} }
#define PlayerJoyAxis(p, ax) ((p) == 1 ? JoyAxis(ax) : Joy2Axis(ax)) #define PlayerJoyAxis(p, ax) ((p) == 1 ? JoyAxis(ax) : Joy2Axis(ax))
// Take a magnitude of two axes, and adjust it to take out the deadzone
// Will return a value between 0 and JOYAXISRANGE
static INT32 G_BasicDeadZoneCalculation(INT32 magnitude, fixed_t deadZone)
{
const INT32 jdeadzone = (JOYAXISRANGE * deadZone) / FRACUNIT;
INT32 deadzoneAppliedValue = 0;
if (jdeadzone > 0)
{
if (magnitude > jdeadzone)
{
INT32 adjustedMagnitude = abs(magnitude);
adjustedMagnitude = min(adjustedMagnitude, JOYAXISRANGE);
adjustedMagnitude -= jdeadzone;
deadzoneAppliedValue = (adjustedMagnitude * JOYAXISRANGE) / (JOYAXISRANGE - jdeadzone);
}
}
return deadzoneAppliedValue;
}
// Get the actual sensible radial value for a joystick axis when accounting for a deadzone
static void G_HandleAxisDeadZone(UINT8 splitnum, joystickvector2_t *joystickvector)
{
INT32 gamepadStyle = Joystick.bGamepadStyle;
fixed_t deadZone = cv_deadzone.value;
if (splitnum == 1)
{
gamepadStyle = Joystick2.bGamepadStyle;
deadZone = cv_deadzone2.value;
}
// When gamepadstyle is "true" the values are just -1, 0, or 1. This is done in the interface code.
if (!gamepadStyle)
{
// Get the total magnitude of the 2 axes
INT32 magnitude = (joystickvector->xaxis * joystickvector->xaxis) + (joystickvector->yaxis * joystickvector->yaxis);
INT32 normalisedXAxis;
INT32 normalisedYAxis;
INT32 normalisedMagnitude;
double dMagnitude = sqrt((double)magnitude);
magnitude = (INT32)dMagnitude;
// Get the normalised xy values from the magnitude
normalisedXAxis = (joystickvector->xaxis * magnitude) / JOYAXISRANGE;
normalisedYAxis = (joystickvector->yaxis * magnitude) / JOYAXISRANGE;
// Apply the deadzone to the magnitude to give a correct value between 0 and JOYAXISRANGE
normalisedMagnitude = G_BasicDeadZoneCalculation(magnitude, deadZone);
// Apply the deadzone to the xy axes
joystickvector->xaxis = (normalisedXAxis * normalisedMagnitude) / JOYAXISRANGE;
joystickvector->yaxis = (normalisedYAxis * normalisedMagnitude) / JOYAXISRANGE;
// Cap the values so they don't go above the correct maximum
joystickvector->xaxis = min(joystickvector->xaxis, JOYAXISRANGE);
joystickvector->xaxis = max(joystickvector->xaxis, -JOYAXISRANGE);
joystickvector->yaxis = min(joystickvector->yaxis, JOYAXISRANGE);
joystickvector->yaxis = max(joystickvector->yaxis, -JOYAXISRANGE);
}
}
// //
// G_BuildTiccmd // G_BuildTiccmd
@ -1045,7 +1121,10 @@ void G_BuildTiccmd(ticcmd_t *cmd, INT32 realtics, UINT8 ssplayer)
{ {
boolean forcestrafe = false; boolean forcestrafe = false;
boolean forcefullinput = false; boolean forcefullinput = false;
INT32 tspeed, forward, side, axis, altaxis, i; INT32 tspeed, forward, side, axis, strafeaxis, moveaxis, turnaxis, lookaxis, i;
joystickvector2_t movejoystickvector, lookjoystickvector;
const INT32 speed = 1; const INT32 speed = 1;
// these ones used for multiple conditions // these ones used for multiple conditions
boolean turnleft, turnright, strafelkey, straferkey, movefkey, movebkey, mouseaiming, analogjoystickmove, gamepadjoystickmove, thisjoyaiming; boolean turnleft, turnright, strafelkey, straferkey, movefkey, movebkey, mouseaiming, analogjoystickmove, gamepadjoystickmove, thisjoyaiming;
@ -1143,13 +1222,18 @@ void G_BuildTiccmd(ticcmd_t *cmd, INT32 realtics, UINT8 ssplayer)
*myaiming = 0; *myaiming = 0;
joyaiming[forplayer] = thisjoyaiming; joyaiming[forplayer] = thisjoyaiming;
axis = PlayerJoyAxis(ssplayer, AXISTURN); turnaxis = JPlayerJoyAxis(ssplayer, AXISTURN);
if (strafeisturn) if (strafeisturn)
axis += PlayerJoyAxis(ssplayer, AXISSTRAFE); turnaxis += PlayerJoyAxis(ssplayer, AXISSTRAFE);
if (gamepadjoystickmove && axis != 0) lookaxis = PlayerJoyAxis(ssplayer, AXISLOOK);
lookjoystickvector.xaxis = turnaxis;
lookjoystickvector.yaxis = lookaxis;
G_HandleAxisDeadZone(forplayer, &lookjoystickvector);
if (gamepadjoystickmove && lookjoystickvector.xaxis != 0)
{ {
turnright = turnright || (axis > 0); turnright = turnright || (lookjoystickvector.xaxis > 0);
turnleft = turnleft || (axis < 0); turnleft = turnleft || (lookjoystickvector.xaxis < 0);
} }
forward = side = 0; forward = side = 0;
@ -1189,10 +1273,10 @@ void G_BuildTiccmd(ticcmd_t *cmd, INT32 realtics, UINT8 ssplayer)
if (turnleft) if (turnleft)
side -= sidemove[speed]; side -= sidemove[speed];
if (analogjoystickmove && axis != 0) if (analogjoystickmove && lookjoystickvector.xaxis != 0)
{ {
// JOYAXISRANGE is supposed to be 1023 (divide by 1024) // JOYAXISRANGE is supposed to be 1023 (divide by 1024)
side += ((axis * sidemove[1]) >> 10); side += ((lookjoystickvector.xaxis * sidemove[1]) >> 10);
} }
} }
else if (analog) // Analog else if (analog) // Analog
@ -1205,14 +1289,14 @@ void G_BuildTiccmd(ticcmd_t *cmd, INT32 realtics, UINT8 ssplayer)
else else
{ {
if (turnright) if (turnright)
cmd->angleturn = (INT16)(cmd->angleturn - angleturn[tspeed]); cmd->angleturn = (INT16)(cmd->angleturn - ((angleturn[tspeed] * cv_cam_turnmultiplier.value)>>FRACBITS));
if (turnleft) else if (turnleft)
cmd->angleturn = (INT16)(cmd->angleturn + angleturn[tspeed]); cmd->angleturn = (INT16)(cmd->angleturn + ((angleturn[tspeed] * cv_cam_turnmultiplier.value)>>FRACBITS));
if (analogjoystickmove && axis != 0) if (analogjoystickmove && lookjoystickvector.xaxis != 0)
{ {
// JOYAXISRANGE should be 1023 (divide by 1024) // JOYAXISRANGE should be 1023 (divide by 1024)
cmd->angleturn = (INT16)(cmd->angleturn - ((axis * angleturn[1]) >> 10)); // ANALOG! cmd->angleturn = (INT16)(cmd->angleturn - ((((lookjoystickvector.xaxis * angleturn[1]) >> 10) * cv_cam_turnmultiplier.value)>>FRACBITS)); // ANALOG!
} }
if (turnright || turnleft || abs(cmd->angleturn) > angleturn[2]) if (turnright || turnleft || abs(cmd->angleturn) > angleturn[2])
@ -1222,34 +1306,37 @@ void G_BuildTiccmd(ticcmd_t *cmd, INT32 realtics, UINT8 ssplayer)
cmd->angleturn = (cmd->angleturn * (ssplayer == 1 ? cv_cam_rotspeed.value : cv_cam2_rotspeed.value)) / 10; cmd->angleturn = (cmd->angleturn * (ssplayer == 1 ? cv_cam_rotspeed.value : cv_cam2_rotspeed.value)) / 10;
} }
axis = strafeisturn ? 0 : PlayerJoyAxis(ssplayer, AXISSTRAFE); strafeaxis = strafeisturn ? 0 : PlayerJoyAxis(ssplayer, AXISSTRAFE);
if (gamepadjoystickmove && axis != 0) moveaxis = PlayerJoyAxis(ssplayer, AXISMOVE);
movejoystickvector.xaxis = strafeaxis;
movejoystickvector.yaxis = moveaxis;
G_HandleAxisDeadZone(forplayer, &movejoystickvector);
if (gamepadjoystickmove && movejoystickvector.xaxis != 0)
{ {
if (axis < 0) if (movejoystickvector.xaxis > 0)
side += sidemove[speed]; side += sidemove[speed];
else if (axis > 0) else if (movejoystickvector.xaxis < 0)
side -= sidemove[speed]; side -= sidemove[speed];
} }
else if (analogjoystickmove && axis != 0) else if (analogjoystickmove && movejoystickvector.xaxis != 0)
{ {
// JOYAXISRANGE is supposed to be 1023 (divide by 1024) // JOYAXISRANGE is supposed to be 1023 (divide by 1024)
side += ((axis * sidemove[1]) >> 10); side += ((movejoystickvector.xaxis * sidemove[1]) >> 10);
} }
// forward with key or button // forward with key or button
axis = PlayerJoyAxis(ssplayer, AXISMOVE); if (movefkey || (gamepadjoystickmove && movejoystickvector.yaxis < 0)
altaxis = PlayerJoyAxis(ssplayer, AXISLOOK);
if (movefkey || (gamepadjoystickmove && axis < 0)
|| ((player->powers[pw_carry] == CR_NIGHTSMODE) || ((player->powers[pw_carry] == CR_NIGHTSMODE)
&& (PLAYERINPUTDOWN(ssplayer, gc_lookup) || (gamepadjoystickmove && altaxis < 0)))) && (PLAYERINPUTDOWN(ssplayer, gc_lookup) || (gamepadjoystickmove && lookjoystickvector.yaxis > 0))))
forward = forwardmove[speed]; forward = forwardmove[speed];
if (movebkey || (gamepadjoystickmove && axis > 0) if (movebkey || (gamepadjoystickmove && movejoystickvector.yaxis > 0)
|| ((player->powers[pw_carry] == CR_NIGHTSMODE) || ((player->powers[pw_carry] == CR_NIGHTSMODE)
&& (PLAYERINPUTDOWN(ssplayer, gc_lookdown) || (gamepadjoystickmove && altaxis > 0)))) && (PLAYERINPUTDOWN(ssplayer, gc_lookdown) || (gamepadjoystickmove && lookjoystickvector.yaxis < 0))))
forward -= forwardmove[speed]; forward -= forwardmove[speed];
if (analogjoystickmove && axis != 0) if (analogjoystickmove && movejoystickvector.yaxis != 0)
forward -= ((axis * forwardmove[1]) >> 10); // ANALOG! forward -= ((movejoystickvector.yaxis * forwardmove[1]) >> 10); // ANALOG!
// some people strafe left & right with mouse buttons // some people strafe left & right with mouse buttons
// those people are weird // those people are weird
@ -1430,9 +1517,8 @@ void G_BuildTiccmd(ticcmd_t *cmd, INT32 realtics, UINT8 ssplayer)
*myaiming += (*mly<<19)*player_invert*screen_invert; *myaiming += (*mly<<19)*player_invert*screen_invert;
} }
axis = PlayerJoyAxis(ssplayer, AXISLOOK); if (analogjoystickmove && joyaiming[forplayer] && lookjoystickvector.yaxis != 0 && lookaxis != 0)
if (analogjoystickmove && joyaiming[forplayer] && axis != 0 && lookaxis != 0) *myaiming += (lookjoystickvector.yaxis<<16) * screen_invert;
*myaiming += (axis<<16) * screen_invert;
// spring back if not using keyboard neither mouselookin' // spring back if not using keyboard neither mouselookin'
if (!keyboard_look[forplayer] && lookaxis == 0 && !joyaiming[forplayer] && !mouseaiming) if (!keyboard_look[forplayer] && lookaxis == 0 && !joyaiming[forplayer] && !mouseaiming)
@ -1440,12 +1526,12 @@ void G_BuildTiccmd(ticcmd_t *cmd, INT32 realtics, UINT8 ssplayer)
if (!(player->powers[pw_carry] == CR_NIGHTSMODE)) if (!(player->powers[pw_carry] == CR_NIGHTSMODE))
{ {
if (PLAYERINPUTDOWN(ssplayer, gc_lookup) || (gamepadjoystickmove && axis < 0)) if (PLAYERINPUTDOWN(ssplayer, gc_lookup) || (gamepadjoystickmove && lookjoystickvector.yaxis < 0))
{ {
*myaiming += KB_LOOKSPEED * screen_invert; *myaiming += KB_LOOKSPEED * screen_invert;
keyboard_look[forplayer] = true; keyboard_look[forplayer] = true;
} }
else if (PLAYERINPUTDOWN(ssplayer, gc_lookdown) || (gamepadjoystickmove && axis > 0)) else if (PLAYERINPUTDOWN(ssplayer, gc_lookdown) || (gamepadjoystickmove && lookjoystickvector.yaxis > 0))
{ {
*myaiming -= KB_LOOKSPEED * screen_invert; *myaiming -= KB_LOOKSPEED * screen_invert;
keyboard_look[forplayer] = true; keyboard_look[forplayer] = true;
@ -1787,9 +1873,6 @@ void G_DoLoadLevel(boolean resetplayer)
// //
void G_StartTitleCard(void) void G_StartTitleCard(void)
{ {
wipestyleflags |= WSF_FADEIN;
wipestyleflags &= ~WSF_FADEOUT;
// The title card has been disabled for this map. // The title card has been disabled for this map.
// Oh well. // Oh well.
if (mapheaderinfo[gamemap-1]->levelflags & LF_NOTITLECARD) if (mapheaderinfo[gamemap-1]->levelflags & LF_NOTITLECARD)
@ -1833,6 +1916,8 @@ void G_PreLevelTitleCard(void)
if (takescreenshot) // Only take screenshots after drawing. if (takescreenshot) // Only take screenshots after drawing.
M_DoScreenShot(); M_DoScreenShot();
} }
if (!cv_showhud.value)
wipestyleflags = WSF_CROSSFADE;
} }
INT32 pausedelay = 0; INT32 pausedelay = 0;

View File

@ -33,10 +33,6 @@
#include "../r_patch.h" #include "../r_patch.h"
#include "../p_setup.h" #include "../p_setup.h"
//Hurdler: 25/04/2000: used for new colormap code in hardware mode
//static UINT8 *gr_colormap = NULL; // by default it must be NULL ! (because colormap tables are not initialized)
boolean firetranslucent = false;
// Values set after a call to HWR_ResizeBlock() // Values set after a call to HWR_ResizeBlock()
static INT32 blocksize, blockwidth, blockheight; static INT32 blocksize, blockwidth, blockheight;
@ -122,18 +118,16 @@ static void HWR_DrawColumnInCache(const column_t *patchcol, UINT8 *block, GLMipm
texel = source[yfrac>>FRACBITS]; texel = source[yfrac>>FRACBITS];
if (firetranslucent && (transtables[(texel<<8)+0x40000]!=texel)) //Hurdler: 25/04/2000: now support colormap in hardware mode
alpha = 0x80; if (mipmap->colormap)
texel = mipmap->colormap[texel];
// transparent pixel
if (texel == HWR_PATCHES_CHROMAKEY_COLORINDEX)
alpha = 0x00;
else else
alpha = 0xff; alpha = 0xff;
//Hurdler: not perfect, but better than holes
if (texel == HWR_PATCHES_CHROMAKEY_COLORINDEX && (mipmap->flags & TF_CHROMAKEYED))
texel = HWR_CHROMAKEY_EQUIVALENTCOLORINDEX;
//Hurdler: 25/04/2000: now support colormap in hardware mode
else if (mipmap->colormap)
texel = mipmap->colormap[texel];
// hope compiler will get this switch out of the loops (dreams...) // hope compiler will get this switch out of the loops (dreams...)
// gcc do it ! but vcc not ! (why don't use cygwin gcc for win32 ?) // gcc do it ! but vcc not ! (why don't use cygwin gcc for win32 ?)
// Alam: SRB2 uses Mingw, HUGS // Alam: SRB2 uses Mingw, HUGS
@ -236,18 +230,16 @@ static void HWR_DrawFlippedColumnInCache(const column_t *patchcol, UINT8 *block,
texel = source[yfrac>>FRACBITS]; texel = source[yfrac>>FRACBITS];
if (firetranslucent && (transtables[(texel<<8)+0x40000]!=texel)) //Hurdler: 25/04/2000: now support colormap in hardware mode
alpha = 0x80; if (mipmap->colormap)
texel = mipmap->colormap[texel];
// transparent pixel
if (texel == HWR_PATCHES_CHROMAKEY_COLORINDEX)
alpha = 0x00;
else else
alpha = 0xff; alpha = 0xff;
//Hurdler: not perfect, but better than holes
if (texel == HWR_PATCHES_CHROMAKEY_COLORINDEX && (mipmap->flags & TF_CHROMAKEYED))
texel = HWR_CHROMAKEY_EQUIVALENTCOLORINDEX;
//Hurdler: 25/04/2000: now support colormap in hardware mode
else if (mipmap->colormap)
texel = mipmap->colormap[texel];
// hope compiler will get this switch out of the loops (dreams...) // hope compiler will get this switch out of the loops (dreams...)
// gcc do it ! but vcc not ! (why don't use cygwin gcc for win32 ?) // gcc do it ! but vcc not ! (why don't use cygwin gcc for win32 ?)
// Alam: SRB2 uses Mingw, HUGS // Alam: SRB2 uses Mingw, HUGS
@ -576,7 +568,7 @@ static UINT8 *MakeBlock(GLMipmap_t *grMipmap)
{ {
UINT8 *block; UINT8 *block;
INT32 bpp, i; INT32 bpp, i;
UINT16 bu16 = ((0x00 <<8) | HWR_CHROMAKEY_EQUIVALENTCOLORINDEX); UINT16 bu16 = ((0x00 <<8) | HWR_PATCHES_CHROMAKEY_COLORINDEX);
bpp = format2bpp[grMipmap->grInfo.format]; bpp = format2bpp[grMipmap->grInfo.format];
block = Z_Malloc(blocksize*bpp, PU_HWRCACHE, &(grMipmap->grInfo.data)); block = Z_Malloc(blocksize*bpp, PU_HWRCACHE, &(grMipmap->grInfo.data));
@ -606,6 +598,7 @@ static void HWR_GenerateTexture(INT32 texnum, GLTexture_t *grtex)
texture_t *texture; texture_t *texture;
texpatch_t *patch; texpatch_t *patch;
patch_t *realpatch; patch_t *realpatch;
UINT8 *pdata;
INT32 i; INT32 i;
boolean skyspecial = false; //poor hack for Legacy large skies.. boolean skyspecial = false; //poor hack for Legacy large skies..
@ -638,7 +631,7 @@ static void HWR_GenerateTexture(INT32 texnum, GLTexture_t *grtex)
INT32 j; INT32 j;
RGBA_t col; RGBA_t col;
col = V_GetColor(HWR_CHROMAKEY_EQUIVALENTCOLORINDEX); col = V_GetColor(HWR_PATCHES_CHROMAKEY_COLORINDEX);
for (j = 0; j < blockheight; j++) for (j = 0; j < blockheight; j++)
{ {
for (i = 0; i < blockwidth; i++) for (i = 0; i < blockwidth; i++)
@ -654,19 +647,30 @@ static void HWR_GenerateTexture(INT32 texnum, GLTexture_t *grtex)
// Composite the columns together. // Composite the columns together.
for (i = 0, patch = texture->patches; i < texture->patchcount; i++, patch++) for (i = 0, patch = texture->patches; i < texture->patchcount; i++, patch++)
{ {
#ifndef NO_PNG_LUMPS boolean dealloc = true;
size_t lumplength = W_LumpLengthPwad(patch->wad, patch->lump); size_t lumplength = W_LumpLengthPwad(patch->wad, patch->lump);
#endif pdata = W_CacheLumpNumPwad(patch->wad, patch->lump, PU_CACHE);
realpatch = W_CacheLumpNumPwad(patch->wad, patch->lump, PU_CACHE); realpatch = (patch_t *)pdata;
#ifndef NO_PNG_LUMPS #ifndef NO_PNG_LUMPS
if (R_IsLumpPNG((UINT8 *)realpatch, lumplength)) if (R_IsLumpPNG((UINT8 *)realpatch, lumplength))
realpatch = R_PNGToPatch((UINT8 *)realpatch, lumplength, NULL, false); realpatch = R_PNGToPatch((UINT8 *)realpatch, lumplength, NULL, false);
else
#endif #endif
HWR_DrawTexturePatchInCache(&grtex->mipmap, #ifdef WALLFLATS
blockwidth, blockheight, if (texture->type == TEXTURETYPE_FLAT)
texture, patch, realpatch = R_FlatToPatch(pdata, texture->width, texture->height, 0, 0, NULL, false);
realpatch); else
Z_Unlock(realpatch); #endif
{
(void)lumplength;
dealloc = false;
}
HWR_DrawTexturePatchInCache(&grtex->mipmap, blockwidth, blockheight, texture, patch, realpatch);
if (dealloc)
Z_Unlock(realpatch);
} }
//Hurdler: not efficient at all but I don't remember exactly how HWR_DrawPatchInCache works :( //Hurdler: not efficient at all but I don't remember exactly how HWR_DrawPatchInCache works :(
if (format2bpp[grtex->mipmap.grInfo.format]==4) if (format2bpp[grtex->mipmap.grInfo.format]==4)
@ -760,15 +764,15 @@ void HWR_MakePatch (const patch_t *patch, GLPatch_t *grPatch, GLMipmap_t *grMipm
// CACHING HANDLING // CACHING HANDLING
// ================================================= // =================================================
static size_t gr_numtextures; static size_t gr_numtextures; // Texture count
static GLTexture_t *gr_textures; // for ALL Doom textures static GLTexture_t *gr_textures; // For all textures
static GLTexture_t *gr_textures2; static GLTexture_t *gr_flats; // For all (texture) flats, as normal flats don't need to be cached
void HWR_InitTextureCache(void) void HWR_InitTextureCache(void)
{ {
gr_numtextures = 0; gr_numtextures = 0;
gr_textures = NULL; gr_textures = NULL;
gr_textures2 = NULL; gr_flats = NULL;
} }
// Callback function for HWR_FreeTextureCache. // Callback function for HWR_FreeTextureCache.
@ -776,29 +780,45 @@ static void FreeMipmapColormap(INT32 patchnum, void *patch)
{ {
GLPatch_t* const pat = patch; GLPatch_t* const pat = patch;
(void)patchnum; //unused (void)patchnum; //unused
while (pat->mipmap && pat->mipmap->nextcolormap) // The mipmap must be valid, obviously
// The patch must be valid, obviously
if (!pat)
return;
// The mipmap must be valid, obviously
while (pat->mipmap)
{ {
// Confusing at first, but pat->mipmap->nextcolormap // Confusing at first, but pat->mipmap->nextcolormap
// at the beginning of the loop is the first colormap // at the beginning of the loop is the first colormap
// from the linked list of colormaps // from the linked list of colormaps.
GLMipmap_t *next = pat->mipmap; GLMipmap_t *next = NULL;
if (!next) // No mipmap in this patch, break out of loop.
// No mipmap in this patch, break out of the loop.
if (!pat->mipmap)
break; break;
// Set the first colormap
// to the one that comes after it // No colormap mipmap either.
next = next->nextcolormap; if (!pat->mipmap->nextcolormap)
break;
// Set the first colormap to the one that comes after it.
next = pat->mipmap->nextcolormap;
pat->mipmap->nextcolormap = next->nextcolormap; pat->mipmap->nextcolormap = next->nextcolormap;
// Free image data from memory
// Free image data from memory.
if (next->grInfo.data) if (next->grInfo.data)
Z_Free(next->grInfo.data); Z_Free(next->grInfo.data);
// Free the old colormap from memory next->grInfo.data = NULL;
// Free the old colormap mipmap from memory.
free(next); free(next);
} }
} }
void HWR_FreeTextureCache(void) void HWR_FreeMipmapCache(void)
{ {
INT32 i; INT32 i;
// free references to the textures // free references to the textures
HWD.pfnClearMipMapCache(); HWD.pfnClearMipMapCache();
@ -808,51 +828,46 @@ void HWR_FreeTextureCache(void)
Z_FreeTag(PU_HWRCACHE_UNLOCKED); Z_FreeTag(PU_HWRCACHE_UNLOCKED);
// Alam: free the Z_Blocks before freeing it's users // Alam: free the Z_Blocks before freeing it's users
// free all patch colormaps after each level: must be done after ClearMipMapCache! // free all patch colormaps after each level: must be done after ClearMipMapCache!
for (i = 0; i < numwadfiles; i++) for (i = 0; i < numwadfiles; i++)
M_AATreeIterate(wadfiles[i]->hwrcache, FreeMipmapColormap); M_AATreeIterate(wadfiles[i]->hwrcache, FreeMipmapColormap);
}
void HWR_FreeTextureCache(void)
{
// free references to the textures
HWR_FreeMipmapCache();
// now the heap don't have any 'user' pointing to our // now the heap don't have any 'user' pointing to our
// texturecache info, we can free it // texturecache info, we can free it
if (gr_textures) if (gr_textures)
free(gr_textures); free(gr_textures);
if (gr_textures2) if (gr_flats)
free(gr_textures2); free(gr_flats);
gr_textures = NULL; gr_textures = NULL;
gr_textures2 = NULL; gr_flats = NULL;
gr_numtextures = 0; gr_numtextures = 0;
} }
void HWR_PrepLevelCache(size_t pnumtextures) void HWR_LoadTextures(size_t pnumtextures)
{ {
// problem: the mipmap cache management hold a list of mipmaps.. but they are
// reallocated on each level..
//sub-optimal, but 1) just need re-download stuff in hardware cache VERY fast
// 2) sprite/menu stuff mixed with level textures so can't do anything else
// we must free it since numtextures changed // we must free it since numtextures changed
HWR_FreeTextureCache(); HWR_FreeTextureCache();
// Why not Z_Malloc?
gr_numtextures = pnumtextures; gr_numtextures = pnumtextures;
gr_textures = calloc(pnumtextures, sizeof (*gr_textures)); gr_textures = calloc(gr_numtextures, sizeof(*gr_textures));
if (gr_textures == NULL) gr_flats = calloc(gr_numtextures, sizeof(*gr_flats));
I_Error("3D can't alloc gr_textures");
gr_textures2 = calloc(pnumtextures, sizeof (*gr_textures2)); // Doesn't tell you which it _is_, but hopefully
if (gr_textures2 == NULL) // should never ever happen (right?!)
I_Error("3D can't alloc gr_textures2"); if ((gr_textures == NULL) || (gr_flats == NULL))
I_Error("HWR_LoadTextures: ran out of memory for OpenGL textures. Sad!");
} }
void HWR_SetPalette(RGBA_t *palette) void HWR_SetPalette(RGBA_t *palette)
{ {
//Hudler: 16/10/99: added for OpenGL gamma correction HWD.pfnSetPalette(palette);
RGBA_t gamma_correction = {0x7F7F7F7F};
//Hurdler 16/10/99: added for OpenGL gamma correction
gamma_correction.s.red = (UINT8)cv_grgammared.value;
gamma_correction.s.green = (UINT8)cv_grgammagreen.value;
gamma_correction.s.blue = (UINT8)cv_grgammablue.value;
HWD.pfnSetPalette(palette, &gamma_correction);
// hardware driver will flush there own cache if cache is non paletized // hardware driver will flush there own cache if cache is non paletized
// now flush data texture cache so 32 bit texture are recomputed // now flush data texture cache so 32 bit texture are recomputed
@ -873,11 +888,16 @@ GLTexture_t *HWR_GetTexture(INT32 tex)
if ((unsigned)tex >= gr_numtextures) if ((unsigned)tex >= gr_numtextures)
I_Error("HWR_GetTexture: tex >= numtextures\n"); I_Error("HWR_GetTexture: tex >= numtextures\n");
#endif #endif
// Every texture in memory, stored in the
// hardware renderer's bit depth format. Wow!
grtex = &gr_textures[tex]; grtex = &gr_textures[tex];
// Generate texture if missing from the cache
if (!grtex->mipmap.grInfo.data && !grtex->mipmap.downloaded) if (!grtex->mipmap.grInfo.data && !grtex->mipmap.downloaded)
HWR_GenerateTexture(tex, grtex); HWR_GenerateTexture(tex, grtex);
// Tell the hardware driver to bind the current texture to the flat's mipmap
HWD.pfnSetTexture(&grtex->mipmap); HWD.pfnSetTexture(&grtex->mipmap);
// The system-memory data can be purged now. // The system-memory data can be purged now.
@ -989,13 +1009,19 @@ void HWR_GetLevelFlat(levelflat_t *levelflat)
if ((unsigned)texturenum >= gr_numtextures) if ((unsigned)texturenum >= gr_numtextures)
I_Error("HWR_GetLevelFlat: texturenum >= numtextures\n"); I_Error("HWR_GetLevelFlat: texturenum >= numtextures\n");
#endif #endif
// Who knows?
if (texturenum == 0 || texturenum == -1) if (texturenum == 0 || texturenum == -1)
return; return;
grtex = &gr_textures2[texturenum];
// Every texture in memory, stored as a 8-bit flat. Wow!
grtex = &gr_flats[texturenum];
// Generate flat if missing from the cache
if (!grtex->mipmap.grInfo.data && !grtex->mipmap.downloaded) if (!grtex->mipmap.grInfo.data && !grtex->mipmap.downloaded)
HWR_CacheTextureAsFlat(&grtex->mipmap, texturenum); HWR_CacheTextureAsFlat(&grtex->mipmap, texturenum);
// Tell the hardware driver to bind the current texture to the flat's mipmap
HWD.pfnSetTexture(&grtex->mipmap); HWD.pfnSetTexture(&grtex->mipmap);
// The system-memory data can be purged now. // The system-memory data can be purged now.
@ -1019,6 +1045,7 @@ static void HWR_LoadMappedPatch(GLMipmap_t *grmip, GLPatch_t *gpatch)
HWR_MakePatch(patch, gpatch, grmip, true); HWR_MakePatch(patch, gpatch, grmip, true);
// You can't free rawpatch for some reason? // You can't free rawpatch for some reason?
// (Obviously I can't, sprite rotation needs that...)
if (!gpatch->rawpatch) if (!gpatch->rawpatch)
Z_Free(patch); Z_Free(patch);
} }
@ -1046,7 +1073,6 @@ void HWR_GetPatch(GLPatch_t *gpatch)
// this is inefficient.. but the hardware patch in heap is purgeable so it should // this is inefficient.. but the hardware patch in heap is purgeable so it should
// not fragment memory, and besides the REAL cache here is the hardware memory // not fragment memory, and besides the REAL cache here is the hardware memory
// You can't free rawpatch for some reason?
if (!gpatch->rawpatch) if (!gpatch->rawpatch)
Z_Free(ptr); Z_Free(ptr);
} }

View File

@ -48,6 +48,7 @@ struct GLMipmap_s
struct GLMipmap_s *nextcolormap; struct GLMipmap_s *nextcolormap;
const UINT8 *colormap; const UINT8 *colormap;
INT32 tcindex;
// opengl // opengl
struct GLMipmap_s *nextmipmap; // opengl : liste of all texture in opengl driver struct GLMipmap_s *nextmipmap; // opengl : liste of all texture in opengl driver

View File

@ -42,7 +42,7 @@ typedef unsigned char FBOOLEAN;
// byte value for paletted graphics, which represent the transparent color // byte value for paletted graphics, which represent the transparent color
#define HWR_PATCHES_CHROMAKEY_COLORINDEX 255 #define HWR_PATCHES_CHROMAKEY_COLORINDEX 255
#define HWR_CHROMAKEY_EQUIVALENTCOLORINDEX 130 //#define HWR_CHROMAKEY_EQUIVALENTCOLORINDEX 130
// the chroma key color shows on border sprites, set it to black // the chroma key color shows on border sprites, set it to black
#define HWR_PATCHES_CHROMAKEY_COLORVALUE (0x00000000) //RGBA format as in grSstWinOpen() #define HWR_PATCHES_CHROMAKEY_COLORVALUE (0x00000000) //RGBA format as in grSstWinOpen()
@ -220,11 +220,10 @@ typedef struct FSurfaceInfo FSurfaceInfo;
//Hurdler: added for backward compatibility //Hurdler: added for backward compatibility
enum hwdsetspecialstate enum hwdsetspecialstate
{ {
HWD_SET_FOG_TABLE = 1, HWD_SET_MODEL_LIGHTING = 1,
HWD_SET_FOG_MODE, HWD_SET_FOG_MODE,
HWD_SET_FOG_COLOR, HWD_SET_FOG_COLOR,
HWD_SET_FOG_DENSITY, HWD_SET_FOG_DENSITY,
HWD_SET_FOV,
HWD_SET_TEXTUREFILTERMODE, HWD_SET_TEXTUREFILTERMODE,
HWD_SET_TEXTUREANISOTROPICMODE, HWD_SET_TEXTUREANISOTROPICMODE,
HWD_NUMSTATE HWD_NUMSTATE

View File

@ -39,11 +39,7 @@ EXPORT void HWRAPI(Shutdown) (void);
#ifdef _WINDOWS #ifdef _WINDOWS
EXPORT void HWRAPI(GetModeList) (vmode_t **pvidmodes, INT32 *numvidmodes); EXPORT void HWRAPI(GetModeList) (vmode_t **pvidmodes, INT32 *numvidmodes);
#endif #endif
#if defined (PURESDL) || defined (macintosh) EXPORT void HWRAPI(SetPalette) (RGBA_t *ppal);
EXPORT void HWRAPI(SetPalette) (INT32 *, RGBA_t *gamma);
#else
EXPORT void HWRAPI(SetPalette) (RGBA_t *ppal, RGBA_t *pgamma);
#endif
EXPORT void HWRAPI(FinishUpdate) (INT32 waitvbl); EXPORT void HWRAPI(FinishUpdate) (INT32 waitvbl);
EXPORT void HWRAPI(Draw2DLine) (F2DCoord *v1, F2DCoord *v2, RGBA_t Color); EXPORT void HWRAPI(Draw2DLine) (F2DCoord *v1, F2DCoord *v2, RGBA_t Color);
EXPORT void HWRAPI(DrawPolygon) (FSurfaceInfo *pSurf, FOutVector *pOutVerts, FUINT iNumPts, FBITFIELD PolyFlags); EXPORT void HWRAPI(DrawPolygon) (FSurfaceInfo *pSurf, FOutVector *pOutVerts, FUINT iNumPts, FBITFIELD PolyFlags);

View File

@ -100,6 +100,7 @@ void HWR_FreePolyPool(void);
// -------- // --------
void HWR_InitTextureCache(void); void HWR_InitTextureCache(void);
void HWR_FreeTextureCache(void); void HWR_FreeTextureCache(void);
void HWR_FreeMipmapCache(void);
void HWR_FreeExtraSubsectors(void); void HWR_FreeExtraSubsectors(void);
void HWR_GetLevelFlat(levelflat_t *levelflat); void HWR_GetLevelFlat(levelflat_t *levelflat);
@ -127,6 +128,5 @@ extern consvar_t cv_grrounddown; // on/off
extern INT32 patchformat; extern INT32 patchformat;
extern INT32 textureformat; extern INT32 textureformat;
extern boolean firetranslucent;
#endif //_HW_GLOB_ #endif //_HW_GLOB_

View File

@ -85,62 +85,8 @@ static void HWR_RenderTransparentWalls(void);
static void HWR_FoggingOn(void); static void HWR_FoggingOn(void);
static UINT32 atohex(const char *s); static UINT32 atohex(const char *s);
static void CV_filtermode_ONChange(void);
static void CV_anisotropic_ONChange(void);
static void CV_FogDensity_ONChange(void);
static void CV_grFov_OnChange(void);
// ==========================================================================
// 3D ENGINE COMMANDS & CONSOLE VARS
// ==========================================================================
static CV_PossibleValue_t grfov_cons_t[] = {{0, "MIN"}, {179*FRACUNIT, "MAX"}, {0, NULL}};
static CV_PossibleValue_t grfiltermode_cons_t[]= {{HWD_SET_TEXTUREFILTER_POINTSAMPLED, "Nearest"},
{HWD_SET_TEXTUREFILTER_BILINEAR, "Bilinear"}, {HWD_SET_TEXTUREFILTER_TRILINEAR, "Trilinear"},
{HWD_SET_TEXTUREFILTER_MIXED1, "Linear_Nearest"},
{HWD_SET_TEXTUREFILTER_MIXED2, "Nearest_Linear"},
{HWD_SET_TEXTUREFILTER_MIXED3, "Nearest_Mipmap"},
{0, NULL}};
CV_PossibleValue_t granisotropicmode_cons_t[] = {{1, "MIN"}, {16, "MAX"}, {0, NULL}};
boolean drawsky = true; boolean drawsky = true;
// needs fix: walls are incorrectly clipped one column less
#ifndef NEWCLIP
static consvar_t cv_grclipwalls = {"gr_clipwalls", "Off", 0, CV_OnOff, NULL, 0, NULL, NULL, 0, 0, NULL};
#endif
//development variables for diverse uses
static consvar_t cv_gralpha = {"gr_alpha", "160", 0, CV_Unsigned, NULL, 0, NULL, NULL, 0, 0, NULL};
static consvar_t cv_grbeta = {"gr_beta", "0", 0, CV_Unsigned, NULL, 0, NULL, NULL, 0, 0, NULL};
consvar_t cv_grrounddown = {"gr_rounddown", "Off", 0, CV_OnOff, NULL, 0, NULL, NULL, 0, 0, NULL};
consvar_t cv_grfov = {"gr_fov", "90", CV_FLOAT|CV_CALL, grfov_cons_t, CV_grFov_OnChange, 0, NULL, NULL, 0, 0, NULL};
consvar_t cv_grfogdensity = {"gr_fogdensity", "150", CV_CALL|CV_NOINIT, CV_Unsigned,
CV_FogDensity_ONChange, 0, NULL, NULL, 0, 0, NULL};
// Unfortunately, this can no longer be saved..
consvar_t cv_grfiltermode = {"gr_filtermode", "Nearest", CV_CALL, grfiltermode_cons_t,
CV_filtermode_ONChange, 0, NULL, NULL, 0, 0, NULL};
consvar_t cv_granisotropicmode = {"gr_anisotropicmode", "1", CV_CALL, granisotropicmode_cons_t,
CV_anisotropic_ONChange, 0, NULL, NULL, 0, 0, NULL};
//static consvar_t cv_grzbuffer = {"gr_zbuffer", "On", 0, CV_OnOff};
consvar_t cv_grcorrecttricks = {"gr_correcttricks", "Off", 0, CV_OnOff, NULL, 0, NULL, NULL, 0, 0, NULL};
consvar_t cv_grsolvetjoin = {"gr_solvetjoin", "On", 0, CV_OnOff, NULL, 0, NULL, NULL, 0, 0, NULL};
static void CV_FogDensity_ONChange(void)
{
HWD.pfnSetSpecialState(HWD_SET_FOG_DENSITY, cv_grfogdensity.value);
}
static void CV_filtermode_ONChange(void)
{
HWD.pfnSetSpecialState(HWD_SET_TEXTUREFILTERMODE, cv_grfiltermode.value);
}
static void CV_anisotropic_ONChange(void)
{
HWD.pfnSetSpecialState(HWD_SET_TEXTUREANISOTROPICMODE, cv_granisotropicmode.value);
}
/* /*
* lookuptable for lightvalues * lookuptable for lightvalues
* calculated as follow: * calculated as follow:
@ -2473,11 +2419,13 @@ static boolean CheckClip(seg_t * seg, sector_t * afrontsector, sector_t * abacks
static cliprange_t * hw_newend; static cliprange_t * hw_newend;
static cliprange_t gr_solidsegs[MAXSEGS]; static cliprange_t gr_solidsegs[MAXSEGS];
// needs fix: walls are incorrectly clipped one column less
static consvar_t cv_grclipwalls = {"gr_clipwalls", "Off", 0, CV_OnOff, NULL, 0, NULL, NULL, 0, 0, NULL};
static void printsolidsegs(void) static void printsolidsegs(void)
{ {
cliprange_t * start; cliprange_t * start;
if (!hw_newend || cv_grbeta.value != 2) if (!hw_newend)
return; return;
for (start = gr_solidsegs;start != hw_newend;start++) for (start = gr_solidsegs;start != hw_newend;start++)
{ {
@ -3431,7 +3379,7 @@ static void HWR_AddPolyObjectPlanes(void)
{ {
HWR_GetLevelFlat(&levelflats[polyobjsector->ceilingpic]); HWR_GetLevelFlat(&levelflats[polyobjsector->ceilingpic]);
HWR_RenderPolyObjectPlane(po_ptrs[i], true, polyobjsector->ceilingheight, PF_Occlude, HWR_RenderPolyObjectPlane(po_ptrs[i], true, polyobjsector->ceilingheight, PF_Occlude,
(light == -1 ? gr_frontsector->lightlevel : *gr_frontsector->lightlist[light].lightlevel), &levelflats[polyobjsector->floorpic], (light == -1 ? gr_frontsector->lightlevel : *gr_frontsector->lightlist[light].lightlevel), &levelflats[polyobjsector->ceilingpic],
polyobjsector, 255, (light == -1 ? gr_frontsector->extra_colormap : *gr_frontsector->lightlist[light].extra_colormap)); polyobjsector, 255, (light == -1 ? gr_frontsector->extra_colormap : *gr_frontsector->lightlist[light].extra_colormap));
} }
} }
@ -5420,14 +5368,20 @@ static void HWR_DrawSprites(void)
if (!cv_grmodels.value || md2_playermodels[(skin_t*)spr->mobj->skin-skins].notfound || md2_playermodels[(skin_t*)spr->mobj->skin-skins].scale < 0.0f) if (!cv_grmodels.value || md2_playermodels[(skin_t*)spr->mobj->skin-skins].notfound || md2_playermodels[(skin_t*)spr->mobj->skin-skins].scale < 0.0f)
HWR_DrawSprite(spr); HWR_DrawSprite(spr);
else else
HWR_DrawModel(spr); {
if (!HWR_DrawModel(spr))
HWR_DrawSprite(spr);
}
} }
else else
{ {
if (!cv_grmodels.value || md2_models[spr->mobj->sprite].notfound || md2_models[spr->mobj->sprite].scale < 0.0f) if (!cv_grmodels.value || md2_models[spr->mobj->sprite].notfound || md2_models[spr->mobj->sprite].scale < 0.0f)
HWR_DrawSprite(spr); HWR_DrawSprite(spr);
else else
HWR_DrawModel(spr); {
if (!HWR_DrawModel(spr))
HWR_DrawSprite(spr);
}
} }
} }
} }
@ -5941,7 +5895,7 @@ static void HWR_DrawSkyBackground(player_t *player)
{ {
if (cv_grskydome.value) if (cv_grskydome.value)
{ {
FTransform transform; FTransform dometransform;
const float fpov = FIXED_TO_FLOAT(cv_grfov.value+player->fovadd); const float fpov = FIXED_TO_FLOAT(cv_grfov.value+player->fovadd);
postimg_t *type; postimg_t *type;
@ -5950,27 +5904,27 @@ static void HWR_DrawSkyBackground(player_t *player)
else else
type = &postimgtype; type = &postimgtype;
memset(&transform, 0x00, sizeof(FTransform)); memset(&dometransform, 0x00, sizeof(FTransform));
//04/01/2000: Hurdler: added for T&L //04/01/2000: Hurdler: added for T&L
// It should replace all other gr_viewxxx when finished // It should replace all other gr_viewxxx when finished
transform.anglex = (float)(aimingangle>>ANGLETOFINESHIFT)*(360.0f/(float)FINEANGLES); dometransform.anglex = (float)(aimingangle>>ANGLETOFINESHIFT)*(360.0f/(float)FINEANGLES);
transform.angley = (float)((viewangle-ANGLE_270)>>ANGLETOFINESHIFT)*(360.0f/(float)FINEANGLES); dometransform.angley = (float)((viewangle-ANGLE_270)>>ANGLETOFINESHIFT)*(360.0f/(float)FINEANGLES);
if (*type == postimg_flip) if (*type == postimg_flip)
transform.flip = true; dometransform.flip = true;
else else
transform.flip = false; dometransform.flip = false;
transform.scalex = 1; dometransform.scalex = 1;
transform.scaley = (float)vid.width/vid.height; dometransform.scaley = (float)vid.width/vid.height;
transform.scalez = 1; dometransform.scalez = 1;
transform.fovxangle = fpov; // Tails dometransform.fovxangle = fpov; // Tails
transform.fovyangle = fpov; // Tails dometransform.fovyangle = fpov; // Tails
transform.splitscreen = splitscreen; dometransform.splitscreen = splitscreen;
HWR_GetTexture(texturetranslation[skytexture]); HWR_GetTexture(texturetranslation[skytexture]);
HWD.pfnRenderSkyDome(skytexture, textures[skytexture]->width, textures[skytexture]->height, transform); HWD.pfnRenderSkyDome(skytexture, textures[skytexture]->width, textures[skytexture]->height, dometransform);
} }
else else
{ {
@ -6172,6 +6126,8 @@ void HWR_RenderSkyboxView(INT32 viewnumber, player_t *player)
//04/01/2000: Hurdler: added for T&L //04/01/2000: Hurdler: added for T&L
// It should replace all other gr_viewxxx when finished // It should replace all other gr_viewxxx when finished
memset(&atransform, 0x00, sizeof(FTransform));
atransform.anglex = (float)(aimingangle>>ANGLETOFINESHIFT)*(360.0f/(float)FINEANGLES); atransform.anglex = (float)(aimingangle>>ANGLETOFINESHIFT)*(360.0f/(float)FINEANGLES);
atransform.angley = (float)(viewangle>>ANGLETOFINESHIFT)*(360.0f/(float)FINEANGLES); atransform.angley = (float)(viewangle>>ANGLETOFINESHIFT)*(360.0f/(float)FINEANGLES);
@ -6390,6 +6346,8 @@ void HWR_RenderPlayerView(INT32 viewnumber, player_t *player)
//04/01/2000: Hurdler: added for T&L //04/01/2000: Hurdler: added for T&L
// It should replace all other gr_viewxxx when finished // It should replace all other gr_viewxxx when finished
memset(&atransform, 0x00, sizeof(FTransform));
atransform.anglex = (float)(aimingangle>>ANGLETOFINESHIFT)*(360.0f/(float)FINEANGLES); atransform.anglex = (float)(aimingangle>>ANGLETOFINESHIFT)*(360.0f/(float)FINEANGLES);
atransform.angley = (float)(viewangle>>ANGLETOFINESHIFT)*(360.0f/(float)FINEANGLES); atransform.angley = (float)(viewangle>>ANGLETOFINESHIFT)*(360.0f/(float)FINEANGLES);
@ -6584,59 +6542,125 @@ static void HWR_FoggingOn(void)
// 3D ENGINE COMMANDS // 3D ENGINE COMMANDS
// ========================================================================== // ==========================================================================
static CV_PossibleValue_t grsoftwarefog_cons_t[] = {{0, "Off"}, {1, "On"}, {2, "LightPlanes"}, {0, NULL}};
static CV_PossibleValue_t grmodelinterpolation_cons_t[] = {{0, "Off"}, {1, "Sometimes"}, {2, "Always"}, {0, NULL}};
static void CV_grFov_OnChange(void) static void CV_grmodellighting_OnChange(void);
static void CV_grfiltermode_OnChange(void);
static void CV_granisotropic_OnChange(void);
static void CV_grfogdensity_OnChange(void);
static void CV_grfov_OnChange(void);
static CV_PossibleValue_t grfov_cons_t[] = {{0, "MIN"}, {179*FRACUNIT, "MAX"}, {0, NULL}};
static CV_PossibleValue_t grfiltermode_cons_t[]= {{HWD_SET_TEXTUREFILTER_POINTSAMPLED, "Nearest"},
{HWD_SET_TEXTUREFILTER_BILINEAR, "Bilinear"}, {HWD_SET_TEXTUREFILTER_TRILINEAR, "Trilinear"},
{HWD_SET_TEXTUREFILTER_MIXED1, "Linear_Nearest"},
{HWD_SET_TEXTUREFILTER_MIXED2, "Nearest_Linear"},
{HWD_SET_TEXTUREFILTER_MIXED3, "Nearest_Mipmap"},
{0, NULL}};
CV_PossibleValue_t granisotropicmode_cons_t[] = {{1, "MIN"}, {16, "MAX"}, {0, NULL}};
consvar_t cv_grfovchange = {"gr_fovchange", "Off", CV_SAVE, CV_OnOff, NULL, 0, NULL, NULL, 0, 0, NULL};
consvar_t cv_grfog = {"gr_fog", "On", CV_SAVE, CV_OnOff, NULL, 0, NULL, NULL, 0, 0, NULL};
consvar_t cv_grfogcolor = {"gr_fogcolor", "AAAAAA", CV_SAVE, NULL, NULL, 0, NULL, NULL, 0, 0, NULL};
consvar_t cv_grsoftwarefog = {"gr_softwarefog", "Off", CV_SAVE, grsoftwarefog_cons_t, NULL, 0, NULL, NULL, 0, 0, NULL};
#ifdef ALAM_LIGHTING
consvar_t cv_grdynamiclighting = {"gr_dynamiclighting", "On", CV_SAVE, CV_OnOff, NULL, 0, NULL, NULL, 0, 0, NULL};
consvar_t cv_grstaticlighting = {"gr_staticlighting", "On", CV_SAVE, CV_OnOff, NULL, 0, NULL, NULL, 0, 0, NULL};
consvar_t cv_grcoronas = {"gr_coronas", "On", CV_SAVE, CV_OnOff, NULL, 0, NULL, NULL, 0, 0, NULL};
consvar_t cv_grcoronasize = {"gr_coronasize", "1", CV_SAVE|CV_FLOAT, 0, NULL, 0, NULL, NULL, 0, 0, NULL};
#endif
consvar_t cv_grmodels = {"gr_models", "Off", CV_SAVE, CV_OnOff, NULL, 0, NULL, NULL, 0, 0, NULL};
consvar_t cv_grmodelinterpolation = {"gr_modelinterpolation", "Sometimes", CV_SAVE, grmodelinterpolation_cons_t, NULL, 0, NULL, NULL, 0, 0, NULL};
consvar_t cv_grmodellighting = {"gr_modellighting", "Off", CV_SAVE|CV_CALL, CV_OnOff, CV_grmodellighting_OnChange, 0, NULL, NULL, 0, 0, NULL};
consvar_t cv_grspritebillboarding = {"gr_spritebillboarding", "Off", CV_SAVE, CV_OnOff, NULL, 0, NULL, NULL, 0, 0, NULL};
consvar_t cv_grskydome = {"gr_skydome", "On", CV_SAVE, CV_OnOff, NULL, 0, NULL, NULL, 0, 0, NULL};
consvar_t cv_grrounddown = {"gr_rounddown", "Off", 0, CV_OnOff, NULL, 0, NULL, NULL, 0, 0, NULL};
consvar_t cv_grfov = {"gr_fov", "90", CV_FLOAT|CV_CALL, grfov_cons_t, CV_grfov_OnChange, 0, NULL, NULL, 0, 0, NULL};
consvar_t cv_grfogdensity = {"gr_fogdensity", "150", CV_CALL|CV_NOINIT, CV_Unsigned,
CV_grfogdensity_OnChange, 0, NULL, NULL, 0, 0, NULL};
consvar_t cv_grfiltermode = {"gr_filtermode", "Nearest", CV_SAVE|CV_CALL, grfiltermode_cons_t,
CV_grfiltermode_OnChange, 0, NULL, NULL, 0, 0, NULL};
consvar_t cv_granisotropicmode = {"gr_anisotropicmode", "1", CV_CALL, granisotropicmode_cons_t,
CV_granisotropic_OnChange, 0, NULL, NULL, 0, 0, NULL};
consvar_t cv_grcorrecttricks = {"gr_correcttricks", "Off", 0, CV_OnOff, NULL, 0, NULL, NULL, 0, 0, NULL};
consvar_t cv_grsolvetjoin = {"gr_solvetjoin", "On", 0, CV_OnOff, NULL, 0, NULL, NULL, 0, 0, NULL};
static void CV_grmodellighting_OnChange(void)
{
if (rendermode == render_opengl)
HWD.pfnSetSpecialState(HWD_SET_MODEL_LIGHTING, cv_grmodellighting.value);
}
static void CV_grfogdensity_OnChange(void)
{
if (rendermode == render_opengl)
HWD.pfnSetSpecialState(HWD_SET_FOG_DENSITY, cv_grfogdensity.value);
}
static void CV_grfiltermode_OnChange(void)
{
if (rendermode == render_opengl)
HWD.pfnSetSpecialState(HWD_SET_TEXTUREFILTERMODE, cv_grfiltermode.value);
}
static void CV_granisotropic_OnChange(void)
{
if (rendermode == render_opengl)
HWD.pfnSetSpecialState(HWD_SET_TEXTUREANISOTROPICMODE, cv_granisotropicmode.value);
}
static void CV_grfov_OnChange(void)
{ {
if ((netgame || multiplayer) && !cv_debug && cv_grfov.value != 90*FRACUNIT) if ((netgame || multiplayer) && !cv_debug && cv_grfov.value != 90*FRACUNIT)
CV_Set(&cv_grfov, cv_grfov.defaultvalue); CV_Set(&cv_grfov, cv_grfov.defaultvalue);
} }
static void Command_GrStats_f(void)
{
Z_CheckHeap(9875); // debug
CONS_Printf(M_GetText("Patch info headers: %7s kb\n"), sizeu1(Z_TagUsage(PU_HWRPATCHINFO)>>10));
CONS_Printf(M_GetText("3D Texture cache : %7s kb\n"), sizeu1(Z_TagUsage(PU_HWRCACHE)>>10));
CONS_Printf(M_GetText("Plane polygon : %7s kb\n"), sizeu1(Z_TagUsage(PU_HWRPLANE)>>10));
}
// **************************************************************************
// 3D ENGINE SETUP
// **************************************************************************
// --------------------------------------------------------------------------
// Add hardware engine commands & consvars
// --------------------------------------------------------------------------
//added by Hurdler: console varibale that are saved //added by Hurdler: console varibale that are saved
void HWR_AddCommands(void) void HWR_AddCommands(void)
{ {
CV_RegisterVar(&cv_grrounddown); CV_RegisterVar(&cv_grfovchange);
CV_RegisterVar(&cv_grfov); CV_RegisterVar(&cv_grfov);
CV_RegisterVar(&cv_grfogdensity); CV_RegisterVar(&cv_grfogdensity);
CV_RegisterVar(&cv_grfogcolor);
CV_RegisterVar(&cv_grfog);
CV_RegisterVar(&cv_grsoftwarefog);
#ifdef ALAM_LIGHTING
CV_RegisterVar(&cv_grstaticlighting);
CV_RegisterVar(&cv_grdynamiclighting);
CV_RegisterVar(&cv_grcoronasize);
CV_RegisterVar(&cv_grcoronas);
#endif
CV_RegisterVar(&cv_grmodellighting);
CV_RegisterVar(&cv_grmodelinterpolation);
CV_RegisterVar(&cv_grmodels);
CV_RegisterVar(&cv_grskydome);
CV_RegisterVar(&cv_grspritebillboarding);
CV_RegisterVar(&cv_grfiltermode); CV_RegisterVar(&cv_grfiltermode);
CV_RegisterVar(&cv_granisotropicmode); CV_RegisterVar(&cv_grrounddown);
CV_RegisterVar(&cv_grcorrecttricks); CV_RegisterVar(&cv_grcorrecttricks);
CV_RegisterVar(&cv_grsolvetjoin); CV_RegisterVar(&cv_grsolvetjoin);
}
static inline void HWR_AddEngineCommands(void)
{
// engine state variables
//CV_RegisterVar(&cv_grzbuffer);
#ifndef NEWCLIP #ifndef NEWCLIP
CV_RegisterVar(&cv_grclipwalls); CV_RegisterVar(&cv_grclipwalls);
#endif #endif
// engine development mode variables
// - usage may vary from version to version..
CV_RegisterVar(&cv_gralpha);
CV_RegisterVar(&cv_grbeta);
// engine commands
COM_AddCommand("gr_stats", Command_GrStats_f);
} }
void HWR_AddSessionCommands(void)
{
CV_RegisterVar(&cv_granisotropicmode);
}
// -------------------------------------------------------------------------- // --------------------------------------------------------------------------
// Setup the hardware renderer // Setup the hardware renderer
@ -6657,12 +6681,9 @@ void HWR_Startup(void)
{ {
CONS_Printf("HWR_Startup()...\n"); CONS_Printf("HWR_Startup()...\n");
HWR_InitPolyPool(); HWR_InitPolyPool();
// add console cmds & vars HWR_AddSessionCommands();
HWR_AddEngineCommands();
HWR_InitTextureCache(); HWR_InitTextureCache();
HWR_InitModels(); HWR_InitModels();
#ifdef ALAM_LIGHTING #ifdef ALAM_LIGHTING
HWR_InitLight(); HWR_InitLight();
#endif #endif
@ -6683,6 +6704,7 @@ void HWR_Shutdown(void)
CONS_Printf("HWR_Shutdown()\n"); CONS_Printf("HWR_Shutdown()\n");
HWR_FreeExtraSubsectors(); HWR_FreeExtraSubsectors();
HWR_FreePolyPool(); HWR_FreePolyPool();
HWR_FreeMipmapCache();
HWR_FreeTextureCache(); HWR_FreeTextureCache();
HWD.pfnFlushScreenTextures(); HWD.pfnFlushScreenTextures();
} }

View File

@ -47,7 +47,7 @@ void HWR_DrawCroppedPatch(GLPatch_t *gpatch, fixed_t x, fixed_t y, fixed_t scale
void HWR_MakePatch(const patch_t *patch, GLPatch_t *grPatch, GLMipmap_t *grMipmap, boolean makebitmap); void HWR_MakePatch(const patch_t *patch, GLPatch_t *grPatch, GLMipmap_t *grMipmap, boolean makebitmap);
void HWR_CreatePlanePolygons(INT32 bspnum); void HWR_CreatePlanePolygons(INT32 bspnum);
void HWR_CreateStaticLightmaps(INT32 bspnum); void HWR_CreateStaticLightmaps(INT32 bspnum);
void HWR_PrepLevelCache(size_t pnumtextures); void HWR_LoadTextures(size_t pnumtextures);
void HWR_DrawFill(INT32 x, INT32 y, INT32 w, INT32 h, INT32 color); void HWR_DrawFill(INT32 x, INT32 y, INT32 w, INT32 h, INT32 color);
void HWR_DrawFadeFill(INT32 x, INT32 y, INT32 w, INT32 h, INT32 color, UINT16 actualcolor, UINT8 strength); void HWR_DrawFadeFill(INT32 x, INT32 y, INT32 w, INT32 h, INT32 color, UINT16 actualcolor, UINT8 strength);
void HWR_DrawConsoleFill(INT32 x, INT32 y, INT32 w, INT32 h, INT32 color, UINT32 actualcolor); // Lat: separate flags from color since color needs to be an uint to work right. void HWR_DrawConsoleFill(INT32 x, INT32 y, INT32 w, INT32 h, INT32 color, UINT32 actualcolor); // Lat: separate flags from color since color needs to be an uint to work right.
@ -57,6 +57,7 @@ UINT8 *HWR_GetScreenshot(void);
boolean HWR_Screenshot(const char *pathname); boolean HWR_Screenshot(const char *pathname);
void HWR_AddCommands(void); void HWR_AddCommands(void);
void HWR_AddSessionCommands(void);
void HWR_CorrectSWTricks(void); void HWR_CorrectSWTricks(void);
void transform(float *cx, float *cy, float *cz); void transform(float *cx, float *cy, float *cz);
FBITFIELD HWR_TranstableToAlpha(INT32 transtablenum, FSurfaceInfo *pSurf); FBITFIELD HWR_TranstableToAlpha(INT32 transtablenum, FSurfaceInfo *pSurf);
@ -85,13 +86,11 @@ extern consvar_t cv_grcoronasize;
extern consvar_t cv_grfov; extern consvar_t cv_grfov;
extern consvar_t cv_grmodels; extern consvar_t cv_grmodels;
extern consvar_t cv_grmodelinterpolation; extern consvar_t cv_grmodelinterpolation;
extern consvar_t cv_grmodellighting;
extern consvar_t cv_grfog; extern consvar_t cv_grfog;
extern consvar_t cv_grfogcolor; extern consvar_t cv_grfogcolor;
extern consvar_t cv_grfogdensity; extern consvar_t cv_grfogdensity;
extern consvar_t cv_grsoftwarefog; extern consvar_t cv_grsoftwarefog;
extern consvar_t cv_grgammared;
extern consvar_t cv_grgammagreen;
extern consvar_t cv_grgammablue;
extern consvar_t cv_grfiltermode; extern consvar_t cv_grfiltermode;
extern consvar_t cv_granisotropicmode; extern consvar_t cv_granisotropicmode;
extern consvar_t cv_grcorrecttricks; extern consvar_t cv_grcorrecttricks;

View File

@ -239,7 +239,7 @@ static GrTextureFormat_t PNG_Load(const char *filename, int *w, int *h, GLPatch_
{ {
png_uint_32 i, pitch = png_get_rowbytes(png_ptr, png_info_ptr); png_uint_32 i, pitch = png_get_rowbytes(png_ptr, png_info_ptr);
png_bytep PNG_image = Z_Malloc(pitch*height, PU_HWRCACHE, &grpatch->mipmap->grInfo.data); png_bytep PNG_image = Z_Malloc(pitch*height, PU_HWRMODELTEXTURE, &grpatch->mipmap->grInfo.data);
png_bytepp row_pointers = png_malloc(png_ptr, height * sizeof (png_bytep)); png_bytepp row_pointers = png_malloc(png_ptr, height * sizeof (png_bytep));
for (i = 0; i < height; i++) for (i = 0; i < height; i++)
row_pointers[i] = PNG_image + i*pitch; row_pointers[i] = PNG_image + i*pitch;
@ -313,7 +313,7 @@ static GrTextureFormat_t PCX_Load(const char *filename, int *w, int *h,
pw = *w = header.xmax - header.xmin + 1; pw = *w = header.xmax - header.xmin + 1;
ph = *h = header.ymax - header.ymin + 1; ph = *h = header.ymax - header.ymin + 1;
image = Z_Malloc(pw*ph*4, PU_HWRCACHE, &grpatch->mipmap->grInfo.data); image = Z_Malloc(pw*ph*4, PU_HWRMODELTEXTURE, &grpatch->mipmap->grInfo.data);
if (fread(palette, sizeof (UINT8), PALSIZE, file) != PALSIZE) if (fread(palette, sizeof (UINT8), PALSIZE, file) != PALSIZE)
{ {
@ -373,6 +373,9 @@ static void md2_loadTexture(md2_t *model)
if (!grpatch->mipmap->downloaded && !grpatch->mipmap->grInfo.data) if (!grpatch->mipmap->downloaded && !grpatch->mipmap->grInfo.data)
{ {
int w = 0, h = 0; int w = 0, h = 0;
UINT32 size;
RGBA_t *image;
#ifdef HAVE_PNG #ifdef HAVE_PNG
grpatch->mipmap->grInfo.format = PNG_Load(filename, &w, &h, grpatch); grpatch->mipmap->grInfo.format = PNG_Load(filename, &w, &h, grpatch);
if (grpatch->mipmap->grInfo.format == 0) if (grpatch->mipmap->grInfo.format == 0)
@ -389,6 +392,15 @@ static void md2_loadTexture(md2_t *model)
grpatch->mipmap->width = (UINT16)w; grpatch->mipmap->width = (UINT16)w;
grpatch->mipmap->height = (UINT16)h; grpatch->mipmap->height = (UINT16)h;
// Lactozilla: Apply colour cube
image = grpatch->mipmap->grInfo.data;
size = w*h;
while (size--)
{
V_CubeApply(&image->s.red, &image->s.green, &image->s.blue);
image++;
}
#ifdef GLIDE_API_COMPATIBILITY #ifdef GLIDE_API_COMPATIBILITY
// not correct! // not correct!
grpatch->mipmap->grInfo.smallLodLog2 = GR_LOD_LOG2_256; grpatch->mipmap->grInfo.smallLodLog2 = GR_LOD_LOG2_256;
@ -397,7 +409,6 @@ static void md2_loadTexture(md2_t *model)
#endif #endif
} }
HWD.pfnSetTexture(grpatch->mipmap); HWD.pfnSetTexture(grpatch->mipmap);
HWR_UnlockCachedPatch(grpatch);
} }
// -----------------+ // -----------------+
@ -453,7 +464,6 @@ static void md2_loadBlendTexture(md2_t *model)
#endif #endif
} }
HWD.pfnSetTexture(grpatch->mipmap); // We do need to do this so that it can be cleared and knows to recreate it when necessary HWD.pfnSetTexture(grpatch->mipmap); // We do need to do this so that it can be cleared and knows to recreate it when necessary
HWR_UnlockCachedPatch(grpatch);
Z_Free(filename); Z_Free(filename);
} }
@ -637,18 +647,20 @@ spritemd2found:
// 0.7152 to green // 0.7152 to green
// 0.0722 to blue // 0.0722 to blue
#define SETBRIGHTNESS(brightness,r,g,b) \ #define SETBRIGHTNESS(brightness,r,g,b) \
brightness = (UINT8)(((1063*((UINT16)r)/5000) + (3576*((UINT16)g)/5000) + (361*((UINT16)b)/5000)) / 3) brightness = (UINT8)(((1063*(UINT16)(r))/5000) + ((3576*(UINT16)(g))/5000) + ((361*(UINT16)(b))/5000))
static void HWR_CreateBlendedTexture(GLPatch_t *gpatch, GLPatch_t *blendgpatch, GLMipmap_t *grmip, INT32 skinnum, skincolors_t color) static void HWR_CreateBlendedTexture(GLPatch_t *gpatch, GLPatch_t *blendgpatch, GLMipmap_t *grmip, INT32 skinnum, skincolors_t color)
{ {
UINT8 i;
UINT16 w = gpatch->width, h = gpatch->height; UINT16 w = gpatch->width, h = gpatch->height;
UINT32 size = w*h; UINT32 size = w*h;
RGBA_t *image, *blendimage, *cur, blendcolor; RGBA_t *image, *blendimage, *cur, blendcolor;
// vanilla port
UINT8 translation[16];
memset(translation, 0, sizeof(translation));
if (grmip->width == 0) if (grmip->width == 0)
{ {
grmip->width = gpatch->width; grmip->width = gpatch->width;
grmip->height = gpatch->height; grmip->height = gpatch->height;
@ -658,46 +670,58 @@ static void HWR_CreateBlendedTexture(GLPatch_t *gpatch, GLPatch_t *blendgpatch,
grmip->grInfo.format = GR_RGBA; grmip->grInfo.format = GR_RGBA;
} }
Z_Free(grmip->grInfo.data); if (grmip->grInfo.data)
grmip->grInfo.data = NULL; {
Z_Free(grmip->grInfo.data);
grmip->grInfo.data = NULL;
}
cur = Z_Malloc(size*4, PU_HWRCACHE, &grmip->grInfo.data); cur = Z_Malloc(size*4, PU_HWRMODELTEXTURE, &grmip->grInfo.data);
memset(cur, 0x00, size*4); memset(cur, 0x00, size*4);
image = gpatch->mipmap->grInfo.data; image = gpatch->mipmap->grInfo.data;
blendimage = blendgpatch->mipmap->grInfo.data; blendimage = blendgpatch->mipmap->grInfo.data;
blendcolor = V_GetColor(0); // initialize
// Average all of the translation's colors if (color != SKINCOLOR_NONE)
if (color == SKINCOLOR_NONE || color >= MAXTRANSLATIONS) memcpy(&translation, &Color_Index[color - 1], 16);
blendcolor = V_GetColor(0xff);
else while (size--)
{ {
const UINT8 div = 6; if (skinnum == TC_BOSS)
const UINT8 start = 4;
UINT32 r, g, b;
blendcolor = V_GetColor(Color_Index[color-1][start]);
r = (UINT32)(blendcolor.s.red*blendcolor.s.red);
g = (UINT32)(blendcolor.s.green*blendcolor.s.green);
b = (UINT32)(blendcolor.s.blue*blendcolor.s.blue);
for (i = 1; i < div; i++)
{ {
RGBA_t nextcolor = V_GetColor(Color_Index[color-1][start+i]); // Turn everything below a certain threshold white
r += (UINT32)(nextcolor.s.red*nextcolor.s.red); if ((image->s.red == image->s.green) && (image->s.green == image->s.blue) && image->s.blue <= 82)
g += (UINT32)(nextcolor.s.green*nextcolor.s.green); {
b += (UINT32)(nextcolor.s.blue*nextcolor.s.blue); // Lactozilla: Invert the colors
cur->s.red = cur->s.green = cur->s.blue = (255 - image->s.blue);
}
else
{
cur->s.red = image->s.red;
cur->s.green = image->s.green;
cur->s.blue = image->s.blue;
}
cur->s.alpha = image->s.alpha;
} }
else if (skinnum == TC_METALSONIC)
{
// Turn everything below a certain blue threshold white
if (image->s.red == 0 && image->s.green == 0 && image->s.blue <= 82)
{
cur->s.red = cur->s.green = cur->s.blue = 255;
}
else
{
cur->s.red = image->s.red;
cur->s.green = image->s.green;
cur->s.blue = image->s.blue;
}
blendcolor.s.red = (UINT8)(FixedSqrt((r/div)<<FRACBITS)>>FRACBITS); cur->s.alpha = image->s.alpha;
blendcolor.s.green = (UINT8)(FixedSqrt((g/div)<<FRACBITS)>>FRACBITS); }
blendcolor.s.blue = (UINT8)(FixedSqrt((b/div)<<FRACBITS)>>FRACBITS); else if (skinnum == TC_DASHMODE)
}
// rainbow support, could theoretically support boss ones too
if (skinnum == TC_RAINBOW)
{
while (size--)
{ {
if (image->s.alpha == 0 && blendimage->s.alpha == 0) if (image->s.alpha == 0 && blendimage->s.alpha == 0)
{ {
@ -706,65 +730,215 @@ static void HWR_CreateBlendedTexture(GLPatch_t *gpatch, GLPatch_t *blendgpatch,
} }
else else
{ {
UINT32 tempcolor; UINT8 ialpha = 255 - blendimage->s.alpha, balpha = blendimage->s.alpha;
UINT16 imagebright, blendbright, finalbright, colorbright; RGBA_t icolor = *image, bcolor;
SETBRIGHTNESS(imagebright,image->s.red,image->s.green,image->s.blue);
SETBRIGHTNESS(blendbright,blendimage->s.red,blendimage->s.green,blendimage->s.blue);
// slightly dumb average between the blend image color and base image colour, usually one or the other will be fully opaque anyway
finalbright = (imagebright*(255-blendimage->s.alpha))/255 + (blendbright*blendimage->s.alpha)/255;
SETBRIGHTNESS(colorbright,blendcolor.s.red,blendcolor.s.green,blendcolor.s.blue);
tempcolor = (finalbright*blendcolor.s.red)/colorbright; memset(&bcolor, 0x00, sizeof(RGBA_t));
tempcolor = min(255, tempcolor);
cur->s.red = (UINT8)tempcolor; if (blendimage->s.alpha)
tempcolor = (finalbright*blendcolor.s.green)/colorbright; {
tempcolor = min(255, tempcolor); bcolor.s.blue = 0;
cur->s.green = (UINT8)tempcolor; bcolor.s.red = 255;
tempcolor = (finalbright*blendcolor.s.blue)/colorbright; bcolor.s.green = (blendimage->s.red + blendimage->s.green + blendimage->s.blue) / 3;
tempcolor = min(255, tempcolor); }
cur->s.blue = (UINT8)tempcolor; if (image->s.alpha && image->s.red > image->s.green << 1) // this is pretty arbitrary, but it works well for Metal Sonic
{
icolor.s.red = image->s.blue;
icolor.s.blue = image->s.red;
}
cur->s.red = (ialpha * icolor.s.red + balpha * bcolor.s.red)/255;
cur->s.green = (ialpha * icolor.s.green + balpha * bcolor.s.green)/255;
cur->s.blue = (ialpha * icolor.s.blue + balpha * bcolor.s.blue)/255;
cur->s.alpha = image->s.alpha; cur->s.alpha = image->s.alpha;
} }
cur++; image++; blendimage++;
} }
} else if (skinnum == TC_ALLWHITE)
else
{
while (size--)
{ {
if (blendimage->s.alpha == 0) // Turn everything white
cur->s.red = cur->s.green = cur->s.blue = 255;
cur->s.alpha = image->s.alpha;
}
else
{
UINT16 brightness;
// Don't bother with blending the pixel if the alpha of the blend pixel is 0
if (skinnum == TC_RAINBOW)
{ {
// Don't bother with blending the pixel if the alpha of the blend pixel is 0 if (image->s.alpha == 0 && blendimage->s.alpha == 0)
cur->rgba = image->rgba; {
cur->rgba = image->rgba;
cur++; image++; blendimage++;
continue;
}
else
{
UINT16 imagebright, blendbright;
SETBRIGHTNESS(imagebright,image->s.red,image->s.green,image->s.blue);
SETBRIGHTNESS(blendbright,blendimage->s.red,blendimage->s.green,blendimage->s.blue);
// slightly dumb average between the blend image color and base image colour, usually one or the other will be fully opaque anyway
brightness = (imagebright*(255-blendimage->s.alpha))/255 + (blendbright*blendimage->s.alpha)/255;
}
} }
else else
{ {
INT32 tempcolor; if (blendimage->s.alpha == 0)
INT16 tempmult, tempalpha; {
tempalpha = -(abs(blendimage->s.red-127)-127)*2; cur->rgba = image->rgba;
if (tempalpha > 255) cur++; image++; blendimage++;
tempalpha = 255; continue;
else if (tempalpha < 0) }
tempalpha = 0; else
{
SETBRIGHTNESS(brightness,blendimage->s.red,blendimage->s.green,blendimage->s.blue);
}
}
tempmult = (blendimage->s.red-127)*2; // Calculate a sort of "gradient" for the skincolor
if (tempmult > 255) // (Me splitting this into a function didn't work, so I had to ruin this entire function's groove...)
tempmult = 255; {
else if (tempmult < 0) RGBA_t nextcolor;
tempmult = 0; UINT8 firsti, secondi, mul;
UINT32 r, g, b;
tempcolor = (image->s.red*(255-blendimage->s.alpha))/255 + ((tempmult + ((tempalpha*blendcolor.s.red)/255)) * blendimage->s.alpha)/255; // Rainbow needs to find the closest match to the textures themselves, instead of matching brightnesses to other colors.
// Ensue horrible mess.
if (skinnum == TC_RAINBOW)
{
UINT16 brightdif = 256;
UINT8 colorbrightnesses[16];
INT32 compare, m, d;
UINT8 i;
// Ignore pure white & pitch black
if (brightness > 253 || brightness < 2)
{
cur->rgba = image->rgba;
cur++; image++; blendimage++;
continue;
}
firsti = 0;
mul = 0;
for (i = 0; i < 16; i++)
{
RGBA_t tempc = V_GetColor(translation[i]);
SETBRIGHTNESS(colorbrightnesses[i], tempc.s.red, tempc.s.green, tempc.s.blue); // store brightnesses for comparison
}
for (i = 0; i < 16; i++)
{
if (brightness > colorbrightnesses[i]) // don't allow greater matches (because calculating a makeshift gradient for this is already a huge mess as is)
continue;
compare = abs((INT16)(colorbrightnesses[i]) - (INT16)(brightness));
if (compare < brightdif)
{
brightdif = (UINT16)compare;
firsti = i; // best matching color that's equal brightness or darker
}
}
secondi = firsti+1; // next color in line
if (secondi == 16)
{
m = (INT16)brightness; // - 0;
d = (INT16)colorbrightnesses[firsti]; // - 0;
}
else
{
m = (INT16)brightness - (INT16)colorbrightnesses[secondi];
d = (INT16)colorbrightnesses[firsti] - (INT16)colorbrightnesses[secondi];
}
if (m >= d)
m = d-1;
// calculate the "gradient" multiplier based on how close this color is to the one next in line
if (m <= 0 || d <= 0)
mul = 0;
else
mul = 15 - ((m * 16) / d);
}
else
{
// Thankfully, it's normally way more simple.
// Just convert brightness to a skincolor value, use remainder to find the gradient multipler
firsti = ((UINT8)(255-brightness) / 16);
secondi = firsti+1;
mul = ((UINT8)(255-brightness) % 16);
}
blendcolor = V_GetColor(translation[firsti]);
if (mul > 0 // If it's 0, then we only need the first color.
&& translation[firsti] != translation[secondi]) // Some colors have duplicate colors in a row, so let's just save the process
{
if (secondi == 16) // blend to black
nextcolor = V_GetColor(31);
else
nextcolor = V_GetColor(translation[secondi]);
// Find difference between points
r = (UINT32)(nextcolor.s.red - blendcolor.s.red);
g = (UINT32)(nextcolor.s.green - blendcolor.s.green);
b = (UINT32)(nextcolor.s.blue - blendcolor.s.blue);
// Find the gradient of the two points
r = ((mul * r) / 16);
g = ((mul * g) / 16);
b = ((mul * b) / 16);
// Add gradient value to color
blendcolor.s.red += r;
blendcolor.s.green += g;
blendcolor.s.blue += b;
}
}
if (skinnum == TC_RAINBOW)
{
UINT32 tempcolor;
UINT16 colorbright;
SETBRIGHTNESS(colorbright,blendcolor.s.red,blendcolor.s.green,blendcolor.s.blue);
if (colorbright == 0)
colorbright = 1; // no dividing by 0 please
tempcolor = (brightness * blendcolor.s.red) / colorbright;
tempcolor = min(255, tempcolor);
cur->s.red = (UINT8)tempcolor; cur->s.red = (UINT8)tempcolor;
tempcolor = (image->s.green*(255-blendimage->s.alpha))/255 + ((tempmult + ((tempalpha*blendcolor.s.green)/255)) * blendimage->s.alpha)/255;
tempcolor = (brightness * blendcolor.s.green) / colorbright;
tempcolor = min(255, tempcolor);
cur->s.green = (UINT8)tempcolor; cur->s.green = (UINT8)tempcolor;
tempcolor = (image->s.blue*(255-blendimage->s.alpha))/255 + ((tempmult + ((tempalpha*blendcolor.s.blue)/255)) * blendimage->s.alpha)/255;
tempcolor = (brightness * blendcolor.s.blue) / colorbright;
tempcolor = min(255, tempcolor);
cur->s.blue = (UINT8)tempcolor; cur->s.blue = (UINT8)tempcolor;
cur->s.alpha = image->s.alpha; cur->s.alpha = image->s.alpha;
} }
else
{
// Color strength depends on image alpha
INT32 tempcolor;
cur++; image++; blendimage++; tempcolor = ((image->s.red * (255-blendimage->s.alpha)) / 255) + ((blendcolor.s.red * blendimage->s.alpha) / 255);
tempcolor = min(255, tempcolor);
cur->s.red = (UINT8)tempcolor;
tempcolor = ((image->s.green * (255-blendimage->s.alpha)) / 255) + ((blendcolor.s.green * blendimage->s.alpha) / 255);
tempcolor = min(255, tempcolor);
cur->s.green = (UINT8)tempcolor;
tempcolor = ((image->s.blue * (255-blendimage->s.alpha)) / 255) + ((blendcolor.s.blue * blendimage->s.alpha) / 255);
tempcolor = min(255, tempcolor);
cur->s.blue = (UINT8)tempcolor;
cur->s.alpha = image->s.alpha;
}
} }
cur++; image++; blendimage++;
} }
return; return;
@ -777,24 +951,24 @@ static void HWR_GetBlendedTexture(GLPatch_t *gpatch, GLPatch_t *blendgpatch, INT
// mostly copied from HWR_GetMappedPatch, hence the similarities and comment // mostly copied from HWR_GetMappedPatch, hence the similarities and comment
GLMipmap_t *grmip, *newmip; GLMipmap_t *grmip, *newmip;
if (colormap == colormaps || colormap == NULL) if ((colormap == colormaps || colormap == NULL) && (skinnum > TC_DEFAULT))
{ {
// Don't do any blending // Don't do any blending
HWD.pfnSetTexture(gpatch->mipmap); HWD.pfnSetTexture(gpatch->mipmap);
return; return;
} }
// search for the mimmap // search for the mipmap
// skip the first (no colormap translated) // skip the first (no colormap translated)
for (grmip = gpatch->mipmap; grmip->nextcolormap; ) for (grmip = gpatch->mipmap; grmip->nextcolormap; )
{ {
grmip = grmip->nextcolormap; grmip = grmip->nextcolormap;
if (grmip->colormap == colormap) if (grmip->colormap == colormap || (skinnum < TC_DEFAULT && grmip->tcindex == skinnum))
{ {
if (grmip->downloaded && grmip->grInfo.data) if (grmip->downloaded && grmip->grInfo.data)
{ {
HWD.pfnSetTexture(grmip); // found the colormap, set it to the correct texture HWD.pfnSetTexture(grmip); // found the colormap, set it to the correct texture
Z_ChangeTag(grmip->grInfo.data, PU_HWRCACHE_UNLOCKED); Z_ChangeTag(grmip->grInfo.data, PU_HWRMODELTEXTURE);
return; return;
} }
} }
@ -812,16 +986,27 @@ static void HWR_GetBlendedTexture(GLPatch_t *gpatch, GLPatch_t *blendgpatch, INT
I_Error("%s: Out of memory", "HWR_GetMappedPatch"); I_Error("%s: Out of memory", "HWR_GetMappedPatch");
grmip->nextcolormap = newmip; grmip->nextcolormap = newmip;
newmip->colormap = colormap; newmip->colormap = colormap;
newmip->tcindex = skinnum;
HWR_CreateBlendedTexture(gpatch, blendgpatch, newmip, skinnum, color); HWR_CreateBlendedTexture(gpatch, blendgpatch, newmip, skinnum, color);
HWD.pfnSetTexture(newmip); HWD.pfnSetTexture(newmip);
Z_ChangeTag(newmip->grInfo.data, PU_HWRCACHE_UNLOCKED); Z_ChangeTag(newmip->grInfo.data, PU_HWRMODELTEXTURE);
} }
#define NORMALFOG 0x00000000 #define NORMALFOG 0x00000000
#define FADEFOG 0x19000000 #define FADEFOG 0x19000000
static boolean HWR_AllowModel(mobj_t *mobj)
{
// Signpost overlay. Not needed.
if (mobj->state-states == S_PLAY_SIGN)
return false;
// Otherwise, render the model.
return true;
}
static boolean HWR_CanInterpolateModel(mobj_t *mobj, model_t *model) static boolean HWR_CanInterpolateModel(mobj_t *mobj, model_t *model)
{ {
if (cv_grmodelinterpolation.value == 2) // Always interpolate if (cv_grmodelinterpolation.value == 2) // Always interpolate
@ -897,7 +1082,7 @@ static UINT8 HWR_GetModelSprite2(md2_t *md2, skin_t *skin, UINT8 spr2, player_t
// HWR_DrawModel // HWR_DrawModel
// //
void HWR_DrawModel(gr_vissprite_t *spr) boolean HWR_DrawModel(gr_vissprite_t *spr)
{ {
FSurfaceInfo Surf; FSurfaceInfo Surf;
@ -910,10 +1095,12 @@ void HWR_DrawModel(gr_vissprite_t *spr)
UINT8 color[4]; UINT8 color[4];
if (!cv_grmodels.value) if (!cv_grmodels.value)
return; return false;
if (spr->precip) if (spr->precip)
return; return false;
memset(&p, 0x00, sizeof(FTransform));
// MD2 colormap fix // MD2 colormap fix
// colormap test // colormap test
@ -1001,7 +1188,7 @@ void HWR_DrawModel(gr_vissprite_t *spr)
} }
if (md2->error) if (md2->error)
return; // we already failed loading this before :( return false; // we already failed loading this before :(
if (!md2->model) if (!md2->model)
{ {
//CONS_Debug(DBG_RENDER, "Loading model... (%s)", sprnames[spr->mobj->sprite]); //CONS_Debug(DBG_RENDER, "Loading model... (%s)", sprnames[spr->mobj->sprite]);
@ -1017,9 +1204,14 @@ void HWR_DrawModel(gr_vissprite_t *spr)
{ {
//CONS_Debug(DBG_RENDER, " FAILED\n"); //CONS_Debug(DBG_RENDER, " FAILED\n");
md2->error = true; // prevent endless fail md2->error = true; // prevent endless fail
return; return false;
} }
} }
// Lactozilla: Disallow certain models from rendering
if (!HWR_AllowModel(spr->mobj))
return false;
//HWD.pfnSetBlend(blend); // This seems to actually break translucency? //HWD.pfnSetBlend(blend); // This seems to actually break translucency?
finalscale = md2->scale; finalscale = md2->scale;
//Hurdler: arf, I don't like that implementation at all... too much crappy //Hurdler: arf, I don't like that implementation at all... too much crappy
@ -1034,11 +1226,10 @@ void HWR_DrawModel(gr_vissprite_t *spr)
if (gpatch && gpatch->mipmap->grInfo.format) // else if meant that if a texture couldn't be loaded, it would just end up using something else's texture if (gpatch && gpatch->mipmap->grInfo.format) // else if meant that if a texture couldn't be loaded, it would just end up using something else's texture
{ {
if ((skincolors_t)spr->mobj->color != SKINCOLOR_NONE && if (md2->blendgrpatch && ((GLPatch_t *)md2->blendgrpatch)->mipmap->grInfo.format
md2->blendgrpatch && ((GLPatch_t *)md2->blendgrpatch)->mipmap->grInfo.format
&& gpatch->width == ((GLPatch_t *)md2->blendgrpatch)->width && gpatch->height == ((GLPatch_t *)md2->blendgrpatch)->height) && gpatch->width == ((GLPatch_t *)md2->blendgrpatch)->width && gpatch->height == ((GLPatch_t *)md2->blendgrpatch)->height)
{ {
INT32 skinnum = TC_DEFAULT; INT32 skinnum = INT32_MAX;
if ((spr->mobj->flags & (MF_ENEMY|MF_BOSS)) && (spr->mobj->flags2 & MF2_FRET) && !(spr->mobj->flags & MF_GRENADEBOUNCE) && (leveltime & 1)) // Bosses "flash" if ((spr->mobj->flags & (MF_ENEMY|MF_BOSS)) && (spr->mobj->flags2 & MF2_FRET) && !(spr->mobj->flags & MF_GRENADEBOUNCE) && (leveltime & 1)) // Bosses "flash"
{ {
if (spr->mobj->type == MT_CYBRAKDEMON || spr->mobj->colorized) if (spr->mobj->type == MT_CYBRAKDEMON || spr->mobj->colorized)
@ -1048,7 +1239,7 @@ void HWR_DrawModel(gr_vissprite_t *spr)
else else
skinnum = TC_BOSS; skinnum = TC_BOSS;
} }
else if (spr->mobj->color) else if ((skincolors_t)spr->mobj->color != SKINCOLOR_NONE)
{ {
if (spr->mobj->colorized) if (spr->mobj->colorized)
skinnum = TC_RAINBOW; skinnum = TC_RAINBOW;
@ -1066,7 +1257,15 @@ void HWR_DrawModel(gr_vissprite_t *spr)
else else
skinnum = TC_DEFAULT; skinnum = TC_DEFAULT;
} }
HWR_GetBlendedTexture(gpatch, (GLPatch_t *)md2->blendgrpatch, skinnum, spr->colormap, (skincolors_t)spr->mobj->color);
// Translation or skin number found
if (skinnum != INT32_MAX)
HWR_GetBlendedTexture(gpatch, (GLPatch_t *)md2->blendgrpatch, skinnum, spr->colormap, (skincolors_t)spr->mobj->color);
else
{
// Sorry nothing
HWD.pfnSetTexture(gpatch->mipmap);
}
} }
else else
{ {
@ -1244,6 +1443,8 @@ void HWR_DrawModel(gr_vissprite_t *spr)
HWD.pfnDrawModel(md2->model, frame, durs, tics, nextFrame, &p, finalscale, flip, color); HWD.pfnDrawModel(md2->model, frame, durs, tics, nextFrame, &p, finalscale, flip, color);
} }
return true;
} }
#endif //HWRENDER #endif //HWRENDER

View File

@ -45,8 +45,8 @@ extern md2_t md2_models[NUMSPRITES];
extern md2_t md2_playermodels[MAXSKINS]; extern md2_t md2_playermodels[MAXSKINS];
void HWR_InitModels(void); void HWR_InitModels(void);
void HWR_DrawModel(gr_vissprite_t *spr);
void HWR_AddPlayerModel(INT32 skin); void HWR_AddPlayerModel(INT32 skin);
void HWR_AddSpriteModel(size_t spritenum); void HWR_AddSpriteModel(size_t spritenum);
boolean HWR_DrawModel(gr_vissprite_t *spr);
#endif // _HW_MD2_H_ #endif // _HW_MD2_H_

View File

@ -564,20 +564,15 @@ EXPORT void HWRAPI(FinishUpdate) (INT32 waitvbl)
// : in OpenGL, we store values for conversion of paletted graphics when // : in OpenGL, we store values for conversion of paletted graphics when
// : they are downloaded to the 3D card. // : they are downloaded to the 3D card.
// -----------------+ // -----------------+
EXPORT void HWRAPI(SetPalette) (RGBA_t *pal, RGBA_t *gamma) EXPORT void HWRAPI(SetPalette) (RGBA_t *pal)
{ {
INT32 i; size_t palsize = (sizeof(RGBA_t) * 256);
for (i = 0; i < 256; i++)
{
myPaletteData[i].s.red = (UINT8)MIN((pal[i].s.red*gamma->s.red)/127, 255);
myPaletteData[i].s.green = (UINT8)MIN((pal[i].s.green*gamma->s.green)/127, 255);
myPaletteData[i].s.blue = (UINT8)MIN((pal[i].s.blue*gamma->s.blue)/127, 255);
myPaletteData[i].s.alpha = pal[i].s.alpha;
}
// on a palette change, you have to reload all of the textures // on a palette change, you have to reload all of the textures
Flush(); if (memcmp(&myPaletteData, pal, palsize))
{
memcpy(&myPaletteData, pal, palsize);
Flush();
}
} }
#endif #endif

View File

@ -85,7 +85,7 @@ static GLboolean MipMap = GL_FALSE;
static GLint min_filter = GL_LINEAR; static GLint min_filter = GL_LINEAR;
static GLint mag_filter = GL_LINEAR; static GLint mag_filter = GL_LINEAR;
static GLint anisotropic_filter = 0; static GLint anisotropic_filter = 0;
static FTransform md2_transform; static boolean model_lighting = true;
const GLubyte *gl_extensions = NULL; const GLubyte *gl_extensions = NULL;
@ -221,11 +221,6 @@ FUNCPRINTF void DBG_Printf(const char *lpFmt, ...)
#define pglDrawElements glDrawElements #define pglDrawElements glDrawElements
#define pglEnableClientState glEnableClientState #define pglEnableClientState glEnableClientState
#define pglDisableClientState glDisableClientState #define pglDisableClientState glDisableClientState
#define pglClientActiveTexture glClientActiveTexture
#define pglGenBuffers glGenBuffers
#define pglBindBuffer glBindBuffer
#define pglBufferData glBufferData
#define pglDeleteBuffers glDeleteBuffers
/* Lighting */ /* Lighting */
#define pglShadeModel glShadeModel #define pglShadeModel glShadeModel
@ -331,15 +326,6 @@ typedef void (APIENTRY * PFNglEnableClientState) (GLenum cap);
static PFNglEnableClientState pglEnableClientState; static PFNglEnableClientState pglEnableClientState;
typedef void (APIENTRY * PFNglDisableClientState) (GLenum cap); typedef void (APIENTRY * PFNglDisableClientState) (GLenum cap);
static PFNglDisableClientState pglDisableClientState; static PFNglDisableClientState pglDisableClientState;
typedef void (APIENTRY * PFNglGenBuffers) (GLsizei n, GLuint *buffers);
static PFNglGenBuffers pglGenBuffers;
typedef void (APIENTRY * PFNglBindBuffer) (GLenum target, GLuint buffer);
static PFNglBindBuffer pglBindBuffer;
typedef void (APIENTRY * PFNglBufferData) (GLenum target, GLsizei size, const GLvoid *data, GLenum usage);
static PFNglBufferData pglBufferData;
typedef void (APIENTRY * PFNglDeleteBuffers) (GLsizei n, const GLuint *buffers);
static PFNglDeleteBuffers pglDeleteBuffers;
/* Lighting */ /* Lighting */
typedef void (APIENTRY * PFNglShadeModel) (GLenum mode); typedef void (APIENTRY * PFNglShadeModel) (GLenum mode);
@ -397,6 +383,17 @@ static PFNglMultiTexCoord2fv pglMultiTexCoord2fv;
typedef void (APIENTRY *PFNglClientActiveTexture) (GLenum); typedef void (APIENTRY *PFNglClientActiveTexture) (GLenum);
static PFNglClientActiveTexture pglClientActiveTexture; static PFNglClientActiveTexture pglClientActiveTexture;
/* 1.5 functions for buffers */
typedef void (APIENTRY * PFNglGenBuffers) (GLsizei n, GLuint *buffers);
static PFNglGenBuffers pglGenBuffers;
typedef void (APIENTRY * PFNglBindBuffer) (GLenum target, GLuint buffer);
static PFNglBindBuffer pglBindBuffer;
typedef void (APIENTRY * PFNglBufferData) (GLenum target, GLsizei size, const GLvoid *data, GLenum usage);
static PFNglBufferData pglBufferData;
typedef void (APIENTRY * PFNglDeleteBuffers) (GLsizei n, const GLuint *buffers);
static PFNglDeleteBuffers pglDeleteBuffers;
/* 1.2 Parms */ /* 1.2 Parms */
/* GL_CLAMP_TO_EDGE_EXT */ /* GL_CLAMP_TO_EDGE_EXT */
#ifndef GL_CLAMP_TO_EDGE #ifndef GL_CLAMP_TO_EDGE
@ -512,6 +509,8 @@ boolean SetupGLFunc13(void)
pglMultiTexCoord2f = GetGLFunc("glMultiTexCoord2f"); pglMultiTexCoord2f = GetGLFunc("glMultiTexCoord2f");
pglClientActiveTexture = GetGLFunc("glClientActiveTexture"); pglClientActiveTexture = GetGLFunc("glClientActiveTexture");
pglMultiTexCoord2fv = GetGLFunc("glMultiTexCoord2fv"); pglMultiTexCoord2fv = GetGLFunc("glMultiTexCoord2fv");
/* 1.5 funcs */
pglGenBuffers = GetGLFunc("glGenBuffers"); pglGenBuffers = GetGLFunc("glGenBuffers");
pglBindBuffer = GetGLFunc("glBindBuffer"); pglBindBuffer = GetGLFunc("glBindBuffer");
pglBufferData = GetGLFunc("glBufferData"); pglBufferData = GetGLFunc("glBufferData");
@ -724,8 +723,8 @@ void Flush(void)
while (gr_cachehead) while (gr_cachehead)
{ {
// ceci n'est pas du tout necessaire vu que tu les a charger normalement et // this is not necessary at all, because you have loaded them normally,
// donc il sont dans ta liste ! // and so they already are in your list!
#if 0 #if 0
//Hurdler: 25/04/2000: now support colormap in hardware mode //Hurdler: 25/04/2000: now support colormap in hardware mode
FTextureInfo *tmp = gr_cachehead->nextskin; FTextureInfo *tmp = gr_cachehead->nextskin;
@ -1297,11 +1296,11 @@ EXPORT void HWRAPI(SetTexture) (FTextureInfo *pTexInfo)
pTexInfo->nextmipmap = NULL; pTexInfo->nextmipmap = NULL;
if (gr_cachetail) if (gr_cachetail)
{ // insertion en fin de liste { // insertion at the tail
gr_cachetail->nextmipmap = pTexInfo; gr_cachetail->nextmipmap = pTexInfo;
gr_cachetail = pTexInfo; gr_cachetail = pTexInfo;
} }
else // initialisation de la liste else // initialization of the linked list
gr_cachetail = gr_cachehead = pTexInfo; gr_cachetail = gr_cachehead = pTexInfo;
} }
} }
@ -1435,7 +1434,7 @@ static const boolean gl_ext_arb_vertex_buffer_object = true;
// The texture offset to be applied to the texture coordinates in SkyVertex(). // The texture offset to be applied to the texture coordinates in SkyVertex().
static int rows, columns; static int rows, columns;
static boolean yflip; static signed char yflip;
static int texw, texh; static int texw, texh;
static boolean foglayer; static boolean foglayer;
static float delta = 0.0f; static float delta = 0.0f;
@ -1660,16 +1659,9 @@ EXPORT void HWRAPI(SetSpecialState) (hwdspecialstate_t IdState, INT32 Value)
{ {
switch (IdState) switch (IdState)
{ {
case HWD_SET_MODEL_LIGHTING:
#if 0 model_lighting = Value;
case 77:
{
//08/01/00: Hurdler this is a test for mirror
if (!Value)
ClearBuffer(false, true, 0); // clear depth buffer
break; break;
}
#endif
case HWD_SET_FOG_COLOR: case HWD_SET_FOG_COLOR:
{ {
@ -1682,6 +1674,7 @@ EXPORT void HWRAPI(SetSpecialState) (hwdspecialstate_t IdState, INT32 Value)
pglFogfv(GL_FOG_COLOR, fogcolor); pglFogfv(GL_FOG_COLOR, fogcolor);
break; break;
} }
case HWD_SET_FOG_DENSITY: case HWD_SET_FOG_DENSITY:
pglFogf(GL_FOG_DENSITY, Value*1200/(500*1000000.0f)); pglFogf(GL_FOG_DENSITY, Value*1200/(500*1000000.0f));
break; break;
@ -2046,16 +2039,25 @@ static void DrawModelEx(model_t *model, INT32 frameIndex, INT32 duration, INT32
} }
#endif #endif
pglLightfv(GL_LIGHT0, GL_POSITION, LightPos); if (model_lighting)
{
pglLightfv(GL_LIGHT0, GL_POSITION, LightPos);
pglShadeModel(GL_SMOOTH);
}
pglShadeModel(GL_SMOOTH);
if (color) if (color)
{ {
#ifdef GL_LIGHT_MODEL_AMBIENT #ifdef GL_LIGHT_MODEL_AMBIENT
pglEnable(GL_LIGHTING); if (model_lighting)
pglMaterialfv(GL_FRONT_AND_BACK, GL_AMBIENT, ambient); {
pglMaterialfv(GL_FRONT_AND_BACK, GL_DIFFUSE, diffuse); pglEnable(GL_LIGHTING);
pglMaterialfv(GL_FRONT_AND_BACK, GL_AMBIENT, ambient);
pglMaterialfv(GL_FRONT_AND_BACK, GL_DIFFUSE, diffuse);
}
else
#endif #endif
pglColor4ubv((GLubyte*)color);
if (color[3] < 255) if (color[3] < 255)
SetBlend(PF_Translucent|PF_Modulated|PF_Clip); SetBlend(PF_Translucent|PF_Modulated|PF_Clip);
else else
@ -2226,8 +2228,6 @@ EXPORT void HWRAPI(SetTransform) (FTransform *stransform)
if (stransform) if (stransform)
{ {
boolean fovx90; boolean fovx90;
// keep a trace of the transformation for md2
memcpy(&md2_transform, stransform, sizeof (md2_transform));
#ifdef USE_FTRANSFORM_MIRROR #ifdef USE_FTRANSFORM_MIRROR
// mirroring from Kart // mirroring from Kart

View File

@ -184,10 +184,6 @@ void I_StartupMouse(void);
*/ */
void I_StartupMouse2(void); void I_StartupMouse2(void);
/** \brief keyboard startup, shutdown, handler
*/
void I_StartupKeyboard(void);
/** \brief setup timer irq and user timer routine. /** \brief setup timer irq and user timer routine.
*/ */
void I_StartupTimer(void); void I_StartupTimer(void);

View File

@ -209,7 +209,8 @@ static size_t numbans = 0;
static boolean SOCK_bannednode[MAXNETNODES+1]; /// \note do we really need the +1? static boolean SOCK_bannednode[MAXNETNODES+1]; /// \note do we really need the +1?
static boolean init_tcp_driver = false; static boolean init_tcp_driver = false;
static char port_name[8] = DEFAULTPORT; static const char *serverport_name = DEFAULTPORT;
static const char *clientport_name;/* any port */
#ifndef NONET #ifndef NONET
@ -887,6 +888,7 @@ static boolean UDP_Socket(void)
#ifdef HAVE_IPV6 #ifdef HAVE_IPV6
const INT32 b_ipv6 = M_CheckParm("-ipv6"); const INT32 b_ipv6 = M_CheckParm("-ipv6");
#endif #endif
const char *serv;
for (s = 0; s < mysocketses; s++) for (s = 0; s < mysocketses; s++)
@ -902,11 +904,16 @@ static boolean UDP_Socket(void)
hints.ai_socktype = SOCK_DGRAM; hints.ai_socktype = SOCK_DGRAM;
hints.ai_protocol = IPPROTO_UDP; hints.ai_protocol = IPPROTO_UDP;
if (serverrunning)
serv = serverport_name;
else
serv = clientport_name;
if (M_CheckParm("-bindaddr")) if (M_CheckParm("-bindaddr"))
{ {
while (M_IsNextParm()) while (M_IsNextParm())
{ {
gaie = I_getaddrinfo(M_GetNextParm(), port_name, &hints, &ai); gaie = I_getaddrinfo(M_GetNextParm(), serv, &hints, &ai);
if (gaie == 0) if (gaie == 0)
{ {
runp = ai; runp = ai;
@ -927,7 +934,7 @@ static boolean UDP_Socket(void)
} }
else else
{ {
gaie = I_getaddrinfo("0.0.0.0", port_name, &hints, &ai); gaie = I_getaddrinfo("0.0.0.0", serv, &hints, &ai);
if (gaie == 0) if (gaie == 0)
{ {
runp = ai; runp = ai;
@ -942,8 +949,8 @@ static boolean UDP_Socket(void)
#ifdef HAVE_MINIUPNPC #ifdef HAVE_MINIUPNPC
if (UPNP_support) if (UPNP_support)
{ {
I_UPnP_rem(port_name, "UDP"); I_UPnP_rem(serverport_name, "UDP");
I_UPnP_add(NULL, port_name, "UDP"); I_UPnP_add(NULL, serverport_name, "UDP");
} }
#endif #endif
} }
@ -960,7 +967,7 @@ static boolean UDP_Socket(void)
{ {
while (M_IsNextParm()) while (M_IsNextParm())
{ {
gaie = I_getaddrinfo(M_GetNextParm(), port_name, &hints, &ai); gaie = I_getaddrinfo(M_GetNextParm(), serv, &hints, &ai);
if (gaie == 0) if (gaie == 0)
{ {
runp = ai; runp = ai;
@ -981,7 +988,7 @@ static boolean UDP_Socket(void)
} }
else else
{ {
gaie = I_getaddrinfo("::", port_name, &hints, &ai); gaie = I_getaddrinfo("::", serv, &hints, &ai);
if (gaie == 0) if (gaie == 0)
{ {
runp = ai; runp = ai;
@ -1421,15 +1428,19 @@ boolean I_InitTcpNetwork(void)
if (!I_InitTcpDriver()) if (!I_InitTcpDriver())
return false; return false;
if (M_CheckParm("-port")) if (M_CheckParm("-port") || M_CheckParm("-serverport"))
// Combined -udpport and -clientport into -port // Combined -udpport and -clientport into -port
// As it was really redundant having two seperate parms that does the same thing // As it was really redundant having two seperate parms that does the same thing
/* Sorry Steel, I'm adding these back. But -udpport is a stupid name. */
{ {
if (M_IsNextParm()) /*
strcpy(port_name, M_GetNextParm()); If it's NULL, that's okay! Because then
else we'll get a random port from getaddrinfo.
strcpy(port_name, "0"); */
serverport_name = M_GetNextParm();
} }
if (M_CheckParm("-clientport"))
clientport_name = M_GetNextParm();
// parse network game options, // parse network game options,
if (M_CheckParm("-server") || dedicated) if (M_CheckParm("-server") || dedicated)

View File

@ -20,6 +20,10 @@
#include "i_video.h" #include "i_video.h"
#include "m_misc.h" #include "m_misc.h"
#ifdef HWRENDER
#include "hardware/hw_main.h"
#endif
// GIFs are always little-endian // GIFs are always little-endian
#include "byteptr.h" #include "byteptr.h"
@ -29,6 +33,7 @@ consvar_t cv_gif_downscale = {"gif_downscale", "On", CV_SAVE, CV_OnOff, NULL, 0
#ifdef HAVE_ANIGIF #ifdef HAVE_ANIGIF
static boolean gif_optimize = false; // So nobody can do something dumb static boolean gif_optimize = false; // So nobody can do something dumb
static boolean gif_downscale = false; // like changing cvars mid output static boolean gif_downscale = false; // like changing cvars mid output
static RGBA_t *gif_palette = NULL;
static FILE *gif_out = NULL; static FILE *gif_out = NULL;
static INT32 gif_frames = 0; static INT32 gif_frames = 0;
@ -428,10 +433,7 @@ static void GIF_headwrite(void)
// write color table // write color table
{ {
RGBA_t *pal = ((cv_screenshot_colorprofile.value) RGBA_t *pal = gif_palette;
? pLocalPalette
: pMasterPalette);
for (i = 0; i < 256; i++) for (i = 0; i < 256; i++)
{ {
WRITEUINT8(p, pal[i].s.red); WRITEUINT8(p, pal[i].s.red);
@ -457,6 +459,32 @@ const UINT8 gifframe_gchead[4] = {0x21,0xF9,0x04,0x04}; // GCE, bytes, packed by
static UINT8 *gifframe_data = NULL; static UINT8 *gifframe_data = NULL;
static size_t gifframe_size = 8192; static size_t gifframe_size = 8192;
#ifdef HWRENDER
static void hwrconvert(void)
{
UINT8 *linear = HWR_GetScreenshot();
UINT8 *dest = screens[2];
UINT8 r, g, b;
INT32 x, y;
size_t i = 0;
InitColorLUT(gif_palette);
for (y = 0; y < vid.height; y++)
{
for (x = 0; x < vid.width; x++, i += 3)
{
r = (UINT8)linear[i];
g = (UINT8)linear[i + 1];
b = (UINT8)linear[i + 2];
dest[(y * vid.width) + x] = colorlookup[r >> SHIFTCOLORBITS][g >> SHIFTCOLORBITS][b >> SHIFTCOLORBITS];
}
}
free(linear);
}
#endif
// //
// GIF_framewrite // GIF_framewrite
// writes a frame into the file. // writes a frame into the file.
@ -482,7 +510,12 @@ static void GIF_framewrite(void)
GIF_optimizeregion(cur_screen, movie_screen, &blitx, &blity, &blitw, &blith); GIF_optimizeregion(cur_screen, movie_screen, &blitx, &blity, &blitw, &blith);
// blit to temp screen // blit to temp screen
I_ReadScreen(movie_screen); if (rendermode == render_soft)
I_ReadScreen(movie_screen);
#ifdef HWRENDER
else if (rendermode == render_opengl)
hwrconvert();
#endif
} }
else else
{ {
@ -491,7 +524,18 @@ static void GIF_framewrite(void)
blith = vid.height; blith = vid.height;
if (gif_frames == 0) if (gif_frames == 0)
I_ReadScreen(movie_screen); {
if (rendermode == render_soft)
I_ReadScreen(movie_screen);
#ifdef HWRENDER
else if (rendermode == render_opengl)
{
hwrconvert();
VID_BlitLinearScreen(screens[2], screens[0], vid.width*vid.bpp, vid.height, vid.width*vid.bpp, vid.rowbytes);
}
#endif
}
movie_screen = screens[0]; movie_screen = screens[0];
} }
@ -580,7 +624,7 @@ static void GIF_framewrite(void)
// //
INT32 GIF_open(const char *filename) INT32 GIF_open(const char *filename)
{ {
#ifdef HWRENDER #if 0
if (rendermode != render_soft) if (rendermode != render_soft)
{ {
CONS_Alert(CONS_WARNING, M_GetText("GIFs cannot be taken in non-software modes!\n")); CONS_Alert(CONS_WARNING, M_GetText("GIFs cannot be taken in non-software modes!\n"));
@ -594,6 +638,16 @@ INT32 GIF_open(const char *filename)
gif_optimize = (!!cv_gif_optimize.value); gif_optimize = (!!cv_gif_optimize.value);
gif_downscale = (!!cv_gif_downscale.value); gif_downscale = (!!cv_gif_downscale.value);
// GIF color table
// In hardware mode, uses the master palette
gif_palette = ((cv_screenshot_colorprofile.value
#ifdef HWRENDER
&& (rendermode == render_soft)
#endif
) ? pLocalPalette
: pMasterPalette);
GIF_headwrite(); GIF_headwrite();
gif_frames = 0; gif_frames = 0;
return 1; return 1;

View File

@ -312,7 +312,7 @@ static void M_ChangeControl(INT32 choice);
// Video & Sound // Video & Sound
menu_t OP_VideoOptionsDef, OP_VideoModeDef, OP_ColorOptionsDef; menu_t OP_VideoOptionsDef, OP_VideoModeDef, OP_ColorOptionsDef;
#ifdef HWRENDER #ifdef HWRENDER
menu_t OP_OpenGLOptionsDef, OP_OpenGLFogDef, OP_OpenGLColorDef; menu_t OP_OpenGLOptionsDef, OP_OpenGLFogDef;
#endif #endif
menu_t OP_SoundOptionsDef; menu_t OP_SoundOptionsDef;
menu_t OP_SoundAdvancedDef; menu_t OP_SoundAdvancedDef;
@ -361,7 +361,6 @@ static void M_DrawScreenshotMenu(void);
static void M_DrawMonitorToggles(void); static void M_DrawMonitorToggles(void);
#ifdef HWRENDER #ifdef HWRENDER
static void M_OGL_DrawFogMenu(void); static void M_OGL_DrawFogMenu(void);
static void M_OGL_DrawColorMenu(void);
#endif #endif
#ifndef NONET #ifndef NONET
static void M_DrawScreenshotMenu(void); static void M_DrawScreenshotMenu(void);
@ -1193,8 +1192,8 @@ static menuitem_t OP_CameraOptionsMenu[] =
{IT_HEADER, NULL, "Camera Positioning", NULL, 30}, {IT_HEADER, NULL, "Camera Positioning", NULL, 30},
{IT_STRING | IT_CVAR | IT_CV_INTEGERSTEP, NULL, "Camera Distance", &cv_cam_dist, 36}, {IT_STRING | IT_CVAR | IT_CV_INTEGERSTEP, NULL, "Camera Distance", &cv_cam_dist, 36},
{IT_STRING | IT_CVAR | IT_CV_INTEGERSTEP, NULL, "Camera Height", &cv_cam_height, 41}, {IT_STRING | IT_CVAR | IT_CV_INTEGERSTEP, NULL, "Camera Height", &cv_cam_height, 41},
{IT_STRING | IT_CVAR | IT_CV_FLOATSLIDER, NULL, "Camera Speed", &cv_cam_speed, 46}, {IT_STRING | IT_CVAR | IT_CV_FLOATSLIDER, NULL, "Camera Spacial Speed", &cv_cam_speed, 46},
{IT_STRING | IT_CVAR | IT_CV_SLIDER, NULL, "Rotation Speed", &cv_cam_rotspeed, 51}, {IT_STRING | IT_CVAR | IT_CV_FLOATSLIDER, NULL, "Rotation Speed", &cv_cam_turnmultiplier, 51},
{IT_HEADER, NULL, "Display Options", NULL, 60}, {IT_HEADER, NULL, "Display Options", NULL, 60},
{IT_STRING | IT_CVAR, NULL, "Crosshair", &cv_crosshair, 66}, {IT_STRING | IT_CVAR, NULL, "Crosshair", &cv_crosshair, 66},
@ -1211,8 +1210,8 @@ static menuitem_t OP_Camera2OptionsMenu[] =
{IT_HEADER, NULL, "Camera Positioning", NULL, 30}, {IT_HEADER, NULL, "Camera Positioning", NULL, 30},
{IT_STRING | IT_CVAR | IT_CV_INTEGERSTEP, NULL, "Camera Distance", &cv_cam2_dist, 36}, {IT_STRING | IT_CVAR | IT_CV_INTEGERSTEP, NULL, "Camera Distance", &cv_cam2_dist, 36},
{IT_STRING | IT_CVAR | IT_CV_INTEGERSTEP, NULL, "Camera Height", &cv_cam2_height, 41}, {IT_STRING | IT_CVAR | IT_CV_INTEGERSTEP, NULL, "Camera Height", &cv_cam2_height, 41},
{IT_STRING | IT_CVAR | IT_CV_FLOATSLIDER, NULL, "Camera Speed", &cv_cam2_speed, 46}, {IT_STRING | IT_CVAR | IT_CV_FLOATSLIDER, NULL, "Camera Spacial Speed", &cv_cam2_speed, 46},
{IT_STRING | IT_CVAR | IT_CV_SLIDER, NULL, "Rotation Speed", &cv_cam2_rotspeed, 51}, {IT_STRING | IT_CVAR | IT_CV_FLOATSLIDER, NULL, "Rotation Speed", &cv_cam2_turnmultiplier, 51},
{IT_HEADER, NULL, "Display Options", NULL, 60}, {IT_HEADER, NULL, "Display Options", NULL, 60},
{IT_STRING | IT_CVAR, NULL, "Crosshair", &cv_crosshair2, 66}, {IT_STRING | IT_CVAR, NULL, "Crosshair", &cv_crosshair2, 66},
@ -1229,8 +1228,8 @@ static menuitem_t OP_CameraExtendedOptionsMenu[] =
{IT_HEADER, NULL, "Camera Positioning", NULL, 30}, {IT_HEADER, NULL, "Camera Positioning", NULL, 30},
{IT_STRING | IT_CVAR | IT_CV_INTEGERSTEP, NULL, "Camera Distance", &cv_cam_dist, 36}, {IT_STRING | IT_CVAR | IT_CV_INTEGERSTEP, NULL, "Camera Distance", &cv_cam_dist, 36},
{IT_STRING | IT_CVAR | IT_CV_INTEGERSTEP, NULL, "Camera Height", &cv_cam_height, 41}, {IT_STRING | IT_CVAR | IT_CV_INTEGERSTEP, NULL, "Camera Height", &cv_cam_height, 41},
{IT_STRING | IT_CVAR | IT_CV_FLOATSLIDER, NULL, "Camera Speed", &cv_cam_speed, 46}, {IT_STRING | IT_CVAR | IT_CV_FLOATSLIDER, NULL, "Camera Spacial Speed", &cv_cam_speed, 46},
{IT_STRING | IT_CVAR | IT_CV_SLIDER, NULL, "Rotation Speed", &cv_cam_rotspeed, 51}, {IT_STRING | IT_CVAR | IT_CV_FLOATSLIDER, NULL, "Rotation Speed", &cv_cam_turnmultiplier, 51},
{IT_HEADER, NULL, "Automatic Camera Options", NULL, 60}, {IT_HEADER, NULL, "Automatic Camera Options", NULL, 60},
{IT_STRING | IT_CVAR | IT_CV_SLIDER, NULL, "Shift to player angle", &cv_cam_shiftfacing[0], 66}, {IT_STRING | IT_CVAR | IT_CV_SLIDER, NULL, "Shift to player angle", &cv_cam_shiftfacing[0], 66},
@ -1259,8 +1258,8 @@ static menuitem_t OP_Camera2ExtendedOptionsMenu[] =
{IT_HEADER, NULL, "Camera Positioning", NULL, 30}, {IT_HEADER, NULL, "Camera Positioning", NULL, 30},
{IT_STRING | IT_CVAR | IT_CV_INTEGERSTEP, NULL, "Camera Distance", &cv_cam2_dist, 36}, {IT_STRING | IT_CVAR | IT_CV_INTEGERSTEP, NULL, "Camera Distance", &cv_cam2_dist, 36},
{IT_STRING | IT_CVAR | IT_CV_INTEGERSTEP, NULL, "Camera Height", &cv_cam2_height, 41}, {IT_STRING | IT_CVAR | IT_CV_INTEGERSTEP, NULL, "Camera Height", &cv_cam2_height, 41},
{IT_STRING | IT_CVAR | IT_CV_FLOATSLIDER, NULL, "Camera Speed", &cv_cam2_speed, 46}, {IT_STRING | IT_CVAR | IT_CV_FLOATSLIDER, NULL, "Camera Spacial Speed", &cv_cam2_speed, 46},
{IT_STRING | IT_CVAR | IT_CV_SLIDER, NULL, "Rotation Speed", &cv_cam2_rotspeed, 51}, {IT_STRING | IT_CVAR | IT_CV_FLOATSLIDER, NULL, "Rotation Speed", &cv_cam2_turnmultiplier, 51},
{IT_HEADER, NULL, "Automatic Camera Options", NULL, 60}, {IT_HEADER, NULL, "Automatic Camera Options", NULL, 60},
{IT_STRING | IT_CVAR | IT_CV_SLIDER, NULL, "Shift to player angle", &cv_cam_shiftfacing[1], 66}, {IT_STRING | IT_CVAR | IT_CV_SLIDER, NULL, "Shift to player angle", &cv_cam_shiftfacing[1], 66},
@ -1381,21 +1380,25 @@ static menuitem_t OP_ColorOptionsMenu[] =
#ifdef HWRENDER #ifdef HWRENDER
static menuitem_t OP_OpenGLOptionsMenu[] = static menuitem_t OP_OpenGLOptionsMenu[] =
{ {
{IT_STRING|IT_CVAR, NULL, "Models", &cv_grmodels, 10}, {IT_HEADER, NULL, "3D Models", NULL, 0},
{IT_STRING|IT_CVAR, NULL, "Model interpolation", &cv_grmodelinterpolation, 20}, {IT_STRING|IT_CVAR, NULL, "Models", &cv_grmodels, 12},
{IT_STRING|IT_CVAR, NULL, "Model interpolation", &cv_grmodelinterpolation, 22},
{IT_STRING|IT_CVAR, NULL, "Model lighting", &cv_grmodellighting, 32},
{IT_STRING|IT_CVAR, NULL, "Field of view", &cv_grfov, 40}, {IT_HEADER, NULL, "General", NULL, 51},
{IT_STRING|IT_CVAR, NULL, "Quality", &cv_scr_depth, 50}, {IT_STRING|IT_CVAR, NULL, "Field of view", &cv_grfov, 63},
{IT_STRING|IT_CVAR, NULL, "Texture Filter", &cv_grfiltermode, 60}, {IT_STRING|IT_CVAR, NULL, "Quality", &cv_scr_depth, 73},
{IT_STRING|IT_CVAR, NULL, "Anisotropic", &cv_granisotropicmode,70}, {IT_STRING|IT_CVAR, NULL, "Texture Filter", &cv_grfiltermode, 83},
#if defined (_WINDOWS) && (!((defined (__unix__) && !defined (MSDOS)) || defined (UNIXCOMMON) || defined (HAVE_SDL))) {IT_STRING|IT_CVAR, NULL, "Anisotropic", &cv_granisotropicmode,93},
{IT_STRING|IT_CVAR, NULL, "Fullscreen", &cv_fullscreen, 80},
#endif {IT_HEADER, NULL, "Miscellaneous", NULL, 112},
{IT_SUBMENU|IT_STRING, NULL, "Fog...", &OP_OpenGLFogDef, 124},
#ifdef ALAM_LIGHTING #ifdef ALAM_LIGHTING
{IT_SUBMENU|IT_STRING, NULL, "Lighting...", &OP_OpenGLLightingDef, 100}, {IT_SUBMENU|IT_STRING, NULL, "Lighting...", &OP_OpenGLLightingDef, 134},
#endif
#if defined (_WINDOWS) && (!((defined (__unix__) && !defined (MSDOS)) || defined (UNIXCOMMON) || defined (HAVE_SDL)))
{IT_STRING|IT_CVAR, NULL, "Fullscreen", &cv_fullscreen, 144},
#endif #endif
{IT_SUBMENU|IT_STRING, NULL, "Fog...", &OP_OpenGLFogDef, 110},
{IT_SUBMENU|IT_STRING, NULL, "Gamma...", &OP_OpenGLColorDef, 120},
}; };
#ifdef ALAM_LIGHTING #ifdef ALAM_LIGHTING
@ -1415,13 +1418,6 @@ static menuitem_t OP_OpenGLFogMenu[] =
{IT_STRING|IT_CVAR, NULL, "Fog density", &cv_grfogdensity, 30}, {IT_STRING|IT_CVAR, NULL, "Fog density", &cv_grfogdensity, 30},
{IT_STRING|IT_CVAR, NULL, "Software Fog",&cv_grsoftwarefog,40}, {IT_STRING|IT_CVAR, NULL, "Software Fog",&cv_grsoftwarefog,40},
}; };
static menuitem_t OP_OpenGLColorMenu[] =
{
{IT_STRING|IT_CVAR|IT_CV_SLIDER, NULL, "red", &cv_grgammared, 10},
{IT_STRING|IT_CVAR|IT_CV_SLIDER, NULL, "green", &cv_grgammagreen, 20},
{IT_STRING|IT_CVAR|IT_CV_SLIDER, NULL, "blue", &cv_grgammablue, 30},
};
#endif #endif
static menuitem_t OP_SoundOptionsMenu[] = static menuitem_t OP_SoundOptionsMenu[] =
@ -2149,18 +2145,6 @@ menu_t OP_OpenGLFogDef =
0, 0,
NULL NULL
}; };
menu_t OP_OpenGLColorDef =
{
MN_OP_MAIN + (MN_OP_VIDEO << 6) + (MN_OP_OPENGL << 12) + (MN_OP_OPENGL_COLOR << 18),
"M_VIDEO",
sizeof (OP_OpenGLColorMenu)/sizeof (menuitem_t),
&OP_OpenGLOptionsDef,
OP_OpenGLColorMenu,
M_OGL_DrawColorMenu,
60, 40,
0,
NULL
};
#endif #endif
menu_t OP_DataOptionsDef = DEFAULTMENUSTYLE( menu_t OP_DataOptionsDef = DEFAULTMENUSTYLE(
MN_OP_MAIN + (MN_OP_DATA << 6), MN_OP_MAIN + (MN_OP_DATA << 6),
@ -3147,7 +3131,7 @@ boolean M_Responder(event_t *ev)
} }
else if (ev->type == ev_joystick && ev->data1 == 0 && joywait < I_GetTime()) else if (ev->type == ev_joystick && ev->data1 == 0 && joywait < I_GetTime())
{ {
const INT32 jdeadzone = JOYAXISRANGE/4; const INT32 jdeadzone = (JOYAXISRANGE * cv_digitaldeadzone.value) / FRACUNIT;
if (ev->data3 != INT32_MAX) if (ev->data3 != INT32_MAX)
{ {
if (Joystick.bGamepadStyle || abs(ev->data3) > jdeadzone) if (Joystick.bGamepadStyle || abs(ev->data3) > jdeadzone)
@ -6602,11 +6586,7 @@ static void M_PandorasBox(INT32 choice)
else else
CV_StealthSetValue(&cv_dummylives, max(players[consoleplayer].lives, 1)); CV_StealthSetValue(&cv_dummylives, max(players[consoleplayer].lives, 1));
CV_StealthSetValue(&cv_dummycontinues, players[consoleplayer].continues); CV_StealthSetValue(&cv_dummycontinues, players[consoleplayer].continues);
SR_PandorasBox[6].status = ((players[consoleplayer].charflags & SF_SUPER) SR_PandorasBox[6].status = (players[consoleplayer].charflags & SF_SUPER) ? (IT_GRAYEDOUT) : (IT_STRING | IT_CALL);
#ifndef DEVELOP
|| cv_skin.value == 1
#endif
) ? (IT_GRAYEDOUT) : (IT_STRING | IT_CALL);
SR_PandorasBox[7].status = (emeralds == ((EMERALD7)*2)-1) ? (IT_GRAYEDOUT) : (IT_STRING | IT_CALL); SR_PandorasBox[7].status = (emeralds == ((EMERALD7)*2)-1) ? (IT_GRAYEDOUT) : (IT_STRING | IT_CALL);
M_SetupNextMenu(&SR_PandoraDef); M_SetupNextMenu(&SR_PandoraDef);
} }
@ -12243,20 +12223,6 @@ static void M_OGL_DrawFogMenu(void)
my + currentMenu->menuitems[FOG_COLOR_ITEM].alphaKey, '_' | 0x80,false); my + currentMenu->menuitems[FOG_COLOR_ITEM].alphaKey, '_' | 0x80,false);
} }
// =====================
// M_OGL_DrawColorMenu()
// =====================
static void M_OGL_DrawColorMenu(void)
{
INT32 mx, my;
mx = currentMenu->x;
my = currentMenu->y;
M_DrawGenericMenu(); // use generic drawer for cursor, items and title
V_DrawString(mx, my + currentMenu->menuitems[0].alphaKey - 10,
V_YELLOWMAP, "Gamma correction");
}
//=================== //===================
// M_HandleFogColor() // M_HandleFogColor()
//=================== //===================

View File

@ -1161,12 +1161,8 @@ void M_StartMovie(void)
switch (cv_moviemode.value) switch (cv_moviemode.value)
{ {
case MM_GIF: case MM_GIF:
if (rendermode == render_soft) moviemode = M_StartMovieGIF(pathname);
{ break;
moviemode = M_StartMovieGIF(pathname);
break;
}
/* FALLTHRU */
case MM_APNG: case MM_APNG:
moviemode = M_StartMovieAPNG(pathname); moviemode = M_StartMovieAPNG(pathname);
break; break;
@ -2453,3 +2449,94 @@ const char *M_FileError(FILE *fp)
else else
return "end-of-file"; return "end-of-file";
} }
/** Return the number of parts of this path.
*/
int M_PathParts(const char *path)
{
int n;
const char *p;
const char *t;
if (path == NULL)
return 0;
for (n = 0, p = path ;; ++n)
{
t = p;
if (( p = strchr(p, PATHSEP[0]) ))
p += strspn(p, PATHSEP);
else
{
if (*t)/* there is something after the final delimiter */
n++;
break;
}
}
return n;
}
/** Check whether a path is an absolute path.
*/
boolean M_IsPathAbsolute(const char *path)
{
#ifdef _WIN32
return ( strncmp(&path[1], ":\\", 2) == 0 );
#else
return ( path[0] == '/' );
#endif
}
/** I_mkdir for each part of the path.
*/
void M_MkdirEachUntil(const char *cpath, int start, int end, int mode)
{
char path[MAX_WADPATH];
char *p;
char *t;
if (end > 0 && end <= start)
return;
strlcpy(path, cpath, sizeof path);
#ifdef _WIN32
if (strncmp(&path[1], ":\\", 2) == 0)
p = &path[3];
else
#endif
p = path;
if (end > 0)
end -= start;
for (; start > 0; --start)
{
p += strspn(p, PATHSEP);
if (!( p = strchr(p, PATHSEP[0]) ))
return;
}
p += strspn(p, PATHSEP);
for (;;)
{
if (end > 0 && !--end)
break;
t = p;
if (( p = strchr(p, PATHSEP[0]) ))
{
*p = '\0';
I_mkdir(path, mode);
*p = PATHSEP[0];
p += strspn(p, PATHSEP);
}
else
{
if (*t)
I_mkdir(path, mode);
break;
}
}
}
void M_MkdirEach(const char *path, int start, int mode)
{
M_MkdirEachUntil(path, start, -1, mode);
}

View File

@ -96,6 +96,11 @@ void M_SetupMemcpy(void);
const char *M_FileError(FILE *handle); const char *M_FileError(FILE *handle);
int M_PathParts (const char *path);
boolean M_IsPathAbsolute (const char *path);
void M_MkdirEach (const char *path, int start, int mode);
void M_MkdirEachUntil (const char *path, int start, int end, int mode);
// counting bits, for weapon ammo code, usually // counting bits, for weapon ammo code, usually
FUNCMATH UINT8 M_CountBits(UINT32 num, UINT8 size); FUNCMATH UINT8 M_CountBits(UINT32 num, UINT8 size);

View File

@ -2962,7 +2962,7 @@ void P_KillMobj(mobj_t *target, mobj_t *inflictor, mobj_t *source, UINT8 damaget
Graue 12-22-2003 */ Graue 12-22-2003 */
} }
static inline void P_NiGHTSDamage(mobj_t *target, mobj_t *source) static void P_NiGHTSDamage(mobj_t *target, mobj_t *source)
{ {
player_t *player = target->player; player_t *player = target->player;
tic_t oldnightstime = player->nightstime; tic_t oldnightstime = player->nightstime;
@ -3028,7 +3028,7 @@ static inline void P_NiGHTSDamage(mobj_t *target, mobj_t *source)
} }
} }
static inline boolean P_TagDamage(mobj_t *target, mobj_t *inflictor, mobj_t *source, INT32 damage, UINT8 damagetype) static boolean P_TagDamage(mobj_t *target, mobj_t *inflictor, mobj_t *source, INT32 damage, UINT8 damagetype)
{ {
player_t *player = target->player; player_t *player = target->player;
(void)damage; //unused parm (void)damage; //unused parm
@ -3132,7 +3132,7 @@ static inline boolean P_TagDamage(mobj_t *target, mobj_t *inflictor, mobj_t *sou
return true; return true;
} }
static inline boolean P_PlayerHitsPlayer(mobj_t *target, mobj_t *inflictor, mobj_t *source, INT32 damage, UINT8 damagetype) static boolean P_PlayerHitsPlayer(mobj_t *target, mobj_t *inflictor, mobj_t *source, INT32 damage, UINT8 damagetype)
{ {
player_t *player = target->player; player_t *player = target->player;

View File

@ -115,10 +115,10 @@ typedef struct camera_s
extern camera_t camera, camera2; extern camera_t camera, camera2;
extern consvar_t cv_cam_dist, cv_cam_still, cv_cam_height; extern consvar_t cv_cam_dist, cv_cam_still, cv_cam_height;
extern consvar_t cv_cam_speed, cv_cam_rotate, cv_cam_rotspeed, cv_cam_orbit, cv_cam_adjust; extern consvar_t cv_cam_speed, cv_cam_rotate, cv_cam_rotspeed, cv_cam_turnmultiplier, cv_cam_orbit, cv_cam_adjust;
extern consvar_t cv_cam2_dist, cv_cam2_still, cv_cam2_height; extern consvar_t cv_cam2_dist, cv_cam2_still, cv_cam2_height;
extern consvar_t cv_cam2_speed, cv_cam2_rotate, cv_cam2_rotspeed, cv_cam2_orbit, cv_cam2_adjust; extern consvar_t cv_cam2_speed, cv_cam2_rotate, cv_cam2_rotspeed, cv_cam2_turnmultiplier, cv_cam2_orbit, cv_cam2_adjust;
extern fixed_t t_cam_dist, t_cam_height, t_cam_rotate; extern fixed_t t_cam_dist, t_cam_height, t_cam_rotate;
extern fixed_t t_cam2_dist, t_cam2_height, t_cam2_rotate; extern fixed_t t_cam2_dist, t_cam2_height, t_cam2_rotate;

View File

@ -672,7 +672,7 @@ INT32 P_AddLevelFlat(const char *flatname, levelflat_t *levelflat)
// //
INT32 P_AddLevelFlatRuntime(const char *flatname) INT32 P_AddLevelFlatRuntime(const char *flatname)
{ {
return Ploadflat(0, flatname); return Ploadflat(levelflats, flatname);
} }
// help function for $$$.sav checking // help function for $$$.sav checking
@ -3019,8 +3019,15 @@ boolean P_SetupLevel(boolean skipprecip)
P_SpawnPrecipitation(); P_SpawnPrecipitation();
#ifdef HWRENDER // not win32 only 19990829 by Kin #ifdef HWRENDER // not win32 only 19990829 by Kin
if (rendermode != render_soft && rendermode != render_none) if (rendermode == render_opengl)
{ {
// Lactozilla (December 8, 2019)
// Level setup used to free EVERY mipmap from memory.
// Even mipmaps that aren't related to level textures.
// Presumably, the hardware render code used to store textures as level data.
// Meaning, they had memory allocated and marked with the PU_LEVEL tag.
// Level textures are only reloaded after R_LoadTextures, which is
// when the texture list is loaded.
#ifdef ALAM_LIGHTING #ifdef ALAM_LIGHTING
// BP: reset light between levels (we draw preview frame lights on current frame) // BP: reset light between levels (we draw preview frame lights on current frame)
HWR_ResetLights(); HWR_ResetLights();
@ -3175,11 +3182,6 @@ boolean P_SetupLevel(boolean skipprecip)
if (!cv_analog2.changed) if (!cv_analog2.changed)
CV_SetValue(&cv_analog2, 0); CV_SetValue(&cv_analog2, 0);
#ifdef HWRENDER
if (rendermode != render_soft && rendermode != render_none)
CV_Set(&cv_grfov, cv_grfov.defaultvalue);
#endif
displayplayer = consoleplayer; // Start with your OWN view, please! displayplayer = consoleplayer; // Start with your OWN view, please!
} }
@ -3203,14 +3205,6 @@ boolean P_SetupLevel(boolean skipprecip)
// Fab : 19-07-98 : start cd music for this level (note: can be remapped) // Fab : 19-07-98 : start cd music for this level (note: can be remapped)
I_PlayCD((UINT8)(gamemap), false); I_PlayCD((UINT8)(gamemap), false);
// preload graphics
#ifdef HWRENDER // not win32 only 19990829 by Kin
if (rendermode != render_soft && rendermode != render_none)
{
HWR_PrepLevelCache(numtextures);
}
#endif
P_MapEnd(); P_MapEnd();
// Remove the loading shit from the screen // Remove the loading shit from the screen
@ -3380,10 +3374,10 @@ boolean P_AddWadFile(const char *wadfilename)
// WADs use markers for some resources, but others such as sounds are checked lump-by-lump anyway. // WADs use markers for some resources, but others such as sounds are checked lump-by-lump anyway.
// UINT16 luaPos, luaNum = 0; // UINT16 luaPos, luaNum = 0;
// UINT16 socPos, socNum = 0; // UINT16 socPos, socNum = 0;
UINT16 sfxPos, sfxNum = 0; UINT16 sfxPos = 0, sfxNum = 0;
UINT16 musPos = 0, musNum = 0; UINT16 musPos = 0, musNum = 0;
// UINT16 sprPos, sprNum = 0; // UINT16 sprPos, sprNum = 0;
UINT16 texPos, texNum = 0; UINT16 texPos = 0, texNum = 0;
// UINT16 patPos, patNum = 0; // UINT16 patPos, patNum = 0;
// UINT16 flaPos, flaNum = 0; // UINT16 flaPos, flaNum = 0;
// UINT16 mapPos, mapNum = 0; // UINT16 mapPos, mapNum = 0;

View File

@ -138,6 +138,13 @@ static size_t maxanims;
static animdef_t *animdefs = NULL; static animdef_t *animdefs = NULL;
// Increase the size of animdefs to make room for a new animation definition
static void GrowAnimDefs(void)
{
maxanims++;
animdefs = (animdef_t *)Z_Realloc(animdefs, sizeof(animdef_t)*(maxanims + 1), PU_STATIC, NULL);
}
// A prototype; here instead of p_spec.h, so they're "private" // A prototype; here instead of p_spec.h, so they're "private"
void P_ParseANIMDEFSLump(INT32 wadNum, UINT16 lumpnum); void P_ParseANIMDEFSLump(INT32 wadNum, UINT16 lumpnum);
void P_ParseAnimationDefintion(SINT8 istexture); void P_ParseAnimationDefintion(SINT8 istexture);
@ -347,8 +354,7 @@ void P_ParseAnimationDefintion(SINT8 istexture)
if (i == maxanims) if (i == maxanims)
{ {
// Increase the size to make room for the new animation definition // Increase the size to make room for the new animation definition
maxanims++; GrowAnimDefs();
animdefs = (animdef_t *)Z_Realloc(animdefs, sizeof(animdef_t)*(maxanims + 1), PU_STATIC, NULL);
strncpy(animdefs[i].startname, animdefsToken, 9); strncpy(animdefs[i].startname, animdefsToken, 9);
} }
@ -434,8 +440,17 @@ void P_ParseAnimationDefintion(SINT8 istexture)
} }
animdefs[i].speed = animSpeed; animdefs[i].speed = animSpeed;
Z_Free(animdefsToken); Z_Free(animdefsToken);
}
#ifdef WALLFLATS
// hehe... uhh.....
if (!istexture)
{
GrowAnimDefs();
M_Memcpy(&animdefs[maxanims-1], &animdefs[i], sizeof(animdef_t));
animdefs[maxanims-1].istexture = 1;
}
#endif
}
/** Checks for flats in levelflats that are part of a flat animation sequence /** Checks for flats in levelflats that are part of a flat animation sequence
* and sets them up for animation. * and sets them up for animation.
@ -476,7 +491,8 @@ static inline void P_FindAnimatedFlat(INT32 animnum)
atoi(sizeu1(i)), foundflats->name, foundflats->animseq, atoi(sizeu1(i)), foundflats->name, foundflats->animseq,
foundflats->numpics,foundflats->speed); foundflats->numpics,foundflats->speed);
} }
else if (foundflats->u.flat.lumpnum >= startflatnum && foundflats->u.flat.lumpnum <= endflatnum) else if ((!anims[animnum].istexture) && (foundflats->type == LEVELFLAT_FLAT)
&& (foundflats->u.flat.lumpnum >= startflatnum && foundflats->u.flat.lumpnum <= endflatnum))
{ {
foundflats->u.flat.baselumpnum = startflatnum; foundflats->u.flat.baselumpnum = startflatnum;
foundflats->animseq = foundflats->u.flat.lumpnum - startflatnum; foundflats->animseq = foundflats->u.flat.lumpnum - startflatnum;
@ -5626,7 +5642,7 @@ void P_UpdateSpecials(void)
if (foundflats->speed) // it is an animated flat if (foundflats->speed) // it is an animated flat
{ {
// update the levelflat texture number // update the levelflat texture number
if (foundflats->type == LEVELFLAT_TEXTURE) if ((foundflats->type == LEVELFLAT_TEXTURE) && (foundflats->u.texture.basenum != -1))
foundflats->u.texture.num = foundflats->u.texture.basenum + ((leveltime/foundflats->speed + foundflats->animseq) % foundflats->numpics); foundflats->u.texture.num = foundflats->u.texture.basenum + ((leveltime/foundflats->speed + foundflats->animseq) % foundflats->numpics);
// update the levelflat lump number // update the levelflat lump number
else if ((foundflats->type == LEVELFLAT_FLAT) && (foundflats->u.flat.baselumpnum != LUMPERROR)) else if ((foundflats->type == LEVELFLAT_FLAT) && (foundflats->u.flat.baselumpnum != LUMPERROR))

View File

@ -9727,6 +9727,7 @@ static void CV_CamRotate2_OnChange(void)
static CV_PossibleValue_t CV_CamSpeed[] = {{0, "MIN"}, {1*FRACUNIT, "MAX"}, {0, NULL}}; static CV_PossibleValue_t CV_CamSpeed[] = {{0, "MIN"}, {1*FRACUNIT, "MAX"}, {0, NULL}};
static CV_PossibleValue_t rotation_cons_t[] = {{1, "MIN"}, {25, "MAX"}, {0, NULL}}; static CV_PossibleValue_t rotation_cons_t[] = {{1, "MIN"}, {25, "MAX"}, {0, NULL}};
static CV_PossibleValue_t CV_CamRotate[] = {{-720, "MIN"}, {720, "MAX"}, {0, NULL}}; static CV_PossibleValue_t CV_CamRotate[] = {{-720, "MIN"}, {720, "MAX"}, {0, NULL}};
static CV_PossibleValue_t multiplier_cons_t[] = {{0, "MIN"}, {3*FRACUNIT, "MAX"}, {0, NULL}};
consvar_t cv_cam_dist = {"cam_dist", "160", CV_FLOAT|CV_SAVE, NULL, NULL, 0, NULL, NULL, 0, 0, NULL}; consvar_t cv_cam_dist = {"cam_dist", "160", CV_FLOAT|CV_SAVE, NULL, NULL, 0, NULL, NULL, 0, 0, NULL};
consvar_t cv_cam_height = {"cam_height", "25", CV_FLOAT|CV_SAVE, NULL, NULL, 0, NULL, NULL, 0, 0, NULL}; consvar_t cv_cam_height = {"cam_height", "25", CV_FLOAT|CV_SAVE, NULL, NULL, 0, NULL, NULL, 0, 0, NULL};
@ -9734,6 +9735,7 @@ consvar_t cv_cam_still = {"cam_still", "Off", 0, CV_OnOff, NULL, 0, NULL, NULL,
consvar_t cv_cam_speed = {"cam_speed", "0.3", CV_FLOAT|CV_SAVE, CV_CamSpeed, NULL, 0, NULL, NULL, 0, 0, NULL}; consvar_t cv_cam_speed = {"cam_speed", "0.3", CV_FLOAT|CV_SAVE, CV_CamSpeed, NULL, 0, NULL, NULL, 0, 0, NULL};
consvar_t cv_cam_rotate = {"cam_rotate", "0", CV_CALL|CV_NOINIT, CV_CamRotate, CV_CamRotate_OnChange, 0, NULL, NULL, 0, 0, NULL}; consvar_t cv_cam_rotate = {"cam_rotate", "0", CV_CALL|CV_NOINIT, CV_CamRotate, CV_CamRotate_OnChange, 0, NULL, NULL, 0, 0, NULL};
consvar_t cv_cam_rotspeed = {"cam_rotspeed", "10", CV_SAVE, rotation_cons_t, NULL, 0, NULL, NULL, 0, 0, NULL}; consvar_t cv_cam_rotspeed = {"cam_rotspeed", "10", CV_SAVE, rotation_cons_t, NULL, 0, NULL, NULL, 0, 0, NULL};
consvar_t cv_cam_turnmultiplier = {"cam_turnmultiplier", "1.0", CV_FLOAT|CV_SAVE, multiplier_cons_t, NULL, 0, NULL, NULL, 0, 0, NULL};
consvar_t cv_cam_orbit = {"cam_orbit", "Off", CV_SAVE, CV_OnOff, NULL, 0, NULL, NULL, 0, 0, NULL}; consvar_t cv_cam_orbit = {"cam_orbit", "Off", CV_SAVE, CV_OnOff, NULL, 0, NULL, NULL, 0, 0, NULL};
consvar_t cv_cam_adjust = {"cam_adjust", "On", CV_SAVE, CV_OnOff, NULL, 0, NULL, NULL, 0, 0, NULL}; consvar_t cv_cam_adjust = {"cam_adjust", "On", CV_SAVE, CV_OnOff, NULL, 0, NULL, NULL, 0, 0, NULL};
consvar_t cv_cam2_dist = {"cam2_dist", "160", CV_FLOAT|CV_SAVE, NULL, NULL, 0, NULL, NULL, 0, 0, NULL}; consvar_t cv_cam2_dist = {"cam2_dist", "160", CV_FLOAT|CV_SAVE, NULL, NULL, 0, NULL, NULL, 0, 0, NULL};
@ -9742,6 +9744,7 @@ consvar_t cv_cam2_still = {"cam2_still", "Off", 0, CV_OnOff, NULL, 0, NULL, NULL
consvar_t cv_cam2_speed = {"cam2_speed", "0.3", CV_FLOAT|CV_SAVE, CV_CamSpeed, NULL, 0, NULL, NULL, 0, 0, NULL}; consvar_t cv_cam2_speed = {"cam2_speed", "0.3", CV_FLOAT|CV_SAVE, CV_CamSpeed, NULL, 0, NULL, NULL, 0, 0, NULL};
consvar_t cv_cam2_rotate = {"cam2_rotate", "0", CV_CALL|CV_NOINIT, CV_CamRotate, CV_CamRotate2_OnChange, 0, NULL, NULL, 0, 0, NULL}; consvar_t cv_cam2_rotate = {"cam2_rotate", "0", CV_CALL|CV_NOINIT, CV_CamRotate, CV_CamRotate2_OnChange, 0, NULL, NULL, 0, 0, NULL};
consvar_t cv_cam2_rotspeed = {"cam2_rotspeed", "10", CV_SAVE, rotation_cons_t, NULL, 0, NULL, NULL, 0, 0, NULL}; consvar_t cv_cam2_rotspeed = {"cam2_rotspeed", "10", CV_SAVE, rotation_cons_t, NULL, 0, NULL, NULL, 0, 0, NULL};
consvar_t cv_cam2_turnmultiplier = {"cam2_turnmultiplier", "1.0", CV_FLOAT|CV_SAVE, multiplier_cons_t, NULL, 0, NULL, NULL, 0, 0, NULL};
consvar_t cv_cam2_orbit = {"cam2_orbit", "Off", CV_SAVE, CV_OnOff, NULL, 0, NULL, NULL, 0, 0, NULL}; consvar_t cv_cam2_orbit = {"cam2_orbit", "Off", CV_SAVE, CV_OnOff, NULL, 0, NULL, NULL, 0, 0, NULL};
consvar_t cv_cam2_adjust = {"cam2_adjust", "On", CV_SAVE, CV_OnOff, NULL, 0, NULL, NULL, 0, 0, NULL}; consvar_t cv_cam2_adjust = {"cam2_adjust", "On", CV_SAVE, CV_OnOff, NULL, 0, NULL, NULL, 0, 0, NULL};

View File

@ -1378,5 +1378,13 @@ void R_RenderBSPNode(INT32 bspnum)
bspnum = bsp->children[side^1]; bspnum = bsp->children[side^1];
} }
// PORTAL CULLING
if (portalcullsector) {
sector_t *sect = subsectors[bspnum & ~NF_SUBSECTOR].sector;
if (sect != portalcullsector)
return;
portalcullsector = NULL;
}
R_Subsector(bspnum == -1 ? 0 : bspnum & ~NF_SUBSECTOR); R_Subsector(bspnum == -1 ? 0 : bspnum & ~NF_SUBSECTOR);
} }

View File

@ -32,6 +32,10 @@
#include <malloc.h> // alloca(sizeof) #include <malloc.h> // alloca(sizeof)
#endif #endif
#ifdef HWRENDER
#include "hardware/hw_main.h" // HWR_LoadTextures
#endif
#if defined(_MSC_VER) #if defined(_MSC_VER)
#pragma pack(1) #pragma pack(1)
#endif #endif
@ -437,7 +441,7 @@ static UINT8 *R_GenerateTexture(size_t texnum)
texture_t *texture; texture_t *texture;
texpatch_t *patch; texpatch_t *patch;
patch_t *realpatch; patch_t *realpatch;
boolean dealloc = false; UINT8 *pdata;
int x, x1, x2, i, width, height; int x, x1, x2, i, width, height;
size_t blocksize; size_t blocksize;
column_t *patchcol; column_t *patchcol;
@ -465,12 +469,17 @@ static UINT8 *R_GenerateTexture(size_t texnum)
wadnum = patch->wad; wadnum = patch->wad;
lumpnum = patch->lump; lumpnum = patch->lump;
lumplength = W_LumpLengthPwad(wadnum, lumpnum); lumplength = W_LumpLengthPwad(wadnum, lumpnum);
realpatch = W_CacheLumpNumPwad(wadnum, lumpnum, PU_CACHE); // can't use W_CachePatchNumPwad because OpenGL pdata = W_CacheLumpNumPwad(wadnum, lumpnum, PU_CACHE);
realpatch = (patch_t *)pdata;
#ifndef NO_PNG_LUMPS #ifndef NO_PNG_LUMPS
if (R_IsLumpPNG((UINT8 *)realpatch, lumplength)) if (R_IsLumpPNG((UINT8 *)realpatch, lumplength))
goto multipatch; goto multipatch;
#endif #endif
#ifdef WALLFLATS
if (texture->type == TEXTURETYPE_FLAT)
goto multipatch;
#endif
// Check the patch for holes. // Check the patch for holes.
if (texture->width > SHORT(realpatch->width) || texture->height > SHORT(realpatch->height)) if (texture->width > SHORT(realpatch->width) || texture->height > SHORT(realpatch->height))
@ -527,9 +536,7 @@ static UINT8 *R_GenerateTexture(size_t texnum)
} }
// multi-patch textures (or 'composite') // multi-patch textures (or 'composite')
#ifndef NO_PNG_LUMPS
multipatch: multipatch:
#endif
texture->holes = false; texture->holes = false;
texture->flip = 0; texture->flip = 0;
blocksize = (texture->width * 4) + (texture->width * texture->height); blocksize = (texture->width * 4) + (texture->width * texture->height);
@ -548,6 +555,7 @@ static UINT8 *R_GenerateTexture(size_t texnum)
// Composite the columns together. // Composite the columns together.
for (i = 0, patch = texture->patches; i < texture->patchcount; i++, patch++) for (i = 0, patch = texture->patches; i < texture->patchcount; i++, patch++)
{ {
boolean dealloc = true;
static void (*ColumnDrawerPointer)(column_t *, UINT8 *, texpatch_t *, INT32, INT32); // Column drawing function pointer. static void (*ColumnDrawerPointer)(column_t *, UINT8 *, texpatch_t *, INT32, INT32); // Column drawing function pointer.
if (patch->style != AST_COPY) if (patch->style != AST_COPY)
ColumnDrawerPointer = (patch->flip & 2) ? R_DrawBlendFlippedColumnInCache : R_DrawBlendColumnInCache; ColumnDrawerPointer = (patch->flip & 2) ? R_DrawBlendFlippedColumnInCache : R_DrawBlendColumnInCache;
@ -556,17 +564,25 @@ static UINT8 *R_GenerateTexture(size_t texnum)
wadnum = patch->wad; wadnum = patch->wad;
lumpnum = patch->lump; lumpnum = patch->lump;
pdata = W_CacheLumpNumPwad(wadnum, lumpnum, PU_CACHE);
lumplength = W_LumpLengthPwad(wadnum, lumpnum); lumplength = W_LumpLengthPwad(wadnum, lumpnum);
realpatch = W_CacheLumpNumPwad(wadnum, lumpnum, PU_CACHE); realpatch = (patch_t *)pdata;
dealloc = false; dealloc = true;
#ifndef NO_PNG_LUMPS #ifndef NO_PNG_LUMPS
if (R_IsLumpPNG((UINT8 *)realpatch, lumplength)) if (R_IsLumpPNG((UINT8 *)realpatch, lumplength))
{
realpatch = R_PNGToPatch((UINT8 *)realpatch, lumplength, NULL, false); realpatch = R_PNGToPatch((UINT8 *)realpatch, lumplength, NULL, false);
dealloc = true; else
}
#endif #endif
#ifdef WALLFLATS
if (texture->type == TEXTURETYPE_FLAT)
realpatch = R_FlatToPatch(pdata, texture->width, texture->height, 0, 0, NULL, false);
else
#endif
{
(void)lumplength;
dealloc = false;
}
x1 = patch->originx; x1 = patch->originx;
width = SHORT(realpatch->width); width = SHORT(realpatch->width);
@ -721,7 +737,6 @@ void R_LoadTextures(void)
for (w = 0, numtextures = 0; w < numwadfiles; w++) for (w = 0, numtextures = 0; w < numwadfiles; w++)
{ {
// Count the textures from TEXTURES lumps // Count the textures from TEXTURES lumps
texturesLumpPos = W_CheckNumForNamePwad("TEXTURES", (UINT16)w, 0); texturesLumpPos = W_CheckNumForNamePwad("TEXTURES", (UINT16)w, 0);
while (texturesLumpPos != INT16_MAX) while (texturesLumpPos != INT16_MAX)
{ {
@ -730,7 +745,6 @@ void R_LoadTextures(void)
} }
// Count single-patch textures // Count single-patch textures
if (wadfiles[w]->type == RET_PK3) if (wadfiles[w]->type == RET_PK3)
{ {
texstart = W_CheckNumForFolderStartPK3("textures/", (UINT16)w, 0); texstart = W_CheckNumForFolderStartPK3("textures/", (UINT16)w, 0);
@ -743,7 +757,11 @@ void R_LoadTextures(void)
} }
if (texstart == INT16_MAX || texend == INT16_MAX) if (texstart == INT16_MAX || texend == INT16_MAX)
#ifdef WALLFLATS
goto countflats;
#else
continue; continue;
#endif
texstart++; // Do not count the first marker texstart++; // Do not count the first marker
@ -760,6 +778,40 @@ void R_LoadTextures(void)
{ {
numtextures += (UINT32)(texend - texstart); numtextures += (UINT32)(texend - texstart);
} }
#ifdef WALLFLATS
countflats:
// Count flats
if (wadfiles[w]->type == RET_PK3)
{
texstart = W_CheckNumForFolderStartPK3("flats/", (UINT16)w, 0);
texend = W_CheckNumForFolderEndPK3("flats/", (UINT16)w, texstart);
}
else
{
texstart = W_CheckNumForNamePwad("F_START", (UINT16)w, 0);
texend = W_CheckNumForNamePwad("F_END", (UINT16)w, texstart);
}
if (texstart == INT16_MAX || texend == INT16_MAX)
continue;
texstart++; // Do not count the first marker
// PK3s have subfolders, so we can't just make a simple sum
if (wadfiles[w]->type == RET_PK3)
{
for (j = texstart; j < texend; j++)
{
if (!W_IsLumpFolder((UINT16)w, j)) // Check if lump is a folder; if not, then count it
numtextures++;
}
}
else // Add all the textures between F_START and F_END
{
numtextures += (UINT32)(texend - texstart);
}
#endif
} }
// If no textures found by this point, bomb out // If no textures found by this point, bomb out
@ -809,7 +861,11 @@ void R_LoadTextures(void)
} }
if (texstart == INT16_MAX || texend == INT16_MAX) if (texstart == INT16_MAX || texend == INT16_MAX)
#ifdef WALLFLATS
goto checkflats;
#else
continue; continue;
#endif
texstart++; // Do not count the first marker texstart++; // Do not count the first marker
@ -853,6 +909,8 @@ void R_LoadTextures(void)
texture->width = SHORT(patchlump->width); texture->width = SHORT(patchlump->width);
texture->height = SHORT(patchlump->height); texture->height = SHORT(patchlump->height);
} }
texture->type = TEXTURETYPE_SINGLEPATCH;
texture->patchcount = 1; texture->patchcount = 1;
texture->holes = false; texture->holes = false;
texture->flip = 0; texture->flip = 0;
@ -871,7 +929,113 @@ void R_LoadTextures(void)
textureheight[i] = texture->height << FRACBITS; textureheight[i] = texture->height << FRACBITS;
i++; i++;
} }
#ifdef WALLFLATS
checkflats:
// Yes
if (wadfiles[w]->type == RET_PK3)
{
texstart = W_CheckNumForFolderStartPK3("flats/", (UINT16)w, 0);
texend = W_CheckNumForFolderEndPK3("flats/", (UINT16)w, texstart);
}
else
{
texstart = W_CheckNumForNamePwad("F_START", (UINT16)w, 0);
texend = W_CheckNumForNamePwad("F_END", (UINT16)w, texstart);
}
if (texstart == INT16_MAX || texend == INT16_MAX)
continue;
texstart++; // Do not count the first marker
// Work through each lump between the markers in the WAD.
for (j = 0; j < (texend - texstart); j++)
{
UINT8 *flatlump;
UINT16 wadnum = (UINT16)w;
lumpnum_t lumpnum = texstart + j;
size_t lumplength;
size_t flatsize = 0;
if (wadfiles[w]->type == RET_PK3)
{
if (W_IsLumpFolder(wadnum, lumpnum)) // Check if lump is a folder
continue; // If it is then SKIP IT
}
flatlump = W_CacheLumpNumPwad(wadnum, lumpnum, PU_CACHE);
lumplength = W_LumpLengthPwad(wadnum, lumpnum);
switch (lumplength)
{
case 4194304: // 2048x2048 lump
flatsize = 2048;
break;
case 1048576: // 1024x1024 lump
flatsize = 1024;
break;
case 262144:// 512x512 lump
flatsize = 512;
break;
case 65536: // 256x256 lump
flatsize = 256;
break;
case 16384: // 128x128 lump
flatsize = 128;
break;
case 1024: // 32x32 lump
flatsize = 32;
break;
default: // 64x64 lump
flatsize = 64;
break;
}
//CONS_Printf("\n\"%s\" is a flat, dimensions %d x %d",W_CheckNameForNumPwad((UINT16)w,texstart+j),flatsize,flatsize);
texture = textures[i] = Z_Calloc(sizeof(texture_t) + sizeof(texpatch_t), PU_STATIC, NULL);
// Set texture properties.
M_Memcpy(texture->name, W_CheckNameForNumPwad(wadnum, lumpnum), sizeof(texture->name));
#ifndef NO_PNG_LUMPS
if (R_IsLumpPNG((UINT8 *)flatlump, lumplength))
{
INT16 width, height;
R_PNGDimensions((UINT8 *)flatlump, &width, &height, lumplength);
texture->width = width;
texture->height = height;
}
else
#endif
texture->width = texture->height = flatsize;
texture->type = TEXTURETYPE_FLAT;
texture->patchcount = 1;
texture->holes = false;
texture->flip = 0;
// Allocate information for the texture's patches.
patch = &texture->patches[0];
patch->originx = patch->originy = 0;
patch->wad = (UINT16)w;
patch->lump = texstart + j;
patch->flip = 0;
Z_Unlock(flatlump);
texturewidth[i] = texture->width;
textureheight[i] = texture->height << FRACBITS;
i++;
}
#endif
} }
#ifdef HWRENDER
if (rendermode == render_opengl)
HWR_LoadTextures(numtextures);
#endif
} }
static texpatch_t *R_ParsePatch(boolean actuallyLoadPatch) static texpatch_t *R_ParsePatch(boolean actuallyLoadPatch)
@ -1182,6 +1346,7 @@ static texture_t *R_ParseTexture(boolean actuallyLoadTexture)
M_Memcpy(resultTexture->name, newTextureName, 8); M_Memcpy(resultTexture->name, newTextureName, 8);
resultTexture->width = newTextureWidth; resultTexture->width = newTextureWidth;
resultTexture->height = newTextureHeight; resultTexture->height = newTextureHeight;
resultTexture->type = TEXTURETYPE_COMPOSITE;
} }
Z_Free(texturesToken); Z_Free(texturesToken);
texturesToken = M_GetToken(NULL); texturesToken = M_GetToken(NULL);

View File

@ -45,6 +45,17 @@ typedef struct
enum patchalphastyle style; enum patchalphastyle style;
} texpatch_t; } texpatch_t;
// texture type
enum
{
TEXTURETYPE_UNKNOWN,
TEXTURETYPE_SINGLEPATCH,
TEXTURETYPE_COMPOSITE,
#ifdef WALLFLATS
TEXTURETYPE_FLAT,
#endif
};
// A maptexturedef_t describes a rectangular texture, // A maptexturedef_t describes a rectangular texture,
// which is composed of one or more mappatch_t structures // which is composed of one or more mappatch_t structures
// that arrange graphic patches. // that arrange graphic patches.
@ -52,6 +63,7 @@ typedef struct
{ {
// Keep name for switch changing, etc. // Keep name for switch changing, etc.
char name[8]; char name[8];
UINT8 type; // TEXTURETYPE_
INT16 width, height; INT16 width, height;
boolean holes; boolean holes;
UINT8 flip; // 1 = flipx, 2 = flipy, 3 = both UINT8 flip; // 1 = flipx, 2 = flipy, 3 = both
@ -159,6 +171,8 @@ const char *R_NameForColormap(extracolormap_t *extra_colormap);
#define R_PutRgbaRGB(r, g, b) (R_PutRgbaR(r) + R_PutRgbaG(g) + R_PutRgbaB(b)) #define R_PutRgbaRGB(r, g, b) (R_PutRgbaR(r) + R_PutRgbaG(g) + R_PutRgbaB(b))
#define R_PutRgbaRGBA(r, g, b, a) (R_PutRgbaRGB(r, g, b) + R_PutRgbaA(a)) #define R_PutRgbaRGBA(r, g, b, a) (R_PutRgbaRGB(r, g, b) + R_PutRgbaA(a))
UINT8 NearestColor(UINT8 r, UINT8 g, UINT8 b);
extern INT32 numtextures; extern INT32 numtextures;
#endif #endif

View File

@ -107,7 +107,8 @@ UINT8 *ds_transmap; // one of the translucency tables
#ifdef ESLOPE #ifdef ESLOPE
pslope_t *ds_slope; // Current slope being used pslope_t *ds_slope; // Current slope being used
floatv3_t ds_su, ds_sv, ds_sz; // Vectors for... stuff? floatv3_t ds_su[MAXVIDHEIGHT], ds_sv[MAXVIDHEIGHT], ds_sz[MAXVIDHEIGHT]; // Vectors for... stuff?
floatv3_t *ds_sup, *ds_svp, *ds_szp;
float focallengthf, zeroheight; float focallengthf, zeroheight;
#endif #endif
@ -960,6 +961,7 @@ void R_DrawViewBorder(void)
// ========================================================================== // ==========================================================================
#include "r_draw8.c" #include "r_draw8.c"
#include "r_draw8_npo2.c"
// ========================================================================== // ==========================================================================
// INCLUDE 16bpp DRAWING CODE HERE // INCLUDE 16bpp DRAWING CODE HERE

View File

@ -68,7 +68,8 @@ typedef struct {
} floatv3_t; } floatv3_t;
extern pslope_t *ds_slope; // Current slope being used extern pslope_t *ds_slope; // Current slope being used
extern floatv3_t ds_su, ds_sv, ds_sz; // Vectors for... stuff? extern floatv3_t ds_su[MAXVIDHEIGHT], ds_sv[MAXVIDHEIGHT], ds_sz[MAXVIDHEIGHT]; // Vectors for... stuff?
extern floatv3_t *ds_sup, *ds_svp, *ds_szp;
extern float focallengthf, zeroheight; extern float focallengthf, zeroheight;
#endif #endif
@ -138,49 +139,65 @@ void R_DrawViewBorder(void);
// ----------------- // -----------------
void R_DrawColumn_8(void); void R_DrawColumn_8(void);
#define R_DrawWallColumn_8 R_DrawColumn_8
void R_DrawShadeColumn_8(void); void R_DrawShadeColumn_8(void);
void R_DrawTranslucentColumn_8(void); void R_DrawTranslucentColumn_8(void);
void R_DrawTranslatedColumn_8(void);
void R_DrawTranslatedTranslucentColumn_8(void);
void R_Draw2sMultiPatchColumn_8(void);
void R_Draw2sMultiPatchTranslucentColumn_8(void);
void R_DrawFogColumn_8(void);
void R_DrawColumnShadowed_8(void);
void R_DrawSpan_8(void);
void R_DrawSplat_8(void);
void R_DrawTranslucentSpan_8(void);
void R_DrawTranslucentSplat_8(void);
#ifdef ESLOPE
void R_DrawTiltedSpan_8(void);
void R_DrawTiltedTranslucentSpan_8(void);
#ifndef NOWATER
void R_DrawTiltedTranslucentWaterSpan_8(void);
#endif
void R_DrawTiltedSplat_8(void);
void R_CalcTiltedLighting(fixed_t start, fixed_t end);
extern INT32 tiltlighting[MAXVIDWIDTH];
#endif
#ifndef NOWATER
void R_DrawTranslucentWaterSpan_8(void);
extern INT32 ds_bgofs;
extern INT32 ds_waterofs;
#endif
void R_DrawFogSpan_8(void);
// Lactozilla: Non-powers-of-two
void R_DrawSpan_NPO2_8(void);
void R_DrawTranslucentSpan_NPO2_8(void);
void R_DrawSplat_NPO2_8(void);
void R_DrawTranslucentSplat_NPO2_8(void);
#ifdef ESLOPE
void R_DrawTiltedSpan_NPO2_8(void);
void R_DrawTiltedTranslucentSpan_NPO2_8(void);
#ifndef NOWATER
void R_DrawTiltedTranslucentWaterSpan_NPO2_8(void);
#endif
void R_DrawTiltedSplat_NPO2_8(void);
#endif
#ifndef NOWATER
void R_DrawTranslucentWaterSpan_NPO2_8(void);
#endif
#ifdef USEASM #ifdef USEASM
void ASMCALL R_DrawColumn_8_ASM(void); void ASMCALL R_DrawColumn_8_ASM(void);
#define R_DrawWallColumn_8_ASM R_DrawColumn_8_ASM
void ASMCALL R_DrawShadeColumn_8_ASM(void); void ASMCALL R_DrawShadeColumn_8_ASM(void);
void ASMCALL R_DrawTranslucentColumn_8_ASM(void); void ASMCALL R_DrawTranslucentColumn_8_ASM(void);
void ASMCALL R_Draw2sMultiPatchColumn_8_ASM(void); void ASMCALL R_Draw2sMultiPatchColumn_8_ASM(void);
void ASMCALL R_DrawColumn_8_MMX(void); void ASMCALL R_DrawColumn_8_MMX(void);
#define R_DrawWallColumn_8_MMX R_DrawColumn_8_MMX
void ASMCALL R_Draw2sMultiPatchColumn_8_MMX(void); void ASMCALL R_Draw2sMultiPatchColumn_8_MMX(void);
void ASMCALL R_DrawSpan_8_MMX(void); void ASMCALL R_DrawSpan_8_MMX(void);
#endif #endif
void R_DrawTranslatedColumn_8(void);
void R_DrawTranslatedTranslucentColumn_8(void);
void R_DrawSpan_8(void);
#ifdef ESLOPE
void R_CalcTiltedLighting(fixed_t start, fixed_t end);
void R_DrawTiltedSpan_8(void);
void R_DrawTiltedTranslucentSpan_8(void);
void R_DrawTiltedSplat_8(void);
#endif
void R_DrawSplat_8(void);
void R_DrawTranslucentSplat_8(void);
void R_DrawTranslucentSpan_8(void);
void R_Draw2sMultiPatchColumn_8(void);
void R_Draw2sMultiPatchTranslucentColumn_8(void);
void R_DrawFogSpan_8(void);
void R_DrawFogColumn_8(void);
void R_DrawColumnShadowed_8(void);
#ifndef NOWATER
void R_DrawTranslucentWaterSpan_8(void);
extern INT32 ds_bgofs;
extern INT32 ds_waterofs;
#endif
// ------------------ // ------------------
// 16bpp DRAWING CODE // 16bpp DRAWING CODE
// ------------------ // ------------------

File diff suppressed because it is too large Load Diff

1044
src/r_draw8_npo2.c Normal file

File diff suppressed because it is too large Load Diff

View File

@ -1008,11 +1008,13 @@ static void R_PortalFrame(portal_t *portal)
if (portal->clipline != -1) if (portal->clipline != -1)
{ {
portalclipline = &lines[portal->clipline]; portalclipline = &lines[portal->clipline];
portalcullsector = portalclipline->frontsector;
viewsector = portalclipline->frontsector; viewsector = portalclipline->frontsector;
} }
else else
{ {
portalclipline = NULL; portalclipline = NULL;
portalcullsector = NULL;
viewsector = R_PointInSubsector(viewx, viewy)->sector; viewsector = R_PointInSubsector(viewx, viewy)->sector;
} }
} }
@ -1190,6 +1192,7 @@ void R_RegisterEngineStuff(void)
CV_RegisterVar(&cv_cam_speed); CV_RegisterVar(&cv_cam_speed);
CV_RegisterVar(&cv_cam_rotate); CV_RegisterVar(&cv_cam_rotate);
CV_RegisterVar(&cv_cam_rotspeed); CV_RegisterVar(&cv_cam_rotspeed);
CV_RegisterVar(&cv_cam_turnmultiplier);
CV_RegisterVar(&cv_cam_orbit); CV_RegisterVar(&cv_cam_orbit);
CV_RegisterVar(&cv_cam_adjust); CV_RegisterVar(&cv_cam_adjust);
@ -1199,6 +1202,7 @@ void R_RegisterEngineStuff(void)
CV_RegisterVar(&cv_cam2_speed); CV_RegisterVar(&cv_cam2_speed);
CV_RegisterVar(&cv_cam2_rotate); CV_RegisterVar(&cv_cam2_rotate);
CV_RegisterVar(&cv_cam2_rotspeed); CV_RegisterVar(&cv_cam2_rotspeed);
CV_RegisterVar(&cv_cam2_turnmultiplier);
CV_RegisterVar(&cv_cam2_orbit); CV_RegisterVar(&cv_cam2_orbit);
CV_RegisterVar(&cv_cam2_adjust); CV_RegisterVar(&cv_cam2_adjust);
@ -1208,30 +1212,4 @@ void R_RegisterEngineStuff(void)
CV_RegisterVar(&cv_maxportals); CV_RegisterVar(&cv_maxportals);
CV_RegisterVar(&cv_movebob); CV_RegisterVar(&cv_movebob);
#ifdef HWRENDER
// GL-specific Commands
CV_RegisterVar(&cv_grgammablue);
CV_RegisterVar(&cv_grgammagreen);
CV_RegisterVar(&cv_grgammared);
CV_RegisterVar(&cv_grfovchange);
CV_RegisterVar(&cv_grfog);
CV_RegisterVar(&cv_grfogcolor);
CV_RegisterVar(&cv_grsoftwarefog);
#ifdef ALAM_LIGHTING
CV_RegisterVar(&cv_grstaticlighting);
CV_RegisterVar(&cv_grdynamiclighting);
CV_RegisterVar(&cv_grcoronas);
CV_RegisterVar(&cv_grcoronasize);
#endif
CV_RegisterVar(&cv_grmodelinterpolation);
CV_RegisterVar(&cv_grmodels);
CV_RegisterVar(&cv_grspritebillboarding);
CV_RegisterVar(&cv_grskydome);
#endif
#ifdef HWRENDER
if (rendermode != render_soft && rendermode != render_none)
HWR_AddCommands();
#endif
} }

View File

@ -116,6 +116,35 @@ void R_InitPlanes(void)
// FIXME: unused // FIXME: unused
} }
//
// Water ripple effect!!
// Needs the height of the plane, and the vertical position of the span.
// Sets ripple_xfrac and ripple_yfrac, added to ds_xfrac and ds_yfrac, if the span is not tilted.
//
#ifndef NOWATER
INT32 ds_bgofs;
INT32 ds_waterofs;
static INT32 wtofs=0;
static boolean itswater;
static fixed_t ripple_xfrac;
static fixed_t ripple_yfrac;
static void R_PlaneRipple(visplane_t *plane, INT32 y, fixed_t plheight)
{
fixed_t distance = FixedMul(plheight, yslope[y]);
const INT32 yay = (wtofs + (distance>>9) ) & 8191;
// ripples da water texture
angle_t angle = (plane->viewangle + plane->plangle)>>ANGLETOFINESHIFT;
ds_bgofs = FixedDiv(FINESINE(yay), (1<<12) + (distance>>11))>>FRACBITS;
angle = (angle + 2048) & 8191; // 90 degrees
ripple_xfrac = FixedMul(FINECOSINE(angle), (ds_bgofs<<FRACBITS));
ripple_yfrac = FixedMul(FINESINE(angle), (ds_bgofs<<FRACBITS));
}
#endif
// //
// R_MapPlane // R_MapPlane
// //
@ -129,14 +158,6 @@ void R_InitPlanes(void)
// viewcos // viewcos
// viewheight // viewheight
#ifndef NOWATER
INT32 ds_bgofs;
INT32 ds_waterofs;
static INT32 wtofs=0;
static boolean itswater;
#endif
void R_MapPlane(INT32 y, INT32 x1, INT32 x2) void R_MapPlane(INT32 y, INT32 x1, INT32 x2)
{ {
angle_t angle, planecos, planesin; angle_t angle, planecos, planesin;
@ -181,14 +202,22 @@ void R_MapPlane(INT32 y, INT32 x1, INT32 x2)
#ifndef NOWATER #ifndef NOWATER
if (itswater) if (itswater)
{ {
const INT32 yay = (wtofs + (distance>>9) ) & 8191; // Needed for ds_bgofs
// ripples da water texture R_PlaneRipple(currentplane, y, planeheight);
ds_bgofs = FixedDiv(FINESINE(yay), (1<<12) + (distance>>11))>>FRACBITS;
angle = (currentplane->viewangle + currentplane->plangle + xtoviewangle[x1])>>ANGLETOFINESHIFT;
angle = (angle + 2048) & 8191; // 90 degrees #ifdef ESLOPE
ds_xfrac += FixedMul(FINECOSINE(angle), (ds_bgofs<<FRACBITS)); if (currentplane->slope)
ds_yfrac += FixedMul(FINESINE(angle), (ds_bgofs<<FRACBITS)); {
ds_sup = &ds_su[y];
ds_svp = &ds_sv[y];
ds_szp = &ds_sz[y];
}
else
#endif
{
ds_xfrac += ripple_xfrac;
ds_yfrac += ripple_yfrac;
}
if (y+ds_bgofs>=viewheight) if (y+ds_bgofs>=viewheight)
ds_bgofs = viewheight-y-1; ds_bgofs = viewheight-y-1;
@ -587,8 +616,7 @@ void R_DrawPlanes(void)
// Note: are these two lines really needed? // Note: are these two lines really needed?
// R_DrawSinglePlane and R_DrawSkyPlane do span/column drawer resets themselves anyway // R_DrawSinglePlane and R_DrawSkyPlane do span/column drawer resets themselves anyway
spanfunc = basespanfunc; spanfunc = spanfuncs[BASEDRAWFUNC];
wallcolfunc = walldrawerfunc;
for (i = 0; i < MAXVISPLANES; i++, pl++) for (i = 0; i < MAXVISPLANES; i++, pl++)
{ {
@ -622,7 +650,7 @@ static void R_DrawSkyPlane(visplane_t *pl)
// Reset column drawer function (note: couldn't we just call walldrawerfunc directly?) // Reset column drawer function (note: couldn't we just call walldrawerfunc directly?)
// (that is, unless we'll need to switch drawers in future for some reason) // (that is, unless we'll need to switch drawers in future for some reason)
wallcolfunc = walldrawerfunc; colfunc = colfuncs[BASEDRAWFUNC];
// use correct aspect ratio scale // use correct aspect ratio scale
dc_iscale = skyscale; dc_iscale = skyscale;
@ -648,7 +676,7 @@ static void R_DrawSkyPlane(visplane_t *pl)
dc_source = dc_source =
R_GetColumn(texturetranslation[skytexture], R_GetColumn(texturetranslation[skytexture],
-angle); // get negative of angle for each column to display sky correct way round! --Monster Iestyn 27/01/18 -angle); // get negative of angle for each column to display sky correct way round! --Monster Iestyn 27/01/18
wallcolfunc(); colfunc();
} }
} }
} }
@ -760,6 +788,8 @@ static UINT8 *R_GetTextureFlat(levelflat_t *levelflat, boolean leveltexture, boo
patch_t *patch = NULL; patch_t *patch = NULL;
boolean texturechanged = (leveltexture ? (levelflat->u.texture.num != levelflat->u.texture.lastnum) : false); boolean texturechanged = (leveltexture ? (levelflat->u.texture.num != levelflat->u.texture.lastnum) : false);
(void)ispng;
// Check if the texture changed. // Check if the texture changed.
if (leveltexture && (!texturechanged)) if (leveltexture && (!texturechanged))
{ {
@ -833,6 +863,99 @@ static UINT8 *R_GetTextureFlat(levelflat_t *levelflat, boolean leveltexture, boo
return flat; return flat;
} }
#ifdef ESLOPE
static void R_SlopeVectors(visplane_t *pl, INT32 i, float fudge)
{
// Potentially override other stuff for now cus we're mean. :< But draw a slope plane!
// I copied ZDoom's code and adapted it to SRB2... -Red
floatv3_t p, m, n;
float ang;
float vx, vy, vz;
// compiler complains when P_GetZAt is used in FLOAT_TO_FIXED directly
// use this as a temp var to store P_GetZAt's return value each time
fixed_t temp;
vx = FIXED_TO_FLOAT(pl->viewx+xoffs);
vy = FIXED_TO_FLOAT(pl->viewy-yoffs);
vz = FIXED_TO_FLOAT(pl->viewz);
temp = P_GetZAt(pl->slope, pl->viewx, pl->viewy);
zeroheight = FIXED_TO_FLOAT(temp);
// p is the texture origin in view space
// Don't add in the offsets at this stage, because doing so can result in
// errors if the flat is rotated.
ang = ANG2RAD(ANGLE_270 - pl->viewangle);
p.x = vx * cos(ang) - vy * sin(ang);
p.z = vx * sin(ang) + vy * cos(ang);
temp = P_GetZAt(pl->slope, -xoffs, yoffs);
p.y = FIXED_TO_FLOAT(temp) - vz;
// m is the v direction vector in view space
ang = ANG2RAD(ANGLE_180 - (pl->viewangle + pl->plangle));
m.x = cos(ang);
m.z = sin(ang);
// n is the u direction vector in view space
n.x = sin(ang);
n.z = -cos(ang);
ang = ANG2RAD(pl->plangle);
temp = P_GetZAt(pl->slope, pl->viewx + FLOAT_TO_FIXED(sin(ang)), pl->viewy + FLOAT_TO_FIXED(cos(ang)));
m.y = FIXED_TO_FLOAT(temp) - zeroheight;
temp = P_GetZAt(pl->slope, pl->viewx + FLOAT_TO_FIXED(cos(ang)), pl->viewy - FLOAT_TO_FIXED(sin(ang)));
n.y = FIXED_TO_FLOAT(temp) - zeroheight;
if (ds_powersoftwo)
{
m.x /= fudge;
m.y /= fudge;
m.z /= fudge;
n.x *= fudge;
n.y *= fudge;
n.z *= fudge;
}
// Eh. I tried making this stuff fixed-point and it exploded on me. Here's a macro for the only floating-point vector function I recall using.
#define CROSS(d, v1, v2) \
d.x = (v1.y * v2.z) - (v1.z * v2.y);\
d.y = (v1.z * v2.x) - (v1.x * v2.z);\
d.z = (v1.x * v2.y) - (v1.y * v2.x)
CROSS(ds_su[i], p, m);
CROSS(ds_sv[i], p, n);
CROSS(ds_sz[i], m, n);
#undef CROSS
ds_su[i].z *= focallengthf;
ds_sv[i].z *= focallengthf;
ds_sz[i].z *= focallengthf;
// Premultiply the texture vectors with the scale factors
#define SFMULT 65536.f
if (ds_powersoftwo)
{
ds_su[i].x *= (SFMULT * (1<<nflatshiftup));
ds_su[i].y *= (SFMULT * (1<<nflatshiftup));
ds_su[i].z *= (SFMULT * (1<<nflatshiftup));
ds_sv[i].x *= (SFMULT * (1<<nflatshiftup));
ds_sv[i].y *= (SFMULT * (1<<nflatshiftup));
ds_sv[i].z *= (SFMULT * (1<<nflatshiftup));
}
else
{
// Lactozilla: I'm essentially multiplying the vectors by FRACUNIT...
ds_su[i].x *= SFMULT;
ds_su[i].y *= SFMULT;
ds_su[i].z *= SFMULT;
ds_sv[i].x *= SFMULT;
ds_sv[i].y *= SFMULT;
ds_sv[i].z *= SFMULT;
}
#undef SFMULT
}
#endif // ESLOPE
void R_DrawSinglePlane(visplane_t *pl) void R_DrawSinglePlane(visplane_t *pl)
{ {
UINT8 *flat; UINT8 *flat;
@ -842,6 +965,7 @@ void R_DrawSinglePlane(visplane_t *pl)
ffloor_t *rover; ffloor_t *rover;
levelflat_t *levelflat; levelflat_t *levelflat;
int type; int type;
int spanfunctype = BASEDRAWFUNC;
if (!(pl->minx <= pl->maxx)) if (!(pl->minx <= pl->maxx))
return; return;
@ -856,11 +980,12 @@ void R_DrawSinglePlane(visplane_t *pl)
#ifndef NOWATER #ifndef NOWATER
itswater = false; itswater = false;
#endif #endif
spanfunc = basespanfunc; spanfunc = spanfuncs[BASEDRAWFUNC];
#ifdef POLYOBJECTS_PLANES #ifdef POLYOBJECTS_PLANES
if (pl->polyobj && pl->polyobj->translucency != 0) { if (pl->polyobj && pl->polyobj->translucency != 0)
spanfunc = R_DrawTranslucentSpan_8; {
spanfunctype = SPANDRAWFUNC_TRANS;
// Hacked up support for alpha value in software mode Tails 09-24-2002 (sidenote: ported to polys 10-15-2014, there was no time travel involved -Red) // Hacked up support for alpha value in software mode Tails 09-24-2002 (sidenote: ported to polys 10-15-2014, there was no time travel involved -Red)
if (pl->polyobj->translucency >= 10) if (pl->polyobj->translucency >= 10)
@ -868,10 +993,10 @@ void R_DrawSinglePlane(visplane_t *pl)
else if (pl->polyobj->translucency > 0) else if (pl->polyobj->translucency > 0)
ds_transmap = transtables + ((pl->polyobj->translucency-1)<<FF_TRANSSHIFT); ds_transmap = transtables + ((pl->polyobj->translucency-1)<<FF_TRANSSHIFT);
else // Opaque, but allow transparent flat pixels else // Opaque, but allow transparent flat pixels
spanfunc = splatfunc; spanfunctype = SPANDRAWFUNC_SPLAT;
#ifdef SHITPLANESPARENCY #ifdef SHITPLANESPARENCY
if ((spanfunc == splatfunc) != (pl->extra_colormap && (pl->extra_colormap->fog & 4))) if ((spanfunctype == SPANDRAWFUNC_SPLAT) != (pl->extra_colormap && (pl->extra_colormap->fog & 4)))
#else #else
if (!pl->extra_colormap || !(pl->extra_colormap->fog & 2)) if (!pl->extra_colormap || !(pl->extra_colormap->fog & 2))
#endif #endif
@ -902,7 +1027,7 @@ void R_DrawSinglePlane(visplane_t *pl)
if (pl->ffloor->flags & FF_TRANSLUCENT) if (pl->ffloor->flags & FF_TRANSLUCENT)
{ {
spanfunc = R_DrawTranslucentSpan_8; spanfunctype = SPANDRAWFUNC_TRANS;
// Hacked up support for alpha value in software mode Tails 09-24-2002 // Hacked up support for alpha value in software mode Tails 09-24-2002
if (pl->ffloor->alpha < 12) if (pl->ffloor->alpha < 12)
@ -926,10 +1051,10 @@ void R_DrawSinglePlane(visplane_t *pl)
else if (pl->ffloor->alpha < 243) else if (pl->ffloor->alpha < 243)
ds_transmap = transtables + ((tr_trans10-1)<<FF_TRANSSHIFT); ds_transmap = transtables + ((tr_trans10-1)<<FF_TRANSSHIFT);
else // Opaque, but allow transparent flat pixels else // Opaque, but allow transparent flat pixels
spanfunc = splatfunc; spanfunctype = SPANDRAWFUNC_SPLAT;
#ifdef SHITPLANESPARENCY #ifdef SHITPLANESPARENCY
if ((spanfunc == splatfunc) != (pl->extra_colormap && (pl->extra_colormap->fog & 4))) if ((spanfunctype == SPANDRAWFUNC_SPLAT) != (pl->extra_colormap && (pl->extra_colormap->fog & 4)))
#else #else
if (!pl->extra_colormap || !(pl->extra_colormap->fog & 2)) if (!pl->extra_colormap || !(pl->extra_colormap->fog & 2))
#endif #endif
@ -939,24 +1064,20 @@ void R_DrawSinglePlane(visplane_t *pl)
} }
else if (pl->ffloor->flags & FF_FOG) else if (pl->ffloor->flags & FF_FOG)
{ {
spanfunc = R_DrawFogSpan_8; spanfunctype = SPANDRAWFUNC_FOG;
light = (pl->lightlevel >> LIGHTSEGSHIFT); light = (pl->lightlevel >> LIGHTSEGSHIFT);
} }
else light = (pl->lightlevel >> LIGHTSEGSHIFT); else light = (pl->lightlevel >> LIGHTSEGSHIFT);
#ifndef NOWATER #ifndef NOWATER
if (pl->ffloor->flags & FF_RIPPLE if (pl->ffloor->flags & FF_RIPPLE)
#ifdef ESLOPE
&& !pl->slope
#endif
)
{ {
INT32 top, bottom; INT32 top, bottom;
itswater = true; itswater = true;
if (spanfunc == R_DrawTranslucentSpan_8) if (spanfunctype == SPANDRAWFUNC_TRANS)
{ {
spanfunc = R_DrawTranslucentWaterSpan_8; spanfunctype = SPANDRAWFUNC_WATER;
// Copy the current scene, ugh // Copy the current scene, ugh
top = pl->high-8; top = pl->high-8;
@ -1007,8 +1128,6 @@ void R_DrawSinglePlane(visplane_t *pl)
R_CheckFlatLength(W_LumpLength(levelflat->u.flat.lumpnum)); R_CheckFlatLength(W_LumpLength(levelflat->u.flat.lumpnum));
// Raw flats always have dimensions that are powers-of-two numbers. // Raw flats always have dimensions that are powers-of-two numbers.
ds_powersoftwo = true; ds_powersoftwo = true;
if (spanfunc == basespanfunc)
spanfunc = mmxspanfunc;
break; break;
default: default:
switch (type) switch (type)
@ -1031,11 +1150,7 @@ void R_DrawSinglePlane(visplane_t *pl)
} }
// Check if this texture or patch has power-of-two dimensions. // Check if this texture or patch has power-of-two dimensions.
if (R_CheckPowersOfTwo()) if (R_CheckPowersOfTwo())
{
R_CheckFlatLength(ds_flatwidth * ds_flatheight); R_CheckFlatLength(ds_flatwidth * ds_flatheight);
if (spanfunc == basespanfunc)
spanfunc = mmxspanfunc;
}
} }
if (light >= LIGHTLEVELS) if (light >= LIGHTLEVELS)
@ -1045,25 +1160,18 @@ void R_DrawSinglePlane(visplane_t *pl)
light = 0; light = 0;
#ifdef ESLOPE #ifdef ESLOPE
if (pl->slope) { if (pl->slope)
// Potentially override other stuff for now cus we're mean. :< But draw a slope plane! {
// I copied ZDoom's code and adapted it to SRB2... -Red float fudgecanyon = 0;
floatv3_t p, m, n;
float ang;
float vx, vy, vz;
float fudge = 0;
// compiler complains when P_GetZAt is used in FLOAT_TO_FIXED directly
// use this as a temp var to store P_GetZAt's return value each time
fixed_t temp;
angle_t hack = (pl->plangle & (ANGLE_90-1)); angle_t hack = (pl->plangle & (ANGLE_90-1));
yoffs *= 1; yoffs *= 1;
if (ds_powersoftwo) if (ds_powersoftwo)
{ {
fixed_t temp;
// Okay, look, don't ask me why this works, but without this setup there's a disgusting-looking misalignment with the textures. -Red // Okay, look, don't ask me why this works, but without this setup there's a disgusting-looking misalignment with the textures. -Red
fudge = ((1<<nflatshiftup)+1.0f)/(1<<nflatshiftup); fudgecanyon = ((1<<nflatshiftup)+1.0f)/(1<<nflatshiftup);
if (hack) if (hack)
{ {
/* /*
@ -1105,95 +1213,50 @@ void R_DrawSinglePlane(visplane_t *pl)
xoffs -= (pl->slope->o.x + (1 << (31-nflatshiftup))) & ~((1 << (32-nflatshiftup))-1); xoffs -= (pl->slope->o.x + (1 << (31-nflatshiftup))) & ~((1 << (32-nflatshiftup))-1);
yoffs += (pl->slope->o.y + (1 << (31-nflatshiftup))) & ~((1 << (32-nflatshiftup))-1); yoffs += (pl->slope->o.y + (1 << (31-nflatshiftup))) & ~((1 << (32-nflatshiftup))-1);
} }
xoffs = (fixed_t)(xoffs*fudge); xoffs = (fixed_t)(xoffs*fudgecanyon);
yoffs = (fixed_t)(yoffs/fudge); yoffs = (fixed_t)(yoffs/fudgecanyon);
} }
vx = FIXED_TO_FLOAT(pl->viewx+xoffs); ds_sup = &ds_su[0];
vy = FIXED_TO_FLOAT(pl->viewy-yoffs); ds_svp = &ds_sv[0];
vz = FIXED_TO_FLOAT(pl->viewz); ds_szp = &ds_sz[0];
temp = P_GetZAt(pl->slope, pl->viewx, pl->viewy); #ifndef NOWATER
zeroheight = FIXED_TO_FLOAT(temp); if (itswater)
// p is the texture origin in view space
// Don't add in the offsets at this stage, because doing so can result in
// errors if the flat is rotated.
ang = ANG2RAD(ANGLE_270 - pl->viewangle);
p.x = vx * cos(ang) - vy * sin(ang);
p.z = vx * sin(ang) + vy * cos(ang);
temp = P_GetZAt(pl->slope, -xoffs, yoffs);
p.y = FIXED_TO_FLOAT(temp) - vz;
// m is the v direction vector in view space
ang = ANG2RAD(ANGLE_180 - (pl->viewangle + pl->plangle));
m.x = cos(ang);
m.z = sin(ang);
// n is the u direction vector in view space
n.x = sin(ang);
n.z = -cos(ang);
ang = ANG2RAD(pl->plangle);
temp = P_GetZAt(pl->slope, pl->viewx + FLOAT_TO_FIXED(sin(ang)), pl->viewy + FLOAT_TO_FIXED(cos(ang)));
m.y = FIXED_TO_FLOAT(temp) - zeroheight;
temp = P_GetZAt(pl->slope, pl->viewx + FLOAT_TO_FIXED(cos(ang)), pl->viewy - FLOAT_TO_FIXED(sin(ang)));
n.y = FIXED_TO_FLOAT(temp) - zeroheight;
if (ds_powersoftwo)
{ {
m.x /= fudge; INT32 i;
m.y /= fudge; fixed_t plheight = abs(P_GetZAt(pl->slope, pl->viewx, pl->viewy) - pl->viewz);
m.z /= fudge; fixed_t rxoffs = xoffs;
fixed_t ryoffs = yoffs;
n.x *= fudge; R_PlaneBounds(pl);
n.y *= fudge;
n.z *= fudge;
}
// Eh. I tried making this stuff fixed-point and it exploded on me. Here's a macro for the only floating-point vector function I recall using. for (i = pl->high; i < pl->low; i++)
#define CROSS(d, v1, v2) \ {
d.x = (v1.y * v2.z) - (v1.z * v2.y);\ R_PlaneRipple(pl, i, plheight);
d.y = (v1.z * v2.x) - (v1.x * v2.z);\ xoffs = rxoffs + ripple_xfrac;
d.z = (v1.x * v2.y) - (v1.y * v2.x) yoffs = ryoffs + ripple_yfrac;
CROSS(ds_su, p, m); R_SlopeVectors(pl, i, fudgecanyon);
CROSS(ds_sv, p, n); }
CROSS(ds_sz, m, n);
#undef CROSS
ds_su.z *= focallengthf; xoffs = rxoffs;
ds_sv.z *= focallengthf; yoffs = ryoffs;
ds_sz.z *= focallengthf;
// Premultiply the texture vectors with the scale factors
#define SFMULT 65536.f
if (ds_powersoftwo)
{
ds_su.x *= (SFMULT * (1<<nflatshiftup));
ds_su.y *= (SFMULT * (1<<nflatshiftup));
ds_su.z *= (SFMULT * (1<<nflatshiftup));
ds_sv.x *= (SFMULT * (1<<nflatshiftup));
ds_sv.y *= (SFMULT * (1<<nflatshiftup));
ds_sv.z *= (SFMULT * (1<<nflatshiftup));
} }
else else
{ #endif
// I'm essentially multiplying the vectors by FRACUNIT... R_SlopeVectors(pl, 0, fudgecanyon);
ds_su.x *= SFMULT;
ds_su.y *= SFMULT;
ds_su.z *= SFMULT;
ds_sv.x *= SFMULT;
ds_sv.y *= SFMULT;
ds_sv.z *= SFMULT;
}
#undef SFMULT
if (spanfunc == R_DrawTranslucentSpan_8) #ifndef NOWATER
spanfunc = R_DrawTiltedTranslucentSpan_8; if (itswater && (spanfunctype == SPANDRAWFUNC_WATER))
else if (spanfunc == splatfunc) spanfunctype = SPANDRAWFUNC_TILTEDWATER;
spanfunc = R_DrawTiltedSplat_8;
else else
spanfunc = R_DrawTiltedSpan_8; #endif
if (spanfunctype == SPANDRAWFUNC_TRANS)
spanfunctype = SPANDRAWFUNC_TILTEDTRANS;
else if (spanfunctype == SPANDRAWFUNC_SPLAT)
spanfunctype = SPANDRAWFUNC_TILTEDSPLAT;
else
spanfunctype = SPANDRAWFUNC_TILTED;
planezlight = scalelight[light]; planezlight = scalelight[light];
} else } else
@ -1201,6 +1264,17 @@ void R_DrawSinglePlane(visplane_t *pl)
planezlight = zlight[light]; planezlight = zlight[light];
// Use the correct span drawer depending on the powers-of-twoness
if (!ds_powersoftwo)
{
if (spanfuncs_npo2[spanfunctype])
spanfunc = spanfuncs_npo2[spanfunctype];
else
spanfunc = spanfuncs[spanfunctype];
}
else
spanfunc = spanfuncs[spanfunctype];
// set the maximum value for unsigned // set the maximum value for unsigned
pl->top[pl->maxx+1] = 0xffff; pl->top[pl->maxx+1] = 0xffff;
pl->top[pl->minx-1] = 0xffff; pl->top[pl->minx-1] = 0xffff;
@ -1240,11 +1314,11 @@ a 'smoothing' of the texture while
using the palette colors. using the palette colors.
*/ */
#ifdef QUINCUNX #ifdef QUINCUNX
if (spanfunc == R_DrawSpan_8) if (spanfunc == spanfuncs[BASEDRAWFUNC])
{ {
INT32 i; INT32 i;
ds_transmap = transtables + ((tr_trans50-1)<<FF_TRANSSHIFT); ds_transmap = transtables + ((tr_trans50-1)<<FF_TRANSSHIFT);
spanfunc = R_DrawTranslucentSpan_8; spanfunc = spanfuncs[SPANDRAWFUNC_TRANS];
for (i=0; i<4; i++) for (i=0; i<4; i++)
{ {
xoffs = pl->xoffs; xoffs = pl->xoffs;

View File

@ -26,6 +26,7 @@ UINT8 portalrender; /**< When rendering a portal, it establishes the depth of
portal_t *portal_base, *portal_cap; portal_t *portal_base, *portal_cap;
line_t *portalclipline; line_t *portalclipline;
sector_t *portalcullsector;
INT32 portalclipstart, portalclipend; INT32 portalclipstart, portalclipend;
boolean portalline; // is curline a portal seg? boolean portalline; // is curline a portal seg?

View File

@ -45,6 +45,7 @@ extern portal_t* portal_cap;
extern UINT8 portalrender; extern UINT8 portalrender;
extern line_t *portalclipline; extern line_t *portalclipline;
extern sector_t *portalcullsector;
extern INT32 portalclipstart, portalclipend; extern INT32 portalclipstart, portalclipend;
void Portal_InitList (void); void Portal_InitList (void);

View File

@ -177,20 +177,20 @@ static void R_DrawWallSplats(void)
switch (splat->flags & SPLATDRAWMODE_MASK) switch (splat->flags & SPLATDRAWMODE_MASK)
{ {
case SPLATDRAWMODE_OPAQUE: case SPLATDRAWMODE_OPAQUE:
colfunc = basecolfunc; colfunc = colfuncs[BASEDRAWFUNC];
break; break;
case SPLATDRAWMODE_TRANS: case SPLATDRAWMODE_TRANS:
if (!cv_translucency.value) if (!cv_translucency.value)
colfunc = basecolfunc; colfunc = colfuncs[BASEDRAWFUNC];
else else
{ {
dc_transmap = transtables + ((tr_trans50 - 1)<<FF_TRANSSHIFT); dc_transmap = transtables + ((tr_trans50 - 1)<<FF_TRANSSHIFT);
colfunc = fuzzcolfunc; colfunc = colfuncs[COLDRAWFUNC_FUZZY];
} }
break; break;
case SPLATDRAWMODE_SHADE: case SPLATDRAWMODE_SHADE:
colfunc = shadecolfunc; colfunc = colfuncs[COLDRAWFUNC_SHADE];
break; break;
} }
@ -226,7 +226,7 @@ static void R_DrawWallSplats(void)
} }
} // next splat } // next splat
colfunc = basecolfunc; colfunc = colfuncs[BASEDRAWFUNC];
} }
#endif //WALLSPLATS #endif //WALLSPLATS
@ -270,10 +270,10 @@ static void R_Render2sidedMultiPatchColumn(column_t *column)
{ {
dc_source = (UINT8 *)column + 3; dc_source = (UINT8 *)column + 3;
if (colfunc == wallcolfunc) if (colfunc == colfuncs[BASEDRAWFUNC])
twosmultipatchfunc(); (colfuncs[COLDRAWFUNC_TWOSMULTIPATCH])();
else if (colfunc == fuzzcolfunc) else if (colfunc == colfuncs[COLDRAWFUNC_FUZZY])
twosmultipatchtransfunc(); (colfuncs[COLDRAWFUNC_TWOSMULTIPATCHTRANS])();
else else
colfunc(); colfunc();
} }
@ -327,15 +327,15 @@ void R_RenderMaskedSegRange(drawseg_t *ds, INT32 x1, INT32 x2)
case 907: case 907:
case 908: case 908:
dc_transmap = transtables + ((ldef->special-900)<<FF_TRANSSHIFT); dc_transmap = transtables + ((ldef->special-900)<<FF_TRANSSHIFT);
colfunc = fuzzcolfunc; colfunc = colfuncs[COLDRAWFUNC_FUZZY];
break; break;
case 909: case 909:
colfunc = R_DrawFogColumn_8; colfunc = colfuncs[COLDRAWFUNC_FOG];
windowtop = frontsector->ceilingheight; windowtop = frontsector->ceilingheight;
windowbottom = frontsector->floorheight; windowbottom = frontsector->floorheight;
break; break;
default: default:
colfunc = wallcolfunc; colfunc = colfuncs[BASEDRAWFUNC];
break; break;
} }
@ -345,7 +345,7 @@ void R_RenderMaskedSegRange(drawseg_t *ds, INT32 x1, INT32 x2)
return; return;
dc_transmap = transtables + ((curline->polyseg->translucency-1)<<FF_TRANSSHIFT); dc_transmap = transtables + ((curline->polyseg->translucency-1)<<FF_TRANSSHIFT);
colfunc = fuzzcolfunc; colfunc = colfuncs[COLDRAWFUNC_FUZZY];
} }
#ifdef ESLOPE #ifdef ESLOPE
@ -419,7 +419,7 @@ void R_RenderMaskedSegRange(drawseg_t *ds, INT32 x1, INT32 x2)
if (rlight->flags & FF_FOG || (rlight->extra_colormap && rlight->extra_colormap->fog)) if (rlight->flags & FF_FOG || (rlight->extra_colormap && rlight->extra_colormap->fog))
lightnum = (rlight->lightlevel >> LIGHTSEGSHIFT); lightnum = (rlight->lightlevel >> LIGHTSEGSHIFT);
else if (colfunc == fuzzcolfunc) else if (colfunc == colfuncs[COLDRAWFUNC_FUZZY])
lightnum = LIGHTLEVELS - 1; lightnum = LIGHTLEVELS - 1;
else else
lightnum = (rlight->lightlevel >> LIGHTSEGSHIFT); lightnum = (rlight->lightlevel >> LIGHTSEGSHIFT);
@ -436,7 +436,7 @@ void R_RenderMaskedSegRange(drawseg_t *ds, INT32 x1, INT32 x2)
} }
else else
{ {
if (colfunc == fuzzcolfunc) if (colfunc == colfuncs[COLDRAWFUNC_FUZZY])
{ {
if (frontsector->extra_colormap && frontsector->extra_colormap->fog) if (frontsector->extra_colormap && frontsector->extra_colormap->fog)
lightnum = (frontsector->lightlevel >> LIGHTSEGSHIFT); lightnum = (frontsector->lightlevel >> LIGHTSEGSHIFT);
@ -446,7 +446,7 @@ void R_RenderMaskedSegRange(drawseg_t *ds, INT32 x1, INT32 x2)
else else
lightnum = (frontsector->lightlevel >> LIGHTSEGSHIFT); lightnum = (frontsector->lightlevel >> LIGHTSEGSHIFT);
if (colfunc == R_DrawFogColumn_8 if (colfunc == colfuncs[COLDRAWFUNC_FOG]
|| (frontsector->extra_colormap && frontsector->extra_colormap->fog)) || (frontsector->extra_colormap && frontsector->extra_colormap->fog))
; ;
else if (curline->v1->y == curline->v2->y) else if (curline->v1->y == curline->v2->y)
@ -718,7 +718,7 @@ void R_RenderMaskedSegRange(drawseg_t *ds, INT32 x1, INT32 x2)
spryscale += rw_scalestep; spryscale += rw_scalestep;
} }
} }
colfunc = wallcolfunc; colfunc = colfuncs[BASEDRAWFUNC];
} }
// Loop through R_DrawMaskedColumn calls // Loop through R_DrawMaskedColumn calls
@ -789,7 +789,7 @@ void R_RenderThickSideRange(drawseg_t *ds, INT32 x1, INT32 x2, ffloor_t *pfloor)
frontsector = curline->frontsector == pfloor->target ? curline->backsector : curline->frontsector; frontsector = curline->frontsector == pfloor->target ? curline->backsector : curline->frontsector;
texnum = R_GetTextureNum(sides[pfloor->master->sidenum[0]].midtexture); texnum = R_GetTextureNum(sides[pfloor->master->sidenum[0]].midtexture);
colfunc = wallcolfunc; colfunc = colfuncs[BASEDRAWFUNC];
if (pfloor->master->flags & ML_TFERLINE) if (pfloor->master->flags & ML_TFERLINE)
{ {
@ -827,10 +827,10 @@ void R_RenderThickSideRange(drawseg_t *ds, INT32 x1, INT32 x2, ffloor_t *pfloor)
fuzzy = false; // Opaque fuzzy = false; // Opaque
if (fuzzy) if (fuzzy)
colfunc = fuzzcolfunc; colfunc = colfuncs[COLDRAWFUNC_FUZZY];
} }
else if (pfloor->flags & FF_FOG) else if (pfloor->flags & FF_FOG)
colfunc = R_DrawFogColumn_8; colfunc = colfuncs[COLDRAWFUNC_FOG];
#ifdef ESLOPE #ifdef ESLOPE
range = max(ds->x2-ds->x1, 1); range = max(ds->x2-ds->x1, 1);
@ -965,7 +965,7 @@ void R_RenderThickSideRange(drawseg_t *ds, INT32 x1, INT32 x2, ffloor_t *pfloor)
lightnum = (frontsector->lightlevel >> LIGHTSEGSHIFT); lightnum = (frontsector->lightlevel >> LIGHTSEGSHIFT);
else if (pfloor->flags & FF_FOG) else if (pfloor->flags & FF_FOG)
lightnum = (pfloor->master->frontsector->lightlevel >> LIGHTSEGSHIFT); lightnum = (pfloor->master->frontsector->lightlevel >> LIGHTSEGSHIFT);
else if (colfunc == fuzzcolfunc) else if (colfunc == colfuncs[COLDRAWFUNC_FUZZY])
lightnum = LIGHTLEVELS-1; lightnum = LIGHTLEVELS-1;
else else
lightnum = R_FakeFlat(frontsector, &tempsec, &templight, &templight, false) lightnum = R_FakeFlat(frontsector, &tempsec, &templight, &templight, false)
@ -1297,7 +1297,7 @@ void R_RenderThickSideRange(drawseg_t *ds, INT32 x1, INT32 x2, ffloor_t *pfloor)
spryscale += rw_scalestep; spryscale += rw_scalestep;
} }
} }
colfunc = wallcolfunc; colfunc = colfuncs[BASEDRAWFUNC];
#undef CLAMPMAX #undef CLAMPMAX
#undef CLAMPMIN #undef CLAMPMIN
@ -1530,7 +1530,7 @@ static void R_RenderSegLoop (void)
else else
dc_lightlist[i].rcolormap = xwalllights[pindex]; dc_lightlist[i].rcolormap = xwalllights[pindex];
colfunc = R_DrawColumnShadowed_8; colfunc = colfuncs[COLDRAWFUNC_SHADOWED];
} }
} }
@ -1736,6 +1736,8 @@ void R_StoreWallRange(INT32 start, INT32 stop)
memset(&segright, 0x00, sizeof(segright)); memset(&segright, 0x00, sizeof(segright));
#endif #endif
colfunc = colfuncs[BASEDRAWFUNC];
if (ds_p == drawsegs+maxdrawsegs) if (ds_p == drawsegs+maxdrawsegs)
{ {
size_t curpos = curdrawsegs - drawsegs; size_t curpos = curdrawsegs - drawsegs;
@ -3186,7 +3188,7 @@ void R_StoreWallRange(INT32 start, INT32 stop)
else else
#endif #endif
R_RenderSegLoop(); R_RenderSegLoop();
colfunc = wallcolfunc; colfunc = colfuncs[BASEDRAWFUNC];
if (portalline) // if curline is a portal, set portalrender for drawseg if (portalline) // if curline is a portal, set portalrender for drawseg
ds_p->portalpass = portalrender+1; ds_p->portalpass = portalrender+1;

View File

@ -512,7 +512,7 @@ static void R_RenderFloorSplat(floorsplat_t *pSplat, vertex_t *verts, UINT8 *pTe
ds_x1 = x1; ds_x1 = x1;
ds_x2 = x2; ds_x2 = x2;
ds_transmap = transtables + ((tr_trans50-1)<<FF_TRANSSHIFT); ds_transmap = transtables + ((tr_trans50-1)<<FF_TRANSSHIFT);
splatfunc(); (spanfuncs[SPANDRAWFUNC_SPLAT])();
} }
// reset for next calls to edge rasterizer // reset for next calls to edge rasterizer

View File

@ -653,11 +653,7 @@ void R_DrawMaskedColumn(column_t *column)
// quick fix... something more proper should be done!!! // quick fix... something more proper should be done!!!
if (ylookup[dc_yl]) if (ylookup[dc_yl])
colfunc(); colfunc();
else if (colfunc == R_DrawColumn_8 else if (colfunc == colfuncs[COLDRAWFUNC_BASE])
#ifdef USEASM
|| colfunc == R_DrawColumn_8_ASM || colfunc == R_DrawColumn_8_MMX
#endif
)
{ {
static INT32 first = 1; static INT32 first = 1;
if (first) if (first)
@ -724,11 +720,7 @@ void R_DrawFlippedMaskedColumn(column_t *column, INT32 texheight)
// Still drawn by R_DrawColumn. // Still drawn by R_DrawColumn.
if (ylookup[dc_yl]) if (ylookup[dc_yl])
colfunc(); colfunc();
else if (colfunc == R_DrawColumn_8 else if (colfunc == colfuncs[COLDRAWFUNC_BASE])
#ifdef USEASM
|| colfunc == R_DrawColumn_8_ASM || colfunc == R_DrawColumn_8_MMX
#endif
)
{ {
static INT32 first = 1; static INT32 first = 1;
if (first) if (first)
@ -776,12 +768,12 @@ static void R_DrawVisSprite(vissprite_t *vis)
if ((UINT64)overflow_test&0xFFFFFFFF80000000ULL) return; // ditto if ((UINT64)overflow_test&0xFFFFFFFF80000000ULL) return; // ditto
} }
colfunc = basecolfunc; // hack: this isn't resetting properly somewhere. colfunc = colfuncs[BASEDRAWFUNC]; // hack: this isn't resetting properly somewhere.
dc_colormap = vis->colormap; dc_colormap = vis->colormap;
if (!(vis->cut & SC_PRECIP) && (vis->mobj->flags & (MF_ENEMY|MF_BOSS)) && (vis->mobj->flags2 & MF2_FRET) && !(vis->mobj->flags & MF_GRENADEBOUNCE) && (leveltime & 1)) // Bosses "flash" if (!(vis->cut & SC_PRECIP) && (vis->mobj->flags & (MF_ENEMY|MF_BOSS)) && (vis->mobj->flags2 & MF2_FRET) && !(vis->mobj->flags & MF_GRENADEBOUNCE) && (leveltime & 1)) // Bosses "flash"
{ {
// translate certain pixels to white // translate certain pixels to white
colfunc = transcolfunc; colfunc = colfuncs[COLDRAWFUNC_TRANS];
if (vis->mobj->type == MT_CYBRAKDEMON || vis->mobj->colorized) if (vis->mobj->type == MT_CYBRAKDEMON || vis->mobj->colorized)
dc_translation = R_GetTranslationColormap(TC_ALLWHITE, 0, GTC_CACHE); dc_translation = R_GetTranslationColormap(TC_ALLWHITE, 0, GTC_CACHE);
else if (vis->mobj->type == MT_METALSONIC_BATTLE) else if (vis->mobj->type == MT_METALSONIC_BATTLE)
@ -791,7 +783,7 @@ static void R_DrawVisSprite(vissprite_t *vis)
} }
else if (vis->mobj->color && vis->transmap) // Color mapping else if (vis->mobj->color && vis->transmap) // Color mapping
{ {
colfunc = transtransfunc; colfunc = colfuncs[COLDRAWFUNC_TRANSTRANS];
dc_transmap = vis->transmap; dc_transmap = vis->transmap;
if (!(vis->cut & SC_PRECIP) && vis->mobj->colorized) if (!(vis->cut & SC_PRECIP) && vis->mobj->colorized)
dc_translation = R_GetTranslationColormap(TC_RAINBOW, vis->mobj->color, GTC_CACHE); dc_translation = R_GetTranslationColormap(TC_RAINBOW, vis->mobj->color, GTC_CACHE);
@ -815,13 +807,13 @@ static void R_DrawVisSprite(vissprite_t *vis)
} }
else if (vis->transmap) else if (vis->transmap)
{ {
colfunc = fuzzcolfunc; colfunc = colfuncs[COLDRAWFUNC_FUZZY];
dc_transmap = vis->transmap; //Fab : 29-04-98: translucency table dc_transmap = vis->transmap; //Fab : 29-04-98: translucency table
} }
else if (vis->mobj->color) else if (vis->mobj->color)
{ {
// translate green skin to another color // translate green skin to another color
colfunc = transcolfunc; colfunc = colfuncs[COLDRAWFUNC_TRANS];
// New colormap stuff for skins Tails 06-07-2002 // New colormap stuff for skins Tails 06-07-2002
if (!(vis->cut & SC_PRECIP) && vis->mobj->colorized) if (!(vis->cut & SC_PRECIP) && vis->mobj->colorized)
@ -846,7 +838,7 @@ static void R_DrawVisSprite(vissprite_t *vis)
} }
else if (vis->mobj->sprite == SPR_PLAY) // Looks like a player, but doesn't have a color? Get rid of green sonic syndrome. else if (vis->mobj->sprite == SPR_PLAY) // Looks like a player, but doesn't have a color? Get rid of green sonic syndrome.
{ {
colfunc = transcolfunc; colfunc = colfuncs[COLDRAWFUNC_TRANS];
dc_translation = R_GetTranslationColormap(TC_DEFAULT, SKINCOLOR_BLUE, GTC_CACHE); dc_translation = R_GetTranslationColormap(TC_DEFAULT, SKINCOLOR_BLUE, GTC_CACHE);
} }
@ -926,7 +918,7 @@ static void R_DrawVisSprite(vissprite_t *vis)
spryscale += vis->scalestep; spryscale += vis->scalestep;
} }
colfunc = basecolfunc; colfunc = colfuncs[BASEDRAWFUNC];
dc_hires = 0; dc_hires = 0;
vis->x1 = x1; vis->x1 = x1;
@ -956,7 +948,7 @@ static void R_DrawPrecipitationVisSprite(vissprite_t *vis)
if (vis->transmap) if (vis->transmap)
{ {
colfunc = fuzzcolfunc; colfunc = colfuncs[COLDRAWFUNC_FUZZY];
dc_transmap = vis->transmap; //Fab : 29-04-98: translucency table dc_transmap = vis->transmap; //Fab : 29-04-98: translucency table
} }
@ -992,7 +984,7 @@ static void R_DrawPrecipitationVisSprite(vissprite_t *vis)
R_DrawMaskedColumn(column); R_DrawMaskedColumn(column);
} }
colfunc = basecolfunc; colfunc = colfuncs[BASEDRAWFUNC];
} }
// //

View File

@ -41,20 +41,12 @@
// -------------------------------------------- // --------------------------------------------
// assembly or c drawer routines for 8bpp/16bpp // assembly or c drawer routines for 8bpp/16bpp
// -------------------------------------------- // --------------------------------------------
void (*wallcolfunc)(void); // new wall column drawer to draw posts >128 high void (*colfunc)(void);
void (*colfunc)(void); // standard column, up to 128 high posts void (*colfuncs[COLDRAWFUNC_MAX])(void);
void (*basecolfunc)(void); void (*spanfunc)(void);
void (*fuzzcolfunc)(void); // standard fuzzy effect column drawer void (*spanfuncs[SPANDRAWFUNC_MAX])(void);
void (*transcolfunc)(void); // translation column drawer void (*spanfuncs_npo2[SPANDRAWFUNC_MAX])(void);
void (*shadecolfunc)(void); // smokie test..
void (*spanfunc)(void); // span drawer, use a 64x64 tile
void (*mmxspanfunc)(void); // span drawer in MMX assembly
void (*splatfunc)(void); // span drawer w/ transparency
void (*basespanfunc)(void); // default span func for color mode
void (*transtransfunc)(void); // translucent translated column drawer
void (*twosmultipatchfunc)(void); // for cols with transparent pixels
void (*twosmultipatchtransfunc)(void); // for cols with transparent pixels AND translucency
// ------------------ // ------------------
// global video state // global video state
@ -113,36 +105,72 @@ void SCR_SetMode(void)
// //
if (true)//vid.bpp == 1) //Always run in 8bpp. todo: remove all 16bpp code? if (true)//vid.bpp == 1) //Always run in 8bpp. todo: remove all 16bpp code?
{ {
spanfunc = basespanfunc = mmxspanfunc = R_DrawSpan_8; colfuncs[BASEDRAWFUNC] = R_DrawColumn_8;
splatfunc = R_DrawSplat_8; spanfuncs[BASEDRAWFUNC] = R_DrawSpan_8;
transcolfunc = R_DrawTranslatedColumn_8;
transtransfunc = R_DrawTranslatedTranslucentColumn_8; colfunc = colfuncs[BASEDRAWFUNC];
spanfunc = spanfuncs[BASEDRAWFUNC];
colfuncs[COLDRAWFUNC_FUZZY] = R_DrawTranslucentColumn_8;
colfuncs[COLDRAWFUNC_TRANS] = R_DrawTranslatedColumn_8;
colfuncs[COLDRAWFUNC_SHADE] = R_DrawShadeColumn_8;
colfuncs[COLDRAWFUNC_SHADOWED] = R_DrawColumnShadowed_8;
colfuncs[COLDRAWFUNC_TRANSTRANS] = R_DrawTranslatedTranslucentColumn_8;
colfuncs[COLDRAWFUNC_TWOSMULTIPATCH] = R_Draw2sMultiPatchColumn_8;
colfuncs[COLDRAWFUNC_TWOSMULTIPATCHTRANS] = R_Draw2sMultiPatchTranslucentColumn_8;
colfuncs[COLDRAWFUNC_FOG] = R_DrawFogColumn_8;
spanfuncs[SPANDRAWFUNC_TRANS] = R_DrawTranslucentSpan_8;
spanfuncs[SPANDRAWFUNC_SPLAT] = R_DrawSplat_8;
spanfuncs[SPANDRAWFUNC_TRANSSPLAT] = R_DrawTranslucentSplat_8;
spanfuncs[SPANDRAWFUNC_FOG] = R_DrawFogSpan_8;
#ifndef NOWATER
spanfuncs[SPANDRAWFUNC_WATER] = R_DrawTranslucentWaterSpan_8;
#endif
#ifdef ESLOPE
spanfuncs[SPANDRAWFUNC_TILTED] = R_DrawTiltedSpan_8;
spanfuncs[SPANDRAWFUNC_TILTEDTRANS] = R_DrawTiltedTranslucentSpan_8;
#ifndef NOWATER
spanfuncs[SPANDRAWFUNC_TILTEDWATER] = R_DrawTiltedTranslucentWaterSpan_8;
#endif
spanfuncs[SPANDRAWFUNC_TILTEDSPLAT] = R_DrawTiltedSplat_8;
#endif
// Lactozilla: Non-powers-of-two
spanfuncs_npo2[BASEDRAWFUNC] = R_DrawSpan_NPO2_8;
spanfuncs_npo2[SPANDRAWFUNC_TRANS] = R_DrawTranslucentSpan_NPO2_8;
spanfuncs_npo2[SPANDRAWFUNC_SPLAT] = R_DrawSplat_NPO2_8;
spanfuncs_npo2[SPANDRAWFUNC_TRANSSPLAT] = R_DrawTranslucentSplat_NPO2_8;
spanfuncs_npo2[SPANDRAWFUNC_FOG] = NULL; // Not needed
#ifndef NOWATER
spanfuncs_npo2[SPANDRAWFUNC_WATER] = R_DrawTranslucentWaterSpan_NPO2_8;
#endif
#ifdef ESLOPE
spanfuncs_npo2[SPANDRAWFUNC_TILTED] = R_DrawTiltedSpan_NPO2_8;
spanfuncs_npo2[SPANDRAWFUNC_TILTEDTRANS] = R_DrawTiltedTranslucentSpan_NPO2_8;
#ifndef NOWATER
spanfuncs_npo2[SPANDRAWFUNC_TILTEDWATER] = R_DrawTiltedTranslucentWaterSpan_NPO2_8;
#endif
spanfuncs_npo2[SPANDRAWFUNC_TILTEDSPLAT] = R_DrawTiltedSplat_NPO2_8;
#endif
colfunc = basecolfunc = R_DrawColumn_8;
shadecolfunc = R_DrawShadeColumn_8;
fuzzcolfunc = R_DrawTranslucentColumn_8;
walldrawerfunc = R_DrawWallColumn_8;
twosmultipatchfunc = R_Draw2sMultiPatchColumn_8;
twosmultipatchtransfunc = R_Draw2sMultiPatchTranslucentColumn_8;
#ifdef RUSEASM #ifdef RUSEASM
if (R_ASM) if (R_ASM)
{ {
if (R_MMX) if (R_MMX)
{ {
colfunc = basecolfunc = R_DrawColumn_8_MMX; colfuncs[BASEDRAWFUNC] = R_DrawColumn_8_MMX;
//shadecolfunc = R_DrawShadeColumn_8_ASM; //colfuncs[COLDRAWFUNC_SHADE] = R_DrawShadeColumn_8_ASM;
//fuzzcolfunc = R_DrawTranslucentColumn_8_ASM; //colfuncs[COLDRAWFUNC_FUZZY] = R_DrawTranslucentColumn_8_ASM;
walldrawerfunc = R_DrawWallColumn_8_MMX; colfuncs[COLDRAWFUNC_TWOSMULTIPATCH] = R_Draw2sMultiPatchColumn_8_MMX;
twosmultipatchfunc = R_Draw2sMultiPatchColumn_8_MMX; spanfuncs[BASEDRAWFUNC] = R_DrawSpan_8_MMX;
mmxspanfunc = R_DrawSpan_8_MMX;
} }
else else
{ {
colfunc = basecolfunc = R_DrawColumn_8_ASM; colfuncs[BASEDRAWFUNC] = R_DrawColumn_8_ASM;
//shadecolfunc = R_DrawShadeColumn_8_ASM; //colfuncs[COLDRAWFUNC_SHADE] = R_DrawShadeColumn_8_ASM;
//fuzzcolfunc = R_DrawTranslucentColumn_8_ASM; //colfuncs[COLDRAWFUNC_FUZZY] = R_DrawTranslucentColumn_8_ASM;
walldrawerfunc = R_DrawWallColumn_8_ASM; colfuncs[COLDRAWFUNC_TWOSMULTIPATCH] = R_Draw2sMultiPatchColumn_8_ASM;
twosmultipatchfunc = R_Draw2sMultiPatchColumn_8_ASM;
} }
} }
#endif #endif
@ -166,8 +194,6 @@ void SCR_SetMode(void)
CONS_Alert(CONS_WARNING, M_GetText("Resolution is not aspect-correct!\nUse a multiple of %dx%d\n"), BASEVIDWIDTH, BASEVIDHEIGHT); CONS_Alert(CONS_WARNING, M_GetText("Resolution is not aspect-correct!\nUse a multiple of %dx%d\n"), BASEVIDWIDTH, BASEVIDHEIGHT);
*/ */
wallcolfunc = walldrawerfunc;
// set the apprpriate drawer for the sky (tall or INT16) // set the apprpriate drawer for the sky (tall or INT16)
setmodeneeded = 0; setmodeneeded = 0;
} }

View File

@ -110,19 +110,51 @@ extern vmode_t specialmodes[NUMSPECIALMODES];
// color mode dependent drawer function pointers // color mode dependent drawer function pointers
// --------------------------------------------- // ---------------------------------------------
extern void (*wallcolfunc)(void); #define BASEDRAWFUNC 0
enum
{
COLDRAWFUNC_BASE = BASEDRAWFUNC,
COLDRAWFUNC_FUZZY,
COLDRAWFUNC_TRANS,
COLDRAWFUNC_SHADE,
COLDRAWFUNC_SHADOWED,
COLDRAWFUNC_TRANSTRANS,
COLDRAWFUNC_TWOSMULTIPATCH,
COLDRAWFUNC_TWOSMULTIPATCHTRANS,
COLDRAWFUNC_FOG,
COLDRAWFUNC_MAX
};
extern void (*colfunc)(void); extern void (*colfunc)(void);
extern void (*basecolfunc)(void); extern void (*colfuncs[COLDRAWFUNC_MAX])(void);
extern void (*fuzzcolfunc)(void);
extern void (*transcolfunc)(void); enum
extern void (*shadecolfunc)(void); {
SPANDRAWFUNC_BASE = BASEDRAWFUNC,
SPANDRAWFUNC_TRANS,
SPANDRAWFUNC_SPLAT,
SPANDRAWFUNC_TRANSSPLAT,
SPANDRAWFUNC_FOG,
#ifndef NOWATER
SPANDRAWFUNC_WATER,
#endif
#ifdef ESLOPE
SPANDRAWFUNC_TILTED,
SPANDRAWFUNC_TILTEDTRANS,
SPANDRAWFUNC_TILTEDSPLAT,
#ifndef NOWATER
SPANDRAWFUNC_TILTEDWATER,
#endif
#endif
SPANDRAWFUNC_MAX
};
extern void (*spanfunc)(void); extern void (*spanfunc)(void);
extern void (*basespanfunc)(void); extern void (*spanfuncs[SPANDRAWFUNC_MAX])(void);
extern void (*mmxspanfunc)(void); extern void (*spanfuncs_npo2[SPANDRAWFUNC_MAX])(void);
extern void (*splatfunc)(void);
extern void (*transtransfunc)(void);
extern void (*twosmultipatchfunc)(void);
extern void (*twosmultipatchtransfunc)(void);
// ----- // -----
// CPUID // CPUID
@ -148,9 +180,6 @@ extern consvar_t cv_scr_width, cv_scr_height, cv_scr_depth, cv_renderview, cv_fu
// wait for page flipping to end or not // wait for page flipping to end or not
extern consvar_t cv_vidwait; extern consvar_t cv_vidwait;
// quick fix for tall/short skies, depending on bytesperpixel
extern void (*walldrawerfunc)(void);
// Change video mode, only at the start of a refresh. // Change video mode, only at the start of a refresh.
void SCR_SetMode(void); void SCR_SetMode(void);
// Recalc screen size dependent stuff // Recalc screen size dependent stuff

View File

@ -140,7 +140,13 @@ if(${SDL2_FOUND})
endif() endif()
add_executable(SRB2SDL2 MACOSX_BUNDLE WIN32 ${SRB2_SDL2_TOTAL_SOURCES}) add_executable(SRB2SDL2 MACOSX_BUNDLE WIN32 ${SRB2_SDL2_TOTAL_SOURCES})
set_target_properties(SRB2SDL2 PROPERTIES OUTPUT_NAME ${SRB2_SDL2_EXE_NAME}) if(${CMAKE_SYSTEM} MATCHES Windows)
set_target_properties(SRB2SDL2 PROPERTIES OUTPUT_NAME srb2win)
elseif(${CMAKE_SYSTEM} MATCHES Linux)
set_target_properties(SRB2SDL2 PROPERTIES OUTPUT_NAME lsdlsrb2)
else()
set_target_properties(SRB2SDL2 PROPERTIES OUTPUT_NAME srb2)
endif()
if(${CMAKE_SYSTEM} MATCHES Darwin) if(${CMAKE_SYSTEM} MATCHES Darwin)
find_library(CORE_LIB CoreFoundation) find_library(CORE_LIB CoreFoundation)

View File

@ -438,6 +438,9 @@
<ClCompile Include="..\r_draw8.c"> <ClCompile Include="..\r_draw8.c">
<ExcludedFromBuild>true</ExcludedFromBuild> <ExcludedFromBuild>true</ExcludedFromBuild>
</ClCompile> </ClCompile>
<ClCompile Include="..\r_draw8_npo2.c">
<ExcludedFromBuild>true</ExcludedFromBuild>
</ClCompile>
<ClCompile Include="..\r_main.c" /> <ClCompile Include="..\r_main.c" />
<ClCompile Include="..\r_plane.c" /> <ClCompile Include="..\r_plane.c" />
<ClCompile Include="..\r_patch.c" /> <ClCompile Include="..\r_patch.c" />

View File

@ -837,6 +837,9 @@
<ClCompile Include="..\r_draw8.c"> <ClCompile Include="..\r_draw8.c">
<Filter>R_Rend</Filter> <Filter>R_Rend</Filter>
</ClCompile> </ClCompile>
<ClCompile Include="..\r_draw8_npo2.c">
<Filter>R_Rend</Filter>
</ClCompile>
<ClCompile Include="..\r_main.c"> <ClCompile Include="..\r_main.c">
<Filter>R_Rend</Filter> <Filter>R_Rend</Filter>
</ClCompile> </ClCompile>

View File

@ -20,12 +20,17 @@
#include "../doomdef.h" #include "../doomdef.h"
#include "../m_argv.h" #include "../m_argv.h"
#include "../d_main.h" #include "../d_main.h"
#include "../m_misc.h"/* path shit */
#include "../i_system.h" #include "../i_system.h"
#ifdef __GNUC__ #if defined (__GNUC__) || defined (__unix__)
#include <unistd.h> #include <unistd.h>
#endif #endif
#ifdef __unix__
#include <errno.h>
#endif
#include "time.h" // For log timestamps #include "time.h" // For log timestamps
#ifdef HAVE_SDL #ifdef HAVE_SDL
@ -47,6 +52,7 @@ extern int SDL_main(int argc, char *argv[]);
#ifdef LOGMESSAGES #ifdef LOGMESSAGES
FILE *logstream = NULL; FILE *logstream = NULL;
char logfilename[1024];
#endif #endif
#ifndef DOXYGEN #ifndef DOXYGEN
@ -116,7 +122,6 @@ int main(int argc, char **argv)
#endif #endif
{ {
const char *logdir = NULL; const char *logdir = NULL;
char logfile[MAX_WADPATH];
myargc = argc; myargc = argc;
myargv = argv; /// \todo pull out path to exe from this string myargv = argv; /// \todo pull out path to exe from this string
@ -133,32 +138,86 @@ int main(int argc, char **argv)
{ {
time_t my_time; time_t my_time;
struct tm * timeinfo; struct tm * timeinfo;
char buf[26]; const char *format;
const char *reldir;
int left;
boolean fileabs;
#ifdef __unix__
const char *link;
#endif
logdir = D_Home(); logdir = D_Home();
my_time = time(NULL); my_time = time(NULL);
timeinfo = localtime(&my_time); timeinfo = localtime(&my_time);
strftime(buf, 26, "%Y-%m-%d %H-%M-%S", timeinfo); if (M_CheckParm("-logfile") && M_IsNextParm())
strcpy(logfile, va("log-%s.txt", buf));
#ifdef DEFAULTDIR
if (logdir)
{ {
// Create dirs here because D_SRB2Main() is too late. format = M_GetNextParm();
I_mkdir(va("%s%s"DEFAULTDIR, logdir, PATHSEP), 0755); fileabs = M_IsPathAbsolute(format);
I_mkdir(va("%s%s"DEFAULTDIR"%slogs",logdir, PATHSEP, PATHSEP), 0755);
logstream = fopen(va("%s%s"DEFAULTDIR"%slogs%s%s",logdir, PATHSEP, PATHSEP, PATHSEP, logfile), "wt");
} }
else else
#endif
{ {
I_mkdir("."PATHSEP"logs"PATHSEP, 0755); format = "log-%Y-%m-%d_%H-%M-%S.txt";
logstream = fopen(va("."PATHSEP"logs"PATHSEP"%s", logfile), "wt"); fileabs = false;
} }
if (fileabs)
{
strftime(logfilename, sizeof logfilename, format, timeinfo);
}
else
{
if (M_CheckParm("-logdir") && M_IsNextParm())
reldir = M_GetNextParm();
else
reldir = "logs";
if (M_IsPathAbsolute(reldir))
{
left = snprintf(logfilename, sizeof logfilename,
"%s"PATHSEP, reldir);
}
else
#ifdef DEFAULTDIR
if (logdir)
{
left = snprintf(logfilename, sizeof logfilename,
"%s"PATHSEP DEFAULTDIR PATHSEP"%s"PATHSEP, logdir, reldir);
}
else
#endif/*DEFAULTDIR*/
{
left = snprintf(logfilename, sizeof logfilename,
"."PATHSEP"%s"PATHSEP, reldir);
}
#endif/*LOGMESSAGES*/
strftime(&logfilename[left], sizeof logfilename - left,
format, timeinfo);
}
M_MkdirEachUntil(logfilename,
M_PathParts(logdir) - 1,
M_PathParts(logfilename) - 1, 0755);
#ifdef __unix__
logstream = fopen(logfilename, "w");
#ifdef DEFAULTDIR
if (logdir)
link = va("%s/"DEFAULTDIR"/latest-log.txt", logdir);
else
#endif/*DEFAULTDIR*/
link = "latest-log.txt";
unlink(link);
if (symlink(logfilename, link) == -1)
{
I_OutputMsg("Error symlinking latest-log.txt: %s\n", strerror(errno));
}
#else/*__unix__*/
logstream = fopen("latest-log.txt", "wt+");
#endif/*__unix__*/
} }
#endif
//I_OutputMsg("I_StartupSystem() ...\n"); //I_OutputMsg("I_StartupSystem() ...\n");
I_StartupSystem(); I_StartupSystem();
@ -181,12 +240,13 @@ int main(int argc, char **argv)
#endif #endif
MakeCodeWritable(); MakeCodeWritable();
#endif #endif
// startup SRB2 // startup SRB2
CONS_Printf("Setting up SRB2...\n"); CONS_Printf("Setting up SRB2...\n");
D_SRB2Main(); D_SRB2Main();
#ifdef LOGMESSAGES #ifdef LOGMESSAGES
if (!M_CheckParm("-nolog")) if (!M_CheckParm("-nolog"))
CONS_Printf("Logfile: %s\n", logfile); CONS_Printf("Logfile: %s\n", logfilename);
#endif #endif
CONS_Printf("Entering main game loop...\n"); CONS_Printf("Entering main game loop...\n");
// never return // never return

View File

@ -102,6 +102,12 @@ typedef LPVOID (WINAPI *p_MapViewOfFile) (HANDLE, DWORD, DWORD, DWORD, SIZE_T);
#endif #endif
#endif #endif
#if (defined (__unix__) && !defined (_MSDOS)) || defined (UNIXCOMMON)
#include <errno.h>
#include <sys/wait.h>
#define NEWSIGNALHANDLER
#endif
#ifndef NOMUMBLE #ifndef NOMUMBLE
#ifdef __linux__ // need -lrt #ifdef __linux__ // need -lrt
#include <sys/mman.h> #include <sys/mman.h>
@ -229,13 +235,11 @@ SDL_bool framebuffer = SDL_FALSE;
UINT8 keyboard_started = false; UINT8 keyboard_started = false;
FUNCNORETURN static ATTRNORETURN void signal_handler(INT32 num) static void I_ReportSignal(int num, int coredumped)
{ {
//static char msg[] = "oh no! back to reality!\r\n"; //static char msg[] = "oh no! back to reality!\r\n";
const char * sigmsg; const char * sigmsg;
char sigdef[32]; char msg[128];
D_QuitNetGame(); // Fix server freezes
switch (num) switch (num)
{ {
@ -261,20 +265,41 @@ FUNCNORETURN static ATTRNORETURN void signal_handler(INT32 num)
sigmsg = "SIGABRT - abnormal termination triggered by abort call"; sigmsg = "SIGABRT - abnormal termination triggered by abort call";
break; break;
default: default:
sprintf(sigdef,"signal number %d", num); sprintf(msg,"signal number %d", num);
sigmsg = sigdef; if (coredumped)
sigmsg = 0;
else
sigmsg = msg;
} }
I_OutputMsg("\nsignal_handler() error: %s\n", sigmsg); if (coredumped)
{
if (sigmsg)
sprintf(msg, "%s (core dumped)", sigmsg);
else
strcat(msg, " (core dumped)");
sigmsg = msg;
}
I_OutputMsg("\nProcess killed by signal: %s\n\n", sigmsg);
SDL_ShowSimpleMessageBox(SDL_MESSAGEBOX_ERROR, SDL_ShowSimpleMessageBox(SDL_MESSAGEBOX_ERROR,
"Signal caught", "Process killed by signal",
sigmsg, NULL); sigmsg, NULL);
}
#ifndef NEWSIGNALHANDLER
FUNCNORETURN static ATTRNORETURN void signal_handler(INT32 num)
{
D_QuitNetGame(); // Fix server freezes
I_ReportSignal(num, 0);
I_ShutdownSystem(); I_ShutdownSystem();
signal(num, SIG_DFL); //default signal action signal(num, SIG_DFL); //default signal action
raise(num); raise(num);
I_Quit(); I_Quit();
} }
#endif
FUNCNORETURN static ATTRNORETURN void quit_handler(int num) FUNCNORETURN static ATTRNORETURN void quit_handler(int num)
{ {
@ -650,7 +675,7 @@ static inline void I_ShutdownConsole(void){}
// //
// StartupKeyboard // StartupKeyboard
// //
void I_StartupKeyboard (void) static void I_RegisterSignals (void)
{ {
#ifdef SIGINT #ifdef SIGINT
signal(SIGINT , quit_handler); signal(SIGINT , quit_handler);
@ -664,10 +689,12 @@ void I_StartupKeyboard (void)
// If these defines don't exist, // If these defines don't exist,
// then compilation would have failed above us... // then compilation would have failed above us...
#ifndef NEWSIGNALHANDLER
signal(SIGILL , signal_handler); signal(SIGILL , signal_handler);
signal(SIGSEGV , signal_handler); signal(SIGSEGV , signal_handler);
signal(SIGABRT , signal_handler); signal(SIGABRT , signal_handler);
signal(SIGFPE , signal_handler); signal(SIGFPE , signal_handler);
#endif
} }
// //
@ -2139,6 +2166,85 @@ void I_Sleep(void)
SDL_Delay(cv_sleep.value); SDL_Delay(cv_sleep.value);
} }
#ifdef NEWSIGNALHANDLER
static void newsignalhandler_Warn(const char *pr)
{
char text[128];
snprintf(text, sizeof text,
"Error while setting up signal reporting: %s: %s",
pr,
strerror(errno)
);
I_OutputMsg("%s\n", text);
SDL_ShowSimpleMessageBox(SDL_MESSAGEBOX_ERROR,
"Startup error",
text, NULL);
I_ShutdownConsole();
exit(-1);
}
static void I_Fork(void)
{
int child;
int status;
int signum;
int c;
child = fork();
switch (child)
{
case -1:
newsignalhandler_Warn("fork()");
break;
case 0:
break;
default:
if (logstream)
fclose(logstream);/* the child has this */
c = wait(&status);
#ifdef LOGMESSAGES
/* By the way, exit closes files. */
logstream = fopen(logfilename, "at");
#else
logstream = 0;
#endif
if (c == -1)
{
kill(child, SIGKILL);
newsignalhandler_Warn("wait()");
}
else
{
if (WIFSIGNALED (status))
{
signum = WTERMSIG (status);
#ifdef WCOREDUMP
I_ReportSignal(signum, WCOREDUMP (status));
#else
I_ReportSignal(signum, 0);
#endif
status = 128 + signum;
}
else if (WIFEXITED (status))
{
status = WEXITSTATUS (status);
}
I_ShutdownConsole();
exit(status);
}
}
}
#endif/*NEWSIGNALHANDLER*/
INT32 I_StartupSystem(void) INT32 I_StartupSystem(void)
{ {
SDL_version SDLcompiled; SDL_version SDLcompiled;
@ -2146,6 +2252,10 @@ INT32 I_StartupSystem(void)
SDL_VERSION(&SDLcompiled) SDL_VERSION(&SDLcompiled)
SDL_GetVersion(&SDLlinked); SDL_GetVersion(&SDLlinked);
I_StartupConsole(); I_StartupConsole();
#ifdef NEWSIGNALHANDLER
I_Fork();
#endif
I_RegisterSignals();
I_OutputMsg("Compiled for SDL version: %d.%d.%d\n", I_OutputMsg("Compiled for SDL version: %d.%d.%d\n",
SDLcompiled.major, SDLcompiled.minor, SDLcompiled.patch); SDLcompiled.major, SDLcompiled.minor, SDLcompiled.patch);
I_OutputMsg("Linked with SDL version: %d.%d.%d\n", I_OutputMsg("Linked with SDL version: %d.%d.%d\n",
@ -2169,7 +2279,6 @@ void I_Quit(void)
if (quiting) goto death; if (quiting) goto death;
SDLforceUngrabMouse(); SDLforceUngrabMouse();
quiting = SDL_FALSE; quiting = SDL_FALSE;
I_ShutdownConsole();
M_SaveConfig(NULL); //save game config, cvars.. M_SaveConfig(NULL); //save game config, cvars..
#ifndef NONET #ifndef NONET
D_SaveBan(); // save the ban list D_SaveBan(); // save the ban list
@ -2287,8 +2396,6 @@ void I_Error(const char *error, ...)
I_OutputMsg("\nI_Error(): %s\n", buffer); I_OutputMsg("\nI_Error(): %s\n", buffer);
// --- // ---
I_ShutdownConsole();
M_SaveConfig(NULL); // save game config, cvars.. M_SaveConfig(NULL); // save game config, cvars..
#ifndef NONET #ifndef NONET
D_SaveBan(); // save the ban list D_SaveBan(); // save the ban list
@ -2377,6 +2484,48 @@ void I_RemoveExitFunc(void (*func)())
} }
} }
#ifndef __unix__
static void Shittycopyerror(const char *name)
{
I_OutputMsg(
"Error copying log file: %s: %s\n",
name,
strerror(errno)
);
}
static void Shittylogcopy(void)
{
char buf[8192];
FILE *fp;
size_t r;
if (fseek(logstream, 0, SEEK_SET) == -1)
{
Shittycopyerror("fseek");
}
else if (( fp = fopen(logfilename, "wt") ))
{
while (( r = fread(buf, 1, sizeof buf, logstream) ))
{
if (fwrite(buf, 1, r, fp) < r)
{
Shittycopyerror("fwrite");
break;
}
}
if (ferror(logstream))
{
Shittycopyerror("fread");
}
fclose(fp);
}
else
{
Shittycopyerror(logfilename);
}
}
#endif/*__unix__*/
// //
// Closes down everything. This includes restoring the initial // Closes down everything. This includes restoring the initial
// palette and video mode, and removing whatever mouse, keyboard, and // palette and video mode, and removing whatever mouse, keyboard, and
@ -2388,6 +2537,10 @@ void I_ShutdownSystem(void)
{ {
INT32 c; INT32 c;
#ifndef NEWSIGNALHANDLER
I_ShutdownConsole();
#endif
for (c = MAX_QUIT_FUNCS-1; c >= 0; c--) for (c = MAX_QUIT_FUNCS-1; c >= 0; c--)
if (quit_funcs[c]) if (quit_funcs[c])
(*quit_funcs[c])(); (*quit_funcs[c])();
@ -2395,6 +2548,9 @@ void I_ShutdownSystem(void)
if (logstream) if (logstream)
{ {
I_OutputMsg("I_ShutdownSystem(): end of logstream.\n"); I_OutputMsg("I_ShutdownSystem(): end of logstream.\n");
#ifndef __unix__
Shittylogcopy();
#endif
fclose(logstream); fclose(logstream);
logstream = NULL; logstream = NULL;
} }

View File

@ -1441,6 +1441,7 @@ INT32 VID_SetMode(INT32 modeNum)
//Impl_SetWindowName("SRB2 "VERSIONSTRING); //Impl_SetWindowName("SRB2 "VERSIONSTRING);
SDLSetMode(vid.width, vid.height, USE_FULLSCREEN); SDLSetMode(vid.width, vid.height, USE_FULLSCREEN);
Impl_VideoSetupBuffer();
if (rendermode == render_soft) if (rendermode == render_soft)
{ {
@ -1449,8 +1450,6 @@ INT32 VID_SetMode(INT32 modeNum)
SDL_FreeSurface(bufSurface); SDL_FreeSurface(bufSurface);
bufSurface = NULL; bufSurface = NULL;
} }
Impl_VideoSetupBuffer();
} }
return SDL_TRUE; return SDL_TRUE;
@ -1573,7 +1572,7 @@ static void Impl_VideoSetupSDLBuffer(void)
static void Impl_VideoSetupBuffer(void) static void Impl_VideoSetupBuffer(void)
{ {
// Set up game's software render buffer // Set up game's software render buffer
if (rendermode == render_soft) //if (rendermode == render_soft)
{ {
vid.rowbytes = vid.width * vid.bpp; vid.rowbytes = vid.width * vid.bpp;
vid.direct = NULL; vid.direct = NULL;

View File

@ -1219,7 +1219,7 @@
C01FCF4B08A954540054247B /* Debug */ = { C01FCF4B08A954540054247B /* Debug */ = {
isa = XCBuildConfiguration; isa = XCBuildConfiguration;
buildSettings = { buildSettings = {
CURRENT_PROJECT_VERSION = 2.1.25; CURRENT_PROJECT_VERSION = 2.2.0;
GCC_PREPROCESSOR_DEFINITIONS = ( GCC_PREPROCESSOR_DEFINITIONS = (
"$(inherited)", "$(inherited)",
NORMALSRB2, NORMALSRB2,
@ -1231,7 +1231,7 @@
C01FCF4C08A954540054247B /* Release */ = { C01FCF4C08A954540054247B /* Release */ = {
isa = XCBuildConfiguration; isa = XCBuildConfiguration;
buildSettings = { buildSettings = {
CURRENT_PROJECT_VERSION = 2.1.25; CURRENT_PROJECT_VERSION = 2.2.0;
GCC_ENABLE_FIX_AND_CONTINUE = NO; GCC_ENABLE_FIX_AND_CONTINUE = NO;
GCC_GENERATE_DEBUGGING_SYMBOLS = NO; GCC_GENERATE_DEBUGGING_SYMBOLS = NO;
GCC_PREPROCESSOR_DEFINITIONS = ( GCC_PREPROCESSOR_DEFINITIONS = (

View File

@ -9,6 +9,26 @@
/// \file /// \file
/// \brief SDL Mixer interface for sound /// \brief SDL Mixer interface for sound
#ifdef HAVE_LIBGME
#ifdef HAVE_ZLIB
#ifndef _MSC_VER
#ifndef _LARGEFILE64_SOURCE
#define _LARGEFILE64_SOURCE
#endif
#endif
#ifndef _LFS64_LARGEFILE
#define _LFS64_LARGEFILE
#endif
#ifndef _FILE_OFFSET_BITS
#define _FILE_OFFSET_BITS 0
#endif
#include <zlib.h>
#endif // HAVE_ZLIB
#endif // HAVE_LIBGME
#include "../doomdef.h" #include "../doomdef.h"
#include "../doomstat.h" // menuactive #include "../doomstat.h" // menuactive
@ -57,24 +77,6 @@
#include "gme/gme.h" #include "gme/gme.h"
#define GME_TREBLE 5.0f #define GME_TREBLE 5.0f
#define GME_BASS 1.0f #define GME_BASS 1.0f
#ifdef HAVE_ZLIB
#ifndef _MSC_VER
#ifndef _LARGEFILE64_SOURCE
#define _LARGEFILE64_SOURCE
#endif
#endif
#ifndef _LFS64_LARGEFILE
#define _LFS64_LARGEFILE
#endif
#ifndef _FILE_OFFSET_BITS
#define _FILE_OFFSET_BITS 0
#endif
#include "zlib.h"
#endif // HAVE_ZLIB
#endif // HAVE_LIBGME #endif // HAVE_LIBGME
static UINT16 BUFFERSIZE = 2048; static UINT16 BUFFERSIZE = 2048;

View File

@ -222,20 +222,15 @@ void OglSdlFinishUpdate(boolean waitvbl)
HWR_DrawScreenFinalTexture(realwidth, realheight); HWR_DrawScreenFinalTexture(realwidth, realheight);
} }
EXPORT void HWRAPI( OglSdlSetPalette) (RGBA_t *palette, RGBA_t *pgamma) EXPORT void HWRAPI( OglSdlSetPalette) (RGBA_t *palette)
{ {
INT32 i = -1; size_t palsize = (sizeof(RGBA_t) * 256);
UINT32 redgamma = pgamma->s.red, greengamma = pgamma->s.green, // on a palette change, you have to reload all of the textures
bluegamma = pgamma->s.blue; if (memcmp(&myPaletteData, palette, palsize))
for (i = 0; i < 256; i++)
{ {
myPaletteData[i].s.red = (UINT8)MIN((palette[i].s.red * redgamma) /127, 255); memcpy(&myPaletteData, palette, palsize);
myPaletteData[i].s.green = (UINT8)MIN((palette[i].s.green * greengamma)/127, 255); Flush();
myPaletteData[i].s.blue = (UINT8)MIN((palette[i].s.blue * bluegamma) /127, 255);
myPaletteData[i].s.alpha = palette[i].s.alpha;
} }
Flush();
} }
#endif //HWRENDER #endif //HWRENDER

View File

@ -31,5 +31,5 @@ extern Uint16 realwidth;
extern Uint16 realheight; extern Uint16 realheight;
#ifdef _CREATE_DLL_ #ifdef _CREATE_DLL_
EXPORT void HWRAPI( OglSdlSetPalette ) (RGBA_t *palette, RGBA_t *pgamma); EXPORT void HWRAPI( OglSdlSetPalette ) (RGBA_t *palette);
#endif #endif

View File

@ -23,13 +23,6 @@ ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT
SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
*/ */
#define SWAP( a, b ) \
(\
(a) ^= (b),\
(b) ^= (a),\
(a) ^= (b)\
)
static inline int static inline int
trycmp (char **pp, char *cp, trycmp (char **pp, char *cp,
const char *q, size_t qn) const char *q, size_t qn)
@ -45,8 +38,16 @@ trycmp (char **pp, char *cp,
static inline void static inline void
swapp (char ***ppap, char ***ppbp, char **cpap, char **cpbp) swapp (char ***ppap, char ***ppbp, char **cpap, char **cpbp)
{ {
SWAP(*(intptr_t *)ppap, *(intptr_t *)ppbp); char **pp;
SWAP(*(intptr_t *)cpap, *(intptr_t *)cpbp); char *p;
pp = *ppap;
*ppap = *ppbp;
*ppbp = pp;
p = *cpap;
*cpap = *cpbp;
*cpbp = p;
} }
char * char *

View File

@ -84,39 +84,6 @@ static CV_PossibleValue_t constextsize_cons_t[] = {
static void CV_constextsize_OnChange(void); static void CV_constextsize_OnChange(void);
consvar_t cv_constextsize = {"con_textsize", "Medium", CV_SAVE|CV_CALL, constextsize_cons_t, CV_constextsize_OnChange, 0, NULL, NULL, 0, 0, NULL}; consvar_t cv_constextsize = {"con_textsize", "Medium", CV_SAVE|CV_CALL, constextsize_cons_t, CV_constextsize_OnChange, 0, NULL, NULL, 0, 0, NULL};
#ifdef HWRENDER
static void CV_Gammaxxx_ONChange(void);
// Saved hardware mode variables
// - You can change them in software,
// but they won't do anything.
static CV_PossibleValue_t grgamma_cons_t[] = {{1, "MIN"}, {255, "MAX"}, {0, NULL}};
static CV_PossibleValue_t grsoftwarefog_cons_t[] = {{0, "Off"}, {1, "On"}, {2, "LightPlanes"}, {0, NULL}};
static CV_PossibleValue_t grmodelinterpolation_cons_t[] = {{0, "Off"}, {1, "Sometimes"}, {2, "Always"}, {0, NULL}};
consvar_t cv_grfovchange = {"gr_fovchange", "Off", CV_SAVE, CV_OnOff, NULL, 0, NULL, NULL, 0, 0, NULL};
consvar_t cv_grfog = {"gr_fog", "On", CV_SAVE, CV_OnOff, NULL, 0, NULL, NULL, 0, 0, NULL};
consvar_t cv_grfogcolor = {"gr_fogcolor", "AAAAAA", CV_SAVE, NULL, NULL, 0, NULL, NULL, 0, 0, NULL};
consvar_t cv_grsoftwarefog = {"gr_softwarefog", "Off", CV_SAVE, grsoftwarefog_cons_t, NULL, 0, NULL, NULL, 0, 0, NULL};
consvar_t cv_grgammared = {"gr_gammared", "127", CV_SAVE|CV_CALL, grgamma_cons_t,
CV_Gammaxxx_ONChange, 0, NULL, NULL, 0, 0, NULL};
consvar_t cv_grgammagreen = {"gr_gammagreen", "127", CV_SAVE|CV_CALL, grgamma_cons_t,
CV_Gammaxxx_ONChange, 0, NULL, NULL, 0, 0, NULL};
consvar_t cv_grgammablue = {"gr_gammablue", "127", CV_SAVE|CV_CALL, grgamma_cons_t,
CV_Gammaxxx_ONChange, 0, NULL, NULL, 0, 0, NULL};
#ifdef ALAM_LIGHTING
consvar_t cv_grdynamiclighting = {"gr_dynamiclighting", "On", CV_SAVE, CV_OnOff, NULL, 0, NULL, NULL, 0, 0, NULL};
consvar_t cv_grstaticlighting = {"gr_staticlighting", "On", CV_SAVE, CV_OnOff, NULL, 0, NULL, NULL, 0, 0, NULL};
consvar_t cv_grcoronas = {"gr_coronas", "On", CV_SAVE, CV_OnOff, NULL, 0, NULL, NULL, 0, 0, NULL};
consvar_t cv_grcoronasize = {"gr_coronasize", "1", CV_SAVE| CV_FLOAT, 0, NULL, 0, NULL, NULL, 0, 0, NULL};
#endif
consvar_t cv_grmodels = {"gr_models", "Off", CV_SAVE, CV_OnOff, NULL, 0, NULL, NULL, 0, 0, NULL};
consvar_t cv_grmodelinterpolation = {"gr_modelinterpolation", "Sometimes", CV_SAVE, grmodelinterpolation_cons_t, NULL, 0, NULL, NULL, 0, 0, NULL};
consvar_t cv_grspritebillboarding = {"gr_spritebillboarding", "Off", CV_SAVE, CV_OnOff, NULL, 0, NULL, NULL, 0, 0, NULL};
consvar_t cv_grskydome = {"gr_skydome", "On", CV_SAVE, CV_OnOff, NULL, 0, NULL, NULL, 0, 0, NULL};
#endif
// local copy of the palette for V_GetColor() // local copy of the palette for V_GetColor()
RGBA_t *pLocalPalette = NULL; RGBA_t *pLocalPalette = NULL;
RGBA_t *pMasterPalette = NULL; RGBA_t *pMasterPalette = NULL;
@ -128,6 +95,7 @@ Please check it out if you're trying to maintain this.
toast 18/04/17 toast 18/04/17
*/ */
float Cubepal[2][2][2][3]; float Cubepal[2][2][2][3];
boolean Cubeapply = false;
// returns whether to apply cube, selectively avoiding expensive operations // returns whether to apply cube, selectively avoiding expensive operations
static boolean InitCube(void) static boolean InitCube(void)
@ -343,11 +311,12 @@ const UINT8 correctiontable[256] =
// keep a copy of the palette so that we can get the RGB value for a color index at any time. // keep a copy of the palette so that we can get the RGB value for a color index at any time.
static void LoadPalette(const char *lumpname) static void LoadPalette(const char *lumpname)
{ {
boolean cube = InitCube();
lumpnum_t lumpnum = W_GetNumForName(lumpname); lumpnum_t lumpnum = W_GetNumForName(lumpname);
size_t i, palsize = W_LumpLength(lumpnum)/3; size_t i, palsize = W_LumpLength(lumpnum)/3;
UINT8 *pal; UINT8 *pal;
Cubeapply = InitCube();
Z_Free(pLocalPalette); Z_Free(pLocalPalette);
Z_Free(pMasterPalette); Z_Free(pMasterPalette);
@ -369,43 +338,49 @@ static void LoadPalette(const char *lumpname)
pMasterPalette[i].s.alpha = pLocalPalette[i].s.alpha = 0xFF; pMasterPalette[i].s.alpha = pLocalPalette[i].s.alpha = 0xFF;
// lerp of colour cubing! if you want, make it smoother yourself // lerp of colour cubing! if you want, make it smoother yourself
if (cube) if (Cubeapply)
{ V_CubeApply(&pLocalPalette[i].s.red, &pLocalPalette[i].s.green, &pLocalPalette[i].s.blue);
float working[4][3]; }
float linear; }
UINT8 q;
linear = (pLocalPalette[i].s.red/255.0); void V_CubeApply(UINT8 *red, UINT8 *green, UINT8 *blue)
{
float working[4][3];
float linear;
UINT8 q;
if (!Cubeapply)
return;
linear = (*red/255.0);
#define dolerp(e1, e2) ((1 - linear)*e1 + linear*e2) #define dolerp(e1, e2) ((1 - linear)*e1 + linear*e2)
for (q = 0; q < 3; q++) for (q = 0; q < 3; q++)
{ {
working[0][q] = dolerp(Cubepal[0][0][0][q], Cubepal[1][0][0][q]); working[0][q] = dolerp(Cubepal[0][0][0][q], Cubepal[1][0][0][q]);
working[1][q] = dolerp(Cubepal[0][1][0][q], Cubepal[1][1][0][q]); working[1][q] = dolerp(Cubepal[0][1][0][q], Cubepal[1][1][0][q]);
working[2][q] = dolerp(Cubepal[0][0][1][q], Cubepal[1][0][1][q]); working[2][q] = dolerp(Cubepal[0][0][1][q], Cubepal[1][0][1][q]);
working[3][q] = dolerp(Cubepal[0][1][1][q], Cubepal[1][1][1][q]); working[3][q] = dolerp(Cubepal[0][1][1][q], Cubepal[1][1][1][q]);
} }
linear = (pLocalPalette[i].s.green/255.0); linear = (*green/255.0);
for (q = 0; q < 3; q++) for (q = 0; q < 3; q++)
{ {
working[0][q] = dolerp(working[0][q], working[1][q]); working[0][q] = dolerp(working[0][q], working[1][q]);
working[1][q] = dolerp(working[2][q], working[3][q]); working[1][q] = dolerp(working[2][q], working[3][q]);
} }
linear = (pLocalPalette[i].s.blue/255.0); linear = (*blue/255.0);
for (q = 0; q < 3; q++) for (q = 0; q < 3; q++)
{ {
working[0][q] = 255*dolerp(working[0][q], working[1][q]); working[0][q] = 255*dolerp(working[0][q], working[1][q]);
if (working[0][q] > 255.0) if (working[0][q] > 255.0)
working[0][q] = 255.0; working[0][q] = 255.0;
else if (working[0][q] < 0.0) else if (working[0][q] < 0.0)
working[0][q] = 0.0; working[0][q] = 0.0;
} }
#undef dolerp #undef dolerp
pLocalPalette[i].s.red = (UINT8)(working[0][0]); *red = (UINT8)(working[0][0]);
pLocalPalette[i].s.green = (UINT8)(working[0][1]); *green = (UINT8)(working[0][1]);
pLocalPalette[i].s.blue = (UINT8)(working[0][2]); *blue = (UINT8)(working[0][2]);
}
}
} }
const char *R_GetPalname(UINT16 num) const char *R_GetPalname(UINT16 num)
@ -473,16 +448,6 @@ static void CV_palette_OnChange(void)
V_SetPalette(0); V_SetPalette(0);
} }
// change the palette directly to see the change
#ifdef HWRENDER
static void CV_Gammaxxx_ONChange(void)
{
if (rendermode != render_soft && rendermode != render_none)
V_SetPalette(0);
}
#endif
#if defined (__GNUC__) && defined (__i386__) && !defined (NOASM) && !defined (__APPLE__) && !defined (NORUSEASM) #if defined (__GNUC__) && defined (__i386__) && !defined (NOASM) && !defined (__APPLE__) && !defined (NORUSEASM)
void VID_BlitLinearScreen_ASM(const UINT8 *srcptr, UINT8 *destptr, INT32 width, INT32 height, size_t srcrowbytes, void VID_BlitLinearScreen_ASM(const UINT8 *srcptr, UINT8 *destptr, INT32 width, INT32 height, size_t srcrowbytes,
size_t destrowbytes); size_t destrowbytes);
@ -3279,6 +3244,29 @@ Unoptimized version
#endif #endif
} }
// Taken from my videos-in-SRB2 project
// Generates a color look-up table
// which has up to 64 colors at each channel
// (see the defines in v_video.h)
UINT8 colorlookup[CLUTSIZE][CLUTSIZE][CLUTSIZE];
void InitColorLUT(RGBA_t *palette)
{
UINT8 r, g, b;
static boolean clutinit = false;
static RGBA_t *lastpalette = NULL;
if ((!clutinit) || (lastpalette != palette))
{
for (r = 0; r < CLUTSIZE; r++)
for (g = 0; g < CLUTSIZE; g++)
for (b = 0; b < CLUTSIZE; b++)
colorlookup[r][g][b] = NearestColor(r << SHIFTCOLORBITS, g << SHIFTCOLORBITS, b << SHIFTCOLORBITS);
clutinit = true;
lastpalette = palette;
}
}
// V_Init // V_Init
// old software stuff, buffers are allocated at video mode setup // old software stuff, buffers are allocated at video mode setup
// here we set the screens[x] pointers accordingly // here we set the screens[x] pointers accordingly
@ -3290,13 +3278,9 @@ void V_Init(void)
const INT32 screensize = vid.rowbytes * vid.height; const INT32 screensize = vid.rowbytes * vid.height;
LoadMapPalette(); LoadMapPalette();
// hardware modes do not use screens[] pointers
for (i = 0; i < NUMSCREENS; i++) for (i = 0; i < NUMSCREENS; i++)
screens[i] = NULL; screens[i] = NULL;
if (rendermode != render_soft)
{
return; // be sure to cause a NULL read/write error so we detect it, in case of..
}
// start address of NUMSCREENS * width*height vidbuffers // start address of NUMSCREENS * width*height vidbuffers
if (base) if (base)

View File

@ -37,6 +37,18 @@ cv_allcaps;
// Allocates buffer screens, call before R_Init. // Allocates buffer screens, call before R_Init.
void V_Init(void); void V_Init(void);
// Taken from my videos-in-SRB2 project
// Generates a color look-up table
// which has up to 64 colors at each channel
#define COLORBITS 6
#define SHIFTCOLORBITS (8-COLORBITS)
#define CLUTSIZE (1<<COLORBITS)
extern UINT8 colorlookup[CLUTSIZE][CLUTSIZE][CLUTSIZE];
void InitColorLUT(RGBA_t *palette);
// Set the current RGB palette lookup to use for palettized graphics // Set the current RGB palette lookup to use for palettized graphics
void V_SetPalette(INT32 palettenum); void V_SetPalette(INT32 palettenum);
@ -48,6 +60,8 @@ const char *GetPalette(void);
extern RGBA_t *pLocalPalette; extern RGBA_t *pLocalPalette;
extern RGBA_t *pMasterPalette; extern RGBA_t *pMasterPalette;
void V_CubeApply(UINT8 *red, UINT8 *green, UINT8 *blue);
// Retrieve the ARGB value from a palette color index // Retrieve the ARGB value from a palette color index
#define V_GetColor(color) (pLocalPalette[color&0xFF]) #define V_GetColor(color) (pLocalPalette[color&0xFF])

View File

@ -11,6 +11,24 @@
/// \file w_wad.c /// \file w_wad.c
/// \brief Handles WAD file header, directory, lump I/O /// \brief Handles WAD file header, directory, lump I/O
#ifdef HAVE_ZLIB
#ifndef _MSC_VER
#ifndef _LARGEFILE64_SOURCE
#define _LARGEFILE64_SOURCE
#endif
#endif
#ifndef _LFS64_LARGEFILE
#define _LFS64_LARGEFILE
#endif
#ifndef _FILE_OFFSET_BITS
#define _FILE_OFFSET_BITS 0
#endif
#include <zlib.h>
#endif
#ifdef __GNUC__ #ifdef __GNUC__
#include <unistd.h> #include <unistd.h>
#endif #endif
@ -22,22 +40,6 @@
#include "lzf.h" #include "lzf.h"
#endif #endif
#ifndef _FILE_OFFSET_BITS
#define _FILE_OFFSET_BITS 0
#endif
#ifndef _LARGEFILE64_SOURCE
#define _LARGEFILE64_SOURCE
#endif
#ifndef _LFS64_LARGEFILE
#define _LFS64_LARGEFILE
#endif
//#ifdef HAVE_ZLIB
#include "zlib.h"
//#endif // HAVE_ZLIB
#include "doomdef.h" #include "doomdef.h"
#include "doomstat.h" #include "doomstat.h"
#include "doomtype.h" #include "doomtype.h"
@ -77,24 +79,6 @@ int snprintf(char *str, size_t n, const char *fmt, ...);
#define O_BINARY 0 #define O_BINARY 0
#endif #endif
#ifdef HAVE_ZLIB
#ifndef _MSC_VER
#ifndef _LARGEFILE64_SOURCE
#define _LARGEFILE64_SOURCE
#endif
#endif
#ifndef _LFS64_LARGEFILE
#define _LFS64_LARGEFILE
#endif
#ifndef _FILE_OFFSET_BITS
#define _FILE_OFFSET_BITS 0
#endif
#include "zlib.h"
#endif
typedef struct typedef struct
{ {
@ -1516,8 +1500,8 @@ void *W_CachePatchNumPwad(UINT16 wad, UINT16 lump, INT32 tag)
#ifdef HWRENDER #ifdef HWRENDER
// Software-only compile cache the data without conversion // Software-only compile cache the data without conversion
if (rendermode == render_soft || rendermode == render_none) if (rendermode == render_soft || rendermode == render_none)
{
#endif #endif
{
lumpcache_t *lumpcache = wadfiles[wad]->patchcache; lumpcache_t *lumpcache = wadfiles[wad]->patchcache;
if (!lumpcache[lump]) if (!lumpcache[lump])
{ {
@ -1551,8 +1535,8 @@ void *W_CachePatchNumPwad(UINT16 wad, UINT16 lump, INT32 tag)
Z_ChangeTag(lumpcache[lump], tag); Z_ChangeTag(lumpcache[lump], tag);
return lumpcache[lump]; return lumpcache[lump];
#ifdef HWRENDER
} }
#ifdef HWRENDER
grPatch = HWR_GetCachedGLPatchPwad(wad, lump); grPatch = HWR_GetCachedGLPatchPwad(wad, lump);

View File

@ -295,6 +295,9 @@
<ClCompile Include="..\r_draw8.c"> <ClCompile Include="..\r_draw8.c">
<ExcludedFromBuild>true</ExcludedFromBuild> <ExcludedFromBuild>true</ExcludedFromBuild>
</ClCompile> </ClCompile>
<ClCompile Include="..\r_draw8_npo2.c">
<ExcludedFromBuild>true</ExcludedFromBuild>
</ClCompile>
<ClCompile Include="..\r_main.c" /> <ClCompile Include="..\r_main.c" />
<ClCompile Include="..\r_plane.c" /> <ClCompile Include="..\r_plane.c" />
<ClCompile Include="..\r_patch.c" /> <ClCompile Include="..\r_patch.c" />

View File

@ -369,6 +369,9 @@
<ClCompile Include="..\r_draw16.c"> <ClCompile Include="..\r_draw16.c">
<Filter>R_Rend</Filter> <Filter>R_Rend</Filter>
</ClCompile> </ClCompile>
<ClCompile Include="..\r_draw8_npo2.c">
<Filter>R_Rend</Filter>
</ClCompile>
<ClCompile Include="..\r_main.c"> <ClCompile Include="..\r_main.c">
<Filter>R_Rend</Filter> <Filter>R_Rend</Filter>
</ClCompile> </ClCompile>

View File

@ -98,7 +98,7 @@ static loadfunc_t hwdFuncTable[] = {
{"Init@4", &hwdriver.pfnInit}, {"Init@4", &hwdriver.pfnInit},
{"Shutdown@0", &hwdriver.pfnShutdown}, {"Shutdown@0", &hwdriver.pfnShutdown},
{"GetModeList@8", &hwdriver.pfnGetModeList}, {"GetModeList@8", &hwdriver.pfnGetModeList},
{"SetPalette@8", &hwdriver.pfnSetPalette}, {"SetPalette@4", &hwdriver.pfnSetPalette},
{"FinishUpdate@4", &hwdriver.pfnFinishUpdate}, {"FinishUpdate@4", &hwdriver.pfnFinishUpdate},
{"Draw2DLine@12", &hwdriver.pfnDraw2DLine}, {"Draw2DLine@12", &hwdriver.pfnDraw2DLine},
{"DrawPolygon@16", &hwdriver.pfnDrawPolygon}, {"DrawPolygon@16", &hwdriver.pfnDrawPolygon},
@ -110,7 +110,7 @@ static loadfunc_t hwdFuncTable[] = {
{"GClipRect@20", &hwdriver.pfnGClipRect}, {"GClipRect@20", &hwdriver.pfnGClipRect},
{"ClearMipMapCache@0", &hwdriver.pfnClearMipMapCache}, {"ClearMipMapCache@0", &hwdriver.pfnClearMipMapCache},
{"SetSpecialState@8", &hwdriver.pfnSetSpecialState}, {"SetSpecialState@8", &hwdriver.pfnSetSpecialState},
{"DrawModel@16", &hwdriver.pfnDrawModel}, {"DrawModel@16", &hwdriver.pfnDrawModel},
{"SetTransform@4", &hwdriver.pfnSetTransform}, {"SetTransform@4", &hwdriver.pfnSetTransform},
{"GetTextureUsed@0", &hwdriver.pfnGetTextureUsed}, {"GetTextureUsed@0", &hwdriver.pfnGetTextureUsed},
{"GetRenderVersion@0", &hwdriver.pfnGetRenderVersion}, {"GetRenderVersion@0", &hwdriver.pfnGetRenderVersion},

View File

@ -46,6 +46,7 @@ enum
PU_HWRPATCHINFO = 21, // Hardware GLPatch_t struct for OpenGL texture cache PU_HWRPATCHINFO = 21, // Hardware GLPatch_t struct for OpenGL texture cache
PU_HWRPATCHCOLMIPMAP = 22, // Hardware GLMipmap_t struct colormap variation of patch PU_HWRPATCHCOLMIPMAP = 22, // Hardware GLMipmap_t struct colormap variation of patch
PU_HWRMODELTEXTURE = 23, // Hardware model texture
PU_HWRCACHE = 48, // static until unlocked PU_HWRCACHE = 48, // static until unlocked
PU_CACHE = 49, // static until unlocked PU_CACHE = 49, // static until unlocked