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.
This commit is contained in:
Tamito Kajiyama
2010-02-16 02:10:27 +00:00
parent 12506ed6a1
commit ca908e21e2
6 changed files with 37 additions and 6 deletions

View File

@@ -144,6 +144,7 @@ void init_material(Material *ma)
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;

View File

@@ -62,6 +62,14 @@ BlenderStrokeRenderer::BlenderStrokeRenderer(Render* re)
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 @@ BlenderStrokeRenderer::BlenderStrokeRenderer(Render* re)
// 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 @@ void BlenderStrokeRenderer::store_object(Object *ob) const {
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 @@ void BlenderStrokeRenderer::RenderStrokeRepBasic(StrokeRep *iStrokeRep) const{
// 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 @@ void BlenderStrokeRenderer::RenderStrokeRepBasic(StrokeRep *iStrokeRep) const{
// 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 @@ void BlenderStrokeRenderer::RenderStrokeRepBasic(StrokeRep *iStrokeRep) const{
}
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;

View File

@@ -37,8 +37,11 @@ protected:
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

View File

@@ -158,7 +158,7 @@ typedef struct Material {
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;

View File

@@ -1049,6 +1049,7 @@ void shade_input_set_shade_texco(ShadeInput *shi)
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 @@ void shade_input_set_shade_texco(ShadeInput *shi)
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;

View File

@@ -1588,7 +1588,7 @@ void shade_lamp_loop(ShadeInput *shi, ShadeResult *shr)
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)