[Bf-committers] Edge Drawing with derived mesh (all edges currently drawn twice)

Campbell Barton cbarton at metavr.com
Tue Oct 3 08:36:49 CEST 2006


Maybe this is the solution for double edge drawing

draw_em_fancy's  1871 draws the cage if (cageDM!=finalDM) {

The problem is  DerivedMesh.c's editmesh_calc_modifiers that is called 
before draw_em_fancy.

static void editmesh_calc_modifiers(DerivedMesh **cage_r, DerivedMesh 
**final_r)

At the moment this will never make cage_r == final_r

This looks like it may be a 1 liner though.

at DerivedMesh.c:3114

the line
    *final_r = getEditMeshDerivedMesh(em, ob, deformedVerts);
can be replaced by
    *final_r = *cage_r;

I assume this saves memory as well as CPU time making a new derived 
mesh, which would be nice since this is done as verts are dragging.

it may be possible cage_r is not set, though in my tests it didnt 
happen, so that could be checked fro also.

_________________  DerivedMesh.c:3114
    if(dm && deformedVerts) {
        *final_r = CDDM_copy(dm);

        if(!(cage_r && dm == *cage_r)) dm->release(dm);

        CDDM_apply_vert_coords(*final_r, deformedVerts);
        CDDM_calc_normals(*final_r);

        MEM_freeN(deformedVerts);
    } else if (dm) {
        *final_r = dm;
    } else {
        *final_r = getEditMeshDerivedMesh(em, ob, deformedVerts);
    }

















Campbell Barton wrote:
> Hey,
> Im posting because this isnt an area Im familier with..
> just looking at a way to stop hidden faces being drawn in editmode and 
> discovered that with a normal mesh (no modifiers)
> all edges are being drawn twice.
>
> Once  drawobject.c:1819 - Draws light wire edges, weather there hidden 
> or not, but only in wire display mode.
>  finalDM->drawEdges(finalDM, 1);
>
> and the normal edge draw
>  drawobject.c:1864
> draw_em_fancy_edges(cageDM);
>
>
> From 2104 - Read down to the last line,  if cageDM != finalDM then a 
> second wire mesh is drawn. (line 1819)
> I assume cageDM != finalDM means that the modifier has made the 2 
> derived meshes different then draw the wire cage,
> But you can see that  cageDM will never == finalDM, for the editmode 
> object, I dried commenting drawobject.c:1819  and it worked fine.
> __________________________________________
> static int draw_mesh_object(Base *base, int dt)
> {
>    Object *ob= base->object;
>    Mesh *me= ob->data;
>    int has_alpha= 0, drawlinked= 0, retval= 0;
>      if(G.obedit && ob!=G.obedit && ob->data==G.obedit->data) {
>        if(ob_get_key(ob));
>        else drawlinked= 1;
>    }
>      if(ob==G.obedit || drawlinked) {
>        int cageNeedsFree, finalNeedsFree;
>        DerivedMesh *finalDM, *cageDM;
>              if (G.obedit!=ob) {
>            finalDM = cageDM = editmesh_get_derived_base();
>            cageNeedsFree = 0;
>            finalNeedsFree = 1;
>        } else {
>            cageDM = editmesh_get_derived_cage_and_final(&finalDM, 
> &cageNeedsFree, &finalNeedsFree);
>        }
>
>        if(dt>OB_WIRE) init_gl_materials(ob, 0);    // no transp in 
> editmode, the fancy draw over goes bad then
>        draw_em_fancy(ob, G.editMesh, cageDM, finalDM, dt);
>
>
> _______________________________________________
> Bf-committers mailing list
> Bf-committers at projects.blender.org
> http://projects.blender.org/mailman/listinfo/bf-committers
>


-- 
Campbell J Barton

133 Hope Street
Geelong West, Victoria 3218 Australia

URL:    http://www.metavr.com
e-mail: cbarton at metavr.com
phone: AU (03) 5229 0241


More information about the Bf-committers mailing list