//--------------------------------------------------------------------------------------
void RenderSubset( UINT iSubset )
{
    HRESULT hr;
    
    Material* pMaterial = g_MeshLoader.GetSubsetMaterial( iSubset );

    V( g_pAmbient->SetFloatVector( pMaterial->vAmbient ) );
    V( g_pDiffuse->SetFloatVector( pMaterial->vDiffuse ) );
    V( g_pSpecular->SetFloatVector( pMaterial->vSpecular ) );
    V( g_pOpacity->SetFloat( pMaterial->fAlpha ) );
    V( g_pSpecularPower->SetInt( pMaterial->nShininess ) );

    if ( !IsErrorResource( pMaterial->pTextureRV10 ) )
        g_ptxDiffuseVariable->SetResource( pMaterial->pTextureRV10 );

    D3D10_TECHNIQUE_DESC techDesc;
    pMaterial->pTechnique->GetDesc( &techDesc );

    for ( UINT p = 0; p < techDesc.Passes; ++p )
    {
        pMaterial->pTechnique->GetPassByIndex(p)->Apply(0);
        g_MeshLoader.GetMesh()->DrawSubset(iSubset);
    }
}
Example #2
0
void sdk_mesh::render(ID3D11DeviceContext* context, D3DXMATRIX* to_clip)
{
    D3D11_PRIMITIVE_TOPOLOGY PrimType = D3D11_PRIMITIVE_TOPOLOGY_UNDEFINED;

    assert(context);
    context->IASetInputLayout(vertex_layout_);
    
    context->VSSetShader(vs_, nullptr, 0);
    context->GSSetShader(nullptr, nullptr, 0);
    context->PSSetShader(ps_, nullptr, 0);
    
    //context->PSSetSamplers(0, 1, &ss_);

    context->OMSetBlendState(nullptr, nullptr, 0xFF);

    auto cbvs = cb_mesh_data_vs_.map(context);
    {
        D3DXMatrixTranspose(&cbvs->world, &world);
    }
    cb_mesh_data_vs_.unmap_vs(1);

    #define MAX_D3D11_VERTEX_STREAMS D3D11_IA_VERTEX_INPUT_RESOURCE_SLOT_COUNT

    if(sdk_mesh_->GetOutstandingBufferResources())
        return;

	//sdk_mesh_->RenderMesh(0, false, context, diffuse_tex_slot_, normal_tex_slot_, specular_tex_slot_);

    for(UINT m = 0; m < sdk_mesh_->GetNumMeshes(); m++)
    {
        SDKMESH_MESH* mesh = sdk_mesh_->GetMesh(m);

        UINT strides[MAX_D3D11_VERTEX_STREAMS];
        UINT offsets[MAX_D3D11_VERTEX_STREAMS];
        ID3D11Buffer* vb[MAX_D3D11_VERTEX_STREAMS];

        if(mesh->NumVertexBuffers > MAX_D3D11_VERTEX_STREAMS)
            return;

        for(UINT i = 0; i < mesh->NumVertexBuffers; ++i)
        {
            vb[i] = sdk_mesh_->GetVB11(m, i);
            strides[i] = sdk_mesh_->GetVertexStride(m, i);
            offsets[i] = 0;
        }

        ID3D11Buffer* index_buffer = sdk_mesh_->GetIB11(m);
        DXGI_FORMAT format = sdk_mesh_->GetIBFormat11(m);
    
        context->IASetVertexBuffers(0, mesh->NumVertexBuffers, vb, strides, offsets);
        context->IASetIndexBuffer(index_buffer, format, 0);

        for(UINT s = 0; s < mesh->NumSubsets; s++)
        {
            SDKMESH_SUBSET* subset = sdk_mesh_->GetSubset(m, s);
		
            auto pt = sdk_mesh_->GetPrimitiveType11(static_cast<SDKMESH_PRIMITIVE_TYPE>(subset->PrimitiveType));
            context->IASetPrimitiveTopology(pt);

            SDKMESH_MATERIAL* material = sdk_mesh_->GetMaterial(subset->MaterialID);

            auto cb = cb_mesh_data_ps_.map(context);
            {
                cb->diffuse_color    = material->Diffuse;
                cb->has_diffuse_tex  = material->pDiffuseRV11  != nullptr && diffuse_tex_slot_  != -1 && !IsErrorResource(material->pDiffuseRV11);
                cb->has_normal_tex   = material->pNormalRV11   != nullptr && normal_tex_slot_   != -1 && !IsErrorResource(material->pNormalRV11);
                cb->has_specular_tex = material->pSpecularRV11 != nullptr && specular_tex_slot_ != -1 && !IsErrorResource(material->pSpecularRV11);
                cb->has_alpha_tex    = false;
            }
            cb_mesh_data_ps_.unmap_ps(0);

            if (cb->has_diffuse_tex)
                context->PSSetShaderResources(diffuse_tex_slot_, 1, &material->pDiffuseRV11);

            if (cb->has_normal_tex)
                context->PSSetShaderResources(normal_tex_slot_, 1, &material->pNormalRV11);

            if (cb->has_specular_tex)
                context->PSSetShaderResources(specular_tex_slot_, 1, &material->pSpecularRV11);

            UINT index_count  = static_cast<UINT>(subset->IndexCount);
            UINT index_start  = static_cast<UINT>(subset->IndexStart);
            UINT vertex_start = static_cast<UINT>(subset->VertexStart);
        
            context->DrawIndexed(index_count, index_start, vertex_start);
        }
    }

}
//--------------------------------------------------------------------------------------
void CDXUTSDKMesh::Destroy()
{

    if (m_pStaticMeshData)
    {
        if (m_pMaterialArray)
        {
            for (UINT64 m = 0; m < m_pMeshHeader->NumMaterials; m++)
            {
                if (m_pDev11)
                {
                    //ID3D11Resource* pRes = NULL;
                    if (m_pMaterialArray[m].pDiffuseRV11 && !IsErrorResource(m_pMaterialArray[m].pDiffuseRV11))
                    {
                        //m_pMaterialArray[m].pDiffuseRV11->GetResource( &pRes );
                        //SAFE_RELEASE( pRes );

                        m_pMaterialArray[m].pDiffuseRV11->Release();
                    }
                    if (m_pMaterialArray[m].pNormalRV11 && !IsErrorResource(m_pMaterialArray[m].pNormalRV11))
                    {
                        //m_pMaterialArray[m].pNormalRV11->GetResource( &pRes );
                        //SAFE_RELEASE( pRes );

                        m_pMaterialArray[m].pNormalRV11->Release();
                    }
                    if (m_pMaterialArray[m].pSpecularRV11 && !IsErrorResource(m_pMaterialArray[m].pSpecularRV11))
                    {
                        //m_pMaterialArray[m].pSpecularRV11->GetResource( &pRes );
                        //SAFERELEASE( pRes );

                        m_pMaterialArray[m].pSpecularRV11->Release();
                    }
                }
            }
        }
    }

    if (m_pVertexBufferArray)
    {
        for (UINT64 i = 0; i < m_pMeshHeader->NumVertexBuffers; i++)
        {
            if (m_pVertexBufferArray[i].pVB11)
            {
                m_pVertexBufferArray[i].pVB11->Release();
            }
        }
    }

    if (m_pIndexBufferArray)
    {
        for (UINT64 i = 0; i < m_pMeshHeader->NumIndexBuffers; i++)
        {
            if (m_pIndexBufferArray[i].pIB11)
            {
                m_pIndexBufferArray[i].pIB11->Release();
            }
        }
    }

    if (m_pAdjacencyIndexBufferArray)
    {
        for (UINT64 i = 0; i < m_pMeshHeader->NumIndexBuffers; i++)
        {
            if (m_pAdjacencyIndexBufferArray[i].pIB11)
            {
                m_pAdjacencyIndexBufferArray[i].pIB11->Release();
            }
        }
    }

    if (m_pAdjacencyIndexBufferArray)
        delete[] m_pAdjacencyIndexBufferArray;

    if (m_bCopyStatic && m_pHeapData)
        delete[] m_pHeapData;
    m_pStaticMeshData = NULL;

    if (m_pAnimationData)
        delete[] m_pAnimationData;
    if (m_pBindPoseFrameMatrices)
        delete[] m_pBindPoseFrameMatrices;
    if (m_pTransformedFrameMatrices)
        delete[] m_pTransformedFrameMatrices;
    if (m_pWorldPoseFrameMatrices)
        delete[] m_pWorldPoseFrameMatrices;

    if (m_ppVertices)
        delete[] m_ppVertices;
    if (m_ppIndices)
        delete[] m_ppIndices;

    m_pMeshHeader = NULL;
    m_pVertexBufferArray = NULL;
    m_pIndexBufferArray = NULL;
    m_pMeshArray = NULL;
    m_pSubsetArray = NULL;
    m_pFrameArray = NULL;
    m_pMaterialArray = NULL;

    m_pAnimationHeader = NULL;
    m_pAnimationFrameData = NULL;
}