mirror of
https://gitlab.com/GaryOderNichts/re3-wiiu.git
synced 2024-11-27 03:24:15 +01:00
sync with upstream
This commit is contained in:
commit
7669b97ac6
4
.gitignore
vendored
4
.gitignore
vendored
@ -348,3 +348,7 @@ healthchecksdb
|
||||
|
||||
# Backup folder for Package Reference Convert tool in Visual Studio 2017
|
||||
MigrationBackup/
|
||||
|
||||
vendor/glew-2.1.0/
|
||||
vendor/glfw-3.3.2.bin.WIN32/
|
||||
vendor/glfw-3.3.2.bin.WIN64/
|
27
.gitmodules
vendored
27
.gitmodules
vendored
@ -1,15 +1,16 @@
|
||||
[submodule "librw"]
|
||||
path = librw
|
||||
url = https://github.com/aap/librw
|
||||
[submodule "opus"]
|
||||
path = opus
|
||||
url = https://github.com/xiph/opus.git
|
||||
branch = master
|
||||
[submodule "opusfile"]
|
||||
path = opusfile
|
||||
url = https://github.com/xiph/opusfile.git
|
||||
branch = master
|
||||
[submodule "ogg"]
|
||||
path = ogg
|
||||
[submodule "vendor/ogg"]
|
||||
path = vendor/ogg
|
||||
url = https://github.com/xiph/ogg.git
|
||||
branch = master
|
||||
[submodule "vendor/opus"]
|
||||
path = vendor/opus
|
||||
url = https://github.com/xiph/opus.git
|
||||
branch = master
|
||||
[submodule "vendor/opusfile"]
|
||||
path = vendor/opusfile
|
||||
url = https://github.com/xiph/opusfile.git
|
||||
branch = master
|
||||
[submodule "vendor/librw"]
|
||||
path = vendor/librw
|
||||
url = https://github.com/aap/librw.git
|
||||
branch = master
|
||||
|
Binary file not shown.
Binary file not shown.
Binary file not shown.
Binary file not shown.
Binary file not shown.
Binary file not shown.
Binary file not shown.
Binary file not shown.
Binary file not shown.
Binary file not shown.
Binary file not shown.
Binary file not shown.
File diff suppressed because it is too large
Load Diff
@ -1,199 +0,0 @@
|
||||
Version 1.0.28 (2017-04-02)
|
||||
* Fix buffer overruns in FLAC and ID3 handling code.
|
||||
* Move to variable length header storage.
|
||||
* Fix detection of Large File Support for 32 bit systems.
|
||||
* Remove large stack allocations in ALAC handling code.
|
||||
* Remove all use of Variable Length Arrays.
|
||||
* Minor bug fixes and improvements.
|
||||
|
||||
Version 1.0.27 (2016-06-19)
|
||||
* Fix an SF_INFO seekable flag regression introduced in 1.0.26.
|
||||
* Fix potential infinite loops on malformed input files.
|
||||
* Add string metadata read/write for CAF and RF64.
|
||||
* Add handling of CUE chunks.
|
||||
* Fix endian-ness issues in PAF files.
|
||||
* Minor bug fixes and improvements.
|
||||
|
||||
Version 1.0.26 (2015-11-22)
|
||||
* Fix for CVE-2014-9496, SD2 buffer read overflow.
|
||||
* Fix for CVE-2014-9756, file_io.c divide by zero.
|
||||
* Fix for CVE-2015-7805, AIFF heap write overflow.
|
||||
* Add support for ALAC encoder in a CAF container.
|
||||
* Add support for Cart chunks in WAV files.
|
||||
* Minor bug fixes and improvements.
|
||||
|
||||
Version 1.0.25 (2011-07-13)
|
||||
* Fix for Secunia Advisory SA45125, heap overflow in PAF file handler.
|
||||
* Accept broken WAV files with blockalign == 0.
|
||||
* Minor bug fixes and improvements.
|
||||
|
||||
Version 1.0.24 (2011-03-23)
|
||||
* WAV files now have an 18 byte u-law and A-law fmt chunk.
|
||||
* Document virtual I/O functionality.
|
||||
* Two new methods rawHandle() and takeOwnership() in sndfile.hh.
|
||||
* AIFF fix for non-zero offset value in SSND chunk.
|
||||
* Minor bug fixes and improvements.
|
||||
|
||||
Version 1.0.23 (2010-10-10)
|
||||
* Add version metadata to Windows DLL.
|
||||
* Add a missing 'inline' to sndfile.hh.
|
||||
* Update docs.
|
||||
* Minor bug fixes and improvements.
|
||||
|
||||
Version 1.0.22 (2010-10-04)
|
||||
* Couple of fixes for SDS file writer.
|
||||
* Fixes arising from static analysis.
|
||||
* Handle FLAC files with ID3 meta data at start of file.
|
||||
* Handle FLAC files which report zero length.
|
||||
* Other minor bug fixes and improvements.
|
||||
|
||||
Version 1.0.21 (2009-12-13)
|
||||
* Add a couple of new binary programs to programs/ dir.
|
||||
* Remove sndfile-jackplay (now in sndfile-tools package).
|
||||
* Add windows only function sf_wchar_open().
|
||||
* Bunch of minor bug fixes.
|
||||
|
||||
Version 1.0.20 (2009-05-14)
|
||||
* Fix potential heap overflow in VOC file parser (Tobias Klein, http://www.trapkit.de/).
|
||||
|
||||
Version 1.0.19 (2009-03-02)
|
||||
* Fix for CVE-2009-0186 (Alin Rad Pop, Secunia Research).
|
||||
* Huge number of minor bug fixes as a result of static analysis.
|
||||
|
||||
Version 1.0.18 (2009-02-07)
|
||||
* Add Ogg/Vorbis support (thanks to John ffitch).
|
||||
* Remove captive FLAC library.
|
||||
* Many new features and bug fixes.
|
||||
* Generate Win32 and Win64 pre-compiled binaries.
|
||||
|
||||
Version 1.0.17 (2006-08-31)
|
||||
* Add sndfile.hh C++ wrapper.
|
||||
* Update Win32 MinGW build instructions.
|
||||
* Minor bug fixes and cleanups.
|
||||
|
||||
Version 1.0.16 (2006-04-30)
|
||||
* Add support for Broadcast (BEXT) chunks in WAV files.
|
||||
* Implement new commands SFC_GET_SIGNAL_MAX and SFC_GET_MAX_ALL_CHANNELS.
|
||||
* Add support for RIFX (big endian WAV variant).
|
||||
* Fix configure script bugs.
|
||||
* Fix bug in INST and MARK chunk writing for AIFF files.
|
||||
|
||||
Version 1.0.15 (2006-03-16)
|
||||
* Fix some ia64 issues.
|
||||
* Fix precompiled DLL.
|
||||
* Minor bug fixes.
|
||||
|
||||
Version 1.0.14 (2006-02-19)
|
||||
* Really fix MinGW compile problems.
|
||||
* Minor bug fixes.
|
||||
|
||||
Version 1.0.13 (2006-01-21)
|
||||
* Fix for MinGW compiler problems.
|
||||
* Allow readin/write of instrument chunks from WAV and AIFF files.
|
||||
* Compile problem fix for Solaris compiler.
|
||||
* Minor cleanups and bug fixes.
|
||||
|
||||
Version 1.0.12 (2005-09-30)
|
||||
* Add support for FLAC and Apple's Core Audio Format (CAF).
|
||||
* Add virtual I/O interface (still needs docs).
|
||||
* Cygwin and other Win32 fixes.
|
||||
* Minor bug fixes and cleanups.
|
||||
|
||||
Version 1.0.11 (2004-11-15)
|
||||
* Add support for SD2 files.
|
||||
* Add read support for loop info in WAV and AIFF files.
|
||||
* Add more tests.
|
||||
* Improve type safety.
|
||||
* Minor optimisations and bug fixes.
|
||||
|
||||
Version 1.0.10 (2004-06-15)
|
||||
* Fix AIFF read/write mode bugs.
|
||||
* Add support for compiling Win32 DLLS using MinGW.
|
||||
* Fix problems resulting in failed compiles with gcc-2.95.
|
||||
* Improve test suite.
|
||||
* Minor bug fixes.
|
||||
|
||||
Version 1.0.9 (2004-03-30)
|
||||
* Add handling of AVR (Audio Visual Research) files.
|
||||
* Improve handling of WAVEFORMATEXTENSIBLE WAV files.
|
||||
* Fix for using pipes on Win32.
|
||||
|
||||
Version 1.0.8 (2004-03-14)
|
||||
* Correct peak chunk handing for files with > 16 tracks.
|
||||
* Fix for WAV files with huge number of CUE chunks.
|
||||
|
||||
Version 1.0.7 (2004-02-25)
|
||||
* Fix clip mode detection on ia64, MIPS and other CPUs.
|
||||
* Fix two MacOSX build problems.
|
||||
|
||||
Version 1.0.6 (2004-02-08)
|
||||
* Added support for native Win32 file access API (Ross Bencina).
|
||||
* New mode to add clippling then a converting from float/double to integer
|
||||
would otherwise wrap around.
|
||||
* Fixed a bug in reading/writing files > 2Gig on Linux, Solaris and others.
|
||||
* Many minor bug fixes.
|
||||
* Other random fixes for Win32.
|
||||
|
||||
Version 1.0.5 (2003-05-03)
|
||||
* Added support for HTK files.
|
||||
* Added new function sf_open_fd() to allow for secure opening of temporary
|
||||
files as well as reading/writing sound files embedded within larger
|
||||
container files.
|
||||
* Added string support for AIFF files.
|
||||
* Minor bug fixes and code cleanups.
|
||||
|
||||
Version 1.0.4 (2003-02-02)
|
||||
* Added suport of PVF and XI files.
|
||||
* Added functionality for setting and retreiving strings from sound files.
|
||||
* Minor code cleanups and bug fixes.
|
||||
|
||||
Version 1.0.3 (2002-12-09)
|
||||
* Minor bug fixes.
|
||||
|
||||
Version 1.0.2 (2002-11-24)
|
||||
* Added support for VOX ADPCM.
|
||||
* Improved error reporting.
|
||||
* Added version scripting on Linux and Solaris.
|
||||
* Minor bug fixes.
|
||||
|
||||
Version 1.0.1 (2002-09-14)
|
||||
* Added MAT and MAT5 file formats.
|
||||
* Minor bug fixes.
|
||||
|
||||
Version 1.0.0 (2002-08-16)
|
||||
* Final release for 1.0.0.
|
||||
|
||||
Version 1.0.0rc6 (2002-08-14)
|
||||
* Release candidate 6 for the 1.0.0 series.
|
||||
* MacOS9 fixes.
|
||||
|
||||
Version 1.0.0rc5 (2002-08-10)
|
||||
* Release candidate 5 for the 1.0.0 series.
|
||||
* Changed the definition of sf_count_t which was causing problems when
|
||||
libsndfile was compiled with other libraries (ie WxWindows).
|
||||
* Minor bug fixes.
|
||||
* Documentation cleanup.
|
||||
|
||||
Version 1.0.0rc4 (2002-08-03)
|
||||
* Release candidate 4 for the 1.0.0 series.
|
||||
* Minor bug fixes.
|
||||
* Fix broken Win32 "make check".
|
||||
|
||||
Version 1.0.0rc3 (2002-08-02)
|
||||
* Release candidate 3 for the 1.0.0 series.
|
||||
* Fix bug where libsndfile was reading beyond the end of the data chunk.
|
||||
* Added on-the-fly header updates on write.
|
||||
* Fix a couple of documentation issues.
|
||||
|
||||
Version 1.0.0rc2 (2002-06-24)
|
||||
* Release candidate 2 for the 1.0.0 series.
|
||||
* Fix compile problem for Win32.
|
||||
|
||||
Version 1.0.0rc1 (2002-06-24)
|
||||
* Release candidate 1 for the 1.0.0 series.
|
||||
|
||||
Version 0.0.28 (2002-04-27)
|
||||
* Last offical release of 0.0.X series of the library.
|
||||
|
||||
Version 0.0.8 (1999-02-16)
|
||||
* First offical release.
|
@ -1,857 +0,0 @@
|
||||
/*
|
||||
** Copyright (C) 1999-2016 Erik de Castro Lopo <erikd@mega-nerd.com>
|
||||
**
|
||||
** This program is free software; you can redistribute it and/or modify
|
||||
** it under the terms of the GNU Lesser General Public License as published by
|
||||
** the Free Software Foundation; either version 2.1 of the License, or
|
||||
** (at your option) any later version.
|
||||
**
|
||||
** This program is distributed in the hope that it will be useful,
|
||||
** but WITHOUT ANY WARRANTY; without even the implied warranty of
|
||||
** MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
|
||||
** GNU Lesser General Public License for more details.
|
||||
**
|
||||
** You should have received a copy of the GNU Lesser General Public License
|
||||
** along with this program; if not, write to the Free Software
|
||||
** Foundation, Inc., 59 Temple Place - Suite 330, Boston, MA 02111-1307, USA.
|
||||
*/
|
||||
|
||||
/*
|
||||
** sndfile.h -- system-wide definitions
|
||||
**
|
||||
** API documentation is in the doc/ directory of the source code tarball
|
||||
** and at http://www.mega-nerd.com/libsndfile/api.html.
|
||||
*/
|
||||
|
||||
#ifndef SNDFILE_H
|
||||
#define SNDFILE_H
|
||||
|
||||
/* This is the version 1.0.X header file. */
|
||||
#define SNDFILE_1
|
||||
|
||||
#include <stdio.h>
|
||||
#include <stdint.h>
|
||||
#include <sys/types.h>
|
||||
|
||||
#ifdef __cplusplus
|
||||
extern "C" {
|
||||
#endif /* __cplusplus */
|
||||
|
||||
/* The following file types can be read and written.
|
||||
** A file type would consist of a major type (ie SF_FORMAT_WAV) bitwise
|
||||
** ORed with a minor type (ie SF_FORMAT_PCM). SF_FORMAT_TYPEMASK and
|
||||
** SF_FORMAT_SUBMASK can be used to separate the major and minor file
|
||||
** types.
|
||||
*/
|
||||
|
||||
enum
|
||||
{ /* Major formats. */
|
||||
SF_FORMAT_WAV = 0x010000, /* Microsoft WAV format (little endian default). */
|
||||
SF_FORMAT_AIFF = 0x020000, /* Apple/SGI AIFF format (big endian). */
|
||||
SF_FORMAT_AU = 0x030000, /* Sun/NeXT AU format (big endian). */
|
||||
SF_FORMAT_RAW = 0x040000, /* RAW PCM data. */
|
||||
SF_FORMAT_PAF = 0x050000, /* Ensoniq PARIS file format. */
|
||||
SF_FORMAT_SVX = 0x060000, /* Amiga IFF / SVX8 / SV16 format. */
|
||||
SF_FORMAT_NIST = 0x070000, /* Sphere NIST format. */
|
||||
SF_FORMAT_VOC = 0x080000, /* VOC files. */
|
||||
SF_FORMAT_IRCAM = 0x0A0000, /* Berkeley/IRCAM/CARL */
|
||||
SF_FORMAT_W64 = 0x0B0000, /* Sonic Foundry's 64 bit RIFF/WAV */
|
||||
SF_FORMAT_MAT4 = 0x0C0000, /* Matlab (tm) V4.2 / GNU Octave 2.0 */
|
||||
SF_FORMAT_MAT5 = 0x0D0000, /* Matlab (tm) V5.0 / GNU Octave 2.1 */
|
||||
SF_FORMAT_PVF = 0x0E0000, /* Portable Voice Format */
|
||||
SF_FORMAT_XI = 0x0F0000, /* Fasttracker 2 Extended Instrument */
|
||||
SF_FORMAT_HTK = 0x100000, /* HMM Tool Kit format */
|
||||
SF_FORMAT_SDS = 0x110000, /* Midi Sample Dump Standard */
|
||||
SF_FORMAT_AVR = 0x120000, /* Audio Visual Research */
|
||||
SF_FORMAT_WAVEX = 0x130000, /* MS WAVE with WAVEFORMATEX */
|
||||
SF_FORMAT_SD2 = 0x160000, /* Sound Designer 2 */
|
||||
SF_FORMAT_FLAC = 0x170000, /* FLAC lossless file format */
|
||||
SF_FORMAT_CAF = 0x180000, /* Core Audio File format */
|
||||
SF_FORMAT_WVE = 0x190000, /* Psion WVE format */
|
||||
SF_FORMAT_OGG = 0x200000, /* Xiph OGG container */
|
||||
SF_FORMAT_MPC2K = 0x210000, /* Akai MPC 2000 sampler */
|
||||
SF_FORMAT_RF64 = 0x220000, /* RF64 WAV file */
|
||||
|
||||
/* Subtypes from here on. */
|
||||
|
||||
SF_FORMAT_PCM_S8 = 0x0001, /* Signed 8 bit data */
|
||||
SF_FORMAT_PCM_16 = 0x0002, /* Signed 16 bit data */
|
||||
SF_FORMAT_PCM_24 = 0x0003, /* Signed 24 bit data */
|
||||
SF_FORMAT_PCM_32 = 0x0004, /* Signed 32 bit data */
|
||||
|
||||
SF_FORMAT_PCM_U8 = 0x0005, /* Unsigned 8 bit data (WAV and RAW only) */
|
||||
|
||||
SF_FORMAT_FLOAT = 0x0006, /* 32 bit float data */
|
||||
SF_FORMAT_DOUBLE = 0x0007, /* 64 bit float data */
|
||||
|
||||
SF_FORMAT_ULAW = 0x0010, /* U-Law encoded. */
|
||||
SF_FORMAT_ALAW = 0x0011, /* A-Law encoded. */
|
||||
SF_FORMAT_IMA_ADPCM = 0x0012, /* IMA ADPCM. */
|
||||
SF_FORMAT_MS_ADPCM = 0x0013, /* Microsoft ADPCM. */
|
||||
|
||||
SF_FORMAT_GSM610 = 0x0020, /* GSM 6.10 encoding. */
|
||||
SF_FORMAT_VOX_ADPCM = 0x0021, /* OKI / Dialogix ADPCM */
|
||||
|
||||
SF_FORMAT_G721_32 = 0x0030, /* 32kbs G721 ADPCM encoding. */
|
||||
SF_FORMAT_G723_24 = 0x0031, /* 24kbs G723 ADPCM encoding. */
|
||||
SF_FORMAT_G723_40 = 0x0032, /* 40kbs G723 ADPCM encoding. */
|
||||
|
||||
SF_FORMAT_DWVW_12 = 0x0040, /* 12 bit Delta Width Variable Word encoding. */
|
||||
SF_FORMAT_DWVW_16 = 0x0041, /* 16 bit Delta Width Variable Word encoding. */
|
||||
SF_FORMAT_DWVW_24 = 0x0042, /* 24 bit Delta Width Variable Word encoding. */
|
||||
SF_FORMAT_DWVW_N = 0x0043, /* N bit Delta Width Variable Word encoding. */
|
||||
|
||||
SF_FORMAT_DPCM_8 = 0x0050, /* 8 bit differential PCM (XI only) */
|
||||
SF_FORMAT_DPCM_16 = 0x0051, /* 16 bit differential PCM (XI only) */
|
||||
|
||||
SF_FORMAT_VORBIS = 0x0060, /* Xiph Vorbis encoding. */
|
||||
|
||||
SF_FORMAT_ALAC_16 = 0x0070, /* Apple Lossless Audio Codec (16 bit). */
|
||||
SF_FORMAT_ALAC_20 = 0x0071, /* Apple Lossless Audio Codec (20 bit). */
|
||||
SF_FORMAT_ALAC_24 = 0x0072, /* Apple Lossless Audio Codec (24 bit). */
|
||||
SF_FORMAT_ALAC_32 = 0x0073, /* Apple Lossless Audio Codec (32 bit). */
|
||||
|
||||
/* Endian-ness options. */
|
||||
|
||||
SF_ENDIAN_FILE = 0x00000000, /* Default file endian-ness. */
|
||||
SF_ENDIAN_LITTLE = 0x10000000, /* Force little endian-ness. */
|
||||
SF_ENDIAN_BIG = 0x20000000, /* Force big endian-ness. */
|
||||
SF_ENDIAN_CPU = 0x30000000, /* Force CPU endian-ness. */
|
||||
|
||||
SF_FORMAT_SUBMASK = 0x0000FFFF,
|
||||
SF_FORMAT_TYPEMASK = 0x0FFF0000,
|
||||
SF_FORMAT_ENDMASK = 0x30000000
|
||||
} ;
|
||||
|
||||
/*
|
||||
** The following are the valid command numbers for the sf_command()
|
||||
** interface. The use of these commands is documented in the file
|
||||
** command.html in the doc directory of the source code distribution.
|
||||
*/
|
||||
|
||||
enum
|
||||
{ SFC_GET_LIB_VERSION = 0x1000,
|
||||
SFC_GET_LOG_INFO = 0x1001,
|
||||
SFC_GET_CURRENT_SF_INFO = 0x1002,
|
||||
|
||||
|
||||
SFC_GET_NORM_DOUBLE = 0x1010,
|
||||
SFC_GET_NORM_FLOAT = 0x1011,
|
||||
SFC_SET_NORM_DOUBLE = 0x1012,
|
||||
SFC_SET_NORM_FLOAT = 0x1013,
|
||||
SFC_SET_SCALE_FLOAT_INT_READ = 0x1014,
|
||||
SFC_SET_SCALE_INT_FLOAT_WRITE = 0x1015,
|
||||
|
||||
SFC_GET_SIMPLE_FORMAT_COUNT = 0x1020,
|
||||
SFC_GET_SIMPLE_FORMAT = 0x1021,
|
||||
|
||||
SFC_GET_FORMAT_INFO = 0x1028,
|
||||
|
||||
SFC_GET_FORMAT_MAJOR_COUNT = 0x1030,
|
||||
SFC_GET_FORMAT_MAJOR = 0x1031,
|
||||
SFC_GET_FORMAT_SUBTYPE_COUNT = 0x1032,
|
||||
SFC_GET_FORMAT_SUBTYPE = 0x1033,
|
||||
|
||||
SFC_CALC_SIGNAL_MAX = 0x1040,
|
||||
SFC_CALC_NORM_SIGNAL_MAX = 0x1041,
|
||||
SFC_CALC_MAX_ALL_CHANNELS = 0x1042,
|
||||
SFC_CALC_NORM_MAX_ALL_CHANNELS = 0x1043,
|
||||
SFC_GET_SIGNAL_MAX = 0x1044,
|
||||
SFC_GET_MAX_ALL_CHANNELS = 0x1045,
|
||||
|
||||
SFC_SET_ADD_PEAK_CHUNK = 0x1050,
|
||||
SFC_SET_ADD_HEADER_PAD_CHUNK = 0x1051,
|
||||
|
||||
SFC_UPDATE_HEADER_NOW = 0x1060,
|
||||
SFC_SET_UPDATE_HEADER_AUTO = 0x1061,
|
||||
|
||||
SFC_FILE_TRUNCATE = 0x1080,
|
||||
|
||||
SFC_SET_RAW_START_OFFSET = 0x1090,
|
||||
|
||||
SFC_SET_DITHER_ON_WRITE = 0x10A0,
|
||||
SFC_SET_DITHER_ON_READ = 0x10A1,
|
||||
|
||||
SFC_GET_DITHER_INFO_COUNT = 0x10A2,
|
||||
SFC_GET_DITHER_INFO = 0x10A3,
|
||||
|
||||
SFC_GET_EMBED_FILE_INFO = 0x10B0,
|
||||
|
||||
SFC_SET_CLIPPING = 0x10C0,
|
||||
SFC_GET_CLIPPING = 0x10C1,
|
||||
|
||||
SFC_GET_CUE_COUNT = 0x10CD,
|
||||
SFC_GET_CUE = 0x10CE,
|
||||
SFC_SET_CUE = 0x10CF,
|
||||
|
||||
SFC_GET_INSTRUMENT = 0x10D0,
|
||||
SFC_SET_INSTRUMENT = 0x10D1,
|
||||
|
||||
SFC_GET_LOOP_INFO = 0x10E0,
|
||||
|
||||
SFC_GET_BROADCAST_INFO = 0x10F0,
|
||||
SFC_SET_BROADCAST_INFO = 0x10F1,
|
||||
|
||||
SFC_GET_CHANNEL_MAP_INFO = 0x1100,
|
||||
SFC_SET_CHANNEL_MAP_INFO = 0x1101,
|
||||
|
||||
SFC_RAW_DATA_NEEDS_ENDSWAP = 0x1110,
|
||||
|
||||
/* Support for Wavex Ambisonics Format */
|
||||
SFC_WAVEX_SET_AMBISONIC = 0x1200,
|
||||
SFC_WAVEX_GET_AMBISONIC = 0x1201,
|
||||
|
||||
/*
|
||||
** RF64 files can be set so that on-close, writable files that have less
|
||||
** than 4GB of data in them are converted to RIFF/WAV, as per EBU
|
||||
** recommendations.
|
||||
*/
|
||||
SFC_RF64_AUTO_DOWNGRADE = 0x1210,
|
||||
|
||||
SFC_SET_VBR_ENCODING_QUALITY = 0x1300,
|
||||
SFC_SET_COMPRESSION_LEVEL = 0x1301,
|
||||
|
||||
/* Cart Chunk support */
|
||||
SFC_SET_CART_INFO = 0x1400,
|
||||
SFC_GET_CART_INFO = 0x1401,
|
||||
|
||||
/* Following commands for testing only. */
|
||||
SFC_TEST_IEEE_FLOAT_REPLACE = 0x6001,
|
||||
|
||||
/*
|
||||
** SFC_SET_ADD_* values are deprecated and will disappear at some
|
||||
** time in the future. They are guaranteed to be here up to and
|
||||
** including version 1.0.8 to avoid breakage of existing software.
|
||||
** They currently do nothing and will continue to do nothing.
|
||||
*/
|
||||
SFC_SET_ADD_DITHER_ON_WRITE = 0x1070,
|
||||
SFC_SET_ADD_DITHER_ON_READ = 0x1071
|
||||
} ;
|
||||
|
||||
|
||||
/*
|
||||
** String types that can be set and read from files. Not all file types
|
||||
** support this and even the file types which support one, may not support
|
||||
** all string types.
|
||||
*/
|
||||
|
||||
enum
|
||||
{ SF_STR_TITLE = 0x01,
|
||||
SF_STR_COPYRIGHT = 0x02,
|
||||
SF_STR_SOFTWARE = 0x03,
|
||||
SF_STR_ARTIST = 0x04,
|
||||
SF_STR_COMMENT = 0x05,
|
||||
SF_STR_DATE = 0x06,
|
||||
SF_STR_ALBUM = 0x07,
|
||||
SF_STR_LICENSE = 0x08,
|
||||
SF_STR_TRACKNUMBER = 0x09,
|
||||
SF_STR_GENRE = 0x10
|
||||
} ;
|
||||
|
||||
/*
|
||||
** Use the following as the start and end index when doing metadata
|
||||
** transcoding.
|
||||
*/
|
||||
|
||||
#define SF_STR_FIRST SF_STR_TITLE
|
||||
#define SF_STR_LAST SF_STR_GENRE
|
||||
|
||||
enum
|
||||
{ /* True and false */
|
||||
SF_FALSE = 0,
|
||||
SF_TRUE = 1,
|
||||
|
||||
/* Modes for opening files. */
|
||||
SFM_READ = 0x10,
|
||||
SFM_WRITE = 0x20,
|
||||
SFM_RDWR = 0x30,
|
||||
|
||||
SF_AMBISONIC_NONE = 0x40,
|
||||
SF_AMBISONIC_B_FORMAT = 0x41
|
||||
} ;
|
||||
|
||||
/* Public error values. These are guaranteed to remain unchanged for the duration
|
||||
** of the library major version number.
|
||||
** There are also a large number of private error numbers which are internal to
|
||||
** the library which can change at any time.
|
||||
*/
|
||||
|
||||
enum
|
||||
{ SF_ERR_NO_ERROR = 0,
|
||||
SF_ERR_UNRECOGNISED_FORMAT = 1,
|
||||
SF_ERR_SYSTEM = 2,
|
||||
SF_ERR_MALFORMED_FILE = 3,
|
||||
SF_ERR_UNSUPPORTED_ENCODING = 4
|
||||
} ;
|
||||
|
||||
|
||||
/* Channel map values (used with SFC_SET/GET_CHANNEL_MAP).
|
||||
*/
|
||||
|
||||
enum
|
||||
{ SF_CHANNEL_MAP_INVALID = 0,
|
||||
SF_CHANNEL_MAP_MONO = 1,
|
||||
SF_CHANNEL_MAP_LEFT, /* Apple calls this 'Left' */
|
||||
SF_CHANNEL_MAP_RIGHT, /* Apple calls this 'Right' */
|
||||
SF_CHANNEL_MAP_CENTER, /* Apple calls this 'Center' */
|
||||
SF_CHANNEL_MAP_FRONT_LEFT,
|
||||
SF_CHANNEL_MAP_FRONT_RIGHT,
|
||||
SF_CHANNEL_MAP_FRONT_CENTER,
|
||||
SF_CHANNEL_MAP_REAR_CENTER, /* Apple calls this 'Center Surround', Msft calls this 'Back Center' */
|
||||
SF_CHANNEL_MAP_REAR_LEFT, /* Apple calls this 'Left Surround', Msft calls this 'Back Left' */
|
||||
SF_CHANNEL_MAP_REAR_RIGHT, /* Apple calls this 'Right Surround', Msft calls this 'Back Right' */
|
||||
SF_CHANNEL_MAP_LFE, /* Apple calls this 'LFEScreen', Msft calls this 'Low Frequency' */
|
||||
SF_CHANNEL_MAP_FRONT_LEFT_OF_CENTER, /* Apple calls this 'Left Center' */
|
||||
SF_CHANNEL_MAP_FRONT_RIGHT_OF_CENTER, /* Apple calls this 'Right Center */
|
||||
SF_CHANNEL_MAP_SIDE_LEFT, /* Apple calls this 'Left Surround Direct' */
|
||||
SF_CHANNEL_MAP_SIDE_RIGHT, /* Apple calls this 'Right Surround Direct' */
|
||||
SF_CHANNEL_MAP_TOP_CENTER, /* Apple calls this 'Top Center Surround' */
|
||||
SF_CHANNEL_MAP_TOP_FRONT_LEFT, /* Apple calls this 'Vertical Height Left' */
|
||||
SF_CHANNEL_MAP_TOP_FRONT_RIGHT, /* Apple calls this 'Vertical Height Right' */
|
||||
SF_CHANNEL_MAP_TOP_FRONT_CENTER, /* Apple calls this 'Vertical Height Center' */
|
||||
SF_CHANNEL_MAP_TOP_REAR_LEFT, /* Apple and MS call this 'Top Back Left' */
|
||||
SF_CHANNEL_MAP_TOP_REAR_RIGHT, /* Apple and MS call this 'Top Back Right' */
|
||||
SF_CHANNEL_MAP_TOP_REAR_CENTER, /* Apple and MS call this 'Top Back Center' */
|
||||
|
||||
SF_CHANNEL_MAP_AMBISONIC_B_W,
|
||||
SF_CHANNEL_MAP_AMBISONIC_B_X,
|
||||
SF_CHANNEL_MAP_AMBISONIC_B_Y,
|
||||
SF_CHANNEL_MAP_AMBISONIC_B_Z,
|
||||
|
||||
SF_CHANNEL_MAP_MAX
|
||||
} ;
|
||||
|
||||
|
||||
/* A SNDFILE* pointer can be passed around much like stdio.h's FILE* pointer. */
|
||||
|
||||
typedef struct SNDFILE_tag SNDFILE ;
|
||||
|
||||
/* The following typedef is system specific and is defined when libsndfile is
|
||||
** compiled. sf_count_t will be a 64 bit value when the underlying OS allows
|
||||
** 64 bit file offsets.
|
||||
** On windows, we need to allow the same header file to be compiler by both GCC
|
||||
** and the Microsoft compiler.
|
||||
*/
|
||||
|
||||
#if (defined (_MSCVER) || defined (_MSC_VER) && (_MSC_VER < 1310))
|
||||
typedef __int64 sf_count_t ;
|
||||
#define SF_COUNT_MAX 0x7fffffffffffffffi64
|
||||
#else
|
||||
typedef __int64 sf_count_t ;
|
||||
#define SF_COUNT_MAX 0x7FFFFFFFFFFFFFFFLL
|
||||
#endif
|
||||
|
||||
|
||||
/* A pointer to a SF_INFO structure is passed to sf_open () and filled in.
|
||||
** On write, the SF_INFO structure is filled in by the user and passed into
|
||||
** sf_open ().
|
||||
*/
|
||||
|
||||
struct SF_INFO
|
||||
{ sf_count_t frames ; /* Used to be called samples. Changed to avoid confusion. */
|
||||
int samplerate ;
|
||||
int channels ;
|
||||
int format ;
|
||||
int sections ;
|
||||
int seekable ;
|
||||
} ;
|
||||
|
||||
typedef struct SF_INFO SF_INFO ;
|
||||
|
||||
/* The SF_FORMAT_INFO struct is used to retrieve information about the sound
|
||||
** file formats libsndfile supports using the sf_command () interface.
|
||||
**
|
||||
** Using this interface will allow applications to support new file formats
|
||||
** and encoding types when libsndfile is upgraded, without requiring
|
||||
** re-compilation of the application.
|
||||
**
|
||||
** Please consult the libsndfile documentation (particularly the information
|
||||
** on the sf_command () interface) for examples of its use.
|
||||
*/
|
||||
|
||||
typedef struct
|
||||
{ int format ;
|
||||
const char *name ;
|
||||
const char *extension ;
|
||||
} SF_FORMAT_INFO ;
|
||||
|
||||
/*
|
||||
** Enums and typedefs for adding dither on read and write.
|
||||
** See the html documentation for sf_command(), SFC_SET_DITHER_ON_WRITE
|
||||
** and SFC_SET_DITHER_ON_READ.
|
||||
*/
|
||||
|
||||
enum
|
||||
{ SFD_DEFAULT_LEVEL = 0,
|
||||
SFD_CUSTOM_LEVEL = 0x40000000,
|
||||
|
||||
SFD_NO_DITHER = 500,
|
||||
SFD_WHITE = 501,
|
||||
SFD_TRIANGULAR_PDF = 502
|
||||
} ;
|
||||
|
||||
typedef struct
|
||||
{ int type ;
|
||||
double level ;
|
||||
const char *name ;
|
||||
} SF_DITHER_INFO ;
|
||||
|
||||
/* Struct used to retrieve information about a file embedded within a
|
||||
** larger file. See SFC_GET_EMBED_FILE_INFO.
|
||||
*/
|
||||
|
||||
typedef struct
|
||||
{ sf_count_t offset ;
|
||||
sf_count_t length ;
|
||||
} SF_EMBED_FILE_INFO ;
|
||||
|
||||
/*
|
||||
** Struct used to retrieve cue marker information from a file
|
||||
*/
|
||||
|
||||
typedef struct
|
||||
{ int32_t indx ;
|
||||
uint32_t position ;
|
||||
int32_t fcc_chunk ;
|
||||
int32_t chunk_start ;
|
||||
int32_t block_start ;
|
||||
uint32_t sample_offset ;
|
||||
char name [256] ;
|
||||
} SF_CUE_POINT ;
|
||||
|
||||
#define SF_CUES_VAR(count) \
|
||||
struct \
|
||||
{ uint32_t cue_count ; \
|
||||
SF_CUE_POINT cue_points [count] ; \
|
||||
}
|
||||
|
||||
typedef SF_CUES_VAR (100) SF_CUES ;
|
||||
|
||||
/*
|
||||
** Structs used to retrieve music sample information from a file.
|
||||
*/
|
||||
|
||||
enum
|
||||
{ /*
|
||||
** The loop mode field in SF_INSTRUMENT will be one of the following.
|
||||
*/
|
||||
SF_LOOP_NONE = 800,
|
||||
SF_LOOP_FORWARD,
|
||||
SF_LOOP_BACKWARD,
|
||||
SF_LOOP_ALTERNATING
|
||||
} ;
|
||||
|
||||
typedef struct
|
||||
{ int gain ;
|
||||
char basenote, detune ;
|
||||
char velocity_lo, velocity_hi ;
|
||||
char key_lo, key_hi ;
|
||||
int loop_count ;
|
||||
|
||||
struct
|
||||
{ int mode ;
|
||||
uint32_t start ;
|
||||
uint32_t end ;
|
||||
uint32_t count ;
|
||||
} loops [16] ; /* make variable in a sensible way */
|
||||
} SF_INSTRUMENT ;
|
||||
|
||||
|
||||
|
||||
/* Struct used to retrieve loop information from a file.*/
|
||||
typedef struct
|
||||
{
|
||||
short time_sig_num ; /* any positive integer > 0 */
|
||||
short time_sig_den ; /* any positive power of 2 > 0 */
|
||||
int loop_mode ; /* see SF_LOOP enum */
|
||||
|
||||
int num_beats ; /* this is NOT the amount of quarter notes !!!*/
|
||||
/* a full bar of 4/4 is 4 beats */
|
||||
/* a full bar of 7/8 is 7 beats */
|
||||
|
||||
float bpm ; /* suggestion, as it can be calculated using other fields:*/
|
||||
/* file's length, file's sampleRate and our time_sig_den*/
|
||||
/* -> bpms are always the amount of _quarter notes_ per minute */
|
||||
|
||||
int root_key ; /* MIDI note, or -1 for None */
|
||||
int future [6] ;
|
||||
} SF_LOOP_INFO ;
|
||||
|
||||
|
||||
/* Struct used to retrieve broadcast (EBU) information from a file.
|
||||
** Strongly (!) based on EBU "bext" chunk format used in Broadcast WAVE.
|
||||
*/
|
||||
#define SF_BROADCAST_INFO_VAR(coding_hist_size) \
|
||||
struct \
|
||||
{ char description [256] ; \
|
||||
char originator [32] ; \
|
||||
char originator_reference [32] ; \
|
||||
char origination_date [10] ; \
|
||||
char origination_time [8] ; \
|
||||
uint32_t time_reference_low ; \
|
||||
uint32_t time_reference_high ; \
|
||||
short version ; \
|
||||
char umid [64] ; \
|
||||
char reserved [190] ; \
|
||||
uint32_t coding_history_size ; \
|
||||
char coding_history [coding_hist_size] ; \
|
||||
}
|
||||
|
||||
/* SF_BROADCAST_INFO is the above struct with coding_history field of 256 bytes. */
|
||||
typedef SF_BROADCAST_INFO_VAR (256) SF_BROADCAST_INFO ;
|
||||
|
||||
struct SF_CART_TIMER
|
||||
{ char usage [4] ;
|
||||
int32_t value ;
|
||||
} ;
|
||||
|
||||
typedef struct SF_CART_TIMER SF_CART_TIMER ;
|
||||
|
||||
#define SF_CART_INFO_VAR(p_tag_text_size) \
|
||||
struct \
|
||||
{ char version [4] ; \
|
||||
char title [64] ; \
|
||||
char artist [64] ; \
|
||||
char cut_id [64] ; \
|
||||
char client_id [64] ; \
|
||||
char category [64] ; \
|
||||
char classification [64] ; \
|
||||
char out_cue [64] ; \
|
||||
char start_date [10] ; \
|
||||
char start_time [8] ; \
|
||||
char end_date [10] ; \
|
||||
char end_time [8] ; \
|
||||
char producer_app_id [64] ; \
|
||||
char producer_app_version [64] ; \
|
||||
char user_def [64] ; \
|
||||
int32_t level_reference ; \
|
||||
SF_CART_TIMER post_timers [8] ; \
|
||||
char reserved [276] ; \
|
||||
char url [1024] ; \
|
||||
uint32_t tag_text_size ; \
|
||||
char tag_text [p_tag_text_size] ; \
|
||||
}
|
||||
|
||||
typedef SF_CART_INFO_VAR (256) SF_CART_INFO ;
|
||||
|
||||
/* Virtual I/O functionality. */
|
||||
|
||||
typedef sf_count_t (*sf_vio_get_filelen) (void *user_data) ;
|
||||
typedef sf_count_t (*sf_vio_seek) (sf_count_t offset, int whence, void *user_data) ;
|
||||
typedef sf_count_t (*sf_vio_read) (void *ptr, sf_count_t count, void *user_data) ;
|
||||
typedef sf_count_t (*sf_vio_write) (const void *ptr, sf_count_t count, void *user_data) ;
|
||||
typedef sf_count_t (*sf_vio_tell) (void *user_data) ;
|
||||
|
||||
struct SF_VIRTUAL_IO
|
||||
{ sf_vio_get_filelen get_filelen ;
|
||||
sf_vio_seek seek ;
|
||||
sf_vio_read read ;
|
||||
sf_vio_write write ;
|
||||
sf_vio_tell tell ;
|
||||
} ;
|
||||
|
||||
typedef struct SF_VIRTUAL_IO SF_VIRTUAL_IO ;
|
||||
|
||||
|
||||
/* Open the specified file for read, write or both. On error, this will
|
||||
** return a NULL pointer. To find the error number, pass a NULL SNDFILE
|
||||
** to sf_strerror ().
|
||||
** All calls to sf_open() should be matched with a call to sf_close().
|
||||
*/
|
||||
|
||||
SNDFILE* sf_open (const char *path, int mode, SF_INFO *sfinfo) ;
|
||||
|
||||
|
||||
/* Use the existing file descriptor to create a SNDFILE object. If close_desc
|
||||
** is TRUE, the file descriptor will be closed when sf_close() is called. If
|
||||
** it is FALSE, the descriptor will not be closed.
|
||||
** When passed a descriptor like this, the library will assume that the start
|
||||
** of file header is at the current file offset. This allows sound files within
|
||||
** larger container files to be read and/or written.
|
||||
** On error, this will return a NULL pointer. To find the error number, pass a
|
||||
** NULL SNDFILE to sf_strerror ().
|
||||
** All calls to sf_open_fd() should be matched with a call to sf_close().
|
||||
|
||||
*/
|
||||
|
||||
SNDFILE* sf_open_fd (int fd, int mode, SF_INFO *sfinfo, int close_desc) ;
|
||||
|
||||
SNDFILE* sf_open_virtual (SF_VIRTUAL_IO *sfvirtual, int mode, SF_INFO *sfinfo, void *user_data) ;
|
||||
|
||||
|
||||
/* sf_error () returns a error number which can be translated to a text
|
||||
** string using sf_error_number().
|
||||
*/
|
||||
|
||||
int sf_error (SNDFILE *sndfile) ;
|
||||
|
||||
|
||||
/* sf_strerror () returns to the caller a pointer to the current error message for
|
||||
** the given SNDFILE.
|
||||
*/
|
||||
|
||||
const char* sf_strerror (SNDFILE *sndfile) ;
|
||||
|
||||
|
||||
/* sf_error_number () allows the retrieval of the error string for each internal
|
||||
** error number.
|
||||
**
|
||||
*/
|
||||
|
||||
const char* sf_error_number (int errnum) ;
|
||||
|
||||
|
||||
/* The following two error functions are deprecated but they will remain in the
|
||||
** library for the foreseeable future. The function sf_strerror() should be used
|
||||
** in their place.
|
||||
*/
|
||||
|
||||
int sf_perror (SNDFILE *sndfile) ;
|
||||
int sf_error_str (SNDFILE *sndfile, char* str, size_t len) ;
|
||||
|
||||
|
||||
/* Return TRUE if fields of the SF_INFO struct are a valid combination of values. */
|
||||
|
||||
int sf_command (SNDFILE *sndfile, int command, void *data, int datasize) ;
|
||||
|
||||
|
||||
/* Return TRUE if fields of the SF_INFO struct are a valid combination of values. */
|
||||
|
||||
int sf_format_check (const SF_INFO *info) ;
|
||||
|
||||
|
||||
/* Seek within the waveform data chunk of the SNDFILE. sf_seek () uses
|
||||
** the same values for whence (SEEK_SET, SEEK_CUR and SEEK_END) as
|
||||
** stdio.h function fseek ().
|
||||
** An offset of zero with whence set to SEEK_SET will position the
|
||||
** read / write pointer to the first data sample.
|
||||
** On success sf_seek returns the current position in (multi-channel)
|
||||
** samples from the start of the file.
|
||||
** Please see the libsndfile documentation for moving the read pointer
|
||||
** separately from the write pointer on files open in mode SFM_RDWR.
|
||||
** On error all of these functions return -1.
|
||||
*/
|
||||
|
||||
enum
|
||||
{ SF_SEEK_SET = SEEK_SET,
|
||||
SF_SEEK_CUR = SEEK_CUR,
|
||||
SF_SEEK_END = SEEK_END
|
||||
} ;
|
||||
|
||||
sf_count_t sf_seek (SNDFILE *sndfile, sf_count_t frames, int whence) ;
|
||||
|
||||
|
||||
/* Functions for retrieving and setting string data within sound files.
|
||||
** Not all file types support this features; AIFF and WAV do. For both
|
||||
** functions, the str_type parameter must be one of the SF_STR_* values
|
||||
** defined above.
|
||||
** On error, sf_set_string() returns non-zero while sf_get_string()
|
||||
** returns NULL.
|
||||
*/
|
||||
|
||||
int sf_set_string (SNDFILE *sndfile, int str_type, const char* str) ;
|
||||
|
||||
const char* sf_get_string (SNDFILE *sndfile, int str_type) ;
|
||||
|
||||
|
||||
/* Return the library version string. */
|
||||
|
||||
const char * sf_version_string (void) ;
|
||||
|
||||
/* Return the current byterate at this point in the file. The byte rate in this
|
||||
** case is the number of bytes per second of audio data. For instance, for a
|
||||
** stereo, 18 bit PCM encoded file with an 16kHz sample rate, the byte rate
|
||||
** would be 2 (stereo) * 2 (two bytes per sample) * 16000 => 64000 bytes/sec.
|
||||
** For some file formats the returned value will be accurate and exact, for some
|
||||
** it will be a close approximation, for some it will be the average bitrate for
|
||||
** the whole file and for some it will be a time varying value that was accurate
|
||||
** when the file was most recently read or written.
|
||||
** To get the bitrate, multiple this value by 8.
|
||||
** Returns -1 for unknown.
|
||||
*/
|
||||
int sf_current_byterate (SNDFILE *sndfile) ;
|
||||
|
||||
/* Functions for reading/writing the waveform data of a sound file.
|
||||
*/
|
||||
|
||||
sf_count_t sf_read_raw (SNDFILE *sndfile, void *ptr, sf_count_t bytes) ;
|
||||
sf_count_t sf_write_raw (SNDFILE *sndfile, const void *ptr, sf_count_t bytes) ;
|
||||
|
||||
|
||||
/* Functions for reading and writing the data chunk in terms of frames.
|
||||
** The number of items actually read/written = frames * number of channels.
|
||||
** sf_xxxx_raw read/writes the raw data bytes from/to the file
|
||||
** sf_xxxx_short passes data in the native short format
|
||||
** sf_xxxx_int passes data in the native int format
|
||||
** sf_xxxx_float passes data in the native float format
|
||||
** sf_xxxx_double passes data in the native double format
|
||||
** All of these read/write function return number of frames read/written.
|
||||
*/
|
||||
|
||||
sf_count_t sf_readf_short (SNDFILE *sndfile, short *ptr, sf_count_t frames) ;
|
||||
sf_count_t sf_writef_short (SNDFILE *sndfile, const short *ptr, sf_count_t frames) ;
|
||||
|
||||
sf_count_t sf_readf_int (SNDFILE *sndfile, int *ptr, sf_count_t frames) ;
|
||||
sf_count_t sf_writef_int (SNDFILE *sndfile, const int *ptr, sf_count_t frames) ;
|
||||
|
||||
sf_count_t sf_readf_float (SNDFILE *sndfile, float *ptr, sf_count_t frames) ;
|
||||
sf_count_t sf_writef_float (SNDFILE *sndfile, const float *ptr, sf_count_t frames) ;
|
||||
|
||||
sf_count_t sf_readf_double (SNDFILE *sndfile, double *ptr, sf_count_t frames) ;
|
||||
sf_count_t sf_writef_double (SNDFILE *sndfile, const double *ptr, sf_count_t frames) ;
|
||||
|
||||
|
||||
/* Functions for reading and writing the data chunk in terms of items.
|
||||
** Otherwise similar to above.
|
||||
** All of these read/write function return number of items read/written.
|
||||
*/
|
||||
|
||||
sf_count_t sf_read_short (SNDFILE *sndfile, short *ptr, sf_count_t items) ;
|
||||
sf_count_t sf_write_short (SNDFILE *sndfile, const short *ptr, sf_count_t items) ;
|
||||
|
||||
sf_count_t sf_read_int (SNDFILE *sndfile, int *ptr, sf_count_t items) ;
|
||||
sf_count_t sf_write_int (SNDFILE *sndfile, const int *ptr, sf_count_t items) ;
|
||||
|
||||
sf_count_t sf_read_float (SNDFILE *sndfile, float *ptr, sf_count_t items) ;
|
||||
sf_count_t sf_write_float (SNDFILE *sndfile, const float *ptr, sf_count_t items) ;
|
||||
|
||||
sf_count_t sf_read_double (SNDFILE *sndfile, double *ptr, sf_count_t items) ;
|
||||
sf_count_t sf_write_double (SNDFILE *sndfile, const double *ptr, sf_count_t items) ;
|
||||
|
||||
|
||||
/* Close the SNDFILE and clean up all memory allocations associated with this
|
||||
** file.
|
||||
** Returns 0 on success, or an error number.
|
||||
*/
|
||||
|
||||
int sf_close (SNDFILE *sndfile) ;
|
||||
|
||||
|
||||
/* If the file is opened SFM_WRITE or SFM_RDWR, call fsync() on the file
|
||||
** to force the writing of data to disk. If the file is opened SFM_READ
|
||||
** no action is taken.
|
||||
*/
|
||||
|
||||
void sf_write_sync (SNDFILE *sndfile) ;
|
||||
|
||||
|
||||
|
||||
/* The function sf_wchar_open() is Windows Only!
|
||||
** Open a file passing in a Windows Unicode filename. Otherwise, this is
|
||||
** the same as sf_open().
|
||||
**
|
||||
** In order for this to work, you need to do the following:
|
||||
**
|
||||
** #include <windows.h>
|
||||
** #define ENABLE_SNDFILE_WINDOWS_PROTOTYPES 1
|
||||
** #including <sndfile.h>
|
||||
*/
|
||||
|
||||
#if (defined (ENABLE_SNDFILE_WINDOWS_PROTOTYPES) && ENABLE_SNDFILE_WINDOWS_PROTOTYPES)
|
||||
SNDFILE* sf_wchar_open (LPCWSTR wpath, int mode, SF_INFO *sfinfo) ;
|
||||
#endif
|
||||
|
||||
|
||||
|
||||
|
||||
/* Getting and setting of chunks from within a sound file.
|
||||
**
|
||||
** These functions allow the getting and setting of chunks within a sound file
|
||||
** (for those formats which allow it).
|
||||
**
|
||||
** These functions fail safely. Specifically, they will not allow you to overwrite
|
||||
** existing chunks or add extra versions of format specific reserved chunks but
|
||||
** should allow you to retrieve any and all chunks (may not be implemented for
|
||||
** all chunks or all file formats).
|
||||
*/
|
||||
|
||||
struct SF_CHUNK_INFO
|
||||
{ char id [64] ; /* The chunk identifier. */
|
||||
unsigned id_size ; /* The size of the chunk identifier. */
|
||||
unsigned datalen ; /* The size of that data. */
|
||||
void *data ; /* Pointer to the data. */
|
||||
} ;
|
||||
|
||||
typedef struct SF_CHUNK_INFO SF_CHUNK_INFO ;
|
||||
|
||||
/* Set the specified chunk info (must be done before any audio data is written
|
||||
** to the file). This will fail for format specific reserved chunks.
|
||||
** The chunk_info->data pointer must be valid until the file is closed.
|
||||
** Returns SF_ERR_NO_ERROR on success or non-zero on failure.
|
||||
*/
|
||||
int sf_set_chunk (SNDFILE * sndfile, const SF_CHUNK_INFO * chunk_info) ;
|
||||
|
||||
/*
|
||||
** An opaque structure to an iterator over the all chunks of a given id
|
||||
*/
|
||||
typedef struct SF_CHUNK_ITERATOR SF_CHUNK_ITERATOR ;
|
||||
|
||||
/* Get an iterator for all chunks matching chunk_info.
|
||||
** The iterator will point to the first chunk matching chunk_info.
|
||||
** Chunks are matching, if (chunk_info->id) matches the first
|
||||
** (chunk_info->id_size) bytes of a chunk found in the SNDFILE* handle.
|
||||
** If chunk_info is NULL, an iterator to all chunks in the SNDFILE* handle
|
||||
** is returned.
|
||||
** The values of chunk_info->datalen and chunk_info->data are ignored.
|
||||
** If no matching chunks are found in the sndfile, NULL is returned.
|
||||
** The returned iterator will stay valid until one of the following occurs:
|
||||
** a) The sndfile is closed.
|
||||
** b) A new chunk is added using sf_set_chunk().
|
||||
** c) Another chunk iterator function is called on the same SNDFILE* handle
|
||||
** that causes the iterator to be modified.
|
||||
** The memory for the iterator belongs to the SNDFILE* handle and is freed when
|
||||
** sf_close() is called.
|
||||
*/
|
||||
SF_CHUNK_ITERATOR *
|
||||
sf_get_chunk_iterator (SNDFILE * sndfile, const SF_CHUNK_INFO * chunk_info) ;
|
||||
|
||||
/* Iterate through chunks by incrementing the iterator.
|
||||
** Increments the iterator and returns a handle to the new one.
|
||||
** After this call, iterator will no longer be valid, and you must use the
|
||||
** newly returned handle from now on.
|
||||
** The returned handle can be used to access the next chunk matching
|
||||
** the criteria as defined in sf_get_chunk_iterator().
|
||||
** If iterator points to the last chunk, this will free all resources
|
||||
** associated with iterator and return NULL.
|
||||
** The returned iterator will stay valid until sf_get_chunk_iterator_next
|
||||
** is called again, the sndfile is closed or a new chunk us added.
|
||||
*/
|
||||
SF_CHUNK_ITERATOR *
|
||||
sf_next_chunk_iterator (SF_CHUNK_ITERATOR * iterator) ;
|
||||
|
||||
|
||||
/* Get the size of the specified chunk.
|
||||
** If the specified chunk exists, the size will be returned in the
|
||||
** datalen field of the SF_CHUNK_INFO struct.
|
||||
** Additionally, the id of the chunk will be copied to the id
|
||||
** field of the SF_CHUNK_INFO struct and it's id_size field will
|
||||
** be updated accordingly.
|
||||
** If the chunk doesn't exist chunk_info->datalen will be zero, and the
|
||||
** id and id_size fields will be undefined.
|
||||
** The function will return SF_ERR_NO_ERROR on success or non-zero on
|
||||
** failure.
|
||||
*/
|
||||
int
|
||||
sf_get_chunk_size (const SF_CHUNK_ITERATOR * it, SF_CHUNK_INFO * chunk_info) ;
|
||||
|
||||
/* Get the specified chunk data.
|
||||
** If the specified chunk exists, up to chunk_info->datalen bytes of
|
||||
** the chunk data will be copied into the chunk_info->data buffer
|
||||
** (allocated by the caller) and the chunk_info->datalen field
|
||||
** updated to reflect the size of the data. The id and id_size
|
||||
** field will be updated according to the retrieved chunk
|
||||
** If the chunk doesn't exist chunk_info->datalen will be zero, and the
|
||||
** id and id_size fields will be undefined.
|
||||
** The function will return SF_ERR_NO_ERROR on success or non-zero on
|
||||
** failure.
|
||||
*/
|
||||
int
|
||||
sf_get_chunk_data (const SF_CHUNK_ITERATOR * it, SF_CHUNK_INFO * chunk_info) ;
|
||||
|
||||
|
||||
#ifdef __cplusplus
|
||||
} /* extern "C" */
|
||||
#endif /* __cplusplus */
|
||||
|
||||
#endif /* SNDFILE_H */
|
||||
|
@ -1,446 +0,0 @@
|
||||
/*
|
||||
** Copyright (C) 2005-2012 Erik de Castro Lopo <erikd@mega-nerd.com>
|
||||
**
|
||||
** All rights reserved.
|
||||
**
|
||||
** Redistribution and use in source and binary forms, with or without
|
||||
** modification, are permitted provided that the following conditions are
|
||||
** met:
|
||||
**
|
||||
** * Redistributions of source code must retain the above copyright
|
||||
** notice, this list of conditions and the following disclaimer.
|
||||
** * Redistributions in binary form must reproduce the above copyright
|
||||
** notice, this list of conditions and the following disclaimer in
|
||||
** the documentation and/or other materials provided with the
|
||||
** distribution.
|
||||
** * Neither the author nor the names of any contributors may be used
|
||||
** to endorse or promote products derived from this software without
|
||||
** specific prior written permission.
|
||||
**
|
||||
** THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS
|
||||
** "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED
|
||||
** TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR
|
||||
** PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT OWNER OR
|
||||
** CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL,
|
||||
** EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO,
|
||||
** PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS;
|
||||
** OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY,
|
||||
** WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR
|
||||
** OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF
|
||||
** ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
|
||||
*/
|
||||
|
||||
/*
|
||||
** The above modified BSD style license (GPL and LGPL compatible) applies to
|
||||
** this file. It does not apply to libsndfile itself which is released under
|
||||
** the GNU LGPL or the libsndfile test suite which is released under the GNU
|
||||
** GPL.
|
||||
** This means that this header file can be used under this modified BSD style
|
||||
** license, but the LGPL still holds for the libsndfile library itself.
|
||||
*/
|
||||
|
||||
/*
|
||||
** sndfile.hh -- A lightweight C++ wrapper for the libsndfile API.
|
||||
**
|
||||
** All the methods are inlines and all functionality is contained in this
|
||||
** file. There is no separate implementation file.
|
||||
**
|
||||
** API documentation is in the doc/ directory of the source code tarball
|
||||
** and at http://www.mega-nerd.com/libsndfile/api.html.
|
||||
*/
|
||||
|
||||
#ifndef SNDFILE_HH
|
||||
#define SNDFILE_HH
|
||||
|
||||
#include <sndfile.h>
|
||||
|
||||
#include <string>
|
||||
#include <new> // for std::nothrow
|
||||
|
||||
class SndfileHandle
|
||||
{ private :
|
||||
struct SNDFILE_ref
|
||||
{ SNDFILE_ref (void) ;
|
||||
~SNDFILE_ref (void) ;
|
||||
|
||||
SNDFILE *sf ;
|
||||
SF_INFO sfinfo ;
|
||||
int ref ;
|
||||
} ;
|
||||
|
||||
SNDFILE_ref *p ;
|
||||
|
||||
public :
|
||||
/* Default constructor */
|
||||
SndfileHandle (void) : p (NULL) {} ;
|
||||
SndfileHandle (const char *path, int mode = SFM_READ,
|
||||
int format = 0, int channels = 0, int samplerate = 0) ;
|
||||
SndfileHandle (std::string const & path, int mode = SFM_READ,
|
||||
int format = 0, int channels = 0, int samplerate = 0) ;
|
||||
SndfileHandle (int fd, bool close_desc, int mode = SFM_READ,
|
||||
int format = 0, int channels = 0, int samplerate = 0) ;
|
||||
SndfileHandle (SF_VIRTUAL_IO &sfvirtual, void *user_data, int mode = SFM_READ,
|
||||
int format = 0, int channels = 0, int samplerate = 0) ;
|
||||
|
||||
#ifdef ENABLE_SNDFILE_WINDOWS_PROTOTYPES
|
||||
SndfileHandle (LPCWSTR wpath, int mode = SFM_READ,
|
||||
int format = 0, int channels = 0, int samplerate = 0) ;
|
||||
#endif
|
||||
|
||||
~SndfileHandle (void) ;
|
||||
|
||||
SndfileHandle (const SndfileHandle &orig) ;
|
||||
SndfileHandle & operator = (const SndfileHandle &rhs) ;
|
||||
|
||||
/* Mainly for debugging/testing. */
|
||||
int refCount (void) const { return (p == NULL) ? 0 : p->ref ; }
|
||||
|
||||
operator bool () const { return (p != NULL) ; }
|
||||
|
||||
bool operator == (const SndfileHandle &rhs) const { return (p == rhs.p) ; }
|
||||
|
||||
sf_count_t frames (void) const { return p ? p->sfinfo.frames : 0 ; }
|
||||
int format (void) const { return p ? p->sfinfo.format : 0 ; }
|
||||
int channels (void) const { return p ? p->sfinfo.channels : 0 ; }
|
||||
int samplerate (void) const { return p ? p->sfinfo.samplerate : 0 ; }
|
||||
|
||||
int error (void) const ;
|
||||
const char * strError (void) const ;
|
||||
|
||||
int command (int cmd, void *data, int datasize) ;
|
||||
|
||||
sf_count_t seek (sf_count_t frames, int whence) ;
|
||||
|
||||
void writeSync (void) ;
|
||||
|
||||
int setString (int str_type, const char* str) ;
|
||||
|
||||
const char* getString (int str_type) const ;
|
||||
|
||||
static int formatCheck (int format, int channels, int samplerate) ;
|
||||
|
||||
sf_count_t read (short *ptr, sf_count_t items) ;
|
||||
sf_count_t read (int *ptr, sf_count_t items) ;
|
||||
sf_count_t read (float *ptr, sf_count_t items) ;
|
||||
sf_count_t read (double *ptr, sf_count_t items) ;
|
||||
|
||||
sf_count_t write (const short *ptr, sf_count_t items) ;
|
||||
sf_count_t write (const int *ptr, sf_count_t items) ;
|
||||
sf_count_t write (const float *ptr, sf_count_t items) ;
|
||||
sf_count_t write (const double *ptr, sf_count_t items) ;
|
||||
|
||||
sf_count_t readf (short *ptr, sf_count_t frames) ;
|
||||
sf_count_t readf (int *ptr, sf_count_t frames) ;
|
||||
sf_count_t readf (float *ptr, sf_count_t frames) ;
|
||||
sf_count_t readf (double *ptr, sf_count_t frames) ;
|
||||
|
||||
sf_count_t writef (const short *ptr, sf_count_t frames) ;
|
||||
sf_count_t writef (const int *ptr, sf_count_t frames) ;
|
||||
sf_count_t writef (const float *ptr, sf_count_t frames) ;
|
||||
sf_count_t writef (const double *ptr, sf_count_t frames) ;
|
||||
|
||||
sf_count_t readRaw (void *ptr, sf_count_t bytes) ;
|
||||
sf_count_t writeRaw (const void *ptr, sf_count_t bytes) ;
|
||||
|
||||
/**< Raw access to the handle. SndfileHandle keeps ownership. */
|
||||
SNDFILE * rawHandle (void) ;
|
||||
|
||||
/**< Take ownership of handle, if reference count is 1. */
|
||||
SNDFILE * takeOwnership (void) ;
|
||||
} ;
|
||||
|
||||
/*==============================================================================
|
||||
** Nothing but implementation below.
|
||||
*/
|
||||
|
||||
inline
|
||||
SndfileHandle::SNDFILE_ref::SNDFILE_ref (void)
|
||||
: sf (NULL), sfinfo (), ref (1)
|
||||
{}
|
||||
|
||||
inline
|
||||
SndfileHandle::SNDFILE_ref::~SNDFILE_ref (void)
|
||||
{ if (sf != NULL) sf_close (sf) ; }
|
||||
|
||||
inline
|
||||
SndfileHandle::SndfileHandle (const char *path, int mode, int fmt, int chans, int srate)
|
||||
: p (NULL)
|
||||
{
|
||||
p = new (std::nothrow) SNDFILE_ref () ;
|
||||
|
||||
if (p != NULL)
|
||||
{ p->ref = 1 ;
|
||||
|
||||
p->sfinfo.frames = 0 ;
|
||||
p->sfinfo.channels = chans ;
|
||||
p->sfinfo.format = fmt ;
|
||||
p->sfinfo.samplerate = srate ;
|
||||
p->sfinfo.sections = 0 ;
|
||||
p->sfinfo.seekable = 0 ;
|
||||
|
||||
p->sf = sf_open (path, mode, &p->sfinfo) ;
|
||||
} ;
|
||||
|
||||
return ;
|
||||
} /* SndfileHandle const char * constructor */
|
||||
|
||||
inline
|
||||
SndfileHandle::SndfileHandle (std::string const & path, int mode, int fmt, int chans, int srate)
|
||||
: p (NULL)
|
||||
{
|
||||
p = new (std::nothrow) SNDFILE_ref () ;
|
||||
|
||||
if (p != NULL)
|
||||
{ p->ref = 1 ;
|
||||
|
||||
p->sfinfo.frames = 0 ;
|
||||
p->sfinfo.channels = chans ;
|
||||
p->sfinfo.format = fmt ;
|
||||
p->sfinfo.samplerate = srate ;
|
||||
p->sfinfo.sections = 0 ;
|
||||
p->sfinfo.seekable = 0 ;
|
||||
|
||||
p->sf = sf_open (path.c_str (), mode, &p->sfinfo) ;
|
||||
} ;
|
||||
|
||||
return ;
|
||||
} /* SndfileHandle std::string constructor */
|
||||
|
||||
inline
|
||||
SndfileHandle::SndfileHandle (int fd, bool close_desc, int mode, int fmt, int chans, int srate)
|
||||
: p (NULL)
|
||||
{
|
||||
if (fd < 0)
|
||||
return ;
|
||||
|
||||
p = new (std::nothrow) SNDFILE_ref () ;
|
||||
|
||||
if (p != NULL)
|
||||
{ p->ref = 1 ;
|
||||
|
||||
p->sfinfo.frames = 0 ;
|
||||
p->sfinfo.channels = chans ;
|
||||
p->sfinfo.format = fmt ;
|
||||
p->sfinfo.samplerate = srate ;
|
||||
p->sfinfo.sections = 0 ;
|
||||
p->sfinfo.seekable = 0 ;
|
||||
|
||||
p->sf = sf_open_fd (fd, mode, &p->sfinfo, close_desc) ;
|
||||
} ;
|
||||
|
||||
return ;
|
||||
} /* SndfileHandle fd constructor */
|
||||
|
||||
inline
|
||||
SndfileHandle::SndfileHandle (SF_VIRTUAL_IO &sfvirtual, void *user_data, int mode, int fmt, int chans, int srate)
|
||||
: p (NULL)
|
||||
{
|
||||
p = new (std::nothrow) SNDFILE_ref () ;
|
||||
|
||||
if (p != NULL)
|
||||
{ p->ref = 1 ;
|
||||
|
||||
p->sfinfo.frames = 0 ;
|
||||
p->sfinfo.channels = chans ;
|
||||
p->sfinfo.format = fmt ;
|
||||
p->sfinfo.samplerate = srate ;
|
||||
p->sfinfo.sections = 0 ;
|
||||
p->sfinfo.seekable = 0 ;
|
||||
|
||||
p->sf = sf_open_virtual (&sfvirtual, mode, &p->sfinfo, user_data) ;
|
||||
} ;
|
||||
|
||||
return ;
|
||||
} /* SndfileHandle std::string constructor */
|
||||
|
||||
inline
|
||||
SndfileHandle::~SndfileHandle (void)
|
||||
{ if (p != NULL && --p->ref == 0)
|
||||
delete p ;
|
||||
} /* SndfileHandle destructor */
|
||||
|
||||
|
||||
inline
|
||||
SndfileHandle::SndfileHandle (const SndfileHandle &orig)
|
||||
: p (orig.p)
|
||||
{ if (p != NULL)
|
||||
++p->ref ;
|
||||
} /* SndfileHandle copy constructor */
|
||||
|
||||
inline SndfileHandle &
|
||||
SndfileHandle::operator = (const SndfileHandle &rhs)
|
||||
{
|
||||
if (&rhs == this)
|
||||
return *this ;
|
||||
if (p != NULL && --p->ref == 0)
|
||||
delete p ;
|
||||
|
||||
p = rhs.p ;
|
||||
if (p != NULL)
|
||||
++p->ref ;
|
||||
|
||||
return *this ;
|
||||
} /* SndfileHandle assignment operator */
|
||||
|
||||
inline int
|
||||
SndfileHandle::error (void) const
|
||||
{ return sf_error (p->sf) ; }
|
||||
|
||||
inline const char *
|
||||
SndfileHandle::strError (void) const
|
||||
{ return sf_strerror (p->sf) ; }
|
||||
|
||||
inline int
|
||||
SndfileHandle::command (int cmd, void *data, int datasize)
|
||||
{ return sf_command (p->sf, cmd, data, datasize) ; }
|
||||
|
||||
inline sf_count_t
|
||||
SndfileHandle::seek (sf_count_t frame_count, int whence)
|
||||
{ return sf_seek (p->sf, frame_count, whence) ; }
|
||||
|
||||
inline void
|
||||
SndfileHandle::writeSync (void)
|
||||
{ sf_write_sync (p->sf) ; }
|
||||
|
||||
inline int
|
||||
SndfileHandle::setString (int str_type, const char* str)
|
||||
{ return sf_set_string (p->sf, str_type, str) ; }
|
||||
|
||||
inline const char*
|
||||
SndfileHandle::getString (int str_type) const
|
||||
{ return sf_get_string (p->sf, str_type) ; }
|
||||
|
||||
inline int
|
||||
SndfileHandle::formatCheck (int fmt, int chans, int srate)
|
||||
{
|
||||
SF_INFO sfinfo ;
|
||||
|
||||
sfinfo.frames = 0 ;
|
||||
sfinfo.channels = chans ;
|
||||
sfinfo.format = fmt ;
|
||||
sfinfo.samplerate = srate ;
|
||||
sfinfo.sections = 0 ;
|
||||
sfinfo.seekable = 0 ;
|
||||
|
||||
return sf_format_check (&sfinfo) ;
|
||||
}
|
||||
|
||||
/*---------------------------------------------------------------------*/
|
||||
|
||||
inline sf_count_t
|
||||
SndfileHandle::read (short *ptr, sf_count_t items)
|
||||
{ return sf_read_short (p->sf, ptr, items) ; }
|
||||
|
||||
inline sf_count_t
|
||||
SndfileHandle::read (int *ptr, sf_count_t items)
|
||||
{ return sf_read_int (p->sf, ptr, items) ; }
|
||||
|
||||
inline sf_count_t
|
||||
SndfileHandle::read (float *ptr, sf_count_t items)
|
||||
{ return sf_read_float (p->sf, ptr, items) ; }
|
||||
|
||||
inline sf_count_t
|
||||
SndfileHandle::read (double *ptr, sf_count_t items)
|
||||
{ return sf_read_double (p->sf, ptr, items) ; }
|
||||
|
||||
inline sf_count_t
|
||||
SndfileHandle::write (const short *ptr, sf_count_t items)
|
||||
{ return sf_write_short (p->sf, ptr, items) ; }
|
||||
|
||||
inline sf_count_t
|
||||
SndfileHandle::write (const int *ptr, sf_count_t items)
|
||||
{ return sf_write_int (p->sf, ptr, items) ; }
|
||||
|
||||
inline sf_count_t
|
||||
SndfileHandle::write (const float *ptr, sf_count_t items)
|
||||
{ return sf_write_float (p->sf, ptr, items) ; }
|
||||
|
||||
inline sf_count_t
|
||||
SndfileHandle::write (const double *ptr, sf_count_t items)
|
||||
{ return sf_write_double (p->sf, ptr, items) ; }
|
||||
|
||||
inline sf_count_t
|
||||
SndfileHandle::readf (short *ptr, sf_count_t frame_count)
|
||||
{ return sf_readf_short (p->sf, ptr, frame_count) ; }
|
||||
|
||||
inline sf_count_t
|
||||
SndfileHandle::readf (int *ptr, sf_count_t frame_count)
|
||||
{ return sf_readf_int (p->sf, ptr, frame_count) ; }
|
||||
|
||||
inline sf_count_t
|
||||
SndfileHandle::readf (float *ptr, sf_count_t frame_count)
|
||||
{ return sf_readf_float (p->sf, ptr, frame_count) ; }
|
||||
|
||||
inline sf_count_t
|
||||
SndfileHandle::readf (double *ptr, sf_count_t frame_count)
|
||||
{ return sf_readf_double (p->sf, ptr, frame_count) ; }
|
||||
|
||||
inline sf_count_t
|
||||
SndfileHandle::writef (const short *ptr, sf_count_t frame_count)
|
||||
{ return sf_writef_short (p->sf, ptr, frame_count) ; }
|
||||
|
||||
inline sf_count_t
|
||||
SndfileHandle::writef (const int *ptr, sf_count_t frame_count)
|
||||
{ return sf_writef_int (p->sf, ptr, frame_count) ; }
|
||||
|
||||
inline sf_count_t
|
||||
SndfileHandle::writef (const float *ptr, sf_count_t frame_count)
|
||||
{ return sf_writef_float (p->sf, ptr, frame_count) ; }
|
||||
|
||||
inline sf_count_t
|
||||
SndfileHandle::writef (const double *ptr, sf_count_t frame_count)
|
||||
{ return sf_writef_double (p->sf, ptr, frame_count) ; }
|
||||
|
||||
inline sf_count_t
|
||||
SndfileHandle::readRaw (void *ptr, sf_count_t bytes)
|
||||
{ return sf_read_raw (p->sf, ptr, bytes) ; }
|
||||
|
||||
inline sf_count_t
|
||||
SndfileHandle::writeRaw (const void *ptr, sf_count_t bytes)
|
||||
{ return sf_write_raw (p->sf, ptr, bytes) ; }
|
||||
|
||||
inline SNDFILE *
|
||||
SndfileHandle::rawHandle (void)
|
||||
{ return (p ? p->sf : NULL) ; }
|
||||
|
||||
inline SNDFILE *
|
||||
SndfileHandle::takeOwnership (void)
|
||||
{
|
||||
if (p == NULL || (p->ref != 1))
|
||||
return NULL ;
|
||||
|
||||
SNDFILE * sf = p->sf ;
|
||||
p->sf = NULL ;
|
||||
delete p ;
|
||||
p = NULL ;
|
||||
return sf ;
|
||||
}
|
||||
|
||||
#ifdef ENABLE_SNDFILE_WINDOWS_PROTOTYPES
|
||||
|
||||
inline
|
||||
SndfileHandle::SndfileHandle (LPCWSTR wpath, int mode, int fmt, int chans, int srate)
|
||||
: p (NULL)
|
||||
{
|
||||
p = new (std::nothrow) SNDFILE_ref () ;
|
||||
|
||||
if (p != NULL)
|
||||
{ p->ref = 1 ;
|
||||
|
||||
p->sfinfo.frames = 0 ;
|
||||
p->sfinfo.channels = chans ;
|
||||
p->sfinfo.format = fmt ;
|
||||
p->sfinfo.samplerate = srate ;
|
||||
p->sfinfo.sections = 0 ;
|
||||
p->sfinfo.seekable = 0 ;
|
||||
|
||||
p->sf = sf_wchar_open (wpath, mode, &p->sfinfo) ;
|
||||
} ;
|
||||
|
||||
return ;
|
||||
} /* SndfileHandle const wchar_t * constructor */
|
||||
|
||||
#endif
|
||||
|
||||
#endif /* SNDFILE_HH */
|
||||
|
@ -1,159 +0,0 @@
|
||||
/*
|
||||
libmpg123: MPEG Audio Decoder library
|
||||
|
||||
separate header just for audio format definitions not tied to
|
||||
library code
|
||||
|
||||
copyright 1995-2020 by the mpg123 project
|
||||
free software under the terms of the LGPL 2.1
|
||||
see COPYING and AUTHORS files in distribution or http://mpg123.org
|
||||
*/
|
||||
|
||||
#ifndef MPG123_ENC_H
|
||||
#define MPG123_ENC_H
|
||||
|
||||
/** \file fmt123.h Audio format definitions. */
|
||||
|
||||
/** \defgroup mpg123_enc mpg123 PCM sample encodings
|
||||
* These are definitions for audio formats used by libmpg123 and
|
||||
* libout123.
|
||||
*
|
||||
* @{
|
||||
*/
|
||||
|
||||
/** An enum over all sample types possibly known to mpg123.
|
||||
* The values are designed as bit flags to allow bitmasking for encoding
|
||||
* families.
|
||||
* This is also why the enum is not used as type for actual encoding variables,
|
||||
* plain integers (at least 16 bit, 15 bit being used) cover the possible
|
||||
* combinations of these flags.
|
||||
*
|
||||
* Note that (your build of) libmpg123 does not necessarily support all these.
|
||||
* Usually, you can expect the 8bit encodings and signed 16 bit.
|
||||
* Also 32bit float will be usual beginning with mpg123-1.7.0 .
|
||||
* What you should bear in mind is that (SSE, etc) optimized routines may be
|
||||
* absent for some formats. We do have SSE for 16, 32 bit and float, though.
|
||||
* 24 bit integer is done via postprocessing of 32 bit output -- just cutting
|
||||
* the last byte, no rounding, even. If you want better, do it yourself.
|
||||
*
|
||||
* All formats are in native byte order. If you need different endinaness, you
|
||||
* can simply postprocess the output buffers (libmpg123 wouldn't do anything
|
||||
* else). The macro MPG123_SAMPLESIZE() can be helpful there.
|
||||
*/
|
||||
enum mpg123_enc_enum
|
||||
{
|
||||
/* 0000 0000 0000 1111 Some 8 bit integer encoding. */
|
||||
MPG123_ENC_8 = 0x00f
|
||||
/* 0000 0000 0100 0000 Some 16 bit integer encoding. */
|
||||
, MPG123_ENC_16 = 0x040
|
||||
/* 0100 0000 0000 0000 Some 24 bit integer encoding. */
|
||||
, MPG123_ENC_24 = 0x4000
|
||||
/* 0000 0001 0000 0000 Some 32 bit integer encoding. */
|
||||
, MPG123_ENC_32 = 0x100
|
||||
/* 0000 0000 1000 0000 Some signed integer encoding. */
|
||||
, MPG123_ENC_SIGNED = 0x080
|
||||
/* 0000 1110 0000 0000 Some float encoding. */
|
||||
, MPG123_ENC_FLOAT = 0xe00
|
||||
/* 0000 0000 1101 0000 signed 16 bit */
|
||||
, MPG123_ENC_SIGNED_16 = (MPG123_ENC_16|MPG123_ENC_SIGNED|0x10)
|
||||
/* 0000 0000 0110 0000 unsigned 16 bit */
|
||||
, MPG123_ENC_UNSIGNED_16 = (MPG123_ENC_16|0x20)
|
||||
/* 0000 0000 0000 0001 unsigned 8 bit */
|
||||
, MPG123_ENC_UNSIGNED_8 = 0x01
|
||||
/* 0000 0000 1000 0010 signed 8 bit */
|
||||
, MPG123_ENC_SIGNED_8 = (MPG123_ENC_SIGNED|0x02)
|
||||
/* 0000 0000 0000 0100 ulaw 8 bit */
|
||||
, MPG123_ENC_ULAW_8 = 0x04
|
||||
/* 0000 0000 0000 1000 alaw 8 bit */
|
||||
, MPG123_ENC_ALAW_8 = 0x08
|
||||
/* 0001 0001 1000 0000 signed 32 bit */
|
||||
, MPG123_ENC_SIGNED_32 = MPG123_ENC_32|MPG123_ENC_SIGNED|0x1000
|
||||
/* 0010 0001 0000 0000 unsigned 32 bit */
|
||||
, MPG123_ENC_UNSIGNED_32 = MPG123_ENC_32|0x2000
|
||||
/* 0101 0000 1000 0000 signed 24 bit */
|
||||
, MPG123_ENC_SIGNED_24 = MPG123_ENC_24|MPG123_ENC_SIGNED|0x1000
|
||||
/* 0110 0000 0000 0000 unsigned 24 bit */
|
||||
, MPG123_ENC_UNSIGNED_24 = MPG123_ENC_24|0x2000
|
||||
/* 0000 0010 0000 0000 32bit float */
|
||||
, MPG123_ENC_FLOAT_32 = 0x200
|
||||
/* 0000 0100 0000 0000 64bit float */
|
||||
, MPG123_ENC_FLOAT_64 = 0x400
|
||||
/* Any possibly known encoding from the list above. */
|
||||
, MPG123_ENC_ANY = ( MPG123_ENC_SIGNED_16 | MPG123_ENC_UNSIGNED_16
|
||||
| MPG123_ENC_UNSIGNED_8 | MPG123_ENC_SIGNED_8
|
||||
| MPG123_ENC_ULAW_8 | MPG123_ENC_ALAW_8
|
||||
| MPG123_ENC_SIGNED_32 | MPG123_ENC_UNSIGNED_32
|
||||
| MPG123_ENC_SIGNED_24 | MPG123_ENC_UNSIGNED_24
|
||||
| MPG123_ENC_FLOAT_32 | MPG123_ENC_FLOAT_64 )
|
||||
};
|
||||
|
||||
/** Get size of one PCM sample with given encoding.
|
||||
* This is included both in libmpg123 and libout123. Both offer
|
||||
* an API function to provide the macro results from library
|
||||
* compile-time, not that of you application. This most likely
|
||||
* does not matter as I do not expect any fresh PCM sample
|
||||
* encoding to appear. But who knows? Perhaps the encoding type
|
||||
* will be abused for funny things in future, not even plain PCM.
|
||||
* And, by the way: Thomas really likes the ?: operator.
|
||||
* \param enc the encoding (mpg123_enc_enum value)
|
||||
* \return size of one sample in bytes
|
||||
*/
|
||||
#define MPG123_SAMPLESIZE(enc) ( \
|
||||
(enc) < 1 \
|
||||
? 0 \
|
||||
: ( (enc) & MPG123_ENC_8 \
|
||||
? 1 \
|
||||
: ( (enc) & MPG123_ENC_16 \
|
||||
? 2 \
|
||||
: ( (enc) & MPG123_ENC_24 \
|
||||
? 3 \
|
||||
: ( ( (enc) & MPG123_ENC_32 \
|
||||
|| (enc) == MPG123_ENC_FLOAT_32 ) \
|
||||
? 4 \
|
||||
: ( (enc) == MPG123_ENC_FLOAT_64 \
|
||||
? 8 \
|
||||
: 0 \
|
||||
) ) ) ) ) )
|
||||
|
||||
/** Representation of zero in differing encodings.
|
||||
* This exists to define proper silence in various encodings without
|
||||
* having to link to libsyn123 to do actual conversions at runtime.
|
||||
* You have to handle big/little endian order yourself, though.
|
||||
* This takes the shortcut that any signed encoding has a zero with
|
||||
* all-zero bits. Unsigned linear encodings just have the highest bit set
|
||||
* (2^(n-1) for n bits), while the nonlinear 8-bit ones are special.
|
||||
* \param enc the encoding (mpg123_enc_enum value)
|
||||
* \param siz bytes per sample (return value of MPG123_SAMPLESIZE(enc))
|
||||
* \param off byte (octet) offset counted from LSB
|
||||
* \return unsigned byte value for the designated octet
|
||||
*/
|
||||
#define MPG123_ZEROSAMPLE(enc, siz, off) ( \
|
||||
(enc) == MPG123_ENC_ULAW_8 \
|
||||
? (off == 0 ? 0xff : 0x00) \
|
||||
: ( (enc) == MPG123_ENC_ALAW_8 \
|
||||
? (off == 0 ? 0xd5 : 0x00) \
|
||||
: ( (((enc) & (MPG123_ENC_SIGNED|MPG123_ENC_FLOAT)) || (siz) != ((off)+1)) \
|
||||
? 0x00 \
|
||||
: 0x80 \
|
||||
) ) )
|
||||
|
||||
/** Structure defining an audio format.
|
||||
* Providing the members as individual function arguments to define a certain
|
||||
* output format is easy enough. This struct makes is more comfortable to deal
|
||||
* with a list of formats.
|
||||
* Negative values for the members might be used to communicate use of default
|
||||
* values.
|
||||
*/
|
||||
struct mpg123_fmt
|
||||
{
|
||||
long rate; /**< sampling rate in Hz */
|
||||
int channels; /**< channel count */
|
||||
/** encoding code, can be single value or bitwise or of members of
|
||||
* mpg123_enc_enum */
|
||||
int encoding;
|
||||
};
|
||||
|
||||
/* @} */
|
||||
|
||||
#endif
|
||||
|
File diff suppressed because it is too large
Load Diff
70
premake5.lua
70
premake5.lua
@ -2,21 +2,21 @@ newoption {
|
||||
trigger = "glewdir",
|
||||
value = "PATH",
|
||||
description = "Directory of GLEW",
|
||||
default = "glew-2.1.0"
|
||||
default = "vendor/glew-2.1.0"
|
||||
}
|
||||
|
||||
newoption {
|
||||
trigger = "glfwdir64",
|
||||
value = "PATH",
|
||||
description = "Directory of glfw",
|
||||
default = "glfw-3.3.2.bin.WIN64",
|
||||
default = "vendor/glfw-3.3.2.bin.WIN64",
|
||||
}
|
||||
|
||||
newoption {
|
||||
trigger = "glfwdir32",
|
||||
value = "PATH",
|
||||
description = "Directory of glfw",
|
||||
default = "glfw-3.3.2.bin.WIN32",
|
||||
default = "vendor/glfw-3.3.2.bin.WIN32",
|
||||
}
|
||||
|
||||
newoption {
|
||||
@ -30,9 +30,9 @@ newoption {
|
||||
}
|
||||
|
||||
if(_OPTIONS["with-librw"]) then
|
||||
Librw = "librw"
|
||||
Librw = "vendor/librw"
|
||||
else
|
||||
Librw = os.getenv("LIBRW") or "librw"
|
||||
Librw = os.getenv("LIBRW") or "vendor/librw"
|
||||
end
|
||||
|
||||
function getsys(a)
|
||||
@ -77,6 +77,11 @@ workspace "reVC"
|
||||
"linux-arm-librw_gl3_glfw-oal",
|
||||
}
|
||||
|
||||
filter { "system:bsd" }
|
||||
platforms {
|
||||
"bsd-amd64-librw_gl3_glfw-oal"
|
||||
}
|
||||
|
||||
filter "configurations:Debug"
|
||||
defines { "DEBUG" }
|
||||
|
||||
@ -90,6 +95,9 @@ workspace "reVC"
|
||||
filter { "platforms:linux*" }
|
||||
system "linux"
|
||||
|
||||
filter { "platforms:bsd*" }
|
||||
system "bsd"
|
||||
|
||||
filter { "platforms:*x86*" }
|
||||
architecture "x86"
|
||||
|
||||
@ -144,9 +152,14 @@ if(_OPTIONS["with-librw"]) then
|
||||
project "librw"
|
||||
kind "StaticLib"
|
||||
targetname "rw"
|
||||
targetdir "lib/%{cfg.platform}/%{cfg.buildcfg}"
|
||||
targetdir(path.join(Librw, "lib/%{cfg.platform}/%{cfg.buildcfg}"))
|
||||
files { path.join(Librw, "src/*.*") }
|
||||
files { path.join(Librw, "src/*/*.*") }
|
||||
|
||||
filter "platforms:bsd*"
|
||||
includedirs { "/usr/local/include" }
|
||||
libdirs { "/usr/local/lib" }
|
||||
|
||||
filter "platforms:*RW34*"
|
||||
flags { "ExcludeFromBuild" }
|
||||
filter {}
|
||||
@ -207,9 +220,9 @@ project "reVC"
|
||||
includedirs { "src/extras" }
|
||||
|
||||
if _OPTIONS["with-opus"] then
|
||||
includedirs { "ogg/include" }
|
||||
includedirs { "opus/include" }
|
||||
includedirs { "opusfile/include" }
|
||||
includedirs { "vendor/ogg/include" }
|
||||
includedirs { "vendor/opus/include" }
|
||||
includedirs { "vendor/opusfile/include" }
|
||||
end
|
||||
|
||||
filter "platforms:*mss"
|
||||
@ -219,9 +232,9 @@ project "reVC"
|
||||
|
||||
if _OPTIONS["with-opus"] then
|
||||
filter "platforms:win*"
|
||||
libdirs { "ogg/win32/VS2015/Win32/%{cfg.buildcfg}" }
|
||||
libdirs { "opus/win32/VS2015/Win32/%{cfg.buildcfg}" }
|
||||
libdirs { "opusfile/win32/VS2015/Win32/Release-NoHTTP" }
|
||||
libdirs { "vendor/ogg/win32/VS2015/Win32/%{cfg.buildcfg}" }
|
||||
libdirs { "vendor/opus/win32/VS2015/Win32/%{cfg.buildcfg}" }
|
||||
libdirs { "vendor/opusfile/win32/VS2015/Win32/Release-NoHTTP" }
|
||||
filter {}
|
||||
defines { "AUDIO_OPUS" }
|
||||
end
|
||||
@ -241,24 +254,26 @@ project "reVC"
|
||||
characterset ("MBCS")
|
||||
targetextension ".exe"
|
||||
|
||||
filter "platforms:win*oal"
|
||||
includedirs { "vendor/openal-soft/include" }
|
||||
includedirs { "vendor/libsndfile/include" }
|
||||
includedirs { "vendor/mpg123/include" }
|
||||
|
||||
filter "platforms:win-x86*oal"
|
||||
includedirs { "openal-soft/include" }
|
||||
includedirs { "libsndfile.32/include" }
|
||||
includedirs { "mpg123.32/include" }
|
||||
libdirs { "mpg123.32/lib" }
|
||||
libdirs { "libsndfile.32/lib" }
|
||||
libdirs { "openal-soft/libs/Win32" }
|
||||
libdirs { "vendor/mpg123/lib/Win32" }
|
||||
libdirs { "vendor/libsndfile/lib/Win32" }
|
||||
libdirs { "vendor/openal-soft/libs/Win32" }
|
||||
|
||||
filter "platforms:win-amd64*oal"
|
||||
includedirs { "openal-soft/include" }
|
||||
includedirs { "libsndfile.64/include" }
|
||||
includedirs { "mpg123.64/include" }
|
||||
libdirs { "mpg123.64/lib" }
|
||||
libdirs { "libsndfile.64/lib" }
|
||||
libdirs { "openal-soft/libs/Win64" }
|
||||
libdirs { "vendor/mpg123/lib/Win64" }
|
||||
libdirs { "vendor/libsndfile/lib/Win64" }
|
||||
libdirs { "vendor/openal-soft/libs/Win64" }
|
||||
|
||||
filter "platforms:linux*oal"
|
||||
links { "openal", "mpg123", "sndfile", "pthread" }
|
||||
|
||||
filter "platforms:bsd*oal"
|
||||
links { "openal", "mpg123", "sndfile", "pthread" }
|
||||
|
||||
if _OPTIONS["with-opus"] then
|
||||
filter {}
|
||||
@ -281,7 +296,7 @@ project "reVC"
|
||||
includedirs { "src/fakerw" }
|
||||
includedirs { Librw }
|
||||
if(_OPTIONS["with-librw"]) then
|
||||
libdirs { "lib/%{cfg.platform}/%{cfg.buildcfg}" }
|
||||
libdirs { "vendor/librw/lib/%{cfg.platform}/%{cfg.buildcfg}" }
|
||||
end
|
||||
links { "rw" }
|
||||
|
||||
@ -307,3 +322,8 @@ project "reVC"
|
||||
|
||||
filter "platforms:linux*gl3_glfw*"
|
||||
links { "GL", "GLEW", "glfw" }
|
||||
|
||||
filter "platforms:bsd*gl3_glfw*"
|
||||
links { "GL", "GLEW", "glfw", "sysinfo" }
|
||||
includedirs { "/usr/local/include" }
|
||||
libdirs { "/usr/local/lib" }
|
||||
|
@ -2756,7 +2756,6 @@ cAudioManager::ProcessPlane(cVehicleParams *params)
|
||||
ProcessCesna(params);
|
||||
break;
|
||||
default:
|
||||
debug("Plane Model Id is %d\n, ", params->m_pVehicle->GetModelIndex());
|
||||
break;
|
||||
}
|
||||
}
|
||||
|
@ -12,7 +12,8 @@ enum eRadioStation
|
||||
EMOTION,
|
||||
WAVE,
|
||||
USERTRACK,
|
||||
POLICE_RADIO,
|
||||
NUM_RADIOS = 10,
|
||||
POLICE_RADIO = 10,
|
||||
//TAXI_RADIO,
|
||||
RADIO_OFF,
|
||||
};
|
||||
|
@ -587,16 +587,16 @@ cSampleManager::Initialise(void)
|
||||
}
|
||||
|
||||
nSampleBankMemoryStartAddress[SAMPLEBANK_MAIN] = (uintptr)malloc(nSampleBankSize[SAMPLEBANK_MAIN]);
|
||||
ASSERT(nSampleBankMemoryStartAddress[SAMPLEBANK_MAIN] != NULL);
|
||||
ASSERT(nSampleBankMemoryStartAddress[SAMPLEBANK_MAIN] != 0);
|
||||
|
||||
if ( nSampleBankMemoryStartAddress[SAMPLEBANK_MAIN] == NULL )
|
||||
if ( nSampleBankMemoryStartAddress[SAMPLEBANK_MAIN] == 0 )
|
||||
{
|
||||
Terminate();
|
||||
return false;
|
||||
}
|
||||
|
||||
nSampleBankMemoryStartAddress[SAMPLEBANK_PED] = (uintptr)malloc(PED_BLOCKSIZE*MAX_PEDSFX);
|
||||
ASSERT(nSampleBankMemoryStartAddress[SAMPLEBANK_PED] != NULL);
|
||||
ASSERT(nSampleBankMemoryStartAddress[SAMPLEBANK_PED] != 0);
|
||||
}
|
||||
|
||||
|
||||
|
@ -32,9 +32,9 @@ int8 CDarkel::InterruptedWeapon;
|
||||
* makes game handle sounds & messages instead of SCM (just like in GTA2)
|
||||
* but it's never been used in the game. Has unused sliding text when frenzy completed etc.
|
||||
*/
|
||||
int8 CDarkel::bStandardSoundAndMessages;
|
||||
int8 CDarkel::bNeedHeadShot;
|
||||
int8 CDarkel::bProperKillFrenzy;
|
||||
bool CDarkel::bStandardSoundAndMessages;
|
||||
bool CDarkel::bNeedHeadShot;
|
||||
bool CDarkel::bProperKillFrenzy;
|
||||
uint16 CDarkel::Status;
|
||||
uint16 CDarkel::RegisteredKills[NUM_DEFAULT_MODELS];
|
||||
int32 CDarkel::ModelToKill;
|
||||
|
@ -24,9 +24,9 @@ private:
|
||||
static int32 AmmoInterruptedWeapon;
|
||||
static int32 KillsNeeded;
|
||||
static int8 InterruptedWeapon;
|
||||
static int8 bStandardSoundAndMessages;
|
||||
static int8 bNeedHeadShot;
|
||||
static int8 bProperKillFrenzy;
|
||||
static bool bStandardSoundAndMessages;
|
||||
static bool bNeedHeadShot;
|
||||
static bool bProperKillFrenzy;
|
||||
static uint16 Status;
|
||||
static uint16 RegisteredKills[NUM_DEFAULT_MODELS];
|
||||
static int32 ModelToKill;
|
||||
|
@ -28,6 +28,7 @@
|
||||
#include "Particle.h"
|
||||
#include "ColStore.h"
|
||||
#include "Automobile.h"
|
||||
#include "MBlur.h"
|
||||
|
||||
uint8 CGameLogic::ActivePlayers;
|
||||
uint8 CGameLogic::ShortCutState;
|
||||
@ -343,7 +344,10 @@ CGameLogic::RestorePlayerStuffDuringResurrection(CPlayerPed *pPlayerPed, CVector
|
||||
pPlayerPed->bIsVisible = true;
|
||||
pPlayerPed->m_bloodyFootprintCountOrDeathTime = 0;
|
||||
pPlayerPed->bDoBloodyFootprints = false;
|
||||
//TODO(MIAMI): clear drunk stuff
|
||||
pPlayerPed->m_nDrunkenness = 0;
|
||||
pPlayerPed->m_nFadeDrunkenness = 0;
|
||||
CMBlur::ClearDrunkBlur();
|
||||
pPlayerPed->m_nDrunkCountdown = 0;
|
||||
pPlayerPed->ClearAdrenaline();
|
||||
pPlayerPed->m_fCurrentStamina = pPlayerPed->m_fMaxStamina;
|
||||
if (pPlayerPed->m_pFire)
|
||||
|
@ -1806,7 +1806,7 @@ void CMissionCleanup::Process()
|
||||
// TODO(MIAMI)
|
||||
//CSpecialFX::bLiftCam = false;
|
||||
//CSpecialFX::bVideoCam = false;
|
||||
//CTimeCycle::StopExtraColour(0);
|
||||
CTimeCycle::StopExtraColour(0);
|
||||
for (int i = 0; i < MISSION_AUDIO_SLOTS; i++)
|
||||
DMAudio.ClearMissionAudio(i);
|
||||
CWeather::ReleaseWeather();
|
||||
@ -1822,8 +1822,11 @@ void CMissionCleanup::Process()
|
||||
CWorld::Players[0].m_pPed->m_pWanted->m_bIgnoredByCops = false;
|
||||
CWorld::Players[0].m_pPed->m_pWanted->m_bIgnoredByEveryone = false;
|
||||
CWorld::Players[0].MakePlayerSafe(false);
|
||||
//TODO(MIAMI): drunkenness, enable drive by
|
||||
//DMAudio::ShutUpPlayerTalking(0);
|
||||
CWorld::Players[0].m_pPed->m_nFadeDrunkenness = 1;
|
||||
CWorld::Players[0].m_pPed->m_nDrunkCountdown = 0;
|
||||
// CPad::GetPad(0)->SetDrunkInputDelay(0); // TODO(Miami)
|
||||
CWorld::Players[0].m_bDriveByAllowed = true;
|
||||
// DMAudio::ShutUpPlayerTalking(0); // TODO(Miami)
|
||||
CVehicle::bDisableRemoteDetonation = false;
|
||||
CVehicle::bDisableRemoteDetonationOnContact = false;
|
||||
CGameLogic::ClearShortCut();
|
||||
@ -5353,7 +5356,7 @@ int8 CRunningScript::ProcessCommands300To399(int32 command)
|
||||
if (pos.z <= MAP_Z_LOW_LIMIT)
|
||||
pos.z = CWorld::FindGroundZForCoord(pos.x, pos.y);
|
||||
CRadar::GetActualBlipArrayIndex(CollectNextParameterWithoutIncreasingPC(m_nIp));
|
||||
int handle = CRadar::SetCoordBlip(BLIP_COORD, pos, 2, BLIP_DISPLAY_BOTH);
|
||||
int handle = CRadar::SetCoordBlip(BLIP_CONTACT_POINT, pos, 2, BLIP_DISPLAY_BOTH);
|
||||
CRadar::ChangeBlipScale(handle, 3);
|
||||
ScriptParams[0] = handle;
|
||||
StoreParameters(&m_nIp, 1);
|
||||
@ -9792,7 +9795,7 @@ int8 CRunningScript::ProcessCommands900To999(int32 command)
|
||||
CVector pos = *(CVector*)&ScriptParams[0];
|
||||
if (pos.z <= MAP_Z_LOW_LIMIT)
|
||||
pos.z = CWorld::FindGroundZForCoord(pos.x, pos.y);
|
||||
C3dMarkers::PlaceMarkerSet((uintptr)this + m_nIp, 4, pos, *(float*)&ScriptParams[3],
|
||||
C3dMarkers::PlaceMarkerSet((uintptr)this + m_nIp, MARKERTYPE_CYLINDER, pos, *(float*)&ScriptParams[3],
|
||||
SPHERE_MARKER_R, SPHERE_MARKER_G, SPHERE_MARKER_B, SPHERE_MARKER_A,
|
||||
SPHERE_MARKER_PULSE_PERIOD, SPHERE_MARKER_PULSE_FRACTION, 0);
|
||||
return 0;
|
||||
@ -12709,27 +12712,33 @@ int8 CRunningScript::ProcessCommands1200To1299(int32 command)
|
||||
case COMMAND_SET_EXTRA_COLOURS:
|
||||
{
|
||||
CollectParameters(&m_nIp, 2);
|
||||
debug("SET_EXTRA_COLOURS not implemented, skipping\n");
|
||||
CTimeCycle::StartExtraColour(ScriptParams[0]-1, ScriptParams[1] != 0);
|
||||
return 0;
|
||||
}
|
||||
case COMMAND_CLEAR_EXTRA_COLOURS:
|
||||
{
|
||||
CollectParameters(&m_nIp, 1);
|
||||
debug("CLEAR_EXTRA_COLOURS not implemented, skipping\n");
|
||||
CTimeCycle::StopExtraColour(ScriptParams[0]);
|
||||
return 0;
|
||||
}
|
||||
//case COMMAND_CLOSE_CAR_BOOT:
|
||||
case COMMAND_GET_WHEELIE_STATS:
|
||||
{
|
||||
CollectParameters(&m_nIp, 1);
|
||||
static bool bShowed = false;
|
||||
if (!bShowed) {
|
||||
debug("GET_WHEELIE_STATS not implemented\n");
|
||||
bShowed = true;
|
||||
}
|
||||
for (int i = 0; i < 6; i++)
|
||||
ScriptParams[i] = 0;
|
||||
CPlayerInfo* pPlayerInfo = &CWorld::Players[ScriptParams[0]];
|
||||
ScriptParams[0] = pPlayerInfo->m_nLastTimeCarSpentOnTwoWheels;
|
||||
ScriptParams[1] = *(int*)&pPlayerInfo->m_nLastDistanceCarTravelledOnTwoWheels;
|
||||
ScriptParams[2] = pPlayerInfo->m_nLastTimeSpentOnWheelie;
|
||||
ScriptParams[3] = *(int*)&pPlayerInfo->m_nLastDistanceTravelledOnWheelie;
|
||||
ScriptParams[4] = pPlayerInfo->m_nLastTimeSpentOnStoppie;
|
||||
ScriptParams[5] = *(int*)&pPlayerInfo->m_nLastDistanceTravelledOnStoppie;
|
||||
StoreParameters(&m_nIp, 6);
|
||||
pPlayerInfo->m_nLastTimeCarSpentOnTwoWheels = 0;
|
||||
pPlayerInfo->m_nLastDistanceCarTravelledOnTwoWheels = 0.0f;
|
||||
pPlayerInfo->m_nLastTimeSpentOnWheelie = 0;
|
||||
pPlayerInfo->m_nLastDistanceTravelledOnWheelie = 0.0f;
|
||||
pPlayerInfo->m_nLastTimeSpentOnStoppie = 0;
|
||||
pPlayerInfo->m_nLastDistanceTravelledOnStoppie = 0.0f;
|
||||
return 0;
|
||||
}
|
||||
//case COMMAND_DISARM_CHAR:
|
||||
@ -13008,11 +13017,11 @@ int8 CRunningScript::ProcessCommands1300To1399(int32 command)
|
||||
//case COMMAND_IS_MISSION_AUDIO_LOADING:
|
||||
case COMMAND_ADD_MONEY_SPENT_ON_WEAPONS:
|
||||
CollectParameters(&m_nIp, 1);
|
||||
debug("ADD_MONEY_SPENT_ON_WEAPON not implemented\n"); // TODO(MIAMI)
|
||||
CStats::MoneySpentOnWeapons(ScriptParams[0]);
|
||||
return 0;
|
||||
case COMMAND_ADD_MONEY_SPENT_ON_PROPERTY:
|
||||
CollectParameters(&m_nIp, 1);
|
||||
debug("ADD_MONEY_SPENT_ON_PROPERTY not implemented\n"); // TODO(MIAMI)
|
||||
CStats::MoneySpentOnProperty(ScriptParams[0]);
|
||||
return 0;
|
||||
//case COMMAND_ADD_MONEY_SPENT_ON_AUTO_PAINTING:
|
||||
case COMMAND_SET_CHAR_ANSWERING_MOBILE:
|
||||
@ -13041,21 +13050,21 @@ int8 CRunningScript::ProcessCommands1300To1399(int32 command)
|
||||
//case COMMAND_ADD_LOAN_SHARK_VISITS:
|
||||
case COMMAND_ADD_STORES_KNOCKED_OFF:
|
||||
CollectParameters(&m_nIp, 1);
|
||||
debug("ADD_STORES_KNOCKED_OFF not implemented\n"); // TODO(MIAMI)
|
||||
CStats::NumOfStoresKnockedOff(ScriptParams[0]);
|
||||
return 0;
|
||||
//case COMMAND_ADD_MOVIE_STUNTS:
|
||||
case COMMAND_ADD_NUMBER_OF_ASSASSINATIONS:
|
||||
CollectParameters(&m_nIp, 1);
|
||||
debug("ADD_NUMBER_OF_ASSASSINATIONS not implemented\n"); // TODO(MIAMI)
|
||||
CStats::NumOfAssassinations(ScriptParams[0]);
|
||||
return 0;
|
||||
case COMMAND_ADD_PIZZAS_DELIVERED:
|
||||
CollectParameters(&m_nIp, 1);
|
||||
debug("ADD_PIZZAS_DELIVERED not implemented\n"); // TODO(MIAMI)
|
||||
CStats::NumOfPizzasDelivered(ScriptParams[0]);
|
||||
return 0;
|
||||
//case COMMAND_ADD_GARBAGE_PICKUPS:
|
||||
case COMMAND_ADD_ICE_CREAMS_SOLD:
|
||||
CollectParameters(&m_nIp, 1);
|
||||
debug("ADD_ICE_CREAMS_SOLD not implemented\n"); // TODO(MIAMI)
|
||||
CStats::NumOfIceCreamSold(ScriptParams[0]);
|
||||
return 0;
|
||||
//case COMMAND_SET_TOP_SHOOTING_RANGE_SCORE:
|
||||
//case COMMAND_ADD_SHOOTING_RANGE_RANK:
|
||||
@ -13137,15 +13146,15 @@ int8 CRunningScript::ProcessCommands1300To1399(int32 command)
|
||||
}
|
||||
case COMMAND_SET_PROPERTY_AS_OWNED:
|
||||
CollectParameters(&m_nIp, 1);
|
||||
debug("SET_PROPERTY_AS_OWNED not implemented\n"); // TODO(MIAMI)
|
||||
CStats::AddPropertyAsOwned(ScriptParams[0]);
|
||||
return 0;
|
||||
case COMMAND_ADD_BLOOD_RING_KILLS:
|
||||
CollectParameters(&m_nIp, 1);
|
||||
debug("ADD_BLOOD_RING_KILLS not implemented\n"); // TODO(MIAMI)
|
||||
CStats::AddNumBloodRingKills(ScriptParams[0]);
|
||||
return 0;
|
||||
case COMMAND_SET_LONGEST_TIME_IN_BLOOD_RING:
|
||||
CollectParameters(&m_nIp, 1);
|
||||
debug("SET_LONGEST_TIME_IN_BLOOD_RING not implemented\n"); // TODO(MIAMI)
|
||||
CStats::LongestTimeInBloodRing(ScriptParams[0]);
|
||||
return 0;
|
||||
case COMMAND_REMOVE_EVERYTHING_FOR_HUGE_CUTSCENE:
|
||||
{
|
||||
@ -13271,7 +13280,8 @@ int8 CRunningScript::ProcessCommands1300To1399(int32 command)
|
||||
//case COMMAND_SET_CHAR_OBJ_GOTO_CAR_ON_FOOT:
|
||||
//case COMMAND_GET_CLOSEST_WATER_NODE:
|
||||
case COMMAND_ADD_PORN_LEAFLET_TO_RUBBISH:
|
||||
debug("ADD_PORN_LEAFLET_TO_RUBBISH is not implemented\n"); // TODO(MIAMI)
|
||||
CollectParameters(&m_nIp, 1);
|
||||
CStats::PamphletMissionPassed = ScriptParams[0];
|
||||
return 0;
|
||||
case COMMAND_CREATE_CLOTHES_PICKUP:
|
||||
{
|
||||
@ -13541,7 +13551,7 @@ int8 CRunningScript::ProcessCommands1400To1499(int32 command)
|
||||
switch (command) {
|
||||
case COMMAND_REGISTER_VIGILANTE_LEVEL:
|
||||
CollectParameters(&m_nIp, 1);
|
||||
debug("REGISTER_VIGILANTE_LEVEL not implemented\n"); // TODO(MIAMI)
|
||||
CStats::RegisterLevelVigilanteMission(ScriptParams[0]);
|
||||
return 0;
|
||||
case COMMAND_CLEAR_ALL_CHAR_ANIMS:
|
||||
{
|
||||
@ -13854,7 +13864,7 @@ int8 CRunningScript::ProcessCommands1400To1499(int32 command)
|
||||
}
|
||||
case COMMAND_REGISTER_FIRE_LEVEL:
|
||||
CollectParameters(&m_nIp, 1);
|
||||
debug("REGISTER_FIRE_LEVEL not implemented\n"); // TODO(MIAMI)
|
||||
CStats::RegisterLevelFireMission(ScriptParams[0]);
|
||||
return 0;
|
||||
case COMMAND_IS_AUSTRALIAN_GAME:
|
||||
UpdateCompareFlag(false); // should we make some check?
|
||||
@ -14007,7 +14017,7 @@ void CTheScripts::DrawScriptSpheres()
|
||||
{
|
||||
for (int i = 0; i < MAX_NUM_SCRIPT_SPHERES; i++) {
|
||||
if (ScriptSphereArray[i].m_bInUse)
|
||||
C3dMarkers::PlaceMarkerSet(ScriptSphereArray[i].m_Id, 4, ScriptSphereArray[i].m_vecCenter, ScriptSphereArray[i].m_fRadius,
|
||||
C3dMarkers::PlaceMarkerSet(ScriptSphereArray[i].m_Id, MARKERTYPE_CYLINDER, ScriptSphereArray[i].m_vecCenter, ScriptSphereArray[i].m_fRadius,
|
||||
SPHERE_MARKER_R, SPHERE_MARKER_G, SPHERE_MARKER_B, SPHERE_MARKER_A, SPHERE_MARKER_PULSE_PERIOD, SPHERE_MARKER_PULSE_FRACTION, 0);
|
||||
}
|
||||
}
|
||||
|
@ -4894,11 +4894,6 @@ CCam::Process_FollowCar_SA(const CVector& CameraTarget, float TargetOrientation,
|
||||
|
||||
if (ResetStatics) {
|
||||
FOV = DefaultFOV;
|
||||
|
||||
// TODO(Miami): Remove that when cam is done!
|
||||
// GTA 3 has this in veh. camera
|
||||
if (TheCamera.m_bIdleOn)
|
||||
TheCamera.m_uiTimeWeEnteredIdle = CTimer::GetTimeInMilliseconds();
|
||||
} else {
|
||||
if (isCar || isBike) {
|
||||
// 0.4f: CAR_FOV_START_SPEED
|
||||
@ -4933,18 +4928,13 @@ CCam::Process_FollowCar_SA(const CVector& CameraTarget, float TargetOrientation,
|
||||
Rotating = false;
|
||||
m_bCollisionChecksOn = true;
|
||||
|
||||
|
||||
// TODO(Miami): Uncomment that when cam is done!
|
||||
|
||||
// Garage exit cam is not working well in III...
|
||||
// if (!TheCamera.m_bJustCameOutOfGarage)
|
||||
// {
|
||||
Alpha = 0.0f;
|
||||
Beta = car->GetForward().Heading() - HALFPI;
|
||||
if (TheCamera.m_bCamDirectlyInFront) {
|
||||
Beta += PI;
|
||||
if (!TheCamera.m_bJustCameOutOfGarage) {
|
||||
Alpha = 0.0f;
|
||||
Beta = car->GetForward().Heading() - HALFPI;
|
||||
if (TheCamera.m_bCamDirectlyInFront) {
|
||||
Beta += PI;
|
||||
}
|
||||
}
|
||||
// }
|
||||
|
||||
BetaSpeed = 0.0;
|
||||
AlphaSpeed = 0.0;
|
||||
|
@ -514,7 +514,12 @@ CCamera::Process(void)
|
||||
|
||||
int tableIndex = (int)(DEGTORAD(DrunkAngle)/TWOPI * CParticle::SIN_COS_TABLE_SIZE) & CParticle::SIN_COS_TABLE_SIZE-1;
|
||||
DrunkAngle += 5.0f;
|
||||
#ifndef FIX_BUGS
|
||||
// This just messes up interpolation, probably not what they intended
|
||||
// and multiplying the interpolated FOV is also a bit extreme
|
||||
// so let's not do any of this nonsense
|
||||
Cams[ActiveCam].FOV *= (1.0f + CMBlur::Drunkness);
|
||||
#endif
|
||||
|
||||
CamSource.x += -0.02f*CMBlur::Drunkness * CParticle::m_CosTable[tableIndex];
|
||||
CamSource.y += -0.02f*CMBlur::Drunkness * CParticle::m_SinTable[tableIndex];
|
||||
|
@ -150,9 +150,11 @@ CdStreamInit(int32 numChannels)
|
||||
ASSERT(0);
|
||||
return;
|
||||
}
|
||||
|
||||
#ifdef __linux__
|
||||
_gdwCdStreamFlags = O_RDONLY | O_NOATIME;
|
||||
|
||||
#else
|
||||
_gdwCdStreamFlags = O_RDONLY;
|
||||
#endif
|
||||
// People say it's slower
|
||||
/*
|
||||
if ( fsInfo.f_bsize <= CDSTREAM_SECTOR_SIZE )
|
||||
@ -400,9 +402,12 @@ void *CdStreamThread(void *param)
|
||||
if (gCdStreamThreadStatus == 0){
|
||||
gCdStreamThreadStatus = 1;
|
||||
#endif
|
||||
|
||||
#ifdef __linux__
|
||||
pid_t tid = syscall(SYS_gettid);
|
||||
int ret = setpriority(PRIO_PROCESS, tid, getpriority(PRIO_PROCESS, getpid()) + 1);
|
||||
}
|
||||
#endif
|
||||
}
|
||||
|
||||
// spurious wakeup or we sent interrupt signal for flushing
|
||||
if(pChannel->nSectorsToRead == 0)
|
||||
|
@ -651,6 +651,11 @@ void CControllerConfigManager::AffectControllerStateOn_ButtonDown(int32 button,
|
||||
}
|
||||
|
||||
AffectControllerStateOn_ButtonDown_AllStates(button, type, *state);
|
||||
|
||||
#ifdef REGISTER_START_BUTTON
|
||||
if (button == 12)
|
||||
state->Start = 255;
|
||||
#endif
|
||||
}
|
||||
}
|
||||
}
|
||||
@ -1060,6 +1065,11 @@ void CControllerConfigManager::AffectControllerStateOn_ButtonUp(int32 button, eC
|
||||
{
|
||||
if (FrontEndMenuManager.GetIsMenuActive())
|
||||
AffectControllerStateOn_ButtonUp_All_Player_States(button, type, *state);
|
||||
|
||||
#ifdef REGISTER_START_BUTTON
|
||||
if (button == 12)
|
||||
state->Start = 0;
|
||||
#endif
|
||||
}
|
||||
}
|
||||
}
|
||||
|
@ -19,4 +19,5 @@ public:
|
||||
static bool ReadLine(int fd, char *buf, int len);
|
||||
static int CloseFile(int fd);
|
||||
static int GetErrorReadWrite(int fd);
|
||||
static char *GetRootDirName() { return ms_rootDirName; }
|
||||
};
|
||||
|
File diff suppressed because it is too large
Load Diff
@ -318,6 +318,8 @@ enum eCheckHover
|
||||
HOVEROPTION_DECREASE_SFXVOLUME,
|
||||
HOVEROPTION_INCREASE_MOUSESENS,
|
||||
HOVEROPTION_DECREASE_MOUSESENS,
|
||||
HOVEROPTION_INCREASE_MP3BOOST,
|
||||
HOVEROPTION_DECREASE_MP3BOOST,
|
||||
HOVEROPTION_NOT_HOVERING,
|
||||
};
|
||||
|
||||
@ -633,7 +635,9 @@ public:
|
||||
static void PrintErrorMessage();
|
||||
void PrintStats();
|
||||
void Process();
|
||||
void ProcessButtonPresses();
|
||||
void ProcessList(bool &optionSelected, bool &goBack);
|
||||
void UserInput();
|
||||
void ProcessButtonPresses(uint8, uint8, uint8, uint8, int8);
|
||||
void ProcessFileActions();
|
||||
void ProcessOnOffMenuOptions();
|
||||
void RequestFrontEndShutDown();
|
||||
|
@ -1179,30 +1179,9 @@ CMenuManager::InitialiseMenuContents(void)
|
||||
|
||||
STAT_LINE("KGS_EXP", &CStats::KgsOfExplosivesUsed, 0, nil);
|
||||
|
||||
nTemp = (CStats::InstantHitsFiredByPlayer == 0 ? 0 : CStats::InstantHitsHitByPlayer * 100.0f / CStats::InstantHitsFiredByPlayer);
|
||||
STAT_LINE("ACCURA", &nTemp, 0, nil);
|
||||
|
||||
if (CStats::ElBurroTime > 0)
|
||||
STAT_LINE("ELBURRO", &CStats::ElBurroTime, 0, nil);
|
||||
|
||||
if (CStats::Record4x4One > 0)
|
||||
STAT_LINE("FEST_R1", &CStats::Record4x4One, 0, nil);
|
||||
|
||||
if (CStats::Record4x4Two > 0)
|
||||
STAT_LINE("FEST_R2", &CStats::Record4x4Two, 0, nil);
|
||||
|
||||
if (CStats::Record4x4Three > 0)
|
||||
STAT_LINE("FEST_R3", &CStats::Record4x4Three, 0, nil);
|
||||
|
||||
if (CStats::Record4x4Mayhem > 0)
|
||||
STAT_LINE("FEST_RM", &CStats::Record4x4Mayhem, 0, nil);
|
||||
|
||||
if (CStats::LongestFlightInDodo > 0)
|
||||
STAT_LINE("FEST_LF", &CStats::LongestFlightInDodo, 0, nil);
|
||||
|
||||
if (CStats::TimeTakenDefuseMission > 0)
|
||||
STAT_LINE("FEST_BD", &CStats::TimeTakenDefuseMission, 0, nil);
|
||||
|
||||
STAT_LINE("CAR_CRU", &CStats::CarsCrushed, 0, nil);
|
||||
|
||||
if (CStats::HighestScores[0] > 0)
|
||||
@ -1231,7 +1210,11 @@ CMenuManager::InitialiseMenuContents(void)
|
||||
STAT_LINE("FEST_H4", &CStats::HighestScores[4], 0, nil);
|
||||
|
||||
STAT_LINE("FESTDFM", &CStats::DistanceTravelledOnFoot, 0, nil);
|
||||
STAT_LINE("FESTDCM", &CStats::DistanceTravelledInVehicle, 0, nil);
|
||||
STAT_LINE("FESTDCM", &CStats::DistanceTravelledByCar, 0, nil);
|
||||
STAT_LINE("DISTBIM", &CStats::DistanceTravelledByBike, 0, nil);
|
||||
STAT_LINE("DISTBOM", &CStats::DistanceTravelledByBoat, 0, nil);
|
||||
STAT_LINE("DISTGOM", &CStats::DistanceTravelledByGolfCart, 0, nil);
|
||||
STAT_LINE("DISTHEM", &CStats::DistanceTravelledByHelicoptor, 0, nil);
|
||||
STAT_LINE("MMRAIN", &CStats::mmRain, 0, nil);
|
||||
nTemp = (int32)CStats::MaximumJumpDistance;
|
||||
STAT_LINE("MXCARDM", &nTemp, 0, nil);
|
||||
|
@ -89,6 +89,8 @@
|
||||
#include "Occlusion.h"
|
||||
#include "debugmenu.h"
|
||||
#include "Ropes.h"
|
||||
#include "WindModifiers.h"
|
||||
#include "postfx.h"
|
||||
|
||||
eLevelName CGame::currLevel;
|
||||
int32 CGame::currArea;
|
||||
@ -151,6 +153,9 @@ CGame::InitialiseOnceBeforeRW(void)
|
||||
CFileMgr::Initialise();
|
||||
CdStreamInit(MAX_CDCHANNELS);
|
||||
ValidateVersion();
|
||||
#ifdef EXTENDED_COLOURFILTER
|
||||
CPostFX::InitOnce();
|
||||
#endif
|
||||
return true;
|
||||
}
|
||||
|
||||
@ -695,6 +700,7 @@ void CGame::Process(void)
|
||||
if (!CCutsceneMgr::IsCutsceneProcessing() && !CTimer::GetIsCodePaused())
|
||||
FrontEndMenuManager.Process();
|
||||
CStreaming::Update();
|
||||
CWindModifiers::Number = 0;
|
||||
if (!CTimer::GetIsPaused())
|
||||
{
|
||||
CTheZones::Update();
|
||||
|
@ -41,6 +41,7 @@
|
||||
#include "Fluff.h"
|
||||
#include "Gangs.h"
|
||||
#include "platform.h"
|
||||
#include "Stats.h"
|
||||
|
||||
#ifdef GTA_PS2
|
||||
#include "eetypes.h"
|
||||
@ -59,6 +60,7 @@ bool CPad::bDisplayNoControllerMessage;
|
||||
bool CPad::bObsoleteControllerMessage;
|
||||
bool CPad::bOldDisplayNoControllerMessage;
|
||||
bool CPad::m_bMapPadOneToPadTwo;
|
||||
bool CPad::bHasPlayerCheated;
|
||||
#ifdef GTA_PS2
|
||||
unsigned char act_direct[6];
|
||||
unsigned char act_align[6];
|
||||
@ -228,6 +230,8 @@ void VehicleCheat(bool something, int model)
|
||||
CWorld::Add(vehicle);
|
||||
}
|
||||
}
|
||||
CStats::CheatedCount += 1000;
|
||||
CPad::bHasPlayerCheated = true;
|
||||
}
|
||||
|
||||
void BlowUpCarsCheat()
|
||||
@ -287,6 +291,8 @@ void MayhemCheat()
|
||||
PED_FLAG_GANG2 | PED_FLAG_GANG3 | PED_FLAG_GANG4 | PED_FLAG_GANG5 |
|
||||
PED_FLAG_GANG6 | PED_FLAG_GANG7 | PED_FLAG_GANG8 | PED_FLAG_GANG9 |
|
||||
PED_FLAG_EMERGENCY | PED_FLAG_PROSTITUTE | PED_FLAG_CRIMINAL | PED_FLAG_SPECIAL );
|
||||
CStats::CheatedCount += 1000;
|
||||
CPad::bHasPlayerCheated = true;
|
||||
}
|
||||
|
||||
void EverybodyAttacksPlayerCheat()
|
||||
@ -294,12 +300,17 @@ void EverybodyAttacksPlayerCheat()
|
||||
CHud::SetHelpMessage(TheText.Get("CHEAT1"), true);
|
||||
for (int i = PEDTYPE_CIVMALE; i < PEDTYPE_SPECIAL; i++)
|
||||
CPedType::AddThreat(i, PED_FLAG_PLAYER1);
|
||||
|
||||
CStats::CheatedCount += 1000;
|
||||
CPad::bHasPlayerCheated = true;
|
||||
}
|
||||
|
||||
void WeaponsForAllCheat()
|
||||
{
|
||||
CHud::SetHelpMessage(TheText.Get("CHEAT1"), true);
|
||||
CPopulation::ms_bGivePedsWeapons = !CPopulation::ms_bGivePedsWeapons;
|
||||
CStats::CheatedCount += 1000;
|
||||
CPad::bHasPlayerCheated = true;
|
||||
}
|
||||
|
||||
void FastTimeCheat()
|
||||
@ -380,19 +391,24 @@ void OnlyRenderWheelsCheat()
|
||||
{
|
||||
CHud::SetHelpMessage(TheText.Get("CHEAT1"), true);
|
||||
CVehicle::bWheelsOnlyCheat = !CVehicle::bWheelsOnlyCheat;
|
||||
CStats::CheatedCount += 1000;
|
||||
CPad::bHasPlayerCheated = true;
|
||||
}
|
||||
|
||||
|
||||
void ChittyChittyBangBangCheat()
|
||||
{
|
||||
CHud::SetHelpMessage(TheText.Get("CHEAT1"), true);
|
||||
CVehicle::bAllDodosCheat = !CVehicle::bAllDodosCheat;
|
||||
CStats::CheatedCount += 1000;
|
||||
CPad::bHasPlayerCheated = true;
|
||||
}
|
||||
|
||||
void StrongGripCheat()
|
||||
{
|
||||
CHud::SetHelpMessage(TheText.Get("CHEAT1"), true);
|
||||
CVehicle::bCheat3 = !CVehicle::bCheat3;
|
||||
CStats::CheatedCount += 1000;
|
||||
CPad::bHasPlayerCheated = true;
|
||||
}
|
||||
|
||||
void NastyLimbsCheat()
|
||||
@ -404,6 +420,7 @@ void FannyMagnetCheat()
|
||||
{
|
||||
CHud::SetHelpMessage(TheText.Get("CHEAT1"), true);
|
||||
CPed::bFannyMagnetCheat = !CPed::bFannyMagnetCheat;
|
||||
CPad::bHasPlayerCheated = true;
|
||||
}
|
||||
|
||||
void BlackCarsCheat()
|
||||
@ -437,6 +454,7 @@ void BackToTheFuture(void)
|
||||
{
|
||||
CHud::SetHelpMessage(TheText.Get("CHEAT1"), true);
|
||||
CVehicle::bHoverCheat = !CVehicle::bHoverCheat;
|
||||
CPad::bHasPlayerCheated = true;
|
||||
}
|
||||
|
||||
void SuicideCheat(void) {
|
||||
@ -453,6 +471,8 @@ void DoChicksWithGunsCheat(void) {
|
||||
CStreaming::RemoveCurrentZonesModels();
|
||||
CGangs::SetGangPedModels(GANG_PLAYER, MI_HFYBE, MI_WFYBE);
|
||||
CGangs::SetGangWeapons(GANG_PLAYER, WEAPONTYPE_M4, WEAPONTYPE_M4);
|
||||
CStats::CheatedCount += 1000;
|
||||
CPad::bHasPlayerCheated = true;
|
||||
}
|
||||
|
||||
//////////////////////////////////////////////////////////////////////////
|
||||
|
@ -171,6 +171,7 @@ public:
|
||||
static bool bObsoleteControllerMessage;
|
||||
static bool bOldDisplayNoControllerMessage;
|
||||
static bool m_bMapPadOneToPadTwo;
|
||||
static bool bHasPlayerCheated;
|
||||
|
||||
static CKeyboardState OldKeyState;
|
||||
static CKeyboardState NewKeyState;
|
||||
|
@ -30,7 +30,13 @@
|
||||
#include "World.h"
|
||||
#include "ZoneCull.h"
|
||||
#include "main.h"
|
||||
#include "Bike.h"
|
||||
#include "Automobile.h"
|
||||
#include "GameLogic.h"
|
||||
|
||||
CVector lastPlayerPos;
|
||||
|
||||
// --MIAMI: Done
|
||||
void
|
||||
CPlayerInfo::SetPlayerSkin(char *skin)
|
||||
{
|
||||
@ -38,6 +44,7 @@ CPlayerInfo::SetPlayerSkin(char *skin)
|
||||
LoadPlayerSkin();
|
||||
}
|
||||
|
||||
// --MIAMI: Done
|
||||
const CVector &
|
||||
CPlayerInfo::GetPos()
|
||||
{
|
||||
@ -50,16 +57,16 @@ CPlayerInfo::GetPos()
|
||||
return m_pPed->GetPosition();
|
||||
}
|
||||
|
||||
// --MIAMI: Done
|
||||
void
|
||||
CPlayerInfo::LoadPlayerSkin()
|
||||
{
|
||||
DeletePlayerSkin();
|
||||
|
||||
m_pSkinTexture = CPlayerSkin::GetSkinTexture(m_aSkinName);
|
||||
if (!m_pSkinTexture)
|
||||
m_pSkinTexture = CPlayerSkin::GetSkinTexture(DEFAULT_SKIN_NAME);
|
||||
}
|
||||
|
||||
// --MIAMI: Done
|
||||
void
|
||||
CPlayerInfo::DeletePlayerSkin()
|
||||
{
|
||||
@ -69,6 +76,7 @@ CPlayerInfo::DeletePlayerSkin()
|
||||
}
|
||||
}
|
||||
|
||||
// --MIAMI: Done
|
||||
void
|
||||
CPlayerInfo::KillPlayer()
|
||||
{
|
||||
@ -81,6 +89,7 @@ CPlayerInfo::KillPlayer()
|
||||
CStats::TimesDied++;
|
||||
}
|
||||
|
||||
// --MIAMI: Done
|
||||
void
|
||||
CPlayerInfo::ArrestPlayer()
|
||||
{
|
||||
@ -88,11 +97,13 @@ CPlayerInfo::ArrestPlayer()
|
||||
|
||||
m_WBState = WBSTATE_BUSTED;
|
||||
m_nWBTime = CTimer::GetTimeInMilliseconds();
|
||||
m_nBustedAudioStatus = BUSTEDAUDIO_NONE;
|
||||
CDarkel::ResetOnPlayerDeath();
|
||||
CMessages::AddBigMessage(TheText.Get("BUSTED"), 5000, 2);
|
||||
CStats::TimesArrested++;
|
||||
}
|
||||
|
||||
// --MIAMI: Done
|
||||
bool
|
||||
CPlayerInfo::IsPlayerInRemoteMode()
|
||||
{
|
||||
@ -109,6 +120,7 @@ CPlayerInfo::PlayerFailedCriticalMission()
|
||||
CDarkel::ResetOnPlayerDeath();
|
||||
}
|
||||
|
||||
// --MIAMI: Done
|
||||
void
|
||||
CPlayerInfo::Clear(void)
|
||||
{
|
||||
@ -125,6 +137,8 @@ CPlayerInfo::Clear(void)
|
||||
m_nTrafficMultiplier = 0;
|
||||
m_fRoadDensity = 1.0f;
|
||||
m_bInRemoteMode = false;
|
||||
field_D5 = false;
|
||||
field_D6 = false;
|
||||
m_bUnusedTaxiThing = false;
|
||||
m_nUnusedTaxiTimer = 0;
|
||||
m_nCollectedPackages = 0;
|
||||
@ -136,10 +150,25 @@ CPlayerInfo::Clear(void)
|
||||
m_nSexFrequency = 0;
|
||||
m_pHooker = nil;
|
||||
m_nTimeTankShotGun = 0;
|
||||
field_248 = 0;
|
||||
field_EC = 0;
|
||||
m_nUpsideDownCounter = 0;
|
||||
m_nTimeCarSpentOnTwoWheels = 0;
|
||||
m_nDistanceCarTravelledOnTwoWheels = 0;
|
||||
m_nTimeNotFullyOnGround = 0;
|
||||
m_nTimeSpentOnWheelie = 0;
|
||||
m_nDistanceTravelledOnWheelie = 0.0f;
|
||||
m_nTimeSpentOnStoppie = 0;
|
||||
m_nDistanceTravelledOnStoppie = 0.0f;
|
||||
m_nCancelWheelStuntTimer = 0;
|
||||
m_nLastTimeCarSpentOnTwoWheels = 0;
|
||||
m_nLastDistanceCarTravelledOnTwoWheels = 0;
|
||||
m_nLastTimeSpentOnWheelie = 0;
|
||||
m_nLastDistanceTravelledOnWheelie = 0;
|
||||
m_nLastTimeSpentOnStoppie = 0;
|
||||
m_nLastDistanceTravelledOnStoppie = 0;
|
||||
m_bInfiniteSprint = false;
|
||||
m_bFastReload = false;
|
||||
m_bFireproof = false;
|
||||
m_nMaxHealth = m_nMaxArmour = 100;
|
||||
m_bGetOutOfJailFree = false;
|
||||
m_bGetOutOfHospitalFree = false;
|
||||
@ -147,11 +176,12 @@ CPlayerInfo::Clear(void)
|
||||
m_nPreviousTimeRewardedForExplosion = 0;
|
||||
m_nExplosionsSinceLastReward = 0;
|
||||
m_nHavocLevel = 0;
|
||||
m_fMediaAttention = 0;
|
||||
m_fMediaAttention = 0.0f;
|
||||
m_nCurrentBustedAudio = 1;
|
||||
m_nBustedAudioStatus = BUSTEDAUDIO_NONE;
|
||||
}
|
||||
|
||||
// --MIAMI: Done
|
||||
void
|
||||
CPlayerInfo::BlowUpRCBuggy(bool actually)
|
||||
{
|
||||
@ -163,6 +193,7 @@ CPlayerInfo::BlowUpRCBuggy(bool actually)
|
||||
m_pRemoteVehicle->BlowUpCar(FindPlayerPed());
|
||||
}
|
||||
|
||||
// --MIAMI: Done
|
||||
void
|
||||
CPlayerInfo::CancelPlayerEnteringCars(CVehicle *car)
|
||||
{
|
||||
@ -174,6 +205,7 @@ CPlayerInfo::CancelPlayerEnteringCars(CVehicle *car)
|
||||
m_pPed->ClearObjective();
|
||||
}
|
||||
|
||||
// --MIAMI: Done
|
||||
void
|
||||
CPlayerInfo::MakePlayerSafe(bool toggle)
|
||||
{
|
||||
@ -198,8 +230,7 @@ CPlayerInfo::MakePlayerSafe(bool toggle)
|
||||
CWorld::ExtinguishAllCarFiresInArea(GetPos(), 4000.0f);
|
||||
CReplay::DisableReplays();
|
||||
|
||||
}
|
||||
else {
|
||||
} else {
|
||||
m_pPed->m_pWanted->m_bIgnoredByEveryone = false;
|
||||
CPad::GetPad(0)->SetEnablePlayerControls(PLAYERCONTROL_PLAYERINFO);
|
||||
m_pPed->bBulletProof = false;
|
||||
@ -214,18 +245,21 @@ CPlayerInfo::MakePlayerSafe(bool toggle)
|
||||
}
|
||||
}
|
||||
|
||||
// --MIAMI: Done
|
||||
bool
|
||||
CPlayerInfo::IsRestartingAfterDeath()
|
||||
{
|
||||
return m_WBState == WBSTATE_WASTED;
|
||||
}
|
||||
|
||||
// --MIAMI: Done
|
||||
bool
|
||||
CPlayerInfo::IsRestartingAfterArrest()
|
||||
{
|
||||
return m_WBState == WBSTATE_BUSTED;
|
||||
}
|
||||
|
||||
// --MIAMI: Done
|
||||
// lastCloseness is passed to other calls of this function
|
||||
void
|
||||
CPlayerInfo::EvaluateCarPosition(CEntity *carToTest, CPed *player, float carBoundCentrePedDist, float *lastCloseness, CVehicle **closestCarOutput)
|
||||
@ -250,32 +284,7 @@ CPlayerInfo::EvaluateCarPosition(CEntity *carToTest, CPed *player, float carBoun
|
||||
}
|
||||
}
|
||||
|
||||
// There is something unfinished in here... Sadly all IDBs we have have it unfinished.
|
||||
void
|
||||
CPlayerInfo::AwardMoneyForExplosion(CVehicle *wreckedCar)
|
||||
{
|
||||
if (CTimer::GetTimeInMilliseconds() - m_nPreviousTimeRewardedForExplosion < 6000)
|
||||
++m_nExplosionsSinceLastReward;
|
||||
else
|
||||
m_nExplosionsSinceLastReward = 1;
|
||||
|
||||
m_nPreviousTimeRewardedForExplosion = CTimer::GetTimeInMilliseconds();
|
||||
int award = wreckedCar->pHandling->nMonetaryValue * 0.002f;
|
||||
sprintf(gString, "$%d", award);
|
||||
#ifdef MONEY_MESSAGES
|
||||
// This line is a leftover from PS2, I don't know what it was meant to be.
|
||||
// CVector sth(TheCamera.GetPosition() * 4.0f);
|
||||
|
||||
CMoneyMessages::RegisterOne(wreckedCar->GetPosition() + CVector(0.0f, 0.0f, 2.0f), gString, 0, 255, 0, 2.0f, 0.5f);
|
||||
#endif
|
||||
CWorld::Players[CWorld::PlayerInFocus].m_nMoney += award;
|
||||
|
||||
for (int i = m_nExplosionsSinceLastReward; i > 1; --i) {
|
||||
CGeneral::GetRandomNumber();
|
||||
CWorld::Players[CWorld::PlayerInFocus].m_nMoney += award;
|
||||
}
|
||||
}
|
||||
|
||||
// --MIAMI: Done
|
||||
void
|
||||
CPlayerInfo::SavePlayerInfo(uint8 *buf, uint32 *size)
|
||||
{
|
||||
@ -293,12 +302,19 @@ CPlayerInfo::SavePlayerInfo(uint8 *buf, uint32 *size)
|
||||
CopyToBuf(buf, CWorld::Players[CWorld::PlayerInFocus].m_nTotalPackages);
|
||||
CopyToBuf(buf, CWorld::Players[CWorld::PlayerInFocus].m_bInfiniteSprint);
|
||||
CopyToBuf(buf, CWorld::Players[CWorld::PlayerInFocus].m_bFastReload);
|
||||
CopyToBuf(buf, CWorld::Players[CWorld::PlayerInFocus].m_bFireproof);
|
||||
CopyToBuf(buf, CWorld::Players[CWorld::PlayerInFocus].m_nMaxHealth);
|
||||
CopyToBuf(buf, CWorld::Players[CWorld::PlayerInFocus].m_nMaxArmour);
|
||||
CopyToBuf(buf, CWorld::Players[CWorld::PlayerInFocus].m_bGetOutOfJailFree);
|
||||
CopyToBuf(buf, CWorld::Players[CWorld::PlayerInFocus].m_bGetOutOfHospitalFree);
|
||||
CopyToBuf(buf, CWorld::Players[CWorld::PlayerInFocus].m_bDriveByAllowed);
|
||||
CopyToBuf(buf, CWorld::Players[CWorld::PlayerInFocus].m_aPlayerName);
|
||||
CopyToBuf(buf, CWorld::Players[CWorld::PlayerInFocus].m_nBustedAudioStatus);
|
||||
CopyToBuf(buf, CWorld::Players[CWorld::PlayerInFocus].m_nCurrentBustedAudio);
|
||||
#undef CopyToBuf
|
||||
}
|
||||
|
||||
// --MIAMI: Done
|
||||
void
|
||||
CPlayerInfo::LoadPlayerInfo(uint8 *buf, uint32 size)
|
||||
{
|
||||
@ -313,12 +329,19 @@ CPlayerInfo::LoadPlayerInfo(uint8 *buf, uint32 size)
|
||||
CopyFromBuf(buf, CWorld::Players[CWorld::PlayerInFocus].m_nTotalPackages);
|
||||
CopyFromBuf(buf, CWorld::Players[CWorld::PlayerInFocus].m_bInfiniteSprint);
|
||||
CopyFromBuf(buf, CWorld::Players[CWorld::PlayerInFocus].m_bFastReload);
|
||||
CopyFromBuf(buf, CWorld::Players[CWorld::PlayerInFocus].m_bFireproof);
|
||||
CopyFromBuf(buf, CWorld::Players[CWorld::PlayerInFocus].m_nMaxHealth);
|
||||
CopyFromBuf(buf, CWorld::Players[CWorld::PlayerInFocus].m_nMaxArmour);
|
||||
CopyFromBuf(buf, CWorld::Players[CWorld::PlayerInFocus].m_bGetOutOfJailFree);
|
||||
CopyFromBuf(buf, CWorld::Players[CWorld::PlayerInFocus].m_bGetOutOfHospitalFree);
|
||||
CopyFromBuf(buf, CWorld::Players[CWorld::PlayerInFocus].m_aPlayerName)
|
||||
CopyFromBuf(buf, CWorld::Players[CWorld::PlayerInFocus].m_bDriveByAllowed);
|
||||
CopyFromBuf(buf, CWorld::Players[CWorld::PlayerInFocus].m_aPlayerName);
|
||||
CopyFromBuf(buf, CWorld::Players[CWorld::PlayerInFocus].m_nBustedAudioStatus);
|
||||
CopyFromBuf(buf, CWorld::Players[CWorld::PlayerInFocus].m_nCurrentBustedAudio)
|
||||
#undef CopyFromBuf
|
||||
}
|
||||
|
||||
// --MIAMI: Done
|
||||
void
|
||||
CPlayerInfo::FindClosestCarSectorList(CPtrList& carList, CPed* ped, float unk1, float unk2, float unk3, float unk4, float* lastCloseness, CVehicle** closestCarOutput)
|
||||
{
|
||||
@ -333,7 +356,7 @@ CPlayerInfo::FindClosestCarSectorList(CPtrList& carList, CPed* ped, float unk1,
|
||||
&& (car->GetUp().z > 0.3f || (car->IsVehicle() && ((CVehicle*)car)->m_vehType == VEHICLE_TYPE_BIKE))) {
|
||||
CVector carCentre = car->GetBoundCentre();
|
||||
|
||||
if (Abs(ped->GetPosition().z - carCentre.z) < 2.0f) {
|
||||
if (Abs(ped->GetPosition().z - carCentre.z) < 2.0f || car->IsCar() && carCentre.z < ped->GetPosition().z && ped->GetPosition().z - 4.f < carCentre.z) {
|
||||
float dist = (ped->GetPosition() - carCentre).Magnitude2D();
|
||||
if (dist <= 10.0f && !CCranes::IsThisCarBeingCarriedByAnyCrane(car)) {
|
||||
EvaluateCarPosition(car, ped, dist, lastCloseness, closestCarOutput);
|
||||
@ -367,6 +390,157 @@ CPlayerInfo::Process(void)
|
||||
if (startTaxiTimer)
|
||||
m_nUnusedTaxiTimer = CTimer::GetTimeInMilliseconds();
|
||||
|
||||
if (!m_pPed->InVehicle()) {
|
||||
m_nTimeCarSpentOnTwoWheels = 0;
|
||||
m_nTimeNotFullyOnGround = 0;
|
||||
m_nTimeSpentOnWheelie = 0;
|
||||
m_nTimeSpentOnStoppie = 0;
|
||||
m_nCancelWheelStuntTimer = 0;
|
||||
} else if (m_pPed->m_pMyVehicle->IsCar()) {
|
||||
CAutomobile *car = (CAutomobile*)m_pPed->m_pMyVehicle;
|
||||
|
||||
if (car->m_nWheelsOnGround < 3)
|
||||
m_nTimeNotFullyOnGround += CTimer::GetTimeInMilliseconds();
|
||||
else
|
||||
m_nTimeNotFullyOnGround = 0;
|
||||
|
||||
if (car->m_aSuspensionSpringRatioPrev[2] == 1.f && car->m_aSuspensionSpringRatioPrev[3] == 1.f) {
|
||||
if (car->m_aSuspensionSpringRatioPrev[0] < 1.0f && car->m_aSuspensionSpringRatioPrev[1] < 1.0f && car->m_fDamageImpulse == 0.0f) {
|
||||
m_nTimeCarSpentOnTwoWheels += CTimer::GetTimeStepInMilliseconds();
|
||||
m_nDistanceCarTravelledOnTwoWheels += car->m_fDistanceTravelled;
|
||||
m_nCancelWheelStuntTimer = Max(0.0f, m_nCancelWheelStuntTimer - CTimer::GetTimeStepInMilliseconds() * 0.5f);
|
||||
|
||||
} else {
|
||||
if (m_nTimeCarSpentOnTwoWheels != 0 && m_nCancelWheelStuntTimer < 500) {
|
||||
m_nCancelWheelStuntTimer += CTimer::GetTimeStepInMilliseconds();
|
||||
} else {
|
||||
if (m_nTimeCarSpentOnTwoWheels >= 2000) {
|
||||
m_nLastTimeCarSpentOnTwoWheels = m_nTimeCarSpentOnTwoWheels;
|
||||
m_nLastDistanceCarTravelledOnTwoWheels = m_nDistanceCarTravelledOnTwoWheels;
|
||||
if (CStats::Longest2Wheel < m_nTimeCarSpentOnTwoWheels / 1000)
|
||||
CStats::Longest2Wheel = m_nTimeCarSpentOnTwoWheels / 1000;
|
||||
if (CStats::Longest2WheelDist < m_nDistanceCarTravelledOnTwoWheels)
|
||||
CStats::Longest2WheelDist = m_nDistanceCarTravelledOnTwoWheels;
|
||||
}
|
||||
m_nTimeCarSpentOnTwoWheels = 0;
|
||||
m_nDistanceCarTravelledOnTwoWheels = 0;
|
||||
m_nCancelWheelStuntTimer = 0;
|
||||
}
|
||||
}
|
||||
} else if (car->m_aSuspensionSpringRatioPrev[0] == 1.0f && car->m_aSuspensionSpringRatioPrev[1] == 1.0f) {
|
||||
#ifdef FIX_BUGS
|
||||
if (car->m_aSuspensionSpringRatioPrev[2] < 1.f
|
||||
#else
|
||||
if (car->m_aSuspensionSpringRatioPrev[1] < 1.f
|
||||
#endif
|
||||
&& car->m_aSuspensionSpringRatioPrev[3] < 1.f && 0.0f == car->m_fDamageImpulse) {
|
||||
m_nTimeCarSpentOnTwoWheels += CTimer::GetTimeStepInMilliseconds();
|
||||
m_nDistanceCarTravelledOnTwoWheels += car->m_fDistanceTravelled;
|
||||
m_nCancelWheelStuntTimer = Max(0.0f, m_nCancelWheelStuntTimer - CTimer::GetTimeStepInMilliseconds() * 0.2f);
|
||||
|
||||
} else if (m_nTimeCarSpentOnTwoWheels != 0 && m_nCancelWheelStuntTimer < 500) {
|
||||
m_nCancelWheelStuntTimer += CTimer::GetTimeStepInMilliseconds();
|
||||
|
||||
} else {
|
||||
if (m_nTimeCarSpentOnTwoWheels >= 2000) {
|
||||
m_nLastTimeCarSpentOnTwoWheels = m_nTimeCarSpentOnTwoWheels;
|
||||
m_nLastDistanceCarTravelledOnTwoWheels = m_nDistanceCarTravelledOnTwoWheels;
|
||||
if (CStats::Longest2Wheel < m_nTimeCarSpentOnTwoWheels / 1000)
|
||||
CStats::Longest2Wheel = m_nTimeCarSpentOnTwoWheels / 1000;
|
||||
if (CStats::Longest2WheelDist < m_nDistanceCarTravelledOnTwoWheels)
|
||||
CStats::Longest2WheelDist = m_nDistanceCarTravelledOnTwoWheels;
|
||||
}
|
||||
m_nTimeCarSpentOnTwoWheels = 0;
|
||||
m_nDistanceCarTravelledOnTwoWheels = 0;
|
||||
m_nCancelWheelStuntTimer = 0;
|
||||
}
|
||||
} else if (m_nTimeCarSpentOnTwoWheels != 0) {
|
||||
if (m_nTimeCarSpentOnTwoWheels >= 2000) {
|
||||
m_nLastTimeCarSpentOnTwoWheels = m_nTimeCarSpentOnTwoWheels;
|
||||
m_nLastDistanceCarTravelledOnTwoWheels = m_nDistanceCarTravelledOnTwoWheels;
|
||||
if (CStats::Longest2Wheel < m_nTimeCarSpentOnTwoWheels / 1000)
|
||||
CStats::Longest2Wheel = m_nTimeCarSpentOnTwoWheels / 1000;
|
||||
if (CStats::Longest2WheelDist < m_nDistanceCarTravelledOnTwoWheels)
|
||||
CStats::Longest2WheelDist = m_nDistanceCarTravelledOnTwoWheels;
|
||||
}
|
||||
m_nTimeCarSpentOnTwoWheels = 0;
|
||||
m_nDistanceCarTravelledOnTwoWheels = 0;
|
||||
m_nCancelWheelStuntTimer = 0;
|
||||
}
|
||||
m_nTimeSpentOnWheelie = 0;
|
||||
m_nTimeSpentOnStoppie = 0;
|
||||
} else if (m_pPed->m_pMyVehicle->IsBike()) {
|
||||
CBike *bike = (CBike*)m_pPed->m_pMyVehicle;
|
||||
if (bike->m_aSuspensionSpringRatioPrev[0] == 1.0f && bike->m_aSuspensionSpringRatioPrev[1] == 1.0f) {
|
||||
if (bike->m_aSuspensionSpringRatioPrev[2] < 1.0f
|
||||
|| (bike->m_aSuspensionSpringRatioPrev[3] < 1.0f && 0.0f == bike->m_fDamageImpulse)) {
|
||||
m_nTimeSpentOnWheelie += CTimer::GetTimeStepInMilliseconds();
|
||||
m_nDistanceTravelledOnWheelie += bike->m_fDistanceTravelled;
|
||||
m_nCancelWheelStuntTimer = Max(0.0f, m_nCancelWheelStuntTimer - CTimer::GetTimeStepInMilliseconds() * 0.2f);
|
||||
|
||||
} else {
|
||||
if (m_nTimeSpentOnWheelie != 0 && m_nCancelWheelStuntTimer < 500) {
|
||||
m_nCancelWheelStuntTimer += CTimer::GetTimeStepInMilliseconds();
|
||||
} else {
|
||||
if (m_nTimeSpentOnWheelie >= 5000) {
|
||||
m_nLastTimeSpentOnWheelie = m_nTimeSpentOnWheelie;
|
||||
m_nLastDistanceTravelledOnWheelie = m_nDistanceTravelledOnWheelie;
|
||||
if (CStats::LongestWheelie < m_nTimeSpentOnWheelie / 1000)
|
||||
CStats::LongestWheelie = m_nTimeSpentOnWheelie / 1000;
|
||||
if (CStats::LongestWheelieDist < m_nDistanceTravelledOnWheelie)
|
||||
CStats::LongestWheelieDist = m_nDistanceTravelledOnWheelie;
|
||||
}
|
||||
m_nTimeSpentOnWheelie = 0;
|
||||
m_nDistanceTravelledOnWheelie = 0;
|
||||
m_nCancelWheelStuntTimer = 0;
|
||||
}
|
||||
}
|
||||
} else if (m_nTimeSpentOnWheelie != 0) {
|
||||
if (m_nTimeSpentOnWheelie >= 5000) {
|
||||
m_nLastTimeSpentOnWheelie = m_nTimeSpentOnWheelie;
|
||||
m_nLastDistanceTravelledOnWheelie = m_nDistanceTravelledOnWheelie;
|
||||
if (CStats::LongestWheelie < m_nTimeSpentOnWheelie / 1000)
|
||||
CStats::LongestWheelie = m_nTimeSpentOnWheelie / 1000;
|
||||
if (CStats::LongestWheelieDist < m_nDistanceTravelledOnWheelie)
|
||||
CStats::LongestWheelieDist = m_nDistanceTravelledOnWheelie;
|
||||
}
|
||||
m_nTimeSpentOnWheelie = 0;
|
||||
m_nDistanceTravelledOnWheelie = 0;
|
||||
m_nCancelWheelStuntTimer = 0;
|
||||
|
||||
} else if (bike->m_aSuspensionSpringRatioPrev[2] == 1.0f && bike->m_aSuspensionSpringRatioPrev[3] == 1.0f
|
||||
&& 0.0f == bike->m_fDamageImpulse) {
|
||||
m_nTimeSpentOnStoppie += CTimer::GetTimeStepInMilliseconds();
|
||||
m_nDistanceTravelledOnStoppie += bike->m_fDistanceTravelled;
|
||||
m_nCancelWheelStuntTimer = Max(0.0f, m_nCancelWheelStuntTimer - CTimer::GetTimeStepInMilliseconds() * 0.2f);
|
||||
|
||||
} else {
|
||||
if (m_nTimeSpentOnStoppie != 0 && m_nCancelWheelStuntTimer < 500) {
|
||||
m_nCancelWheelStuntTimer += CTimer::GetTimeStepInMilliseconds();
|
||||
} else {
|
||||
if (m_nTimeSpentOnStoppie >= 2000) {
|
||||
m_nLastTimeSpentOnStoppie = m_nTimeSpentOnStoppie;
|
||||
m_nLastDistanceTravelledOnStoppie = m_nDistanceTravelledOnStoppie;
|
||||
if (CStats::LongestStoppie < m_nTimeSpentOnStoppie / 1000)
|
||||
CStats::LongestStoppie = m_nTimeSpentOnStoppie / 1000;
|
||||
if (CStats::LongestStoppieDist < m_nDistanceTravelledOnStoppie)
|
||||
CStats::LongestStoppieDist = m_nDistanceTravelledOnStoppie;
|
||||
}
|
||||
m_nTimeSpentOnStoppie = 0;
|
||||
m_nDistanceTravelledOnStoppie = 0;
|
||||
m_nCancelWheelStuntTimer = 0;
|
||||
}
|
||||
}
|
||||
m_nTimeCarSpentOnTwoWheels = 0;
|
||||
m_nTimeNotFullyOnGround = 0;
|
||||
} else {
|
||||
m_nTimeCarSpentOnTwoWheels = 0;
|
||||
m_nTimeNotFullyOnGround = 0;
|
||||
m_nTimeSpentOnWheelie = 0;
|
||||
m_nTimeSpentOnStoppie = 0;
|
||||
m_nCancelWheelStuntTimer = 0;
|
||||
}
|
||||
|
||||
// The effect that makes money counter does while earning/losing money
|
||||
if (m_nVisibleMoney != m_nMoney) {
|
||||
int diff = m_nMoney - m_nVisibleMoney;
|
||||
@ -395,7 +569,7 @@ CPlayerInfo::Process(void)
|
||||
m_fRoadDensity = ThePaths.CalcRoadDensity(playerPos.x, playerPos.y);
|
||||
}
|
||||
|
||||
m_fRoadDensity = clamp(m_fRoadDensity, 0.4f, 1.45f);
|
||||
m_fRoadDensity = clamp(m_fRoadDensity, 0.5f, 1.45f);
|
||||
|
||||
// Because vehicle enter/exit use same key binding.
|
||||
bool enterOrExitVeh;
|
||||
@ -404,39 +578,31 @@ CPlayerInfo::Process(void)
|
||||
else
|
||||
enterOrExitVeh = CPad::GetPad(0)->GetExitVehicle();
|
||||
|
||||
if (enterOrExitVeh && m_pPed->m_nPedState != PED_SNIPER_MODE && m_pPed->m_nPedState != PED_ROCKET_MODE) {
|
||||
if (enterOrExitVeh && m_pPed->m_nPedState != PED_ANSWER_MOBILE && m_pPed->m_nPedState != PED_SNIPER_MODE && m_pPed->m_nPedState != PED_ROCKET_MODE) {
|
||||
if (m_pPed->bInVehicle) {
|
||||
if (!m_pRemoteVehicle) {
|
||||
CEntity *surfaceBelowVeh = m_pPed->m_pMyVehicle->m_pCurGroundEntity;
|
||||
if (!surfaceBelowVeh || !CBridge::ThisIsABridgeObjectMovingUp(surfaceBelowVeh->GetModelIndex())) {
|
||||
CVehicle *veh = m_pPed->m_pMyVehicle;
|
||||
if (!veh->IsBoat() || veh->m_nDoorLock == CARLOCK_LOCKED_PLAYER_INSIDE) {
|
||||
|
||||
// This condition will always return true, else block was probably WIP Miami code.
|
||||
if (veh->m_vehType != VEHICLE_TYPE_BIKE || veh->m_nDoorLock == CARLOCK_LOCKED_PLAYER_INSIDE) {
|
||||
if (veh->GetStatus() != STATUS_WRECKED && veh->GetStatus() != STATUS_TRAIN_MOVING && veh->m_nDoorLock != CARLOCK_LOCKED_PLAYER_INSIDE) {
|
||||
if (veh->m_vecMoveSpeed.Magnitude() < 0.17f && CTimer::GetTimeScale() >= 0.5f && !veh->bIsInWater) {
|
||||
m_pPed->SetObjective(OBJECTIVE_LEAVE_CAR, veh);
|
||||
}
|
||||
if (veh->GetStatus() != STATUS_WRECKED && veh->GetStatus() != STATUS_TRAIN_MOVING && veh->m_nDoorLock != CARLOCK_LOCKED_PLAYER_INSIDE) {
|
||||
bool canJumpOff = false;
|
||||
if (veh->m_vehType == VEHICLE_TYPE_BIKE) {
|
||||
canJumpOff = veh->CanPedJumpOffBike();
|
||||
} else if (veh->pDriver == m_pPed) {
|
||||
canJumpOff = veh->CanPedJumpOutCar();
|
||||
}
|
||||
} else {
|
||||
CVector sth = 0.7f * veh->GetRight() + veh->GetPosition();
|
||||
bool found = false;
|
||||
float groundZ = CWorld::FindGroundZFor3DCoord(sth.x, sth.y, 2.0f + sth.z, &found);
|
||||
|
||||
if (found)
|
||||
sth.z = 1.0f + groundZ;
|
||||
m_pPed->m_nPedState = PED_IDLE;
|
||||
m_pPed->SetMoveState(PEDMOVE_STILL);
|
||||
CPed::PedSetOutCarCB(0, m_pPed);
|
||||
CAnimManager::BlendAnimation(m_pPed->GetClump(), m_pPed->m_animGroup, ANIM_IDLE_STANCE, 100.0f);
|
||||
CAnimManager::BlendAnimation(m_pPed->GetClump(), ASSOCGRP_STD, ANIM_FALL_LAND, 100.0f);
|
||||
m_pPed->SetPosition(sth);
|
||||
m_pPed->SetMoveState(PEDMOVE_STILL);
|
||||
m_pPed->m_vecMoveSpeed = veh->m_vecMoveSpeed;
|
||||
if (canJumpOff || veh->m_vecMoveSpeed.Magnitude() < 0.1f) {
|
||||
if (!veh->bIsInWater)
|
||||
m_pPed->SetObjective(OBJECTIVE_LEAVE_CAR, veh);
|
||||
|
||||
} else if (veh->GetStatus() != STATUS_PLAYER && veh != CGameLogic::pShortCutTaxi) {
|
||||
veh->AutoPilot.m_nTempAction = TEMPACT_WAIT;
|
||||
veh->AutoPilot.m_nTimeTempAction = CTimer::GetTimeInMilliseconds() + 1000;
|
||||
}
|
||||
}
|
||||
} else {
|
||||
// The code in here was under CPed::SetExitBoat in VC, did the same for here.
|
||||
m_pPed->SetExitBoat(veh);
|
||||
m_pPed->bTryingToReachDryLand = true;
|
||||
}
|
||||
@ -451,14 +617,10 @@ CPlayerInfo::Process(void)
|
||||
CEntity *surfaceBelow = m_pPed->m_pCurrentPhysSurface;
|
||||
if (surfaceBelow && surfaceBelow->IsVehicle()) {
|
||||
carBelow = (CVehicle*)surfaceBelow;
|
||||
if (carBelow->IsBoat()) {
|
||||
if (carBelow->IsBoat() && carBelow->m_modelIndex != MI_SKIMMER) {
|
||||
weAreOnBoat = true;
|
||||
m_pPed->bOnBoat = true;
|
||||
#ifdef VC_PED_PORTS
|
||||
if (carBelow->GetStatus() != STATUS_WRECKED && carBelow->GetUp().z > 0.3f)
|
||||
#else
|
||||
if (carBelow->GetStatus() != STATUS_WRECKED)
|
||||
#endif
|
||||
m_pPed->SetSeekBoatPosition(carBelow);
|
||||
}
|
||||
}
|
||||
@ -506,14 +668,15 @@ CPlayerInfo::Process(void)
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
if (m_bInRemoteMode) {
|
||||
uint32 timeWithoutRemoteCar = CTimer::GetTimeInMilliseconds() - m_nTimeLostRemoteCar;
|
||||
if (CTimer::GetPreviousTimeInMilliseconds() - m_nTimeLostRemoteCar < 1000 && timeWithoutRemoteCar >= 1000 && m_WBState == WBSTATE_PLAYING) {
|
||||
if (CTimer::GetPreviousTimeInMilliseconds() - m_nTimeLostRemoteCar < 1000 && timeWithoutRemoteCar >= 1000 && m_WBState == WBSTATE_PLAYING && field_D6) {
|
||||
TheCamera.SetFadeColour(0, 0, 0);
|
||||
TheCamera.Fade(1.0f, 0);
|
||||
}
|
||||
if (timeWithoutRemoteCar > 2000) {
|
||||
if (m_WBState == WBSTATE_PLAYING) {
|
||||
if (m_WBState == WBSTATE_PLAYING && field_D6) {
|
||||
TheCamera.RestoreWithJumpCut();
|
||||
TheCamera.SetFadeColour(0, 0, 0);
|
||||
TheCamera.Fade(1.0f, 1);
|
||||
@ -525,6 +688,7 @@ CPlayerInfo::Process(void)
|
||||
CTimer::Update();
|
||||
}
|
||||
m_bInRemoteMode = false;
|
||||
CWorld::Players[CWorld::PlayerInFocus].m_pRemoteVehicle->bRemoveFromWorld = true;
|
||||
CWorld::Players[CWorld::PlayerInFocus].m_pRemoteVehicle = nil;
|
||||
if (FindPlayerVehicle()) {
|
||||
FindPlayerVehicle()->SetStatus(STATUS_PLAYER);
|
||||
@ -534,11 +698,10 @@ CPlayerInfo::Process(void)
|
||||
if (!(CTimer::GetFrameCounter() & 31)) {
|
||||
CVehicle *veh = FindPlayerVehicle();
|
||||
if (veh && m_pPed->bInVehicle && veh->GetUp().z < 0.0f
|
||||
&& veh->m_vecMoveSpeed.Magnitude() < 0.05f && veh->IsCar() && !veh->bIsInWater) {
|
||||
&& veh->m_vecMoveSpeed.Magnitude() < 0.05f && (veh->IsCar() || veh->IsBoat()) && !veh->bIsInWater) {
|
||||
|
||||
if (veh->GetUp().z < -0.5f) {
|
||||
m_nUpsideDownCounter += 2;
|
||||
|
||||
} else {
|
||||
m_nUpsideDownCounter++;
|
||||
}
|
||||
@ -562,8 +725,74 @@ CPlayerInfo::Process(void)
|
||||
if (veh->pPassengers[i])
|
||||
veh->pPassengers[i]->m_nZoneLevel = LEVEL_GENERIC;
|
||||
}
|
||||
CStats::DistanceTravelledInVehicle += veh->m_fDistanceTravelled;
|
||||
if(veh->m_modelIndex == MI_CADDY)
|
||||
CStats::DistanceTravelledByGolfCart += veh->m_fDistanceTravelled;
|
||||
else {
|
||||
if(veh->GetVehicleAppearance() == VEHICLE_APPEARANCE_HELI)
|
||||
CStats::DistanceTravelledByHelicoptor += veh->m_fDistanceTravelled;
|
||||
if (veh->GetVehicleAppearance() == VEHICLE_APPEARANCE_PLANE)
|
||||
CStats::DistanceTravelledByPlane += veh->m_fDistanceTravelled;
|
||||
if (veh->GetVehicleAppearance() == VEHICLE_APPEARANCE_CAR)
|
||||
CStats::DistanceTravelledByCar += veh->m_fDistanceTravelled;
|
||||
if (veh->GetVehicleAppearance() == VEHICLE_APPEARANCE_BIKE)
|
||||
CStats::DistanceTravelledByBike += veh->m_fDistanceTravelled;
|
||||
if (veh->GetVehicleAppearance() == VEHICLE_APPEARANCE_BOAT)
|
||||
CStats::DistanceTravelledByBoat += veh->m_fDistanceTravelled;
|
||||
|
||||
if (veh->GetVehicleAppearance() == VEHICLE_APPEARANCE_PLANE) {
|
||||
if (veh->m_vecMoveSpeed.Magnitude() > 0.2f) {
|
||||
CStats::FlightTime += CTimer::GetTimeStep() * 16.f; // what a weird choice
|
||||
}
|
||||
}
|
||||
}
|
||||
} else {
|
||||
CStats::DistanceTravelledOnFoot += FindPlayerPed()->m_fDistanceTravelled;
|
||||
}
|
||||
|
||||
if (m_pPed->m_pWanted->m_nWantedLevel && !CTheScripts::IsPlayerOnAMission()) {
|
||||
float maxDelta = 0.0f;
|
||||
static bool movedSignificantly = true;
|
||||
static bool thereIsACarPathNear = true;
|
||||
// there was one more guard without variable's itself???
|
||||
|
||||
if (CTimer::GetTimeInMilliseconds() / 20000 != CTimer::GetPreviousTimeInMilliseconds() / 20000) {
|
||||
float posChange = (lastPlayerPos - FindPlayerCoors()).Magnitude();
|
||||
movedSignificantly = posChange >= 10.0f;
|
||||
lastPlayerPos = FindPlayerCoors();
|
||||
thereIsACarPathNear = ThePaths.FindNodeClosestToCoors(FindPlayerCoors(), PATH_CAR, 60.0f, true, false, false, false) != 0;
|
||||
}
|
||||
switch (m_pPed->m_pWanted->m_nWantedLevel) {
|
||||
case 1:
|
||||
maxDelta = 31.f;
|
||||
break;
|
||||
case 2:
|
||||
maxDelta = 62.f;
|
||||
break;
|
||||
case 3:
|
||||
maxDelta = 125.f;
|
||||
break;
|
||||
case 4:
|
||||
maxDelta = 250.f;
|
||||
break;
|
||||
case 5:
|
||||
maxDelta = 500.f;
|
||||
break;
|
||||
case 6:
|
||||
maxDelta = 1000.f;
|
||||
break;
|
||||
default:
|
||||
break;
|
||||
}
|
||||
float increaseDelta = maxDelta - m_fMediaAttention;
|
||||
float increaseAttentionBy = CTimer::GetTimeStep() * 0.0001f * increaseDelta;
|
||||
if (increaseAttentionBy < 0.0f
|
||||
|| movedSignificantly && thereIsACarPathNear && !CCullZones::NoPolice() && !CCullZones::PoliceAbandonCars() && CGame::currArea == AREA_MAIN_MAP) {
|
||||
m_fMediaAttention += increaseAttentionBy;
|
||||
}
|
||||
} else {
|
||||
m_fMediaAttention = 0.0f;
|
||||
}
|
||||
CStats::HighestChaseValue = Max(m_fMediaAttention, CStats::HighestChaseValue);
|
||||
m_nMoney = Min(999999999, m_nMoney);
|
||||
m_nVisibleMoney = Min(999999999, m_nVisibleMoney);
|
||||
}
|
||||
|
@ -45,19 +45,33 @@ public:
|
||||
int8 m_WBState; // eWastedBustedState
|
||||
uint32 m_nWBTime;
|
||||
bool m_bInRemoteMode;
|
||||
bool field_D5;
|
||||
bool field_D6;
|
||||
uint32 m_nTimeLostRemoteCar;
|
||||
uint32 m_nTimeLastHealthLoss;
|
||||
uint32 m_nTimeLastArmourLoss;
|
||||
uint32 m_nTimeTankShotGun;
|
||||
int32 m_nTimeNotFullyOnGround;
|
||||
int32 m_nUpsideDownCounter;
|
||||
int32 field_248;
|
||||
int32 field_EC;
|
||||
int32 m_nTimeCarSpentOnTwoWheels;
|
||||
int32 m_nDistanceCarTravelledOnTwoWheels;
|
||||
int32 m_nTimeNotFullyOnGround;
|
||||
int32 m_nTimeSpentOnWheelie;
|
||||
float m_nDistanceTravelledOnWheelie;
|
||||
int32 m_nTimeSpentOnStoppie;
|
||||
float m_nDistanceTravelledOnStoppie;
|
||||
int32 m_nCancelWheelStuntTimer;
|
||||
int32 m_nLastTimeCarSpentOnTwoWheels;
|
||||
int32 m_nLastDistanceCarTravelledOnTwoWheels;
|
||||
int32 m_nLastTimeSpentOnWheelie;
|
||||
int32 m_nLastDistanceTravelledOnWheelie;
|
||||
int32 m_nLastTimeSpentOnStoppie;
|
||||
int32 m_nLastDistanceTravelledOnStoppie;
|
||||
int16 m_nTrafficMultiplier;
|
||||
int16 field_12A;
|
||||
float m_fRoadDensity;
|
||||
uint32 m_nPreviousTimeRewardedForExplosion;
|
||||
int32 m_nExplosionsSinceLastReward;
|
||||
int32 field_268;
|
||||
int32 field_272;
|
||||
uint32 m_nExplosionsSinceLastReward;
|
||||
uint32 m_nHavocLevel;
|
||||
float m_fMediaAttention;
|
||||
bool m_bInfiniteSprint;
|
||||
@ -76,7 +90,6 @@ public:
|
||||
void MakePlayerSafe(bool);
|
||||
void LoadPlayerSkin();
|
||||
void DeletePlayerSkin();
|
||||
void AwardMoneyForExplosion(CVehicle *vehicle);
|
||||
void SetPlayerSkin(char* skin);
|
||||
const CVector &GetPos();
|
||||
void Process(void);
|
||||
|
@ -19,7 +19,7 @@
|
||||
#define COORDBLIP_MARKER_COLOR_R 252
|
||||
#define COORDBLIP_MARKER_COLOR_G 138
|
||||
#define COORDBLIP_MARKER_COLOR_B 242
|
||||
#define COORDBLIP_MARKER_COLOR_A 255
|
||||
#define COORDBLIP_MARKER_COLOR_A 228
|
||||
|
||||
#define NUM_MAP_LEGENDS 75
|
||||
|
||||
|
@ -3,12 +3,14 @@
|
||||
#include "Stats.h"
|
||||
#include "Text.h"
|
||||
#include "World.h"
|
||||
#include "Pad.h"
|
||||
|
||||
#include <climits>
|
||||
|
||||
//TODO
|
||||
int32 CStats::SeagullsKilled;
|
||||
|
||||
int32 CStats::BoatsExploded;
|
||||
int32 CStats::WantedStarsAttained;
|
||||
int32 CStats::WantedStarsEvaded;
|
||||
int32 CStats::DaysPassed;
|
||||
int32 CStats::HeadsPopped;
|
||||
int32 CStats::CommercialPassed;
|
||||
@ -21,8 +23,25 @@ int32 CStats::PedsKilledOfThisType[NUM_PEDTYPES];
|
||||
int32 CStats::TimesDied;
|
||||
int32 CStats::TimesArrested;
|
||||
int32 CStats::KillsSinceLastCheckpoint;
|
||||
float CStats::DistanceTravelledInVehicle;
|
||||
float CStats::DistanceTravelledByCar;
|
||||
float CStats::DistanceTravelledByHelicoptor;
|
||||
float CStats::DistanceTravelledByBike;
|
||||
float CStats::DistanceTravelledByBoat;
|
||||
float CStats::DistanceTravelledByPlane;
|
||||
float CStats::DistanceTravelledByGolfCart;
|
||||
float CStats::DistanceTravelledOnFoot;
|
||||
int32 CStats::FlightTime;
|
||||
int32 CStats::TimesDrowned;
|
||||
int32 CStats::PhotosTaken;
|
||||
float CStats::LoanSharks;
|
||||
float CStats::StoresKnockedOff;
|
||||
float CStats::MovieStunts;
|
||||
float CStats::Assassinations;
|
||||
float CStats::PizzasDelivered;
|
||||
float CStats::GarbagePickups;
|
||||
float CStats::IceCreamSold;
|
||||
float CStats::TopShootingRangeScore;
|
||||
float CStats::ShootingRank;
|
||||
int32 CStats::ProgressMade;
|
||||
int32 CStats::TotalProgressInGame;
|
||||
int32 CStats::CarsExploded;
|
||||
@ -40,94 +59,153 @@ int32 CStats::MissionsGiven;
|
||||
int32 CStats::MissionsPassed;
|
||||
char CStats::LastMissionPassedName[8];
|
||||
int32 CStats::TotalLegitimateKills;
|
||||
int32 CStats::ElBurroTime;
|
||||
int32 CStats::Record4x4One;
|
||||
int32 CStats::Record4x4Two;
|
||||
int32 CStats::Record4x4Three;
|
||||
int32 CStats::Record4x4Mayhem;
|
||||
int32 CStats::LivesSavedWithAmbulance;
|
||||
int32 CStats::CriminalsCaught;
|
||||
int32 CStats::HighestLevelAmbulanceMission;
|
||||
int32 CStats::HighestLevelVigilanteMission;
|
||||
int32 CStats::HighestLevelFireMission;
|
||||
int32 CStats::FiresExtinguished;
|
||||
int32 CStats::TimeTakenDefuseMission;
|
||||
int32 CStats::TotalNumberKillFrenzies;
|
||||
int32 CStats::TotalNumberMissions;
|
||||
int32 CStats::RoundsFiredByPlayer;
|
||||
int32 CStats::KgsOfExplosivesUsed;
|
||||
int32 CStats::InstantHitsFiredByPlayer;
|
||||
int32 CStats::InstantHitsHitByPlayer;
|
||||
int32 CStats::BulletsThatHit;
|
||||
int32 CStats::BestTimeBombDefusal;
|
||||
int32 CStats::FastestTimes[CStats::TOTAL_FASTEST_TIMES];
|
||||
int32 CStats::HighestScores[CStats::TOTAL_HIGHEST_SCORES];
|
||||
int32 CStats::BestPositions[CStats::TOTAL_BEST_POSITIONS];
|
||||
bool CStats::PropertyOwned[CStats::TOTAL_PROPERTIES];
|
||||
int32 CStats::NumPropertyOwned;
|
||||
int32 CStats::PropertyDestroyed;
|
||||
float CStats::HighestChaseValue;
|
||||
int32 CStats::CheatedCount;
|
||||
int32 CStats::ShowChaseStatOnScreen;
|
||||
int32 CStats::PamphletMissionPassed;
|
||||
bool CStats::abSonyCDs[1];
|
||||
int32 CStats::BloodRingKills;
|
||||
int32 CStats::BloodRingTime;
|
||||
float CStats::FavoriteRadioStationList[NUM_RADIOS];
|
||||
|
||||
int32 CStats::Sprayings;
|
||||
float CStats::AutoPaintingBudget;
|
||||
int32 CStats::NoMoreHurricanes;
|
||||
float CStats::FashionBudget;
|
||||
float CStats::PropertyBudget;
|
||||
float CStats::WeaponBudget;
|
||||
int32 CStats::SafeHouseVisits;
|
||||
int32 CStats::TyresPopped;
|
||||
|
||||
int32 CStats::LongestWheelie;
|
||||
int32 CStats::LongestStoppie;
|
||||
int32 CStats::Longest2Wheel;
|
||||
float CStats::LongestWheelieDist;
|
||||
float CStats::LongestStoppieDist;
|
||||
float CStats::Longest2WheelDist;
|
||||
|
||||
// --MIAMI: functions below are done except TODOs, but there are some to be moved from Frontend
|
||||
|
||||
void CStats::Init()
|
||||
{
|
||||
PeopleKilledByOthers = 0;
|
||||
PeopleKilledByPlayer = 0;
|
||||
RoundsFiredByPlayer = 0;
|
||||
CarsExploded = 0;
|
||||
BoatsExploded = 0;
|
||||
RoundsFiredByPlayer = 0;
|
||||
for (int i = 0; i < NUM_PEDTYPES; i++)
|
||||
PedsKilledOfThisType[i] = 0;
|
||||
HelisDestroyed = 0;
|
||||
ProgressMade = 0;
|
||||
KgsOfExplosivesUsed = 0;
|
||||
InstantHitsFiredByPlayer = 0;
|
||||
InstantHitsHitByPlayer = 0;
|
||||
BulletsThatHit = 0;
|
||||
TyresPopped = 0;
|
||||
HeadsPopped = 0;
|
||||
WantedStarsAttained = 0;
|
||||
WantedStarsEvaded = 0;
|
||||
TimesArrested = 0;
|
||||
TimesDied = 0;
|
||||
DaysPassed = 0;
|
||||
NumberOfUniqueJumpsFound = 0;
|
||||
MaximumJumpFlips = 0;
|
||||
MaximumJumpSpins = 0;
|
||||
SafeHouseVisits = 0;
|
||||
Sprayings = 0;
|
||||
MaximumJumpDistance = 0;
|
||||
MaximumJumpHeight = 0;
|
||||
MaximumJumpFlips = 0;
|
||||
MaximumJumpSpins = 0;
|
||||
BestStuntJump = 0;
|
||||
NumberOfUniqueJumpsFound = 0;
|
||||
TotalNumberOfUniqueJumps = 0;
|
||||
Record4x4One = 0;
|
||||
Record4x4Two = 0;
|
||||
PassengersDroppedOffWithTaxi = 0;
|
||||
Record4x4Three = 0;
|
||||
MoneyMadeWithTaxi = 0;
|
||||
Record4x4Mayhem = 0;
|
||||
LivesSavedWithAmbulance = 0;
|
||||
ElBurroTime = 0;
|
||||
CriminalsCaught = 0;
|
||||
MissionsGiven = 0;
|
||||
HighestLevelAmbulanceMission = 0;
|
||||
MissionsPassed = 0;
|
||||
FiresExtinguished = 0;
|
||||
PassengersDroppedOffWithTaxi = 0;
|
||||
MoneyMadeWithTaxi = 0;
|
||||
DistanceTravelledOnFoot = 0;
|
||||
TimeTakenDefuseMission = 0;
|
||||
DistanceTravelledByCar = 0;
|
||||
DistanceTravelledByBike = 0;
|
||||
DistanceTravelledByBoat = 0;
|
||||
DistanceTravelledByGolfCart = 0;
|
||||
DistanceTravelledByHelicoptor = 0;
|
||||
DistanceTravelledByPlane = 0; // FIX: Wasn't initialized
|
||||
LivesSavedWithAmbulance = 0;
|
||||
CriminalsCaught = 0;
|
||||
HighestLevelVigilanteMission = 0;
|
||||
HighestLevelAmbulanceMission = 0;
|
||||
HighestLevelFireMission = 0;
|
||||
FiresExtinguished = 0;
|
||||
PhotosTaken = 0;
|
||||
NumberKillFrenziesPassed = 0;
|
||||
DistanceTravelledInVehicle = 0;
|
||||
TotalNumberKillFrenzies = 0;
|
||||
TotalNumberMissions = 0;
|
||||
KillsSinceLastCheckpoint = 0;
|
||||
TotalLegitimateKills = 0;
|
||||
FlightTime = 0;
|
||||
TimesDrowned = 0;
|
||||
SeagullsKilled = 0;
|
||||
WeaponBudget = 0.0f;
|
||||
FashionBudget = 0.0f;
|
||||
LoanSharks = 0.0f;
|
||||
StoresKnockedOff = 0.0f;
|
||||
MovieStunts = 0.0f;
|
||||
Assassinations = 0.0f;
|
||||
PizzasDelivered = 0.0f;
|
||||
GarbagePickups = 0.0f;
|
||||
IceCreamSold = 0.0f;
|
||||
TopShootingRangeScore = 0.0f;
|
||||
ShootingRank = 0.0f;
|
||||
LongestWheelie = 0;
|
||||
LongestStoppie = 0;
|
||||
Longest2Wheel = 0;
|
||||
LongestWheelieDist = 0.0f;
|
||||
LongestStoppieDist = 0.0f;
|
||||
Longest2WheelDist = 0.0f;
|
||||
PropertyBudget = 0.0f;
|
||||
AutoPaintingBudget = 0.0f;
|
||||
PropertyDestroyed = 0;
|
||||
HighestChaseValue = 0.0f;
|
||||
CheatedCount = 0;
|
||||
|
||||
for (int i = 0; i < TOTAL_FASTEST_TIMES; i++)
|
||||
FastestTimes[i] = 0;
|
||||
for (int i = 0; i < TOTAL_HIGHEST_SCORES; i++)
|
||||
HighestScores[i] = 0;
|
||||
for (int i = 0; i < TOTAL_BEST_POSITIONS; i++)
|
||||
BestPositions[i] = INT_MAX;
|
||||
for (int i = 0; i < NUM_PEDTYPES; i++)
|
||||
PedsKilledOfThisType[i] = 0;
|
||||
|
||||
KillsSinceLastCheckpoint = 0;
|
||||
TotalLegitimateKills = 0;
|
||||
IndustrialPassed = 0;
|
||||
CommercialPassed = 0;
|
||||
SuburbanPassed = 0;
|
||||
|
||||
Sprayings = 0;
|
||||
AutoPaintingBudget = 0.0f;
|
||||
PamphletMissionPassed = 0;
|
||||
NoMoreHurricanes = 0;
|
||||
SafeHouseVisits = 0;
|
||||
ShowChaseStatOnScreen = 0;
|
||||
abSonyCDs[0] = 0;
|
||||
// TODO(Miami): Change this with PopulateFavoriteRadioStationList(); !!
|
||||
for (int i = 0; i < NUM_RADIOS; i++)
|
||||
FavoriteRadioStationList[i] = 0.0f;
|
||||
|
||||
NumPropertyOwned = 0;
|
||||
for (int i = 0; i < TOTAL_PROPERTIES; i++)
|
||||
PropertyOwned[i] = false;
|
||||
|
||||
BloodRingKills = 0;
|
||||
BloodRingTime = 0;
|
||||
}
|
||||
|
||||
void CStats::RegisterFastestTime(int32 index, int32 time)
|
||||
@ -151,31 +229,6 @@ void CStats::RegisterBestPosition(int32 index, int32 position)
|
||||
BestPositions[index] = Min(BestPositions[index], position);
|
||||
}
|
||||
|
||||
void CStats::RegisterElBurroTime(int32 time)
|
||||
{
|
||||
ElBurroTime = (ElBurroTime && ElBurroTime < time) ? ElBurroTime : time;
|
||||
}
|
||||
|
||||
void CStats::Register4x4OneTime(int32 time)
|
||||
{
|
||||
Record4x4One = (Record4x4One && Record4x4One < time) ? Record4x4One : time;
|
||||
}
|
||||
|
||||
void CStats::Register4x4TwoTime(int32 time)
|
||||
{
|
||||
Record4x4Two = (Record4x4Two && Record4x4Two < time) ? Record4x4Two : time;
|
||||
}
|
||||
|
||||
void CStats::Register4x4ThreeTime(int32 time)
|
||||
{
|
||||
Record4x4Three = (Record4x4Three && Record4x4Three < time) ? Record4x4Three : time;
|
||||
}
|
||||
|
||||
void CStats::Register4x4MayhemTime(int32 time)
|
||||
{
|
||||
Record4x4Mayhem = (Record4x4Mayhem && Record4x4Mayhem < time) ? Record4x4Mayhem : time;
|
||||
}
|
||||
|
||||
void CStats::AnotherLifeSavedWithAmbulance()
|
||||
{
|
||||
++LivesSavedWithAmbulance;
|
||||
@ -191,16 +244,21 @@ void CStats::RegisterLevelAmbulanceMission(int32 level)
|
||||
HighestLevelAmbulanceMission = Max(HighestLevelAmbulanceMission, level);
|
||||
}
|
||||
|
||||
void CStats::RegisterLevelVigilanteMission(int32 level)
|
||||
{
|
||||
HighestLevelVigilanteMission = Max(HighestLevelVigilanteMission, level);
|
||||
}
|
||||
|
||||
void CStats::RegisterLevelFireMission(int32 level)
|
||||
{
|
||||
HighestLevelFireMission = Max(HighestLevelFireMission, level);
|
||||
}
|
||||
|
||||
void CStats::AnotherFireExtinguished()
|
||||
{
|
||||
++FiresExtinguished;
|
||||
}
|
||||
|
||||
void CStats::RegisterTimeTakenDefuseMission(int32 time)
|
||||
{
|
||||
TimeTakenDefuseMission = (TimeTakenDefuseMission && TimeTakenDefuseMission < time) ? TimeTakenDefuseMission : time;
|
||||
}
|
||||
|
||||
void CStats::AnotherKillFrenzyPassed()
|
||||
{
|
||||
++NumberKillFrenziesPassed;
|
||||
@ -220,40 +278,88 @@ wchar *CStats::FindCriminalRatingString()
|
||||
{
|
||||
int rating = FindCriminalRatingNumber();
|
||||
|
||||
if (rating < 10) return TheText.Get("RATNG1");
|
||||
if (rating < 25) return TheText.Get("RATNG2");
|
||||
if (rating < 70) return TheText.Get("RATNG3");
|
||||
if (rating < 150) return TheText.Get("RATNG4");
|
||||
if (rating < 250) return TheText.Get("RATNG5");
|
||||
if (rating < 450) return TheText.Get("RATNG6");
|
||||
if (rating < 700) return TheText.Get("RATNG7");
|
||||
if (rating < 1000) return TheText.Get("RATNG8");
|
||||
if (rating < 1400) return TheText.Get("RATNG9");
|
||||
if (rating < 1900) return TheText.Get("RATNG10");
|
||||
if (rating < 2500) return TheText.Get("RATNG11");
|
||||
if (rating < 3200) return TheText.Get("RATNG12");
|
||||
if (rating < 4000) return TheText.Get("RATNG13");
|
||||
if (rating < 5000) return TheText.Get("RATNG14");
|
||||
return TheText.Get("RATNG15");
|
||||
if (rating < 0) {
|
||||
if (rating > -500) return TheText.Get("RATNG53");
|
||||
if (rating > -2000) return TheText.Get("RATNG54");
|
||||
if (rating > -4000) return TheText.Get("RATNG55");
|
||||
if (rating > -6000) return TheText.Get("RATNG56");
|
||||
return TheText.Get("RATNG57");
|
||||
}
|
||||
if (rating < 20) return TheText.Get("RATNG1");
|
||||
if (rating < 50) return TheText.Get("RATNG2");
|
||||
if (rating < 75) return TheText.Get("RATNG3");
|
||||
if (rating < 100) return TheText.Get("RATNG4");
|
||||
if (rating < 120) return TheText.Get("RATNG5");
|
||||
if (rating < 150) return TheText.Get("RATNG6");
|
||||
if (rating < 200) return TheText.Get("RATNG7");
|
||||
if (rating < 240) return TheText.Get("RATNG8");
|
||||
if (rating < 270) return TheText.Get("RATNG9");
|
||||
if (rating < 300) return TheText.Get("RATNG10");
|
||||
if (rating < 335) return TheText.Get("RATNG11");
|
||||
if (rating < 370) return TheText.Get("RATNG12");
|
||||
if (rating < 400) return TheText.Get("RATNG13");
|
||||
if (rating < 450) return TheText.Get("RATNG14");
|
||||
if (rating < 500) return TheText.Get("RATNG15");
|
||||
if (rating < 550) return TheText.Get("RATNG16");
|
||||
if (rating < 600) return TheText.Get("RATNG17");
|
||||
if (rating < 610) return TheText.Get("RATNG18");
|
||||
if (rating < 650) return TheText.Get("RATNG19");
|
||||
if (rating < 700) return TheText.Get("RATNG20");
|
||||
if (rating < 850) return TheText.Get("RATNG21");
|
||||
if (rating < 1000) return TheText.Get("RATNG22");
|
||||
if (rating < 1005) return TheText.Get("RATNG23");
|
||||
if (rating < 1150) return TheText.Get("RATNG24");
|
||||
if (rating < 1300) return TheText.Get(TimesArrested > 0 ? "RATNG25" : "RATNG24");
|
||||
if (rating < 1500) return TheText.Get("RATNG26");
|
||||
if (rating < 1700) return TheText.Get("RATNG27");
|
||||
if (rating < 2000) return TheText.Get("RATNG28");
|
||||
if (rating < 2100) return TheText.Get("RATNG29");
|
||||
if (rating < 2300) return TheText.Get("RATNG30");
|
||||
if (rating < 2500) return TheText.Get("RATNG31");
|
||||
if (rating < 2750) return TheText.Get("RATNG32");
|
||||
if (rating < 3000) return TheText.Get("RATNG33");
|
||||
if (rating < 3500) return TheText.Get("RATNG34");
|
||||
if (rating < 4000) return TheText.Get("RATNG35");
|
||||
if (rating < 5000) return TheText.Get("RATNG36");
|
||||
if (rating < 7500) return TheText.Get("RATNG37");
|
||||
if (rating < 10000) return TheText.Get("RATNG38");
|
||||
if (rating < 20000) return TheText.Get("RATNG39");
|
||||
if (rating < 30000) return TheText.Get("RATNG40");
|
||||
if (rating < 40000) return TheText.Get("RATNG41");
|
||||
if (rating < 50000) return TheText.Get("RATNG42");
|
||||
if (rating < 65000) return TheText.Get("RATNG43");
|
||||
if (rating < 80000) return TheText.Get("RATNG44");
|
||||
if (rating < 100000) return TheText.Get("RATNG45");
|
||||
if (rating < 150000) return TheText.Get("RATNG46");
|
||||
if (rating < 200000) return TheText.Get("RATNG47");
|
||||
if (rating < 300000) return TheText.Get("RATNG48");
|
||||
if (rating < 375000) return TheText.Get("RATNG49");
|
||||
if (rating < 500000) return TheText.Get(FlightTime / 60000 / 60 > 10 ? "RATNG50" : "RATNG49");
|
||||
if (rating < 1000000) return TheText.Get("RATNG51");
|
||||
return TheText.Get(CWorld::Players[CWorld::PlayerInFocus].m_nVisibleMoney > 10000000 ? "RATNG52" : "RATNG51");
|
||||
}
|
||||
|
||||
int32 CStats::FindCriminalRatingNumber()
|
||||
{
|
||||
int32 rating;
|
||||
|
||||
rating = FiresExtinguished + 10 * HighestLevelAmbulanceMission + CriminalsCaught + LivesSavedWithAmbulance
|
||||
rating = FiresExtinguished + 10 * HighestLevelFireMission + 10 * HighestLevelAmbulanceMission
|
||||
+ CriminalsCaught + LivesSavedWithAmbulance
|
||||
+ 30 * HelisDestroyed + TotalLegitimateKills - 3 * TimesArrested - 3 * TimesDied
|
||||
+ CWorld::Players[CWorld::PlayerInFocus].m_nMoney / 5000;
|
||||
if (rating <= 0) rating = 0;
|
||||
if (CPad::bHasPlayerCheated || CheatedCount > 0) {
|
||||
rating -= CheatedCount;
|
||||
if (rating <= -10000)
|
||||
rating = -10000;
|
||||
|
||||
if (InstantHitsFiredByPlayer > 100)
|
||||
rating += (float)CStats::InstantHitsHitByPlayer / (float)CStats::InstantHitsFiredByPlayer * 500.0f;
|
||||
} else if (rating <= 0) {
|
||||
rating = 0;
|
||||
}
|
||||
|
||||
if (RoundsFiredByPlayer > 100)
|
||||
rating += (float)CStats::BulletsThatHit / (float)CStats::RoundsFiredByPlayer * 500.0f;
|
||||
if (TotalProgressInGame)
|
||||
rating += (float)CStats::ProgressMade / (float)CStats::TotalProgressInGame * 1000.0f;
|
||||
if (!IndustrialPassed && rating >= 3521)
|
||||
rating = 3521;
|
||||
if (!CommercialPassed && rating >= 4552)
|
||||
rating = 4552;
|
||||
return rating;
|
||||
}
|
||||
|
||||
@ -265,11 +371,80 @@ float CStats::GetPercentageProgress()
|
||||
return Min(percentCompleted, 100.0f);
|
||||
}
|
||||
|
||||
void CStats::MoneySpentOnWeapons(int32 money)
|
||||
{
|
||||
WeaponBudget += money;
|
||||
}
|
||||
|
||||
void CStats::MoneySpentOnProperty(int32 money)
|
||||
{
|
||||
PropertyBudget += money;
|
||||
}
|
||||
|
||||
void CStats::MoneySpentOnAutoPainting(int32 money)
|
||||
{
|
||||
AutoPaintingBudget += money;
|
||||
}
|
||||
|
||||
void CStats::MoneySpentOnFashion(int32 money)
|
||||
{
|
||||
FashionBudget += money;
|
||||
}
|
||||
|
||||
void CStats::NumOfVisitsFromLoanSharks(int32 num)
|
||||
{
|
||||
LoanSharks += num;
|
||||
}
|
||||
|
||||
void CStats::NumOfStoresKnockedOff(int32 num)
|
||||
{
|
||||
StoresKnockedOff += num;
|
||||
}
|
||||
|
||||
void CStats::NumOfMovieStunts(int32 num)
|
||||
{
|
||||
MovieStunts += num;
|
||||
}
|
||||
|
||||
void CStats::NumOfAssassinations(int32 num)
|
||||
{
|
||||
Assassinations += num;
|
||||
}
|
||||
|
||||
void CStats::NumOfPizzasDelivered(int32 num)
|
||||
{
|
||||
PizzasDelivered += num;
|
||||
}
|
||||
|
||||
void CStats::NumOfGarbagePickups(int32 num)
|
||||
{
|
||||
GarbagePickups += num;
|
||||
}
|
||||
|
||||
void CStats::NumOfIceCreamSold(int32 num)
|
||||
{
|
||||
IceCreamSold += num;
|
||||
}
|
||||
|
||||
void CStats::AddNumBloodRingKills(int32 num)
|
||||
{
|
||||
BloodRingKills += num;
|
||||
}
|
||||
|
||||
void CStats::LongestTimeInBloodRing(int32 time)
|
||||
{
|
||||
if (BloodRingTime < time)
|
||||
BloodRingTime = time;
|
||||
}
|
||||
|
||||
void CStats::AddPropertyAsOwned(int32 id)
|
||||
{
|
||||
if (!PropertyOwned[id]) {
|
||||
PropertyOwned[id] = true;
|
||||
++NumPropertyOwned;
|
||||
}
|
||||
}
|
||||
|
||||
void CStats::SaveStats(uint8 *buf, uint32 *size)
|
||||
{
|
||||
CheckPointReachedSuccessfully();
|
||||
@ -277,18 +452,23 @@ void CStats::SaveStats(uint8 *buf, uint32 *size)
|
||||
*size = sizeof(PeopleKilledByPlayer) +
|
||||
sizeof(PeopleKilledByOthers) +
|
||||
sizeof(CarsExploded) +
|
||||
sizeof(BoatsExploded) +
|
||||
sizeof(TyresPopped) +
|
||||
sizeof(RoundsFiredByPlayer) +
|
||||
sizeof(PedsKilledOfThisType) +
|
||||
sizeof(HelisDestroyed) +
|
||||
sizeof(ProgressMade) +
|
||||
sizeof(TotalProgressInGame) +
|
||||
sizeof(KgsOfExplosivesUsed) +
|
||||
sizeof(InstantHitsFiredByPlayer) +
|
||||
sizeof(InstantHitsHitByPlayer) +
|
||||
sizeof(BulletsThatHit) +
|
||||
sizeof(HeadsPopped) +
|
||||
sizeof(WantedStarsAttained) +
|
||||
sizeof(WantedStarsEvaded) +
|
||||
sizeof(TimesArrested) +
|
||||
sizeof(TimesDied) +
|
||||
sizeof(DaysPassed) +
|
||||
sizeof(SafeHouseVisits) +
|
||||
sizeof(Sprayings) +
|
||||
sizeof(MaximumJumpDistance) +
|
||||
sizeof(MaximumJumpHeight) +
|
||||
sizeof(MaximumJumpFlips) +
|
||||
@ -297,50 +477,88 @@ void CStats::SaveStats(uint8 *buf, uint32 *size)
|
||||
sizeof(NumberOfUniqueJumpsFound) +
|
||||
sizeof(TotalNumberOfUniqueJumps) +
|
||||
sizeof(MissionsGiven) +
|
||||
sizeof(MissionsPassed) +
|
||||
sizeof(PassengersDroppedOffWithTaxi) +
|
||||
sizeof(MoneyMadeWithTaxi) +
|
||||
sizeof(IndustrialPassed) +
|
||||
sizeof(CommercialPassed) +
|
||||
sizeof(SuburbanPassed) +
|
||||
sizeof(ElBurroTime) +
|
||||
sizeof(PamphletMissionPassed) +
|
||||
sizeof(NoMoreHurricanes) +
|
||||
sizeof(DistanceTravelledOnFoot) +
|
||||
sizeof(DistanceTravelledInVehicle) +
|
||||
sizeof(Record4x4One) +
|
||||
sizeof(Record4x4Two) +
|
||||
sizeof(Record4x4Three) +
|
||||
sizeof(Record4x4Mayhem) +
|
||||
sizeof(DistanceTravelledByCar) +
|
||||
sizeof(DistanceTravelledByBike) +
|
||||
sizeof(DistanceTravelledByBoat) +
|
||||
sizeof(DistanceTravelledByGolfCart) +
|
||||
sizeof(DistanceTravelledByHelicoptor) +
|
||||
sizeof(DistanceTravelledByPlane) +
|
||||
sizeof(LivesSavedWithAmbulance) +
|
||||
sizeof(CriminalsCaught) +
|
||||
sizeof(HighestLevelAmbulanceMission) +
|
||||
sizeof(FiresExtinguished) +
|
||||
sizeof(TimeTakenDefuseMission) +
|
||||
sizeof(HighestLevelVigilanteMission) +
|
||||
sizeof(HighestLevelAmbulanceMission) +
|
||||
sizeof(HighestLevelFireMission) +
|
||||
sizeof(PhotosTaken) +
|
||||
sizeof(NumberKillFrenziesPassed) +
|
||||
sizeof(TotalNumberKillFrenzies) +
|
||||
sizeof(TotalNumberMissions) +
|
||||
sizeof(FlightTime) +
|
||||
sizeof(TimesDrowned) +
|
||||
sizeof(SeagullsKilled) +
|
||||
sizeof(WeaponBudget) +
|
||||
sizeof(FashionBudget) +
|
||||
sizeof(LoanSharks) +
|
||||
sizeof(StoresKnockedOff) +
|
||||
sizeof(MovieStunts) +
|
||||
sizeof(Assassinations) +
|
||||
sizeof(PizzasDelivered) +
|
||||
sizeof(GarbagePickups) +
|
||||
sizeof(IceCreamSold) +
|
||||
sizeof(TopShootingRangeScore) +
|
||||
sizeof(ShootingRank) +
|
||||
sizeof(LongestWheelie) +
|
||||
sizeof(LongestStoppie) +
|
||||
sizeof(Longest2Wheel) +
|
||||
sizeof(LongestWheelieDist) +
|
||||
sizeof(LongestStoppieDist) +
|
||||
sizeof(Longest2WheelDist) +
|
||||
sizeof(PropertyBudget) +
|
||||
sizeof(AutoPaintingBudget) +
|
||||
sizeof(PropertyDestroyed) +
|
||||
sizeof(NumPropertyOwned) +
|
||||
sizeof(BloodRingKills) +
|
||||
sizeof(BloodRingTime) +
|
||||
sizeof(PropertyOwned) +
|
||||
sizeof(HighestChaseValue) +
|
||||
sizeof(FastestTimes) +
|
||||
sizeof(HighestScores) +
|
||||
sizeof(BestPositions) +
|
||||
sizeof(KillsSinceLastCheckpoint) +
|
||||
sizeof(TotalLegitimateKills) +
|
||||
sizeof(LastMissionPassedName);
|
||||
sizeof(LastMissionPassedName) +
|
||||
sizeof(CheatedCount) +
|
||||
sizeof(FavoriteRadioStationList);
|
||||
|
||||
#define CopyToBuf(buf, data) memcpy(buf, &data, sizeof(data)); buf += sizeof(data);
|
||||
CopyToBuf(buf, PeopleKilledByPlayer);
|
||||
CopyToBuf(buf, PeopleKilledByOthers);
|
||||
CopyToBuf(buf, CarsExploded);
|
||||
CopyToBuf(buf, BoatsExploded);
|
||||
CopyToBuf(buf, TyresPopped);
|
||||
CopyToBuf(buf, RoundsFiredByPlayer);
|
||||
CopyToBuf(buf, PedsKilledOfThisType);
|
||||
CopyToBuf(buf, HelisDestroyed);
|
||||
CopyToBuf(buf, ProgressMade);
|
||||
CopyToBuf(buf, TotalProgressInGame);
|
||||
CopyToBuf(buf, KgsOfExplosivesUsed);
|
||||
CopyToBuf(buf, InstantHitsFiredByPlayer);
|
||||
CopyToBuf(buf, InstantHitsHitByPlayer);
|
||||
CopyToBuf(buf, BulletsThatHit);
|
||||
CopyToBuf(buf, HeadsPopped);
|
||||
CopyToBuf(buf, WantedStarsAttained);
|
||||
CopyToBuf(buf, WantedStarsEvaded);
|
||||
CopyToBuf(buf, TimesArrested);
|
||||
CopyToBuf(buf, TimesDied);
|
||||
CopyToBuf(buf, DaysPassed);
|
||||
CopyToBuf(buf, SafeHouseVisits);
|
||||
CopyToBuf(buf, Sprayings);
|
||||
CopyToBuf(buf, MaximumJumpDistance);
|
||||
CopyToBuf(buf, MaximumJumpHeight);
|
||||
CopyToBuf(buf, MaximumJumpFlips);
|
||||
@ -349,33 +567,67 @@ void CStats::SaveStats(uint8 *buf, uint32 *size)
|
||||
CopyToBuf(buf, NumberOfUniqueJumpsFound);
|
||||
CopyToBuf(buf, TotalNumberOfUniqueJumps);
|
||||
CopyToBuf(buf, MissionsGiven);
|
||||
CopyToBuf(buf, MissionsPassed);
|
||||
CopyToBuf(buf, PassengersDroppedOffWithTaxi);
|
||||
CopyToBuf(buf, MoneyMadeWithTaxi);
|
||||
CopyToBuf(buf, IndustrialPassed);
|
||||
CopyToBuf(buf, CommercialPassed);
|
||||
CopyToBuf(buf, SuburbanPassed);
|
||||
CopyToBuf(buf, ElBurroTime);
|
||||
CopyToBuf(buf, PamphletMissionPassed);
|
||||
CopyToBuf(buf, NoMoreHurricanes);
|
||||
CopyToBuf(buf, DistanceTravelledOnFoot);
|
||||
CopyToBuf(buf, DistanceTravelledInVehicle);
|
||||
CopyToBuf(buf, Record4x4One);
|
||||
CopyToBuf(buf, Record4x4Two);
|
||||
CopyToBuf(buf, Record4x4Three);
|
||||
CopyToBuf(buf, Record4x4Mayhem);
|
||||
CopyToBuf(buf, DistanceTravelledByCar);
|
||||
CopyToBuf(buf, DistanceTravelledByBike);
|
||||
CopyToBuf(buf, DistanceTravelledByBoat);
|
||||
CopyToBuf(buf, DistanceTravelledByGolfCart);
|
||||
CopyToBuf(buf, DistanceTravelledByHelicoptor);
|
||||
CopyToBuf(buf, DistanceTravelledByPlane);
|
||||
CopyToBuf(buf, LivesSavedWithAmbulance);
|
||||
CopyToBuf(buf, CriminalsCaught);
|
||||
CopyToBuf(buf, HighestLevelAmbulanceMission);
|
||||
CopyToBuf(buf, FiresExtinguished);
|
||||
CopyToBuf(buf, TimeTakenDefuseMission);
|
||||
CopyToBuf(buf, HighestLevelVigilanteMission);
|
||||
CopyToBuf(buf, HighestLevelAmbulanceMission);
|
||||
CopyToBuf(buf, HighestLevelFireMission);
|
||||
CopyToBuf(buf, PhotosTaken);
|
||||
CopyToBuf(buf, NumberKillFrenziesPassed);
|
||||
CopyToBuf(buf, TotalNumberKillFrenzies);
|
||||
CopyToBuf(buf, TotalNumberMissions);
|
||||
CopyToBuf(buf, FlightTime);
|
||||
CopyToBuf(buf, TimesDrowned);
|
||||
CopyToBuf(buf, SeagullsKilled);
|
||||
CopyToBuf(buf, WeaponBudget);
|
||||
CopyToBuf(buf, FashionBudget);
|
||||
CopyToBuf(buf, LoanSharks);
|
||||
CopyToBuf(buf, StoresKnockedOff);
|
||||
CopyToBuf(buf, MovieStunts);
|
||||
CopyToBuf(buf, Assassinations);
|
||||
CopyToBuf(buf, PizzasDelivered);
|
||||
CopyToBuf(buf, GarbagePickups);
|
||||
CopyToBuf(buf, IceCreamSold);
|
||||
CopyToBuf(buf, TopShootingRangeScore);
|
||||
CopyToBuf(buf, ShootingRank);
|
||||
CopyToBuf(buf, LongestWheelie);
|
||||
CopyToBuf(buf, LongestStoppie);
|
||||
CopyToBuf(buf, Longest2Wheel);
|
||||
CopyToBuf(buf, LongestWheelieDist);
|
||||
CopyToBuf(buf, LongestStoppieDist);
|
||||
CopyToBuf(buf, Longest2WheelDist);
|
||||
CopyToBuf(buf, PropertyBudget);
|
||||
CopyToBuf(buf, AutoPaintingBudget);
|
||||
CopyToBuf(buf, PropertyDestroyed);
|
||||
CopyToBuf(buf, NumPropertyOwned);
|
||||
CopyToBuf(buf, BloodRingKills);
|
||||
CopyToBuf(buf, BloodRingTime);
|
||||
CopyToBuf(buf, PropertyOwned);
|
||||
CopyToBuf(buf, HighestChaseValue);
|
||||
CopyToBuf(buf, FastestTimes);
|
||||
CopyToBuf(buf, HighestScores);
|
||||
CopyToBuf(buf, BestPositions);
|
||||
CopyToBuf(buf, KillsSinceLastCheckpoint);
|
||||
CopyToBuf(buf, TotalLegitimateKills);
|
||||
CopyToBuf(buf, LastMissionPassedName);
|
||||
CopyToBuf(buf, CheatedCount);
|
||||
// TODO(Miami): Set favourite radio stations!!
|
||||
CopyToBuf(buf, FavoriteRadioStationList);
|
||||
|
||||
assert(buf - buf_start == *size);
|
||||
#undef CopyToBuf
|
||||
@ -390,18 +642,23 @@ void CStats::LoadStats(uint8 *buf, uint32 size)
|
||||
CopyFromBuf(buf, PeopleKilledByPlayer);
|
||||
CopyFromBuf(buf, PeopleKilledByOthers);
|
||||
CopyFromBuf(buf, CarsExploded);
|
||||
CopyFromBuf(buf, BoatsExploded);
|
||||
CopyFromBuf(buf, TyresPopped);
|
||||
CopyFromBuf(buf, RoundsFiredByPlayer);
|
||||
CopyFromBuf(buf, PedsKilledOfThisType);
|
||||
CopyFromBuf(buf, HelisDestroyed);
|
||||
CopyFromBuf(buf, ProgressMade);
|
||||
CopyFromBuf(buf, TotalProgressInGame);
|
||||
CopyFromBuf(buf, KgsOfExplosivesUsed);
|
||||
CopyFromBuf(buf, InstantHitsFiredByPlayer);
|
||||
CopyFromBuf(buf, InstantHitsHitByPlayer);
|
||||
CopyFromBuf(buf, BulletsThatHit);
|
||||
CopyFromBuf(buf, HeadsPopped);
|
||||
CopyFromBuf(buf, WantedStarsAttained);
|
||||
CopyFromBuf(buf, WantedStarsEvaded);
|
||||
CopyFromBuf(buf, TimesArrested);
|
||||
CopyFromBuf(buf, TimesDied);
|
||||
CopyFromBuf(buf, DaysPassed);
|
||||
CopyFromBuf(buf, SafeHouseVisits);
|
||||
CopyFromBuf(buf, Sprayings);
|
||||
CopyFromBuf(buf, MaximumJumpDistance);
|
||||
CopyFromBuf(buf, MaximumJumpHeight);
|
||||
CopyFromBuf(buf, MaximumJumpFlips);
|
||||
@ -410,33 +667,66 @@ void CStats::LoadStats(uint8 *buf, uint32 size)
|
||||
CopyFromBuf(buf, NumberOfUniqueJumpsFound);
|
||||
CopyFromBuf(buf, TotalNumberOfUniqueJumps);
|
||||
CopyFromBuf(buf, MissionsGiven);
|
||||
CopyFromBuf(buf, MissionsPassed);
|
||||
CopyFromBuf(buf, PassengersDroppedOffWithTaxi);
|
||||
CopyFromBuf(buf, MoneyMadeWithTaxi);
|
||||
CopyFromBuf(buf, IndustrialPassed);
|
||||
CopyFromBuf(buf, CommercialPassed);
|
||||
CopyFromBuf(buf, SuburbanPassed);
|
||||
CopyFromBuf(buf, ElBurroTime);
|
||||
CopyFromBuf(buf, PamphletMissionPassed);
|
||||
CopyFromBuf(buf, NoMoreHurricanes);
|
||||
CopyFromBuf(buf, DistanceTravelledOnFoot);
|
||||
CopyFromBuf(buf, DistanceTravelledInVehicle);
|
||||
CopyFromBuf(buf, Record4x4One);
|
||||
CopyFromBuf(buf, Record4x4Two);
|
||||
CopyFromBuf(buf, Record4x4Three);
|
||||
CopyFromBuf(buf, Record4x4Mayhem);
|
||||
CopyFromBuf(buf, DistanceTravelledByCar);
|
||||
CopyFromBuf(buf, DistanceTravelledByBike);
|
||||
CopyFromBuf(buf, DistanceTravelledByBoat);
|
||||
CopyFromBuf(buf, DistanceTravelledByGolfCart);
|
||||
CopyFromBuf(buf, DistanceTravelledByHelicoptor);
|
||||
CopyFromBuf(buf, DistanceTravelledByPlane);
|
||||
CopyFromBuf(buf, LivesSavedWithAmbulance);
|
||||
CopyFromBuf(buf, CriminalsCaught);
|
||||
CopyFromBuf(buf, HighestLevelAmbulanceMission);
|
||||
CopyFromBuf(buf, FiresExtinguished);
|
||||
CopyFromBuf(buf, TimeTakenDefuseMission);
|
||||
CopyFromBuf(buf, HighestLevelVigilanteMission);
|
||||
CopyFromBuf(buf, HighestLevelAmbulanceMission);
|
||||
CopyFromBuf(buf, HighestLevelFireMission);
|
||||
CopyFromBuf(buf, PhotosTaken);
|
||||
CopyFromBuf(buf, NumberKillFrenziesPassed);
|
||||
CopyFromBuf(buf, TotalNumberKillFrenzies);
|
||||
CopyFromBuf(buf, TotalNumberMissions);
|
||||
CopyFromBuf(buf, FlightTime);
|
||||
CopyFromBuf(buf, TimesDrowned);
|
||||
CopyFromBuf(buf, SeagullsKilled);
|
||||
CopyFromBuf(buf, WeaponBudget);
|
||||
CopyFromBuf(buf, FashionBudget);
|
||||
CopyFromBuf(buf, LoanSharks);
|
||||
CopyFromBuf(buf, StoresKnockedOff);
|
||||
CopyFromBuf(buf, MovieStunts);
|
||||
CopyFromBuf(buf, Assassinations);
|
||||
CopyFromBuf(buf, PizzasDelivered);
|
||||
CopyFromBuf(buf, GarbagePickups);
|
||||
CopyFromBuf(buf, IceCreamSold);
|
||||
CopyFromBuf(buf, TopShootingRangeScore);
|
||||
CopyFromBuf(buf, ShootingRank);
|
||||
CopyFromBuf(buf, LongestWheelie);
|
||||
CopyFromBuf(buf, LongestStoppie);
|
||||
CopyFromBuf(buf, Longest2Wheel);
|
||||
CopyFromBuf(buf, LongestWheelieDist);
|
||||
CopyFromBuf(buf, LongestStoppieDist);
|
||||
CopyFromBuf(buf, Longest2WheelDist);
|
||||
CopyFromBuf(buf, PropertyBudget);
|
||||
CopyFromBuf(buf, AutoPaintingBudget);
|
||||
CopyFromBuf(buf, PropertyDestroyed);
|
||||
CopyFromBuf(buf, NumPropertyOwned);
|
||||
CopyFromBuf(buf, BloodRingKills);
|
||||
CopyFromBuf(buf, BloodRingTime);
|
||||
CopyFromBuf(buf, PropertyOwned);
|
||||
CopyFromBuf(buf, HighestChaseValue);
|
||||
CopyFromBuf(buf, FastestTimes);
|
||||
CopyFromBuf(buf, HighestScores);
|
||||
CopyFromBuf(buf, BestPositions);
|
||||
CopyFromBuf(buf, KillsSinceLastCheckpoint);
|
||||
CopyFromBuf(buf, TotalLegitimateKills);
|
||||
CopyFromBuf(buf, LastMissionPassedName);
|
||||
CopyFromBuf(buf, CheatedCount);
|
||||
CopyFromBuf(buf, FavoriteRadioStationList);
|
||||
|
||||
assert(buf - buf_start == size);
|
||||
#undef CopyFromBuf
|
||||
|
@ -1,6 +1,7 @@
|
||||
#pragma once
|
||||
|
||||
#include "PedType.h"
|
||||
#include "audio_enums.h"
|
||||
|
||||
class CStats
|
||||
{
|
||||
@ -8,11 +9,10 @@ public:
|
||||
enum {
|
||||
TOTAL_FASTEST_TIMES = 23,
|
||||
TOTAL_HIGHEST_SCORES = 5,
|
||||
TOTAL_BEST_POSITIONS = 1
|
||||
TOTAL_BEST_POSITIONS = 1,
|
||||
TOTAL_PROPERTIES = 15
|
||||
};
|
||||
//TODO
|
||||
static int32 SeagullsKilled;
|
||||
|
||||
static int32 DaysPassed;
|
||||
static int32 HeadsPopped;
|
||||
static int32 CommercialPassed;
|
||||
@ -25,9 +25,29 @@ public:
|
||||
static int32 TimesDied;
|
||||
static int32 TimesArrested;
|
||||
static int32 KillsSinceLastCheckpoint;
|
||||
static float DistanceTravelledInVehicle;
|
||||
static float DistanceTravelledByCar;
|
||||
static float DistanceTravelledByHelicoptor;
|
||||
static float DistanceTravelledByBike;
|
||||
static float DistanceTravelledByBoat;
|
||||
static float DistanceTravelledByPlane;
|
||||
static float DistanceTravelledByGolfCart;
|
||||
static float DistanceTravelledOnFoot;
|
||||
static int32 FlightTime;
|
||||
static int32 TimesDrowned;
|
||||
static int32 PhotosTaken;
|
||||
static float LoanSharks;
|
||||
static float StoresKnockedOff;
|
||||
static float MovieStunts;
|
||||
static float Assassinations;
|
||||
static float PizzasDelivered;
|
||||
static float GarbagePickups;
|
||||
static float IceCreamSold;
|
||||
static float TopShootingRangeScore;
|
||||
static float ShootingRank;
|
||||
static int32 CarsExploded;
|
||||
static int32 BoatsExploded;
|
||||
static int32 WantedStarsAttained;
|
||||
static int32 WantedStarsEvaded;
|
||||
static int32 PeopleKilledByPlayer;
|
||||
static int32 ProgressMade;
|
||||
static int32 TotalProgressInGame;
|
||||
@ -44,50 +64,60 @@ public:
|
||||
static int32 MissionsPassed;
|
||||
static char LastMissionPassedName[8];
|
||||
static int32 TotalLegitimateKills;
|
||||
static int32 ElBurroTime;
|
||||
static int32 Record4x4One;
|
||||
static int32 Record4x4Two;
|
||||
static int32 Record4x4Three;
|
||||
static int32 Record4x4Mayhem;
|
||||
static int32 LivesSavedWithAmbulance;
|
||||
static int32 CriminalsCaught;
|
||||
static int32 HighestLevelAmbulanceMission;
|
||||
static int32 HighestLevelVigilanteMission;
|
||||
static int32 HighestLevelFireMission;
|
||||
static int32 FiresExtinguished;
|
||||
static int32 TimeTakenDefuseMission;
|
||||
static int32 TotalNumberKillFrenzies;
|
||||
static int32 TotalNumberMissions;
|
||||
static int32 RoundsFiredByPlayer;
|
||||
static int32 KgsOfExplosivesUsed;
|
||||
static int32 InstantHitsFiredByPlayer;
|
||||
static int32 InstantHitsHitByPlayer;
|
||||
static int32 BulletsThatHit;
|
||||
static int32 BestTimeBombDefusal;
|
||||
static int32 FastestTimes[TOTAL_FASTEST_TIMES];
|
||||
static int32 HighestScores[TOTAL_HIGHEST_SCORES];
|
||||
static int32 BestPositions[TOTAL_BEST_POSITIONS];
|
||||
static bool PropertyOwned[TOTAL_PROPERTIES];
|
||||
static int32 NumPropertyOwned;
|
||||
static int32 PropertyDestroyed;
|
||||
static float HighestChaseValue;
|
||||
static int32 CheatedCount;
|
||||
static int32 ShowChaseStatOnScreen;
|
||||
static int32 PamphletMissionPassed;
|
||||
static bool abSonyCDs[1];
|
||||
static int32 BloodRingKills;
|
||||
static int32 BloodRingTime;
|
||||
static float FavoriteRadioStationList[NUM_RADIOS];
|
||||
static int32 Sprayings;
|
||||
static float AutoPaintingBudget;
|
||||
static int32 NoMoreHurricanes;
|
||||
static float FashionBudget;
|
||||
static float PropertyBudget;
|
||||
static float WeaponBudget;
|
||||
static int32 SafeHouseVisits;
|
||||
static int32 TyresPopped;
|
||||
|
||||
static int32 LongestWheelie;
|
||||
static int32 LongestStoppie;
|
||||
static int32 Longest2Wheel;
|
||||
static float LongestWheelieDist;
|
||||
static float LongestStoppieDist;
|
||||
static float Longest2WheelDist;
|
||||
|
||||
public:
|
||||
static void Init(void);
|
||||
static void RegisterFastestTime(int32, int32);
|
||||
static void RegisterHighestScore(int32, int32);
|
||||
static void RegisterBestPosition(int32, int32);
|
||||
static void RegisterElBurroTime(int32);
|
||||
static void Register4x4OneTime(int32);
|
||||
static void Register4x4TwoTime(int32);
|
||||
static void Register4x4ThreeTime(int32);
|
||||
static void Register4x4MayhemTime(int32);
|
||||
static void AnotherLifeSavedWithAmbulance();
|
||||
static void AnotherCriminalCaught();
|
||||
static void RegisterLevelAmbulanceMission(int32);
|
||||
static void RegisterLevelVigilanteMission(int32);
|
||||
static void RegisterLevelFireMission(int32);
|
||||
static void AnotherFireExtinguished();
|
||||
static wchar *FindCriminalRatingString();
|
||||
static void RegisterTimeTakenDefuseMission(int32);
|
||||
static void AnotherKillFrenzyPassed();
|
||||
static void SetTotalNumberKillFrenzies(int32);
|
||||
static void SetTotalNumberMissions(int32);
|
||||
@ -98,5 +128,20 @@ public:
|
||||
static void LoadStats(uint8 *buf, uint32 size);
|
||||
static float GetPercentageProgress();
|
||||
|
||||
static void MoneySpentOnWeapons(int32);
|
||||
static void MoneySpentOnProperty(int32);
|
||||
static void MoneySpentOnAutoPainting(int32);
|
||||
static void MoneySpentOnFashion(int32);
|
||||
|
||||
static void NumOfVisitsFromLoanSharks(int32);
|
||||
static void NumOfStoresKnockedOff(int32);
|
||||
static void NumOfMovieStunts(int32);
|
||||
static void NumOfAssassinations(int32);
|
||||
static void NumOfPizzasDelivered(int32);
|
||||
static void NumOfGarbagePickups(int32);
|
||||
static void NumOfIceCreamSold(int32);
|
||||
static void AddNumBloodRingKills(int32);
|
||||
|
||||
static void LongestTimeInBloodRing(int32);
|
||||
static void AddPropertyAsOwned(int32);
|
||||
};
|
||||
|
@ -10,6 +10,7 @@
|
||||
#include "CopPed.h"
|
||||
#include "Wanted.h"
|
||||
#include "General.h"
|
||||
#include "Stats.h"
|
||||
|
||||
int32 CWanted::MaximumWantedLevel = 6;
|
||||
int32 CWanted::nMaximumWantedLevel = 9600;
|
||||
@ -308,7 +309,6 @@ CWanted::ReportCrimeNow(eCrimeType type, const CVector &coors, bool policeDoesnt
|
||||
UpdateWantedLevel();
|
||||
}
|
||||
|
||||
// TODO(Miami): Stats
|
||||
void
|
||||
CWanted::UpdateWantedLevel()
|
||||
{
|
||||
@ -318,36 +318,44 @@ CWanted::UpdateWantedLevel()
|
||||
m_nChaos = nMaximumWantedLevel;
|
||||
|
||||
if (m_nChaos >= 0 && m_nChaos < 50) {
|
||||
if (m_nWantedLevel == 1)
|
||||
++CStats::WantedStarsEvaded;
|
||||
m_nWantedLevel = 0;
|
||||
m_MaximumLawEnforcerVehicles = 0;
|
||||
m_MaxCops = 0;
|
||||
m_RoadblockDensity = 0;
|
||||
} else if (m_nChaos >= 50 && m_nChaos < 180) {
|
||||
CStats::WantedStarsAttained += 1 - m_nWantedLevel;
|
||||
m_nWantedLevel = 1;
|
||||
m_MaximumLawEnforcerVehicles = 1;
|
||||
m_MaxCops = 1;
|
||||
m_RoadblockDensity = 0;
|
||||
} else if (m_nChaos >= 180 && m_nChaos < 550) {
|
||||
CStats::WantedStarsAttained += 2 - m_nWantedLevel;
|
||||
m_nWantedLevel = 2;
|
||||
m_MaximumLawEnforcerVehicles = 2;
|
||||
m_MaxCops = 3;
|
||||
m_RoadblockDensity = 0;
|
||||
} else if (m_nChaos >= 550 && m_nChaos < 1200) {
|
||||
CStats::WantedStarsAttained += 3 - m_nWantedLevel;
|
||||
m_nWantedLevel = 3;
|
||||
m_MaximumLawEnforcerVehicles = 2;
|
||||
m_MaxCops = 4;
|
||||
m_RoadblockDensity = 12;
|
||||
} else if (m_nChaos >= 1200 && m_nChaos < 2400) {
|
||||
CStats::WantedStarsAttained += 4 - m_nWantedLevel;
|
||||
m_nWantedLevel = 4;
|
||||
m_MaximumLawEnforcerVehicles = 2;
|
||||
m_MaxCops = 6;
|
||||
m_RoadblockDensity = 18;
|
||||
} else if (m_nChaos >= 2400 && m_nChaos < 4800) {
|
||||
CStats::WantedStarsAttained += 5 - m_nWantedLevel;
|
||||
m_nWantedLevel = 5;
|
||||
m_MaximumLawEnforcerVehicles = 3;
|
||||
m_MaxCops = 8;
|
||||
m_RoadblockDensity = 24;
|
||||
} else if (m_nChaos >= 4800) {
|
||||
CStats::WantedStarsAttained += 6 - m_nWantedLevel;
|
||||
m_nWantedLevel = 6;
|
||||
m_MaximumLawEnforcerVehicles = 3;
|
||||
m_MaxCops = 10;
|
||||
@ -494,8 +502,7 @@ CWanted::UpdateCrimesQ(void)
|
||||
void
|
||||
CWanted::Suspend(void)
|
||||
{
|
||||
// TODO(Miami): Stats
|
||||
// dwStarsEvaded += m_nWantedLevel;
|
||||
CStats::WantedStarsEvaded += m_nWantedLevel;
|
||||
m_nMinChaos = m_nChaos;
|
||||
m_nMinWantedLevel = m_nWantedLevel;
|
||||
m_nLastTimeSuspended = CTimer::GetTimeInMilliseconds();
|
||||
|
@ -225,6 +225,7 @@ enum Config {
|
||||
//#define NO_ISLAND_LOADING // disable loadscreen between islands via loading all island data at once, consumes more memory and CPU
|
||||
//#define USE_TEXTURE_POOL
|
||||
#define CUTSCENE_BORDERS_SWITCH
|
||||
//#define EXTENDED_COLOURFILTER // more options for colour filter (replaces mblur)
|
||||
|
||||
// Water & Particle
|
||||
#define PC_PARTICLE
|
||||
@ -232,6 +233,9 @@ enum Config {
|
||||
// #define PC_WATER
|
||||
#define WATER_CHEATS
|
||||
|
||||
//#define USE_CUTSCENE_SHADOW_FOR_PED
|
||||
#define DISABLE_CUTSCENE_SHADOWS
|
||||
|
||||
// Pad
|
||||
#if !defined(RW_GL3) && defined(_WIN32)
|
||||
#define XINPUT
|
||||
|
@ -2,6 +2,7 @@
|
||||
#include "rpmatfx.h"
|
||||
#include "rphanim.h"
|
||||
#include "rpskin.h"
|
||||
#include "rtbmp.h"
|
||||
|
||||
#include "main.h"
|
||||
#include "CdStream.h"
|
||||
@ -61,6 +62,7 @@
|
||||
#include "MemoryCard.h"
|
||||
#include "SceneEdit.h"
|
||||
#include "debugmenu.h"
|
||||
#include "Clock.h"
|
||||
#include "Occlusion.h"
|
||||
#include "Ropes.h"
|
||||
|
||||
@ -279,6 +281,28 @@ DoFade(void)
|
||||
}
|
||||
}
|
||||
|
||||
bool
|
||||
RwGrabScreen(RwCamera *camera, RwChar *filename)
|
||||
{
|
||||
char temp[255];
|
||||
RwImage *pImage = RsGrabScreen(camera);
|
||||
bool result = true;
|
||||
|
||||
if (pImage == nil)
|
||||
return false;
|
||||
|
||||
strcpy(temp, CFileMgr::GetRootDirName());
|
||||
strcat(temp, filename);
|
||||
|
||||
if (RtBMPImageWrite(pImage, &temp[0]) == nil)
|
||||
result = false;
|
||||
RwImageDestroy(pImage);
|
||||
return result;
|
||||
}
|
||||
|
||||
#define TILE_WIDTH 576
|
||||
#define TILE_HEIGHT 432
|
||||
|
||||
void
|
||||
DoRWStuffEndOfFrame(void)
|
||||
{
|
||||
@ -287,6 +311,20 @@ DoRWStuffEndOfFrame(void)
|
||||
FlushObrsPrintfs();
|
||||
RwCameraEndUpdate(Scene.camera);
|
||||
RsCameraShowRaster(Scene.camera);
|
||||
#ifndef MASTER
|
||||
char s[48];
|
||||
if (CPad::GetPad(1)->GetLeftShockJustDown()) {
|
||||
// try using both controllers for this thing... crazy bastards
|
||||
if (CPad::GetPad(0)->GetRightStickY() > 0) {
|
||||
sprintf(s, "screen%d%d.ras", CClock::ms_nGameClockHours, CClock::ms_nGameClockMinutes);
|
||||
// TODO
|
||||
//RtTileRender(Scene.camera, TILE_WIDTH * 2, TILE_HEIGHT * 2, TILE_WIDTH, TILE_HEIGHT, &NewTileRendererCB, nil, s);
|
||||
} else {
|
||||
sprintf(s, "screen%d%d.bmp", CClock::ms_nGameClockHours, CClock::ms_nGameClockMinutes);
|
||||
RwGrabScreen(Scene.camera, s);
|
||||
}
|
||||
}
|
||||
#endif // !MASTER
|
||||
}
|
||||
|
||||
static RwBool
|
||||
@ -852,7 +890,7 @@ RenderScene(void)
|
||||
CRenderer::RenderFadingInEntities();
|
||||
RwRenderStateSet(rwRENDERSTATECULLMODE, (void*)rwCULLMODECULLNONE);
|
||||
CWeather::RenderRainStreaks();
|
||||
// CCoronas::RenderSunReflection
|
||||
CCoronas::RenderSunReflection();
|
||||
}
|
||||
|
||||
void
|
||||
|
@ -7,6 +7,7 @@
|
||||
#include "Credits.h"
|
||||
#include "Camera.h"
|
||||
#include "Weather.h"
|
||||
#include "Timecycle.h"
|
||||
#include "Clock.h"
|
||||
#include "World.h"
|
||||
#include "Vehicle.h"
|
||||
@ -32,6 +33,8 @@
|
||||
#include "WaterLevel.h"
|
||||
#include "main.h"
|
||||
#include "Script.h"
|
||||
#include "MBlur.h"
|
||||
#include "postfx.h"
|
||||
|
||||
#ifndef _WIN32
|
||||
#include "assert.h"
|
||||
@ -406,6 +409,26 @@ DebugMenuPopulate(void)
|
||||
static const char *weathers[] = {
|
||||
"Sunny", "Cloudy", "Rainy", "Foggy", "Extrasunny", "Stormy"
|
||||
};
|
||||
static const char *extracols[] = {
|
||||
"1 - Malibu club",
|
||||
"2 - Strib club",
|
||||
"3 - Hotel",
|
||||
"4 - Bank",
|
||||
"5 - Police HQ",
|
||||
"6 - Mall",
|
||||
"7 - Rifle Range",
|
||||
"8 - Mansion",
|
||||
"9 - Dirt ring",
|
||||
"10 - Blood ring",
|
||||
"11 - Hot ring",
|
||||
"12 - Concert hall",
|
||||
"13 - Auntie Poulets",
|
||||
"14 - Intro at docks",
|
||||
"15 - Biker bar",
|
||||
"16 - Intro cafe",
|
||||
"17 - Studio",
|
||||
"18", "19", "20", "21", "22", "23", "24"
|
||||
};
|
||||
DebugMenuEntry *e;
|
||||
e = DebugMenuAddVar("Time & Weather", "Current Hour", &CClock::GetHoursRef(), nil, 1, 0, 23, nil);
|
||||
DebugMenuEntrySetWrap(e, true);
|
||||
@ -416,7 +439,8 @@ DebugMenuPopulate(void)
|
||||
DebugMenuEntrySetWrap(e, true);
|
||||
e = DebugMenuAddVar("Time & Weather", "New Weather", (int16*)&CWeather::NewWeatherType, nil, 1, 0, 5, weathers);
|
||||
DebugMenuEntrySetWrap(e, true);
|
||||
DebugMenuAddVar("Time & Weather", "Wind", (float*)&CWeather::Wind, nil, 0.1f, 0.0f, 1.0f);
|
||||
DebugMenuAddVarBool32("Time & Weather", "Extracolours On", &CTimeCycle::m_bExtraColourOn, nil);
|
||||
DebugMenuAddVar("Time & Weather", "Extracolour", &CTimeCycle::m_ExtraColour, nil, 1, 0, 23, extracols);
|
||||
DebugMenuAddVar("Time & Weather", "Time scale", (float*)&CTimer::GetTimeScale(), nil, 0.1f, 0.0f, 10.0f);
|
||||
|
||||
DebugMenuAddCmd("Cheats", "Weapon set 1", WeaponCheat1);
|
||||
@ -493,6 +517,15 @@ DebugMenuPopulate(void)
|
||||
DebugMenuAddVarBool8("Render", "Frame limiter", &FrontEndMenuManager.m_PrefsFrameLimiter, nil);
|
||||
DebugMenuAddVarBool8("Render", "VSynch", &FrontEndMenuManager.m_PrefsVsync, nil);
|
||||
DebugMenuAddVar("Render", "Max FPS", &RsGlobal.maxFPS, nil, 1, 1, 1000, nil);
|
||||
#ifdef EXTENDED_COLOURFILTER
|
||||
static const char *filternames[] = { "None", "Simple", "Normal", "Mobile" };
|
||||
e = DebugMenuAddVar("Render", "Colourfilter", &CPostFX::EffectSwitch, nil, 1, CPostFX::POSTFX_OFF, CPostFX::POSTFX_MOBILE, filternames);
|
||||
DebugMenuEntrySetWrap(e, true);
|
||||
DebugMenuAddVar("Render", "Intensity", &CPostFX::Intensity, nil, 0.05f, 0, 10.0f);
|
||||
DebugMenuAddVarBool8("Render", "Blur", &CPostFX::BlurOn, nil);
|
||||
DebugMenuAddVarBool8("Render", "Motion Blur", &CPostFX::MotionBlurOn, nil);
|
||||
#endif
|
||||
DebugMenuAddVar("Render", "Drunkness", &CMBlur::Drunkness, nil, 0.05f, 0, 1.0f);
|
||||
DebugMenuAddVarBool8("Render", "Occlusion debug", &bDisplayOccDebugStuff, nil);
|
||||
DebugMenuAddVarBool8("Render", "Show Ped Paths", &gbShowPedPaths, nil);
|
||||
DebugMenuAddVarBool8("Render", "Show Car Paths", &gbShowCarPaths, nil);
|
||||
@ -534,7 +567,30 @@ DebugMenuPopulate(void)
|
||||
DebugMenuAddVarBool8("Debug", "Show Timebars", &gbShowTimebars, nil);
|
||||
#endif
|
||||
#ifdef MISSION_SWITCHER
|
||||
DebugMenuAddInt8("Debug", "Select mission no", &nextMissionToSwitch, nil, 1, 0, 96, nil);
|
||||
DebugMenuEntry *missionEntry;
|
||||
static const char* missions[] = {
|
||||
"Initial", "Intro", "An Old Friend", "The Party", "Back Alley Brawl", "Jury Fury", "Riot",
|
||||
"Treacherous Swine", "Mall Shootout", "Guardian Angels", "Sir, Yes Sir!", "All Hands On Deck!",
|
||||
"The Chase", "Phnom Penh '86", "The Fastest Boat", "Supply & Demand", "Rub Out", "Death Row",
|
||||
"Four Iron", "Demolition Man", "Two Bit Hit", "No Escape?", "The Shootist", "The Driver",
|
||||
"The Job", "Gun Runner", "Boomshine Saigon", "Recruitment Drive", "Dildo Dodo", "Martha's Mug Shot",
|
||||
"G-spotlight", "Shakedown", "Bar Brawl", "Cop Land", "Spilling the Beans", "Hit the Courier",
|
||||
"Printworks Buy", "Sunshine Autos", "Interglobal Films Buy", "Cherry Popper Icecreams Buy",
|
||||
"Kaufman Cabs Buy", "Malibu Club Buy", "The Boatyard Buy", "Pole Position Club Buy", "El Swanko Casa Buy",
|
||||
"Links View Apartment Buy", "Hyman Condo Buy", "Ocean Heighs Aprt. Buy", "1102 Washington Street Buy",
|
||||
"Vice Point Buy", "Skumole Shack Buy", "Cap the Collector", "Keep your Friends Close...",
|
||||
"Alloy Wheels of Steel", "Messing with the Man", "Hog Tied", "Stunt Boat Challenge", "Cannon Fodder",
|
||||
"Naval Engagement", "Trojan Voodoo", "Juju Scramble", "Bombs Away!", "Dirty Lickin's", "Love Juice",
|
||||
"Psycho Killer", "Publicity Tour", "Weapon Range", "Road Kill", "Waste the Wife", "Autocide",
|
||||
"Check Out at the Check In", "Loose Ends", "V.I.P.", "Friendly Rivalry", "Cabmaggedon", "TAXI DRIVER",
|
||||
"PARAMEDIC", "FIREFIGHTER", "VIGILANTE", "HOTRING", "BLOODRING", "DIRTRING", "Sunshine Autos Races",
|
||||
"Distribution", "Downtown Chopper Checkpoint", "Ocean Beach Chopper Checkpoint", "Vice Point Chopper Checkpoint",
|
||||
"Little Haiti Chopper Checkpoint", "Trial by Dirt", "Test Track", "PCJ Playground", "Cone Crazy",
|
||||
"PIZZA BOY", "RC Raider Pickup", "RC Bandit Race", "RC Baron Race", "Checkpoint Charlie"
|
||||
};
|
||||
|
||||
missionEntry = DebugMenuAddVar("Debug", "Select mission", &nextMissionToSwitch, nil, 1, 0, 96, missions);
|
||||
DebugMenuEntrySetWrap(missionEntry, true);
|
||||
DebugMenuAddCmd("Debug", "Start selected mission ", SwitchToMission);
|
||||
#endif
|
||||
extern bool PrintDebugCode;
|
||||
|
492
src/extras/postfx.cpp
Normal file
492
src/extras/postfx.cpp
Normal file
@ -0,0 +1,492 @@
|
||||
#define WITHWINDOWS
|
||||
#define WITH_D3D
|
||||
#include "common.h"
|
||||
|
||||
#ifdef EXTENDED_COLOURFILTER
|
||||
|
||||
#ifndef LIBRW
|
||||
#error "Need librw for EXTENDED_COLOURFILTER"
|
||||
#endif
|
||||
|
||||
#include "RwHelper.h"
|
||||
#include "Camera.h"
|
||||
#include "MBlur.h"
|
||||
#include "postfx.h"
|
||||
|
||||
RwRaster *CPostFX::pFrontBuffer;
|
||||
RwRaster *CPostFX::pBackBuffer;
|
||||
bool CPostFX::bJustInitialised;
|
||||
int CPostFX::EffectSwitch = POSTFX_NORMAL;
|
||||
bool CPostFX::BlurOn = false;
|
||||
bool CPostFX::MotionBlurOn = false;
|
||||
|
||||
static RwIm2DVertex Vertex[4];
|
||||
static RwIm2DVertex Vertex2[4];
|
||||
static RwImVertexIndex Index[6] = { 0, 1, 2, 0, 2, 3 };
|
||||
|
||||
#ifdef RW_D3D9
|
||||
void *colourfilterVC_PS;
|
||||
void *contrast_PS;
|
||||
#endif
|
||||
#ifdef RW_OPENGL
|
||||
int32 u_blurcolor;
|
||||
int32 u_contrastAdd;
|
||||
int32 u_contrastMult;
|
||||
rw::gl3::Shader *colourFilterVC;
|
||||
rw::gl3::Shader *contrast;
|
||||
#endif
|
||||
|
||||
void
|
||||
CPostFX::InitOnce(void)
|
||||
{
|
||||
#ifdef RW_OPENGL
|
||||
u_blurcolor = rw::gl3::registerUniform("u_blurcolor");
|
||||
u_contrastAdd = rw::gl3::registerUniform("u_contrastAdd");
|
||||
u_contrastMult = rw::gl3::registerUniform("u_contrastMult");
|
||||
#endif
|
||||
}
|
||||
|
||||
void
|
||||
CPostFX::Open(RwCamera *cam)
|
||||
{
|
||||
uint32 width = Pow(2.0f, int32(log2(RwRasterGetWidth (RwCameraGetRaster(cam))))+1);
|
||||
uint32 height = Pow(2.0f, int32(log2(RwRasterGetHeight(RwCameraGetRaster(cam))))+1);
|
||||
uint32 depth = RwRasterGetDepth(RwCameraGetRaster(cam));
|
||||
pFrontBuffer = RwRasterCreate(width, height, depth, rwRASTERTYPECAMERATEXTURE);
|
||||
pBackBuffer = RwRasterCreate(width, height, depth, rwRASTERTYPECAMERATEXTURE);
|
||||
bJustInitialised = true;
|
||||
|
||||
float zero, xmax, ymax;
|
||||
|
||||
if(RwRasterGetDepth(RwCameraGetRaster(cam)) == 16){
|
||||
zero = HALFPX;
|
||||
xmax = width + HALFPX;
|
||||
ymax = height + HALFPX;
|
||||
}else{
|
||||
zero = -HALFPX;
|
||||
xmax = width - HALFPX;
|
||||
ymax = height - HALFPX;
|
||||
}
|
||||
|
||||
RwIm2DVertexSetScreenX(&Vertex[0], zero);
|
||||
RwIm2DVertexSetScreenY(&Vertex[0], zero);
|
||||
RwIm2DVertexSetScreenZ(&Vertex[0], RwIm2DGetNearScreenZ());
|
||||
RwIm2DVertexSetCameraZ(&Vertex[0], RwCameraGetNearClipPlane(cam));
|
||||
RwIm2DVertexSetRecipCameraZ(&Vertex[0], 1.0f/RwCameraGetNearClipPlane(cam));
|
||||
RwIm2DVertexSetU(&Vertex[0], 0.0f, 1.0f/RwCameraGetNearClipPlane(cam));
|
||||
RwIm2DVertexSetV(&Vertex[0], 0.0f, 1.0f/RwCameraGetNearClipPlane(cam));
|
||||
RwIm2DVertexSetIntRGBA(&Vertex[0], 255, 255, 255, 255);
|
||||
|
||||
RwIm2DVertexSetScreenX(&Vertex[1], zero);
|
||||
RwIm2DVertexSetScreenY(&Vertex[1], ymax);
|
||||
RwIm2DVertexSetScreenZ(&Vertex[1], RwIm2DGetNearScreenZ());
|
||||
RwIm2DVertexSetCameraZ(&Vertex[1], RwCameraGetNearClipPlane(cam));
|
||||
RwIm2DVertexSetRecipCameraZ(&Vertex[1], 1.0f/RwCameraGetNearClipPlane(cam));
|
||||
RwIm2DVertexSetU(&Vertex[1], 0.0f, 1.0f/RwCameraGetNearClipPlane(cam));
|
||||
RwIm2DVertexSetV(&Vertex[1], 1.0f, 1.0f/RwCameraGetNearClipPlane(cam));
|
||||
RwIm2DVertexSetIntRGBA(&Vertex[1], 255, 255, 255, 255);
|
||||
|
||||
RwIm2DVertexSetScreenX(&Vertex[2], xmax);
|
||||
RwIm2DVertexSetScreenY(&Vertex[2], ymax);
|
||||
RwIm2DVertexSetScreenZ(&Vertex[2], RwIm2DGetNearScreenZ());
|
||||
RwIm2DVertexSetCameraZ(&Vertex[2], RwCameraGetNearClipPlane(cam));
|
||||
RwIm2DVertexSetRecipCameraZ(&Vertex[2], 1.0f/RwCameraGetNearClipPlane(cam));
|
||||
RwIm2DVertexSetU(&Vertex[2], 1.0f, 1.0f/RwCameraGetNearClipPlane(cam));
|
||||
RwIm2DVertexSetV(&Vertex[2], 1.0f, 1.0f/RwCameraGetNearClipPlane(cam));
|
||||
RwIm2DVertexSetIntRGBA(&Vertex[2], 255, 255, 255, 255);
|
||||
|
||||
RwIm2DVertexSetScreenX(&Vertex[3], xmax);
|
||||
RwIm2DVertexSetScreenY(&Vertex[3], zero);
|
||||
RwIm2DVertexSetScreenZ(&Vertex[3], RwIm2DGetNearScreenZ());
|
||||
RwIm2DVertexSetCameraZ(&Vertex[3], RwCameraGetNearClipPlane(cam));
|
||||
RwIm2DVertexSetRecipCameraZ(&Vertex[3], 1.0f/RwCameraGetNearClipPlane(cam));
|
||||
RwIm2DVertexSetU(&Vertex[3], 1.0f, 1.0f/RwCameraGetNearClipPlane(cam));
|
||||
RwIm2DVertexSetV(&Vertex[3], 0.0f, 1.0f/RwCameraGetNearClipPlane(cam));
|
||||
RwIm2DVertexSetIntRGBA(&Vertex[3], 255, 255, 255, 255);
|
||||
|
||||
|
||||
RwIm2DVertexSetScreenX(&Vertex2[0], zero + 2.0f);
|
||||
RwIm2DVertexSetScreenY(&Vertex2[0], zero + 2.0f);
|
||||
RwIm2DVertexSetScreenZ(&Vertex2[0], RwIm2DGetNearScreenZ());
|
||||
RwIm2DVertexSetCameraZ(&Vertex2[0], RwCameraGetNearClipPlane(cam));
|
||||
RwIm2DVertexSetRecipCameraZ(&Vertex2[0], 1.0f/RwCameraGetNearClipPlane(cam));
|
||||
RwIm2DVertexSetU(&Vertex2[0], 0.0f, 1.0f/RwCameraGetNearClipPlane(cam));
|
||||
RwIm2DVertexSetV(&Vertex2[0], 0.0f, 1.0f/RwCameraGetNearClipPlane(cam));
|
||||
RwIm2DVertexSetIntRGBA(&Vertex2[0], 255, 255, 255, 255);
|
||||
|
||||
RwIm2DVertexSetScreenX(&Vertex2[1], 2.0f);
|
||||
RwIm2DVertexSetScreenY(&Vertex2[1], ymax + 2.0f);
|
||||
RwIm2DVertexSetScreenZ(&Vertex2[1], RwIm2DGetNearScreenZ());
|
||||
RwIm2DVertexSetCameraZ(&Vertex2[1], RwCameraGetNearClipPlane(cam));
|
||||
RwIm2DVertexSetRecipCameraZ(&Vertex2[1], 1.0f/RwCameraGetNearClipPlane(cam));
|
||||
RwIm2DVertexSetU(&Vertex2[1], 0.0f, 1.0f/RwCameraGetNearClipPlane(cam));
|
||||
RwIm2DVertexSetV(&Vertex2[1], 1.0f, 1.0f/RwCameraGetNearClipPlane(cam));
|
||||
RwIm2DVertexSetIntRGBA(&Vertex2[1], 255, 255, 255, 255);
|
||||
|
||||
RwIm2DVertexSetScreenX(&Vertex2[2], xmax + 2.0f);
|
||||
RwIm2DVertexSetScreenY(&Vertex2[2], ymax + 2.0f);
|
||||
RwIm2DVertexSetScreenZ(&Vertex2[2], RwIm2DGetNearScreenZ());
|
||||
RwIm2DVertexSetCameraZ(&Vertex2[2], RwCameraGetNearClipPlane(cam));
|
||||
RwIm2DVertexSetRecipCameraZ(&Vertex2[2], 1.0f/RwCameraGetNearClipPlane(cam));
|
||||
RwIm2DVertexSetU(&Vertex2[2], 1.0f, 1.0f/RwCameraGetNearClipPlane(cam));
|
||||
RwIm2DVertexSetV(&Vertex2[2], 1.0f, 1.0f/RwCameraGetNearClipPlane(cam));
|
||||
RwIm2DVertexSetIntRGBA(&Vertex2[2], 255, 255, 255, 255);
|
||||
|
||||
RwIm2DVertexSetScreenX(&Vertex2[3], xmax + 2.0f);
|
||||
RwIm2DVertexSetScreenY(&Vertex2[3], zero + 2.0f);
|
||||
RwIm2DVertexSetScreenZ(&Vertex2[3], RwIm2DGetNearScreenZ());
|
||||
RwIm2DVertexSetCameraZ(&Vertex2[3], RwCameraGetNearClipPlane(cam));
|
||||
RwIm2DVertexSetRecipCameraZ(&Vertex2[3], 1.0f/RwCameraGetNearClipPlane(cam));
|
||||
RwIm2DVertexSetU(&Vertex2[3], 1.0f, 1.0f/RwCameraGetNearClipPlane(cam));
|
||||
RwIm2DVertexSetV(&Vertex2[3], 0.0f, 1.0f/RwCameraGetNearClipPlane(cam));
|
||||
RwIm2DVertexSetIntRGBA(&Vertex2[3], 255, 255, 255, 255);
|
||||
|
||||
|
||||
#ifdef RW_D3D9
|
||||
#include "shaders/colourfilterVC_PS.inc"
|
||||
colourfilterVC_PS = rw::d3d::createPixelShader(colourfilterVC_PS_cso);
|
||||
#include "shaders/contrastPS.inc"
|
||||
contrast_PS = rw::d3d::createPixelShader(contrastPS_cso);
|
||||
#endif
|
||||
#ifdef RW_OPENGL
|
||||
using namespace rw::gl3;
|
||||
|
||||
{
|
||||
#ifdef RW_GLES2
|
||||
#include "gl2_shaders/im2d_gl2.inc"
|
||||
#include "gl2_shaders/colourfilterVC_fs_gl2.inc"
|
||||
#else
|
||||
#include "shaders/im2d_gl3.inc"
|
||||
#include "shaders/colourfilterVC_fs_gl3.inc"
|
||||
#endif
|
||||
const char *vs[] = { shaderDecl, header_vert_src, im2d_vert_src, nil };
|
||||
const char *fs[] = { shaderDecl, header_frag_src, colourfilterVC_frag_src, nil };
|
||||
colourFilterVC = Shader::create(vs, fs);
|
||||
assert(colourFilterVC);
|
||||
}
|
||||
|
||||
{
|
||||
#ifdef RW_GLES2
|
||||
#include "gl2_shaders/im2d_gl2.inc"
|
||||
#include "gl2_shaders/contrast_fs_gl2.inc"
|
||||
#else
|
||||
#include "shaders/im2d_gl3.inc"
|
||||
#include "shaders/contrast_fs_gl3.inc"
|
||||
const char *vs[] = { shaderDecl, header_vert_src, im2d_vert_src, nil };
|
||||
const char *fs[] = { shaderDecl, header_frag_src, contrast_frag_src, nil };
|
||||
contrast = Shader::create(vs, fs);
|
||||
assert(contrast);
|
||||
#endif
|
||||
}
|
||||
|
||||
#endif
|
||||
}
|
||||
|
||||
void
|
||||
CPostFX::Close(void)
|
||||
{
|
||||
if(pFrontBuffer){
|
||||
RwRasterDestroy(pFrontBuffer);
|
||||
pFrontBuffer = nil;
|
||||
}
|
||||
if(pBackBuffer){
|
||||
RwRasterDestroy(pBackBuffer);
|
||||
pBackBuffer = nil;
|
||||
}
|
||||
#ifdef RW_D3D9
|
||||
if(colourfilterVC_PS){
|
||||
rw::d3d::destroyPixelShader(colourfilterVC_PS);
|
||||
colourfilterVC_PS = nil;
|
||||
}
|
||||
if(contrast_PS){
|
||||
rw::d3d::destroyPixelShader(contrast_PS);
|
||||
contrast_PS = nil;
|
||||
}
|
||||
#endif
|
||||
#ifdef RW_OPENGL
|
||||
if(colourFilterVC){
|
||||
colourFilterVC->destroy();
|
||||
colourFilterVC = nil;
|
||||
}
|
||||
if(contrast){
|
||||
contrast->destroy();
|
||||
contrast = nil;
|
||||
}
|
||||
#endif
|
||||
}
|
||||
|
||||
void
|
||||
CPostFX::RenderOverlayBlur(RwCamera *cam, int32 r, int32 g, int32 b, int32 a)
|
||||
{
|
||||
RwRenderStateSet(rwRENDERSTATETEXTURERASTER, pFrontBuffer);
|
||||
RwRenderStateSet(rwRENDERSTATEVERTEXALPHAENABLE, (void*)TRUE);
|
||||
|
||||
RwIm2DVertexSetIntRGBA(&Vertex[0], r*2, g*2, b*2, 30);
|
||||
RwIm2DVertexSetIntRGBA(&Vertex[1], r*2, g*2, b*2, 30);
|
||||
RwIm2DVertexSetIntRGBA(&Vertex[2], r*2, g*2, b*2, 30);
|
||||
RwIm2DVertexSetIntRGBA(&Vertex[3], r*2, g*2, b*2, 30);
|
||||
RwIm2DVertexSetIntRGBA(&Vertex2[0], r*2, g*2, b*2, 30);
|
||||
RwIm2DVertexSetIntRGBA(&Vertex2[1], r*2, g*2, b*2, 30);
|
||||
RwIm2DVertexSetIntRGBA(&Vertex2[2], r*2, g*2, b*2, 30);
|
||||
RwIm2DVertexSetIntRGBA(&Vertex2[3], r*2, g*2, b*2, 30);
|
||||
|
||||
RwRenderStateSet(rwRENDERSTATESRCBLEND, (void*)rwBLENDSRCALPHA);
|
||||
RwRenderStateSet(rwRENDERSTATEDESTBLEND, (void*)rwBLENDINVSRCALPHA);
|
||||
|
||||
RwIm2DRenderIndexedPrimitive(rwPRIMTYPETRILIST, BlurOn ? Vertex2 : Vertex, 4, Index, 6);
|
||||
|
||||
|
||||
RwIm2DVertexSetIntRGBA(&Vertex2[0], r, g, b, a);
|
||||
RwIm2DVertexSetIntRGBA(&Vertex[0], r, g, b, a);
|
||||
RwIm2DVertexSetIntRGBA(&Vertex2[1], r, g, b, a);
|
||||
RwIm2DVertexSetIntRGBA(&Vertex[1], r, g, b, a);
|
||||
RwIm2DVertexSetIntRGBA(&Vertex2[2], r, g, b, a);
|
||||
RwIm2DVertexSetIntRGBA(&Vertex[2], r, g, b, a);
|
||||
RwIm2DVertexSetIntRGBA(&Vertex2[3], r, g, b, a);
|
||||
RwIm2DVertexSetIntRGBA(&Vertex[3], r, g, b, a);
|
||||
|
||||
RwRenderStateSet(rwRENDERSTATESRCBLEND, (void*)rwBLENDONE);
|
||||
RwRenderStateSet(rwRENDERSTATEDESTBLEND, (void*)rwBLENDONE);
|
||||
|
||||
RwIm2DRenderIndexedPrimitive(rwPRIMTYPETRILIST, Vertex, 4, Index, 6);
|
||||
RwIm2DRenderIndexedPrimitive(rwPRIMTYPETRILIST, BlurOn ? Vertex2 : Vertex, 4, Index, 6);
|
||||
}
|
||||
|
||||
void
|
||||
CPostFX::RenderOverlaySniper(RwCamera *cam, int32 r, int32 g, int32 b, int32 a)
|
||||
{
|
||||
RwRenderStateSet(rwRENDERSTATETEXTURERASTER, pFrontBuffer);
|
||||
RwRenderStateSet(rwRENDERSTATEVERTEXALPHAENABLE, (void*)TRUE);
|
||||
|
||||
RwIm2DVertexSetIntRGBA(&Vertex[0], r, g, b, 80);
|
||||
RwIm2DVertexSetIntRGBA(&Vertex[1], r, g, b, 80);
|
||||
RwIm2DVertexSetIntRGBA(&Vertex[2], r, g, b, 80);
|
||||
RwIm2DVertexSetIntRGBA(&Vertex[3], r, g, b, 80);
|
||||
RwRenderStateSet(rwRENDERSTATESRCBLEND, (void*)rwBLENDSRCALPHA);
|
||||
RwRenderStateSet(rwRENDERSTATEDESTBLEND, (void*)rwBLENDINVSRCALPHA);
|
||||
|
||||
RwIm2DRenderIndexedPrimitive(rwPRIMTYPETRILIST, Vertex, 4, Index, 6);
|
||||
}
|
||||
|
||||
float CPostFX::Intensity = 1.0f;
|
||||
|
||||
void
|
||||
CPostFX::RenderOverlayShader(RwCamera *cam, int32 r, int32 g, int32 b, int32 a)
|
||||
{
|
||||
RwRenderStateSet(rwRENDERSTATETEXTURERASTER, pBackBuffer);
|
||||
|
||||
if(EffectSwitch == POSTFX_MOBILE){
|
||||
float mult[3], add[3];
|
||||
mult[0] = (r-64)/256.0f + 1.4f;
|
||||
mult[1] = (g-64)/256.0f + 1.4f;
|
||||
mult[2] = (b-64)/256.0f + 1.4f;
|
||||
add[0] = r/1536.f - 0.05f;
|
||||
add[1] = g/1536.f - 0.05f;
|
||||
add[2] = b/1536.f - 0.05f;
|
||||
#ifdef RW_D3D9
|
||||
rw::d3d::d3ddevice->SetPixelShaderConstantF(10, mult, 1);
|
||||
rw::d3d::d3ddevice->SetPixelShaderConstantF(11, add, 1);
|
||||
|
||||
rw::d3d::im2dOverridePS = contrast_PS;
|
||||
#endif
|
||||
#ifdef RW_OPENGL
|
||||
rw::gl3::im2dOverrideShader = contrast;
|
||||
contrast->use();
|
||||
glUniform3fv(contrast->uniformLocations[u_contrastMult], 1, mult);
|
||||
glUniform3fv(contrast->uniformLocations[u_contrastAdd], 1, add);
|
||||
#endif
|
||||
}else{
|
||||
float f = Intensity;
|
||||
float blurcolors[4];
|
||||
blurcolors[0] = r*f/255.0f;
|
||||
blurcolors[1] = g*f/255.0f;
|
||||
blurcolors[2] = b*f/255.0f;
|
||||
blurcolors[3] = 30/255.0f;
|
||||
#ifdef RW_D3D9
|
||||
rw::d3d::d3ddevice->SetPixelShaderConstantF(10, blurcolors, 1);
|
||||
rw::d3d::im2dOverridePS = colourfilterVC_PS;
|
||||
#endif
|
||||
#ifdef RW_OPENGL
|
||||
rw::gl3::im2dOverrideShader = colourFilterVC;
|
||||
colourFilterVC->use();
|
||||
glUniform4fv(colourFilterVC->uniformLocations[u_blurcolor], 1, blurcolors);
|
||||
#endif
|
||||
}
|
||||
RwIm2DRenderIndexedPrimitive(rwPRIMTYPETRILIST, Vertex, 4, Index, 6);
|
||||
#ifdef RW_D3D9
|
||||
rw::d3d::im2dOverridePS = nil;
|
||||
#endif
|
||||
#ifdef RW_OPENGL
|
||||
rw::gl3::im2dOverrideShader = nil;
|
||||
#endif
|
||||
}
|
||||
|
||||
void
|
||||
CPostFX::RenderMotionBlur(RwCamera *cam, uint32 blur)
|
||||
{
|
||||
if(blur == 0)
|
||||
return;
|
||||
|
||||
RwRenderStateSet(rwRENDERSTATETEXTURERASTER, pFrontBuffer);
|
||||
RwRenderStateSet(rwRENDERSTATEVERTEXALPHAENABLE, (void*)TRUE);
|
||||
RwRenderStateSet(rwRENDERSTATESRCBLEND, (void*)rwBLENDSRCALPHA);
|
||||
RwRenderStateSet(rwRENDERSTATEDESTBLEND, (void*)rwBLENDINVSRCALPHA);
|
||||
|
||||
RwIm2DVertexSetIntRGBA(&Vertex[0], 255, 255, 255, blur);
|
||||
RwIm2DVertexSetIntRGBA(&Vertex[1], 255, 255, 255, blur);
|
||||
RwIm2DVertexSetIntRGBA(&Vertex[2], 255, 255, 255, blur);
|
||||
RwIm2DVertexSetIntRGBA(&Vertex[3], 255, 255, 255, blur);
|
||||
|
||||
RwIm2DRenderIndexedPrimitive(rwPRIMTYPETRILIST, Vertex, 4, Index, 6);
|
||||
}
|
||||
|
||||
bool
|
||||
CPostFX::NeedBackBuffer(void)
|
||||
{
|
||||
// Current frame -- needed for non-blur effect
|
||||
switch(EffectSwitch){
|
||||
case POSTFX_OFF:
|
||||
case POSTFX_SIMPLE:
|
||||
// no actual rendering here
|
||||
return false;
|
||||
case POSTFX_NORMAL:
|
||||
if(MotionBlurOn)
|
||||
return false;
|
||||
else
|
||||
return true;
|
||||
case POSTFX_MOBILE:
|
||||
return true;
|
||||
}
|
||||
return false;
|
||||
}
|
||||
|
||||
bool
|
||||
CPostFX::NeedFrontBuffer(int32 type)
|
||||
{
|
||||
// Last frame -- needed for motion blur
|
||||
if(CMBlur::Drunkness > 0.0f)
|
||||
return true;
|
||||
if(type == MOTION_BLUR_SNIPER)
|
||||
return true;
|
||||
|
||||
switch(EffectSwitch){
|
||||
case POSTFX_OFF:
|
||||
case POSTFX_SIMPLE:
|
||||
// no actual rendering here
|
||||
return false;
|
||||
case POSTFX_NORMAL:
|
||||
if(MotionBlurOn)
|
||||
return true;
|
||||
else
|
||||
return false;
|
||||
case POSTFX_MOBILE:
|
||||
return false;
|
||||
}
|
||||
return false;
|
||||
}
|
||||
|
||||
void
|
||||
CPostFX::Render(RwCamera *cam, uint32 red, uint32 green, uint32 blue, uint32 blur, int32 type, uint32 bluralpha)
|
||||
{
|
||||
if(pFrontBuffer == nil)
|
||||
Open(cam);
|
||||
assert(pFrontBuffer);
|
||||
assert(pBackBuffer);
|
||||
|
||||
if(type == MOTION_BLUR_LIGHT_SCENE){
|
||||
SmoothColor(red, green, blue, blur);
|
||||
red = AvgRed;
|
||||
green = AvgGreen;
|
||||
blue = AvgBlue;
|
||||
blur = AvgAlpha;
|
||||
}
|
||||
|
||||
if(NeedBackBuffer()){
|
||||
RwRasterPushContext(pBackBuffer);
|
||||
RwRasterRenderFast(RwCameraGetRaster(cam), 0, 0);
|
||||
RwRasterPopContext();
|
||||
}
|
||||
|
||||
DefinedState();
|
||||
|
||||
RwRenderStateSet(rwRENDERSTATEFOGENABLE, (void*)FALSE);
|
||||
RwRenderStateSet(rwRENDERSTATETEXTUREFILTER, (void*)rwFILTERNEAREST);
|
||||
RwRenderStateSet(rwRENDERSTATEZTESTENABLE, (void*)FALSE);
|
||||
RwRenderStateSet(rwRENDERSTATEZWRITEENABLE, (void*)FALSE);
|
||||
|
||||
if(type == MOTION_BLUR_SNIPER){
|
||||
if(!bJustInitialised)
|
||||
RenderOverlaySniper(cam, red, green, blue, blur);
|
||||
}else switch(EffectSwitch){
|
||||
case POSTFX_OFF:
|
||||
case POSTFX_SIMPLE:
|
||||
// no actual rendering here
|
||||
break;
|
||||
case POSTFX_NORMAL:
|
||||
if(MotionBlurOn){
|
||||
if(!bJustInitialised)
|
||||
RenderOverlayBlur(cam, red, green, blue, blur);
|
||||
}else{
|
||||
RenderOverlayShader(cam, red, green, blue, blur);
|
||||
}
|
||||
break;
|
||||
case POSTFX_MOBILE:
|
||||
RenderOverlayShader(cam, red, green, blue, blur);
|
||||
break;
|
||||
}
|
||||
|
||||
if(!bJustInitialised)
|
||||
RenderMotionBlur(cam, 175.0f * CMBlur::Drunkness);
|
||||
|
||||
RwRenderStateSet(rwRENDERSTATEZTESTENABLE, (void*)TRUE);
|
||||
RwRenderStateSet(rwRENDERSTATEZWRITEENABLE, (void*)TRUE);
|
||||
RwRenderStateSet(rwRENDERSTATETEXTURERASTER, nil);
|
||||
RwRenderStateSet(rwRENDERSTATEVERTEXALPHAENABLE, (void*)FALSE);
|
||||
RwRenderStateSet(rwRENDERSTATESRCBLEND, (void*)rwBLENDSRCALPHA);
|
||||
RwRenderStateSet(rwRENDERSTATEDESTBLEND, (void*)rwBLENDINVSRCALPHA);
|
||||
|
||||
if(NeedFrontBuffer(type)){
|
||||
RwRasterPushContext(pFrontBuffer);
|
||||
RwRasterRenderFast(RwCameraGetRaster(cam), 0, 0);
|
||||
RwRasterPopContext();
|
||||
bJustInitialised = false;
|
||||
}else
|
||||
bJustInitialised = true;
|
||||
}
|
||||
|
||||
int CPostFX::PrevRed[NUMAVERAGE], CPostFX::AvgRed;
|
||||
int CPostFX::PrevGreen[NUMAVERAGE], CPostFX::AvgGreen;
|
||||
int CPostFX::PrevBlue[NUMAVERAGE], CPostFX::AvgBlue;
|
||||
int CPostFX::PrevAlpha[NUMAVERAGE], CPostFX::AvgAlpha;
|
||||
int CPostFX::Next;
|
||||
int CPostFX::NumValues;
|
||||
|
||||
// This is rather annoying...the blur color can flicker slightly
|
||||
// which becomes very visible when amplified by the shader
|
||||
void
|
||||
CPostFX::SmoothColor(uint32 red, uint32 green, uint32 blue, uint32 alpha)
|
||||
{
|
||||
PrevRed[Next] = red;
|
||||
PrevGreen[Next] = green;
|
||||
PrevBlue[Next] = blue;
|
||||
PrevAlpha[Next] = alpha;
|
||||
Next = (Next+1) % NUMAVERAGE;
|
||||
NumValues = Min(NumValues+1, NUMAVERAGE);
|
||||
|
||||
AvgRed = 0;
|
||||
AvgGreen = 0;
|
||||
AvgBlue = 0;
|
||||
AvgAlpha = 0;
|
||||
for(int i = 0; i < NumValues; i++){
|
||||
AvgRed += PrevRed[i];
|
||||
AvgGreen += PrevGreen[i];
|
||||
AvgBlue += PrevBlue[i];
|
||||
AvgAlpha += PrevAlpha[i];
|
||||
}
|
||||
AvgRed /= NumValues;
|
||||
AvgGreen /= NumValues;
|
||||
AvgBlue /= NumValues;
|
||||
AvgAlpha /= NumValues;
|
||||
}
|
||||
|
||||
#endif
|
45
src/extras/postfx.h
Normal file
45
src/extras/postfx.h
Normal file
@ -0,0 +1,45 @@
|
||||
#pragma once
|
||||
|
||||
#ifdef EXTENDED_COLOURFILTER
|
||||
|
||||
class CPostFX
|
||||
{
|
||||
public:
|
||||
enum {
|
||||
POSTFX_OFF,
|
||||
POSTFX_SIMPLE,
|
||||
POSTFX_NORMAL,
|
||||
POSTFX_MOBILE
|
||||
};
|
||||
static RwRaster *pFrontBuffer;
|
||||
static RwRaster *pBackBuffer;
|
||||
static bool bJustInitialised;
|
||||
static int EffectSwitch;
|
||||
static bool BlurOn; // or use CMblur for that?
|
||||
static bool MotionBlurOn; // or use CMblur for that?
|
||||
static float Intensity;
|
||||
|
||||
// smooth blur color
|
||||
enum { NUMAVERAGE = 20 };
|
||||
static int PrevRed[NUMAVERAGE], AvgRed;
|
||||
static int PrevGreen[NUMAVERAGE], AvgGreen;
|
||||
static int PrevBlue[NUMAVERAGE], AvgBlue;
|
||||
static int PrevAlpha[NUMAVERAGE], AvgAlpha;
|
||||
static int Next;
|
||||
static int NumValues;
|
||||
|
||||
static void InitOnce(void);
|
||||
static void Open(RwCamera *cam);
|
||||
static void Close(void);
|
||||
static void RenderOverlayBlur(RwCamera *cam, int32 r, int32 g, int32 b, int32 a);
|
||||
static void RenderOverlaySniper(RwCamera *cam, int32 r, int32 g, int32 b, int32 a);
|
||||
static void RenderOverlayShader(RwCamera *cam, int32 r, int32 g, int32 b, int32 a);
|
||||
static void RenderMotionBlur(RwCamera *cam, uint32 blur);
|
||||
static void Render(RwCamera *cam, uint32 red, uint32 green, uint32 blue, uint32 blur, int32 type, uint32 bluralpha);
|
||||
static void SmoothColor(uint32 red, uint32 green, uint32 blue, uint32 alpha);
|
||||
static bool NeedBackBuffer(void);
|
||||
static bool NeedFrontBuffer(int32 type);
|
||||
static bool UseBlurColours(void) { return EffectSwitch != POSTFX_SIMPLE; }
|
||||
};
|
||||
|
||||
#endif
|
16
src/extras/shaders/Makefile
Normal file
16
src/extras/shaders/Makefile
Normal file
@ -0,0 +1,16 @@
|
||||
all: im2d_gl3.inc colourfilterVC_fs_gl3.inc contrast_fs_gl3.inc
|
||||
|
||||
im2d_gl3.inc: im2d.vert
|
||||
(echo 'const char *im2d_vert_src =';\
|
||||
sed 's/..*/"&\\n"/' im2d.vert;\
|
||||
echo ';') >im2d_gl3.inc
|
||||
|
||||
colourfilterVC_fs_gl3.inc: colourfilterVC.frag
|
||||
(echo 'const char *colourfilterVC_frag_src =';\
|
||||
sed 's/..*/"&\\n"/' colourfilterVC.frag;\
|
||||
echo ';') >colourfilterVC_fs_gl3.inc
|
||||
|
||||
contrast_fs_gl3.inc: contrast.frag
|
||||
(echo 'const char *contrast_frag_src =';\
|
||||
sed 's/..*/"&\\n"/' contrast.frag;\
|
||||
echo ';') >contrast_fs_gl3.inc
|
28
src/extras/shaders/colourfilterVC.frag
Normal file
28
src/extras/shaders/colourfilterVC.frag
Normal file
@ -0,0 +1,28 @@
|
||||
uniform sampler2D tex0;
|
||||
uniform vec4 u_blurcolor;
|
||||
|
||||
in vec4 v_color;
|
||||
in vec2 v_tex0;
|
||||
in float v_fog;
|
||||
|
||||
out vec4 color;
|
||||
|
||||
void
|
||||
main(void)
|
||||
{
|
||||
float a = u_blurcolor.a;
|
||||
|
||||
vec4 doublec = clamp(u_blurcolor*2, 0.0, 1.0);
|
||||
vec4 dst = texture(tex0, vec2(v_tex0.x, 1.0-v_tex0.y));
|
||||
vec4 prev = dst;
|
||||
for(int i = 0; i < 5; i++){
|
||||
// vec4 doublec = clamp(u_blurcolor*2, 0.0, 1.0);
|
||||
vec4 tmp = dst*(1.0-a) + prev*doublec*a;
|
||||
tmp += prev*u_blurcolor;
|
||||
tmp += prev*u_blurcolor;
|
||||
prev = clamp(tmp, 0.0, 1.0);
|
||||
}
|
||||
color.rgb = prev.rgb;
|
||||
color.a = 1.0f;
|
||||
}
|
||||
|
BIN
src/extras/shaders/colourfilterVC_PS.cso
Normal file
BIN
src/extras/shaders/colourfilterVC_PS.cso
Normal file
Binary file not shown.
23
src/extras/shaders/colourfilterVC_PS.hlsl
Normal file
23
src/extras/shaders/colourfilterVC_PS.hlsl
Normal file
@ -0,0 +1,23 @@
|
||||
sampler2D tex : register(s0);
|
||||
float4 blurcol : register(c10);
|
||||
|
||||
//float4 blurcols[10] : register(c15);
|
||||
|
||||
|
||||
float4 main(in float2 texcoord : TEXCOORD0) : COLOR0
|
||||
{
|
||||
float a = blurcol.a;
|
||||
|
||||
float4 doublec = saturate(blurcol*2);
|
||||
float4 dst = tex2D(tex, texcoord.xy);
|
||||
float4 prev = dst;
|
||||
for(int i = 0; i < 5; i++){
|
||||
// float4 doublec = saturate(blurcol*2);
|
||||
float4 tmp = dst*(1-a) + prev*doublec*a;
|
||||
tmp += prev*blurcol;
|
||||
tmp += prev*blurcol;
|
||||
prev = saturate(tmp);
|
||||
}
|
||||
prev.a = 1.0f;
|
||||
return prev;
|
||||
}
|
56
src/extras/shaders/colourfilterVC_PS.inc
Normal file
56
src/extras/shaders/colourfilterVC_PS.inc
Normal file
@ -0,0 +1,56 @@
|
||||
static unsigned char colourfilterVC_PS_cso[] = {
|
||||
0x00, 0x02, 0xff, 0xff, 0xfe, 0xff, 0x2b, 0x00, 0x43, 0x54, 0x41, 0x42,
|
||||
0x1c, 0x00, 0x00, 0x00, 0x77, 0x00, 0x00, 0x00, 0x00, 0x02, 0xff, 0xff,
|
||||
0x02, 0x00, 0x00, 0x00, 0x1c, 0x00, 0x00, 0x00, 0x00, 0x01, 0x00, 0x00,
|
||||
0x70, 0x00, 0x00, 0x00, 0x44, 0x00, 0x00, 0x00, 0x02, 0x00, 0x0a, 0x00,
|
||||
0x01, 0x00, 0x2a, 0x00, 0x4c, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
|
||||
0x5c, 0x00, 0x00, 0x00, 0x03, 0x00, 0x00, 0x00, 0x01, 0x00, 0x02, 0x00,
|
||||
0x60, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x62, 0x6c, 0x75, 0x72,
|
||||
0x63, 0x6f, 0x6c, 0x00, 0x01, 0x00, 0x03, 0x00, 0x01, 0x00, 0x04, 0x00,
|
||||
0x01, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x74, 0x65, 0x78, 0x00,
|
||||
0x04, 0x00, 0x0c, 0x00, 0x01, 0x00, 0x01, 0x00, 0x01, 0x00, 0x00, 0x00,
|
||||
0x00, 0x00, 0x00, 0x00, 0x70, 0x73, 0x5f, 0x32, 0x5f, 0x30, 0x00, 0x4d,
|
||||
0x69, 0x63, 0x72, 0x6f, 0x73, 0x6f, 0x66, 0x74, 0x20, 0x28, 0x52, 0x29,
|
||||
0x20, 0x48, 0x4c, 0x53, 0x4c, 0x20, 0x53, 0x68, 0x61, 0x64, 0x65, 0x72,
|
||||
0x20, 0x43, 0x6f, 0x6d, 0x70, 0x69, 0x6c, 0x65, 0x72, 0x20, 0x39, 0x2e,
|
||||
0x32, 0x39, 0x2e, 0x39, 0x35, 0x32, 0x2e, 0x33, 0x31, 0x31, 0x31, 0x00,
|
||||
0x51, 0x00, 0x00, 0x05, 0x00, 0x00, 0x0f, 0xa0, 0x00, 0x00, 0x00, 0x40,
|
||||
0x00, 0x00, 0x80, 0x3f, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
|
||||
0x1f, 0x00, 0x00, 0x02, 0x00, 0x00, 0x00, 0x80, 0x00, 0x00, 0x03, 0xb0,
|
||||
0x1f, 0x00, 0x00, 0x02, 0x00, 0x00, 0x00, 0x90, 0x00, 0x08, 0x0f, 0xa0,
|
||||
0x42, 0x00, 0x00, 0x03, 0x00, 0x00, 0x0f, 0x80, 0x00, 0x00, 0xe4, 0xb0,
|
||||
0x00, 0x08, 0xe4, 0xa0, 0x02, 0x00, 0x00, 0x03, 0x01, 0x00, 0x17, 0x80,
|
||||
0x0a, 0x00, 0xe4, 0xa0, 0x0a, 0x00, 0xe4, 0xa0, 0x05, 0x00, 0x00, 0x03,
|
||||
0x02, 0x00, 0x07, 0x80, 0x00, 0x00, 0xe4, 0x80, 0x01, 0x00, 0xe4, 0x80,
|
||||
0x12, 0x00, 0x00, 0x04, 0x03, 0x00, 0x07, 0x80, 0x0a, 0x00, 0xff, 0xa0,
|
||||
0x02, 0x00, 0xe4, 0x80, 0x00, 0x00, 0xe4, 0x80, 0x05, 0x00, 0x00, 0x03,
|
||||
0x02, 0x00, 0x07, 0x80, 0x00, 0x00, 0xe4, 0x80, 0x0a, 0x00, 0xe4, 0xa0,
|
||||
0x04, 0x00, 0x00, 0x04, 0x02, 0x00, 0x17, 0x80, 0x02, 0x00, 0xe4, 0x80,
|
||||
0x00, 0x00, 0x00, 0xa0, 0x03, 0x00, 0xe4, 0x80, 0x05, 0x00, 0x00, 0x03,
|
||||
0x03, 0x00, 0x07, 0x80, 0x01, 0x00, 0xe4, 0x80, 0x02, 0x00, 0xe4, 0x80,
|
||||
0x05, 0x00, 0x00, 0x03, 0x02, 0x00, 0x07, 0x80, 0x02, 0x00, 0xe4, 0x80,
|
||||
0x0a, 0x00, 0xe4, 0xa0, 0x12, 0x00, 0x00, 0x04, 0x04, 0x00, 0x07, 0x80,
|
||||
0x0a, 0x00, 0xff, 0xa0, 0x03, 0x00, 0xe4, 0x80, 0x00, 0x00, 0xe4, 0x80,
|
||||
0x04, 0x00, 0x00, 0x04, 0x02, 0x00, 0x17, 0x80, 0x02, 0x00, 0xe4, 0x80,
|
||||
0x00, 0x00, 0x00, 0xa0, 0x04, 0x00, 0xe4, 0x80, 0x05, 0x00, 0x00, 0x03,
|
||||
0x03, 0x00, 0x07, 0x80, 0x01, 0x00, 0xe4, 0x80, 0x02, 0x00, 0xe4, 0x80,
|
||||
0x05, 0x00, 0x00, 0x03, 0x02, 0x00, 0x07, 0x80, 0x02, 0x00, 0xe4, 0x80,
|
||||
0x0a, 0x00, 0xe4, 0xa0, 0x12, 0x00, 0x00, 0x04, 0x04, 0x00, 0x07, 0x80,
|
||||
0x0a, 0x00, 0xff, 0xa0, 0x03, 0x00, 0xe4, 0x80, 0x00, 0x00, 0xe4, 0x80,
|
||||
0x04, 0x00, 0x00, 0x04, 0x02, 0x00, 0x17, 0x80, 0x02, 0x00, 0xe4, 0x80,
|
||||
0x00, 0x00, 0x00, 0xa0, 0x04, 0x00, 0xe4, 0x80, 0x05, 0x00, 0x00, 0x03,
|
||||
0x03, 0x00, 0x07, 0x80, 0x01, 0x00, 0xe4, 0x80, 0x02, 0x00, 0xe4, 0x80,
|
||||
0x05, 0x00, 0x00, 0x03, 0x02, 0x00, 0x07, 0x80, 0x02, 0x00, 0xe4, 0x80,
|
||||
0x0a, 0x00, 0xe4, 0xa0, 0x12, 0x00, 0x00, 0x04, 0x04, 0x00, 0x07, 0x80,
|
||||
0x0a, 0x00, 0xff, 0xa0, 0x03, 0x00, 0xe4, 0x80, 0x00, 0x00, 0xe4, 0x80,
|
||||
0x04, 0x00, 0x00, 0x04, 0x02, 0x00, 0x17, 0x80, 0x02, 0x00, 0xe4, 0x80,
|
||||
0x00, 0x00, 0x00, 0xa0, 0x04, 0x00, 0xe4, 0x80, 0x05, 0x00, 0x00, 0x03,
|
||||
0x01, 0x00, 0x07, 0x80, 0x01, 0x00, 0xe4, 0x80, 0x02, 0x00, 0xe4, 0x80,
|
||||
0x05, 0x00, 0x00, 0x03, 0x02, 0x00, 0x07, 0x80, 0x02, 0x00, 0xe4, 0x80,
|
||||
0x0a, 0x00, 0xe4, 0xa0, 0x12, 0x00, 0x00, 0x04, 0x03, 0x00, 0x07, 0x80,
|
||||
0x0a, 0x00, 0xff, 0xa0, 0x01, 0x00, 0xe4, 0x80, 0x00, 0x00, 0xe4, 0x80,
|
||||
0x04, 0x00, 0x00, 0x04, 0x00, 0x00, 0x17, 0x80, 0x02, 0x00, 0xe4, 0x80,
|
||||
0x00, 0x00, 0x00, 0xa0, 0x03, 0x00, 0xe4, 0x80, 0x01, 0x00, 0x00, 0x02,
|
||||
0x00, 0x00, 0x08, 0x80, 0x00, 0x00, 0x55, 0xa0, 0x01, 0x00, 0x00, 0x02,
|
||||
0x00, 0x08, 0x0f, 0x80, 0x00, 0x00, 0xe4, 0x80, 0xff, 0xff, 0x00, 0x00
|
||||
};
|
30
src/extras/shaders/colourfilterVC_fs_gl3.inc
Normal file
30
src/extras/shaders/colourfilterVC_fs_gl3.inc
Normal file
@ -0,0 +1,30 @@
|
||||
const char *colourfilterVC_frag_src =
|
||||
"uniform sampler2D tex0;\n"
|
||||
"uniform vec4 u_blurcolor;\n"
|
||||
|
||||
"in vec4 v_color;\n"
|
||||
"in vec2 v_tex0;\n"
|
||||
"in float v_fog;\n"
|
||||
|
||||
"out vec4 color;\n"
|
||||
|
||||
"void\n"
|
||||
"main(void)\n"
|
||||
"{\n"
|
||||
" float a = u_blurcolor.a;\n"
|
||||
|
||||
" vec4 doublec = clamp(u_blurcolor*2, 0.0, 1.0);\n"
|
||||
" vec4 dst = texture(tex0, vec2(v_tex0.x, 1.0-v_tex0.y));\n"
|
||||
" vec4 prev = dst;\n"
|
||||
" for(int i = 0; i < 5; i++){\n"
|
||||
"// vec4 doublec = clamp(u_blurcolor*2, 0.0, 1.0);\n"
|
||||
" vec4 tmp = dst*(1.0-a) + prev*doublec*a;\n"
|
||||
" tmp += prev*u_blurcolor;\n"
|
||||
" tmp += prev*u_blurcolor;\n"
|
||||
" prev = clamp(tmp, 0.0, 1.0);\n"
|
||||
" }\n"
|
||||
" color.rgb = prev.rgb;\n"
|
||||
" color.a = 1.0f;\n"
|
||||
"}\n"
|
||||
|
||||
;
|
18
src/extras/shaders/contrast.frag
Normal file
18
src/extras/shaders/contrast.frag
Normal file
@ -0,0 +1,18 @@
|
||||
uniform sampler2D tex0;
|
||||
uniform vec3 u_contrastAdd;
|
||||
uniform vec3 u_contrastMult;
|
||||
|
||||
in vec4 v_color;
|
||||
in vec2 v_tex0;
|
||||
in float v_fog;
|
||||
|
||||
out vec4 color;
|
||||
|
||||
void
|
||||
main(void)
|
||||
{
|
||||
vec4 dst = texture(tex0, vec2(v_tex0.x, 1.0-v_tex0.y));
|
||||
color.rgb = dst.rgb*u_contrastMult + u_contrastAdd;
|
||||
color.a = 1.0f;
|
||||
}
|
||||
|
BIN
src/extras/shaders/contrastPS.cso
Normal file
BIN
src/extras/shaders/contrastPS.cso
Normal file
Binary file not shown.
21
src/extras/shaders/contrastPS.hlsl
Normal file
21
src/extras/shaders/contrastPS.hlsl
Normal file
@ -0,0 +1,21 @@
|
||||
struct PS_INPUT
|
||||
{
|
||||
float4 position : POSITION;
|
||||
float3 texcoord0 : TEXCOORD0;
|
||||
float4 color : COLOR0;
|
||||
};
|
||||
|
||||
uniform float3 contrastMult : register(c10);
|
||||
uniform float3 contrastAdd : register(c11);
|
||||
|
||||
sampler2D tex : register(s0);
|
||||
|
||||
float4
|
||||
main(PS_INPUT In) : COLOR
|
||||
{
|
||||
float4 dst = tex2D(tex, In.texcoord0.xy);
|
||||
|
||||
dst.rgb = dst.rgb*contrastMult + contrastAdd;
|
||||
dst.a = 1.0;
|
||||
return dst;
|
||||
}
|
31
src/extras/shaders/contrastPS.inc
Normal file
31
src/extras/shaders/contrastPS.inc
Normal file
@ -0,0 +1,31 @@
|
||||
static unsigned char contrastPS_cso[] = {
|
||||
0x00, 0x02, 0xff, 0xff, 0xfe, 0xff, 0x35, 0x00, 0x43, 0x54, 0x41, 0x42,
|
||||
0x1c, 0x00, 0x00, 0x00, 0x9f, 0x00, 0x00, 0x00, 0x00, 0x02, 0xff, 0xff,
|
||||
0x03, 0x00, 0x00, 0x00, 0x1c, 0x00, 0x00, 0x00, 0x00, 0x01, 0x00, 0x00,
|
||||
0x98, 0x00, 0x00, 0x00, 0x58, 0x00, 0x00, 0x00, 0x02, 0x00, 0x0b, 0x00,
|
||||
0x01, 0x00, 0x2e, 0x00, 0x64, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
|
||||
0x74, 0x00, 0x00, 0x00, 0x02, 0x00, 0x0a, 0x00, 0x01, 0x00, 0x2a, 0x00,
|
||||
0x64, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x81, 0x00, 0x00, 0x00,
|
||||
0x03, 0x00, 0x00, 0x00, 0x01, 0x00, 0x02, 0x00, 0x88, 0x00, 0x00, 0x00,
|
||||
0x00, 0x00, 0x00, 0x00, 0x63, 0x6f, 0x6e, 0x74, 0x72, 0x61, 0x73, 0x74,
|
||||
0x41, 0x64, 0x64, 0x00, 0x01, 0x00, 0x03, 0x00, 0x01, 0x00, 0x03, 0x00,
|
||||
0x01, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x63, 0x6f, 0x6e, 0x74,
|
||||
0x72, 0x61, 0x73, 0x74, 0x4d, 0x75, 0x6c, 0x74, 0x00, 0x74, 0x65, 0x78,
|
||||
0x00, 0xab, 0xab, 0xab, 0x04, 0x00, 0x0c, 0x00, 0x01, 0x00, 0x01, 0x00,
|
||||
0x01, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x70, 0x73, 0x5f, 0x32,
|
||||
0x5f, 0x30, 0x00, 0x4d, 0x69, 0x63, 0x72, 0x6f, 0x73, 0x6f, 0x66, 0x74,
|
||||
0x20, 0x28, 0x52, 0x29, 0x20, 0x48, 0x4c, 0x53, 0x4c, 0x20, 0x53, 0x68,
|
||||
0x61, 0x64, 0x65, 0x72, 0x20, 0x43, 0x6f, 0x6d, 0x70, 0x69, 0x6c, 0x65,
|
||||
0x72, 0x20, 0x39, 0x2e, 0x32, 0x39, 0x2e, 0x39, 0x35, 0x32, 0x2e, 0x33,
|
||||
0x31, 0x31, 0x31, 0x00, 0x51, 0x00, 0x00, 0x05, 0x00, 0x00, 0x0f, 0xa0,
|
||||
0x00, 0x00, 0x80, 0x3f, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
|
||||
0x00, 0x00, 0x00, 0x00, 0x1f, 0x00, 0x00, 0x02, 0x00, 0x00, 0x00, 0x80,
|
||||
0x00, 0x00, 0x03, 0xb0, 0x1f, 0x00, 0x00, 0x02, 0x00, 0x00, 0x00, 0x90,
|
||||
0x00, 0x08, 0x0f, 0xa0, 0x42, 0x00, 0x00, 0x03, 0x00, 0x00, 0x0f, 0x80,
|
||||
0x00, 0x00, 0xe4, 0xb0, 0x00, 0x08, 0xe4, 0xa0, 0x01, 0x00, 0x00, 0x02,
|
||||
0x01, 0x00, 0x07, 0x80, 0x0a, 0x00, 0xe4, 0xa0, 0x04, 0x00, 0x00, 0x04,
|
||||
0x00, 0x00, 0x07, 0x80, 0x00, 0x00, 0xe4, 0x80, 0x01, 0x00, 0xe4, 0x80,
|
||||
0x0b, 0x00, 0xe4, 0xa0, 0x01, 0x00, 0x00, 0x02, 0x00, 0x00, 0x08, 0x80,
|
||||
0x00, 0x00, 0x00, 0xa0, 0x01, 0x00, 0x00, 0x02, 0x00, 0x08, 0x0f, 0x80,
|
||||
0x00, 0x00, 0xe4, 0x80, 0xff, 0xff, 0x00, 0x00
|
||||
};
|
20
src/extras/shaders/contrast_fs_gl3.inc
Normal file
20
src/extras/shaders/contrast_fs_gl3.inc
Normal file
@ -0,0 +1,20 @@
|
||||
const char *contrast_frag_src =
|
||||
"uniform sampler2D tex0;\n"
|
||||
"uniform vec3 u_contrastAdd;\n"
|
||||
"uniform vec3 u_contrastMult;\n"
|
||||
|
||||
"in vec4 v_color;\n"
|
||||
"in vec2 v_tex0;\n"
|
||||
"in float v_fog;\n"
|
||||
|
||||
"out vec4 color;\n"
|
||||
|
||||
"void\n"
|
||||
"main(void)\n"
|
||||
"{\n"
|
||||
" vec4 dst = texture(tex0, vec2(v_tex0.x, 1.0-v_tex0.y));\n"
|
||||
" color.rgb = dst.rgb*u_contrastMult + u_contrastAdd;\n"
|
||||
" color.a = 1.0f;\n"
|
||||
"}\n"
|
||||
|
||||
;
|
21
src/extras/shaders/im2d.vert
Normal file
21
src/extras/shaders/im2d.vert
Normal file
@ -0,0 +1,21 @@
|
||||
uniform vec4 u_xform;
|
||||
|
||||
layout(location = 0) in vec4 in_pos;
|
||||
layout(location = 2) in vec4 in_color;
|
||||
layout(location = 3) in vec2 in_tex0;
|
||||
|
||||
out vec4 v_color;
|
||||
out vec2 v_tex0;
|
||||
out float v_fog;
|
||||
|
||||
void
|
||||
main(void)
|
||||
{
|
||||
gl_Position = in_pos;
|
||||
gl_Position.w = 1.0;
|
||||
gl_Position.xy = gl_Position.xy * u_xform.xy + u_xform.zw;
|
||||
v_fog = DoFog(gl_Position.z);
|
||||
gl_Position.xyz *= gl_Position.w;
|
||||
v_color = in_color;
|
||||
v_tex0 = in_tex0;
|
||||
}
|
23
src/extras/shaders/im2d_gl3.inc
Normal file
23
src/extras/shaders/im2d_gl3.inc
Normal file
@ -0,0 +1,23 @@
|
||||
const char *im2d_vert_src =
|
||||
"uniform vec4 u_xform;\n"
|
||||
|
||||
"layout(location = 0) in vec4 in_pos;\n"
|
||||
"layout(location = 2) in vec4 in_color;\n"
|
||||
"layout(location = 3) in vec2 in_tex0;\n"
|
||||
|
||||
"out vec4 v_color;\n"
|
||||
"out vec2 v_tex0;\n"
|
||||
"out float v_fog;\n"
|
||||
|
||||
"void\n"
|
||||
"main(void)\n"
|
||||
"{\n"
|
||||
" gl_Position = in_pos;\n"
|
||||
" gl_Position.w = 1.0;\n"
|
||||
" gl_Position.xy = gl_Position.xy * u_xform.xy + u_xform.zw;\n"
|
||||
" v_fog = DoFog(gl_Position.z);\n"
|
||||
" gl_Position.xyz *= gl_Position.w;\n"
|
||||
" v_color = in_color;\n"
|
||||
" v_tex0 = in_tex0;\n"
|
||||
"}\n"
|
||||
;
|
3
src/extras/shaders/make.cmd
Normal file
3
src/extras/shaders/make.cmd
Normal file
@ -0,0 +1,3 @@
|
||||
@echo off
|
||||
for %%f in (*PS.hlsl) do "%DXSDK_DIR%\Utilities\bin\x86\fxc.exe" /T ps_2_0 /nologo /E main /Fo %%~nf.cso %%f
|
||||
for %%f in (*VS.hlsl) do "%DXSDK_DIR%\Utilities\bin\x86\fxc.exe" /T vs_2_0 /nologo /E main /Fo %%~nf.cso %%f
|
5
src/extras/shaders/makeinc.sh
Normal file
5
src/extras/shaders/makeinc.sh
Normal file
@ -0,0 +1,5 @@
|
||||
#!sh
|
||||
for i in *cso; do
|
||||
(echo -n 'static '
|
||||
xxd -i $i | grep -v '_len = ') > ${i%cso}inc
|
||||
done
|
@ -124,8 +124,6 @@ CParticleObject::AddObject(uint16 type, CVector const &pos, CVector const &targe
|
||||
{
|
||||
CParticleObject *pobj = pUnusedListHead;
|
||||
|
||||
ASSERT(pobj != nil);
|
||||
|
||||
if ( pobj == nil )
|
||||
{
|
||||
printf("Error: No particle objects available!\n");
|
||||
|
@ -63,6 +63,7 @@
|
||||
#include "Debug.h"
|
||||
#include "GameLogic.h"
|
||||
#include "Bike.h"
|
||||
#include "WindModifiers.h"
|
||||
#include "CutsceneShadow.h"
|
||||
|
||||
#define CAN_SEE_ENTITY_ANGLE_THRESHOLD DEGTORAD(60.0f)
|
||||
@ -147,7 +148,7 @@ void CPed::operator delete(void *p, int handle) { CPools::GetPedPool()->Delete((
|
||||
// --MIAMI: Done
|
||||
CPed::~CPed(void)
|
||||
{
|
||||
#if 1
|
||||
#ifdef USE_CUTSCENE_SHADOW_FOR_PED
|
||||
if ( m_pRTShadow ) delete m_pRTShadow;
|
||||
#endif
|
||||
CWorld::Remove(this);
|
||||
@ -207,8 +208,8 @@ CPed::FlagToDestroyWhenNextProcessed(void)
|
||||
|
||||
CPed::CPed(uint32 pedType) : m_pedIK(this)
|
||||
{
|
||||
#if 1
|
||||
m_pRTShadow = NULL;
|
||||
#ifdef USE_CUTSCENE_SHADOW_FOR_PED
|
||||
m_pRTShadow = nil;
|
||||
#endif
|
||||
m_type = ENTITY_TYPE_PED;
|
||||
bPedPhysics = true;
|
||||
@ -2792,12 +2793,12 @@ CPed::SetModelIndex(uint32 mi)
|
||||
modelInfo->CreateHitColModelSkinned(GetClump());
|
||||
|
||||
UpdateRpHAnim();
|
||||
|
||||
#ifndef LIBRW
|
||||
#ifdef USE_CUTSCENE_SHADOW_FOR_PED
|
||||
if (!m_pRTShadow)
|
||||
{
|
||||
m_pRTShadow = new CCutsceneShadow;
|
||||
m_pRTShadow->Create(m_rwObject, 10, 1, 1, 1);
|
||||
//m_pRTShadow->Create(m_rwObject, 8, 0, 0, 0);
|
||||
}
|
||||
#endif
|
||||
}
|
||||
@ -3159,6 +3160,8 @@ CPed::SetStoredObjective(void)
|
||||
case OBJECTIVE_GOTO_CHAR_ON_FOOT:
|
||||
case OBJECTIVE_GOTO_CHAR_ON_FOOT_WALKING:
|
||||
case OBJECTIVE_HASSLE_CHAR:
|
||||
case OBJECTIVE_FOLLOW_CHAR_IN_FORMATION:
|
||||
case OBJECTIVE_LEAVE_CAR:
|
||||
case OBJECTIVE_ENTER_CAR_AS_PASSENGER:
|
||||
case OBJECTIVE_ENTER_CAR_AS_DRIVER:
|
||||
case OBJECTIVE_GOTO_AREA_ON_FOOT:
|
||||
@ -4729,9 +4732,11 @@ CPed::InflictDamage(CEntity *damagedBy, eWeaponType method, float damage, ePedPi
|
||||
} else {
|
||||
CDarkel::RegisterKillNotByPlayer(this, method);
|
||||
}
|
||||
if (method == WEAPONTYPE_DROWNING)
|
||||
if (method == WEAPONTYPE_DROWNING) {
|
||||
bIsInTheAir = false;
|
||||
// TODO(Miami): timesDrowned
|
||||
if (FindPlayerPed() == this)
|
||||
CStats::TimesDrowned++;
|
||||
}
|
||||
|
||||
return true;
|
||||
}
|
||||
@ -11805,7 +11810,11 @@ CPed::ProcessControl(void)
|
||||
CPed::Chat();
|
||||
break;
|
||||
case PED_AIM_GUN:
|
||||
if (m_pPointGunAt && m_pPointGunAt->IsPed() && ((CPed*)m_pPointGunAt)->CanSeeEntity(this, CAN_SEE_ENTITY_ANGLE_THRESHOLD * 2)) {
|
||||
if (m_pPointGunAt && m_pPointGunAt->IsPed()
|
||||
#ifdef FIX_BUGS
|
||||
&& !GetWeapon()->IsTypeMelee()
|
||||
#endif
|
||||
&& ((CPed*)m_pPointGunAt)->CanSeeEntity(this, CAN_SEE_ENTITY_ANGLE_THRESHOLD * 2)) {
|
||||
((CPed*)m_pPointGunAt)->ReactToPointGun(this);
|
||||
}
|
||||
PointGunAt();
|
||||
@ -16426,6 +16435,77 @@ CPed::PreRender(void)
|
||||
}
|
||||
#endif
|
||||
|
||||
bool bIsWindModifierTurnedOn = false;
|
||||
float fAnyDirectionShift = 1.0f;
|
||||
if (IsPlayer() && CWindModifiers::FindWindModifier(GetPosition(), &fAnyDirectionShift, &fAnyDirectionShift)
|
||||
&& !CCullZones::PlayerNoRain() && GetPedState() != PED_DRIVING)
|
||||
bIsWindModifierTurnedOn = true;
|
||||
|
||||
bool bIsPedDrivingBikeOrOpenTopCar = false;
|
||||
if (GetPedState() == PED_DRIVING && m_pMyVehicle) {
|
||||
if (m_pMyVehicle->m_vehType == VEHICLE_TYPE_BIKE
|
||||
|| (m_pMyVehicle->m_vehType == VEHICLE_TYPE_CAR && m_pMyVehicle->IsOpenTopCar()))
|
||||
bIsPedDrivingBikeOrOpenTopCar = true;
|
||||
}
|
||||
|
||||
if (bIsWindModifierTurnedOn || bIsPedDrivingBikeOrOpenTopCar) {
|
||||
float fWindMult = 0.0f;
|
||||
if (bIsPedDrivingBikeOrOpenTopCar) {
|
||||
fWindMult = DotProduct(m_pMyVehicle->m_vecMoveSpeed, GetForward());
|
||||
if (fWindMult > 0.4f) {
|
||||
float volume = (fWindMult - 0.4f) / 0.6f;
|
||||
DMAudio.PlayOneShot(m_audioEntityId, SOUND_SET_202, volume); //TODO(MIAMI): revise when audio is done
|
||||
}
|
||||
}
|
||||
|
||||
if (bIsWindModifierTurnedOn)
|
||||
fWindMult = Min(fWindMult, Abs(fAnyDirectionShift - 1.0f));
|
||||
|
||||
RpHAnimHierarchy* hier = GetAnimHierarchyFromSkinClump(GetClump());
|
||||
int32 idx;
|
||||
RwV3d scale;
|
||||
float fScaleOffset;
|
||||
|
||||
fScaleOffset = fWindMult * 0.2f;
|
||||
scale.x = CGeneral::GetRandomNumberInRange(1.0f - fScaleOffset, 1.0f + fScaleOffset);
|
||||
scale.y = CGeneral::GetRandomNumberInRange(1.0f - fScaleOffset, 1.0f + fScaleOffset);
|
||||
scale.z = CGeneral::GetRandomNumberInRange(1.0f - fScaleOffset, 1.0f + fScaleOffset);
|
||||
|
||||
idx = RpHAnimIDGetIndex(hier, ConvertPedNode2BoneTag(PED_NECK));
|
||||
RwMatrix* neck = &RpHAnimHierarchyGetMatrixArray(hier)[idx];
|
||||
RwMatrixScale(neck, &scale, rwCOMBINEPRECONCAT);
|
||||
|
||||
fScaleOffset = fWindMult * 0.1f;
|
||||
scale.x = CGeneral::GetRandomNumberInRange(1.0f - fScaleOffset, 1.0f + fScaleOffset);
|
||||
scale.y = CGeneral::GetRandomNumberInRange(1.0f - fScaleOffset, 1.0f + fScaleOffset);
|
||||
scale.z = CGeneral::GetRandomNumberInRange(1.0f - fScaleOffset, 1.0f + fScaleOffset);
|
||||
|
||||
idx = RpHAnimIDGetIndex(hier, ConvertPedNode2BoneTag(PED_CLAVICLEL));
|
||||
RwMatrix* clavicleL = &RpHAnimHierarchyGetMatrixArray(hier)[idx];
|
||||
RwMatrixScale(clavicleL, &scale, rwCOMBINEPRECONCAT);
|
||||
|
||||
idx = RpHAnimIDGetIndex(hier, ConvertPedNode2BoneTag(PED_CLAVICLER));
|
||||
RwMatrix* clavicleR = &RpHAnimHierarchyGetMatrixArray(hier)[idx];
|
||||
RwMatrixScale(clavicleR, &scale, rwCOMBINEPRECONCAT);
|
||||
|
||||
idx = RpHAnimIDGetIndex(hier, ConvertPedNode2BoneTag(PED_MID));
|
||||
RwMatrix* mid = &RpHAnimHierarchyGetMatrixArray(hier)[idx];
|
||||
RwMatrixScale(mid, &scale, rwCOMBINEPRECONCAT);
|
||||
|
||||
fScaleOffset = fWindMult * 0.2f;
|
||||
scale.x = CGeneral::GetRandomNumberInRange(1.0f - fScaleOffset, 1.0f + fScaleOffset);
|
||||
scale.y = CGeneral::GetRandomNumberInRange(1.0f - fScaleOffset, 1.0f + fScaleOffset);
|
||||
scale.z = CGeneral::GetRandomNumberInRange(1.0f - fScaleOffset, 1.0f + fScaleOffset);
|
||||
|
||||
idx = RpHAnimIDGetIndex(hier, ConvertPedNode2BoneTag(PED_UPPERARML));
|
||||
RwMatrix* upperArmL = &RpHAnimHierarchyGetMatrixArray(hier)[idx];
|
||||
RwMatrixScale(upperArmL, &scale, rwCOMBINEPRECONCAT);
|
||||
|
||||
idx = RpHAnimIDGetIndex(hier, ConvertPedNode2BoneTag(PED_UPPERARMR));
|
||||
RwMatrix* upperArmR = &RpHAnimHierarchyGetMatrixArray(hier)[idx];
|
||||
RwMatrixScale(upperArmR, &scale, rwCOMBINEPRECONCAT);
|
||||
}
|
||||
|
||||
if (bBodyPartJustCameOff && bIsPedDieAnimPlaying && m_bodyPartBleeding != -1 && (CTimer::GetFrameCounter() & 7) > 3) {
|
||||
CVector bloodDir(0.0f, 0.0f, 0.0f);
|
||||
CVector bloodPos(0.0f, 0.0f, 0.0f);
|
||||
|
@ -363,7 +363,7 @@ class CVehicle;
|
||||
class CPed : public CPhysical
|
||||
{
|
||||
public:
|
||||
#if 1
|
||||
#ifdef USE_CUTSCENE_SHADOW_FOR_PED
|
||||
class CCutsceneShadow *m_pRTShadow;
|
||||
#endif
|
||||
// 0x128
|
||||
|
@ -2,6 +2,8 @@
|
||||
|
||||
#include "Antennas.h"
|
||||
|
||||
//--MIAMI: file done
|
||||
|
||||
CAntenna CAntennas::aAntennas[NUMANTENNAS];
|
||||
|
||||
void
|
||||
|
@ -71,6 +71,43 @@ CClouds::Update(void)
|
||||
#endif
|
||||
}
|
||||
|
||||
float StarCoorsX[9] = { 0.0f, 0.05f, 0.13f, 0.4f, 0.7f, 0.6f, 0.27f, 0.55f, 0.75f };
|
||||
float StarCoorsY[9] = { 0.0f, 0.45f, 0.9f, 1.0f, 0.85f, 0.52f, 0.48f, 0.35f, 0.2f };
|
||||
float StarSizes[9] = { 1.0f, 1.4f, 0.9f, 1.0f, 0.6f, 1.5f, 1.3f, 1.0f, 0.8f };
|
||||
|
||||
float LowCloudsX[12] = { 1.0f, 0.7f, 0.0f, -0.7f, -1.0f, -0.7f, 0.0f, 0.7f, 0.8f, -0.8f, 0.4f, -0.4f };
|
||||
float LowCloudsY[12] = { 0.0f, -0.7f, -1.0f, -0.7f, 0.0f, 0.7f, 1.0f, 0.7f, 0.4f, 0.4f, -0.8f, -0.8f };
|
||||
float LowCloudsZ[12] = { 0.0f, 1.0f, 0.5f, 0.0f, 1.0f, 0.3f, 0.9f, 0.4f, 1.3f, 1.4f, 1.2f, 1.7f };
|
||||
|
||||
float CoorsOffsetX[37] = {
|
||||
0.0f, 60.0f, 72.0f, 48.0f, 21.0f, 12.0f,
|
||||
9.0f, -3.0f, -8.4f, -18.0f, -15.0f, -36.0f,
|
||||
-40.0f, -48.0f, -60.0f, -24.0f, 100.0f, 100.0f,
|
||||
100.0f, 100.0f, 100.0f, 100.0f, 100.0f, 100.0f,
|
||||
100.0f, 100.0f, -30.0f, -20.0f, 10.0f, 30.0f,
|
||||
0.0f, -100.0f, -100.0f, -100.0f, -100.0f, -100.0f, -100.0f
|
||||
};
|
||||
float CoorsOffsetY[37] = {
|
||||
100.0f, 100.0f, 100.0f, 100.0f, 100.0f, 100.0f,
|
||||
100.0f, 100.0f, 100.0f, 100.0f, 100.0f, 100.0f,
|
||||
100.0f, 100.0f, 100.0f, 100.0f, -30.0f, 10.0f,
|
||||
-25.0f, -5.0f, 28.0f, -10.0f, 10.0f, 0.0f,
|
||||
15.0f, 40.0f, -100.0f, -100.0f, -100.0f, -100.0f,
|
||||
-100.0f, -40.0f, -20.0f, 0.0f, 10.0f, 30.0f, 35.0f
|
||||
};
|
||||
float CoorsOffsetZ[37] = {
|
||||
2.0f, 1.0f, 0.0f, 0.3f, 0.7f, 1.4f,
|
||||
1.7f, 0.24f, 0.7f, 1.3f, 1.6f, 1.0f,
|
||||
1.2f, 0.3f, 0.7f, 1.4f, 0.0f, 0.1f,
|
||||
0.5f, 0.4f, 0.55f, 0.75f, 1.0f, 1.4f,
|
||||
1.7f, 2.0f, 2.0f, 2.3f, 1.9f, 2.4f,
|
||||
2.0f, 2.0f, 1.5f, 1.2f, 1.7f, 1.5f, 2.1f
|
||||
};
|
||||
|
||||
uint8 BowRed[6] = { 30, 30, 30, 10, 0, 15 };
|
||||
uint8 BowGreen[6] = { 0, 15, 30, 30, 0, 0 };
|
||||
uint8 BowBlue[6] = { 0, 0, 0, 10, 30, 30 };
|
||||
|
||||
void
|
||||
CClouds::Render(void)
|
||||
{
|
||||
@ -94,11 +131,10 @@ CClouds::Render(void)
|
||||
float minute = CClock::GetHours()*60 + CClock::GetMinutes() + CClock::GetSeconds()/60.0f;
|
||||
RwV3d campos = *(RwV3d*)&TheCamera.GetPosition();
|
||||
|
||||
float coverage = Max(CWeather::Foggyness, CWeather::Foggyness);
|
||||
|
||||
// Moon
|
||||
float moonfadeout = Abs(minute - 180.0f); // fully visible at 3AM
|
||||
if((int)moonfadeout < 180){ // fade in/out 3 hours
|
||||
float coverage = Max(CWeather::Foggyness, CWeather::CloudCoverage);
|
||||
int brightness = (1.0f - coverage) * (180 - (int)moonfadeout);
|
||||
RwV3d pos = { 0.0f, -100.0f, 15.0f };
|
||||
RwV3dAdd(&worldpos, &campos, &pos);
|
||||
@ -122,11 +158,10 @@ CClouds::Render(void)
|
||||
else if(CClock::GetHours() == 5)
|
||||
starintens = 255 * (60 - CClock::GetMinutes())/60.0f;
|
||||
if(starintens != 0){
|
||||
// R
|
||||
static float StarCoorsX[9] = { 0.0f, 0.05f, 0.13f, 0.4f, 0.7f, 0.6f, 0.27f, 0.55f, 0.75f };
|
||||
static float StarCoorsY[9] = { 0.0f, 0.45f, 0.9f, 1.0f, 0.85f, 0.52f, 0.48f, 0.35f, 0.2f };
|
||||
static float StarSizes[9] = { 1.0f, 1.4f, 0.9f, 1.0f, 0.6f, 1.5f, 1.3f, 1.0f, 0.8f };
|
||||
float coverage = Max(CWeather::Foggyness, CWeather::CloudCoverage);
|
||||
int brightness = (1.0f - coverage) * starintens;
|
||||
|
||||
// R
|
||||
RwRenderStateSet(rwRENDERSTATETEXTURERASTER, RwTextureGetRaster(gpCoronaTexture[0]));
|
||||
for(i = 0; i < 11; i++){
|
||||
RwV3d pos = { 100.0f, 0.0f, 10.0f };
|
||||
@ -155,13 +190,7 @@ CClouds::Render(void)
|
||||
}
|
||||
|
||||
// Low clouds
|
||||
static float LowCloudsX[12] = { 1.0f, 0.7f, 0.0f, -0.7f, -1.0f, -0.7f,
|
||||
0.0f, 0.7f, 0.8f, -0.8f, 0.4f, -0.4f };
|
||||
static float LowCloudsY[12] = { 0.0f, -0.7f, -1.0f, -0.7f, 0.0f, 0.7f,
|
||||
1.0f, 0.7f, 0.4f, 0.4f, -0.8f, -0.8f };
|
||||
static float LowCloudsZ[12] = { 0.0f, 1.0f, 0.5f, 0.0f, 1.0f, 0.3f,
|
||||
0.9f, 0.4f, 1.3f, 1.4f, 1.2f, 1.7f };
|
||||
float lowcloudintensity = 1.0f - Max(coverage, CWeather::ExtraSunnyness);
|
||||
float lowcloudintensity = 1.0f - Max(Max(CWeather::Foggyness, CWeather::CloudCoverage), CWeather::ExtraSunnyness);
|
||||
int r = CTimeCycle::GetLowCloudsRed() * lowcloudintensity;
|
||||
int g = CTimeCycle::GetLowCloudsGreen() * lowcloudintensity;
|
||||
int b = CTimeCycle::GetLowCloudsBlue() * lowcloudintensity;
|
||||
@ -184,30 +213,6 @@ CClouds::Render(void)
|
||||
float rot_cos = Cos(CloudRotation);
|
||||
int fluffyalpha = 160 * (1.0f - Max(CWeather::Foggyness, CWeather::ExtraSunnyness));
|
||||
if(fluffyalpha != 0){
|
||||
static float CoorsOffsetX[37] = {
|
||||
0.0f, 60.0f, 72.0f, 48.0f, 21.0f, 12.0f,
|
||||
9.0f, -3.0f, -8.4f, -18.0f, -15.0f, -36.0f,
|
||||
-40.0f, -48.0f, -60.0f, -24.0f, 100.0f, 100.0f,
|
||||
100.0f, 100.0f, 100.0f, 100.0f, 100.0f, 100.0f,
|
||||
100.0f, 100.0f, -30.0f, -20.0f, 10.0f, 30.0f,
|
||||
0.0f, -100.0f, -100.0f, -100.0f, -100.0f, -100.0f, -100.0f
|
||||
};
|
||||
static float CoorsOffsetY[37] = {
|
||||
100.0f, 100.0f, 100.0f, 100.0f, 100.0f, 100.0f,
|
||||
100.0f, 100.0f, 100.0f, 100.0f, 100.0f, 100.0f,
|
||||
100.0f, 100.0f, 100.0f, 100.0f, -30.0f, 10.0f,
|
||||
-25.0f, -5.0f, 28.0f, -10.0f, 10.0f, 0.0f,
|
||||
15.0f, 40.0f, -100.0f, -100.0f, -100.0f, -100.0f,
|
||||
-100.0f, -40.0f, -20.0f, 0.0f, 10.0f, 30.0f, 35.0f
|
||||
};
|
||||
static float CoorsOffsetZ[37] = {
|
||||
2.0f, 1.0f, 0.0f, 0.3f, 0.7f, 1.4f,
|
||||
1.7f, 0.24f, 0.7f, 1.3f, 1.6f, 1.0f,
|
||||
1.2f, 0.3f, 0.7f, 1.4f, 0.0f, 0.1f,
|
||||
0.5f, 0.4f, 0.55f, 0.75f, 1.0f, 1.4f,
|
||||
1.7f, 2.0f, 2.0f, 2.3f, 1.9f, 2.4f,
|
||||
2.0f, 2.0f, 1.5f, 1.2f, 1.7f, 1.5f, 2.1f
|
||||
};
|
||||
static bool bCloudOnScreen[37];
|
||||
float sundist, hilight;
|
||||
|
||||
@ -230,7 +235,7 @@ CClouds::Render(void)
|
||||
int bb = CTimeCycle::GetFluffyCloudsBottomBlue();
|
||||
int distLimit = (3*SCREEN_WIDTH)/4;
|
||||
if(sundist < distLimit){
|
||||
hilight = (1.0f - coverage) * (1.0f - sundist/(float)distLimit);
|
||||
hilight = (1.0f - Max(CWeather::Foggyness, CWeather::CloudCoverage)) * (1.0f - sundist/(float)distLimit);
|
||||
tr = tr*(1.0f-hilight) + 255*hilight;
|
||||
tg = tg*(1.0f-hilight) + 190*hilight;
|
||||
tb = tb*(1.0f-hilight) + 190*hilight;
|
||||
@ -277,9 +282,6 @@ CClouds::Render(void)
|
||||
|
||||
// Rainbow
|
||||
if(CWeather::Rainbow != 0.0f){
|
||||
static uint8 BowRed[6] = { 30, 30, 30, 10, 0, 15 };
|
||||
static uint8 BowGreen[6] = { 0, 15, 30, 30, 0, 0 };
|
||||
static uint8 BowBlue[6] = { 0, 0, 0, 10, 30, 30 };
|
||||
RwRenderStateSet(rwRENDERSTATETEXTURERASTER, RwTextureGetRaster(gpCoronaTexture[0]));
|
||||
for(i = 0; i < 6; i++){
|
||||
RwV3d pos = { i*1.5f, 100.0f, 5.0f };
|
||||
|
@ -2,6 +2,7 @@
|
||||
|
||||
#include "main.h"
|
||||
#include "General.h"
|
||||
#include "RenderBuffer.h"
|
||||
#include "TxdStore.h"
|
||||
#include "Camera.h"
|
||||
#include "Sprite.h"
|
||||
@ -12,6 +13,8 @@
|
||||
#include "Timecycle.h"
|
||||
#include "Coronas.h"
|
||||
|
||||
//--MIAMI: file done
|
||||
|
||||
struct FlareDef
|
||||
{
|
||||
float position;
|
||||
@ -130,13 +133,21 @@ void
|
||||
CCoronas::RegisterCorona(uint32 id, uint8 red, uint8 green, uint8 blue, uint8 alpha,
|
||||
const CVector &coors, float size, float drawDist, RwTexture *tex,
|
||||
int8 flareType, uint8 reflection, uint8 LOScheck, uint8 drawStreak, float someAngle,
|
||||
bool longDist, float nearDist)
|
||||
bool useNearDist, float nearDist)
|
||||
{
|
||||
int i;
|
||||
|
||||
if(sq(drawDist) < (TheCamera.GetPosition() - coors).MagnitudeSqr2D())
|
||||
return;
|
||||
|
||||
if(useNearDist){
|
||||
float dist = (TheCamera.GetPosition() - coors).Magnitude();
|
||||
if(dist < 35.0f)
|
||||
return;
|
||||
if(dist < 50.0f)
|
||||
alpha *= (dist - 35.0f)/(50.0f - 35.0f);
|
||||
}
|
||||
|
||||
for(i = 0; i < NUMCORONAS; i++)
|
||||
if(aCoronas[i].id == id)
|
||||
break;
|
||||
@ -189,17 +200,19 @@ CCoronas::RegisterCorona(uint32 id, uint8 red, uint8 green, uint8 blue, uint8 al
|
||||
aCoronas[i].reflection = reflection;
|
||||
aCoronas[i].LOScheck = LOScheck;
|
||||
aCoronas[i].drawStreak = drawStreak;
|
||||
aCoronas[i].useNearDist = useNearDist;
|
||||
aCoronas[i].nearDist = nearDist;
|
||||
}
|
||||
|
||||
void
|
||||
CCoronas::RegisterCorona(uint32 id, uint8 red, uint8 green, uint8 blue, uint8 alpha,
|
||||
const CVector &coors, float size, float drawDist, uint8 type,
|
||||
int8 flareType, uint8 reflection, uint8 LOScheck, uint8 drawStreak, float someAngle,
|
||||
bool longDist, float nearDist)
|
||||
bool useNearDist, float nearDist)
|
||||
{
|
||||
RegisterCorona(id, red, green, blue, alpha, coors, size, drawDist,
|
||||
gpCoronaTexture[type], flareType, reflection, LOScheck, drawStreak, someAngle,
|
||||
longDist, nearDist);
|
||||
useNearDist, nearDist);
|
||||
}
|
||||
|
||||
void
|
||||
@ -258,7 +271,10 @@ CCoronas::Render(void)
|
||||
|
||||
CVector spriteCoors;
|
||||
float spritew, spriteh;
|
||||
if(CSprite::CalcScreenCoors(aCoronas[i].coors, spriteCoors, &spritew, &spriteh, true)){
|
||||
if(!CSprite::CalcScreenCoors(aCoronas[i].coors, spriteCoors, &spritew, &spriteh, true)){
|
||||
aCoronas[i].offScreen = true;
|
||||
aCoronas[i].sightClear = false;
|
||||
}else{
|
||||
aCoronas[i].offScreen = false;
|
||||
|
||||
if(spriteCoors.x < 0.0f || spriteCoors.y < 0.0f ||
|
||||
@ -292,10 +308,7 @@ CCoronas::Render(void)
|
||||
}
|
||||
|
||||
|
||||
if(aCoronas[i].fadeAlpha == 0)
|
||||
continue;
|
||||
|
||||
if(spriteCoors.z < aCoronas[i].drawDist){
|
||||
if(aCoronas[i].fadeAlpha && spriteCoors.z < aCoronas[i].drawDist){
|
||||
float recipz = 1.0f/spriteCoors.z;
|
||||
float fadeDistance = aCoronas[i].drawDist / 2.0f;
|
||||
float distanceFade = spriteCoors.z < fadeDistance ? 1.0f : 1.0f - (spriteCoors.z - fadeDistance)/fadeDistance;
|
||||
@ -312,7 +325,7 @@ CCoronas::Render(void)
|
||||
if(CCoronas::aCoronas[i].id == SUN_CORE)
|
||||
spriteCoors.z = 0.95f * RwCameraGetFarClipPlane(Scene.camera);
|
||||
RwRenderStateSet(rwRENDERSTATETEXTURERASTER, RwTextureGetRaster(aCoronas[i].texture));
|
||||
spriteCoors.z -= 1.5f;
|
||||
spriteCoors.z -= aCoronas[i].nearDist;
|
||||
|
||||
if(aCoronas[i].texture == gpCoronaTexture[8]){
|
||||
// what's this?
|
||||
@ -370,14 +383,11 @@ CCoronas::Render(void)
|
||||
recipz, 255);
|
||||
}
|
||||
}
|
||||
}else{
|
||||
aCoronas[i].offScreen = true;
|
||||
aCoronas[i].sightClear = false;
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
RwRenderStateSet(rwRENDERSTATEZWRITEENABLE, (void*)TRUE);
|
||||
RwRenderStateSet(rwRENDERSTATEZWRITEENABLE, (void*)FALSE);
|
||||
RwRenderStateSet(rwRENDERSTATEZTESTENABLE, (void*)FALSE);
|
||||
RwRenderStateSet(rwRENDERSTATEVERTEXALPHAENABLE, (void*)TRUE);
|
||||
RwRenderStateSet(rwRENDERSTATESRCBLEND, (void*)rwBLENDONE);
|
||||
@ -393,23 +403,24 @@ CCoronas::Render(void)
|
||||
if(!aCoronas[i].hasValue[j] || !aCoronas[i].hasValue[j+1])
|
||||
continue;
|
||||
|
||||
int mod1 = (float)(6 - j) / 6 * 128;
|
||||
int mod2 = (float)(6 - (j+1)) / 6 * 128;
|
||||
int alpha1 = (float)(6 - j) / 6 * 128;
|
||||
int alpha2 = (float)(6 - (j+1)) / 6 * 128;
|
||||
|
||||
RwIm2DVertexSetScreenX(&vertexbufferX[0], aCoronas[i].prevX[j]);
|
||||
RwIm2DVertexSetScreenY(&vertexbufferX[0], aCoronas[i].prevY[j]);
|
||||
RwIm2DVertexSetIntRGBA(&vertexbufferX[0], aCoronas[i].prevRed[j] * mod1 / 256, aCoronas[i].prevGreen[j] * mod1 / 256, aCoronas[i].prevBlue[j] * mod1 / 256, 255);
|
||||
RwIm2DVertexSetIntRGBA(&vertexbufferX[0], aCoronas[i].prevRed[j] * alpha1 / 256, aCoronas[i].prevGreen[j] * alpha1 / 256, aCoronas[i].prevBlue[j] * alpha1 / 256, 255);
|
||||
RwIm2DVertexSetScreenX(&vertexbufferX[1], aCoronas[i].prevX[j+1]);
|
||||
RwIm2DVertexSetScreenY(&vertexbufferX[1], aCoronas[i].prevY[j+1]);
|
||||
RwIm2DVertexSetIntRGBA(&vertexbufferX[1], aCoronas[i].prevRed[j+1] * mod2 / 256, aCoronas[i].prevGreen[j+1] * mod2 / 256, aCoronas[i].prevBlue[j+1] * mod2 / 256, 255);
|
||||
RwIm2DVertexSetIntRGBA(&vertexbufferX[1], aCoronas[i].prevRed[j+1] * alpha2 / 256, aCoronas[i].prevGreen[j+1] * alpha2 / 256, aCoronas[i].prevBlue[j+1] * alpha2 / 256, 255);
|
||||
|
||||
// BUG: game doesn't do this
|
||||
#ifdef FIX_BUGS
|
||||
RwIm2DVertexSetScreenZ(&vertexbufferX[0], RwIm2DGetNearScreenZ());
|
||||
RwIm2DVertexSetCameraZ(&vertexbufferX[0], RwCameraGetNearClipPlane(Scene.camera));
|
||||
RwIm2DVertexSetRecipCameraZ(&vertexbufferX[0], 1.0f/RwCameraGetNearClipPlane(Scene.camera));
|
||||
RwIm2DVertexSetScreenZ(&vertexbufferX[1], RwIm2DGetNearScreenZ());
|
||||
RwIm2DVertexSetCameraZ(&vertexbufferX[1], RwCameraGetNearClipPlane(Scene.camera));
|
||||
RwIm2DVertexSetRecipCameraZ(&vertexbufferX[1], 1.0f/RwCameraGetNearClipPlane(Scene.camera));
|
||||
#endif
|
||||
|
||||
RwIm2DRenderLine(vertexbufferX, 2, 0, 1);
|
||||
}
|
||||
@ -428,6 +439,8 @@ CCoronas::RenderReflections(void)
|
||||
CEntity *entity;
|
||||
|
||||
if(CWeather::WetRoads > 0.0f){
|
||||
CSprite::InitSpriteBuffer();
|
||||
|
||||
RwRenderStateSet(rwRENDERSTATEFOGENABLE, (void*)FALSE);
|
||||
RwRenderStateSet(rwRENDERSTATEZWRITEENABLE, (void*)FALSE);
|
||||
RwRenderStateSet(rwRENDERSTATEZTESTENABLE, (void*)FALSE);
|
||||
@ -438,7 +451,8 @@ CCoronas::RenderReflections(void)
|
||||
|
||||
for(i = 0; i < NUMCORONAS; i++){
|
||||
if(aCoronas[i].id == 0 ||
|
||||
aCoronas[i].fadeAlpha == 0 && aCoronas[i].alpha == 0)
|
||||
aCoronas[i].fadeAlpha == 0 && aCoronas[i].alpha == 0 ||
|
||||
aCoronas[i].reflection == 0)
|
||||
continue;
|
||||
|
||||
// check if we want a reflection on this corona
|
||||
@ -453,11 +467,8 @@ CCoronas::RenderReflections(void)
|
||||
}
|
||||
}
|
||||
|
||||
if(!aCoronas[i].renderReflection)
|
||||
continue;
|
||||
|
||||
// Don't draw if reflection is too high
|
||||
if(aCoronas[i].heightAboveRoad < 20.0f){
|
||||
if(aCoronas[i].renderReflection && aCoronas[i].heightAboveRoad < 20.0f){
|
||||
// don't draw if camera is below road
|
||||
if(CCoronas::aCoronas[i].coors.z - aCoronas[i].heightAboveRoad > TheCamera.GetPosition().z)
|
||||
continue;
|
||||
@ -469,13 +480,14 @@ CCoronas::RenderReflections(void)
|
||||
float spritew, spriteh;
|
||||
if(CSprite::CalcScreenCoors(coors, spriteCoors, &spritew, &spriteh, true)){
|
||||
float drawDist = 0.75f * aCoronas[i].drawDist;
|
||||
drawDist = Min(drawDist, 50.0f);
|
||||
drawDist = Min(drawDist, 55.0f);
|
||||
if(spriteCoors.z < drawDist){
|
||||
float fadeDistance = drawDist / 2.0f;
|
||||
float distanceFade = spriteCoors.z < fadeDistance ? 1.0f : 1.0f - (spriteCoors.z - fadeDistance)/fadeDistance;
|
||||
distanceFade = clamp(distanceFade, 0.0f, 1.0f);
|
||||
float recipz = 1.0f/RwCameraGetNearClipPlane(Scene.camera);
|
||||
int intensity = (20.0f - aCoronas[i].heightAboveRoad) * 230.0 * distanceFade*CWeather::WetRoads * 0.05f;
|
||||
float heightFade = (20.0f - aCoronas[i].heightAboveRoad)/20.0f;
|
||||
int intensity = distanceFade*heightFade * 230.0 * CWeather::WetRoads;
|
||||
|
||||
CSprite::RenderBufferedOneXLUSprite(
|
||||
spriteCoors.x, spriteCoors.y, RwIm2DGetNearScreenZ(),
|
||||
@ -504,6 +516,130 @@ CCoronas::RenderReflections(void)
|
||||
}
|
||||
}
|
||||
|
||||
void
|
||||
CCoronas::RenderSunReflection(void)
|
||||
{
|
||||
float sunZDir = CTimeCycle::GetSunDirection().z;
|
||||
if(sunZDir > -0.05f){
|
||||
float intensity = (0.3f - Abs(sunZDir - 0.25f))/0.3f *
|
||||
(1.0f - CWeather::CloudCoverage) *
|
||||
(1.0f - CWeather::Foggyness) *
|
||||
(1.0f - CWeather::Wind);
|
||||
if(intensity > 0.0f){
|
||||
int r = (CTimeCycle::GetSunCoreRed() + CTimeCycle::GetSunCoronaRed())*intensity*0.25f;
|
||||
int g = (CTimeCycle::GetSunCoreGreen() + CTimeCycle::GetSunCoronaGreen())*intensity*0.25f;
|
||||
int b = (CTimeCycle::GetSunCoreBlue() + CTimeCycle::GetSunCoronaBlue())*intensity*0.25f;
|
||||
|
||||
CVector sunPos = 40.0f*CTimeCycle::GetSunDirection() + TheCamera.GetPosition();
|
||||
sunPos.z = 0.5f*CWeather::Wind + 6.1f;
|
||||
CVector sunDir = CTimeCycle::GetSunDirection();
|
||||
sunDir.z = 0.0;
|
||||
sunDir.Normalise();
|
||||
|
||||
TempBufferIndicesStored = 6;
|
||||
TempBufferRenderIndexList[0] = 2;
|
||||
TempBufferRenderIndexList[1] = 1;
|
||||
TempBufferRenderIndexList[2] = 0;
|
||||
TempBufferRenderIndexList[3] = 2;
|
||||
TempBufferRenderIndexList[4] = 3;
|
||||
TempBufferRenderIndexList[5] = 1;
|
||||
|
||||
// 60 unit square in sun direction
|
||||
TempBufferVerticesStored = 4;
|
||||
RwIm3DVertexSetRGBA(&TempBufferRenderVertices[0], r, g, b, 255);
|
||||
RwIm3DVertexSetPos(&TempBufferRenderVertices[0],
|
||||
sunPos.x + 30.0f*sunDir.y,
|
||||
sunPos.y - 30.0f*sunDir.x,
|
||||
sunPos.z);
|
||||
RwIm3DVertexSetRGBA(&TempBufferRenderVertices[1], r, g, b, 255);
|
||||
RwIm3DVertexSetPos(&TempBufferRenderVertices[1],
|
||||
sunPos.x - 30.0f*sunDir.y,
|
||||
sunPos.y + 30.0f*sunDir.x,
|
||||
sunPos.z);
|
||||
RwIm3DVertexSetRGBA(&TempBufferRenderVertices[2], r, g, b, 255);
|
||||
RwIm3DVertexSetPos(&TempBufferRenderVertices[2],
|
||||
sunPos.x + 60.0f*sunDir.x + 30.0f*sunDir.y,
|
||||
sunPos.y + 60.0f*sunDir.y - 30.0f*sunDir.x,
|
||||
sunPos.z);
|
||||
RwIm3DVertexSetRGBA(&TempBufferRenderVertices[3], r, g, b, 255);
|
||||
RwIm3DVertexSetPos(&TempBufferRenderVertices[3],
|
||||
sunPos.x + 60.0f*sunDir.x - 30.0f*sunDir.y,
|
||||
sunPos.y + 60.0f*sunDir.y + 30.0f*sunDir.x,
|
||||
sunPos.z);
|
||||
|
||||
RwIm3DVertexSetU(&TempBufferRenderVertices[0], 0.0f);
|
||||
RwIm3DVertexSetV(&TempBufferRenderVertices[0], 1.0f);
|
||||
RwIm3DVertexSetU(&TempBufferRenderVertices[1], 1.0f);
|
||||
RwIm3DVertexSetV(&TempBufferRenderVertices[1], 1.0f);
|
||||
RwIm3DVertexSetU(&TempBufferRenderVertices[2], 0.0f);
|
||||
RwIm3DVertexSetV(&TempBufferRenderVertices[2], 0.5f);
|
||||
RwIm3DVertexSetU(&TempBufferRenderVertices[3], 1.0f);
|
||||
RwIm3DVertexSetV(&TempBufferRenderVertices[3], 0.5f);
|
||||
|
||||
int timeInc = 0;
|
||||
int sideInc = 0;
|
||||
int fwdInc = 0;
|
||||
for(int i = 0; i < 20; i++){
|
||||
TempBufferRenderIndexList[TempBufferIndicesStored + 0] = TempBufferVerticesStored;
|
||||
TempBufferRenderIndexList[TempBufferIndicesStored + 1] = TempBufferVerticesStored-1;
|
||||
TempBufferRenderIndexList[TempBufferIndicesStored + 2] = TempBufferVerticesStored-2;
|
||||
TempBufferRenderIndexList[TempBufferIndicesStored + 3] = TempBufferVerticesStored;
|
||||
TempBufferRenderIndexList[TempBufferIndicesStored + 4] = TempBufferVerticesStored+1;
|
||||
TempBufferRenderIndexList[TempBufferIndicesStored + 5] = TempBufferVerticesStored-1;
|
||||
TempBufferIndicesStored += 6;
|
||||
|
||||
// What a weird way to do it...
|
||||
float fwdLen = fwdInc/20 + 60;
|
||||
float sideLen = sideInc/20 + 30;
|
||||
sideLen += 10.0f*Sin((float)(CTimer::GetTimeInMilliseconds()+timeInc & 0x7FF)/0x800*TWOPI);
|
||||
timeInc += 900;
|
||||
sideInc += 970;
|
||||
fwdInc += 1440;
|
||||
|
||||
RwIm3DVertexSetRGBA(&TempBufferRenderVertices[TempBufferVerticesStored+0], r, g, b, 255);
|
||||
RwIm3DVertexSetPos(&TempBufferRenderVertices[TempBufferVerticesStored+0],
|
||||
sunPos.x + fwdLen*sunDir.x + sideLen*sunDir.y,
|
||||
sunPos.y + fwdLen*sunDir.y - sideLen*sunDir.x,
|
||||
sunPos.z);
|
||||
|
||||
RwIm3DVertexSetRGBA(&TempBufferRenderVertices[TempBufferVerticesStored+1], r, g, b, 255);
|
||||
RwIm3DVertexSetPos(&TempBufferRenderVertices[TempBufferVerticesStored+1],
|
||||
sunPos.x + fwdLen*sunDir.x - sideLen*sunDir.y,
|
||||
sunPos.y + fwdLen*sunDir.y + sideLen*sunDir.x,
|
||||
sunPos.z);
|
||||
|
||||
RwIm3DVertexSetU(&TempBufferRenderVertices[TempBufferVerticesStored+0], 0.0f);
|
||||
RwIm3DVertexSetV(&TempBufferRenderVertices[TempBufferVerticesStored+0], 0.5f);
|
||||
RwIm3DVertexSetU(&TempBufferRenderVertices[TempBufferVerticesStored+1], 1.0f);
|
||||
RwIm3DVertexSetV(&TempBufferRenderVertices[TempBufferVerticesStored+1], 0.5f);
|
||||
TempBufferVerticesStored += 2;
|
||||
}
|
||||
|
||||
|
||||
RwRenderStateSet(rwRENDERSTATEZWRITEENABLE, (void*)FALSE);
|
||||
RwRenderStateSet(rwRENDERSTATEZTESTENABLE, (void*)TRUE);
|
||||
RwRenderStateSet(rwRENDERSTATEFOGENABLE, (void*)FALSE);
|
||||
RwRenderStateSet(rwRENDERSTATEFOGTYPE, (void*)rwFOGTYPELINEAR);
|
||||
RwRenderStateSet(rwRENDERSTATESRCBLEND, (void*)rwBLENDONE);
|
||||
RwRenderStateSet(rwRENDERSTATEDESTBLEND, (void*)rwBLENDONE);
|
||||
RwRenderStateSet(rwRENDERSTATEVERTEXALPHAENABLE, (void*)TRUE);
|
||||
RwRenderStateSet(rwRENDERSTATETEXTURERASTER, RwTextureGetRaster(gpCoronaTexture[4]));
|
||||
if(RwIm3DTransform(TempBufferRenderVertices, TempBufferVerticesStored, nil, rwIM3D_VERTEXUV)){
|
||||
RwIm3DRenderIndexedPrimitive(rwPRIMTYPETRILIST, TempBufferRenderIndexList, TempBufferIndicesStored);
|
||||
RwIm3DEnd();
|
||||
}
|
||||
RwRenderStateSet(rwRENDERSTATEZWRITEENABLE, (void*)TRUE);
|
||||
RwRenderStateSet(rwRENDERSTATEZTESTENABLE, (void*)TRUE);
|
||||
RwRenderStateSet(rwRENDERSTATESRCBLEND, (void*)rwBLENDSRCALPHA);
|
||||
RwRenderStateSet(rwRENDERSTATEDESTBLEND, (void*)rwBLENDINVSRCALPHA);
|
||||
RwRenderStateSet(rwRENDERSTATEFOGENABLE, (void*)FALSE);
|
||||
RwRenderStateSet(rwRENDERSTATEVERTEXALPHAENABLE, (void*)FALSE);
|
||||
TempBufferVerticesStored = 0;
|
||||
TempBufferIndicesStored = 0;
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
void
|
||||
CCoronas::DoSunAndMoon(void)
|
||||
{
|
||||
@ -520,7 +656,7 @@ CCoronas::DoSunAndMoon(void)
|
||||
255, sunCoors, size,
|
||||
999999.88f, TYPE_STAR, FLARE_NONE, REFLECTION_OFF, LOSCHECK_OFF, STREAK_OFF, 0.0f);
|
||||
|
||||
if(CTimeCycle::GetSunDirection().z > 0.0f)
|
||||
if(CTimeCycle::GetSunDirection().z > 0.0f && !CGame::IsInInterior())
|
||||
RegisterCorona(SUN_CORONA,
|
||||
CTimeCycle::GetSunCoronaRed(), CTimeCycle::GetSunCoronaGreen(), CTimeCycle::GetSunCoronaBlue(),
|
||||
255, sunCoors, 25.0f * CTimeCycle::GetSunSize(),
|
||||
|
@ -4,19 +4,21 @@ extern RwTexture *gpCoronaTexture[9];
|
||||
|
||||
struct CRegisteredCorona
|
||||
{
|
||||
CVector coors;
|
||||
uint32 id;
|
||||
uint32 lastLOScheck;
|
||||
RwTexture *texture;
|
||||
float size;
|
||||
float someAngle;
|
||||
float drawDist;
|
||||
float nearDist;
|
||||
float heightAboveRoad;
|
||||
uint8 red;
|
||||
uint8 green;
|
||||
uint8 blue;
|
||||
uint8 alpha; // alpha when fully visible
|
||||
uint8 fadeAlpha; // actual value used for rendering, faded
|
||||
CVector coors;
|
||||
float size;
|
||||
float someAngle;
|
||||
bool registeredThisFrame;
|
||||
float drawDist;
|
||||
int8 flareType;
|
||||
int8 reflection;
|
||||
|
||||
@ -25,12 +27,11 @@ struct CRegisteredCorona
|
||||
uint8 firstUpdate : 1;
|
||||
uint8 drawStreak : 1;
|
||||
uint8 sightClear : 1;
|
||||
uint8 useNearDist : 1;
|
||||
uint8 renderReflection : 1;
|
||||
|
||||
bool renderReflection;
|
||||
float heightAboveRoad;
|
||||
|
||||
float prevX[6];
|
||||
float prevY[6];
|
||||
int16 prevX[6];
|
||||
int16 prevY[6];
|
||||
uint8 prevRed[6];
|
||||
uint8 prevGreen[6];
|
||||
uint8 prevBlue[6];
|
||||
@ -39,7 +40,7 @@ struct CRegisteredCorona
|
||||
void Update(void);
|
||||
};
|
||||
|
||||
VALIDATE_SIZE(CRegisteredCorona, 0x80);
|
||||
VALIDATE_SIZE(CRegisteredCorona, 0x68);
|
||||
|
||||
class CCoronas
|
||||
{
|
||||
@ -91,13 +92,14 @@ public:
|
||||
static void RegisterCorona(uint32 id, uint8 red, uint8 green, uint8 blue, uint8 alpha,
|
||||
const CVector &coors, float size, float drawDist, RwTexture *tex,
|
||||
int8 flareType, uint8 reflection, uint8 LOScheck, uint8 drawStreak, float someAngle,
|
||||
bool longDist = false, float nearClip = 1.5f);
|
||||
bool useNearDist = false, float nearDist = 1.5f);
|
||||
static void RegisterCorona(uint32 id, uint8 red, uint8 green, uint8 blue, uint8 alpha,
|
||||
const CVector &coors, float size, float drawDist, uint8 type,
|
||||
int8 flareType, uint8 reflection, uint8 LOScheck, uint8 drawStreak, float someAngle,
|
||||
bool longDist = false, float nearClip = 1.5f);
|
||||
bool useNearDist = false, float nearDist = 1.5f);
|
||||
static void UpdateCoronaCoors(uint32 id, const CVector &coors, float drawDist, float someAngle);
|
||||
static void Render(void);
|
||||
static void RenderReflections(void);
|
||||
static void RenderSunReflection(void);
|
||||
static void DoSunAndMoon(void);
|
||||
};
|
||||
|
@ -7,6 +7,7 @@
|
||||
#include "Camera.h"
|
||||
#include "Sprite.h"
|
||||
#include "Coronas.h"
|
||||
#include "PointLights.h"
|
||||
#include "Rubbish.h"
|
||||
#include "Timecycle.h"
|
||||
#include "General.h"
|
||||
@ -391,7 +392,7 @@ void CMovingThings::Init()
|
||||
CPlaneTrails::Init();
|
||||
CSmokeTrails::Init();
|
||||
CPlaneBanners::Init();
|
||||
CEscalators::Init();
|
||||
CPointLights::Init();
|
||||
|
||||
StartCloseList.m_pNext = &CMovingThings::EndCloseList;
|
||||
StartCloseList.m_pPrev = nil;
|
||||
@ -399,6 +400,8 @@ void CMovingThings::Init()
|
||||
EndCloseList.m_pPrev = &CMovingThings::StartCloseList;
|
||||
Num = 0;
|
||||
|
||||
CEscalators::Init();
|
||||
|
||||
#ifndef MIAMI // something is still used here actually
|
||||
// Initialize scroll bars
|
||||
aScrollBars[0].Init(CVector( 228.3f, -669.0f, 39.0f ), SCROLL_BUSINESS, 0.0f, 0.5f, 0.5f, 255, 128, 0, 0.3f);
|
||||
|
@ -205,7 +205,8 @@ void CHud::Draw()
|
||||
rect.right = f3rdX + SCREEN_SCALE_X(32.0f * 0.6f);
|
||||
rect.bottom = f3rdY + SCREEN_SCALE_Y(32.0f * 0.6f);
|
||||
|
||||
Sprites[HUD_SITEM16].Draw(CRect(rect), CRGBA(255, 255, 255, 255));
|
||||
Sprites[HUD_SITEM16].Draw(CRect(rect), CRGBA(255, 255, 255, 255),
|
||||
0.0f, 0.0f, 1.0f, 0.0f, 0.0f, 1.0f, 1.0f, 1.0f);
|
||||
}
|
||||
else {
|
||||
rect.left = f3rdX - SCREEN_SCALE_X(32.0f * 0.4f);
|
||||
@ -213,7 +214,8 @@ void CHud::Draw()
|
||||
rect.right = f3rdX + SCREEN_SCALE_X(32.0f * 0.4f);
|
||||
rect.bottom = f3rdY + SCREEN_SCALE_Y(32.0f * 0.4f);
|
||||
|
||||
Sprites[HUD_SITEM16].Draw(CRect(rect), CRGBA(255, 255, 255, 255));
|
||||
Sprites[HUD_SITEM16].Draw(CRect(rect), CRGBA(255, 255, 255, 255),
|
||||
0.0f, 0.0f, 1.0f, 0.0f, 0.0f, 1.0f, 1.0f, 1.0f);
|
||||
}
|
||||
} else {
|
||||
if (Mode == CCam::MODE_M16_1STPERSON ||
|
||||
@ -223,7 +225,8 @@ void CHud::Draw()
|
||||
rect.top = (SCREEN_HEIGHT / 2) - SCREEN_SCALE_Y(32.0f);
|
||||
rect.right = (SCREEN_WIDTH / 2) + SCREEN_SCALE_X(32.0f);
|
||||
rect.bottom = (SCREEN_HEIGHT / 2) + SCREEN_SCALE_Y(32.0f);
|
||||
Sprites[HUD_SITEM16].Draw(CRect(rect), CRGBA(255, 255, 255, 255));
|
||||
Sprites[HUD_SITEM16].Draw(CRect(rect), CRGBA(255, 255, 255, 255),
|
||||
0.0f, 0.0f, 1.0f, 0.0f, 0.0f, 1.0f, 1.0f, 1.0f);
|
||||
}
|
||||
else if (Mode == CCam::MODE_1STPERSON_RUNABOUT) {
|
||||
rect.left = (SCREEN_WIDTH / 2) - SCREEN_SCALE_X(32.0f * 0.7f);
|
||||
@ -231,7 +234,8 @@ void CHud::Draw()
|
||||
rect.right = (SCREEN_WIDTH / 2) + SCREEN_SCALE_X(32.0f * 0.7f);
|
||||
rect.bottom = (SCREEN_HEIGHT / 2) + SCREEN_SCALE_Y(32.0f * 0.7f);
|
||||
|
||||
Sprites[HUD_SITEM16].Draw(CRect(rect), CRGBA(255, 255, 255, 255));
|
||||
Sprites[HUD_SITEM16].Draw(CRect(rect), CRGBA(255, 255, 255, 255),
|
||||
0.0f, 0.0f, 1.0f, 0.0f, 0.0f, 1.0f, 1.0f, 1.0f);
|
||||
}
|
||||
else if (Mode == CCam::MODE_ROCKETLAUNCHER || Mode == CCam::MODE_ROCKETLAUNCHER_RUNABOUT) {
|
||||
RwRenderStateSet(rwRENDERSTATEVERTEXALPHAENABLE, (void *)TRUE);
|
||||
@ -248,29 +252,33 @@ void CHud::Draw()
|
||||
|
||||
// TODO(Miami)
|
||||
// Sniper
|
||||
rect.left = (SCREEN_WIDTH / 2) - SCREEN_SCALE_X(210.0f);
|
||||
rect.top = (SCREEN_HEIGHT / 2) - SCREEN_SCALE_Y(210.0f);
|
||||
rect.right = SCREEN_WIDTH / 2;
|
||||
rect.bottom = SCREEN_HEIGHT / 2;
|
||||
Sprites[HUD_SITESNIPER].Draw(CRect(rect), CRGBA(255, 255, 255, 255));
|
||||
rect.left = SCREEN_WIDTH/2 - SCREEN_SCALE_X(210.0f);
|
||||
rect.top = SCREEN_HEIGHT/2 - SCREEN_SCALE_Y(210.0f);
|
||||
rect.right = SCREEN_WIDTH/2;
|
||||
rect.bottom = SCREEN_HEIGHT/2;
|
||||
Sprites[HUD_SITESNIPER].Draw(CRect(rect), CRGBA(255, 255, 255, 255),
|
||||
0.01f, 0.01f, 1.0f, 0.0f, 0.01f, 1.0f, 1.0f, 1.0f);
|
||||
|
||||
rect.right = (SCREEN_WIDTH / 2);
|
||||
rect.top = (SCREEN_HEIGHT / 2) - SCREEN_SCALE_Y(210.0f);
|
||||
rect.left = SCREEN_SCALE_X(210.0f) + (SCREEN_WIDTH / 2);
|
||||
rect.bottom = SCREEN_HEIGHT / 2;
|
||||
Sprites[HUD_SITESNIPER].Draw(CRect(rect), CRGBA(255, 255, 255, 255));
|
||||
rect.left = SCREEN_WIDTH/2;
|
||||
rect.top = SCREEN_HEIGHT/2 - SCREEN_SCALE_Y(210.0f);
|
||||
rect.right = SCREEN_WIDTH/2 + SCREEN_SCALE_X(210.0f);
|
||||
rect.bottom = SCREEN_HEIGHT/2;
|
||||
Sprites[HUD_SITESNIPER].Draw(CRect(rect), CRGBA(255, 255, 255, 255),
|
||||
0.99f, 0.0f, 0.01f, 0.01f, 0.99f, 1.0f, 0.01f, 1.0f);
|
||||
|
||||
rect.left = (SCREEN_WIDTH / 2) - SCREEN_SCALE_X(210.0f);
|
||||
rect.bottom = (SCREEN_HEIGHT / 2);
|
||||
rect.right = (SCREEN_WIDTH / 2);
|
||||
rect.top = SCREEN_SCALE_Y(210.0f) + (SCREEN_HEIGHT / 2);
|
||||
Sprites[HUD_SITESNIPER].Draw(CRect(rect), CRGBA(255, 255, 255, 255));
|
||||
rect.left = SCREEN_WIDTH/2 - SCREEN_SCALE_X(210.0f);
|
||||
rect.top = SCREEN_HEIGHT/2;
|
||||
rect.right = SCREEN_WIDTH/2;
|
||||
rect.bottom = SCREEN_HEIGHT/2 + SCREEN_SCALE_Y(210.0f);
|
||||
Sprites[HUD_SITESNIPER].Draw(CRect(rect), CRGBA(255, 255, 255, 255),
|
||||
0.01f, 0.99f, 1.0f, 0.99f, 0.01f, 0.01f, 1.0f, 0.01f);
|
||||
|
||||
rect.right = (SCREEN_WIDTH / 2);
|
||||
rect.bottom = (SCREEN_HEIGHT / 2);
|
||||
rect.left = SCREEN_SCALE_X(210.0f) + (SCREEN_WIDTH / 2);
|
||||
rect.top = SCREEN_SCALE_Y(210.0f) + (SCREEN_HEIGHT / 2);
|
||||
Sprites[HUD_SITESNIPER].Draw(CRect(rect), CRGBA(255, 255, 255, 255));
|
||||
rect.left = SCREEN_WIDTH/2;
|
||||
rect.top = SCREEN_HEIGHT/2;
|
||||
rect.right = SCREEN_WIDTH/2 + SCREEN_SCALE_X(210.0f);
|
||||
rect.bottom = SCREEN_HEIGHT/2 + SCREEN_SCALE_Y(210.0f);
|
||||
Sprites[HUD_SITESNIPER].Draw(CRect(rect), CRGBA(255, 255, 255, 255),
|
||||
0.99f, 0.99f, 0.01f, 0.99f, 0.99f, 0.01f, 0.1f, 0.01f);
|
||||
}
|
||||
}
|
||||
RwRenderStateSet(rwRENDERSTATESRCBLEND, (void *)rwBLENDSRCALPHA);
|
||||
|
@ -11,6 +11,7 @@
|
||||
#include "Camera.h"
|
||||
#include "MBlur.h"
|
||||
#include "Timer.h"
|
||||
#include "postfx.h"
|
||||
|
||||
// Originally taken from RW example 'mblur'
|
||||
|
||||
@ -30,6 +31,10 @@ extern "C" D3DCAPS8 _RwD3D8DeviceCaps;
|
||||
RwBool
|
||||
CMBlur::MotionBlurOpen(RwCamera *cam)
|
||||
{
|
||||
#ifdef EXTENDED_COLOURFILTER
|
||||
CPostFX::Open(cam);
|
||||
return TRUE;
|
||||
#else
|
||||
#ifdef GTA_PS2
|
||||
RwRect rect = {0, 0, 0, 0};
|
||||
|
||||
@ -130,18 +135,22 @@ CMBlur::MotionBlurOpen(RwCamera *cam)
|
||||
|
||||
return TRUE;
|
||||
#endif
|
||||
#endif
|
||||
}
|
||||
|
||||
RwBool
|
||||
CMBlur::MotionBlurClose(void)
|
||||
{
|
||||
#ifdef EXTENDED_COLOURFILTER
|
||||
CPostFX::Close();
|
||||
#else
|
||||
if(pFrontBuffer){
|
||||
RwRasterDestroy(pFrontBuffer);
|
||||
pFrontBuffer = nil;
|
||||
|
||||
return TRUE;
|
||||
}
|
||||
|
||||
#endif
|
||||
return FALSE;
|
||||
}
|
||||
|
||||
@ -197,8 +206,8 @@ CMBlur::CreateImmediateModeData(RwCamera *cam, RwRect *rect)
|
||||
RwIm2DVertexSetIntRGBA(&Vertex[3], 255, 255, 255, 255);
|
||||
|
||||
|
||||
RwIm2DVertexSetScreenX(&Vertex2[0], zero);
|
||||
RwIm2DVertexSetScreenY(&Vertex2[0], zero);
|
||||
RwIm2DVertexSetScreenX(&Vertex2[0], zero + 2.0f);
|
||||
RwIm2DVertexSetScreenY(&Vertex2[0], zero + 2.0f);
|
||||
RwIm2DVertexSetScreenZ(&Vertex2[0], RwIm2DGetNearScreenZ());
|
||||
RwIm2DVertexSetCameraZ(&Vertex2[0], RwCameraGetNearClipPlane(cam));
|
||||
RwIm2DVertexSetRecipCameraZ(&Vertex2[0], 1.0f/RwCameraGetNearClipPlane(cam));
|
||||
@ -206,8 +215,8 @@ CMBlur::CreateImmediateModeData(RwCamera *cam, RwRect *rect)
|
||||
RwIm2DVertexSetV(&Vertex2[0], 0.0f, 1.0f/RwCameraGetNearClipPlane(cam));
|
||||
RwIm2DVertexSetIntRGBA(&Vertex2[0], 255, 255, 255, 255);
|
||||
|
||||
RwIm2DVertexSetScreenX(&Vertex2[1], zero);
|
||||
RwIm2DVertexSetScreenY(&Vertex2[1], ymax);
|
||||
RwIm2DVertexSetScreenX(&Vertex2[1], 2.0f);
|
||||
RwIm2DVertexSetScreenY(&Vertex2[1], ymax + 2.0f);
|
||||
RwIm2DVertexSetScreenZ(&Vertex2[1], RwIm2DGetNearScreenZ());
|
||||
RwIm2DVertexSetCameraZ(&Vertex2[1], RwCameraGetNearClipPlane(cam));
|
||||
RwIm2DVertexSetRecipCameraZ(&Vertex2[1], 1.0f/RwCameraGetNearClipPlane(cam));
|
||||
@ -215,8 +224,8 @@ CMBlur::CreateImmediateModeData(RwCamera *cam, RwRect *rect)
|
||||
RwIm2DVertexSetV(&Vertex2[1], 1.0f, 1.0f/RwCameraGetNearClipPlane(cam));
|
||||
RwIm2DVertexSetIntRGBA(&Vertex2[1], 255, 255, 255, 255);
|
||||
|
||||
RwIm2DVertexSetScreenX(&Vertex2[2], xmax);
|
||||
RwIm2DVertexSetScreenY(&Vertex2[2], ymax);
|
||||
RwIm2DVertexSetScreenX(&Vertex2[2], xmax + 2.0f);
|
||||
RwIm2DVertexSetScreenY(&Vertex2[2], ymax + 2.0f);
|
||||
RwIm2DVertexSetScreenZ(&Vertex2[2], RwIm2DGetNearScreenZ());
|
||||
RwIm2DVertexSetCameraZ(&Vertex2[2], RwCameraGetNearClipPlane(cam));
|
||||
RwIm2DVertexSetRecipCameraZ(&Vertex2[2], 1.0f/RwCameraGetNearClipPlane(cam));
|
||||
@ -224,20 +233,22 @@ CMBlur::CreateImmediateModeData(RwCamera *cam, RwRect *rect)
|
||||
RwIm2DVertexSetV(&Vertex2[2], 1.0f, 1.0f/RwCameraGetNearClipPlane(cam));
|
||||
RwIm2DVertexSetIntRGBA(&Vertex2[2], 255, 255, 255, 255);
|
||||
|
||||
RwIm2DVertexSetScreenX(&Vertex2[3], xmax);
|
||||
RwIm2DVertexSetScreenY(&Vertex2[3], zero);
|
||||
RwIm2DVertexSetScreenX(&Vertex2[3], xmax + 2.0f);
|
||||
RwIm2DVertexSetScreenY(&Vertex2[3], zero + 2.0f);
|
||||
RwIm2DVertexSetScreenZ(&Vertex2[3], RwIm2DGetNearScreenZ());
|
||||
RwIm2DVertexSetCameraZ(&Vertex2[3], RwCameraGetNearClipPlane(cam));
|
||||
RwIm2DVertexSetRecipCameraZ(&Vertex2[3], 1.0f/RwCameraGetNearClipPlane(cam));
|
||||
RwIm2DVertexSetU(&Vertex2[3], 1.0f, 1.0f/RwCameraGetNearClipPlane(cam));
|
||||
RwIm2DVertexSetV(&Vertex2[3], 0.0f, 1.0f/RwCameraGetNearClipPlane(cam));
|
||||
RwIm2DVertexSetIntRGBA(&Vertex2[3], 255, 255, 255, 255);
|
||||
|
||||
}
|
||||
|
||||
void
|
||||
CMBlur::MotionBlurRender(RwCamera *cam, uint32 red, uint32 green, uint32 blue, uint32 blur, int32 type, uint32 bluralpha)
|
||||
{
|
||||
#ifdef EXTENDED_COLOURFILTER
|
||||
CPostFX::Render(cam, red, green, blue, blur, type, bluralpha);
|
||||
#else
|
||||
RwRGBA color = { (RwUInt8)red, (RwUInt8)green, (RwUInt8)blue, (RwUInt8)blur };
|
||||
#ifdef GTA_PS2
|
||||
if( pFrontBuffer )
|
||||
@ -253,8 +264,14 @@ CMBlur::MotionBlurRender(RwCamera *cam, uint32 red, uint32 green, uint32 blue, u
|
||||
RwRasterPopContext();
|
||||
}
|
||||
#endif
|
||||
#endif
|
||||
}
|
||||
|
||||
static uint8 DrunkBlurRed = 128;
|
||||
static uint8 DrunkBlurGreen = 128;
|
||||
static uint8 DrunkBlurBlue = 128;
|
||||
static int32 DrunkBlurIncrement = 1;
|
||||
|
||||
void
|
||||
CMBlur::OverlayRender(RwCamera *cam, RwRaster *raster, RwRGBA color, int32 type, int32 bluralpha)
|
||||
{
|
||||
@ -367,7 +384,36 @@ CMBlur::OverlayRender(RwCamera *cam, RwRaster *raster, RwRGBA color, int32 type,
|
||||
}
|
||||
}
|
||||
|
||||
// TODO(MIAMI): drunkness
|
||||
int DrunkBlurAlpha = 175.0f * Drunkness;
|
||||
if(DrunkBlurAlpha != 0){
|
||||
RwRenderStateSet(rwRENDERSTATESRCBLEND, (void*)rwBLENDSRCALPHA);
|
||||
RwRenderStateSet(rwRENDERSTATEDESTBLEND, (void*)rwBLENDINVSRCALPHA);
|
||||
if(BlurOn){
|
||||
RwIm2DVertexSetIntRGBA(&Vertex[0], 255, 255, 255, DrunkBlurAlpha);
|
||||
RwIm2DVertexSetIntRGBA(&Vertex[1], 255, 255, 255, DrunkBlurAlpha);
|
||||
RwIm2DVertexSetIntRGBA(&Vertex[2], 255, 255, 255, DrunkBlurAlpha);
|
||||
RwIm2DVertexSetIntRGBA(&Vertex[3], 255, 255, 255, DrunkBlurAlpha);
|
||||
}else{
|
||||
RwIm2DVertexSetIntRGBA(&Vertex[0], DrunkBlurRed, DrunkBlurGreen, DrunkBlurBlue, DrunkBlurAlpha);
|
||||
RwIm2DVertexSetIntRGBA(&Vertex[1], DrunkBlurRed, DrunkBlurGreen, DrunkBlurBlue, DrunkBlurAlpha);
|
||||
RwIm2DVertexSetIntRGBA(&Vertex[2], DrunkBlurRed, DrunkBlurGreen, DrunkBlurBlue, DrunkBlurAlpha);
|
||||
RwIm2DVertexSetIntRGBA(&Vertex[3], DrunkBlurRed, DrunkBlurGreen, DrunkBlurBlue, DrunkBlurAlpha);
|
||||
if(DrunkBlurIncrement){
|
||||
if(DrunkBlurRed < 255) DrunkBlurRed++;
|
||||
if(DrunkBlurGreen < 255) DrunkBlurGreen++;
|
||||
if(DrunkBlurBlue < 255) DrunkBlurBlue++;
|
||||
if(DrunkBlurRed == 255)
|
||||
DrunkBlurIncrement = 0;
|
||||
}else{
|
||||
if(DrunkBlurRed > 128) DrunkBlurRed--;
|
||||
if(DrunkBlurGreen > 128) DrunkBlurGreen--;
|
||||
if(DrunkBlurBlue > 128) DrunkBlurBlue--;
|
||||
if(DrunkBlurRed == 128)
|
||||
DrunkBlurIncrement = 1;
|
||||
}
|
||||
}
|
||||
RwIm2DRenderIndexedPrimitive(rwPRIMTYPETRILIST, Vertex, 4, Index, 6);
|
||||
}
|
||||
|
||||
// TODO(MIAMI): OverlayRenderFx
|
||||
|
||||
|
@ -1,6 +1,7 @@
|
||||
#include "common.h"
|
||||
|
||||
#include "main.h"
|
||||
#include "CutsceneMgr.h"
|
||||
#include "Lights.h"
|
||||
#include "Camera.h"
|
||||
#include "Weather.h"
|
||||
@ -10,8 +11,23 @@
|
||||
#include "Timer.h"
|
||||
#include "PointLights.h"
|
||||
|
||||
//--MIAMI: file done
|
||||
|
||||
int16 CPointLights::NumLights;
|
||||
CRegisteredPointLight CPointLights::aLights[NUMPOINTLIGHTS];
|
||||
CVector CPointLights::aCachedMapReads[32];
|
||||
float CPointLights::aCachedMapReadResults[32];
|
||||
int32 CPointLights::NextCachedValue;
|
||||
|
||||
void
|
||||
CPointLights::Init(void)
|
||||
{
|
||||
for(int i = 0; i < ARRAY_SIZE(aCachedMapReads); i++){
|
||||
aCachedMapReads[i] = CVector(0.0f, 0.0f, 0.0f);
|
||||
aCachedMapReadResults[i] = 0.0f;
|
||||
}
|
||||
NextCachedValue = 0;
|
||||
}
|
||||
|
||||
void
|
||||
CPointLights::InitPerFrame(void)
|
||||
@ -86,12 +102,11 @@ CPointLights::GenerateLightsAffectingObject(Const CVector *objCoors)
|
||||
ret *= distNorm;
|
||||
}else{
|
||||
float intensity;
|
||||
// distance fade
|
||||
if(distNorm < 0.5f)
|
||||
// near enough
|
||||
intensity = 1.0f;
|
||||
else
|
||||
// attenuate
|
||||
intensity = 1.0f - (distNorm - 0.5f)*2.0f;
|
||||
intensity = 1.0f - (distNorm - 0.5f)/(1.0f - 0.5f);
|
||||
|
||||
if(distance != 0.0f){
|
||||
CVector dir = dist / distance;
|
||||
@ -143,17 +158,22 @@ CPointLights::RenderFogEffect(void)
|
||||
CVector spriteCoors;
|
||||
float spritew, spriteh;
|
||||
|
||||
if(CCutsceneMgr::IsRunning())
|
||||
return;
|
||||
|
||||
RwRenderStateSet(rwRENDERSTATEZWRITEENABLE, (void*)FALSE);
|
||||
RwRenderStateSet(rwRENDERSTATEVERTEXALPHAENABLE, (void*)TRUE);
|
||||
RwRenderStateSet(rwRENDERSTATESRCBLEND, (void*)rwBLENDONE);
|
||||
RwRenderStateSet(rwRENDERSTATEDESTBLEND, (void*)rwBLENDONE);
|
||||
RwRenderStateSet(rwRENDERSTATETEXTURERASTER, gpPointlightRaster);
|
||||
|
||||
CSprite::InitSpriteBuffer();
|
||||
|
||||
for(i = 0; i < NumLights; i++){
|
||||
if(aLights[i].fogType != FOG_NORMAL && aLights[i].fogType != FOG_ALWAYS)
|
||||
continue;
|
||||
|
||||
fogginess = aLights[i].fogType == FOG_ALWAYS ? 1.0f : CWeather::Foggyness;
|
||||
fogginess = aLights[i].fogType == FOG_NORMAL ? CWeather::Foggyness : 1.0f;
|
||||
if(fogginess == 0.0f)
|
||||
continue;
|
||||
|
||||
@ -198,7 +218,7 @@ CPointLights::RenderFogEffect(void)
|
||||
float distsq = sq(dx) + sq(dy);
|
||||
float linedistsq = distsq - sq(dot);
|
||||
if(dot > 0.0f && dot < FOG_AREA_LENGTH && linedistsq < sq(FOG_AREA_WIDTH)){
|
||||
CVector fogcoors(xi, yi, aLights[i].coors.z + 1.0f);
|
||||
CVector fogcoors(xi, yi, aLights[i].coors.z + 10.0f);
|
||||
if(CWorld::ProcessVerticalLine(fogcoors, fogcoors.z - 20.0f,
|
||||
point, entity, true, false, false, false, true, false, nil)){
|
||||
// Now same check again in xyz
|
||||
@ -220,9 +240,9 @@ CPointLights::RenderFogEffect(void)
|
||||
intensity *= 1.0f - sq(Sqrt(linedistsq) / FOG_AREA_WIDTH);
|
||||
|
||||
if(CSprite::CalcScreenCoors(fogcoors, spriteCoors, &spritew, &spriteh, true)){
|
||||
float rotation = (CTimer::GetTimeInMilliseconds()&0x1FFF) * 2*3.14f / 0x1FFF;
|
||||
float rotation = (CTimer::GetTimeInMilliseconds()&0x1FFF) * 2*3.14f / 0x2000;
|
||||
float size = FogSizes[r>>1];
|
||||
CSprite::RenderOneXLUSprite_Rotate_Aspect(spriteCoors.x, spriteCoors.y, spriteCoors.z,
|
||||
CSprite::RenderBufferedOneXLUSprite_Rotate_Aspect(spriteCoors.x, spriteCoors.y, spriteCoors.z,
|
||||
spritew * size, spriteh * size,
|
||||
aLights[i].red * intensity, aLights[i].green * intensity, aLights[i].blue * intensity,
|
||||
intensity, 1/spriteCoors.z, rotation, 255);
|
||||
@ -234,9 +254,8 @@ CPointLights::RenderFogEffect(void)
|
||||
}
|
||||
|
||||
}else if(aLights[i].type == LIGHT_POINT || aLights[i].type == LIGHT_FOGONLY || aLights[i].type == LIGHT_FOGONLY_ALWAYS){
|
||||
if(CWorld::ProcessVerticalLine(aLights[i].coors, aLights[i].coors.z - 20.0f,
|
||||
point, entity, true, false, false, false, true, false, nil)){
|
||||
|
||||
float groundZ;
|
||||
if(ProcessVerticalLineUsingCache(aLights[i].coors, &groundZ)){
|
||||
xmin = aLights[i].coors.x - FOG_AREA_RADIUS;
|
||||
ymin = aLights[i].coors.y - FOG_AREA_RADIUS;
|
||||
xmax = aLights[i].coors.x + FOG_AREA_RADIUS;
|
||||
@ -267,11 +286,11 @@ CPointLights::RenderFogEffect(void)
|
||||
// more intensity the closer to light source
|
||||
intensity *= 1.0f - sq(lightdist / FOG_AREA_RADIUS);
|
||||
|
||||
CVector fogcoors(xi, yi, point.point.z + 1.6f);
|
||||
CVector fogcoors(xi, yi, groundZ + 1.6f);
|
||||
if(CSprite::CalcScreenCoors(fogcoors, spriteCoors, &spritew, &spriteh, true)){
|
||||
float rotation = (CTimer::GetTimeInMilliseconds()&0x3FFF) * 2*3.14f / 0x3FFF;
|
||||
float rotation = (CTimer::GetTimeInMilliseconds()&0x3FFF) * 2*3.14f / 0x4000;
|
||||
float size = FogSizes[r>>1];
|
||||
CSprite::RenderOneXLUSprite_Rotate_Aspect(spriteCoors.x, spriteCoors.y, spriteCoors.z,
|
||||
CSprite::RenderBufferedOneXLUSprite_Rotate_Aspect(spriteCoors.x, spriteCoors.y, spriteCoors.z,
|
||||
spritew * size, spriteh * size,
|
||||
aLights[i].red * intensity, aLights[i].green * intensity, aLights[i].blue * intensity,
|
||||
intensity, 1/spriteCoors.z, rotation, 255);
|
||||
@ -283,4 +302,27 @@ CPointLights::RenderFogEffect(void)
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
CSprite::FlushSpriteBuffer();
|
||||
}
|
||||
|
||||
bool
|
||||
CPointLights::ProcessVerticalLineUsingCache(CVector coors, float *groundZ)
|
||||
{
|
||||
for(int i = 0; i < ARRAY_SIZE(aCachedMapReads); i++)
|
||||
if(aCachedMapReads[i] == coors){
|
||||
*groundZ = aCachedMapReadResults[i];
|
||||
return true;
|
||||
}
|
||||
|
||||
CColPoint point;
|
||||
CEntity *entity;
|
||||
if(CWorld::ProcessVerticalLine(coors, coors.z - 20.0f, point, entity, true, false, false, false, true, false, nil)){
|
||||
aCachedMapReads[NextCachedValue] = coors;
|
||||
aCachedMapReadResults[NextCachedValue] = point.point.z;
|
||||
NextCachedValue = (NextCachedValue+1) % ARRAY_SIZE(aCachedMapReads);
|
||||
*groundZ = point.point.z;
|
||||
return true;
|
||||
}
|
||||
return false;
|
||||
}
|
||||
|
@ -20,6 +20,9 @@ class CPointLights
|
||||
public:
|
||||
static int16 NumLights;
|
||||
static CRegisteredPointLight aLights[NUMPOINTLIGHTS];
|
||||
static CVector aCachedMapReads[32];
|
||||
static float aCachedMapReadResults[32];
|
||||
static int32 NextCachedValue;
|
||||
|
||||
enum {
|
||||
LIGHT_POINT,
|
||||
@ -37,9 +40,11 @@ public:
|
||||
FOG_ALWAYS
|
||||
};
|
||||
|
||||
static void Init(void);
|
||||
static void InitPerFrame(void);
|
||||
static void AddLight(uint8 type, CVector coors, CVector dir, float radius, float red, float green, float blue, uint8 fogType, bool castExtraShadows);
|
||||
static float GenerateLightsAffectingObject(Const CVector *objCoors);
|
||||
static void RemoveLightsAffectingObject(void);
|
||||
static void RenderFogEffect(void);
|
||||
static bool ProcessVerticalLineUsingCache(CVector coors, float *groundZ);
|
||||
};
|
||||
|
@ -908,8 +908,13 @@ CRenderer::ScanSectorPoly(RwV2d *poly, int32 numVertices, void (*scanfunc)(CPtrL
|
||||
a2 = i;
|
||||
}
|
||||
}
|
||||
#ifdef FIX_BUGS
|
||||
y = Floor(miny);
|
||||
yend = Floor(maxy);
|
||||
#else
|
||||
y = miny;
|
||||
yend = maxy;
|
||||
#endif
|
||||
|
||||
// Go left in poly to find first edge b
|
||||
b2 = a2;
|
||||
@ -947,8 +952,8 @@ CRenderer::ScanSectorPoly(RwV2d *poly, int32 numVertices, void (*scanfunc)(CPtrL
|
||||
while(y <= yend && y < NUMSECTORS_Y){
|
||||
// scan one x-line
|
||||
if(y >= 0 && xstart < NUMSECTORS_X)
|
||||
for(x = xstart; x <= xend; x++)
|
||||
if(x >= 0 && x != NUMSECTORS_X)
|
||||
for(x = xstart; x <= xend && x != NUMSECTORS_X; x++)
|
||||
if(x >= 0)
|
||||
scanfunc(CWorld::GetSector(x, y)->m_lists);
|
||||
|
||||
// advance one scan line
|
||||
|
@ -8,17 +8,18 @@
|
||||
#include "World.h"
|
||||
#include "Vehicle.h"
|
||||
#include "ZoneCull.h"
|
||||
#include "Stats.h"
|
||||
#include "TxdStore.h"
|
||||
#include "RenderBuffer.h"
|
||||
#include "Rubbish.h"
|
||||
|
||||
#define RUBBISH_MAX_DIST (18.0f)
|
||||
#define RUBBISH_FADE_DIST (16.5f)
|
||||
//--MIAMI: file done
|
||||
|
||||
#define RUBBISH_MAX_DIST (23.0f)
|
||||
#define RUBBISH_FADE_DIST (20.0f)
|
||||
|
||||
RwTexture *gpRubbishTexture[4];
|
||||
RwImVertexIndex RubbishIndexList[6];
|
||||
RwImVertexIndex RubbishIndexList2[6]; // unused
|
||||
RwIm3DVertex RubbishVertices[4];
|
||||
bool CRubbish::bRubbishInvisible;
|
||||
int CRubbish::RubbishVisibility;
|
||||
COneSheet CRubbish::aSheets[NUM_RUBBISH_SHEETS];
|
||||
@ -52,12 +53,16 @@ CRubbish::Render(void)
|
||||
{
|
||||
int type;
|
||||
|
||||
if(RubbishVisibility == 0)
|
||||
return;
|
||||
|
||||
RwRenderStateSet(rwRENDERSTATEZWRITEENABLE, (void*)FALSE);
|
||||
RwRenderStateSet(rwRENDERSTATEVERTEXALPHAENABLE, (void*)TRUE);
|
||||
RwRenderStateSet(rwRENDERSTATEFOGENABLE, (void*)TRUE);
|
||||
|
||||
for(type = 0; type < 4; type++){
|
||||
RwRenderStateSet(rwRENDERSTATETEXTURERASTER, RwTextureGetRaster(gpRubbishTexture[type]));
|
||||
if(type < 3 || CStats::PamphletMissionPassed)
|
||||
RwRenderStateSet(rwRENDERSTATETEXTURERASTER, RwTextureGetRaster(gpRubbishTexture[type]));
|
||||
|
||||
TempBufferIndicesStored = 0;
|
||||
TempBufferVerticesStored = 0;
|
||||
@ -69,7 +74,7 @@ CRubbish::Render(void)
|
||||
if(sheet->m_state == 0)
|
||||
continue;
|
||||
|
||||
uint32 alpha = 128;
|
||||
uint32 alpha = 100;
|
||||
CVector pos;
|
||||
if(sheet->m_state == 1){
|
||||
pos = sheet->m_basePos;
|
||||
@ -82,7 +87,7 @@ CRubbish::Render(void)
|
||||
float t = (float)(CTimer::GetTimeInMilliseconds() - sheet->m_moveStart)/sheet->m_moveDuration;
|
||||
float f1 = sheet->m_isVisible ? 1.0f-t : 0.0f;
|
||||
float f2 = sheet->m_targetIsVisible ? t : 0.0f;
|
||||
alpha = 128 * (f1+f2);
|
||||
alpha = 100 * (f1+f2);
|
||||
}
|
||||
}
|
||||
|
||||
@ -92,17 +97,27 @@ CRubbish::Render(void)
|
||||
alpha -= alpha*(camDist-RUBBISH_FADE_DIST)/(RUBBISH_MAX_DIST-RUBBISH_FADE_DIST);
|
||||
alpha = (RubbishVisibility*alpha)/256;
|
||||
|
||||
float vx = Sin(sheet->m_angle) * 0.4f;
|
||||
float vy = Cos(sheet->m_angle) * 0.4f;
|
||||
float vx1, vy1, vx2, vy2;
|
||||
if(type == 0 || type == 1){
|
||||
vx1 = 0.9f*Sin(sheet->m_angle);
|
||||
vy1 = 0.9f*Cos(sheet->m_angle);
|
||||
vx2 = 0.3f*Cos(sheet->m_angle);
|
||||
vy2 = -0.3f*Sin(sheet->m_angle);
|
||||
}else{
|
||||
vx1 = 0.3f*Sin(sheet->m_angle);
|
||||
vy1 = 0.3f*Cos(sheet->m_angle);
|
||||
vx2 = 0.3f*Cos(sheet->m_angle);
|
||||
vy2 = -0.3f*Sin(sheet->m_angle);
|
||||
}
|
||||
|
||||
int v = TempBufferVerticesStored;
|
||||
RwIm3DVertexSetPos(&TempBufferRenderVertices[v+0], pos.x + vx, pos.y + vy, pos.z);
|
||||
RwIm3DVertexSetPos(&TempBufferRenderVertices[v+0], pos.x + vx1 + vx2, pos.y + vy1 + vy2, pos.z);
|
||||
RwIm3DVertexSetPos(&TempBufferRenderVertices[v+1], pos.x + vx1 - vx2, pos.y + vy1 - vy2, pos.z);
|
||||
RwIm3DVertexSetPos(&TempBufferRenderVertices[v+2], pos.x - vx1 + vx2, pos.y - vy1 + vy2, pos.z);
|
||||
RwIm3DVertexSetPos(&TempBufferRenderVertices[v+3], pos.x - vx1 - vx2, pos.y - vy1 - vy2, pos.z);
|
||||
RwIm3DVertexSetRGBA(&TempBufferRenderVertices[v+0], 255, 255, 255, alpha);
|
||||
RwIm3DVertexSetPos(&TempBufferRenderVertices[v+1], pos.x - vy, pos.y + vx, pos.z);
|
||||
RwIm3DVertexSetRGBA(&TempBufferRenderVertices[v+1], 255, 255, 255, alpha);
|
||||
RwIm3DVertexSetPos(&TempBufferRenderVertices[v+2], pos.x + vy, pos.y - vx, pos.z);
|
||||
RwIm3DVertexSetRGBA(&TempBufferRenderVertices[v+2], 255, 255, 255, alpha);
|
||||
RwIm3DVertexSetPos(&TempBufferRenderVertices[v+3], pos.x - vx, pos.y - vy, pos.z);
|
||||
RwIm3DVertexSetRGBA(&TempBufferRenderVertices[v+3], 255, 255, 255, alpha);
|
||||
RwIm3DVertexSetU(&TempBufferRenderVertices[v+0], 0.0f);
|
||||
RwIm3DVertexSetV(&TempBufferRenderVertices[v+0], 0.0f);
|
||||
@ -373,24 +388,6 @@ CRubbish::Init(void)
|
||||
EndMoversList.m_next = nil;
|
||||
EndMoversList.m_prev = &StartMoversList;
|
||||
|
||||
// unused
|
||||
RwIm3DVertexSetU(&RubbishVertices[0], 0.0f);
|
||||
RwIm3DVertexSetV(&RubbishVertices[0], 0.0f);
|
||||
RwIm3DVertexSetU(&RubbishVertices[1], 1.0f);
|
||||
RwIm3DVertexSetV(&RubbishVertices[1], 0.0f);
|
||||
RwIm3DVertexSetU(&RubbishVertices[2], 0.0f);
|
||||
RwIm3DVertexSetV(&RubbishVertices[2], 1.0f);
|
||||
RwIm3DVertexSetU(&RubbishVertices[3], 1.0f);
|
||||
RwIm3DVertexSetV(&RubbishVertices[3], 1.0f);
|
||||
|
||||
// unused
|
||||
RubbishIndexList2[0] = 0;
|
||||
RubbishIndexList2[1] = 2;
|
||||
RubbishIndexList2[2] = 1;
|
||||
RubbishIndexList2[3] = 1;
|
||||
RubbishIndexList2[4] = 2;
|
||||
RubbishIndexList2[5] = 3;
|
||||
|
||||
RubbishIndexList[0] = 0;
|
||||
RubbishIndexList[1] = 1;
|
||||
RubbishIndexList[2] = 2;
|
||||
@ -414,19 +411,11 @@ void
|
||||
CRubbish::Shutdown(void)
|
||||
{
|
||||
RwTextureDestroy(gpRubbishTexture[0]);
|
||||
#ifdef GTA3_1_1_PATCH
|
||||
gpRubbishTexture[0] = nil;
|
||||
#endif
|
||||
RwTextureDestroy(gpRubbishTexture[1]);
|
||||
#ifdef GTA3_1_1_PATCH
|
||||
gpRubbishTexture[1] = nil;
|
||||
#endif
|
||||
RwTextureDestroy(gpRubbishTexture[2]);
|
||||
#ifdef GTA3_1_1_PATCH
|
||||
gpRubbishTexture[2] = nil;
|
||||
#endif
|
||||
RwTextureDestroy(gpRubbishTexture[3]);
|
||||
#ifdef GTA3_1_1_PATCH
|
||||
gpRubbishTexture[3] = nil;
|
||||
#endif
|
||||
}
|
||||
|
@ -160,7 +160,7 @@ CShadowCamera::SetCenter(RwV3d *center)
|
||||
ASSERT(m_pCamera != nil);
|
||||
|
||||
RwFrame *camFrame = RwCameraGetFrame(m_pCamera);
|
||||
RwMatrix *camMatrix = RwFrameGetMatrix(camFrame);
|
||||
RwMatrix *camMatrix = RwFrameGetMatrix(camFrame);
|
||||
|
||||
*RwMatrixGetPos(camMatrix) = *center;
|
||||
|
||||
@ -188,7 +188,7 @@ CShadowCamera::Update(RpClump *clump)
|
||||
|
||||
if ( RwCameraBeginUpdate(m_pCamera) )
|
||||
{
|
||||
geometry = GetFirstAtomic(clump)->geometry;
|
||||
geometry = RpAtomicGetGeometry(GetFirstAtomic(clump));
|
||||
ASSERT(geometry != nil);
|
||||
|
||||
flags = RpGeometryGetFlags(geometry);
|
||||
|
@ -236,9 +236,9 @@ CShadows::StoreStaticShadow(uint32 nID, uint8 ShadowType, RwTexture *pTexture, C
|
||||
|
||||
float fDistToCamSqr = (*pPosn - TheCamera.GetPosition()).MagnitudeSqr2D();
|
||||
|
||||
if ( SQR(fDrawDistance) > fDistToCamSqr || fDistToCamSqr == 0.0f )
|
||||
if ( SQR(fDrawDistance) > fDistToCamSqr || fDrawDistance == 0.0f )
|
||||
{
|
||||
if ( fDistToCamSqr != 0.0f )
|
||||
if ( fDrawDistance != 0.0f )
|
||||
{
|
||||
float fDistToCam = Sqrt(fDistToCamSqr);
|
||||
|
||||
@ -277,8 +277,10 @@ CShadows::StoreStaticShadow(uint32 nID, uint8 ShadowType, RwTexture *pTexture, C
|
||||
aStaticShadows[nSlot].m_fScale = fScale;
|
||||
aStaticShadows[nSlot].m_bTemp = bTempShadow;
|
||||
aStaticShadows[nSlot].m_nTimeCreated = CTimer::GetTimeInMilliseconds();
|
||||
|
||||
return true;
|
||||
}
|
||||
else if ( Abs(pPosn->x - aStaticShadows[nSlot].m_vecPosn.x) < 0.05f
|
||||
else if ( Abs(pPosn->x - aStaticShadows[nSlot].m_vecPosn.x) < 0.05f
|
||||
&& Abs(pPosn->y - aStaticShadows[nSlot].m_vecPosn.y) < 0.05f
|
||||
&& Abs(pPosn->z - aStaticShadows[nSlot].m_vecPosn.z) < 2.0f
|
||||
|
||||
@ -299,7 +301,7 @@ CShadows::StoreStaticShadow(uint32 nID, uint8 ShadowType, RwTexture *pTexture, C
|
||||
aStaticShadows[nSlot].m_bTemp = bTempShadow;
|
||||
aStaticShadows[nSlot].m_nTimeCreated = CTimer::GetTimeInMilliseconds();
|
||||
|
||||
return false;
|
||||
return true;
|
||||
}
|
||||
else
|
||||
{
|
||||
@ -585,7 +587,7 @@ CShadows::StoreShadowForVehicle(CVehicle *pCar, VEH_SHD_TYPE type)
|
||||
CarPos.x -= pCar->GetForward().x * (((fVehicleHeight/2) - pCar->GetColModel()->boundingBox.max.y)*size);
|
||||
CarPos.y -= pCar->GetForward().y * (((fVehicleHeight/2) - pCar->GetColModel()->boundingBox.max.y)*size);
|
||||
|
||||
RwTexture *tex;
|
||||
RwTexture *tex = gpShadowCarTex;
|
||||
switch ( type )
|
||||
{
|
||||
case VEH_SHD_TYPE_BIKE:
|
||||
@ -625,8 +627,8 @@ CShadows::StoreShadowForVehicle(CVehicle *pCar, VEH_SHD_TYPE type)
|
||||
|
||||
float frontx = pCar->GetForward().x;
|
||||
float fronty = pCar->GetForward().y;
|
||||
float sidex = pCar->GetRight().x;
|
||||
float sidey = pCar->GetRight().y;
|
||||
float sidex = pCar->GetRight().x;
|
||||
float sidey = pCar->GetRight().y;
|
||||
|
||||
switch ( type )
|
||||
{
|
||||
@ -769,7 +771,7 @@ CShadows::StoreCarLightShadow(CAutomobile *pCar, int32 nID, RwTexture *pTexture,
|
||||
}
|
||||
|
||||
|
||||
#if 1
|
||||
#ifdef USE_CUTSCENE_SHADOW_FOR_PED
|
||||
void
|
||||
StoreShadowForCutscenePedObject(CPed *pObject, float fDisplacementX, float fDisplacementY,
|
||||
float fFrontX, float fFrontY, float fSideX, float fSideY)
|
||||
@ -853,7 +855,7 @@ CShadows::StoreShadowForPed(CPed *pPed, float fDisplacementX, float fDisplacemen
|
||||
{
|
||||
if ( CTimeCycle::GetShadowStrength() != 0 )
|
||||
{
|
||||
#ifndef LIBRW
|
||||
#ifdef USE_CUTSCENE_SHADOW_FOR_PED
|
||||
CCutsceneShadow *pShadow = pPed->m_pRTShadow;
|
||||
|
||||
if (pShadow)
|
||||
@ -864,7 +866,7 @@ CShadows::StoreShadowForPed(CPed *pPed, float fDisplacementX, float fDisplacemen
|
||||
}
|
||||
|
||||
return;
|
||||
#endif
|
||||
#endif
|
||||
|
||||
StoreShadowForPedObject(pPed,
|
||||
fDisplacementX, fDisplacementY,
|
||||
@ -920,6 +922,9 @@ void
|
||||
CShadows::StoreShadowForCutscenePedObject(CCutsceneObject *pObject, float fDisplacementX, float fDisplacementY,
|
||||
float fFrontX, float fFrontY, float fSideX, float fSideY)
|
||||
{
|
||||
#ifdef DISABLE_CUTSCENE_SHADOWS
|
||||
return;
|
||||
#endif
|
||||
ASSERT(pObject != nil);
|
||||
|
||||
CCutsceneShadow *shadow = pObject->m_pShadow;
|
||||
|
@ -6,6 +6,8 @@
|
||||
#include "Replay.h"
|
||||
#include "Skidmarks.h"
|
||||
|
||||
//--MIAMI: file done
|
||||
|
||||
CSkidmark CSkidmarks::aSkidmarks[NUMSKIDMARKS];
|
||||
|
||||
RwImVertexIndex SkidmarkIndexList[SKIDMARK_LENGTH * 6];
|
||||
@ -37,13 +39,6 @@ CSkidmarks::Init(void)
|
||||
SkidmarkIndexList[i*6+5] = ix+3;
|
||||
ix += 2;
|
||||
}
|
||||
|
||||
for(i = 0; i < SKIDMARK_LENGTH; i++){
|
||||
RwIm3DVertexSetU(&SkidmarkVertices[i*2 + 0], 0.0f);
|
||||
RwIm3DVertexSetV(&SkidmarkVertices[i*2 + 0], i*5.01f);
|
||||
RwIm3DVertexSetU(&SkidmarkVertices[i*2 + 1], 1.0f);
|
||||
RwIm3DVertexSetV(&SkidmarkVertices[i*2 + 1], i*5.01f);
|
||||
}
|
||||
}
|
||||
|
||||
void
|
||||
@ -141,8 +136,12 @@ CSkidmarks::Render(void)
|
||||
p2.y -= aSkidmarks[i].m_sideY[j];
|
||||
RwIm3DVertexSetRGBA(&SkidmarkVertices[j*2+0], color.red, color.green, color.blue, alpha);
|
||||
RwIm3DVertexSetPos(&SkidmarkVertices[j*2+0], p1.x, p1.y, p1.z+0.1f);
|
||||
RwIm3DVertexSetU(&SkidmarkVertices[j*2+0], 0.0f);
|
||||
RwIm3DVertexSetV(&SkidmarkVertices[j*2+0], j*5.01f);
|
||||
RwIm3DVertexSetRGBA(&SkidmarkVertices[j*2+1], color.red, color.green, color.blue, alpha);
|
||||
RwIm3DVertexSetPos(&SkidmarkVertices[j*2+1], p2.x, p2.y, p2.z+0.1f);
|
||||
RwIm3DVertexSetU(&SkidmarkVertices[j*2+1], 1.0f);
|
||||
RwIm3DVertexSetV(&SkidmarkVertices[j*2+1], j*5.01f);
|
||||
}
|
||||
|
||||
LittleTest();
|
||||
|
@ -21,6 +21,9 @@
|
||||
#include "Camera.h"
|
||||
#include "Shadows.h"
|
||||
#include "main.h"
|
||||
#include "ColStore.h"
|
||||
#include "Coronas.h"
|
||||
#include "Script.h"
|
||||
|
||||
RwIm3DVertex StreakVertices[4];
|
||||
RwImVertexIndex StreakIndexList[12];
|
||||
@ -370,6 +373,8 @@ MarkerAtomicCB(RpAtomic *atomic, void *data)
|
||||
return atomic;
|
||||
}
|
||||
|
||||
// --MIAMI: C3dMarker and C3dMarkers done
|
||||
|
||||
bool
|
||||
C3dMarker::AddMarker(uint32 identifier, uint16 type, float fSize, uint8 r, uint8 g, uint8 b, uint8 a, uint16 pulsePeriod, float pulseFraction, int16 rotateRate)
|
||||
{
|
||||
@ -414,6 +419,7 @@ C3dMarker::DeleteMarkerObject()
|
||||
m_nIdentifier = 0;
|
||||
m_nStartTime = 0;
|
||||
m_bIsUsed = false;
|
||||
m_bFindZOnNextPlacement = false;
|
||||
m_nType = MARKERTYPE_INVALID;
|
||||
|
||||
frame = RpAtomicGetFrame(m_pAtomic);
|
||||
@ -457,6 +463,7 @@ C3dMarkers::Init()
|
||||
m_aMarkerArray[i].m_pAtomic = nil;
|
||||
m_aMarkerArray[i].m_nType = MARKERTYPE_INVALID;
|
||||
m_aMarkerArray[i].m_bIsUsed = false;
|
||||
m_aMarkerArray[i].m_bFindZOnNextPlacement = false;
|
||||
m_aMarkerArray[i].m_nIdentifier = 0;
|
||||
m_aMarkerArray[i].m_Color.red = 255;
|
||||
m_aMarkerArray[i].m_Color.green = 255;
|
||||
@ -502,8 +509,15 @@ C3dMarkers::Render()
|
||||
ActivateDirectional();
|
||||
for (int i = 0; i < NUM3DMARKERS; i++) {
|
||||
if (m_aMarkerArray[i].m_bIsUsed) {
|
||||
if (m_aMarkerArray[i].m_fCameraRange < 120.0f)
|
||||
if (m_aMarkerArray[i].m_fCameraRange < 150.0f) {
|
||||
m_aMarkerArray[i].Render();
|
||||
if (m_aMarkerArray[i].m_nType == MARKERTYPE_ARROW) {
|
||||
CCoronas::RegisterCorona((uintptr)&m_aMarkerArray[i],
|
||||
SPHERE_MARKER_R, SPHERE_MARKER_G, SPHERE_MARKER_B, 192,
|
||||
m_aMarkerArray[i].m_Matrix.GetPosition(), 1.2f * m_aMarkerArray[i].m_fSize, 50.0f * TheCamera.LODDistMultiplier,
|
||||
CCoronas::TYPE_STAR, CCoronas::FLARE_NONE, CCoronas::REFLECTION_OFF, CCoronas::LOSCHECK_OFF, CCoronas::STREAK_ON, 0.0f, false);
|
||||
}
|
||||
}
|
||||
NumActiveMarkers++;
|
||||
m_aMarkerArray[i].m_bIsUsed = false;
|
||||
} else if (m_aMarkerArray[i].m_pAtomic != nil) {
|
||||
@ -516,9 +530,9 @@ C3dMarker *
|
||||
C3dMarkers::PlaceMarker(uint32 identifier, uint16 type, CVector &pos, float size, uint8 r, uint8 g, uint8 b, uint8 a, uint16 pulsePeriod, float pulseFraction, int16 rotateRate)
|
||||
{
|
||||
C3dMarker *pMarker;
|
||||
|
||||
CVector2D playerPos = FindPlayerCentreOfWorld(0);
|
||||
pMarker = nil;
|
||||
float dist = Sqrt((pos.x - FindPlayerCentreOfWorld(0).x) * (pos.x - FindPlayerCentreOfWorld(0).x) + (pos.y - FindPlayerCentreOfWorld(0).y) * (pos.y - FindPlayerCentreOfWorld(0).y));
|
||||
float dist = ((CVector2D)pos - playerPos).Magnitude();
|
||||
|
||||
if (type != MARKERTYPE_ARROW && type != MARKERTYPE_CYLINDER) return nil;
|
||||
|
||||
@ -591,6 +605,15 @@ C3dMarkers::PlaceMarker(uint32 identifier, uint16 type, CVector &pos, float size
|
||||
}
|
||||
if (type == MARKERTYPE_ARROW)
|
||||
pMarker->m_Matrix.GetPosition() = pos;
|
||||
|
||||
if (pMarker->m_bFindZOnNextPlacement) {
|
||||
if ((playerPos - pos).MagnitudeSqr() < sq(100.f) && CColStore::HasCollisionLoaded(CVector2D(pos))) {
|
||||
float z = CWorld::FindGroundZFor3DCoord(pos.x, pos.y, pos.z + 1.0f, nil);
|
||||
if (z != 0.0f)
|
||||
pMarker->m_Matrix.GetPosition().z = z - 0.05f * size;
|
||||
pMarker->m_bFindZOnNextPlacement = false;
|
||||
}
|
||||
}
|
||||
pMarker->m_bIsUsed = true;
|
||||
return pMarker;
|
||||
}
|
||||
@ -600,9 +623,14 @@ C3dMarkers::PlaceMarker(uint32 identifier, uint16 type, CVector &pos, float size
|
||||
|
||||
pMarker->AddMarker(identifier, type, size, r, g, b, a, pulsePeriod, pulseFraction, rotateRate);
|
||||
if (type == MARKERTYPE_CYLINDER || type == MARKERTYPE_0 || type == MARKERTYPE_2) {
|
||||
float z = CWorld::FindGroundZFor3DCoord(pos.x, pos.y, pos.z + 1.0f, nil);
|
||||
if (z != 0.0f)
|
||||
pos.z = z - 0.05f * size;
|
||||
if ((playerPos - pos).MagnitudeSqr() < sq(100.f) && CColStore::HasCollisionLoaded(CVector2D(pos))) {
|
||||
float z = CWorld::FindGroundZFor3DCoord(pos.x, pos.y, pos.z + 1.0f, nil);
|
||||
if (z != 0.0f)
|
||||
pos.z = z - 0.05f * size;
|
||||
pMarker->m_bFindZOnNextPlacement = false;
|
||||
} else {
|
||||
pMarker->m_bFindZOnNextPlacement = true;
|
||||
}
|
||||
}
|
||||
pMarker->m_Matrix.SetTranslate(pos.x, pos.y, pos.z);
|
||||
if (type == MARKERTYPE_2) {
|
||||
|
@ -79,6 +79,7 @@ public:
|
||||
RpMaterial *m_pMaterial;
|
||||
uint16 m_nType;
|
||||
bool m_bIsUsed;
|
||||
bool m_bFindZOnNextPlacement;
|
||||
uint32 m_nIdentifier;
|
||||
RwRGBA m_Color;
|
||||
uint16 m_nPulsePeriod;
|
||||
|
@ -9,6 +9,7 @@
|
||||
|
||||
float CSprite2d::RecipNearClip;
|
||||
float CSprite2d::NearScreenZ;
|
||||
float CSprite2d::NearCamZ;
|
||||
int CSprite2d::nextBufferVertex;
|
||||
int CSprite2d::nextBufferIndex;
|
||||
RwIm2DVertex CSprite2d::maVertices[8];
|
||||
@ -26,6 +27,9 @@ CSprite2d::InitPerFrame(void)
|
||||
nextBufferIndex = 0;
|
||||
RecipNearClip = 1.0f / RwCameraGetNearClipPlane(Scene.camera);
|
||||
NearScreenZ = RwIm2DGetNearScreenZ();
|
||||
// not original but you're supposed to set camera z too
|
||||
// wrapping all this in FIX_BUGS is too ugly
|
||||
NearCamZ = RwCameraGetNearClipPlane(Scene.camera);
|
||||
}
|
||||
void
|
||||
CSprite2d::Delete(void)
|
||||
@ -71,7 +75,7 @@ CSprite2d::SetRenderState(void)
|
||||
void
|
||||
CSprite2d::Draw(float x, float y, float w, float h, const CRGBA &col)
|
||||
{
|
||||
SetVertices(CRect(x, y, x + w, y + h), col, col, col, col, 0);
|
||||
SetVertices(CRect(x, y, x + w, y + h), col, col, col, col);
|
||||
SetRenderState();
|
||||
RwIm2DRenderPrimitive(rwPRIMTYPETRIFAN, CSprite2d::maVertices, 4);
|
||||
}
|
||||
@ -79,7 +83,7 @@ CSprite2d::Draw(float x, float y, float w, float h, const CRGBA &col)
|
||||
void
|
||||
CSprite2d::Draw(const CRect &rect, const CRGBA &col)
|
||||
{
|
||||
SetVertices(rect, col, col, col, col, 0);
|
||||
SetVertices(rect, col, col, col, col);
|
||||
SetRenderState();
|
||||
RwIm2DRenderPrimitive(rwPRIMTYPETRIFAN, CSprite2d::maVertices, 4);
|
||||
}
|
||||
@ -96,7 +100,7 @@ CSprite2d::Draw(const CRect &rect, const CRGBA &col,
|
||||
void
|
||||
CSprite2d::Draw(const CRect &rect, const CRGBA &c0, const CRGBA &c1, const CRGBA &c2, const CRGBA &c3)
|
||||
{
|
||||
SetVertices(rect, c0, c1, c2, c3, 0);
|
||||
SetVertices(rect, c0, c1, c2, c3);
|
||||
SetRenderState();
|
||||
RwIm2DRenderPrimitive(rwPRIMTYPETRIFAN, CSprite2d::maVertices, 4);
|
||||
}
|
||||
@ -114,178 +118,149 @@ CSprite2d::Draw(float x1, float y1, float x2, float y2, float x3, float y3, floa
|
||||
// | |
|
||||
// 0---1
|
||||
void
|
||||
CSprite2d::SetVertices(const CRect &r, const CRGBA &c0, const CRGBA &c1, const CRGBA &c2, const CRGBA &c3, uint32 far)
|
||||
CSprite2d::SetVertices(const CRect &r, const CRGBA &c0, const CRGBA &c1, const CRGBA &c2, const CRGBA &c3)
|
||||
{
|
||||
float screenz, z, recipz;
|
||||
|
||||
if(far){
|
||||
screenz = RwIm2DGetFarScreenZ();
|
||||
z = RwCameraGetFarClipPlane(Scene.camera);
|
||||
}else{
|
||||
screenz = NearScreenZ;
|
||||
z = 1.0f/RecipNearClip;
|
||||
}
|
||||
recipz = 1.0f/z;
|
||||
|
||||
// This is what we draw:
|
||||
// 0---1
|
||||
// | / |
|
||||
// 3---2
|
||||
RwIm2DVertexSetScreenX(&maVertices[0], r.left);
|
||||
RwIm2DVertexSetScreenY(&maVertices[0], r.top);
|
||||
RwIm2DVertexSetScreenZ(&maVertices[0], screenz);
|
||||
RwIm2DVertexSetCameraZ(&maVertices[0], z);
|
||||
RwIm2DVertexSetRecipCameraZ(&maVertices[0], recipz);
|
||||
RwIm2DVertexSetScreenZ(&maVertices[0], NearScreenZ);
|
||||
RwIm2DVertexSetCameraZ(&maVertices[0], NearCamZ);
|
||||
RwIm2DVertexSetRecipCameraZ(&maVertices[0], RecipNearClip);
|
||||
RwIm2DVertexSetIntRGBA(&maVertices[0], c2.r, c2.g, c2.b, c2.a);
|
||||
RwIm2DVertexSetU(&maVertices[0], 0.0f, recipz);
|
||||
RwIm2DVertexSetV(&maVertices[0], 0.0f, recipz);
|
||||
RwIm2DVertexSetU(&maVertices[0], 0.0f, RecipNearClip);
|
||||
RwIm2DVertexSetV(&maVertices[0], 0.0f, RecipNearClip);
|
||||
|
||||
RwIm2DVertexSetScreenX(&maVertices[1], r.right);
|
||||
RwIm2DVertexSetScreenY(&maVertices[1], r.top);
|
||||
RwIm2DVertexSetScreenZ(&maVertices[1], screenz);
|
||||
RwIm2DVertexSetCameraZ(&maVertices[1], z);
|
||||
RwIm2DVertexSetRecipCameraZ(&maVertices[1], recipz);
|
||||
RwIm2DVertexSetScreenZ(&maVertices[1], NearScreenZ);
|
||||
RwIm2DVertexSetCameraZ(&maVertices[1], NearCamZ);
|
||||
RwIm2DVertexSetRecipCameraZ(&maVertices[1], RecipNearClip);
|
||||
RwIm2DVertexSetIntRGBA(&maVertices[1], c3.r, c3.g, c3.b, c3.a);
|
||||
RwIm2DVertexSetU(&maVertices[1], 1.0f, recipz);
|
||||
RwIm2DVertexSetV(&maVertices[1], 0.0f, recipz);
|
||||
RwIm2DVertexSetU(&maVertices[1], 1.0f, RecipNearClip);
|
||||
RwIm2DVertexSetV(&maVertices[1], 0.0f, RecipNearClip);
|
||||
|
||||
RwIm2DVertexSetScreenX(&maVertices[2], r.right);
|
||||
RwIm2DVertexSetScreenY(&maVertices[2], r.bottom);
|
||||
RwIm2DVertexSetScreenZ(&maVertices[2], screenz);
|
||||
RwIm2DVertexSetCameraZ(&maVertices[2], z);
|
||||
RwIm2DVertexSetRecipCameraZ(&maVertices[2], recipz);
|
||||
RwIm2DVertexSetScreenZ(&maVertices[2], NearScreenZ);
|
||||
RwIm2DVertexSetCameraZ(&maVertices[2], NearCamZ);
|
||||
RwIm2DVertexSetRecipCameraZ(&maVertices[2], RecipNearClip);
|
||||
RwIm2DVertexSetIntRGBA(&maVertices[2], c1.r, c1.g, c1.b, c1.a);
|
||||
RwIm2DVertexSetU(&maVertices[2], 1.0f, recipz);
|
||||
RwIm2DVertexSetV(&maVertices[2], 1.0f, recipz);
|
||||
RwIm2DVertexSetU(&maVertices[2], 1.0f, RecipNearClip);
|
||||
RwIm2DVertexSetV(&maVertices[2], 1.0f, RecipNearClip);
|
||||
|
||||
RwIm2DVertexSetScreenX(&maVertices[3], r.left);
|
||||
RwIm2DVertexSetScreenY(&maVertices[3], r.bottom);
|
||||
RwIm2DVertexSetScreenZ(&maVertices[3], screenz);
|
||||
RwIm2DVertexSetCameraZ(&maVertices[3], z);
|
||||
RwIm2DVertexSetRecipCameraZ(&maVertices[3], recipz);
|
||||
RwIm2DVertexSetScreenZ(&maVertices[3], NearScreenZ);
|
||||
RwIm2DVertexSetCameraZ(&maVertices[3], NearCamZ);
|
||||
RwIm2DVertexSetRecipCameraZ(&maVertices[3], RecipNearClip);
|
||||
RwIm2DVertexSetIntRGBA(&maVertices[3], c0.r, c0.g, c0.b, c0.a);
|
||||
RwIm2DVertexSetU(&maVertices[3], 0.0f, recipz);
|
||||
RwIm2DVertexSetV(&maVertices[3], 1.0f, recipz);
|
||||
RwIm2DVertexSetU(&maVertices[3], 0.0f, RecipNearClip);
|
||||
RwIm2DVertexSetV(&maVertices[3], 1.0f, RecipNearClip);
|
||||
}
|
||||
|
||||
void
|
||||
CSprite2d::SetVertices(const CRect &r, const CRGBA &c0, const CRGBA &c1, const CRGBA &c2, const CRGBA &c3,
|
||||
float u0, float v0, float u1, float v1, float u3, float v3, float u2, float v2)
|
||||
{
|
||||
float screenz, z, recipz;
|
||||
|
||||
screenz = NearScreenZ;
|
||||
z = 1.0f/RecipNearClip;
|
||||
recipz = 1.0f/z;
|
||||
|
||||
// This is what we draw:
|
||||
// 0---1
|
||||
// | / |
|
||||
// 3---2
|
||||
RwIm2DVertexSetScreenX(&maVertices[0], r.left);
|
||||
RwIm2DVertexSetScreenY(&maVertices[0], r.top);
|
||||
RwIm2DVertexSetScreenZ(&maVertices[0], screenz);
|
||||
RwIm2DVertexSetCameraZ(&maVertices[0], z);
|
||||
RwIm2DVertexSetRecipCameraZ(&maVertices[0], recipz);
|
||||
RwIm2DVertexSetScreenZ(&maVertices[0], NearScreenZ);
|
||||
RwIm2DVertexSetCameraZ(&maVertices[0], NearCamZ);
|
||||
RwIm2DVertexSetRecipCameraZ(&maVertices[0], RecipNearClip);
|
||||
RwIm2DVertexSetIntRGBA(&maVertices[0], c2.r, c2.g, c2.b, c2.a);
|
||||
RwIm2DVertexSetU(&maVertices[0], u0, recipz);
|
||||
RwIm2DVertexSetV(&maVertices[0], v0, recipz);
|
||||
RwIm2DVertexSetU(&maVertices[0], u0, RecipNearClip);
|
||||
RwIm2DVertexSetV(&maVertices[0], v0, RecipNearClip);
|
||||
|
||||
RwIm2DVertexSetScreenX(&maVertices[1], r.right);
|
||||
RwIm2DVertexSetScreenY(&maVertices[1], r.top);
|
||||
RwIm2DVertexSetScreenZ(&maVertices[1], screenz);
|
||||
RwIm2DVertexSetCameraZ(&maVertices[1], z);
|
||||
RwIm2DVertexSetRecipCameraZ(&maVertices[1], recipz);
|
||||
RwIm2DVertexSetScreenZ(&maVertices[1], NearScreenZ);
|
||||
RwIm2DVertexSetCameraZ(&maVertices[1], NearCamZ);
|
||||
RwIm2DVertexSetRecipCameraZ(&maVertices[1], RecipNearClip);
|
||||
RwIm2DVertexSetIntRGBA(&maVertices[1], c3.r, c3.g, c3.b, c3.a);
|
||||
RwIm2DVertexSetU(&maVertices[1], u1, recipz);
|
||||
RwIm2DVertexSetV(&maVertices[1], v1, recipz);
|
||||
RwIm2DVertexSetU(&maVertices[1], u1, RecipNearClip);
|
||||
RwIm2DVertexSetV(&maVertices[1], v1, RecipNearClip);
|
||||
|
||||
RwIm2DVertexSetScreenX(&maVertices[2], r.right);
|
||||
RwIm2DVertexSetScreenY(&maVertices[2], r.bottom);
|
||||
RwIm2DVertexSetScreenZ(&maVertices[2], screenz);
|
||||
RwIm2DVertexSetCameraZ(&maVertices[2], z);
|
||||
RwIm2DVertexSetRecipCameraZ(&maVertices[2], recipz);
|
||||
RwIm2DVertexSetScreenZ(&maVertices[2], NearScreenZ);
|
||||
RwIm2DVertexSetCameraZ(&maVertices[2], NearCamZ);
|
||||
RwIm2DVertexSetRecipCameraZ(&maVertices[2], RecipNearClip);
|
||||
RwIm2DVertexSetIntRGBA(&maVertices[2], c1.r, c1.g, c1.b, c1.a);
|
||||
RwIm2DVertexSetU(&maVertices[2], u2, recipz);
|
||||
RwIm2DVertexSetV(&maVertices[2], v2, recipz);
|
||||
RwIm2DVertexSetU(&maVertices[2], u2, RecipNearClip);
|
||||
RwIm2DVertexSetV(&maVertices[2], v2, RecipNearClip);
|
||||
|
||||
RwIm2DVertexSetScreenX(&maVertices[3], r.left);
|
||||
RwIm2DVertexSetScreenY(&maVertices[3], r.bottom);
|
||||
RwIm2DVertexSetScreenZ(&maVertices[3], screenz);
|
||||
RwIm2DVertexSetCameraZ(&maVertices[3], z);
|
||||
RwIm2DVertexSetRecipCameraZ(&maVertices[3], recipz);
|
||||
RwIm2DVertexSetScreenZ(&maVertices[3], NearScreenZ);
|
||||
RwIm2DVertexSetCameraZ(&maVertices[3], NearCamZ);
|
||||
RwIm2DVertexSetRecipCameraZ(&maVertices[3], RecipNearClip);
|
||||
RwIm2DVertexSetIntRGBA(&maVertices[3], c0.r, c0.g, c0.b, c0.a);
|
||||
RwIm2DVertexSetU(&maVertices[3], u3, recipz);
|
||||
RwIm2DVertexSetV(&maVertices[3], v3, recipz);
|
||||
RwIm2DVertexSetU(&maVertices[3], u3, RecipNearClip);
|
||||
RwIm2DVertexSetV(&maVertices[3], v3, RecipNearClip);
|
||||
}
|
||||
|
||||
void
|
||||
CSprite2d::SetVertices(float x1, float y1, float x2, float y2, float x3, float y3, float x4, float y4,
|
||||
const CRGBA &c0, const CRGBA &c1, const CRGBA &c2, const CRGBA &c3)
|
||||
{
|
||||
float screenz, recipz;
|
||||
float z = RwCameraGetNearClipPlane(Scene.camera); // not done by game
|
||||
|
||||
screenz = NearScreenZ;
|
||||
recipz = RecipNearClip;
|
||||
|
||||
RwIm2DVertexSetScreenX(&maVertices[0], x3);
|
||||
RwIm2DVertexSetScreenY(&maVertices[0], y3);
|
||||
RwIm2DVertexSetScreenZ(&maVertices[0], screenz);
|
||||
RwIm2DVertexSetCameraZ(&maVertices[0], z);
|
||||
RwIm2DVertexSetRecipCameraZ(&maVertices[0], recipz);
|
||||
RwIm2DVertexSetScreenZ(&maVertices[0], NearScreenZ);
|
||||
RwIm2DVertexSetCameraZ(&maVertices[0], NearCamZ);
|
||||
RwIm2DVertexSetRecipCameraZ(&maVertices[0], RecipNearClip);
|
||||
RwIm2DVertexSetIntRGBA(&maVertices[0], c2.r, c2.g, c2.b, c2.a);
|
||||
RwIm2DVertexSetU(&maVertices[0], 0.0f, recipz);
|
||||
RwIm2DVertexSetV(&maVertices[0], 0.0f, recipz);
|
||||
RwIm2DVertexSetU(&maVertices[0], 0.0f, RecipNearClip);
|
||||
RwIm2DVertexSetV(&maVertices[0], 0.0f, RecipNearClip);
|
||||
|
||||
RwIm2DVertexSetScreenX(&maVertices[1], x4);
|
||||
RwIm2DVertexSetScreenY(&maVertices[1], y4);
|
||||
RwIm2DVertexSetScreenZ(&maVertices[1], screenz);
|
||||
RwIm2DVertexSetCameraZ(&maVertices[1], z);
|
||||
RwIm2DVertexSetRecipCameraZ(&maVertices[1], recipz);
|
||||
RwIm2DVertexSetScreenZ(&maVertices[1], NearScreenZ);
|
||||
RwIm2DVertexSetCameraZ(&maVertices[1], NearCamZ);
|
||||
RwIm2DVertexSetRecipCameraZ(&maVertices[1], RecipNearClip);
|
||||
RwIm2DVertexSetIntRGBA(&maVertices[1], c3.r, c3.g, c3.b, c3.a);
|
||||
RwIm2DVertexSetU(&maVertices[1], 1.0f, recipz);
|
||||
RwIm2DVertexSetV(&maVertices[1], 0.0f, recipz);
|
||||
RwIm2DVertexSetU(&maVertices[1], 1.0f, RecipNearClip);
|
||||
RwIm2DVertexSetV(&maVertices[1], 0.0f, RecipNearClip);
|
||||
|
||||
RwIm2DVertexSetScreenX(&maVertices[2], x2);
|
||||
RwIm2DVertexSetScreenY(&maVertices[2], y2);
|
||||
RwIm2DVertexSetScreenZ(&maVertices[2], screenz);
|
||||
RwIm2DVertexSetCameraZ(&maVertices[2], z);
|
||||
RwIm2DVertexSetRecipCameraZ(&maVertices[2], recipz);
|
||||
RwIm2DVertexSetScreenZ(&maVertices[2], NearScreenZ);
|
||||
RwIm2DVertexSetCameraZ(&maVertices[2], NearCamZ);
|
||||
RwIm2DVertexSetRecipCameraZ(&maVertices[2], RecipNearClip);
|
||||
RwIm2DVertexSetIntRGBA(&maVertices[2], c1.r, c1.g, c1.b, c1.a);
|
||||
RwIm2DVertexSetU(&maVertices[2], 1.0f, recipz);
|
||||
RwIm2DVertexSetV(&maVertices[2], 1.0f, recipz);
|
||||
RwIm2DVertexSetU(&maVertices[2], 1.0f, RecipNearClip);
|
||||
RwIm2DVertexSetV(&maVertices[2], 1.0f, RecipNearClip);
|
||||
|
||||
RwIm2DVertexSetScreenX(&maVertices[3], x1);
|
||||
RwIm2DVertexSetScreenY(&maVertices[3], y1);
|
||||
RwIm2DVertexSetScreenZ(&maVertices[3], screenz);
|
||||
RwIm2DVertexSetCameraZ(&maVertices[3], z);
|
||||
RwIm2DVertexSetRecipCameraZ(&maVertices[3], recipz);
|
||||
RwIm2DVertexSetScreenZ(&maVertices[3], NearScreenZ);
|
||||
RwIm2DVertexSetCameraZ(&maVertices[3], NearCamZ);
|
||||
RwIm2DVertexSetRecipCameraZ(&maVertices[3], RecipNearClip);
|
||||
RwIm2DVertexSetIntRGBA(&maVertices[3], c0.r, c0.g, c0.b, c0.a);
|
||||
RwIm2DVertexSetU(&maVertices[3], 0.0f, recipz);
|
||||
RwIm2DVertexSetV(&maVertices[3], 1.0f, recipz);
|
||||
RwIm2DVertexSetU(&maVertices[3], 0.0f, RecipNearClip);
|
||||
RwIm2DVertexSetV(&maVertices[3], 1.0f, RecipNearClip);
|
||||
}
|
||||
|
||||
void
|
||||
CSprite2d::SetVertices(int n, float *positions, float *uvs, const CRGBA &col)
|
||||
{
|
||||
int i;
|
||||
float screenz, recipz, z;
|
||||
|
||||
screenz = NearScreenZ;
|
||||
recipz = RecipNearClip;
|
||||
z = RwCameraGetNearClipPlane(Scene.camera); // not done by game
|
||||
|
||||
|
||||
for(i = 0; i < n; i++){
|
||||
RwIm2DVertexSetScreenX(&maVertices[i], positions[i*2 + 0]);
|
||||
RwIm2DVertexSetScreenY(&maVertices[i], positions[i*2 + 1]);
|
||||
RwIm2DVertexSetScreenZ(&maVertices[i], screenz + 0.0001f);
|
||||
RwIm2DVertexSetCameraZ(&maVertices[i], z);
|
||||
RwIm2DVertexSetRecipCameraZ(&maVertices[i], recipz);
|
||||
RwIm2DVertexSetScreenZ(&maVertices[i], NearScreenZ + 0.0001f);
|
||||
RwIm2DVertexSetCameraZ(&maVertices[i], NearCamZ);
|
||||
RwIm2DVertexSetRecipCameraZ(&maVertices[i], RecipNearClip);
|
||||
RwIm2DVertexSetIntRGBA(&maVertices[i], col.r, col.g, col.b, col.a);
|
||||
RwIm2DVertexSetU(&maVertices[i], uvs[i*2 + 0], recipz);
|
||||
RwIm2DVertexSetV(&maVertices[i], uvs[i*2 + 1], recipz);
|
||||
RwIm2DVertexSetU(&maVertices[i], uvs[i*2 + 0], RecipNearClip);
|
||||
RwIm2DVertexSetV(&maVertices[i], uvs[i*2 + 1], RecipNearClip);
|
||||
}
|
||||
}
|
||||
|
||||
@ -293,18 +268,13 @@ void
|
||||
CSprite2d::SetMaskVertices(int n, float *positions)
|
||||
{
|
||||
int i;
|
||||
float screenz, recipz, z;
|
||||
|
||||
screenz = NearScreenZ;
|
||||
recipz = RecipNearClip;
|
||||
z = RwCameraGetNearClipPlane(Scene.camera); // not done by game
|
||||
|
||||
for(i = 0; i < n; i++){
|
||||
RwIm2DVertexSetScreenX(&maVertices[i], positions[i*2 + 0]);
|
||||
RwIm2DVertexSetScreenY(&maVertices[i], positions[i*2 + 1]);
|
||||
RwIm2DVertexSetScreenZ(&maVertices[i], screenz);
|
||||
RwIm2DVertexSetCameraZ(&maVertices[i], z);
|
||||
RwIm2DVertexSetRecipCameraZ(&maVertices[i], recipz);
|
||||
RwIm2DVertexSetScreenZ(&maVertices[i], NearScreenZ);
|
||||
RwIm2DVertexSetCameraZ(&maVertices[i], NearCamZ);
|
||||
RwIm2DVertexSetRecipCameraZ(&maVertices[i], RecipNearClip);
|
||||
RwIm2DVertexSetIntRGBA(&maVertices[i], 255, 255, 255, 255); // 0, 0, 0, 0 on PC
|
||||
}
|
||||
}
|
||||
@ -313,53 +283,47 @@ void
|
||||
CSprite2d::SetVertices(RwIm2DVertex *verts, const CRect &r, const CRGBA &c0, const CRGBA &c1, const CRGBA &c2, const CRGBA &c3,
|
||||
float u0, float v0, float u1, float v1, float u3, float v3, float u2, float v2)
|
||||
{
|
||||
float screenz, recipz, z;
|
||||
|
||||
screenz = NearScreenZ;
|
||||
recipz = RecipNearClip;
|
||||
z = RwCameraGetNearClipPlane(Scene.camera); // not done by game
|
||||
|
||||
RwIm2DVertexSetScreenX(&verts[0], r.left);
|
||||
RwIm2DVertexSetScreenY(&verts[0], r.top);
|
||||
RwIm2DVertexSetScreenZ(&verts[0], screenz);
|
||||
RwIm2DVertexSetCameraZ(&verts[0], z);
|
||||
RwIm2DVertexSetRecipCameraZ(&verts[0], recipz);
|
||||
RwIm2DVertexSetScreenZ(&verts[0], NearScreenZ);
|
||||
RwIm2DVertexSetCameraZ(&verts[0], NearCamZ);
|
||||
RwIm2DVertexSetRecipCameraZ(&verts[0], RecipNearClip);
|
||||
RwIm2DVertexSetIntRGBA(&verts[0], c2.r, c2.g, c2.b, c2.a);
|
||||
RwIm2DVertexSetU(&verts[0], u0, recipz);
|
||||
RwIm2DVertexSetV(&verts[0], v0, recipz);
|
||||
RwIm2DVertexSetU(&verts[0], u0, RecipNearClip);
|
||||
RwIm2DVertexSetV(&verts[0], v0, RecipNearClip);
|
||||
|
||||
RwIm2DVertexSetScreenX(&verts[1], r.right);
|
||||
RwIm2DVertexSetScreenY(&verts[1], r.top);
|
||||
RwIm2DVertexSetScreenZ(&verts[1], screenz);
|
||||
RwIm2DVertexSetCameraZ(&verts[1], z);
|
||||
RwIm2DVertexSetRecipCameraZ(&verts[1], recipz);
|
||||
RwIm2DVertexSetScreenZ(&verts[1], NearScreenZ);
|
||||
RwIm2DVertexSetCameraZ(&verts[1], NearCamZ);
|
||||
RwIm2DVertexSetRecipCameraZ(&verts[1], RecipNearClip);
|
||||
RwIm2DVertexSetIntRGBA(&verts[1], c3.r, c3.g, c3.b, c3.a);
|
||||
RwIm2DVertexSetU(&verts[1], u1, recipz);
|
||||
RwIm2DVertexSetV(&verts[1], v1, recipz);
|
||||
RwIm2DVertexSetU(&verts[1], u1, RecipNearClip);
|
||||
RwIm2DVertexSetV(&verts[1], v1, RecipNearClip);
|
||||
|
||||
RwIm2DVertexSetScreenX(&verts[2], r.right);
|
||||
RwIm2DVertexSetScreenY(&verts[2], r.bottom);
|
||||
RwIm2DVertexSetScreenZ(&verts[2], screenz);
|
||||
RwIm2DVertexSetCameraZ(&verts[2], z);
|
||||
RwIm2DVertexSetRecipCameraZ(&verts[2], recipz);
|
||||
RwIm2DVertexSetScreenZ(&verts[2], NearScreenZ);
|
||||
RwIm2DVertexSetCameraZ(&verts[2], NearCamZ);
|
||||
RwIm2DVertexSetRecipCameraZ(&verts[2], RecipNearClip);
|
||||
RwIm2DVertexSetIntRGBA(&verts[2], c1.r, c1.g, c1.b, c1.a);
|
||||
RwIm2DVertexSetU(&verts[2], u2, recipz);
|
||||
RwIm2DVertexSetV(&verts[2], v2, recipz);
|
||||
RwIm2DVertexSetU(&verts[2], u2, RecipNearClip);
|
||||
RwIm2DVertexSetV(&verts[2], v2, RecipNearClip);
|
||||
|
||||
RwIm2DVertexSetScreenX(&verts[3], r.left);
|
||||
RwIm2DVertexSetScreenY(&verts[3], r.bottom);
|
||||
RwIm2DVertexSetScreenZ(&verts[3], screenz);
|
||||
RwIm2DVertexSetCameraZ(&verts[3], z);
|
||||
RwIm2DVertexSetRecipCameraZ(&verts[3], recipz);
|
||||
RwIm2DVertexSetScreenZ(&verts[3], NearScreenZ);
|
||||
RwIm2DVertexSetCameraZ(&verts[3], NearCamZ);
|
||||
RwIm2DVertexSetRecipCameraZ(&verts[3], RecipNearClip);
|
||||
RwIm2DVertexSetIntRGBA(&verts[3], c0.r, c0.g, c0.b, c0.a);
|
||||
RwIm2DVertexSetU(&verts[3], u3, recipz);
|
||||
RwIm2DVertexSetV(&verts[3], v3, recipz);
|
||||
RwIm2DVertexSetU(&verts[3], u3, RecipNearClip);
|
||||
RwIm2DVertexSetV(&verts[3], v3, RecipNearClip);
|
||||
}
|
||||
|
||||
void
|
||||
CSprite2d::DrawRect(const CRect &r, const CRGBA &col)
|
||||
{
|
||||
SetVertices(r, col, col, col, col, false);
|
||||
SetVertices(r, col, col, col, col);
|
||||
RwRenderStateSet(rwRENDERSTATETEXTURERASTER, nil);
|
||||
RwRenderStateSet(rwRENDERSTATESHADEMODE, (void*)rwSHADEMODEFLAT);
|
||||
RwRenderStateSet(rwRENDERSTATEZTESTENABLE, (void*)FALSE);
|
||||
@ -374,7 +338,7 @@ CSprite2d::DrawRect(const CRect &r, const CRGBA &col)
|
||||
void
|
||||
CSprite2d::DrawRect(const CRect &r, const CRGBA &c0, const CRGBA &c1, const CRGBA &c2, const CRGBA &c3)
|
||||
{
|
||||
SetVertices(r, c0, c1, c2, c3, false);
|
||||
SetVertices(r, c0, c1, c2, c3);
|
||||
RwRenderStateSet(rwRENDERSTATETEXTURERASTER, nil);
|
||||
RwRenderStateSet(rwRENDERSTATEZTESTENABLE, (void*)FALSE);
|
||||
RwRenderStateSet(rwRENDERSTATEZWRITEENABLE, (void*)FALSE);
|
||||
@ -387,7 +351,7 @@ CSprite2d::DrawRect(const CRect &r, const CRGBA &c0, const CRGBA &c1, const CRGB
|
||||
void
|
||||
CSprite2d::DrawRectXLU(const CRect &r, const CRGBA &c0, const CRGBA &c1, const CRGBA &c2, const CRGBA &c3)
|
||||
{
|
||||
SetVertices(r, c0, c1, c2, c3, false);
|
||||
SetVertices(r, c0, c1, c2, c3);
|
||||
RwRenderStateSet(rwRENDERSTATETEXTURERASTER, nil);
|
||||
RwRenderStateSet(rwRENDERSTATEZTESTENABLE, (void*)FALSE);
|
||||
RwRenderStateSet(rwRENDERSTATEZWRITEENABLE, (void*)FALSE);
|
||||
|
@ -4,6 +4,7 @@ class CSprite2d
|
||||
{
|
||||
static float RecipNearClip;
|
||||
static float NearScreenZ;
|
||||
static float NearCamZ; // not original
|
||||
static int nextBufferVertex;
|
||||
static int nextBufferIndex;
|
||||
static RwIm2DVertex maVertices[8];
|
||||
@ -27,7 +28,7 @@ public:
|
||||
void Draw(const CRect &rect, const CRGBA &c0, const CRGBA &c1, const CRGBA &c2, const CRGBA &c3);
|
||||
void Draw(float x1, float y1, float x2, float y2, float x3, float y3, float x4, float y4, const CRGBA &col);
|
||||
|
||||
static void SetVertices(const CRect &r, const CRGBA &c0, const CRGBA &c1, const CRGBA &c2, const CRGBA &c3, uint32 far);
|
||||
static void SetVertices(const CRect &r, const CRGBA &c0, const CRGBA &c1, const CRGBA &c2, const CRGBA &c3);
|
||||
static void SetVertices(const CRect &r, const CRGBA &c0, const CRGBA &c1, const CRGBA &c2, const CRGBA &c3,
|
||||
float u0, float v0, float u1, float v1, float u3, float v3, float u2, float v2);
|
||||
static void SetVertices(float x1, float y1, float x2, float y2, float x3, float y3, float x4, float y4,
|
||||
|
@ -10,60 +10,60 @@
|
||||
#include "FileMgr.h"
|
||||
#include "Timecycle.h"
|
||||
|
||||
// TODO(MIAMI): change some of the types here
|
||||
//--MIAMI: done
|
||||
|
||||
int CTimeCycle::m_nAmbientRed[NUMHOURS][NUMWEATHERS];
|
||||
int CTimeCycle::m_nAmbientGreen[NUMHOURS][NUMWEATHERS];
|
||||
int CTimeCycle::m_nAmbientBlue[NUMHOURS][NUMWEATHERS];
|
||||
int CTimeCycle::m_nAmbientRed_Obj[NUMHOURS][NUMWEATHERS];
|
||||
int CTimeCycle::m_nAmbientGreen_Obj[NUMHOURS][NUMWEATHERS];
|
||||
int CTimeCycle::m_nAmbientBlue_Obj[NUMHOURS][NUMWEATHERS];
|
||||
int CTimeCycle::m_nAmbientRed_Bl[NUMHOURS][NUMWEATHERS];
|
||||
int CTimeCycle::m_nAmbientGreen_Bl[NUMHOURS][NUMWEATHERS];
|
||||
int CTimeCycle::m_nAmbientBlue_Bl[NUMHOURS][NUMWEATHERS];
|
||||
int CTimeCycle::m_nAmbientRed_Obj_Bl[NUMHOURS][NUMWEATHERS];
|
||||
int CTimeCycle::m_nAmbientGreen_Obj_Bl[NUMHOURS][NUMWEATHERS];
|
||||
int CTimeCycle::m_nAmbientBlue_Obj_Bl[NUMHOURS][NUMWEATHERS];
|
||||
int CTimeCycle::m_nDirectionalRed[NUMHOURS][NUMWEATHERS];
|
||||
int CTimeCycle::m_nDirectionalGreen[NUMHOURS][NUMWEATHERS];
|
||||
int CTimeCycle::m_nDirectionalBlue[NUMHOURS][NUMWEATHERS];
|
||||
int CTimeCycle::m_nSkyTopRed[NUMHOURS][NUMWEATHERS];
|
||||
int CTimeCycle::m_nSkyTopGreen[NUMHOURS][NUMWEATHERS];
|
||||
int CTimeCycle::m_nSkyTopBlue[NUMHOURS][NUMWEATHERS];
|
||||
int CTimeCycle::m_nSkyBottomRed[NUMHOURS][NUMWEATHERS];
|
||||
int CTimeCycle::m_nSkyBottomGreen[NUMHOURS][NUMWEATHERS];
|
||||
int CTimeCycle::m_nSkyBottomBlue[NUMHOURS][NUMWEATHERS];
|
||||
int CTimeCycle::m_nSunCoreRed[NUMHOURS][NUMWEATHERS];
|
||||
int CTimeCycle::m_nSunCoreGreen[NUMHOURS][NUMWEATHERS];
|
||||
int CTimeCycle::m_nSunCoreBlue[NUMHOURS][NUMWEATHERS];
|
||||
int CTimeCycle::m_nSunCoronaRed[NUMHOURS][NUMWEATHERS];
|
||||
int CTimeCycle::m_nSunCoronaGreen[NUMHOURS][NUMWEATHERS];
|
||||
int CTimeCycle::m_nSunCoronaBlue[NUMHOURS][NUMWEATHERS];
|
||||
float CTimeCycle::m_fSunSize[NUMHOURS][NUMWEATHERS];
|
||||
float CTimeCycle::m_fSpriteSize[NUMHOURS][NUMWEATHERS];
|
||||
float CTimeCycle::m_fSpriteBrightness[NUMHOURS][NUMWEATHERS];
|
||||
short CTimeCycle::m_nShadowStrength[NUMHOURS][NUMWEATHERS];
|
||||
short CTimeCycle::m_nLightShadowStrength[NUMHOURS][NUMWEATHERS];
|
||||
short CTimeCycle::m_nPoleShadowStrength[NUMHOURS][NUMWEATHERS];
|
||||
float CTimeCycle::m_fFogStart[NUMHOURS][NUMWEATHERS];
|
||||
float CTimeCycle::m_fFarClip[NUMHOURS][NUMWEATHERS];
|
||||
float CTimeCycle::m_fLightsOnGroundBrightness[NUMHOURS][NUMWEATHERS];
|
||||
int CTimeCycle::m_nLowCloudsRed[NUMHOURS][NUMWEATHERS];
|
||||
int CTimeCycle::m_nLowCloudsGreen[NUMHOURS][NUMWEATHERS];
|
||||
int CTimeCycle::m_nLowCloudsBlue[NUMHOURS][NUMWEATHERS];
|
||||
int CTimeCycle::m_nFluffyCloudsTopRed[NUMHOURS][NUMWEATHERS];
|
||||
int CTimeCycle::m_nFluffyCloudsTopGreen[NUMHOURS][NUMWEATHERS];
|
||||
int CTimeCycle::m_nFluffyCloudsTopBlue[NUMHOURS][NUMWEATHERS];
|
||||
int CTimeCycle::m_nFluffyCloudsBottomRed[NUMHOURS][NUMWEATHERS];
|
||||
int CTimeCycle::m_nFluffyCloudsBottomGreen[NUMHOURS][NUMWEATHERS];
|
||||
int CTimeCycle::m_nFluffyCloudsBottomBlue[NUMHOURS][NUMWEATHERS];
|
||||
float CTimeCycle::m_fBlurRed[NUMHOURS][NUMWEATHERS];
|
||||
float CTimeCycle::m_fBlurGreen[NUMHOURS][NUMWEATHERS];
|
||||
float CTimeCycle::m_fBlurBlue[NUMHOURS][NUMWEATHERS];
|
||||
float CTimeCycle::m_fWaterRed[NUMHOURS][NUMWEATHERS];
|
||||
float CTimeCycle::m_fWaterGreen[NUMHOURS][NUMWEATHERS];
|
||||
float CTimeCycle::m_fWaterBlue[NUMHOURS][NUMWEATHERS];
|
||||
float CTimeCycle::m_fWaterAlpha[NUMHOURS][NUMWEATHERS];
|
||||
uint8 CTimeCycle::m_nAmbientRed[NUMHOURS][NUMWEATHERS];
|
||||
uint8 CTimeCycle::m_nAmbientGreen[NUMHOURS][NUMWEATHERS];
|
||||
uint8 CTimeCycle::m_nAmbientBlue[NUMHOURS][NUMWEATHERS];
|
||||
uint8 CTimeCycle::m_nAmbientRed_Obj[NUMHOURS][NUMWEATHERS];
|
||||
uint8 CTimeCycle::m_nAmbientGreen_Obj[NUMHOURS][NUMWEATHERS];
|
||||
uint8 CTimeCycle::m_nAmbientBlue_Obj[NUMHOURS][NUMWEATHERS];
|
||||
uint8 CTimeCycle::m_nAmbientRed_Bl[NUMHOURS][NUMWEATHERS];
|
||||
uint8 CTimeCycle::m_nAmbientGreen_Bl[NUMHOURS][NUMWEATHERS];
|
||||
uint8 CTimeCycle::m_nAmbientBlue_Bl[NUMHOURS][NUMWEATHERS];
|
||||
uint8 CTimeCycle::m_nAmbientRed_Obj_Bl[NUMHOURS][NUMWEATHERS];
|
||||
uint8 CTimeCycle::m_nAmbientGreen_Obj_Bl[NUMHOURS][NUMWEATHERS];
|
||||
uint8 CTimeCycle::m_nAmbientBlue_Obj_Bl[NUMHOURS][NUMWEATHERS];
|
||||
uint8 CTimeCycle::m_nDirectionalRed[NUMHOURS][NUMWEATHERS];
|
||||
uint8 CTimeCycle::m_nDirectionalGreen[NUMHOURS][NUMWEATHERS];
|
||||
uint8 CTimeCycle::m_nDirectionalBlue[NUMHOURS][NUMWEATHERS];
|
||||
uint8 CTimeCycle::m_nSkyTopRed[NUMHOURS][NUMWEATHERS];
|
||||
uint8 CTimeCycle::m_nSkyTopGreen[NUMHOURS][NUMWEATHERS];
|
||||
uint8 CTimeCycle::m_nSkyTopBlue[NUMHOURS][NUMWEATHERS];
|
||||
uint8 CTimeCycle::m_nSkyBottomRed[NUMHOURS][NUMWEATHERS];
|
||||
uint8 CTimeCycle::m_nSkyBottomGreen[NUMHOURS][NUMWEATHERS];
|
||||
uint8 CTimeCycle::m_nSkyBottomBlue[NUMHOURS][NUMWEATHERS];
|
||||
uint8 CTimeCycle::m_nSunCoreRed[NUMHOURS][NUMWEATHERS];
|
||||
uint8 CTimeCycle::m_nSunCoreGreen[NUMHOURS][NUMWEATHERS];
|
||||
uint8 CTimeCycle::m_nSunCoreBlue[NUMHOURS][NUMWEATHERS];
|
||||
uint8 CTimeCycle::m_nSunCoronaRed[NUMHOURS][NUMWEATHERS];
|
||||
uint8 CTimeCycle::m_nSunCoronaGreen[NUMHOURS][NUMWEATHERS];
|
||||
uint8 CTimeCycle::m_nSunCoronaBlue[NUMHOURS][NUMWEATHERS];
|
||||
int8 CTimeCycle::m_fSunSize[NUMHOURS][NUMWEATHERS];
|
||||
int8 CTimeCycle::m_fSpriteSize[NUMHOURS][NUMWEATHERS];
|
||||
int8 CTimeCycle::m_fSpriteBrightness[NUMHOURS][NUMWEATHERS];
|
||||
uint8 CTimeCycle::m_nShadowStrength[NUMHOURS][NUMWEATHERS];
|
||||
uint8 CTimeCycle::m_nLightShadowStrength[NUMHOURS][NUMWEATHERS];
|
||||
uint8 CTimeCycle::m_nPoleShadowStrength[NUMHOURS][NUMWEATHERS];
|
||||
int16 CTimeCycle::m_fFogStart[NUMHOURS][NUMWEATHERS];
|
||||
int16 CTimeCycle::m_fFarClip[NUMHOURS][NUMWEATHERS];
|
||||
uint8 CTimeCycle::m_fLightsOnGroundBrightness[NUMHOURS][NUMWEATHERS];
|
||||
uint8 CTimeCycle::m_nLowCloudsRed[NUMHOURS][NUMWEATHERS];
|
||||
uint8 CTimeCycle::m_nLowCloudsGreen[NUMHOURS][NUMWEATHERS];
|
||||
uint8 CTimeCycle::m_nLowCloudsBlue[NUMHOURS][NUMWEATHERS];
|
||||
uint8 CTimeCycle::m_nFluffyCloudsTopRed[NUMHOURS][NUMWEATHERS];
|
||||
uint8 CTimeCycle::m_nFluffyCloudsTopGreen[NUMHOURS][NUMWEATHERS];
|
||||
uint8 CTimeCycle::m_nFluffyCloudsTopBlue[NUMHOURS][NUMWEATHERS];
|
||||
uint8 CTimeCycle::m_nFluffyCloudsBottomRed[NUMHOURS][NUMWEATHERS];
|
||||
uint8 CTimeCycle::m_nFluffyCloudsBottomGreen[NUMHOURS][NUMWEATHERS];
|
||||
uint8 CTimeCycle::m_nFluffyCloudsBottomBlue[NUMHOURS][NUMWEATHERS];
|
||||
uint8 CTimeCycle::m_fBlurRed[NUMHOURS][NUMWEATHERS];
|
||||
uint8 CTimeCycle::m_fBlurGreen[NUMHOURS][NUMWEATHERS];
|
||||
uint8 CTimeCycle::m_fBlurBlue[NUMHOURS][NUMWEATHERS];
|
||||
uint8 CTimeCycle::m_fWaterRed[NUMHOURS][NUMWEATHERS];
|
||||
uint8 CTimeCycle::m_fWaterGreen[NUMHOURS][NUMWEATHERS];
|
||||
uint8 CTimeCycle::m_fWaterBlue[NUMHOURS][NUMWEATHERS];
|
||||
uint8 CTimeCycle::m_fWaterAlpha[NUMHOURS][NUMWEATHERS];
|
||||
|
||||
|
||||
float CTimeCycle::m_fCurrentAmbientRed;
|
||||
@ -81,36 +81,36 @@ float CTimeCycle::m_fCurrentAmbientBlue_Obj_Bl;
|
||||
float CTimeCycle::m_fCurrentDirectionalRed;
|
||||
float CTimeCycle::m_fCurrentDirectionalGreen;
|
||||
float CTimeCycle::m_fCurrentDirectionalBlue;
|
||||
int CTimeCycle::m_nCurrentSkyTopRed;
|
||||
int CTimeCycle::m_nCurrentSkyTopGreen;
|
||||
int CTimeCycle::m_nCurrentSkyTopBlue;
|
||||
int CTimeCycle::m_nCurrentSkyBottomRed;
|
||||
int CTimeCycle::m_nCurrentSkyBottomGreen;
|
||||
int CTimeCycle::m_nCurrentSkyBottomBlue;
|
||||
int CTimeCycle::m_nCurrentSunCoreRed;
|
||||
int CTimeCycle::m_nCurrentSunCoreGreen;
|
||||
int CTimeCycle::m_nCurrentSunCoreBlue;
|
||||
int CTimeCycle::m_nCurrentSunCoronaRed;
|
||||
int CTimeCycle::m_nCurrentSunCoronaGreen;
|
||||
int CTimeCycle::m_nCurrentSunCoronaBlue;
|
||||
int32 CTimeCycle::m_nCurrentSkyTopRed;
|
||||
int32 CTimeCycle::m_nCurrentSkyTopGreen;
|
||||
int32 CTimeCycle::m_nCurrentSkyTopBlue;
|
||||
int32 CTimeCycle::m_nCurrentSkyBottomRed;
|
||||
int32 CTimeCycle::m_nCurrentSkyBottomGreen;
|
||||
int32 CTimeCycle::m_nCurrentSkyBottomBlue;
|
||||
int32 CTimeCycle::m_nCurrentSunCoreRed;
|
||||
int32 CTimeCycle::m_nCurrentSunCoreGreen;
|
||||
int32 CTimeCycle::m_nCurrentSunCoreBlue;
|
||||
int32 CTimeCycle::m_nCurrentSunCoronaRed;
|
||||
int32 CTimeCycle::m_nCurrentSunCoronaGreen;
|
||||
int32 CTimeCycle::m_nCurrentSunCoronaBlue;
|
||||
float CTimeCycle::m_fCurrentSunSize;
|
||||
float CTimeCycle::m_fCurrentSpriteSize;
|
||||
float CTimeCycle::m_fCurrentSpriteBrightness;
|
||||
int CTimeCycle::m_nCurrentShadowStrength;
|
||||
int CTimeCycle::m_nCurrentLightShadowStrength;
|
||||
int CTimeCycle::m_nCurrentPoleShadowStrength;
|
||||
int32 CTimeCycle::m_nCurrentShadowStrength;
|
||||
int32 CTimeCycle::m_nCurrentLightShadowStrength;
|
||||
int32 CTimeCycle::m_nCurrentPoleShadowStrength;
|
||||
float CTimeCycle::m_fCurrentFogStart;
|
||||
float CTimeCycle::m_fCurrentFarClip;
|
||||
float CTimeCycle::m_fCurrentLightsOnGroundBrightness;
|
||||
int CTimeCycle::m_nCurrentLowCloudsRed;
|
||||
int CTimeCycle::m_nCurrentLowCloudsGreen;
|
||||
int CTimeCycle::m_nCurrentLowCloudsBlue;
|
||||
int CTimeCycle::m_nCurrentFluffyCloudsTopRed;
|
||||
int CTimeCycle::m_nCurrentFluffyCloudsTopGreen;
|
||||
int CTimeCycle::m_nCurrentFluffyCloudsTopBlue;
|
||||
int CTimeCycle::m_nCurrentFluffyCloudsBottomRed;
|
||||
int CTimeCycle::m_nCurrentFluffyCloudsBottomGreen;
|
||||
int CTimeCycle::m_nCurrentFluffyCloudsBottomBlue;
|
||||
int32 CTimeCycle::m_nCurrentLowCloudsRed;
|
||||
int32 CTimeCycle::m_nCurrentLowCloudsGreen;
|
||||
int32 CTimeCycle::m_nCurrentLowCloudsBlue;
|
||||
int32 CTimeCycle::m_nCurrentFluffyCloudsTopRed;
|
||||
int32 CTimeCycle::m_nCurrentFluffyCloudsTopGreen;
|
||||
int32 CTimeCycle::m_nCurrentFluffyCloudsTopBlue;
|
||||
int32 CTimeCycle::m_nCurrentFluffyCloudsBottomRed;
|
||||
int32 CTimeCycle::m_nCurrentFluffyCloudsBottomGreen;
|
||||
int32 CTimeCycle::m_nCurrentFluffyCloudsBottomBlue;
|
||||
float CTimeCycle::m_fCurrentBlurRed;
|
||||
float CTimeCycle::m_fCurrentBlurGreen;
|
||||
float CTimeCycle::m_fCurrentBlurBlue;
|
||||
@ -118,13 +118,16 @@ float CTimeCycle::m_fCurrentWaterRed;
|
||||
float CTimeCycle::m_fCurrentWaterGreen;
|
||||
float CTimeCycle::m_fCurrentWaterBlue;
|
||||
float CTimeCycle::m_fCurrentWaterAlpha;
|
||||
int CTimeCycle::m_nCurrentFogColourRed;
|
||||
int CTimeCycle::m_nCurrentFogColourGreen;
|
||||
int CTimeCycle::m_nCurrentFogColourBlue;
|
||||
int32 CTimeCycle::m_nCurrentFogColourRed;
|
||||
int32 CTimeCycle::m_nCurrentFogColourGreen;
|
||||
int32 CTimeCycle::m_nCurrentFogColourBlue;
|
||||
|
||||
int CTimeCycle::m_FogReduction;
|
||||
int32 CTimeCycle::m_FogReduction;
|
||||
int32 CTimeCycle::m_bExtraColourOn;
|
||||
int32 CTimeCycle::m_ExtraColour;
|
||||
float CTimeCycle::m_ExtraColourInter;
|
||||
|
||||
int CTimeCycle::m_CurrentStoredValue;
|
||||
int32 CTimeCycle::m_CurrentStoredValue;
|
||||
CVector CTimeCycle::m_VectorToSun[16];
|
||||
float CTimeCycle::m_fShadowFrontX[16];
|
||||
float CTimeCycle::m_fShadowFrontY[16];
|
||||
@ -133,7 +136,6 @@ float CTimeCycle::m_fShadowSideY[16];
|
||||
float CTimeCycle::m_fShadowDisplacementX[16];
|
||||
float CTimeCycle::m_fShadowDisplacementY[16];
|
||||
|
||||
|
||||
void
|
||||
CTimeCycle::Initialise(void)
|
||||
{
|
||||
@ -233,15 +235,15 @@ CTimeCycle::Initialise(void)
|
||||
m_nSunCoronaRed[h][w] = sunCoronaR;
|
||||
m_nSunCoronaGreen[h][w] = sunCoronaG;
|
||||
m_nSunCoronaBlue[h][w] = sunCoronaB;
|
||||
m_fSunSize[h][w] = sunSz;
|
||||
m_fSpriteSize[h][w] = sprSz;
|
||||
m_fSpriteBrightness[h][w] = sprBght;
|
||||
m_fSunSize[h][w] = sunSz * 10.0f;
|
||||
m_fSpriteSize[h][w] = sprSz * 10.0f;
|
||||
m_fSpriteBrightness[h][w] = sprBght * 10.0f;
|
||||
m_nShadowStrength[h][w] = shad;
|
||||
m_nLightShadowStrength[h][w] = lightShad;
|
||||
m_nPoleShadowStrength[h][w] = poleShad;
|
||||
m_fFarClip[h][w] = farClp;
|
||||
m_fFogStart[h][w] = fogSt;
|
||||
m_fLightsOnGroundBrightness[h][w] = lightGnd;
|
||||
m_fLightsOnGroundBrightness[h][w] = lightGnd * 10.0f;
|
||||
m_nLowCloudsRed[h][w] = cloudR;
|
||||
m_nLowCloudsGreen[h][w] = cloudG;
|
||||
m_nLowCloudsBlue[h][w] = cloudB;
|
||||
@ -265,6 +267,51 @@ CTimeCycle::Initialise(void)
|
||||
debug("CTimeCycle ready\n");
|
||||
}
|
||||
|
||||
static float interp_c0, interp_c1, interp_c2, interp_c3;
|
||||
|
||||
float CTimeCycle::Interpolate(int8 *a, int8 *b)
|
||||
{
|
||||
return a[CWeather::OldWeatherType] * interp_c0 +
|
||||
b[CWeather::OldWeatherType] * interp_c1 +
|
||||
a[CWeather::NewWeatherType] * interp_c2 +
|
||||
b[CWeather::NewWeatherType] * interp_c3;
|
||||
}
|
||||
|
||||
float CTimeCycle::Interpolate(uint8 *a, uint8 *b)
|
||||
{
|
||||
return a[CWeather::OldWeatherType] * interp_c0 +
|
||||
b[CWeather::OldWeatherType] * interp_c1 +
|
||||
a[CWeather::NewWeatherType] * interp_c2 +
|
||||
b[CWeather::NewWeatherType] * interp_c3;
|
||||
}
|
||||
|
||||
float CTimeCycle::Interpolate(int16 *a, int16 *b)
|
||||
{
|
||||
return a[CWeather::OldWeatherType] * interp_c0 +
|
||||
b[CWeather::OldWeatherType] * interp_c1 +
|
||||
a[CWeather::NewWeatherType] * interp_c2 +
|
||||
b[CWeather::NewWeatherType] * interp_c3;
|
||||
}
|
||||
|
||||
void
|
||||
CTimeCycle::StartExtraColour(int32 c, bool fade)
|
||||
{
|
||||
m_bExtraColourOn = true;
|
||||
m_ExtraColour = c;
|
||||
if(fade)
|
||||
m_ExtraColourInter = 0.0f;
|
||||
else
|
||||
m_ExtraColourInter = 1.0f;
|
||||
}
|
||||
|
||||
void
|
||||
CTimeCycle::StopExtraColour(bool fade)
|
||||
{
|
||||
m_bExtraColourOn = false;
|
||||
if(!fade)
|
||||
m_ExtraColourInter = 0.0f;
|
||||
}
|
||||
|
||||
void
|
||||
CTimeCycle::Update(void)
|
||||
{
|
||||
@ -274,12 +321,12 @@ CTimeCycle::Update(void)
|
||||
int w2 = CWeather::NewWeatherType;
|
||||
float timeInterp = (CClock::GetMinutes() + CClock::GetSeconds()/60.0f)/60.0f;
|
||||
// coefficients for a bilinear interpolation
|
||||
float c0 = (1.0f-timeInterp) * (1.0f-CWeather::InterpolationValue);
|
||||
float c1 = timeInterp * (1.0f-CWeather::InterpolationValue);
|
||||
float c2 = (1.0f-timeInterp) * CWeather::InterpolationValue;
|
||||
float c3 = timeInterp * CWeather::InterpolationValue;
|
||||
interp_c0 = (1.0f-timeInterp) * (1.0f-CWeather::InterpolationValue);
|
||||
interp_c1 = timeInterp * (1.0f-CWeather::InterpolationValue);
|
||||
interp_c2 = (1.0f-timeInterp) * CWeather::InterpolationValue;
|
||||
interp_c3 = timeInterp * CWeather::InterpolationValue;
|
||||
|
||||
#define INTERP(v) v[h1][w1]*c0 + v[h2][w1]*c1 + v[h1][w2]*c2 + v[h2][w2]*c3;
|
||||
#define INTERP(v) Interpolate(v[h1], v[h2])
|
||||
|
||||
m_nCurrentSkyTopRed = INTERP(m_nSkyTopRed);
|
||||
m_nCurrentSkyTopGreen = INTERP(m_nSkyTopGreen);
|
||||
@ -317,15 +364,15 @@ CTimeCycle::Update(void)
|
||||
m_nCurrentSunCoronaGreen = INTERP(m_nSunCoronaGreen);
|
||||
m_nCurrentSunCoronaBlue = INTERP(m_nSunCoronaBlue);
|
||||
|
||||
m_fCurrentSunSize = INTERP(m_fSunSize);
|
||||
m_fCurrentSpriteSize = INTERP(m_fSpriteSize);
|
||||
m_fCurrentSpriteBrightness = INTERP(m_fSpriteBrightness);
|
||||
m_fCurrentSunSize = INTERP(m_fSunSize)/10.0f;
|
||||
m_fCurrentSpriteSize = INTERP(m_fSpriteSize)/10.0f;
|
||||
m_fCurrentSpriteBrightness = INTERP(m_fSpriteBrightness)/10.0f;
|
||||
m_nCurrentShadowStrength = INTERP(m_nShadowStrength);
|
||||
m_nCurrentLightShadowStrength = INTERP(m_nLightShadowStrength);
|
||||
m_nCurrentPoleShadowStrength = INTERP(m_nPoleShadowStrength);
|
||||
m_fCurrentFarClip = INTERP(m_fFarClip);
|
||||
m_fCurrentFogStart = INTERP(m_fFogStart);
|
||||
m_fCurrentLightsOnGroundBrightness = INTERP(m_fLightsOnGroundBrightness);
|
||||
m_fCurrentLightsOnGroundBrightness = INTERP(m_fLightsOnGroundBrightness)/10.0f;
|
||||
|
||||
m_nCurrentLowCloudsRed = INTERP(m_nLowCloudsRed);
|
||||
m_nCurrentLowCloudsGreen = INTERP(m_nLowCloudsGreen);
|
||||
@ -347,6 +394,7 @@ CTimeCycle::Update(void)
|
||||
m_fCurrentWaterGreen = INTERP(m_fWaterGreen);
|
||||
m_fCurrentWaterBlue = INTERP(m_fWaterBlue);
|
||||
m_fCurrentWaterAlpha = INTERP(m_fWaterAlpha);
|
||||
#undef INTERP
|
||||
|
||||
if(m_FogReduction != 0)
|
||||
m_fCurrentFarClip = Max(m_fCurrentFarClip, m_FogReduction/64.0f * 650.0f);
|
||||
@ -360,7 +408,88 @@ CTimeCycle::Update(void)
|
||||
sunPos.z = 0.2f - Cos(sunAngle);
|
||||
sunPos.Normalise();
|
||||
|
||||
// TODO(MIAMI): extra colours
|
||||
if(m_bExtraColourOn)
|
||||
m_ExtraColourInter = Min(1.0f, m_ExtraColourInter + CTimer::GetTimeStep()/120.0f);
|
||||
else
|
||||
m_ExtraColourInter = Max(-.0f, m_ExtraColourInter - CTimer::GetTimeStep()/120.0f);
|
||||
if(m_ExtraColourInter > 0.0f){
|
||||
#define INTERP(extra,cur) (m_ExtraColourInter*extra[m_ExtraColour][WEATHER_EXTRACOLOURS] + (1.0f-m_ExtraColourInter)*cur)
|
||||
#define INTERPscl(extra,scl,cur) (m_ExtraColourInter*extra[m_ExtraColour][WEATHER_EXTRACOLOURS]/scl + (1.0f-m_ExtraColourInter)*cur)
|
||||
if(m_nSkyTopRed[m_ExtraColour][WEATHER_EXTRACOLOURS] != 0 ||
|
||||
m_nSkyTopGreen[m_ExtraColour][WEATHER_EXTRACOLOURS] != 0 ||
|
||||
m_nSkyTopBlue[m_ExtraColour][WEATHER_EXTRACOLOURS] != 0){
|
||||
m_nCurrentSkyTopRed = INTERP(m_nSkyTopRed,m_nCurrentSkyTopRed);
|
||||
m_nCurrentSkyTopGreen = INTERP(m_nSkyTopGreen,m_nCurrentSkyTopGreen);
|
||||
m_nCurrentSkyTopBlue = INTERP(m_nSkyTopBlue,m_nCurrentSkyTopBlue);
|
||||
|
||||
m_nCurrentSkyBottomRed = INTERP(m_nSkyBottomRed,m_nCurrentSkyBottomRed);
|
||||
m_nCurrentSkyBottomGreen = INTERP(m_nSkyBottomGreen,m_nCurrentSkyBottomGreen);
|
||||
m_nCurrentSkyBottomBlue = INTERP(m_nSkyBottomBlue,m_nCurrentSkyBottomBlue);
|
||||
|
||||
m_nCurrentSunCoreRed = INTERP(m_nSunCoreRed,m_nCurrentSunCoreRed);
|
||||
m_nCurrentSunCoreGreen = INTERP(m_nSunCoreGreen,m_nCurrentSunCoreGreen);
|
||||
m_nCurrentSunCoreBlue = INTERP(m_nSunCoreBlue,m_nCurrentSunCoreBlue);
|
||||
|
||||
m_nCurrentSunCoronaRed = INTERP(m_nSunCoronaRed,m_nCurrentSunCoronaRed);
|
||||
m_nCurrentSunCoronaGreen = INTERP(m_nSunCoronaGreen,m_nCurrentSunCoronaGreen);
|
||||
m_nCurrentSunCoronaBlue = INTERP(m_nSunCoronaBlue,m_nCurrentSunCoronaBlue);
|
||||
|
||||
m_fCurrentSunSize = INTERPscl(m_fSunSize,10.0f,m_fCurrentSunSize);
|
||||
|
||||
m_nCurrentLowCloudsRed = INTERP(m_nLowCloudsRed,m_nCurrentLowCloudsRed);
|
||||
m_nCurrentLowCloudsGreen = INTERP(m_nLowCloudsGreen,m_nCurrentLowCloudsGreen);
|
||||
m_nCurrentLowCloudsBlue = INTERP(m_nLowCloudsBlue,m_nCurrentLowCloudsBlue);
|
||||
|
||||
m_nCurrentFluffyCloudsTopRed = INTERP(m_nFluffyCloudsTopRed,m_nCurrentFluffyCloudsTopRed);
|
||||
m_nCurrentFluffyCloudsTopGreen = INTERP(m_nFluffyCloudsTopGreen,m_nCurrentFluffyCloudsTopGreen);
|
||||
m_nCurrentFluffyCloudsTopBlue = INTERP(m_nFluffyCloudsTopBlue,m_nCurrentFluffyCloudsTopBlue);
|
||||
|
||||
m_nCurrentFluffyCloudsBottomRed = INTERP(m_nFluffyCloudsBottomRed,m_nCurrentFluffyCloudsBottomRed);
|
||||
m_nCurrentFluffyCloudsBottomGreen = INTERP(m_nFluffyCloudsBottomGreen,m_nCurrentFluffyCloudsBottomGreen);
|
||||
m_nCurrentFluffyCloudsBottomBlue = INTERP(m_nFluffyCloudsBottomBlue,m_nCurrentFluffyCloudsBottomBlue);
|
||||
|
||||
m_fCurrentWaterRed = INTERP(m_fWaterRed,m_fCurrentWaterRed);
|
||||
m_fCurrentWaterGreen = INTERP(m_fWaterGreen,m_fCurrentWaterGreen);
|
||||
m_fCurrentWaterBlue = INTERP(m_fWaterBlue,m_fCurrentWaterBlue);
|
||||
m_fCurrentWaterAlpha = INTERP(m_fWaterAlpha,m_fCurrentWaterAlpha);
|
||||
}
|
||||
|
||||
m_fCurrentAmbientRed = INTERP(m_nAmbientRed,m_fCurrentAmbientRed);
|
||||
m_fCurrentAmbientGreen = INTERP(m_nAmbientGreen,m_fCurrentAmbientGreen);
|
||||
m_fCurrentAmbientBlue = INTERP(m_nAmbientBlue,m_fCurrentAmbientBlue);
|
||||
|
||||
m_fCurrentAmbientRed_Obj = INTERP(m_nAmbientRed_Obj,m_fCurrentAmbientRed_Obj);
|
||||
m_fCurrentAmbientGreen_Obj = INTERP(m_nAmbientGreen_Obj,m_fCurrentAmbientGreen_Obj);
|
||||
m_fCurrentAmbientBlue_Obj = INTERP(m_nAmbientBlue_Obj,m_fCurrentAmbientBlue_Obj);
|
||||
|
||||
m_fCurrentAmbientRed_Bl = INTERP(m_nAmbientRed_Bl,m_fCurrentAmbientRed_Bl);
|
||||
m_fCurrentAmbientGreen_Bl = INTERP(m_nAmbientGreen_Bl,m_fCurrentAmbientGreen_Bl);
|
||||
m_fCurrentAmbientBlue_Bl = INTERP(m_nAmbientBlue_Bl,m_fCurrentAmbientBlue_Bl);
|
||||
|
||||
m_fCurrentAmbientRed_Obj_Bl = INTERP(m_nAmbientRed_Obj_Bl,m_fCurrentAmbientRed_Obj_Bl);
|
||||
m_fCurrentAmbientGreen_Obj_Bl = INTERP(m_nAmbientGreen_Obj_Bl,m_fCurrentAmbientGreen_Obj_Bl);
|
||||
m_fCurrentAmbientBlue_Obj_Bl = INTERP(m_nAmbientBlue_Obj_Bl,m_fCurrentAmbientBlue_Obj_Bl);
|
||||
|
||||
m_fCurrentDirectionalRed = INTERP(m_nDirectionalRed,m_fCurrentDirectionalRed);
|
||||
m_fCurrentDirectionalGreen = INTERP(m_nDirectionalGreen,m_fCurrentDirectionalGreen);
|
||||
m_fCurrentDirectionalBlue = INTERP(m_nDirectionalBlue,m_fCurrentDirectionalBlue);
|
||||
|
||||
m_fCurrentSpriteSize = INTERPscl(m_fSpriteSize,10.0f,m_fCurrentSpriteSize);
|
||||
m_fCurrentSpriteBrightness = INTERPscl(m_fSpriteBrightness,10.0f,m_fCurrentSpriteBrightness);
|
||||
m_nCurrentShadowStrength = INTERP(m_nShadowStrength,m_nCurrentShadowStrength);
|
||||
m_nCurrentLightShadowStrength = INTERP(m_nLightShadowStrength,m_nCurrentLightShadowStrength);
|
||||
m_nCurrentPoleShadowStrength = INTERP(m_nPoleShadowStrength,m_nCurrentPoleShadowStrength);
|
||||
m_fCurrentFarClip = INTERP(m_fFarClip,m_fCurrentFarClip);
|
||||
m_fCurrentFogStart = INTERP(m_fFogStart,m_fCurrentFogStart);
|
||||
m_fCurrentLightsOnGroundBrightness = INTERPscl(m_fLightsOnGroundBrightness,10.0f,m_fCurrentLightsOnGroundBrightness);
|
||||
|
||||
m_fCurrentBlurRed = INTERP(m_fBlurRed,m_fCurrentBlurRed);
|
||||
m_fCurrentBlurGreen = INTERP(m_fBlurGreen,m_fCurrentBlurGreen);
|
||||
m_fCurrentBlurBlue = INTERP(m_fBlurBlue,m_fCurrentBlurBlue);
|
||||
|
||||
#undef INTERP
|
||||
#undef INTERPscl
|
||||
}
|
||||
|
||||
if(TheCamera.m_BlurType == MOTION_BLUR_NONE || TheCamera.m_BlurType == MOTION_BLUR_LIGHT_SCENE)
|
||||
TheCamera.SetMotionBlur(m_fCurrentBlurRed, m_fCurrentBlurGreen, m_fCurrentBlurBlue, 5, MOTION_BLUR_LIGHT_SCENE);
|
||||
|
@ -2,58 +2,58 @@
|
||||
|
||||
class CTimeCycle
|
||||
{
|
||||
static int m_nAmbientRed[NUMHOURS][NUMWEATHERS];
|
||||
static int m_nAmbientGreen[NUMHOURS][NUMWEATHERS];
|
||||
static int m_nAmbientBlue[NUMHOURS][NUMWEATHERS];
|
||||
static int m_nAmbientRed_Obj[NUMHOURS][NUMWEATHERS];
|
||||
static int m_nAmbientGreen_Obj[NUMHOURS][NUMWEATHERS];
|
||||
static int m_nAmbientBlue_Obj[NUMHOURS][NUMWEATHERS];
|
||||
static int m_nAmbientRed_Bl[NUMHOURS][NUMWEATHERS];
|
||||
static int m_nAmbientGreen_Bl[NUMHOURS][NUMWEATHERS];
|
||||
static int m_nAmbientBlue_Bl[NUMHOURS][NUMWEATHERS];
|
||||
static int m_nAmbientRed_Obj_Bl[NUMHOURS][NUMWEATHERS];
|
||||
static int m_nAmbientGreen_Obj_Bl[NUMHOURS][NUMWEATHERS];
|
||||
static int m_nAmbientBlue_Obj_Bl[NUMHOURS][NUMWEATHERS];
|
||||
static int m_nDirectionalRed[NUMHOURS][NUMWEATHERS];
|
||||
static int m_nDirectionalGreen[NUMHOURS][NUMWEATHERS];
|
||||
static int m_nDirectionalBlue[NUMHOURS][NUMWEATHERS];
|
||||
static int m_nSkyTopRed[NUMHOURS][NUMWEATHERS];
|
||||
static int m_nSkyTopGreen[NUMHOURS][NUMWEATHERS];
|
||||
static int m_nSkyTopBlue[NUMHOURS][NUMWEATHERS];
|
||||
static int m_nSkyBottomRed[NUMHOURS][NUMWEATHERS];
|
||||
static int m_nSkyBottomGreen[NUMHOURS][NUMWEATHERS];
|
||||
static int m_nSkyBottomBlue[NUMHOURS][NUMWEATHERS];
|
||||
static int m_nSunCoreRed[NUMHOURS][NUMWEATHERS];
|
||||
static int m_nSunCoreGreen[NUMHOURS][NUMWEATHERS];
|
||||
static int m_nSunCoreBlue[NUMHOURS][NUMWEATHERS];
|
||||
static int m_nSunCoronaRed[NUMHOURS][NUMWEATHERS];
|
||||
static int m_nSunCoronaGreen[NUMHOURS][NUMWEATHERS];
|
||||
static int m_nSunCoronaBlue[NUMHOURS][NUMWEATHERS];
|
||||
static float m_fSunSize[NUMHOURS][NUMWEATHERS];
|
||||
static float m_fSpriteSize[NUMHOURS][NUMWEATHERS];
|
||||
static float m_fSpriteBrightness[NUMHOURS][NUMWEATHERS];
|
||||
static short m_nShadowStrength[NUMHOURS][NUMWEATHERS];
|
||||
static short m_nLightShadowStrength[NUMHOURS][NUMWEATHERS];
|
||||
static short m_nPoleShadowStrength[NUMHOURS][NUMWEATHERS];
|
||||
static float m_fFogStart[NUMHOURS][NUMWEATHERS];
|
||||
static float m_fFarClip[NUMHOURS][NUMWEATHERS];
|
||||
static float m_fLightsOnGroundBrightness[NUMHOURS][NUMWEATHERS];
|
||||
static int m_nLowCloudsRed[NUMHOURS][NUMWEATHERS];
|
||||
static int m_nLowCloudsGreen[NUMHOURS][NUMWEATHERS];
|
||||
static int m_nLowCloudsBlue[NUMHOURS][NUMWEATHERS];
|
||||
static int m_nFluffyCloudsTopRed[NUMHOURS][NUMWEATHERS];
|
||||
static int m_nFluffyCloudsTopGreen[NUMHOURS][NUMWEATHERS];
|
||||
static int m_nFluffyCloudsTopBlue[NUMHOURS][NUMWEATHERS];
|
||||
static int m_nFluffyCloudsBottomRed[NUMHOURS][NUMWEATHERS];
|
||||
static int m_nFluffyCloudsBottomGreen[NUMHOURS][NUMWEATHERS];
|
||||
static int m_nFluffyCloudsBottomBlue[NUMHOURS][NUMWEATHERS];
|
||||
static float m_fBlurRed[NUMHOURS][NUMWEATHERS];
|
||||
static float m_fBlurGreen[NUMHOURS][NUMWEATHERS];
|
||||
static float m_fBlurBlue[NUMHOURS][NUMWEATHERS];
|
||||
static float m_fWaterRed[NUMHOURS][NUMWEATHERS];
|
||||
static float m_fWaterGreen[NUMHOURS][NUMWEATHERS];
|
||||
static float m_fWaterBlue[NUMHOURS][NUMWEATHERS];
|
||||
static float m_fWaterAlpha[NUMHOURS][NUMWEATHERS];
|
||||
static uint8 m_nAmbientRed[NUMHOURS][NUMWEATHERS];
|
||||
static uint8 m_nAmbientGreen[NUMHOURS][NUMWEATHERS];
|
||||
static uint8 m_nAmbientBlue[NUMHOURS][NUMWEATHERS];
|
||||
static uint8 m_nAmbientRed_Obj[NUMHOURS][NUMWEATHERS];
|
||||
static uint8 m_nAmbientGreen_Obj[NUMHOURS][NUMWEATHERS];
|
||||
static uint8 m_nAmbientBlue_Obj[NUMHOURS][NUMWEATHERS];
|
||||
static uint8 m_nAmbientRed_Bl[NUMHOURS][NUMWEATHERS];
|
||||
static uint8 m_nAmbientGreen_Bl[NUMHOURS][NUMWEATHERS];
|
||||
static uint8 m_nAmbientBlue_Bl[NUMHOURS][NUMWEATHERS];
|
||||
static uint8 m_nAmbientRed_Obj_Bl[NUMHOURS][NUMWEATHERS];
|
||||
static uint8 m_nAmbientGreen_Obj_Bl[NUMHOURS][NUMWEATHERS];
|
||||
static uint8 m_nAmbientBlue_Obj_Bl[NUMHOURS][NUMWEATHERS];
|
||||
static uint8 m_nDirectionalRed[NUMHOURS][NUMWEATHERS];
|
||||
static uint8 m_nDirectionalGreen[NUMHOURS][NUMWEATHERS];
|
||||
static uint8 m_nDirectionalBlue[NUMHOURS][NUMWEATHERS];
|
||||
static uint8 m_nSkyTopRed[NUMHOURS][NUMWEATHERS];
|
||||
static uint8 m_nSkyTopGreen[NUMHOURS][NUMWEATHERS];
|
||||
static uint8 m_nSkyTopBlue[NUMHOURS][NUMWEATHERS];
|
||||
static uint8 m_nSkyBottomRed[NUMHOURS][NUMWEATHERS];
|
||||
static uint8 m_nSkyBottomGreen[NUMHOURS][NUMWEATHERS];
|
||||
static uint8 m_nSkyBottomBlue[NUMHOURS][NUMWEATHERS];
|
||||
static uint8 m_nSunCoreRed[NUMHOURS][NUMWEATHERS];
|
||||
static uint8 m_nSunCoreGreen[NUMHOURS][NUMWEATHERS];
|
||||
static uint8 m_nSunCoreBlue[NUMHOURS][NUMWEATHERS];
|
||||
static uint8 m_nSunCoronaRed[NUMHOURS][NUMWEATHERS];
|
||||
static uint8 m_nSunCoronaGreen[NUMHOURS][NUMWEATHERS];
|
||||
static uint8 m_nSunCoronaBlue[NUMHOURS][NUMWEATHERS];
|
||||
static int8 m_fSunSize[NUMHOURS][NUMWEATHERS];
|
||||
static int8 m_fSpriteSize[NUMHOURS][NUMWEATHERS];
|
||||
static int8 m_fSpriteBrightness[NUMHOURS][NUMWEATHERS];
|
||||
static uint8 m_nShadowStrength[NUMHOURS][NUMWEATHERS];
|
||||
static uint8 m_nLightShadowStrength[NUMHOURS][NUMWEATHERS];
|
||||
static uint8 m_nPoleShadowStrength[NUMHOURS][NUMWEATHERS];
|
||||
static int16 m_fFogStart[NUMHOURS][NUMWEATHERS];
|
||||
static int16 m_fFarClip[NUMHOURS][NUMWEATHERS];
|
||||
static uint8 m_fLightsOnGroundBrightness[NUMHOURS][NUMWEATHERS];
|
||||
static uint8 m_nLowCloudsRed[NUMHOURS][NUMWEATHERS];
|
||||
static uint8 m_nLowCloudsGreen[NUMHOURS][NUMWEATHERS];
|
||||
static uint8 m_nLowCloudsBlue[NUMHOURS][NUMWEATHERS];
|
||||
static uint8 m_nFluffyCloudsTopRed[NUMHOURS][NUMWEATHERS];
|
||||
static uint8 m_nFluffyCloudsTopGreen[NUMHOURS][NUMWEATHERS];
|
||||
static uint8 m_nFluffyCloudsTopBlue[NUMHOURS][NUMWEATHERS];
|
||||
static uint8 m_nFluffyCloudsBottomRed[NUMHOURS][NUMWEATHERS];
|
||||
static uint8 m_nFluffyCloudsBottomGreen[NUMHOURS][NUMWEATHERS];
|
||||
static uint8 m_nFluffyCloudsBottomBlue[NUMHOURS][NUMWEATHERS];
|
||||
static uint8 m_fBlurRed[NUMHOURS][NUMWEATHERS];
|
||||
static uint8 m_fBlurGreen[NUMHOURS][NUMWEATHERS];
|
||||
static uint8 m_fBlurBlue[NUMHOURS][NUMWEATHERS];
|
||||
static uint8 m_fWaterRed[NUMHOURS][NUMWEATHERS];
|
||||
static uint8 m_fWaterGreen[NUMHOURS][NUMWEATHERS];
|
||||
static uint8 m_fWaterBlue[NUMHOURS][NUMWEATHERS];
|
||||
static uint8 m_fWaterAlpha[NUMHOURS][NUMWEATHERS];
|
||||
|
||||
static float m_fCurrentAmbientRed;
|
||||
static float m_fCurrentAmbientGreen;
|
||||
@ -70,36 +70,36 @@ class CTimeCycle
|
||||
static float m_fCurrentDirectionalRed;
|
||||
static float m_fCurrentDirectionalGreen;
|
||||
static float m_fCurrentDirectionalBlue;
|
||||
static int m_nCurrentSkyTopRed;
|
||||
static int m_nCurrentSkyTopGreen;
|
||||
static int m_nCurrentSkyTopBlue;
|
||||
static int m_nCurrentSkyBottomRed;
|
||||
static int m_nCurrentSkyBottomGreen;
|
||||
static int m_nCurrentSkyBottomBlue;
|
||||
static int m_nCurrentSunCoreRed;
|
||||
static int m_nCurrentSunCoreGreen;
|
||||
static int m_nCurrentSunCoreBlue;
|
||||
static int m_nCurrentSunCoronaRed;
|
||||
static int m_nCurrentSunCoronaGreen;
|
||||
static int m_nCurrentSunCoronaBlue;
|
||||
static int32 m_nCurrentSkyTopRed;
|
||||
static int32 m_nCurrentSkyTopGreen;
|
||||
static int32 m_nCurrentSkyTopBlue;
|
||||
static int32 m_nCurrentSkyBottomRed;
|
||||
static int32 m_nCurrentSkyBottomGreen;
|
||||
static int32 m_nCurrentSkyBottomBlue;
|
||||
static int32 m_nCurrentSunCoreRed;
|
||||
static int32 m_nCurrentSunCoreGreen;
|
||||
static int32 m_nCurrentSunCoreBlue;
|
||||
static int32 m_nCurrentSunCoronaRed;
|
||||
static int32 m_nCurrentSunCoronaGreen;
|
||||
static int32 m_nCurrentSunCoronaBlue;
|
||||
static float m_fCurrentSunSize;
|
||||
static float m_fCurrentSpriteSize;
|
||||
static float m_fCurrentSpriteBrightness;
|
||||
static int m_nCurrentShadowStrength;
|
||||
static int m_nCurrentLightShadowStrength;
|
||||
static int m_nCurrentPoleShadowStrength;
|
||||
static int32 m_nCurrentShadowStrength;
|
||||
static int32 m_nCurrentLightShadowStrength;
|
||||
static int32 m_nCurrentPoleShadowStrength;
|
||||
static float m_fCurrentFogStart;
|
||||
static float m_fCurrentFarClip;
|
||||
static float m_fCurrentLightsOnGroundBrightness;
|
||||
static int m_nCurrentLowCloudsRed;
|
||||
static int m_nCurrentLowCloudsGreen;
|
||||
static int m_nCurrentLowCloudsBlue;
|
||||
static int m_nCurrentFluffyCloudsTopRed;
|
||||
static int m_nCurrentFluffyCloudsTopGreen;
|
||||
static int m_nCurrentFluffyCloudsTopBlue;
|
||||
static int m_nCurrentFluffyCloudsBottomRed;
|
||||
static int m_nCurrentFluffyCloudsBottomGreen;
|
||||
static int m_nCurrentFluffyCloudsBottomBlue;
|
||||
static int32 m_nCurrentLowCloudsRed;
|
||||
static int32 m_nCurrentLowCloudsGreen;
|
||||
static int32 m_nCurrentLowCloudsBlue;
|
||||
static int32 m_nCurrentFluffyCloudsTopRed;
|
||||
static int32 m_nCurrentFluffyCloudsTopGreen;
|
||||
static int32 m_nCurrentFluffyCloudsTopBlue;
|
||||
static int32 m_nCurrentFluffyCloudsBottomRed;
|
||||
static int32 m_nCurrentFluffyCloudsBottomGreen;
|
||||
static int32 m_nCurrentFluffyCloudsBottomBlue;
|
||||
static float m_fCurrentBlurRed;
|
||||
static float m_fCurrentBlurGreen;
|
||||
static float m_fCurrentBlurBlue;
|
||||
@ -107,14 +107,17 @@ class CTimeCycle
|
||||
static float m_fCurrentWaterGreen;
|
||||
static float m_fCurrentWaterBlue;
|
||||
static float m_fCurrentWaterAlpha;
|
||||
static int m_nCurrentFogColourRed;
|
||||
static int m_nCurrentFogColourGreen;
|
||||
static int m_nCurrentFogColourBlue;
|
||||
static int32 m_nCurrentFogColourRed;
|
||||
static int32 m_nCurrentFogColourGreen;
|
||||
static int32 m_nCurrentFogColourBlue;
|
||||
|
||||
static int m_FogReduction;
|
||||
static int32 m_FogReduction;
|
||||
|
||||
public:
|
||||
static int m_CurrentStoredValue;
|
||||
static int32 m_bExtraColourOn;
|
||||
static int32 m_ExtraColour;
|
||||
static float m_ExtraColourInter;
|
||||
static int32 m_CurrentStoredValue;
|
||||
static CVector m_VectorToSun[16];
|
||||
static float m_fShadowFrontX[16];
|
||||
static float m_fShadowFrontY[16];
|
||||
@ -138,51 +141,56 @@ public:
|
||||
static float GetDirectionalRed(void) { return m_fCurrentDirectionalRed; }
|
||||
static float GetDirectionalGreen(void) { return m_fCurrentDirectionalGreen; }
|
||||
static float GetDirectionalBlue(void) { return m_fCurrentDirectionalBlue; }
|
||||
static int GetSkyTopRed(void) { return m_nCurrentSkyTopRed; }
|
||||
static int GetSkyTopGreen(void) { return m_nCurrentSkyTopGreen; }
|
||||
static int GetSkyTopBlue(void) { return m_nCurrentSkyTopBlue; }
|
||||
static int GetSkyBottomRed(void) { return m_nCurrentSkyBottomRed; }
|
||||
static int GetSkyBottomGreen(void) { return m_nCurrentSkyBottomGreen; }
|
||||
static int GetSkyBottomBlue(void) { return m_nCurrentSkyBottomBlue; }
|
||||
static int GetSunCoreRed(void) { return m_nCurrentSunCoreRed; }
|
||||
static int GetSunCoreGreen(void) { return m_nCurrentSunCoreGreen; }
|
||||
static int GetSunCoreBlue(void) { return m_nCurrentSunCoreBlue; }
|
||||
static int GetSunCoronaRed(void) { return m_nCurrentSunCoronaRed; }
|
||||
static int GetSunCoronaGreen(void) { return m_nCurrentSunCoronaGreen; }
|
||||
static int GetSunCoronaBlue(void) { return m_nCurrentSunCoronaBlue; }
|
||||
static int32 GetSkyTopRed(void) { return m_nCurrentSkyTopRed; }
|
||||
static int32 GetSkyTopGreen(void) { return m_nCurrentSkyTopGreen; }
|
||||
static int32 GetSkyTopBlue(void) { return m_nCurrentSkyTopBlue; }
|
||||
static int32 GetSkyBottomRed(void) { return m_nCurrentSkyBottomRed; }
|
||||
static int32 GetSkyBottomGreen(void) { return m_nCurrentSkyBottomGreen; }
|
||||
static int32 GetSkyBottomBlue(void) { return m_nCurrentSkyBottomBlue; }
|
||||
static int32 GetSunCoreRed(void) { return m_nCurrentSunCoreRed; }
|
||||
static int32 GetSunCoreGreen(void) { return m_nCurrentSunCoreGreen; }
|
||||
static int32 GetSunCoreBlue(void) { return m_nCurrentSunCoreBlue; }
|
||||
static int32 GetSunCoronaRed(void) { return m_nCurrentSunCoronaRed; }
|
||||
static int32 GetSunCoronaGreen(void) { return m_nCurrentSunCoronaGreen; }
|
||||
static int32 GetSunCoronaBlue(void) { return m_nCurrentSunCoronaBlue; }
|
||||
static float GetSunSize(void) { return m_fCurrentSunSize; }
|
||||
static float GetSpriteBrightness(void) { return m_fCurrentSpriteBrightness; }
|
||||
static float GetSpriteSize(void) { return m_fCurrentSpriteSize; }
|
||||
static int GetShadowStrength(void) { return m_nCurrentShadowStrength; }
|
||||
static int GetLightShadowStrength(void) { return m_nCurrentLightShadowStrength; }
|
||||
static int32 GetShadowStrength(void) { return m_nCurrentShadowStrength; }
|
||||
static int32 GetLightShadowStrength(void) { return m_nCurrentLightShadowStrength; }
|
||||
static float GetLightOnGroundBrightness(void) { return m_fCurrentLightsOnGroundBrightness; }
|
||||
static float GetFarClip(void) { return m_fCurrentFarClip; }
|
||||
static float GetFogStart(void) { return m_fCurrentFogStart; }
|
||||
|
||||
static int GetLowCloudsRed(void) { return m_nCurrentLowCloudsRed; }
|
||||
static int GetLowCloudsGreen(void) { return m_nCurrentLowCloudsGreen; }
|
||||
static int GetLowCloudsBlue(void) { return m_nCurrentLowCloudsBlue; }
|
||||
static int GetFluffyCloudsTopRed(void) { return m_nCurrentFluffyCloudsTopRed; }
|
||||
static int GetFluffyCloudsTopGreen(void) { return m_nCurrentFluffyCloudsTopGreen; }
|
||||
static int GetFluffyCloudsTopBlue(void) { return m_nCurrentFluffyCloudsTopBlue; }
|
||||
static int GetFluffyCloudsBottomRed(void) { return m_nCurrentFluffyCloudsBottomRed; }
|
||||
static int GetFluffyCloudsBottomGreen(void) { return m_nCurrentFluffyCloudsBottomGreen; }
|
||||
static int GetFluffyCloudsBottomBlue(void) { return m_nCurrentFluffyCloudsBottomBlue; }
|
||||
static int GetFogRed(void) { return m_nCurrentFogColourRed; }
|
||||
static int GetFogGreen(void) { return m_nCurrentFogColourGreen; }
|
||||
static int GetFogBlue(void) { return m_nCurrentFogColourBlue; }
|
||||
static int GetFogReduction(void) { return m_FogReduction; }
|
||||
static int32 GetLowCloudsRed(void) { return m_nCurrentLowCloudsRed; }
|
||||
static int32 GetLowCloudsGreen(void) { return m_nCurrentLowCloudsGreen; }
|
||||
static int32 GetLowCloudsBlue(void) { return m_nCurrentLowCloudsBlue; }
|
||||
static int32 GetFluffyCloudsTopRed(void) { return m_nCurrentFluffyCloudsTopRed; }
|
||||
static int32 GetFluffyCloudsTopGreen(void) { return m_nCurrentFluffyCloudsTopGreen; }
|
||||
static int32 GetFluffyCloudsTopBlue(void) { return m_nCurrentFluffyCloudsTopBlue; }
|
||||
static int32 GetFluffyCloudsBottomRed(void) { return m_nCurrentFluffyCloudsBottomRed; }
|
||||
static int32 GetFluffyCloudsBottomGreen(void) { return m_nCurrentFluffyCloudsBottomGreen; }
|
||||
static int32 GetFluffyCloudsBottomBlue(void) { return m_nCurrentFluffyCloudsBottomBlue; }
|
||||
static int32 GetFogRed(void) { return m_nCurrentFogColourRed; }
|
||||
static int32 GetFogGreen(void) { return m_nCurrentFogColourGreen; }
|
||||
static int32 GetFogBlue(void) { return m_nCurrentFogColourBlue; }
|
||||
static int32 GetFogReduction(void) { return m_FogReduction; }
|
||||
|
||||
static int GetBlurRed(void) { return m_fCurrentBlurRed; }
|
||||
static int GetBlurGreen(void) { return m_fCurrentBlurGreen; }
|
||||
static int GetBlurBlue(void) { return m_fCurrentBlurBlue; }
|
||||
static int GetWaterRed(void) { return m_fCurrentWaterRed; }
|
||||
static int GetWaterGreen(void) { return m_fCurrentWaterGreen; }
|
||||
static int GetWaterBlue(void) { return m_fCurrentWaterBlue; }
|
||||
static int GetWaterAlpha(void) { return m_fCurrentWaterAlpha; }
|
||||
static int32 GetBlurRed(void) { return m_fCurrentBlurRed; }
|
||||
static int32 GetBlurGreen(void) { return m_fCurrentBlurGreen; }
|
||||
static int32 GetBlurBlue(void) { return m_fCurrentBlurBlue; }
|
||||
static int32 GetWaterRed(void) { return m_fCurrentWaterRed; }
|
||||
static int32 GetWaterGreen(void) { return m_fCurrentWaterGreen; }
|
||||
static int32 GetWaterBlue(void) { return m_fCurrentWaterBlue; }
|
||||
static int32 GetWaterAlpha(void) { return m_fCurrentWaterAlpha; }
|
||||
|
||||
static void Initialise(void);
|
||||
static void Update(void);
|
||||
static float Interpolate(int8 *a, int8 *b);
|
||||
static float Interpolate(uint8 *a, uint8 *b);
|
||||
static float Interpolate(int16 *a, int16 *b);
|
||||
static void StartExtraColour(int32 c, bool fade);
|
||||
static void StopExtraColour(bool fade);
|
||||
static CVector &GetSunDirection(void) { return m_VectorToSun[m_CurrentStoredValue]; }
|
||||
static float GetShadowFrontX(void) { return m_fShadowFrontX[m_CurrentStoredValue]; }
|
||||
static float GetShadowFrontY(void) { return m_fShadowFrontY[m_CurrentStoredValue]; }
|
||||
|
@ -6,7 +6,9 @@ enum {
|
||||
WEATHER_FOGGY,
|
||||
WEATHER_EXTRA_SUNNY,
|
||||
WEATHER_HURRICANE,
|
||||
WEATHER_TOTAL
|
||||
WEATHER_TOTAL,
|
||||
|
||||
WEATHER_EXTRACOLOURS = 6
|
||||
};
|
||||
|
||||
class CWeather
|
||||
|
@ -1,13 +1,51 @@
|
||||
#include "common.h"
|
||||
#include "WindModifiers.h"
|
||||
#include "Camera.h"
|
||||
#include "General.h"
|
||||
|
||||
#define MAX_HEIGHT_DIST 40.0f
|
||||
#define MIN_FADE_DIST 20.0f
|
||||
#define MAX_FADE_DIST 50.0f
|
||||
|
||||
CWindModifiers Array[16];
|
||||
int32 CWindModifiers::Number;
|
||||
|
||||
void
|
||||
CWindModifiers::RegisterOne(CVector pos, int32 unk)
|
||||
CWindModifiers::RegisterOne(CVector pos, int32 type = 1)
|
||||
{
|
||||
if (CWindModifiers::Number < 16 && (pos - TheCamera.GetPosition()).Magnitude() < 100.0f) {
|
||||
Array[Number].m_pos = pos;
|
||||
Array[Number].m_type = type;
|
||||
Number++;
|
||||
}
|
||||
}
|
||||
|
||||
int32
|
||||
bool
|
||||
CWindModifiers::FindWindModifier(CVector pos, float *x, float *y)
|
||||
{
|
||||
return 0;
|
||||
bool bWasWindModifierFound = false;
|
||||
CVector2D dir;
|
||||
for (int i = 0; i < Number; i++) {
|
||||
if (Array[i].m_type == 1) {
|
||||
float zDist = Abs(15.0f + pos.z - Array[i].m_pos.z);
|
||||
|
||||
if (zDist < MAX_HEIGHT_DIST) {
|
||||
float dist = (pos - Array[i].m_pos).Magnitude();
|
||||
if (dist < MAX_FADE_DIST) {
|
||||
float distFade = dist < MIN_FADE_DIST ? 1.0f : 1.0f - (dist - MIN_FADE_DIST) / (MAX_FADE_DIST - MIN_FADE_DIST);
|
||||
float heightFade = 1.0f - zDist / MAX_HEIGHT_DIST;
|
||||
dir = (pos - Array[i].m_pos) * heightFade / dist;
|
||||
bWasWindModifierFound = true;
|
||||
}
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
if (bWasWindModifierFound) {
|
||||
float directionMult = ((CGeneral::GetRandomNumber() & 0x1F) - 16) * 0.0035f + 1.0f;
|
||||
*x += dir.x * directionMult;
|
||||
*y += dir.y * directionMult;
|
||||
}
|
||||
|
||||
return bWasWindModifierFound;
|
||||
}
|
||||
|
@ -2,7 +2,10 @@
|
||||
|
||||
class CWindModifiers
|
||||
{
|
||||
CVector m_pos;
|
||||
int32 m_type;
|
||||
public:
|
||||
static void RegisterOne(CVector pos, int32 unk);
|
||||
static int32 FindWindModifier(CVector pos, float *x, float *y);
|
||||
static int32 Number;
|
||||
static void RegisterOne(CVector pos, int32 windSourceType);
|
||||
static bool FindWindModifier(CVector pos, float *x, float *y);
|
||||
};
|
||||
|
@ -23,6 +23,13 @@ RwRGBAReal DirectionalLightColourForFrame;
|
||||
RwRGBAReal AmbientLightColour;
|
||||
RwRGBAReal DirectionalLightColour;
|
||||
|
||||
#ifdef EXTENDED_COLOURFILTER
|
||||
#include "postfx.h"
|
||||
#define USEBLURCOLORS CPostFX::UseBlurColours()
|
||||
#else
|
||||
#define USEBLURCOLORS CMBlur::BlurOn
|
||||
#endif
|
||||
|
||||
//--MIAMI: done
|
||||
void
|
||||
SetLightsWithTimeOfDayColour(RpWorld *)
|
||||
@ -31,7 +38,7 @@ SetLightsWithTimeOfDayColour(RpWorld *)
|
||||
RwMatrix mat;
|
||||
|
||||
if(pAmbient){
|
||||
if(CMBlur::BlurOn){
|
||||
if(USEBLURCOLORS){
|
||||
AmbientLightColourForFrame.red = CTimeCycle::GetAmbientRed_Bl() * CCoronas::LightsMult;
|
||||
AmbientLightColourForFrame.green = CTimeCycle::GetAmbientGreen_Bl() * CCoronas::LightsMult;
|
||||
AmbientLightColourForFrame.blue = CTimeCycle::GetAmbientBlue_Bl() * CCoronas::LightsMult;
|
||||
@ -41,7 +48,7 @@ SetLightsWithTimeOfDayColour(RpWorld *)
|
||||
AmbientLightColourForFrame.blue = CTimeCycle::GetAmbientBlue() * CCoronas::LightsMult;
|
||||
}
|
||||
|
||||
if(CMBlur::BlurOn){
|
||||
if(USEBLURCOLORS){
|
||||
AmbientLightColourForFrame_PedsCarsAndObjects.red = CTimeCycle::GetAmbientRed_Obj_Bl() * CCoronas::LightsMult;
|
||||
AmbientLightColourForFrame_PedsCarsAndObjects.green = CTimeCycle::GetAmbientGreen_Obj_Bl() * CCoronas::LightsMult;
|
||||
AmbientLightColourForFrame_PedsCarsAndObjects.blue = CTimeCycle::GetAmbientBlue_Obj_Bl() * CCoronas::LightsMult;
|
||||
|
@ -37,9 +37,10 @@
|
||||
#include "Weather.h"
|
||||
#include "World.h"
|
||||
#include "Zones.h"
|
||||
#include "Timecycle.h"
|
||||
|
||||
#define BLOCK_COUNT 20
|
||||
#define SIZE_OF_SIMPLEVARS 0xBC
|
||||
#define SIZE_OF_SIMPLEVARS 0xD4
|
||||
|
||||
const uint32 SIZE_OF_ONE_GAME_IN_BYTES = 201729;
|
||||
|
||||
@ -56,7 +57,7 @@ wchar SlotSaveDate[SLOT_COUNT][70];
|
||||
int CheckSum;
|
||||
eLevelName m_LevelToLoad;
|
||||
char SaveFileNameJustSaved[260];
|
||||
int Slots[SLOT_COUNT+1];
|
||||
int Slots[SLOT_COUNT];
|
||||
CDate CompileDateAndTime;
|
||||
|
||||
bool b_FoundRecentSavedGameWantToLoad;
|
||||
@ -187,6 +188,14 @@ GenericSave(int file)
|
||||
WriteDataToBufferPointer(buf, TheCamera.CarZoomIndicator);
|
||||
WriteDataToBufferPointer(buf, TheCamera.PedZoomIndicator);
|
||||
#endif
|
||||
WriteDataToBufferPointer(buf, CGame::currArea);
|
||||
WriteDataToBufferPointer(buf, CVehicle::bAllTaxisHaveNitro);
|
||||
// TODO(Miami): Pad invert Y
|
||||
bool invertY = 0;
|
||||
WriteDataToBufferPointer(buf, invertY);
|
||||
WriteDataToBufferPointer(buf, CTimeCycle::m_ExtraColour);
|
||||
WriteDataToBufferPointer(buf, CTimeCycle::m_bExtraColourOn);
|
||||
WriteDataToBufferPointer(buf, CTimeCycle::m_ExtraColourInter);
|
||||
assert(buf - work_buff == SIZE_OF_SIMPLEVARS);
|
||||
|
||||
// Save scripts, block is nested within the same block as simple vars for some reason
|
||||
@ -315,6 +324,14 @@ GenericLoad()
|
||||
ReadDataFromBufferPointer(buf, TheCamera.CarZoomIndicator);
|
||||
ReadDataFromBufferPointer(buf, TheCamera.PedZoomIndicator);
|
||||
#endif
|
||||
ReadDataFromBufferPointer(buf, CGame::currArea);
|
||||
ReadDataFromBufferPointer(buf, CVehicle::bAllTaxisHaveNitro);
|
||||
// TODO(Miami): Pad invert Y
|
||||
bool invertY = 0;
|
||||
ReadDataFromBufferPointer(buf, invertY);
|
||||
ReadDataFromBufferPointer(buf, CTimeCycle::m_ExtraColour);
|
||||
ReadDataFromBufferPointer(buf, CTimeCycle::m_bExtraColourOn);
|
||||
ReadDataFromBufferPointer(buf, CTimeCycle::m_ExtraColourInter);
|
||||
assert(buf - work_buff == SIZE_OF_SIMPLEVARS);
|
||||
#ifdef MISSION_REPLAY
|
||||
WaitForSave = 0;
|
||||
|
@ -31,7 +31,7 @@ extern wchar SlotFileName[SLOT_COUNT][260];
|
||||
extern wchar SlotSaveDate[SLOT_COUNT][70];
|
||||
extern int CheckSum;
|
||||
extern enum eLevelName m_LevelToLoad;
|
||||
extern int Slots[SLOT_COUNT+1];
|
||||
extern int Slots[SLOT_COUNT];
|
||||
|
||||
extern bool b_FoundRecentSavedGameWantToLoad;
|
||||
extern bool JustLoadedDontFadeInYet;
|
||||
|
@ -88,7 +88,7 @@ void
|
||||
C_PcSave::PopulateSlotInfo()
|
||||
{
|
||||
for (int i = 0; i < SLOT_COUNT; i++) {
|
||||
Slots[i + 1] = SLOT_EMPTY;
|
||||
Slots[i] = SLOT_EMPTY;
|
||||
SlotFileName[i][0] = '\0';
|
||||
SlotSaveDate[i][0] = '\0';
|
||||
}
|
||||
@ -108,14 +108,14 @@ C_PcSave::PopulateSlotInfo()
|
||||
if (file != 0) {
|
||||
CFileMgr::Read(file, (char*)&header, sizeof(header));
|
||||
if (strncmp((char*)&header, TopLineEmptyFile, sizeof(TopLineEmptyFile)-1) != 0) {
|
||||
Slots[i + 1] = SLOT_OK;
|
||||
Slots[i] = SLOT_OK;
|
||||
memcpy(SlotFileName[i], &header.FileName, sizeof(header.FileName));
|
||||
|
||||
SlotFileName[i][24] = '\0';
|
||||
}
|
||||
CFileMgr::CloseFile(file);
|
||||
}
|
||||
if (Slots[i + 1] == SLOT_OK) {
|
||||
if (Slots[i] == SLOT_OK) {
|
||||
if (CheckDataNotCorrupt(i, savename)) {
|
||||
SYSTEMTIME st;
|
||||
memcpy(&st, &header.SaveDateTime, sizeof(SYSTEMTIME));
|
||||
@ -147,7 +147,7 @@ C_PcSave::PopulateSlotInfo()
|
||||
|
||||
} else {
|
||||
CMessages::InsertNumberInString(TheText.Get("FEC_SLC"), i + 1, -1, -1, -1, -1, -1, SlotFileName[i]);
|
||||
Slots[i + 1] = SLOT_CORRUPTED;
|
||||
Slots[i] = SLOT_CORRUPTED;
|
||||
}
|
||||
}
|
||||
}
|
||||
|
@ -185,6 +185,22 @@ psCameraShowRaster(RwCamera *camera)
|
||||
return;
|
||||
}
|
||||
|
||||
/*
|
||||
*****************************************************************************
|
||||
*/
|
||||
RwImage *
|
||||
psGrabScreen(RwCamera *pCamera)
|
||||
{
|
||||
#ifndef LIBRW
|
||||
RwRaster *pRaster = RwCameraGetRaster(pCamera);
|
||||
if (RwImage *pImage = RwImageCreate(pRaster->width, pRaster->height, 32)) {
|
||||
RwImageAllocatePixels(pImage);
|
||||
RwImageSetFromRaster(pImage, pRaster);
|
||||
return pImage;
|
||||
}
|
||||
#endif
|
||||
return nil;
|
||||
}
|
||||
|
||||
/*
|
||||
*****************************************************************************
|
||||
@ -213,7 +229,11 @@ double
|
||||
psTimer(void)
|
||||
{
|
||||
struct timespec start;
|
||||
#ifdef __linux__
|
||||
clock_gettime(CLOCK_MONOTONIC_RAW, &start);
|
||||
#else
|
||||
clock_gettime(CLOCK_MONOTONIC, &start);
|
||||
#endif
|
||||
return start.tv_sec * 1000.0 + start.tv_nsec/1000000.0;
|
||||
}
|
||||
#endif
|
||||
@ -1386,7 +1406,7 @@ WinMain(HINSTANCE instance,
|
||||
RwChar** argv;
|
||||
SystemParametersInfo(SPI_SETFOREGROUNDLOCKTIMEOUT, 0, nil, SPIF_SENDCHANGE);
|
||||
|
||||
#if 0
|
||||
#if 1
|
||||
// TODO: make this an option somewhere
|
||||
AllocConsole();
|
||||
freopen("CONIN$", "r", stdin);
|
||||
|
@ -22,6 +22,7 @@ extern void psTerminate(void);
|
||||
|
||||
extern void psCameraShowRaster(RwCamera *camera);
|
||||
extern RwBool psCameraBeginUpdate(RwCamera *camera);
|
||||
extern RwImage *psGrabScreen(RwCamera *camera);
|
||||
|
||||
extern void psMouseSetPos(RwV2d *pos);
|
||||
|
||||
|
@ -50,6 +50,15 @@ RsCameraBeginUpdate(RwCamera * camera)
|
||||
return psCameraBeginUpdate(camera);
|
||||
}
|
||||
|
||||
/*
|
||||
*****************************************************************************
|
||||
*/
|
||||
RwImage*
|
||||
RsGrabScreen(RwCamera *camera)
|
||||
{
|
||||
return psGrabScreen(camera);
|
||||
}
|
||||
|
||||
/*
|
||||
*****************************************************************************
|
||||
*/
|
||||
|
@ -274,6 +274,9 @@ RsCameraBeginUpdate(RwCamera *camera);
|
||||
//extern void
|
||||
//RsMouseSetVisibility(RwBool visible);
|
||||
|
||||
extern RwImage*
|
||||
RsGrabScreen(RwCamera *camera);
|
||||
|
||||
extern void
|
||||
RsMouseSetPos(RwV2d *pos);
|
||||
|
||||
|
@ -242,6 +242,23 @@ psCameraShowRaster(RwCamera *camera)
|
||||
}
|
||||
|
||||
|
||||
/*
|
||||
*****************************************************************************
|
||||
*/
|
||||
RwImage *
|
||||
psGrabScreen(RwCamera *pCamera)
|
||||
{
|
||||
#ifndef LIBRW
|
||||
RwRaster *pRaster = RwCameraGetRaster(pCamera);
|
||||
if (RwImage *pImage = RwImageCreate(pRaster->width, pRaster->height, 32)) {
|
||||
RwImageAllocatePixels(pImage);
|
||||
RwImageSetFromRaster(pImage, pRaster);
|
||||
return pImage;
|
||||
}
|
||||
#endif
|
||||
return nil;
|
||||
}
|
||||
|
||||
/*
|
||||
*****************************************************************************
|
||||
*/
|
||||
@ -1863,7 +1880,11 @@ void PlayMovieInWindow(int cmdShow, const char* szFile)
|
||||
MultiByteToWideChar(CP_ACP, 0, szFile, -1, wFileName, sizeof(wFileName) - 1);
|
||||
|
||||
// Initialize COM
|
||||
#ifdef FIX_BUGS // will also return S_FALSE if it has already been inited in the same thread
|
||||
CoInitialize(nil);
|
||||
#else
|
||||
JIF(CoInitialize(nil));
|
||||
#endif
|
||||
|
||||
// Get the interface for DirectShow's GraphBuilder
|
||||
JIF(CoCreateInstance(CLSID_FilterGraph, nil, CLSCTX_INPROC,
|
||||
@ -2233,9 +2254,10 @@ WinMain(HINSTANCE instance,
|
||||
|
||||
case GS_INIT_INTRO_MPEG:
|
||||
{
|
||||
#ifndef NO_MOVIES
|
||||
CloseClip();
|
||||
|
||||
CoUninitialize();
|
||||
#endif
|
||||
|
||||
if ( FrontEndMenuManager.OS_Language == LANG_FRENCH || FrontEndMenuManager.OS_Language == LANG_GERMAN )
|
||||
PlayMovieInWindow(cmdShow, "movies\\GTAtitlesGER.mpg");
|
||||
@ -2269,8 +2291,10 @@ WinMain(HINSTANCE instance,
|
||||
|
||||
case GS_INIT_ONCE:
|
||||
{
|
||||
#ifndef NO_MOVIES
|
||||
CloseClip();
|
||||
CoUninitialize();
|
||||
#endif
|
||||
|
||||
#ifdef FIX_BUGS
|
||||
// draw one frame because otherwise we'll end up looking at black screen for a while if vsync is on
|
||||
|
Some files were not shown because too many files have changed in this diff Show More
Loading…
Reference in New Issue
Block a user