* BM_Collapse_Vert_Faces
* BM_Collapse_Vert_Edges
since these are both quite different operations and callers where checking for one case or another anyway.
support for dissolving boundry & loose edges, previously this would only join adjacent faces,
now it collapses edge vertices when the edge has no face users.
Multires interpolation. It's quite usable yet; I wanted to avoid
subsurfing the multires data and ray tracing original/new
topology. The result is kindof like trunk's interpolation.
I'll see how much better I can get it. I might have to go with
the full-on ray tracing solution. Right now, it's not very good.
Also made it so trunk files with multires open correctly.
Phase 1 of restructuring done. There are now two
distinct subclass systems within the bmesh API;
one is compile-time, and forms the backend of what will
eventually be a "lite" bmesh API for modifiers (the
ones that use bmesh are simply too slow right now).
The other is dynamic, and will be used to implement
multires reprojection.
The idea was to solve as many serious problems with
memory, speed, etc, at once as possible and set up others
to be solved more easily later.
I've also added holes into the data structure, but not
the api; I don't plan to finish implementing that until
after bmesh gets into trunk. I simply wanted to lessen
how much code I'll have to rewrite, since I was doing a
fairly major restructuring anyway.
In addition, I've added iteration support to mempool, to
avoid having to store linked list pointers (though this
has caveats).
Next step: merge in trunk changes. . .oh, what fun :P
as does only edges and individual faces extrude (individual vert
extrude already did).
Note that I need to port this, after we all figure out how to handle
operators with variable transform follow-ons.
I also implemented the merge->collapse function, which is currently
accessable under ctrl->v, Bmesh Test Operator. I still need to
implement the other merge modes, and properly hook everything into
the merge menu tool, which I plan on doing soon (tomorrow hopefully).
The cool thing about the collapse tool, is not only does it handle (all)
UV layers, it handles vcols as well. To do this, I had to add a few math
functions to the customdata API, which seem to be working well.
(though it's not completely feature-complete yet).
I ported over the remove doubles code from the
old bmesh branch for this, and split it into two
bmops, "Weld Verts" and "Remove Doubles".
Weld verts welds specific verts together, while remove
doubles finds doubles and welds them.
I also reverted the hotkey change I made earlier.
and made it sensitive to the selection mode. Also
coded dissolve edges, since that was missing.
Removed the old "Delete Edge Loop", since dissolve
edges pretty much replaces that :)
that handles some non-manifold situations better without failing.
Also made edge subdivide use a more specializzed internal version
of BM_Connect_Verts, that should hopefully always split the correct face.
Dissolve verts also now has checks to not accidentally dissolve
unselected vertices. It's not kindof a hybrid tool, using dissolve
faces where it can to dissolve verts for robustness, and using
BM_Dissolve_Verts where it cannot.
And removed some cruft from a few API functions.
Used it to implement the dissolve faces operation (previous
incarnation was just a debugging hack). The code works by
creating one giant new face per region of faces.
The dissolve verts (xkey->collapse, heh need to rename it)
operator now invokes dissolve faces on the faces around verts.
This is less error-prone then a pure topological/euler based
solution.
as it can.
Some design notes:
* BM_Dissolve_Disk is now more like a
BM_Dissolve_Vert function (e.g. there's logic
to remove verts if there's not surrounding faces).
I kindof like this idea better (if we decide to
go this way we should call it BM_Dissolve_Vert)
but will have to discuss it further with Briggs.
It seems more intuitive to have a "destroy this
vert" function then a "just destroy it in this
specific situation" function.
* Joining two two-edged faces does not work, so
dissolve vert cannot clean all of them up. Until
this is fixed, I've added checks in the conversion
code so at least things don't crash.