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; }