// NeL - MMORPG Framework
// Copyright (C) 2010 Winch Gate Property Limited
//
// This program is free software: you can redistribute it and/or modify
// it under the terms of the GNU Affero General Public License as
// published by the Free Software Foundation, either version 3 of the
// License, or (at your option) any later version.
//
// This program is distributed in the hope that it will be useful,
// but WITHOUT ANY WARRANTY; without even the implied warranty of
// MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
// GNU Affero General Public License for more details.
//
// You should have received a copy of the GNU Affero General Public License
// along with this program. If not, see .
#include "std3d.h"
#include "nel/3d/hls_texture_bank.h"
using namespace std;
using namespace NLMISC;
namespace NL3D
{
// ***************************************************************************
// ***************************************************************************
// CHLSTextureBank
// ***************************************************************************
// ***************************************************************************
// ***************************************************************************
CHLSTextureBank::CHLSTextureBank()
{
}
// ***************************************************************************
void CHLSTextureBank::reset()
{
contReset(_ColorTextures);
contReset(_TextureInstanceData);
contReset(_TextureInstances);
}
// ***************************************************************************
uint32 CHLSTextureBank::addColorTexture(const CHLSColorTexture &tex)
{
_ColorTextures.push_back(tex);
return (uint32)_ColorTextures.size()-1;
}
// ***************************************************************************
void CHLSTextureBank::addTextureInstance(const std::string &name, uint32 colorTextureId, const vector &cols)
{
string nameLwr= toLower(name);
// checks
nlassert(colorTextureId<_ColorTextures.size());
CHLSColorTexture &colText= _ColorTextures[colorTextureId];
nlassert(cols.size()==colText.getNumMasks());
// new instance
CTextureInstance textInst;
textInst._ColorTextureId= colorTextureId;
textInst._DataIndex= (uint32)_TextureInstanceData.size();
// leave ptrs undefined
textInst._DataPtr= NULL;
textInst._ColorTexturePtr= NULL;
// allocate/fill data
uint32 nameSize= (uint32)(nameLwr.size()+1);
uint32 colSize= (uint32)cols.size()*sizeof(CHLSColorDelta);
_TextureInstanceData.resize(_TextureInstanceData.size() + nameSize + colSize);
// copy name
memcpy(&_TextureInstanceData[textInst._DataIndex], nameLwr.c_str(), nameSize);
// copy cols
memcpy(&_TextureInstanceData[textInst._DataIndex+nameSize], &cols[0], colSize);
// add the instance.
_TextureInstances.push_back(textInst);
}
// ***************************************************************************
void CHLSTextureBank::compilePtrs()
{
uint8 *data= &_TextureInstanceData[0];
// For all texture instances, compute ptr.
for(uint i=0;i<_TextureInstances.size();i++)
{
CTextureInstance &text= _TextureInstances[i];
text._DataPtr= data + text._DataIndex;
text._ColorTexturePtr= &_ColorTextures[text._ColorTextureId];
}
}
// ***************************************************************************
void CHLSTextureBank::compile()
{
// compile the ptrs.
compilePtrs();
// No other ops for now.
}
// ***************************************************************************
void CHLSTextureBank::serial(NLMISC::IStream &f)
{
f.serialVersion(0);
f.serialCont(_ColorTextures);
f.serialCont(_TextureInstanceData);
f.serialCont(_TextureInstances);
// Must compile ptrs.
if(f.isReading())
{
// compile the ptrs only.
compilePtrs();
}
}
// ***************************************************************************
void CHLSTextureBank::fillHandleArray(std::vector &array)
{
for(uint i=0;i<_TextureInstances.size();i++)
{
CTextureInstanceHandle h;
h.Texture= &_TextureInstances[i];
array.push_back(h);
}
}
// ***************************************************************************
// ***************************************************************************
// CHLSTextureBank::CTextureInstance
// ***************************************************************************
// ***************************************************************************
// ***************************************************************************
void CHLSTextureBank::CTextureInstance::serial(NLMISC::IStream &f)
{
f.serialVersion(0);
f.serial(_DataIndex);
f.serial(_ColorTextureId);
}
// ***************************************************************************
bool CHLSTextureBank::CTextureInstance::operator<(const CTextureInstance &t) const
{
// compare the 2 strings.
return (strcmp((const char*)_DataPtr, (const char*)t._DataPtr)<0);
}
// ***************************************************************************
bool CHLSTextureBank::CTextureInstance::operator<=(const CTextureInstance &t) const
{
// compare the 2 strings.
return (strcmp((const char*)_DataPtr, (const char*)t._DataPtr)<=0);
}
// ***************************************************************************
bool CHLSTextureBank::CTextureInstance::sameName(const char *str)
{
return (strcmp((const char*)_DataPtr, str)==0);
}
// ***************************************************************************
void CHLSTextureBank::CTextureInstance::buildColorVersion(NLMISC::CBitmap &out)
{
// get ptr to color deltas.
uint nameSize= (uint)strlen((const char*)_DataPtr)+1;
CHLSColorDelta *colDeltas= (CHLSColorDelta*)(_DataPtr + nameSize);
// build the texture.
_ColorTexturePtr->buildColorVersion(colDeltas, out);
}
} // NL3D