WM: add support for temporary region data
This commit is contained in:
		@@ -233,10 +233,15 @@ ARegion *BKE_area_region_copy(SpaceType *st, ARegion *ar)
 | 
			
		||||
	if (ar->regiondata) {
 | 
			
		||||
		ARegionType *art = BKE_regiontype_from_id(st, ar->regiontype);
 | 
			
		||||
 | 
			
		||||
		if (art && art->duplicate)
 | 
			
		||||
		if (art && art->duplicate) {
 | 
			
		||||
			newar->regiondata = art->duplicate(ar->regiondata);
 | 
			
		||||
		else
 | 
			
		||||
		}
 | 
			
		||||
		else if (ar->flag & RGN_FLAG_TEMP_REGIONDATA) {
 | 
			
		||||
			newar->regiondata = NULL;
 | 
			
		||||
		}
 | 
			
		||||
		else {
 | 
			
		||||
			newar->regiondata = MEM_dupallocN(ar->regiondata);
 | 
			
		||||
		}
 | 
			
		||||
	}
 | 
			
		||||
 | 
			
		||||
	if (ar->v2d.tab_offset)
 | 
			
		||||
 
 | 
			
		||||
@@ -6431,6 +6431,10 @@ static void direct_link_region(FileData *fd, ARegion *ar, int spacetype)
 | 
			
		||||
		/* unkown space type, don't leak regiondata */
 | 
			
		||||
		ar->regiondata = NULL;
 | 
			
		||||
	}
 | 
			
		||||
	else if (ar->flag & RGN_FLAG_TEMP_REGIONDATA) {
 | 
			
		||||
		/* Runtime data, don't use. */
 | 
			
		||||
		ar->regiondata = NULL;
 | 
			
		||||
	}
 | 
			
		||||
	else {
 | 
			
		||||
		ar->regiondata = newdataadr(fd, ar->regiondata);
 | 
			
		||||
		if (ar->regiondata) {
 | 
			
		||||
@@ -7213,11 +7217,12 @@ static void lib_link_workspace_layout_restore(struct IDNameLib_Map *id_map, Main
 | 
			
		||||
 | 
			
		||||
					/* free render engines for now */
 | 
			
		||||
					for (ar = sa->regionbase.first; ar; ar = ar->next) {
 | 
			
		||||
						RegionView3D *rv3d= ar->regiondata;
 | 
			
		||||
						
 | 
			
		||||
						if (rv3d && rv3d->render_engine) {
 | 
			
		||||
							RE_engine_free(rv3d->render_engine);
 | 
			
		||||
							rv3d->render_engine = NULL;
 | 
			
		||||
						if (ar->regiontype == RGN_TYPE_WINDOW) {
 | 
			
		||||
							RegionView3D *rv3d = ar->regiondata;
 | 
			
		||||
							if (rv3d && rv3d->render_engine) {
 | 
			
		||||
								RE_engine_free(rv3d->render_engine);
 | 
			
		||||
								rv3d->render_engine = NULL;
 | 
			
		||||
							}
 | 
			
		||||
						}
 | 
			
		||||
					}
 | 
			
		||||
				}
 | 
			
		||||
 
 | 
			
		||||
@@ -2687,6 +2687,10 @@ static void write_region(WriteData *wd, ARegion *ar, int spacetype)
 | 
			
		||||
	writestruct(wd, DATA, ARegion, 1, ar);
 | 
			
		||||
 | 
			
		||||
	if (ar->regiondata) {
 | 
			
		||||
		if (ar->flag & RGN_FLAG_TEMP_REGIONDATA) {
 | 
			
		||||
			return;
 | 
			
		||||
		}
 | 
			
		||||
 | 
			
		||||
		switch (spacetype) {
 | 
			
		||||
			case SPACE_VIEW3D:
 | 
			
		||||
				if (ar->regiontype == RGN_TYPE_WINDOW) {
 | 
			
		||||
 
 | 
			
		||||
@@ -489,7 +489,9 @@ enum {
 | 
			
		||||
	/* Force delayed reinit of region size data, so that region size is calculated
 | 
			
		||||
	 * just big enough to show all its content (if enough space is available).
 | 
			
		||||
	 * Note that only ED_region_header supports this right now. */
 | 
			
		||||
	RGN_FLAG_DYNAMIC_SIZE     = (1 << 2),
 | 
			
		||||
	RGN_FLAG_DYNAMIC_SIZE       = (1 << 2),
 | 
			
		||||
	/* Region data is NULL'd on read, never written. */
 | 
			
		||||
	RGN_FLAG_TEMP_REGIONDATA    = (1 << 3),
 | 
			
		||||
};
 | 
			
		||||
 | 
			
		||||
/* region do_draw */
 | 
			
		||||
 
 | 
			
		||||
		Reference in New Issue
	
	Block a user