[Bf-blender-cvs] [1a33fb9] gooseberry: Support dupli transparency pass.
Antony Riakiotakis
noreply at git.blender.org
Tue Feb 10 10:58:00 CET 2015
Commit: 1a33fb983bd4ac1db1b5a74d6a00eb80db3d91cb
Author: Antony Riakiotakis
Date: Tue Feb 10 10:55:26 2015 +0100
Branches: gooseberry
https://developer.blender.org/rB1a33fb983bd4ac1db1b5a74d6a00eb80db3d91cb
Support dupli transparency pass.
Only for gooseberry for now, since it's slightly hacky and adds extra
cost to duplis.
===================================================================
M source/blender/editors/space_view3d/drawobject.c
M source/blender/editors/space_view3d/view3d_draw.c
===================================================================
diff --git a/source/blender/editors/space_view3d/drawobject.c b/source/blender/editors/space_view3d/drawobject.c
index eae24b3a..b4ea727 100644
--- a/source/blender/editors/space_view3d/drawobject.c
+++ b/source/blender/editors/space_view3d/drawobject.c
@@ -310,9 +310,6 @@ bool draw_glsl_material(Scene *scene, Object *ob, View3D *v3d, const char dt)
static bool check_alpha_pass(Base *base)
{
- if (base->flag & OB_FROMDUPLI)
- return false;
-
if (G.f & G_PICKSEL)
return false;
@@ -4024,14 +4021,22 @@ static bool draw_mesh_object(Scene *scene, ARegion *ar, View3D *v3d, RegionView3
}
}
- if ((dflag & DRAW_PICKING) == 0 && (base->flag & OB_FROMDUPLI) == 0 && (v3d->flag2 & V3D_RENDER_SHADOW) == 0) {
+ if ((dflag & DRAW_PICKING) == 0 && ((base->flag & OB_FROMDUPLI) == 0 || (ob->dtx & OB_DRAWTRANSP)) && (v3d->flag2 & V3D_RENDER_SHADOW) == 0) {
/* GPU_begin_object_materials checked if this is needed */
if (do_alpha_after) {
- if (ob->dtx & OB_DRAWXRAY) {
+ /* duplis only for transparency */
+ if ((ob->dtx & OB_DRAWXRAY) && !(base->flag & OB_FROMDUPLI)) {
ED_view3d_after_add(&v3d->afterdraw_xraytransp, base, dflag);
}
else {
- ED_view3d_after_add(&v3d->afterdraw_transp, base, dflag);
+ if (base->flag & OB_FROMDUPLI) {
+ Base *nbase = MEM_mallocN(sizeof(Base), "dupli_trans");
+ *nbase = *base;
+ ED_view3d_after_add(&v3d->afterdraw_transp, nbase, dflag);
+ }
+ else {
+ ED_view3d_after_add(&v3d->afterdraw_transp, base, dflag);
+ }
}
}
else if (ob->dtx & OB_DRAWXRAY && ob->dtx & OB_DRAWTRANSP) {
diff --git a/source/blender/editors/space_view3d/view3d_draw.c b/source/blender/editors/space_view3d/view3d_draw.c
index c9be94e..553ba56 100644
--- a/source/blender/editors/space_view3d/view3d_draw.c
+++ b/source/blender/editors/space_view3d/view3d_draw.c
@@ -1904,16 +1904,19 @@ typedef struct View3DAfter {
struct View3DAfter *next, *prev;
struct Base *base;
short dflag;
+ float obmat[4][4];
} View3DAfter;
/* temp storage of Objects that need to be drawn as last */
void ED_view3d_after_add(ListBase *lb, Base *base, const short dflag)
{
View3DAfter *v3da = MEM_callocN(sizeof(View3DAfter), "View 3d after");
- BLI_assert((base->flag & OB_FROMDUPLI) == 0);
BLI_addtail(lb, v3da);
v3da->base = base;
v3da->dflag = dflag;
+ if (base->flag & OB_FROMDUPLI) {
+ copy_m4_m4(v3da->obmat, base->object->obmat);
+ }
}
/* disables write in zbuffer and draws it over */
@@ -1925,8 +1928,17 @@ static void view3d_draw_transp(Scene *scene, ARegion *ar, View3D *v3d)
v3d->transp = true;
for (v3da = v3d->afterdraw_transp.first; v3da; v3da = next) {
+ float obmat[4][4];
next = v3da->next;
+ if (v3da->base->flag & OB_FROMDUPLI) {
+ copy_m4_m4(obmat, v3da->base->object->obmat);
+ copy_m4_m4(v3da->base->object->obmat, v3da->obmat);
+ }
draw_object(scene, ar, v3d, v3da->base, v3da->dflag);
+ if (v3da->base->flag & OB_FROMDUPLI) {
+ copy_m4_m4(v3da->base->object->obmat, obmat);
+ MEM_freeN(v3da->base);
+ }
BLI_remlink(&v3d->afterdraw_transp, v3da);
MEM_freeN(v3da);
}
@@ -1959,6 +1971,7 @@ static void view3d_draw_xray(Scene *scene, ARegion *ar, View3D *v3d, const bool
static void view3d_draw_xraytransp(Scene *scene, ARegion *ar, View3D *v3d, const bool clear)
{
View3DAfter *v3da, *next;
+ float obmat[4][4];
if (clear && v3d->zbuf)
glClear(GL_DEPTH_BUFFER_BIT);
@@ -1968,7 +1981,15 @@ static void view3d_draw_xraytransp(Scene *scene, ARegion *ar, View3D *v3d, const
for (v3da = v3d->afterdraw_xraytransp.first; v3da; v3da = next) {
next = v3da->next;
+ if (v3da->base->flag & OB_FROMDUPLI) {
+ copy_m4_m4(obmat, v3da->base->object->obmat);
+ copy_m4_m4(v3da->base->object->obmat, v3da->obmat);
+ }
draw_object(scene, ar, v3d, v3da->base, v3da->dflag);
+ if (v3da->base->flag & OB_FROMDUPLI) {
+ copy_m4_m4(v3da->base->object->obmat, obmat);
+ MEM_freeN(v3da->base);
+ }
BLI_remlink(&v3d->afterdraw_xraytransp, v3da);
MEM_freeN(v3da);
}
@@ -2068,7 +2089,7 @@ static void draw_dupli_objects_color(
* slow it down too much */
dtx = tbase.object->dtx;
if (tbase.object->dt != OB_BOUNDBOX)
- tbase.object->dtx = base->object->dtx;
+ tbase.object->dtx = base->object->dtx | (dtx & OB_DRAWTRANSP);
/* negative scale flag has to propagate */
transflag = tbase.object->transflag;
@@ -2113,7 +2134,8 @@ static void draw_dupli_objects_color(
!bb_tmp ||
draw_glsl_material(scene, dob->ob, v3d, dt) ||
check_object_draw_texture(scene, v3d, dt) ||
- (v3d->flag2 & V3D_SOLID_MATCAP) != 0)
+ (v3d->flag2 & V3D_SOLID_MATCAP) != 0 ||
+ ((dtx & OB_DRAWTRANSP) != 0))
{
// printf("draw_dupli_objects_color: skipping displist for %s\n", dob->ob->id.name + 2);
use_displist = false;
More information about the Bf-blender-cvs
mailing list