[Bf-blender-cvs] SVN commit: /data/svn/bf-blender [26947] branches/soc-2008-mxcurioni/source /blender: Added support for transparent stroke colors (again).

Tamito Kajiyama rd6t-kjym at asahi-net.or.jp
Tue Feb 16 03:10:27 CET 2010


Revision: 26947
          http://projects.blender.org/plugins/scmsvn/viewcvs.php?view=rev&root=bf-blender&revision=26947
Author:   kjym3
Date:     2010-02-16 03:10:27 +0100 (Tue, 16 Feb 2010)

Log Message:
-----------
Added support for transparent stroke colors (again).

Transparent strokes are rendered by means of transparent vertex colors.
To make this possible, Blender's internal renderer has been slightly
extended to allow transparent vertex colors.  When Material::vcol_alpha
is non-zero, the renderer takes MCol::a into account.

Modified Paths:
--------------
    branches/soc-2008-mxcurioni/source/blender/blenkernel/intern/material.c
    branches/soc-2008-mxcurioni/source/blender/freestyle/intern/blender_interface/BlenderStrokeRenderer.cpp
    branches/soc-2008-mxcurioni/source/blender/freestyle/intern/blender_interface/BlenderStrokeRenderer.h
    branches/soc-2008-mxcurioni/source/blender/makesdna/DNA_material_types.h
    branches/soc-2008-mxcurioni/source/blender/render/intern/source/shadeinput.c
    branches/soc-2008-mxcurioni/source/blender/render/intern/source/shadeoutput.c

Modified: branches/soc-2008-mxcurioni/source/blender/blenkernel/intern/material.c
===================================================================
--- branches/soc-2008-mxcurioni/source/blender/blenkernel/intern/material.c	2010-02-16 01:42:34 UTC (rev 26946)
+++ branches/soc-2008-mxcurioni/source/blender/blenkernel/intern/material.c	2010-02-16 02:10:27 UTC (rev 26947)
@@ -144,6 +144,7 @@
 	ma->tx_limit= 0.0;
 	ma->tx_falloff= 1.0;
 	ma->shad_alpha= 1.0f;
+	ma->vcol_alpha= 0;
 	
 	ma->gloss_mir = ma->gloss_tra= 1.0;
 	ma->samp_gloss_mir = ma->samp_gloss_tra= 18;

Modified: branches/soc-2008-mxcurioni/source/blender/freestyle/intern/blender_interface/BlenderStrokeRenderer.cpp
===================================================================
--- branches/soc-2008-mxcurioni/source/blender/freestyle/intern/blender_interface/BlenderStrokeRenderer.cpp	2010-02-16 01:42:34 UTC (rev 26946)
+++ branches/soc-2008-mxcurioni/source/blender/freestyle/intern/blender_interface/BlenderStrokeRenderer.cpp	2010-02-16 02:10:27 UTC (rev 26947)
@@ -62,6 +62,14 @@
 	Camera* camera = (Camera *) object_camera->data;
 	camera->type = CAM_ORTHO;
 	camera->ortho_scale = max(width,height);
+    camera->clipsta = 0.1f;
+    camera->clipend = 100.0f;
+
+    _z_delta = 0.00001f;
+    _z = camera->clipsta + _z_delta;
+
+    // test
+    //_z = 999.90f; _z_delta = 0.01f;
 	
 	object_camera->loc[0] = 0.5 * width;
 	object_camera->loc[1] = 0.5 * height;
@@ -74,7 +82,9 @@
 	// Material
 	material = add_material("stroke_material");
 	material->mode |= MA_VERTEXCOLP;
+	material->mode |= MA_TRANSP;
 	material->mode |= MA_SHLESS;
+	material->vcol_alpha = 1;
 }
 
 BlenderStrokeRenderer::~BlenderStrokeRenderer(){
@@ -125,6 +135,15 @@
 	BLI_addhead(const_cast<ListBase *>(&objects), link);
 }
 
+float BlenderStrokeRenderer::get_stroke_vertex_z(void) const {
+    float z = _z;
+    BlenderStrokeRenderer *self = const_cast<BlenderStrokeRenderer *>(this);
+    if (!(_z < _z_delta * 100000.0f))
+        self->_z_delta *= 10.0f;
+    self->_z += _z_delta;
+    return -z;
+}
+
 void BlenderStrokeRenderer::RenderStrokeRep(StrokeRep *iStrokeRep) const{
   RenderStrokeRepBasic(iStrokeRep);
 }
@@ -252,13 +271,13 @@
 					// first vertex
 					vertices->co[0] = svRep[0]->point2d()[0];
 					vertices->co[1] = svRep[0]->point2d()[1];
-					vertices->co[2] = 0.0;
+					vertices->co[2] = get_stroke_vertex_z();
 					++vertices;
 					
 					// second vertex
 					vertices->co[0] = svRep[1]->point2d()[0];
 					vertices->co[1] = svRep[1]->point2d()[1];
-					vertices->co[2] = 0.0;
+					vertices->co[2] = get_stroke_vertex_z();
 					++vertices;
 				}
 				visible = true;
@@ -266,7 +285,7 @@
 				// vertex
 				vertices->co[0] = svRep[2]->point2d()[0];
 				vertices->co[1] = svRep[2]->point2d()[1];
-				vertices->co[2] = 0.0;
+				vertices->co[2] = get_stroke_vertex_z();
 				
 				// faces
 				faces->v1 = vertex_index - 2;
@@ -310,6 +329,11 @@
 }
 
 Render* BlenderStrokeRenderer::RenderScene( Render *re ) {
+    Camera *camera = (Camera *)freestyle_scene->camera->data;
+    if (camera->clipend < _z)
+        camera->clipend = _z + _z_delta * 100.0f;
+    //cout << "clipsta " << camera->clipsta << ", clipend " << camera->clipend << endl;
+
 	freestyle_scene->r.mode &= ~( R_EDGE_FRS | R_SHADOW | R_SSS | R_PANORAMA | R_ENVMAP | R_MBLUR );
 	freestyle_scene->r.scemode &= ~( R_SINGLE_LAYER );
 	freestyle_scene->r.planes = R_PLANES32;

Modified: branches/soc-2008-mxcurioni/source/blender/freestyle/intern/blender_interface/BlenderStrokeRenderer.h
===================================================================
--- branches/soc-2008-mxcurioni/source/blender/freestyle/intern/blender_interface/BlenderStrokeRenderer.h	2010-02-16 01:42:34 UTC (rev 26946)
+++ branches/soc-2008-mxcurioni/source/blender/freestyle/intern/blender_interface/BlenderStrokeRenderer.h	2010-02-16 02:10:27 UTC (rev 26947)
@@ -37,8 +37,11 @@
 	Scene* freestyle_scene;
 	Material* material;
 	ListBase objects;
+	float _z, _z_delta;
 
 	void store_object(Object *ob) const;
+
+	float get_stroke_vertex_z(void) const;
 };
 
 #endif // BLENDERSTROKERENDERER_H

Modified: branches/soc-2008-mxcurioni/source/blender/makesdna/DNA_material_types.h
===================================================================
--- branches/soc-2008-mxcurioni/source/blender/makesdna/DNA_material_types.h	2010-02-16 01:42:34 UTC (rev 26946)
+++ branches/soc-2008-mxcurioni/source/blender/makesdna/DNA_material_types.h	2010-02-16 02:10:27 UTC (rev 26947)
@@ -158,7 +158,7 @@
 	short sss_flag, sss_preset;
 
 	int mapto_textured;	/* render-time cache to optimise texture lookups */
-	int pad4;
+	short vcol_alpha, pad4;
 
 	ListBase gpumaterial;		/* runtime */
 } Material;

Modified: branches/soc-2008-mxcurioni/source/blender/render/intern/source/shadeinput.c
===================================================================
--- branches/soc-2008-mxcurioni/source/blender/render/intern/source/shadeinput.c	2010-02-16 01:42:34 UTC (rev 26946)
+++ branches/soc-2008-mxcurioni/source/blender/render/intern/source/shadeinput.c	2010-02-16 02:10:27 UTC (rev 26947)
@@ -1049,6 +1049,7 @@
 			shi->actcol= obr->actmcol;
 
 			if(mode & (MA_VERTEXCOL|MA_VERTEXCOLP)) {
+				float alpha[8];
 				for (i=0; (mcol=RE_vlakren_get_mcol(obr, vlr, i, &name, 0)); i++) {
 					ShadeInputCol *scol= &shi->col[i];
 					char *cp1, *cp2, *cp3;
@@ -1063,13 +1064,15 @@
 					scol->col[0]= (l*((float)cp3[3]) - u*((float)cp1[3]) - v*((float)cp2[3]))/255.0f;
 					scol->col[1]= (l*((float)cp3[2]) - u*((float)cp1[2]) - v*((float)cp2[2]))/255.0f;
 					scol->col[2]= (l*((float)cp3[1]) - u*((float)cp1[1]) - v*((float)cp2[1]))/255.0f;
+
+					alpha[i]= (l*((float)cp3[0]) - u*((float)cp1[0]) - v*((float)cp2[0]))/255.0f;
 				}
 
 				if(shi->totcol) {
 					shi->vcol[0]= shi->col[shi->actcol].col[0];
 					shi->vcol[1]= shi->col[shi->actcol].col[1];
 					shi->vcol[2]= shi->col[shi->actcol].col[2];
-					shi->vcol[3]= 1.0f;
+					shi->vcol[3]= shi->mat->vcol_alpha ? alpha[shi->actcol] : 1.0f;
 				}
 				else {
 					shi->vcol[0]= 0.0f;

Modified: branches/soc-2008-mxcurioni/source/blender/render/intern/source/shadeoutput.c
===================================================================
--- branches/soc-2008-mxcurioni/source/blender/render/intern/source/shadeoutput.c	2010-02-16 01:42:34 UTC (rev 26946)
+++ branches/soc-2008-mxcurioni/source/blender/render/intern/source/shadeoutput.c	2010-02-16 02:10:27 UTC (rev 26947)
@@ -1588,7 +1588,7 @@
 			shi->r= shi->vcol[0];
 			shi->g= shi->vcol[1];
 			shi->b= shi->vcol[2];
-			if(ma->mode & (MA_FACETEXTURE_ALPHA))
+			if((ma->mode & (MA_FACETEXTURE_ALPHA)) || ma->vcol_alpha)
 				shi->alpha= shi->vcol[3];
 		}
 		if(ma->texco)





More information about the Bf-blender-cvs mailing list