#include <surface_light_grid.h>
Nevrax France
Definition at line 57 of file surface_light_grid.h.
Public Types | |
| enum | { NumLightPerCorner = 2 } |
| We support only 2 light per corner. Should never be changed. More... | |
Public Member Functions | |
| CSurfaceLightGrid () | |
| Constructor. | |
| void | getStaticLightSetup (const CVector &localPos, std::vector< CPointLightInfluence > &pointLightList, uint8 &sunContribution, CIGSurfaceLight &igsl, NLMISC::CRGBA &localAmbient) const |
| void | serial (NLMISC::IStream &f) |
Data Fields | |
| NLMISC::CObjectVector< CCellCorner > | Cells |
| uint32 | Height |
| NLMISC::CVector2f | Origin |
| uint32 | Width |
|
|
We support only 2 light per corner. Should never be changed.
Definition at line 62 of file surface_light_grid.h.
00062 {NumLightPerCorner= 2};
|
|
|
Constructor.
Definition at line 43 of file surface_light_grid.cpp.
|
|
||||||||||||||||||||||||
|
Definition at line 62 of file surface_light_grid.cpp. References NL3D::CIGSurfaceLight::_Owner, NLMISC::CRGBA::A, NLMISC::CRGBA::B, NLMISC::clamp(), NL3D::CLightInfluenceInterpolator::Corners, NLMISC::CRGBA::G, NL3D::CPointLight::getAmbient(), NL3D::CIGSurfaceLight::getOOCellSize(), NL3D::CInstanceGroup::getPointLightList(), NL3D::CLightInfluenceInterpolator::interpolate(), NL3D::CSurfaceLightGrid::CCellCorner::Light, NL3D::CLightInfluenceInterpolator::CCorner::Lights, NL3D::CSurfaceLightGrid::CCellCorner::LocalAmbientId, nlassert, NLMISC::OptFastFloor(), NLMISC::CRGBA::R, sint, NL3D::CSurfaceLightGrid::CCellCorner::SunContribution, uint, uint8, x, NLMISC::CVector2f::x, NLMISC::CVector::x, y, NLMISC::CVector2f::y, and NLMISC::CVector::y.
00064 {
00065 // Get local coordinate to the grid.
00066 float xfloat= (localPos.x - Origin.x) * igsl.getOOCellSize();
00067 float yfloat= (localPos.y - Origin.y) * igsl.getOOCellSize();
00068 sint wCell= Width-1;
00069 sint hCell= Height-1;
00070 // fastFloor: use a precision of 256 to avoid doing OptFastFloorBegin.
00071 sint wfixed= wCell<<8;
00072 sint hfixed= hCell<<8;
00073 sint xfixed= NLMISC::OptFastFloor(xfloat * 256);
00074 sint yfixed= NLMISC::OptFastFloor(yfloat * 256);
00075 clamp(xfixed, 0, wfixed);
00076 clamp(yfixed, 0, hfixed);
00077 // compute the cell coord, and the subCoord for bilinear.
00078 sint xCell, yCell, xSub, ySub;
00079 xCell= xfixed>>8;
00080 yCell= yfixed>>8;
00081 clamp(xCell, 0, wCell-1);
00082 clamp(yCell, 0, hCell-1);
00083 // Hence, xSub and ySub range is [0, 256].
00084 xSub= xfixed - (xCell<<8);
00085 ySub= yfixed - (yCell<<8);
00086
00087
00088 // Use a CLightInfluenceInterpolator to biLinear light influence
00089 CLightInfluenceInterpolator interp;
00090 // Must support only 2 light per cell corner.
00091 nlassert(CSurfaceLightGrid::NumLightPerCorner==2);
00092 nlassert(CLightInfluenceInterpolator::NumLightPerCorner==2);
00093 // Get ref on array of PointLightNamed.
00094 CPointLightNamed *igPointLights= NULL;;
00095 if( igsl._Owner->getPointLightList().size() >0 )
00096 {
00097 // const_cast, because will only change _IdInfluence, and
00098 // also because CLightingManager will call appendLightedModel()
00099 igPointLights= const_cast<CPointLightNamed*>(&(igsl._Owner->getPointLightList()[0]));
00100 }
00101 // For 4 corners.
00102 uint x,y;
00103 uint sunContribFixed= 0;
00104 uint rLocalAmbientFixed= 0;
00105 uint gLocalAmbientFixed= 0;
00106 uint bLocalAmbientFixed= 0;
00107 uint aLocalAmbientFixed= 0;
00108 for(y=0;y<2;y++)
00109 {
00110 for(x=0;x<2;x++)
00111 {
00112 // Prepare compute for PointLights.
00113 //-------------
00114 // get ref on TLI, and on corner.
00115 const CCellCorner &cellCorner= Cells[ (yCell+y)*Width + xCell+x ];
00116 CLightInfluenceInterpolator::CCorner &corner= interp.Corners[y*2 + x];
00117 // For all lights
00118 uint lid;
00119 for(lid= 0; lid<CSurfaceLightGrid::NumLightPerCorner; lid++)
00120 {
00121 // get the id of the light in the ig
00122 uint igLightId= cellCorner.Light[lid];
00123 // If empty id, stop
00124 if(igLightId==0xFF)
00125 break;
00126 else
00127 {
00128 // Set pointer of the light in the corner
00129 corner.Lights[lid]= igPointLights + igLightId;
00130 }
00131 }
00132 // Reset Empty slots.
00133 for(; lid<CSurfaceLightGrid::NumLightPerCorner; lid++)
00134 {
00135 // set to NULL
00136 corner.Lights[lid]= NULL;
00137 }
00138
00139 // BiLinear SunContribution.
00140 //-------------
00141 uint xBi= (x==0)?256-xSub : xSub;
00142 uint yBi= (y==0)?256-ySub : ySub;
00143 uint mulBi= xBi * yBi;
00144 sunContribFixed+= cellCorner.SunContribution * mulBi;
00145
00146
00147 // BiLinear Ambient Contribution.
00148 //-------------
00149 // If FF, then take Sun Ambient => leave color and alpha To 0.
00150 if(cellCorner.LocalAmbientId!=0xFF)
00151 {
00152 // take current ambient from pointLight
00153 CRGBA ambCorner= igPointLights[cellCorner.LocalAmbientId].getAmbient();
00154 rLocalAmbientFixed+= ambCorner.R * mulBi;
00155 gLocalAmbientFixed+= ambCorner.G * mulBi;
00156 bLocalAmbientFixed+= ambCorner.B * mulBi;
00157 // increase the influence of igPointLights in alpha
00158 aLocalAmbientFixed+= 255 * mulBi;
00159 }
00160 }
00161 }
00162 // interpolate PointLights.
00163 interp.interpolate(pointLightList, xSub/256.f, ySub/256.f);
00164
00165 // Final SunContribution
00166 sunContribution= sunContribFixed>>16;
00167
00168 // Final SunContribution
00169 localAmbient.R= rLocalAmbientFixed>>16;
00170 localAmbient.G= gLocalAmbientFixed>>16;
00171 localAmbient.B= bLocalAmbientFixed>>16;
00172 localAmbient.A= aLocalAmbientFixed>>16;
00173
00174 }
|
|
|
Definition at line 51 of file surface_light_grid.cpp. References NLMISC::IStream::serial(), and NLMISC::IStream::serialVersion().
00052 {
00053 (void)f.serialVersion(0);
00054 f.serial(Origin);
00055 f.serial(Width);
00056 f.serial(Height);
00057 f.serial(Cells);
00058 }
|
|
|
Definition at line 101 of file surface_light_grid.h. Referenced by NL3D::CIGSurfaceLight::build(), NL3D::CIGSurfaceLightBuild::buildPLDebugMesh(), NL3D::CInstanceLighter::getCurrentNeighborCell(), and NL3D::CInstanceLighter::light(). |
|
|
Definition at line 100 of file surface_light_grid.h. Referenced by NL3D::CInstanceLighter::isCurrentNeighborCellInSurface(), and NL3D::CInstanceLighter::light(). |
|
|
Definition at line 98 of file surface_light_grid.h. Referenced by NL3D::CInstanceLighter::light(). |
|
|
Definition at line 99 of file surface_light_grid.h. Referenced by NL3D::CInstanceLighter::getCurrentNeighborCell(), NL3D::CInstanceLighter::isCurrentNeighborCellInSurface(), and NL3D::CInstanceLighter::light(). |
1.3.6