99 lines
2.7 KiB
C++
99 lines
2.7 KiB
C++
/*
|
|
* Copyright (c) 2016-2022 Marco Cawthorne <marco@icculus.org>
|
|
*
|
|
* Permission to use, copy, modify, and distribute this software for any
|
|
* purpose with or without fee is hereby granted, provided that the above
|
|
* copyright notice and this permission notice appear in all copies.
|
|
*
|
|
* THE SOFTWARE IS PROVIDED "AS IS" AND THE AUTHOR DISCLAIMS ALL WARRANTIES
|
|
* WITH REGARD TO THIS SOFTWARE INCLUDING ALL IMPLIED WARRANTIES OF
|
|
* MERCHANTABILITY AND FITNESS. IN NO EVENT SHALL THE AUTHOR BE LIABLE FOR
|
|
* ANY SPECIAL, DIRECT, INDIRECT, OR CONSEQUENTIAL DAMAGES OR ANY DAMAGES
|
|
* WHATSOEVER RESULTING FROM LOSS OF MIND, USE, DATA OR PROFITS, WHETHER
|
|
* IN AN ACTION OF CONTRACT, NEGLIGENCE OR OTHER TORTIOUS ACTION, ARISING
|
|
* OUT OF OR IN CONNECTION WITH THE USE OR PERFORMANCE OF THIS SOFTWARE.
|
|
*/
|
|
|
|
/*
|
|
This file adds support for GoldSrc styled detail texture definitions.
|
|
Currently, it's map specific (but we can make a global detail file as well.
|
|
|
|
maps/mapname_detail.txt contains a list made up of 4 components per line.
|
|
|
|
MAPTEXTURENAME PATH_TO_SOME_OVERLAY XSCALE YSCALE
|
|
*/
|
|
|
|
static int g_detail_initialized;
|
|
|
|
const string g_detail_shader = \
|
|
"{\n" \
|
|
"{\n" \
|
|
"program defaultwall\n" \
|
|
"map $diffuse\n" \
|
|
"}\n" \
|
|
"{\n" \
|
|
"map gfx/%s.tga\n" \
|
|
"tcMod scale %f %f\n" \
|
|
"blendFunc filter\n" \
|
|
"}\n" \
|
|
"}";
|
|
|
|
const string g_detail_debug = \
|
|
"{\n" \
|
|
"{\n" \
|
|
"map $blackimage\n" \
|
|
"}\n" \
|
|
"}";
|
|
|
|
void
|
|
DetailTex_Parse(string maptex, string detailtex, float xscale, float yscale)
|
|
{
|
|
xscale *= autocvar(r_detailtextures_xscale, 1.0, "X scale multiplier for detail tex");
|
|
yscale *= autocvar(r_detailtextures_yscale, 1.0, "Y scale multiplier for detail tex");
|
|
|
|
dprint(sprintf("DETAIL: %s %s %f %f\n", maptex, detailtex, xscale, yscale));
|
|
|
|
#if 1
|
|
shaderforname(strcat(maptex, "_detail"), sprintf(g_detail_shader, detailtex, xscale, yscale));
|
|
#else
|
|
shaderforname(strcat(maptex, "_detail"), g_detail_debug);
|
|
#endif
|
|
|
|
remapshader(maptex, strcat(maptex, "_detail"), 0.0f);
|
|
}
|
|
|
|
void
|
|
DetailTex_Init(void)
|
|
{
|
|
filestream fh;
|
|
string line;
|
|
int n = 0;
|
|
|
|
g_detail_initialized = 0;
|
|
|
|
if (!autocvar(r_detailtextures, 0, "High-res detail texture overlays for selected maps"))
|
|
return;
|
|
|
|
print("--------- Initializing DetailTex ----------\n");
|
|
|
|
fh = fopen(strcat("maps/", mapname, "_detail.txt"), FILE_READ);
|
|
|
|
if (fh < 0) {
|
|
print(sprintf("DeailTex definition not found for %s.\n", mapname));
|
|
return;
|
|
}
|
|
|
|
while ((line = fgets(fh))) {
|
|
int c = tokenize_console(line);
|
|
|
|
if (c != 4)
|
|
continue;
|
|
|
|
DetailTex_Parse(strtolower(argv(0)), argv(1), stof(argv(2)), stof(argv(3)));
|
|
n++;
|
|
}
|
|
|
|
print(sprintf("DeailTex initialized with %i entries.\n", n));
|
|
fclose(fh);
|
|
g_detail_initialized = 1;
|
|
}
|