Jump to content

  • Log In with Google      Sign In   
  • Create Account

We're offering banner ads on our site from just $5!

1. Details HERE. 2. GDNet+ Subscriptions HERE. 3. Ad upload HERE.


#Actualbelfegor

Posted 13 June 2013 - 12:44 PM

Might do better with vertex declaration since that way have more control, for example it can give you bytes offset to some element.

Here is example chopped from my old project:

D3DVERTEXELEMENT9 decl[MAX_FVF_DECL_SIZE];
hr = dxMesh->GetDeclaration(decl);
if(FAILED(hr))
    ...// handle error
bool havePosition  = false;
        bool haveNormal    = false;
        bool haveTexCoord0 = false;
        bool haveTexCoord1 = false;
        bool haveTangent   = false;
        bool haveBinormal  = false;

        WORD offsetToPosition  = 0;
        WORD offsetToNormal    = 0;
        WORD offsetToTexCoord0 = 0;
        WORD offsetToTexCoord1 = 0;
        WORD offsetToTangent   = 0;
        WORD offsetToBinormal  = 0;

        for(UINT i = 0; i < MAX_FVF_DECL_SIZE; ++i)
        {
            if(decl[i].Stream == 0xFF || decl[i].Stream != 0)
            {
                break;
            }

            if(decl[i].Usage == D3DDECLUSAGE_POSITION)
            {
                offsetToPosition = decl[i].Offset;
                havePosition      = true;
                continue;
            }

            if(decl[i].Usage == D3DDECLUSAGE_NORMAL)
            {
                offsetToNormal = decl[i].Offset;
                haveNormal      = true;
                continue;
            }

            if(decl[i].Usage == D3DDECLUSAGE_TEXCOORD && decl[i].UsageIndex == 0)
            {
                offsetToTexCoord0 = decl[i].Offset;
                haveTexCoord0      = true;
                continue;
            }

            if(decl[i].Usage == D3DDECLUSAGE_TEXCOORD && decl[i].UsageIndex == 1)
            {
                offsetToTexCoord1 = decl[i].Offset;
                haveTexCoord1      = true;
                continue;
            }

            if(decl[i].Usage == D3DDECLUSAGE_TANGENT)
            {
                offsetToTangent = decl[i].Offset;
                haveTangent      = true;
                continue;
            }

            if(decl[i].Usage == D3DDECLUSAGE_BINORMAL)
            {
                offsetToBinormal = decl[i].Offset;
                haveBinormal      = true;
                continue;
            }
            ...// add more what you need
        }
   

Then you lock and access what you need:

auto stride = dxMesh->GetNumBytesPerVertex();
BYTE* pVerts;
dxMesh->LockVertexBuffer(0, reinterpret_cast<LPVOID*>(&pVerts));
...
if(havePosition)
{
    for(DWORD i = 0; i < numVertices; ++i)
    {
        // assume that position is vec3
        // you can check vertex declaration for that also
        D3DXVECTOR3 pos = *reinterpret_cast<D3DXVECTOR3*>((i * stride) + pVerts + offsetToPosition);
    }
}

#3belfegor

Posted 13 June 2013 - 12:44 PM

Might do better with vertex declaration since that way have more control, for example it can give you bytes offset to some element.

Here is example chopped from my old project:

D3DVERTEXELEMENT9 decl[MAX_FVF_DECL_SIZE];
hr = dxMesh->GetDeclaration(decl);
if(FAILED(hr))
    ...// handle error
bool havePosition  = false;
        bool haveNormal    = false;
        bool haveTexCoord0 = false;
        bool haveTexCoord1 = false;
        bool haveTangent   = false;
        bool haveBinormal  = false;

        WORD offsetToPosition  = 0;
        WORD offsetToNormal    = 0;
        WORD offsetToTexCoord0 = 0;
        WORD offsetToTexCoord1 = 0;
        WORD offsetToTangent   = 0;
        WORD offsetToBinormal  = 0;

        for(UINT i = 0; i < MAX_FVF_DECL_SIZE; ++i)
        {
            if(decl[i].Stream == 0xFF || decl[i].Stream != 0)
            {
                break;
            }

            if(decl[i].Usage == D3DDECLUSAGE_POSITION)
            {
                offsetToPosition = decl[i].Offset;
                havePosition      = true;
                continue;
            }

            if(decl[i].Usage == D3DDECLUSAGE_NORMAL)
            {
                offsetToNormal = decl[i].Offset;
                haveNormal      = true;
                continue;
            }

            if(decl[i].Usage == D3DDECLUSAGE_TEXCOORD && decl[i].UsageIndex == 0)
            {
                offsetToTexCoord0 = decl[i].Offset;
                haveTexCoord0      = true;
                continue;
            }

            if(decl[i].Usage == D3DDECLUSAGE_TEXCOORD && decl[i].UsageIndex == 1)
            {
                offsetToTexCoord1 = decl[i].Offset;
                haveTexCoord1      = true;
                continue;
            }

            if(decl[i].Usage == D3DDECLUSAGE_TANGENT)
            {
                offsetToTangent = decl[i].Offset;
                haveTangent      = true;
                continue;
            }

            if(decl[i].Usage == D3DDECLUSAGE_BINORMAL)
            {
                offsetToBinormal = decl[i].Offset;
                haveBinormal      = true;
                continue;
            }
            ...// add more what you need
        }
   

Then you lock and access what you need:

auto stride = dxMesh->GetNumBytesPerVertex();
BYTE* pVerts = nullptr;
dxMesh->LockVertexBuffer(0, reinterpret_cast<LPVOID*>(&pVerts));
...
if(havePosition)
{
    for(DWORD i = 0; i < numVertices; ++i)
    {
        // assume that position is vec3
        // you can check vertex declaration for that also
        D3DXVECTOR3 pos = *reinterpret_cast<D3DXVECTOR3*>((i * stride) + pVerts + offsetToPosition);
    }
}

#2belfegor

Posted 13 June 2013 - 12:43 PM

Might do better with vertex declaration since that way have more control, for example it can give you bytes offset to some element.

Here is example chopped from my old project:

D3DVERTEXELEMENT9 decl[MAX_FVF_DECL_SIZE];
hr = dxMesh->GetDeclaration(decl);
if(FAILED(hr))
    ...// handle error
bool havePosition  = false;
        bool haveNormal    = false;
        bool haveTexCoord0 = false;
        bool haveTexCoord1 = false;
        bool haveTangent   = false;
        bool haveBinormal  = false;

        WORD offsetToPosition  = 0;
        WORD offsetToNormal    = 0;
        WORD offsetToTexCoord0 = 0;
        WORD offsetToTexCoord1 = 0;
        WORD offsetToTangent   = 0;
        WORD offsetToBinormal  = 0;

        for(UINT i = 0; i < MAX_FVF_DECL_SIZE; ++i)
        {
            if(decl[i].Stream == 0xFF || decl[i].Stream != 0)
            {
                break;
            }

            if(decl[i].Usage == D3DDECLUSAGE_POSITION)
            {
                offsetToPosition = decl[i].Offset;
                havePosition      = true;
                continue;
            }

            if(decl[i].Usage == D3DDECLUSAGE_NORMAL)
            {
                offsetToNormal = decl[i].Offset;
                haveNormal      = true;
                continue;
            }

            if(decl[i].Usage == D3DDECLUSAGE_TEXCOORD && decl[i].UsageIndex == 0)
            {
                offsetToTexCoord0 = decl[i].Offset;
                haveTexCoord0      = true;
                continue;
            }

            if(decl[i].Usage == D3DDECLUSAGE_TEXCOORD && decl[i].UsageIndex == 1)
            {
                offsetToTexCoord1 = decl[i].Offset;
                haveTexCoord1      = true;
                continue;
            }

            if(decl[i].Usage == D3DDECLUSAGE_TANGENT)
            {
                offsetToTangent = decl[i].Offset;
                haveTangent      = true;
                continue;
            }

            if(decl[i].Usage == D3DDECLUSAGE_BINORMAL)
            {
                offsetToBinormal = decl[i].Offset;
                haveBinormal      = true;
                continue;
            }
            ...// add more what you need
        }
   

Then you lock and access what you need:

auto stride = dxMesh->GetNumBytesPerVertex();
BYTE* pVerts = nullptr;
dxMesh->LockVertexBuffer(0, reinterpret_cast<LPVOID*>(&pDXVertices));
...
if(havePosition)
{
    for(DWORD i = 0; i < numVertices; ++i)
    {
        // assume that position is vec3
        // you can check vertex declaration for that also
        D3DXVECTOR3 pos = *reinterpret_cast<D3DXVECTOR3*>((i * stride) + pVerts + offsetToPosition);
    }
}

#1belfegor

Posted 13 June 2013 - 12:42 PM

Might do better with vertex declaration since that way have more control, for example it can give you bytes offset to some element.

Here is example chopped from my old project:

D3DVERTEXELEMENT9 decl[MAX_FVF_DECL_SIZE];
hr = dxMesh->GetDeclaration(decl);
if(FAILED(hr))
    ...// handle error
bool havePosition  = false;
        bool haveNormal    = false;
        bool haveTexCoord0 = false;
        bool haveTexCoord1 = false;
        bool haveTangent   = false;
        bool haveBinormal  = false;

        WORD offsetToPosition  = 0;
        WORD offsetToNormal    = 0;
        WORD offsetToTexCoord0 = 0;
        WORD offsetToTexCoord1 = 0;
        WORD offsetToTangent   = 0;
        WORD offsetToBinormal  = 0;

        for(UINT i = 0; i < MAX_FVF_DECL_SIZE; ++i)
        {
            if(decl[i].Stream == 0xFF || decl[i].Stream != 0)
            {
                break;
            }

            if(decl[i].Usage == D3DDECLUSAGE_POSITION)
            {
                offsetToPosition = decl[i].Offset;
                havePosition      = true;
                continue;
            }

            if(decl[i].Usage == D3DDECLUSAGE_NORMAL)
            {
                offsetToNormal = decl[i].Offset;
                haveNormal      = true;
                continue;
            }

            if(decl[i].Usage == D3DDECLUSAGE_TEXCOORD && decl[i].UsageIndex == 0)
            {
                offsetToTexCoord0 = decl[i].Offset;
                haveTexCoord0      = true;
                continue;
            }

            if(decl[i].Usage == D3DDECLUSAGE_TEXCOORD && decl[i].UsageIndex == 1)
            {
                offsetToTexCoord1 = decl[i].Offset;
                haveTexCoord1      = true;
                continue;
            }

            if(decl[i].Usage == D3DDECLUSAGE_TANGENT)
            {
                offsetToTangent = decl[i].Offset;
                haveTangent      = true;
                continue;
            }

            if(decl[i].Usage == D3DDECLUSAGE_BINORMAL)
            {
                offsetToBinormal = decl[i].Offset;
                haveBinormal      = true;
                continue;
            }
        }
   

 

Then you lock and access what you need:

auto stride = dxMesh->GetNumBytesPerVertex();
BYTE* pVerts = nullptr;
dxMesh->LockVertexBuffer(0, reinterpret_cast<LPVOID*>(&pDXVertices));
...
if(havePosition)
{
    for(DWORD i = 0; i < numVertices; ++i)
    {
        // assume that position is vec3
        // you can check vertex declaration for that also
        D3DXVECTOR3 pos = *reinterpret_cast<D3DXVECTOR3*>((i * stride) + pVerts + offsetToPosition);
    }
}

PARTNERS