Este es un viejo código muy útil para todos aquellos que utilizan el FVF
de D3D. Al tener una estructura con muchas posibilidades, se plantea
tener un sistema fácil de acceso a las propiedades. Por ejemplo, podemos
tener mallas con Diffuse y otras que no lo tienen. Y si tienen diffuse y
queremos modificarlo directamente, necesitamos saber en qué posición de
memoria se encuentran, que despende totalmente de los FVF que se hayan
asignado para esta malla
Pues con este código, se guarda el valor del desplamzamiento en una
variable y luego se aplica donde sea conveniente. Asó el FVF se
convierte en algo transparente para el desarrollador, puesto que llama
al método EstablecerDiffuse sin preocuparle cómo está formado el FVF
¡Espero que os guste!
void CXMalla::EstablecerFVF(DWORD FVF,bool convertir)
{
DWORD d;CXFVF ant;
m_FVF.FVF=FVF;
m_FVF.tamanyo=D3DXGetFVFVertexSize(FVF);
m_FVF.desp_diffuse=0;
m_FVF.desp_specular=0;
for(d=0;d<CX_MAX_MTEXT;d++) m_FVF.desp_textura[d]=0;
// Calculamos el desplazamiento en bytes
d=0;
if((FVF & D3DFVF_XYZ)==D3DFVF_XYZ) d=3*4; // 3 float
if((FVF & D3DFVF_XYZRHW)==D3DFVF_XYZRHW) d=4*4; // 4 float
if((FVF & D3DFVF_XYZB1)==D3DFVF_XYZB1) d=(3+1)*4;
if((FVF & D3DFVF_XYZB2)==D3DFVF_XYZB2) d=(3+2)*4;
if((FVF & D3DFVF_XYZB3)==D3DFVF_XYZB3) d=(3+3)*4;
if((FVF & D3DFVF_XYZB4)==D3DFVF_XYZB4) d=(3+4)*4;
if((FVF & D3DFVF_XYZB5)==D3DFVF_XYZB5) d=(3+5)*4;
if(FVF & D3DFVF_NORMAL) d+=(3)*4;
if(FVF & D3DFVF_PSIZE) d+=(1)*4;
if(FVF & D3DFVF_DIFFUSE) {
m_FVF.desp_diffuse=d;
d+=(1)*4;
}
if(FVF & D3DFVF_SPECULAR) {
m_FVF.desp_specular=d;
d+=(1)*4;
}
DWORD w,k=FVF>>D3DFVF_TEXCOUNT_SHIFT;
if(k>CX_MAX_MTEXT) k=CX_MAX_MTEXT;
for(w=0;w<k;w++) {
m_FVF.desp_textura[w]=d;
d+=(2)*4;
}
}
void CXMalla::EstablecerDiffuse(DWORD Diffuse,DWORD inicial,DWORD nvert)
{
CXVERTEX *dest;DWORD *diffuse,n;
if(m_FVF.desp_diffuse==0) return;
m_VB->Lock(0,0,(BYTE **)&dest,0);
// Saltamos hasta el diffuse
dest+=m_FVF.desp_diffuse;
if(nvert!=0) {
dest+=inicial*m_FVF.tamanyo;
n=nvert;
}
else n=m_NVertices;
while(n-->0) {
diffuse=(DWORD *)dest;
*diffuse=Diffuse;
dest+=m_FVF.tamanyo;
}
m_VB->Unlock();
}
Éste código fue enviado por Drácula el sábado, 26 de octubre de 2002 dracular@ono.com
Si quieres enviar tu propio código hazlo a eth_cotd@lycos.es
No he usado nunca d3d pero aunque sean un poco estupideces no esta mal comentarlas:
-En EstablecerDiffuse te puede ahorrar la variable DWORD *diffuse haciendo:
*(DWORD *)dest=Diffuse;
o mucho mejor usar los cast de c++
*static_cast<DWORD *>dest=Diffuse;
-Por otro lado en ese cast vas a dar a un vector de d3d, no se como van los vectores en d3d pero cuando se hacen cosas de esas hay q tener en cuenta el factor de empaquetamiento.
Saludos
vosotros tb podeis postear, no mata y no es malo para la salud.
saludos
io no posteo xq no le encuentro utilidad al codigo, pa kes esto ? pa ahorrarte 4 defines? XD
Por esto mismo pongo en las recomendaciones q es mejor poner un codigo donde lo uses o un ejemplo de uso, mucho mas visible.
saludos