// 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/u_instance_material.h" #include "nel/3d/async_texture_block.h" #include "nel/3d/mesh_base_instance.h" #include "nel/3d/driver.h" #include "nel/3d/texture_mem.h" #include "nel/3d/texture_file.h" #ifdef DEBUG_NEW #define new DEBUG_NEW #endif namespace NL3D { // *************************************************************************** bool UInstanceMaterial::isTextureFile(uint stage) const { if (stage >= IDRV_MAT_MAXTEXTURES) { nlwarning("UInstanceMaterialUser::isTextureFile : invalid stage"); return false; } return dynamic_cast(_Object->getTexture(stage)) != NULL; } // *************************************************************************** std::string UInstanceMaterial::getTextureFileName(uint stage) const { if (stage >= IDRV_MAT_MAXTEXTURES) { nlwarning("UInstanceMaterialUser::getTextureFileName : invalid stage"); return ""; } // If Async mode if(_MBI->getAsyncTextureMode()) { nlassert(_AsyncTextureBlock->isTextureFile(stage)); // return name of the async one. return _AsyncTextureBlock->TextureNames[stage]; } else { // return the name in the material return NLMISC::safe_cast(_Object->getTexture(stage))->getFileName(); } } // *************************************************************************** void UInstanceMaterial::setTextureFileName(const std::string &fileName, uint stage) { if (stage >= IDRV_MAT_MAXTEXTURES) { nlwarning("UInstanceMaterialUser::setTextureFileName : invalid stage"); return; } // If Async mode if(_MBI->getAsyncTextureMode()) { if(!_AsyncTextureBlock->isTextureFile(stage)) { nlwarning("UInstanceMaterialUser::setTextureFileName : the texture is not a texture file"); return; } // replace the fileName _AsyncTextureBlock->TextureNames[stage]= fileName; // Flag the instance. _MBI->setAsyncTextureDirty(true); } else { CTextureFile *otherTex = dynamic_cast(_Object->getTexture(stage)); if (!otherTex) { nlwarning("UInstanceMaterialUser::setTextureFileName : the texture is not a texture file"); return; } CTextureFile *tf = new CTextureFile(*otherTex); tf->setFileName(fileName); NLMISC::CSmartPtr old = _Object->getTexture(stage); _Object->setTexture(stage, tf); } } // *************************************************************************** void UInstanceMaterial::emptyTexture(uint stage /*=0*/) { if (stage >= IDRV_MAT_MAXTEXTURES) { nlwarning("UInstanceMaterialUser::emptyTexture : invalid stage"); return; } _Object->setTexture(stage, NULL); } // *************************************************************************** /*bool UInstanceMaterial::isSupportedByDriver(UDriver &drv, bool forceBaseCaps) { IDriver *idrv = NLMISC::safe_cast(&drv)->getDriver(); return _Object->isSupportedByDriver(*idrv, forceBaseCaps); }*/ // *************************************************************************** void UInstanceMaterial::setTextureMem(uint stage, uint8 *data, uint32 length, bool _delete, bool isFile /*=true*/, uint width /*=0*/, uint height /*=0*/, CBitmap::TType texType /*=CBitmap::RGBA*/) { if (stage >= IDRV_MAT_MAXTEXTURES) { nlwarning("UInstanceMaterialUser::emptyTexture : invalid stage"); return; } _Object->setTexture((uint8) stage, new CTextureMem(data, length, _delete, isFile, width, height, texType)); } // *************************************************************************** bool UInstanceMaterial::isLighted() const { return _Object->isLighted(); } // *************************************************************************** void UInstanceMaterial::setLighting(bool active, CRGBA emissive /*=CRGBA(0,0,0)*/, CRGBA ambient /*=CRGBA(0,0,0)*/, CRGBA diffuse /*=CRGBA(0,0,0)*/, CRGBA specular /*=CRGBA(0,0,0)*/, float shininess /*=10*/) { _Object->setLighting(active, emissive, ambient, diffuse, specular, shininess); } // *************************************************************************** bool UInstanceMaterial::isUserColor() const { return _Object->getShader()==CMaterial::UserColor; } // *************************************************************************** void UInstanceMaterial::setEmissive( CRGBA emissive ) { _Object->setEmissive(emissive); } // *************************************************************************** void UInstanceMaterial::setAmbient( CRGBA ambient ) { _Object->setAmbient( ambient); } // *************************************************************************** void UInstanceMaterial::setDiffuse( CRGBA diffuse ) { _Object->setDiffuse( diffuse); } // *************************************************************************** void UInstanceMaterial::setOpacity( uint8 opa ) { _Object->setOpacity( opa ); } // *************************************************************************** void UInstanceMaterial::setSpecular( CRGBA specular ) { _Object->setSpecular( specular); } // *************************************************************************** void UInstanceMaterial::setShininess( float shininess ) { _Object->setShininess( shininess ); } // *************************************************************************** CRGBA UInstanceMaterial::getEmissive() const { return _Object->getEmissive(); } // *************************************************************************** CRGBA UInstanceMaterial::getAmbient() const { return _Object->getAmbient(); } // *************************************************************************** CRGBA UInstanceMaterial::getDiffuse() const { return _Object->getDiffuse(); } // *************************************************************************** uint8 UInstanceMaterial::getOpacity() const { return _Object->getOpacity(); } // *************************************************************************** CRGBA UInstanceMaterial::getSpecular() const { return _Object->getSpecular(); } // *************************************************************************** float UInstanceMaterial::getShininess() const { return _Object->getShininess(); } // *************************************************************************** void UInstanceMaterial::setColor(CRGBA rgba) { _Object->setColor(rgba) ; } // *************************************************************************** CRGBA UInstanceMaterial::getColor(void) const { return _Object->getColor(); } // *************************************************************************** void UInstanceMaterial::setUserColor(CRGBA userColor) { if(isUserColor()) _Object->setUserColor(userColor); } // *************************************************************************** CRGBA UInstanceMaterial::getUserColor() const { if(isUserColor()) return _Object->getUserColor(); else return CRGBA(0,0,0,0); } // *************************************************************************** void UInstanceMaterial::setConstantColor(uint stage, NLMISC::CRGBA color) { if (stage >= IDRV_MAT_MAXTEXTURES) { nlwarning("UInstanceMaterialUser::setConstantColor : invalid stage"); return; } _Object->texConstantColor(stage, color); } // *************************************************************************** NLMISC::CRGBA UInstanceMaterial::getConstantColor(uint stage) const { if (stage >= IDRV_MAT_MAXTEXTURES) { nlwarning("UInstanceMaterialUser::getConstantColor : invalid stage"); return NLMISC::CRGBA::Black; } return _Object->getTexConstantColor(stage); } // *************************************************************************** sint UInstanceMaterial::getLastTextureStage() const { sint lastStage = -1; for(uint k = 0; k < IDRV_MAT_MAXTEXTURES; ++k) { if (_Object->getTexture(k) != NULL) { lastStage = k; } } return lastStage; } // *************************************************************************** void UInstanceMaterial::setBlend(bool active) { _Object->setBlend(active); } // *************************************************************************** void UInstanceMaterial::setBlendFunc(TBlend src, TBlend dst) { _Object->setBlendFunc((CMaterial::TBlend)(uint32)src, (CMaterial::TBlend)(uint32)dst); } // *************************************************************************** void UInstanceMaterial::setSrcBlend(TBlend val) { _Object->setSrcBlend((CMaterial::TBlend)(uint32)val); } // *************************************************************************** void UInstanceMaterial::setDstBlend(TBlend val) { _Object->setDstBlend((CMaterial::TBlend)(uint32)val); } // *************************************************************************** void UInstanceMaterial::setAlphaTestThreshold(float at) { _Object->setAlphaTestThreshold(at); } // *************************************************************************** float UInstanceMaterial::getAlphaTestThreshold() const { return _Object->getAlphaTestThreshold(); } // *************************************************************************** void UInstanceMaterial::setAlphaTest(bool active) { _Object->setAlphaTest(active); } // *************************************************************************** void UInstanceMaterial::setZWrite(bool active) { _Object->setZWrite(active); } // *************************************************************************** void UInstanceMaterial::setZFunc(ZFunc val) { _Object->setZFunc((CMaterial::ZFunc) val); } // *************************************************************************** bool UInstanceMaterial::getBlend() const { return _Object->getBlend(); } // *************************************************************************** UInstanceMaterial::TBlend UInstanceMaterial::getSrcBlend(void) const { return (UInstanceMaterial::TBlend)(uint32)_Object->getSrcBlend(); } // *************************************************************************** UInstanceMaterial::TBlend UInstanceMaterial::getDstBlend(void) const { return (UInstanceMaterial::TBlend)(uint32)_Object->getDstBlend(); } // *************************************************************************** void UInstanceMaterial::enableUserTexMat(uint stage, bool enabled) { if (stage >= IDRV_MAT_MAXTEXTURES) { nlwarning("UInstanceMaterial::enableUserTexMat : stage %d is invalid", stage); return; } _Object->enableUserTexMat(stage, enabled); } // *************************************************************************** bool UInstanceMaterial::isUserTexMatEnabled(uint stage) const { if (stage >= IDRV_MAT_MAXTEXTURES) { nlwarning("UInstanceMaterial::enableUserTexMat : stage %d is invalid", stage); return false; } return _Object->isUserTexMatEnabled(stage); } // *************************************************************************** void UInstanceMaterial::setUserTexMat(uint stage, const NLMISC::CMatrix &m) { if (stage >= IDRV_MAT_MAXTEXTURES) { nlwarning("UInstanceMaterial::enableUserTexMat : stage %d is invalid", stage); return; } if (!_Object->isUserTexMatEnabled(stage)) { nlwarning("UInstanceMaterial::setUserTexMat : texture stage %d has no user matrix.", stage); } _Object->setUserTexMat(stage, m); } // *************************************************************************** const NLMISC::CMatrix &UInstanceMaterial::getUserTexMat(uint stage) const { if (stage >= IDRV_MAT_MAXTEXTURES) { nlwarning("UInstanceMaterial::enableUserTexMat : stage %d is invalid", stage); return CMatrix::Identity; } if (!_Object->isUserTexMatEnabled(stage)) { nlwarning("UInstanceMaterial::setUserTexMat : texture stage %d has no user matrix.", stage); return CMatrix::Identity; } return _Object->getUserTexMat(stage); } // *************************************************************************** void UInstanceMaterial::setWrapS(uint stage, TWrapMode mode) { if (stage >= IDRV_MAT_MAXTEXTURES || _Object->getTexture(stage) == NULL) { nlwarning("UInstanceMaterial::setWrapS : stage %d is invalid or there's no texture", stage); return; } _Object->getTexture(stage)->setWrapS((ITexture::TWrapMode) mode); } // *************************************************************************** void UInstanceMaterial::setWrapT(uint stage, TWrapMode mode) { if (stage >= IDRV_MAT_MAXTEXTURES || _Object->getTexture(stage) == NULL) { nlwarning("UInstanceMaterial::setWrapT : stage %d is invalid or there's no texture", stage); return; } _Object->getTexture(stage)->setWrapT((ITexture::TWrapMode) mode); } // *************************************************************************** UInstanceMaterial::TWrapMode UInstanceMaterial::getWrapS(uint stage) const { if (stage >= IDRV_MAT_MAXTEXTURES || _Object->getTexture(uint8(stage)) == NULL) { nlwarning("UInstanceMaterial::getWrapS : stage %d is invalid or there's no texture", stage); return Repeat; } return (TWrapMode) _Object->getTexture(uint8(stage))->getWrapS(); } // *************************************************************************** UInstanceMaterial::TWrapMode UInstanceMaterial::getWrapT(uint stage) const { if (stage >= IDRV_MAT_MAXTEXTURES || _Object->getTexture(uint8(stage)) == NULL) { nlwarning("UInstanceMaterial::getWrapT : stage %d is invalid or there's no texture", stage); return Repeat; } return (TWrapMode) _Object->getTexture(uint8(stage))->getWrapT(); } // *************************************************************************** } // NL3D