[Bf-blender-cvs] SVN commit: /data/svn/bf-blender [40961] branches/cycles: Cycles: don' t use glsl in textured draw mode, to keep things simpler and faster

Brecht Van Lommel brechtvanlommel at pandora.be
Wed Oct 12 17:48:26 CEST 2011


Revision: 40961
          http://projects.blender.org/scm/viewvc.php?view=rev&root=bf-blender&revision=40961
Author:   blendix
Date:     2011-10-12 15:48:26 +0000 (Wed, 12 Oct 2011)
Log Message:
-----------
Cycles: don't use glsl in textured draw mode, to keep things simpler and faster
there for now. Also add viewport color setting for materials for solid draw mode.

Modified Paths:
--------------
    branches/cycles/intern/cycles/blender/addon/ui.py
    branches/cycles/source/blender/editors/space_view3d/view3d_draw.c
    branches/cycles/source/blender/gpu/GPU_material.h
    branches/cycles/source/blender/gpu/intern/gpu_draw.c
    branches/cycles/source/blender/gpu/intern/gpu_material.c
    branches/cycles/source/blender/nodes/shader/node_shader_tree.c
    branches/cycles/source/blender/nodes/shader/node_shader_util.c
    branches/cycles/source/blender/nodes/shader/node_shader_util.h
    branches/cycles/source/gameengine/Ketsji/BL_BlenderShader.cpp
    branches/cycles/source/gameengine/Rasterizer/RAS_OpenGLRasterizer/RAS_OpenGLRasterizer.cpp

Modified: branches/cycles/intern/cycles/blender/addon/ui.py
===================================================================
--- branches/cycles/intern/cycles/blender/addon/ui.py	2011-10-12 15:45:52 UTC (rev 40960)
+++ branches/cycles/intern/cycles/blender/addon/ui.py	2011-10-12 15:48:26 UTC (rev 40961)
@@ -463,8 +463,7 @@
 
     @classmethod
     def poll(cls, context):
-        return False
-        #return context.material and CyclesButtonsPanel.poll(context)
+        return context.material and CyclesButtonsPanel.poll(context)
 
     def draw(self, context):
         layout = self.layout
@@ -472,6 +471,9 @@
         mat = context.material
         cmat = mat.cycles
 
+        layout.prop(mat, "diffuse_color", text="Viewport Color")
+
+        """
         split = layout.split()
     
         col = split.column()
@@ -479,6 +481,7 @@
 
         col = split.column()
         col.prop(cmat, "homogeneous_volume")
+        """
 
 class CyclesTexture_PT_context(CyclesButtonsPanel, Panel):
     bl_label = ""

Modified: branches/cycles/source/blender/editors/space_view3d/view3d_draw.c
===================================================================
--- branches/cycles/source/blender/editors/space_view3d/view3d_draw.c	2011-10-12 15:45:52 UTC (rev 40960)
+++ branches/cycles/source/blender/editors/space_view3d/view3d_draw.c	2011-10-12 15:48:26 UTC (rev 40961)
@@ -2156,8 +2156,15 @@
 	if(ELEM(v3d->drawtype, OB_TEXTURE, OB_MATERIAL) || ((v3d->drawtype == OB_SOLID) && (v3d->flag2 & V3D_SOLID_TEX))) {
 		mask |= CD_MASK_MTFACE | CD_MASK_MCOL;
 
-		if(v3d->drawtype == OB_MATERIAL || scene->gm.matmode == GAME_MAT_GLSL)
-			mask |= CD_MASK_ORCO;
+		if(scene_use_new_shading_nodes(scene)) {
+			/* todo: use orco in textured draw mode */
+			if(v3d->drawtype == OB_MATERIAL)
+				mask |= CD_MASK_ORCO;
+		}
+		else {
+			if(scene->gm.matmode == GAME_MAT_GLSL)
+				mask |= CD_MASK_ORCO;
+		}
 	}
 
 	return mask;

Modified: branches/cycles/source/blender/gpu/GPU_material.h
===================================================================
--- branches/cycles/source/blender/gpu/GPU_material.h	2011-10-12 15:45:52 UTC (rev 40960)
+++ branches/cycles/source/blender/gpu/GPU_material.h	2011-10-12 15:48:26 UTC (rev 40961)
@@ -121,13 +121,12 @@
 int GPU_stack_link(GPUMaterial *mat, const char *name, GPUNodeStack *in, GPUNodeStack *out, ...);
 
 void GPU_material_output_link(GPUMaterial *material, GPUNodeLink *link);
-int GPU_material_drawtype(GPUMaterial *material);
 void GPU_material_enable_alpha(GPUMaterial *material);
 GPUBlendMode GPU_material_alpha_blend(GPUMaterial *material, float obcol[4]);
 
 /* High level functions to create and use GPU materials */
 
-GPUMaterial *GPU_material_from_blender(struct Scene *scene, struct Material *ma, int drawtype);
+GPUMaterial *GPU_material_from_blender(struct Scene *scene, struct Material *ma);
 void GPU_material_free(struct Material *ma);
 
 void GPU_materials_free(void);

Modified: branches/cycles/source/blender/gpu/intern/gpu_draw.c
===================================================================
--- branches/cycles/source/blender/gpu/intern/gpu_draw.c	2011-10-12 15:45:52 UTC (rev 40960)
+++ branches/cycles/source/blender/gpu/intern/gpu_draw.c	2011-10-12 15:48:26 UTC (rev 40961)
@@ -64,8 +64,8 @@
 #include "BKE_material.h"
 #include "BKE_node.h"
 #include "BKE_object.h"
+#include "BKE_scene.h"
 
-
 #include "BLI_threads.h"
 #include "BLI_blenlib.h"
 
@@ -941,7 +941,6 @@
 	Material *gboundmat;
 	Object *gob;
 	Scene *gscene;
-	int gdrawtype;
 	int glay;
 	float (*gviewmat)[4];
 	float (*gviewinv)[4];
@@ -955,15 +954,17 @@
 } GMS = {NULL};
 
 /* fixed function material, alpha handed by caller */
-static void gpu_material_to_fixed(GPUMaterialFixed *smat, const Material *bmat, const int gamma, const Object *ob)
+static void gpu_material_to_fixed(GPUMaterialFixed *smat, const Material *bmat, const int gamma, const Object *ob, const int new_shading_nodes)
 {
-	if (bmat->mode & MA_SHLESS) {
+	if(new_shading_nodes || bmat->mode & MA_SHLESS) {
 		copy_v3_v3(smat->diff, &bmat->r);
 		smat->diff[3]= 1.0;
 
-		if(gamma) {
+		if(gamma)
 			linearrgb_to_srgb_v3_v3(smat->diff, smat->diff);
-		}	
+
+		zero_v4(smat->spec);
+		smat->hard= 0;
 	}
 	else {
 		mul_v3_v3fl(smat->diff, &bmat->r, bmat->ref + bmat->emit);
@@ -1004,6 +1005,7 @@
 	GPUBlendMode alphablend;
 	int a;
 	int gamma = scene->r.color_mgt_flag & R_COLOR_MANAGEMENT;
+	int new_shading_nodes = scene_use_new_shading_nodes(scene);
 	
 	/* initialize state */
 	memset(&GMS, 0, sizeof(GMS));
@@ -1013,7 +1015,6 @@
 
 	GMS.gob = ob;
 	GMS.gscene = scene;
-	GMS.gdrawtype = v3d->drawtype;
 	GMS.totmat= ob->totcol+1; /* materials start from 1, default material is 0 */
 	GMS.glay= v3d->lay;
 	GMS.gviewmat= rv3d->viewmat;
@@ -1036,14 +1037,14 @@
 
 	/* no materials assigned? */
 	if(ob->totcol==0) {
-		gpu_material_to_fixed(&GMS.matbuf[0], &defmaterial, 0, ob);
+		gpu_material_to_fixed(&GMS.matbuf[0], &defmaterial, 0, ob, new_shading_nodes);
 
 		/* do material 1 too, for displists! */
 		memcpy(&GMS.matbuf[1], &GMS.matbuf[0], sizeof(GPUMaterialFixed));
 
 		if(glsl) {
 			GMS.gmatbuf[0]= &defmaterial;
-			GPU_material_from_blender(GMS.gscene, &defmaterial, GMS.gdrawtype);
+			GPU_material_from_blender(GMS.gscene, &defmaterial);
 		}
 
 		GMS.alphablend[0]= GPU_BLEND_SOLID;
@@ -1053,11 +1054,11 @@
 	for(a=1; a<=ob->totcol; a++) {
 		/* find a suitable material */
 		ma= give_current_material(ob, a);
-		if(!glsl) ma= gpu_active_node_material(ma);
+		if(!glsl && !new_shading_nodes) ma= gpu_active_node_material(ma);
 		if(ma==NULL) ma= &defmaterial;
 
 		/* create glsl material if requested */
-		gpumat = (glsl)? GPU_material_from_blender(GMS.gscene, ma, GMS.gdrawtype): NULL;
+		gpumat = (glsl)? GPU_material_from_blender(GMS.gscene, ma): NULL;
 
 		if(gpumat) {
 			/* do glsl only if creating it succeed, else fallback */
@@ -1066,7 +1067,7 @@
 		}
 		else {
 			/* fixed function opengl materials */
-			gpu_material_to_fixed(&GMS.matbuf[a], ma, gamma, ob);
+			gpu_material_to_fixed(&GMS.matbuf[a], ma, gamma, ob, new_shading_nodes);
 
 			alphablend = (ma->alpha == 1.0f)? GPU_BLEND_SOLID: GPU_BLEND_ALPHA;
 			if(do_alpha_pass && GMS.alphapass)
@@ -1127,7 +1128,7 @@
 	/* unbind glsl material */
 	if(GMS.gboundmat) {
 		if(GMS.alphapass) glDepthMask(0);
-		GPU_material_unbind(GPU_material_from_blender(GMS.gscene, GMS.gboundmat, GMS.gdrawtype));
+		GPU_material_unbind(GPU_material_from_blender(GMS.gscene, GMS.gboundmat));
 		GMS.gboundmat= NULL;
 	}
 
@@ -1145,7 +1146,7 @@
 			/* bind glsl material and get attributes */
 			Material *mat = GMS.gmatbuf[nr];
 
-			gpumat = GPU_material_from_blender(GMS.gscene, mat, GMS.gdrawtype);
+			gpumat = GPU_material_from_blender(GMS.gscene, mat);
 			GPU_material_vertex_attributes(gpumat, gattribs);
 			GPU_material_bind(gpumat, GMS.gob->lay, GMS.glay, 1.0, !(GMS.gob->mode & OB_MODE_TEXTURE_PAINT));
 			GPU_material_bind_uniforms(gpumat, GMS.gob->obmat, GMS.gviewmat, GMS.gviewinv, GMS.gob->col);
@@ -1193,7 +1194,7 @@
 
 	if(GMS.gboundmat) {
 		if(GMS.alphapass) glDepthMask(0);
-		GPU_material_unbind(GPU_material_from_blender(GMS.gscene, GMS.gboundmat, GMS.gdrawtype));
+		GPU_material_unbind(GPU_material_from_blender(GMS.gscene, GMS.gboundmat));
 		GMS.gboundmat= NULL;
 	}
 

Modified: branches/cycles/source/blender/gpu/intern/gpu_material.c
===================================================================
--- branches/cycles/source/blender/gpu/intern/gpu_material.c	2011-10-12 15:45:52 UTC (rev 40960)
+++ branches/cycles/source/blender/gpu/intern/gpu_material.c	2011-10-12 15:48:26 UTC (rev 40961)
@@ -80,7 +80,6 @@
 struct GPUMaterial {
 	Scene *scene;
 	Material *ma;
-	int drawtype;
 
 	/* for creating the material */
 	ListBase nodes;
@@ -354,11 +353,6 @@
 		material->outlink= link;
 }
 
-int GPU_material_drawtype(GPUMaterial *material)
-{
-	return material->drawtype;
-}
-
 void GPU_material_enable_alpha(GPUMaterial *material)
 {
 	material->alpha= 1;
@@ -1413,27 +1407,19 @@
 	return shr.combined;
 }
 
-GPUMaterial *GPU_material_from_blender(Scene *scene, Material *ma, int drawtype)
+GPUMaterial *GPU_material_from_blender(Scene *scene, Material *ma)
 {
 	GPUMaterial *mat;
 	GPUNodeLink *outlink;
 	LinkData *link;
 
-	/* find an existing glsl shader that is already compiled */
-	for(link=ma->gpumaterial.first; link; link=link->next) {
-		mat= (GPUMaterial*)link->data;
-		if(mat->scene == scene && mat->drawtype == drawtype)
+	for(link=ma->gpumaterial.first; link; link=link->next)
+		if(((GPUMaterial*)link->data)->scene == scene)
 			return link->data;
-	}
 
-	/* in texture draw mode, we need an active texture node */
-	if(drawtype == OB_TEXTURE && (!ma->use_nodes || !nodeGetActiveTexture(ma->nodetree)))
-		return NULL;
-
 	/* allocate material */
 	mat = GPU_material_construct_begin(ma);
 	mat->scene = scene;
-	mat->drawtype = drawtype;
 
 	if(!(scene->gm.flag & GAME_GLSL_NO_NODES) && ma->nodetree && ma->use_nodes) {
 		/* create nodes */
@@ -1443,12 +1429,15 @@
 		/* create material */
 		outlink = GPU_blender_material(mat, ma);
 		GPU_material_output_link(mat, outlink);
+	}
 
+	if(!scene_use_new_shading_nodes(scene)) {
 		if(gpu_do_color_management(mat))
 			if(mat->outlink)
 				GPU_link(mat, "linearrgb_to_srgb", mat->outlink, &mat->outlink);
 	}
 
+
 	GPU_material_construct_end(mat);
 
 	/* note that even if building the shader fails in some way, we still keep
@@ -1730,7 +1719,7 @@
 	if(!GPU_glsl_support())
 		return NULL;
 
-	mat = GPU_material_from_blender(scene, ma, OB_TEXTURE);
+	mat = GPU_material_from_blender(scene, ma);
 	pass = (mat)? mat->pass: NULL;
 
 	if(pass && pass->fragmentcode && pass->vertexcode) {

Modified: branches/cycles/source/blender/nodes/shader/node_shader_tree.c
===================================================================
--- branches/cycles/source/blender/nodes/shader/node_shader_tree.c	2011-10-12 15:45:52 UTC (rev 40960)
+++ branches/cycles/source/blender/nodes/shader/node_shader_tree.c	2011-10-12 15:48:26 UTC (rev 40961)
@@ -123,14 +123,10 @@
 void ntreeGPUMaterialNodes(bNodeTree *ntree, GPUMaterial *mat)
 {
 	bNodeTreeExec *exec;
-	bNode *tex_node = NULL;
 
-	if(GPU_material_drawtype(mat) == OB_TEXTURE)
-		tex_node= nodeGetActiveTexture(ntree);
-
 	exec = ntreeShaderBeginExecTree(ntree, 1);
 
-	ntreeExecGPUNodes(exec, tex_node, mat, 1);
+	ntreeExecGPUNodes(exec, mat, 1);
 
 	ntreeShaderEndExecTree(exec, 1);
 }

Modified: branches/cycles/source/blender/nodes/shader/node_shader_util.c

@@ Diff output truncated at 10240 characters. @@



More information about the Bf-blender-cvs mailing list