[Bf-blender-cvs] SVN commit: /data/svn/bf-blender [30452] branches/soc-2010-jwilkins: == MatCap Shade Mode ==

Jason Wilkins Jason.A.Wilkins at gmail.com
Sun Jul 18 01:17:43 CEST 2010


Revision: 30452
          http://projects.blender.org/plugins/scmsvn/viewcvs.php?view=rev&root=bf-blender&revision=30452
Author:   jwilkins
Date:     2010-07-18 01:17:42 +0200 (Sun, 18 Jul 2010)

Log Message:
-----------
== MatCap Shade Mode ==
Added MatCap shade mode to 'BB, Wire, Solid, Texture' selector.
Use the MatCap panel on the nkey panel to load and select a MatCap
MatCap is a quick and easy way to visualize how models will look with a particular shading style.  This is particularly useful for sculpting and modeling where it is possible to get a quick idea how a finished object may look without rendering it.

However, the selected MatCap will have no effect on a finished render.  Its purpose is to allow quick and easy visualization of a surface without creating or changing materials or loading images into the .blend.

Known Problems:
* MatCap is global so it will be used to render every object in a view.  A per-object matcap would be more complex to implement and goes against the idea that it be simple and minimal.

* Only the image used last as MatCap will be saved to the .blend.  There is no intention at this time to save multiple MatCaps, in fact, saving just one is a concession to usability.

In the future I intend to load the MatcCp selector with images from a directory the user selects and keep none of the images in the .blend file at all.  I think this would be the best way.

Sorry this is a little long winded.  I am trying to justify this feature as simple and needed because I've heard objections that it would introduce complexity when MatCaps are already possible with the existing options.  However, this commit is intended as a proof of concept on how it can be done simply and unobtrusively.

Modified Paths:
--------------
    branches/soc-2010-jwilkins/release/scripts/ui/space_view3d.py
    branches/soc-2010-jwilkins/source/blender/blenkernel/intern/material.c
    branches/soc-2010-jwilkins/source/blender/blenloader/intern/readfile.c
    branches/soc-2010-jwilkins/source/blender/editors/space_view3d/drawmesh.c
    branches/soc-2010-jwilkins/source/blender/editors/space_view3d/drawobject.c
    branches/soc-2010-jwilkins/source/blender/editors/space_view3d/space_view3d.c
    branches/soc-2010-jwilkins/source/blender/editors/space_view3d/view3d_draw.c
    branches/soc-2010-jwilkins/source/blender/gpu/intern/gpu_codegen.c
    branches/soc-2010-jwilkins/source/blender/gpu/intern/gpu_draw.c
    branches/soc-2010-jwilkins/source/blender/gpu/intern/gpu_material.c
    branches/soc-2010-jwilkins/source/blender/makesdna/DNA_object_types.h
    branches/soc-2010-jwilkins/source/blender/makesdna/DNA_view3d_types.h
    branches/soc-2010-jwilkins/source/blender/makesrna/intern/rna_object.c
    branches/soc-2010-jwilkins/source/blender/makesrna/intern/rna_space.c

Modified: branches/soc-2010-jwilkins/release/scripts/ui/space_view3d.py
===================================================================
--- branches/soc-2010-jwilkins/release/scripts/ui/space_view3d.py	2010-07-17 21:38:23 UTC (rev 30451)
+++ branches/soc-2010-jwilkins/release/scripts/ui/space_view3d.py	2010-07-17 23:17:42 UTC (rev 30452)
@@ -2047,7 +2047,19 @@
             row.enabled = region.lock_rotation and region.box_preview
             row.prop(region, "box_clip")
 
+class VIEW3D_PT_view3d_matcap(bpy.types.Panel):
+    bl_space_type = 'VIEW_3D'
+    bl_region_type = 'UI'
+    bl_label = "MatCap"
+    bl_default_closed = True
 
+    def poll(self, context):
+        return (context.space_data)
+
+    def draw(self, context):
+        #self.layout.column().template_ID_preview(context.space_data, "matcap_image", open="image.open", new="image.new", filter="is_matcap_image", rows=3, cols=3)
+        self.layout.column().template_ID_preview(context.space_data, "matcap_image", open="image.open", new="image.new", rows=3, cols=3)
+
 class VIEW3D_PT_view3d_meshdisplay(bpy.types.Panel):
     bl_space_type = 'VIEW_3D'
     bl_region_type = 'UI'
@@ -2357,6 +2369,7 @@
    # Panels
     VIEW3D_PT_view3d_properties,
     VIEW3D_PT_view3d_display,
+    VIEW3D_PT_view3d_matcap,
     VIEW3D_PT_view3d_name,
     VIEW3D_PT_view3d_meshdisplay,
     VIEW3D_PT_view3d_curvedisplay,

Modified: branches/soc-2010-jwilkins/source/blender/blenkernel/intern/material.c
===================================================================
--- branches/soc-2010-jwilkins/source/blender/blenkernel/intern/material.c	2010-07-17 21:38:23 UTC (rev 30451)
+++ branches/soc-2010-jwilkins/source/blender/blenkernel/intern/material.c	2010-07-17 23:17:42 UTC (rev 30452)
@@ -55,6 +55,7 @@
 #include "BKE_mesh.h"
 #include "BKE_node.h"
 #include "BKE_utildefines.h"
+#include "BKE_texture.h"
 
 #ifndef DISABLE_PYTHON
 #include "BPY_extern.h"
@@ -65,10 +66,25 @@
 /* used in UI and render */
 Material defmaterial;
 
+Material    matcap_ma;
+static MTex matcap_mtex;
+static Tex  matcap_tex;
+
 /* called on startup, creator.c */
 void init_def_material(void)
 {
 	init_material(&defmaterial);
+
+	default_tex(&matcap_tex);
+	matcap_tex.type = TEX_IMAGE;
+
+	default_mtex(&matcap_mtex);
+	matcap_mtex.texco = TEXCO_NORM;
+	matcap_mtex.tex = &matcap_tex;
+
+	init_material(&matcap_ma);
+	matcap_ma.mode |= MA_SHLESS;
+	matcap_ma.mtex[0] = &matcap_mtex;
 }
 
 /* not material itself */

Modified: branches/soc-2010-jwilkins/source/blender/blenloader/intern/readfile.c
===================================================================
--- branches/soc-2010-jwilkins/source/blender/blenloader/intern/readfile.c	2010-07-17 21:38:23 UTC (rev 30451)
+++ branches/soc-2010-jwilkins/source/blender/blenloader/intern/readfile.c	2010-07-17 23:17:42 UTC (rev 30452)
@@ -4589,6 +4589,8 @@
 						if(v3d->localvd) {
 							v3d->localvd->camera= newlibadr(fd, sc->id.lib, v3d->localvd->camera);
 						}
+
+						v3d->matcap_ima= newlibadr_us(fd, sc->id.lib, v3d->matcap_ima);
 					}
 					else if(sl->spacetype==SPACE_IPO) {
 						SpaceIpo *sipo= (SpaceIpo *)sl;
@@ -4817,7 +4819,8 @@
 
 					/* not very nice, but could help */
 					if((v3d->layact & v3d->lay)==0) v3d->layact= v3d->lay;
-					
+
+					v3d->matcap_ima = restore_pointer_by_name(newmain, (ID *)v3d->matcap_ima, 1);
 				}
 				else if(sl->spacetype==SPACE_IPO) {
 					SpaceIpo *sipo= (SpaceIpo *)sl;
@@ -5107,7 +5110,7 @@
 				v3d->localvd= newdataadr(fd, v3d->localvd);
 				v3d->afterdraw.first= v3d->afterdraw.last= NULL;
 				v3d->properties_storage= NULL;
-				
+
 				view3d_split_250(v3d, &sl->regionbase);
 			}
 			else if (sl->spacetype==SPACE_IPO) {

Modified: branches/soc-2010-jwilkins/source/blender/editors/space_view3d/drawmesh.c
===================================================================
--- branches/soc-2010-jwilkins/source/blender/editors/space_view3d/drawmesh.c	2010-07-17 21:38:23 UTC (rev 30451)
+++ branches/soc-2010-jwilkins/source/blender/editors/space_view3d/drawmesh.c	2010-07-17 23:17:42 UTC (rev 30452)
@@ -343,7 +343,7 @@
 	int istex, solidtex= 0;
 
 	// XXX scene->obedit warning
-	if(v3d->drawtype==OB_SOLID || ((ob->mode & OB_MODE_EDIT) && v3d->drawtype!=OB_TEXTURE)) {
+	if(v3d->drawtype==OB_SOLID || ((ob->mode & OB_MODE_EDIT) && !ELEM(v3d->drawtype, OB_TEXTURE, OB_MATCAP))) {
 		/* draw with default lights in solid draw mode and edit mode */
 		solidtex= 1;
 		Gtexdraw.islit= -1;
@@ -359,7 +359,7 @@
 	obcol[3]= CLAMPIS(ob->col[3]*255, 0, 255);
 	
 	glCullFace(GL_BACK); glEnable(GL_CULL_FACE);
-	if(solidtex || v3d->drawtype==OB_TEXTURE) istex= 1;
+	if(solidtex || ELEM(v3d->drawtype, OB_TEXTURE, OB_MATCAP)) istex= 1;
 	else istex= 0;
 
 	Gtexdraw.ob = ob;

Modified: branches/soc-2010-jwilkins/source/blender/editors/space_view3d/drawobject.c
===================================================================
--- branches/soc-2010-jwilkins/source/blender/editors/space_view3d/drawobject.c	2010-07-17 21:38:23 UTC (rev 30451)
+++ branches/soc-2010-jwilkins/source/blender/editors/space_view3d/drawobject.c	2010-07-17 23:17:42 UTC (rev 30452)
@@ -98,7 +98,7 @@
 
 /* this condition has been made more complex since editmode can draw textures */
 #define CHECK_OB_DRAWTEXTURE(vd, dt) \
-((vd->drawtype==OB_TEXTURE && dt>OB_SOLID) || \
+((ELEM(vd->drawtype, OB_TEXTURE, OB_MATCAP) && dt>OB_SOLID) || \
 	(vd->drawtype==OB_SOLID && vd->flag2 & V3D_SOLID_TEX))
 
 static void draw_bounding_volume(Scene *scene, Object *ob);
@@ -120,7 +120,7 @@
 		return 1;
 
 	/* if its drawing textures with zbuf sel, then dont draw dots */
-	if(dt==OB_TEXTURE && vd->drawtype==OB_TEXTURE)
+	if(dt==OB_TEXTURE && ELEM(vd->drawtype, OB_TEXTURE, OB_MATCAP))
 		return 0;
 
 	if(vd->drawtype>=OB_SOLID && vd->flag2 & V3D_SOLID_TEX)
@@ -209,7 +209,7 @@
 	if(ob==OBACT && (ob && ob->mode & OB_MODE_WEIGHT_PAINT))
 		return 0;
 	
-	return (scene->gm.matmode == GAME_MAT_GLSL) && (dt >= OB_SHADED);
+	return ((v3d->drawtype == OB_MATCAP) || (scene->gm.matmode == GAME_MAT_GLSL)) && (dt >= OB_SHADED);
 }
 
 static int check_material_alpha(Base *base, Mesh *me, int glsl)

Modified: branches/soc-2010-jwilkins/source/blender/editors/space_view3d/space_view3d.c
===================================================================
--- branches/soc-2010-jwilkins/source/blender/editors/space_view3d/space_view3d.c	2010-07-17 21:38:23 UTC (rev 30451)
+++ branches/soc-2010-jwilkins/source/blender/editors/space_view3d/space_view3d.c	2010-07-17 23:17:42 UTC (rev 30452)
@@ -44,6 +44,8 @@
 #include "BKE_screen.h"
 #include "BKE_utildefines.h"
 #include "BKE_image.h"
+#include "BKE_material.h"
+#include "BKE_texture.h"
 
 #include "ED_screen.h"
 #include "ED_object.h"
@@ -211,7 +213,7 @@
 	v3d->far= 500.0f;
 
 	v3d->twtype= V3D_MANIP_TRANSLATE;
-	
+
 	/* header */
 	ar= MEM_callocN(sizeof(ARegion), "header for view3d");
 	
@@ -270,6 +272,9 @@
 	}
 	BLI_freelistN(&vd->bgpicbase);
 
+	if (vd->matcap_ima)
+		vd->matcap_ima->id.us--;
+
 	if(vd->localvd) MEM_freeN(vd->localvd);
 	
 	if(vd->properties_storage) MEM_freeN(vd->properties_storage);
@@ -307,6 +312,11 @@
 		if(bgpic->ima)
 			bgpic->ima->id.us++;
 
+	v3dn->matcap_ima= v3do->matcap_ima;
+
+	if (v3dn->matcap_ima)
+		v3dn->matcap_ima->id.us++;
+
 	v3dn->properties_storage= NULL;
 	
 	return (SpaceLink *)v3dn;

Modified: branches/soc-2010-jwilkins/source/blender/editors/space_view3d/view3d_draw.c
===================================================================
--- branches/soc-2010-jwilkins/source/blender/editors/space_view3d/view3d_draw.c	2010-07-17 21:38:23 UTC (rev 30451)
+++ branches/soc-2010-jwilkins/source/blender/editors/space_view3d/view3d_draw.c	2010-07-17 23:17:42 UTC (rev 30452)
@@ -1886,7 +1886,7 @@
 				/* this includes normals for mesh_create_shadedColors */
 				mask |= CD_MASK_MTFACE | CD_MASK_MCOL | CD_MASK_NORMAL | CD_MASK_ORCO;
 			}
-			if((view->drawtype == OB_TEXTURE) || ((view->drawtype == OB_SOLID) && (view->flag2 & V3D_SOLID_TEX))) {
+			if(ELEM(view->drawtype, OB_TEXTURE, OB_MATCAP) || ((view->drawtype == OB_SOLID) && (view->flag2 & V3D_SOLID_TEX))) {
 				mask |= CD_MASK_MTFACE | CD_MASK_MCOL;
 
 				if(scene->gm.matmode == GAME_MAT_GLSL)

Modified: branches/soc-2010-jwilkins/source/blender/gpu/intern/gpu_codegen.c
===================================================================
--- branches/soc-2010-jwilkins/source/blender/gpu/intern/gpu_codegen.c	2010-07-17 21:38:23 UTC (rev 30451)
+++ branches/soc-2010-jwilkins/source/blender/gpu/intern/gpu_codegen.c	2010-07-17 23:17:42 UTC (rev 30452)
@@ -364,10 +364,14 @@
 void GPU_extensions_exit(void)
 {
 	extern Material defmaterial;    // render module abuse...
+	extern Material matcap_ma;
 
 	if(defmaterial.gpumaterial.first)
 		GPU_material_free(&defmaterial);
 
+	if(matcap_ma.gpumaterial.first)
+		GPU_material_free(&matcap_ma);
+
 	if(FUNCTION_HASH) {
 		BLI_ghash_free(FUNCTION_HASH, NULL, (GHashValFreeFP)MEM_freeN);
 		FUNCTION_HASH = NULL;

Modified: branches/soc-2010-jwilkins/source/blender/gpu/intern/gpu_draw.c
===================================================================
--- branches/soc-2010-jwilkins/source/blender/gpu/intern/gpu_draw.c	2010-07-17 21:38:23 UTC (rev 30451)
+++ branches/soc-2010-jwilkins/source/blender/gpu/intern/gpu_draw.c	2010-07-17 23:17:42 UTC (rev 30452)
@@ -912,6 +912,7 @@
 void GPU_begin_object_materials(View3D *v3d, RegionView3D *rv3d, Scene *scene, Object *ob, int glsl, int *do_alpha_pass)
 {
 	extern Material defmaterial; /* from material.c */
+	extern Material matcap_ma;
 	Material *ma;
 	GPUMaterial *gpumat;
 	GPUBlendMode blendmode;
@@ -946,79 +947,98 @@
 		GMS.blendmode= GMS.blendmode_fixed;
 	}
 
-	/* no materials assigned? */
-	if(ob->totcol==0) {
-		GMS.matbuf[0][0][0]= (defmaterial.ref+defmaterial.emit)*defmaterial.r;
-		GMS.matbuf[0][0][1]= (defmaterial.ref+defmaterial.emit)*defmaterial.g;
-		GMS.matbuf[0][0][2]= (defmaterial.ref+defmaterial.emit)*defmaterial.b;
-		GMS.matbuf[0][0][3]= 1.0;
+	if (v3d->drawtype!=OB_MATCAP) {
+		/* no materials assigned? */
+		if(ob->totcol==0) {
+			GMS.matbuf[0][0][0]= (defmaterial.ref+defmaterial.emit)*defmaterial.r;
+			GMS.matbuf[0][0][1]= (defmaterial.ref+defmaterial.emit)*defmaterial.g;
+			GMS.matbuf[0][0][2]= (defmaterial.ref+defmaterial.emit)*defmaterial.b;
+			GMS.matbuf[0][0][3]= 1.0;
 
-		GMS.matbuf[0][1][0]= defmaterial.spec*defmaterial.specr;
-		GMS.matbuf[0][1][1]= defmaterial.spec*defmaterial.specg;

@@ Diff output truncated at 10240 characters. @@




More information about the Bf-blender-cvs mailing list