mirror of https://git.rip/DMCA_FUCKER/re3.git
Compare commits
40 Commits
Author | SHA1 | Date |
---|---|---|
aap | 9a7fa47857 | |
withmorten | 0b1d3669bc | |
withmorten | 8128e8e817 | |
withmorten | 73fce903b8 | |
erorcun | b52356f6b5 | |
erorcun | 139c6bfcf3 | |
erorcun | bf7280b55b | |
withmorten | 48cec4a786 | |
aap | 6245a17e16 | |
nick7 | 1402b9ed72 | |
aap | 253021866c | |
aap | e8b435a624 | |
aap | 9db87fc636 | |
aap | 1a429bb3c4 | |
aap | a4412e8d63 | |
aap | c3af33f97d | |
Fire-Head | 68cc5fe965 | |
withmorten | 6227aee863 | |
Sergeanur | ee6b7152c7 | |
withmorten | 53e3bc6092 | |
withmorten | 7db2df33e8 | |
aap | b4c96bca93 | |
aap | c488ce166e | |
erorcun | 4d8f340827 | |
erorcun | eccf87acc7 | |
Adrian Graber | 19b39f49fa | |
Steve Wills | e482ab6292 | |
Steve Wills | 20d9498fdb | |
erorcun | 1a64053da5 | |
erorcun | 5ee4931fb6 | |
erorcun | 49fd99119d | |
erorcun | 179b11151e | |
erorcun | 3baccc9d3e | |
aap | edc77d7f00 | |
withmorten | fec39e87c0 | |
withmorten | a826091dc9 | |
Fire-Head | a3eae736e7 | |
Steve Wills | a666de46aa | |
Adrian Graber | b60baf46f6 | |
Adrian Graber | d76b58cc72 |
|
@ -0,0 +1,13 @@
|
|||
As long as it's not linux/cross-platform skeleton/compatibility layer, all of the code on the repo that's not behind a preprocessor condition(like FIX_BUGS) are **completely** reversed code from original binaries.
|
||||
|
||||
We **don't** accept custom codes, as long as it's not wrapped via preprocessor conditions, or it's linux/cross-platform skeleton/compatibility layer.
|
||||
|
||||
We accept only these kinds of PRs;
|
||||
|
||||
- A new feature that exists in at least one of the GTAs (if it wasn't in III/VC then it doesn't have to be decompilation)
|
||||
- Game, UI or UX bug fixes (if it's a fix to R* code, it should be behind FIX_BUGS)
|
||||
- Platform-specific and/or unused code that's not been reversed yet
|
||||
- Makes reversed code more understandable/accurate, as in "which code would produce this assembly".
|
||||
- A new cross-platform skeleton/compatibility layer, or improvements to them
|
||||
- Translation fixes, for languages R* supported/outsourced
|
||||
- Code that increase maintainability
|
|
@ -6,13 +6,9 @@ on:
|
|||
release:
|
||||
types: published
|
||||
env:
|
||||
GLEW_VER: "2.1.0"
|
||||
GLFW_VER: "3.3.2"
|
||||
GLEW_BASE: "glew-2.1.0"
|
||||
GLFW_BASE: "glfw-3.3.2.bin.WIN64"
|
||||
GLEW_FILE: "glew-2.1.0-win32.zip"
|
||||
GLFW_FILE: "glfw-3.3.2.bin.WIN64.zip"
|
||||
GLEW_URL: "https://github.com/nigels-com/glew/releases/download/glew-2.1.0/glew-2.1.0-win32.zip"
|
||||
GLFW_URL: "https://github.com/glfw/glfw/releases/download/3.3.2/glfw-3.3.2.bin.WIN64.zip"
|
||||
jobs:
|
||||
build:
|
||||
|
@ -27,11 +23,6 @@ jobs:
|
|||
- uses: actions/checkout@v2
|
||||
with:
|
||||
submodules: 'true'
|
||||
- if: ${{ matrix.platform }} == "win-amd64-librw_gl3_glfw-mss"
|
||||
name: Download glew
|
||||
uses: carlosperate/download-file-action@v1.0.3
|
||||
with:
|
||||
file-url: ${{env.GLEW_URL}}
|
||||
- if: ${{ matrix.platform }} == "win-amd64-librw_gl3_glfw-mss"
|
||||
name: Download glfw
|
||||
uses: carlosperate/download-file-action@v1.0.3
|
||||
|
@ -40,11 +31,10 @@ jobs:
|
|||
- if: ${{ matrix.platform }} == "win-amd64-librw_gl3_glfw-mss"
|
||||
name: Unpack archives
|
||||
run: |
|
||||
7z x ${{env.GLEW_FILE}}
|
||||
7z x ${{env.GLFW_FILE}}
|
||||
- name: Configure build
|
||||
run: |
|
||||
./premake5 vs2019 --with-librw --glewdir=${{env.GLEW_BASE}} --glfwdir64=${{env.GLFW_BASE}}
|
||||
./premake5 vs2019 --with-librw --glfwdir64=${{env.GLFW_BASE}}
|
||||
- name: Build
|
||||
run: |
|
||||
msbuild -m build/re3.sln /property:Configuration=${{matrix.buildtype}} /property:Platform=${{matrix.platform}}
|
||||
|
|
|
@ -6,13 +6,9 @@ on:
|
|||
release:
|
||||
types: published
|
||||
env:
|
||||
GLEW_VER: "2.1.0"
|
||||
GLFW_VER: "3.3.2"
|
||||
GLEW_BASE: "glew-2.1.0"
|
||||
GLFW_BASE: "glfw-3.3.2.bin.WIN32"
|
||||
GLEW_FILE: "glew-2.1.0-win32.zip"
|
||||
GLFW_FILE: "glfw-3.3.2.bin.WIN32.zip"
|
||||
GLEW_URL: "https://github.com/nigels-com/glew/releases/download/glew-2.1.0/glew-2.1.0-win32.zip"
|
||||
GLFW_URL: "https://github.com/glfw/glfw/releases/download/3.3.2/glfw-3.3.2.bin.WIN32.zip"
|
||||
jobs:
|
||||
build:
|
||||
|
@ -27,11 +23,6 @@ jobs:
|
|||
- uses: actions/checkout@v2
|
||||
with:
|
||||
submodules: 'true'
|
||||
- if: ${{ matrix.platform }} == "win-x86-librw_gl3_glfw-mss"
|
||||
name: Download glew
|
||||
uses: carlosperate/download-file-action@v1.0.3
|
||||
with:
|
||||
file-url: ${{env.GLEW_URL}}
|
||||
- if: ${{ matrix.platform }} == "win-x86-librw_gl3_glfw-mss"
|
||||
name: Download glfw
|
||||
uses: carlosperate/download-file-action@v1.0.3
|
||||
|
@ -40,11 +31,10 @@ jobs:
|
|||
- if: ${{ matrix.platform }} == "win-x86-librw_gl3_glfw-mss"
|
||||
name: Unpack archives
|
||||
run: |
|
||||
7z x ${{env.GLEW_FILE}}
|
||||
7z x ${{env.GLFW_FILE}}
|
||||
- name: Configure build
|
||||
run: |
|
||||
./premake5 vs2019 --with-librw --glewdir=${{env.GLEW_BASE}} --glfwdir32=${{env.GLFW_BASE}}
|
||||
./premake5 vs2019 --with-librw --glfwdir32=${{env.GLFW_BASE}}
|
||||
- name: Build
|
||||
run: |
|
||||
msbuild -m build/re3.sln /property:Configuration=${{matrix.buildtype}} /property:Platform=${{matrix.platform}}
|
||||
|
|
25
README.md
25
README.md
|
@ -21,7 +21,7 @@ We cannot build for PS2 or Xbox yet. If you're interested in doing so, get in to
|
|||
## Installation
|
||||
|
||||
- re3 requires PC game assets to work, so you **must** own [a copy of GTA III](https://store.steampowered.com/app/12100/Grand_Theft_Auto_III/).
|
||||
- Build re3 or download the latest nightly build:
|
||||
- Build re3 or download the latest build:
|
||||
- [Windows D3D9 MSS 32bit](https://nightly.link/GTAmodding/re3/workflows/re3_msvc_x86/master/re3_Release_win-x86-librw_d3d9-mss.zip)
|
||||
- [Windows D3D9 64bit](https://nightly.link/GTAmodding/re3/workflows/re3_msvc_amd64/master/re3_Release_win-amd64-librw_d3d9-oal.zip)
|
||||
- [Windows OpenGL 64bit](https://nightly.link/GTAmodding/re3/workflows/re3_msvc_amd64/master/re3_Release_win-amd64-librw_gl3_glfw-oal.zip)
|
||||
|
@ -48,7 +48,7 @@ Some of them can be toggled at runtime, some cannot.
|
|||
* Debug menu to do and change various things (Ctrl-M to open)
|
||||
* Debug camera (Ctrl-B to toggle)
|
||||
* Rotatable camera
|
||||
* Xinput controller support (Windows)
|
||||
* XInput controller support (Windows)
|
||||
* No loading screens between islands ("map memory usage" in menu)
|
||||
* Skinned ped support (models from Xbox or Mobile)
|
||||
* Rendering
|
||||
|
@ -79,7 +79,7 @@ The following things would be nice to have/do:
|
|||
* [PS2 port](https://github.com/GTAmodding/re3/wiki/PS2-port)
|
||||
* Xbox port (not quite as important)
|
||||
* reverse remaining unused/debug functions
|
||||
* compare Codewarrior build with original binary for more accurate code (very tedious)
|
||||
* compare CodeWarrior build with original binary for more accurate code (very tedious)
|
||||
|
||||
## Modding
|
||||
|
||||
|
@ -138,9 +138,23 @@ Microsoft recently discontinued its downloads of the DX9 SDK. You can download a
|
|||
|
||||
> :information_source: re3 uses completely homebrew RenderWare-replacement rendering engine; [librw](https://github.com/aap/librw/). librw comes as submodule of re3, but you also can use LIBRW enviorenment variable to specify path to your own librw.
|
||||
|
||||
If you feel the need, you can also use Codewarrior 7 to compile re3 using the supplied codewarrior/re3.mcp project - this requires the original RW33 libraries, and the DX8 SDK. The build is unstable compared to the MSVC builds though, and is mostly meant to serve as a reference.
|
||||
If you feel the need, you can also use CodeWarrior 7 to compile re3 using the supplied codewarrior/re3.mcp project - this requires the original RW33 libraries, and the DX8 SDK. The build is unstable compared to the MSVC builds though, and is mostly meant to serve as a reference.
|
||||
|
||||
## Contributing
|
||||
As long as it's not linux/cross-platform skeleton/compatibility layer, all of the code on the repo that's not behind a preprocessor condition(like FIX_BUGS) are **completely** reversed code from original binaries.
|
||||
|
||||
We **don't** accept custom codes, as long as it's not wrapped via preprocessor conditions, or it's linux/cross-platform skeleton/compatibility layer.
|
||||
|
||||
We accept only these kinds of PRs;
|
||||
|
||||
- A new feature that exists in at least one of the GTAs (if it wasn't in III/VC then it doesn't have to be decompilation)
|
||||
- Game, UI or UX bug fixes (if it's a fix to original code, it should be behind FIX_BUGS)
|
||||
- Platform-specific and/or unused code that's not been reversed yet
|
||||
- Makes reversed code more understandable/accurate, as in "which code would produce this assembly".
|
||||
- A new cross-platform skeleton/compatibility layer, or improvements to them
|
||||
- Translation fixes, for languages original game supported
|
||||
- Code that increase maintainability
|
||||
|
||||
We have a [Coding Style](https://github.com/GTAmodding/re3/blob/master/CODING_STYLE.md) document that isn't followed or enforced very well.
|
||||
|
||||
Do not use features from C++11 or later.
|
||||
|
@ -158,7 +172,8 @@ After a bit of work the project lay dormant for about a year
|
|||
and was picked up again and pushed to github in May 2019.
|
||||
At the time I (aap) had reversed around 10k lines of code and estimated
|
||||
the final game to have around 200-250k.
|
||||
Others quickly joined the effort and we made very quick progress
|
||||
Others quickly joined the effort (Fire_Head, shfil, erorcun and Nick007J
|
||||
in time order, and Serge a bit later) and we made very quick progress
|
||||
throughout the summer of 2019
|
||||
after which the pace slowed down a bit.
|
||||
|
||||
|
|
|
@ -28,7 +28,7 @@ find_package_handle_standard_args(MilesSDK DEFAULT_MSG MilesSDK_LIBRARIES MilesS
|
|||
if(NOT TARGET MilesSDK::MilesSDK)
|
||||
add_library(MilesSDK::MilesSDK UNKNOWN IMPORTED)
|
||||
set_target_properties(MilesSDK::MilesSDK PROPERTIES
|
||||
IMPORTED_LOCATION "${MilesSDK_LIBRARIES}
|
||||
IMPORTED_LOCATION "${MilesSDK_LIBRARIES}"
|
||||
INTERFACE_INCLUDE_DIRECTORIES "${MilesSDK_INCLUDE_DIR}"
|
||||
)
|
||||
endif()
|
||||
|
|
|
@ -18,7 +18,7 @@ find_path(mpg123_INCLUDE_DIR mpg123.h
|
|||
PATH_SUFFIXES include
|
||||
)
|
||||
|
||||
find_library(mpg123_LIBRARIES NAMES mpg123 mpg123-0
|
||||
find_library(mpg123_LIBRARIES NAMES mpg123 mpg123-0 libmpg123-0
|
||||
HINTS ${PKG_MPG123_LIBRARIES}
|
||||
PATHS "${mpg123_DIR}"
|
||||
PATH_SUFFIXES lib
|
||||
|
|
Binary file not shown.
28
premake5.lua
28
premake5.lua
|
@ -1,10 +1,3 @@
|
|||
newoption {
|
||||
trigger = "glewdir",
|
||||
value = "PATH",
|
||||
description = "Directory of GLEW",
|
||||
default = "vendor/glew-2.1.0"
|
||||
}
|
||||
|
||||
newoption {
|
||||
trigger = "glfwdir64",
|
||||
value = "PATH",
|
||||
|
@ -158,7 +151,6 @@ workspace "re3"
|
|||
|
||||
filter "platforms:*librw_gl3_glfw*"
|
||||
defines { "RW_GL3" }
|
||||
includedirs { path.join(_OPTIONS["glewdir"], "include") }
|
||||
if(not _OPTIONS["with-librw"]) then
|
||||
libdirs { path.join(Librw, "lib/%{getsys(cfg.system)}-%{getarch(cfg.architecture)}-gl3/%{cfg.buildcfg}") }
|
||||
end
|
||||
|
@ -169,9 +161,6 @@ workspace "re3"
|
|||
filter "platforms:*amd64-librw_gl3_glfw*"
|
||||
includedirs { path.join(_OPTIONS["glfwdir64"], "include") }
|
||||
|
||||
filter "platforms:win*librw_gl3_glfw*"
|
||||
defines { "GLEW_STATIC" }
|
||||
|
||||
filter {}
|
||||
|
||||
function setpaths (gamepath, exepath)
|
||||
|
@ -196,6 +185,7 @@ project "librw"
|
|||
targetdir(path.join(Librw, "lib/%{cfg.platform}/%{cfg.buildcfg}"))
|
||||
files { path.join(Librw, "src/*.*") }
|
||||
files { path.join(Librw, "src/*/*.*") }
|
||||
files { path.join(Librw, "src/gl/*/*.*") }
|
||||
|
||||
filter { "platforms:*x86*" }
|
||||
architecture "x86"
|
||||
|
@ -352,10 +342,10 @@ project "re3"
|
|||
libdirs { "vendor/openal-soft/libs/Win64" }
|
||||
|
||||
filter "platforms:linux*oal"
|
||||
links { "openal", "mpg123", "sndfile", "pthread" }
|
||||
links { "openal", "mpg123", "sndfile", "pthread", "X11" }
|
||||
|
||||
filter "platforms:bsd*oal"
|
||||
links { "openal", "mpg123", "sndfile", "pthread" }
|
||||
links { "openal", "mpg123", "sndfile", "pthread", "X11" }
|
||||
|
||||
filter "platforms:macosx*oal"
|
||||
links { "openal", "mpg123", "sndfile", "pthread" }
|
||||
|
@ -395,25 +385,23 @@ project "re3"
|
|||
libdirs { "sdk/dx8sdk/lib" }
|
||||
|
||||
filter "platforms:win-x86*gl3_glfw*"
|
||||
libdirs { path.join(_OPTIONS["glewdir"], "lib/Release/Win32") }
|
||||
libdirs { path.join(_OPTIONS["glfwdir32"], "lib-" .. string.gsub(_ACTION or '', "vs", "vc")) }
|
||||
links { "opengl32", "glew32s", "glfw3" }
|
||||
links { "opengl32", "glfw3" }
|
||||
|
||||
filter "platforms:win-amd64*gl3_glfw*"
|
||||
libdirs { path.join(_OPTIONS["glewdir"], "lib/Release/x64") }
|
||||
libdirs { path.join(_OPTIONS["glfwdir64"], "lib-" .. string.gsub(_ACTION or '', "vs", "vc")) }
|
||||
links { "opengl32", "glew32s", "glfw3" }
|
||||
links { "opengl32", "glfw3" }
|
||||
|
||||
filter "platforms:linux*gl3_glfw*"
|
||||
links { "GL", "GLEW", "glfw" }
|
||||
links { "GL", "glfw" }
|
||||
|
||||
filter "platforms:bsd*gl3_glfw*"
|
||||
links { "GL", "GLEW", "glfw", "sysinfo" }
|
||||
links { "GL", "glfw", "sysinfo" }
|
||||
includedirs { "/usr/local/include" }
|
||||
libdirs { "/usr/local/lib" }
|
||||
|
||||
filter "platforms:macosx*gl3_glfw*"
|
||||
links { "GLEW", "glfw" }
|
||||
links { "glfw" }
|
||||
linkoptions { "-framework OpenGL" }
|
||||
includedirs { "/opt/local/include" }
|
||||
includedirs { "/usr/local/include" }
|
||||
|
|
|
@ -2046,141 +2046,131 @@ cSampleManager::StartPreloadedStreamedFile(uint8 nStream)
|
|||
bool
|
||||
cSampleManager::StartStreamedFile(uint8 nFile, uint32 nPos, uint8 nStream)
|
||||
{
|
||||
int i = 0;
|
||||
uint32 position = nPos;
|
||||
char filename[MAX_PATH];
|
||||
|
||||
if ( m_bInitialised && nFile < TOTAL_STREAMED_SOUNDS )
|
||||
if ( !m_bInitialised || nFile >= TOTAL_STREAMED_SOUNDS )
|
||||
return false;
|
||||
|
||||
if ( mp3Stream[nStream] )
|
||||
{
|
||||
if ( mp3Stream[nStream] )
|
||||
AIL_pause_stream(mp3Stream[nStream], 1);
|
||||
AIL_close_stream(mp3Stream[nStream]);
|
||||
}
|
||||
if ( nFile == STREAMED_SOUND_RADIO_MP3_PLAYER )
|
||||
{
|
||||
do
|
||||
{
|
||||
AIL_pause_stream(mp3Stream[nStream], 1);
|
||||
AIL_close_stream(mp3Stream[nStream]);
|
||||
}
|
||||
|
||||
if ( nFile == STREAMED_SOUND_RADIO_MP3_PLAYER )
|
||||
{
|
||||
uint32 i = 0;
|
||||
do {
|
||||
if(i != 0 || _bIsMp3Active) {
|
||||
if(++_CurMP3Index >= nNumMP3s) _CurMP3Index = 0;
|
||||
// Just switched to MP3 player
|
||||
if ( !_bIsMp3Active && i == 0 )
|
||||
{
|
||||
if ( nPos > nStreamLength[STREAMED_SOUND_RADIO_MP3_PLAYER] )
|
||||
position = 0;
|
||||
tMP3Entry *e = _pMP3List;
|
||||
|
||||
_CurMP3Pos = 0;
|
||||
|
||||
tMP3Entry *mp3 = _GetMP3EntryByIndex(_CurMP3Index);
|
||||
|
||||
if(mp3) {
|
||||
mp3 = _pMP3List;
|
||||
if(mp3 == NULL) {
|
||||
_bIsMp3Active = false;
|
||||
nFile = 0;
|
||||
strcpy(filename, m_szCDRomRootPath);
|
||||
strcat(filename, StreamedNameTable[nFile]);
|
||||
|
||||
mp3Stream[nStream] =
|
||||
AIL_open_stream(DIG, filename, 0);
|
||||
if(mp3Stream[nStream]) {
|
||||
AIL_set_stream_loop_count(
|
||||
mp3Stream[nStream], 1);
|
||||
AIL_set_stream_ms_position(
|
||||
mp3Stream[nStream], position);
|
||||
AIL_pause_stream(mp3Stream[nStream],
|
||||
0);
|
||||
return true;
|
||||
}
|
||||
|
||||
return false;
|
||||
}
|
||||
}
|
||||
|
||||
if(mp3->pLinkPath != NULL)
|
||||
mp3Stream[nStream] =
|
||||
AIL_open_stream(DIG, mp3->pLinkPath, 0);
|
||||
else {
|
||||
strcpy(filename, _mp3DirectoryPath);
|
||||
strcat(filename, mp3->aFilename);
|
||||
|
||||
mp3Stream[nStream] =
|
||||
AIL_open_stream(DIG, filename, 0);
|
||||
}
|
||||
|
||||
if(mp3Stream[nStream]) {
|
||||
// Try to continue from previous song, if already started
|
||||
if(!_GetMP3PosFromStreamPos(&position, &e) && !e) {
|
||||
nFile = 0;
|
||||
strcpy(filename, m_szCDRomRootPath);
|
||||
strcat(filename, StreamedNameTable[nFile]);
|
||||
|
||||
mp3Stream[nStream] = AIL_open_stream(DIG, filename, 0);
|
||||
if ( mp3Stream[nStream] )
|
||||
{
|
||||
AIL_set_stream_loop_count(mp3Stream[nStream], 1);
|
||||
AIL_set_stream_ms_position(mp3Stream[nStream], 0);
|
||||
AIL_set_stream_ms_position(mp3Stream[nStream], position);
|
||||
AIL_pause_stream(mp3Stream[nStream], 0);
|
||||
return true;
|
||||
}
|
||||
return false;
|
||||
|
||||
_bIsMp3Active = false;
|
||||
continue;
|
||||
}
|
||||
if ( nPos > nStreamLength[STREAMED_SOUND_RADIO_MP3_PLAYER] )
|
||||
position = 0;
|
||||
} else {
|
||||
if ( e->pLinkPath != NULL )
|
||||
mp3Stream[nStream] = AIL_open_stream(DIG, e->pLinkPath, 0);
|
||||
else {
|
||||
strcpy(filename, _mp3DirectoryPath);
|
||||
strcat(filename, e->aFilename);
|
||||
|
||||
mp3Stream[nStream] = AIL_open_stream(DIG, filename, 0);
|
||||
}
|
||||
|
||||
if ( mp3Stream[nStream] ) {
|
||||
AIL_set_stream_loop_count(mp3Stream[nStream], 1);
|
||||
AIL_set_stream_ms_position(mp3Stream[nStream], position);
|
||||
AIL_pause_stream(mp3Stream[nStream], 0);
|
||||
|
||||
_bIsMp3Active = true;
|
||||
|
||||
tMP3Entry *e;
|
||||
if ( !_GetMP3PosFromStreamPos(&position, &e) )
|
||||
return true;
|
||||
}
|
||||
// fall through, start playing from another song
|
||||
}
|
||||
} else {
|
||||
if(++_CurMP3Index >= nNumMP3s) _CurMP3Index = 0;
|
||||
|
||||
_CurMP3Pos = 0;
|
||||
|
||||
tMP3Entry *mp3 = _GetMP3EntryByIndex(_CurMP3Index);
|
||||
if ( !mp3 )
|
||||
{
|
||||
if ( e == NULL )
|
||||
mp3 = _pMP3List;
|
||||
if ( !_pMP3List )
|
||||
{
|
||||
nFile = 0;
|
||||
_bIsMp3Active = 0;
|
||||
strcpy(filename, m_szCDRomRootPath);
|
||||
strcat(filename, StreamedNameTable[nFile]);
|
||||
mp3Stream[nStream] =
|
||||
AIL_open_stream(DIG, filename, 0);
|
||||
if(mp3Stream[nStream]) {
|
||||
AIL_set_stream_loop_count(
|
||||
mp3Stream[nStream], 1);
|
||||
AIL_set_stream_ms_position(
|
||||
mp3Stream[nStream], position);
|
||||
|
||||
mp3Stream[nStream] = AIL_open_stream(DIG, filename, 0);
|
||||
if ( mp3Stream[nStream] )
|
||||
{
|
||||
AIL_set_stream_loop_count(mp3Stream[nStream], 1);
|
||||
AIL_set_stream_ms_position(mp3Stream[nStream], position);
|
||||
AIL_pause_stream(mp3Stream[nStream], 0);
|
||||
return true;
|
||||
}
|
||||
|
||||
return false;
|
||||
}
|
||||
}
|
||||
|
||||
if ( e->pLinkPath != NULL )
|
||||
mp3Stream[nStream] = AIL_open_stream(DIG, e->pLinkPath, 0);
|
||||
else
|
||||
{
|
||||
if(mp3->pLinkPath != NULL)
|
||||
mp3Stream[nStream] = AIL_open_stream(DIG, mp3->pLinkPath, 0);
|
||||
else {
|
||||
strcpy(filename, _mp3DirectoryPath);
|
||||
strcat(filename, e->aFilename);
|
||||
|
||||
mp3Stream[nStream] = AIL_open_stream(DIG, filename, 0);
|
||||
strcat(filename, mp3->aFilename);
|
||||
|
||||
mp3Stream[nStream] =
|
||||
AIL_open_stream(DIG, filename, 0);
|
||||
}
|
||||
|
||||
if ( mp3Stream[nStream] )
|
||||
{
|
||||
|
||||
if(mp3Stream[nStream]) {
|
||||
AIL_set_stream_loop_count(mp3Stream[nStream], 1);
|
||||
AIL_set_stream_ms_position(mp3Stream[nStream], position);
|
||||
AIL_set_stream_ms_position(mp3Stream[nStream], 0);
|
||||
AIL_pause_stream(mp3Stream[nStream], 0);
|
||||
|
||||
#ifdef FIX_BUGS
|
||||
_bIsMp3Active = true;
|
||||
|
||||
#endif
|
||||
return true;
|
||||
}
|
||||
|
||||
_bIsMp3Active = false;
|
||||
|
||||
} while(++i < nNumMP3s);
|
||||
|
||||
position = 0;
|
||||
nFile = 0;
|
||||
}
|
||||
|
||||
strcpy(filename, m_szCDRomRootPath);
|
||||
strcat(filename, StreamedNameTable[nFile]);
|
||||
|
||||
mp3Stream[nStream] = AIL_open_stream(DIG, filename, 0);
|
||||
if ( mp3Stream[nStream] )
|
||||
{
|
||||
AIL_set_stream_loop_count(mp3Stream[nStream], 1);
|
||||
AIL_set_stream_ms_position(mp3Stream[nStream], position);
|
||||
AIL_pause_stream(mp3Stream[nStream], 0);
|
||||
return true;
|
||||
}
|
||||
_bIsMp3Active = 0;
|
||||
}
|
||||
while ( ++i < nNumMP3s );
|
||||
position = 0;
|
||||
nFile = 0;
|
||||
}
|
||||
strcpy(filename, m_szCDRomRootPath);
|
||||
strcat(filename, StreamedNameTable[nFile]);
|
||||
|
||||
mp3Stream[nStream] = AIL_open_stream(DIG, filename, 0);
|
||||
if ( mp3Stream[nStream] )
|
||||
{
|
||||
AIL_set_stream_loop_count(mp3Stream[nStream], 1);
|
||||
AIL_set_stream_ms_position(mp3Stream[nStream], position);
|
||||
AIL_pause_stream(mp3Stream[nStream], 0);
|
||||
return true;
|
||||
}
|
||||
return false;
|
||||
}
|
||||
|
||||
|
|
|
@ -730,8 +730,6 @@ _FindMP3s(void)
|
|||
delete aStream[0];
|
||||
aStream[0] = NULL;
|
||||
|
||||
OutputDebugString(fd.cFileName);
|
||||
|
||||
pList->pNext = new tMP3Entry;
|
||||
|
||||
tMP3Entry *e = pList->pNext;
|
||||
|
@ -1706,91 +1704,91 @@ cSampleManager::StartPreloadedStreamedFile(uint8 nStream)
|
|||
bool
|
||||
cSampleManager::StartStreamedFile(uint8 nFile, uint32 nPos, uint8 nStream)
|
||||
{
|
||||
int i = 0;
|
||||
uint32 position = nPos;
|
||||
char filename[256];
|
||||
|
||||
ASSERT( nStream < MAX_STREAMS );
|
||||
|
||||
if ( nFile < TOTAL_STREAMED_SOUNDS )
|
||||
char filename[MAX_PATH];
|
||||
|
||||
if ( nFile >= TOTAL_STREAMED_SOUNDS )
|
||||
return false;
|
||||
|
||||
if ( aStream[nStream] )
|
||||
{
|
||||
if ( aStream[nStream] )
|
||||
delete aStream[nStream];
|
||||
aStream[nStream] = NULL;
|
||||
}
|
||||
if ( nFile == STREAMED_SOUND_RADIO_MP3_PLAYER )
|
||||
{
|
||||
do
|
||||
{
|
||||
delete aStream[nStream];
|
||||
aStream[nStream] = NULL;
|
||||
}
|
||||
|
||||
if ( nFile == STREAMED_SOUND_RADIO_MP3_PLAYER )
|
||||
{
|
||||
uint32 i = 0;
|
||||
do {
|
||||
if(i != 0 || _bIsMp3Active) {
|
||||
if(++_CurMP3Index >= nNumMP3s) _CurMP3Index = 0;
|
||||
// Switched to MP3 player just now
|
||||
if ( !_bIsMp3Active && i == 0 )
|
||||
{
|
||||
if ( nPos > nStreamLength[STREAMED_SOUND_RADIO_MP3_PLAYER] )
|
||||
position = 0;
|
||||
tMP3Entry *e = _pMP3List;
|
||||
|
||||
_CurMP3Pos = 0;
|
||||
// Try to continue from previous song, if already started
|
||||
if(!_GetMP3PosFromStreamPos(&position, &e) && !e) {
|
||||
nFile = 0;
|
||||
strcpy(filename, StreamedNameTable[nFile]);
|
||||
|
||||
CStream* stream = new CStream(filename, ALStreamSources[nStream], ALStreamBuffers[nStream], IsThisTrackAt16KHz(nFile) ? 16000 : 32000);
|
||||
|
||||
tMP3Entry *mp3 = _GetMP3EntryByIndex(_CurMP3Index);
|
||||
aStream[nStream] = stream;
|
||||
|
||||
if(mp3) {
|
||||
mp3 = _pMP3List;
|
||||
if(mp3 == NULL) {
|
||||
_bIsMp3Active = false;
|
||||
nFile = 0;
|
||||
strcat(filename, StreamedNameTable[nFile]);
|
||||
if (stream->Setup()) {
|
||||
if (position != 0)
|
||||
stream->SetPosMS(position);
|
||||
|
||||
CStream* stream = new CStream(filename, ALStreamSources[nStream], ALStreamBuffers[nStream], IsThisTrackAt16KHz(nFile) ? 16000 : 32000);
|
||||
ASSERT(stream != NULL);
|
||||
stream->Start();
|
||||
|
||||
aStream[nStream] = stream;
|
||||
|
||||
if (stream->Setup()) {
|
||||
if (position != 0)
|
||||
stream->SetPosMS(position);
|
||||
|
||||
stream->Start();
|
||||
|
||||
return true;
|
||||
} else {
|
||||
delete stream;
|
||||
aStream[nStream] = NULL;
|
||||
}
|
||||
|
||||
return false;
|
||||
}
|
||||
return true;
|
||||
} else {
|
||||
delete stream;
|
||||
aStream[nStream] = NULL;
|
||||
}
|
||||
return false;
|
||||
|
||||
if (mp3->pLinkPath != NULL)
|
||||
aStream[nStream] = new CStream(mp3->pLinkPath, ALStreamSources[nStream], ALStreamBuffers[nStream], IsThisTrackAt16KHz(nFile) ? 16000 : 32000);
|
||||
} else {
|
||||
if ( e->pLinkPath != NULL )
|
||||
aStream[nStream] = new CStream(e->pLinkPath, ALStreamSources[nStream], ALStreamBuffers[nStream], IsThisTrackAt16KHz(nFile) ? 16000 : 32000);
|
||||
else {
|
||||
strcpy(filename, _mp3DirectoryPath);
|
||||
strcat(filename, mp3->aFilename);
|
||||
|
||||
aStream[nStream] = new CStream(filename, ALStreamSources[nStream], ALStreamBuffers[nStream], IsThisTrackAt16KHz(nFile) ? 16000 : 32000);
|
||||
strcat(filename, e->aFilename);
|
||||
|
||||
aStream[nStream] = new CStream(filename, ALStreamSources[nStream], ALStreamBuffers[nStream]);
|
||||
}
|
||||
|
||||
|
||||
if (aStream[nStream]->Setup()) {
|
||||
if (position != 0)
|
||||
aStream[nStream]->SetPosMS(position);
|
||||
|
||||
aStream[nStream]->Start();
|
||||
|
||||
_bIsMp3Active = true;
|
||||
return true;
|
||||
} else {
|
||||
delete aStream[nStream];
|
||||
aStream[nStream] = NULL;
|
||||
}
|
||||
|
||||
_bIsMp3Active = false;
|
||||
continue;
|
||||
// fall through, start playing from another song
|
||||
}
|
||||
if ( nPos > nStreamLength[STREAMED_SOUND_RADIO_MP3_PLAYER] )
|
||||
position = 0;
|
||||
|
||||
tMP3Entry *e;
|
||||
if ( !_GetMP3PosFromStreamPos(&position, &e) )
|
||||
} else {
|
||||
if(++_CurMP3Index >= nNumMP3s) _CurMP3Index = 0;
|
||||
|
||||
_CurMP3Pos = 0;
|
||||
|
||||
tMP3Entry *mp3 = _GetMP3EntryByIndex(_CurMP3Index);
|
||||
if ( !mp3 )
|
||||
{
|
||||
if ( e == NULL )
|
||||
mp3 = _pMP3List;
|
||||
if ( !_pMP3List )
|
||||
{
|
||||
nFile = 0;
|
||||
strcat(filename, StreamedNameTable[nFile]);
|
||||
_bIsMp3Active = 0;
|
||||
strcpy(filename, StreamedNameTable[nFile]);
|
||||
|
||||
CStream* stream = new CStream(filename, ALStreamSources[nStream], ALStreamBuffers[nStream], IsThisTrackAt16KHz(nFile) ? 16000 : 32000);
|
||||
ASSERT(stream != NULL);
|
||||
|
||||
aStream[nStream] = stream;
|
||||
|
||||
|
@ -1805,61 +1803,53 @@ cSampleManager::StartStreamedFile(uint8 nFile, uint32 nPos, uint8 nStream)
|
|||
delete stream;
|
||||
aStream[nStream] = NULL;
|
||||
}
|
||||
|
||||
return false;
|
||||
}
|
||||
}
|
||||
|
||||
if (e->pLinkPath != NULL)
|
||||
aStream[nStream] = new CStream(e->pLinkPath, ALStreamSources[nStream], ALStreamBuffers[nStream], IsThisTrackAt16KHz(nFile) ? 16000 : 32000);
|
||||
if(mp3->pLinkPath != NULL)
|
||||
aStream[nStream] = new CStream(mp3->pLinkPath, ALStreamSources[nStream], ALStreamBuffers[nStream], IsThisTrackAt16KHz(nFile) ? 16000 : 32000);
|
||||
else {
|
||||
strcpy(filename, _mp3DirectoryPath);
|
||||
strcat(filename, e->aFilename);
|
||||
strcat(filename, mp3->aFilename);
|
||||
|
||||
aStream[nStream] = new CStream(filename, ALStreamSources[nStream], ALStreamBuffers[nStream]);
|
||||
}
|
||||
|
||||
if (aStream[nStream]->Setup()) {
|
||||
if (position != 0)
|
||||
aStream[nStream]->SetPosMS(position);
|
||||
|
||||
aStream[nStream]->Start();
|
||||
|
||||
#ifdef FIX_BUGS
|
||||
_bIsMp3Active = true;
|
||||
#endif
|
||||
return true;
|
||||
} else {
|
||||
delete aStream[nStream];
|
||||
aStream[nStream] = NULL;
|
||||
}
|
||||
|
||||
_bIsMp3Active = false;
|
||||
|
||||
} while(++i < nNumMP3s);
|
||||
|
||||
position = 0;
|
||||
nFile = 0;
|
||||
}
|
||||
|
||||
strcpy(filename, StreamedNameTable[nFile]);
|
||||
|
||||
CStream *stream = new CStream(filename, ALStreamSources[nStream], ALStreamBuffers[nStream], IsThisTrackAt16KHz(nFile) ? 16000 : 32000);
|
||||
ASSERT(stream != NULL);
|
||||
|
||||
aStream[nStream] = stream;
|
||||
|
||||
if ( stream->Setup() ) {
|
||||
if (position != 0)
|
||||
stream->SetPosMS(position);
|
||||
|
||||
stream->Start();
|
||||
|
||||
return true;
|
||||
} else {
|
||||
delete stream;
|
||||
aStream[nStream] = NULL;
|
||||
}
|
||||
_bIsMp3Active = 0;
|
||||
}
|
||||
while ( ++i < nNumMP3s );
|
||||
position = 0;
|
||||
nFile = 0;
|
||||
}
|
||||
strcpy(filename, StreamedNameTable[nFile]);
|
||||
|
||||
CStream *stream = new CStream(filename, ALStreamSources[nStream], ALStreamBuffers[nStream], IsThisTrackAt16KHz(nFile) ? 16000 : 32000);
|
||||
|
||||
aStream[nStream] = stream;
|
||||
|
||||
if ( stream->Setup() ) {
|
||||
if (position != 0)
|
||||
stream->SetPosMS(position);
|
||||
|
||||
stream->Start();
|
||||
|
||||
return true;
|
||||
} else {
|
||||
delete stream;
|
||||
aStream[nStream] = NULL;
|
||||
}
|
||||
return false;
|
||||
}
|
||||
|
||||
|
|
|
@ -2718,7 +2718,7 @@ bool CCarCtrl::GenerateOneEmergencyServicesCar(uint32 mi, CVector vecPos)
|
|||
attempts += 1;
|
||||
}
|
||||
if (attempts >= 5)
|
||||
return nil;
|
||||
return false;
|
||||
CAutomobile* pVehicle = new CAutomobile(mi, RANDOM_VEHICLE);
|
||||
pVehicle->AutoPilot.m_vecDestinationCoors = vecPos;
|
||||
pVehicle->SetPosition(spawnPos);
|
||||
|
|
|
@ -1330,6 +1330,8 @@ CPacManPickups::Render()
|
|||
{
|
||||
if (!bPMActive) return;
|
||||
|
||||
PUSH_RENDERGROUP("CPacManPickups::Render");
|
||||
|
||||
RwRenderStateSet(rwRENDERSTATEZWRITEENABLE, FALSE);
|
||||
RwRenderStateSet(rwRENDERSTATEVERTEXALPHAENABLE, (void*)TRUE);
|
||||
RwRenderStateSet(rwRENDERSTATESRCBLEND, (void*)rwBLENDONE);
|
||||
|
@ -1363,6 +1365,8 @@ CPacManPickups::Render()
|
|||
RwRenderStateSet(rwRENDERSTATEDESTBLEND, (void*)rwBLENDINVSRCALPHA);
|
||||
RwRenderStateSet(rwRENDERSTATEZWRITEENABLE, (void*)TRUE);
|
||||
RwRenderStateSet(rwRENDERSTATEVERTEXALPHAENABLE, FALSE);
|
||||
|
||||
POP_RENDERGROUP();
|
||||
}
|
||||
|
||||
void
|
||||
|
|
|
@ -14,9 +14,9 @@ struct CdReadInfo
|
|||
void *pBuffer;
|
||||
char field_C;
|
||||
bool bLocked;
|
||||
bool bInUse;
|
||||
bool bReading;
|
||||
int32 nStatus;
|
||||
HANDLE hSemaphore; // used for CdStreamSync
|
||||
HANDLE pDoneSemaphore; // used for CdStreamSync
|
||||
HANDLE hFile;
|
||||
OVERLAPPED Overlapped;
|
||||
};
|
||||
|
@ -53,9 +53,9 @@ CdStreamInitThread(void)
|
|||
{
|
||||
for ( int32 i = 0; i < gNumChannels; i++ )
|
||||
{
|
||||
gpReadInfo[i].hSemaphore = CreateSemaphore(nil, 0, 2, nil);
|
||||
gpReadInfo[i].pDoneSemaphore = CreateSemaphore(nil, 0, 2, nil);
|
||||
|
||||
if ( gpReadInfo[i].hSemaphore == nil )
|
||||
if ( gpReadInfo[i].pDoneSemaphore == nil )
|
||||
{
|
||||
printf("%s: failed to create sync semaphore\n", "cdvd_stream");
|
||||
ASSERT(0);
|
||||
|
@ -183,7 +183,7 @@ CdStreamShutdown(void)
|
|||
CloseHandle(_gCdStreamThread);
|
||||
|
||||
for ( int32 i = 0; i < gNumChannels; i++ )
|
||||
CloseHandle(gpReadInfo[i].hSemaphore);
|
||||
CloseHandle(gpReadInfo[i].pDoneSemaphore);
|
||||
}
|
||||
|
||||
LocalFree(gpReadInfo);
|
||||
|
@ -213,7 +213,7 @@ CdStreamRead(int32 channel, void *buffer, uint32 offset, uint32 size)
|
|||
|
||||
if ( _gbCdStreamAsync )
|
||||
{
|
||||
if ( pChannel->nSectorsToRead != 0 || pChannel->bInUse )
|
||||
if ( pChannel->nSectorsToRead != 0 || pChannel->bReading )
|
||||
return STREAM_NONE;
|
||||
|
||||
pChannel->nStatus = STREAM_NONE;
|
||||
|
@ -271,7 +271,7 @@ CdStreamGetStatus(int32 channel)
|
|||
|
||||
if ( _gbCdStreamAsync )
|
||||
{
|
||||
if ( pChannel->bInUse )
|
||||
if ( pChannel->bReading )
|
||||
return STREAM_READING;
|
||||
|
||||
if ( pChannel->nSectorsToRead != 0 )
|
||||
|
@ -321,12 +321,21 @@ CdStreamSync(int32 channel)
|
|||
{
|
||||
pChannel->bLocked = true;
|
||||
|
||||
ASSERT( pChannel->hSemaphore != nil );
|
||||
ASSERT( pChannel->pDoneSemaphore != nil );
|
||||
|
||||
WaitForSingleObject(pChannel->hSemaphore, INFINITE);
|
||||
// Deadlock fix 1
|
||||
#ifdef FIX_BUGS
|
||||
// This is while loop on Posix streamer, for spurious wakeups
|
||||
if (pChannel->bLocked && pChannel->nSectorsToRead != 0){
|
||||
WaitForSingleObject(pChannel->pDoneSemaphore, INFINITE);
|
||||
}
|
||||
pChannel->bLocked = false;
|
||||
#else
|
||||
WaitForSingleObject(pChannel->pDoneSemaphore, INFINITE);
|
||||
#endif
|
||||
}
|
||||
|
||||
pChannel->bInUse = false;
|
||||
pChannel->bReading = false;
|
||||
|
||||
return pChannel->nStatus;
|
||||
}
|
||||
|
@ -398,7 +407,7 @@ WINAPI CdStreamThread(LPVOID lpThreadParameter)
|
|||
CdReadInfo *pChannel = &gpReadInfo[channel];
|
||||
ASSERT( pChannel != nil );
|
||||
|
||||
pChannel->bInUse = true;
|
||||
pChannel->bReading = true;
|
||||
|
||||
if ( pChannel->nStatus == STREAM_NONE )
|
||||
{
|
||||
|
@ -455,11 +464,15 @@ WINAPI CdStreamThread(LPVOID lpThreadParameter)
|
|||
|
||||
if ( pChannel->bLocked )
|
||||
{
|
||||
ASSERT( pChannel->hSemaphore != nil );
|
||||
ReleaseSemaphore(pChannel->hSemaphore, 1, NULL);
|
||||
ASSERT( pChannel->pDoneSemaphore != nil );
|
||||
// Deadlock fix 2
|
||||
#ifdef FIX_BUGS
|
||||
pChannel->bLocked = 0;
|
||||
#endif
|
||||
ReleaseSemaphore(pChannel->pDoneSemaphore, 1, NULL);
|
||||
}
|
||||
|
||||
pChannel->bInUse = false;
|
||||
pChannel->bReading = false;
|
||||
}
|
||||
}
|
||||
|
||||
|
|
|
@ -1,8 +1,8 @@
|
|||
#ifndef _WIN32
|
||||
#include "common.h"
|
||||
#include "crossplatform.h"
|
||||
#include <pthread.h>
|
||||
#include <signal.h>
|
||||
#include <pthread.h>
|
||||
#include <semaphore.h>
|
||||
#include <sys/types.h>
|
||||
#include <unistd.h>
|
||||
|
@ -12,7 +12,11 @@
|
|||
#include <sys/stat.h>
|
||||
#include <fcntl.h>
|
||||
#include <sys/resource.h>
|
||||
#include <stdarg.h>
|
||||
|
||||
#ifdef __linux__
|
||||
#include <sys/syscall.h>
|
||||
#endif
|
||||
|
||||
#include "CdStream.h"
|
||||
#include "rwcore.h"
|
||||
|
@ -25,6 +29,58 @@
|
|||
bool flushStream[MAX_CDCHANNELS];
|
||||
#endif
|
||||
|
||||
#ifdef USE_UNNAMED_SEM
|
||||
|
||||
#define RE3_SEM_OPEN(name, ...) re3_sem_open()
|
||||
sem_t*
|
||||
re3_sem_open(void)
|
||||
{
|
||||
sem_t* sem = (sem_t*)malloc(sizeof(sem_t));
|
||||
if (sem_init(sem, 0, 1) == -1) {
|
||||
sem = SEM_FAILED;
|
||||
}
|
||||
|
||||
return sem;
|
||||
}
|
||||
|
||||
#define RE3_SEM_CLOSE(sem, format, ...) re3_sem_close(sem)
|
||||
void
|
||||
re3_sem_close(sem_t* sem)
|
||||
{
|
||||
sem_destroy(sem);
|
||||
free(sem);
|
||||
}
|
||||
|
||||
#else
|
||||
|
||||
#define RE3_SEM_OPEN re3_sem_open
|
||||
sem_t*
|
||||
re3_sem_open(const char* format, ...)
|
||||
{
|
||||
char semName[21];
|
||||
va_list va;
|
||||
va_start(va, format);
|
||||
vsprintf(semName, format, va);
|
||||
|
||||
return sem_open(semName, O_CREAT, 0644, 1);
|
||||
}
|
||||
|
||||
#define RE3_SEM_CLOSE re3_sem_close
|
||||
void
|
||||
re3_sem_close(sem_t* sem, const char* format, ...)
|
||||
{
|
||||
sem_close(sem);
|
||||
|
||||
char semName[21];
|
||||
va_list va;
|
||||
va_start(va, format);
|
||||
vsprintf(semName, format, va);
|
||||
|
||||
sem_unlink(semName);
|
||||
}
|
||||
|
||||
#endif
|
||||
|
||||
struct CdReadInfo
|
||||
{
|
||||
uint32 nSectorOffset;
|
||||
|
@ -69,14 +125,13 @@ void
|
|||
CdStreamInitThread(void)
|
||||
{
|
||||
int status;
|
||||
char semName[20];
|
||||
#ifndef ONE_THREAD_PER_CHANNEL
|
||||
gChannelRequestQ.items = (int32 *)calloc(gNumChannels + 1, sizeof(int32));
|
||||
gChannelRequestQ.head = 0;
|
||||
gChannelRequestQ.tail = 0;
|
||||
gChannelRequestQ.size = gNumChannels + 1;
|
||||
ASSERT(gChannelRequestQ.items != nil );
|
||||
gCdStreamSema = sem_open("/semaphore_cd_stream", O_CREAT, 0644, 0);
|
||||
gCdStreamSema = RE3_SEM_OPEN("/semaphore_cd_stream");
|
||||
|
||||
|
||||
if (gCdStreamSema == SEM_FAILED) {
|
||||
|
@ -90,8 +145,7 @@ CdStreamInitThread(void)
|
|||
{
|
||||
for ( int32 i = 0; i < gNumChannels; i++ )
|
||||
{
|
||||
sprintf(semName,"/semaphore_done%d",i);
|
||||
gpReadInfo[i].pDoneSemaphore = sem_open(semName, O_CREAT, 0644, 0);
|
||||
gpReadInfo[i].pDoneSemaphore = RE3_SEM_OPEN("/semaphore_done%d", i);
|
||||
|
||||
if (gpReadInfo[i].pDoneSemaphore == SEM_FAILED)
|
||||
{
|
||||
|
@ -101,8 +155,7 @@ CdStreamInitThread(void)
|
|||
}
|
||||
|
||||
#ifdef ONE_THREAD_PER_CHANNEL
|
||||
sprintf(semName,"/semaphore_start%d",i);
|
||||
gpReadInfo[i].pStartSemaphore = sem_open(semName, O_CREAT, 0644, 0);
|
||||
gpReadInfo[i].pStartSemaphore = RE3_SEM_OPEN("/semaphore_start%d", i);
|
||||
|
||||
if (gpReadInfo[i].pStartSemaphore == SEM_FAILED)
|
||||
{
|
||||
|
@ -464,21 +517,14 @@ void *CdStreamThread(void *param)
|
|||
#ifndef ONE_THREAD_PER_CHANNEL
|
||||
for ( int32 i = 0; i < gNumChannels; i++ )
|
||||
{
|
||||
sem_close(gpReadInfo[i].pDoneSemaphore);
|
||||
sprintf(semName,"/semaphore_done%d",i);
|
||||
sem_unlink(semName);
|
||||
RE3_SEM_CLOSE(gpReadInfo[i].pDoneSemaphore, "/semaphore_done%d", i);
|
||||
}
|
||||
sem_close(gCdStreamSema);
|
||||
sem_unlink("/semaphore_cd_stream");
|
||||
RE3_SEM_CLOSE(gCdStreamSema, "/semaphore_cd_stream");
|
||||
free(gChannelRequestQ.items);
|
||||
#else
|
||||
sem_close(gpReadInfo[channel].pStartSemaphore);
|
||||
sprintf(semName,"/semaphore_start%d",channel);
|
||||
sem_unlink(semName);
|
||||
RE3_SEM_CLOSE(gpReadInfo[channel].pStartSemaphore, "/semaphore_start%d", channel);
|
||||
|
||||
sem_close(gpReadInfo[channel].pDoneSemaphore);
|
||||
sprintf(semName,"/semaphore_done%d",channel);
|
||||
sem_unlink(semName);
|
||||
RE3_SEM_CLOSE(gpReadInfo[channel].pDoneSemaphore, "/semaphore_done%d", channel);
|
||||
#endif
|
||||
if (gpReadInfo)
|
||||
free(gpReadInfo);
|
||||
|
|
|
@ -2166,7 +2166,11 @@ CMenuManager::DrawControllerBound(int32 yStart, int32 xStart, int32 unused, int8
|
|||
|
||||
// Print bindings, including seperator (-) between them
|
||||
CFont::SetScale(MENU_X(0.25f), MENU_Y(SMALLESTTEXT_Y_SCALE));
|
||||
#ifdef FIX_BUGS
|
||||
for (; contSetOrder < MAX_SETORDERS && controllerAction >= 0; contSetOrder++) {
|
||||
#else
|
||||
for (; contSetOrder < MAX_SETORDERS && controllerAction != -1; contSetOrder++) {
|
||||
#endif
|
||||
wchar *settingText = ControlsManager.GetControllerSettingTextWithOrderNumber((e_ControllerAction)controllerAction, (eContSetOrder)contSetOrder);
|
||||
if (settingText) {
|
||||
++bindingsForThisOpt;
|
||||
|
@ -3821,11 +3825,10 @@ CMenuManager::LoadSettings()
|
|||
#ifdef LOAD_INI_SETTINGS
|
||||
if (LoadINISettings()) {
|
||||
LoadINIControllerSettings();
|
||||
} else {
|
||||
// no re3.ini, create it
|
||||
SaveINISettings();
|
||||
SaveINIControllerSettings();
|
||||
}
|
||||
// if no re3.ini, create it, or update it with new values
|
||||
SaveINISettings();
|
||||
SaveINIControllerSettings();
|
||||
#endif
|
||||
|
||||
m_PrefsVsync = m_PrefsVsyncDisp;
|
||||
|
@ -5692,6 +5695,9 @@ CMenuManager::SwitchMenuOnAndOff()
|
|||
|| m_bShutDownFrontEndRequested || m_bStartUpFrontEndRequested) {
|
||||
|
||||
m_bMenuActive = !m_bMenuActive;
|
||||
#ifdef FIX_BUGS
|
||||
CPad::StopPadsShaking();
|
||||
#endif
|
||||
|
||||
if (m_bShutDownFrontEndRequested)
|
||||
m_bMenuActive = false;
|
||||
|
|
|
@ -223,7 +223,6 @@ enum Config {
|
|||
// not in master builds
|
||||
#define VALIDATE_SAVE_SIZE
|
||||
|
||||
#define NO_MOVIES // disable intro videos
|
||||
#define DEBUGMENU
|
||||
#endif
|
||||
|
||||
|
@ -241,6 +240,8 @@ enum Config {
|
|||
#define COMPATIBLE_SAVES // this allows changing structs while keeping saves compatible
|
||||
#define LOAD_INI_SETTINGS // as the name suggests. fundamental for CUSTOM_FRONTEND_OPTIONS
|
||||
|
||||
#define NO_MOVIES // add option to disable intro videos
|
||||
|
||||
#if defined(__LP64__) || defined(_WIN64)
|
||||
#define FIX_BUGS_64 // Must have fixes to be able to run 64 bit build
|
||||
#endif
|
||||
|
|
|
@ -92,7 +92,10 @@ bool gbModelViewer;
|
|||
bool gbShowTimebars;
|
||||
#endif
|
||||
#ifdef DRAW_GAME_VERSION_TEXT
|
||||
bool gDrawVersionText; // Our addition, we think it was always enabled on !MASTER builds
|
||||
bool gbDrawVersionText; // Our addition, we think it was always enabled on !MASTER builds
|
||||
#endif
|
||||
#ifdef NO_MOVIES
|
||||
bool gbNoMovies;
|
||||
#endif
|
||||
|
||||
volatile int32 frameCount;
|
||||
|
@ -1109,7 +1112,7 @@ DisplayGameDebugText()
|
|||
#ifdef DRAW_GAME_VERSION_TEXT
|
||||
wchar ver[200];
|
||||
|
||||
if(gDrawVersionText) // This realtime switch is our thing
|
||||
if(gbDrawVersionText) // This realtime switch is our thing
|
||||
{
|
||||
|
||||
#ifdef USE_OUR_VERSIONING
|
||||
|
@ -1313,6 +1316,7 @@ if(gbRenderEverythingBarRoads)
|
|||
void
|
||||
RenderScene_new(void)
|
||||
{
|
||||
PUSH_RENDERGROUP("RenderScene_new");
|
||||
CClouds::Render();
|
||||
DoRWRenderHorizon();
|
||||
|
||||
|
@ -1320,6 +1324,7 @@ RenderScene_new(void)
|
|||
DefinedState();
|
||||
// CMattRenderer::ResetRenderStates
|
||||
// moved CRenderer::RenderBoats to before transparent water
|
||||
POP_RENDERGROUP();
|
||||
}
|
||||
|
||||
// TODO
|
||||
|
@ -1327,6 +1332,7 @@ bool FredIsInFirstPersonCam(void) { return false; }
|
|||
void
|
||||
RenderEffects_new(void)
|
||||
{
|
||||
PUSH_RENDERGROUP("RenderEffects_new");
|
||||
CShadows::RenderStaticShadows();
|
||||
// CRenderer::GenerateEnvironmentMap
|
||||
CShadows::RenderStoredShadows();
|
||||
|
@ -1369,6 +1375,7 @@ if(gbRenderFadingInEntities)
|
|||
CPointLights::RenderFogEffect();
|
||||
CMovingThings::Render();
|
||||
CRenderer::RenderFirstPersonVehicle();
|
||||
POP_RENDERGROUP();
|
||||
}
|
||||
#endif
|
||||
|
||||
|
@ -1381,6 +1388,7 @@ RenderScene(void)
|
|||
return;
|
||||
}
|
||||
#endif
|
||||
PUSH_RENDERGROUP("RenderScene");
|
||||
CClouds::Render();
|
||||
DoRWRenderHorizon();
|
||||
CRenderer::RenderRoads();
|
||||
|
@ -1395,11 +1403,13 @@ RenderScene(void)
|
|||
CRenderer::RenderVehiclesButNotBoats();
|
||||
#endif
|
||||
CWeather::RenderRainStreaks();
|
||||
POP_RENDERGROUP();
|
||||
}
|
||||
|
||||
void
|
||||
RenderDebugShit(void)
|
||||
{
|
||||
PUSH_RENDERGROUP("RenderDebugShit");
|
||||
CTheScripts::RenderTheScriptDebugLines();
|
||||
#ifndef FINAL
|
||||
if(gbShowCollisionLines)
|
||||
|
@ -1408,6 +1418,7 @@ RenderDebugShit(void)
|
|||
CDebug::DrawLines();
|
||||
DefinedState();
|
||||
#endif
|
||||
POP_RENDERGROUP();
|
||||
}
|
||||
|
||||
void
|
||||
|
@ -1419,6 +1430,7 @@ RenderEffects(void)
|
|||
return;
|
||||
}
|
||||
#endif
|
||||
PUSH_RENDERGROUP("RenderEffects");
|
||||
CGlass::Render();
|
||||
CWaterCannons::Render();
|
||||
CSpecialFX::Render();
|
||||
|
@ -1434,11 +1446,13 @@ RenderEffects(void)
|
|||
CPointLights::RenderFogEffect();
|
||||
CMovingThings::Render();
|
||||
CRenderer::RenderFirstPersonVehicle();
|
||||
POP_RENDERGROUP();
|
||||
}
|
||||
|
||||
void
|
||||
Render2dStuff(void)
|
||||
{
|
||||
PUSH_RENDERGROUP("Render2dStuff");
|
||||
RwRenderStateSet(rwRENDERSTATEZTESTENABLE, (void*)FALSE);
|
||||
RwRenderStateSet(rwRENDERSTATEZWRITEENABLE, (void*)FALSE);
|
||||
RwRenderStateSet(rwRENDERSTATEVERTEXALPHAENABLE, (void*)TRUE);
|
||||
|
@ -1504,6 +1518,7 @@ Render2dStuff(void)
|
|||
#ifdef DEBUGMENU
|
||||
DebugMenuRender();
|
||||
#endif
|
||||
POP_RENDERGROUP();
|
||||
}
|
||||
|
||||
void
|
||||
|
@ -1511,21 +1526,25 @@ RenderMenus(void)
|
|||
{
|
||||
if (FrontEndMenuManager.m_bMenuActive)
|
||||
{
|
||||
PUSH_RENDERGROUP("RenderMenus");
|
||||
PUSH_MEMID(MEMID_FRONTEND);
|
||||
FrontEndMenuManager.DrawFrontEnd();
|
||||
POP_MEMID();
|
||||
POP_RENDERGROUP();
|
||||
}
|
||||
}
|
||||
|
||||
void
|
||||
Render2dStuffAfterFade(void)
|
||||
{
|
||||
PUSH_RENDERGROUP("Render2dStuffAfterFade");
|
||||
#ifndef MASTER
|
||||
DisplayGameDebugText();
|
||||
#endif
|
||||
|
||||
CHud::DrawAfterFade();
|
||||
CFont::DrawFonts();
|
||||
POP_RENDERGROUP();
|
||||
}
|
||||
|
||||
void
|
||||
|
|
|
@ -1,5 +1,16 @@
|
|||
#pragma once
|
||||
|
||||
#ifndef FINAL
|
||||
// defined in RwHelpder.cpp
|
||||
void PushRendergroup(const char *name);
|
||||
void PopRendergroup(void);
|
||||
#define PUSH_RENDERGROUP(str) PushRendergroup(str)
|
||||
#define POP_RENDERGROUP() PopRendergroup()
|
||||
#else
|
||||
#define PUSH_RENDERGROUP(str)
|
||||
#define POP_RENDERGROUP()
|
||||
#endif
|
||||
|
||||
struct GlobalScene
|
||||
{
|
||||
RpWorld *world;
|
||||
|
@ -55,3 +66,11 @@ void SaveINIControllerSettings();
|
|||
extern bool gbNewRenderer;
|
||||
bool FredIsInFirstPersonCam(void);
|
||||
#endif
|
||||
|
||||
#ifdef DRAW_GAME_VERSION_TEXT
|
||||
extern bool gbDrawVersionText;
|
||||
#endif
|
||||
|
||||
#ifdef NO_MOVIES
|
||||
extern bool gbNoMovies;
|
||||
#endif
|
||||
|
|
|
@ -517,8 +517,10 @@ bool LoadINISettings()
|
|||
ReadIniIfExists("Draw", "FixSprites", &CDraw::ms_bFixSprites);
|
||||
#endif
|
||||
#ifdef DRAW_GAME_VERSION_TEXT
|
||||
extern bool gDrawVersionText;
|
||||
ReadIniIfExists("General", "DrawVersionText", &gDrawVersionText);
|
||||
ReadIniIfExists("General", "DrawVersionText", &gbDrawVersionText);
|
||||
#endif
|
||||
#ifdef NO_MOVIES
|
||||
ReadIniIfExists("General", "NoMovies", &gbNoMovies);
|
||||
#endif
|
||||
|
||||
#ifdef CUSTOM_FRONTEND_OPTIONS
|
||||
|
@ -608,8 +610,10 @@ void SaveINISettings()
|
|||
StoreIni("Draw", "FixSprites", CDraw::ms_bFixSprites);
|
||||
#endif
|
||||
#ifdef DRAW_GAME_VERSION_TEXT
|
||||
extern bool gDrawVersionText;
|
||||
StoreIni("General", "DrawVersionText", gDrawVersionText);
|
||||
StoreIni("General", "DrawVersionText", gbDrawVersionText);
|
||||
#endif
|
||||
#ifdef NO_MOVIES
|
||||
StoreIni("General", "NoMovies", gbNoMovies);
|
||||
#endif
|
||||
#ifdef CUSTOM_FRONTEND_OPTIONS
|
||||
for (int i = 0; i < MENUPAGES; i++) {
|
||||
|
@ -990,14 +994,14 @@ extern bool gbRenderWorld2;
|
|||
|
||||
|
||||
#ifdef DRAW_GAME_VERSION_TEXT
|
||||
extern bool gDrawVersionText;
|
||||
DebugMenuAddVarBool8("Debug", "Version Text", &gDrawVersionText, nil);
|
||||
DebugMenuAddVarBool8("Debug", "Version Text", &gbDrawVersionText, nil);
|
||||
#endif
|
||||
DebugMenuAddVarBool8("Debug", "Show DebugStuffInRelease", &gbDebugStuffInRelease, nil);
|
||||
#ifdef TIMEBARS
|
||||
DebugMenuAddVarBool8("Debug", "Show Timebars", &gbShowTimebars, nil);
|
||||
#endif
|
||||
#ifndef FINAL
|
||||
DebugMenuAddVarBool8("Debug", "Use debug render groups", &bDebugRenderGroups, nil);
|
||||
DebugMenuAddVarBool8("Debug", "Print Memory Usage", &gbPrintMemoryUsage, nil);
|
||||
#ifdef USE_CUSTOM_ALLOCATOR
|
||||
DebugMenuAddCmd("Debug", "Parse Heap", ParseHeap);
|
||||
|
|
|
@ -91,13 +91,7 @@ vehicleRenderCB(rw::Atomic *atomic, rw::gl3::InstanceDataHeader *header)
|
|||
setWorldMatrix(atomic->getFrame()->getLTM());
|
||||
lightingCB(atomic);
|
||||
|
||||
#ifdef RW_GL_USE_VAOS
|
||||
glBindVertexArray(header->vao);
|
||||
#else
|
||||
glBindBuffer(GL_ELEMENT_ARRAY_BUFFER, header->ibo);
|
||||
glBindBuffer(GL_ARRAY_BUFFER, header->vbo);
|
||||
setAttribPointers(header->attribDesc, header->numAttribs);
|
||||
#endif
|
||||
setupVertexInput(header);
|
||||
|
||||
InstanceData *inst = header->inst;
|
||||
rw::int32 n = header->numMeshes;
|
||||
|
@ -137,9 +131,7 @@ vehicleRenderCB(rw::Atomic *atomic, rw::gl3::InstanceDataHeader *header)
|
|||
SetRenderState(SRCBLEND, BLENDSRCALPHA);
|
||||
setTexture(1, nil);
|
||||
|
||||
#ifndef RW_GL_USE_VAOS
|
||||
disableAttribPointers(header->attribDesc, header->numAttribs);
|
||||
#endif
|
||||
teardownVertexInput(header);
|
||||
}
|
||||
|
||||
void
|
||||
|
@ -210,13 +202,7 @@ worldRenderCB(rw::Atomic *atomic, rw::gl3::InstanceDataHeader *header)
|
|||
setWorldMatrix(atomic->getFrame()->getLTM());
|
||||
lightingCB(atomic);
|
||||
|
||||
#ifdef RW_GL_USE_VAOS
|
||||
glBindVertexArray(header->vao);
|
||||
#else
|
||||
glBindBuffer(GL_ELEMENT_ARRAY_BUFFER, header->ibo);
|
||||
glBindBuffer(GL_ARRAY_BUFFER, header->vbo);
|
||||
setAttribPointers(header->attribDesc, header->numAttribs);
|
||||
#endif
|
||||
setupVertexInput(header);
|
||||
|
||||
InstanceData *inst = header->inst;
|
||||
rw::int32 n = header->numMeshes;
|
||||
|
@ -254,9 +240,7 @@ worldRenderCB(rw::Atomic *atomic, rw::gl3::InstanceDataHeader *header)
|
|||
inst++;
|
||||
}
|
||||
setTexture(1, nil);
|
||||
#ifndef RW_GL_USE_VAOS
|
||||
disableAttribPointers(header->attribDesc, header->numAttribs);
|
||||
#endif
|
||||
teardownVertexInput(header);
|
||||
}
|
||||
|
||||
void
|
||||
|
@ -318,13 +302,7 @@ glossRenderCB(rw::Atomic *atomic, rw::gl3::InstanceDataHeader *header)
|
|||
|
||||
Material *m;
|
||||
|
||||
#ifdef RW_GL_USE_VAOS
|
||||
glBindVertexArray(header->vao);
|
||||
#else
|
||||
glBindBuffer(GL_ELEMENT_ARRAY_BUFFER, header->ibo);
|
||||
glBindBuffer(GL_ARRAY_BUFFER, header->vbo);
|
||||
setAttribPointers(header->attribDesc, header->numAttribs);
|
||||
#endif
|
||||
setupVertexInput(header);
|
||||
|
||||
InstanceData *inst = header->inst;
|
||||
rw::int32 n = header->numMeshes;
|
||||
|
@ -367,9 +345,7 @@ glossRenderCB(rw::Atomic *atomic, rw::gl3::InstanceDataHeader *header)
|
|||
SetRenderState(SRCBLEND, BLENDSRCALPHA);
|
||||
SetRenderState(DESTBLEND, BLENDINVSRCALPHA);
|
||||
|
||||
#ifndef RW_GL_USE_VAOS
|
||||
disableAttribPointers(header->attribDesc, header->numAttribs);
|
||||
#endif
|
||||
teardownVertexInput(header);
|
||||
}
|
||||
|
||||
void
|
||||
|
@ -453,13 +429,7 @@ rimSkinRenderCB(rw::Atomic *atomic, rw::gl3::InstanceDataHeader *header)
|
|||
setWorldMatrix(atomic->getFrame()->getLTM());
|
||||
lightingCB(atomic);
|
||||
|
||||
#ifdef RW_GL_USE_VAOS
|
||||
glBindVertexArray(header->vao);
|
||||
#else
|
||||
glBindBuffer(GL_ELEMENT_ARRAY_BUFFER, header->ibo);
|
||||
glBindBuffer(GL_ARRAY_BUFFER, header->vbo);
|
||||
setAttribPointers(header->attribDesc, header->numAttribs);
|
||||
#endif
|
||||
setupVertexInput(header);
|
||||
|
||||
InstanceData *inst = header->inst;
|
||||
rw::int32 n = header->numMeshes;
|
||||
|
@ -482,9 +452,7 @@ rimSkinRenderCB(rw::Atomic *atomic, rw::gl3::InstanceDataHeader *header)
|
|||
drawInst(header, inst);
|
||||
inst++;
|
||||
}
|
||||
#ifndef RW_GL_USE_VAOS
|
||||
disableAttribPointers(header->attribDesc, header->numAttribs);
|
||||
#endif
|
||||
teardownVertexInput(header);
|
||||
}
|
||||
|
||||
static void
|
||||
|
@ -504,13 +472,7 @@ rimRenderCB(rw::Atomic *atomic, rw::gl3::InstanceDataHeader *header)
|
|||
setWorldMatrix(atomic->getFrame()->getLTM());
|
||||
lightingCB(atomic);
|
||||
|
||||
#ifdef RW_GL_USE_VAOS
|
||||
glBindVertexArray(header->vao);
|
||||
#else
|
||||
glBindBuffer(GL_ELEMENT_ARRAY_BUFFER, header->ibo);
|
||||
glBindBuffer(GL_ARRAY_BUFFER, header->vbo);
|
||||
setAttribPointers(header->attribDesc, header->numAttribs);
|
||||
#endif
|
||||
setupVertexInput(header);
|
||||
|
||||
InstanceData *inst = header->inst;
|
||||
rw::int32 n = header->numMeshes;
|
||||
|
@ -531,9 +493,7 @@ rimRenderCB(rw::Atomic *atomic, rw::gl3::InstanceDataHeader *header)
|
|||
drawInst(header, inst);
|
||||
inst++;
|
||||
}
|
||||
#ifndef RW_GL_USE_VAOS
|
||||
disableAttribPointers(header->attribDesc, header->numAttribs);
|
||||
#endif
|
||||
teardownVertexInput(header);
|
||||
}
|
||||
|
||||
void
|
||||
|
@ -696,13 +656,7 @@ AtomicFirstPass(RpAtomic *atomic, int pass)
|
|||
if(!setupDone){
|
||||
defaultShader->use();
|
||||
setWorldMatrix(&building->matrix);
|
||||
#ifdef RW_GL_USE_VAOS
|
||||
glBindVertexArray(building->instHeader->vao);
|
||||
#else
|
||||
glBindBuffer(GL_ELEMENT_ARRAY_BUFFER, building->instHeader->ibo);
|
||||
glBindBuffer(GL_ARRAY_BUFFER, building->instHeader->vbo);
|
||||
setAttribPointers(building->instHeader->attribDesc, building->instHeader->numAttribs);
|
||||
#endif
|
||||
setupVertexInput(building->instHeader);
|
||||
setLights(&lights);
|
||||
setupDone = true;
|
||||
}
|
||||
|
@ -713,9 +667,7 @@ AtomicFirstPass(RpAtomic *atomic, int pass)
|
|||
|
||||
drawInst(building->instHeader, inst);
|
||||
}
|
||||
#ifndef RW_GL_USE_VAOS
|
||||
disableAttribPointers(building->instHeader->attribDesc, building->instHeader->numAttribs);
|
||||
#endif
|
||||
teardownVertexInput(building->instHeader);
|
||||
if(defer)
|
||||
numBlendInsts[pass]++;
|
||||
}
|
||||
|
@ -754,13 +706,7 @@ RenderBlendPass(int pass)
|
|||
for(i = 0; i < numBlendInsts[pass]; i++){
|
||||
BuildingInst *building = &blendInsts[pass][i];
|
||||
|
||||
#ifdef RW_GL_USE_VAOS
|
||||
glBindVertexArray(building->instHeader->vao);
|
||||
#else
|
||||
glBindBuffer(GL_ELEMENT_ARRAY_BUFFER, building->instHeader->ibo);
|
||||
glBindBuffer(GL_ARRAY_BUFFER, building->instHeader->vbo);
|
||||
setAttribPointers(building->instHeader->attribDesc, building->instHeader->numAttribs);
|
||||
#endif
|
||||
setupVertexInput(building->instHeader);
|
||||
setWorldMatrix(&building->matrix);
|
||||
if(building->lighting)
|
||||
lights.ambient = pAmbient->color;
|
||||
|
@ -782,9 +728,7 @@ RenderBlendPass(int pass)
|
|||
|
||||
drawInst(building->instHeader, inst);
|
||||
}
|
||||
#ifndef RW_GL_USE_VAOS
|
||||
disableAttribPointers(building->instHeader->attribDesc, building->instHeader->numAttribs);
|
||||
#endif
|
||||
teardownVertexInput(building->instHeader);
|
||||
}
|
||||
}
|
||||
}
|
||||
|
|
|
@ -7,6 +7,7 @@
|
|||
#error "Need librw for EXTENDED_COLOURFILTER"
|
||||
#endif
|
||||
|
||||
#include "main.h"
|
||||
#include "RwHelper.h"
|
||||
#include "Camera.h"
|
||||
#include "MBlur.h"
|
||||
|
@ -407,6 +408,7 @@ CPostFX::Render(RwCamera *cam, uint32 red, uint32 green, uint32 blue, uint32 blu
|
|||
break;
|
||||
}
|
||||
|
||||
PUSH_RENDERGROUP("CPostFX::Render");
|
||||
if(pFrontBuffer == nil)
|
||||
Open(cam);
|
||||
assert(pFrontBuffer);
|
||||
|
@ -464,6 +466,8 @@ CPostFX::Render(RwCamera *cam, uint32 red, uint32 green, uint32 blue, uint32 blu
|
|||
bJustInitialised = false;
|
||||
}else
|
||||
bJustInitialised = true;
|
||||
|
||||
POP_RENDERGROUP();
|
||||
}
|
||||
|
||||
#endif
|
||||
|
|
|
@ -17,7 +17,7 @@ main(void)
|
|||
}
|
||||
vec4 color;
|
||||
color.rgb = prev.rgb;
|
||||
color.a = 1.0f;
|
||||
color.a = 1.0;
|
||||
|
||||
FRAGCOLOR(color);
|
||||
}
|
||||
|
|
|
@ -10,6 +10,6 @@ float4 main(in float2 texcoord : TEXCOORD0) : COLOR0
|
|||
float4 tmp = dst*(1-a) + prev*blurcol*a;
|
||||
prev = saturate(tmp);
|
||||
}
|
||||
prev.a = 1.0f;
|
||||
prev.a = 1.0;
|
||||
return prev;
|
||||
}
|
||||
|
|
|
@ -12,7 +12,7 @@ main(void)
|
|||
vec4 dst = texture(tex0, vec2(v_tex0.x, 1.0-v_tex0.y));
|
||||
vec4 color;
|
||||
color.rgb = dst.rgb*u_contrastMult + u_contrastAdd;
|
||||
color.a = 1.0f;
|
||||
color.a = 1.0;
|
||||
|
||||
FRAGCOLOR(color);
|
||||
}
|
||||
|
|
|
@ -42,7 +42,7 @@ main(void)
|
|||
v_tex1 = uv2.xy*0.5 + 0.5;
|
||||
float b = 1.0 - clamp(dot(viewVec, Normal), 0.0, 1.0);
|
||||
v_reflcolor = vec4(0.0, 0.0, 0.0, 1.0);
|
||||
v_reflcolor.a = mix(b*b*b*b*b, 1.0f, fresnel)*shininess;
|
||||
v_reflcolor.a = mix(b*b*b*b*b, 1.0, fresnel)*shininess;
|
||||
|
||||
for(int i = 0; i < 5; i++)
|
||||
v_reflcolor.rgb += DoDirLightSpec(u_specDir[i].xyz, u_specColor[i].rgb, Normal, viewVec, u_specDir[i].w)*specularity*lightStrength;
|
||||
|
|
|
@ -52,7 +52,7 @@ VS_out main(in VS_in input)
|
|||
output.TexCoord1 = uv2.xy*0.5 + 0.5;
|
||||
float b = 1.0 - saturate(dot(viewVec, Normal));
|
||||
output.ReflColor = float4(0.0, 0.0, 0.0, 1.0);
|
||||
output.ReflColor.a = lerp(b*b*b*b*b, 1.0f, fresnel)*shininess;
|
||||
output.ReflColor.a = lerp(b*b*b*b*b, 1.0, fresnel)*shininess;
|
||||
|
||||
//Light mainLight = lights[0];
|
||||
for(i = 0; i < 5; i++)
|
||||
|
|
|
@ -18,7 +18,7 @@ const char *colourfilterIII_frag_src =
|
|||
" }\n"
|
||||
" vec4 color;\n"
|
||||
" color.rgb = prev.rgb;\n"
|
||||
" color.a = 1.0f;\n"
|
||||
" color.a = 1.0;\n"
|
||||
|
||||
" FRAGCOLOR(color);\n"
|
||||
"}\n"
|
||||
|
|
|
@ -13,7 +13,7 @@ const char *contrast_frag_src =
|
|||
" vec4 dst = texture(tex0, vec2(v_tex0.x, 1.0-v_tex0.y));\n"
|
||||
" vec4 color;\n"
|
||||
" color.rgb = dst.rgb*u_contrastMult + u_contrastAdd;\n"
|
||||
" color.a = 1.0f;\n"
|
||||
" color.a = 1.0;\n"
|
||||
|
||||
" FRAGCOLOR(color);\n"
|
||||
"}\n"
|
||||
|
|
|
@ -43,7 +43,7 @@ const char *neoVehicle_vert_src =
|
|||
" v_tex1 = uv2.xy*0.5 + 0.5;\n"
|
||||
" float b = 1.0 - clamp(dot(viewVec, Normal), 0.0, 1.0);\n"
|
||||
" v_reflcolor = vec4(0.0, 0.0, 0.0, 1.0);\n"
|
||||
" v_reflcolor.a = mix(b*b*b*b*b, 1.0f, fresnel)*shininess;\n"
|
||||
" v_reflcolor.a = mix(b*b*b*b*b, 1.0, fresnel)*shininess;\n"
|
||||
|
||||
" for(int i = 0; i < 5; i++)\n"
|
||||
" v_reflcolor.rgb += DoDirLightSpec(u_specDir[i].xyz, u_specColor[i].rgb, Normal, viewVec, u_specDir[i].w)*specularity*lightStrength;\n"
|
||||
|
|
|
@ -1,5 +1,6 @@
|
|||
#include "common.h"
|
||||
|
||||
#include "main.h"
|
||||
#include "Antennas.h"
|
||||
|
||||
CAntenna CAntennas::aAntennas[NUMANTENNAS];
|
||||
|
@ -70,6 +71,7 @@ CAntennas::Render(void)
|
|||
{
|
||||
int i, j;
|
||||
|
||||
PUSH_RENDERGROUP("CAntennas::Render");
|
||||
for(i = 0; i < NUMANTENNAS; i++){
|
||||
if(!aAntennas[i].active)
|
||||
continue;
|
||||
|
@ -101,6 +103,8 @@ CAntennas::Render(void)
|
|||
}
|
||||
|
||||
RwRenderStateSet(rwRENDERSTATEVERTEXALPHAENABLE, (void*)FALSE);
|
||||
|
||||
POP_RENDERGROUP();
|
||||
}
|
||||
|
||||
void
|
||||
|
|
|
@ -1,5 +1,6 @@
|
|||
#include "common.h"
|
||||
|
||||
#include "main.h"
|
||||
#include "Sprite.h"
|
||||
#include "Sprite2d.h"
|
||||
#include "General.h"
|
||||
|
@ -123,6 +124,8 @@ CClouds::Render(void)
|
|||
RwV3d screenpos;
|
||||
RwV3d worldpos;
|
||||
|
||||
PUSH_RENDERGROUP("CClouds::Render");
|
||||
|
||||
CCoronas::SunBlockedByClouds = false;
|
||||
|
||||
RwRenderStateSet(rwRENDERSTATEZWRITEENABLE, (void*)FALSE);
|
||||
|
@ -310,6 +313,8 @@ CClouds::Render(void)
|
|||
RwRenderStateSet(rwRENDERSTATEZTESTENABLE, (void*)TRUE);
|
||||
RwRenderStateSet(rwRENDERSTATESRCBLEND, (void*)rwBLENDSRCALPHA);
|
||||
RwRenderStateSet(rwRENDERSTATEDESTBLEND, (void*)rwBLENDINVSRCALPHA);
|
||||
|
||||
POP_RENDERGROUP();
|
||||
}
|
||||
|
||||
bool
|
||||
|
@ -322,6 +327,8 @@ void
|
|||
CClouds::RenderBackground(int16 topred, int16 topgreen, int16 topblue,
|
||||
int16 botred, int16 botgreen, int16 botblue, int16 alpha)
|
||||
{
|
||||
PUSH_RENDERGROUP("CClouds::RenderBackground");
|
||||
|
||||
CVector left = TheCamera.GetRight();
|
||||
float c = left.Magnitude2D();
|
||||
if(c > 1.0f)
|
||||
|
@ -422,6 +429,8 @@ CClouds::RenderBackground(int16 topred, int16 topgreen, int16 topblue,
|
|||
ms_colourBottom.g = (topgreen + 2 * botgreen) / 3;
|
||||
ms_colourBottom.b = (topblue + 2 * botblue) / 3;
|
||||
}
|
||||
|
||||
POP_RENDERGROUP();
|
||||
}
|
||||
|
||||
void
|
||||
|
@ -436,6 +445,8 @@ CClouds::RenderHorizon(void)
|
|||
if(ms_horizonZ > SCREEN_HEIGHT)
|
||||
return;
|
||||
|
||||
PUSH_RENDERGROUP("CClouds::RenderHorizon");
|
||||
|
||||
float z1 = Min(ms_horizonZ + SMALLSTRIPHEIGHT, SCREEN_HEIGHT);
|
||||
CSprite2d::DrawRectXLU(CRect(0, ms_horizonZ, SCREEN_WIDTH, z1),
|
||||
ms_colourBottom, ms_colourBottom, ms_colourTop, ms_colourTop);
|
||||
|
@ -450,4 +461,6 @@ CClouds::RenderHorizon(void)
|
|||
z2 = Min(z2, SCREEN_HEIGHT);
|
||||
CSprite2d::DrawRect(CRect(0, z1, SCREEN_WIDTH, z2),
|
||||
ms_colourBottom, ms_colourBottom, ms_colourTop, ms_colourTop);
|
||||
|
||||
POP_RENDERGROUP();
|
||||
}
|
||||
|
|
|
@ -235,6 +235,8 @@ CCoronas::Render(void)
|
|||
int i, j;
|
||||
int screenw, screenh;
|
||||
|
||||
PUSH_RENDERGROUP("CCoronas::Render");
|
||||
|
||||
screenw = RwRasterGetWidth(RwCameraGetRaster(Scene.camera));
|
||||
screenh = RwRasterGetHeight(RwCameraGetRaster(Scene.camera));
|
||||
|
||||
|
@ -418,6 +420,8 @@ CCoronas::Render(void)
|
|||
RwRenderStateSet(rwRENDERSTATEVERTEXALPHAENABLE, (void*)FALSE);
|
||||
RwRenderStateSet(rwRENDERSTATEZTESTENABLE, (void*)TRUE);
|
||||
RwRenderStateSet(rwRENDERSTATEZWRITEENABLE, (void*)TRUE);
|
||||
|
||||
POP_RENDERGROUP();
|
||||
}
|
||||
|
||||
void
|
||||
|
@ -428,6 +432,8 @@ CCoronas::RenderReflections(void)
|
|||
CEntity *entity;
|
||||
|
||||
if(CWeather::WetRoads > 0.0f){
|
||||
PUSH_RENDERGROUP("CCoronas::RenderReflections");
|
||||
|
||||
#ifdef FIX_BUGS
|
||||
CSprite::InitSpriteBuffer();
|
||||
#endif
|
||||
|
@ -505,6 +511,8 @@ CCoronas::RenderReflections(void)
|
|||
RwRenderStateSet(rwRENDERSTATEVERTEXALPHAENABLE, (void*)FALSE);
|
||||
RwRenderStateSet(rwRENDERSTATEZWRITEENABLE, (void*)TRUE);
|
||||
RwRenderStateSet(rwRENDERSTATEZTESTENABLE, (void*)TRUE);
|
||||
|
||||
POP_RENDERGROUP();
|
||||
}else{
|
||||
for(i = 0; i < NUMCORONAS; i++)
|
||||
aCoronas[i].renderReflection = false;
|
||||
|
|
|
@ -189,6 +189,7 @@ void CMovingThings::Update()
|
|||
void CMovingThings::Render()
|
||||
{
|
||||
int i;
|
||||
PUSH_RENDERGROUP("CMovingThings::Render");
|
||||
for (i = 0; i < ARRAY_SIZE(aScrollBars); ++i)
|
||||
{
|
||||
if (aScrollBars[i].IsVisible())
|
||||
|
@ -204,6 +205,7 @@ void CMovingThings::Render()
|
|||
if (aDigitalClocks[i].IsVisible())
|
||||
aDigitalClocks[i].Render();
|
||||
}
|
||||
POP_RENDERGROUP();
|
||||
}
|
||||
|
||||
// ---------- CMovingThing ----------
|
||||
|
|
|
@ -261,6 +261,8 @@ CGlass::Render(void)
|
|||
RwRenderStateSet(rwRENDERSTATEDESTBLEND, (void *)rwBLENDONE);
|
||||
RwRenderStateSet(rwRENDERSTATEVERTEXALPHAENABLE, (void *)TRUE);
|
||||
|
||||
PUSH_RENDERGROUP("CGlass::Render");
|
||||
|
||||
for ( int32 i = 0; i < NUM_GLASSPANES; i++ )
|
||||
{
|
||||
if ( aGlassPanes[i].m_bActive )
|
||||
|
@ -270,6 +272,8 @@ CGlass::Render(void)
|
|||
for ( uint32 i = 0; i < NumGlassEntities; i++ )
|
||||
RenderEntityInGlass(apEntitiesToBeRendered[i]);
|
||||
|
||||
POP_RENDERGROUP();
|
||||
|
||||
NumGlassEntities = 0;
|
||||
|
||||
RenderHiLightPolys();
|
||||
|
|
|
@ -6,6 +6,7 @@
|
|||
#include <d3d8caps.h>
|
||||
#endif
|
||||
|
||||
#include "main.h"
|
||||
#include "RwHelper.h"
|
||||
#include "Camera.h"
|
||||
#include "MBlur.h"
|
||||
|
@ -208,6 +209,7 @@ CMBlur::MotionBlurRender(RwCamera *cam, uint32 red, uint32 green, uint32 blue, u
|
|||
#ifdef EXTENDED_COLOURFILTER
|
||||
CPostFX::Render(cam, red, green, blue, blur, type, bluralpha);
|
||||
#else
|
||||
PUSH_RENDERGROUP("CMBlur::MotionBlurRender");
|
||||
RwRGBA color = { (RwUInt8)red, (RwUInt8)green, (RwUInt8)blue, (RwUInt8)blur };
|
||||
#ifdef GTA_PS2
|
||||
if( pFrontBuffer )
|
||||
|
@ -227,6 +229,7 @@ CMBlur::MotionBlurRender(RwCamera *cam, uint32 red, uint32 green, uint32 blue, u
|
|||
OverlayRender(cam, nil, color, type, bluralpha);
|
||||
}
|
||||
#endif
|
||||
POP_RENDERGROUP();
|
||||
#endif
|
||||
}
|
||||
|
||||
|
|
|
@ -1,5 +1,6 @@
|
|||
#include "common.h"
|
||||
|
||||
#include "main.h"
|
||||
#include "General.h"
|
||||
#include "Timer.h"
|
||||
#include "TxdStore.h"
|
||||
|
@ -1477,6 +1478,8 @@ void CParticle::Update()
|
|||
|
||||
void CParticle::Render()
|
||||
{
|
||||
PUSH_RENDERGROUP("CParticle::Render");
|
||||
|
||||
RwRenderStateSet(rwRENDERSTATETEXTUREADDRESS, (void *)rwTEXTUREADDRESSWRAP);
|
||||
RwRenderStateSet(rwRENDERSTATETEXTUREPERSPECTIVE, (void *)TRUE);
|
||||
RwRenderStateSet(rwRENDERSTATEFOGENABLE, (void *)FALSE);
|
||||
|
@ -1794,6 +1797,8 @@ void CParticle::Render()
|
|||
RwRenderStateSet(rwRENDERSTATEZTESTENABLE, (void *)TRUE);
|
||||
RwRenderStateSet(rwRENDERSTATESRCBLEND, (void *)rwBLENDSRCALPHA);
|
||||
RwRenderStateSet(rwRENDERSTATEDESTBLEND, (void *)rwBLENDINVSRCALPHA);
|
||||
|
||||
POP_RENDERGROUP();
|
||||
}
|
||||
|
||||
void CParticle::RemovePSystem(tParticleType type)
|
||||
|
|
|
@ -142,6 +142,8 @@ CPointLights::RenderFogEffect(void)
|
|||
CVector spriteCoors;
|
||||
float spritew, spriteh;
|
||||
|
||||
PUSH_RENDERGROUP("CPointLights::RenderFogEffect");
|
||||
|
||||
RwRenderStateSet(rwRENDERSTATEZWRITEENABLE, (void*)FALSE);
|
||||
RwRenderStateSet(rwRENDERSTATEVERTEXALPHAENABLE, (void*)TRUE);
|
||||
RwRenderStateSet(rwRENDERSTATESRCBLEND, (void*)rwBLENDONE);
|
||||
|
@ -282,4 +284,6 @@ CPointLights::RenderFogEffect(void)
|
|||
}
|
||||
}
|
||||
}
|
||||
|
||||
POP_RENDERGROUP();
|
||||
}
|
||||
|
|
|
@ -158,6 +158,8 @@ CRenderer::RenderOneRoad(CEntity *e)
|
|||
#ifdef EXTENDED_PIPELINES
|
||||
CustomPipes::AttachGlossPipe(e->GetAtomic());
|
||||
#endif
|
||||
PUSH_RENDERGROUP(CModelInfo::GetModelInfo(e->GetModelIndex())->GetModelName());
|
||||
|
||||
#ifdef EXTRA_MODEL_FLAGS
|
||||
if(!e->IsBuilding() || CModelInfo::GetModelInfo(e->GetModelIndex())->RenderDoubleSided()){
|
||||
BACKFACE_CULLING_OFF;
|
||||
|
@ -166,6 +168,8 @@ CRenderer::RenderOneRoad(CEntity *e)
|
|||
}else
|
||||
#endif
|
||||
e->Render();
|
||||
|
||||
POP_RENDERGROUP();
|
||||
}
|
||||
}
|
||||
|
||||
|
@ -213,6 +217,8 @@ CRenderer::RenderOneNonRoad(CEntity *e)
|
|||
}
|
||||
#endif
|
||||
|
||||
PUSH_RENDERGROUP(CModelInfo::GetModelInfo(e->GetModelIndex())->GetModelName());
|
||||
|
||||
resetLights = e->SetupLighting();
|
||||
|
||||
if(e->IsVehicle())
|
||||
|
@ -246,6 +252,8 @@ CRenderer::RenderOneNonRoad(CEntity *e)
|
|||
}
|
||||
|
||||
e->RemoveLighting(resetLights);
|
||||
|
||||
POP_RENDERGROUP();
|
||||
}
|
||||
|
||||
void
|
||||
|
@ -271,6 +279,7 @@ CRenderer::RenderRoads(void)
|
|||
int i;
|
||||
CTreadable *t;
|
||||
|
||||
PUSH_RENDERGROUP("CRenderer::RenderRoads");
|
||||
RwRenderStateSet(rwRENDERSTATEFOGENABLE, (void*)TRUE);
|
||||
BACKFACE_CULLING_ON;
|
||||
DeActivateDirectional();
|
||||
|
@ -296,6 +305,7 @@ CRenderer::RenderRoads(void)
|
|||
#endif
|
||||
}
|
||||
}
|
||||
POP_RENDERGROUP();
|
||||
}
|
||||
|
||||
void
|
||||
|
@ -306,6 +316,7 @@ CRenderer::RenderEverythingBarRoads(void)
|
|||
CVector dist;
|
||||
EntityInfo ei;
|
||||
|
||||
PUSH_RENDERGROUP("CRenderer::RenderEverythingBarRoads");
|
||||
BACKFACE_CULLING_ON;
|
||||
gSortedVehiclesAndPeds.Clear();
|
||||
|
||||
|
@ -337,6 +348,7 @@ CRenderer::RenderEverythingBarRoads(void)
|
|||
}else
|
||||
RenderOneNonRoad(e);
|
||||
}
|
||||
POP_RENDERGROUP();
|
||||
}
|
||||
|
||||
void
|
||||
|
@ -361,6 +373,7 @@ CRenderer::RenderBoats(void)
|
|||
{
|
||||
CLink<EntityInfo> *node;
|
||||
|
||||
PUSH_RENDERGROUP("CRenderer::RenderBoats");
|
||||
BACKFACE_CULLING_ON;
|
||||
|
||||
for(node = gSortedVehiclesAndPeds.tail.prev;
|
||||
|
@ -371,6 +384,7 @@ CRenderer::RenderBoats(void)
|
|||
if(v->IsBoat())
|
||||
RenderOneNonRoad(v);
|
||||
}
|
||||
POP_RENDERGROUP();
|
||||
}
|
||||
|
||||
#ifdef NEW_RENDERER
|
||||
|
@ -475,6 +489,7 @@ CRenderer::RenderWorld(int pass)
|
|||
switch(pass){
|
||||
case 0:
|
||||
// Roads
|
||||
PUSH_RENDERGROUP("CRenderer::RenderWorld - Roads");
|
||||
RwRenderStateSet(rwRENDERSTATEVERTEXALPHAENABLE, (void*)FALSE);
|
||||
for(i = 0; i < ms_nNoOfVisibleBuildings; i++){
|
||||
e = ms_aVisibleBuildingPtrs[i];
|
||||
|
@ -495,9 +510,11 @@ CRenderer::RenderWorld(int pass)
|
|||
RwRenderStateSet(rwRENDERSTATEDESTBLEND, (void*)rwBLENDINVSRCALPHA);
|
||||
WorldRender::RenderBlendPass(PASS_BLEND);
|
||||
WorldRender::numBlendInsts[PASS_BLEND] = 0;
|
||||
POP_RENDERGROUP();
|
||||
break;
|
||||
case 1:
|
||||
// Opaque
|
||||
PUSH_RENDERGROUP("CRenderer::RenderWorld - Opaque");
|
||||
RwRenderStateSet(rwRENDERSTATEVERTEXALPHAENABLE, (void*)FALSE);
|
||||
for(i = 0; i < ms_nNoOfVisibleBuildings; i++){
|
||||
e = ms_aVisibleBuildingPtrs[i];
|
||||
|
@ -518,14 +535,17 @@ CRenderer::RenderWorld(int pass)
|
|||
RwRenderStateSet(rwRENDERSTATEZWRITEENABLE, FALSE);
|
||||
WorldRender::RenderBlendPass(PASS_NOZ);
|
||||
RwRenderStateSet(rwRENDERSTATEZWRITEENABLE, (void*)TRUE);
|
||||
POP_RENDERGROUP();
|
||||
break;
|
||||
case 2:
|
||||
// Transparent
|
||||
PUSH_RENDERGROUP("CRenderer::RenderWorld - Transparent");
|
||||
RwRenderStateSet(rwRENDERSTATEVERTEXALPHAENABLE, (void*)TRUE);
|
||||
RwRenderStateSet(rwRENDERSTATEDESTBLEND, (void*)rwBLENDONE);
|
||||
WorldRender::RenderBlendPass(PASS_ADD);
|
||||
RwRenderStateSet(rwRENDERSTATEDESTBLEND, (void*)rwBLENDINVSRCALPHA);
|
||||
WorldRender::RenderBlendPass(PASS_BLEND);
|
||||
POP_RENDERGROUP();
|
||||
break;
|
||||
}
|
||||
}
|
||||
|
@ -536,11 +556,13 @@ CRenderer::RenderPeds(void)
|
|||
int i;
|
||||
CEntity *e;
|
||||
|
||||
PUSH_RENDERGROUP("CRenderer::RenderPeds");
|
||||
for(i = 0; i < ms_nNoOfVisibleVehicles; i++){
|
||||
e = ms_aVisibleVehiclePtrs[i];
|
||||
if(e->IsPed())
|
||||
RenderOneNonRoad(e);
|
||||
}
|
||||
POP_RENDERGROUP();
|
||||
}
|
||||
|
||||
void
|
||||
|
@ -551,6 +573,7 @@ CRenderer::RenderVehicles(void)
|
|||
EntityInfo ei;
|
||||
CLink<EntityInfo> *node;
|
||||
|
||||
PUSH_RENDERGROUP("CRenderer::RenderVehicles");
|
||||
// not the real thing
|
||||
for(i = 0; i < ms_nNoOfVisibleVehicles; i++){
|
||||
e = ms_aVisibleVehiclePtrs[i];
|
||||
|
@ -567,6 +590,7 @@ CRenderer::RenderVehicles(void)
|
|||
node != &gSortedVehiclesAndPeds.head;
|
||||
node = node->prev)
|
||||
RenderOneNonRoad(node->item.ent);
|
||||
POP_RENDERGROUP();
|
||||
}
|
||||
|
||||
void
|
||||
|
@ -575,6 +599,7 @@ CRenderer::RenderWater(void)
|
|||
int i;
|
||||
CEntity *e;
|
||||
|
||||
PUSH_RENDERGROUP("CRenderer::RenderWater");
|
||||
RwRenderStateSet(rwRENDERSTATETEXTURERASTER, nil);
|
||||
RwRenderStateSet(rwRENDERSTATEVERTEXALPHAENABLE, (void*)TRUE);
|
||||
RwRenderStateSet(rwRENDERSTATEFOGENABLE, (void*)FALSE);
|
||||
|
@ -598,6 +623,7 @@ CRenderer::RenderWater(void)
|
|||
CWaterLevel::RenderWater();
|
||||
|
||||
SetStencilState(0);
|
||||
POP_RENDERGROUP();
|
||||
}
|
||||
|
||||
void
|
||||
|
@ -618,11 +644,13 @@ CRenderer::ClearForFrame(void)
|
|||
void
|
||||
CRenderer::RenderFadingInEntities(void)
|
||||
{
|
||||
PUSH_RENDERGROUP("CRenderer::RenderFadingInEntities");
|
||||
RwRenderStateSet(rwRENDERSTATEFOGENABLE, (void*)TRUE);
|
||||
BACKFACE_CULLING_ON;
|
||||
DeActivateDirectional();
|
||||
SetAmbientColours();
|
||||
CVisibilityPlugins::RenderFadingEntities();
|
||||
POP_RENDERGROUP();
|
||||
}
|
||||
|
||||
void
|
||||
|
|
|
@ -52,6 +52,8 @@ CRubbish::Render(void)
|
|||
{
|
||||
int type;
|
||||
|
||||
PUSH_RENDERGROUP("CRubbish::Render");
|
||||
|
||||
RwRenderStateSet(rwRENDERSTATEZWRITEENABLE, (void*)FALSE);
|
||||
RwRenderStateSet(rwRENDERSTATEVERTEXALPHAENABLE, (void*)TRUE);
|
||||
RwRenderStateSet(rwRENDERSTATEFOGENABLE, (void*)TRUE);
|
||||
|
@ -137,6 +139,8 @@ CRubbish::Render(void)
|
|||
RwRenderStateSet(rwRENDERSTATEFOGENABLE, (void*)FALSE);
|
||||
RwRenderStateSet(rwRENDERSTATEZWRITEENABLE, (void*)FALSE);
|
||||
RwRenderStateSet(rwRENDERSTATEVERTEXALPHAENABLE, (void*)TRUE);
|
||||
|
||||
POP_RENDERGROUP();
|
||||
}
|
||||
|
||||
void
|
||||
|
|
|
@ -687,6 +687,8 @@ CShadows::SetRenderModeForShadowType(uint8 ShadowType)
|
|||
void
|
||||
CShadows::RenderStoredShadows(void)
|
||||
{
|
||||
PUSH_RENDERGROUP("CShadows::RenderStoredShadows");
|
||||
|
||||
RenderBuffer::ClearRenderBuffer();
|
||||
|
||||
RwRenderStateSet(rwRENDERSTATEZWRITEENABLE, (void *)FALSE);
|
||||
|
@ -784,11 +786,15 @@ CShadows::RenderStoredShadows(void)
|
|||
RwRenderStateSet(rwRENDERSTATEZTESTENABLE, (void *)TRUE);
|
||||
|
||||
ShadowsStoredToBeRendered = 0;
|
||||
|
||||
POP_RENDERGROUP();
|
||||
}
|
||||
|
||||
void
|
||||
CShadows::RenderStaticShadows(void)
|
||||
{
|
||||
PUSH_RENDERGROUP("CShadows::RenderStaticShadows");
|
||||
|
||||
RenderBuffer::ClearRenderBuffer();
|
||||
|
||||
RwRenderStateSet(rwRENDERSTATEZWRITEENABLE, (void *)FALSE);
|
||||
|
@ -855,6 +861,8 @@ CShadows::RenderStaticShadows(void)
|
|||
|
||||
RwRenderStateSet(rwRENDERSTATEVERTEXALPHAENABLE, (void *)FALSE);
|
||||
RwRenderStateSet(rwRENDERSTATEZWRITEENABLE, (void *)TRUE);
|
||||
|
||||
POP_RENDERGROUP();
|
||||
}
|
||||
|
||||
void
|
||||
|
|
|
@ -118,6 +118,8 @@ CSkidmarks::Render(void)
|
|||
int i, j;
|
||||
RwTexture *lastTex = nil;
|
||||
|
||||
PUSH_RENDERGROUP("CSkidmarks::Render");
|
||||
|
||||
RwRenderStateSet(rwRENDERSTATEZWRITEENABLE, (void*)FALSE);
|
||||
RwRenderStateSet(rwRENDERSTATEVERTEXALPHAENABLE, (void*)TRUE);
|
||||
RwRenderStateSet(rwRENDERSTATESRCBLEND, (void*)rwBLENDSRCALPHA);
|
||||
|
@ -174,6 +176,8 @@ CSkidmarks::Render(void)
|
|||
RwRenderStateSet(rwRENDERSTATEVERTEXALPHAENABLE, (void*)FALSE);
|
||||
RwRenderStateSet(rwRENDERSTATEZWRITEENABLE, (void*)TRUE);
|
||||
RwRenderStateSet(rwRENDERSTATEZTESTENABLE, (void*)TRUE);
|
||||
|
||||
POP_RENDERGROUP();
|
||||
}
|
||||
|
||||
void
|
||||
|
|
|
@ -136,6 +136,7 @@ CSpecialFX::Shutdown(void)
|
|||
void
|
||||
CSpecialFX::Render(void)
|
||||
{
|
||||
PUSH_RENDERGROUP("CSpecialFX::Render");
|
||||
CMotionBlurStreaks::Render();
|
||||
CBulletTraces::Render();
|
||||
CBrightLights::Render();
|
||||
|
@ -145,6 +146,7 @@ CSpecialFX::Render(void)
|
|||
if(!(gbNewRenderer && FredIsInFirstPersonCam()))
|
||||
#endif
|
||||
C3dMarkers::Render();
|
||||
POP_RENDERGROUP();
|
||||
}
|
||||
|
||||
CRegisteredMotionBlurStreak CMotionBlurStreaks::aStreaks[NUMMBLURSTREAKS];
|
||||
|
|
|
@ -297,9 +297,11 @@ void CWaterCannons::Update(void)
|
|||
|
||||
void CWaterCannons::Render(void)
|
||||
{
|
||||
PUSH_RENDERGROUP("CWaterCannons::Render");
|
||||
for ( int32 i = 0; i < NUM_WATERCANNONS; i++ )
|
||||
{
|
||||
if ( aCannons[i].m_nId != 0 )
|
||||
aCannons[i].Render();
|
||||
}
|
||||
POP_RENDERGROUP();
|
||||
}
|
||||
|
|
|
@ -432,14 +432,14 @@ CWaterLevel::TestVisibilityForFineWaterBlocks(const CVector &worldPos)
|
|||
|
||||
if ((lineEnd.x > WORLD_MIN_X && lineEnd.x < WORLD_MAX_X) && (lineEnd.y > WORLD_MIN_Y && lineEnd.y < WORLD_MAX_Y))
|
||||
{
|
||||
if (!CWorld::ProcessLineOfSight(lineStart, lineEnd, col, entity, true, false, false, false, true, false, nil))
|
||||
if (!CWorld::ProcessLineOfSight(lineStart, lineEnd, col, entity, true, false, false, false, true, false))
|
||||
{
|
||||
lineStart.x += 0.4f;
|
||||
lineStart.y += 0.4f;
|
||||
lineEnd.x += 0.4f;
|
||||
lineEnd.y += 0.4f;
|
||||
|
||||
if (!CWorld::ProcessLineOfSight(lineStart, lineEnd, col, entity, true, false, false, false, true, false, nil))
|
||||
if (!CWorld::ProcessLineOfSight(lineStart, lineEnd, col, entity, true, false, false, false, true, false))
|
||||
{
|
||||
return false;
|
||||
}
|
||||
|
@ -643,6 +643,7 @@ CWaterLevel::RenderWater()
|
|||
if (gbDontRenderWater)
|
||||
return;
|
||||
#endif
|
||||
PUSH_RENDERGROUP("CWaterLevel::RenderWater");
|
||||
bool bUseCamEndX = false;
|
||||
bool bUseCamStartY = false;
|
||||
|
||||
|
@ -1066,6 +1067,8 @@ CWaterLevel::RenderWater()
|
|||
}
|
||||
|
||||
DefinedState();
|
||||
|
||||
POP_RENDERGROUP();
|
||||
}
|
||||
|
||||
void
|
||||
|
|
|
@ -11,6 +11,7 @@
|
|||
#endif
|
||||
#ifndef FINAL
|
||||
RtCharset *debugCharset;
|
||||
bool bDebugRenderGroups;
|
||||
#endif
|
||||
|
||||
#ifdef PS2_ALPHA_TEST
|
||||
|
@ -113,6 +114,36 @@ SetCullMode(uint32 mode)
|
|||
RwRenderStateSet(rwRENDERSTATECULLMODE, (void*)rwCULLMODECULLNONE);
|
||||
}
|
||||
|
||||
#ifndef FINAL
|
||||
void
|
||||
PushRendergroup(const char *name)
|
||||
{
|
||||
if(!bDebugRenderGroups)
|
||||
return;
|
||||
#if defined(RW_OPENGL)
|
||||
if(GLAD_GL_KHR_debug)
|
||||
glPushDebugGroup(GL_DEBUG_SOURCE_APPLICATION, 0, -1, name);
|
||||
#elif defined(RW_D3D9)
|
||||
static WCHAR tmp[256];
|
||||
MultiByteToWideChar(CP_ACP, MB_PRECOMPOSED, name, -1, tmp, sizeof(tmp));
|
||||
D3DPERF_BeginEvent(0xFFFFFFFF, tmp);
|
||||
#endif
|
||||
}
|
||||
|
||||
void
|
||||
PopRendergroup(void)
|
||||
{
|
||||
if(!bDebugRenderGroups)
|
||||
return;
|
||||
#if defined(RW_OPENGL)
|
||||
if(GLAD_GL_KHR_debug)
|
||||
glPopDebugGroup();
|
||||
#elif defined(RW_D3D9)
|
||||
D3DPERF_EndEvent();
|
||||
#endif
|
||||
}
|
||||
#endif
|
||||
|
||||
RwFrame*
|
||||
GetFirstFrameCallback(RwFrame *child, void *data)
|
||||
{
|
||||
|
|
|
@ -1,5 +1,6 @@
|
|||
#pragma once
|
||||
|
||||
extern bool bDebugRenderGroups;
|
||||
extern bool gPS2alphaTest;
|
||||
|
||||
void OpenCharsetSafe();
|
||||
|
|
|
@ -293,6 +293,7 @@ CVisibilityPlugins::RenderFadingEntities(void)
|
|||
continue;
|
||||
#endif
|
||||
mi = (CSimpleModelInfo *)CModelInfo::GetModelInfo(e->GetModelIndex());
|
||||
|
||||
#ifdef FIX_BUGS
|
||||
if(mi->GetModelType() == MITYPE_SIMPLE && mi->m_noZwrite)
|
||||
#else
|
||||
|
@ -308,7 +309,9 @@ CVisibilityPlugins::RenderFadingEntities(void)
|
|||
DeActivateDirectional();
|
||||
SetAmbientColours();
|
||||
e->bImBeingRendered = true;
|
||||
PUSH_RENDERGROUP(mi->GetModelName());
|
||||
RenderFadingAtomic((RpAtomic*)e->m_rwObject, node->item.sort);
|
||||
POP_RENDERGROUP();
|
||||
e->bImBeingRendered = false;
|
||||
}else
|
||||
CRenderer::RenderOneNonRoad(e);
|
||||
|
|
|
@ -132,7 +132,12 @@ void GetLocalTime_CP(SYSTEMTIME* out);
|
|||
|
||||
typedef void* HANDLE;
|
||||
#define INVALID_HANDLE_VALUE NULL
|
||||
#define FindClose(h) closedir((DIR*)h)
|
||||
#define FindClose(h) \
|
||||
do { \
|
||||
if (h != nil) \
|
||||
closedir((DIR*)h); \
|
||||
} while(0)
|
||||
|
||||
#define LOCALE_USER_DEFAULT 0
|
||||
#define DATE_SHORTDATE 0
|
||||
|
||||
|
|
|
@ -50,17 +50,30 @@ long _dwOperatingSystemVersion;
|
|||
#include "Font.h"
|
||||
#include "MemoryMgr.h"
|
||||
|
||||
#define MAX_SUBSYSTEMS (16)
|
||||
// We found out that GLFW's keyboard input handling is still pretty delayed/not stable, so now we fetch input from X11 directly on Linux.
|
||||
#if !defined _WIN32 && !defined __APPLE__ && !defined __SWITCH__ // && !defined WAYLAND
|
||||
#define GET_KEYBOARD_INPUT_FROM_X11
|
||||
#endif
|
||||
|
||||
#ifdef GET_KEYBOARD_INPUT_FROM_X11
|
||||
#include <X11/Xlib.h>
|
||||
#include <X11/XKBlib.h>
|
||||
#define GLFW_EXPOSE_NATIVE_X11
|
||||
#include <GLFW/glfw3native.h>
|
||||
#endif
|
||||
|
||||
#ifdef _WIN32
|
||||
#define GLFW_EXPOSE_NATIVE_WIN32
|
||||
#include <GLFW/glfw3native.h>
|
||||
#endif
|
||||
|
||||
#define MAX_SUBSYSTEMS (16)
|
||||
|
||||
rw::EngineOpenParams openParams;
|
||||
|
||||
static RwBool ForegroundApp = TRUE;
|
||||
static RwBool WindowIconified = FALSE;
|
||||
static RwBool WindowFocused = TRUE;
|
||||
|
||||
static RwBool RwInitialised = FALSE;
|
||||
|
||||
|
@ -322,7 +335,9 @@ psInitialize(void)
|
|||
RsGlobal.ps = &PsGlobal;
|
||||
|
||||
PsGlobal.fullScreen = FALSE;
|
||||
PsGlobal.cursorIsInWindow = TRUE;
|
||||
PsGlobal.cursorIsInWindow = FALSE;
|
||||
WindowFocused = TRUE;
|
||||
WindowIconified = FALSE;
|
||||
|
||||
PsGlobal.joy1id = -1;
|
||||
PsGlobal.joy2id = -1;
|
||||
|
@ -838,11 +853,15 @@ psSelectDevice()
|
|||
return TRUE;
|
||||
}
|
||||
|
||||
#ifndef GET_KEYBOARD_INPUT_FROM_X11
|
||||
void keypressCB(GLFWwindow* window, int key, int scancode, int action, int mods);
|
||||
#endif
|
||||
void resizeCB(GLFWwindow* window, int width, int height);
|
||||
void scrollCB(GLFWwindow* window, double xoffset, double yoffset);
|
||||
void cursorCB(GLFWwindow* window, double xpos, double ypos);
|
||||
void cursorEnterCB(GLFWwindow* window, int entered);
|
||||
void windowFocusCB(GLFWwindow* window, int focused);
|
||||
void windowIconifyCB(GLFWwindow* window, int iconified);
|
||||
void joysChangeCB(int jid, int event);
|
||||
|
||||
bool IsThisJoystickBlacklisted(int i)
|
||||
|
@ -930,11 +949,15 @@ void psPostRWinit(void)
|
|||
RwVideoMode vm;
|
||||
RwEngineGetVideoModeInfo(&vm, GcurSelVM);
|
||||
|
||||
#ifndef GET_KEYBOARD_INPUT_FROM_X11
|
||||
glfwSetKeyCallback(PSGLOBAL(window), keypressCB);
|
||||
#endif
|
||||
glfwSetFramebufferSizeCallback(PSGLOBAL(window), resizeCB);
|
||||
glfwSetScrollCallback(PSGLOBAL(window), scrollCB);
|
||||
glfwSetCursorPosCallback(PSGLOBAL(window), cursorCB);
|
||||
glfwSetCursorEnterCallback(PSGLOBAL(window), cursorEnterCB);
|
||||
glfwSetWindowIconifyCallback(PSGLOBAL(window), windowIconifyCB);
|
||||
glfwSetWindowFocusCallback(PSGLOBAL(window), windowFocusCB);
|
||||
glfwSetJoystickCallback(joysChangeCB);
|
||||
|
||||
_InputInitialiseJoys();
|
||||
|
@ -1286,6 +1309,10 @@ void scrollCB(GLFWwindow* window, double xoffset, double yoffset) {
|
|||
PSGLOBAL(mouseWheel) = yoffset;
|
||||
}
|
||||
|
||||
bool lshiftStatus = false;
|
||||
bool rshiftStatus = false;
|
||||
|
||||
#ifndef GET_KEYBOARD_INPUT_FROM_X11
|
||||
int keymap[GLFW_KEY_LAST + 1];
|
||||
|
||||
static void
|
||||
|
@ -1416,9 +1443,6 @@ initkeymap(void)
|
|||
keymap[GLFW_KEY_MENU] = rsNULL;
|
||||
}
|
||||
|
||||
bool lshiftStatus = false;
|
||||
bool rshiftStatus = false;
|
||||
|
||||
void
|
||||
keypressCB(GLFWwindow* window, int key, int scancode, int action, int mods)
|
||||
{
|
||||
|
@ -1436,6 +1460,266 @@ keypressCB(GLFWwindow* window, int key, int scancode, int action, int mods)
|
|||
}
|
||||
}
|
||||
|
||||
#else
|
||||
|
||||
uint32 keymap[512]; // 256 ascii + 256 KeySyms between 0xff00 - 0xffff
|
||||
bool keyStates[512];
|
||||
uint32 keyCodeToKeymapIndex[256]; // cache for physical keys
|
||||
|
||||
#define KEY_MAP_OFFSET (0xff00 - 256)
|
||||
static void
|
||||
initkeymap(void)
|
||||
{
|
||||
Display *display = glfwGetX11Display();
|
||||
int i;
|
||||
|
||||
for (i = 0; i < ARRAY_SIZE(keymap); i++)
|
||||
keymap[i] = rsNULL;
|
||||
|
||||
// You can add new ASCII mappings to here freely (but beware that if right hand side of assignment isn't supported on CFont, it'll be blank/won't work on binding screen)
|
||||
// Right hand side of assigments should always be uppercase counterpart of character
|
||||
keymap[XK_space] = ' ';
|
||||
keymap[XK_apostrophe] = '\'';
|
||||
keymap[XK_ampersand] = '&';
|
||||
keymap[XK_percent] = '%';
|
||||
keymap[XK_dollar] = '$';
|
||||
keymap[XK_comma] = ',';
|
||||
keymap[XK_minus] = '-';
|
||||
keymap[XK_period] = '.';
|
||||
keymap[XK_slash] = '/';
|
||||
keymap[XK_question] = '?';
|
||||
keymap[XK_exclam] = '!';
|
||||
keymap[XK_quotedbl] = '"';
|
||||
keymap[XK_colon] = ':';
|
||||
keymap[XK_semicolon] = ';';
|
||||
keymap[XK_equal] = '=';
|
||||
keymap[XK_bracketleft] = '[';
|
||||
keymap[XK_backslash] = '\\';
|
||||
keymap[XK_bracketright] = ']';
|
||||
keymap[XK_grave] = '`';
|
||||
keymap[XK_0] = '0';
|
||||
keymap[XK_1] = '1';
|
||||
keymap[XK_2] = '2';
|
||||
keymap[XK_3] = '3';
|
||||
keymap[XK_4] = '4';
|
||||
keymap[XK_5] = '5';
|
||||
keymap[XK_6] = '6';
|
||||
keymap[XK_7] = '7';
|
||||
keymap[XK_8] = '8';
|
||||
keymap[XK_9] = '9';
|
||||
keymap[XK_a] = 'A';
|
||||
keymap[XK_b] = 'B';
|
||||
keymap[XK_c] = 'C';
|
||||
keymap[XK_d] = 'D';
|
||||
keymap[XK_e] = 'E';
|
||||
keymap[XK_f] = 'F';
|
||||
keymap[XK_g] = 'G';
|
||||
keymap[XK_h] = 'H';
|
||||
keymap[XK_i] = 'I';
|
||||
keymap[XK_I] = 'I'; // Turkish I problem
|
||||
keymap[XK_j] = 'J';
|
||||
keymap[XK_k] = 'K';
|
||||
keymap[XK_l] = 'L';
|
||||
keymap[XK_m] = 'M';
|
||||
keymap[XK_n] = 'N';
|
||||
keymap[XK_o] = 'O';
|
||||
keymap[XK_p] = 'P';
|
||||
keymap[XK_q] = 'Q';
|
||||
keymap[XK_r] = 'R';
|
||||
keymap[XK_s] = 'S';
|
||||
keymap[XK_t] = 'T';
|
||||
keymap[XK_u] = 'U';
|
||||
keymap[XK_v] = 'V';
|
||||
keymap[XK_w] = 'W';
|
||||
keymap[XK_x] = 'X';
|
||||
keymap[XK_y] = 'Y';
|
||||
keymap[XK_z] = 'Z';
|
||||
|
||||
// Some of regional but ASCII characters that GTA supports
|
||||
keymap[XK_agrave] = 0x00c0;
|
||||
keymap[XK_aacute] = 0x00c1;
|
||||
keymap[XK_acircumflex] = 0x00c2;
|
||||
keymap[XK_adiaeresis] = 0x00c4;
|
||||
|
||||
keymap[XK_ae] = 0x00c6;
|
||||
|
||||
keymap[XK_egrave] = 0x00c8;
|
||||
keymap[XK_eacute] = 0x00c9;
|
||||
keymap[XK_ecircumflex] = 0x00ca;
|
||||
keymap[XK_ediaeresis] = 0x00cb;
|
||||
|
||||
keymap[XK_igrave] = 0x00cc;
|
||||
keymap[XK_iacute] = 0x00cd;
|
||||
keymap[XK_icircumflex] = 0x00ce;
|
||||
keymap[XK_idiaeresis] = 0x00cf;
|
||||
|
||||
keymap[XK_ccedilla] = 0x00c7;
|
||||
keymap[XK_odiaeresis] = 0x00d6;
|
||||
keymap[XK_udiaeresis] = 0x00dc;
|
||||
|
||||
// These are 0xff00 - 0xffff range of KeySym's, and subtracting KEY_MAP_OFFSET is needed
|
||||
keymap[XK_Escape - KEY_MAP_OFFSET] = rsESC;
|
||||
keymap[XK_Return - KEY_MAP_OFFSET] = rsENTER;
|
||||
keymap[XK_Tab - KEY_MAP_OFFSET] = rsTAB;
|
||||
keymap[XK_BackSpace - KEY_MAP_OFFSET] = rsBACKSP;
|
||||
keymap[XK_Insert - KEY_MAP_OFFSET] = rsINS;
|
||||
keymap[XK_Delete - KEY_MAP_OFFSET] = rsDEL;
|
||||
keymap[XK_Right - KEY_MAP_OFFSET] = rsRIGHT;
|
||||
keymap[XK_Left - KEY_MAP_OFFSET] = rsLEFT;
|
||||
keymap[XK_Down - KEY_MAP_OFFSET] = rsDOWN;
|
||||
keymap[XK_Up - KEY_MAP_OFFSET] = rsUP;
|
||||
keymap[XK_Page_Up - KEY_MAP_OFFSET] = rsPGUP;
|
||||
keymap[XK_Page_Down - KEY_MAP_OFFSET] = rsPGDN;
|
||||
keymap[XK_Home - KEY_MAP_OFFSET] = rsHOME;
|
||||
keymap[XK_End - KEY_MAP_OFFSET] = rsEND;
|
||||
keymap[XK_Caps_Lock - KEY_MAP_OFFSET] = rsCAPSLK;
|
||||
keymap[XK_Scroll_Lock - KEY_MAP_OFFSET] = rsSCROLL;
|
||||
keymap[XK_Num_Lock - KEY_MAP_OFFSET] = rsNUMLOCK;
|
||||
keymap[XK_Pause - KEY_MAP_OFFSET] = rsPAUSE;
|
||||
|
||||
keymap[XK_F1 - KEY_MAP_OFFSET] = rsF1;
|
||||
keymap[XK_F2 - KEY_MAP_OFFSET] = rsF2;
|
||||
keymap[XK_F3 - KEY_MAP_OFFSET] = rsF3;
|
||||
keymap[XK_F4 - KEY_MAP_OFFSET] = rsF4;
|
||||
keymap[XK_F5 - KEY_MAP_OFFSET] = rsF5;
|
||||
keymap[XK_F6 - KEY_MAP_OFFSET] = rsF6;
|
||||
keymap[XK_F7 - KEY_MAP_OFFSET] = rsF7;
|
||||
keymap[XK_F8 - KEY_MAP_OFFSET] = rsF8;
|
||||
keymap[XK_F9 - KEY_MAP_OFFSET] = rsF9;
|
||||
keymap[XK_F10 - KEY_MAP_OFFSET] = rsF10;
|
||||
keymap[XK_F11 - KEY_MAP_OFFSET] = rsF11;
|
||||
keymap[XK_F12 - KEY_MAP_OFFSET] = rsF12;
|
||||
keymap[XK_F13 - KEY_MAP_OFFSET] = rsNULL;
|
||||
keymap[XK_F14 - KEY_MAP_OFFSET] = rsNULL;
|
||||
keymap[XK_F15 - KEY_MAP_OFFSET] = rsNULL;
|
||||
keymap[XK_F16 - KEY_MAP_OFFSET] = rsNULL;
|
||||
keymap[XK_F17 - KEY_MAP_OFFSET] = rsNULL;
|
||||
keymap[XK_F18 - KEY_MAP_OFFSET] = rsNULL;
|
||||
keymap[XK_F19 - KEY_MAP_OFFSET] = rsNULL;
|
||||
keymap[XK_F20 - KEY_MAP_OFFSET] = rsNULL;
|
||||
keymap[XK_F21 - KEY_MAP_OFFSET] = rsNULL;
|
||||
keymap[XK_F22 - KEY_MAP_OFFSET] = rsNULL;
|
||||
keymap[XK_F23 - KEY_MAP_OFFSET] = rsNULL;
|
||||
keymap[XK_F24 - KEY_MAP_OFFSET] = rsNULL;
|
||||
keymap[XK_F25 - KEY_MAP_OFFSET] = rsNULL;
|
||||
|
||||
keymap[XK_KP_0 - KEY_MAP_OFFSET] = rsPADINS;
|
||||
keymap[XK_KP_1 - KEY_MAP_OFFSET] = rsPADEND;
|
||||
keymap[XK_KP_2 - KEY_MAP_OFFSET] = rsPADDOWN;
|
||||
keymap[XK_KP_3 - KEY_MAP_OFFSET] = rsPADPGDN;
|
||||
keymap[XK_KP_4 - KEY_MAP_OFFSET] = rsPADLEFT;
|
||||
keymap[XK_KP_5 - KEY_MAP_OFFSET] = rsPAD5;
|
||||
keymap[XK_KP_6 - KEY_MAP_OFFSET] = rsPADRIGHT;
|
||||
keymap[XK_KP_7 - KEY_MAP_OFFSET] = rsPADHOME;
|
||||
keymap[XK_KP_8 - KEY_MAP_OFFSET] = rsPADUP;
|
||||
keymap[XK_KP_9 - KEY_MAP_OFFSET] = rsPADPGUP;
|
||||
keymap[XK_KP_Insert - KEY_MAP_OFFSET] = rsPADINS;
|
||||
keymap[XK_KP_End - KEY_MAP_OFFSET] = rsPADEND;
|
||||
keymap[XK_KP_Down - KEY_MAP_OFFSET] = rsPADDOWN;
|
||||
keymap[XK_KP_Page_Down - KEY_MAP_OFFSET] = rsPADPGDN;
|
||||
keymap[XK_KP_Left - KEY_MAP_OFFSET] = rsPADLEFT;
|
||||
keymap[XK_KP_Begin - KEY_MAP_OFFSET] = rsPAD5;
|
||||
keymap[XK_KP_Right - KEY_MAP_OFFSET] = rsPADRIGHT;
|
||||
keymap[XK_KP_Home - KEY_MAP_OFFSET] = rsPADHOME;
|
||||
keymap[XK_KP_Up - KEY_MAP_OFFSET] = rsPADUP;
|
||||
keymap[XK_KP_Page_Up - KEY_MAP_OFFSET] = rsPADPGUP;
|
||||
|
||||
keymap[XK_KP_Decimal - KEY_MAP_OFFSET] = rsPADDEL;
|
||||
keymap[XK_KP_Divide - KEY_MAP_OFFSET] = rsDIVIDE;
|
||||
keymap[XK_KP_Multiply - KEY_MAP_OFFSET] = rsTIMES;
|
||||
keymap[XK_KP_Subtract - KEY_MAP_OFFSET] = rsMINUS;
|
||||
keymap[XK_KP_Add - KEY_MAP_OFFSET] = rsPLUS;
|
||||
keymap[XK_KP_Enter - KEY_MAP_OFFSET] = rsPADENTER;
|
||||
keymap[XK_KP_Equal - KEY_MAP_OFFSET] = rsNULL;
|
||||
keymap[XK_Shift_L - KEY_MAP_OFFSET] = rsLSHIFT;
|
||||
keymap[XK_Control_L - KEY_MAP_OFFSET] = rsLCTRL;
|
||||
keymap[XK_Alt_L - KEY_MAP_OFFSET] = rsLALT;
|
||||
keymap[XK_Super_L - KEY_MAP_OFFSET] = rsLWIN;
|
||||
keymap[XK_Shift_R - KEY_MAP_OFFSET] = rsRSHIFT;
|
||||
keymap[XK_Control_R - KEY_MAP_OFFSET] = rsRCTRL;
|
||||
keymap[XK_Alt_R - KEY_MAP_OFFSET] = rsRALT;
|
||||
keymap[XK_Super_R - KEY_MAP_OFFSET] = rsRWIN;
|
||||
keymap[XK_Menu - KEY_MAP_OFFSET] = rsNULL;
|
||||
|
||||
// Cache the key codes' key symbol equivelants, otherwise we will have to do it on each frame
|
||||
// KeyCode is always in [0,255], and represents a physical key
|
||||
|
||||
int min_keycode, max_keycode, keysyms_per_keycode;
|
||||
KeySym *keymap, *origkeymap;
|
||||
|
||||
char *keyboardLang = setlocale (LC_CTYPE, NULL);
|
||||
setlocale(LC_CTYPE, "");
|
||||
|
||||
XDisplayKeycodes(display, &min_keycode, &max_keycode);
|
||||
origkeymap = XGetKeyboardMapping(display, min_keycode, (max_keycode - min_keycode + 1), &keysyms_per_keycode);
|
||||
keymap = origkeymap;
|
||||
for (int i = min_keycode; i <= max_keycode; i++) {
|
||||
int j, lastKeysym;
|
||||
|
||||
lastKeysym = keysyms_per_keycode - 1;
|
||||
while ((lastKeysym >= 0) && (keymap[lastKeysym] == NoSymbol))
|
||||
lastKeysym--;
|
||||
|
||||
for (j = 0; j <= lastKeysym; j++) {
|
||||
KeySym ks = keymap[j];
|
||||
|
||||
if (ks == NoSymbol)
|
||||
continue;
|
||||
|
||||
if (ks < 256) {
|
||||
keyCodeToKeymapIndex[i] = ks;
|
||||
break;
|
||||
} else if (ks >= 0xff00 && ks < 0xffff) {
|
||||
keyCodeToKeymapIndex[i] = ks - KEY_MAP_OFFSET;
|
||||
break;
|
||||
}
|
||||
}
|
||||
keymap += keysyms_per_keycode;
|
||||
}
|
||||
XFree(origkeymap);
|
||||
|
||||
setlocale(LC_CTYPE, keyboardLang);
|
||||
}
|
||||
#undef KEY_MAP_OFFSET
|
||||
|
||||
void checkKeyPresses()
|
||||
{
|
||||
Display *display = glfwGetX11Display();
|
||||
char keys[32];
|
||||
XQueryKeymap(display, keys);
|
||||
for (int i = 0; i < sizeof(keys); i++) {
|
||||
for (int j = 0; j < 8; j++) {
|
||||
KeyCode keycode = 8 * i + j;
|
||||
uint32 keymapIndex = keyCodeToKeymapIndex[keycode];
|
||||
if (keymapIndex != 0) {
|
||||
int rsCode = keymap[keymapIndex];
|
||||
if (rsCode == rsNULL)
|
||||
continue;
|
||||
|
||||
bool pressed = WindowFocused && !!(keys[i] & (1 << j));
|
||||
|
||||
// idk why R* does that
|
||||
if (rsCode == rsLSHIFT)
|
||||
lshiftStatus = pressed;
|
||||
else if (rsCode == rsRSHIFT)
|
||||
rshiftStatus = pressed;
|
||||
|
||||
if (keyStates[keymapIndex] != pressed) {
|
||||
if (pressed) {
|
||||
RsKeyboardEventHandler(rsKEYDOWN, &rsCode);
|
||||
} else {
|
||||
RsKeyboardEventHandler(rsKEYUP, &rsCode);
|
||||
}
|
||||
}
|
||||
|
||||
keyStates[keymapIndex] = pressed;
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
}
|
||||
#endif
|
||||
|
||||
// R* calls that in ControllerConfig, idk why
|
||||
void
|
||||
_InputTranslateShiftKeyUpDown(RsKeyCodes *rs) {
|
||||
|
@ -1460,6 +1744,16 @@ cursorEnterCB(GLFWwindow* window, int entered) {
|
|||
PSGLOBAL(cursorIsInWindow) = !!entered;
|
||||
}
|
||||
|
||||
void
|
||||
windowFocusCB(GLFWwindow* window, int focused) {
|
||||
WindowFocused = !!focused;
|
||||
}
|
||||
|
||||
void
|
||||
windowIconifyCB(GLFWwindow* window, int iconified) {
|
||||
WindowIconified = !!iconified;
|
||||
}
|
||||
|
||||
/*
|
||||
*****************************************************************************
|
||||
*/
|
||||
|
@ -1712,6 +2006,9 @@ main(int argc, char *argv[])
|
|||
#endif
|
||||
{
|
||||
glfwPollEvents();
|
||||
#ifdef GET_KEYBOARD_INPUT_FROM_X11
|
||||
checkKeyPresses();
|
||||
#endif
|
||||
#ifndef MASTER
|
||||
if (gbModelViewer) {
|
||||
// This is TheModelViewerCore in LCS, but TheModelViewer on other state-machine III-VCs.
|
||||
|
@ -1849,7 +2146,7 @@ main(int argc, char *argv[])
|
|||
|
||||
case GS_FRONTEND:
|
||||
{
|
||||
if(!glfwGetWindowAttrib(PSGLOBAL(window), GLFW_ICONIFIED))
|
||||
if(!WindowIconified)
|
||||
RsEventHandler(rsFRONTENDIDLE, nil);
|
||||
|
||||
#ifdef PS2_MENU
|
||||
|
|
|
@ -2275,7 +2275,7 @@ WinMain(HINSTANCE instance,
|
|||
case GS_START_UP:
|
||||
{
|
||||
#ifdef NO_MOVIES
|
||||
gGameState = GS_INIT_ONCE;
|
||||
gGameState = gbNoMovies ? GS_INIT_ONCE : GS_INIT_LOGO_MPEG;
|
||||
#else
|
||||
gGameState = GS_INIT_LOGO_MPEG;
|
||||
#endif
|
||||
|
@ -2314,8 +2314,11 @@ WinMain(HINSTANCE instance,
|
|||
|
||||
case GS_INIT_INTRO_MPEG:
|
||||
{
|
||||
#ifndef NO_MOVIES
|
||||
#ifdef NO_MOVIES
|
||||
if (!gbNoMovies)
|
||||
#endif
|
||||
CloseClip();
|
||||
#ifndef FIX_BUGS
|
||||
CoUninitialize();
|
||||
#endif
|
||||
|
||||
|
@ -2351,8 +2354,11 @@ WinMain(HINSTANCE instance,
|
|||
|
||||
case GS_INIT_ONCE:
|
||||
{
|
||||
#ifndef NO_MOVIES
|
||||
#ifdef NO_MOVIES
|
||||
if (!gbNoMovies)
|
||||
#endif
|
||||
CloseClip();
|
||||
#ifndef FIX_BUGS
|
||||
CoUninitialize();
|
||||
#endif
|
||||
|
||||
|
|
|
@ -1,5 +1,6 @@
|
|||
#include "common.h"
|
||||
|
||||
#include "main.h"
|
||||
#include "WeaponEffects.h"
|
||||
#include "TxdStore.h"
|
||||
#include "Sprite.h"
|
||||
|
@ -84,11 +85,15 @@ CWeaponEffects::Render(void)
|
|||
float w, h;
|
||||
if ( CSprite::CalcScreenCoors(gCrossHair.m_vecPos, &pos, &w, &h, true) )
|
||||
{
|
||||
PUSH_RENDERGROUP("CWeaponEffects::Render");
|
||||
|
||||
float recipz = 1.0f / pos.z;
|
||||
CSprite::RenderOneXLUSprite(pos.x, pos.y, pos.z,
|
||||
gCrossHair.m_fSize * w, gCrossHair.m_fSize * h,
|
||||
gCrossHair.m_nRed, gCrossHair.m_nGreen, gCrossHair.m_nBlue, 255,
|
||||
recipz, 255);
|
||||
|
||||
POP_RENDERGROUP();
|
||||
}
|
||||
|
||||
RwRenderStateSet(rwRENDERSTATEVERTEXALPHAENABLE, (void *)FALSE);
|
||||
|
|
|
@ -1 +1 @@
|
|||
Subproject commit 41ae7b9b61c6736b34269df0f0350d1b5bcff4df
|
||||
Subproject commit 8b2caf8f86b4f793d07fbc6b7d0bd4aafd22162f
|
Loading…
Reference in New Issue