[Bf-blender-cvs] [94d0cbf1278] temp-udim-images: Support tiled textures in the viewport and in Eevee
Lukas Stockner
noreply at git.blender.org
Mon Jun 11 22:21:53 CEST 2018
Commit: 94d0cbf12782f232eebd9fe54788150421391f37
Author: Lukas Stockner
Date: Mon Jun 11 19:51:38 2018 +0200
Branches: temp-udim-images
https://developer.blender.org/rB94d0cbf12782f232eebd9fe54788150421391f37
Support tiled textures in the viewport and in Eevee
===================================================================
M source/blender/blenkernel/BKE_image.h
M source/blender/blenkernel/intern/image.c
M source/blender/blenloader/intern/readfile.c
M source/blender/draw/intern/draw_manager_data.c
M source/blender/editors/space_image/image_ops.c
M source/blender/gpu/GPU_material.h
M source/blender/gpu/intern/gpu_codegen.c
M source/blender/gpu/intern/gpu_codegen.h
M source/blender/gpu/intern/gpu_draw.c
M source/blender/gpu/intern/gpu_texture.c
M source/blender/gpu/shaders/gpu_shader_material.glsl
M source/blender/makesdna/DNA_image_types.h
M source/blender/nodes/shader/nodes/node_shader_tex_environment.c
M source/blender/nodes/shader/nodes/node_shader_tex_image.c
M source/blender/nodes/shader/nodes/node_shader_texture.c
M source/tools
===================================================================
diff --git a/source/blender/blenkernel/BKE_image.h b/source/blender/blenkernel/BKE_image.h
index 86d3922ca38..2d913da38c5 100644
--- a/source/blender/blenkernel/BKE_image.h
+++ b/source/blender/blenkernel/BKE_image.h
@@ -274,6 +274,17 @@ bool BKE_image_has_alpha(struct Image *image);
/* check if texture has gpu texture code */
bool BKE_image_has_bindcode(struct Image *ima);
+/* get tile index for tiled images */
+int BKE_image_get_tile_index(struct Image *ima, struct ImageUser *iuser);
+
+unsigned int BKE_image_get_bindcode(struct Image *ima, int tile, int type);
+void BKE_image_set_bindcode(struct Image *ima, int tile, int type, unsigned int bindcode);
+
+struct GPUTexture *BKE_image_get_gpu_texture(struct Image *ima, int tile, int type);
+void BKE_image_set_gpu_texture(struct Image *ima, int tile, int type, struct GPUTexture *tex);
+
+void BKE_image_set_num_tiles(struct Image *ima, int num_tiles);
+
void BKE_image_get_size(struct Image *image, struct ImageUser *iuser, int *width, int *height);
void BKE_image_get_size_fl(struct Image *image, struct ImageUser *iuser, float size[2]);
void BKE_image_get_aspect(struct Image *image, float *aspx, float *aspy);
diff --git a/source/blender/blenkernel/intern/image.c b/source/blender/blenkernel/intern/image.c
index aa05116f052..accbf052de4 100644
--- a/source/blender/blenkernel/intern/image.c
+++ b/source/blender/blenkernel/intern/image.c
@@ -446,6 +446,13 @@ static void copy_image_packedfiles(ListBase *lb_dst, const ListBase *lb_src)
}
}
+static void image_alloc_gputexture(Image *ima)
+{
+ int len = TEXTARGET_COUNT * max_ii(1, ima->num_tiles);
+ ima->gputexture = MEM_recallocN(ima->gputexture, sizeof(struct GPUTexture*) * len);
+ ima->bindcode = MEM_recallocN(ima->bindcode, sizeof(unsigned int) * len);
+}
+
/**
* Only copy internal data of Image ID from source to already allocated/initialized destination.
* You probably nerver want to use that directly, use id_copy or BKE_id_copy_ex for typical needs.
@@ -472,10 +479,9 @@ void BKE_image_copy_data(Main *UNUSED(bmain), Image *ima_dst, const Image *ima_s
BLI_listbase_clear(&ima_dst->anims);
- for (int i = 0; i < TEXTARGET_COUNT; i++) {
- ima_dst->bindcode[i] = 0;
- ima_dst->gputexture[i] = NULL;
- }
+ ima_dst->gputexture = NULL;
+ ima_dst->bindcode = NULL;
+ image_alloc_gputexture(ima_dst);
if ((flag & LIB_ID_COPY_NO_PREVIEW) == 0) {
BKE_previewimg_id_copy(&ima_dst->id, &ima_src->id);
@@ -2946,6 +2952,60 @@ void BKE_image_multiview_index(Image *ima, ImageUser *iuser)
}
}
+int BKE_image_get_tile_index(struct Image *ima, struct ImageUser *iuser)
+{
+ if ((ima->source != IMA_SRC_TILED) || !iuser) {
+ return 0;
+ }
+
+ BLI_assert(iuser->tile < ima->num_tiles);
+
+ return iuser->tile;
+}
+
+unsigned int BKE_image_get_bindcode(struct Image *ima, int tile, int type)
+{
+ if (!ima->bindcode) {
+ image_alloc_gputexture(ima);
+ }
+
+ return ima->bindcode[tile*TEXTARGET_COUNT + type];
+}
+
+void BKE_image_set_bindcode(struct Image *ima, int tile, int type, unsigned int bindcode)
+{
+ if (!ima->bindcode) {
+ image_alloc_gputexture(ima);
+ }
+
+ ima->bindcode[tile*TEXTARGET_COUNT + type] = bindcode;
+}
+
+struct GPUTexture *BKE_image_get_gpu_texture(struct Image *ima, int tile, int type)
+{
+ if (!ima->gputexture) {
+ image_alloc_gputexture(ima);
+ }
+
+ return ima->gputexture[tile*TEXTARGET_COUNT + type];
+}
+
+void BKE_image_set_gpu_texture(struct Image *ima, int tile, int type, struct GPUTexture *tex)
+{
+ if (!ima->gputexture) {
+ image_alloc_gputexture(ima);
+ }
+
+ ima->gputexture[tile*TEXTARGET_COUNT + type] = tex;
+}
+
+void BKE_image_set_num_tiles(struct Image *ima, int num_tiles)
+{
+ BLI_assert(ima->source == IMA_SRC_TILED);
+ ima->num_tiles = num_tiles;
+ image_alloc_gputexture(ima);
+}
+
/* if layer or pass changes, we need an index for the imbufs list */
/* note it is called for rendered results, but it doesnt use the index! */
/* and because rendered results use fake layer/passes, don't correct for wrong indices here */
diff --git a/source/blender/blenloader/intern/readfile.c b/source/blender/blenloader/intern/readfile.c
index a9f93dff9e6..8618bd76ec6 100644
--- a/source/blender/blenloader/intern/readfile.c
+++ b/source/blender/blenloader/intern/readfile.c
@@ -1641,14 +1641,22 @@ void blo_make_image_pointer_map(FileData *fd, Main *oldmain)
for (; ima; ima = ima->id.next) {
if (ima->cache)
oldnewmap_insert(fd->imamap, ima->cache, ima->cache, 0);
- for (a = 0; a < TEXTARGET_COUNT; a++)
- if (ima->gputexture[a])
- oldnewmap_insert(fd->imamap, ima->gputexture[a], ima->gputexture[a], 0);
if (ima->rr)
oldnewmap_insert(fd->imamap, ima->rr, ima->rr, 0);
for (a=0; a < IMA_MAX_RENDER_SLOT; a++)
if (ima->renders[a])
oldnewmap_insert(fd->imamap, ima->renders[a], ima->renders[a], 0);
+ if (ima->bindcode) {
+ oldnewmap_insert(fd->imamap, ima->bindcode, ima->bindcode, 0);
+ }
+ if (ima->gputexture) {
+ oldnewmap_insert(fd->imamap, ima->gputexture, ima->gputexture, 0);
+ for (a = 0; a < max_ii(1, ima->num_tiles)*TEXTARGET_COUNT; a++) {
+ if (ima->gputexture[a]) {
+ oldnewmap_insert(fd->imamap, ima->gputexture[a], ima->gputexture[a], 0);
+ }
+ }
+ }
}
for (; sce; sce = sce->id.next) {
if (sce->nodetree && sce->nodetree->previews) {
@@ -1680,17 +1688,21 @@ void blo_end_image_pointer_map(FileData *fd, Main *oldmain)
ima->cache = newimaadr(fd, ima->cache);
if (ima->cache == NULL) {
ima->tpageflag &= ~IMA_GLBIND_IS_DATA;
- for (i = 0; i < TEXTARGET_COUNT; i++) {
- ima->bindcode[i] = 0;
- ima->gputexture[i] = NULL;
- }
ima->rr = NULL;
+ MEM_SAFE_FREE(ima->gputexture);
+ MEM_SAFE_FREE(ima->bindcode);
}
for (i = 0; i < IMA_MAX_RENDER_SLOT; i++)
ima->renders[i] = newimaadr(fd, ima->renders[i]);
- for (i = 0; i < TEXTARGET_COUNT; i++)
- ima->gputexture[i] = newimaadr(fd, ima->gputexture[i]);
+ ima->bindcode = newimaadr(fd, ima->bindcode);
+ ima->gputexture = newimaadr(fd, ima->gputexture);
+ if (ima->gputexture) {
+ for (i = 0; i < max_ii(1, ima->num_tiles)*TEXTARGET_COUNT; i++) {
+ ima->gputexture[i] = newimaadr(fd, ima->gputexture[i]);
+ }
+ }
+
ima->rr = newimaadr(fd, ima->rr);
}
for (; sce; sce = sce->id.next) {
@@ -3915,10 +3927,9 @@ static void direct_link_image(FileData *fd, Image *ima)
/* if not restored, we keep the binded opengl index */
if (!ima->cache) {
ima->tpageflag &= ~IMA_GLBIND_IS_DATA;
- for (int i = 0; i < TEXTARGET_COUNT; i++) {
- ima->bindcode[i] = 0;
- ima->gputexture[i] = NULL;
- }
+
+ ima->gputexture = NULL;
+ ima->bindcode = NULL;
ima->rr = NULL;
}
diff --git a/source/blender/draw/intern/draw_manager_data.c b/source/blender/draw/intern/draw_manager_data.c
index b49af47223f..805d71eb393 100644
--- a/source/blender/draw/intern/draw_manager_data.c
+++ b/source/blender/draw/intern/draw_manager_data.c
@@ -766,9 +766,18 @@ static DRWShadingGroup *drw_shgroup_material_inputs(DRWShadingGroup *grp, struct
for (GPUInput *input = inputs->first; input; input = input->next) {
/* Textures */
if (input->ima) {
+ ImageUser *tex_iuser = input->iuser;
+
+ /* If there's no specified iuser but we need a different tile, create a temporary one. */
+ ImageUser iuser = {NULL};
+ iuser.ok = true;
+ iuser.tile = input->image_tile;
+ if (!tex_iuser && iuser.tile != 0)
+ tex_iuser = &iuser;
+
double time = 0.0; /* TODO make time variable */
GPUTexture *tex = GPU_texture_from_blender(
- input->ima, input->iuser, input->textarget, input->image_isdata, time, 1);
+ input->ima, tex_iuser, input->textarget, input->image_isdata, time, 1);
if (input->bindtex) {
DRW_shgroup_uniform_texture(grp, input->shadername, tex);
diff --git a/source/blender/editors/space_image/image_ops.c b/source/blender/editors/space_image/image_ops.c
index 1fc09fb5e86..a3eafc05df1 100644
--- a/source/blender/editors/space_image/image_ops.c
+++ b/source/blender/editors/space_image/image_ops.c
@@ -1271,7 +1271,7 @@ static Image *image_open_single(
if ((frame_seq_len > 1) && (ima->source == IMA_SRC_FILE)) {
if (frame_seq_ofs == 1001) {
ima->source = IMA_SRC_TILED;
- ima->num_tiles = frame_seq_len;
+ BKE_image_set_num_tiles(ima, frame_seq_len);
}
else {
ima->source = IMA_SRC_SEQUENCE;
diff --git a/source/blender/gpu/GPU_material.h b/source/blender/gpu/GPU_material.h
index 0805cc25d04..eb4eaea8c3e 100644
--- a/source/blender/gpu/GPU_material.h
+++ b/source/blender/gpu/GPU_material.h
@@ -220,7 +220,7 @@ GPUNodeLink *GPU_attribute(CustomDataType type, const char *name);
GPUNodeLink *GPU_uniform(float *num);
GPUNodeLink *GPU_dynamic_uniform(float *num, GPUDynamicType dynamictype, void *data);
GPUNodeLink *GPU_uniform_buffer(float *num, GPUType gputype);
-GPUNodeLink *GPU_image(struct Image *ima, struct ImageUser *iuser, bool is_data);
+GPUNodeLink *GPU_image(struct Image *ima, struct ImageUser *iuser, bool is_data, int tile);
GPUNodeLink *GPU_cube_map(struct Image *ima, struct ImageUser *iuser, bool is_data);
GPUNodeLink *GPU_image_preview(struct PreviewImage *prv);
GPUNodeLink *GPU_texture(int size, float *pixels);
diff --git a/source/blender/gpu/intern/gpu_codegen.c b/source/blender/gpu/intern/gpu_codegen.c
index 0dd9d1f0908..07c4eb5ce3a 100644
--- a/source/blender/gpu/intern/gpu_codegen.c
+++ b/source/blender/gpu/intern/gpu_codegen.c
@@ -498,17 +498,19 @@ const char *GPU_builtin_name(GPUBuiltin builtin)
}
/* assign only one texid per buffer to avoid sampling the same texture twice */
-static void codegen_set_texid(GHash *bindhash, GPUInput *input, int *texid, void *key)
+static void codegen_set_texid(GHash *bindhash, GPUInput *input, int *texid, void *key1, int key2)
{
- if (BLI_ghash_haskey(bindhash, key)) {
+ GHashPair pair = {key1, SET_INT_IN_POINTER(key2 << 16)};
+ if (BLI_ghash_haskey(bindhash, &pair)) {
/* Reuse existing texid */
- input->texid = GET_INT_FROM_POINTER(BLI_ghash_lookup(bindhash, key));
+ input->texid = GET_INT_FROM_POINTER(BLI_ghash_lookup(bindhash, &pair));
}
else {
/* Allocate new texid */
input->texid = *texid;
(*texid)++;
input->bindtex = true;
+ void *key = BLI_ghashutil_pairallo
@@ Diff output truncated at 10240 characters. @@
More information about the Bf-blender-cvs
mailing list