void MySprite::Draw(MyMatrix* matviewproj, ShaderGroup* pShaderOverride) { if( m_pMaterial == 0 || m_pMaterial->GetShader() == 0 ) return; MyAssert( m_pVertexBuffer != 0 && m_pIndexBuffer != 0 ); if( m_pVertexBuffer->m_Dirty ) m_pVertexBuffer->Rebuild( 0, m_pVertexBuffer->m_DataSize ); if( m_pIndexBuffer->m_Dirty ) m_pIndexBuffer->Rebuild( 0, m_pIndexBuffer->m_DataSize ); MyAssert( m_pIndexBuffer->m_Dirty == false && m_pVertexBuffer->m_Dirty == false ); Shader_Base* pShader = 0; if( pShaderOverride ) { // if an override for the shader is sent in, it's already active and doesn't want anything other than position set. pShader = (Shader_Base*)pShaderOverride->GlobalPass( 0, 4 ); MyAssert( pShader ); if( pShader == 0 ) return; pShader->SetupAttributes( m_pVertexBuffer, m_pIndexBuffer, false ); pShader->ProgramPosition( matviewproj, &m_Position ); MyDrawElements( GL_TRIANGLES, 6, GL_UNSIGNED_SHORT, 0 ); pShader->DeactivateShader( m_pVertexBuffer ); } else { pShader = (Shader_Base*)m_pMaterial->GetShader()->GlobalPass(); MyAssert( pShader ); if( pShader == 0 ) return; // Enable blending if necessary. TODO: sort draws and only set this once. if( m_pMaterial->IsTransparent( pShader ) ) { glEnable( GL_BLEND ); glBlendFunc( GL_SRC_ALPHA, GL_ONE_MINUS_SRC_ALPHA ); } if( pShader->ActivateAndProgramShader( m_pVertexBuffer, m_pIndexBuffer, GL_UNSIGNED_SHORT, matviewproj, &m_Position, m_pMaterial ) ) { pShader->ProgramFramebufferSize( (float)g_GLStats.m_CurrentFramebufferWidth, (float)g_GLStats.m_CurrentFramebufferHeight ); MyDrawElements( GL_TRIANGLES, 6, GL_UNSIGNED_SHORT, 0 ); pShader->DeactivateShader( m_pVertexBuffer ); } // always disable blending glDisable( GL_BLEND ); } }
void MySprite::DrawNoSetup() { if( m_pMaterial == 0 ) return; #if USE_D3D g_pD3DContext->DrawIndexed( 6, 0, 0 ); //g_pD3DContext->Draw( 6, 0 ); #else MyDrawElements( GL_TRIANGLES, 6, GL_UNSIGNED_SHORT, 0 ); #endif }
void MySprite9::Draw(MyMatrix* matviewproj) { if( m_pMaterial == 0 || m_pMaterial->GetShader() == 0 ) MyAssert( m_pVertexBuffer != 0 && m_pIndexBuffer != 0 ); if( m_pVertexBuffer->m_Dirty ) m_pVertexBuffer->Rebuild( 0, m_pVertexBuffer->m_DataSize ); if( m_pIndexBuffer->m_Dirty ) m_pIndexBuffer->Rebuild( 0, m_pIndexBuffer->m_DataSize ); MyAssert( m_pIndexBuffer->m_Dirty == false && m_pVertexBuffer->m_Dirty == false ); Shader_Base* pShader = (Shader_Base*)m_pMaterial->GetShader()->GlobalPass(); if( pShader == 0 ) return; // Enable blending if necessary. TODO: sort draws and only set this once. if( m_pMaterial->IsTransparent( pShader ) ) { glEnable( GL_BLEND ); glBlendFunc( GL_SRC_ALPHA, GL_ONE_MINUS_SRC_ALPHA ); } if( pShader->ActivateAndProgramShader( m_pVertexBuffer, m_pIndexBuffer, GL_UNSIGNED_SHORT, matviewproj, &m_Position, m_pMaterial ) ) { #if USE_D3D g_pD3DContext->DrawIndexed( 6, 0, 0 ); //g_pD3DContext->Draw( 6, 0 ); #else MyDrawElements( GL_TRIANGLE_STRIP, 24, GL_UNSIGNED_SHORT, 0 ); #endif pShader->DeactivateShader( m_pVertexBuffer ); } // always disable blending glDisable( GL_BLEND ); }
void ParticleRenderer::Draw(MyMatrix* matviewproj) { #if MY_SHITTY_LAPTOP //return; #endif if( m_pTexture == 0 || m_pTexture->m_TextureID == 0 || m_pShaderGroup == 0 || m_ParticleCount == 0 ) return; //glEnable(GL_TEXTURE_2D); #if MYFW_WINDOWS //#define GL_POINT_SPRITE 0x8861 //#define GL_VERTEX_PROGRAM_POINT_SIZE 0x8642 #if !USE_INDEXED_TRIANGLES glEnable( GL_POINT_SPRITE ); glEnable( GL_VERTEX_PROGRAM_POINT_SIZE ); #endif #endif //glTexEnvi(GL_POINT_SPRITE, GL_COORD_REPLACE, GL_TRUE); //glEnable(GL_ARB_point_sprite); //glEnable( GL_BLEND ); if( m_Additive ) { glBlendFunc( GL_ONE, GL_ONE ); #if USE_D3D float blendfactor[4] = { 1.0f, 1.0f, 1.0f, 1.0f }; g_pD3DContext->OMSetBlendState( g_pD3DBlendStateEnabledAdditive.Get(), blendfactor, 0xfff); #endif } int numverts = m_ParticleCount; #if USE_INDEXED_TRIANGLES numverts *= 4; #endif if( m_pVertexBuffer->m_Dirty ) m_pVertexBuffer->Rebuild( 0, sizeof(Vertex_PointSprite)*numverts ); if( m_pIndexBuffer->m_Dirty ) m_pIndexBuffer->Rebuild( 0, m_pIndexBuffer->m_DataSize ); assert( m_pIndexBuffer->m_Dirty == false && m_pVertexBuffer->m_Dirty == false ); //glBindBuffer( GL_ARRAY_BUFFER, m_pVertexBuffer->m_CurrentBufferID ); //glBufferSubData( GL_ARRAY_BUFFER, 0, sizeof(Vertex_PointSprite)*numverts, pVerts ); //if( ((Shader_PointSprite*)m_pShader)->ActivateAndProgramShader( matviewproj, &m_Position, (Vertex_XYZUV*)m_pVerts, m_pTexture->m_TextureID ) ) //if( ((Shader_PointSprite*)m_pShader)->ActivateAndProgramShader( matviewproj, 0, (Vertex_PointSprite*)m_pVerts, m_pTexture->m_TextureID ) ) //if( ((Shader_PointSprite*)m_pShader)->ActivateAndProgramShader( matviewproj, 0, (Vertex_PointSprite*)m_pVerts, m_pTexture->m_TextureID ) ) #if USE_INDEXED_TRIANGLES if( ((Shader_Base*)m_pShaderGroup->GlobalPass())->ActivateAndProgramShader( VertexFormat_PointSprite, m_pVertexBuffer, m_pIndexBuffer, GL_UNSIGNED_SHORT, matviewproj, 0, m_pTexture->m_TextureID ) ) { MyDrawElements( GL_TRIANGLES, m_ParticleCount*6, GL_UNSIGNED_SHORT, 0 ); m_pShaderGroup->GlobalPass()->DeactivateShader( m_pVertexBuffer ); } #else if( ((Shader_PointSprite*)m_pShaderGroup->GlobalPass())->ActivateAndProgramShader( matviewproj, 0, m_VertexBufferID, 0, GL_UNSIGNED_SHORT, m_pTexture->m_TextureID ) ) { MyDrawArrays( GL_POINTS, 0, m_ParticleCount ); m_pShaderGroup->GlobalPass()->DeactivateShader(); } #endif //glEnable( GL_BLEND ); if( m_Additive ) // revert back to regular enabled alpha blending. { glBlendFunc( GL_SRC_ALPHA, GL_ONE_MINUS_SRC_ALPHA ); #if USE_D3D float blendfactor[4] = { 1.0f, 1.0f, 1.0f, 1.0f }; g_pD3DContext->OMSetBlendState( g_pD3DBlendStateEnabled.Get(), blendfactor, 0xfff); #endif } return; }