diff --git a/src/render/gl3shader.cpp b/src/render/gl3shader.cpp index d43b0e4..7d5ab10 100644 --- a/src/render/gl3shader.cpp +++ b/src/render/gl3shader.cpp @@ -272,6 +272,8 @@ void MeshRenderer::Remove(const MeshRenderer::Handle &handle) { void MeshRenderer::Draw(const MeshRenderer::Handle &handle, bool useColors, RgbaColor overrideColor) { + if(handle.size == 0) return; + selectedShader->Enable(); glBindBuffer(GL_ARRAY_BUFFER, handle.vertexBuffer); @@ -575,6 +577,8 @@ void EdgeRenderer::Remove(const EdgeRenderer::Handle &handle) { } void EdgeRenderer::Draw(const EdgeRenderer::Handle &handle) { + if(handle.size == 0) return; + glActiveTexture(GL_TEXTURE1); glBindTexture(GL_TEXTURE_2D, atlas->GetTexture(pattern)); shader.SetUniformTextureUnit("pattern", 1); @@ -774,6 +778,8 @@ void OutlineRenderer::Remove(const OutlineRenderer::Handle &handle) { } void OutlineRenderer::Draw(const OutlineRenderer::Handle &handle, Canvas::DrawOutlinesAs mode) { + if(handle.size == 0) return; + glActiveTexture(GL_TEXTURE1); glBindTexture(GL_TEXTURE_2D, atlas->GetTexture(pattern)); shader.SetUniformTextureUnit("pattern", 1); @@ -980,15 +986,17 @@ IndexedMeshRenderer::Handle IndexedMeshRenderer::Add(const SIndexedMesh &m, bool return handle; } -void IndexedMeshRenderer::Remove(const IndexedMeshRenderer::Handle &m) { - glDeleteBuffers(1, &m.vertexBuffer); - glDeleteBuffers(1, &m.indexBuffer); +void IndexedMeshRenderer::Remove(const IndexedMeshRenderer::Handle &handle) { + glDeleteBuffers(1, &handle.vertexBuffer); + glDeleteBuffers(1, &handle.indexBuffer); } -void IndexedMeshRenderer::Draw(const IndexedMeshRenderer::Handle &m) { +void IndexedMeshRenderer::Draw(const IndexedMeshRenderer::Handle &handle) { + if(handle.size == 0) return; + selectedShader->Enable(); - glBindBuffer(GL_ARRAY_BUFFER, m.vertexBuffer); + glBindBuffer(GL_ARRAY_BUFFER, handle.vertexBuffer); glEnableVertexAttribArray(ATTRIB_POS); glVertexAttribPointer(ATTRIB_POS, 3, GL_FLOAT, GL_FALSE, sizeof(SIndexedMesh::Vertex), (void *)offsetof(SIndexedMesh::Vertex, pos)); @@ -998,8 +1006,8 @@ void IndexedMeshRenderer::Draw(const IndexedMeshRenderer::Handle &m) { (void *)offsetof(SIndexedMesh::Vertex, tex)); } - glBindBuffer(GL_ELEMENT_ARRAY_BUFFER, m.indexBuffer); - glDrawElements(GL_TRIANGLES, m.size, GL_UNSIGNED_INT, NULL); + glBindBuffer(GL_ELEMENT_ARRAY_BUFFER, handle.indexBuffer); + glDrawElements(GL_TRIANGLES, handle.size, GL_UNSIGNED_INT, NULL); glDisableVertexAttribArray(ATTRIB_POS); if(NeedsTexture()) glDisableVertexAttribArray(ATTRIB_TEX); diff --git a/src/render/rendergl3.cpp b/src/render/rendergl3.cpp index 3f409f7..c53a72d 100644 --- a/src/render/rendergl3.cpp +++ b/src/render/rendergl3.cpp @@ -259,14 +259,23 @@ Canvas::Fill *OpenGl2Renderer::SelectFill(hFill hcf) { return fill; } +static bool IsPowerOfTwo(size_t n) { + return (n & (n - 1)) == 0; +} + void OpenGl2Renderer::InvalidatePixmap(std::shared_ptr pm) { GLuint id; pixmapCache.Lookup(pm, &id); glBindTexture(GL_TEXTURE_2D, id); glTexParameteri(GL_TEXTURE_2D, GL_TEXTURE_MAG_FILTER, GL_NEAREST); glTexParameteri(GL_TEXTURE_2D, GL_TEXTURE_MIN_FILTER, GL_NEAREST); - glTexParameteri(GL_TEXTURE_2D, GL_TEXTURE_WRAP_S, GL_REPEAT); - glTexParameteri(GL_TEXTURE_2D, GL_TEXTURE_WRAP_T, GL_REPEAT); + if(IsPowerOfTwo(pm->width) && IsPowerOfTwo(pm->height)) { + glTexParameteri(GL_TEXTURE_2D, GL_TEXTURE_WRAP_S, GL_REPEAT); + glTexParameteri(GL_TEXTURE_2D, GL_TEXTURE_WRAP_T, GL_REPEAT); + } else { + glTexParameteri(GL_TEXTURE_2D, GL_TEXTURE_WRAP_S, GL_CLAMP_TO_EDGE); + glTexParameteri(GL_TEXTURE_2D, GL_TEXTURE_WRAP_T, GL_CLAMP_TO_EDGE); + } GLenum format; switch(pm->format) {