sync with master
This commit is contained in:
commit
1d5e3c7425
4
.gitignore
vendored
4
.gitignore
vendored
@ -348,3 +348,7 @@ healthchecksdb
|
|||||||
|
|
||||||
# Backup folder for Package Reference Convert tool in Visual Studio 2017
|
# Backup folder for Package Reference Convert tool in Visual Studio 2017
|
||||||
MigrationBackup/
|
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"]
|
[submodule "vendor/ogg"]
|
||||||
path = librw
|
path = vendor/ogg
|
||||||
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
|
|
||||||
url = https://github.com/xiph/ogg.git
|
url = https://github.com/xiph/ogg.git
|
||||||
branch = master
|
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
|
||||||
|
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",
|
trigger = "glewdir",
|
||||||
value = "PATH",
|
value = "PATH",
|
||||||
description = "Directory of GLEW",
|
description = "Directory of GLEW",
|
||||||
default = "glew-2.1.0"
|
default = "vendor/glew-2.1.0"
|
||||||
}
|
}
|
||||||
|
|
||||||
newoption {
|
newoption {
|
||||||
trigger = "glfwdir64",
|
trigger = "glfwdir64",
|
||||||
value = "PATH",
|
value = "PATH",
|
||||||
description = "Directory of glfw",
|
description = "Directory of glfw",
|
||||||
default = "glfw-3.3.2.bin.WIN64",
|
default = "vendor/glfw-3.3.2.bin.WIN64",
|
||||||
}
|
}
|
||||||
|
|
||||||
newoption {
|
newoption {
|
||||||
trigger = "glfwdir32",
|
trigger = "glfwdir32",
|
||||||
value = "PATH",
|
value = "PATH",
|
||||||
description = "Directory of glfw",
|
description = "Directory of glfw",
|
||||||
default = "glfw-3.3.2.bin.WIN32",
|
default = "vendor/glfw-3.3.2.bin.WIN32",
|
||||||
}
|
}
|
||||||
|
|
||||||
newoption {
|
newoption {
|
||||||
@ -30,9 +30,9 @@ newoption {
|
|||||||
}
|
}
|
||||||
|
|
||||||
if(_OPTIONS["with-librw"]) then
|
if(_OPTIONS["with-librw"]) then
|
||||||
Librw = "librw"
|
Librw = "vendor/librw"
|
||||||
else
|
else
|
||||||
Librw = os.getenv("LIBRW") or "librw"
|
Librw = os.getenv("LIBRW") or "vendor/librw"
|
||||||
end
|
end
|
||||||
|
|
||||||
function getsys(a)
|
function getsys(a)
|
||||||
@ -77,6 +77,11 @@ workspace "re3"
|
|||||||
"linux-arm-librw_gl3_glfw-oal",
|
"linux-arm-librw_gl3_glfw-oal",
|
||||||
}
|
}
|
||||||
|
|
||||||
|
filter { "system:bsd" }
|
||||||
|
platforms {
|
||||||
|
"bsd-amd64-librw_gl3_glfw-oal"
|
||||||
|
}
|
||||||
|
|
||||||
filter "configurations:Debug"
|
filter "configurations:Debug"
|
||||||
defines { "DEBUG" }
|
defines { "DEBUG" }
|
||||||
|
|
||||||
@ -90,6 +95,9 @@ workspace "re3"
|
|||||||
filter { "platforms:linux*" }
|
filter { "platforms:linux*" }
|
||||||
system "linux"
|
system "linux"
|
||||||
|
|
||||||
|
filter { "platforms:bsd*" }
|
||||||
|
system "bsd"
|
||||||
|
|
||||||
filter { "platforms:*x86*" }
|
filter { "platforms:*x86*" }
|
||||||
architecture "x86"
|
architecture "x86"
|
||||||
|
|
||||||
@ -144,9 +152,14 @@ if(_OPTIONS["with-librw"]) then
|
|||||||
project "librw"
|
project "librw"
|
||||||
kind "StaticLib"
|
kind "StaticLib"
|
||||||
targetname "rw"
|
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/*.*") }
|
||||||
files { path.join(Librw, "src/*/*.*") }
|
files { path.join(Librw, "src/*/*.*") }
|
||||||
|
|
||||||
|
filter "platforms:bsd*"
|
||||||
|
includedirs { "/usr/local/include" }
|
||||||
|
libdirs { "/usr/local/lib" }
|
||||||
|
|
||||||
filter "platforms:*RW33*"
|
filter "platforms:*RW33*"
|
||||||
flags { "ExcludeFromBuild" }
|
flags { "ExcludeFromBuild" }
|
||||||
filter {}
|
filter {}
|
||||||
@ -206,9 +219,9 @@ project "re3"
|
|||||||
includedirs { "src/extras" }
|
includedirs { "src/extras" }
|
||||||
|
|
||||||
if _OPTIONS["with-opus"] then
|
if _OPTIONS["with-opus"] then
|
||||||
includedirs { "ogg/include" }
|
includedirs { "vendor/ogg/include" }
|
||||||
includedirs { "opus/include" }
|
includedirs { "vendor/opus/include" }
|
||||||
includedirs { "opusfile/include" }
|
includedirs { "vendor/opusfile/include" }
|
||||||
end
|
end
|
||||||
|
|
||||||
filter "platforms:*mss"
|
filter "platforms:*mss"
|
||||||
@ -218,9 +231,9 @@ project "re3"
|
|||||||
|
|
||||||
if _OPTIONS["with-opus"] then
|
if _OPTIONS["with-opus"] then
|
||||||
filter "platforms:win*"
|
filter "platforms:win*"
|
||||||
libdirs { "ogg/win32/VS2015/Win32/%{cfg.buildcfg}" }
|
libdirs { "vendor/ogg/win32/VS2015/Win32/%{cfg.buildcfg}" }
|
||||||
libdirs { "opus/win32/VS2015/Win32/%{cfg.buildcfg}" }
|
libdirs { "vendor/opus/win32/VS2015/Win32/%{cfg.buildcfg}" }
|
||||||
libdirs { "opusfile/win32/VS2015/Win32/Release-NoHTTP" }
|
libdirs { "vendor/opusfile/win32/VS2015/Win32/Release-NoHTTP" }
|
||||||
filter {}
|
filter {}
|
||||||
defines { "AUDIO_OPUS" }
|
defines { "AUDIO_OPUS" }
|
||||||
end
|
end
|
||||||
@ -240,25 +253,27 @@ project "re3"
|
|||||||
characterset ("MBCS")
|
characterset ("MBCS")
|
||||||
targetextension ".exe"
|
targetextension ".exe"
|
||||||
|
|
||||||
|
filter "platforms:win*oal"
|
||||||
|
includedirs { "vendor/openal-soft/include" }
|
||||||
|
includedirs { "vendor/libsndfile/include" }
|
||||||
|
includedirs { "vendor/mpg123/include" }
|
||||||
|
|
||||||
filter "platforms:win-x86*oal"
|
filter "platforms:win-x86*oal"
|
||||||
includedirs { "openal-soft/include" }
|
libdirs { "vendor/mpg123/lib/Win32" }
|
||||||
includedirs { "libsndfile.32/include" }
|
libdirs { "vendor/libsndfile/lib/Win32" }
|
||||||
includedirs { "mpg123.32/include" }
|
libdirs { "vendor/openal-soft/libs/Win32" }
|
||||||
libdirs { "mpg123.32/lib" }
|
|
||||||
libdirs { "libsndfile.32/lib" }
|
|
||||||
libdirs { "openal-soft/libs/Win32" }
|
|
||||||
|
|
||||||
filter "platforms:win-amd64*oal"
|
filter "platforms:win-amd64*oal"
|
||||||
includedirs { "openal-soft/include" }
|
libdirs { "vendor/mpg123/lib/Win64" }
|
||||||
includedirs { "libsndfile.64/include" }
|
libdirs { "vendor/libsndfile/lib/Win64" }
|
||||||
includedirs { "mpg123.64/include" }
|
libdirs { "vendor/openal-soft/libs/Win64" }
|
||||||
libdirs { "mpg123.64/lib" }
|
|
||||||
libdirs { "libsndfile.64/lib" }
|
|
||||||
libdirs { "openal-soft/libs/Win64" }
|
|
||||||
|
|
||||||
filter "platforms:linux*oal"
|
filter "platforms:linux*oal"
|
||||||
links { "openal", "mpg123", "sndfile", "pthread" }
|
links { "openal", "mpg123", "sndfile", "pthread" }
|
||||||
|
|
||||||
|
filter "platforms:bsd*oal"
|
||||||
|
links { "openal", "mpg123", "sndfile", "pthread" }
|
||||||
|
|
||||||
if _OPTIONS["with-opus"] then
|
if _OPTIONS["with-opus"] then
|
||||||
filter {}
|
filter {}
|
||||||
links { "libogg" }
|
links { "libogg" }
|
||||||
@ -280,7 +295,7 @@ project "re3"
|
|||||||
includedirs { "src/fakerw" }
|
includedirs { "src/fakerw" }
|
||||||
includedirs { Librw }
|
includedirs { Librw }
|
||||||
if(_OPTIONS["with-librw"]) then
|
if(_OPTIONS["with-librw"]) then
|
||||||
libdirs { "lib/%{cfg.platform}/%{cfg.buildcfg}" }
|
libdirs { "vendor/librw/lib/%{cfg.platform}/%{cfg.buildcfg}" }
|
||||||
end
|
end
|
||||||
links { "rw" }
|
links { "rw" }
|
||||||
|
|
||||||
@ -306,3 +321,8 @@ project "re3"
|
|||||||
|
|
||||||
filter "platforms:linux*gl3_glfw*"
|
filter "platforms:linux*gl3_glfw*"
|
||||||
links { "GL", "GLEW", "glfw" }
|
links { "GL", "GLEW", "glfw" }
|
||||||
|
|
||||||
|
filter "platforms:bsd*gl3_glfw*"
|
||||||
|
links { "GL", "GLEW", "glfw", "sysinfo" }
|
||||||
|
includedirs { "/usr/local/include" }
|
||||||
|
libdirs { "/usr/local/lib" }
|
||||||
|
@ -587,16 +587,16 @@ cSampleManager::Initialise(void)
|
|||||||
}
|
}
|
||||||
|
|
||||||
nSampleBankMemoryStartAddress[SAMPLEBANK_MAIN] = (uintptr)malloc(nSampleBankSize[SAMPLEBANK_MAIN]);
|
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();
|
Terminate();
|
||||||
return false;
|
return false;
|
||||||
}
|
}
|
||||||
|
|
||||||
nSampleBankMemoryStartAddress[SAMPLEBANK_PED] = (uintptr)malloc(PED_BLOCKSIZE*MAX_PEDSFX);
|
nSampleBankMemoryStartAddress[SAMPLEBANK_PED] = (uintptr)malloc(PED_BLOCKSIZE*MAX_PEDSFX);
|
||||||
ASSERT(nSampleBankMemoryStartAddress[SAMPLEBANK_PED] != NULL);
|
ASSERT(nSampleBankMemoryStartAddress[SAMPLEBANK_PED] != 0);
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
||||||
|
@ -30,9 +30,9 @@ int8 CDarkel::InterruptedWeapon;
|
|||||||
* makes game handle sounds & messages instead of SCM (just like in GTA2)
|
* 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.
|
* but it's never been used in the game. Has unused sliding text when frenzy completed etc.
|
||||||
*/
|
*/
|
||||||
int8 CDarkel::bStandardSoundAndMessages;
|
bool CDarkel::bStandardSoundAndMessages;
|
||||||
int8 CDarkel::bNeedHeadShot;
|
bool CDarkel::bNeedHeadShot;
|
||||||
int8 CDarkel::bProperKillFrenzy;
|
bool CDarkel::bProperKillFrenzy;
|
||||||
uint16 CDarkel::Status;
|
uint16 CDarkel::Status;
|
||||||
uint16 CDarkel::RegisteredKills[NUM_DEFAULT_MODELS];
|
uint16 CDarkel::RegisteredKills[NUM_DEFAULT_MODELS];
|
||||||
int32 CDarkel::ModelToKill;
|
int32 CDarkel::ModelToKill;
|
||||||
@ -108,9 +108,15 @@ CDarkel::DrawMessages()
|
|||||||
sprintf(gString, "%d", (CDarkel::KillsNeeded >= 0 ? CDarkel::KillsNeeded : 0));
|
sprintf(gString, "%d", (CDarkel::KillsNeeded >= 0 ? CDarkel::KillsNeeded : 0));
|
||||||
AsciiToUnicode(gString, gUString);
|
AsciiToUnicode(gString, gUString);
|
||||||
CFont::SetColor(CRGBA(0, 0, 0, 255));
|
CFont::SetColor(CRGBA(0, 0, 0, 255));
|
||||||
CFont::PrintString(SCREEN_SCALE_FROM_RIGHT(35.0f), SCREEN_SCALE_Y(144.0f), gUString);
|
#ifdef FIX_BUGS
|
||||||
|
#define DARKEL_COUNTER_HEIGHT 143.0f
|
||||||
|
#else
|
||||||
|
#define DARKEL_COUNTER_HEIGHT 128.0f
|
||||||
|
#endif
|
||||||
|
CFont::PrintString(SCREEN_SCALE_FROM_RIGHT(35.0f), SCREEN_SCALE_Y(DARKEL_COUNTER_HEIGHT + 1.0f), gUString);
|
||||||
CFont::SetColor(CRGBA(255, 128, 128, 255));
|
CFont::SetColor(CRGBA(255, 128, 128, 255));
|
||||||
CFont::PrintString(SCREEN_SCALE_FROM_RIGHT(34.0f), SCREEN_SCALE_Y(143.0f), gUString);
|
CFont::PrintString(SCREEN_SCALE_FROM_RIGHT(34.0f), SCREEN_SCALE_Y(DARKEL_COUNTER_HEIGHT), gUString);
|
||||||
|
#undef DARKEL_COUNTER_HEIGHT
|
||||||
break;
|
break;
|
||||||
}
|
}
|
||||||
case KILLFRENZY_PASSED:
|
case KILLFRENZY_PASSED:
|
||||||
|
@ -24,9 +24,9 @@ private:
|
|||||||
static int32 AmmoInterruptedWeapon;
|
static int32 AmmoInterruptedWeapon;
|
||||||
static int32 KillsNeeded;
|
static int32 KillsNeeded;
|
||||||
static int8 InterruptedWeapon;
|
static int8 InterruptedWeapon;
|
||||||
static int8 bStandardSoundAndMessages;
|
static bool bStandardSoundAndMessages;
|
||||||
static int8 bNeedHeadShot;
|
static bool bNeedHeadShot;
|
||||||
static int8 bProperKillFrenzy;
|
static bool bProperKillFrenzy;
|
||||||
static uint16 Status;
|
static uint16 Status;
|
||||||
static uint16 RegisteredKills[NUM_DEFAULT_MODELS];
|
static uint16 RegisteredKills[NUM_DEFAULT_MODELS];
|
||||||
static int32 ModelToKill;
|
static int32 ModelToKill;
|
||||||
|
@ -150,9 +150,11 @@ CdStreamInit(int32 numChannels)
|
|||||||
ASSERT(0);
|
ASSERT(0);
|
||||||
return;
|
return;
|
||||||
}
|
}
|
||||||
|
#ifdef __linux__
|
||||||
_gdwCdStreamFlags = O_RDONLY | O_NOATIME;
|
_gdwCdStreamFlags = O_RDONLY | O_NOATIME;
|
||||||
|
#else
|
||||||
|
_gdwCdStreamFlags = O_RDONLY;
|
||||||
|
#endif
|
||||||
// People say it's slower
|
// People say it's slower
|
||||||
/*
|
/*
|
||||||
if ( fsInfo.f_bsize <= CDSTREAM_SECTOR_SIZE )
|
if ( fsInfo.f_bsize <= CDSTREAM_SECTOR_SIZE )
|
||||||
@ -400,8 +402,11 @@ void *CdStreamThread(void *param)
|
|||||||
if (gCdStreamThreadStatus == 0){
|
if (gCdStreamThreadStatus == 0){
|
||||||
gCdStreamThreadStatus = 1;
|
gCdStreamThreadStatus = 1;
|
||||||
#endif
|
#endif
|
||||||
|
|
||||||
|
#ifdef __linux__
|
||||||
pid_t tid = syscall(SYS_gettid);
|
pid_t tid = syscall(SYS_gettid);
|
||||||
int ret = setpriority(PRIO_PROCESS, tid, getpriority(PRIO_PROCESS, getpid()) + 1);
|
int ret = setpriority(PRIO_PROCESS, tid, getpriority(PRIO_PROCESS, getpid()) + 1);
|
||||||
|
#endif
|
||||||
}
|
}
|
||||||
|
|
||||||
// spurious wakeup or we sent interrupt signal for flushing
|
// spurious wakeup or we sent interrupt signal for flushing
|
||||||
|
@ -633,6 +633,11 @@ void CControllerConfigManager::AffectControllerStateOn_ButtonDown(int32 button,
|
|||||||
}
|
}
|
||||||
|
|
||||||
AffectControllerStateOn_ButtonDown_AllStates(button, type, *state);
|
AffectControllerStateOn_ButtonDown_AllStates(button, type, *state);
|
||||||
|
|
||||||
|
#ifdef REGISTER_START_BUTTON
|
||||||
|
if (button == 12)
|
||||||
|
state->Start = 255;
|
||||||
|
#endif
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
@ -1036,6 +1041,11 @@ void CControllerConfigManager::AffectControllerStateOn_ButtonUp(int32 button, eC
|
|||||||
{
|
{
|
||||||
if (FrontEndMenuManager.GetIsMenuActive())
|
if (FrontEndMenuManager.GetIsMenuActive())
|
||||||
AffectControllerStateOn_ButtonUp_All_Player_States(button, type, *state);
|
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 bool ReadLine(int fd, char *buf, int len);
|
||||||
static int CloseFile(int fd);
|
static int CloseFile(int fd);
|
||||||
static int GetErrorReadWrite(int fd);
|
static int GetErrorReadWrite(int fd);
|
||||||
|
static char *GetRootDirName() { return ms_rootDirName; }
|
||||||
};
|
};
|
||||||
|
@ -87,6 +87,7 @@
|
|||||||
#include "Zones.h"
|
#include "Zones.h"
|
||||||
#include "debugmenu.h"
|
#include "debugmenu.h"
|
||||||
#include "frontendoption.h"
|
#include "frontendoption.h"
|
||||||
|
#include "postfx.h"
|
||||||
|
|
||||||
eLevelName CGame::currLevel;
|
eLevelName CGame::currLevel;
|
||||||
bool CGame::bDemoMode = true;
|
bool CGame::bDemoMode = true;
|
||||||
@ -148,6 +149,9 @@ CGame::InitialiseOnceBeforeRW(void)
|
|||||||
CFileMgr::Initialise();
|
CFileMgr::Initialise();
|
||||||
CdStreamInit(MAX_CDCHANNELS);
|
CdStreamInit(MAX_CDCHANNELS);
|
||||||
ValidateVersion();
|
ValidateVersion();
|
||||||
|
#ifdef EXTENDED_COLOURFILTER
|
||||||
|
CPostFX::InitOnce();
|
||||||
|
#endif
|
||||||
return true;
|
return true;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
@ -208,6 +208,7 @@ enum Config {
|
|||||||
//#define NO_ISLAND_LOADING // disable loadscreen between islands via loading all island data at once, consumes more memory and CPU
|
//#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 USE_TEXTURE_POOL
|
||||||
#define CUTSCENE_BORDERS_SWITCH
|
#define CUTSCENE_BORDERS_SWITCH
|
||||||
|
//#define EXTENDED_COLOURFILTER // more options for colour filter (replaces mblur)
|
||||||
|
|
||||||
// Particle
|
// Particle
|
||||||
//#define PC_PARTICLE
|
//#define PC_PARTICLE
|
||||||
|
@ -2,6 +2,7 @@
|
|||||||
#include "rpmatfx.h"
|
#include "rpmatfx.h"
|
||||||
#include "rphanim.h"
|
#include "rphanim.h"
|
||||||
#include "rpskin.h"
|
#include "rpskin.h"
|
||||||
|
#include "rtbmp.h"
|
||||||
|
|
||||||
#include "main.h"
|
#include "main.h"
|
||||||
#include "CdStream.h"
|
#include "CdStream.h"
|
||||||
@ -61,6 +62,7 @@
|
|||||||
#include "MemoryCard.h"
|
#include "MemoryCard.h"
|
||||||
#include "SceneEdit.h"
|
#include "SceneEdit.h"
|
||||||
#include "debugmenu.h"
|
#include "debugmenu.h"
|
||||||
|
#include "Clock.h"
|
||||||
|
|
||||||
GlobalScene Scene;
|
GlobalScene Scene;
|
||||||
|
|
||||||
@ -288,6 +290,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
|
void
|
||||||
DoRWStuffEndOfFrame(void)
|
DoRWStuffEndOfFrame(void)
|
||||||
{
|
{
|
||||||
@ -296,6 +320,20 @@ DoRWStuffEndOfFrame(void)
|
|||||||
FlushObrsPrintfs();
|
FlushObrsPrintfs();
|
||||||
RwCameraEndUpdate(Scene.camera);
|
RwCameraEndUpdate(Scene.camera);
|
||||||
RsCameraShowRaster(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
|
static RwBool
|
||||||
|
@ -29,6 +29,8 @@
|
|||||||
#include "Text.h"
|
#include "Text.h"
|
||||||
#include "WaterLevel.h"
|
#include "WaterLevel.h"
|
||||||
#include "main.h"
|
#include "main.h"
|
||||||
|
#include "MBlur.h"
|
||||||
|
#include "postfx.h"
|
||||||
|
|
||||||
#ifndef _WIN32
|
#ifndef _WIN32
|
||||||
#include "assert.h"
|
#include "assert.h"
|
||||||
@ -461,6 +463,13 @@ DebugMenuPopulate(void)
|
|||||||
DebugMenuAddVarBool8("Render", "Frame limiter", &FrontEndMenuManager.m_PrefsFrameLimiter, nil);
|
DebugMenuAddVarBool8("Render", "Frame limiter", &FrontEndMenuManager.m_PrefsFrameLimiter, nil);
|
||||||
DebugMenuAddVarBool8("Render", "VSynch", &FrontEndMenuManager.m_PrefsVsync, nil);
|
DebugMenuAddVarBool8("Render", "VSynch", &FrontEndMenuManager.m_PrefsVsync, nil);
|
||||||
DebugMenuAddVar("Render", "Max FPS", &RsGlobal.maxFPS, nil, 1, 1, 1000, 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", "Motion Blur", &CPostFX::MotionBlurOn, nil);
|
||||||
|
#endif
|
||||||
DebugMenuAddVarBool8("Render", "Show Ped Paths", &gbShowPedPaths, nil);
|
DebugMenuAddVarBool8("Render", "Show Ped Paths", &gbShowPedPaths, nil);
|
||||||
DebugMenuAddVarBool8("Render", "Show Car Paths", &gbShowCarPaths, nil);
|
DebugMenuAddVarBool8("Render", "Show Car Paths", &gbShowCarPaths, nil);
|
||||||
DebugMenuAddVarBool8("Render", "Show Car Path Links", &gbShowCarPathsLinks, nil);
|
DebugMenuAddVarBool8("Render", "Show Car Path Links", &gbShowCarPathsLinks, nil);
|
||||||
|
475
src/extras/postfx.cpp
Normal file
475
src/extras/postfx.cpp
Normal file
@ -0,0 +1,475 @@
|
|||||||
|
#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::MotionBlurOn = false;
|
||||||
|
|
||||||
|
static RwIm2DVertex Vertex[4];
|
||||||
|
static RwIm2DVertex Vertex2[4];
|
||||||
|
static RwImVertexIndex Index[6] = { 0, 1, 2, 0, 2, 3 };
|
||||||
|
|
||||||
|
#ifdef RW_D3D9
|
||||||
|
void *colourfilterIII_PS;
|
||||||
|
void *contrast_PS;
|
||||||
|
#endif
|
||||||
|
#ifdef RW_OPENGL
|
||||||
|
int32 u_blurcolor;
|
||||||
|
int32 u_contrastAdd;
|
||||||
|
int32 u_contrastMult;
|
||||||
|
rw::gl3::Shader *colourFilterIII;
|
||||||
|
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/colourfilterIII_PS.inc"
|
||||||
|
colourfilterIII_PS = rw::d3d::createPixelShader(colourfilterIII_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/colourfilterIII_fs_gl2.inc"
|
||||||
|
#else
|
||||||
|
#include "shaders/im2d_gl3.inc"
|
||||||
|
#include "shaders/colourfilterIII_fs_gl3.inc"
|
||||||
|
#endif
|
||||||
|
const char *vs[] = { shaderDecl, header_vert_src, im2d_vert_src, nil };
|
||||||
|
const char *fs[] = { shaderDecl, header_frag_src, colourfilterIII_frag_src, nil };
|
||||||
|
colourFilterIII = Shader::create(vs, fs);
|
||||||
|
assert(colourFilterIII);
|
||||||
|
}
|
||||||
|
|
||||||
|
{
|
||||||
|
#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(colourfilterIII_PS){
|
||||||
|
rw::d3d::destroyPixelShader(colourfilterIII_PS);
|
||||||
|
colourfilterIII_PS = nil;
|
||||||
|
}
|
||||||
|
if(contrast_PS){
|
||||||
|
rw::d3d::destroyPixelShader(contrast_PS);
|
||||||
|
contrast_PS = nil;
|
||||||
|
}
|
||||||
|
#endif
|
||||||
|
#ifdef RW_OPENGL
|
||||||
|
if(colourFilterIII){
|
||||||
|
colourFilterIII->destroy();
|
||||||
|
colourFilterIII = 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, g, b, a);
|
||||||
|
RwIm2DVertexSetIntRGBA(&Vertex[1], r, g, b, a);
|
||||||
|
RwIm2DVertexSetIntRGBA(&Vertex[2], r, g, b, a);
|
||||||
|
RwIm2DVertexSetIntRGBA(&Vertex[3], r, g, b, a);
|
||||||
|
|
||||||
|
RwRenderStateSet(rwRENDERSTATESRCBLEND, (void*)rwBLENDSRCALPHA);
|
||||||
|
RwRenderStateSet(rwRENDERSTATEDESTBLEND, (void*)rwBLENDINVSRCALPHA);
|
||||||
|
|
||||||
|
RwIm2DRenderIndexedPrimitive(rwPRIMTYPETRILIST, Vertex, 4, Index, 6);
|
||||||
|
}
|
||||||
|
|
||||||
|
void
|
||||||
|
CPostFX::RenderOverlaySimple(RwCamera *cam, int32 r, int32 g, int32 b, int32 a)
|
||||||
|
{
|
||||||
|
RwRenderStateSet(rwRENDERSTATETEXTURERASTER, nil);
|
||||||
|
RwRenderStateSet(rwRENDERSTATEVERTEXALPHAENABLE, (void*)TRUE);
|
||||||
|
|
||||||
|
r *= 0.6f;
|
||||||
|
g *= 0.6f;
|
||||||
|
b *= 0.6f;
|
||||||
|
a *= 0.6f;
|
||||||
|
|
||||||
|
RwIm2DVertexSetIntRGBA(&Vertex[0], r, g, b, a);
|
||||||
|
RwIm2DVertexSetIntRGBA(&Vertex[1], r, g, b, a);
|
||||||
|
RwIm2DVertexSetIntRGBA(&Vertex[2], r, g, b, a);
|
||||||
|
RwIm2DVertexSetIntRGBA(&Vertex[3], r, g, b, a);
|
||||||
|
|
||||||
|
RwRenderStateSet(rwRENDERSTATESRCBLEND, (void*)rwBLENDSRCALPHA);
|
||||||
|
RwRenderStateSet(rwRENDERSTATEDESTBLEND, (void*)rwBLENDINVSRCALPHA);
|
||||||
|
|
||||||
|
RwIm2DRenderIndexedPrimitive(rwPRIMTYPETRILIST, 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)/384.0f + 1.14f;
|
||||||
|
mult[1] = (g-64)/384.0f + 1.14f;
|
||||||
|
mult[2] = (b-64)/384.0f + 1.14f;
|
||||||
|
add[0] = r/1536.f;
|
||||||
|
add[1] = g/1536.f;
|
||||||
|
add[2] = b/1536.f;
|
||||||
|
#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/255.0f;
|
||||||
|
blurcolors[1] = g/255.0f;
|
||||||
|
blurcolors[2] = b/255.0f;
|
||||||
|
blurcolors[3] = a*f/255.0f;
|
||||||
|
#ifdef RW_D3D9
|
||||||
|
rw::d3d::d3ddevice->SetPixelShaderConstantF(10, blurcolors, 1);
|
||||||
|
rw::d3d::im2dOverridePS = colourfilterIII_PS;
|
||||||
|
#endif
|
||||||
|
#ifdef RW_OPENGL
|
||||||
|
rw::gl3::im2dOverrideShader = colourFilterIII;
|
||||||
|
colourFilterIII->use();
|
||||||
|
glUniform4fv(colourFilterIII->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:
|
||||||
|
// no actual rendering here
|
||||||
|
return false;
|
||||||
|
case POSTFX_SIMPLE:
|
||||||
|
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(MotionBlurOn)
|
||||||
|
return true;
|
||||||
|
if(type == MOTION_BLUR_SNIPER)
|
||||||
|
return true;
|
||||||
|
|
||||||
|
return false;
|
||||||
|
}
|
||||||
|
|
||||||
|
void
|
||||||
|
CPostFX::Render(RwCamera *cam, uint32 red, uint32 green, uint32 blue, uint32 blur, int32 type, uint32 bluralpha)
|
||||||
|
{
|
||||||
|
switch(type)
|
||||||
|
{
|
||||||
|
case MOTION_BLUR_SECURITY_CAM:
|
||||||
|
red = 0;
|
||||||
|
green = 255;
|
||||||
|
blue = 0;
|
||||||
|
blur = 128;
|
||||||
|
break;
|
||||||
|
case MOTION_BLUR_INTRO:
|
||||||
|
red = 100;
|
||||||
|
green = 220;
|
||||||
|
blue = 230;
|
||||||
|
blur = 158;
|
||||||
|
break;
|
||||||
|
case MOTION_BLUR_INTRO2:
|
||||||
|
red = 80;
|
||||||
|
green = 255;
|
||||||
|
blue = 230;
|
||||||
|
blur = 138;
|
||||||
|
break;
|
||||||
|
case MOTION_BLUR_INTRO3:
|
||||||
|
red = 255;
|
||||||
|
green = 60;
|
||||||
|
blue = 60;
|
||||||
|
blur = 200;
|
||||||
|
break;
|
||||||
|
case MOTION_BLUR_INTRO4:
|
||||||
|
red = 255;
|
||||||
|
green = 180;
|
||||||
|
blue = 180;
|
||||||
|
blur = 128;
|
||||||
|
break;
|
||||||
|
}
|
||||||
|
|
||||||
|
if(pFrontBuffer == nil)
|
||||||
|
Open(cam);
|
||||||
|
assert(pFrontBuffer);
|
||||||
|
assert(pBackBuffer);
|
||||||
|
|
||||||
|
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:
|
||||||
|
// no actual rendering here
|
||||||
|
break;
|
||||||
|
case POSTFX_SIMPLE:
|
||||||
|
RenderOverlaySimple(cam, red, green, blue, blur);
|
||||||
|
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;
|
||||||
|
}
|
||||||
|
|
||||||
|
// TODO? maybe we want this even without motion blur on sometimes?
|
||||||
|
if(MotionBlurOn)
|
||||||
|
if(!bJustInitialised)
|
||||||
|
RenderMotionBlur(cam, bluralpha);
|
||||||
|
|
||||||
|
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;
|
||||||
|
}
|
||||||
|
|
||||||
|
#endif
|
35
src/extras/postfx.h
Normal file
35
src/extras/postfx.h
Normal file
@ -0,0 +1,35 @@
|
|||||||
|
#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 MotionBlurOn; // or use CMblur for that?
|
||||||
|
static float Intensity;
|
||||||
|
|
||||||
|
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 RenderOverlaySimple(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 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 colourfilterIII_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
|
||||||
|
|
||||||
|
colourfilterIII_fs_gl3.inc: colourfilterIII.frag
|
||||||
|
(echo 'const char *colourfilterIII_frag_src =';\
|
||||||
|
sed 's/..*/"&\\n"/' colourfilterIII.frag;\
|
||||||
|
echo ';') >colourfilterIII_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/colourfilterIII.frag
Normal file
28
src/extras/shaders/colourfilterIII.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/colourfilterIII_PS.cso
Normal file
BIN
src/extras/shaders/colourfilterIII_PS.cso
Normal file
Binary file not shown.
15
src/extras/shaders/colourfilterIII_PS.hlsl
Normal file
15
src/extras/shaders/colourfilterIII_PS.hlsl
Normal file
@ -0,0 +1,15 @@
|
|||||||
|
sampler2D tex : register(s0);
|
||||||
|
float4 blurcol : register(c10);
|
||||||
|
|
||||||
|
float4 main(in float2 texcoord : TEXCOORD0) : COLOR0
|
||||||
|
{
|
||||||
|
float a = blurcol.a;
|
||||||
|
float4 dst = tex2D(tex, texcoord.xy);
|
||||||
|
float4 prev = dst;
|
||||||
|
for(int i = 0; i < 5; i++){
|
||||||
|
float4 tmp = dst*(1-a) + prev*blurcol*a;
|
||||||
|
prev = saturate(tmp);
|
||||||
|
}
|
||||||
|
prev.a = 1.0f;
|
||||||
|
return prev;
|
||||||
|
}
|
40
src/extras/shaders/colourfilterIII_PS.inc
Normal file
40
src/extras/shaders/colourfilterIII_PS.inc
Normal file
@ -0,0 +1,40 @@
|
|||||||
|
static unsigned char colourfilterIII_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, 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, 0x05, 0x00, 0x00, 0x03, 0x01, 0x00, 0x07, 0x80,
|
||||||
|
0x00, 0x00, 0xe4, 0x80, 0x0a, 0x00, 0xe4, 0xa0, 0x12, 0x00, 0x00, 0x04,
|
||||||
|
0x02, 0x00, 0x17, 0x80, 0x0a, 0x00, 0xff, 0xa0, 0x01, 0x00, 0xe4, 0x80,
|
||||||
|
0x00, 0x00, 0xe4, 0x80, 0x05, 0x00, 0x00, 0x03, 0x01, 0x00, 0x07, 0x80,
|
||||||
|
0x02, 0x00, 0xe4, 0x80, 0x0a, 0x00, 0xe4, 0xa0, 0x12, 0x00, 0x00, 0x04,
|
||||||
|
0x02, 0x00, 0x17, 0x80, 0x0a, 0x00, 0xff, 0xa0, 0x01, 0x00, 0xe4, 0x80,
|
||||||
|
0x00, 0x00, 0xe4, 0x80, 0x05, 0x00, 0x00, 0x03, 0x01, 0x00, 0x07, 0x80,
|
||||||
|
0x02, 0x00, 0xe4, 0x80, 0x0a, 0x00, 0xe4, 0xa0, 0x12, 0x00, 0x00, 0x04,
|
||||||
|
0x02, 0x00, 0x17, 0x80, 0x0a, 0x00, 0xff, 0xa0, 0x01, 0x00, 0xe4, 0x80,
|
||||||
|
0x00, 0x00, 0xe4, 0x80, 0x05, 0x00, 0x00, 0x03, 0x01, 0x00, 0x07, 0x80,
|
||||||
|
0x02, 0x00, 0xe4, 0x80, 0x0a, 0x00, 0xe4, 0xa0, 0x12, 0x00, 0x00, 0x04,
|
||||||
|
0x02, 0x00, 0x17, 0x80, 0x0a, 0x00, 0xff, 0xa0, 0x01, 0x00, 0xe4, 0x80,
|
||||||
|
0x00, 0x00, 0xe4, 0x80, 0x05, 0x00, 0x00, 0x03, 0x01, 0x00, 0x07, 0x80,
|
||||||
|
0x02, 0x00, 0xe4, 0x80, 0x0a, 0x00, 0xe4, 0xa0, 0x12, 0x00, 0x00, 0x04,
|
||||||
|
0x02, 0x00, 0x17, 0x80, 0x0a, 0x00, 0xff, 0xa0, 0x01, 0x00, 0xe4, 0x80,
|
||||||
|
0x00, 0x00, 0xe4, 0x80, 0x01, 0x00, 0x00, 0x02, 0x02, 0x00, 0x08, 0x80,
|
||||||
|
0x00, 0x00, 0x00, 0xa0, 0x01, 0x00, 0x00, 0x02, 0x00, 0x08, 0x0f, 0x80,
|
||||||
|
0x02, 0x00, 0xe4, 0x80, 0xff, 0xff, 0x00, 0x00
|
||||||
|
};
|
30
src/extras/shaders/colourfilterIII_fs_gl3.inc
Normal file
30
src/extras/shaders/colourfilterIII_fs_gl3.inc
Normal file
@ -0,0 +1,30 @@
|
|||||||
|
const char *colourfilterIII_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
|
@ -10232,7 +10232,11 @@ CPed::ProcessControl(void)
|
|||||||
CPed::Chat();
|
CPed::Chat();
|
||||||
break;
|
break;
|
||||||
case PED_AIM_GUN:
|
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);
|
((CPed*)m_pPointGunAt)->ReactToPointGun(this);
|
||||||
}
|
}
|
||||||
PointGunAt();
|
PointGunAt();
|
||||||
|
@ -78,6 +78,43 @@ CClouds::Update(void)
|
|||||||
#endif
|
#endif
|
||||||
}
|
}
|
||||||
|
|
||||||
|
float StarCoorsX[9] = { 0.0f, 0.05f, 0.12f, 0.5f, 0.8f, 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
|
void
|
||||||
CClouds::Render(void)
|
CClouds::Render(void)
|
||||||
{
|
{
|
||||||
@ -98,11 +135,10 @@ CClouds::Render(void)
|
|||||||
int minute = CClock::GetHours()*60 + CClock::GetMinutes();
|
int minute = CClock::GetHours()*60 + CClock::GetMinutes();
|
||||||
RwV3d campos = *(RwV3d*)&TheCamera.GetPosition();
|
RwV3d campos = *(RwV3d*)&TheCamera.GetPosition();
|
||||||
|
|
||||||
float coverage = Max(CWeather::Foggyness, CWeather::Foggyness);
|
|
||||||
|
|
||||||
// Moon
|
// Moon
|
||||||
int moonfadeout = Abs(minute - 180); // fully visible at 3AM
|
int moonfadeout = Abs(minute - 180); // fully visible at 3AM
|
||||||
if(moonfadeout < 180){ // fade in/out 3 hours
|
if(moonfadeout < 180){ // fade in/out 3 hours
|
||||||
|
float coverage = Max(CWeather::Foggyness, CWeather::CloudCoverage);
|
||||||
int brightness = (1.0f - coverage) * (180 - moonfadeout);
|
int brightness = (1.0f - coverage) * (180 - moonfadeout);
|
||||||
RwV3d pos = { 0.0f, -100.0f, 15.0f };
|
RwV3d pos = { 0.0f, -100.0f, 15.0f };
|
||||||
RwV3dAdd(&worldpos, &campos, &pos);
|
RwV3dAdd(&worldpos, &campos, &pos);
|
||||||
@ -131,11 +167,10 @@ CClouds::Render(void)
|
|||||||
else if(CClock::GetHours() == 5)
|
else if(CClock::GetHours() == 5)
|
||||||
starintens = 255 * (60 - CClock::GetMinutes())/60.0f;
|
starintens = 255 * (60 - CClock::GetMinutes())/60.0f;
|
||||||
if(starintens != 0){
|
if(starintens != 0){
|
||||||
// R
|
float coverage = Max(CWeather::Foggyness, CWeather::CloudCoverage);
|
||||||
static float StarCoorsX[9] = { 0.0f, 0.05f, 0.12f, 0.5f, 0.8f, 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 };
|
|
||||||
int brightness = (1.0f - coverage) * starintens;
|
int brightness = (1.0f - coverage) * starintens;
|
||||||
|
|
||||||
|
// R
|
||||||
RwRenderStateSet(rwRENDERSTATETEXTURERASTER, RwTextureGetRaster(gpCoronaTexture[0]));
|
RwRenderStateSet(rwRENDERSTATETEXTURERASTER, RwTextureGetRaster(gpCoronaTexture[0]));
|
||||||
for(i = 0; i < 11; i++){
|
for(i = 0; i < 11; i++){
|
||||||
RwV3d pos = { 100.0f, 0.0f, 10.0f };
|
RwV3d pos = { 100.0f, 0.0f, 10.0f };
|
||||||
@ -164,13 +199,7 @@ CClouds::Render(void)
|
|||||||
}
|
}
|
||||||
|
|
||||||
// Low clouds
|
// Low clouds
|
||||||
static float LowCloudsX[12] = { 1.0f, 0.7f, 0.0f, -0.7f, -1.0f, -0.7f,
|
float lowcloudintensity = 1.0f - Max(CWeather::Foggyness, CWeather::CloudCoverage);
|
||||||
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 - coverage;
|
|
||||||
int r = CTimeCycle::GetLowCloudsRed() * lowcloudintensity;
|
int r = CTimeCycle::GetLowCloudsRed() * lowcloudintensity;
|
||||||
int g = CTimeCycle::GetLowCloudsGreen() * lowcloudintensity;
|
int g = CTimeCycle::GetLowCloudsGreen() * lowcloudintensity;
|
||||||
int b = CTimeCycle::GetLowCloudsBlue() * lowcloudintensity;
|
int b = CTimeCycle::GetLowCloudsBlue() * lowcloudintensity;
|
||||||
@ -193,30 +222,6 @@ CClouds::Render(void)
|
|||||||
float rot_cos = Cos(CloudRotation);
|
float rot_cos = Cos(CloudRotation);
|
||||||
int fluffyalpha = 160 * (1.0f - CWeather::Foggyness);
|
int fluffyalpha = 160 * (1.0f - CWeather::Foggyness);
|
||||||
if(fluffyalpha != 0){
|
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];
|
static bool bCloudOnScreen[37];
|
||||||
float hilight;
|
float hilight;
|
||||||
|
|
||||||
@ -238,7 +243,7 @@ CClouds::Render(void)
|
|||||||
int bg = CTimeCycle::GetFluffyCloudsBottomGreen();
|
int bg = CTimeCycle::GetFluffyCloudsBottomGreen();
|
||||||
int bb = CTimeCycle::GetFluffyCloudsBottomBlue();
|
int bb = CTimeCycle::GetFluffyCloudsBottomBlue();
|
||||||
if(sundist < SCREEN_WIDTH/2){
|
if(sundist < SCREEN_WIDTH/2){
|
||||||
hilight = (1.0f - coverage) * (1.0f - sundist/(SCREEN_WIDTH/2));
|
hilight = (1.0f - Max(CWeather::Foggyness, CWeather::CloudCoverage)) * (1.0f - sundist/(SCREEN_WIDTH/2));
|
||||||
tr = tr*(1.0f-hilight) + 255*hilight;
|
tr = tr*(1.0f-hilight) + 255*hilight;
|
||||||
tg = tg*(1.0f-hilight) + 190*hilight;
|
tg = tg*(1.0f-hilight) + 190*hilight;
|
||||||
tb = tb*(1.0f-hilight) + 190*hilight;
|
tb = tb*(1.0f-hilight) + 190*hilight;
|
||||||
@ -286,9 +291,6 @@ CClouds::Render(void)
|
|||||||
|
|
||||||
// Rainbow
|
// Rainbow
|
||||||
if(CWeather::Rainbow != 0.0f){
|
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]));
|
RwRenderStateSet(rwRENDERSTATETEXTURERASTER, RwTextureGetRaster(gpCoronaTexture[0]));
|
||||||
for(i = 0; i < 6; i++){
|
for(i = 0; i < 6; i++){
|
||||||
RwV3d pos = { i*1.5f, 100.0f, 5.0f };
|
RwV3d pos = { i*1.5f, 100.0f, 5.0f };
|
||||||
|
@ -255,7 +255,10 @@ CCoronas::Render(void)
|
|||||||
|
|
||||||
CVector spriteCoors;
|
CVector spriteCoors;
|
||||||
float spritew, spriteh;
|
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;
|
aCoronas[i].offScreen = false;
|
||||||
|
|
||||||
if(spriteCoors.x < 0.0f || spriteCoors.y < 0.0f ||
|
if(spriteCoors.x < 0.0f || spriteCoors.y < 0.0f ||
|
||||||
@ -289,10 +292,7 @@ CCoronas::Render(void)
|
|||||||
}
|
}
|
||||||
|
|
||||||
|
|
||||||
if(aCoronas[i].fadeAlpha == 0)
|
if(aCoronas[i].fadeAlpha && spriteCoors.z < aCoronas[i].drawDist){
|
||||||
continue;
|
|
||||||
|
|
||||||
if(spriteCoors.z < aCoronas[i].drawDist){
|
|
||||||
float recipz = 1.0f/spriteCoors.z;
|
float recipz = 1.0f/spriteCoors.z;
|
||||||
float fadeDistance = aCoronas[i].drawDist / 2.0f;
|
float fadeDistance = aCoronas[i].drawDist / 2.0f;
|
||||||
float distanceFade = spriteCoors.z < fadeDistance ? 1.0f : 1.0f - (spriteCoors.z - fadeDistance)/fadeDistance;
|
float distanceFade = spriteCoors.z < fadeDistance ? 1.0f : 1.0f - (spriteCoors.z - fadeDistance)/fadeDistance;
|
||||||
@ -367,9 +367,6 @@ CCoronas::Render(void)
|
|||||||
recipz, 255);
|
recipz, 255);
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
}else{
|
|
||||||
aCoronas[i].offScreen = true;
|
|
||||||
aCoronas[i].sightClear = false;
|
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
@ -390,23 +387,24 @@ CCoronas::Render(void)
|
|||||||
if(!aCoronas[i].hasValue[j] || !aCoronas[i].hasValue[j+1])
|
if(!aCoronas[i].hasValue[j] || !aCoronas[i].hasValue[j+1])
|
||||||
continue;
|
continue;
|
||||||
|
|
||||||
int mod1 = (float)(6 - j) / 6 * 128;
|
int alpha1 = (float)(6 - j) / 6 * 128;
|
||||||
int mod2 = (float)(6 - (j+1)) / 6 * 128;
|
int alpha2 = (float)(6 - (j+1)) / 6 * 128;
|
||||||
|
|
||||||
RwIm2DVertexSetScreenX(&vertexbufferX[0], aCoronas[i].prevX[j]);
|
RwIm2DVertexSetScreenX(&vertexbufferX[0], aCoronas[i].prevX[j]);
|
||||||
RwIm2DVertexSetScreenY(&vertexbufferX[0], aCoronas[i].prevY[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]);
|
RwIm2DVertexSetScreenX(&vertexbufferX[1], aCoronas[i].prevX[j+1]);
|
||||||
RwIm2DVertexSetScreenY(&vertexbufferX[1], aCoronas[i].prevY[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());
|
RwIm2DVertexSetScreenZ(&vertexbufferX[0], RwIm2DGetNearScreenZ());
|
||||||
RwIm2DVertexSetCameraZ(&vertexbufferX[0], RwCameraGetNearClipPlane(Scene.camera));
|
RwIm2DVertexSetCameraZ(&vertexbufferX[0], RwCameraGetNearClipPlane(Scene.camera));
|
||||||
RwIm2DVertexSetRecipCameraZ(&vertexbufferX[0], 1.0f/RwCameraGetNearClipPlane(Scene.camera));
|
RwIm2DVertexSetRecipCameraZ(&vertexbufferX[0], 1.0f/RwCameraGetNearClipPlane(Scene.camera));
|
||||||
RwIm2DVertexSetScreenZ(&vertexbufferX[1], RwIm2DGetNearScreenZ());
|
RwIm2DVertexSetScreenZ(&vertexbufferX[1], RwIm2DGetNearScreenZ());
|
||||||
RwIm2DVertexSetCameraZ(&vertexbufferX[1], RwCameraGetNearClipPlane(Scene.camera));
|
RwIm2DVertexSetCameraZ(&vertexbufferX[1], RwCameraGetNearClipPlane(Scene.camera));
|
||||||
RwIm2DVertexSetRecipCameraZ(&vertexbufferX[1], 1.0f/RwCameraGetNearClipPlane(Scene.camera));
|
RwIm2DVertexSetRecipCameraZ(&vertexbufferX[1], 1.0f/RwCameraGetNearClipPlane(Scene.camera));
|
||||||
|
#endif
|
||||||
|
|
||||||
RwIm2DRenderLine(vertexbufferX, 2, 0, 1);
|
RwIm2DRenderLine(vertexbufferX, 2, 0, 1);
|
||||||
}
|
}
|
||||||
@ -425,6 +423,10 @@ CCoronas::RenderReflections(void)
|
|||||||
CEntity *entity;
|
CEntity *entity;
|
||||||
|
|
||||||
if(CWeather::WetRoads > 0.0f){
|
if(CWeather::WetRoads > 0.0f){
|
||||||
|
#ifdef FIX_BUGS
|
||||||
|
CSprite::InitSpriteBuffer();
|
||||||
|
#endif
|
||||||
|
|
||||||
RwRenderStateSet(rwRENDERSTATEFOGENABLE, (void*)FALSE);
|
RwRenderStateSet(rwRENDERSTATEFOGENABLE, (void*)FALSE);
|
||||||
RwRenderStateSet(rwRENDERSTATEZWRITEENABLE, (void*)FALSE);
|
RwRenderStateSet(rwRENDERSTATEZWRITEENABLE, (void*)FALSE);
|
||||||
RwRenderStateSet(rwRENDERSTATEZTESTENABLE, (void*)FALSE);
|
RwRenderStateSet(rwRENDERSTATEZTESTENABLE, (void*)FALSE);
|
||||||
@ -435,7 +437,8 @@ CCoronas::RenderReflections(void)
|
|||||||
|
|
||||||
for(i = 0; i < NUMCORONAS; i++){
|
for(i = 0; i < NUMCORONAS; i++){
|
||||||
if(aCoronas[i].id == 0 ||
|
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;
|
continue;
|
||||||
|
|
||||||
// check if we want a reflection on this corona
|
// check if we want a reflection on this corona
|
||||||
@ -450,11 +453,8 @@ CCoronas::RenderReflections(void)
|
|||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
if(!aCoronas[i].renderReflection)
|
|
||||||
continue;
|
|
||||||
|
|
||||||
// Don't draw if reflection is too high
|
// 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
|
// don't draw if camera is below road
|
||||||
if(CCoronas::aCoronas[i].coors.z - aCoronas[i].heightAboveRoad > TheCamera.GetPosition().z)
|
if(CCoronas::aCoronas[i].coors.z - aCoronas[i].heightAboveRoad > TheCamera.GetPosition().z)
|
||||||
continue;
|
continue;
|
||||||
@ -466,13 +466,14 @@ CCoronas::RenderReflections(void)
|
|||||||
float spritew, spriteh;
|
float spritew, spriteh;
|
||||||
if(CSprite::CalcScreenCoors(coors, spriteCoors, &spritew, &spriteh, true)){
|
if(CSprite::CalcScreenCoors(coors, spriteCoors, &spritew, &spriteh, true)){
|
||||||
float drawDist = 0.75f * aCoronas[i].drawDist;
|
float drawDist = 0.75f * aCoronas[i].drawDist;
|
||||||
drawDist = Min(drawDist, 50.0f);
|
drawDist = Min(drawDist, 55.0f);
|
||||||
if(spriteCoors.z < drawDist){
|
if(spriteCoors.z < drawDist){
|
||||||
float fadeDistance = drawDist / 2.0f;
|
float fadeDistance = drawDist / 2.0f;
|
||||||
float distanceFade = spriteCoors.z < fadeDistance ? 1.0f : 1.0f - (spriteCoors.z - fadeDistance)/fadeDistance;
|
float distanceFade = spriteCoors.z < fadeDistance ? 1.0f : 1.0f - (spriteCoors.z - fadeDistance)/fadeDistance;
|
||||||
distanceFade = clamp(distanceFade, 0.0f, 1.0f);
|
distanceFade = clamp(distanceFade, 0.0f, 1.0f);
|
||||||
float recipz = 1.0f/RwCameraGetNearClipPlane(Scene.camera);
|
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(
|
CSprite::RenderBufferedOneXLUSprite(
|
||||||
spriteCoors.x, spriteCoors.y, RwIm2DGetNearScreenZ(),
|
spriteCoors.x, spriteCoors.y, RwIm2DGetNearScreenZ(),
|
||||||
|
@ -175,7 +175,8 @@ void CHud::Draw()
|
|||||||
rect.right = f3rdX + SCREEN_SCALE_X(32.0f * 0.6f);
|
rect.right = f3rdX + SCREEN_SCALE_X(32.0f * 0.6f);
|
||||||
rect.bottom = f3rdY + SCREEN_SCALE_Y(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 {
|
else {
|
||||||
rect.left = f3rdX - SCREEN_SCALE_X(32.0f * 0.4f);
|
rect.left = f3rdX - SCREEN_SCALE_X(32.0f * 0.4f);
|
||||||
@ -183,7 +184,8 @@ void CHud::Draw()
|
|||||||
rect.right = f3rdX + SCREEN_SCALE_X(32.0f * 0.4f);
|
rect.right = f3rdX + SCREEN_SCALE_X(32.0f * 0.4f);
|
||||||
rect.bottom = f3rdY + SCREEN_SCALE_Y(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 {
|
else {
|
||||||
@ -194,7 +196,9 @@ void CHud::Draw()
|
|||||||
rect.top = (SCREEN_HEIGHT / 2) - SCREEN_SCALE_Y(32.0f);
|
rect.top = (SCREEN_HEIGHT / 2) - SCREEN_SCALE_Y(32.0f);
|
||||||
rect.right = (SCREEN_WIDTH / 2) + SCREEN_SCALE_X(32.0f);
|
rect.right = (SCREEN_WIDTH / 2) + SCREEN_SCALE_X(32.0f);
|
||||||
rect.bottom = (SCREEN_HEIGHT / 2) + SCREEN_SCALE_Y(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) {
|
else if (Mode == CCam::MODE_1STPERSON_RUNABOUT) {
|
||||||
rect.left = (SCREEN_WIDTH / 2) - SCREEN_SCALE_X(32.0f * 0.7f);
|
rect.left = (SCREEN_WIDTH / 2) - SCREEN_SCALE_X(32.0f * 0.7f);
|
||||||
@ -202,7 +206,8 @@ void CHud::Draw()
|
|||||||
rect.right = (SCREEN_WIDTH / 2) + SCREEN_SCALE_X(32.0f * 0.7f);
|
rect.right = (SCREEN_WIDTH / 2) + SCREEN_SCALE_X(32.0f * 0.7f);
|
||||||
rect.bottom = (SCREEN_HEIGHT / 2) + SCREEN_SCALE_Y(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) {
|
else if (Mode == CCam::MODE_ROCKETLAUNCHER || Mode == CCam::MODE_ROCKETLAUNCHER_RUNABOUT) {
|
||||||
RwRenderStateSet(rwRENDERSTATEVERTEXALPHAENABLE, (void *)TRUE);
|
RwRenderStateSet(rwRENDERSTATEVERTEXALPHAENABLE, (void *)TRUE);
|
||||||
@ -216,29 +221,33 @@ void CHud::Draw()
|
|||||||
}
|
}
|
||||||
else {
|
else {
|
||||||
// Sniper
|
// Sniper
|
||||||
rect.left = (SCREEN_WIDTH / 2) - SCREEN_SCALE_X(210.0f);
|
rect.left = SCREEN_WIDTH/2 - SCREEN_SCALE_X(210.0f);
|
||||||
rect.top = (SCREEN_HEIGHT / 2) - SCREEN_SCALE_Y(210.0f);
|
rect.top = SCREEN_HEIGHT/2 - SCREEN_SCALE_Y(210.0f);
|
||||||
rect.right = SCREEN_WIDTH/2;
|
rect.right = SCREEN_WIDTH/2;
|
||||||
rect.bottom = SCREEN_HEIGHT/2;
|
rect.bottom = SCREEN_HEIGHT/2;
|
||||||
Sprites[HUD_SITESNIPER].Draw(CRect(rect), CRGBA(255, 255, 255, 255));
|
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.left = SCREEN_WIDTH/2;
|
||||||
rect.top = (SCREEN_HEIGHT / 2) - SCREEN_SCALE_Y(210.0f);
|
rect.top = SCREEN_HEIGHT/2 - SCREEN_SCALE_Y(210.0f);
|
||||||
rect.left = SCREEN_SCALE_X(210.0f) + (SCREEN_WIDTH / 2);
|
rect.right = SCREEN_WIDTH/2 + SCREEN_SCALE_X(210.0f);
|
||||||
rect.bottom = SCREEN_HEIGHT/2;
|
rect.bottom = SCREEN_HEIGHT/2;
|
||||||
Sprites[HUD_SITESNIPER].Draw(CRect(rect), CRGBA(255, 255, 255, 255));
|
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.left = SCREEN_WIDTH/2 - SCREEN_SCALE_X(210.0f);
|
||||||
rect.bottom = (SCREEN_HEIGHT / 2);
|
rect.top = SCREEN_HEIGHT/2;
|
||||||
rect.right = (SCREEN_WIDTH / 2);
|
rect.right = SCREEN_WIDTH/2;
|
||||||
rect.top = SCREEN_SCALE_Y(210.0f) + (SCREEN_HEIGHT / 2);
|
rect.bottom = SCREEN_HEIGHT/2 + SCREEN_SCALE_Y(210.0f);
|
||||||
Sprites[HUD_SITESNIPER].Draw(CRect(rect), CRGBA(255, 255, 255, 255));
|
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.left = SCREEN_WIDTH/2;
|
||||||
rect.bottom = (SCREEN_HEIGHT / 2);
|
rect.top = SCREEN_HEIGHT/2;
|
||||||
rect.left = SCREEN_SCALE_X(210.0f) + (SCREEN_WIDTH / 2);
|
rect.right = SCREEN_WIDTH/2 + SCREEN_SCALE_X(210.0f);
|
||||||
rect.top = SCREEN_SCALE_Y(210.0f) + (SCREEN_HEIGHT / 2);
|
rect.bottom = SCREEN_HEIGHT/2 + SCREEN_SCALE_Y(210.0f);
|
||||||
Sprites[HUD_SITESNIPER].Draw(CRect(rect), CRGBA(255, 255, 255, 255));
|
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(rwRENDERSTATETEXTUREFILTER, (void *)rwFILTERLINEAR);
|
RwRenderStateSet(rwRENDERSTATETEXTUREFILTER, (void *)rwFILTERLINEAR);
|
||||||
|
@ -10,6 +10,7 @@
|
|||||||
#include "RwHelper.h"
|
#include "RwHelper.h"
|
||||||
#include "Camera.h"
|
#include "Camera.h"
|
||||||
#include "MBlur.h"
|
#include "MBlur.h"
|
||||||
|
#include "postfx.h"
|
||||||
|
|
||||||
// Originally taken from RW example 'mblur'
|
// Originally taken from RW example 'mblur'
|
||||||
|
|
||||||
@ -27,6 +28,10 @@ extern "C" D3DCAPS8 _RwD3D8DeviceCaps;
|
|||||||
RwBool
|
RwBool
|
||||||
CMBlur::MotionBlurOpen(RwCamera *cam)
|
CMBlur::MotionBlurOpen(RwCamera *cam)
|
||||||
{
|
{
|
||||||
|
#ifdef EXTENDED_COLOURFILTER
|
||||||
|
CPostFX::Open(cam);
|
||||||
|
return TRUE;
|
||||||
|
#else
|
||||||
#ifdef GTA_PS2
|
#ifdef GTA_PS2
|
||||||
RwRect rect = {0, 0, 0, 0};
|
RwRect rect = {0, 0, 0, 0};
|
||||||
|
|
||||||
@ -127,18 +132,22 @@ CMBlur::MotionBlurOpen(RwCamera *cam)
|
|||||||
|
|
||||||
return TRUE;
|
return TRUE;
|
||||||
#endif
|
#endif
|
||||||
|
#endif
|
||||||
}
|
}
|
||||||
|
|
||||||
RwBool
|
RwBool
|
||||||
CMBlur::MotionBlurClose(void)
|
CMBlur::MotionBlurClose(void)
|
||||||
{
|
{
|
||||||
|
#ifdef EXTENDED_COLOURFILTER
|
||||||
|
CPostFX::Close();
|
||||||
|
#else
|
||||||
if(pFrontBuffer){
|
if(pFrontBuffer){
|
||||||
RwRasterDestroy(pFrontBuffer);
|
RwRasterDestroy(pFrontBuffer);
|
||||||
pFrontBuffer = nil;
|
pFrontBuffer = nil;
|
||||||
|
|
||||||
return TRUE;
|
return TRUE;
|
||||||
}
|
}
|
||||||
|
#endif
|
||||||
return FALSE;
|
return FALSE;
|
||||||
}
|
}
|
||||||
|
|
||||||
@ -192,12 +201,14 @@ CMBlur::CreateImmediateModeData(RwCamera *cam, RwRect *rect)
|
|||||||
RwIm2DVertexSetU(&Vertex[3], 1.0f, 1.0f/RwCameraGetNearClipPlane(cam));
|
RwIm2DVertexSetU(&Vertex[3], 1.0f, 1.0f/RwCameraGetNearClipPlane(cam));
|
||||||
RwIm2DVertexSetV(&Vertex[3], 0.0f, 1.0f/RwCameraGetNearClipPlane(cam));
|
RwIm2DVertexSetV(&Vertex[3], 0.0f, 1.0f/RwCameraGetNearClipPlane(cam));
|
||||||
RwIm2DVertexSetIntRGBA(&Vertex[3], 255, 255, 255, 255);
|
RwIm2DVertexSetIntRGBA(&Vertex[3], 255, 255, 255, 255);
|
||||||
|
|
||||||
}
|
}
|
||||||
|
|
||||||
void
|
void
|
||||||
CMBlur::MotionBlurRender(RwCamera *cam, uint32 red, uint32 green, uint32 blue, uint32 blur, int32 type, uint32 bluralpha)
|
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 };
|
RwRGBA color = { (RwUInt8)red, (RwUInt8)green, (RwUInt8)blue, (RwUInt8)blur };
|
||||||
#ifdef GTA_PS2
|
#ifdef GTA_PS2
|
||||||
if( pFrontBuffer )
|
if( pFrontBuffer )
|
||||||
@ -217,6 +228,7 @@ CMBlur::MotionBlurRender(RwCamera *cam, uint32 red, uint32 green, uint32 blue, u
|
|||||||
OverlayRender(cam, nil, color, type, bluralpha);
|
OverlayRender(cam, nil, color, type, bluralpha);
|
||||||
}
|
}
|
||||||
#endif
|
#endif
|
||||||
|
#endif
|
||||||
}
|
}
|
||||||
|
|
||||||
void
|
void
|
||||||
|
@ -86,12 +86,11 @@ CPointLights::GenerateLightsAffectingObject(Const CVector *objCoors)
|
|||||||
ret *= distNorm;
|
ret *= distNorm;
|
||||||
}else{
|
}else{
|
||||||
float intensity;
|
float intensity;
|
||||||
|
// distance fade
|
||||||
if(distNorm < 0.5f)
|
if(distNorm < 0.5f)
|
||||||
// near enough
|
|
||||||
intensity = 1.0f;
|
intensity = 1.0f;
|
||||||
else
|
else
|
||||||
// attenuate
|
intensity = 1.0f - (distNorm - 0.5f)/(1.0f - 0.5f);
|
||||||
intensity = 1.0f - (distNorm - 0.5f)*2.0f;
|
|
||||||
|
|
||||||
if(distance != 0.0f){
|
if(distance != 0.0f){
|
||||||
CVector dir = dist / distance;
|
CVector dir = dist / distance;
|
||||||
@ -153,7 +152,7 @@ CPointLights::RenderFogEffect(void)
|
|||||||
if(aLights[i].fogType != FOG_NORMAL && aLights[i].fogType != FOG_ALWAYS)
|
if(aLights[i].fogType != FOG_NORMAL && aLights[i].fogType != FOG_ALWAYS)
|
||||||
continue;
|
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)
|
if(fogginess == 0.0f)
|
||||||
continue;
|
continue;
|
||||||
|
|
||||||
@ -198,7 +197,7 @@ CPointLights::RenderFogEffect(void)
|
|||||||
float distsq = sq(dx) + sq(dy);
|
float distsq = sq(dx) + sq(dy);
|
||||||
float linedistsq = distsq - sq(dot);
|
float linedistsq = distsq - sq(dot);
|
||||||
if(dot > 0.0f && dot < FOG_AREA_LENGTH && linedistsq < sq(FOG_AREA_WIDTH)){
|
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,
|
if(CWorld::ProcessVerticalLine(fogcoors, fogcoors.z - 20.0f,
|
||||||
point, entity, true, false, false, false, true, false, nil)){
|
point, entity, true, false, false, false, true, false, nil)){
|
||||||
// Now same check again in xyz
|
// Now same check again in xyz
|
||||||
@ -220,7 +219,7 @@ CPointLights::RenderFogEffect(void)
|
|||||||
intensity *= 1.0f - sq(Sqrt(linedistsq) / FOG_AREA_WIDTH);
|
intensity *= 1.0f - sq(Sqrt(linedistsq) / FOG_AREA_WIDTH);
|
||||||
|
|
||||||
if(CSprite::CalcScreenCoors(fogcoors, spriteCoors, &spritew, &spriteh, true)){
|
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];
|
float size = FogSizes[r>>1];
|
||||||
CSprite::RenderOneXLUSprite_Rotate_Aspect(spriteCoors.x, spriteCoors.y, spriteCoors.z,
|
CSprite::RenderOneXLUSprite_Rotate_Aspect(spriteCoors.x, spriteCoors.y, spriteCoors.z,
|
||||||
spritew * size, spriteh * size,
|
spritew * size, spriteh * size,
|
||||||
@ -269,7 +268,7 @@ CPointLights::RenderFogEffect(void)
|
|||||||
|
|
||||||
CVector fogcoors(xi, yi, point.point.z + 1.6f);
|
CVector fogcoors(xi, yi, point.point.z + 1.6f);
|
||||||
if(CSprite::CalcScreenCoors(fogcoors, spriteCoors, &spritew, &spriteh, true)){
|
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];
|
float size = FogSizes[r>>1];
|
||||||
CSprite::RenderOneXLUSprite_Rotate_Aspect(spriteCoors.x, spriteCoors.y, spriteCoors.z,
|
CSprite::RenderOneXLUSprite_Rotate_Aspect(spriteCoors.x, spriteCoors.y, spriteCoors.z,
|
||||||
spritew * size, spriteh * size,
|
spritew * size, spriteh * size,
|
||||||
|
@ -836,8 +836,13 @@ CRenderer::ScanSectorPoly(RwV2d *poly, int32 numVertices, void (*scanfunc)(CPtrL
|
|||||||
a2 = i;
|
a2 = i;
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
#ifdef FIX_BUGS
|
||||||
|
y = Floor(miny);
|
||||||
|
yend = Floor(maxy);
|
||||||
|
#else
|
||||||
y = miny;
|
y = miny;
|
||||||
yend = maxy;
|
yend = maxy;
|
||||||
|
#endif
|
||||||
|
|
||||||
// Go left in poly to find first edge b
|
// Go left in poly to find first edge b
|
||||||
b2 = a2;
|
b2 = a2;
|
||||||
@ -875,8 +880,8 @@ CRenderer::ScanSectorPoly(RwV2d *poly, int32 numVertices, void (*scanfunc)(CPtrL
|
|||||||
while(y <= yend && y < NUMSECTORS_Y){
|
while(y <= yend && y < NUMSECTORS_Y){
|
||||||
// scan one x-line
|
// scan one x-line
|
||||||
if(y >= 0 && xstart < NUMSECTORS_X)
|
if(y >= 0 && xstart < NUMSECTORS_X)
|
||||||
for(x = xstart; x <= xend; x++)
|
for(x = xstart; x <= xend && x != NUMSECTORS_X; x++)
|
||||||
if(x >= 0 && x != NUMSECTORS_X)
|
if(x >= 0)
|
||||||
scanfunc(CWorld::GetSector(x, y)->m_lists);
|
scanfunc(CWorld::GetSector(x, y)->m_lists);
|
||||||
|
|
||||||
// advance one scan line
|
// advance one scan line
|
||||||
|
@ -178,6 +178,7 @@ CSprite2d::SetVertices(const CRect &r, const CRGBA &c0, const CRGBA &c1, const C
|
|||||||
z = 1.0f/RecipNearClip;
|
z = 1.0f/RecipNearClip;
|
||||||
}
|
}
|
||||||
recipz = 1.0f/z;
|
recipz = 1.0f/z;
|
||||||
|
float offset = 1.0f/1024.0f;
|
||||||
|
|
||||||
// This is what we draw:
|
// This is what we draw:
|
||||||
// 0---1
|
// 0---1
|
||||||
@ -189,8 +190,8 @@ CSprite2d::SetVertices(const CRect &r, const CRGBA &c0, const CRGBA &c1, const C
|
|||||||
RwIm2DVertexSetCameraZ(&maVertices[0], z);
|
RwIm2DVertexSetCameraZ(&maVertices[0], z);
|
||||||
RwIm2DVertexSetRecipCameraZ(&maVertices[0], recipz);
|
RwIm2DVertexSetRecipCameraZ(&maVertices[0], recipz);
|
||||||
RwIm2DVertexSetIntRGBA(&maVertices[0], c2.r, c2.g, c2.b, c2.a);
|
RwIm2DVertexSetIntRGBA(&maVertices[0], c2.r, c2.g, c2.b, c2.a);
|
||||||
RwIm2DVertexSetU(&maVertices[0], 0.0f, recipz);
|
RwIm2DVertexSetU(&maVertices[0], 0.0f+offset, recipz);
|
||||||
RwIm2DVertexSetV(&maVertices[0], 0.0f, recipz);
|
RwIm2DVertexSetV(&maVertices[0], 0.0f+offset, recipz);
|
||||||
|
|
||||||
RwIm2DVertexSetScreenX(&maVertices[1], r.right);
|
RwIm2DVertexSetScreenX(&maVertices[1], r.right);
|
||||||
RwIm2DVertexSetScreenY(&maVertices[1], r.top);
|
RwIm2DVertexSetScreenY(&maVertices[1], r.top);
|
||||||
@ -198,8 +199,8 @@ CSprite2d::SetVertices(const CRect &r, const CRGBA &c0, const CRGBA &c1, const C
|
|||||||
RwIm2DVertexSetCameraZ(&maVertices[1], z);
|
RwIm2DVertexSetCameraZ(&maVertices[1], z);
|
||||||
RwIm2DVertexSetRecipCameraZ(&maVertices[1], recipz);
|
RwIm2DVertexSetRecipCameraZ(&maVertices[1], recipz);
|
||||||
RwIm2DVertexSetIntRGBA(&maVertices[1], c3.r, c3.g, c3.b, c3.a);
|
RwIm2DVertexSetIntRGBA(&maVertices[1], c3.r, c3.g, c3.b, c3.a);
|
||||||
RwIm2DVertexSetU(&maVertices[1], 1.0f, recipz);
|
RwIm2DVertexSetU(&maVertices[1], 1.0f+offset, recipz);
|
||||||
RwIm2DVertexSetV(&maVertices[1], 0.0f, recipz);
|
RwIm2DVertexSetV(&maVertices[1], 0.0f+offset, recipz);
|
||||||
|
|
||||||
RwIm2DVertexSetScreenX(&maVertices[2], r.right);
|
RwIm2DVertexSetScreenX(&maVertices[2], r.right);
|
||||||
RwIm2DVertexSetScreenY(&maVertices[2], r.bottom);
|
RwIm2DVertexSetScreenY(&maVertices[2], r.bottom);
|
||||||
@ -207,8 +208,8 @@ CSprite2d::SetVertices(const CRect &r, const CRGBA &c0, const CRGBA &c1, const C
|
|||||||
RwIm2DVertexSetCameraZ(&maVertices[2], z);
|
RwIm2DVertexSetCameraZ(&maVertices[2], z);
|
||||||
RwIm2DVertexSetRecipCameraZ(&maVertices[2], recipz);
|
RwIm2DVertexSetRecipCameraZ(&maVertices[2], recipz);
|
||||||
RwIm2DVertexSetIntRGBA(&maVertices[2], c1.r, c1.g, c1.b, c1.a);
|
RwIm2DVertexSetIntRGBA(&maVertices[2], c1.r, c1.g, c1.b, c1.a);
|
||||||
RwIm2DVertexSetU(&maVertices[2], 1.0f, recipz);
|
RwIm2DVertexSetU(&maVertices[2], 1.0f+offset, recipz);
|
||||||
RwIm2DVertexSetV(&maVertices[2], 1.0f, recipz);
|
RwIm2DVertexSetV(&maVertices[2], 1.0f+offset, recipz);
|
||||||
|
|
||||||
RwIm2DVertexSetScreenX(&maVertices[3], r.left);
|
RwIm2DVertexSetScreenX(&maVertices[3], r.left);
|
||||||
RwIm2DVertexSetScreenY(&maVertices[3], r.bottom);
|
RwIm2DVertexSetScreenY(&maVertices[3], r.bottom);
|
||||||
@ -216,8 +217,8 @@ CSprite2d::SetVertices(const CRect &r, const CRGBA &c0, const CRGBA &c1, const C
|
|||||||
RwIm2DVertexSetCameraZ(&maVertices[3], z);
|
RwIm2DVertexSetCameraZ(&maVertices[3], z);
|
||||||
RwIm2DVertexSetRecipCameraZ(&maVertices[3], recipz);
|
RwIm2DVertexSetRecipCameraZ(&maVertices[3], recipz);
|
||||||
RwIm2DVertexSetIntRGBA(&maVertices[3], c0.r, c0.g, c0.b, c0.a);
|
RwIm2DVertexSetIntRGBA(&maVertices[3], c0.r, c0.g, c0.b, c0.a);
|
||||||
RwIm2DVertexSetU(&maVertices[3], 0.0f, recipz);
|
RwIm2DVertexSetU(&maVertices[3], 0.0f+offset, recipz);
|
||||||
RwIm2DVertexSetV(&maVertices[3], 1.0f, recipz);
|
RwIm2DVertexSetV(&maVertices[3], 1.0f+offset, recipz);
|
||||||
}
|
}
|
||||||
|
|
||||||
void
|
void
|
||||||
|
@ -10,42 +10,42 @@
|
|||||||
#include "FileMgr.h"
|
#include "FileMgr.h"
|
||||||
#include "Timecycle.h"
|
#include "Timecycle.h"
|
||||||
|
|
||||||
int CTimeCycle::m_nAmbientRed[NUMHOURS][NUMWEATHERS];
|
int32 CTimeCycle::m_nAmbientRed[NUMHOURS][NUMWEATHERS];
|
||||||
int CTimeCycle::m_nAmbientGreen[NUMHOURS][NUMWEATHERS];
|
int32 CTimeCycle::m_nAmbientGreen[NUMHOURS][NUMWEATHERS];
|
||||||
int CTimeCycle::m_nAmbientBlue[NUMHOURS][NUMWEATHERS];
|
int32 CTimeCycle::m_nAmbientBlue[NUMHOURS][NUMWEATHERS];
|
||||||
int CTimeCycle::m_nDirectionalRed[NUMHOURS][NUMWEATHERS];
|
int32 CTimeCycle::m_nDirectionalRed[NUMHOURS][NUMWEATHERS];
|
||||||
int CTimeCycle::m_nDirectionalGreen[NUMHOURS][NUMWEATHERS];
|
int32 CTimeCycle::m_nDirectionalGreen[NUMHOURS][NUMWEATHERS];
|
||||||
int CTimeCycle::m_nDirectionalBlue[NUMHOURS][NUMWEATHERS];
|
int32 CTimeCycle::m_nDirectionalBlue[NUMHOURS][NUMWEATHERS];
|
||||||
int CTimeCycle::m_nSkyTopRed[NUMHOURS][NUMWEATHERS];
|
int32 CTimeCycle::m_nSkyTopRed[NUMHOURS][NUMWEATHERS];
|
||||||
int CTimeCycle::m_nSkyTopGreen[NUMHOURS][NUMWEATHERS];
|
int32 CTimeCycle::m_nSkyTopGreen[NUMHOURS][NUMWEATHERS];
|
||||||
int CTimeCycle::m_nSkyTopBlue[NUMHOURS][NUMWEATHERS];
|
int32 CTimeCycle::m_nSkyTopBlue[NUMHOURS][NUMWEATHERS];
|
||||||
int CTimeCycle::m_nSkyBottomRed[NUMHOURS][NUMWEATHERS];
|
int32 CTimeCycle::m_nSkyBottomRed[NUMHOURS][NUMWEATHERS];
|
||||||
int CTimeCycle::m_nSkyBottomGreen[NUMHOURS][NUMWEATHERS];
|
int32 CTimeCycle::m_nSkyBottomGreen[NUMHOURS][NUMWEATHERS];
|
||||||
int CTimeCycle::m_nSkyBottomBlue[NUMHOURS][NUMWEATHERS];
|
int32 CTimeCycle::m_nSkyBottomBlue[NUMHOURS][NUMWEATHERS];
|
||||||
int CTimeCycle::m_nSunCoreRed[NUMHOURS][NUMWEATHERS];
|
int32 CTimeCycle::m_nSunCoreRed[NUMHOURS][NUMWEATHERS];
|
||||||
int CTimeCycle::m_nSunCoreGreen[NUMHOURS][NUMWEATHERS];
|
int32 CTimeCycle::m_nSunCoreGreen[NUMHOURS][NUMWEATHERS];
|
||||||
int CTimeCycle::m_nSunCoreBlue[NUMHOURS][NUMWEATHERS];
|
int32 CTimeCycle::m_nSunCoreBlue[NUMHOURS][NUMWEATHERS];
|
||||||
int CTimeCycle::m_nSunCoronaRed[NUMHOURS][NUMWEATHERS];
|
int32 CTimeCycle::m_nSunCoronaRed[NUMHOURS][NUMWEATHERS];
|
||||||
int CTimeCycle::m_nSunCoronaGreen[NUMHOURS][NUMWEATHERS];
|
int32 CTimeCycle::m_nSunCoronaGreen[NUMHOURS][NUMWEATHERS];
|
||||||
int CTimeCycle::m_nSunCoronaBlue[NUMHOURS][NUMWEATHERS];
|
int32 CTimeCycle::m_nSunCoronaBlue[NUMHOURS][NUMWEATHERS];
|
||||||
float CTimeCycle::m_fSunSize[NUMHOURS][NUMWEATHERS];
|
float CTimeCycle::m_fSunSize[NUMHOURS][NUMWEATHERS];
|
||||||
float CTimeCycle::m_fSpriteSize[NUMHOURS][NUMWEATHERS];
|
float CTimeCycle::m_fSpriteSize[NUMHOURS][NUMWEATHERS];
|
||||||
float CTimeCycle::m_fSpriteBrightness[NUMHOURS][NUMWEATHERS];
|
float CTimeCycle::m_fSpriteBrightness[NUMHOURS][NUMWEATHERS];
|
||||||
short CTimeCycle::m_nShadowStrength[NUMHOURS][NUMWEATHERS];
|
int16 CTimeCycle::m_nShadowStrength[NUMHOURS][NUMWEATHERS];
|
||||||
short CTimeCycle::m_nLightShadowStrength[NUMHOURS][NUMWEATHERS];
|
int16 CTimeCycle::m_nLightShadowStrength[NUMHOURS][NUMWEATHERS];
|
||||||
short CTimeCycle::m_nTreeShadowStrength[NUMHOURS][NUMWEATHERS];
|
int16 CTimeCycle::m_nTreeShadowStrength[NUMHOURS][NUMWEATHERS];
|
||||||
float CTimeCycle::m_fFogStart[NUMHOURS][NUMWEATHERS];
|
float CTimeCycle::m_fFogStart[NUMHOURS][NUMWEATHERS];
|
||||||
float CTimeCycle::m_fFarClip[NUMHOURS][NUMWEATHERS];
|
float CTimeCycle::m_fFarClip[NUMHOURS][NUMWEATHERS];
|
||||||
float CTimeCycle::m_fLightsOnGroundBrightness[NUMHOURS][NUMWEATHERS];
|
float CTimeCycle::m_fLightsOnGroundBrightness[NUMHOURS][NUMWEATHERS];
|
||||||
int CTimeCycle::m_nLowCloudsRed[NUMHOURS][NUMWEATHERS];
|
int32 CTimeCycle::m_nLowCloudsRed[NUMHOURS][NUMWEATHERS];
|
||||||
int CTimeCycle::m_nLowCloudsGreen[NUMHOURS][NUMWEATHERS];
|
int32 CTimeCycle::m_nLowCloudsGreen[NUMHOURS][NUMWEATHERS];
|
||||||
int CTimeCycle::m_nLowCloudsBlue[NUMHOURS][NUMWEATHERS];
|
int32 CTimeCycle::m_nLowCloudsBlue[NUMHOURS][NUMWEATHERS];
|
||||||
int CTimeCycle::m_nFluffyCloudsTopRed[NUMHOURS][NUMWEATHERS];
|
int32 CTimeCycle::m_nFluffyCloudsTopRed[NUMHOURS][NUMWEATHERS];
|
||||||
int CTimeCycle::m_nFluffyCloudsTopGreen[NUMHOURS][NUMWEATHERS];
|
int32 CTimeCycle::m_nFluffyCloudsTopGreen[NUMHOURS][NUMWEATHERS];
|
||||||
int CTimeCycle::m_nFluffyCloudsTopBlue[NUMHOURS][NUMWEATHERS];
|
int32 CTimeCycle::m_nFluffyCloudsTopBlue[NUMHOURS][NUMWEATHERS];
|
||||||
int CTimeCycle::m_nFluffyCloudsBottomRed[NUMHOURS][NUMWEATHERS];
|
int32 CTimeCycle::m_nFluffyCloudsBottomRed[NUMHOURS][NUMWEATHERS];
|
||||||
int CTimeCycle::m_nFluffyCloudsBottomGreen[NUMHOURS][NUMWEATHERS];
|
int32 CTimeCycle::m_nFluffyCloudsBottomGreen[NUMHOURS][NUMWEATHERS];
|
||||||
int CTimeCycle::m_nFluffyCloudsBottomBlue[NUMHOURS][NUMWEATHERS];
|
int32 CTimeCycle::m_nFluffyCloudsBottomBlue[NUMHOURS][NUMWEATHERS];
|
||||||
float CTimeCycle::m_fBlurRed[NUMHOURS][NUMWEATHERS];
|
float CTimeCycle::m_fBlurRed[NUMHOURS][NUMWEATHERS];
|
||||||
float CTimeCycle::m_fBlurGreen[NUMHOURS][NUMWEATHERS];
|
float CTimeCycle::m_fBlurGreen[NUMHOURS][NUMWEATHERS];
|
||||||
float CTimeCycle::m_fBlurBlue[NUMHOURS][NUMWEATHERS];
|
float CTimeCycle::m_fBlurBlue[NUMHOURS][NUMWEATHERS];
|
||||||
@ -57,47 +57,47 @@ float CTimeCycle::m_fCurrentAmbientBlue;
|
|||||||
float CTimeCycle::m_fCurrentDirectionalRed;
|
float CTimeCycle::m_fCurrentDirectionalRed;
|
||||||
float CTimeCycle::m_fCurrentDirectionalGreen;
|
float CTimeCycle::m_fCurrentDirectionalGreen;
|
||||||
float CTimeCycle::m_fCurrentDirectionalBlue;
|
float CTimeCycle::m_fCurrentDirectionalBlue;
|
||||||
int CTimeCycle::m_nCurrentSkyTopRed;
|
int32 CTimeCycle::m_nCurrentSkyTopRed;
|
||||||
int CTimeCycle::m_nCurrentSkyTopGreen;
|
int32 CTimeCycle::m_nCurrentSkyTopGreen;
|
||||||
int CTimeCycle::m_nCurrentSkyTopBlue;
|
int32 CTimeCycle::m_nCurrentSkyTopBlue;
|
||||||
int CTimeCycle::m_nCurrentSkyBottomRed;
|
int32 CTimeCycle::m_nCurrentSkyBottomRed;
|
||||||
int CTimeCycle::m_nCurrentSkyBottomGreen;
|
int32 CTimeCycle::m_nCurrentSkyBottomGreen;
|
||||||
int CTimeCycle::m_nCurrentSkyBottomBlue;
|
int32 CTimeCycle::m_nCurrentSkyBottomBlue;
|
||||||
int CTimeCycle::m_nCurrentSunCoreRed;
|
int32 CTimeCycle::m_nCurrentSunCoreRed;
|
||||||
int CTimeCycle::m_nCurrentSunCoreGreen;
|
int32 CTimeCycle::m_nCurrentSunCoreGreen;
|
||||||
int CTimeCycle::m_nCurrentSunCoreBlue;
|
int32 CTimeCycle::m_nCurrentSunCoreBlue;
|
||||||
int CTimeCycle::m_nCurrentSunCoronaRed;
|
int32 CTimeCycle::m_nCurrentSunCoronaRed;
|
||||||
int CTimeCycle::m_nCurrentSunCoronaGreen;
|
int32 CTimeCycle::m_nCurrentSunCoronaGreen;
|
||||||
int CTimeCycle::m_nCurrentSunCoronaBlue;
|
int32 CTimeCycle::m_nCurrentSunCoronaBlue;
|
||||||
float CTimeCycle::m_fCurrentSunSize;
|
float CTimeCycle::m_fCurrentSunSize;
|
||||||
float CTimeCycle::m_fCurrentSpriteSize;
|
float CTimeCycle::m_fCurrentSpriteSize;
|
||||||
float CTimeCycle::m_fCurrentSpriteBrightness;
|
float CTimeCycle::m_fCurrentSpriteBrightness;
|
||||||
int CTimeCycle::m_nCurrentShadowStrength;
|
int32 CTimeCycle::m_nCurrentShadowStrength;
|
||||||
int CTimeCycle::m_nCurrentLightShadowStrength;
|
int32 CTimeCycle::m_nCurrentLightShadowStrength;
|
||||||
int CTimeCycle::m_nCurrentTreeShadowStrength;
|
int32 CTimeCycle::m_nCurrentTreeShadowStrength;
|
||||||
float CTimeCycle::m_fCurrentFogStart;
|
float CTimeCycle::m_fCurrentFogStart;
|
||||||
float CTimeCycle::m_fCurrentFarClip;
|
float CTimeCycle::m_fCurrentFarClip;
|
||||||
float CTimeCycle::m_fCurrentLightsOnGroundBrightness;
|
float CTimeCycle::m_fCurrentLightsOnGroundBrightness;
|
||||||
int CTimeCycle::m_nCurrentLowCloudsRed;
|
int32 CTimeCycle::m_nCurrentLowCloudsRed;
|
||||||
int CTimeCycle::m_nCurrentLowCloudsGreen;
|
int32 CTimeCycle::m_nCurrentLowCloudsGreen;
|
||||||
int CTimeCycle::m_nCurrentLowCloudsBlue;
|
int32 CTimeCycle::m_nCurrentLowCloudsBlue;
|
||||||
int CTimeCycle::m_nCurrentFluffyCloudsTopRed;
|
int32 CTimeCycle::m_nCurrentFluffyCloudsTopRed;
|
||||||
int CTimeCycle::m_nCurrentFluffyCloudsTopGreen;
|
int32 CTimeCycle::m_nCurrentFluffyCloudsTopGreen;
|
||||||
int CTimeCycle::m_nCurrentFluffyCloudsTopBlue;
|
int32 CTimeCycle::m_nCurrentFluffyCloudsTopBlue;
|
||||||
int CTimeCycle::m_nCurrentFluffyCloudsBottomRed;
|
int32 CTimeCycle::m_nCurrentFluffyCloudsBottomRed;
|
||||||
int CTimeCycle::m_nCurrentFluffyCloudsBottomGreen;
|
int32 CTimeCycle::m_nCurrentFluffyCloudsBottomGreen;
|
||||||
int CTimeCycle::m_nCurrentFluffyCloudsBottomBlue;
|
int32 CTimeCycle::m_nCurrentFluffyCloudsBottomBlue;
|
||||||
float CTimeCycle::m_fCurrentBlurRed;
|
float CTimeCycle::m_fCurrentBlurRed;
|
||||||
float CTimeCycle::m_fCurrentBlurGreen;
|
float CTimeCycle::m_fCurrentBlurGreen;
|
||||||
float CTimeCycle::m_fCurrentBlurBlue;
|
float CTimeCycle::m_fCurrentBlurBlue;
|
||||||
float CTimeCycle::m_fCurrentBlurAlpha;
|
float CTimeCycle::m_fCurrentBlurAlpha;
|
||||||
int CTimeCycle::m_nCurrentFogColourRed;
|
int32 CTimeCycle::m_nCurrentFogColourRed;
|
||||||
int CTimeCycle::m_nCurrentFogColourGreen;
|
int32 CTimeCycle::m_nCurrentFogColourGreen;
|
||||||
int CTimeCycle::m_nCurrentFogColourBlue;
|
int32 CTimeCycle::m_nCurrentFogColourBlue;
|
||||||
|
|
||||||
int CTimeCycle::m_FogReduction;
|
int32 CTimeCycle::m_FogReduction;
|
||||||
|
|
||||||
int CTimeCycle::m_CurrentStoredValue;
|
int32 CTimeCycle::m_CurrentStoredValue;
|
||||||
CVector CTimeCycle::m_VectorToSun[16];
|
CVector CTimeCycle::m_VectorToSun[16];
|
||||||
float CTimeCycle::m_fShadowFrontX[16];
|
float CTimeCycle::m_fShadowFrontX[16];
|
||||||
float CTimeCycle::m_fShadowFrontY[16];
|
float CTimeCycle::m_fShadowFrontY[16];
|
||||||
@ -227,7 +227,7 @@ CTimeCycle::Update(void)
|
|||||||
float c2 = (1.0f-timeInterp) * CWeather::InterpolationValue;
|
float c2 = (1.0f-timeInterp) * CWeather::InterpolationValue;
|
||||||
float c3 = timeInterp * CWeather::InterpolationValue;
|
float 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) v[h1][w1]*c0 + v[h2][w1]*c1 + v[h1][w2]*c2 + v[h2][w2]*c3
|
||||||
|
|
||||||
m_nCurrentSkyTopRed = INTERP(m_nSkyTopRed);
|
m_nCurrentSkyTopRed = INTERP(m_nSkyTopRed);
|
||||||
m_nCurrentSkyTopGreen = INTERP(m_nSkyTopGreen);
|
m_nCurrentSkyTopGreen = INTERP(m_nSkyTopGreen);
|
||||||
|
@ -2,42 +2,42 @@
|
|||||||
|
|
||||||
class CTimeCycle
|
class CTimeCycle
|
||||||
{
|
{
|
||||||
static int m_nAmbientRed[NUMHOURS][NUMWEATHERS];
|
static int32 m_nAmbientRed[NUMHOURS][NUMWEATHERS];
|
||||||
static int m_nAmbientGreen[NUMHOURS][NUMWEATHERS];
|
static int32 m_nAmbientGreen[NUMHOURS][NUMWEATHERS];
|
||||||
static int m_nAmbientBlue[NUMHOURS][NUMWEATHERS];
|
static int32 m_nAmbientBlue[NUMHOURS][NUMWEATHERS];
|
||||||
static int m_nDirectionalRed[NUMHOURS][NUMWEATHERS];
|
static int32 m_nDirectionalRed[NUMHOURS][NUMWEATHERS];
|
||||||
static int m_nDirectionalGreen[NUMHOURS][NUMWEATHERS];
|
static int32 m_nDirectionalGreen[NUMHOURS][NUMWEATHERS];
|
||||||
static int m_nDirectionalBlue[NUMHOURS][NUMWEATHERS];
|
static int32 m_nDirectionalBlue[NUMHOURS][NUMWEATHERS];
|
||||||
static int m_nSkyTopRed[NUMHOURS][NUMWEATHERS];
|
static int32 m_nSkyTopRed[NUMHOURS][NUMWEATHERS];
|
||||||
static int m_nSkyTopGreen[NUMHOURS][NUMWEATHERS];
|
static int32 m_nSkyTopGreen[NUMHOURS][NUMWEATHERS];
|
||||||
static int m_nSkyTopBlue[NUMHOURS][NUMWEATHERS];
|
static int32 m_nSkyTopBlue[NUMHOURS][NUMWEATHERS];
|
||||||
static int m_nSkyBottomRed[NUMHOURS][NUMWEATHERS];
|
static int32 m_nSkyBottomRed[NUMHOURS][NUMWEATHERS];
|
||||||
static int m_nSkyBottomGreen[NUMHOURS][NUMWEATHERS];
|
static int32 m_nSkyBottomGreen[NUMHOURS][NUMWEATHERS];
|
||||||
static int m_nSkyBottomBlue[NUMHOURS][NUMWEATHERS];
|
static int32 m_nSkyBottomBlue[NUMHOURS][NUMWEATHERS];
|
||||||
static int m_nSunCoreRed[NUMHOURS][NUMWEATHERS];
|
static int32 m_nSunCoreRed[NUMHOURS][NUMWEATHERS];
|
||||||
static int m_nSunCoreGreen[NUMHOURS][NUMWEATHERS];
|
static int32 m_nSunCoreGreen[NUMHOURS][NUMWEATHERS];
|
||||||
static int m_nSunCoreBlue[NUMHOURS][NUMWEATHERS];
|
static int32 m_nSunCoreBlue[NUMHOURS][NUMWEATHERS];
|
||||||
static int m_nSunCoronaRed[NUMHOURS][NUMWEATHERS];
|
static int32 m_nSunCoronaRed[NUMHOURS][NUMWEATHERS];
|
||||||
static int m_nSunCoronaGreen[NUMHOURS][NUMWEATHERS];
|
static int32 m_nSunCoronaGreen[NUMHOURS][NUMWEATHERS];
|
||||||
static int m_nSunCoronaBlue[NUMHOURS][NUMWEATHERS];
|
static int32 m_nSunCoronaBlue[NUMHOURS][NUMWEATHERS];
|
||||||
static float m_fSunSize[NUMHOURS][NUMWEATHERS];
|
static float m_fSunSize[NUMHOURS][NUMWEATHERS];
|
||||||
static float m_fSpriteSize[NUMHOURS][NUMWEATHERS];
|
static float m_fSpriteSize[NUMHOURS][NUMWEATHERS];
|
||||||
static float m_fSpriteBrightness[NUMHOURS][NUMWEATHERS];
|
static float m_fSpriteBrightness[NUMHOURS][NUMWEATHERS];
|
||||||
static short m_nShadowStrength[NUMHOURS][NUMWEATHERS];
|
static int16 m_nShadowStrength[NUMHOURS][NUMWEATHERS];
|
||||||
static short m_nLightShadowStrength[NUMHOURS][NUMWEATHERS];
|
static int16 m_nLightShadowStrength[NUMHOURS][NUMWEATHERS];
|
||||||
static short m_nTreeShadowStrength[NUMHOURS][NUMWEATHERS];
|
static int16 m_nTreeShadowStrength[NUMHOURS][NUMWEATHERS];
|
||||||
static float m_fFogStart[NUMHOURS][NUMWEATHERS];
|
static float m_fFogStart[NUMHOURS][NUMWEATHERS];
|
||||||
static float m_fFarClip[NUMHOURS][NUMWEATHERS];
|
static float m_fFarClip[NUMHOURS][NUMWEATHERS];
|
||||||
static float m_fLightsOnGroundBrightness[NUMHOURS][NUMWEATHERS];
|
static float m_fLightsOnGroundBrightness[NUMHOURS][NUMWEATHERS];
|
||||||
static int m_nLowCloudsRed[NUMHOURS][NUMWEATHERS];
|
static int32 m_nLowCloudsRed[NUMHOURS][NUMWEATHERS];
|
||||||
static int m_nLowCloudsGreen[NUMHOURS][NUMWEATHERS];
|
static int32 m_nLowCloudsGreen[NUMHOURS][NUMWEATHERS];
|
||||||
static int m_nLowCloudsBlue[NUMHOURS][NUMWEATHERS];
|
static int32 m_nLowCloudsBlue[NUMHOURS][NUMWEATHERS];
|
||||||
static int m_nFluffyCloudsTopRed[NUMHOURS][NUMWEATHERS];
|
static int32 m_nFluffyCloudsTopRed[NUMHOURS][NUMWEATHERS];
|
||||||
static int m_nFluffyCloudsTopGreen[NUMHOURS][NUMWEATHERS];
|
static int32 m_nFluffyCloudsTopGreen[NUMHOURS][NUMWEATHERS];
|
||||||
static int m_nFluffyCloudsTopBlue[NUMHOURS][NUMWEATHERS];
|
static int32 m_nFluffyCloudsTopBlue[NUMHOURS][NUMWEATHERS];
|
||||||
static int m_nFluffyCloudsBottomRed[NUMHOURS][NUMWEATHERS];
|
static int32 m_nFluffyCloudsBottomRed[NUMHOURS][NUMWEATHERS];
|
||||||
static int m_nFluffyCloudsBottomGreen[NUMHOURS][NUMWEATHERS];
|
static int32 m_nFluffyCloudsBottomGreen[NUMHOURS][NUMWEATHERS];
|
||||||
static int m_nFluffyCloudsBottomBlue[NUMHOURS][NUMWEATHERS];
|
static int32 m_nFluffyCloudsBottomBlue[NUMHOURS][NUMWEATHERS];
|
||||||
static float m_fBlurRed[NUMHOURS][NUMWEATHERS];
|
static float m_fBlurRed[NUMHOURS][NUMWEATHERS];
|
||||||
static float m_fBlurGreen[NUMHOURS][NUMWEATHERS];
|
static float m_fBlurGreen[NUMHOURS][NUMWEATHERS];
|
||||||
static float m_fBlurBlue[NUMHOURS][NUMWEATHERS];
|
static float m_fBlurBlue[NUMHOURS][NUMWEATHERS];
|
||||||
@ -49,48 +49,48 @@ class CTimeCycle
|
|||||||
static float m_fCurrentDirectionalRed;
|
static float m_fCurrentDirectionalRed;
|
||||||
static float m_fCurrentDirectionalGreen;
|
static float m_fCurrentDirectionalGreen;
|
||||||
static float m_fCurrentDirectionalBlue;
|
static float m_fCurrentDirectionalBlue;
|
||||||
static int m_nCurrentSkyTopRed;
|
static int32 m_nCurrentSkyTopRed;
|
||||||
static int m_nCurrentSkyTopGreen;
|
static int32 m_nCurrentSkyTopGreen;
|
||||||
static int m_nCurrentSkyTopBlue;
|
static int32 m_nCurrentSkyTopBlue;
|
||||||
static int m_nCurrentSkyBottomRed;
|
static int32 m_nCurrentSkyBottomRed;
|
||||||
static int m_nCurrentSkyBottomGreen;
|
static int32 m_nCurrentSkyBottomGreen;
|
||||||
static int m_nCurrentSkyBottomBlue;
|
static int32 m_nCurrentSkyBottomBlue;
|
||||||
static int m_nCurrentSunCoreRed;
|
static int32 m_nCurrentSunCoreRed;
|
||||||
static int m_nCurrentSunCoreGreen;
|
static int32 m_nCurrentSunCoreGreen;
|
||||||
static int m_nCurrentSunCoreBlue;
|
static int32 m_nCurrentSunCoreBlue;
|
||||||
static int m_nCurrentSunCoronaRed;
|
static int32 m_nCurrentSunCoronaRed;
|
||||||
static int m_nCurrentSunCoronaGreen;
|
static int32 m_nCurrentSunCoronaGreen;
|
||||||
static int m_nCurrentSunCoronaBlue;
|
static int32 m_nCurrentSunCoronaBlue;
|
||||||
static float m_fCurrentSunSize;
|
static float m_fCurrentSunSize;
|
||||||
static float m_fCurrentSpriteSize;
|
static float m_fCurrentSpriteSize;
|
||||||
static float m_fCurrentSpriteBrightness;
|
static float m_fCurrentSpriteBrightness;
|
||||||
static int m_nCurrentShadowStrength;
|
static int32 m_nCurrentShadowStrength;
|
||||||
static int m_nCurrentLightShadowStrength;
|
static int32 m_nCurrentLightShadowStrength;
|
||||||
static int m_nCurrentTreeShadowStrength;
|
static int32 m_nCurrentTreeShadowStrength;
|
||||||
static float m_fCurrentFogStart;
|
static float m_fCurrentFogStart;
|
||||||
static float m_fCurrentFarClip;
|
static float m_fCurrentFarClip;
|
||||||
static float m_fCurrentLightsOnGroundBrightness;
|
static float m_fCurrentLightsOnGroundBrightness;
|
||||||
static int m_nCurrentLowCloudsRed;
|
static int32 m_nCurrentLowCloudsRed;
|
||||||
static int m_nCurrentLowCloudsGreen;
|
static int32 m_nCurrentLowCloudsGreen;
|
||||||
static int m_nCurrentLowCloudsBlue;
|
static int32 m_nCurrentLowCloudsBlue;
|
||||||
static int m_nCurrentFluffyCloudsTopRed;
|
static int32 m_nCurrentFluffyCloudsTopRed;
|
||||||
static int m_nCurrentFluffyCloudsTopGreen;
|
static int32 m_nCurrentFluffyCloudsTopGreen;
|
||||||
static int m_nCurrentFluffyCloudsTopBlue;
|
static int32 m_nCurrentFluffyCloudsTopBlue;
|
||||||
static int m_nCurrentFluffyCloudsBottomRed;
|
static int32 m_nCurrentFluffyCloudsBottomRed;
|
||||||
static int m_nCurrentFluffyCloudsBottomGreen;
|
static int32 m_nCurrentFluffyCloudsBottomGreen;
|
||||||
static int m_nCurrentFluffyCloudsBottomBlue;
|
static int32 m_nCurrentFluffyCloudsBottomBlue;
|
||||||
static float m_fCurrentBlurRed;
|
static float m_fCurrentBlurRed;
|
||||||
static float m_fCurrentBlurGreen;
|
static float m_fCurrentBlurGreen;
|
||||||
static float m_fCurrentBlurBlue;
|
static float m_fCurrentBlurBlue;
|
||||||
static float m_fCurrentBlurAlpha;
|
static float m_fCurrentBlurAlpha;
|
||||||
static int m_nCurrentFogColourRed;
|
static int32 m_nCurrentFogColourRed;
|
||||||
static int m_nCurrentFogColourGreen;
|
static int32 m_nCurrentFogColourGreen;
|
||||||
static int m_nCurrentFogColourBlue;
|
static int32 m_nCurrentFogColourBlue;
|
||||||
|
|
||||||
static int m_FogReduction;
|
static int32 m_FogReduction;
|
||||||
|
|
||||||
public:
|
public:
|
||||||
static int m_CurrentStoredValue;
|
static int32 m_CurrentStoredValue;
|
||||||
static CVector m_VectorToSun[16];
|
static CVector m_VectorToSun[16];
|
||||||
static float m_fShadowFrontX[16];
|
static float m_fShadowFrontX[16];
|
||||||
static float m_fShadowFrontY[16];
|
static float m_fShadowFrontY[16];
|
||||||
@ -105,40 +105,40 @@ public:
|
|||||||
static float GetDirectionalRed(void) { return m_fCurrentDirectionalRed; }
|
static float GetDirectionalRed(void) { return m_fCurrentDirectionalRed; }
|
||||||
static float GetDirectionalGreen(void) { return m_fCurrentDirectionalGreen; }
|
static float GetDirectionalGreen(void) { return m_fCurrentDirectionalGreen; }
|
||||||
static float GetDirectionalBlue(void) { return m_fCurrentDirectionalBlue; }
|
static float GetDirectionalBlue(void) { return m_fCurrentDirectionalBlue; }
|
||||||
static int GetSkyTopRed(void) { return m_nCurrentSkyTopRed; }
|
static int32 GetSkyTopRed(void) { return m_nCurrentSkyTopRed; }
|
||||||
static int GetSkyTopGreen(void) { return m_nCurrentSkyTopGreen; }
|
static int32 GetSkyTopGreen(void) { return m_nCurrentSkyTopGreen; }
|
||||||
static int GetSkyTopBlue(void) { return m_nCurrentSkyTopBlue; }
|
static int32 GetSkyTopBlue(void) { return m_nCurrentSkyTopBlue; }
|
||||||
static int GetSkyBottomRed(void) { return m_nCurrentSkyBottomRed; }
|
static int32 GetSkyBottomRed(void) { return m_nCurrentSkyBottomRed; }
|
||||||
static int GetSkyBottomGreen(void) { return m_nCurrentSkyBottomGreen; }
|
static int32 GetSkyBottomGreen(void) { return m_nCurrentSkyBottomGreen; }
|
||||||
static int GetSkyBottomBlue(void) { return m_nCurrentSkyBottomBlue; }
|
static int32 GetSkyBottomBlue(void) { return m_nCurrentSkyBottomBlue; }
|
||||||
static int GetSunCoreRed(void) { return m_nCurrentSunCoreRed; }
|
static int32 GetSunCoreRed(void) { return m_nCurrentSunCoreRed; }
|
||||||
static int GetSunCoreGreen(void) { return m_nCurrentSunCoreGreen; }
|
static int32 GetSunCoreGreen(void) { return m_nCurrentSunCoreGreen; }
|
||||||
static int GetSunCoreBlue(void) { return m_nCurrentSunCoreBlue; }
|
static int32 GetSunCoreBlue(void) { return m_nCurrentSunCoreBlue; }
|
||||||
static int GetSunCoronaRed(void) { return m_nCurrentSunCoronaRed; }
|
static int32 GetSunCoronaRed(void) { return m_nCurrentSunCoronaRed; }
|
||||||
static int GetSunCoronaGreen(void) { return m_nCurrentSunCoronaGreen; }
|
static int32 GetSunCoronaGreen(void) { return m_nCurrentSunCoronaGreen; }
|
||||||
static int GetSunCoronaBlue(void) { return m_nCurrentSunCoronaBlue; }
|
static int32 GetSunCoronaBlue(void) { return m_nCurrentSunCoronaBlue; }
|
||||||
static float GetSunSize(void) { return m_fCurrentSunSize; }
|
static float GetSunSize(void) { return m_fCurrentSunSize; }
|
||||||
static float GetSpriteBrightness(void) { return m_fCurrentSpriteBrightness; }
|
static float GetSpriteBrightness(void) { return m_fCurrentSpriteBrightness; }
|
||||||
static float GetSpriteSize(void) { return m_fCurrentSpriteSize; }
|
static float GetSpriteSize(void) { return m_fCurrentSpriteSize; }
|
||||||
static int GetShadowStrength(void) { return m_nCurrentShadowStrength; }
|
static int32 GetShadowStrength(void) { return m_nCurrentShadowStrength; }
|
||||||
static int GetLightShadowStrength(void) { return m_nCurrentLightShadowStrength; }
|
static int32 GetLightShadowStrength(void) { return m_nCurrentLightShadowStrength; }
|
||||||
static float GetLightOnGroundBrightness(void) { return m_fCurrentLightsOnGroundBrightness; }
|
static float GetLightOnGroundBrightness(void) { return m_fCurrentLightsOnGroundBrightness; }
|
||||||
static float GetFarClip(void) { return m_fCurrentFarClip; }
|
static float GetFarClip(void) { return m_fCurrentFarClip; }
|
||||||
static float GetFogStart(void) { return m_fCurrentFogStart; }
|
static float GetFogStart(void) { return m_fCurrentFogStart; }
|
||||||
|
|
||||||
static int GetLowCloudsRed(void) { return m_nCurrentLowCloudsRed; }
|
static int32 GetLowCloudsRed(void) { return m_nCurrentLowCloudsRed; }
|
||||||
static int GetLowCloudsGreen(void) { return m_nCurrentLowCloudsGreen; }
|
static int32 GetLowCloudsGreen(void) { return m_nCurrentLowCloudsGreen; }
|
||||||
static int GetLowCloudsBlue(void) { return m_nCurrentLowCloudsBlue; }
|
static int32 GetLowCloudsBlue(void) { return m_nCurrentLowCloudsBlue; }
|
||||||
static int GetFluffyCloudsTopRed(void) { return m_nCurrentFluffyCloudsTopRed; }
|
static int32 GetFluffyCloudsTopRed(void) { return m_nCurrentFluffyCloudsTopRed; }
|
||||||
static int GetFluffyCloudsTopGreen(void) { return m_nCurrentFluffyCloudsTopGreen; }
|
static int32 GetFluffyCloudsTopGreen(void) { return m_nCurrentFluffyCloudsTopGreen; }
|
||||||
static int GetFluffyCloudsTopBlue(void) { return m_nCurrentFluffyCloudsTopBlue; }
|
static int32 GetFluffyCloudsTopBlue(void) { return m_nCurrentFluffyCloudsTopBlue; }
|
||||||
static int GetFluffyCloudsBottomRed(void) { return m_nCurrentFluffyCloudsBottomRed; }
|
static int32 GetFluffyCloudsBottomRed(void) { return m_nCurrentFluffyCloudsBottomRed; }
|
||||||
static int GetFluffyCloudsBottomGreen(void) { return m_nCurrentFluffyCloudsBottomGreen; }
|
static int32 GetFluffyCloudsBottomGreen(void) { return m_nCurrentFluffyCloudsBottomGreen; }
|
||||||
static int GetFluffyCloudsBottomBlue(void) { return m_nCurrentFluffyCloudsBottomBlue; }
|
static int32 GetFluffyCloudsBottomBlue(void) { return m_nCurrentFluffyCloudsBottomBlue; }
|
||||||
static int GetFogRed(void) { return m_nCurrentFogColourRed; }
|
static int32 GetFogRed(void) { return m_nCurrentFogColourRed; }
|
||||||
static int GetFogGreen(void) { return m_nCurrentFogColourGreen; }
|
static int32 GetFogGreen(void) { return m_nCurrentFogColourGreen; }
|
||||||
static int GetFogBlue(void) { return m_nCurrentFogColourBlue; }
|
static int32 GetFogBlue(void) { return m_nCurrentFogColourBlue; }
|
||||||
static int GetFogReduction(void) { return m_FogReduction; }
|
static int32 GetFogReduction(void) { return m_FogReduction; }
|
||||||
|
|
||||||
static void Initialise(void);
|
static void Initialise(void);
|
||||||
static void Update(void);
|
static void Update(void);
|
||||||
|
@ -181,6 +181,22 @@ psCameraShowRaster(RwCamera *camera)
|
|||||||
return;
|
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;
|
||||||
|
}
|
||||||
|
|
||||||
/*
|
/*
|
||||||
*****************************************************************************
|
*****************************************************************************
|
||||||
@ -209,7 +225,11 @@ double
|
|||||||
psTimer(void)
|
psTimer(void)
|
||||||
{
|
{
|
||||||
struct timespec start;
|
struct timespec start;
|
||||||
|
#ifdef __linux__
|
||||||
clock_gettime(CLOCK_MONOTONIC_RAW, &start);
|
clock_gettime(CLOCK_MONOTONIC_RAW, &start);
|
||||||
|
#else
|
||||||
|
clock_gettime(CLOCK_MONOTONIC, &start);
|
||||||
|
#endif
|
||||||
return start.tv_sec * 1000.0 + start.tv_nsec/1000000.0;
|
return start.tv_sec * 1000.0 + start.tv_nsec/1000000.0;
|
||||||
}
|
}
|
||||||
#endif
|
#endif
|
||||||
|
@ -22,6 +22,7 @@ extern void psTerminate(void);
|
|||||||
|
|
||||||
extern void psCameraShowRaster(RwCamera *camera);
|
extern void psCameraShowRaster(RwCamera *camera);
|
||||||
extern RwBool psCameraBeginUpdate(RwCamera *camera);
|
extern RwBool psCameraBeginUpdate(RwCamera *camera);
|
||||||
|
extern RwImage *psGrabScreen(RwCamera *camera);
|
||||||
|
|
||||||
extern void psMouseSetPos(RwV2d *pos);
|
extern void psMouseSetPos(RwV2d *pos);
|
||||||
|
|
||||||
|
@ -50,6 +50,15 @@ RsCameraBeginUpdate(RwCamera * camera)
|
|||||||
return psCameraBeginUpdate(camera);
|
return psCameraBeginUpdate(camera);
|
||||||
}
|
}
|
||||||
|
|
||||||
|
/*
|
||||||
|
*****************************************************************************
|
||||||
|
*/
|
||||||
|
RwImage*
|
||||||
|
RsGrabScreen(RwCamera *camera)
|
||||||
|
{
|
||||||
|
return psGrabScreen(camera);
|
||||||
|
}
|
||||||
|
|
||||||
/*
|
/*
|
||||||
*****************************************************************************
|
*****************************************************************************
|
||||||
*/
|
*/
|
||||||
|
@ -274,6 +274,9 @@ RsCameraBeginUpdate(RwCamera *camera);
|
|||||||
//extern void
|
//extern void
|
||||||
//RsMouseSetVisibility(RwBool visible);
|
//RsMouseSetVisibility(RwBool visible);
|
||||||
|
|
||||||
|
extern RwImage*
|
||||||
|
RsGrabScreen(RwCamera *camera);
|
||||||
|
|
||||||
extern void
|
extern void
|
||||||
RsMouseSetPos(RwV2d *pos);
|
RsMouseSetPos(RwV2d *pos);
|
||||||
|
|
||||||
|
@ -238,6 +238,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;
|
||||||
|
}
|
||||||
|
|
||||||
/*
|
/*
|
||||||
*****************************************************************************
|
*****************************************************************************
|
||||||
*/
|
*/
|
||||||
@ -1851,7 +1868,11 @@ void PlayMovieInWindow(int cmdShow, const char* szFile)
|
|||||||
MultiByteToWideChar(CP_ACP, 0, szFile, -1, wFileName, sizeof(wFileName) - 1);
|
MultiByteToWideChar(CP_ACP, 0, szFile, -1, wFileName, sizeof(wFileName) - 1);
|
||||||
|
|
||||||
// Initialize COM
|
// 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));
|
JIF(CoInitialize(nil));
|
||||||
|
#endif
|
||||||
|
|
||||||
// Get the interface for DirectShow's GraphBuilder
|
// Get the interface for DirectShow's GraphBuilder
|
||||||
JIF(CoCreateInstance(CLSID_FilterGraph, nil, CLSCTX_INPROC,
|
JIF(CoCreateInstance(CLSID_FilterGraph, nil, CLSCTX_INPROC,
|
||||||
@ -2223,9 +2244,10 @@ WinMain(HINSTANCE instance,
|
|||||||
|
|
||||||
case GS_INIT_INTRO_MPEG:
|
case GS_INIT_INTRO_MPEG:
|
||||||
{
|
{
|
||||||
|
#ifndef NO_MOVIES
|
||||||
CloseClip();
|
CloseClip();
|
||||||
|
|
||||||
CoUninitialize();
|
CoUninitialize();
|
||||||
|
#endif
|
||||||
|
|
||||||
if ( CMenuManager::OS_Language == LANG_FRENCH || CMenuManager::OS_Language == LANG_GERMAN )
|
if ( CMenuManager::OS_Language == LANG_FRENCH || CMenuManager::OS_Language == LANG_GERMAN )
|
||||||
PlayMovieInWindow(cmdShow, "movies\\GTAtitlesGER.mpg");
|
PlayMovieInWindow(cmdShow, "movies\\GTAtitlesGER.mpg");
|
||||||
@ -2259,8 +2281,10 @@ WinMain(HINSTANCE instance,
|
|||||||
|
|
||||||
case GS_INIT_ONCE:
|
case GS_INIT_ONCE:
|
||||||
{
|
{
|
||||||
|
#ifndef NO_MOVIES
|
||||||
CloseClip();
|
CloseClip();
|
||||||
CoUninitialize();
|
CoUninitialize();
|
||||||
|
#endif
|
||||||
|
|
||||||
#ifdef FIX_BUGS
|
#ifdef FIX_BUGS
|
||||||
// draw one frame because otherwise we'll end up looking at black screen for a while if vsync is on
|
// draw one frame because otherwise we'll end up looking at black screen for a while if vsync is on
|
||||||
|
1
vendor/librw
vendored
Submodule
1
vendor/librw
vendored
Submodule
@ -0,0 +1 @@
|
|||||||
|
Subproject commit 5e299fb12e0ab85b5a32032544f58480a93a4a32
|
1
vendor/ogg
vendored
Submodule
1
vendor/ogg
vendored
Submodule
@ -0,0 +1 @@
|
|||||||
|
Subproject commit 684c73773e7e2683245ffd6aa75f04115b51123a
|
1
vendor/opus
vendored
Submodule
1
vendor/opus
vendored
Submodule
@ -0,0 +1 @@
|
|||||||
|
Subproject commit 6bae366f9fef25191fc812c430e8abd40a13a233
|
1
vendor/opusfile
vendored
Submodule
1
vendor/opusfile
vendored
Submodule
@ -0,0 +1 @@
|
|||||||
|
Subproject commit 6452e838e68e8f4fc0b3599523c760ac6276ce89
|
Loading…
Reference in New Issue
Block a user