Hi,
I'm working on an night vision effect and i have a little problem with it.
My NVG effect is rendered using two shader :
* One is a postprocessing effect wich "greenify" and a little noise to the
sceen. This one work OK.
* Second, wich i have problem with, is a thermal like effect that allow
entitie to be hilighted. In fact the problem does not come from the shader
itself, wich is working OK. The probleme is that i have to get materials
from a given model to replace the shader it use. Currently i'm using the
fonction 'ForcedMaterialOverride', to replace rendered material and try to
get the model base texture with this code :
[CODE]
IMaterial* pMaterial = materials->FindMaterial( "hl2ctf/nvg/thermal",
TEXTURE_GROUP_OTHER );
if (pMaterial == NULL)
return;
IMaterialVar* pVarBaseTextureDestination = HL2CTF_GetShaderParam(pMaterial,
"$basetexture");
C_BasePlayer* pLocal = C_BasePlayer::GetLocalPlayer();
Vector vLook;
if (pVarBaseTextureDestination == NULL)
{
Msg("Cannot find $BASETEXTURE on Thermal material !\n");
return;
}
AngleVectors(pLocal->GetLocalAngles(), &vLook);
VectorNormalize(vLook);
const model_t* pModel = pEntity->GetModel();
bool bBaseTextureFound = false;
studiohdr_t* pStudio = modelinfo->GetStudiomodel(pModel);
if (pStudio)
{
if (pStudio->numtextures > 0)
{
mstudiotexture_t* pTextureStudio = pStudio->pTexture(0);
const char* pTexturePath = pStudio->pCdtexture(0);
char pSearchPath[255] = {0};
Q_strcpy(pSearchPath, pTexturePath);
Q_strcat(pSearchPath, pTextureStudio->pszName());
ITexture* pTexture = materials->FindTexture(pSearchPath,
TEXTURE_GROUP_MODEL);
if (pTexture && pTexture->IsError() == false)
{
pVarBaseTextureDestination->SetTextureValue(pTexture);
bBaseTextureFound = true;
}
}
}
if (!bBaseTextureFound)
{
ITexture* pWhiteTexture = materials->FindTexture("hl2ctf/nvg/white",
TEXTURE_GROUP_OTHER);
pVarBaseTextureDestination->SetTextureValue(pWhiteTexture);
}
IMaterialVar* pVar = HL2CTF_GetShaderParam(pMaterial, "$light_direction");
if (pVar)
pVar->SetVecValue(vLook.x, vLook.y, vLook.z);
modelrender->ForcedMaterialOverride( pMaterial );
[/CODE]
But if the model have more than one material applyed to it, this code just
does not work (all part of the model are rendered with the same material /
texture).
You can download a video of the problem at
http://www.urba3d.com/hl2ctf/nvg.avi (look at the flag and the weapon with /
without nvg).
Is anyone have an idea / trick to get all the materials from a model ? I've
tried "modelinfo->GetModelMaterialCount" and "modelinfo->GetModelMaterials"
but these functions doesn't seems to work.
Sorry for my bad english :).
By Olivier.
_______________________________________________
To unsubscribe, edit your list preferences, or view the list archives, please
visit:
http://list.valvesoftware.com/mailman/listinfo/hlcoders