Fix some strict GL ES 2 conformance issues.
This commit fixes two issues that cause issues in WebGL: * Non-power-of-two textures must wrap as GL_CLAMP_TO_EDGE. This breaks non-power-of-two textures. * Render calls with zero primitives should not be issued. This just causes warning spam.pull/339/head
parent
02ec64ee66
commit
738ac02cbf
|
@ -272,6 +272,8 @@ void MeshRenderer::Remove(const MeshRenderer::Handle &handle) {
|
||||||
|
|
||||||
void MeshRenderer::Draw(const MeshRenderer::Handle &handle,
|
void MeshRenderer::Draw(const MeshRenderer::Handle &handle,
|
||||||
bool useColors, RgbaColor overrideColor) {
|
bool useColors, RgbaColor overrideColor) {
|
||||||
|
if(handle.size == 0) return;
|
||||||
|
|
||||||
selectedShader->Enable();
|
selectedShader->Enable();
|
||||||
|
|
||||||
glBindBuffer(GL_ARRAY_BUFFER, handle.vertexBuffer);
|
glBindBuffer(GL_ARRAY_BUFFER, handle.vertexBuffer);
|
||||||
|
@ -575,6 +577,8 @@ void EdgeRenderer::Remove(const EdgeRenderer::Handle &handle) {
|
||||||
}
|
}
|
||||||
|
|
||||||
void EdgeRenderer::Draw(const EdgeRenderer::Handle &handle) {
|
void EdgeRenderer::Draw(const EdgeRenderer::Handle &handle) {
|
||||||
|
if(handle.size == 0) return;
|
||||||
|
|
||||||
glActiveTexture(GL_TEXTURE1);
|
glActiveTexture(GL_TEXTURE1);
|
||||||
glBindTexture(GL_TEXTURE_2D, atlas->GetTexture(pattern));
|
glBindTexture(GL_TEXTURE_2D, atlas->GetTexture(pattern));
|
||||||
shader.SetUniformTextureUnit("pattern", 1);
|
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) {
|
void OutlineRenderer::Draw(const OutlineRenderer::Handle &handle, Canvas::DrawOutlinesAs mode) {
|
||||||
|
if(handle.size == 0) return;
|
||||||
|
|
||||||
glActiveTexture(GL_TEXTURE1);
|
glActiveTexture(GL_TEXTURE1);
|
||||||
glBindTexture(GL_TEXTURE_2D, atlas->GetTexture(pattern));
|
glBindTexture(GL_TEXTURE_2D, atlas->GetTexture(pattern));
|
||||||
shader.SetUniformTextureUnit("pattern", 1);
|
shader.SetUniformTextureUnit("pattern", 1);
|
||||||
|
@ -980,15 +986,17 @@ IndexedMeshRenderer::Handle IndexedMeshRenderer::Add(const SIndexedMesh &m, bool
|
||||||
return handle;
|
return handle;
|
||||||
}
|
}
|
||||||
|
|
||||||
void IndexedMeshRenderer::Remove(const IndexedMeshRenderer::Handle &m) {
|
void IndexedMeshRenderer::Remove(const IndexedMeshRenderer::Handle &handle) {
|
||||||
glDeleteBuffers(1, &m.vertexBuffer);
|
glDeleteBuffers(1, &handle.vertexBuffer);
|
||||||
glDeleteBuffers(1, &m.indexBuffer);
|
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();
|
selectedShader->Enable();
|
||||||
|
|
||||||
glBindBuffer(GL_ARRAY_BUFFER, m.vertexBuffer);
|
glBindBuffer(GL_ARRAY_BUFFER, handle.vertexBuffer);
|
||||||
glEnableVertexAttribArray(ATTRIB_POS);
|
glEnableVertexAttribArray(ATTRIB_POS);
|
||||||
glVertexAttribPointer(ATTRIB_POS, 3, GL_FLOAT, GL_FALSE, sizeof(SIndexedMesh::Vertex),
|
glVertexAttribPointer(ATTRIB_POS, 3, GL_FLOAT, GL_FALSE, sizeof(SIndexedMesh::Vertex),
|
||||||
(void *)offsetof(SIndexedMesh::Vertex, pos));
|
(void *)offsetof(SIndexedMesh::Vertex, pos));
|
||||||
|
@ -998,8 +1006,8 @@ void IndexedMeshRenderer::Draw(const IndexedMeshRenderer::Handle &m) {
|
||||||
(void *)offsetof(SIndexedMesh::Vertex, tex));
|
(void *)offsetof(SIndexedMesh::Vertex, tex));
|
||||||
}
|
}
|
||||||
|
|
||||||
glBindBuffer(GL_ELEMENT_ARRAY_BUFFER, m.indexBuffer);
|
glBindBuffer(GL_ELEMENT_ARRAY_BUFFER, handle.indexBuffer);
|
||||||
glDrawElements(GL_TRIANGLES, m.size, GL_UNSIGNED_INT, NULL);
|
glDrawElements(GL_TRIANGLES, handle.size, GL_UNSIGNED_INT, NULL);
|
||||||
|
|
||||||
glDisableVertexAttribArray(ATTRIB_POS);
|
glDisableVertexAttribArray(ATTRIB_POS);
|
||||||
if(NeedsTexture()) glDisableVertexAttribArray(ATTRIB_TEX);
|
if(NeedsTexture()) glDisableVertexAttribArray(ATTRIB_TEX);
|
||||||
|
|
|
@ -259,14 +259,23 @@ Canvas::Fill *OpenGl2Renderer::SelectFill(hFill hcf) {
|
||||||
return fill;
|
return fill;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
static bool IsPowerOfTwo(size_t n) {
|
||||||
|
return (n & (n - 1)) == 0;
|
||||||
|
}
|
||||||
|
|
||||||
void OpenGl2Renderer::InvalidatePixmap(std::shared_ptr<const Pixmap> pm) {
|
void OpenGl2Renderer::InvalidatePixmap(std::shared_ptr<const Pixmap> pm) {
|
||||||
GLuint id;
|
GLuint id;
|
||||||
pixmapCache.Lookup(pm, &id);
|
pixmapCache.Lookup(pm, &id);
|
||||||
glBindTexture(GL_TEXTURE_2D, id);
|
glBindTexture(GL_TEXTURE_2D, id);
|
||||||
glTexParameteri(GL_TEXTURE_2D, GL_TEXTURE_MAG_FILTER, GL_NEAREST);
|
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_MIN_FILTER, GL_NEAREST);
|
||||||
glTexParameteri(GL_TEXTURE_2D, GL_TEXTURE_WRAP_S, GL_REPEAT);
|
if(IsPowerOfTwo(pm->width) && IsPowerOfTwo(pm->height)) {
|
||||||
glTexParameteri(GL_TEXTURE_2D, GL_TEXTURE_WRAP_T, GL_REPEAT);
|
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;
|
GLenum format;
|
||||||
switch(pm->format) {
|
switch(pm->format) {
|
||||||
|
|
Loading…
Reference in New Issue