diff options
author | Antony Riakiotakis <kalast@gmail.com> | 2012-09-18 19:58:07 +0400 |
---|---|---|
committer | Antony Riakiotakis <kalast@gmail.com> | 2012-09-18 19:58:07 +0400 |
commit | 602691fdfc5bdb88f52ca7b96b6d2dce0911abce (patch) | |
tree | 6d4723429e7692b626af6d9023583ff19693bc44 /source/blender | |
parent | 71ecbe9b37af2d89a732922fdff9be38a37a1bfb (diff) |
Fix #31539, painting in image editor while in object mode does not update mipmaps.
While we could disable/enable mipmaps on stroke begin/end, it is a bit hacky (but worthy of consideration for later) for my taste just to paint in the image editor. Instead we generate mipmaps on the fly. Since we can update texture levels below the first only with GPU mipmapping, partial update when painting in the image editor will actually work only with GPU mipmapping from now on (which is fast enough I hope not to get any lags!).
Diffstat (limited to 'source/blender')
-rw-r--r-- | source/blender/editors/sculpt_paint/paint_image.c | 2 | ||||
-rw-r--r-- | source/blender/gpu/GPU_draw.h | 2 | ||||
-rw-r--r-- | source/blender/gpu/intern/gpu_draw.c | 17 |
3 files changed, 15 insertions, 6 deletions
diff --git a/source/blender/editors/sculpt_paint/paint_image.c b/source/blender/editors/sculpt_paint/paint_image.c index 64430a263f0..15593b57aac 100644 --- a/source/blender/editors/sculpt_paint/paint_image.c +++ b/source/blender/editors/sculpt_paint/paint_image.c @@ -4265,7 +4265,7 @@ static void imapaint_image_update(Scene *scene, SpaceImage *sima, Image *image, int w = imapaintpartial.x2 - imapaintpartial.x1; int h = imapaintpartial.y2 - imapaintpartial.y1; /* Testing with partial update in uv editor too */ - GPU_paint_update_image(image, imapaintpartial.x1, imapaintpartial.y1, w, h, 0); //!texpaint); + GPU_paint_update_image(image, imapaintpartial.x1, imapaintpartial.y1, w, h); //!texpaint); } } diff --git a/source/blender/gpu/GPU_draw.h b/source/blender/gpu/GPU_draw.h index 467adbe10b8..285acb6bdde 100644 --- a/source/blender/gpu/GPU_draw.h +++ b/source/blender/gpu/GPU_draw.h @@ -119,7 +119,7 @@ void GPU_set_gpu_mipmapping(int gpu_mipmap); /* Image updates and free * - these deal with images bound as opengl textures */ -void GPU_paint_update_image(struct Image *ima, int x, int y, int w, int h, int mipmap); +void GPU_paint_update_image(struct Image *ima, int x, int y, int w, int h); void GPU_update_images_framechange(void); int GPU_update_image_time(struct Image *ima, double time); int GPU_verify_image(struct Image *ima, struct ImageUser *iuser, int tftile, int compare, int mipmap, int ncd); diff --git a/source/blender/gpu/intern/gpu_draw.c b/source/blender/gpu/intern/gpu_draw.c index 9aed843659d..9ae505ef0d0 100644 --- a/source/blender/gpu/intern/gpu_draw.c +++ b/source/blender/gpu/intern/gpu_draw.c @@ -878,13 +878,13 @@ void GPU_paint_set_mipmap(int mipmap) } } -void GPU_paint_update_image(Image *ima, int x, int y, int w, int h, int mipmap) +void GPU_paint_update_image(Image *ima, int x, int y, int w, int h) { ImBuf *ibuf; ibuf = BKE_image_get_ibuf(ima, NULL); - if (ima->repbind || (GPU_get_mipmap() && mipmap) || !ima->bindcode || !ibuf || + if (ima->repbind || (GPU_get_mipmap() && !GTS.gpu_mipmap) || !ima->bindcode || !ibuf || (!is_power_of_2_i(ibuf->x) || !is_power_of_2_i(ibuf->y)) || (w == 0) || (h == 0)) { @@ -911,8 +911,13 @@ void GPU_paint_update_image(Image *ima, int x, int y, int w, int h, int mipmap) MEM_freeN(buffer); - if (ima->tpageflag & IMA_MIPMAP_COMPLETE) + /* we have already accounted for the case where GTS.gpu_mipmap is false + * so we will be using GPU mipmap generation here */ + if (GPU_get_mipmap()) { + glGenerateMipmapEXT(GL_TEXTURE_2D); + } else { ima->tpageflag &= ~IMA_MIPMAP_COMPLETE; + } return; } @@ -934,8 +939,12 @@ void GPU_paint_update_image(Image *ima, int x, int y, int w, int h, int mipmap) glPixelStorei(GL_UNPACK_SKIP_PIXELS, skip_pixels); glPixelStorei(GL_UNPACK_SKIP_ROWS, skip_rows); - if (ima->tpageflag & IMA_MIPMAP_COMPLETE) + /* see comment above as to why we are using gpu mipmap generation here */ + if (GPU_get_mipmap()) { + glGenerateMipmapEXT(GL_TEXTURE_2D); + } else { ima->tpageflag &= ~IMA_MIPMAP_COMPLETE; + } } } |