halflife-photomode/utils/light/light.cpp

226 lines
3.7 KiB
C++

//========= Copyright © 1996-2002, Valve LLC, All rights reserved. ============
//
// Purpose:
//
// $NoKeywords: $
//=============================================================================
// lighting.c
#include "light.h"
/*
NOTES
-----
*/
float scaledist = 1.0;
float scalecos = 0.5;
float rangescale = 0.5;
byte *filebase, *file_p, *file_end;
dmodel_t* bspmodel;
vec3_t bsp_origin;
qboolean extrasamples;
qboolean hicolor;
qboolean clamp192 = true;
float minlights[MAX_MAP_FACES];
lightentity_t lightentities[MAX_MAP_ENTITIES];
int numlightentities;
/*
==================
LoadEntities
==================
*/
void LoadEntities(void)
{
char *s, *s2;
entity_t* e;
lightentity_t* le;
int i, j;
ParseEntities();
// go through all the entities
for (i = 1; i < num_entities; i++)
{
e = &entities[i];
s = ValueForKey(e, "classname");
if (strncmp(s, "light", 5))
continue;
le = &lightentities[numlightentities];
numlightentities++;
strcpy(le->classname, s);
s = ValueForKey(e, "_light");
if (s)
{
double v1, v2, v3;
v1 = v2 = v3 = 0;
if (sscanf(s, "%lf %lf %lf", &v1, &v2, &v3) != 3)
v2 = v3 = v1;
le->light[0] = v1;
le->light[1] = v2;
le->light[2] = v3;
}
else
{
le->light[0] = DEFAULTLIGHTLEVEL;
le->light[1] = DEFAULTLIGHTLEVEL;
le->light[2] = DEFAULTLIGHTLEVEL;
}
le->style = FloatForKey(e, "style");
le->angle = FloatForKey(e, "angle");
GetVectorForKey(e, "origin", le->origin);
s = ValueForKey(e, "target");
if (!s[0])
continue;
// find matching targetname
for (j = 1; j < num_entities; j++)
{
s2 = ValueForKey(&entities[j], "targetname");
if (!strcmp(s, s2))
{
le->targetent = true;
GetVectorForKey(&entities[j], "origin", le->targetorigin);
break;
}
}
if (j == num_entities)
printf("WARNING: entity %i has unmatched target %s\n", i, s);
}
qprintf("%d lightentities\n", numlightentities);
}
byte* GetFileSpace(int size)
{
byte* buf;
ThreadLock();
file_p = (byte*)(((long)file_p + 3) & ~3);
buf = file_p;
file_p += size;
ThreadUnlock();
if (file_p > file_end)
Error("GetFileSpace: overrun");
return buf;
}
/*
=============
LightWorld
=============
*/
void LightWorld(void)
{
filebase = file_p = dlightdata;
file_end = filebase + MAX_MAP_LIGHTING;
RunThreadsOnIndividual(numfaces, true, LightFace);
lightdatasize = file_p - filebase;
printf("lightdatasize: %i\n", lightdatasize);
}
/*
========
main
light modelfile
========
*/
int main(int argc, char** argv)
{
int i;
double start, end;
char source[1024];
printf("Light.exe Version 1.3 Id Software and valve (%s)\n", __DATE__);
printf("----- LightFaces ----\n");
// default to 24-bit light info
hicolor = true;
for (i = 1; i < argc; i++)
{
if (!strcmp(argv[i], "-threads"))
{
numthreads = atoi(argv[i + 1]);
i++;
}
else if (!strcmp(argv[i], "-extra"))
{
extrasamples = true;
printf("extra sampling enabled\n");
}
else if (!strcmp(argv[i], "-dist"))
{
scaledist = atof(argv[i + 1]);
i++;
}
else if (!strcmp(argv[i], "-range"))
{
rangescale = atof(argv[i + 1]);
i++;
}
else if (!strcmp(argv[i], "-lowcolor"))
{
hicolor = false;
}
else if (!strcmp(argv[i], "-noclamp"))
{
clamp192 = false;
}
else if (argv[i][0] == '-')
Error("Unknown option \"%s\"", argv[i]);
else
break;
}
if (i != argc - 1)
Error("usage: light [-threads num] [-extra] [-lowcolor] bspfile");
ThreadSetDefault();
start = I_FloatTime();
strcpy(source, argv[i]);
StripExtension(source);
DefaultExtension(source, ".bsp");
LoadBSPFile(source);
LoadEntities();
MakeTnodes();
LightWorld();
WriteBSPFile(source);
end = I_FloatTime();
printf("%5.1f seconds elapsed\n", end - start);
return 0;
}