9 using std::priority_queue;
37 static priority_queue< light_key >
lightQ;
45 std::vector<int>::iterator where;
46 for (
int i=0;
i<2;++
i) {
77 (*_llights)[*
i].Target() = -1;
80 int targ = (*_llights)[*
i].Target();
82 glDisable( GL_LIGHT0+targ );
85 (*_llights)[*
i].Target() = -1;
94 float intensity = (1.0/3.0)*(
102 float att = (cf+lf*distance+qf*distance*distance);
103 if ( (distance <= 0) || (att <= 0) )
107 return (intensity/att) >= light.
cutoff;
113 const int lightsenabled,
114 const int lightindex )
116 const gfx_light &light = (*_llights)[lightindex];
145 tmp =
QVector( radius, radius, radius );
147 if (lightsenabled && pickglobals) {
160 for (
int j = 0;
j < 2;
j++) {
161 veclinecol::iterator
i;
163 for (i = tmppickt[
j]->begin(); i != tmppickt[
j]->end(); i++) {
164 if (
picklight( *i->lc, center, radius, lightsenabled, i->GetIndex() ) ) {
165 lights.push_back( i->GetIndex() );
170 std::sort( lights.begin(), lights.end(),
lightsort( center, radius ) );
180 void GFXPickLights( vector< int >::const_iterator begin, vector< int >::const_iterator end )
192 std::vector< int >::iterator traverse =
newpicked->begin();
193 std::vector< int >::iterator oldtrav;
196 while (oldtrav !=
oldpicked->end() && *oldtrav < *traverse)
198 if ( ( (*traverse) == (*oldtrav) ) && ( (*_llights)[*oldtrav].target >= 0 ) )
215 if (*traverse>=(
int)
_llights->size()) {
220 if ( (*
_llights)[*traverse].target == -1 ) {
226 (*_llights)[(*traverse)].ClobberGLLight( gltarg );
240 if (*oldtrav>=(
int)
_llights->size()) {
245 int glind = (*_llights)[*oldtrav].target;
248 glDisable( GL_LIGHT0+glind );
251 (*_llights)[*oldtrav].target = -1;
256 #ifdef MIRACLESAVESDAY
267 Vector loc( transform[12], transform[13], transform[14] );
268 SetLocalCompare( loc );
272 unsigned int lightQsize =
lightQ.size();
273 for (i = 0; i < lightQsize; i++) {
290 #ifdef PER_MESH_ATTENUATE
294 AttenuateQ[i] = tmpvar.
intensity_key/(*_llights)[i].intensity;
298 #ifdef PER_MESH_ATTENUATE
307 for (i = 0; i < newQsize; i++) {
309 if ( (*
_llights)[light].target >= 0 ) {
310 #ifdef PER_MESH_ATTENUATE
312 EnableExistingAttenuated( light, AttenuateQ[i] );
315 EnableExisting( newQ[i] );
330 DisableExisting( i );
334 unsigned int tmp = 0;
335 unsigned int newtarg = 0;
336 for (i = 0; i < newQsize; i++) {
338 if ( (*
_llights)[light].target == -1 ) {
340 ForceEnableAttenuated( light, AttenuateQ[i], tmp, newtarg );
342 ForceEnable( light, tmp, newtarg );
343 AttTmp[0] = (*_llights)[light].vect[0]-loc.i;
344 AttTmp[1] = (*_llights)[light].vect[1]-loc.j;
345 AttTmp[2] = (*_llights)[light].vect[2]-loc.k;
347 VecT[0] = AttTmp[0]*transform[0]+AttTmp[1]*transform[1]+AttTmp[2]*transform[2];
348 VecT[1] = AttTmp[0]*transform[4]+AttTmp[1]*transform[5]+AttTmp[2]*transform[6];
349 VecT[2] = AttTmp[0]*transform[8]+AttTmp[1]*transform[9]+AttTmp[2]*transform[10];
350 glLightfv( GL_LIGHT0+(*
_llights)[light].target, GL_POSITION, VecT );