Stratos: Punto de Encuentro de Desarrolladores

¡Bienvenido a Stratos!

Acceder

Foros





Uso de FVF de D3D

Iniciado por ethernet, 27 de Octubre de 2002, 06:03:22 PM

« anterior - próximo »

ethernet



       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

    ethernet

    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

    ethernet

    vosotros tb podeis postear, no mata y no es malo para la salud.

    saludos

    CoLSoN2

                                    io no posteo xq no le encuentro utilidad al codigo, pa kes esto ? pa ahorrarte 4 defines? XD                                
    Manuel F. Lara
    Descargar juegos indie  - blog sobre juegos indie y casual
    El Desarrollo Personal.com  - blog sobre productividad, motivación y espíritu emprendedor

    ethernet

    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






    Stratos es un servicio gratuito, cuyos costes se cubren en parte con la publicidad.
    Por favor, desactiva el bloqueador de anuncios en esta web para ayudar a que siga adelante.
    Muchísimas gracias.