From 19dd66cf3b0108c0a74d7626b31c1b8cb9dd57fe Mon Sep 17 00:00:00 2001 From: Brecht Van Lommel Date: Fri, 25 May 2012 09:26:47 +0000 Subject: 3D View: add Backface Culling option, to hide faces when seen from the back side, found in the Display panel. Patch by Simon Kirk and Irie Shinsuke, refactored to also work for non-mesh objects and avoid globals. --- source/blender/gpu/intern/gpu_draw.c | 14 ++++++++++++++ 1 file changed, 14 insertions(+) (limited to 'source/blender/gpu') diff --git a/source/blender/gpu/intern/gpu_draw.c b/source/blender/gpu/intern/gpu_draw.c index 604e8f8d50e..fb277815878 100644 --- a/source/blender/gpu/intern/gpu_draw.c +++ b/source/blender/gpu/intern/gpu_draw.c @@ -1017,6 +1017,8 @@ static struct GPUMaterialState { float (*gviewmat)[4]; float (*gviewinv)[4]; + int backface_culling; + GPUBlendMode *alphablend; GPUBlendMode alphablend_fixed[FIXEDMAT]; int use_alpha_pass, is_alpha_pass; @@ -1085,6 +1087,8 @@ void GPU_begin_object_materials(View3D *v3d, RegionView3D *rv3d, Scene *scene, O GMS.lastretval = -1; GMS.lastalphablend = GPU_BLEND_SOLID; + GMS.backface_culling = (v3d->flag2 & V3D_BACKFACE_CULLING); + GMS.gob = ob; GMS.gscene = scene; GMS.totmat= ob->totcol+1; /* materials start from 1, default material is 0 */ @@ -1248,6 +1252,13 @@ int GPU_enable_material(int nr, void *attribs) alphablend= mat->game.alpha_blend; if (GMS.is_alpha_pass) glDepthMask(1); + + if (GMS.backface_culling) { + if(mat->game.flag) + glEnable(GL_CULL_FACE); + else + glDisable(GL_CULL_FACE); + } } else { /* or do fixed function opengl material */ @@ -1283,6 +1294,9 @@ void GPU_disable_material(void) GMS.lastretval= 1; if (GMS.gboundmat) { + if (GMS.backface_culling) + glDisable(GL_CULL_FACE); + if (GMS.is_alpha_pass) glDepthMask(0); GPU_material_unbind(GPU_material_from_blender(GMS.gscene, GMS.gboundmat)); GMS.gboundmat= NULL; -- cgit v1.2.3