* Fix issue where setting texture on renderer with no mipmaps and then setting the same texture with mipmaps would prevent them from being generated (fixed for desktop GL1/GL2 and android)
git-svn-id: https://jmonkeyengine.googlecode.com/svn/trunk@9617 75d07b2b-3a1a-0410-a2c5-0572b91ccdca
This commit is contained in:
parent
e78474a5b1
commit
ac0f3a107c
@ -1472,7 +1472,7 @@ public class OGLESShaderRenderer implements Renderer {
|
||||
* @param type
|
||||
* @param needMips
|
||||
*/
|
||||
public void updateTexImageData(Image img, Texture.Type type, boolean needMips) {
|
||||
public void updateTexImageData(Image img, Texture.Type type) {
|
||||
int texId = img.getId();
|
||||
if (texId == -1) {
|
||||
// create texture
|
||||
@ -1495,6 +1495,12 @@ public class OGLESShaderRenderer implements Renderer {
|
||||
GLES20.glBindTexture(target, texId);
|
||||
context.boundTextures[0] = img;
|
||||
}
|
||||
|
||||
boolean needMips = false;
|
||||
if (img.isGeneratedMipmapsRequired()) {
|
||||
needMips = true;
|
||||
img.setMipmapsGenerated(true);
|
||||
}
|
||||
|
||||
if (target == GLES20.GL_TEXTURE_CUBE_MAP) {
|
||||
// Upload a cube map / sky box
|
||||
@ -1534,8 +1540,8 @@ public class OGLESShaderRenderer implements Renderer {
|
||||
|
||||
public void setTexture(int unit, Texture tex) {
|
||||
Image image = tex.getImage();
|
||||
if (image.isUpdateNeeded()) {
|
||||
updateTexImageData(image, tex.getType(), tex.getMinFilter().usesMipMapLevels());
|
||||
if (image.isUpdateNeeded() || (image.isGeneratedMipmapsRequired() && !image.isMipmapsGenerated()) ) {
|
||||
updateTexImageData(image, tex.getType());
|
||||
}
|
||||
|
||||
int texId = image.getId();
|
||||
|
@ -702,7 +702,7 @@ public class LwjglGL1Renderer implements GL1Renderer {
|
||||
}
|
||||
}
|
||||
|
||||
public void updateTexImageData(Image img, Texture.Type type, boolean mips, int unit) {
|
||||
public void updateTexImageData(Image img, Texture.Type type, int unit) {
|
||||
int texId = img.getId();
|
||||
if (texId == -1) {
|
||||
// create texture
|
||||
@ -740,7 +740,7 @@ public class LwjglGL1Renderer implements GL1Renderer {
|
||||
}
|
||||
}
|
||||
|
||||
if (!img.hasMipmaps() && mips) {
|
||||
if (!img.hasMipmaps() && img.isGeneratedMipmapsRequired()) {
|
||||
// No pregenerated mips available,
|
||||
// generate from base level if required
|
||||
|
||||
@ -750,6 +750,7 @@ public class LwjglGL1Renderer implements GL1Renderer {
|
||||
} else {
|
||||
MipMapGenerator.generateMipMaps(img);
|
||||
}
|
||||
img.setMipmapsGenerated(true);
|
||||
} else {
|
||||
}
|
||||
|
||||
@ -787,8 +788,8 @@ public class LwjglGL1Renderer implements GL1Renderer {
|
||||
}
|
||||
|
||||
Image image = tex.getImage();
|
||||
if (image.isUpdateNeeded()) {
|
||||
updateTexImageData(image, tex.getType(), tex.getMinFilter().usesMipMapLevels(), unit);
|
||||
if (image.isUpdateNeeded() || (image.isGeneratedMipmapsRequired() && !image.isMipmapsGenerated()) ) {
|
||||
updateTexImageData(image, tex.getType(), unit);
|
||||
}
|
||||
|
||||
int texId = image.getId();
|
||||
|
@ -1385,7 +1385,7 @@ public class LwjglRenderer implements Renderer {
|
||||
Texture tex = rb.getTexture();
|
||||
Image image = tex.getImage();
|
||||
if (image.isUpdateNeeded()) {
|
||||
updateTexImageData(image, tex.getType(), tex.getMinFilter().usesMipMapLevels(), 0);
|
||||
updateTexImageData(image, tex.getType(), 0);
|
||||
|
||||
// NOTE: For depth textures, sets nearest/no-mips mode
|
||||
// Required to fix "framebuffer unsupported"
|
||||
@ -1775,7 +1775,15 @@ public class LwjglRenderer implements Renderer {
|
||||
}
|
||||
}
|
||||
|
||||
public void updateTexImageData(Image img, Texture.Type type, boolean mips, int unit) {
|
||||
/**
|
||||
* Uploads the given image to the GL driver.
|
||||
*
|
||||
* @param img The image to upload
|
||||
* @param type How the data in the image argument should be interpreted.
|
||||
* @param updateMipsOnly If true, then texture data is already updated for this image, only
|
||||
* @param unit The texture slot to be used to upload the image, not important
|
||||
*/
|
||||
public void updateTexImageData(Image img, Texture.Type type, int unit) {
|
||||
int texId = img.getId();
|
||||
if (texId == -1) {
|
||||
// create texture
|
||||
@ -1800,13 +1808,15 @@ public class LwjglRenderer implements Renderer {
|
||||
statistics.onTextureUse(img, true);
|
||||
}
|
||||
|
||||
if (!img.hasMipmaps() && mips) {
|
||||
if (!img.hasMipmaps() && img.isGeneratedMipmapsRequired()) {
|
||||
// No pregenerated mips available,
|
||||
// generate from base level if required
|
||||
if (!GLContext.getCapabilities().OpenGL30) {
|
||||
glTexParameteri(target, GL_GENERATE_MIPMAP, GL_TRUE);
|
||||
img.setMipmapsGenerated(true);
|
||||
}
|
||||
} else {
|
||||
// Image already has mipmaps or no mipmap generation desired.
|
||||
// glTexParameteri(target, GL_TEXTURE_BASE_LEVEL, 0 );
|
||||
if (img.getMipMapSizes() != null) {
|
||||
glTexParameteri(target, GL_TEXTURE_MAX_LEVEL, img.getMipMapSizes().length - 1);
|
||||
@ -1871,21 +1881,22 @@ public class LwjglRenderer implements Renderer {
|
||||
}
|
||||
|
||||
if (GLContext.getCapabilities().OpenGL30) {
|
||||
if (!img.hasMipmaps() && mips && img.getData() != null) {
|
||||
if (!img.hasMipmaps() && img.isGeneratedMipmapsRequired() && img.getData() != null) {
|
||||
// XXX: Required for ATI
|
||||
glEnable(target);
|
||||
glGenerateMipmapEXT(target);
|
||||
glDisable(target);
|
||||
img.setMipmapsGenerated(true);
|
||||
}
|
||||
}
|
||||
|
||||
img.clearUpdateNeeded();
|
||||
}
|
||||
|
||||
|
||||
public void setTexture(int unit, Texture tex) {
|
||||
Image image = tex.getImage();
|
||||
if (image.isUpdateNeeded()) {
|
||||
updateTexImageData(image, tex.getType(), tex.getMinFilter().usesMipMapLevels(), unit);
|
||||
if (image.isUpdateNeeded() || (image.isGeneratedMipmapsRequired() && !image.isMipmapsGenerated()) ) {
|
||||
updateTexImageData(image, tex.getType(), unit);
|
||||
}
|
||||
|
||||
int texId = image.getId();
|
||||
|
Loading…
x
Reference in New Issue
Block a user