Example #1
0
void PointBuffer::render()
{
    bindBuffer(GL_ARRAY_BUFFER, m_glBuffer);
    if (m_dirty)
    {
        // upload point data
        bufferData(GL_ARRAY_BUFFER, size() * sizeof(Point),
            m_pointList.data(), GL_STATIC_DRAW);
        m_dirty = false;
    }

    // enable additive blending
    glDisable(GL_DEPTH_TEST);
    glEnable(GL_BLEND);
    glBlendFunc(GL_SRC_ALPHA, GL_ONE_MINUS_SRC_ALPHA);

    glEnable(GL_TEXTURE_2D);
    glBindTexture(GL_TEXTURE_2D, m_cloudTexture);
    glTexEnvi(GL_POINT_SPRITE_ARB, GL_COORD_REPLACE_ARB, GL_TRUE);
    glTexEnvi(GL_TEXTURE_ENV, GL_TEXTURE_ENV_MODE, GL_MODULATE);

    float quadratic[] =  { 0.0f, 0.0f, 0.01f };
    pointParameterFV(GL_POINT_DISTANCE_ATTENUATION_ARB, quadratic);
    pointParameterF(GL_POINT_SIZE_MIN_ARB, 0.0);
    pointParameterF(GL_POINT_SIZE_MAX_ARB, 64.0);

    glEnable(GL_POINT_SPRITE_ARB);
    glEnable(GL_POINT_SMOOTH );
    glPointSize(64.0);

    glVertexPointer(3, GL_FLOAT, sizeof(Point), vertexOffset(0));
    glColorPointer(4, GL_FLOAT, sizeof(Point), vertexOffset(sizeof(float) * 3));
    glEnableClientState(GL_VERTEX_ARRAY);
    glEnableClientState(GL_COLOR_ARRAY);
    glDrawArrays(GL_POINTS, 0, size());
}
        //-----------------------------------------------------------
        /// The image from the texture atlas will have potentially
        /// been cropped by the tool. This will affect the sprites
        /// position within the uncropped image and we need to
        /// account for that when positioning the corners
        //-----------------------------------------------------------
		void SpriteComponent::UpdateVertexPositions()
        {
            Core::Vector2 frameCenter;
            Core::Vector2 frameSize;
            if(m_textureAtlas != nullptr && m_hashedTextureAtlasId > 0)
            {
                CalcFrameCentreAndSize(frameCenter, frameSize);
            }
            else if(mpMaterial != nullptr && mpMaterial->GetTexture() != nullptr)
            {
                auto texture = mpMaterial->GetTexture().get();
                frameSize = m_sizePolicyDelegate(m_originalSize, Core::Vector2((f32)texture->GetWidth(), (f32)texture->GetHeight()));
            }
            
            const Core::Matrix4& worldTransform = GetEntity()->GetTransform().GetWorldTransform();
			Core::Vector2 halfFrameSize(frameSize.x * 0.5f, frameSize.y * 0.5f);
			Core::Vector2 alignedPosition = -GetAnchorPoint(m_originAlignment, halfFrameSize);
            Core::Vector4 vertexCentre(alignedPosition.x + frameCenter.x, alignedPosition.y + frameCenter.y, 0.0f, 1.0f);
            
            //TL
            Core::Vector4 vertexOffset(-halfFrameSize.x, halfFrameSize.y, 0.0f, 0.0f);
			m_spriteData.sVerts[(u32)SpriteBatch::Verts::k_topLeft].vPos = (vertexCentre + vertexOffset) * worldTransform;
            
            //TR
            vertexOffset.x = halfFrameSize.x;
            vertexOffset.y = halfFrameSize.y;
			m_spriteData.sVerts[(u32)SpriteBatch::Verts::k_topRight].vPos = (vertexCentre + vertexOffset) * worldTransform;
            
            //BL
            vertexOffset.x = -halfFrameSize.x;
            vertexOffset.y = -halfFrameSize.y;
			m_spriteData.sVerts[(u32)SpriteBatch::Verts::k_bottomLeft].vPos = (vertexCentre + vertexOffset) * worldTransform;
            
            //BR
            vertexOffset.x = halfFrameSize.x;
            vertexOffset.y = -halfFrameSize.y;
			m_spriteData.sVerts[(u32)SpriteBatch::Verts::k_bottomRight].vPos = (vertexCentre + vertexOffset) * worldTransform;
		}