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 #include "3d/texture_blend.h"
00029 #include "nel/misc/common.h"
00030
00031 namespace NL3D {
00032
00033
00034
00035 CTextureBlend::CTextureBlend() : _BlendFactor(0), _SharingEnabled(true)
00036 {
00037 }
00038
00039
00040
00041 bool CTextureBlend::supportSharing() const
00042 {
00043 return _BlendTex[0] && _BlendTex[0]->supportSharing()
00044 && _BlendTex[1] && _BlendTex[1]->supportSharing();
00045 }
00046
00047
00048 std::string CTextureBlend::getShareName() const
00049 {
00050 nlassert(supportSharing());
00051 char fmt[1024];
00052 NLMISC::smprintf(fmt, 1024, "BlendTex0:%s:BlendTex1:%s:blendFactor:%d",
00053 _BlendTex[0]->getShareName().c_str(), _BlendTex[1]->getShareName().c_str(),
00054 (uint) _BlendFactor
00055 );
00056 return fmt;
00057 }
00058
00059
00060
00061 void CTextureBlend::enableSharing(bool enabled )
00062 {
00063 _SharingEnabled = enabled;
00064 }
00065
00066
00067
00068 void CTextureBlend::release()
00069 {
00070 if (_BlendTex[0] && _BlendTex[0]->getReleasable()) _BlendTex[0]->release();
00071 if (_BlendTex[1] && _BlendTex[1]->getReleasable()) _BlendTex[1]->release();
00072 ITexture::release();
00073 }
00074
00075
00076 bool CTextureBlend::setBlendFactor(uint16 factor)
00077 {
00078 nlassert(factor <= 256);
00079 if (factor != _BlendFactor)
00080 {
00081 _BlendFactor = factor;
00082 touch();
00083 return true;
00084 }
00085 return false;
00086 }
00087
00088
00089
00090 void CTextureBlend::setBlendTexture(uint index, ITexture *tex)
00091 {
00092 nlassert(index < 2);
00093 if (tex != _BlendTex[index])
00094 {
00095 _BlendTex[index] = tex;
00096 touch();
00097 }
00098 }
00099
00100
00101
00102 void CTextureBlend::doGenerate()
00103 {
00104 if (!_BlendTex[0] || !_BlendTex[1])
00105 {
00106 makeDummy();
00107 return;
00108 }
00109
00110 _BlendTex[0]->generate();
00111 _BlendTex[1]->generate();
00112 this->blend(*_BlendTex[0], *_BlendTex[1], _BlendFactor);
00113 }
00114
00115
00116
00117 void CTextureBlend::serial(NLMISC::IStream &f) throw(NLMISC::EStream)
00118 {
00119 f.serialVersion(0);
00120 ITexture::serial(f);
00121 for (uint k = 0; k < 2; ++k)
00122 {
00123 ITexture *tex = NULL;
00124 if (f.isReading())
00125 {
00126 f.serialPolyPtr(tex);
00127 _BlendTex[k] = tex;
00128 touch();
00129 }
00130 else
00131 {
00132 tex = _BlendTex[k];
00133 f.serialPolyPtr(tex);
00134 }
00135 }
00136 f.serial(_SharingEnabled, _BlendFactor);
00137 }
00138
00139 }