void NX::Sphere::Render(struct NX::RenderParameter &renderer) { if (!m_pVertexs) { return; } SetupLightingInfo(renderer); int nV = (m_iStacks - 1) * (m_iSlices + 1) + 2; IDirect3DDevice9 *pDevice = renderer.pDXDevice; m_pEffect->SetMatrix(m_pEffect->GetParameterByName(NULL, "PVMMatrix"), (D3DXMATRIX*)&(renderer.pProjectController->GetWatchMatrix() * GetTransform().GetTransformMatrix())); m_pEffect->SetTexture(m_pEffect->GetParameterByName(NULL, "BaseColor"),NX::DX9TextureManager::Instance().GetTexture(m_TextureFilePath)); UINT uPasses = 0; m_pEffect->Begin(&uPasses, 0); for (int i = 0; i < uPasses; ++i) { pDevice->SetVertexDeclaration(m_pVertexDesc); pDevice->SetStreamSource(0, m_pVertexBuffer, 0, sizeof(Vertex)); pDevice->SetIndices(m_pIndexBuffer); m_pEffect->BeginPass(i); pDevice->DrawIndexedPrimitive(D3DPT_TRIANGLEFAN, 0, 0, m_iSlices + 2, 0, m_iSlices); pDevice->DrawIndexedPrimitive(D3DPT_TRIANGLESTRIP, 0, 0, (m_iStacks - 2) * (m_iSlices + 1) * 2, m_iSlices + 2, (m_iStacks - 2) * (m_iSlices + 1) * 2); pDevice->DrawIndexedPrimitive(D3DPT_TRIANGLEFAN, 0, 0, m_iSlices + 2, (m_iStacks - 2) * (m_iSlices + 1) * 2 + m_iSlices + 2, m_iSlices); m_pEffect->EndPass(); } m_pEffect->End(); }
Air::U1 System::DrawOpt( const DrawOption& opt ) { IDirect3DDevice9* pDev = GetGlobal().m_pDevice; D3DPRIMITIVETYPE drawType = (D3DPRIMITIVETYPE)opt.m_DrawType; if(opt.m_uiInstanceCount!=0){ SetStreamSourceFreq( 0, D3DSTREAMSOURCE_INDEXEDDATA | opt.m_uiInstanceCount); SetStreamSourceFreq( 1, D3DSTREAMSOURCE_INSTANCEDATA | 1ul ); } switch(opt.m_DrawFuncType){ case Draw::FUNC_TYPE_DP:{ pDev->DrawPrimitive(drawType, opt.m_uiBaseVertexIndex, opt.m_uiFaceCount); break;} case Draw::FUNC_TYPE_DIP:{ pDev->DrawIndexedPrimitive(drawType, opt.m_uiBaseVertexIndex, 0, opt.m_uiVertexCount, opt.m_uiStartIndex, opt.m_uiFaceCount); break;} } if(opt.m_uiInstanceCount!=0){ SetStreamSourceFreq(0,1); SetStreamSourceFreq(1,1); } return true; }
void TexCube::Render() { if(NULL == m_pWnd || NULL == m_pVB || NULL == m_pIB) { return; } IDirect3DDevice9* pDev = m_pWnd->GetD3DDevice(); pDev->SetStreamSource(0, m_pVB, 0, sizeof(SRNormalTextureVertex)); pDev->SetFVF(SRNormalTextureVertex::FVF); pDev->SetIndices(m_pIB); pDev->DrawIndexedPrimitive(D3DPT_TRIANGLELIST, 0, 0, 24, 0, 12); }
void f2dGraphics2DImpl::flush(bool Discard) { if(m_Commands.empty()) { if(Discard) { // 解锁缓冲区 m_pVB->Unlock(); m_pIB->Unlock(); m_pVB->Lock(0, m_VBMaxCount * sizeof(f2dGraphics2DVertex), (void**)&m_pVBData, D3DLOCK_DISCARD); m_pIB->Lock(0, m_IBMaxCount * sizeof(fuShort), (void**)&m_pIBData, D3DLOCK_DISCARD); m_VBUsedCount = 0; m_IBUsedCount = 0; m_VBAlloced = 0; m_IBAlloced = 0; } else return; } // 解锁缓冲区 m_pVB->Unlock(); m_pIB->Unlock(); // 绘制并统计有效顶点个数 IDirect3DDevice9* pDev = (IDirect3DDevice9*)m_pParent->GetHandle(); vector<RenderCommand>::iterator i = m_Commands.begin(); while(i != m_Commands.end()) { if(i->pTex) { pDev->SetTexture(0, (IDirect3DBaseTexture9*)i->pTex->GetHandle()); i->pTex->Release(); } else pDev->SetTexture(0, NULL); pDev->DrawIndexedPrimitive(D3DPT_TRIANGLELIST, m_VBUsedCount, 0, i->VertCount, m_IBUsedCount, i->IndexCount/3); m_VBUsedCount += i->VertCount; m_IBUsedCount += i->IndexCount; ++i; } m_Commands.clear(); // 重新锁定缓冲区 if(m_VBUsedCount == m_VBMaxCount || m_IBUsedCount == m_IBMaxCount) Discard = true; if(Discard) { m_pVB->Lock(0, m_VBMaxCount * sizeof(f2dGraphics2DVertex), (void**)&m_pVBData, D3DLOCK_DISCARD); m_pIB->Lock(0, m_IBMaxCount * sizeof(fuShort), (void**)&m_pIBData, D3DLOCK_DISCARD); m_VBUsedCount = 0; m_IBUsedCount = 0; m_VBAlloced = 0; m_IBAlloced = 0; } else { m_pVB->Lock(m_VBUsedCount * sizeof(f2dGraphics2DVertex), (m_VBMaxCount - m_VBUsedCount) * sizeof(f2dGraphics2DVertex), (void**)&m_pVBData, D3DLOCK_NOOVERWRITE); m_pIB->Lock(m_IBUsedCount * sizeof(fuShort), (m_IBMaxCount - m_IBUsedCount) * sizeof(fuShort), (void**)&m_pIBData, D3DLOCK_NOOVERWRITE); m_VBAlloced = 0; m_IBAlloced = 0; } }