dont display image sequences outside the frame range in the 3D viewport.
This commit is contained in:
@@ -157,7 +157,7 @@ void BKE_image_assign_ibuf(struct Image *ima, struct ImBuf *ibuf);
|
||||
/* called on frame change or before render */
|
||||
void BKE_image_user_frame_calc(struct ImageUser *iuser, int cfra, int fieldnr);
|
||||
void BKE_image_user_check_frame_calc(struct ImageUser *iuser, int cfra, int fieldnr);
|
||||
int BKE_image_user_frame_get(const struct ImageUser *iuser, int cfra, int fieldnr);
|
||||
int BKE_image_user_frame_get(const struct ImageUser *iuser, int cfra, int fieldnr, short *r_is_in_range);
|
||||
void BKE_image_user_file_path(struct ImageUser *iuser, struct Image *ima, char *path);
|
||||
|
||||
/* sets index offset for multilayer files */
|
||||
|
@@ -2784,10 +2784,14 @@ ImBuf *BKE_image_get_ibuf(Image *ima, ImageUser *iuser)
|
||||
return BKE_image_acquire_ibuf(ima, iuser, NULL);
|
||||
}
|
||||
|
||||
int BKE_image_user_frame_get(const ImageUser *iuser, int cfra, int fieldnr)
|
||||
int BKE_image_user_frame_get(const ImageUser *iuser, int cfra, int fieldnr, short *r_is_in_range)
|
||||
{
|
||||
const int len = (iuser->fie_ima * iuser->frames) / 2;
|
||||
|
||||
if (r_is_in_range) {
|
||||
*r_is_in_range = FALSE;
|
||||
}
|
||||
|
||||
if (len == 0) {
|
||||
return 0;
|
||||
}
|
||||
@@ -2800,10 +2804,23 @@ int BKE_image_user_frame_get(const ImageUser *iuser, int cfra, int fieldnr)
|
||||
cfra = ((cfra) % len);
|
||||
if (cfra < 0) cfra += len;
|
||||
if (cfra == 0) cfra = len;
|
||||
|
||||
if (r_is_in_range) {
|
||||
*r_is_in_range = TRUE;
|
||||
}
|
||||
}
|
||||
|
||||
if (cfra < 0) cfra = 0;
|
||||
else if (cfra > len) cfra = len;
|
||||
if (cfra < 0) {
|
||||
cfra = 0;
|
||||
}
|
||||
else if (cfra > len) {
|
||||
cfra = len;
|
||||
}
|
||||
else {
|
||||
if (r_is_in_range) {
|
||||
*r_is_in_range = TRUE;
|
||||
}
|
||||
}
|
||||
|
||||
/* convert current frame to current field */
|
||||
cfra = 2 * (cfra);
|
||||
@@ -2827,7 +2844,15 @@ int BKE_image_user_frame_get(const ImageUser *iuser, int cfra, int fieldnr)
|
||||
void BKE_image_user_frame_calc(ImageUser *iuser, int cfra, int fieldnr)
|
||||
{
|
||||
if (iuser) {
|
||||
const int framenr = BKE_image_user_frame_get(iuser, cfra, fieldnr);
|
||||
short is_in_range;
|
||||
const int framenr = BKE_image_user_frame_get(iuser, cfra, fieldnr, &is_in_range);
|
||||
|
||||
if (is_in_range) {
|
||||
iuser->flag |= IMA_USER_FRAME_IN_RANGE;
|
||||
}
|
||||
else {
|
||||
iuser->flag &= ~IMA_USER_FRAME_IN_RANGE;
|
||||
}
|
||||
|
||||
/* allows image users to handle redraws */
|
||||
if (iuser->flag & IMA_ANIM_ALWAYS)
|
||||
|
@@ -2892,11 +2892,9 @@ static int mesh_separate_material(Main *bmain, Scene *scene, Base *editbase, wmO
|
||||
static int mesh_separate_loose(Main *bmain, Scene *scene, Base *editbase, wmOperator *wmop)
|
||||
{
|
||||
int i;
|
||||
BMVert *v;
|
||||
BMEdge *e;
|
||||
BMVert *v_seed;
|
||||
BMWalker walker;
|
||||
BMIter iter;
|
||||
int result = FALSE;
|
||||
Object *obedit = editbase->object;
|
||||
BMEditMesh *em = BMEdit_FromObject(obedit);
|
||||
@@ -2913,11 +2911,7 @@ static int mesh_separate_loose(Main *bmain, Scene *scene, Base *editbase, wmOper
|
||||
* original mesh.*/
|
||||
for (i = 0; i < max_iter; i++) {
|
||||
/* Get a seed vertex to start the walk */
|
||||
v_seed = NULL;
|
||||
BM_ITER_MESH (v, &iter, bm, BM_VERTS_OF_MESH) {
|
||||
v_seed = v;
|
||||
break;
|
||||
}
|
||||
v_seed = BM_iter_at_index(bm, BM_VERTS_OF_MESH, NULL, 0);
|
||||
|
||||
/* No vertices available, can't do anything */
|
||||
if (v_seed == NULL) {
|
||||
|
@@ -148,7 +148,7 @@ static void image_info(Scene *scene, ImageUser *iuser, Image *ima, ImBuf *ibuf,
|
||||
/* the frame number, even if we cant */
|
||||
if (ima->source == IMA_SRC_SEQUENCE) {
|
||||
/* don't use iuser->framenr directly because it may not be updated if auto-refresh is off */
|
||||
const int framenr = BKE_image_user_frame_get(iuser, CFRA, 0);
|
||||
const int framenr = BKE_image_user_frame_get(iuser, CFRA, 0, NULL);
|
||||
ofs += sprintf(str + ofs, IFACE_(", Frame: %d"), framenr);
|
||||
}
|
||||
|
||||
|
@@ -1213,7 +1213,7 @@ static void node_buts_image_user(uiLayout *layout, bContext *C, PointerRNA *ptr,
|
||||
Scene *scene = CTX_data_scene(C);
|
||||
ImageUser *iuser = iuserptr->data;
|
||||
char numstr[32];
|
||||
const int framenr = BKE_image_user_frame_get(iuser, CFRA, 0);
|
||||
const int framenr = BKE_image_user_frame_get(iuser, CFRA, 0, NULL);
|
||||
BLI_snprintf(numstr, sizeof(numstr), IFACE_("Frame: %d"), framenr);
|
||||
uiItemL(layout, numstr, ICON_NONE);
|
||||
}
|
||||
|
@@ -1561,7 +1561,12 @@ static void view3d_draw_bgpic(Scene *scene, ARegion *ar, View3D *v3d,
|
||||
if (ima == NULL)
|
||||
continue;
|
||||
BKE_image_user_frame_calc(&bgpic->iuser, CFRA, 0);
|
||||
ibuf = BKE_image_get_ibuf(ima, &bgpic->iuser);
|
||||
if (ima->source == IMA_SRC_SEQUENCE && !(bgpic->iuser.flag & IMA_USER_FRAME_IN_RANGE)) {
|
||||
ibuf = NULL; /* frame is out of range, dont show */
|
||||
}
|
||||
else {
|
||||
ibuf = BKE_image_get_ibuf(ima, &bgpic->iuser);
|
||||
}
|
||||
|
||||
image_aspect[0] = ima->aspx;
|
||||
image_aspect[1] = ima->aspx;
|
||||
|
@@ -122,6 +122,7 @@ typedef struct Image {
|
||||
#define IMA_OLD_PREMUL 128
|
||||
#define IMA_CM_PREDIVIDE 256
|
||||
#define IMA_USED_FOR_RENDER 512
|
||||
#define IMA_USER_FRAME_IN_RANGE 1024 /* for image user, but these flags are mixed */
|
||||
|
||||
/* Image.tpageflag */
|
||||
#define IMA_TILES 1
|
||||
|
Reference in New Issue
Block a user