00001
00007
00008
00009
00010
00011
00012
00013
00014
00015
00016
00017
00018
00019
00020
00021
00022
00023
00024
00025
00026 #include "std3d.h"
00027
00028
00029 #include "3d/texture_near.h"
00030 using namespace NLMISC;
00031
00032 namespace NL3D
00033 {
00034
00035
00036
00037 CTextureNear::CTextureNear(sint size)
00038 {
00039 nlassert(size>=NL_TILE_LIGHTMAP_SIZE);
00040 nlassert(NLMISC::isPowerOf2(size));
00041
00042
00043
00044 setReleasable(false);
00045
00046 CBitmap::resize(size, size, CBitmap::RGBA);
00047
00048 setUploadFormat(ITexture::RGBA8888);
00049 setFilterMode(ITexture::Linear, ITexture::LinearMipMapOff);
00050
00051
00052 uint nbTilesByLine= size/NL_TILE_LIGHTMAP_SIZE;
00053 _FreeTiles.resize(nbTilesByLine*nbTilesByLine);
00054 _AvailableTiles.resize(nbTilesByLine*nbTilesByLine);
00055 for(sint i=0;i<(sint)_FreeTiles.size();i++)
00056 {
00057
00058 _FreeTiles[i]=i;
00059 _AvailableTiles[i]= true;
00060 }
00061
00062 }
00063
00064
00065 sint CTextureNear::getNbAvailableTiles()
00066 {
00067 return _FreeTiles.size();
00068 }
00069
00070 uint CTextureNear::getTileAndFillRect(CRGBA map[NL_TILE_LIGHTMAP_SIZE*NL_TILE_LIGHTMAP_SIZE])
00071 {
00072 nlassert(getNbAvailableTiles()>0);
00073 uint id= _FreeTiles.back();
00074
00075 _AvailableTiles[id]= false;
00076 _FreeTiles.pop_back();
00077
00078
00079 refillRect(id, map);
00080
00081 return id;
00082 }
00083
00084
00085 void CTextureNear::refillRect(uint id, CRGBA map[NL_TILE_LIGHTMAP_SIZE*NL_TILE_LIGHTMAP_SIZE])
00086 {
00087 uint dstWidth= getWidth();
00088
00089 uint nbTilesByLine= dstWidth/NL_TILE_LIGHTMAP_SIZE;
00090 uint s= id% nbTilesByLine;
00091 uint t= id/ nbTilesByLine;
00092 s*= NL_TILE_LIGHTMAP_SIZE;
00093 t*= NL_TILE_LIGHTMAP_SIZE;
00094 CRGBA *src= map;
00095 CRGBA *dst= (CRGBA*)&(*getPixels().begin());
00096 dst+= t*dstWidth+s;
00097 for(sint n= NL_TILE_LIGHTMAP_SIZE;n>0;n--, src+= NL_TILE_LIGHTMAP_SIZE, dst+= dstWidth)
00098 {
00099 memcpy(dst, src, NL_TILE_LIGHTMAP_SIZE*sizeof(CRGBA));
00100 }
00101
00102
00103 ITexture::touchRect(CRect(s, t, NL_TILE_LIGHTMAP_SIZE, NL_TILE_LIGHTMAP_SIZE));
00104 }
00105
00106
00107 void CTextureNear::releaseTile(uint id)
00108 {
00109 nlassert(!_AvailableTiles[id]);
00110
00111 _AvailableTiles[id]= true;
00112
00113 _FreeTiles.push_back(id);
00114 }
00115
00116
00117 }