mirror of
https://github.com/FWGS/xash3d-fwgs.git
synced 2026-08-05 03:24:56 +08:00
Compare commits
52 Commits
continuous
...
continuous
| Author | SHA1 | Date | |
|---|---|---|---|
|
|
150d98bd15 | ||
|
|
f162fbd806 | ||
|
|
7d8ea61ac2 | ||
|
|
40041e30eb | ||
|
|
a247e139bf | ||
|
|
00b2ca7f5a | ||
|
|
e58007aab3 | ||
|
|
dca862a838 | ||
|
|
7e71e20714 | ||
|
|
cee6862924 | ||
|
|
a8cc68f6b9 | ||
|
|
2af0adb629 | ||
|
|
628ac376ed | ||
|
|
251e6ac1dc | ||
|
|
9b6518376c | ||
|
|
6c3fee7f27 | ||
|
|
c111a59639 | ||
|
|
ba9bb70924 | ||
|
|
6acc97b0ef | ||
|
|
cd681d4303 | ||
|
|
46f30e215c | ||
|
|
2ae038c01c | ||
|
|
aaa9fbd50f | ||
|
|
51d4716bcb | ||
|
|
045caacfee | ||
|
|
95a5c670a2 | ||
|
|
30259e1573 | ||
|
|
8b884132b7 | ||
|
|
266f9a6bc6 | ||
|
|
58177d9251 | ||
|
|
69e801d6b8 | ||
|
|
388cc3061f | ||
|
|
c9d29b3955 | ||
|
|
371025dc8e | ||
|
|
cf7a79bff3 | ||
|
|
55dfa1bf44 | ||
|
|
519c8a032a | ||
|
|
c15822f375 | ||
|
|
0e91deec19 | ||
|
|
87b204c661 | ||
|
|
caefa0b7b9 | ||
|
|
a311923d4e | ||
|
|
ee4cb39f3e | ||
|
|
18436a70eb | ||
|
|
8298053e6a | ||
|
|
9304a0041d | ||
|
|
64f92003fa | ||
|
|
be0a241244 | ||
|
|
df6546d5b1 | ||
|
|
a0c31120d9 | ||
|
|
c0757bd84c | ||
|
|
9fa32a9cf4 |
4
.github/workflows/c-cpp.yml
vendored
4
.github/workflows/c-cpp.yml
vendored
@@ -45,11 +45,11 @@ jobs:
|
||||
- os: windows-latest
|
||||
targetos: win32
|
||||
targetarch: amd64
|
||||
- os: windows-latest
|
||||
- os: windows-2019 # always use the oldest possible for 32-bit because of older compilers, and better support of certain legacy OSes
|
||||
targetos: win32
|
||||
targetarch: i386
|
||||
env:
|
||||
SDL_VERSION: 2.28.1
|
||||
SDL_VERSION: 2.28.5
|
||||
GH_CPU_ARCH: ${{ matrix.targetarch }}
|
||||
ANDROID_SDK_TOOLS_VER: 4333796
|
||||
steps:
|
||||
|
||||
2
3rdparty/mainui
vendored
2
3rdparty/mainui
vendored
Submodule 3rdparty/mainui updated: b4bb815420...7223589d60
@@ -240,6 +240,8 @@ CSO-like Xash3D-based mod, CSMoE - https://github.com/MoeMod/CSMoE
|
||||
## Crack-Life: Campaign Mode
|
||||
Recreation by lostgamer aka nillerusr - https://github.com/LostGamerHL/crack_life
|
||||
|
||||
Reverse-engineered code: branch **clcampaign** in hlsdk-portable - https://github.com/FWGS/hlsdk-portable/tree/clcampaign
|
||||
|
||||
## Escape from the Darkness
|
||||
malortie's recreation - https://github.com/malortie/hl-eftd
|
||||
|
||||
|
||||
@@ -717,6 +717,7 @@ enum
|
||||
kRenderFxExplode, // Scale up really big!
|
||||
kRenderFxGlowShell, // Glowing Shell
|
||||
kRenderFxClampMinScale, // Keep this sprite from getting very small (SPRITES only!)
|
||||
kRenderFxLightMultiplier,
|
||||
};
|
||||
|
||||
typedef int func_t;
|
||||
|
||||
@@ -1,18 +1,35 @@
|
||||
//========= Copyright © 1996-2002, Valve LLC, All rights reserved. ============
|
||||
//
|
||||
// Purpose:
|
||||
//
|
||||
// $NoKeywords: $
|
||||
//=============================================================================
|
||||
/*
|
||||
Copyright (C) 1996-1997 Id Software, Inc.
|
||||
|
||||
#if !defined( KBUTTONH )
|
||||
#define KBUTTONH
|
||||
#pragma once
|
||||
This program is free software; you can redistribute it and/or
|
||||
modify it under the terms of the GNU General Public License
|
||||
as published by the Free Software Foundation; either version 2
|
||||
of the License, or (at your option) any later version.
|
||||
|
||||
typedef struct kbutton_s
|
||||
This program is distributed in the hope that it will be useful,
|
||||
but WITHOUT ANY WARRANTY; without even the implied warranty of
|
||||
MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.
|
||||
|
||||
See the GNU General Public License for more details.
|
||||
|
||||
You should have received a copy of the GNU 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.
|
||||
|
||||
*/
|
||||
#ifndef KBUTTON_H
|
||||
#define KBUTTON_H
|
||||
|
||||
// a1ba: copied from WinQuake/client.h
|
||||
//
|
||||
// cl_input
|
||||
//
|
||||
typedef struct
|
||||
{
|
||||
int down[2]; // key nums holding it down
|
||||
int state; // low bit is down state
|
||||
} kbutton_t;
|
||||
|
||||
#endif // !KBUTTONH
|
||||
STATIC_ASSERT( sizeof( kbutton_t ) == 12, "kbutton_t isn't 12 bytes!" );
|
||||
|
||||
#endif // KBUTTON_H
|
||||
|
||||
106
common/netadr.h
106
common/netadr.h
@@ -1,76 +1,74 @@
|
||||
/***
|
||||
*
|
||||
* Copyright (c) 1996-2002, Valve LLC. All rights reserved.
|
||||
*
|
||||
* This product contains software technology licensed from Id
|
||||
* Software, Inc. ("Id Technology"). Id Technology (c) 1996 Id Software, Inc.
|
||||
* All Rights Reserved.
|
||||
*
|
||||
* Use, distribution, and modification of this source code and/or resulting
|
||||
* object code is restricted to non-commercial enhancements to products from
|
||||
* Valve LLC. All other use, distribution, or modification is prohibited
|
||||
* without written permission from Valve LLC.
|
||||
*
|
||||
****/
|
||||
/*
|
||||
Copyright (C) 1997-2001 Id Software, Inc.
|
||||
|
||||
#ifndef NETADR_H
|
||||
#define NETADR_H
|
||||
This program is free software; you can redistribute it and/or
|
||||
modify it under the terms of the GNU General Public License
|
||||
as published by the Free Software Foundation; either version 2
|
||||
of the License, or (at your option) any later version.
|
||||
|
||||
This program is distributed in the hope that it will be useful,
|
||||
but WITHOUT ANY WARRANTY; without even the implied warranty of
|
||||
MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.
|
||||
|
||||
See the GNU General Public License for more details.
|
||||
|
||||
You should have received a copy of the GNU 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.
|
||||
|
||||
*/
|
||||
|
||||
#ifndef NET_ADR_H
|
||||
#define NET_ADR_H
|
||||
|
||||
#include "build.h"
|
||||
#include STDINT_H
|
||||
|
||||
typedef enum
|
||||
{
|
||||
NA_UNUSED = 0,
|
||||
NA_LOOPBACK,
|
||||
NA_BROADCAST,
|
||||
NA_IP,
|
||||
NA_IPX,
|
||||
NA_BROADCAST_IPX,
|
||||
NA_IP6,
|
||||
NA_MULTICAST_IP6, // all nodes multicast
|
||||
} netadrtype_t;
|
||||
// net.h -- quake's interface to the networking layer
|
||||
// a1ba: copied from Quake-2/qcommon/qcommon.h and modified to support IPv6
|
||||
|
||||
// Original structure:
|
||||
// typedef struct netadr_s
|
||||
// {
|
||||
// netadrtype_t type;
|
||||
// unsigned char ip[4];
|
||||
// unsigned char ipx[10];
|
||||
// unsigned short port;
|
||||
// } netadr_t;
|
||||
#define PORT_ANY -1
|
||||
|
||||
typedef enum {NA_LOOPBACK = 1, NA_BROADCAST, NA_IP, NA_IPX, NA_BROADCAST_IPX, NA_IP6, NA_MULTICAST_IP6} netadrtype_t;
|
||||
|
||||
/*
|
||||
Original Quake-2 structure:
|
||||
typedef struct
|
||||
{
|
||||
netadrtype_t type;
|
||||
|
||||
byte ip[4];
|
||||
byte ipx[10];
|
||||
|
||||
unsigned short port;
|
||||
} netadr_t;
|
||||
*/
|
||||
|
||||
#pragma pack( push, 1 )
|
||||
typedef struct netadr_s
|
||||
{
|
||||
union
|
||||
{
|
||||
// IPv6 struct
|
||||
struct
|
||||
{
|
||||
uint32_t type;
|
||||
uint16_t type6;
|
||||
uint8_t ip6[16];
|
||||
};
|
||||
struct
|
||||
{
|
||||
uint32_t type; // must be netadrtype_t but will break with short enums
|
||||
union
|
||||
{
|
||||
uint8_t ip[4];
|
||||
uint32_t ip4;
|
||||
uint8_t ip[4];
|
||||
uint32_t ip4; // for easier conversions
|
||||
};
|
||||
uint8_t ipx[10];
|
||||
};
|
||||
struct
|
||||
{
|
||||
#if XASH_LITTLE_ENDIAN
|
||||
uint16_t type6;
|
||||
uint8_t ip6[16];
|
||||
#elif XASH_BIG_ENDIAN
|
||||
uint8_t ip6_0[2];
|
||||
uint16_t type6;
|
||||
uint8_t ip6_2[14];
|
||||
#endif
|
||||
uint8_t ipx[10];
|
||||
};
|
||||
};
|
||||
uint16_t port;
|
||||
uint16_t port;
|
||||
} netadr_t;
|
||||
#pragma pack( pop )
|
||||
|
||||
STATIC_ASSERT( sizeof( netadr_t ) == 20, "invalid netadr_t size" );
|
||||
STATIC_ASSERT( sizeof( netadr_t ) == 20, "netadr_t isn't 20 bytes!" );
|
||||
|
||||
#endif//NETADR_H
|
||||
#endif // NET_ADR_H
|
||||
|
||||
@@ -58,9 +58,6 @@ typedef uint64_t longtime_t;
|
||||
|
||||
#define BIT( n ) ( 1U << ( n ))
|
||||
#define BIT64( n ) ( 1ULL << ( n ))
|
||||
#define GAMMA ( 2.2f ) // Valve Software gamma
|
||||
#define INVGAMMA ( 1.0f / 2.2f ) // back to 1.0
|
||||
#define TEXGAMMA ( 0.9f ) // compensate dim textures
|
||||
#define SetBits( iBitVector, bits ) ((iBitVector) = (iBitVector) | (bits))
|
||||
#define ClearBits( iBitVector, bits ) ((iBitVector) = (iBitVector) & ~(bits))
|
||||
#define FBitSet( iBitVector, bit ) ((iBitVector) & (bit))
|
||||
@@ -121,15 +118,18 @@ typedef uint64_t longtime_t;
|
||||
#define likely(x) (x)
|
||||
#endif
|
||||
|
||||
#if __STDC_VERSION >= 202311L || __cplusplus >= 201103L // C23 or C++ static_assert is a keyword
|
||||
#define STATIC_ASSERT_ static_assert
|
||||
#if __STDC_VERSION__ >= 202311L || __cplusplus >= 201103L // C23 or C++ static_assert is a keyword
|
||||
#define STATIC_ASSERT_( ignore, x, y ) static_assert( x, y )
|
||||
#define STATIC_ASSERT static_assert
|
||||
#elif __STDC_VERSION >= 201112L // in C11 it's _Static_assert
|
||||
#define STATIC_ASSERT_ _Static_assert
|
||||
#elif __STDC_VERSION__ >= 201112L // in C11 it's _Static_assert
|
||||
#define STATIC_ASSERT_( ignore, x, y ) _Static_assert( x, y )
|
||||
#define STATIC_ASSERT _Static_assert
|
||||
#else
|
||||
#define STATIC_ASSERT_( id, x, y ) extern int id[( x ) ? 1 : -1]
|
||||
#define STATIC_ASSERT( x, y ) STATIC_ASSERT_( static_assert_##__LINE__, x, y )
|
||||
// need these to correctly expand the line macro
|
||||
#define STATIC_ASSERT_3( line, x, y ) STATIC_ASSERT_( static_assert_ ## line, x, y )
|
||||
#define STATIC_ASSERT_2( line, x, y ) STATIC_ASSERT_3( line, x, y )
|
||||
#define STATIC_ASSERT( x, y ) STATIC_ASSERT_2( __LINE__, x, y )
|
||||
#endif
|
||||
|
||||
#ifdef XASH_BIG_ENDIAN
|
||||
|
||||
356
engine/anorms.h
356
engine/anorms.h
@@ -1,177 +1,181 @@
|
||||
/***
|
||||
*
|
||||
* Copyright (c) 1996-2002, Valve LLC. All rights reserved.
|
||||
*
|
||||
* This product contains software technology licensed from Id
|
||||
* Software, Inc. ("Id Technology"). Id Technology (c) 1996 Id Software, Inc.
|
||||
* All Rights Reserved.
|
||||
*
|
||||
* Use, distribution, and modification of this source code and/or resulting
|
||||
* object code is restricted to non-commercial enhancements to products from
|
||||
* Valve LLC. All other use, distribution, or modification is prohibited
|
||||
* without written permission from Valve LLC.
|
||||
*
|
||||
****/
|
||||
/*
|
||||
Copyright (C) 1996-1997 Id Software, Inc.
|
||||
|
||||
{-0.525731, 0.000000, 0.850651},
|
||||
{-0.442863, 0.238856, 0.864188},
|
||||
{-0.295242, 0.000000, 0.955423},
|
||||
{-0.309017, 0.500000, 0.809017},
|
||||
{-0.162460, 0.262866, 0.951056},
|
||||
{0.000000, 0.000000, 1.000000},
|
||||
{0.000000, 0.850651, 0.525731},
|
||||
{-0.147621, 0.716567, 0.681718},
|
||||
{0.147621, 0.716567, 0.681718},
|
||||
{0.000000, 0.525731, 0.850651},
|
||||
{0.309017, 0.500000, 0.809017},
|
||||
{0.525731, 0.000000, 0.850651},
|
||||
{0.295242, 0.000000, 0.955423},
|
||||
{0.442863, 0.238856, 0.864188},
|
||||
{0.162460, 0.262866, 0.951056},
|
||||
{-0.681718, 0.147621, 0.716567},
|
||||
{-0.809017, 0.309017, 0.500000},
|
||||
{-0.587785, 0.425325, 0.688191},
|
||||
{-0.850651, 0.525731, 0.000000},
|
||||
{-0.864188, 0.442863, 0.238856},
|
||||
{-0.716567, 0.681718, 0.147621},
|
||||
{-0.688191, 0.587785, 0.425325},
|
||||
{-0.500000, 0.809017, 0.309017},
|
||||
{-0.238856, 0.864188, 0.442863},
|
||||
{-0.425325, 0.688191, 0.587785},
|
||||
{-0.716567, 0.681718, -0.147621},
|
||||
{-0.500000, 0.809017, -0.309017},
|
||||
{-0.525731, 0.850651, 0.000000},
|
||||
{0.000000, 0.850651, -0.525731},
|
||||
{-0.238856, 0.864188, -0.442863},
|
||||
{0.000000, 0.955423, -0.295242},
|
||||
{-0.262866, 0.951056, -0.162460},
|
||||
{0.000000, 1.000000, 0.000000},
|
||||
{0.000000, 0.955423, 0.295242},
|
||||
{-0.262866, 0.951056, 0.162460},
|
||||
{0.238856, 0.864188, 0.442863},
|
||||
{0.262866, 0.951056, 0.162460},
|
||||
{0.500000, 0.809017, 0.309017},
|
||||
{0.238856, 0.864188, -0.442863},
|
||||
{0.262866, 0.951056, -0.162460},
|
||||
{0.500000, 0.809017, -0.309017},
|
||||
{0.850651, 0.525731, 0.000000},
|
||||
{0.716567, 0.681718, 0.147621},
|
||||
{0.716567, 0.681718, -0.147621},
|
||||
{0.525731, 0.850651, 0.000000},
|
||||
{0.425325, 0.688191, 0.587785},
|
||||
{0.864188, 0.442863, 0.238856},
|
||||
{0.688191, 0.587785, 0.425325},
|
||||
{0.809017, 0.309017, 0.500000},
|
||||
{0.681718, 0.147621, 0.716567},
|
||||
{0.587785, 0.425325, 0.688191},
|
||||
{0.955423, 0.295242, 0.000000},
|
||||
{1.000000, 0.000000, 0.000000},
|
||||
{0.951056, 0.162460, 0.262866},
|
||||
{0.850651, -0.525731, 0.000000},
|
||||
{0.955423, -0.295242, 0.000000},
|
||||
{0.864188, -0.442863, 0.238856},
|
||||
{0.951056, -0.162460, 0.262866},
|
||||
{0.809017, -0.309017, 0.500000},
|
||||
{0.681718, -0.147621, 0.716567},
|
||||
{0.850651, 0.000000, 0.525731},
|
||||
{0.864188, 0.442863, -0.238856},
|
||||
{0.809017, 0.309017, -0.500000},
|
||||
{0.951056, 0.162460, -0.262866},
|
||||
{0.525731, 0.000000, -0.850651},
|
||||
{0.681718, 0.147621, -0.716567},
|
||||
{0.681718, -0.147621, -0.716567},
|
||||
{0.850651, 0.000000, -0.525731},
|
||||
{0.809017, -0.309017, -0.500000},
|
||||
{0.864188, -0.442863, -0.238856},
|
||||
{0.951056, -0.162460, -0.262866},
|
||||
{0.147621, 0.716567, -0.681718},
|
||||
{0.309017, 0.500000, -0.809017},
|
||||
{0.425325, 0.688191, -0.587785},
|
||||
{0.442863, 0.238856, -0.864188},
|
||||
{0.587785, 0.425325, -0.688191},
|
||||
{0.688191, 0.587785, -0.425325},
|
||||
{-0.147621, 0.716567, -0.681718},
|
||||
{-0.309017, 0.500000, -0.809017},
|
||||
{0.000000, 0.525731, -0.850651},
|
||||
{-0.525731, 0.000000, -0.850651},
|
||||
{-0.442863, 0.238856, -0.864188},
|
||||
{-0.295242, 0.000000, -0.955423},
|
||||
{-0.162460, 0.262866, -0.951056},
|
||||
{0.000000, 0.000000, -1.000000},
|
||||
{0.295242, 0.000000, -0.955423},
|
||||
{0.162460, 0.262866, -0.951056},
|
||||
{-0.442863, -0.238856, -0.864188},
|
||||
{-0.309017, -0.500000, -0.809017},
|
||||
{-0.162460, -0.262866, -0.951056},
|
||||
{0.000000, -0.850651, -0.525731},
|
||||
{-0.147621, -0.716567, -0.681718},
|
||||
{0.147621, -0.716567, -0.681718},
|
||||
{0.000000, -0.525731, -0.850651},
|
||||
{0.309017, -0.500000, -0.809017},
|
||||
{0.442863, -0.238856, -0.864188},
|
||||
{0.162460, -0.262866, -0.951056},
|
||||
{0.238856, -0.864188, -0.442863},
|
||||
{0.500000, -0.809017, -0.309017},
|
||||
{0.425325, -0.688191, -0.587785},
|
||||
{0.716567, -0.681718, -0.147621},
|
||||
{0.688191, -0.587785, -0.425325},
|
||||
{0.587785, -0.425325, -0.688191},
|
||||
{0.000000, -0.955423, -0.295242},
|
||||
{0.000000, -1.000000, 0.000000},
|
||||
{0.262866, -0.951056, -0.162460},
|
||||
{0.000000, -0.850651, 0.525731},
|
||||
{0.000000, -0.955423, 0.295242},
|
||||
{0.238856, -0.864188, 0.442863},
|
||||
{0.262866, -0.951056, 0.162460},
|
||||
{0.500000, -0.809017, 0.309017},
|
||||
{0.716567, -0.681718, 0.147621},
|
||||
{0.525731, -0.850651, 0.000000},
|
||||
{-0.238856, -0.864188, -0.442863},
|
||||
{-0.500000, -0.809017, -0.309017},
|
||||
{-0.262866, -0.951056, -0.162460},
|
||||
{-0.850651, -0.525731, 0.000000},
|
||||
{-0.716567, -0.681718, -0.147621},
|
||||
{-0.716567, -0.681718, 0.147621},
|
||||
{-0.525731, -0.850651, 0.000000},
|
||||
{-0.500000, -0.809017, 0.309017},
|
||||
{-0.238856, -0.864188, 0.442863},
|
||||
{-0.262866, -0.951056, 0.162460},
|
||||
{-0.864188, -0.442863, 0.238856},
|
||||
{-0.809017, -0.309017, 0.500000},
|
||||
{-0.688191, -0.587785, 0.425325},
|
||||
{-0.681718, -0.147621, 0.716567},
|
||||
{-0.442863, -0.238856, 0.864188},
|
||||
{-0.587785, -0.425325, 0.688191},
|
||||
{-0.309017, -0.500000, 0.809017},
|
||||
{-0.147621, -0.716567, 0.681718},
|
||||
{-0.425325, -0.688191, 0.587785},
|
||||
{-0.162460, -0.262866, 0.951056},
|
||||
{0.442863, -0.238856, 0.864188},
|
||||
{0.162460, -0.262866, 0.951056},
|
||||
{0.309017, -0.500000, 0.809017},
|
||||
{0.147621, -0.716567, 0.681718},
|
||||
{0.000000, -0.525731, 0.850651},
|
||||
{0.425325, -0.688191, 0.587785},
|
||||
{0.587785, -0.425325, 0.688191},
|
||||
{0.688191, -0.587785, 0.425325},
|
||||
{-0.955423, 0.295242, 0.000000},
|
||||
{-0.951056, 0.162460, 0.262866},
|
||||
{-1.000000, 0.000000, 0.000000},
|
||||
{-0.850651, 0.000000, 0.525731},
|
||||
{-0.955423, -0.295242, 0.000000},
|
||||
{-0.951056, -0.162460, 0.262866},
|
||||
{-0.864188, 0.442863, -0.238856},
|
||||
{-0.951056, 0.162460, -0.262866},
|
||||
{-0.809017, 0.309017, -0.500000},
|
||||
{-0.864188, -0.442863, -0.238856},
|
||||
{-0.951056, -0.162460, -0.262866},
|
||||
{-0.809017, -0.309017, -0.500000},
|
||||
{-0.681718, 0.147621, -0.716567},
|
||||
{-0.681718, -0.147621, -0.716567},
|
||||
{-0.850651, 0.000000, -0.525731},
|
||||
{-0.688191, 0.587785, -0.425325},
|
||||
{-0.587785, 0.425325, -0.688191},
|
||||
{-0.425325, 0.688191, -0.587785},
|
||||
{-0.425325, -0.688191, -0.587785},
|
||||
{-0.587785, -0.425325, -0.688191},
|
||||
{-0.688191, -0.587785, -0.425325},
|
||||
This program is free software; you can redistribute it and/or
|
||||
modify it under the terms of the GNU General Public License
|
||||
as published by the Free Software Foundation; either version 2
|
||||
of the License, or (at your option) any later version.
|
||||
|
||||
This program is distributed in the hope that it will be useful,
|
||||
but WITHOUT ANY WARRANTY; without even the implied warranty of
|
||||
MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.
|
||||
|
||||
See the GNU General Public License for more details.
|
||||
|
||||
You should have received a copy of the GNU 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.
|
||||
|
||||
*/
|
||||
{-0.525731, 0.000000, 0.850651},
|
||||
{-0.442863, 0.238856, 0.864188},
|
||||
{-0.295242, 0.000000, 0.955423},
|
||||
{-0.309017, 0.500000, 0.809017},
|
||||
{-0.162460, 0.262866, 0.951056},
|
||||
{0.000000, 0.000000, 1.000000},
|
||||
{0.000000, 0.850651, 0.525731},
|
||||
{-0.147621, 0.716567, 0.681718},
|
||||
{0.147621, 0.716567, 0.681718},
|
||||
{0.000000, 0.525731, 0.850651},
|
||||
{0.309017, 0.500000, 0.809017},
|
||||
{0.525731, 0.000000, 0.850651},
|
||||
{0.295242, 0.000000, 0.955423},
|
||||
{0.442863, 0.238856, 0.864188},
|
||||
{0.162460, 0.262866, 0.951056},
|
||||
{-0.681718, 0.147621, 0.716567},
|
||||
{-0.809017, 0.309017, 0.500000},
|
||||
{-0.587785, 0.425325, 0.688191},
|
||||
{-0.850651, 0.525731, 0.000000},
|
||||
{-0.864188, 0.442863, 0.238856},
|
||||
{-0.716567, 0.681718, 0.147621},
|
||||
{-0.688191, 0.587785, 0.425325},
|
||||
{-0.500000, 0.809017, 0.309017},
|
||||
{-0.238856, 0.864188, 0.442863},
|
||||
{-0.425325, 0.688191, 0.587785},
|
||||
{-0.716567, 0.681718, -0.147621},
|
||||
{-0.500000, 0.809017, -0.309017},
|
||||
{-0.525731, 0.850651, 0.000000},
|
||||
{0.000000, 0.850651, -0.525731},
|
||||
{-0.238856, 0.864188, -0.442863},
|
||||
{0.000000, 0.955423, -0.295242},
|
||||
{-0.262866, 0.951056, -0.162460},
|
||||
{0.000000, 1.000000, 0.000000},
|
||||
{0.000000, 0.955423, 0.295242},
|
||||
{-0.262866, 0.951056, 0.162460},
|
||||
{0.238856, 0.864188, 0.442863},
|
||||
{0.262866, 0.951056, 0.162460},
|
||||
{0.500000, 0.809017, 0.309017},
|
||||
{0.238856, 0.864188, -0.442863},
|
||||
{0.262866, 0.951056, -0.162460},
|
||||
{0.500000, 0.809017, -0.309017},
|
||||
{0.850651, 0.525731, 0.000000},
|
||||
{0.716567, 0.681718, 0.147621},
|
||||
{0.716567, 0.681718, -0.147621},
|
||||
{0.525731, 0.850651, 0.000000},
|
||||
{0.425325, 0.688191, 0.587785},
|
||||
{0.864188, 0.442863, 0.238856},
|
||||
{0.688191, 0.587785, 0.425325},
|
||||
{0.809017, 0.309017, 0.500000},
|
||||
{0.681718, 0.147621, 0.716567},
|
||||
{0.587785, 0.425325, 0.688191},
|
||||
{0.955423, 0.295242, 0.000000},
|
||||
{1.000000, 0.000000, 0.000000},
|
||||
{0.951056, 0.162460, 0.262866},
|
||||
{0.850651, -0.525731, 0.000000},
|
||||
{0.955423, -0.295242, 0.000000},
|
||||
{0.864188, -0.442863, 0.238856},
|
||||
{0.951056, -0.162460, 0.262866},
|
||||
{0.809017, -0.309017, 0.500000},
|
||||
{0.681718, -0.147621, 0.716567},
|
||||
{0.850651, 0.000000, 0.525731},
|
||||
{0.864188, 0.442863, -0.238856},
|
||||
{0.809017, 0.309017, -0.500000},
|
||||
{0.951056, 0.162460, -0.262866},
|
||||
{0.525731, 0.000000, -0.850651},
|
||||
{0.681718, 0.147621, -0.716567},
|
||||
{0.681718, -0.147621, -0.716567},
|
||||
{0.850651, 0.000000, -0.525731},
|
||||
{0.809017, -0.309017, -0.500000},
|
||||
{0.864188, -0.442863, -0.238856},
|
||||
{0.951056, -0.162460, -0.262866},
|
||||
{0.147621, 0.716567, -0.681718},
|
||||
{0.309017, 0.500000, -0.809017},
|
||||
{0.425325, 0.688191, -0.587785},
|
||||
{0.442863, 0.238856, -0.864188},
|
||||
{0.587785, 0.425325, -0.688191},
|
||||
{0.688191, 0.587785, -0.425325},
|
||||
{-0.147621, 0.716567, -0.681718},
|
||||
{-0.309017, 0.500000, -0.809017},
|
||||
{0.000000, 0.525731, -0.850651},
|
||||
{-0.525731, 0.000000, -0.850651},
|
||||
{-0.442863, 0.238856, -0.864188},
|
||||
{-0.295242, 0.000000, -0.955423},
|
||||
{-0.162460, 0.262866, -0.951056},
|
||||
{0.000000, 0.000000, -1.000000},
|
||||
{0.295242, 0.000000, -0.955423},
|
||||
{0.162460, 0.262866, -0.951056},
|
||||
{-0.442863, -0.238856, -0.864188},
|
||||
{-0.309017, -0.500000, -0.809017},
|
||||
{-0.162460, -0.262866, -0.951056},
|
||||
{0.000000, -0.850651, -0.525731},
|
||||
{-0.147621, -0.716567, -0.681718},
|
||||
{0.147621, -0.716567, -0.681718},
|
||||
{0.000000, -0.525731, -0.850651},
|
||||
{0.309017, -0.500000, -0.809017},
|
||||
{0.442863, -0.238856, -0.864188},
|
||||
{0.162460, -0.262866, -0.951056},
|
||||
{0.238856, -0.864188, -0.442863},
|
||||
{0.500000, -0.809017, -0.309017},
|
||||
{0.425325, -0.688191, -0.587785},
|
||||
{0.716567, -0.681718, -0.147621},
|
||||
{0.688191, -0.587785, -0.425325},
|
||||
{0.587785, -0.425325, -0.688191},
|
||||
{0.000000, -0.955423, -0.295242},
|
||||
{0.000000, -1.000000, 0.000000},
|
||||
{0.262866, -0.951056, -0.162460},
|
||||
{0.000000, -0.850651, 0.525731},
|
||||
{0.000000, -0.955423, 0.295242},
|
||||
{0.238856, -0.864188, 0.442863},
|
||||
{0.262866, -0.951056, 0.162460},
|
||||
{0.500000, -0.809017, 0.309017},
|
||||
{0.716567, -0.681718, 0.147621},
|
||||
{0.525731, -0.850651, 0.000000},
|
||||
{-0.238856, -0.864188, -0.442863},
|
||||
{-0.500000, -0.809017, -0.309017},
|
||||
{-0.262866, -0.951056, -0.162460},
|
||||
{-0.850651, -0.525731, 0.000000},
|
||||
{-0.716567, -0.681718, -0.147621},
|
||||
{-0.716567, -0.681718, 0.147621},
|
||||
{-0.525731, -0.850651, 0.000000},
|
||||
{-0.500000, -0.809017, 0.309017},
|
||||
{-0.238856, -0.864188, 0.442863},
|
||||
{-0.262866, -0.951056, 0.162460},
|
||||
{-0.864188, -0.442863, 0.238856},
|
||||
{-0.809017, -0.309017, 0.500000},
|
||||
{-0.688191, -0.587785, 0.425325},
|
||||
{-0.681718, -0.147621, 0.716567},
|
||||
{-0.442863, -0.238856, 0.864188},
|
||||
{-0.587785, -0.425325, 0.688191},
|
||||
{-0.309017, -0.500000, 0.809017},
|
||||
{-0.147621, -0.716567, 0.681718},
|
||||
{-0.425325, -0.688191, 0.587785},
|
||||
{-0.162460, -0.262866, 0.951056},
|
||||
{0.442863, -0.238856, 0.864188},
|
||||
{0.162460, -0.262866, 0.951056},
|
||||
{0.309017, -0.500000, 0.809017},
|
||||
{0.147621, -0.716567, 0.681718},
|
||||
{0.000000, -0.525731, 0.850651},
|
||||
{0.425325, -0.688191, 0.587785},
|
||||
{0.587785, -0.425325, 0.688191},
|
||||
{0.688191, -0.587785, 0.425325},
|
||||
{-0.955423, 0.295242, 0.000000},
|
||||
{-0.951056, 0.162460, 0.262866},
|
||||
{-1.000000, 0.000000, 0.000000},
|
||||
{-0.850651, 0.000000, 0.525731},
|
||||
{-0.955423, -0.295242, 0.000000},
|
||||
{-0.951056, -0.162460, 0.262866},
|
||||
{-0.864188, 0.442863, -0.238856},
|
||||
{-0.951056, 0.162460, -0.262866},
|
||||
{-0.809017, 0.309017, -0.500000},
|
||||
{-0.864188, -0.442863, -0.238856},
|
||||
{-0.951056, -0.162460, -0.262866},
|
||||
{-0.809017, -0.309017, -0.500000},
|
||||
{-0.681718, 0.147621, -0.716567},
|
||||
{-0.681718, -0.147621, -0.716567},
|
||||
{-0.850651, 0.000000, -0.525731},
|
||||
{-0.688191, 0.587785, -0.425325},
|
||||
{-0.587785, 0.425325, -0.688191},
|
||||
{-0.425325, 0.688191, -0.587785},
|
||||
{-0.425325, -0.688191, -0.587785},
|
||||
{-0.587785, -0.425325, -0.688191},
|
||||
{-0.688191, -0.587785, -0.425325},
|
||||
|
||||
@@ -2191,9 +2191,20 @@ void CL_ConnectionlessPacket( netadr_t from, sizebuf_t *msg )
|
||||
// serverlist got from masterserver
|
||||
while( MSG_GetNumBitsLeft( msg ) > 8 )
|
||||
{
|
||||
MSG_ReadBytes( msg, servadr.ip, sizeof( servadr.ip )); // 4 bytes for IP
|
||||
uint8_t addr[16];
|
||||
|
||||
if( from.type6 == NA_IP6 ) // IPv6 master server only sends IPv6 addresses
|
||||
{
|
||||
MSG_ReadBytes( msg, addr, sizeof( addr ));
|
||||
NET_IP6BytesToNetadr( &servadr, addr );
|
||||
servadr.type6 = NA_IP6;
|
||||
}
|
||||
else
|
||||
{
|
||||
MSG_ReadBytes( msg, servadr.ip, sizeof( servadr.ip )); // 4 bytes for IP
|
||||
servadr.type = NA_IP;
|
||||
}
|
||||
servadr.port = MSG_ReadShort( msg ); // 2 bytes for Port
|
||||
servadr.type = NA_IP;
|
||||
|
||||
// list is ends here
|
||||
if( !servadr.port )
|
||||
@@ -2922,10 +2933,6 @@ void CL_InitLocal( void )
|
||||
Cvar_RegisterVariable( &cl_maxframetime );
|
||||
Cvar_RegisterVariable( &cl_fixmodelinterpolationartifacts );
|
||||
|
||||
// these two added to shut up CS 1.5 about 'unknown' commands
|
||||
Cvar_Get( "lightgamma", "1", FCVAR_ARCHIVE, "ambient lighting level (legacy, unused)" );
|
||||
Cvar_Get( "direct", "1", FCVAR_ARCHIVE, "direct lighting level (legacy, unused)" );
|
||||
|
||||
// server commands
|
||||
Cmd_AddCommand ("noclip", NULL, "enable or disable no clipping mode" );
|
||||
Cmd_AddCommand ("notarget", NULL, "notarget mode (monsters do not see you)" );
|
||||
|
||||
@@ -292,6 +292,8 @@ void SCR_MakeScreenShot( void )
|
||||
viewsize = cls.envshot_viewsize;
|
||||
else viewsize = cl_envshot_size.value;
|
||||
|
||||
V_CheckGamma();
|
||||
|
||||
switch( cls.scrshot_action )
|
||||
{
|
||||
case scrshot_normal:
|
||||
|
||||
@@ -347,6 +347,8 @@ qboolean V_PreRender( void )
|
||||
return false;
|
||||
}
|
||||
|
||||
V_CheckGamma();
|
||||
|
||||
ref.dllFuncs.R_BeginFrame( !cl.paused && ( cls.state == ca_active ));
|
||||
|
||||
GL_UpdateSwapInterval( );
|
||||
|
||||
@@ -29,7 +29,8 @@ static CVAR_DEFINE_AUTO( con_charset, "cp1251", FCVAR_ARCHIVE, "console font cha
|
||||
static CVAR_DEFINE_AUTO( con_fontscale, "1.0", FCVAR_ARCHIVE, "scale font texture" );
|
||||
static CVAR_DEFINE_AUTO( con_fontnum, "-1", FCVAR_ARCHIVE, "console font number (0, 1 or 2), -1 for autoselect" );
|
||||
static CVAR_DEFINE_AUTO( con_color, "240 180 24", FCVAR_ARCHIVE, "set a custom console color" );
|
||||
|
||||
static CVAR_DEFINE_AUTO( scr_drawversion, "1", FCVAR_ARCHIVE, "draw version in menu or screenshots, doesn't affect console" );
|
||||
static CVAR_DEFINE_AUTO( con_oldfont, "0", 0, "use legacy font from gfx.wad, might be missing or broken" );
|
||||
|
||||
static int g_codepage = 0;
|
||||
static qboolean g_utf8 = false;
|
||||
@@ -543,8 +544,7 @@ static void Con_LoadConsoleFont( int fontNumber, cl_font_t *font )
|
||||
if( font->valid )
|
||||
return; // already loaded
|
||||
|
||||
// loading conchars
|
||||
if( Sys_CheckParm( "-oldfont" ))
|
||||
if( con_oldfont.value )
|
||||
{
|
||||
success = Con_LoadVariableWidthFont( "gfx/conchars.fnt", font, scale, kRenderTransTexture, TF_FONT|TF_NEAREST );
|
||||
}
|
||||
@@ -841,6 +841,8 @@ void Con_Init( void )
|
||||
Cvar_RegisterVariable( &con_fontscale );
|
||||
Cvar_RegisterVariable( &con_fontnum );
|
||||
Cvar_RegisterVariable( &con_color );
|
||||
Cvar_RegisterVariable( &scr_drawversion );
|
||||
Cvar_RegisterVariable( &con_oldfont );
|
||||
|
||||
// init the console buffer
|
||||
con.bufsize = CON_TEXTSIZE;
|
||||
@@ -2047,26 +2049,30 @@ void Con_DrawVersion( void )
|
||||
byte *color = g_color_table[7];
|
||||
int stringLen, charH = 0;
|
||||
int start, height = refState.height;
|
||||
qboolean draw_version = false;
|
||||
string curbuild;
|
||||
|
||||
switch( cls.scrshot_action )
|
||||
{
|
||||
case scrshot_normal:
|
||||
case scrshot_snapshot:
|
||||
draw_version = true;
|
||||
break;
|
||||
}
|
||||
|
||||
if( host.force_draw_version_time > host.realtime )
|
||||
draw_version = true;
|
||||
|
||||
if(( cls.key_dest != key_menu && !draw_version ) || CL_IsDevOverviewMode() == 2 || net_graph.value )
|
||||
if( !scr_drawversion.value || CL_IsDevOverviewMode() == 2 || net_graph.value )
|
||||
return;
|
||||
|
||||
if( draw_version )
|
||||
Q_snprintf( curbuild, MAX_STRING, XASH_ENGINE_NAME " v%i/" XASH_VERSION " (%s-%s build %i)", PROTOCOL_VERSION, Q_buildos(), Q_buildarch(), Q_buildnum( ));
|
||||
else Q_snprintf( curbuild, MAX_STRING, "v%i/" XASH_VERSION " (%s-%s build %i)", PROTOCOL_VERSION, Q_buildos(), Q_buildarch(), Q_buildnum( ));
|
||||
if( cls.key_dest == key_menu )
|
||||
{
|
||||
Q_snprintf( curbuild, sizeof( curbuild ),
|
||||
"v%i/" XASH_VERSION " (%s-%s build %i)", PROTOCOL_VERSION, Q_buildos(), Q_buildarch(), Q_buildnum( ));
|
||||
}
|
||||
else
|
||||
{
|
||||
qboolean draw_version;
|
||||
|
||||
draw_version = cls.scrshot_action == scrshot_normal
|
||||
|| cls.scrshot_action == scrshot_snapshot
|
||||
|| host.force_draw_version_time > host.realtime;
|
||||
|
||||
if( !draw_version )
|
||||
return;
|
||||
|
||||
Q_snprintf( curbuild, sizeof( curbuild ),
|
||||
XASH_ENGINE_NAME " v%i/" XASH_VERSION " (%s-%s build %i)", PROTOCOL_VERSION, Q_buildos(), Q_buildarch(), Q_buildnum( ));
|
||||
}
|
||||
|
||||
Con_DrawStringLen( curbuild, &stringLen, &charH );
|
||||
start = refState.width - stringLen * 1.05f;
|
||||
@@ -2112,10 +2118,7 @@ void Con_RunConsole( void )
|
||||
con.vislines = con.showlines;
|
||||
}
|
||||
|
||||
if( FBitSet( con_charset.flags, FCVAR_CHANGED ) ||
|
||||
FBitSet( con_fontscale.flags, FCVAR_CHANGED ) ||
|
||||
FBitSet( con_fontnum.flags, FCVAR_CHANGED ) ||
|
||||
FBitSet( cl_charset.flags, FCVAR_CHANGED ))
|
||||
if( FBitSet( con_charset.flags|con_fontscale.flags|con_fontnum.flags|cl_charset.flags|con_oldfont.flags, FCVAR_CHANGED ))
|
||||
{
|
||||
// update codepage parameters
|
||||
if( !Q_stricmp( con_charset.string, "cp1251" ))
|
||||
@@ -2141,6 +2144,7 @@ void Con_RunConsole( void )
|
||||
ClearBits( con_fontnum.flags, FCVAR_CHANGED );
|
||||
ClearBits( con_fontscale.flags, FCVAR_CHANGED );
|
||||
ClearBits( cl_charset.flags, FCVAR_CHANGED );
|
||||
ClearBits( con_oldfont.flags, FCVAR_CHANGED );
|
||||
}
|
||||
}
|
||||
|
||||
@@ -2186,6 +2190,9 @@ void Con_VidInit( void )
|
||||
con.historyLoaded = true;
|
||||
}
|
||||
|
||||
if( Sys_CheckParm( "-oldfont" ))
|
||||
Cvar_DirectSet( &con_oldfont, "1" );
|
||||
|
||||
Con_LoadConchars();
|
||||
Con_CheckResize();
|
||||
#if XASH_LOW_MEMORY
|
||||
|
||||
428
engine/client/gamma.c
Normal file
428
engine/client/gamma.c
Normal file
@@ -0,0 +1,428 @@
|
||||
/*
|
||||
gamma.c - gamma routines
|
||||
Copyright (C) 2011 Uncle Mike
|
||||
|
||||
This program is free software: you can redistribute it and/or modify
|
||||
it under the terms of the GNU General Public License as published by
|
||||
the Free Software Foundation, either version 3 of the License, or
|
||||
(at your option) any later version.
|
||||
|
||||
This program is distributed in the hope that it will be useful,
|
||||
but WITHOUT ANY WARRANTY; without even the implied warranty of
|
||||
MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
|
||||
GNU General Public License for more details.
|
||||
*/
|
||||
|
||||
#include "common.h"
|
||||
#include "client.h"
|
||||
#include "xash3d_mathlib.h"
|
||||
#include "enginefeatures.h"
|
||||
|
||||
//-----------------------------------------------------------------------------
|
||||
// Gamma conversion support
|
||||
//-----------------------------------------------------------------------------
|
||||
static byte texgammatable[256];
|
||||
static uint lightgammatable[1024];
|
||||
static uint lineargammatable[1024];
|
||||
static uint screengammatable[1024];
|
||||
static CVAR_DEFINE( v_direct, "direct", "0.9", 0, "direct studio lighting" );
|
||||
static CVAR_DEFINE( v_texgamma, "texgamma", "2.0", 0, "texgamma amount" );
|
||||
static CVAR_DEFINE( v_lightgamma, "lightgamma", "2.5", 0, "lightgamma amount" );
|
||||
static CVAR_DEFINE( v_brightness, "brightness", "0.0", FCVAR_ARCHIVE, "brightness factor" );
|
||||
static CVAR_DEFINE( v_gamma, "gamma", "2.5", FCVAR_ARCHIVE, "gamma amount" );
|
||||
|
||||
static void BuildGammaTable( const float gamma, const float brightness, const float texgamma, const float lightgamma )
|
||||
{
|
||||
float g1, g2, g3;
|
||||
int i;
|
||||
|
||||
if( gamma != 0.0 )
|
||||
g1 = 1.0 / gamma;
|
||||
else g1 = 0.4;
|
||||
|
||||
g2 = g1 * texgamma;
|
||||
|
||||
if( brightness <= 0.0 )
|
||||
g3 = 0.125;
|
||||
else if( brightness <= 1.0 )
|
||||
g3 = 0.125 - brightness * brightness * 0.075;
|
||||
else
|
||||
g3 = 0.05;
|
||||
|
||||
for( i = 0; i < 256; i++ )
|
||||
{
|
||||
double d = pow( i / 255.0, (double)g2 );
|
||||
int inf = d * 255.0;
|
||||
texgammatable[i] = bound( 0, inf, 255 );
|
||||
}
|
||||
|
||||
for( i = 0; i < 1024; i++ )
|
||||
{
|
||||
double d;
|
||||
float f = pow( i / 1023.0, (double)lightgamma );
|
||||
int inf;
|
||||
|
||||
if( brightness > 1.0 )
|
||||
f *= brightness;
|
||||
|
||||
if( f <= g3 )
|
||||
f = ( f / g3 ) * 0.125;
|
||||
else
|
||||
f = (( f - g3 ) / ( 1.0 - g3 )) * 0.875 + 0.125;
|
||||
|
||||
d = pow( (double)f, (double)g1 ); // do not remove the cast, or tests fail
|
||||
inf = d * 1023.0;
|
||||
lightgammatable[i] = bound( 0, inf, 1023 );
|
||||
|
||||
// do these calculations in the same loop...
|
||||
lineargammatable[i] = pow( i / 1023.0, (double)gamma ) * 1023.0;
|
||||
screengammatable[i] = pow( i / 1023.0, 1.0 / gamma ) * 1023.0;
|
||||
}
|
||||
}
|
||||
|
||||
static void V_ValidateGammaCvars( void )
|
||||
{
|
||||
if( Host_IsLocalGame( ))
|
||||
return;
|
||||
|
||||
if( v_gamma.value < 1.8f )
|
||||
Cvar_DirectSet( &v_gamma, "1.8" );
|
||||
else if( v_gamma.value > 3.0f )
|
||||
Cvar_DirectSet( &v_gamma, "3" );
|
||||
|
||||
if( v_texgamma.value < 1.8f )
|
||||
Cvar_DirectSet( &v_texgamma, "1.8" );
|
||||
else if( v_texgamma.value > 3.0f )
|
||||
Cvar_DirectSet( &v_texgamma, "3" );
|
||||
|
||||
if( v_lightgamma.value < 1.8f )
|
||||
Cvar_DirectSet( &v_lightgamma, "1.8" );
|
||||
else if( v_lightgamma.value > 3.0f )
|
||||
Cvar_DirectSet( &v_lightgamma, "3" );
|
||||
|
||||
if( v_brightness.value < 0.0f )
|
||||
Cvar_DirectSet( &v_brightness, "0" );
|
||||
else if( v_brightness.value > 2.0f )
|
||||
Cvar_DirectSet( &v_brightness, "2" );
|
||||
}
|
||||
|
||||
void V_CheckGamma( void )
|
||||
{
|
||||
static qboolean dirty = false;
|
||||
qboolean notify_refdll = false;
|
||||
|
||||
// because these cvars were defined as archive
|
||||
// but wasn't doing anything useful
|
||||
// reset them into default values
|
||||
// this might be removed after a while
|
||||
if( v_direct.value == 1.0f || v_lightgamma.value == 1.0f )
|
||||
{
|
||||
Cvar_DirectSet( &v_direct, "0.9" );
|
||||
Cvar_DirectSet( &v_lightgamma, "2.5" );
|
||||
}
|
||||
|
||||
if( cls.scrshot_action == scrshot_envshot || cls.scrshot_action == scrshot_skyshot )
|
||||
{
|
||||
dirty = true; // force recalculate next normal frame
|
||||
BuildGammaTable( 1.8f, 0.0f, 2.0f, 2.5f );
|
||||
if( ref.initialized )
|
||||
ref.dllFuncs.R_GammaChanged( true );
|
||||
return;
|
||||
}
|
||||
|
||||
if( dirty || FBitSet( v_texgamma.flags|v_lightgamma.flags|v_brightness.flags|v_gamma.flags, FCVAR_CHANGED ))
|
||||
{
|
||||
V_ValidateGammaCvars();
|
||||
|
||||
dirty = false;
|
||||
BuildGammaTable( v_gamma.value, v_brightness.value, v_texgamma.value, v_lightgamma.value );
|
||||
|
||||
// force refdll to recalculate lightmaps
|
||||
notify_refdll = true;
|
||||
|
||||
// unfortunately, recalculating textures isn't possible yet
|
||||
ClearBits( v_texgamma.flags, FCVAR_CHANGED );
|
||||
ClearBits( v_lightgamma.flags, FCVAR_CHANGED );
|
||||
ClearBits( v_brightness.flags, FCVAR_CHANGED );
|
||||
ClearBits( v_gamma.flags, FCVAR_CHANGED );
|
||||
}
|
||||
|
||||
if( notify_refdll && ref.initialized )
|
||||
ref.dllFuncs.R_GammaChanged( false );
|
||||
}
|
||||
|
||||
void V_Init( void )
|
||||
{
|
||||
Cvar_RegisterVariable( &v_texgamma );
|
||||
Cvar_RegisterVariable( &v_lightgamma );
|
||||
Cvar_RegisterVariable( &v_brightness );
|
||||
Cvar_RegisterVariable( &v_gamma );
|
||||
Cvar_RegisterVariable( &v_direct );
|
||||
|
||||
// force gamma init
|
||||
SetBits( v_gamma.flags, FCVAR_CHANGED );
|
||||
V_CheckGamma();
|
||||
}
|
||||
|
||||
byte TextureToGamma( byte b )
|
||||
{
|
||||
if( FBitSet( host.features, ENGINE_LINEAR_GAMMA_SPACE ))
|
||||
return b;
|
||||
|
||||
return texgammatable[b];
|
||||
}
|
||||
|
||||
byte LightToTexGamma( byte b )
|
||||
{
|
||||
if( FBitSet( host.features, ENGINE_LINEAR_GAMMA_SPACE ))
|
||||
return b;
|
||||
|
||||
// 255 << 2 is 1020, impossible to overflow
|
||||
return lightgammatable[b << 2] >> 2;
|
||||
}
|
||||
|
||||
uint LightToTexGammaEx( uint b )
|
||||
{
|
||||
if( FBitSet( host.features, ENGINE_LINEAR_GAMMA_SPACE ))
|
||||
return b;
|
||||
|
||||
if( unlikely( b > ARRAYSIZE( lightgammatable )))
|
||||
return 0;
|
||||
|
||||
return lightgammatable[b];
|
||||
}
|
||||
|
||||
uint ScreenGammaTable( uint b )
|
||||
{
|
||||
if( FBitSet( host.features, ENGINE_LINEAR_GAMMA_SPACE ))
|
||||
return b;
|
||||
|
||||
if( unlikely( b > ARRAYSIZE( screengammatable )))
|
||||
return 0;
|
||||
|
||||
return screengammatable[b];
|
||||
}
|
||||
|
||||
uint LinearGammaTable( uint b )
|
||||
{
|
||||
if( FBitSet( host.features, ENGINE_LINEAR_GAMMA_SPACE ))
|
||||
return b;
|
||||
|
||||
if( unlikely( b > ARRAYSIZE( lineargammatable )))
|
||||
return 0;
|
||||
return lineargammatable[b];
|
||||
}
|
||||
|
||||
#if XASH_ENGINE_TESTS
|
||||
#include "tests.h"
|
||||
|
||||
typedef struct precomputed_gamma_tables_s
|
||||
{
|
||||
float gamma;
|
||||
float brightness;
|
||||
float texgamma;
|
||||
float lightgamma;
|
||||
byte texgammatable[256];
|
||||
int lightgammatable[1024];
|
||||
int lineargammatable[1024];
|
||||
int screengammatable[1024];
|
||||
} precomputed_gamma_tables_t;
|
||||
|
||||
// put at the end of the file, to not confuse Qt Creator's parser
|
||||
precomputed_gamma_tables_t *Test_GetGammaTables( int i );
|
||||
|
||||
static void Test_PrecomputedGammaTables( void )
|
||||
{
|
||||
precomputed_gamma_tables_t *data;
|
||||
int i = 0;
|
||||
|
||||
while(( data = Test_GetGammaTables( i )))
|
||||
{
|
||||
int j;
|
||||
|
||||
BuildGammaTable( data->gamma, data->brightness, data->texgamma, data->lightgamma );
|
||||
|
||||
for( j = 0; j < 1024; j++ )
|
||||
{
|
||||
if( j < 256 )
|
||||
{
|
||||
TASSERT_EQi( texgammatable[j], data->texgammatable[j] );
|
||||
}
|
||||
|
||||
TASSERT_EQi( lightgammatable[j], data->lightgammatable[j] );
|
||||
TASSERT_EQi( lineargammatable[j], data->lineargammatable[j] );
|
||||
TASSERT_EQi( screengammatable[j], data->screengammatable[j] );
|
||||
}
|
||||
i++;
|
||||
}
|
||||
}
|
||||
|
||||
void Test_RunGamma( void )
|
||||
{
|
||||
TRUN( Test_PrecomputedGammaTables() );
|
||||
}
|
||||
|
||||
precomputed_gamma_tables_t *Test_GetGammaTables( int i )
|
||||
{
|
||||
static precomputed_gamma_tables_t precomputed_data[] = {
|
||||
{
|
||||
.gamma = 2.5,
|
||||
.brightness = 0.0,
|
||||
.texgamma = 2.0,
|
||||
.lightgamma = 2.5,
|
||||
.texgammatable = {
|
||||
0, 3, 5, 7, 9, 10, 12, 14, 15, 17, 19, 20, 22, 23, 25, 26, 27, 29, 30, 31, 33, 34, 35, 37, 38, 39, 41, 42, 43, 44, 46, 47, 48, 49, 50, 52, 53, 54, 55, 56, 57, 59, 60, 61, 62, 63, 64, 65, 67, 68, 69, 70, 71, 72, 73, 74, 75, 76, 77, 79, 80, 81, 82, 83, 84,
|
||||
85, 86, 87, 88, 89, 90, 91, 92, 93, 94, 95, 96, 97, 98, 99, 100, 101, 102, 103, 104, 105, 106, 107, 108, 109, 110, 111, 112, 113, 114, 115, 116, 117, 118, 119, 120, 121, 122, 123, 124, 125, 126, 127, 128, 129, 130, 131, 132, 132, 133, 134, 135, 136, 137, 138,
|
||||
139, 140, 141, 142, 143, 144, 145, 145, 146, 147, 148, 149, 150, 151, 152, 153, 154, 155, 156, 156, 157, 158, 159, 160, 161, 162, 163, 164, 165, 165, 166, 167, 168, 169, 170, 171, 172, 172, 173, 174, 175, 176, 177, 178, 179, 180, 180, 181, 182, 183, 184, 185,
|
||||
186, 186, 187, 188, 189, 190, 191, 192, 192, 193, 194, 195, 196, 197, 198, 198, 199, 200, 201, 202, 203, 204, 204, 205, 206, 207, 208, 209, 209, 210, 211, 212, 213, 214, 214, 215, 216, 217, 218, 219, 219, 220, 221, 222, 223, 224, 224, 225, 226, 227, 228, 229,
|
||||
229, 230, 231, 232, 233, 233, 234, 235, 236, 237, 238, 238, 239, 240, 241, 242, 242, 243, 244, 245, 246, 246, 247, 248, 249, 250, 250, 251, 252, 253, 254, 255
|
||||
},
|
||||
.lightgammatable = {
|
||||
0, 0, 1, 2, 3, 4, 5, 6, 7, 8, 9, 10, 11, 12, 13, 14, 15, 16, 17, 18, 19, 20, 21, 22, 23, 24, 25, 26, 27, 28, 29, 30, 31, 32, 33, 34, 35, 36, 37, 38, 39, 40, 41, 42, 43, 44, 45, 46, 47, 48, 49, 50, 51, 52, 53, 54, 55, 56, 57, 58, 59, 60, 61, 62, 63, 64,
|
||||
65, 66, 67, 68, 69, 70, 71, 72, 73, 74, 75, 76, 77, 78, 79, 80, 81, 82, 83, 84, 85, 86, 87, 88, 89, 90, 91, 92, 93, 94, 95, 96, 97, 98, 99, 100, 101, 102, 103, 104, 105, 106, 107, 108, 109, 110, 111, 112, 113, 114, 115, 116, 117, 118, 119, 120, 121, 122, 123,
|
||||
124, 125, 126, 127, 128, 129, 130, 131, 132, 133, 134, 135, 136, 137, 138, 139, 140, 141, 142, 143, 144, 145, 146, 147, 148, 149, 150, 151, 152, 153, 154, 155, 156, 157, 158, 159, 160, 161, 162, 163, 164, 165, 166, 167, 168, 169, 170, 171, 172, 173, 174, 175,
|
||||
176, 177, 178, 179, 180, 181, 182, 183, 184, 185, 186, 187, 188, 189, 190, 191, 192, 193, 194, 195, 196, 197, 198, 199, 200, 201, 202, 203, 204, 205, 206, 207, 208, 209, 210, 211, 212, 213, 214, 215, 216, 217, 218, 219, 220, 221, 222, 223, 224, 225, 226, 227,
|
||||
228, 229, 230, 231, 232, 233, 234, 235, 236, 237, 238, 239, 240, 241, 242, 243, 244, 245, 246, 247, 248, 249, 250, 251, 252, 253, 254, 255, 256, 257, 258, 259, 260, 261, 262, 263, 264, 265, 266, 267, 268, 269, 270, 271, 272, 273, 274, 275, 276, 277, 278, 279,
|
||||
280, 281, 282, 283, 284, 285, 286, 287, 288, 289, 290, 291, 292, 293, 294, 295, 296, 297, 298, 299, 300, 301, 302, 303, 304, 305, 306, 307, 308, 309, 310, 311, 312, 313, 314, 315, 316, 317, 318, 319, 320, 321, 322, 323, 324, 325, 326, 327, 328, 329, 330, 331,
|
||||
332, 333, 334, 335, 336, 337, 338, 339, 340, 341, 343, 343, 344, 345, 346, 347, 348, 349, 350, 351, 353, 353, 354, 355, 356, 357, 358, 359, 360, 361, 362, 363, 364, 365, 366, 367, 368, 369, 370, 371, 372, 373, 374, 376, 376, 377, 379, 379, 380, 381, 382, 383,
|
||||
384, 385, 386, 387, 388, 389, 390, 391, 392, 393, 394, 395, 396, 397, 398, 399, 400, 401, 402, 403, 404, 405, 406, 407, 408, 409, 410, 411, 412, 413, 414, 415, 416, 417, 418, 419, 420, 421, 422, 423, 424, 425, 426, 427, 428, 429, 430, 431, 432, 433, 434, 435,
|
||||
436, 437, 438, 439, 440, 441, 442, 443, 444, 446, 446, 447, 449, 449, 450, 451, 452, 453, 455, 455, 456, 457, 458, 459, 460, 461, 462, 463, 464, 465, 466, 468, 469, 470, 470, 472, 472, 473, 474, 475, 476, 477, 478, 479, 480, 481, 482, 483, 484, 485, 486, 487,
|
||||
488, 489, 490, 491, 493, 493, 494, 495, 496, 498, 498, 499, 500, 502, 502, 503, 504, 505, 507, 508, 508, 509, 510, 511, 512, 513, 514, 515, 516, 517, 518, 520, 521, 521, 522, 523, 524, 525, 526, 527, 528, 530, 530, 531, 532, 533, 534, 536, 536, 537, 538, 539,
|
||||
540, 541, 542, 543, 544, 545, 546, 547, 548, 549, 550, 552, 552, 553, 554, 555, 556, 557, 558, 559, 560, 561, 562, 564, 564, 565, 566, 567, 568, 570, 571, 571, 572, 573, 574, 576, 576, 577, 578, 579, 580, 581, 583, 583, 584, 585, 586, 587, 588, 590, 591, 591,
|
||||
593, 593, 594, 596, 596, 597, 598, 600, 600, 601, 602, 603, 604, 605, 606, 607, 608, 609, 611, 611, 612, 613, 615, 615, 616, 618, 618, 620, 621, 621, 622, 624, 625, 626, 627, 627, 628, 629, 630, 632, 633, 633, 634, 635, 636, 638, 638, 639, 641, 642, 643, 643,
|
||||
644, 645, 646, 648, 648, 650, 651, 651, 652, 654, 655, 656, 656, 658, 658, 660, 660, 662, 662, 664, 664, 665, 666, 668, 668, 669, 670, 671, 672, 673, 674, 675, 676, 677, 678, 679, 680, 682, 682, 683, 684, 685, 686, 687, 688, 690, 690, 691, 692, 693, 695, 696,
|
||||
696, 697, 698, 699, 700, 701, 702, 703, 705, 706, 706, 707, 708, 709, 710, 711, 712, 713, 715, 716, 716, 717, 718, 719, 721, 721, 722, 724, 724, 725, 727, 727, 728, 729, 730, 731, 733, 733, 734, 735, 736, 737, 738, 740, 740, 741, 743, 744, 744, 745, 747, 747,
|
||||
748, 749, 750, 752, 753, 753, 755, 755, 757, 757, 758, 759, 760, 761, 762, 764, 764, 766, 766, 767, 769, 770, 770, 771, 772, 773, 774, 775, 776, 777, 778, 779, 780, 782, 783, 784, 784, 785, 786, 788, 789, 790, 791, 792, 792, 794, 794, 796, 796, 797, 799, 800,
|
||||
801, 801, 802, 803, 804, 805, 806, 807, 809, 810, 810, 811, 813, 813, 815, 815, 816, 817, 819, 819, 820, 822, 823, 823, 824, 825, 826, 827, 829, 829, 830, 832, 832, 833, 835, 835, 837, 837, 839, 840, 840, 841, 842, 843, 844, 845, 847, 847, 849, 849, 850, 851,
|
||||
852, 854, 854, 856, 856, 857, 859, 859, 860, 861, 862, 864, 864, 865, 867, 867, 868, 870, 870, 872, 872, 874, 875, 875, 876, 877, 879, 880, 881, 881, 882, 883, 885, 885, 886, 887, 888, 890, 891, 891, 893, 893, 894, 895, 897, 898, 899, 900, 901, 902, 902, 903,
|
||||
904, 905, 907, 907, 908, 910, 910, 911, 912, 914, 914, 915, 917, 918, 919, 920, 921, 922, 922, 923, 925, 925, 926, 927, 928, 930, 931, 932, 932, 933, 935, 936, 936, 937, 939, 940, 940, 942, 942, 944, 944, 946, 947, 948, 949, 949, 950, 952, 952, 953, 955, 956,
|
||||
957, 958, 959, 959, 960, 962, 962, 964, 965, 965, 967, 967, 969, 970, 971, 972, 973, 973, 975, 975, 976, 977, 978, 979, 980, 982, 982, 984, 984, 986, 986, 988, 988, 990, 991, 992, 993, 993, 994, 995, 996, 998, 999, 999, 1000, 1002, 1002, 1004, 1005, 1005,
|
||||
1006, 1007, 1008, 1010, 1011, 1011, 1013, 1014, 1015, 1016, 1017, 1018, 1018, 1019, 1020, 1021, 1023
|
||||
},
|
||||
.lineargammatable = {
|
||||
0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1,
|
||||
2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 5, 5, 5, 5, 5, 5, 5, 5, 5, 6, 6, 6, 6, 6, 6, 6, 6, 6, 7, 7, 7, 7, 7, 7, 7, 8, 8, 8, 8, 8, 8, 8, 8, 9, 9, 9, 9, 9, 9, 10, 10, 10, 10, 10, 10, 11, 11,
|
||||
11, 11, 11, 11, 12, 12, 12, 12, 12, 12, 13, 13, 13, 13, 13, 14, 14, 14, 14, 14, 15, 15, 15, 15, 15, 16, 16, 16, 16, 16, 17, 17, 17, 17, 17, 18, 18, 18, 18, 19, 19, 19, 19, 19, 20, 20, 20, 20, 21, 21, 21, 21, 22, 22, 22, 22, 23, 23, 23, 23, 24, 24, 24, 25, 25,
|
||||
25, 25, 26, 26, 26, 26, 27, 27, 27, 28, 28, 28, 29, 29, 29, 29, 30, 30, 30, 31, 31, 31, 32, 32, 32, 32, 33, 33, 33, 34, 34, 34, 35, 35, 35, 36, 36, 36, 37, 37, 37, 38, 38, 39, 39, 39, 40, 40, 40, 41, 41, 41, 42, 42, 43, 43, 43, 44, 44, 44, 45, 45, 46, 46, 46,
|
||||
47, 47, 48, 48, 48, 49, 49, 50, 50, 50, 51, 51, 52, 52, 52, 53, 53, 54, 54, 55, 55, 55, 56, 56, 57, 57, 58, 58, 59, 59, 60, 60, 60, 61, 61, 62, 62, 63, 63, 64, 64, 65, 65, 66, 66, 67, 67, 68, 68, 69, 69, 70, 70, 71, 71, 72, 72, 73, 73, 74, 74, 75, 75, 76, 76,
|
||||
77, 77, 78, 78, 79, 79, 80, 81, 81, 82, 82, 83, 83, 84, 84, 85, 86, 86, 87, 87, 88, 88, 89, 90, 90, 91, 91, 92, 92, 93, 94, 94, 95, 95, 96, 97, 97, 98, 99, 99, 100, 100, 101, 102, 102, 103, 104, 104, 105, 105, 106, 107, 107, 108, 109, 109, 110, 111, 111, 112,
|
||||
113, 113, 114, 115, 115, 116, 117, 117, 118, 119, 119, 120, 121, 122, 122, 123, 124, 124, 125, 126, 126, 127, 128, 129, 129, 130, 131, 132, 132, 133, 134, 134, 135, 136, 137, 137, 138, 139, 140, 140, 141, 142, 143, 144, 144, 145, 146, 147, 147, 148, 149, 150,
|
||||
151, 151, 152, 153, 154, 155, 155, 156, 157, 158, 159, 159, 160, 161, 162, 163, 164, 164, 165, 166, 167, 168, 169, 169, 170, 171, 172, 173, 174, 175, 176, 176, 177, 178, 179, 180, 181, 182, 183, 183, 184, 185, 186, 187, 188, 189, 190, 191, 192, 193, 193, 194,
|
||||
195, 196, 197, 198, 199, 200, 201, 202, 203, 204, 205, 206, 207, 208, 209, 209, 210, 211, 212, 213, 214, 215, 216, 217, 218, 219, 220, 221, 222, 223, 224, 225, 226, 227, 228, 229, 230, 231, 232, 233, 234, 236, 237, 238, 239, 240, 241, 242, 243, 244, 245, 246,
|
||||
247, 248, 249, 250, 251, 252, 254, 255, 256, 257, 258, 259, 260, 261, 262, 263, 265, 266, 267, 268, 269, 270, 271, 272, 274, 275, 276, 277, 278, 279, 280, 282, 283, 284, 285, 286, 287, 289, 290, 291, 292, 293, 294, 296, 297, 298, 299, 300, 302, 303, 304, 305,
|
||||
306, 308, 309, 310, 311, 312, 314, 315, 316, 317, 319, 320, 321, 322, 324, 325, 326, 327, 329, 330, 331, 333, 334, 335, 336, 338, 339, 340, 342, 343, 344, 345, 347, 348, 349, 351, 352, 353, 355, 356, 357, 359, 360, 361, 363, 364, 365, 367, 368, 369, 371, 372,
|
||||
373, 375, 376, 378, 379, 380, 382, 383, 384, 386, 387, 389, 390, 391, 393, 394, 396, 397, 399, 400, 401, 403, 404, 406, 407, 409, 410, 411, 413, 414, 416, 417, 419, 420, 422, 423, 425, 426, 428, 429, 431, 432, 434, 435, 437, 438, 440, 441, 443, 444, 446, 447,
|
||||
449, 450, 452, 453, 455, 456, 458, 459, 461, 462, 464, 466, 467, 469, 470, 472, 473, 475, 477, 478, 480, 481, 483, 485, 486, 488, 489, 491, 493, 494, 496, 497, 499, 501, 502, 504, 506, 507, 509, 511, 512, 514, 515, 517, 519, 520, 522, 524, 525, 527, 529, 531,
|
||||
532, 534, 536, 537, 539, 541, 542, 544, 546, 548, 549, 551, 553, 554, 556, 558, 560, 561, 563, 565, 567, 568, 570, 572, 574, 575, 577, 579, 581, 583, 584, 586, 588, 590, 592, 593, 595, 597, 599, 601, 602, 604, 606, 608, 610, 612, 613, 615, 617, 619, 621, 623,
|
||||
625, 626, 628, 630, 632, 634, 636, 638, 639, 641, 643, 645, 647, 649, 651, 653, 655, 657, 659, 660, 662, 664, 666, 668, 670, 672, 674, 676, 678, 680, 682, 684, 686, 688, 690, 692, 694, 696, 698, 700, 702, 704, 706, 708, 710, 712, 714, 716, 718, 720, 722, 724,
|
||||
726, 728, 730, 732, 734, 736, 738, 740, 742, 744, 746, 748, 750, 753, 755, 757, 759, 761, 763, 765, 767, 769, 771, 773, 776, 778, 780, 782, 784, 786, 788, 791, 793, 795, 797, 799, 801, 803, 806, 808, 810, 812, 814, 816, 819, 821, 823, 825, 827, 830, 832, 834,
|
||||
836, 839, 841, 843, 845, 847, 850, 852, 854, 856, 859, 861, 863, 865, 868, 870, 872, 874, 877, 879, 881, 884, 886, 888, 890, 893, 895, 897, 900, 902, 904, 907, 909, 911, 914, 916, 918, 921, 923, 925, 928, 930, 932, 935, 937, 940, 942, 944, 947, 949, 952, 954,
|
||||
956, 959, 961, 964, 966, 968, 971, 973, 976, 978, 981, 983, 985, 988, 990, 993, 995, 998, 1000, 1003, 1005, 1008, 1010, 1013, 1015, 1018, 1020, 1023
|
||||
},
|
||||
.screengammatable = {
|
||||
0, 63, 84, 99, 111, 121, 130, 139, 146, 154, 160, 166, 172, 178, 183, 188, 193, 198, 203, 207, 212, 216, 220, 224, 228, 231, 235, 239, 242, 245, 249, 252, 255, 259, 262, 265, 268, 271, 274, 276, 279, 282, 285, 287, 290, 293, 295, 298, 300, 303, 305, 308,
|
||||
310, 313, 315, 317, 320, 322, 324, 326, 328, 331, 333, 335, 337, 339, 341, 343, 345, 347, 349, 351, 353, 355, 357, 359, 361, 363, 365, 367, 369, 370, 372, 374, 376, 378, 379, 381, 383, 385, 386, 388, 390, 392, 393, 395, 397, 398, 400, 401, 403, 405, 406, 408,
|
||||
409, 411, 413, 414, 416, 417, 419, 420, 422, 423, 425, 426, 428, 429, 431, 432, 434, 435, 436, 438, 439, 441, 442, 444, 445, 446, 448, 449, 450, 452, 453, 455, 456, 457, 459, 460, 461, 463, 464, 465, 466, 468, 469, 470, 472, 473, 474, 475, 477, 478, 479, 480,
|
||||
482, 483, 484, 485, 487, 488, 489, 490, 491, 493, 494, 495, 496, 497, 499, 500, 501, 502, 503, 504, 505, 507, 508, 509, 510, 511, 512, 513, 515, 516, 517, 518, 519, 520, 521, 522, 523, 524, 526, 527, 528, 529, 530, 531, 532, 533, 534, 535, 536, 537, 538, 539,
|
||||
540, 541, 543, 544, 545, 546, 547, 548, 549, 550, 551, 552, 553, 554, 555, 556, 557, 558, 559, 560, 561, 562, 563, 564, 565, 566, 567, 568, 568, 569, 570, 571, 572, 573, 574, 575, 576, 577, 578, 579, 580, 581, 582, 583, 584, 585, 585, 586, 587, 588, 589, 590,
|
||||
591, 592, 593, 594, 595, 595, 596, 597, 598, 599, 600, 601, 602, 603, 603, 604, 605, 606, 607, 608, 609, 610, 610, 611, 612, 613, 614, 615, 616, 616, 617, 618, 619, 620, 621, 622, 622, 623, 624, 625, 626, 627, 627, 628, 629, 630, 631, 632, 632, 633, 634, 635,
|
||||
636, 637, 637, 638, 639, 640, 641, 641, 642, 643, 644, 645, 645, 646, 647, 648, 649, 649, 650, 651, 652, 652, 653, 654, 655, 656, 656, 657, 658, 659, 659, 660, 661, 662, 663, 663, 664, 665, 666, 666, 667, 668, 669, 669, 670, 671, 672, 672, 673, 674, 675, 675,
|
||||
676, 677, 678, 678, 679, 680, 681, 681, 682, 683, 684, 684, 685, 686, 686, 687, 688, 689, 689, 690, 691, 692, 692, 693, 694, 694, 695, 696, 697, 697, 698, 699, 699, 700, 701, 701, 702, 703, 704, 704, 705, 706, 706, 707, 708, 708, 709, 710, 711, 711, 712, 713,
|
||||
713, 714, 715, 715, 716, 717, 717, 718, 719, 719, 720, 721, 721, 722, 723, 723, 724, 725, 725, 726, 727, 727, 728, 729, 729, 730, 731, 731, 732, 733, 733, 734, 735, 735, 736, 737, 737, 738, 739, 739, 740, 741, 741, 742, 743, 743, 744, 745, 745, 746, 746, 747,
|
||||
748, 748, 749, 750, 750, 751, 752, 752, 753, 753, 754, 755, 755, 756, 757, 757, 758, 758, 759, 760, 760, 761, 762, 762, 763, 763, 764, 765, 765, 766, 767, 767, 768, 768, 769, 770, 770, 771, 771, 772, 773, 773, 774, 774, 775, 776, 776, 777, 778, 778, 779, 779,
|
||||
780, 781, 781, 782, 782, 783, 784, 784, 785, 785, 786, 786, 787, 788, 788, 789, 789, 790, 791, 791, 792, 792, 793, 794, 794, 795, 795, 796, 796, 797, 798, 798, 799, 799, 800, 801, 801, 802, 802, 803, 803, 804, 805, 805, 806, 806, 807, 807, 808, 809, 809, 810,
|
||||
810, 811, 811, 812, 813, 813, 814, 814, 815, 815, 816, 816, 817, 818, 818, 819, 819, 820, 820, 821, 821, 822, 823, 823, 824, 824, 825, 825, 826, 826, 827, 828, 828, 829, 829, 830, 830, 831, 831, 832, 832, 833, 834, 834, 835, 835, 836, 836, 837, 837, 838, 838,
|
||||
839, 839, 840, 841, 841, 842, 842, 843, 843, 844, 844, 845, 845, 846, 846, 847, 848, 848, 849, 849, 850, 850, 851, 851, 852, 852, 853, 853, 854, 854, 855, 855, 856, 856, 857, 857, 858, 859, 859, 860, 860, 861, 861, 862, 862, 863, 863, 864, 864, 865, 865, 866,
|
||||
866, 867, 867, 868, 868, 869, 869, 870, 870, 871, 871, 872, 872, 873, 873, 874, 874, 875, 875, 876, 876, 877, 877, 878, 878, 879, 879, 880, 880, 881, 881, 882, 882, 883, 883, 884, 884, 885, 885, 886, 886, 887, 887, 888, 888, 889, 889, 890, 890, 891, 891, 892,
|
||||
892, 893, 893, 894, 894, 895, 895, 896, 896, 897, 897, 898, 898, 899, 899, 900, 900, 901, 901, 902, 902, 903, 903, 904, 904, 904, 905, 905, 906, 906, 907, 907, 908, 908, 909, 909, 910, 910, 911, 911, 912, 912, 913, 913, 914, 914, 915, 915, 915, 916, 916, 917,
|
||||
917, 918, 918, 919, 919, 920, 920, 921, 921, 922, 922, 922, 923, 923, 924, 924, 925, 925, 926, 926, 927, 927, 928, 928, 929, 929, 929, 930, 930, 931, 931, 932, 932, 933, 933, 934, 934, 935, 935, 935, 936, 936, 937, 937, 938, 938, 939, 939, 940, 940, 940, 941,
|
||||
941, 942, 942, 943, 943, 944, 944, 944, 945, 945, 946, 946, 947, 947, 948, 948, 949, 949, 949, 950, 950, 951, 951, 952, 952, 953, 953, 953, 954, 954, 955, 955, 956, 956, 957, 957, 957, 958, 958, 959, 959, 960, 960, 961, 961, 961, 962, 962, 963, 963, 964, 964,
|
||||
964, 965, 965, 966, 966, 967, 967, 968, 968, 968, 969, 969, 970, 970, 971, 971, 971, 972, 972, 973, 973, 974, 974, 974, 975, 975, 976, 976, 977, 977, 977, 978, 978, 979, 979, 980, 980, 980, 981, 981, 982, 982, 983, 983, 983, 984, 984, 985, 985, 986, 986, 986,
|
||||
987, 987, 988, 988, 988, 989, 989, 990, 990, 991, 991, 991, 992, 992, 993, 993, 993, 994, 994, 995, 995, 996, 996, 996, 997, 997, 998, 998, 998, 999, 999, 1000, 1000, 1001, 1001, 1001, 1002, 1002, 1003, 1003, 1003, 1004, 1004, 1005, 1005, 1005, 1006, 1006,
|
||||
1007, 1007, 1008, 1008, 1008, 1009, 1009, 1010, 1010, 1010, 1011, 1011, 1012, 1012, 1012, 1013, 1013, 1014, 1014, 1014, 1015, 1015, 1016, 1016, 1016, 1017, 1017, 1018, 1018, 1018, 1019, 1019, 1020, 1020, 1020, 1021, 1021, 1022, 1022, 1023
|
||||
},
|
||||
}, {
|
||||
.gamma = 2.2,
|
||||
.brightness = 1.0,
|
||||
.texgamma = 2.2,
|
||||
.lightgamma = 2.4,
|
||||
.texgammatable = {
|
||||
0, 1, 2, 3, 4, 5, 6, 7, 8, 9, 10, 11, 12, 13, 14, 15, 16, 17, 18, 19, 20, 21, 22, 23, 24, 25, 26, 27, 28, 29, 30, 31, 32, 33, 34, 35, 36, 37, 38, 39, 40, 41, 42, 43, 44, 45, 46, 47, 48, 49, 50, 51, 52, 53, 54, 55, 56, 57, 58, 59, 60, 61, 62, 63, 64, 65,
|
||||
66, 67, 68, 69, 70, 71, 72, 73, 74, 75, 76, 77, 78, 79, 80, 81, 82, 83, 84, 85, 86, 87, 88, 89, 90, 91, 92, 93, 94, 95, 96, 97, 98, 99, 100, 101, 102, 103, 104, 105, 106, 107, 108, 109, 110, 111, 112, 113, 114, 115, 116, 117, 118, 119, 120, 121, 122, 123,
|
||||
124, 125, 126, 127, 128, 129, 130, 131, 132, 133, 134, 135, 136, 137, 138, 139, 140, 141, 142, 143, 144, 145, 146, 147, 148, 149, 150, 151, 152, 153, 154, 155, 156, 157, 158, 159, 160, 161, 162, 163, 164, 165, 166, 167, 168, 169, 170, 171, 172, 173, 174, 175,
|
||||
176, 177, 178, 179, 180, 181, 182, 183, 184, 185, 186, 187, 188, 189, 190, 191, 192, 193, 194, 195, 196, 197, 198, 199, 200, 201, 202, 203, 204, 205, 206, 207, 208, 209, 210, 211, 212, 213, 214, 215, 216, 217, 218, 219, 220, 221, 222, 223, 224, 225, 226, 227,
|
||||
228, 229, 230, 231, 232, 233, 234, 235, 236, 237, 238, 239, 240, 241, 242, 243, 244, 245, 246, 247, 248, 249, 250, 251, 252, 253, 254, 255
|
||||
},
|
||||
.lightgammatable = {
|
||||
0, 0, 1, 2, 3, 4, 5, 6, 7, 8, 9, 11, 12, 13, 14, 15, 16, 17, 18, 20, 21, 22, 23, 24, 25, 27, 28, 29, 30, 31, 33, 34, 35, 36, 37, 39, 40, 41, 42, 43, 45, 46, 47, 48, 50, 51, 52, 53, 55, 56, 57, 58, 60, 61, 62, 63, 65, 66, 67, 69, 70, 71, 72, 74, 75, 76,
|
||||
78, 79, 80, 81, 83, 84, 85, 87, 88, 89, 91, 92, 93, 94, 96, 97, 98, 100, 101, 102, 104, 105, 106, 108, 109, 110, 112, 113, 114, 116, 117, 118, 120, 121, 122, 124, 125, 126, 128, 129, 130, 132, 133, 134, 136, 137, 138, 140, 141, 142, 144, 145, 147, 148, 149,
|
||||
151, 152, 153, 155, 156, 157, 159, 160, 162, 163, 164, 166, 167, 168, 170, 171, 173, 174, 175, 177, 178, 179, 181, 182, 184, 185, 186, 188, 189, 191, 192, 193, 195, 196, 198, 199, 200, 202, 203, 204, 206, 207, 209, 210, 211, 213, 214, 216, 217, 219, 220, 221,
|
||||
223, 224, 226, 227, 228, 230, 231, 233, 234, 235, 237, 238, 240, 241, 243, 244, 245, 247, 248, 250, 251, 252, 254, 255, 257, 258, 260, 261, 262, 264, 265, 267, 268, 270, 271, 272, 274, 275, 277, 278, 280, 281, 282, 284, 285, 287, 288, 290, 291, 293, 294, 295,
|
||||
297, 298, 300, 301, 303, 304, 306, 307, 308, 310, 311, 313, 314, 316, 317, 319, 320, 321, 323, 324, 326, 327, 329, 330, 332, 333, 335, 336, 337, 339, 340, 342, 343, 345, 346, 348, 349, 351, 352, 354, 355, 356, 358, 359, 361, 362, 364, 365, 367, 368, 370, 371,
|
||||
373, 374, 376, 377, 378, 380, 381, 383, 384, 386, 387, 389, 390, 392, 393, 395, 396, 397, 398, 398, 399, 399, 400, 401, 401, 402, 402, 403, 403, 404, 404, 405, 406, 406, 407, 407, 408, 408, 409, 410, 410, 411, 411, 412, 413, 413, 414, 414, 415, 416, 416, 417,
|
||||
417, 418, 419, 419, 420, 420, 421, 422, 422, 423, 423, 424, 425, 425, 426, 427, 427, 428, 428, 429, 430, 430, 431, 432, 432, 433, 433, 434, 435, 435, 436, 437, 437, 438, 439, 439, 440, 441, 441, 442, 443, 443, 444, 445, 445, 446, 447, 447, 448, 449, 449, 450,
|
||||
451, 451, 452, 453, 453, 454, 455, 455, 456, 457, 457, 458, 459, 459, 460, 461, 461, 462, 463, 464, 464, 465, 466, 466, 467, 468, 468, 469, 470, 471, 471, 472, 473, 473, 474, 475, 476, 476, 477, 478, 478, 479, 480, 481, 481, 482, 483, 483, 484, 485, 486, 486,
|
||||
487, 488, 489, 489, 490, 491, 492, 492, 493, 494, 495, 495, 496, 497, 498, 498, 499, 500, 501, 501, 502, 503, 504, 504, 505, 506, 507, 507, 508, 509, 510, 510, 511, 512, 513, 513, 514, 515, 516, 517, 517, 518, 519, 520, 520, 521, 522, 523, 524, 524, 525, 526,
|
||||
527, 527, 528, 529, 530, 531, 531, 532, 533, 534, 535, 535, 536, 537, 538, 538, 539, 540, 541, 542, 542, 543, 544, 545, 546, 546, 547, 548, 549, 550, 550, 551, 552, 553, 554, 555, 555, 556, 557, 558, 559, 559, 560, 561, 562, 563, 564, 564, 565, 566, 567, 568,
|
||||
568, 569, 570, 571, 572, 573, 573, 574, 575, 576, 577, 578, 578, 579, 580, 581, 582, 583, 583, 584, 585, 586, 587, 588, 588, 589, 590, 591, 592, 593, 593, 594, 595, 596, 597, 598, 599, 599, 600, 601, 602, 603, 604, 605, 605, 606, 607, 608, 609, 610, 611, 611,
|
||||
612, 613, 614, 615, 616, 617, 617, 618, 619, 620, 621, 622, 623, 623, 624, 625, 626, 627, 628, 629, 629, 630, 631, 632, 633, 634, 635, 636, 636, 637, 638, 639, 640, 641, 642, 643, 643, 644, 645, 646, 647, 648, 649, 650, 651, 651, 652, 653, 654, 655, 656, 657,
|
||||
658, 658, 659, 660, 661, 662, 663, 664, 665, 666, 666, 667, 668, 669, 670, 671, 672, 673, 674, 675, 675, 676, 677, 678, 679, 680, 681, 682, 683, 684, 684, 685, 686, 687, 688, 689, 690, 691, 692, 693, 693, 694, 695, 696, 697, 698, 699, 700, 701, 702, 703, 703,
|
||||
704, 705, 706, 707, 708, 709, 710, 711, 712, 713, 713, 714, 715, 716, 717, 718, 719, 720, 721, 722, 723, 724, 724, 725, 726, 727, 728, 729, 730, 731, 732, 733, 734, 735, 736, 736, 737, 738, 739, 740, 741, 742, 743, 744, 745, 746, 747, 748, 749, 749, 750, 751,
|
||||
752, 753, 754, 755, 756, 757, 758, 759, 760, 761, 762, 763, 763, 764, 765, 766, 767, 768, 769, 770, 771, 772, 773, 774, 775, 776, 777, 778, 778, 779, 780, 781, 782, 783, 784, 785, 786, 787, 788, 789, 790, 791, 792, 793, 794, 795, 795, 796, 797, 798, 799, 800,
|
||||
801, 802, 803, 804, 805, 806, 807, 808, 809, 810, 811, 812, 813, 814, 814, 815, 816, 817, 818, 819, 820, 821, 822, 823, 824, 825, 826, 827, 828, 829, 830, 831, 832, 833, 834, 835, 836, 836, 837, 838, 839, 840, 841, 842, 843, 844, 845, 846, 847, 848, 849, 850,
|
||||
851, 852, 853, 854, 855, 856, 857, 858, 859, 860, 861, 862, 863, 863, 864, 865, 866, 867, 868, 869, 870, 871, 872, 873, 874, 875, 876, 877, 878, 879, 880, 881, 882, 883, 884, 885, 886, 887, 888, 889, 890, 891, 892, 893, 894, 895, 896, 897, 898, 899, 900, 900,
|
||||
901, 902, 903, 904, 905, 906, 907, 908, 909, 910, 911, 912, 913, 914, 915, 916, 917, 918, 919, 920, 921, 922, 923, 924, 925, 926, 927, 928, 929, 930, 931, 932, 933, 934, 935, 936, 937, 938, 939, 940, 941, 942, 943, 944, 945, 946, 947, 948, 949, 950, 951, 952,
|
||||
953, 954, 955, 956, 957, 958, 959, 960, 961, 962, 963, 964, 965, 966, 967, 968, 969, 970, 971, 972, 973, 974, 974, 975, 976, 977, 978, 979, 980, 981, 982, 983, 984, 985, 986, 987, 988, 989, 990, 991, 992, 993, 994, 995, 996, 997, 998, 999, 1000, 1001, 1002,
|
||||
1003, 1004, 1005, 1006, 1007, 1008, 1009, 1010, 1011, 1012, 1013, 1014, 1015, 1016, 1017, 1018, 1019, 1020, 1021, 1023
|
||||
},
|
||||
.lineargammatable = {
|
||||
0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 4, 4,
|
||||
4, 4, 4, 4, 4, 4, 4, 5, 5, 5, 5, 5, 5, 5, 6, 6, 6, 6, 6, 6, 6, 6, 7, 7, 7, 7, 7, 7, 8, 8, 8, 8, 8, 8, 9, 9, 9, 9, 9, 9, 10, 10, 10, 10, 10, 10, 11, 11, 11, 11, 11, 12, 12, 12, 12, 12, 13, 13, 13, 13, 13, 14, 14, 14, 14, 14, 15, 15, 15, 15, 16, 16, 16, 16, 17,
|
||||
17, 17, 17, 17, 18, 18, 18, 18, 19, 19, 19, 19, 20, 20, 20, 21, 21, 21, 21, 22, 22, 22, 22, 23, 23, 23, 24, 24, 24, 24, 25, 25, 25, 26, 26, 26, 26, 27, 27, 27, 28, 28, 28, 29, 29, 29, 30, 30, 30, 31, 31, 31, 32, 32, 32, 33, 33, 33, 34, 34, 34, 35, 35, 35, 36,
|
||||
36, 36, 37, 37, 38, 38, 38, 39, 39, 39, 40, 40, 40, 41, 41, 42, 42, 42, 43, 43, 44, 44, 44, 45, 45, 46, 46, 46, 47, 47, 48, 48, 48, 49, 49, 50, 50, 51, 51, 51, 52, 52, 53, 53, 54, 54, 55, 55, 55, 56, 56, 57, 57, 58, 58, 59, 59, 60, 60, 61, 61, 61, 62, 62, 63,
|
||||
63, 64, 64, 65, 65, 66, 66, 67, 67, 68, 68, 69, 69, 70, 70, 71, 71, 72, 72, 73, 73, 74, 75, 75, 76, 76, 77, 77, 78, 78, 79, 79, 80, 80, 81, 82, 82, 83, 83, 84, 84, 85, 86, 86, 87, 87, 88, 88, 89, 90, 90, 91, 91, 92, 93, 93, 94, 94, 95, 96, 96, 97, 97, 98, 99,
|
||||
99, 100, 100, 101, 102, 102, 103, 104, 104, 105, 105, 106, 107, 107, 108, 109, 109, 110, 111, 111, 112, 113, 113, 114, 115, 115, 116, 117, 117, 118, 119, 119, 120, 121, 121, 122, 123, 123, 124, 125, 126, 126, 127, 128, 128, 129, 130, 131, 131, 132, 133, 133,
|
||||
134, 135, 136, 136, 137, 138, 139, 139, 140, 141, 142, 142, 143, 144, 145, 145, 146, 147, 148, 148, 149, 150, 151, 151, 152, 153, 154, 155, 155, 156, 157, 158, 159, 159, 160, 161, 162, 163, 163, 164, 165, 166, 167, 167, 168, 169, 170, 171, 172, 172, 173, 174,
|
||||
175, 176, 177, 177, 178, 179, 180, 181, 182, 183, 183, 184, 185, 186, 187, 188, 189, 190, 190, 191, 192, 193, 194, 195, 196, 197, 198, 198, 199, 200, 201, 202, 203, 204, 205, 206, 207, 208, 208, 209, 210, 211, 212, 213, 214, 215, 216, 217, 218, 219, 220, 221,
|
||||
222, 223, 224, 225, 226, 226, 227, 228, 229, 230, 231, 232, 233, 234, 235, 236, 237, 238, 239, 240, 241, 242, 243, 244, 245, 246, 247, 248, 249, 250, 251, 252, 253, 254, 255, 257, 258, 259, 260, 261, 262, 263, 264, 265, 266, 267, 268, 269, 270, 271, 272, 273,
|
||||
274, 276, 277, 278, 279, 280, 281, 282, 283, 284, 285, 286, 288, 289, 290, 291, 292, 293, 294, 295, 296, 298, 299, 300, 301, 302, 303, 304, 305, 307, 308, 309, 310, 311, 312, 313, 315, 316, 317, 318, 319, 320, 322, 323, 324, 325, 326, 328, 329, 330, 331, 332,
|
||||
333, 335, 336, 337, 338, 339, 341, 342, 343, 344, 346, 347, 348, 349, 350, 352, 353, 354, 355, 357, 358, 359, 360, 362, 363, 364, 365, 367, 368, 369, 370, 372, 373, 374, 375, 377, 378, 379, 381, 382, 383, 384, 386, 387, 388, 390, 391, 392, 393, 395, 396, 397,
|
||||
399, 400, 401, 403, 404, 405, 407, 408, 409, 411, 412, 413, 415, 416, 417, 419, 420, 421, 423, 424, 426, 427, 428, 430, 431, 432, 434, 435, 437, 438, 439, 441, 442, 443, 445, 446, 448, 449, 450, 452, 453, 455, 456, 458, 459, 460, 462, 463, 465, 466, 468, 469,
|
||||
470, 472, 473, 475, 476, 478, 479, 481, 482, 483, 485, 486, 488, 489, 491, 492, 494, 495, 497, 498, 500, 501, 503, 504, 506, 507, 509, 510, 512, 513, 515, 516, 518, 519, 521, 522, 524, 525, 527, 528, 530, 532, 533, 535, 536, 538, 539, 541, 542, 544, 545, 547,
|
||||
549, 550, 552, 553, 555, 556, 558, 560, 561, 563, 564, 566, 568, 569, 571, 572, 574, 576, 577, 579, 580, 582, 584, 585, 587, 589, 590, 592, 593, 595, 597, 598, 600, 602, 603, 605, 607, 608, 610, 612, 613, 615, 617, 618, 620, 622, 623, 625, 627, 628, 630, 632,
|
||||
633, 635, 637, 639, 640, 642, 644, 645, 647, 649, 650, 652, 654, 656, 657, 659, 661, 663, 664, 666, 668, 670, 671, 673, 675, 677, 678, 680, 682, 684, 685, 687, 689, 691, 692, 694, 696, 698, 700, 701, 703, 705, 707, 709, 710, 712, 714, 716, 718, 719, 721, 723,
|
||||
725, 727, 729, 730, 732, 734, 736, 738, 740, 741, 743, 745, 747, 749, 751, 753, 754, 756, 758, 760, 762, 764, 766, 767, 769, 771, 773, 775, 777, 779, 781, 783, 785, 786, 788, 790, 792, 794, 796, 798, 800, 802, 804, 806, 808, 809, 811, 813, 815, 817, 819, 821,
|
||||
823, 825, 827, 829, 831, 833, 835, 837, 839, 841, 843, 845, 847, 849, 851, 853, 855, 857, 859, 861, 863, 865, 867, 869, 871, 873, 875, 877, 879, 881, 883, 885, 887, 889, 891, 893, 895, 897, 899, 901, 903, 905, 907, 910, 912, 914, 916, 918, 920, 922, 924, 926,
|
||||
928, 930, 932, 934, 937, 939, 941, 943, 945, 947, 949, 951, 953, 956, 958, 960, 962, 964, 966, 968, 970, 973, 975, 977, 979, 981, 983, 985, 988, 990, 992, 994, 996, 998, 1001, 1003, 1005, 1007, 1009, 1012, 1014, 1016, 1018, 1020, 1023
|
||||
},
|
||||
.screengammatable = {
|
||||
0, 43, 60, 72, 82, 91, 98, 106, 112, 118, 124, 130, 135, 140, 145, 150, 154, 158, 163, 167, 171, 174, 178, 182, 185, 189, 192, 196, 199, 202, 205, 208, 211, 214, 217, 220, 223, 226, 228, 231, 234, 237, 239, 242, 244, 247, 249, 252, 254, 257, 259, 261,
|
||||
264, 266, 268, 270, 273, 275, 277, 279, 281, 283, 286, 288, 290, 292, 294, 296, 298, 300, 302, 304, 306, 308, 310, 311, 313, 315, 317, 319, 321, 323, 324, 326, 328, 330, 331, 333, 335, 337, 338, 340, 342, 343, 345, 347, 348, 350, 352, 353, 355, 357, 358, 360,
|
||||
361, 363, 365, 366, 368, 369, 371, 372, 374, 375, 377, 378, 380, 381, 383, 384, 386, 387, 389, 390, 392, 393, 394, 396, 397, 399, 400, 401, 403, 404, 406, 407, 408, 410, 411, 412, 414, 415, 416, 418, 419, 420, 422, 423, 424, 426, 427, 428, 430, 431, 432, 433,
|
||||
435, 436, 437, 438, 440, 441, 442, 443, 445, 446, 447, 448, 450, 451, 452, 453, 454, 456, 457, 458, 459, 460, 462, 463, 464, 465, 466, 467, 469, 470, 471, 472, 473, 474, 475, 477, 478, 479, 480, 481, 482, 483, 484, 486, 487, 488, 489, 490, 491, 492, 493, 494,
|
||||
495, 497, 498, 499, 500, 501, 502, 503, 504, 505, 506, 507, 508, 509, 510, 511, 512, 513, 514, 516, 517, 518, 519, 520, 521, 522, 523, 524, 525, 526, 527, 528, 529, 530, 531, 532, 533, 534, 535, 536, 537, 538, 539, 540, 541, 542, 543, 544, 545, 545, 546, 547,
|
||||
548, 549, 550, 551, 552, 553, 554, 555, 556, 557, 558, 559, 560, 561, 562, 563, 563, 564, 565, 566, 567, 568, 569, 570, 571, 572, 573, 574, 574, 575, 576, 577, 578, 579, 580, 581, 582, 583, 583, 584, 585, 586, 587, 588, 589, 590, 591, 591, 592, 593, 594, 595,
|
||||
596, 597, 598, 598, 599, 600, 601, 602, 603, 604, 604, 605, 606, 607, 608, 609, 609, 610, 611, 612, 613, 614, 615, 615, 616, 617, 618, 619, 620, 620, 621, 622, 623, 624, 624, 625, 626, 627, 628, 629, 629, 630, 631, 632, 633, 633, 634, 635, 636, 637, 637, 638,
|
||||
639, 640, 641, 641, 642, 643, 644, 645, 645, 646, 647, 648, 649, 649, 650, 651, 652, 652, 653, 654, 655, 656, 656, 657, 658, 659, 659, 660, 661, 662, 663, 663, 664, 665, 666, 666, 667, 668, 669, 669, 670, 671, 672, 672, 673, 674, 675, 675, 676, 677, 678, 678,
|
||||
679, 680, 681, 681, 682, 683, 684, 684, 685, 686, 686, 687, 688, 689, 689, 690, 691, 692, 692, 693, 694, 694, 695, 696, 697, 697, 698, 699, 700, 700, 701, 702, 702, 703, 704, 705, 705, 706, 707, 707, 708, 709, 709, 710, 711, 712, 712, 713, 714, 714, 715, 716,
|
||||
716, 717, 718, 719, 719, 720, 721, 721, 722, 723, 723, 724, 725, 725, 726, 727, 728, 728, 729, 730, 730, 731, 732, 732, 733, 734, 734, 735, 736, 736, 737, 738, 738, 739, 740, 740, 741, 742, 742, 743, 744, 744, 745, 746, 746, 747, 748, 748, 749, 750, 750, 751,
|
||||
752, 752, 753, 754, 754, 755, 756, 756, 757, 758, 758, 759, 759, 760, 761, 761, 762, 763, 763, 764, 765, 765, 766, 767, 767, 768, 769, 769, 770, 770, 771, 772, 772, 773, 774, 774, 775, 776, 776, 777, 777, 778, 779, 779, 780, 781, 781, 782, 782, 783, 784, 784,
|
||||
785, 786, 786, 787, 787, 788, 789, 789, 790, 791, 791, 792, 792, 793, 794, 794, 795, 795, 796, 797, 797, 798, 799, 799, 800, 800, 801, 802, 802, 803, 803, 804, 805, 805, 806, 806, 807, 808, 808, 809, 809, 810, 811, 811, 812, 812, 813, 814, 814, 815, 815, 816,
|
||||
817, 817, 818, 818, 819, 820, 820, 821, 821, 822, 823, 823, 824, 824, 825, 825, 826, 827, 827, 828, 828, 829, 830, 830, 831, 831, 832, 833, 833, 834, 834, 835, 835, 836, 837, 837, 838, 838, 839, 839, 840, 841, 841, 842, 842, 843, 843, 844, 845, 845, 846, 846,
|
||||
847, 847, 848, 849, 849, 850, 850, 851, 851, 852, 853, 853, 854, 854, 855, 855, 856, 857, 857, 858, 858, 859, 859, 860, 860, 861, 862, 862, 863, 863, 864, 864, 865, 865, 866, 867, 867, 868, 868, 869, 869, 870, 870, 871, 872, 872, 873, 873, 874, 874, 875, 875,
|
||||
876, 876, 877, 878, 878, 879, 879, 880, 880, 881, 881, 882, 882, 883, 884, 884, 885, 885, 886, 886, 887, 887, 888, 888, 889, 889, 890, 891, 891, 892, 892, 893, 893, 894, 894, 895, 895, 896, 896, 897, 898, 898, 899, 899, 900, 900, 901, 901, 902, 902, 903, 903,
|
||||
904, 904, 905, 905, 906, 906, 907, 908, 908, 909, 909, 910, 910, 911, 911, 912, 912, 913, 913, 914, 914, 915, 915, 916, 916, 917, 917, 918, 918, 919, 920, 920, 921, 921, 922, 922, 923, 923, 924, 924, 925, 925, 926, 926, 927, 927, 928, 928, 929, 929, 930, 930,
|
||||
931, 931, 932, 932, 933, 933, 934, 934, 935, 935, 936, 936, 937, 937, 938, 938, 939, 939, 940, 940, 941, 941, 942, 942, 943, 943, 944, 944, 945, 945, 946, 946, 947, 947, 948, 948, 949, 949, 950, 950, 951, 951, 952, 952, 953, 953, 954, 954, 955, 955, 956, 956,
|
||||
957, 957, 958, 958, 959, 959, 960, 960, 961, 961, 962, 962, 963, 963, 964, 964, 965, 965, 966, 966, 967, 967, 968, 968, 969, 969, 969, 970, 970, 971, 971, 972, 972, 973, 973, 974, 974, 975, 975, 976, 976, 977, 977, 978, 978, 979, 979, 980, 980, 981, 981, 982,
|
||||
982, 982, 983, 983, 984, 984, 985, 985, 986, 986, 987, 987, 988, 988, 989, 989, 990, 990, 991, 991, 991, 992, 992, 993, 993, 994, 994, 995, 995, 996, 996, 997, 997, 998, 998, 999, 999, 999, 1000, 1000, 1001, 1001, 1002, 1002, 1003, 1003, 1004, 1004, 1005,
|
||||
1005, 1006, 1006, 1006, 1007, 1007, 1008, 1008, 1009, 1009, 1010, 1010, 1011, 1011, 1012, 1012, 1012, 1013, 1013, 1014, 1014, 1015, 1015, 1016, 1016, 1017, 1017, 1017, 1018, 1018, 1019, 1019, 1020, 1020, 1021, 1021, 1022, 1022, 1023
|
||||
},
|
||||
}
|
||||
};
|
||||
|
||||
if( i < 0 || i >= ARRAYSIZE( precomputed_data ))
|
||||
return NULL;
|
||||
|
||||
return &precomputed_data[i];
|
||||
}
|
||||
#endif
|
||||
@@ -178,25 +178,6 @@ static screenfade_t *pfnRefGetScreenFade( void )
|
||||
return &clgame.fade;
|
||||
}
|
||||
|
||||
/*
|
||||
===============
|
||||
R_DoResetGamma
|
||||
gamma will be reset for
|
||||
some type of screenshots
|
||||
===============
|
||||
*/
|
||||
static qboolean R_DoResetGamma( void )
|
||||
{
|
||||
switch( cls.scrshot_action )
|
||||
{
|
||||
case scrshot_envshot:
|
||||
case scrshot_skyshot:
|
||||
return true;
|
||||
default:
|
||||
return false;
|
||||
}
|
||||
}
|
||||
|
||||
static qboolean R_Init_Video_( const int type )
|
||||
{
|
||||
host.apply_opengl_config = true;
|
||||
@@ -306,9 +287,11 @@ static ref_api_t gEngfuncs =
|
||||
SW_LockBuffer,
|
||||
SW_UnlockBuffer,
|
||||
|
||||
BuildGammaTable,
|
||||
LightToTexGamma,
|
||||
R_DoResetGamma,
|
||||
LightToTexGammaEx,
|
||||
TextureToGamma,
|
||||
ScreenGammaTable,
|
||||
LinearGammaTable,
|
||||
|
||||
CL_GetLightStyle,
|
||||
CL_GetDynamicLight,
|
||||
|
||||
@@ -1,6 +1,7 @@
|
||||
/*
|
||||
s_dsp.c - digital signal processing algorithms for audio FX
|
||||
Copyright (C) 2009 Uncle Mike
|
||||
Copyright (C) 2016-2024 Alibek Omarov
|
||||
|
||||
This program is free software: you can redistribute it and/or modify
|
||||
it under the terms of the GNU General Public License as published by
|
||||
@@ -333,7 +334,7 @@ DLY_MovePointer
|
||||
Checks overflow and moves pointer
|
||||
============
|
||||
*/
|
||||
_inline void DLY_MovePointer( dly_t *dly )
|
||||
static void DLY_MovePointer( dly_t *dly )
|
||||
{
|
||||
if( ++dly->idelayinput >= dly->cdelaysamplesmax )
|
||||
dly->idelayinput = 0;
|
||||
@@ -806,13 +807,9 @@ DSP_Process
|
||||
(xash dsp interface)
|
||||
===========
|
||||
*/
|
||||
void DSP_Process( int idsp, portable_samplepair_t *pbfront, int sampleCount )
|
||||
void DSP_Process( portable_samplepair_t *pbfront, int sampleCount )
|
||||
{
|
||||
if( dsp_off.value )
|
||||
return;
|
||||
|
||||
// don't process DSP while in menu
|
||||
if( cls.key_dest == key_menu || !sampleCount )
|
||||
if( dsp_off.value || !sampleCount )
|
||||
return;
|
||||
|
||||
// preset is already installed by CheckNewDspPresets
|
||||
@@ -833,7 +830,7 @@ DSP_ClearState
|
||||
*/
|
||||
void DSP_ClearState( void )
|
||||
{
|
||||
Cvar_SetValue( "room_type", 0.0f );
|
||||
Cvar_DirectSet( &room_type, "0" );
|
||||
SX_ReloadRoomFX();
|
||||
}
|
||||
|
||||
@@ -892,15 +889,15 @@ void CheckNewDspPresets( void )
|
||||
|
||||
cur = ptable + idsp_room;
|
||||
|
||||
Cvar_SetValue( "room_lp", cur->room_lp );
|
||||
Cvar_SetValue( "room_mod", cur->room_mod );
|
||||
Cvar_SetValue( "room_size", cur->room_size );
|
||||
Cvar_SetValue( "room_refl", cur->room_refl );
|
||||
Cvar_SetValue( "room_rvblp", cur->room_rvblp );
|
||||
Cvar_SetValue( "room_delay", cur->room_delay );
|
||||
Cvar_SetValue( "room_feedback", cur->room_feedback );
|
||||
Cvar_SetValue( "room_dlylp", cur->room_dlylp );
|
||||
Cvar_SetValue( "room_left", cur->room_left );
|
||||
Cvar_DirectSetValue( &sxmod_lowpass, cur->room_lp );
|
||||
Cvar_DirectSetValue( &sxmod_mod, cur->room_mod );
|
||||
Cvar_DirectSetValue( &sxrvb_size, cur->room_size );
|
||||
Cvar_DirectSetValue( &sxrvb_feedback, cur->room_refl );
|
||||
Cvar_DirectSetValue( &sxrvb_lp, cur->room_rvblp );
|
||||
Cvar_DirectSetValue( &sxdly_delay, cur->room_delay );
|
||||
Cvar_DirectSetValue( &sxdly_feedback, cur->room_feedback );
|
||||
Cvar_DirectSetValue( &sxdly_lp, cur->room_dlylp );
|
||||
Cvar_DirectSetValue( &sxste_delay, cur->room_left );
|
||||
}
|
||||
|
||||
room_typeprev = idsp_room;
|
||||
@@ -929,7 +926,7 @@ static void SX_Profiling_f( void )
|
||||
|
||||
if( Cmd_Argc() > 1 )
|
||||
{
|
||||
Cvar_SetValue( "room_type", Q_atof( Cmd_Argv( 1 )));
|
||||
Cvar_DirectSetValue( &room_type, Q_atof( Cmd_Argv( 1 )));
|
||||
SX_ReloadRoomFX();
|
||||
CheckNewDspPresets(); // we just need idsp_room immediately, for message below
|
||||
}
|
||||
@@ -939,7 +936,7 @@ static void SX_Profiling_f( void )
|
||||
start = Sys_DoubleTime();
|
||||
for( calls = 10000; calls; calls-- )
|
||||
{
|
||||
DSP_Process( idsp_room, testbuffer, 512 );
|
||||
DSP_Process( testbuffer, 512 );
|
||||
}
|
||||
end = Sys_DoubleTime();
|
||||
|
||||
@@ -947,7 +944,7 @@ static void SX_Profiling_f( void )
|
||||
|
||||
if( Cmd_Argc() > 1 )
|
||||
{
|
||||
Cvar_SetValue( "room_type", oldroom );
|
||||
Cvar_DirectSetValue( &room_type, oldroom );
|
||||
SX_ReloadRoomFX();
|
||||
CheckNewDspPresets();
|
||||
}
|
||||
|
||||
@@ -648,20 +648,6 @@ void S_StartSound( const vec3_t pos, int ent, int chan, sound_t handle, float fv
|
||||
|
||||
// Init client entity mouth movement vars
|
||||
SND_InitMouth( ent, chan );
|
||||
|
||||
for( ch_idx = NUM_AMBIENTS, check = channels + NUM_AMBIENTS; ch_idx < MAX_DYNAMIC_CHANNELS; ch_idx++, check++)
|
||||
{
|
||||
if( check == target_chan ) continue;
|
||||
|
||||
if( check->sfx == sfx && !check->pMixer.sample )
|
||||
{
|
||||
// skip up to 0.1 seconds of audio
|
||||
int skip = COM_RandomLong( 0, (long)( 0.1f * check->sfx->cache->rate ));
|
||||
|
||||
S_SetSampleStart( check, sfx->cache, skip );
|
||||
break;
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
/*
|
||||
|
||||
@@ -999,7 +999,8 @@ void MIX_PaintChannels( int endtime )
|
||||
MIX_UpsampleAllPaintbuffers( end, count );
|
||||
|
||||
// process all sounds with DSP
|
||||
DSP_Process( idsp_room, MIX_GetPFrontFromIPaint( IROOMBUFFER ), count );
|
||||
if( cls.key_dest != key_menu )
|
||||
DSP_Process( MIX_GetPFrontFromIPaint( IROOMBUFFER ), count );
|
||||
|
||||
// add music or soundtrack from movie (no dsp)
|
||||
MIX_MixPaintbuffers( IPAINTBUFFER, IROOMBUFFER, IPAINTBUFFER, count, S_GetMasterVolume() );
|
||||
|
||||
@@ -96,6 +96,7 @@ void S_StartBackgroundTrack( const char *introTrack, const char *mainTrack, int
|
||||
|
||||
// open stream
|
||||
s_bgTrack.stream = FS_OpenStream( introTrack );
|
||||
|
||||
Q_strncpy( s_bgTrack.current, introTrack, sizeof( s_bgTrack.current ));
|
||||
memset( &musicfade, 0, sizeof( musicfade )); // clear any soundfade
|
||||
s_bgTrack.source = cls.key_dest;
|
||||
|
||||
@@ -16,204 +16,6 @@ GNU General Public License for more details.
|
||||
#include "common.h"
|
||||
#include "sound.h"
|
||||
|
||||
// hardcoded macros to test for zero crossing
|
||||
#define ZERO_X_8( b ) (( b ) < 2 && ( b ) > -2 )
|
||||
#define ZERO_X_16( b ) (( b ) < 512 && ( b ) > -512 )
|
||||
|
||||
//-----------------------------------------------------------------------------
|
||||
// Purpose: Search backward for a zero crossing starting at sample
|
||||
// Input : sample - starting point
|
||||
// Output : position of zero crossing
|
||||
//-----------------------------------------------------------------------------
|
||||
int S_ZeroCrossingBefore( wavdata_t *pWaveData, int sample )
|
||||
{
|
||||
if( pWaveData == NULL )
|
||||
return sample;
|
||||
|
||||
if( pWaveData->type == WF_PCMDATA )
|
||||
{
|
||||
int sampleSize;
|
||||
|
||||
sampleSize = pWaveData->width * pWaveData->channels;
|
||||
|
||||
// this can never be zero -- other functions divide by this.
|
||||
// This should never happen, but avoid crashing
|
||||
if( sampleSize <= 0 ) sampleSize = 1;
|
||||
|
||||
if( pWaveData->width == 1 )
|
||||
{
|
||||
signed char *pData = (signed char *)(pWaveData->buffer + sample * sampleSize);
|
||||
qboolean zero = false;
|
||||
|
||||
if( pWaveData->channels == 1 )
|
||||
{
|
||||
while( sample > 0 && !zero )
|
||||
{
|
||||
if( ZERO_X_8( *pData ))
|
||||
{
|
||||
zero = true;
|
||||
}
|
||||
else
|
||||
{
|
||||
sample--;
|
||||
pData--;
|
||||
}
|
||||
}
|
||||
}
|
||||
else
|
||||
{
|
||||
while( sample > 0 && !zero )
|
||||
{
|
||||
if( ZERO_X_8( *pData ) && ZERO_X_8( pData[1] ))
|
||||
{
|
||||
zero = true;
|
||||
}
|
||||
else
|
||||
{
|
||||
sample--;
|
||||
pData--;
|
||||
}
|
||||
}
|
||||
}
|
||||
}
|
||||
else
|
||||
{
|
||||
short *pData = (short *)(pWaveData->buffer + sample * sampleSize);
|
||||
qboolean zero = false;
|
||||
|
||||
if( pWaveData->channels == 1 )
|
||||
{
|
||||
while( sample > 0 && !zero )
|
||||
{
|
||||
if( ZERO_X_16(*pData ))
|
||||
{
|
||||
zero = true;
|
||||
}
|
||||
else
|
||||
{
|
||||
pData--;
|
||||
sample--;
|
||||
}
|
||||
}
|
||||
}
|
||||
else
|
||||
{
|
||||
while( sample > 0 && !zero )
|
||||
{
|
||||
if( ZERO_X_16( *pData ) && ZERO_X_16( pData[1] ))
|
||||
{
|
||||
zero = true;
|
||||
}
|
||||
else
|
||||
{
|
||||
sample--;
|
||||
pData--;
|
||||
}
|
||||
}
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
return sample;
|
||||
}
|
||||
|
||||
//-----------------------------------------------------------------------------
|
||||
// Purpose: Search forward for a zero crossing
|
||||
// Input : sample - starting point
|
||||
// Output : position of found zero crossing
|
||||
//-----------------------------------------------------------------------------
|
||||
int S_ZeroCrossingAfter( wavdata_t *pWaveData, int sample )
|
||||
{
|
||||
if( pWaveData == NULL )
|
||||
return sample;
|
||||
|
||||
if( pWaveData->type == WF_PCMDATA )
|
||||
{
|
||||
int sampleSize;
|
||||
|
||||
sampleSize = pWaveData->width * pWaveData->channels;
|
||||
|
||||
// this can never be zero -- other functions divide by this.
|
||||
// This should never happen, but avoid crashing
|
||||
if( sampleSize <= 0 ) sampleSize = 1;
|
||||
|
||||
if( pWaveData->width == 1 ) // 8-bit
|
||||
{
|
||||
signed char *pData = (signed char *)(pWaveData->buffer + sample * sampleSize);
|
||||
qboolean zero = false;
|
||||
|
||||
if( pWaveData->channels == 1 )
|
||||
{
|
||||
while( sample < pWaveData->samples && !zero )
|
||||
{
|
||||
if( ZERO_X_8( *pData ))
|
||||
{
|
||||
zero = true;
|
||||
}
|
||||
else
|
||||
{
|
||||
sample++;
|
||||
pData++;
|
||||
}
|
||||
}
|
||||
}
|
||||
else
|
||||
{
|
||||
while( sample < pWaveData->samples && !zero )
|
||||
{
|
||||
if( ZERO_X_8( *pData ) && ZERO_X_8( pData[1] ))
|
||||
{
|
||||
zero = true;
|
||||
}
|
||||
else
|
||||
{
|
||||
sample++;
|
||||
pData++;
|
||||
}
|
||||
}
|
||||
}
|
||||
}
|
||||
else
|
||||
{
|
||||
short *pData = (short *)(pWaveData->buffer + sample * sampleSize);
|
||||
qboolean zero = false;
|
||||
|
||||
if( pWaveData->channels == 1 )
|
||||
{
|
||||
while( sample > 0 && !zero )
|
||||
{
|
||||
if( ZERO_X_16( *pData ))
|
||||
{
|
||||
zero = true;
|
||||
}
|
||||
else
|
||||
{
|
||||
pData++;
|
||||
sample++;
|
||||
}
|
||||
}
|
||||
}
|
||||
else
|
||||
{
|
||||
while( sample > 0 && !zero )
|
||||
{
|
||||
if( ZERO_X_16( *pData ) && ZERO_X_16( pData[1] ))
|
||||
{
|
||||
zero = true;
|
||||
}
|
||||
else
|
||||
{
|
||||
sample++;
|
||||
pData++;
|
||||
}
|
||||
}
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
return sample;
|
||||
}
|
||||
|
||||
//-----------------------------------------------------------------------------
|
||||
// Purpose: wrap the position wrt looping
|
||||
// Input : samplePosition - absolute position
|
||||
@@ -279,28 +81,3 @@ int S_GetOutputData( wavdata_t *pSource, void **pData, int samplePosition, int s
|
||||
|
||||
return sampleCount;
|
||||
}
|
||||
|
||||
// move the current position to newPosition
|
||||
void S_SetSampleStart( channel_t *pChan, wavdata_t *pSource, int newPosition )
|
||||
{
|
||||
if( pSource )
|
||||
newPosition = S_ZeroCrossingAfter( pSource, newPosition );
|
||||
|
||||
pChan->pMixer.sample = newPosition;
|
||||
}
|
||||
|
||||
// end playback at newEndPosition
|
||||
void S_SetSampleEnd( channel_t *pChan, wavdata_t *pSource, int newEndPosition )
|
||||
{
|
||||
// forced end of zero means play the whole sample
|
||||
if( !newEndPosition ) newEndPosition = 1;
|
||||
|
||||
if( pSource )
|
||||
newEndPosition = S_ZeroCrossingBefore( pSource, newEndPosition );
|
||||
|
||||
// past current position? limit.
|
||||
if( newEndPosition < pChan->pMixer.sample )
|
||||
newEndPosition = pChan->pMixer.sample;
|
||||
|
||||
pChan->pMixer.forcedEndSample = newEndPosition;
|
||||
}
|
||||
|
||||
@@ -18,10 +18,126 @@ GNU General Public License for more details.
|
||||
#include "const.h"
|
||||
#include <ctype.h>
|
||||
|
||||
#define TRIM_SCAN_MAX 255
|
||||
#define TRIM_SAMPLES_BELOW_8 2
|
||||
#define TRIM_SAMPLES_BELOW_16 512 // 65k * 2 / 256
|
||||
|
||||
#define CVOXFILESENTENCEMAX 4096
|
||||
|
||||
static int cszrawsentences = 0;
|
||||
static char *rgpszrawsentence[CVOXFILESENTENCEMAX];
|
||||
static const char *voxperiod = "_period", *voxcomma = "_comma";
|
||||
|
||||
static qboolean S_ShouldTrimSample8( const int8_t *buf, int channels )
|
||||
{
|
||||
if( abs( buf[0] ) > TRIM_SAMPLES_BELOW_8 )
|
||||
return false;
|
||||
|
||||
if( channels >= 2 && abs( buf[1] ) > TRIM_SAMPLES_BELOW_8 )
|
||||
return false;
|
||||
|
||||
return true;
|
||||
}
|
||||
|
||||
static qboolean S_ShouldTrimSample16( const int16_t *buf, int channels )
|
||||
{
|
||||
if( abs( buf[0] ) > TRIM_SAMPLES_BELOW_16 )
|
||||
return false;
|
||||
|
||||
if( channels >= 2 && abs( buf[1] ) > TRIM_SAMPLES_BELOW_16 )
|
||||
return false;
|
||||
|
||||
return true;
|
||||
}
|
||||
|
||||
static int S_TrimStart( const wavdata_t *wav, int start )
|
||||
{
|
||||
size_t channels = wav->channels, width = wav->width, i;
|
||||
|
||||
if( wav->type != WF_PCMDATA )
|
||||
return start;
|
||||
|
||||
if( width == 1 )
|
||||
{
|
||||
const int8_t *data = (const int8_t *)&wav->buffer[channels * width * start];
|
||||
|
||||
for( i = 0; i < TRIM_SCAN_MAX && start < wav->samples; i++ )
|
||||
{
|
||||
if( !S_ShouldTrimSample8( data, wav->channels ))
|
||||
break;
|
||||
|
||||
start += channels;
|
||||
data += channels;
|
||||
}
|
||||
}
|
||||
else if( width == 2 )
|
||||
{
|
||||
const int16_t *data = (const int16_t *)&wav->buffer[channels * width * start];
|
||||
|
||||
for( i = 0; i < TRIM_SCAN_MAX && start < wav->samples; i++ )
|
||||
{
|
||||
if( !S_ShouldTrimSample16( data, wav->channels ))
|
||||
break;
|
||||
|
||||
start += channels;
|
||||
data += channels;
|
||||
}
|
||||
}
|
||||
|
||||
return start;
|
||||
}
|
||||
|
||||
static int S_TrimEnd( const wavdata_t *wav, int end )
|
||||
{
|
||||
size_t channels = wav->channels, width = wav->width, i;
|
||||
|
||||
if( wav->type != WF_PCMDATA )
|
||||
return end;
|
||||
|
||||
if( width == 1 )
|
||||
{
|
||||
const int8_t *data = (const int8_t *)&wav->buffer[channels * width * end];
|
||||
|
||||
for( i = 0; i < TRIM_SCAN_MAX && end > 0; i++ )
|
||||
{
|
||||
if( !S_ShouldTrimSample8( data, wav->channels ))
|
||||
break;
|
||||
|
||||
end -= channels;
|
||||
data -= channels;
|
||||
}
|
||||
}
|
||||
else if( width == 2 )
|
||||
{
|
||||
const int16_t *data = (const int16_t *)&wav->buffer[channels * width * end];
|
||||
|
||||
for( i = 0; i < TRIM_SCAN_MAX && end > 0; i++ )
|
||||
{
|
||||
if( !S_ShouldTrimSample16( data, wav->channels ))
|
||||
break;
|
||||
|
||||
end -= channels;
|
||||
data -= channels;
|
||||
}
|
||||
}
|
||||
|
||||
return end;
|
||||
}
|
||||
|
||||
static void S_TrimStartEndTimes( channel_t *ch, wavdata_t *wav, int start, int end )
|
||||
{
|
||||
ch->pMixer.sample = start = S_TrimStart( wav, start );
|
||||
|
||||
// don't overrun the buffer while trimming end
|
||||
if( end == 0 )
|
||||
end = wav->samples - wav->channels;
|
||||
|
||||
if( end < start )
|
||||
end = start;
|
||||
|
||||
ch->pMixer.forcedEndSample = S_TrimEnd( wav, end );
|
||||
}
|
||||
|
||||
// return number of samples mixed
|
||||
int VOX_MixDataToDevice( channel_t *pchan, int sampleCount, int outputRate, int outputOffset )
|
||||
{
|
||||
@@ -78,11 +194,7 @@ void VOX_LoadWord( channel_t *ch )
|
||||
|
||||
if( end <= start ) end = 0;
|
||||
|
||||
if( start )
|
||||
S_SetSampleStart( ch, data, start * 0.01f * samples );
|
||||
|
||||
if( end )
|
||||
S_SetSampleEnd( ch, data, end * 0.01f * samples );
|
||||
S_TrimStartEndTimes( ch, data, start * 0.01f * samples, end * 0.01f * samples );
|
||||
}
|
||||
|
||||
void VOX_FreeWord( channel_t *ch )
|
||||
|
||||
@@ -255,8 +255,7 @@ void S_InitSounds( void );
|
||||
void SX_Init( void );
|
||||
void SX_Free( void );
|
||||
void CheckNewDspPresets( void );
|
||||
void DSP_Process( int idsp, portable_samplepair_t *pbfront, int sampleCount );
|
||||
float DSP_GetGain( int idsp );
|
||||
void DSP_Process( portable_samplepair_t *pbfront, int sampleCount );
|
||||
void DSP_ClearState( void );
|
||||
|
||||
qboolean S_Init( void );
|
||||
@@ -305,8 +304,6 @@ int S_ZeroCrossingAfter( wavdata_t *pWaveData, int sample );
|
||||
int S_ZeroCrossingBefore( wavdata_t *pWaveData, int sample );
|
||||
int S_ConvertLoopedPosition( wavdata_t *pSource, int samplePosition, qboolean use_loop );
|
||||
int S_GetOutputData( wavdata_t *pSource, void **pData, int samplePosition, int sampleCount, qboolean use_loop );
|
||||
void S_SetSampleStart( channel_t *pChan, wavdata_t *pSource, int newPosition );
|
||||
void S_SetSampleEnd( channel_t *pChan, wavdata_t *pSource, int newEndPosition );
|
||||
|
||||
//
|
||||
// s_vox.c
|
||||
|
||||
@@ -22,8 +22,6 @@ GNU General Public License for more details.
|
||||
|
||||
static CVAR_DEFINE( window_width, "width", "0", FCVAR_RENDERINFO|FCVAR_VIDRESTART, "screen width" );
|
||||
static CVAR_DEFINE( window_height, "height", "0", FCVAR_RENDERINFO|FCVAR_VIDRESTART, "screen height" );
|
||||
static CVAR_DEFINE( vid_brightness, "brightness", "0.0", FCVAR_ARCHIVE, "brightness factor" );
|
||||
static CVAR_DEFINE( vid_gamma, "gamma", "2.5", FCVAR_ARCHIVE, "gamma amount" );
|
||||
static CVAR_DEFINE_AUTO( vid_mode, "0", FCVAR_RENDERINFO, "current video mode index (used only for storage)" );
|
||||
static CVAR_DEFINE_AUTO( vid_rotate, "0", FCVAR_RENDERINFO|FCVAR_VIDRESTART, "screen rotation (0-3)" );
|
||||
static CVAR_DEFINE_AUTO( vid_scale, "1.0", FCVAR_RENDERINFO|FCVAR_VIDRESTART, "pixel scale" );
|
||||
@@ -36,19 +34,6 @@ CVAR_DEFINE( window_ypos, "_window_ypos", "-1", FCVAR_RENDERINFO, "window positi
|
||||
|
||||
glwstate_t glw_state;
|
||||
|
||||
/*
|
||||
=================
|
||||
VID_StartupGamma
|
||||
=================
|
||||
*/
|
||||
void VID_StartupGamma( void )
|
||||
{
|
||||
BuildGammaTable( vid_gamma.value, vid_brightness.value );
|
||||
Con_Reportf( "VID_StartupGamma: gamma %g brightness %g\n", vid_gamma.value, vid_brightness.value );
|
||||
ClearBits( vid_brightness.flags, FCVAR_CHANGED );
|
||||
ClearBits( vid_gamma.flags, FCVAR_CHANGED );
|
||||
}
|
||||
|
||||
/*
|
||||
=================
|
||||
VID_InitDefaultResolution
|
||||
@@ -224,8 +209,6 @@ void VID_Init( void )
|
||||
Cvar_RegisterVariable( &vid_scale );
|
||||
Cvar_RegisterVariable( &vid_fullscreen );
|
||||
Cvar_RegisterVariable( &vid_maximized );
|
||||
Cvar_RegisterVariable( &vid_brightness );
|
||||
Cvar_RegisterVariable( &vid_gamma );
|
||||
Cvar_RegisterVariable( &window_xpos );
|
||||
Cvar_RegisterVariable( &window_ypos );
|
||||
|
||||
@@ -233,5 +216,6 @@ void VID_Init( void )
|
||||
// but supported mode list is filled by backends, so numbers are not portable any more
|
||||
Cmd_AddRestrictedCommand( "vid_setmode", VID_Mode_f, "display video mode" );
|
||||
|
||||
V_Init(); // init gamma
|
||||
R_Init(); // init renderer
|
||||
}
|
||||
|
||||
@@ -46,6 +46,5 @@ void R_SaveVideoMode( int w, int h, int render_w, int render_h, qboolean maximiz
|
||||
void VID_SetDisplayTransform( int *render_w, int *render_h );
|
||||
void VID_CheckChanges( void );
|
||||
const char *VID_GetModeString( int vid_mode );
|
||||
void VID_StartupGamma( void );
|
||||
|
||||
#endif // VID_COMMON
|
||||
|
||||
@@ -17,7 +17,6 @@ GNU General Public License for more details.
|
||||
#define VOX_H
|
||||
|
||||
#define CVOXWORDMAX 64
|
||||
#define CVOXFILESENTENCEMAX 4096
|
||||
|
||||
#define SENTENCE_INDEX -99999 // unique sentence index
|
||||
|
||||
|
||||
@@ -812,8 +812,13 @@ void S_StopBackgroundTrack( void );
|
||||
void S_StopAllSounds( qboolean ambient );
|
||||
|
||||
// gamma routines
|
||||
void BuildGammaTable( float gamma, float brightness );
|
||||
byte LightToTexGamma( byte b );
|
||||
byte TextureToGamma( byte );
|
||||
uint LightToTexGammaEx( uint );
|
||||
uint ScreenGammaTable( uint );
|
||||
uint LinearGammaTable( uint );
|
||||
void V_Init( void );
|
||||
void V_CheckGamma( void );
|
||||
|
||||
//
|
||||
// identification.c
|
||||
|
||||
@@ -563,6 +563,27 @@ void Cvar_RegisterVariable( convar_t *var )
|
||||
#endif
|
||||
}
|
||||
|
||||
static qboolean Cvar_CanSet( const convar_t *cv )
|
||||
{
|
||||
if( FBitSet( cv->flags, FCVAR_READ_ONLY ))
|
||||
{
|
||||
Con_Printf( "%s is read-only.\n", cv->name );
|
||||
return false;
|
||||
}
|
||||
|
||||
if( FBitSet( cv->flags, FCVAR_CHEAT ) && !host.allow_cheats )
|
||||
{
|
||||
Con_Printf( "%s is cheat protected.\n", cv->name );
|
||||
return false;
|
||||
}
|
||||
|
||||
// just tell user about deferred changes
|
||||
if( FBitSet( cv->flags, FCVAR_LATCH ) && ( SV_Active() || CL_Active( )))
|
||||
Con_Printf( "%s will be changed upon restarting.\n", cv->name );
|
||||
|
||||
return true;
|
||||
}
|
||||
|
||||
/*
|
||||
============
|
||||
Cvar_Set2
|
||||
@@ -632,22 +653,9 @@ static convar_t *Cvar_Set2( const char *var_name, const char *value )
|
||||
force = true;
|
||||
|
||||
if( !force )
|
||||
{
|
||||
if( FBitSet( var->flags, FCVAR_READ_ONLY ))
|
||||
{
|
||||
Con_Printf( "%s is read-only.\n", var->name );
|
||||
{
|
||||
if( !Cvar_CanSet( var ))
|
||||
return var;
|
||||
}
|
||||
|
||||
if( FBitSet( var->flags, FCVAR_CHEAT ) && !host.allow_cheats )
|
||||
{
|
||||
Con_Printf( "%s is cheat protected.\n", var->name );
|
||||
return var;
|
||||
}
|
||||
|
||||
// just tell user about deferred changes
|
||||
if( FBitSet( var->flags, FCVAR_LATCH ) && ( SV_Active() || CL_Active( )))
|
||||
Con_Printf( "%s will be changed upon restarting.\n", var->name );
|
||||
}
|
||||
|
||||
pszValue = Cvar_ValidateString( var, value );
|
||||
@@ -694,21 +702,8 @@ void Cvar_DirectSet( convar_t *var, const char *value )
|
||||
return; // how this possible?
|
||||
}
|
||||
|
||||
if( FBitSet( var->flags, FCVAR_READ_ONLY ))
|
||||
{
|
||||
Con_Printf( "%s is read-only.\n", var->name );
|
||||
if( !Cvar_CanSet( var ))
|
||||
return;
|
||||
}
|
||||
|
||||
if( FBitSet( var->flags, FCVAR_CHEAT ) && !host.allow_cheats )
|
||||
{
|
||||
Con_Printf( "%s is cheat protected.\n", var->name );
|
||||
return;
|
||||
}
|
||||
|
||||
// just tell user about deferred changes
|
||||
if( FBitSet( var->flags, FCVAR_LATCH ) && ( SV_Active() || CL_Active( )))
|
||||
Con_Printf( "%s will be changed upon restarting.\n", var->name );
|
||||
|
||||
// check value
|
||||
if( !value )
|
||||
@@ -741,6 +736,24 @@ void Cvar_DirectSet( convar_t *var, const char *value )
|
||||
Cvar_Changed( var );
|
||||
}
|
||||
|
||||
/*
|
||||
============
|
||||
Cvar_DirectSetValue
|
||||
|
||||
functionally is the same as Cvar_SetValue but for direct cvar access
|
||||
============
|
||||
*/
|
||||
void Cvar_DirectSetValue( convar_t *var, float value )
|
||||
{
|
||||
char val[32];
|
||||
|
||||
if( fabs( value - (int)value ) < 0.000001 )
|
||||
Q_snprintf( val, sizeof( val ), "%d", (int)value );
|
||||
else Q_snprintf( val, sizeof( val ), "%f", value );
|
||||
|
||||
Cvar_DirectSet( var, val );
|
||||
}
|
||||
|
||||
/*
|
||||
============
|
||||
Cvar_FullSet
|
||||
|
||||
@@ -66,6 +66,7 @@ convar_t *Cvar_Getf( const char *var_name, int flags, const char *description, c
|
||||
void Cvar_LookupVars( int checkbit, void *buffer, void *ptr, setpair_t callback );
|
||||
void Cvar_FullSet( const char *var_name, const char *value, int flags );
|
||||
void Cvar_DirectSet( convar_t *var, const char *value );
|
||||
void Cvar_DirectSetValue( convar_t *var, float value );
|
||||
void Cvar_Set( const char *var_name, const char *value );
|
||||
void Cvar_SetValue( const char *var_name, float value );
|
||||
const char *Cvar_BuildAutoDescription( const char *szName, int flags );
|
||||
|
||||
@@ -247,4 +247,14 @@ void CL_HudMessage( const char *pMessage )
|
||||
|
||||
}
|
||||
|
||||
byte TextureToGamma( byte b )
|
||||
{
|
||||
return b;
|
||||
}
|
||||
|
||||
byte LightToTexGamma( byte b )
|
||||
{
|
||||
return b;
|
||||
}
|
||||
|
||||
#endif // XASH_DEDICATED
|
||||
|
||||
@@ -1,78 +0,0 @@
|
||||
/*
|
||||
gamma.c - gamma routines
|
||||
Copyright (C) 2011 Uncle Mike
|
||||
|
||||
This program is free software: you can redistribute it and/or modify
|
||||
it under the terms of the GNU General Public License as published by
|
||||
the Free Software Foundation, either version 3 of the License, or
|
||||
(at your option) any later version.
|
||||
|
||||
This program is distributed in the hope that it will be useful,
|
||||
but WITHOUT ANY WARRANTY; without even the implied warranty of
|
||||
MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
|
||||
GNU General Public License for more details.
|
||||
*/
|
||||
|
||||
#include "common.h"
|
||||
#include "xash3d_mathlib.h"
|
||||
#include "enginefeatures.h"
|
||||
|
||||
//-----------------------------------------------------------------------------
|
||||
// Gamma conversion support
|
||||
//-----------------------------------------------------------------------------
|
||||
static byte lightgammatable[256];
|
||||
static int lineargammatable[1024];
|
||||
static int screengammatable[1024];
|
||||
|
||||
void BuildGammaTable( float lightgamma, float brightness )
|
||||
{
|
||||
int i, inf;
|
||||
float f, g, g1, g3;
|
||||
|
||||
lightgamma = bound( 1.8f, lightgamma, 3.0f );
|
||||
brightness = bound( 0.0f, brightness, 10.0f );
|
||||
|
||||
if( brightness <= 0.0f )
|
||||
g3 = 0.125f;
|
||||
else if( brightness > 1.0f )
|
||||
g3 = 0.05f;
|
||||
else g3 = 0.125f - (brightness * brightness) * 0.075f;
|
||||
|
||||
g = 1.0f / lightgamma;
|
||||
g1 = GAMMA * g;
|
||||
|
||||
for( i = 0; i < 256; i++ )
|
||||
{
|
||||
f = pow( i / 255.f, GAMMA );
|
||||
|
||||
// scale up
|
||||
if( brightness > 1.0f )
|
||||
f = f * brightness;
|
||||
|
||||
// shift up
|
||||
if( f <= g3 ) f = (f / g3) * 0.125f;
|
||||
else f = 0.125f + ((f - g3) / (1.0f - g3)) * 0.875f;
|
||||
|
||||
// convert linear space to desired gamma space
|
||||
inf = (int)( 255.0f * pow( f, g ));
|
||||
|
||||
lightgammatable[i] = bound( 0, inf, 255 );
|
||||
}
|
||||
|
||||
for( i = 0; i < 1024; i++ )
|
||||
{
|
||||
// convert from screen gamma space to linear space
|
||||
lineargammatable[i] = 1023 * pow( i / 1023.0f, g1 );
|
||||
|
||||
// convert from linear gamma space to screen space
|
||||
screengammatable[i] = 1023 * pow( i / 1023.0f, 1.0f / g1 );
|
||||
}
|
||||
}
|
||||
|
||||
byte LightToTexGamma( byte b )
|
||||
{
|
||||
if( FBitSet( host.features, ENGINE_LINEAR_GAMMA_SPACE ))
|
||||
return b;
|
||||
else
|
||||
return lightgammatable[b];
|
||||
}
|
||||
@@ -954,7 +954,7 @@ void Host_InitCommon( int argc, char **argv, const char *progname, qboolean bCha
|
||||
int developer = DEFAULT_DEV;
|
||||
const char *baseDir;
|
||||
char ticrate[16];
|
||||
int len;
|
||||
int len, i;
|
||||
|
||||
// some commands may turn engine into infinite loop,
|
||||
// e.g. xash.exe +game xash -game xash
|
||||
@@ -1029,7 +1029,7 @@ void Host_InitCommon( int argc, char **argv, const char *progname, qboolean bCha
|
||||
progname++;
|
||||
|
||||
Q_strncpy( SI.exeName, progname, sizeof( SI.exeName ));
|
||||
Q_strncpy( SI.basedirName, progname, sizeof( SI.exeName ));
|
||||
Q_strncpy( SI.basedirName, progname, sizeof( SI.basedirName ));
|
||||
|
||||
if( Host_IsDedicated() )
|
||||
{
|
||||
@@ -1201,12 +1201,25 @@ void Host_InitCommon( int argc, char **argv, const char *progname, qboolean bCha
|
||||
FS_LoadGameInfo( NULL );
|
||||
Cvar_PostFSInit();
|
||||
|
||||
if( FS_FileExists( va( "%s.rc", SI.basedirName ), false ))
|
||||
Q_strncpy( SI.rcName, SI.basedirName, sizeof( SI.rcName )); // e.g. valve.rc
|
||||
else Q_strncpy( SI.rcName, SI.exeName, sizeof( SI.rcName )); // e.g. quake.rc
|
||||
|
||||
Q_strncpy( host.gamefolder, GI->gamefolder, sizeof( host.gamefolder ));
|
||||
|
||||
for( i = 0; i < 3; i++ )
|
||||
{
|
||||
const char *rcName;
|
||||
switch( i )
|
||||
{
|
||||
case 0: rcName = SI.basedirName; break; // e.g. valve.rc
|
||||
case 1: rcName = SI.exeName; break; // e.g. quake.rc
|
||||
case 2: rcName = host.gamefolder; break; // e.g. game.rc (ran from default launcher)
|
||||
}
|
||||
|
||||
if( FS_FileExists( va( "%s.rc", rcName ), false ))
|
||||
{
|
||||
Q_strncpy( SI.rcName, rcName, sizeof( SI.rcName ));
|
||||
break;
|
||||
}
|
||||
}
|
||||
|
||||
Image_CheckPaletteQ1 ();
|
||||
Host_InitDecals (); // reload decals
|
||||
|
||||
|
||||
@@ -57,6 +57,8 @@ void COM_NewGame( char const *pMapName )
|
||||
GameState->landmarkName[0] = 0;
|
||||
GameState->loadGame = false;
|
||||
GameState->newGame = true;
|
||||
|
||||
SV_ShutdownGame(); // exit from current game
|
||||
}
|
||||
|
||||
void COM_LoadLevel( char const *pMapName, qboolean background )
|
||||
@@ -74,6 +76,8 @@ void COM_LoadLevel( char const *pMapName, qboolean background )
|
||||
GameState->landmarkName[0] = 0;
|
||||
GameState->loadGame = false;
|
||||
GameState->newGame = false;
|
||||
|
||||
SV_ShutdownGame(); // exit from current game
|
||||
}
|
||||
|
||||
void COM_LoadGame( char const *pMapName )
|
||||
|
||||
@@ -287,16 +287,15 @@ void Image_SetPalette( const byte *pal, uint *d_table )
|
||||
uint uirgba; // TODO: palette looks byte-swapped on big-endian
|
||||
int i;
|
||||
|
||||
|
||||
// setup palette
|
||||
switch( image.d_rendermode )
|
||||
{
|
||||
case LUMP_NORMAL:
|
||||
for( i = 0; i < 256; i++ )
|
||||
{
|
||||
rgba[0] = pal[i*3+0];
|
||||
rgba[1] = pal[i*3+1];
|
||||
rgba[2] = pal[i*3+2];
|
||||
rgba[0] = TextureToGamma( pal[i*3+0] );
|
||||
rgba[1] = TextureToGamma( pal[i*3+1] );
|
||||
rgba[2] = TextureToGamma( pal[i*3+2] );
|
||||
rgba[3] = 0xFF;
|
||||
memcpy( &uirgba, rgba, sizeof( uirgba ));
|
||||
d_table[i] = uirgba;
|
||||
|
||||
@@ -50,7 +50,7 @@ static net_gai_state_t NET_GetMasterHostByName( master_t *m )
|
||||
if( res == NET_EAI_OK )
|
||||
return res;
|
||||
|
||||
m->adr.type = NA_UNUSED;
|
||||
m->adr.type = 0;
|
||||
if( res == NET_EAI_NONAME )
|
||||
Con_Reportf( "Can't resolve adr: %s\n", m->address );
|
||||
|
||||
@@ -266,7 +266,7 @@ static void NET_AddMaster( const char *addr, qboolean save )
|
||||
master->sent = false;
|
||||
master->save = save;
|
||||
master->next = NULL;
|
||||
master->adr.type = NA_UNUSED;
|
||||
master->adr.type = 0;
|
||||
|
||||
// link in
|
||||
if( last )
|
||||
@@ -322,7 +322,7 @@ static void NET_ListMasters_f( void )
|
||||
for( i = 1, list = ml.list; list; i++, list = list->next )
|
||||
{
|
||||
Msg( "%d\t%s", i, list->address );
|
||||
if( list->adr.type != NA_UNUSED )
|
||||
if( list->adr.type != 0 )
|
||||
Msg( "\t%s\n", NET_AdrToString( list->adr ));
|
||||
else Msg( "\n" );
|
||||
}
|
||||
|
||||
@@ -32,7 +32,6 @@ static const struct in6_addr in6addr_any;
|
||||
|
||||
#define NET_USE_FRAGMENTS
|
||||
|
||||
#define PORT_ANY -1
|
||||
#define MAX_LOOPBACK 4
|
||||
#define MASK_LOOPBACK (MAX_LOOPBACK - 1)
|
||||
|
||||
@@ -132,7 +131,7 @@ static CVAR_DEFINE_AUTO( net6_address, "0", FCVAR_PRIVILEGED|FCVAR_READ_ONLY, "c
|
||||
NET_ErrorString
|
||||
====================
|
||||
*/
|
||||
char *NET_ErrorString( void )
|
||||
static char *NET_ErrorString( void )
|
||||
{
|
||||
#if XASH_WIN32
|
||||
int err = WSANOTINITIALISED;
|
||||
@@ -226,34 +225,17 @@ _inline qboolean NET_IsSocketValid( int socket )
|
||||
|
||||
void NET_NetadrToIP6Bytes( uint8_t *ip6, const netadr_t *adr )
|
||||
{
|
||||
#if XASH_LITTLE_ENDIAN
|
||||
memcpy( ip6, adr->ip6, sizeof( adr->ip6 ));
|
||||
#elif XASH_BIG_ENDIAN
|
||||
memcpy( ip6, adr->ip6_0, sizeof( adr->ip6_0 ));
|
||||
memcpy( ip6 + sizeof( adr->ip6_0 ), adr->ip6_2, sizeof( adr->ip6_2 ));
|
||||
#endif
|
||||
}
|
||||
|
||||
void NET_IP6BytesToNetadr( netadr_t *adr, const uint8_t *ip6 )
|
||||
{
|
||||
#if XASH_LITTLE_ENDIAN
|
||||
memcpy( adr->ip6, ip6, sizeof( adr->ip6 ));
|
||||
#elif XASH_BIG_ENDIAN
|
||||
memcpy( adr->ip6_0, ip6, sizeof( adr->ip6_0 ));
|
||||
memcpy( adr->ip6_2, ip6 + sizeof( adr->ip6_0 ), sizeof( adr->ip6_2 ));
|
||||
#endif
|
||||
}
|
||||
|
||||
_inline int NET_NetadrIP6Compare( const netadr_t *a, const netadr_t *b )
|
||||
static int NET_NetadrIP6Compare( const netadr_t *a, const netadr_t *b )
|
||||
{
|
||||
#if XASH_LITTLE_ENDIAN
|
||||
return memcmp( a->ip6, b->ip6, sizeof( a->ip6 ));
|
||||
#elif XASH_BIG_ENDIAN
|
||||
int ret = memcmp( a->ip6_0, b->ip6_0, sizeof( a->ip6_0 ));
|
||||
if( !ret )
|
||||
return memcmp( a->ip6_2, b->ip6_2, sizeof( a->ip6_2 ));
|
||||
return ret;
|
||||
#endif
|
||||
}
|
||||
|
||||
/*
|
||||
|
||||
@@ -152,7 +152,7 @@ stream_t *FS_OpenStream( const char *filename )
|
||||
string path, loadname;
|
||||
qboolean anyformat = true;
|
||||
const streamfmt_t *format;
|
||||
stream_t *stream;
|
||||
stream_t *stream = NULL;
|
||||
|
||||
Sound_Reset(); // clear old streaminfo
|
||||
Q_strncpy( loadname, filename, sizeof( loadname ));
|
||||
@@ -188,9 +188,18 @@ stream_t *FS_OpenStream( const char *filename )
|
||||
}
|
||||
}
|
||||
|
||||
Con_Reportf( "FS_OpenStream: couldn't open \"%s\"\n", loadname );
|
||||
// compatibility with original Xash3D, try media/ folder
|
||||
if( Q_strncmp( filename, "media/", sizeof( "media/" ) - 1 ))
|
||||
{
|
||||
Q_snprintf( loadname, sizeof( loadname ), "media/%s", filename );
|
||||
stream = FS_OpenStream( loadname );
|
||||
}
|
||||
else
|
||||
{
|
||||
Con_Reportf( "%s: couldn't open \"%s\" or \"%s\"\n", __func__, filename + 6, filename );
|
||||
}
|
||||
|
||||
return NULL;
|
||||
return stream;
|
||||
}
|
||||
|
||||
/*
|
||||
|
||||
@@ -38,6 +38,7 @@ void Test_RunCvar( void );
|
||||
void Test_RunCon( void );
|
||||
void Test_RunVOX( void );
|
||||
void Test_RunIPFilter( void );
|
||||
void Test_RunGamma( void );
|
||||
|
||||
#define TEST_LIST_0 \
|
||||
Test_RunLibCommon(); \
|
||||
@@ -47,7 +48,8 @@ void Test_RunIPFilter( void );
|
||||
Test_RunIPFilter();
|
||||
|
||||
#define TEST_LIST_0_CLIENT \
|
||||
Test_RunCon();
|
||||
Test_RunCon(); \
|
||||
Test_RunGamma();
|
||||
|
||||
#define TEST_LIST_1 \
|
||||
Test_RunImagelib();
|
||||
|
||||
@@ -48,8 +48,6 @@ qboolean R_Init_Video( const int type )
|
||||
{
|
||||
qboolean retval;
|
||||
|
||||
VID_StartupGamma();
|
||||
|
||||
if( type != REF_SOFTWARE )
|
||||
return false; /// glide???
|
||||
|
||||
|
||||
@@ -51,8 +51,6 @@ qboolean R_Init_Video( const int type )
|
||||
string fbdev = DEFAULT_FBDEV;
|
||||
fb.fd = -1;
|
||||
|
||||
VID_StartupGamma();
|
||||
|
||||
if( type != REF_SOFTWARE )
|
||||
return false;
|
||||
|
||||
|
||||
@@ -843,13 +843,10 @@ qboolean VID_CreateWindow( int width, int height, window_mode_t window_mode )
|
||||
return false;
|
||||
GL_SetupAttributes(); // re-choose attributes
|
||||
}
|
||||
|
||||
VID_StartupGamma();
|
||||
}
|
||||
|
||||
if( !GL_UpdateContext( ))
|
||||
return false;
|
||||
|
||||
return false;
|
||||
}
|
||||
|
||||
#else // SDL_VERSION_ATLEAST( 2, 0, 0 )
|
||||
|
||||
@@ -42,7 +42,8 @@ GNU General Public License for more details.
|
||||
// 6. Removed timing from ref_globals_t.
|
||||
// Renderers are supposed to migrate to ref_client_t/ref_host_t using PARM_GET_CLIENT_PTR and PARM_GET_HOST_PTR
|
||||
// Removed functions to get internal engine structions. Use PARM_GET_*_PTR instead.
|
||||
#define REF_API_VERSION 6
|
||||
// 7. Gamma fixes.
|
||||
#define REF_API_VERSION 7
|
||||
|
||||
|
||||
#define TF_SKY (TF_SKYSIDE|TF_NOMIPMAP)
|
||||
@@ -404,9 +405,11 @@ typedef struct ref_api_s
|
||||
void (*SW_UnlockBuffer)( void );
|
||||
|
||||
// gamma
|
||||
void (*BuildGammaTable)( float lightgamma, float brightness );
|
||||
byte (*LightToTexGamma)( byte color ); // software gamma support
|
||||
qboolean (*R_DoResetGamma)( void );
|
||||
byte (*LightToTexGamma)( byte ); // software gamma support
|
||||
uint (*LightToTexGammaEx)( uint ); // software gamma support
|
||||
byte (*TextureToGamma)( byte );
|
||||
uint (*ScreenGammaTable)( uint );
|
||||
uint (*LinearGammaTable)( uint );
|
||||
|
||||
// renderapi
|
||||
lightstyle_t* (*GetLightStyle)( int number );
|
||||
@@ -463,6 +466,7 @@ typedef struct ref_interface_s
|
||||
void (*GL_ClearExtensions)( void );
|
||||
|
||||
// scene rendering
|
||||
void (*R_GammaChanged)( qboolean do_reset_gamma );
|
||||
void (*R_BeginFrame)( qboolean clearScene );
|
||||
void (*R_RenderScene)( void );
|
||||
void (*R_EndFrame)( void );
|
||||
@@ -651,6 +655,8 @@ typedef int (*REFAPI)( int version, ref_interface_t *pFunctionTable, ref_api_t*
|
||||
#define ENGINE_SHARED_CVAR_LIST( f ) \
|
||||
ENGINE_SHARED_CVAR_NAME( f, vid_gamma, gamma ) \
|
||||
ENGINE_SHARED_CVAR_NAME( f, vid_brightness, brightness ) \
|
||||
ENGINE_SHARED_CVAR_NAME( f, v_lightgamma, lightgamma ) \
|
||||
ENGINE_SHARED_CVAR_NAME( f, v_direct, direct ) \
|
||||
ENGINE_SHARED_CVAR( f, r_showtextures ) \
|
||||
ENGINE_SHARED_CVAR( f, r_speeds ) \
|
||||
ENGINE_SHARED_CVAR( f, r_fullbright ) \
|
||||
@@ -672,7 +678,6 @@ typedef int (*REFAPI)( int version, ref_interface_t *pFunctionTable, ref_api_t*
|
||||
ENGINE_SHARED_CVAR( f, r_sprite_lighting ) \
|
||||
ENGINE_SHARED_CVAR( f, r_drawviewmodel ) \
|
||||
ENGINE_SHARED_CVAR( f, r_glowshellfreq ) \
|
||||
ENGINE_SHARED_CVAR( f, r_lighting_modulate ) \
|
||||
|
||||
#define DECLARE_ENGINE_SHARED_CVAR_LIST() \
|
||||
ENGINE_SHARED_CVAR_LIST( DECLARE_ENGINE_SHARED_CVAR )
|
||||
|
||||
@@ -129,7 +129,6 @@ CVAR_DEFINE( public_server, "public", "0", 0, "change server type from private t
|
||||
CVAR_DEFINE_AUTO( sv_novis, "0", 0, "force to ignore server visibility" ); // disable server culling entities by vis
|
||||
CVAR_DEFINE( sv_pausable, "pausable", "1", FCVAR_SERVER, "allow players to pause or not" );
|
||||
static CVAR_DEFINE_AUTO( timeout, "125", FCVAR_SERVER, "connection timeout" ); // seconds without any message
|
||||
CVAR_DEFINE( sv_lighting_modulate, "r_lighting_modulate", "0.6", FCVAR_ARCHIVE, "lightstyles modulate scale" );
|
||||
CVAR_DEFINE( sv_maxclients, "maxplayers", "1", FCVAR_LATCH, "server max capacity" );
|
||||
CVAR_DEFINE_AUTO( sv_check_errors, "0", FCVAR_ARCHIVE, "check edicts for errors" );
|
||||
CVAR_DEFINE_AUTO( sv_reconnect_limit, "3", FCVAR_ARCHIVE, "max reconnect attempts" ); // minimum seconds between connect messages
|
||||
@@ -919,7 +918,6 @@ void SV_Init( void )
|
||||
Cvar_RegisterVariable( &sv_maxclients );
|
||||
Cvar_RegisterVariable( &sv_check_errors );
|
||||
Cvar_RegisterVariable( &public_server );
|
||||
Cvar_RegisterVariable( &sv_lighting_modulate );
|
||||
Cvar_RegisterVariable( &sv_reconnect_limit );
|
||||
Cvar_RegisterVariable( &sv_failuretime );
|
||||
Cvar_RegisterVariable( &sv_unlag );
|
||||
|
||||
@@ -1784,7 +1784,7 @@ static void SV_RunLightStyles( void )
|
||||
lightstyle_t *ls;
|
||||
float scale;
|
||||
|
||||
scale = sv_lighting_modulate.value;
|
||||
scale = 1.0f;
|
||||
|
||||
// run lightstyles animation
|
||||
for( i = 0, ls = sv.lightstyles; i < MAX_LIGHTSTYLES; i++, ls++ )
|
||||
|
||||
@@ -237,7 +237,7 @@ def build(bld):
|
||||
app_name = 'xash3d-fwgs'
|
||||
)
|
||||
else:
|
||||
if bld.env.SINGLE_BINARY:
|
||||
if bld.env.DISABLE_LAUNCHER:
|
||||
install_path = bld.env.BINDIR
|
||||
program = 'cxxprogram' if is_cxx_link else 'cprogram'
|
||||
if bld.env.STATIC:
|
||||
|
||||
@@ -822,9 +822,9 @@ void R_AliasDynamicLight( cl_entity_t *ent, alight_t *plight )
|
||||
{
|
||||
VectorSet( lightDir, mv->skyvec_x, mv->skyvec_y, mv->skyvec_z );
|
||||
|
||||
light.r = gEngfuncs.LightToTexGamma( bound( 0, mv->skycolor_r, 255 ));
|
||||
light.g = gEngfuncs.LightToTexGamma( bound( 0, mv->skycolor_g, 255 ));
|
||||
light.b = gEngfuncs.LightToTexGamma( bound( 0, mv->skycolor_b, 255 ));
|
||||
light.r = mv->skycolor_r;
|
||||
light.g = mv->skycolor_g;
|
||||
light.b = mv->skycolor_b;
|
||||
}
|
||||
}
|
||||
|
||||
@@ -907,9 +907,9 @@ void R_AliasDynamicLight( cl_entity_t *ent, alight_t *plight )
|
||||
|
||||
VectorAdd( lightDir, dist, lightDir );
|
||||
|
||||
finalLight[0] += gEngfuncs.LightToTexGamma( dl->color.r ) * ( add / 256.0f ) * 2.0f;
|
||||
finalLight[1] += gEngfuncs.LightToTexGamma( dl->color.g ) * ( add / 256.0f ) * 2.0f;
|
||||
finalLight[2] += gEngfuncs.LightToTexGamma( dl->color.b ) * ( add / 256.0f ) * 2.0f;
|
||||
finalLight[0] += dl->color.r * ( add / 256.0f );
|
||||
finalLight[1] += dl->color.g * ( add / 256.0f );
|
||||
finalLight[2] += dl->color.b * ( add / 256.0f );
|
||||
}
|
||||
}
|
||||
|
||||
@@ -991,9 +991,9 @@ void R_AliasLighting( float *lv, const vec3_t normal )
|
||||
illum -= g_alias.shadelight * lightcos;
|
||||
}
|
||||
|
||||
illum = Q_max( illum, 0.0f );
|
||||
illum = Q_min( illum, 255.0f );
|
||||
*lv = illum * (1.0f / 255.0f);
|
||||
illum = bound( 0.0f, illum, 255.0f );
|
||||
|
||||
*lv = gEngfuncs.LightToTexGammaEx( illum * 4 ) / 1023.0f;
|
||||
}
|
||||
|
||||
/*
|
||||
|
||||
@@ -560,8 +560,6 @@ qboolean VID_CubemapShot( const char *base, uint size, const float *vieworg, qbo
|
||||
// use client vieworg
|
||||
if( !vieworg ) vieworg = RI.vieworg;
|
||||
|
||||
R_CheckGamma();
|
||||
|
||||
for( i = 0; i < 6; i++ )
|
||||
{
|
||||
// go into 3d mode
|
||||
|
||||
@@ -372,6 +372,7 @@ ref_interface_t gReffuncs =
|
||||
GL_InitExtensions,
|
||||
GL_ClearExtensions,
|
||||
|
||||
R_GammaChanged,
|
||||
R_BeginFrame,
|
||||
R_RenderScene,
|
||||
R_EndFrame,
|
||||
|
||||
@@ -1250,12 +1250,6 @@ APIENTRY_LINKAGE void GL_FUNCTION( glClientActiveTextureARB )( GLenum );
|
||||
APIENTRY_LINKAGE void GL_FUNCTION( glGetCompressedTexImage )( GLenum target, GLint lod, const GLvoid* data );
|
||||
APIENTRY_LINKAGE void GL_FUNCTION( glDrawRangeElements )( GLenum mode, GLuint start, GLuint end, GLsizei count, GLenum type, const GLvoid *indices );
|
||||
APIENTRY_LINKAGE void GL_FUNCTION( glDrawRangeElementsEXT )( GLenum mode, GLuint start, GLuint end, GLsizei count, GLenum type, const GLvoid *indices );
|
||||
APIENTRY_LINKAGE void GL_FUNCTION( glDrawElements )(GLenum mode, GLsizei count, GLenum type, const GLvoid *indices);
|
||||
APIENTRY_LINKAGE void GL_FUNCTION( glVertexPointer )(GLint size, GLenum type, GLsizei stride, const GLvoid *ptr);
|
||||
APIENTRY_LINKAGE void GL_FUNCTION( glNormalPointer )(GLenum type, GLsizei stride, const GLvoid *ptr);
|
||||
APIENTRY_LINKAGE void GL_FUNCTION( glColorPointer )(GLint size, GLenum type, GLsizei stride, const GLvoid *ptr);
|
||||
APIENTRY_LINKAGE void GL_FUNCTION( glTexCoordPointer )(GLint size, GLenum type, GLsizei stride, const GLvoid *ptr);
|
||||
APIENTRY_LINKAGE void GL_FUNCTION( glArrayElement )(GLint i);
|
||||
APIENTRY_LINKAGE void GL_FUNCTION( glMultiTexCoord1f) (GLenum, GLfloat);
|
||||
APIENTRY_LINKAGE void GL_FUNCTION( glMultiTexCoord2f) (GLenum, GLfloat, GLfloat);
|
||||
APIENTRY_LINKAGE void GL_FUNCTION( glMultiTexCoord3f) (GLenum, GLfloat, GLfloat, GLfloat);
|
||||
@@ -1313,7 +1307,6 @@ APIENTRY_LINKAGE void GL_FUNCTION( glGetActiveUniformARB )(GLhandleARB programOb
|
||||
APIENTRY_LINKAGE void GL_FUNCTION( glGetUniformfvARB )(GLhandleARB programObj, GLint location, GLfloat *params);
|
||||
APIENTRY_LINKAGE void GL_FUNCTION( glGetUniformivARB )(GLhandleARB programObj, GLint location, GLint *params);
|
||||
APIENTRY_LINKAGE void GL_FUNCTION( glGetShaderSourceARB )(GLhandleARB obj, GLsizei maxLength, GLsizei *length, GLcharARB *source);
|
||||
APIENTRY_LINKAGE void GL_FUNCTION( glPolygonStipple )(const GLubyte *mask);
|
||||
APIENTRY_LINKAGE void GL_FUNCTION( glTexImage3D )( GLenum target, GLint level, GLenum internalFormat, GLsizei width, GLsizei height, GLsizei depth, GLint border, GLenum format, GLenum type, const GLvoid *pixels );
|
||||
APIENTRY_LINKAGE void GL_FUNCTION( glTexSubImage3D )( GLenum target, GLint level, GLint xoffset, GLint yoffset, GLint zoffset, GLsizei width, GLsizei height, GLsizei depth, GLenum format, GLenum type, const GLvoid *pixels );
|
||||
APIENTRY_LINKAGE void GL_FUNCTION( glCopyTexSubImage3D )( GLenum target, GLint level, GLint xoffset, GLint yoffset, GLint zoffset, GLint x, GLint y, GLsizei width, GLsizei height );
|
||||
@@ -1737,12 +1730,6 @@ APIENTRY_LINKAGE void GL_FUNCTION( glTexImage2DMultisample )(GLenum target, GLsi
|
||||
#define pglGetCompressedTexImage glGetCompressedTexImage
|
||||
#define pglDrawRangeElements glDrawRangeElements
|
||||
#define pglDrawRangeElementsEXT glDrawRangeElementsEXT
|
||||
#define pglDrawElements glDrawElements
|
||||
#define pglVertexPointer glVertexPointer
|
||||
#define pglNormalPointer glNormalPointer
|
||||
#define pglColorPointer glColorPointer
|
||||
#define pglTexCoordPointer glTexCoordPointer
|
||||
#define pglArrayElement glArrayElement
|
||||
#define pglMultiTexCoord1f glMultiTexCoord1f
|
||||
#define pglMultiTexCoord2f glMultiTexCoord2f
|
||||
#define pglMultiTexCoord3f glMultiTexCoord3f
|
||||
@@ -1800,7 +1787,6 @@ APIENTRY_LINKAGE void GL_FUNCTION( glTexImage2DMultisample )(GLenum target, GLsi
|
||||
#define pglGetUniformfvARB glGetUniformfvARB
|
||||
#define pglGetUniformivARB glGetUniformivARB
|
||||
#define pglGetShaderSourceARB glGetShaderSourceARB
|
||||
#define pglPolygonStipple glPolygonStipple
|
||||
#define pglTexImage3D glTexImage3D
|
||||
#define pglTexSubImage3D glTexSubImage3D
|
||||
#define pglCopyTexSubImage3D glCopyTexSubImage3D
|
||||
|
||||
@@ -76,7 +76,7 @@ extern poolhandle_t r_temppool;
|
||||
#define MAX_DRAW_STACK 2 // normal view and menu view
|
||||
|
||||
#define SHADEDOT_QUANT 16 // precalculated dot products for quantized angles
|
||||
#define SHADE_LAMBERT 1.495f
|
||||
#define SHADE_LAMBERT 1.4953241
|
||||
#define DEFAULT_ALPHATEST 0.0f
|
||||
|
||||
// refparams
|
||||
@@ -238,7 +238,6 @@ typedef struct
|
||||
int realframecount; // not including viewpasses
|
||||
int framecount;
|
||||
|
||||
qboolean ignore_lightgamma;
|
||||
qboolean fCustomRendering;
|
||||
qboolean fResetVis;
|
||||
qboolean fFlipViewModel;
|
||||
@@ -402,7 +401,6 @@ void R_AllowFog( qboolean allowed );
|
||||
qboolean R_OpaqueEntity( cl_entity_t *ent );
|
||||
void R_SetupFrustum( void );
|
||||
void R_FindViewLeaf( void );
|
||||
void R_CheckGamma( void );
|
||||
void R_PushScene( void );
|
||||
void R_PopScene( void );
|
||||
void R_DrawFog( void );
|
||||
@@ -529,11 +527,11 @@ void GL_SetupAttributes( int safegl );
|
||||
void GL_OnContextCreated( void );
|
||||
void GL_InitExtensions( void );
|
||||
void GL_ClearExtensions( void );
|
||||
void VID_CheckChanges( void );
|
||||
int GL_LoadTexture( const char *name, const byte *buf, size_t size, int flags );
|
||||
void GL_FreeImage( const char *name );
|
||||
qboolean VID_ScreenShot( const char *filename, int shot_type );
|
||||
qboolean VID_CubemapShot( const char *base, uint size, const float *vieworg, qboolean skyshot );
|
||||
void R_GammaChanged( qboolean do_reset_gamma );
|
||||
void R_BeginFrame( qboolean clearScene );
|
||||
void R_RenderFrame( const struct ref_viewpass_s *vp );
|
||||
void R_EndFrame( void );
|
||||
@@ -769,6 +767,7 @@ extern convar_t gl_nosort;
|
||||
extern convar_t gl_test; // cvar to testify new effects
|
||||
extern convar_t gl_msaa;
|
||||
extern convar_t gl_stencilbits;
|
||||
extern convar_t gl_overbright;
|
||||
|
||||
extern convar_t r_lighting_extended;
|
||||
extern convar_t r_lighting_ambient;
|
||||
|
||||
@@ -19,6 +19,7 @@ CVAR_DEFINE_AUTO( gl_nosort, "0", FCVAR_GLCONFIG, "disable sorting of translucen
|
||||
CVAR_DEFINE_AUTO( gl_test, "0", 0, "engine developer cvar for quick testing new features" );
|
||||
CVAR_DEFINE_AUTO( gl_msaa, "1", FCVAR_GLCONFIG, "enable or disable multisample anti-aliasing" );
|
||||
CVAR_DEFINE_AUTO( gl_stencilbits, "8", FCVAR_GLCONFIG|FCVAR_READ_ONLY, "pixelformat stencil bits (0 - auto)" );
|
||||
CVAR_DEFINE_AUTO( gl_overbright, "1", FCVAR_GLCONFIG, "overbrights" );
|
||||
CVAR_DEFINE_AUTO( r_lighting_extended, "1", FCVAR_GLCONFIG, "allow to get lighting from world and bmodels" );
|
||||
CVAR_DEFINE_AUTO( r_lighting_ambient, "0.3", FCVAR_GLCONFIG, "map ambient lighting scale" );
|
||||
CVAR_DEFINE_AUTO( r_detailtextures, "1", FCVAR_ARCHIVE, "enable detail textures support" );
|
||||
@@ -1203,6 +1204,7 @@ void GL_InitCommands( void )
|
||||
gEngfuncs.Cvar_RegisterVariable( &gl_msaa );
|
||||
gEngfuncs.Cvar_RegisterVariable( &gl_stencilbits );
|
||||
gEngfuncs.Cvar_RegisterVariable( &gl_round_down );
|
||||
gEngfuncs.Cvar_RegisterVariable( &gl_overbright );
|
||||
|
||||
// these cvar not used by engine but some mods requires this
|
||||
gEngfuncs.Cvar_RegisterVariable( &gl_polyoffset );
|
||||
|
||||
@@ -36,24 +36,24 @@ void CL_RunLightStyles( void )
|
||||
{
|
||||
int i, k, flight, clight;
|
||||
float l, lerpfrac, backlerp;
|
||||
float frametime = (gp_cl->time - gp_cl->oldtime);
|
||||
float scale;
|
||||
float frametime = (gp_cl->time - gp_cl->oldtime);
|
||||
lightstyle_t *ls;
|
||||
|
||||
if( !WORLDMODEL ) return;
|
||||
if( !WORLDMODEL )
|
||||
return;
|
||||
|
||||
scale = r_lighting_modulate->value;
|
||||
if( !WORLDMODEL->lightdata )
|
||||
{
|
||||
for( i = 0; i < MAX_LIGHTSTYLES; i++ )
|
||||
tr.lightstylevalue[i] = 256 * 256;
|
||||
return;
|
||||
}
|
||||
|
||||
// light animations
|
||||
// 'm' is normal light, 'a' is no light, 'z' is double bright
|
||||
for( i = 0; i < MAX_LIGHTSTYLES; i++ )
|
||||
{
|
||||
ls = gEngfuncs.GetLightStyle( i );
|
||||
if( !WORLDMODEL->lightdata )
|
||||
{
|
||||
tr.lightstylevalue[i] = 256 * 256;
|
||||
continue;
|
||||
}
|
||||
|
||||
if( !gp_cl->paused && frametime <= 0.1f )
|
||||
ls->time += frametime; // evaluate local time
|
||||
@@ -65,18 +65,18 @@ void CL_RunLightStyles( void )
|
||||
|
||||
if( !ls->length )
|
||||
{
|
||||
tr.lightstylevalue[i] = 256 * scale;
|
||||
tr.lightstylevalue[i] = 256;
|
||||
continue;
|
||||
}
|
||||
else if( ls->length == 1 )
|
||||
{
|
||||
// single length style so don't bother interpolating
|
||||
tr.lightstylevalue[i] = ls->map[0] * 22 * scale;
|
||||
tr.lightstylevalue[i] = ( ls->pattern[0] - 'a' ) * 22;
|
||||
continue;
|
||||
}
|
||||
else if( !ls->interp || !cl_lightstyle_lerping->flags )
|
||||
{
|
||||
tr.lightstylevalue[i] = ls->map[flight%ls->length] * 22 * scale;
|
||||
tr.lightstylevalue[i] = ( ls->pattern[flight%ls->length] - 'a' ) * 22;
|
||||
continue;
|
||||
}
|
||||
|
||||
@@ -89,7 +89,7 @@ void CL_RunLightStyles( void )
|
||||
k = ls->map[clight % ls->length];
|
||||
l += (float)( k * 22.0f ) * lerpfrac;
|
||||
|
||||
tr.lightstylevalue[i] = (int)l * scale;
|
||||
tr.lightstylevalue[i] = (int)l;
|
||||
}
|
||||
}
|
||||
|
||||
@@ -320,18 +320,10 @@ static qboolean R_RecursiveLightPoint( model_t *model, mnode_t *node, float p1f,
|
||||
{
|
||||
uint scale = tr.lightstylevalue[surf->styles[map]];
|
||||
|
||||
if( tr.ignore_lightgamma )
|
||||
{
|
||||
cv->r += lm->r * scale;
|
||||
cv->g += lm->g * scale;
|
||||
cv->b += lm->b * scale;
|
||||
}
|
||||
else
|
||||
{
|
||||
cv->r += gEngfuncs.LightToTexGamma( lm->r ) * scale;
|
||||
cv->g += gEngfuncs.LightToTexGamma( lm->g ) * scale;
|
||||
cv->b += gEngfuncs.LightToTexGamma( lm->b ) * scale;
|
||||
}
|
||||
cv->r += lm->r * scale;
|
||||
cv->g += lm->g * scale;
|
||||
cv->b += lm->b * scale;
|
||||
|
||||
lm += size; // skip to next lightmap
|
||||
|
||||
if( dm != NULL )
|
||||
@@ -418,9 +410,10 @@ colorVec R_LightVecInternal( const vec3_t start, const vec3_t end, vec3_t lspot,
|
||||
{
|
||||
if( lspot ) VectorCopy( g_trace_lightspot, lspot );
|
||||
if( lvec ) VectorNormalize2( g_trace_lightvec, lvec );
|
||||
light.r = Q_min(( cv.r >> 7 ), 255 );
|
||||
light.g = Q_min(( cv.g >> 7 ), 255 );
|
||||
light.b = Q_min(( cv.b >> 7 ), 255 );
|
||||
|
||||
light.r = Q_min(( cv.r >> 8 ), 255 );
|
||||
light.g = Q_min(( cv.g >> 8 ), 255 );
|
||||
light.b = Q_min(( cv.b >> 8 ), 255 );
|
||||
last_fraction = g_trace_fraction;
|
||||
|
||||
if(( light.r + light.g + light.b ) != 0 )
|
||||
|
||||
@@ -985,31 +985,42 @@ void R_RenderScene( void )
|
||||
R_EndGL();
|
||||
}
|
||||
|
||||
/*
|
||||
===============
|
||||
R_CheckGamma
|
||||
===============
|
||||
*/
|
||||
void R_CheckGamma( void )
|
||||
void R_GammaChanged( qboolean do_reset_gamma )
|
||||
{
|
||||
if( gEngfuncs.R_DoResetGamma( ))
|
||||
if( do_reset_gamma )
|
||||
{
|
||||
// paranoia cubemaps uses this
|
||||
gEngfuncs.BuildGammaTable( 1.8f, 0.0f );
|
||||
|
||||
// paranoia cubemap rendering
|
||||
if( gEngfuncs.drawFuncs->GL_BuildLightmaps )
|
||||
gEngfuncs.drawFuncs->GL_BuildLightmaps( );
|
||||
}
|
||||
else if( FBitSet( vid_gamma->flags, FCVAR_CHANGED ) || FBitSet( vid_brightness->flags, FCVAR_CHANGED ))
|
||||
else
|
||||
{
|
||||
gEngfuncs.BuildGammaTable( vid_gamma->value, vid_brightness->value );
|
||||
glConfig.softwareGammaUpdate = true;
|
||||
GL_RebuildLightmaps();
|
||||
glConfig.softwareGammaUpdate = false;
|
||||
}
|
||||
}
|
||||
|
||||
static void R_CheckGamma( void )
|
||||
{
|
||||
qboolean rebuild = false;
|
||||
|
||||
if( FBitSet( gl_overbright.flags, FCVAR_CHANGED ))
|
||||
{
|
||||
rebuild = true;
|
||||
ClearBits( gl_overbright.flags, FCVAR_CHANGED );
|
||||
}
|
||||
|
||||
if( gl_overbright.value && FBitSet( r_vbo.flags, FCVAR_CHANGED ))
|
||||
{
|
||||
rebuild = true;
|
||||
ClearBits( r_vbo.flags, FCVAR_CHANGED );
|
||||
}
|
||||
|
||||
if( rebuild )
|
||||
R_GammaChanged( false );
|
||||
}
|
||||
|
||||
/*
|
||||
===============
|
||||
R_BeginFrame
|
||||
|
||||
@@ -91,9 +91,7 @@ void CL_DrawParticles( double frametime, particle_t *cl_active_particles, float
|
||||
if( alpha > 255 || p->type == pt_static )
|
||||
alpha = 255;
|
||||
|
||||
pglColor4ub( gEngfuncs.LightToTexGamma( color.r ),
|
||||
gEngfuncs.LightToTexGamma( color.g ),
|
||||
gEngfuncs.LightToTexGamma( color.b ), alpha );
|
||||
pglColor4ub( color.r, color.g, color.b, alpha );
|
||||
|
||||
pglTexCoord2f( 0.0f, 1.0f );
|
||||
pglVertex3f( p->org[0] - right[0] + up[0], p->org[1] - right[1] + up[1], p->org[2] - right[2] + up[2] );
|
||||
@@ -192,6 +190,8 @@ void CL_DrawTracers( double frametime, particle_t *cl_active_tracers )
|
||||
scale = 1.0 - (frametime * 0.9);
|
||||
if( scale < 0.0f ) scale = 0.0f;
|
||||
|
||||
pglBegin( GL_QUADS );
|
||||
|
||||
for( p = cl_active_tracers; p; p = p->next )
|
||||
{
|
||||
atten = (p->die - gp_cl->time);
|
||||
@@ -238,7 +238,6 @@ void CL_DrawTracers( double frametime, particle_t *cl_active_tracers )
|
||||
color = gTracerColors[p->color];
|
||||
pglColor4ub( color.r, color.g, color.b, p->packedColor );
|
||||
|
||||
pglBegin( GL_QUADS );
|
||||
pglTexCoord2f( 0.0f, 0.8f );
|
||||
pglVertex3fv( verts[2] );
|
||||
pglTexCoord2f( 1.0f, 0.8f );
|
||||
@@ -247,7 +246,6 @@ void CL_DrawTracers( double frametime, particle_t *cl_active_tracers )
|
||||
pglVertex3fv( verts[1] );
|
||||
pglTexCoord2f( 0.0f, 0.0f );
|
||||
pglVertex3fv( verts[0] );
|
||||
pglEnd();
|
||||
}
|
||||
|
||||
// evaluate position
|
||||
@@ -267,6 +265,7 @@ void CL_DrawTracers( double frametime, particle_t *cl_active_tracers )
|
||||
p->vel[2] = gravity * 0.05f;
|
||||
}
|
||||
}
|
||||
pglEnd();
|
||||
|
||||
pglDepthMask( GL_TRUE );
|
||||
}
|
||||
|
||||
@@ -224,10 +224,9 @@ every render pass applies new fog layer, resulting in wrong fog color
|
||||
recalculate fog color for current pass count
|
||||
===============================
|
||||
*/
|
||||
|
||||
void GL_SetupFogColorForSurfacesEx( int passes, float density )
|
||||
void GL_SetupFogColorForSurfacesEx( int passes, float density, qboolean blend_lightmaps )
|
||||
{
|
||||
vec3_t fogColor;
|
||||
vec4_t fogColor;
|
||||
float factor, div;
|
||||
|
||||
if( !glState.isFogEnabled )
|
||||
@@ -244,6 +243,13 @@ void GL_SetupFogColorForSurfacesEx( int passes, float density )
|
||||
fogColor[0] = pow( RI.fogColor[0] / div, ( 1.0f / factor ));
|
||||
fogColor[1] = pow( RI.fogColor[1] / div, ( 1.0f / factor ));
|
||||
fogColor[2] = pow( RI.fogColor[2] / div, ( 1.0f / factor ));
|
||||
fogColor[3] = 1.0f; // ignored but GL_FOG_COLOR requires vec4_t
|
||||
|
||||
// because of enabled blending in R_BlendLightmaps, need to scale down fog color
|
||||
// but only during lightmap blending & without VBO (it takes another route)
|
||||
if( blend_lightmaps && gl_overbright.value )
|
||||
VectorScale( fogColor, 0.5f, fogColor );
|
||||
|
||||
pglFogfv( GL_FOG_COLOR, fogColor );
|
||||
pglFogf( GL_FOG_DENSITY, RI.fogDensity * density );
|
||||
}
|
||||
@@ -251,7 +257,7 @@ void GL_SetupFogColorForSurfacesEx( int passes, float density )
|
||||
|
||||
void GL_SetupFogColorForSurfaces( void )
|
||||
{
|
||||
GL_SetupFogColorForSurfacesEx( r_detailtextures.value ? 3 : 2, 1.0f );
|
||||
GL_SetupFogColorForSurfacesEx( r_detailtextures.value ? 3 : 2, 1.0f, false );
|
||||
}
|
||||
|
||||
void GL_ResetFogColor( void )
|
||||
@@ -600,9 +606,9 @@ void R_AddDynamicLights( msurface_t *surf )
|
||||
|
||||
if( dist < minlight )
|
||||
{
|
||||
bl[0] += ((int)((rad - dist) * 256) * gEngfuncs.LightToTexGamma( dl->color.r )) / 256;
|
||||
bl[1] += ((int)((rad - dist) * 256) * gEngfuncs.LightToTexGamma( dl->color.g )) / 256;
|
||||
bl[2] += ((int)((rad - dist) * 256) * gEngfuncs.LightToTexGamma( dl->color.b )) / 256;
|
||||
bl[0] += ((int)((rad - dist) * 256) * dl->color.r ) / 256;
|
||||
bl[1] += ((int)((rad - dist) * 256) * dl->color.g ) / 256;
|
||||
bl[2] += ((int)((rad - dist) * 256) * dl->color.b ) / 256;
|
||||
}
|
||||
}
|
||||
}
|
||||
@@ -742,11 +748,15 @@ static void R_BuildLightMap( msurface_t *surf, byte *dest, int stride, qboolean
|
||||
int sample_size;
|
||||
mextrasurf_t *info = surf->info;
|
||||
color24 *lm;
|
||||
int lightscale;
|
||||
|
||||
sample_size = gEngfuncs.Mod_SampleSizeForFace( surf );
|
||||
smax = ( info->lightextents[0] / sample_size ) + 1;
|
||||
tmax = ( info->lightextents[1] / sample_size ) + 1;
|
||||
size = smax * tmax;
|
||||
if( gl_overbright.value )
|
||||
lightscale = r_vbo.value ? 171 : 256;
|
||||
else lightscale = ( pow( 2.0f, 1.0f / v_lightgamma->value ) * 256 ) + 0.5;
|
||||
|
||||
lm = surf->samples;
|
||||
|
||||
@@ -759,9 +769,9 @@ static void R_BuildLightMap( msurface_t *surf, byte *dest, int stride, qboolean
|
||||
|
||||
for( i = 0, bl = r_blocklights; i < size; i++, bl += 3, lm++ )
|
||||
{
|
||||
bl[0] += gEngfuncs.LightToTexGamma( lm->r ) * scale;
|
||||
bl[1] += gEngfuncs.LightToTexGamma( lm->g ) * scale;
|
||||
bl[2] += gEngfuncs.LightToTexGamma( lm->b ) * scale;
|
||||
bl[0] += lm->r * scale;
|
||||
bl[1] += lm->g * scale;
|
||||
bl[2] += lm->b * scale;
|
||||
}
|
||||
}
|
||||
|
||||
@@ -777,9 +787,16 @@ static void R_BuildLightMap( msurface_t *surf, byte *dest, int stride, qboolean
|
||||
{
|
||||
for( s = 0; s < smax; s++ )
|
||||
{
|
||||
dest[0] = Q_min((bl[0] >> 7), 255 );
|
||||
dest[1] = Q_min((bl[1] >> 7), 255 );
|
||||
dest[2] = Q_min((bl[2] >> 7), 255 );
|
||||
int i;
|
||||
for( i = 0; i < 3; i++ )
|
||||
{
|
||||
int t = bl[i] * lightscale >> 14;
|
||||
|
||||
if( t > 1023 )
|
||||
t = 1023;
|
||||
|
||||
dest[i] = gEngfuncs.LightToTexGammaEx( t ) >> 2;
|
||||
}
|
||||
dest[3] = 255;
|
||||
|
||||
bl += 3;
|
||||
@@ -933,7 +950,7 @@ void R_BlendLightmaps( void )
|
||||
if( !R_HasLightmap() )
|
||||
return;
|
||||
|
||||
GL_SetupFogColorForSurfaces ();
|
||||
GL_SetupFogColorForSurfacesEx( r_detailtextures.value ? 3 : 2, 1.0f, true );
|
||||
|
||||
if( !r_lightmap->value )
|
||||
pglEnable( GL_BLEND );
|
||||
@@ -944,7 +961,15 @@ void R_BlendLightmaps( void )
|
||||
pglDepthFunc( GL_EQUAL );
|
||||
|
||||
pglDisable( GL_ALPHA_TEST );
|
||||
pglBlendFunc( GL_ZERO, GL_SRC_COLOR );
|
||||
if( gl_overbright.value )
|
||||
{
|
||||
pglBlendFunc( GL_DST_COLOR, GL_SRC_COLOR );
|
||||
pglColor4f( 128.0f / 192.0f, 128.0f / 192.0f, 128.0f / 192.0f, 1.0f );
|
||||
}
|
||||
else
|
||||
{
|
||||
pglBlendFunc( GL_ZERO, GL_SRC_COLOR );
|
||||
}
|
||||
pglTexEnvi( GL_TEXTURE_ENV, GL_TEXTURE_ENV_MODE, GL_MODULATE );
|
||||
|
||||
// render static lightmaps first
|
||||
@@ -1103,7 +1128,7 @@ void R_RenderDetails( int passes )
|
||||
if( !draw_details )
|
||||
return;
|
||||
|
||||
GL_SetupFogColorForSurfacesEx( passes, passes == 2 ? 0.5f : 1.0f );
|
||||
GL_SetupFogColorForSurfacesEx( passes, passes == 2 ? 0.5f : 1.0f, false );
|
||||
|
||||
pglEnable( GL_BLEND );
|
||||
pglBlendFunc( GL_DST_COLOR, GL_SRC_COLOR );
|
||||
@@ -2198,17 +2223,22 @@ static void R_SetLightmap( void )
|
||||
if( mtst.skiptexture )
|
||||
return;
|
||||
|
||||
/*if( gl_overbright->integer )
|
||||
if( gl_overbright.value )
|
||||
{
|
||||
// GLfloat color[4] = { 128.0f / 192.0f, 128.0f / 192.0f, 128.0f / 192.0f, 1.0f };
|
||||
|
||||
pglTexEnvi( GL_TEXTURE_ENV, GL_TEXTURE_ENV_MODE, GL_COMBINE_ARB );
|
||||
pglTexEnvi( GL_TEXTURE_ENV, GL_COMBINE_RGB_ARB, GL_MODULATE );
|
||||
pglTexEnvi( GL_TEXTURE_ENV, GL_SOURCE0_RGB_ARB, GL_PREVIOUS_ARB );
|
||||
pglTexEnvi( GL_TEXTURE_ENV, GL_SOURCE1_RGB_ARB, GL_TEXTURE );
|
||||
pglTexEnvi( GL_TEXTURE_ENV, GL_RGB_SCALE_ARB, 2 );
|
||||
|
||||
// doesn't work here for some reason
|
||||
// pglTexEnvfv( GL_TEXTURE_ENV, GL_TEXTURE_ENV_COLOR, color );
|
||||
}
|
||||
else*/
|
||||
else
|
||||
{
|
||||
pglTexEnvi( GL_TEXTURE_ENV, GL_TEXTURE_ENV_MODE, GL_MODULATE );
|
||||
}
|
||||
pglTexCoordPointer( 2, GL_FLOAT, sizeof( vbovertex_t ), (void*)offsetof(vbovertex_t, lm_tc ) );
|
||||
}
|
||||
|
||||
@@ -2963,7 +2993,7 @@ void R_ClearVBOState( qboolean drawlightmap, qboolean drawtextures )
|
||||
if( drawlightmap )
|
||||
{
|
||||
// reset states
|
||||
GL_SelectTexture( XASH_TEXTURE1 );
|
||||
GL_Bind( XASH_TEXTURE1, tr.defaultTexture ); // force reset tmu in case we have only one lightmap
|
||||
pglDisableClientState( GL_TEXTURE_COORD_ARRAY );
|
||||
pglDisable( GL_TEXTURE_2D );
|
||||
if( drawtextures )
|
||||
@@ -3005,7 +3035,7 @@ void R_DrawVBO( qboolean drawlightmap, qboolean drawtextures )
|
||||
if( !r_vbo.value )
|
||||
return;
|
||||
|
||||
GL_SetupFogColorForSurfacesEx( 1, 0.5f );
|
||||
GL_SetupFogColorForSurfacesEx( 1, 0.5f, false );
|
||||
|
||||
R_SetupVBOArrayStatic( vbo, drawlightmap, drawtextures );
|
||||
mtst.skiptexture = !drawtextures;
|
||||
@@ -3756,9 +3786,6 @@ void GL_RebuildLightmaps( void )
|
||||
if( !ENGINE_GET_PARM( PARM_CLIENT_ACTIVE ) )
|
||||
return; // wait for worldmodel
|
||||
|
||||
ClearBits( vid_brightness->flags, FCVAR_CHANGED );
|
||||
ClearBits( vid_gamma->flags, FCVAR_CHANGED );
|
||||
|
||||
// release old lightmaps
|
||||
for( i = 0; i < MAX_LIGHTMAPS; i++ )
|
||||
{
|
||||
@@ -3874,10 +3901,6 @@ void GL_BuildLightmaps( void )
|
||||
// build lightmaps on the client-side
|
||||
gEngfuncs.drawFuncs->GL_BuildLightmaps( );
|
||||
}
|
||||
|
||||
// now gamma and brightness are valid
|
||||
ClearBits( vid_brightness->flags, FCVAR_CHANGED );
|
||||
ClearBits( vid_gamma->flags, FCVAR_CHANGED );
|
||||
}
|
||||
|
||||
void GL_InitRandomTable( void )
|
||||
|
||||
@@ -103,7 +103,7 @@ typedef struct
|
||||
int numlocallights;
|
||||
int lightage[MAXSTUDIOBONES];
|
||||
dlight_t *locallight[MAX_LOCALLIGHTS];
|
||||
color24 locallightcolor[MAX_LOCALLIGHTS];
|
||||
int locallightcolor[MAX_LOCALLIGHTS][3];
|
||||
vec4_t lightpos[MAXSTUDIOVERTS][MAX_LOCALLIGHTS];
|
||||
vec3_t lightbonepos[MAXSTUDIOBONES][MAX_LOCALLIGHTS];
|
||||
float locallightR2[MAX_LOCALLIGHTS];
|
||||
@@ -1381,13 +1381,13 @@ void R_StudioDynamicLight( cl_entity_t *ent, alight_t *plight )
|
||||
{
|
||||
VectorSet( lightDir, mv->skyvec_x, mv->skyvec_y, mv->skyvec_z );
|
||||
|
||||
light.r = gEngfuncs.LightToTexGamma( bound( 0, mv->skycolor_r, 255 ));
|
||||
light.g = gEngfuncs.LightToTexGamma( bound( 0, mv->skycolor_g, 255 ));
|
||||
light.b = gEngfuncs.LightToTexGamma( bound( 0, mv->skycolor_b, 255 ));
|
||||
light.r = mv->skycolor_r;
|
||||
light.g = mv->skycolor_g;
|
||||
light.b = mv->skycolor_b;
|
||||
}
|
||||
}
|
||||
|
||||
if(( light.r + light.g + light.b ) < 16 ) // TESTTEST
|
||||
if(( light.r + light.g + light.b ) == 0 )
|
||||
{
|
||||
colorVec gcolor;
|
||||
float grad[4];
|
||||
@@ -1435,6 +1435,13 @@ void R_StudioDynamicLight( cl_entity_t *ent, alight_t *plight )
|
||||
}
|
||||
}
|
||||
|
||||
if( ent->curstate.renderfx == kRenderFxLightMultiplier && ent->curstate.iuser4 != 10 )
|
||||
{
|
||||
light.r *= ent->curstate.iuser4 / 10.0f;
|
||||
light.g *= ent->curstate.iuser4 / 10.0f;
|
||||
light.b *= ent->curstate.iuser4 / 10.0f;
|
||||
}
|
||||
|
||||
VectorSet( finalLight, light.r, light.g, light.b );
|
||||
ent->cvFloorColor = light;
|
||||
|
||||
@@ -1466,15 +1473,15 @@ void R_StudioDynamicLight( cl_entity_t *ent, alight_t *plight )
|
||||
|
||||
VectorAdd( lightDir, dist, lightDir );
|
||||
|
||||
finalLight[0] += gEngfuncs.LightToTexGamma( dl->color.r ) * ( add / 256.0f ) * 2.0f;
|
||||
finalLight[1] += gEngfuncs.LightToTexGamma( dl->color.g ) * ( add / 256.0f ) * 2.0f;
|
||||
finalLight[2] += gEngfuncs.LightToTexGamma( dl->color.b ) * ( add / 256.0f ) * 2.0f;
|
||||
finalLight[0] += dl->color.r * ( add / 256.0f );
|
||||
finalLight[1] += dl->color.g * ( add / 256.0f );
|
||||
finalLight[2] += dl->color.b * ( add / 256.0f );
|
||||
}
|
||||
}
|
||||
|
||||
if( FBitSet( ent->model->flags, STUDIO_AMBIENT_LIGHT ))
|
||||
add = 0.6f;
|
||||
else add = 0.9f;
|
||||
else add = bound( 0.75f, v_direct->value, 1.0f );
|
||||
|
||||
VectorScale( lightDir, add, lightDir );
|
||||
|
||||
@@ -1568,9 +1575,9 @@ void R_StudioEntityLight( alight_t *lightinfo )
|
||||
|
||||
if( k != -1 )
|
||||
{
|
||||
g_studio.locallightcolor[k].r = gEngfuncs.LightToTexGamma( el->color.r );
|
||||
g_studio.locallightcolor[k].g = gEngfuncs.LightToTexGamma( el->color.g );
|
||||
g_studio.locallightcolor[k].b = gEngfuncs.LightToTexGamma( el->color.b );
|
||||
g_studio.locallightcolor[k][0] = gEngfuncs.LinearGammaTable( el->color.r << 2 );
|
||||
g_studio.locallightcolor[k][1] = gEngfuncs.LinearGammaTable( el->color.g << 2 );
|
||||
g_studio.locallightcolor[k][2] = gEngfuncs.LinearGammaTable( el->color.b << 2 );
|
||||
g_studio.locallightR2[k] = r2;
|
||||
g_studio.locallight[k] = el;
|
||||
lstrength[k] = minstrength;
|
||||
@@ -1665,7 +1672,8 @@ void R_StudioLighting( float *lv, int bone, int flags, vec3_t normal )
|
||||
}
|
||||
|
||||
illum = Q_min( illum, 255.0f );
|
||||
*lv = illum * (1.0f / 255.0f);
|
||||
|
||||
*lv = gEngfuncs.LightToTexGammaEx( illum * 4 ) / 1023.0f;
|
||||
}
|
||||
|
||||
/*
|
||||
@@ -1685,7 +1693,7 @@ static void R_LightLambert( vec4_t light[MAX_LOCALLIGHTS], const vec3_t normal,
|
||||
return;
|
||||
}
|
||||
|
||||
VectorCopy( color, finalLight );
|
||||
VectorSet( finalLight, 0, 0, 0 );
|
||||
|
||||
for( i = 0; i < g_studio.numlocallights; i++ )
|
||||
{
|
||||
@@ -1709,21 +1717,29 @@ static void R_LightLambert( vec4_t light[MAX_LOCALLIGHTS], const vec3_t normal,
|
||||
else light[i][3] = 0.0001f;
|
||||
}
|
||||
|
||||
temp = Q_min( r * light[i][3] / 255.0f, 1.0f );
|
||||
|
||||
localLight[0] = (float)g_studio.locallightcolor[i].r * temp;
|
||||
localLight[1] = (float)g_studio.locallightcolor[i].g * temp;
|
||||
localLight[2] = (float)g_studio.locallightcolor[i].b * temp;
|
||||
temp = r * light[i][3];
|
||||
|
||||
VectorAddScalar( g_studio.locallightcolor[i], temp, localLight );
|
||||
VectorAdd( finalLight, localLight, finalLight );
|
||||
}
|
||||
}
|
||||
|
||||
VectorScale( finalLight, 255.0f, finalLight );
|
||||
if( !VectorIsNull( finalLight ))
|
||||
{
|
||||
for( i = 0; i < 3; i++ )
|
||||
{
|
||||
float c = finalLight[i] + gEngfuncs.LinearGammaTable( color[i] * 1023.0f );
|
||||
|
||||
out[0] = Q_min( (int)( finalLight[0] ), 255 );
|
||||
out[1] = Q_min( (int)( finalLight[1] ), 255 );
|
||||
out[2] = Q_min( (int)( finalLight[2] ), 255 );
|
||||
if( c > 1023.0f )
|
||||
out[i] = 255;
|
||||
else
|
||||
out[i] = gEngfuncs.ScreenGammaTable( c ) >> 2;
|
||||
}
|
||||
}
|
||||
else
|
||||
{
|
||||
VectorScale( color, 255.0f, out );
|
||||
}
|
||||
}
|
||||
|
||||
static void R_StudioSetColorArray( short *ptricmds, vec3_t *pstudionorms, byte *color )
|
||||
@@ -3645,9 +3661,7 @@ void R_GatherPlayerLight( void )
|
||||
cl_entity_t *view = tr.viewent;
|
||||
colorVec c;
|
||||
|
||||
tr.ignore_lightgamma = true;
|
||||
c = R_LightPoint( view->origin );
|
||||
tr.ignore_lightgamma = false;
|
||||
gEngfuncs.SetLocalLightLevel( ( c.r + c.g + c.b ) / 3 );
|
||||
}
|
||||
|
||||
|
||||
@@ -883,6 +883,10 @@ void R_InitRipples( void )
|
||||
memset( pic.buffer, 0, pic.size );
|
||||
|
||||
g_ripple.rippletexturenum = GL_LoadTextureInternal( "*rippletex", &pic, TF_NOMIPMAP );
|
||||
|
||||
// need to set proper tex params for TF_NOMIPMAP texture,
|
||||
// as during upload it fails TF_NEAREST check and gets blurry even with gl_texture_nearest 1
|
||||
R_UpdateRippleTexParams();
|
||||
}
|
||||
|
||||
static void R_SwapBufs( void )
|
||||
|
||||
@@ -418,6 +418,7 @@ ref_interface_t gReffuncs =
|
||||
GL_InitExtensions,
|
||||
GL_ClearExtensions,
|
||||
|
||||
R_GammaChanged,
|
||||
R_BeginFrame,
|
||||
R_RenderScene,
|
||||
R_EndFrame,
|
||||
|
||||
@@ -40,23 +40,23 @@ void GAME_EXPORT CL_RunLightStyles( void )
|
||||
int i, k, flight, clight;
|
||||
float l, lerpfrac, backlerp;
|
||||
float frametime = (gp_cl->time - gp_cl->oldtime);
|
||||
float scale;
|
||||
lightstyle_t *ls;
|
||||
|
||||
if( !WORLDMODEL ) return;
|
||||
if( !WORLDMODEL )
|
||||
return;
|
||||
|
||||
scale = 1; //r_lighting_modulate->value;
|
||||
if( !WORLDMODEL->lightdata )
|
||||
{
|
||||
for( i = 0; i < MAX_LIGHTSTYLES; i++ )
|
||||
tr.lightstylevalue[i] = 256 * 256;
|
||||
return;
|
||||
}
|
||||
|
||||
// light animations
|
||||
// 'm' is normal light, 'a' is no light, 'z' is double bright
|
||||
for( i = 0; i < MAX_LIGHTSTYLES; i++ )
|
||||
{
|
||||
ls = gEngfuncs.GetLightStyle( i );
|
||||
if( !WORLDMODEL->lightdata )
|
||||
{
|
||||
tr.lightstylevalue[i] = 256 * 256;
|
||||
continue;
|
||||
}
|
||||
|
||||
if( !gp_cl->paused && frametime <= 0.1f )
|
||||
ls->time += frametime; // evaluate local time
|
||||
@@ -68,18 +68,18 @@ void GAME_EXPORT CL_RunLightStyles( void )
|
||||
|
||||
if( !ls->length )
|
||||
{
|
||||
tr.lightstylevalue[i] = 256 * scale;
|
||||
tr.lightstylevalue[i] = 256;
|
||||
continue;
|
||||
}
|
||||
else if( ls->length == 1 )
|
||||
{
|
||||
// single length style so don't bother interpolating
|
||||
tr.lightstylevalue[i] = ls->map[0] * 22 * scale;
|
||||
tr.lightstylevalue[i] = ( ls->pattern[0] - 'a' ) * 22;
|
||||
continue;
|
||||
}
|
||||
else if( !ls->interp ) // || !CVAR_TO_BOOL( cl_lightstyle_lerping ))
|
||||
{
|
||||
tr.lightstylevalue[i] = ls->map[flight%ls->length] * 22 * scale;
|
||||
tr.lightstylevalue[i] = ( ls->pattern[flight%ls->length] - 'a' ) * 22;
|
||||
continue;
|
||||
}
|
||||
|
||||
@@ -92,7 +92,7 @@ void GAME_EXPORT CL_RunLightStyles( void )
|
||||
k = ls->map[clight % ls->length];
|
||||
l += (float)( k * 22.0f ) * lerpfrac;
|
||||
|
||||
tr.lightstylevalue[i] = (int)l * scale;
|
||||
tr.lightstylevalue[i] = (int)l;
|
||||
}
|
||||
}
|
||||
|
||||
@@ -323,18 +323,10 @@ static qboolean R_RecursiveLightPoint( model_t *model, mnode_t *node, float p1f,
|
||||
{
|
||||
uint scale = tr.lightstylevalue[surf->styles[map]];
|
||||
|
||||
if( tr.ignore_lightgamma )
|
||||
{
|
||||
cv->r += lm->r * scale * 2.5; // scale;
|
||||
cv->g += lm->g * scale * 2.5; // scale;
|
||||
cv->b += lm->b * scale * 2.5; // scale;
|
||||
}
|
||||
else
|
||||
{
|
||||
cv->r += gEngfuncs.LightToTexGamma( lm->r ) * scale;
|
||||
cv->g += gEngfuncs.LightToTexGamma( lm->g ) * scale;
|
||||
cv->b += gEngfuncs.LightToTexGamma( lm->b ) * scale;
|
||||
}
|
||||
cv->r += lm->r * scale;
|
||||
cv->g += lm->g * scale;
|
||||
cv->b += lm->b * scale;
|
||||
|
||||
lm += size; // skip to next lightmap
|
||||
|
||||
if( dm != NULL )
|
||||
@@ -421,9 +413,9 @@ colorVec R_LightVecInternal( const vec3_t start, const vec3_t end, vec3_t lspot,
|
||||
{
|
||||
if( lspot ) VectorCopy( g_trace_lightspot, lspot );
|
||||
if( lvec ) VectorNormalize2( g_trace_lightvec, lvec );
|
||||
light.r = Q_min(( cv.r >> 7 ), 255 );
|
||||
light.g = Q_min(( cv.g >> 7 ), 255 );
|
||||
light.b = Q_min(( cv.b >> 7 ), 255 );
|
||||
light.r = Q_min(( cv.r >> 8 ), 255 );
|
||||
light.g = Q_min(( cv.g >> 8 ), 255 );
|
||||
light.b = Q_min(( cv.b >> 8 ), 255 );
|
||||
last_fraction = g_trace_fraction;
|
||||
|
||||
if(( light.r + light.g + light.b ) != 0 )
|
||||
|
||||
@@ -66,7 +66,7 @@ extern poolhandle_t r_temppool;
|
||||
#define MAX_DRAW_STACK 2 // normal view and menu view
|
||||
|
||||
#define SHADEDOT_QUANT 16 // precalculated dot products for quantized angles
|
||||
#define SHADE_LAMBERT 1.495f
|
||||
#define SHADE_LAMBERT 1.4953241
|
||||
#define DEFAULT_ALPHATEST 0.0f
|
||||
|
||||
// refparams
|
||||
@@ -270,7 +270,6 @@ typedef struct
|
||||
int realframecount; // not including viewpasses
|
||||
int framecount;
|
||||
|
||||
qboolean ignore_lightgamma;
|
||||
qboolean fCustomRendering;
|
||||
qboolean fResetVis;
|
||||
qboolean fFlipViewModel;
|
||||
@@ -607,6 +606,7 @@ int GL_LoadTexture( const char *name, const byte *buf, size_t size, int flags );
|
||||
void GL_FreeImage( const char *name );
|
||||
qboolean VID_ScreenShot( const char *filename, int shot_type );
|
||||
qboolean VID_CubemapShot( const char *base, uint size, const float *vieworg, qboolean skyshot );
|
||||
void R_GammaChanged( qboolean do_reset_gamma );
|
||||
void R_BeginFrame( qboolean clearScene );
|
||||
void R_RenderFrame( const struct ref_viewpass_s *vp );
|
||||
void R_EndFrame( void );
|
||||
|
||||
@@ -1636,6 +1636,14 @@ qboolean R_DoResetGamma( void )
|
||||
#endif
|
||||
}
|
||||
|
||||
void R_GammaChanged( qboolean do_reset_gamma )
|
||||
{
|
||||
if( do_reset_gamma ) // unused
|
||||
return;
|
||||
|
||||
D_FlushCaches( );
|
||||
}
|
||||
|
||||
/*
|
||||
===============
|
||||
R_BeginFrame
|
||||
@@ -1643,28 +1651,6 @@ R_BeginFrame
|
||||
*/
|
||||
void GAME_EXPORT R_BeginFrame( qboolean clearScene )
|
||||
{
|
||||
#if 0 // unused
|
||||
if( R_DoResetGamma( ))
|
||||
{
|
||||
gEngfuncs.BuildGammaTable( 1.8f, 0.0f );
|
||||
D_FlushCaches( );
|
||||
|
||||
// next frame will be restored gamma
|
||||
SetBits( vid_brightness->flags, FCVAR_CHANGED );
|
||||
SetBits( vid_gamma->flags, FCVAR_CHANGED );
|
||||
}
|
||||
else
|
||||
#endif
|
||||
if( FBitSet( vid_gamma->flags, FCVAR_CHANGED ) || FBitSet( vid_brightness->flags, FCVAR_CHANGED ))
|
||||
{
|
||||
gEngfuncs.BuildGammaTable( vid_gamma->value, vid_brightness->value );
|
||||
|
||||
D_FlushCaches( );
|
||||
// next frame will be restored gamma
|
||||
ClearBits( vid_brightness->flags, FCVAR_CHANGED );
|
||||
ClearBits( vid_gamma->flags, FCVAR_CHANGED );
|
||||
}
|
||||
|
||||
R_Set2DMode( true );
|
||||
|
||||
// draw buffer stuff
|
||||
|
||||
@@ -107,7 +107,7 @@ typedef struct
|
||||
int numlocallights;
|
||||
int lightage[MAXSTUDIOBONES];
|
||||
dlight_t *locallight[MAX_LOCALLIGHTS];
|
||||
color24 locallightcolor[MAX_LOCALLIGHTS];
|
||||
uint locallightcolor[MAX_LOCALLIGHTS][3];
|
||||
vec4_t lightpos[MAXSTUDIOVERTS][MAX_LOCALLIGHTS];
|
||||
vec3_t lightbonepos[MAXSTUDIOBONES][MAX_LOCALLIGHTS];
|
||||
float locallightR2[MAX_LOCALLIGHTS];
|
||||
@@ -1377,13 +1377,13 @@ void R_StudioDynamicLight( cl_entity_t *ent, alight_t *plight )
|
||||
{
|
||||
VectorSet( lightDir, mv->skyvec_x, mv->skyvec_y, mv->skyvec_z );
|
||||
|
||||
light.r = gEngfuncs.LightToTexGamma( bound( 0, mv->skycolor_r, 255 ));
|
||||
light.g = gEngfuncs.LightToTexGamma( bound( 0, mv->skycolor_g, 255 ));
|
||||
light.b = gEngfuncs.LightToTexGamma( bound( 0, mv->skycolor_b, 255 ));
|
||||
light.r = mv->skycolor_r;
|
||||
light.g = mv->skycolor_g;
|
||||
light.b = mv->skycolor_b;
|
||||
}
|
||||
}
|
||||
|
||||
if(( light.r + light.g + light.b ) < 16 ) // TESTTEST
|
||||
if(( light.r + light.g + light.b ) == 0 )
|
||||
{
|
||||
colorVec gcolor;
|
||||
float grad[4];
|
||||
@@ -1431,6 +1431,13 @@ void R_StudioDynamicLight( cl_entity_t *ent, alight_t *plight )
|
||||
}
|
||||
}
|
||||
|
||||
if( ent->curstate.renderfx == kRenderFxLightMultiplier && ent->curstate.iuser4 != 10 )
|
||||
{
|
||||
light.r *= ent->curstate.iuser4 / 10.0f;
|
||||
light.g *= ent->curstate.iuser4 / 10.0f;
|
||||
light.b *= ent->curstate.iuser4 / 10.0f;
|
||||
}
|
||||
|
||||
VectorSet( finalLight, light.r, light.g, light.b );
|
||||
ent->cvFloorColor = light;
|
||||
|
||||
@@ -1462,15 +1469,15 @@ void R_StudioDynamicLight( cl_entity_t *ent, alight_t *plight )
|
||||
|
||||
VectorAdd( lightDir, dist, lightDir );
|
||||
|
||||
finalLight[0] += gEngfuncs.LightToTexGamma( dl->color.r ) * ( add / 256.0f ) * 2.0f;
|
||||
finalLight[1] += gEngfuncs.LightToTexGamma( dl->color.g ) * ( add / 256.0f ) * 2.0f;
|
||||
finalLight[2] += gEngfuncs.LightToTexGamma( dl->color.b ) * ( add / 256.0f ) * 2.0f;
|
||||
finalLight[0] += dl->color.r * ( add / 256.0f );
|
||||
finalLight[1] += dl->color.g * ( add / 256.0f );
|
||||
finalLight[2] += dl->color.b * ( add / 256.0f );
|
||||
}
|
||||
}
|
||||
|
||||
if( FBitSet( ent->model->flags, STUDIO_AMBIENT_LIGHT ))
|
||||
add = 0.6f;
|
||||
else add = 0.9f;
|
||||
else add = bound( 0.75f, v_direct->value, 1.0f );
|
||||
|
||||
VectorScale( lightDir, add, lightDir );
|
||||
|
||||
@@ -1564,9 +1571,9 @@ void R_StudioEntityLight( alight_t *lightinfo )
|
||||
|
||||
if( k != -1 )
|
||||
{
|
||||
g_studio.locallightcolor[k].r = gEngfuncs.LightToTexGamma( el->color.r );
|
||||
g_studio.locallightcolor[k].g = gEngfuncs.LightToTexGamma( el->color.g );
|
||||
g_studio.locallightcolor[k].b = gEngfuncs.LightToTexGamma( el->color.b );
|
||||
g_studio.locallightcolor[k][0] = gEngfuncs.LinearGammaTable( el->color.r << 2 );
|
||||
g_studio.locallightcolor[k][1] = gEngfuncs.LinearGammaTable( el->color.g << 2 );
|
||||
g_studio.locallightcolor[k][2] = gEngfuncs.LinearGammaTable( el->color.b << 2 );
|
||||
g_studio.locallightR2[k] = r2;
|
||||
g_studio.locallight[k] = el;
|
||||
lstrength[k] = minstrength;
|
||||
@@ -1642,7 +1649,7 @@ void R_StudioLighting( float *lv, int bone, int flags, vec3_t normal )
|
||||
|
||||
r = SHADE_LAMBERT;
|
||||
|
||||
// do modified hemispherical lighting
|
||||
// do modified hemispherical lighting
|
||||
if( r <= 1.0f )
|
||||
{
|
||||
r += 1.0f;
|
||||
@@ -1661,7 +1668,8 @@ void R_StudioLighting( float *lv, int bone, int flags, vec3_t normal )
|
||||
}
|
||||
|
||||
illum = Q_min( illum, 255.0f );
|
||||
*lv = illum * (1.0f / 255.0f);
|
||||
|
||||
*lv = gEngfuncs.LightToTexGammaEx( illum * 4 ) / 1023.0f;
|
||||
}
|
||||
|
||||
/*
|
||||
@@ -1681,11 +1689,11 @@ static void R_LightLambert( vec4_t light[MAX_LOCALLIGHTS], const vec3_t normal,
|
||||
return;
|
||||
}
|
||||
|
||||
VectorCopy( color, finalLight );
|
||||
VectorSet( finalLight, 0, 0, 0 );
|
||||
|
||||
for( i = 0; i < g_studio.numlocallights; i++ )
|
||||
{
|
||||
float r;
|
||||
float r;
|
||||
|
||||
r = DotProduct( normal, light[i] );
|
||||
if( likely( !tr.fFlipViewModel ))
|
||||
@@ -1705,21 +1713,29 @@ static void R_LightLambert( vec4_t light[MAX_LOCALLIGHTS], const vec3_t normal,
|
||||
else light[i][3] = 0.0001f;
|
||||
}
|
||||
|
||||
temp = Q_min( r * light[i][3] / 255.0f, 1.0f );
|
||||
|
||||
localLight[0] = (float)g_studio.locallightcolor[i].r * temp;
|
||||
localLight[1] = (float)g_studio.locallightcolor[i].g * temp;
|
||||
localLight[2] = (float)g_studio.locallightcolor[i].b * temp;
|
||||
temp = r * light[i][3];
|
||||
|
||||
VectorAddScalar( g_studio.locallightcolor[i], temp, localLight );
|
||||
VectorAdd( finalLight, localLight, finalLight );
|
||||
}
|
||||
}
|
||||
|
||||
VectorScale( finalLight, 255.0f, finalLight );
|
||||
if( !VectorIsNull( finalLight ))
|
||||
{
|
||||
for( i = 0; i < 3; i++ )
|
||||
{
|
||||
float c = finalLight[i] + gEngfuncs.LinearGammaTable( color[i] * 1023.0f );
|
||||
|
||||
out[0] = Q_min( (int)( finalLight[0] ), 255 );
|
||||
out[1] = Q_min( (int)( finalLight[1] ), 255 );
|
||||
out[2] = Q_min( (int)( finalLight[2] ), 255 );
|
||||
if( c > 1023.0f )
|
||||
out[i] = 255;
|
||||
else
|
||||
out[i] = gEngfuncs.ScreenGammaTable( c ) >> 2;
|
||||
}
|
||||
}
|
||||
else
|
||||
{
|
||||
VectorScale( color, 255.0f, out );
|
||||
}
|
||||
}
|
||||
|
||||
static void R_StudioSetColorBegin(short *ptricmds, vec3_t *pstudionorms )
|
||||
@@ -3412,9 +3428,7 @@ void R_GatherPlayerLight( void )
|
||||
cl_entity_t *view = tr.viewent;
|
||||
colorVec c;
|
||||
|
||||
tr.ignore_lightgamma = true;
|
||||
c = R_LightPoint( view->origin );
|
||||
tr.ignore_lightgamma = false;
|
||||
gEngfuncs.SetLocalLightLevel( ( c.r + c.g + c.b ) / 3 );
|
||||
}
|
||||
|
||||
|
||||
@@ -211,13 +211,9 @@ static void R_BuildLightMap( void )
|
||||
|
||||
for( i = 0, bl = blocklights; i < size; i++, bl += 1, lm++ )
|
||||
{
|
||||
bl[0] += gEngfuncs.LightToTexGamma( lm->r ) * scale;
|
||||
bl[0] += gEngfuncs.LightToTexGamma( lm->g ) * scale;
|
||||
bl[0] += gEngfuncs.LightToTexGamma( lm->b ) * scale;
|
||||
|
||||
//printf("test\n");
|
||||
//bl[1] += gEngfuncs.LightToTexGamma( lm->g ) * scale;
|
||||
//bl[2] += gEngfuncs.LightToTexGamma( lm->b ) * scale;
|
||||
bl[0] += lm->r * scale;
|
||||
bl[1] += lm->g * scale;
|
||||
bl[2] += lm->b * scale;
|
||||
}
|
||||
}
|
||||
|
||||
@@ -245,7 +241,10 @@ static void R_BuildLightMap( void )
|
||||
// bound, invert, and shift
|
||||
for (i=0 ; i<size ; i++)
|
||||
{
|
||||
t = (int)blocklights[i];
|
||||
if( blocklights[i] < 65280 )
|
||||
t = gEngfuncs.LightToTexGammaEx( blocklights[i] >> 6 ) << 6;
|
||||
else t = (int)blocklights[i];
|
||||
|
||||
if (t < 0)
|
||||
t = 0;
|
||||
if( t > 65535 * 3 )
|
||||
|
||||
@@ -12,6 +12,8 @@ build_hlsdk()
|
||||
./waf build install --destdir=../pkgtemp/xash3d || die
|
||||
}
|
||||
|
||||
git config --global --add safe.directory '*'
|
||||
|
||||
echo "Setting up environment..."
|
||||
|
||||
# we can't actually download dkp-toolchain-vars even from here, so
|
||||
|
||||
@@ -75,29 +75,3 @@ ACT_FLINCH_LEFTARM
|
||||
ACT_FLINCH_RIGHTARM
|
||||
ACT_FLINCH_LEFTLEG
|
||||
ACT_FLINCH_RIGHTLEG
|
||||
ACT_VM_NONE
|
||||
ACT_VM_DEPLOY
|
||||
ACT_VM_DEPLOY_EMPTY
|
||||
ACT_VM_HOLSTER
|
||||
ACT_VM_HOLSTER_EMPTY
|
||||
ACT_VM_IDLE1
|
||||
ACT_VM_IDLE2
|
||||
ACT_VM_IDLE3
|
||||
ACT_VM_RANGE_ATTACK1
|
||||
ACT_VM_RANGE_ATTACK2
|
||||
ACT_VM_RANGE_ATTACK3
|
||||
ACT_VM_MELEE_ATTACK1
|
||||
ACT_VM_MELEE_ATTACK2
|
||||
ACT_VM_MELEE_ATTACK3
|
||||
ACT_VM_SHOOT_EMPTY
|
||||
ACT_VM_START_RELOAD
|
||||
ACT_VM_RELOAD
|
||||
ACT_VM_RELOAD_EMPTY
|
||||
ACT_VM_TURNON
|
||||
ACT_VM_TURNOFF
|
||||
ACT_VM_PUMP
|
||||
ACT_VM_PUMP_EMPTY
|
||||
ACT_VM_START_CHARGE
|
||||
ACT_VM_CHARGE
|
||||
ACT_VM_OVERLOAD
|
||||
ACT_VM_IDLE_EMPTY
|
||||
|
||||
6
wscript
6
wscript
@@ -78,7 +78,7 @@ SUBDIRS = [
|
||||
Subproject('3rdparty/mainui', lambda x: not x.env.DEDICATED),
|
||||
Subproject('3rdparty/vgui_support', lambda x: not x.env.DEDICATED),
|
||||
Subproject('stub/client', lambda x: not x.env.DEDICATED),
|
||||
Subproject('game_launch', lambda x: not x.env.DEDICATED and not x.env.DISABLE_LAUNCHER),
|
||||
Subproject('game_launch', lambda x: not x.env.DISABLE_LAUNCHER),
|
||||
|
||||
# disable only by external dependency presense
|
||||
Subproject('3rdparty/opus', lambda x: not x.env.HAVE_SYSTEM_OPUS and not x.env.DEDICATED),
|
||||
@@ -164,7 +164,7 @@ def configure(conf):
|
||||
conf.env.MSVC_TARGETS = ['x86' if not conf.options.ALLOW64 else 'x64']
|
||||
|
||||
# Load compilers early
|
||||
conf.load('xshlib xcompile compiler_c compiler_cxx cmake gccdeps msvcdeps')
|
||||
conf.load('xshlib xcompile compiler_c compiler_cxx cmake gccdeps')
|
||||
|
||||
if conf.options.NSWITCH:
|
||||
conf.load('nswitch')
|
||||
@@ -351,7 +351,7 @@ def configure(conf):
|
||||
conf.env.SUPPORT_BSP2_FORMAT = conf.options.SUPPORT_BSP2_FORMAT
|
||||
|
||||
# disable game_launch compiling on platform where it's not needed
|
||||
conf.env.DISABLE_LAUNCHER = conf.env.DEST_OS in ['android', 'nswitch', 'psvita', 'dos'] or conf.env.MAGX
|
||||
conf.env.DISABLE_LAUNCHER = conf.env.DEST_OS in ['android', 'nswitch', 'psvita', 'dos'] or conf.env.MAGX or conf.env.DEDICATED
|
||||
|
||||
if conf.env.SAILFISH == 'aurora':
|
||||
conf.env.DEFAULT_RPATH = '/usr/share/su.xash.Engine/lib'
|
||||
|
||||
Reference in New Issue
Block a user