NL3D::CPatchDLMPointLight Class Reference

#include <patchdlm_context.h>


Detailed Description

A PointLight for Dynamic LightMap (DLM) context for a patch. It contains precomputed values.
Author:
Lionel Berenguier

Nevrax France

Date:
2002

Definition at line 55 of file patchdlm_context.h.

Public Member Functions

void compile (const CPointLight &pl, NLMISC::CRGBA landDiffMat, float maxAttEnd=30.f)

Data Fields

float AttMax
float AttMin
float B
NLMISC::CAABBox BBox
NLMISC::CBSphere BSphere
float CosMax
float CosMin
CVector Dir
float G
bool IsSpot
float OOAttDelta
float OOCosDelta
CVector Pos
float R


Member Function Documentation

void NL3D::CPatchDLMPointLight::compile const CPointLight pl,
NLMISC::CRGBA  landDiffMat,
float  maxAttEnd = 30.f
 

Definition at line 52 of file patchdlm_context.cpp.

References AttMax, AttMin, NLMISC::CRGBA::B, NLMISC::CBSphere::Center, CosMax, CosMin, Dir, NLMISC::CRGBA::G, G, NL3D::CPointLight::getAttenuationBegin(), NL3D::CPointLight::getAttenuationEnd(), NL3D::CPointLight::getDiffuse(), NL3D::CPointLight::getPosition(), NL3D::CPointLight::getSpotAngleBegin(), NL3D::CPointLight::getSpotAngleEnd(), NL3D::CPointLight::getSpotDirection(), NL3D::CPointLight::getType(), IsSpot, min, nlassert, OOAttDelta, OOCosDelta, NLMISC::CRGBA::R, R, NLMISC::CBSphere::Radius, NLMISC::CAABBox::setCenter(), NLMISC::CAABBox::setHalfSize(), and NLMISC::sqr().

00053 {
00054         nlassert(maxAttEnd>0);
00055 
00056         // copy color
00057         R= (float) (( pl.getDiffuse().R*(landDiffMat.R+1) ) >>8);
00058         G= (float) (( pl.getDiffuse().G*(landDiffMat.G+1) ) >>8);
00059         B= (float) (( pl.getDiffuse().B*(landDiffMat.B+1) ) >>8);
00060         // Copy Spot/Pos/Dir.
00061         IsSpot= pl.getType() == CPointLight::SpotLight;
00062         Pos= pl.getPosition();
00063         Dir= pl.getSpotDirection();
00064         
00065         // compute spot params
00066         if(IsSpot)
00067         {
00068                 CosMax= cosf(pl.getSpotAngleBegin());
00069                 CosMin= cosf(pl.getSpotAngleEnd());
00070         }
00071         else
00072         {
00073                 // with tesse Values, we have always (cosSpot-CosMin) * OOCosDelta > 1.0f
00074                 CosMax= -1;
00075                 CosMin= -2;
00076         }
00077         OOCosDelta= 1.f / (CosMax-CosMin);
00078 
00079         // compute att params
00080         AttMax= pl.getAttenuationEnd();
00081         AttMin= pl.getAttenuationBegin();
00082         // infinite pointLight?
00083         if(AttMax==0)
00084         {
00085                 AttMax= maxAttEnd;
00086                 AttMin= maxAttEnd*0.99f;
00087         }
00088         // To big pointLigt?
00089         else if(AttMax>maxAttEnd)
00090         {
00091                 AttMax= maxAttEnd;
00092                 AttMin= min(AttMin, maxAttEnd*0.99f);
00093         }
00094         // compile distance
00095         OOAttDelta= 1.f / (AttMin-AttMax);
00096 
00097 
00098         // Compute bounding sphere.
00099         // If not a spot or if angleMin>Pi/2
00100         if(!IsSpot || CosMin<0)
00101         {
00102                 // Take sphere of pointlight sphere
00103                 BSphere.Center= Pos;
00104                 BSphere.Radius= AttMax;
00105                 // The bbox englobe the sphere.
00106                 BBox.setCenter(Pos);
00107                 BBox.setHalfSize(CVector(AttMax, AttMax, AttMax));
00108         }
00109         else
00110         {
00111                 // Compute BSphere.
00112                 //==============
00113 
00114                 // compute sinus of AngleMin
00115                 float   sinMin= sqrtf(1-sqr(CosMin));
00116 
00117                 // Test 2 centers: Center of radius along Dir: Pos+Dir*AttMax/2, and intersection of end cone with line (Pos,Dir)
00118                 // Don't know why but I think they are sufficiently good :)
00119                 // See below for computing of those centers.
00120 
00121                 /* compute radius of each sphere by taking max of 3 distances: distance to spotLight center, distance
00122                         to spotLight forward extremity, and distance to spotLight circle interstion Cone/Sphere. (named DCCS)
00123                         NB: Do the compute with radius=1 at first, then multiply later.
00124                 */
00125                 float   radius1= 0.5f;          // =max(0.5, 0.5); max distance to spot center and extremity center :)
00126                 // for distance DCCS, this is the hypothenuse of (cosMin-0.5) + sinMin.
00127                 float   dccs= sqrtf( sqr(CosMin-0.5f) + sqr(sinMin));
00128                 // take the bigger.
00129                 radius1= max(radius1, dccs );
00130 
00131                 // Same reasoning for center2.
00132                 float   radius2= max(CosMin, 1-CosMin); // max distance to spot center and extremity center :)
00133                 // for distance DCCS, it is simply sinMin!!
00134                 dccs= sinMin;
00135                 // take the bigger.
00136                 radius2= max(radius2, dccs );
00137 
00138 
00139                 // Then take the center which gives the smaller sphere
00140                 if(radius1<radius2)
00141                 {
00142                         BSphere.Center= Pos + (Dir*0.5f*AttMax);
00143                         // radius1 E [0,1], must take real size.
00144                         BSphere.Radius= radius1 * AttMax;
00145                 }
00146                 else
00147                 {
00148                         BSphere.Center= Pos + (Dir*CosMin*AttMax);
00149                         // radius2 E [0,1], must take real size.
00150                         BSphere.Radius= radius2 * AttMax;
00151                 }
00152 
00153 
00154                 // Compute BBox.
00155                 //==============
00156                 
00157                 // just take bbox of the sphere, even if not optimal.
00158                 BBox.setCenter(BSphere.Center);
00159                 float   rad= BSphere.Radius;
00160                 BBox.setHalfSize( CVector(rad, rad, rad) );
00161         }
00162 }


Field Documentation

float NL3D::CPatchDLMPointLight::AttMax
 

Definition at line 73 of file patchdlm_context.h.

Referenced by NL3D::CPatchDLMContext::addPointLightInfluence(), and compile().

float NL3D::CPatchDLMPointLight::AttMin
 

Definition at line 75 of file patchdlm_context.h.

Referenced by compile().

float NL3D::CPatchDLMPointLight::B
 

Definition at line 59 of file patchdlm_context.h.

Referenced by NL3D::CPatchDLMContext::addPointLightInfluence().

NLMISC::CAABBox NL3D::CPatchDLMPointLight::BBox
 

Definition at line 84 of file patchdlm_context.h.

Referenced by NL3D::CLandscape::computeDynamicLighting().

NLMISC::CBSphere NL3D::CPatchDLMPointLight::BSphere
 

Definition at line 81 of file patchdlm_context.h.

Referenced by NL3D::CPatchDLMContext::addPointLightInfluence(), and NL3D::CLandscape::computeDynamicLighting().

float NL3D::CPatchDLMPointLight::CosMax
 

Definition at line 67 of file patchdlm_context.h.

Referenced by compile().

float NL3D::CPatchDLMPointLight::CosMin
 

Definition at line 69 of file patchdlm_context.h.

Referenced by NL3D::CPatchDLMContext::addPointLightInfluence(), and compile().

CVector NL3D::CPatchDLMPointLight::Dir
 

Definition at line 65 of file patchdlm_context.h.

Referenced by NL3D::CPatchDLMContext::addPointLightInfluence(), and compile().

float NL3D::CPatchDLMPointLight::G
 

Definition at line 59 of file patchdlm_context.h.

Referenced by NL3D::CPatchDLMContext::addPointLightInfluence(), and compile().

bool NL3D::CPatchDLMPointLight::IsSpot
 

Definition at line 61 of file patchdlm_context.h.

Referenced by NL3D::CPatchDLMContext::addPointLightInfluence(), and compile().

float NL3D::CPatchDLMPointLight::OOAttDelta
 

Definition at line 77 of file patchdlm_context.h.

Referenced by NL3D::CPatchDLMContext::addPointLightInfluence(), and compile().

float NL3D::CPatchDLMPointLight::OOCosDelta
 

Definition at line 71 of file patchdlm_context.h.

Referenced by NL3D::CPatchDLMContext::addPointLightInfluence(), and compile().

CVector NL3D::CPatchDLMPointLight::Pos
 

Definition at line 63 of file patchdlm_context.h.

Referenced by NL3D::CPatchDLMContext::addPointLightInfluence().

float NL3D::CPatchDLMPointLight::R
 

Definition at line 59 of file patchdlm_context.h.

Referenced by NL3D::CPatchDLMContext::addPointLightInfluence(), and compile().


The documentation for this class was generated from the following files:
Generated on Tue Mar 16 07:00:59 2004 for NeL by doxygen 1.3.6