[Bf-blender-cvs] SVN commit: /data/svn/bf-blender [60633] trunk/blender/source/blender/ editors/sculpt_paint: Paint cursor overlays: Delete the cursor texture overlay resources when

Antony Riakiotakis kalast at gmail.com
Wed Oct 9 18:00:16 CEST 2013


Revision: 60633
          http://projects.blender.org/scm/viewvc.php?view=rev&root=bf-blender&revision=60633
Author:   psy-fi
Date:     2013-10-09 16:00:15 +0000 (Wed, 09 Oct 2013)
Log Message:
-----------
Paint cursor overlays: Delete the cursor texture overlay resources when
exiting a paint mode.

Modified Paths:
--------------
    trunk/blender/source/blender/editors/sculpt_paint/paint_cursor.c
    trunk/blender/source/blender/editors/sculpt_paint/paint_image.c
    trunk/blender/source/blender/editors/sculpt_paint/paint_intern.h
    trunk/blender/source/blender/editors/sculpt_paint/paint_vertex.c
    trunk/blender/source/blender/editors/sculpt_paint/sculpt.c

Modified: trunk/blender/source/blender/editors/sculpt_paint/paint_cursor.c
===================================================================
--- trunk/blender/source/blender/editors/sculpt_paint/paint_cursor.c	2013-10-09 15:57:32 UTC (rev 60632)
+++ trunk/blender/source/blender/editors/sculpt_paint/paint_cursor.c	2013-10-09 16:00:15 UTC (rev 60633)
@@ -79,6 +79,30 @@
 	bool old_col;
 } TexSnapshot;
 
+typedef struct CursorSnapshot {
+	GLuint overlay_texture;
+	int size;
+	int zoom;
+} CursorSnapshot;
+
+static TexSnapshot primary_snap = {0};
+static TexSnapshot secondary_snap  = {0};
+static CursorSnapshot cursor_snap  = {0};
+
+/* delete overlay cursor textures to preserve memory and invalidate all overlay flags */
+void paint_cursor_delete_textures()
+{
+	glDeleteTextures(1, &primary_snap.overlay_texture);
+	glDeleteTextures(1, &secondary_snap.overlay_texture);
+	glDeleteTextures(1, &cursor_snap.overlay_texture);
+
+	memset(&primary_snap, 0, sizeof(TexSnapshot));
+	memset(&secondary_snap, 0, sizeof(TexSnapshot));
+	memset(&cursor_snap, 0, sizeof(TexSnapshot));
+
+	BKE_paint_invalidate_overlay_all();
+}
+
 static int same_tex_snap(TexSnapshot *snap, MTex *mtex, ViewContext *vc, bool col, float zoom)
 {
 	return (/* make brush smaller shouldn't cause a resample */
@@ -103,9 +127,7 @@
 
 static int load_tex(Brush *br, ViewContext *vc, float zoom, bool col, bool primary)
 {
-	static int init = 0;
-	static TexSnapshot primary_snap = {0};
-	static TexSnapshot secondary_snap  = {0};
+	bool init;
 	TexSnapshot *target;
 
 	MTex *mtex = (primary) ? &br->mtex : &br->mask_mtex;
@@ -120,12 +142,14 @@
 	                           (overlay_flags & PAINT_INVALID_OVERLAY_TEXTURE_SECONDARY);
 
 	target = (primary) ? &primary_snap : &secondary_snap;
-		
+
 	refresh = 
 	    !target->overlay_texture ||
 	    (invalid != 0) ||
 	    !same_tex_snap(target, mtex, vc, col, zoom);
 
+	init = (target->overlay_texture != 0);
+
 	if (refresh) {
 		struct ImagePool *pool = NULL;
 		/* stencil is rotated later */
@@ -160,7 +184,7 @@
 				target->overlay_texture = 0;
 			}
 
-			init = 0;
+			init = false;
 
 			target->old_size = size;
 		}
@@ -267,7 +291,6 @@
 	if (refresh) {
 		if (!init || (target->old_col != col)) {
 			glTexImage2D(GL_TEXTURE_2D, 0, format, size, size, 0, format, GL_UNSIGNED_BYTE, buffer);
-			init = 1;
 		}
 		else {
 			glTexSubImage2D(GL_TEXTURE_2D, 0, 0, 0, size, size, format, GL_UNSIGNED_BYTE, buffer);
@@ -297,10 +320,7 @@
 
 static int load_tex_cursor(Brush *br, ViewContext *vc, float zoom)
 {
-	static GLuint overlay_texture = 0;
-	static int init = 0;
-	static int old_size = -1;
-	static int old_zoom = -1;
+	bool init;
 
 	OverlayControlFlags overlay_flags = BKE_paint_get_overlay_flags();
 	GLubyte *buffer = NULL;
@@ -310,14 +330,16 @@
 	int refresh;
 
 	refresh =
-	    !overlay_texture ||
+	    !cursor_snap.overlay_texture ||
 	    (overlay_flags & PAINT_INVALID_OVERLAY_CURVE) ||
-	    old_zoom != zoom;
+	    cursor_snap.zoom != zoom;
 
+	init = (cursor_snap.overlay_texture != 0);
+
 	if (refresh) {
 		int s, r;
 
-		old_zoom = zoom;
+		cursor_snap.zoom = zoom;
 
 		s = BKE_brush_size_get(vc->scene, br);
 		r = 1;
@@ -330,18 +352,18 @@
 		if (size < 256)
 			size = 256;
 
-		if (size < old_size)
-			size = old_size;
+		if (size < cursor_snap.size)
+			size = cursor_snap.size;
 
-		if (old_size != size) {
-			if (overlay_texture) {
-				glDeleteTextures(1, &overlay_texture);
-				overlay_texture = 0;
+		if (cursor_snap.size != size) {
+			if (cursor_snap.overlay_texture) {
+				glDeleteTextures(1, &cursor_snap.overlay_texture);
+				cursor_snap.overlay_texture = 0;
 			}
 
-			init = 0;
+			init = false;
 
-			old_size = size;
+			cursor_snap.size = size;
 		}
 		buffer = MEM_mallocN(sizeof(GLubyte) * size * size, "load_tex");
 
@@ -383,14 +405,14 @@
 			}
 		}
 
-		if (!overlay_texture)
-			glGenTextures(1, &overlay_texture);
+		if (!cursor_snap.overlay_texture)
+			glGenTextures(1, &cursor_snap.overlay_texture);
 	}
 	else {
-		size = old_size;
+		size = cursor_snap.size;
 	}
 
-	glBindTexture(GL_TEXTURE_2D, overlay_texture);
+	glBindTexture(GL_TEXTURE_2D, cursor_snap.overlay_texture);
 
 	if (refresh) {
 		if (!init) {

Modified: trunk/blender/source/blender/editors/sculpt_paint/paint_image.c
===================================================================
--- trunk/blender/source/blender/editors/sculpt_paint/paint_image.c	2013-10-09 15:57:32 UTC (rev 60632)
+++ trunk/blender/source/blender/editors/sculpt_paint/paint_image.c	2013-10-09 16:00:15 UTC (rev 60633)
@@ -792,6 +792,7 @@
 	if (settings->imapaint.paintcursor && !enable) {
 		WM_paint_cursor_end(wm, settings->imapaint.paintcursor);
 		settings->imapaint.paintcursor = NULL;
+		paint_cursor_delete_textures();
 	}
 	else if (enable)
 		paint_cursor_start(C, image_paint_poll);
@@ -820,6 +821,9 @@
 
 		paint_cursor_start_explicit(&imapaint->paint, wm, image_paint_poll);
 	}
+	else {
+		paint_cursor_delete_textures();
+	}
 }
 
 /************************ grab clone operator ************************/

Modified: trunk/blender/source/blender/editors/sculpt_paint/paint_intern.h
===================================================================
--- trunk/blender/source/blender/editors/sculpt_paint/paint_intern.h	2013-10-09 15:57:32 UTC (rev 60632)
+++ trunk/blender/source/blender/editors/sculpt_paint/paint_intern.h	2013-10-09 16:00:15 UTC (rev 60633)
@@ -86,6 +86,7 @@
 int paint_poll(struct bContext *C);
 void paint_cursor_start(struct bContext *C, int (*poll)(struct bContext *C));
 void paint_cursor_start_explicit(struct Paint *p, struct wmWindowManager *wm, int (*poll)(struct bContext *C));
+void paint_cursor_delete_textures(void);
 
 /* paint_vertex.c */
 int weight_paint_poll(struct bContext *C);

Modified: trunk/blender/source/blender/editors/sculpt_paint/paint_vertex.c
===================================================================
--- trunk/blender/source/blender/editors/sculpt_paint/paint_vertex.c	2013-10-09 15:57:32 UTC (rev 60632)
+++ trunk/blender/source/blender/editors/sculpt_paint/paint_vertex.c	2013-10-09 16:00:15 UTC (rev 60633)
@@ -2062,6 +2062,8 @@
 		/* weight paint spesific */
 		mesh_octree_table(NULL, NULL, NULL, 'e');
 		mesh_mirrtopo_table(NULL, 'e');
+
+		paint_cursor_delete_textures();
 	}
 	else {
 		ob->mode |= mode_flag;
@@ -2684,6 +2686,8 @@
 		if (me->editflag & ME_EDIT_PAINT_FACE_SEL) {
 			BKE_mesh_flush_select_from_polys(me);
 		}
+
+		paint_cursor_delete_textures();
 	}
 	else {
 		ob->mode |= mode_flag;

Modified: trunk/blender/source/blender/editors/sculpt_paint/sculpt.c
===================================================================
--- trunk/blender/source/blender/editors/sculpt_paint/sculpt.c	2013-10-09 15:57:32 UTC (rev 60632)
+++ trunk/blender/source/blender/editors/sculpt_paint/sculpt.c	2013-10-09 16:00:15 UTC (rev 60633)
@@ -5039,6 +5039,8 @@
 		ob->mode &= ~mode_flag;
 
 		free_sculptsession(ob);
+
+		paint_cursor_delete_textures();
 	}
 	else {
 		/* Enter sculptmode */




More information about the Bf-blender-cvs mailing list