/* 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 */
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;
}
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);
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)
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);
* 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) {
/* 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);
}
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);
}
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;
#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