int D3DOverdrawWindow:: ResetDevice(void) { Superclass::ResetDevice(); if (!SetQuery()) { return 0; } if (!m_pSoup) { return 1; } m_pSoup->ComputeNormals(); //TODO: check if we need this // create vertex buffer if (!SetVB()) { return 0; } if (!SetIB()) { return 0; } if (!SetVD()) { return 0; } return 1; }
VOID CameraWorkBase::CreateImage( LPIMAGE _pImage, LPINFO _pInfo ) { // Vertex는 외부에서 받아온다 if( _pImage->pVB == NULL && _pImage->pIB == NULL ) { // 처음 만들거나 iNumVertices정보가 변경되었을때 // Create VertexBuffer _pImage->iNumVertices = _pInfo->iNumVertices; CreateVB( &_pImage->pVB, _pImage->iNumVertices, sizeof( VERTEX ), VERTEX::FVF ); SetVB( _pImage->pVB, _pInfo->pVertex, _pImage->iNumVertices, sizeof( VERTEX ) ); // Create IndexBuffer _pImage->iNumIndices = _pInfo->iNumIndices; CreateIB( &_pImage->pIB, _pImage->iNumIndices, sizeof( INDEX ) ); SetIB( _pImage->pIB, _pInfo->pIndex, _pImage->iNumIndices, sizeof( INDEX) ); return; } LPVOID pVertices; if( FAILED( _pImage->pVB->Lock( 0, sizeof( VERTEX ) * _pInfo->iNumVertices, (LPVOID*)&pVertices, 0 ) ) ) { MessageBox( NULL, L"CreateImage_Course(){ ... pVB->Lock failed ... }", NULL, MB_OK ); return; } memcpy( pVertices, _pInfo->pVertex, sizeof( VERTEX ) * _pInfo->iNumVertices ); _pImage->pVB->Unlock(); }
VOID NormalLine::Create( D3DCOLOR _Color, INT _iNumVertex, LPD3DXVECTOR3 _pPosition, LPD3DXVECTOR3 _pNormal ) { INT iNumVertex = _iNumVertex * 2; LPVERTEX pVertex = new VERTEX[ iNumVertex ]; INT k = 0; for( INT i=0 ; i<iNumVertex ; i+=2 ) { pVertex[ i ].pos = _pPosition[ k ]; pVertex[ i ].color = _Color; pVertex[ i+1 ].pos = _pPosition[ k ] + _pNormal[ k ]; pVertex[ i+1 ].color = _Color; k++; } LPDATA pData = new DATA; pData->iNumLine = _iNumVertex; CreateVB( &pData->pVB, iNumVertex, sizeof( VERTEX ), VERTEX::FVF ); SetVB( pData->pVB, pVertex, iNumVertex, sizeof( VERTEX ) ); m_pDataList.push_back( pData ); SAFE_DELETE_ARRAY( pVertex ); }
VOID CameraWorkBase::CreateImage_Box( LPIMAGE _pImage ) { INT iNumVertices = 8; INT iNumIndices = 12; _pImage->iNumVertices = iNumVertices; _pImage->iNumIndices = iNumIndices; // Init Vertex VERTEX aVertex[ 8 ]; aVertex[ 0 ].vecPos = D3DXVECTOR3( -1.0f, 1.0f, -1.0f ); aVertex[ 1 ].vecPos = D3DXVECTOR3( 1.0f, 1.0f, -1.0f ); aVertex[ 2 ].vecPos = D3DXVECTOR3( -1.0f, 1.0f, 1.0f ); aVertex[ 3 ].vecPos = D3DXVECTOR3( 1.0f, 1.0f, 1.0f ); aVertex[ 4 ].vecPos = D3DXVECTOR3( -1.0f, -1.0f, -1.0f ); aVertex[ 5 ].vecPos = D3DXVECTOR3( 1.0f, -1.0f, -1.0f ); aVertex[ 6 ].vecPos = D3DXVECTOR3( -1.0f, -1.0f, 1.0f ); aVertex[ 7 ].vecPos = D3DXVECTOR3( 1.0f, -1.0f, 1.0f ); aVertex[ 0 ].dColor = m_dColBox; aVertex[ 1 ].dColor = m_dColBox; aVertex[ 2 ].dColor = m_dColBox; aVertex[ 3 ].dColor = m_dColBox; aVertex[ 4 ].dColor = m_dColBox; aVertex[ 5 ].dColor = m_dColBox; aVertex[ 6 ].dColor = m_dColBox; aVertex[ 7 ].dColor = m_dColBox; // Init Index INDEX aIndex[ 12 ]; aIndex[ 0 ]._0 = 0; aIndex[ 0 ]._1 = 1; aIndex[ 1 ]._0 = 0; aIndex[ 1 ]._1 = 2; aIndex[ 2 ]._0 = 2; aIndex[ 2 ]._1 = 3; aIndex[ 3 ]._0 = 3; aIndex[ 3 ]._1 = 1; aIndex[ 4 ]._0 = 0; aIndex[ 4 ]._1 = 4; aIndex[ 5 ]._0 = 1; aIndex[ 5 ]._1 = 5; aIndex[ 6 ]._0 = 2; aIndex[ 6 ]._1 = 6; aIndex[ 7 ]._0 = 3; aIndex[ 7 ]._1 = 7; aIndex[ 8 ]._0 = 4; aIndex[ 8 ]._1 = 5; aIndex[ 9 ]._0 = 5; aIndex[ 9 ]._1 = 7; aIndex[ 10 ]._0 = 6; aIndex[ 10 ]._1 = 7; aIndex[ 11 ]._0 = 6; aIndex[ 11 ]._1 = 4; // Init VertexBuffer, IndexBuffer CreateVB( &_pImage->pVB, iNumVertices, sizeof( VERTEX ), VERTEX::FVF ); SetVB( _pImage->pVB, aVertex, iNumVertices, sizeof( VERTEX ) ); CreateIB( &_pImage->pIB, iNumIndices, sizeof( INDEX ) ); SetIB( _pImage->pIB, aIndex, iNumIndices, sizeof( INDEX) ); }
int D3DOverdrawWindow:: SetSoup(Soup* pSoup) { // re-create vertex and index buffers m_pSoup = pSoup; if (!SetVB()) { return 0; } if (!SetIB()) { return 0; } // create other device objects as needed if (!m_VD) { if (!SetVD()) { return 0; } } if (!m_pOcclusionQuery[0] || !m_pOcclusionQueryPix[0]) { if (!SetQuery()) { return 0; } } return 1; }
///////////////////////////////////////////////////////////////////////////////// // MeshSegment implementation MeshSegment::MeshSegment( const Segment3 & vSegment, GPUInputLayout * pIL ): LineListMesh(), m_vSegment( vSegment ) { Assert( pIL != NULL ); SetIL( pIL ); UInt iVertexSize = m_pIL->GetSize(); UInt iVertexCount = 2; //UInt iEdgeCount = 1; UInt iIndexCount = 2; // Create buffers GPUVertexBuffer * pVB = RenderingFn->CreateVertexBuffer( iVertexSize, iVertexCount ); pVB->SetUsage( GPURESOURCE_USAGE_DEFAULT ); GPUIndexBuffer * pIB = RenderingFn->CreateIndexBuffer( iIndexCount ); pIB->SetUsage( GPURESOURCE_USAGE_DEFAULT ); SetVB( pVB ); SetIB( pIB ); // Generate vertices UInt iOffset, iSize; m_pIL->GetFieldRange( &iOffset, &iSize, GPUINPUTFIELD_SEMANTIC_POSITION, 0 ); Byte * arrPositions = m_pVB->GetData() + iOffset; Byte * arrTexCoords = NULL; if ( m_pIL->HasField(GPUINPUTFIELD_SEMANTIC_TEXCOORD, 0) ) { m_pIL->GetFieldRange( &iOffset, &iSize, GPUINPUTFIELD_SEMANTIC_TEXCOORD, 0 ); arrTexCoords = m_pVB->GetData() + iOffset; } Vertex4 * pPosition; TextureCoord1 * pTexCoord; pPosition = (Vertex4*)( arrPositions ); *pPosition = m_vSegment.EndA; arrPositions += iVertexSize; if ( arrTexCoords != NULL ) { pTexCoord = (TextureCoord1*)( arrTexCoords ); pTexCoord->T = 0.0f; arrTexCoords += iVertexSize; } pPosition = (Vertex4*)( arrPositions ); *pPosition = m_vSegment.EndB; if ( arrTexCoords != NULL ) { pTexCoord = (TextureCoord1*)( arrTexCoords ); pTexCoord->T = 1.0f; } // Generate indices UInt * arrIndices = (UInt*)( m_pIB->GetData() ); arrIndices[0] = 0; arrIndices[1] = 1; // Bind buffers m_pVB->Bind(); m_pIB->Bind(); }
///////////////////////////////////////////////////////////////////////////////// // MeshTriangle implementation MeshTriangle::MeshTriangle( const Triangle3 & vTriangle, GPUInputLayout * pIL ): TriangleListMesh(), m_vTriangle( vTriangle ) { Assert( pIL != NULL ); SetIL( pIL ); UInt iVertexSize = m_pIL->GetSize(); UInt iVertexCount = 3; //UInt iTriangleCount = 1; UInt iIndexCount = 3; // Create buffers GPUVertexBuffer * pVB = RenderingFn->CreateVertexBuffer( iVertexSize, iVertexCount ); pVB->SetUsage( GPURESOURCE_USAGE_DEFAULT ); GPUIndexBuffer * pIB = RenderingFn->CreateIndexBuffer( iIndexCount ); pIB->SetUsage( GPURESOURCE_USAGE_DEFAULT ); SetVB( pVB ); SetIB( pIB ); // Generate vertices UInt iOffset, iSize; m_pIL->GetFieldRange( &iOffset, &iSize, GPUINPUTFIELD_SEMANTIC_POSITION, 0 ); Byte * arrPositions = m_pVB->GetData() + iOffset; Byte * arrNormals = NULL; if ( m_pIL->HasField(GPUINPUTFIELD_SEMANTIC_NORMAL, 0) ) { m_pIL->GetFieldRange( &iOffset, &iSize, GPUINPUTFIELD_SEMANTIC_NORMAL, 0 ); arrNormals = m_pVB->GetData() + iOffset; } Byte * arrTexCoords = NULL; if ( m_pIL->HasField(GPUINPUTFIELD_SEMANTIC_TEXCOORD, 0) ) { m_pIL->GetFieldRange( &iOffset, &iSize, GPUINPUTFIELD_SEMANTIC_TEXCOORD, 0 ); arrTexCoords = m_pVB->GetData() + iOffset; } Vertex4 * pPosition; Vector4 * pNormal; TextureCoord2 * pTexCoord; Vector4 vNormal = m_vTriangle.GetPlane().Normal; pPosition = (Vertex4*)( arrPositions ); *pPosition = m_vTriangle.A; arrPositions += iVertexSize; if ( arrNormals != NULL ) { pNormal = (Vector4*)( arrNormals ); *pNormal = vNormal; arrNormals += iVertexSize; } if ( arrTexCoords != NULL ) { pTexCoord = (TextureCoord2*)( arrTexCoords ); pTexCoord->T = 0.0f; pTexCoord->U = 0.0f; arrTexCoords += iVertexSize; } pPosition = (Vertex4*)( arrPositions ); *pPosition = m_vTriangle.B; arrPositions += iVertexSize; if ( arrNormals != NULL ) { pNormal = (Vector4*)( arrNormals ); *pNormal = vNormal; arrNormals += iVertexSize; } if ( arrTexCoords != NULL ) { pTexCoord = (TextureCoord2*)( arrTexCoords ); pTexCoord->T = 1.0f; pTexCoord->U = 0.0f; arrTexCoords += iVertexSize; } pPosition = (Vertex4*)( arrPositions ); *pPosition = m_vTriangle.C; if ( arrNormals != NULL ) { pNormal = (Vector4*)( arrNormals ); *pNormal = vNormal; } if ( arrTexCoords != NULL ) { pTexCoord = (TextureCoord2*)( arrTexCoords ); pTexCoord->T = 0.0f; pTexCoord->U = 1.0f; } // Generate indices UInt * arrIndices = (UInt*)( m_pIB->GetData() ); arrIndices[0] = 0; arrIndices[1] = 1; arrIndices[2] = 2; // Bind buffers m_pVB->Bind(); m_pIB->Bind(); }