light: bounce: scale bounced light by texture color
This commit is contained in:
parent
199cba7349
commit
a5356c161c
|
|
@ -165,6 +165,7 @@ typedef struct {
|
||||||
|
|
||||||
extern const bouncelight_t *bouncelights;
|
extern const bouncelight_t *bouncelights;
|
||||||
extern int numbouncelights;
|
extern int numbouncelights;
|
||||||
|
extern byte thepalette[768];
|
||||||
|
|
||||||
/* tracelist is a null terminated array of BSP models to use for LOS tests */
|
/* tracelist is a null terminated array of BSP models to use for LOS tests */
|
||||||
extern const modelinfo_t *const *tracelist;
|
extern const modelinfo_t *const *tracelist;
|
||||||
|
|
|
||||||
|
|
@ -32,6 +32,7 @@
|
||||||
#include <set>
|
#include <set>
|
||||||
#include <algorithm>
|
#include <algorithm>
|
||||||
#include <mutex>
|
#include <mutex>
|
||||||
|
#include <string>
|
||||||
|
|
||||||
using namespace std;
|
using namespace std;
|
||||||
|
|
||||||
|
|
@ -759,6 +760,7 @@ LoadExtendedTexinfoFlags(const char *sourcefilename, const bsp2_t *bsp)
|
||||||
|
|
||||||
// radiosity
|
// radiosity
|
||||||
|
|
||||||
|
map<string, vec3_struct_t> texturecolors;
|
||||||
std::vector<bouncelight_t> radlights;
|
std::vector<bouncelight_t> radlights;
|
||||||
|
|
||||||
// for access from C
|
// for access from C
|
||||||
|
|
@ -982,6 +984,49 @@ MakeBounceLightsThread (void *arg)
|
||||||
return NULL;
|
return NULL;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
// Returns color in [0,1]
|
||||||
|
void Texture_AvgColor (const bsp2_t *bsp, const miptex_t *miptex, vec3_t color)
|
||||||
|
{
|
||||||
|
VectorSet(color, 0, 0, 0);
|
||||||
|
if (!bsp->texdatasize)
|
||||||
|
return;
|
||||||
|
|
||||||
|
const byte *data = (byte*)miptex + miptex->offsets[0];
|
||||||
|
for (int y=0; y<miptex->height; y++) {
|
||||||
|
for (int x=0; x<miptex->width; x++) {
|
||||||
|
const int i = data[(miptex->width * y) + x];
|
||||||
|
|
||||||
|
vec3_t samplecolor = { (float)thepalette[3*i], (float)thepalette[3*i + 1], (float)thepalette[3*i + 2] };
|
||||||
|
VectorAdd(color, samplecolor, color);
|
||||||
|
}
|
||||||
|
}
|
||||||
|
VectorScale(color, 1.0 / (miptex->width * miptex->height), color);
|
||||||
|
VectorScale(color, 1.0 / 255.0, color);
|
||||||
|
}
|
||||||
|
|
||||||
|
void MakeTextureColors (const bsp2_t *bsp)
|
||||||
|
{
|
||||||
|
logprint("--- MakeTextureColors ---\n");
|
||||||
|
|
||||||
|
if (!bsp->texdatasize)
|
||||||
|
return;
|
||||||
|
|
||||||
|
for (int i=0; i<bsp->dtexdata.header->nummiptex; i++) {
|
||||||
|
const int ofs = bsp->dtexdata.header->dataofs[i];
|
||||||
|
if (ofs < 0)
|
||||||
|
continue;
|
||||||
|
|
||||||
|
const miptex_t *miptex = (miptex_t *)(bsp->dtexdata.base + ofs);
|
||||||
|
|
||||||
|
string name { miptex->name };
|
||||||
|
vec3_struct_t color;
|
||||||
|
Texture_AvgColor(bsp, miptex, color.v);
|
||||||
|
|
||||||
|
printf("%s has color %f %f %f\n", name.c_str(), color.v[0], color.v[1], color.v[2]);
|
||||||
|
texturecolors[name] = color;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
void MakeBounceLights (const bsp2_t *bsp)
|
void MakeBounceLights (const bsp2_t *bsp)
|
||||||
{
|
{
|
||||||
logprint("--- MakeBounceLights ---\n");
|
logprint("--- MakeBounceLights ---\n");
|
||||||
|
|
@ -1007,8 +1052,17 @@ void MakeBounceLights (const bsp2_t *bsp)
|
||||||
VectorCopy(patch->plane.normal, l.surfnormal);
|
VectorCopy(patch->plane.normal, l.surfnormal);
|
||||||
l.area = WindingArea(patch->w);
|
l.area = WindingArea(patch->w);
|
||||||
l.leaf = Light_PointInLeaf(bsp, l.pos);
|
l.leaf = Light_PointInLeaf(bsp, l.pos);
|
||||||
radlights.push_back(l);
|
|
||||||
|
|
||||||
|
// scale by texture color
|
||||||
|
const bsp2_dface_t *f = &bsp->dfaces[mapentry.first];
|
||||||
|
const char *facename = Face_TextureName(bsp, f);
|
||||||
|
if (texturecolors.find(facename) != texturecolors.end()) {
|
||||||
|
vec3_struct_t texcolor = texturecolors.at(facename);
|
||||||
|
for (int i=0; i<3; i++)
|
||||||
|
l.color[i] *= texcolor.v[i];
|
||||||
|
}
|
||||||
|
|
||||||
|
radlights.push_back(l);
|
||||||
//fprintf(f, "{\n\"classname\" \"light\"\n\"origin\" \"%f %f %f\"\n}\n", l.pos[0], l.pos[1], l.pos[2]);
|
//fprintf(f, "{\n\"classname\" \"light\"\n\"origin\" \"%f %f %f\"\n}\n", l.pos[0], l.pos[1], l.pos[2]);
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
@ -1378,8 +1432,10 @@ main(int argc, const char **argv)
|
||||||
|
|
||||||
MakeTnodes(bsp);
|
MakeTnodes(bsp);
|
||||||
|
|
||||||
if (bounce)
|
if (bounce) {
|
||||||
|
MakeTextureColors(bsp);
|
||||||
MakeBounceLights(bsp);
|
MakeBounceLights(bsp);
|
||||||
|
}
|
||||||
|
|
||||||
LightWorld(&bspdata, !!lmscaleoverride);
|
LightWorld(&bspdata, !!lmscaleoverride);
|
||||||
|
|
||||||
|
|
|
||||||
|
|
@ -1123,7 +1123,7 @@ CullLight(const entity_t *entity, const lightsurf_t *lightsurf)
|
||||||
return fabs(GetLightValue(&entity->light, entity, dist)) <= fadegate;
|
return fabs(GetLightValue(&entity->light, entity, dist)) <= fadegate;
|
||||||
}
|
}
|
||||||
|
|
||||||
static byte thepalette[768] =
|
byte thepalette[768] =
|
||||||
{
|
{
|
||||||
0,0,0,15,15,15,31,31,31,47,47,47,63,63,63,75,75,75,91,91,91,107,107,107,123,123,123,139,139,139,155,155,155,171,171,171,187,187,187,203,203,203,219,219,219,235,235,235,15,11,7,23,15,11,31,23,11,39,27,15,47,35,19,55,43,23,63,47,23,75,55,27,83,59,27,91,67,31,99,75,31,107,83,31,115,87,31,123,95,35,131,103,35,143,111,35,11,11,15,19,19,27,27,27,39,39,39,51,47,47,63,55,55,75,63,63,87,71,71,103,79,79,115,91,91,127,99,99,
|
0,0,0,15,15,15,31,31,31,47,47,47,63,63,63,75,75,75,91,91,91,107,107,107,123,123,123,139,139,139,155,155,155,171,171,171,187,187,187,203,203,203,219,219,219,235,235,235,15,11,7,23,15,11,31,23,11,39,27,15,47,35,19,55,43,23,63,47,23,75,55,27,83,59,27,91,67,31,99,75,31,107,83,31,115,87,31,123,95,35,131,103,35,143,111,35,11,11,15,19,19,27,27,27,39,39,39,51,47,47,63,55,55,75,63,63,87,71,71,103,79,79,115,91,91,127,99,99,
|
||||||
139,107,107,151,115,115,163,123,123,175,131,131,187,139,139,203,0,0,0,7,7,0,11,11,0,19,19,0,27,27,0,35,35,0,43,43,7,47,47,7,55,55,7,63,63,7,71,71,7,75,75,11,83,83,11,91,91,11,99,99,11,107,107,15,7,0,0,15,0,0,23,0,0,31,0,0,39,0,0,47,0,0,55,0,0,63,0,0,71,0,0,79,0,0,87,0,0,95,0,0,103,0,0,111,0,0,119,0,0,127,0,0,19,19,0,27,27,0,35,35,0,47,43,0,55,47,0,67,
|
139,107,107,151,115,115,163,123,123,175,131,131,187,139,139,203,0,0,0,7,7,0,11,11,0,19,19,0,27,27,0,35,35,0,43,43,7,47,47,7,55,55,7,63,63,7,71,71,7,75,75,11,83,83,11,91,91,11,99,99,11,107,107,15,7,0,0,15,0,0,23,0,0,31,0,0,39,0,0,47,0,0,55,0,0,63,0,0,71,0,0,79,0,0,87,0,0,95,0,0,103,0,0,111,0,0,119,0,0,127,0,0,19,19,0,27,27,0,35,35,0,47,43,0,55,47,0,67,
|
||||||
|
|
|
||||||
Loading…
Reference in New Issue