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:
@@ -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;
|
||||
|
||||
@@ -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;
|
||||
|
||||
@@ -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
|
||||
|
||||
@@ -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;
|
||||
|
||||
@@ -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;
|
||||
|
||||
@@ -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)
|
||||
|
||||
Reference in New Issue
Block a user