//-------------------------------------------------------------------------------------- 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); } }
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; }