Example #1
0
HRESULT D3DWMesh::DrawToRenderTargetInternals(ID3DWEffect *effect, ID3DWRenderTargetInternals *rtInternals)
{
  HRESULT hr;
  if(_vbMapped || _ibMapped)
  {
    V_HR_BREAK("Mesh is mapped. Unable to draw.");
    return HRESULT_FROM_WIN32(ERROR_INVALID_OPERATION);
  }

  if(!effect || !rtInternals)
    return E_POINTER;

  ComPtr<ID3DWEffectInternals> effectInternals;  
  hr = effect->QueryInterface(IID_PPV_ARGS(&effectInternals));
  if(FAILED(hr))
  {
    V_HR_BREAK("Invalid effect object passed to ID3DWMesh::Draw");
    return E_INVALIDARG;
  }

  _dc->IASetPrimitiveTopology(_topology);

  UINT stride = _vertexSize, offset = 0;
  _dc->IASetVertexBuffers(0, 1, _vb.AddressOf(), &stride, &offset);
  _dc->IASetIndexBuffer(_ib, DXGI_FORMAT_R32_UINT, 0);

  hr = effectInternals->LockTargets(rtInternals);
  if(FAILED(hr))
  {
    V_HR_BREAK("Unable draw to object because it is already bound as shader resource");
    return hr;
  }

  hr = rtInternals->SetAsTarget();
  if(FAILED(hr))
  {
    effectInternals->UnlockTargets();
    return hr;
  }

  hr = effectInternals->Apply();
  if(FAILED(hr))
  {
    effectInternals->UnlockTargets();
    return hr;
  }

  _dc->DrawIndexed(_nIndices, 0, 0);

  effectInternals->UnlockTargets();

  return S_OK;
}