Welcome to mirror list, hosted at ThFree Co, Russian Federation.

git.blender.org/blender.git - Unnamed repository; edit this file 'description' to name the repository.
summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
-rw-r--r--source/blender/blenkernel/BKE_DerivedMesh.h39
-rw-r--r--source/blender/blenkernel/intern/DerivedMesh.c222
-rw-r--r--source/blender/blenkernel/intern/subsurf_ccg.c129
-rw-r--r--source/blender/blenlib/BLI_editVert.h1
-rw-r--r--source/blender/include/BDR_drawobject.h15
-rw-r--r--source/blender/include/BDR_editcurve.h4
-rw-r--r--source/blender/include/BIF_editmesh.h4
-rw-r--r--source/blender/python/api2_2x/BezTriple.c10
-rw-r--r--source/blender/python/api2_2x/CurNurb.c3
-rw-r--r--source/blender/src/buttons_editing.c1
-rw-r--r--source/blender/src/drawobject.c340
-rw-r--r--source/blender/src/editcurve.c182
-rw-r--r--source/blender/src/editlattice.c47
-rw-r--r--source/blender/src/editmesh_add.c2
-rw-r--r--source/blender/src/editmesh_loop.c2
-rw-r--r--source/blender/src/editmesh_mods.c458
-rw-r--r--source/blender/src/editmesh_tools.c64
-rw-r--r--source/blender/src/editview.c835
-rw-r--r--source/blender/src/transform_manipulator.c9
19 files changed, 1031 insertions, 1336 deletions
diff --git a/source/blender/blenkernel/BKE_DerivedMesh.h b/source/blender/blenkernel/BKE_DerivedMesh.h
index 1158f89dde0..f4302d12bf6 100644
--- a/source/blender/blenkernel/BKE_DerivedMesh.h
+++ b/source/blender/blenkernel/BKE_DerivedMesh.h
@@ -63,7 +63,24 @@ struct DerivedMesh {
/* Also called in Editmode */
int (*getNumFaces)(DerivedMesh *dm);
- void (*getMappedVertCoEM)(DerivedMesh *dm, void *vert, float co_r[3]);
+ /* Iterate over each mapped vertex in the derived mesh, calling the
+ * given function with the original vert and the mapped vert's new
+ * coordinate and normal. For historical reasons the normal can be
+ * passed as a float or short array, only one should be non-NULL.
+ */
+ void (*foreachMappedVertEM)(DerivedMesh *dm, void (*func)(void *userData, struct EditVert *vert, float *co, float *no_f, short *no_s), void *userData);
+
+ /* Iterate over each mapped vertex in the derived mesh, calling the
+ * given function with the original vert and the mapped edge's new
+ * coordinates.
+ */
+ void (*foreachMappedEdgeEM)(DerivedMesh *dm, void (*func)(void *userData, struct EditEdge *edge, float *v0co, float *v1co), void *userData);
+
+ /* Iterate over each mapped face in the derived mesh, calling the
+ * given function with the original face and the mapped face's (or
+ * faces') center and normal.
+ */
+ void (*foreachMappedFaceCenterEM)(DerivedMesh *dm, void (*func)(void *userData, struct EditFace *face, float *cent, float *no), void *userData);
/* Convert to new DispListMesh, should be free'd by caller.
*
@@ -144,11 +161,6 @@ struct DerivedMesh {
*/
void (*drawFacesTex)(DerivedMesh *dm, int (*setDrawParams)(TFace *tf, int matnr));
- /* Draw mapped vertices as bgl points
- * o Only if !setDrawOptions or setDrawOptions(userData, mapped-vert) returns true
- */
- void (*drawMappedVertsEM)(DerivedMesh *dm, int (*setDrawOptions)(void *userData, struct EditVert *eve), void *userData);
-
/* Draw mapped edges as lines
* o Only if !setDrawOptions or setDrawOptions(userData, mapped-edge) returns true
*/
@@ -169,21 +181,6 @@ struct DerivedMesh {
*/
void (*drawMappedFacesEM)(DerivedMesh *dm, int (*setDrawOptions)(void *userData, struct EditFace *efa), void *userData);
- /* Draw vert normals
- * o Only if !setDrawOptions or setDrawOptions(userData, mapped-vert) returns true
- */
- void (*drawMappedVertNormalsEM)(DerivedMesh *dm, float length, int (*setDrawOptions)(void *userData, struct EditVert *eve), void *userData);
-
- /* Draw face normals
- * o Only if !setDrawOptions or setDrawOptions(userData, mapped-face) returns true
- */
- void (*drawMappedFaceNormalsEM)(DerivedMesh *dm, float length, int (*setDrawOptions)(void *userData, struct EditFace *efa), void *userData);
-
- /* Draw face centers as bgl points
- * o Only if !setDrawOptions or setDrawOptions(userData, mapped-face) returns true
- */
- void (*drawMappedFaceCentersEM)(DerivedMesh *dm, int (*setDrawOptions)(void *userData, struct EditFace *efa), void *userData);
-
void (*release)(DerivedMesh *dm);
};
diff --git a/source/blender/blenkernel/intern/DerivedMesh.c b/source/blender/blenkernel/intern/DerivedMesh.c
index 25ec8d6e3a4..45d5669ebba 100644
--- a/source/blender/blenkernel/intern/DerivedMesh.c
+++ b/source/blender/blenkernel/intern/DerivedMesh.c
@@ -504,47 +504,41 @@ typedef struct {
float (*faceNos)[3];
} EditMeshDerivedMesh;
-static void emDM_getMappedVertCoEM(DerivedMesh *dm, void *vert, float co_r[3])
+static void emDM_foreachMappedVertEM(DerivedMesh *dm, void (*func)(void *userData, EditVert *vert, float *co, float *no_f, short *no_s), void *userData)
{
EditMeshDerivedMesh *emdm= (EditMeshDerivedMesh*) dm;
+ EditVert *eve;
if (emdm->vertexCos) {
- EditVert *eve;
int i;
for (i=0,eve= emdm->em->verts.first; eve; i++,eve=eve->next) {
- if (eve==vert) {
- VECCOPY(co_r, emdm->vertexCos[i]);
- break;
- }
+ func(userData, eve, emdm->vertexCos[i], emdm->vertexNos[i], NULL);
}
} else {
- EditVert *eve = vert;
-
- VECCOPY(co_r, eve->co);
+ for (eve= emdm->em->verts.first; eve; eve=eve->next) {
+ func(userData, eve, eve->co, eve->no, NULL);
+ }
}
}
-static void emDM_drawMappedVertsEM(DerivedMesh *dm, int (*setDrawOptions)(void *userData, EditVert *vert), void *userData)
+static void emDM_foreachMappedEdgeEM(DerivedMesh *dm, void (*func)(void *userData, EditEdge *eed, float *v0co, float *v1co), void *userData)
{
EditMeshDerivedMesh *emdm= (EditMeshDerivedMesh*) dm;
- EditVert *eve;
+ EditEdge *eed;
if (emdm->vertexCos) {
+ EditVert *eve, *preveve;
int i;
- bglBegin(GL_POINTS);
- for(i=0,eve= emdm->em->verts.first; eve; i++,eve= eve->next) {
- if(!setDrawOptions || setDrawOptions(userData, eve))
- bglVertex3fv(emdm->vertexCos[i]);
- }
- bglEnd();
+ for (i=0,eve=emdm->em->verts.first; eve; eve= eve->next)
+ eve->prev = (EditVert*) i++;
+ for(eed= emdm->em->edges.first; eed; eed= eed->next)
+ func(userData, eed, emdm->vertexCos[(int) eed->v1->prev], emdm->vertexCos[(int) eed->v2->prev]);
+ for (preveve=NULL, eve=emdm->em->verts.first; eve; preveve=eve, eve= eve->next)
+ eve->prev = preveve;
} else {
- bglBegin(GL_POINTS);
- for(eve= emdm->em->verts.first; eve; eve= eve->next) {
- if(!setDrawOptions || setDrawOptions(userData, eve))
- bglVertex3fv(eve->co);
- }
- bglEnd();
+ for(eed= emdm->em->edges.first; eed; eed= eed->next)
+ func(userData, eed, eed->v1->co, eed->v2->co);
}
}
static void emDM_drawMappedEdgesEM(DerivedMesh *dm, int (*setDrawOptions)(void *userData, EditEdge *edge), void *userData)
@@ -643,7 +637,7 @@ static void emDM__calcFaceCent(EditFace *efa, float cent[3], float (*vertexCos)[
VecMulf(cent, 0.33333333333f);
}
}
-static void emDM_drawMappedFaceCentersEM(DerivedMesh *dm, int (*setDrawOptions)(void *userData, struct EditFace *efa), void *userData)
+static void emDM_foreachMappedFaceCenterEM(DerivedMesh *dm, void (*func)(void *userData, EditFace *efa, float *co, float *no), void *userData)
{
EditMeshDerivedMesh *emdm= (EditMeshDerivedMesh*) dm;
EditVert *eve, *preveve;
@@ -656,78 +650,16 @@ static void emDM_drawMappedFaceCentersEM(DerivedMesh *dm, int (*setDrawOptions)(
eve->prev = (EditVert*) i++;
}
- bglBegin(GL_POINTS);
for(efa= emdm->em->faces.first; efa; efa= efa->next) {
- if(!setDrawOptions || setDrawOptions(userData, efa)) {
- emDM__calcFaceCent(efa, cent, emdm->vertexCos);
- bglVertex3fv(cent);
- }
- }
- bglEnd();
-
- if (emdm->vertexCos) {
- for (preveve=NULL, eve=emdm->em->verts.first; eve; preveve=eve, eve= eve->next)
- eve->prev = preveve;
- }
-}
-static void emDM_drawMappedFaceNormalsEM(DerivedMesh *dm, float length, int (*setDrawOptions)(void *userData, struct EditFace *efa), void *userData)
-{
- EditMeshDerivedMesh *emdm= (EditMeshDerivedMesh*) dm;
- EditVert *eve, *preveve;
- EditFace *efa;
- float cent[3];
- int i;
-
- glBegin(GL_LINES);
- if (emdm->vertexCos) {
- for (i=0,eve=emdm->em->verts.first; eve; eve= eve->next)
- eve->prev = (EditVert*) i++;
- }
-
-
- for (i=0,efa= emdm->em->faces.first; efa; i++,efa= efa->next) {
- if(!setDrawOptions || setDrawOptions(userData, efa)) {
- float *no = emdm->vertexCos?emdm->faceNos[i]:efa->n;
-
- emDM__calcFaceCent(efa, cent, emdm->vertexCos);
-
- glVertex3fv(cent);
- glVertex3f( cent[0] + length*no[0],
- cent[1] + length*no[1],
- cent[2] + length*no[2]);
- }
+ emDM__calcFaceCent(efa, cent, emdm->vertexCos);
+ func(userData, efa, cent, emdm->vertexCos?emdm->faceNos[i]:efa->n);
+ bglVertex3fv(cent);
}
if (emdm->vertexCos) {
for (preveve=NULL, eve=emdm->em->verts.first; eve; preveve=eve, eve= eve->next)
eve->prev = preveve;
}
-
- glEnd();
-}
-static void emDM_drawMappedVertNormalsEM(DerivedMesh *dm, float length, int (*setDrawOptions)(void *userData, struct EditVert *eve), void *userData)
-{
- EditMeshDerivedMesh *emdm= (EditMeshDerivedMesh*) dm;
- EditVert *eve;
- int i;
-
- glBegin(GL_LINES);
- for (i=0,eve= emdm->em->verts.first; eve; i++,eve= eve->next) {
- if(!setDrawOptions || setDrawOptions(userData, eve)) {
- if (emdm->vertexCos) {
- glVertex3fv(emdm->vertexCos[i]);
- glVertex3f( emdm->vertexCos[i][0] + length*emdm->vertexNos[i][0],
- emdm->vertexCos[i][1] + length*emdm->vertexNos[i][1],
- emdm->vertexCos[i][2] + length*emdm->vertexNos[i][2]);
- } else {
- glVertex3fv(eve->co);
- glVertex3f( eve->co[0] + length*eve->no[0],
- eve->co[1] + length*eve->no[1],
- eve->co[2] + length*eve->no[2]);
- }
- }
- }
- glEnd();
}
static void emDM_drawMappedFacesEM(DerivedMesh *dm, int (*setDrawOptions)(void *userData, EditFace *face), void *userData)
{
@@ -865,17 +797,13 @@ static DerivedMesh *getEditMeshDerivedMesh(EditMesh *em, float (*vertexCos)[3])
emdm->dm.getNumVerts = emDM_getNumVerts;
emdm->dm.getNumFaces = emDM_getNumFaces;
- emdm->dm.getMappedVertCoEM = emDM_getMappedVertCoEM;
-
- emdm->dm.drawMappedVertsEM = emDM_drawMappedVertsEM;
+ emdm->dm.foreachMappedVertEM = emDM_foreachMappedVertEM;
+ emdm->dm.foreachMappedEdgeEM = emDM_foreachMappedEdgeEM;
+ emdm->dm.foreachMappedFaceCenterEM = emDM_foreachMappedFaceCenterEM;
emdm->dm.drawEdges = emDM_drawEdges;
emdm->dm.drawMappedEdgesEM = emDM_drawMappedEdgesEM;
emdm->dm.drawMappedEdgesInterpEM = emDM_drawMappedEdgesInterpEM;
-
- emdm->dm.drawMappedVertNormalsEM = emDM_drawMappedVertNormalsEM;
- emdm->dm.drawMappedFaceNormalsEM = emDM_drawMappedFaceNormalsEM;
- emdm->dm.drawMappedFaceCentersEM = emDM_drawMappedFaceCentersEM;
emdm->dm.drawFacesSolid = emDM_drawFacesSolid;
emdm->dm.drawMappedFacesEM = emDM_drawMappedFacesEM;
@@ -946,37 +874,34 @@ typedef struct {
EditFace **faceMap;
} SSDerivedMesh;
-static void ssDM_getMappedVertCoEM(DerivedMesh *dm, void *vert, float co_r[3])
+static void ssDM_foreachMappedVertEM(DerivedMesh *dm, void (*func)(void *userData, EditVert *vert, float *co, float *no_f, short *no_s), void *userData)
{
SSDerivedMesh *ssdm = (SSDerivedMesh*) dm;
DispListMesh *dlm = ssdm->dlm;
+ int i;
if (ssdm->vertMap) {
- int i;
-
for (i=0; i<dlm->totvert; i++) {
- if (ssdm->vertMap[i]==vert) {
- VECCOPY(co_r, dlm->mvert[i].co);
- break;
+ if (ssdm->vertMap[i]) {
+ func(userData, ssdm->vertMap[i], dlm->mvert[i].co, NULL, dlm->mvert[i].no);
}
}
}
}
-static void ssDM_drawMappedVertsEM(DerivedMesh *dm, int (*setDrawOptions)(void *userData, EditVert *vert), void *userData)
+static void ssDM_foreachMappedEdgeEM(DerivedMesh *dm, void (*func)(void *userData, EditEdge *eed, float *v0co, float *v1co), void *userData)
{
SSDerivedMesh *ssdm = (SSDerivedMesh*) dm;
DispListMesh *dlm = ssdm->dlm;
+ int i;
- if (ssdm->vertMap) {
- int i;
+ if (ssdm->edgeMap) {
+ for (i=0; i<dlm->totedge; i++) {
+ if (ssdm->edgeMap[i]) {
+ MEdge *med = &dlm->medge[i];
- bglBegin(GL_POINTS);
- for (i=0; i<dlm->totvert; i++) {
- if(ssdm->vertMap[i] && (!setDrawOptions || setDrawOptions(userData, ssdm->vertMap[i]))) {
- bglVertex3fv(dlm->mvert[i].co);
+ func(userData, ssdm->edgeMap[i], dlm->mvert[med->v1].co, dlm->mvert[med->v2].co);
}
}
- bglEnd();
}
}
static void ssDM_drawMappedEdgesEM(DerivedMesh *dm, int (*setDrawOptions)(void *userData, EditEdge *edge), void *userData)
@@ -999,49 +924,15 @@ static void ssDM_drawMappedEdgesEM(DerivedMesh *dm, int (*setDrawOptions)(void *
}
}
-static void ssDM_drawMappedFaceCentersEM(DerivedMesh *dm, int (*setDrawOptions)(void *userData, struct EditFace *efa), void *userData)
-{
- SSDerivedMesh *ssdm = (SSDerivedMesh*) dm;
- DispListMesh *dlm = ssdm->dlm;
- int i;
-
- if (ssdm->faceMap) {
- bglBegin(GL_POINTS);
- for (i=0; i<dlm->totface; i++) {
- if(ssdm->faceMap[i] && (!setDrawOptions || setDrawOptions(userData, ssdm->faceMap[i]))) {
- MFace *mf = &dlm->mface[i];
-
- if (mf->v3) {
- float cent[3];
-
- VECCOPY(cent, dlm->mvert[mf->v1].co);
- VecAddf(cent, cent, dlm->mvert[mf->v2].co);
- VecAddf(cent, cent, dlm->mvert[mf->v3].co);
-
- if (mf->v4) {
- VecAddf(cent, cent, dlm->mvert[mf->v4].co);
- VecMulf(cent, 0.25f);
- } else {
- VecMulf(cent, 0.33333333333f);
- }
-
- bglVertex3fv(cent);
- }
- }
- }
- bglEnd();
- }
-}
-static void ssDM_drawMappedFaceNormalsEM(DerivedMesh *dm, float length, int (*setDrawOptions)(void *userData, struct EditFace *efa), void *userData)
+static void ssDM_foreachMappedFaceCenterEM(DerivedMesh *dm, void (*func)(void *userData, EditFace *efa, float *co, float *no), void *userData)
{
SSDerivedMesh *ssdm = (SSDerivedMesh*) dm;
DispListMesh *dlm = ssdm->dlm;
int i;
if (ssdm->faceMap) {
- glBegin(GL_LINES);
for (i=0; i<dlm->totface; i++) {
- if(ssdm->faceMap[i] && (!setDrawOptions || setDrawOptions(userData, ssdm->faceMap[i]))) {
+ if(ssdm->faceMap[i]) {
MFace *mf = &dlm->mface[i];
if (mf->v3) {
@@ -1061,36 +952,10 @@ static void ssDM_drawMappedFaceNormalsEM(DerivedMesh *dm, float length, int (*se
VecMulf(cent, 0.33333333333f);
}
- glVertex3fv(cent);
- glVertex3f( cent[0] + length*no[0],
- cent[1] + length*no[1],
- cent[2] + length*no[2]);
+ func(userData, ssdm->faceMap[i], cent, no);
}
}
}
- glEnd();
- }
-}
-static void ssDM_drawMappedVertNormalsEM(DerivedMesh *dm, float length, int (*setDrawOptions)(void *userData, struct EditVert *eve), void *userData)
-{
- SSDerivedMesh *ssdm = (SSDerivedMesh*) dm;
- DispListMesh *dlm = ssdm->dlm;
- int i;
-
- if (ssdm->vertMap) {
- glBegin(GL_LINES);
- for (i=0; i<dlm->totvert; i++) {
- if(ssdm->vertMap[i] && (!setDrawOptions || setDrawOptions(userData, ssdm->vertMap[i]))) {
- float *co = dlm->mvert[i].co;
- short *no = dlm->mvert[i].no;
-
- glVertex3fv(co);
- glVertex3f( co[0] + length*no[0]/32767.0,
- co[1] + length*no[1]/32767.0,
- co[2] + length*no[2]/32767.0);
- }
- }
- glEnd();
}
}
static void ssDM_drawMappedFacesEM(DerivedMesh *dm, int (*setDrawOptions)(void *userData, EditFace *face), void *userData)
@@ -1459,16 +1324,13 @@ DerivedMesh *derivedmesh_from_displistmesh(DispListMesh *dlm, float (*vertexCos)
/* EM functions */
- ssdm->dm.getMappedVertCoEM = ssDM_getMappedVertCoEM;
- ssdm->dm.drawMappedVertsEM = ssDM_drawMappedVertsEM;
-
+ ssdm->dm.foreachMappedVertEM = ssDM_foreachMappedVertEM;
+ ssdm->dm.foreachMappedEdgeEM = ssDM_foreachMappedEdgeEM;
+ ssdm->dm.foreachMappedFaceCenterEM = ssDM_foreachMappedFaceCenterEM;
+
ssdm->dm.drawMappedEdgesEM = ssDM_drawMappedEdgesEM;
ssdm->dm.drawMappedEdgesInterpEM = NULL; // no way to implement this one
- ssdm->dm.drawMappedVertNormalsEM = ssDM_drawMappedVertNormalsEM;
- ssdm->dm.drawMappedFaceNormalsEM = ssDM_drawMappedFaceNormalsEM;
- ssdm->dm.drawMappedFaceCentersEM = ssDM_drawMappedFaceCentersEM;
-
ssdm->dm.drawMappedFacesEM = ssDM_drawMappedFacesEM;
ssdm->dm.release = ssDM_release;
diff --git a/source/blender/blenkernel/intern/subsurf_ccg.c b/source/blender/blenkernel/intern/subsurf_ccg.c
index d75b6c31d91..8feeb649854 100644
--- a/source/blender/blenkernel/intern/subsurf_ccg.c
+++ b/source/blender/blenkernel/intern/subsurf_ccg.c
@@ -751,39 +751,35 @@ static void ccgdm_getVertCos(DerivedMesh *dm, float (*cos)[3]) {
}
ccgFaceIterator_free(fi);
}
-static void ccgDM_getMappedVertCoEM(DerivedMesh *dm, void *vert, float co_r[3]) {
+static void ccgDM_foreachMappedVertEM(DerivedMesh *dm, void (*func)(void *userData, EditVert *vert, float *co, float *no_f, short *no_s), void *userData) {
CCGDerivedMesh *ccgdm = (CCGDerivedMesh*) dm;
+ CCGVertIterator *vi = ccgSubSurf_getVertIterator(ccgdm->ss);
- /* The vert handle is an index into the vmap in this case, have
- * to search for it.
- */
- if (ccgdm->vertMap) {
- CCGVertIterator *vi = ccgSubSurf_getVertIterator(ccgdm->ss);
-
- for (; !ccgVertIterator_isStopped(vi); ccgVertIterator_next(vi)) {
- CCGVert *v = ccgVertIterator_getCurrent(vi);
- int index = (int) ccgSubSurf_getVertVertHandle(ccgdm->ss, v);
-
- if (ccgdm->vertMap[index]==vert) {
- float *co = ccgSubSurf_getVertData(ccgdm->ss, v);
+ for (; !ccgVertIterator_isStopped(vi); ccgVertIterator_next(vi)) {
+ CCGVert *v = ccgVertIterator_getCurrent(vi);
+ VertData *vd = ccgSubSurf_getVertData(ccgdm->ss, v);
- co_r[0] = co[0];
- co_r[1] = co[1];
- co_r[2] = co[2];
+ func(userData, ccgDM_getVertHandle(ccgdm, v), vd->co, vd->no, NULL);
+ }
- break;
- }
- }
+ ccgVertIterator_free(vi);
+}
+static void ccgDM_foreachMappedEdgeEM(DerivedMesh *dm, void (*func)(void *userData, EditEdge *eed, float *v0co, float *v1co), void *userData) {
+ CCGDerivedMesh *ccgdm = (CCGDerivedMesh*) dm;
+ CCGSubSurf *ss = ccgdm->ss;
+ CCGEdgeIterator *ei = ccgSubSurf_getEdgeIterator(ss);
+ int i, edgeSize = ccgSubSurf_getEdgeSize(ss);
- ccgVertIterator_free(vi);
- } else {
- CCGVert *v = ccgSubSurf_getVert(ccgdm->ss, vert);
- float *co = ccgSubSurf_getVertData(ccgdm->ss, v);
+ for (; !ccgEdgeIterator_isStopped(ei); ccgEdgeIterator_next(ei)) {
+ CCGEdge *e = ccgEdgeIterator_getCurrent(ei);
+ EditEdge *edge = ccgDM_getEdgeHandle(ccgdm, e);
+ VertData *edgeData = ccgSubSurf_getEdgeDataArray(ss, e);
- co_r[0] = co[0];
- co_r[1] = co[1];
- co_r[2] = co[2];
+ for (i=0; i<edgeSize-1; i++)
+ func(userData, edge, edgeData[i].co, edgeData[i+1].co);
}
+
+ ccgEdgeIterator_free(ei);
}
static DispListMesh *ccgDM_convertToDispListMesh(DerivedMesh *dm, int allowShared) {
CCGDerivedMesh *ccgdm = (CCGDerivedMesh*) dm;
@@ -1216,47 +1212,6 @@ static void ccgDM_drawFacesTex(DerivedMesh *dm, int (*setDrawParams)(TFace *tf,
*/
}
-static void ccgDM_drawMappedVertsEM(DerivedMesh *dm, int (*setDrawOptions)(void *userData, EditVert *vert), void *userData) {
- CCGDerivedMesh *ccgdm = (CCGDerivedMesh*) dm;
- CCGSubSurf *ss = ccgdm->ss;
- CCGVertIterator *vi = ccgSubSurf_getVertIterator(ss);
-
- bglBegin(GL_POINTS);
- for (; !ccgVertIterator_isStopped(vi); ccgVertIterator_next(vi)) {
- CCGVert *v = ccgVertIterator_getCurrent(vi);
- EditVert *vert = ccgDM_getVertHandle(ccgdm, v);
-
- if (vert && (!setDrawOptions || setDrawOptions(userData, vert))) {
- bglVertex3fv(ccgSubSurf_getVertData(ss, v));
- }
- }
- bglEnd();
-
- ccgVertIterator_free(vi);
-}
-static void ccgDM_drawMappedVertNormalsEM(DerivedMesh *dm, float length, int (*setDrawOptions)(void *userData, struct EditVert *eve), void *userData) {
- CCGDerivedMesh *ccgdm = (CCGDerivedMesh*) dm;
- CCGSubSurf *ss = ccgdm->ss;
- CCGVertIterator *vi = ccgSubSurf_getVertIterator(ss);
-
- glBegin(GL_LINES);
- for (; !ccgVertIterator_isStopped(vi); ccgVertIterator_next(vi)) {
- CCGVert *v = ccgVertIterator_getCurrent(vi);
- EditVert *vert = ccgDM_getVertHandle(ccgdm, v);
-
- if (vert && (!setDrawOptions || setDrawOptions(userData, vert))) {
- VertData *vd = ccgSubSurf_getVertData(ss, v);
-
- glVertex3fv(vd->co);
- glVertex3f( vd->co[0] + length*vd->no[0],
- vd->co[1] + length*vd->no[1],
- vd->co[2] + length*vd->no[2]);
- }
- }
- glEnd();
-
- ccgVertIterator_free(vi);
-}
static void ccgDM_drawMappedEdgesEM(DerivedMesh *dm, int (*setDrawOptions)(void *userData, EditEdge *edge), void *userData) {
CCGDerivedMesh *ccgdm = (CCGDerivedMesh*) dm;
CCGSubSurf *ss = ccgdm->ss;
@@ -1345,47 +1300,23 @@ static void ccgDM_drawMappedFacesEM(DerivedMesh *dm, int (*setDrawOptions)(void
ccgFaceIterator_free(fi);
}
-static void ccgDM_drawMappedFaceNormalsEM(DerivedMesh *dm, float length, int (*setDrawOptions)(void *userData, struct EditFace *efa), void *userData) {
+static void ccgDM_foreachMappedFaceCenterEM(DerivedMesh *dm, void (*func)(void *userData, EditFace *efa, float *co, float *no), void *userData) {
CCGDerivedMesh *ccgdm = (CCGDerivedMesh*) dm;
CCGSubSurf *ss = ccgdm->ss;
CCGFaceIterator *fi = ccgSubSurf_getFaceIterator(ss);
int gridSize = ccgSubSurf_getGridSize(ss);
- glBegin(GL_LINES);
for (; !ccgFaceIterator_isStopped(fi); ccgFaceIterator_next(fi)) {
CCGFace *f = ccgFaceIterator_getCurrent(fi);
EditFace *efa = ccgDM_getFaceHandle(ccgdm, f);
- if (efa && (!setDrawOptions || setDrawOptions(userData, efa))) {
+
+ if (efa) {
/* Face center data normal isn't updated atm. */
VertData *vd = ccgSubSurf_getFaceGridData(ss, f, 0, 0, 0);
- glVertex3fv(vd->co);
- glVertex3f( vd->co[0] + length*vd->no[0],
- vd->co[1] + length*vd->no[1],
- vd->co[2] + length*vd->no[2]);
- }
- }
- glEnd();
-
- ccgFaceIterator_free(fi);
-}
-static void ccgDM_drawMappedFaceCentersEM(DerivedMesh *dm, int (*setDrawOptions)(void *userData, struct EditFace *efa), void *userData) {
- CCGDerivedMesh *ccgdm = (CCGDerivedMesh*) dm;
- CCGSubSurf *ss = ccgdm->ss;
- CCGFaceIterator *fi = ccgSubSurf_getFaceIterator(ss);
- int gridSize = ccgSubSurf_getGridSize(ss);
-
- bglBegin(GL_POINTS);
- for (; !ccgFaceIterator_isStopped(fi); ccgFaceIterator_next(fi)) {
- CCGFace *f = ccgFaceIterator_getCurrent(fi);
- EditFace *efa = ccgDM_getFaceHandle(ccgdm, f);
- if (efa && (!setDrawOptions || setDrawOptions(userData, efa))) {
- VertData *vd = ccgSubSurf_getFaceCenterData(ss, f);
-
- bglVertex3fv(vd->co);
+ func(userData, efa, vd->co, vd->no);
}
}
- bglEnd();
ccgFaceIterator_free(fi);
}
@@ -1410,7 +1341,9 @@ static CCGDerivedMesh *getCCGDerivedMesh(CCGSubSurf *ss, int fromEditmesh, Mesh
ccgdm->dm.getNumVerts = ccgDM_getNumVerts;
ccgdm->dm.getNumFaces = ccgDM_getNumFaces;
ccgdm->dm.getVertCos = ccgdm_getVertCos;
- ccgdm->dm.getMappedVertCoEM = ccgDM_getMappedVertCoEM;
+ ccgdm->dm.foreachMappedVertEM = ccgDM_foreachMappedVertEM;
+ ccgdm->dm.foreachMappedEdgeEM = ccgDM_foreachMappedEdgeEM;
+ ccgdm->dm.foreachMappedFaceCenterEM = ccgDM_foreachMappedFaceCenterEM;
ccgdm->dm.convertToDispListMesh = ccgDM_convertToDispListMesh;
ccgdm->dm.convertToDispListMeshMapped = ccgDM_convertToDispListMeshMapped;
@@ -1422,13 +1355,9 @@ static CCGDerivedMesh *getCCGDerivedMesh(CCGSubSurf *ss, int fromEditmesh, Mesh
ccgdm->dm.drawFacesColored = ccgDM_drawFacesColored;
ccgdm->dm.drawFacesTex = ccgDM_drawFacesTex;
- ccgdm->dm.drawMappedVertsEM = ccgDM_drawMappedVertsEM;
- ccgdm->dm.drawMappedVertNormalsEM = ccgDM_drawMappedVertNormalsEM;
ccgdm->dm.drawMappedEdgesInterpEM = ccgDM_drawMappedEdgesInterpEM;
ccgdm->dm.drawMappedEdgesEM = ccgDM_drawMappedEdgesEM;
ccgdm->dm.drawMappedFacesEM = ccgDM_drawMappedFacesEM;
- ccgdm->dm.drawMappedFaceNormalsEM = ccgDM_drawMappedFaceNormalsEM;
- ccgdm->dm.drawMappedFaceCentersEM = ccgDM_drawMappedFaceCentersEM;
ccgdm->dm.release = ccgDM_release;
diff --git a/source/blender/blenlib/BLI_editVert.h b/source/blender/blenlib/BLI_editVert.h
index 6263a35432d..5e393570e94 100644
--- a/source/blender/blenlib/BLI_editVert.h
+++ b/source/blender/blenlib/BLI_editVert.h
@@ -82,7 +82,6 @@ typedef struct EditFace
struct EditVert *v1, *v2, *v3, *v4;
struct EditEdge *e1, *e2, *e3, *e4;
float n[3], cent[3];
- short xs, ys; /* selection */
struct TFace tf; /* a copy of original tface. */
unsigned char mat_nr, flag;
unsigned char f, f1, h;
diff --git a/source/blender/include/BDR_drawobject.h b/source/blender/include/BDR_drawobject.h
index 02b12582b2a..96457376924 100644
--- a/source/blender/include/BDR_drawobject.h
+++ b/source/blender/include/BDR_drawobject.h
@@ -44,16 +44,21 @@ struct Lamp;
struct ListBase;
struct BoundBox;
struct Base;
+struct BPoint;
+struct BezTriple;
+struct EditVert;
void init_draw_rects(void);
void drawaxes(float size);
void drawcamera(struct Object *ob);
-void calc_mesh_facedots_ext(void);
-void calc_lattverts_ext(void);
-void calc_meshverts_ext(void);
-void calc_meshverts_ext_f2(void);
-void calc_nurbverts_ext(void);
+void mesh_foreachScreenVert(void (*func)(void *userData, struct EditVert *eve, int x, int y, int index), void *userData, int clipVerts);
+void mesh_foreachScreenEdge(void (*func)(void *userData, struct EditEdge *eed, int x0, int y0, int x1, int y1, int index), void *userData, int clipVerts);
+void mesh_foreachScreenFace(void (*func)(void *userData, struct EditFace *efa, int x, int y, int index), void *userData);
+
+void lattice_foreachScreenVert(void (*func)(void *userData, struct BPoint *bp, int x, int y), void *userData);
+void nurbs_foreachScreenVert(void (*func)(void *userData, struct Nurb *nu, struct BPoint *bp, struct BezTriple *bezt, int beztindex, int x, int y), void *userData);
+
void drawcircball(int mode, float *cent, float rad, float tmat[][4]);
void get_local_bounds(struct Object *ob, float *centre, float *size);
void draw_object(struct Base *base);
diff --git a/source/blender/include/BDR_editcurve.h b/source/blender/include/BDR_editcurve.h
index 461eaa81318..1abf2dbe867 100644
--- a/source/blender/include/BDR_editcurve.h
+++ b/source/blender/include/BDR_editcurve.h
@@ -62,10 +62,6 @@ void hideNurb(int swap);
void revealNurb(void);
void selectswapNurb(void);
void subdivideNurb(void);
-short findnearestNurbvert(short sel, struct Nurb **nurb,
- struct BezTriple **bezt, struct BPoint **bp);
-void findselectedNurbvert(struct Nurb **nu, struct BezTriple **bezt,
- struct BPoint **bp);
int convertspline(short type, struct Nurb *nu);
void setsplinetype(short type);
diff --git a/source/blender/include/BIF_editmesh.h b/source/blender/include/BIF_editmesh.h
index c92449ddea7..b110643e666 100644
--- a/source/blender/include/BIF_editmesh.h
+++ b/source/blender/include/BIF_editmesh.h
@@ -96,8 +96,8 @@ extern void EM_select_face_fgon(struct EditFace *efa, int sel);
extern int EM_init_backbuf_border(short xmin, short ymin, short xmax, short ymax);
extern int EM_mask_init_backbuf_border(short mcords[][2], short tot, short xmin, short ymin, short xmax, short ymax);
extern int EM_init_backbuf_circle(short xs, short ys, short rads);
-extern int EM_check_backbuf_border(unsigned int index);
-extern void EM_free_backbuf_border(void);
+extern int EM_check_backbuf(unsigned int index);
+extern void EM_free_backbuf(void);
extern void EM_selectmode_menu(void);
diff --git a/source/blender/python/api2_2x/BezTriple.c b/source/blender/python/api2_2x/BezTriple.c
index 2e97bd2910e..1fd736a1bc6 100644
--- a/source/blender/python/api2_2x/BezTriple.c
+++ b/source/blender/python/api2_2x/BezTriple.c
@@ -331,15 +331,12 @@ static PyObject *BezTripleRepr( BPy_BezTriple * self )
*/
char str[1000];
sprintf( str,
- "BezTriple %f %f %f %f %f %f %f %f %f %f\n %d %d %d %d %d %d %d %d %d %d %d %d\n",
+ "BezTriple %f %f %f %f %f %f %f %f %f %f\n %d %d %d %d %d %d\n",
self->beztriple->vec[0][0], self->beztriple->vec[0][1],
self->beztriple->vec[0][2], self->beztriple->vec[1][0],
self->beztriple->vec[1][1], self->beztriple->vec[1][2],
self->beztriple->vec[2][0], self->beztriple->vec[2][1],
self->beztriple->vec[2][2], self->beztriple->alfa,
- self->beztriple->s[0][0], self->beztriple->s[0][1],
- self->beztriple->s[1][0], self->beztriple->s[1][1],
- self->beztriple->s[2][0], self->beztriple->s[1][1],
self->beztriple->h1, self->beztriple->h2, self->beztriple->f1,
self->beztriple->f2, self->beztriple->f3,
self->beztriple->hide );
@@ -359,14 +356,11 @@ static PyObject *BezTriple_Str( BPy_BezTriple * self )
// fixme:
return PyString_FromFormat(
- "BezTriple (%f %f %f) (%f %f %f) (%f %f %f) alpha %f\n (%d %d) (%d %d) (%d %d) h1:%d h2:%d f1:%d f2:%d f3:%d hide:%d",
+ "BezTriple (%f %f %f) (%f %f %f) (%f %f %f) alpha %f\n h1:%d h2:%d f1:%d f2:%d f3:%d hide:%d",
p->vec[0][0], p->vec[0][1], p->vec[0][2],
p->vec[1][0], p->vec[1][1], p->vec[1][2],
p->vec[2][0], p->vec[2][1], p->vec[2][2],
p->alfa,
- p->s[0][0], p->s[0][1],
- p->s[1][0], p->s[1][1],
- p->s[2][0], p->s[1][1],
p->h1, p->h2, p->f1,
p->f2, p->f3,
p->hide );
diff --git a/source/blender/python/api2_2x/CurNurb.c b/source/blender/python/api2_2x/CurNurb.c
index bb9fa25643b..5a86b50fd8d 100644
--- a/source/blender/python/api2_2x/CurNurb.c
+++ b/source/blender/python/api2_2x/CurNurb.c
@@ -1025,8 +1025,7 @@ PyObject *CurNurb_dump( BPy_CurNurb * self )
}
/* alfa, s[2] */
- printf("\n alpha: %5.2f s: %d %d ",
- bp->alfa, bp->s[0], bp->s[1] );
+ printf("\n alpha: %5.2f", bp->alfa);
/* f1, hide */
printf(" f1 %d hide %d", bp->f1, bp->hide );
printf("\n");
diff --git a/source/blender/src/buttons_editing.c b/source/blender/src/buttons_editing.c
index fc1d71132ea..0f6c2fcf909 100644
--- a/source/blender/src/buttons_editing.c
+++ b/source/blender/src/buttons_editing.c
@@ -1781,7 +1781,6 @@ void do_latticebuts(unsigned short event)
allqueue(REDRAWVIEW3D, 0);
break;
case B_DRAWLAT:
- if(ob==G.obedit) calc_lattverts_ext();
allqueue(REDRAWVIEW3D, 0);
break;
case B_LATTCHANGED:
diff --git a/source/blender/src/drawobject.c b/source/blender/src/drawobject.c
index 280165fb6d5..02b90877b6c 100644
--- a/source/blender/src/drawobject.c
+++ b/source/blender/src/drawobject.c
@@ -276,7 +276,7 @@ void init_draw_rects(void)
static void draw_icon_centered(float *pos, unsigned int *rect, int rectsize)
{
- float hsize= (float) rectsize/2.0;
+ float hsize= (float) rectsize/2.0f;
GLubyte dummy= 0;
glRasterPos3fv(pos);
@@ -836,36 +836,29 @@ static void tekenvertslatt(short sel)
bglEnd();
}
-static void calc_lattverts(void)
+void lattice_foreachScreenVert(void (*func)(void *userData, BPoint *bp, int x, int y), void *userData)
{
- BPoint *bp;
+ int i, N = editLatt->pntsu*editLatt->pntsv*editLatt->pntsw;
float mat[4][4];
- int a;
+ short s[2];
+ areawinset(curarea->win);
+ persp(PERSP_VIEW);
+ mymultmatrix(G.obedit->obmat);
MTC_Mat4SwapMat4(G.vd->persmat, mat);
mygetsingmatrix(G.vd->persmat);
-
- bp= editLatt->def;
-
- a= editLatt->pntsu*editLatt->pntsv*editLatt->pntsw;
- while(a--) {
- project_short(bp->vec, bp->s);
- bp++;
- }
-
- MTC_Mat4SwapMat4(G.vd->persmat, mat);
-}
+ for (i=0; i<N; i++) {
+ BPoint *bp = &editLatt->def[i];
-void calc_lattverts_ext(void)
-{
+ if (bp->hide==0) {
+ project_short(bp->vec, s);
+ func(userData, bp, s[0], s[1]);
+ }
+ }
- areawinset(curarea->win);
- persp(PERSP_VIEW);
- mymultmatrix(G.obedit->obmat);
- calc_lattverts();
+ MTC_Mat4SwapMat4(G.vd->persmat, mat);
myloadmatrix(G.vd->viewmat);
-
}
@@ -962,9 +955,6 @@ static void drawlattice(Object *ob)
}
if(ob==G.obedit) {
-
- calc_lattverts();
-
if(G.vd->zbuf) glDisable(GL_DEPTH_TEST);
tekenvertslatt(0);
@@ -978,65 +968,107 @@ static void drawlattice(Object *ob)
/* ***************** ******************** */
-void calc_mesh_facedots_ext(void)
+static void mesh_foreachScreenVert__mapFunc(void *userData, EditVert *eve, float *co, float *no_f, short *no_s)
{
- EditMesh *em = G.editMesh;
- EditFace *efa;
+ struct { void (*func)(void *userData, EditVert *eve, int x, int y, int index); void *userData; int clipVerts; } *data = userData;
+ short s[2];
+
+ if (eve->h==0) {
+ if (data->clipVerts) {
+ project_short(co, s);
+ } else {
+ project_short_noclip(co, s);
+ }
+
+ data->func(data->userData, eve, s[0], s[1], (int) eve->prev);
+ }
+}
+void mesh_foreachScreenVert(void (*func)(void *userData, EditVert *eve, int x, int y, int index), void *userData, int clipVerts)
+{
+ struct { void (*func)(void *userData, EditVert *eve, int x, int y, int index); void *userData; int clipVerts; } data;
+ int dmNeedsFree;
+ DerivedMesh *dm = editmesh_get_derived_cage(&dmNeedsFree);
float mat[4][4];
+ EditVert *eve, *preveve;
+ int index;
- if(em->faces.first==NULL) return;
- efa= em->faces.first;
+ data.func = func;
+ data.userData = userData;
+ data.clipVerts = clipVerts;
areawinset(curarea->win);
persp(PERSP_VIEW);
-
mymultmatrix(G.obedit->obmat);
-
MTC_Mat4SwapMat4(G.vd->persmat, mat);
mygetsingmatrix(G.vd->persmat);
- efa= em->faces.first;
- while(efa) {
- if( efa->h==0) {
- project_short(efa->cent, &(efa->xs));
- }
- efa= efa->next;
- }
- MTC_Mat4SwapMat4(G.vd->persmat, mat);
+ for (index=0,eve=G.editMesh->verts.first; eve; index++,eve= eve->next)
+ eve->prev = (EditVert*) index;
+
+ dm->foreachMappedVertEM(dm, mesh_foreachScreenVert__mapFunc, &data);
+ for (preveve=NULL, eve=G.editMesh->verts.first; eve; preveve=eve, eve= eve->next)
+ eve->prev = preveve;
+
+ MTC_Mat4SwapMat4(G.vd->persmat, mat);
myloadmatrix(G.vd->viewmat);
+
+ if (dmNeedsFree) {
+ dm->release(dm);
+ }
}
-/* window coord, assuming all matrices are set OK */
-static void calc_meshverts(DerivedMesh *dm)
+static void mesh_foreachScreenEdge__mapFunc(void *userData, EditEdge *eed, float *v0co, float *v1co)
{
- float co[3], mat[4][4];
- EditVert *eve;
+ struct { void (*func)(void *userData, EditEdge *eed, int x0, int y0, int x1, int y1, int index); void *userData; int clipVerts; } *data = userData;
+ short s[2][2];
- MTC_Mat4SwapMat4(G.vd->persmat, mat);
- mygetsingmatrix(G.vd->persmat);
+ if (eed->h==0) {
+ if (data->clipVerts==1) {
+ project_short(v0co, s[0]);
+ project_short(v1co, s[1]);
+ } else {
+ project_short_noclip(v0co, s[0]);
+ project_short_noclip(v1co, s[1]);
- for(eve= G.editMesh->verts.first; eve; eve= eve->next) {
- if(eve->h==0) {
- dm->getMappedVertCoEM(dm, eve, co);
- project_short(co, &(eve->xs));
+ if (data->clipVerts==2) {
+ if (!(s[0][0]>=0 && s[0][1]>= 0 && s[0][0]<curarea->winx && s[0][1]<curarea->winy))
+ if (!(s[1][0]>=0 && s[1][1]>= 0 && s[1][0]<curarea->winx && s[1][1]<curarea->winy))
+ return;
+ }
}
- }
- MTC_Mat4SwapMat4(G.vd->persmat, mat);
+ data->func(data->userData, eed, s[0][0], s[0][1], s[1][0], s[1][1], (int) eed->prev);
+ }
}
-
-/* window coord for current window, sets matrices temporal */
-void calc_meshverts_ext(void)
+void mesh_foreachScreenEdge(void (*func)(void *userData, EditEdge *eed, int x0, int y0, int x1, int y1, int index), void *userData, int clipVerts)
{
+ struct { void (*func)(void *userData, EditEdge *eed, int x0, int y0, int x1, int y1, int index); void *userData; int clipVerts; } data;
int dmNeedsFree;
DerivedMesh *dm = editmesh_get_derived_cage(&dmNeedsFree);
+ float mat[4][4];
+ EditEdge *eed, *preveed;
+ int index;
+
+ data.func = func;
+ data.userData = userData;
+ data.clipVerts = clipVerts;
areawinset(curarea->win);
persp(PERSP_VIEW);
-
mymultmatrix(G.obedit->obmat);
- calc_meshverts(dm);
+ MTC_Mat4SwapMat4(G.vd->persmat, mat);
+ mygetsingmatrix(G.vd->persmat);
+
+ for (index=0,eed=G.editMesh->edges.first; eed; index++,eed= eed->next)
+ eed->prev = (EditEdge*) index;
+
+ dm->foreachMappedEdgeEM(dm, mesh_foreachScreenEdge__mapFunc, &data);
+
+ for (preveed=NULL, eed=G.editMesh->edges.first; eed; preveed=eed, eed= eed->next)
+ eed->prev = preveed;
+
+ MTC_Mat4SwapMat4(G.vd->persmat, mat);
myloadmatrix(G.vd->viewmat);
if (dmNeedsFree) {
@@ -1044,34 +1076,43 @@ void calc_meshverts_ext(void)
}
}
-/* window coord for current window, sets matrices temporal, sets (eve->f & 2) when not visible */
-void calc_meshverts_ext_f2(void)
+static void mesh_foreachScreenFace__mapFunc(void *userData, EditFace *efa, float *cent, float *no)
+{
+ struct { void (*func)(void *userData, EditFace *efa, int x, int y, int index); void *userData; } *data = userData;
+ short s[2];
+
+ if (efa && efa->fgonf!=EM_FGON) {
+ project_short(cent, s);
+
+ data->func(data->userData, efa, s[0], s[1], (int) efa->prev);
+ }
+}
+void mesh_foreachScreenFace(void (*func)(void *userData, EditFace *efa, int x, int y, int index), void *userData)
{
+ struct { void (*func)(void *userData, EditFace *efa, int x, int y, int index); void *userData; } data;
int dmNeedsFree;
DerivedMesh *dm = editmesh_get_derived_cage(&dmNeedsFree);
- float co[3], mat[4][4];
- EditVert *eve;
+ float mat[4][4];
+ EditFace *efa, *prevefa;
+ int index = 0;
+
+ data.func = func;
+ data.userData = userData;
- /* matrices */
areawinset(curarea->win);
persp(PERSP_VIEW);
mymultmatrix(G.obedit->obmat);
-
MTC_Mat4SwapMat4(G.vd->persmat, mat);
mygetsingmatrix(G.vd->persmat);
- for(eve= G.editMesh->verts.first; eve; eve= eve->next) {
- eve->f &= ~2;
- if(eve->h==0) {
- dm->getMappedVertCoEM(dm, eve, co);
- project_short_noclip(co, &(eve->xs));
-
- if( eve->xs >= 0 && eve->ys >= 0 && eve->xs<curarea->winx && eve->ys<curarea->winy);
- else eve->f |= 2;
- }
- }
-
- /* restore */
+ for (index=0,efa=G.editMesh->faces.first; efa; index++,efa= efa->next)
+ efa->prev = (EditFace*) index;
+
+ dm->foreachMappedFaceCenterEM(dm, mesh_foreachScreenFace__mapFunc, &data);
+
+ for (prevefa=NULL, efa=G.editMesh->faces.first; efa; prevefa=efa, efa= efa->next)
+ efa->prev = prevefa;
+
MTC_Mat4SwapMat4(G.vd->persmat, mat);
myloadmatrix(G.vd->viewmat);
@@ -1080,53 +1121,48 @@ void calc_meshverts_ext_f2(void)
}
}
-
-static void calc_Nurbverts(Nurb *nurb)
+void nurbs_foreachScreenVert(void (*func)(void *userData, Nurb *nu, BPoint *bp, BezTriple *bezt, int beztindex, int x, int y), void *userData)
{
- Nurb *nu;
- BezTriple *bezt;
- BPoint *bp;
float mat[4][4];
- int a;
+ short s[2];
+ Nurb *nu;
+ int i;
+ areawinset(curarea->win);
+ persp(PERSP_VIEW);
+ mymultmatrix(G.obedit->obmat);
MTC_Mat4SwapMat4(G.vd->persmat, mat);
mygetsingmatrix(G.vd->persmat);
- nu= nurb;
- while(nu) {
- if((nu->type & 7)==1) {
- bezt= nu->bezt;
- a= nu->pntsu;
- while(a--) {
- project_short(bezt->vec[0], bezt->s[0]);
- project_short(bezt->vec[1], bezt->s[1]);
- project_short(bezt->vec[2], bezt->s[2]);
- bezt++;
+ for (nu= editNurb.first; nu; nu=nu->next) {
+ if((nu->type & 7)==CU_BEZIER) {
+ for (i=0; i<nu->pntsu; i++) {
+ BezTriple *bezt = &nu->bezt[i];
+
+ if(bezt->hide==0) {
+ project_short(bezt->vec[0], s);
+ func(userData, nu, NULL, bezt, 0, s[0], s[1]);
+ project_short(bezt->vec[1], s);
+ func(userData, nu, NULL, bezt, 1, s[0], s[1]);
+ project_short(bezt->vec[2], s);
+ func(userData, nu, NULL, bezt, 2, s[0], s[1]);
+ }
}
}
else {
- bp= nu->bp;
- a= nu->pntsu*nu->pntsv;
- while(a--) {
- project_short(bp->vec, bp->s);
- bp++;
+ for (i=0; i<nu->pntsu*nu->pntsv; i++) {
+ BPoint *bp = &nu->bp[i];
+
+ if(bp->hide==0) {
+ project_short(bp->vec, s);
+ func(userData, nu, bp, NULL, -1, s[0], s[1]);
+ }
}
}
- nu= nu->next;
}
MTC_Mat4SwapMat4(G.vd->persmat, mat);
-}
-
-void calc_nurbverts_ext(void)
-{
-
- areawinset(curarea->win);
- persp(PERSP_VIEW);
- mymultmatrix(G.obedit->obmat);
- calc_Nurbverts(editNurb.first);
myloadmatrix(G.vd->viewmat);
-
}
////
@@ -1205,40 +1241,72 @@ static unsigned char *calc_weightpaint_colors(Object *ob)
* logic!!!
*/
-static int ef_nonhiddenAndFgon__setDrawOptions(void *userData, EditFace *efa)
+static void draw_dm_face_normals__mapFunc(void *userData, EditFace *efa, float *cent, float *no)
{
- if (userData) {
- int sel = ((int) userData) - 1;
- return (efa->h==0 && efa->fgonf!=EM_FGON && (efa->f&SELECT)==sel);
- } else {
- return (efa->h==0 && efa->fgonf!=EM_FGON);
+ if (efa->h==0 && efa->fgonf!=EM_FGON) {
+ glVertex3fv(cent);
+ glVertex3f( cent[0] + no[0]*G.scene->editbutsize,
+ cent[1] + no[1]*G.scene->editbutsize,
+ cent[2] + no[2]*G.scene->editbutsize);
}
}
-static int ev_nonhidden__setDrawOptions(void *userData, EditVert *eve)
-{
- return (eve->h==0);
-}
static void draw_dm_face_normals(DerivedMesh *dm) {
- dm->drawMappedFaceNormalsEM(dm, G.scene->editbutsize, ef_nonhiddenAndFgon__setDrawOptions, 0);
+ glBegin(GL_LINES);
+ dm->foreachMappedFaceCenterEM(dm, draw_dm_face_normals__mapFunc, 0);
+ glEnd();
+}
+
+static void draw_dm_face_centers__mapFunc(void *userData, EditFace *efa, float *cent, float *no)
+{
+ int sel = *((int*) userData);
+
+ if (efa->h==0 && efa->fgonf!=EM_FGON && (efa->f&SELECT)==sel) {
+ bglVertex3fv(cent);
+ }
}
-static void draw_dm_face_centers(DerivedMesh *dm, int sel) {
- dm->drawMappedFaceCentersEM(dm, ef_nonhiddenAndFgon__setDrawOptions, (void*) (sel+1));
+static void draw_dm_face_centers(DerivedMesh *dm, int sel)
+{
+ bglBegin(GL_POINTS);
+ dm->foreachMappedFaceCenterEM(dm, draw_dm_face_centers__mapFunc, &sel);
+ bglEnd();
}
+static void draw_dm_vert_normals__mapFunc(void *userData, EditVert *eve, float *co, float *no_f, short *no_s)
+{
+ if (eve->h==0) {
+ glVertex3fv(co);
+
+ if (no_f) {
+ glVertex3f( co[0] + no_f[0]*G.scene->editbutsize,
+ co[1] + no_f[1]*G.scene->editbutsize,
+ co[2] + no_f[2]*G.scene->editbutsize);
+ } else {
+ glVertex3f( co[0] + no_s[0]*G.scene->editbutsize/32767.0f,
+ co[1] + no_s[1]*G.scene->editbutsize/32767.0f,
+ co[2] + no_s[2]*G.scene->editbutsize/32767.0f);
+ }
+ }
+}
static void draw_dm_vert_normals(DerivedMesh *dm) {
- dm->drawMappedVertNormalsEM(dm, G.scene->editbutsize, ev_nonhidden__setDrawOptions, 0);
+ glBegin(GL_LINES);
+ dm->foreachMappedVertEM(dm, draw_dm_vert_normals__mapFunc, NULL);
+ glEnd();
}
/* Draw verts with color set based on selection */
-static int draw_dm_verts__setDrawOptions(void *userData, EditVert *eve)
+static void draw_dm_verts__mapFunc(void *userData, EditVert *eve, float *co, float *no_f, short *no_s)
{
int sel = *((int*) userData);
- return (eve->h==0 && (eve->f&SELECT)==sel);
+ if (eve->h==0 && (eve->f&SELECT)==sel) {
+ bglVertex3fv(co);
+ }
}
static void draw_dm_verts(DerivedMesh *dm, int sel)
{
- dm->drawMappedVertsEM(dm, draw_dm_verts__setDrawOptions, &sel);
+ bglBegin(GL_POINTS);
+ dm->foreachMappedVertEM(dm, draw_dm_verts__mapFunc, &sel);
+ bglEnd();
}
/* Draw edges with color set based on selection */
@@ -1671,7 +1739,6 @@ static void draw_em_fancy(Object *ob, EditMesh *em, DerivedMesh *cageDM, Derived
}
if(ob==G.obedit) {
- calc_meshverts(cageDM);
draw_em_fancy_verts(em, cageDM);
if(G.f & G_DRAWNORMALS) {
@@ -2736,8 +2803,6 @@ static void drawnurb(Object *ob, Nurb *nurb, int dt)
}
}
- calc_Nurbverts(nurb);
-
if(G.vd->zbuf) glDisable(GL_DEPTH_TEST);
nu= nurb;
@@ -3833,13 +3898,11 @@ void draw_object_ext(Base *base)
/* ***************** BACKBUF SEL (BBS) ********* */
-static int bbs_mesh_verts__setDrawOptions(void *userData, EditVert *eve)
+static void bbs_mesh_verts__mapFunc(void *userData, EditVert *eve, float *co, float *no_f, short *no_s)
{
if (eve->h==0) {
set_framebuffer_index_color((int) eve->prev);
- return 1;
- } else {
- return 0;
+ bglVertex3fv(co);
}
}
static int bbs_mesh_verts(DerivedMesh *dm, int offset)
@@ -3850,7 +3913,9 @@ static int bbs_mesh_verts(DerivedMesh *dm, int offset)
eve->prev = (EditVert*) offset++;
glPointSize( BIF_GetThemeValuef(TH_VERTEX_SIZE) );
- dm->drawMappedVertsEM(dm, bbs_mesh_verts__setDrawOptions, NULL);
+ bglBegin(GL_POINTS);
+ dm->foreachMappedVertEM(dm, bbs_mesh_verts__mapFunc, NULL);
+ bglEnd();
glPointSize(1.0);
for (preveve=NULL, eve=G.editMesh->verts.first; eve; preveve=eve, eve= eve->next)
@@ -3892,13 +3957,12 @@ static int bbs_mesh_solid__setSolidDrawOptions(void *userData, EditFace *efa)
}
}
-int bbs_mesh_solid__setCenterDrawOptions(void *userData, EditFace *efa)
+static void bbs_mesh_solid__drawCenter(void *userData, EditFace *efa, float *cent, float *no)
{
if (efa->h==0 && efa->fgonf!=EM_FGON) {
set_framebuffer_index_color((int) efa->prev);
- return 1;
- } else {
- return 0;
+
+ bglVertex3fv(cent);
}
}
@@ -3921,7 +3985,9 @@ static int bbs_mesh_solid_EM(DerivedMesh *dm, int facecol)
if(G.scene->selectmode & SCE_SELECT_FACE) {
glPointSize(BIF_GetThemeValuef(TH_FACEDOT_SIZE));
- dm->drawMappedFaceCentersEM(dm, bbs_mesh_solid__setCenterDrawOptions, NULL);
+ bglBegin(GL_POINTS);
+ dm->foreachMappedFaceCenterEM(dm, bbs_mesh_solid__drawCenter, NULL);
+ bglEnd();
}
for (prevefa= NULL, efa= G.editMesh->faces.first; efa; prevefa= efa, efa= efa->next)
diff --git a/source/blender/src/editcurve.c b/source/blender/src/editcurve.c
index b1e61bbbef6..6932d583ba8 100644
--- a/source/blender/src/editcurve.c
+++ b/source/blender/src/editcurve.c
@@ -185,48 +185,35 @@ void printknots()
}
#if 0
-static void printweightsNurb(void)
+static void printweightsNurb__doPrint(void *userData, Nurb *nurb, BPoint *bp, BezTriple *bezt, int beztindex, int x, int y)
{
- Nurb *nu;
- BPoint *bp;
- int a;
char str[30];
- if(G.obedit==0) return;
+ if (bp && (bp->f1&1)) {
+ sprintf(str,"%2.2f", bp->vec[3]);
- persp(PERSP_WIN);
+ cpack(0x737373);
+ glRasterPos2i(x-1, y-1);
+ BMF_DrawString(G.font, str);
- glDrawBuffer(GL_FRONT);
+ glRasterPos2i(x+1, y+1);
+ BMF_DrawString(G.font, str);
- nu= editNurb.first;
- while(nu) {
- if((nu->type & 7)==CU_NURBS) {
- a= nu->pntsu*nu->pntsv;
- bp= nu->bp;
- while(a--) {
- if(bp->f1 & 1) {
- if(bp->s[0]!= 3200) {
- sprintf(str,"%2.2f", bp->vec[3]);
-
- cpack(0x737373);
- glRasterPos2i(bp->s[0]-1, bp->s[1]-1);
- BMF_DrawString(G.font, str);
+ cpack(0xFFFFFF);
+ glRasterPos2i(x, y);
+ BMF_DrawString(G.font, str);
+ }
+}
+static void printweightsNurb(void)
+{
+ if(G.obedit==0) return;
- glRasterPos2i(bp->s[0]+1, bp->s[1]+1);
- BMF_DrawString(G.font, str);
+ persp(PERSP_WIN);
- cpack(0xFFFFFF);
- glRasterPos2i(bp->s[0], bp->s[1]);
- BMF_DrawString(G.font, str);
- }
- }
- bp++;
- }
- }
- nu= nu->next;
- }
+ glDrawBuffer(GL_FRONT);
+ nurbs_foreachScreenVert(printweightsNurb__doPrint, NULL);
+ glDrawBuffer(GL_BACK);
- glDrawBuffer(GL_BACK);
persp(PERSP_VIEW);
}
#endif
@@ -1679,93 +1666,62 @@ void subdivideNurb()
}
-
-short findnearestNurbvert(short sel, Nurb **nurb, BezTriple **bezt, BPoint **bp)
+static void findnearestNurbvert__doClosest(void *userData, Nurb *nu, BPoint *bp, BezTriple *bezt, int beztindex, int x, int y)
{
- /* sel==1: selected gets a disadvantage */
- /* in nurb and bezt or bp the nearest is written */
- /* return 0 1 2: handlepunt */
- Nurb *nu;
- BezTriple *bezt1;
- BPoint *bp1;
- short dist= 100, temp, mval[2], a, hpoint=0;
+ struct { BPoint *bp; BezTriple *bezt; Nurb *nurb; short dist, hpoint, select, mval[2]; } *data = userData;
- *nurb= 0;
- *bezt= 0;
- *bp= 0;
-
- /* do projection */
- calc_nurbverts_ext(); /* drawobject.c */
-
- getmouseco_areawin(mval);
+ short flag;
+ short temp;
- nu= editNurb.first;
- while(nu) {
- if((nu->type & 7)==CU_BEZIER) {
- bezt1= nu->bezt;
- a= nu->pntsu;
- while(a--) {
- if(bezt1->hide==0) {
- temp= abs(mval[0]- bezt1->s[0][0])+ abs(mval[1]- bezt1->s[0][1]);
- if( (bezt1->f1 & 1)==sel) temp+=5;
- if(temp<dist) {
- hpoint=0;
- *bezt=bezt1;
- dist= temp;
- *nurb= nu;
- *bp= 0;
- }
-
- /* middle points get a small disadvantage */
- temp= 3+abs(mval[0]- bezt1->s[1][0])+ abs(mval[1]- bezt1->s[1][1]);
- if( (bezt1->f2 & 1)==sel) temp+=5;
- if(temp<dist) {
- hpoint=1;
- *bezt=bezt1;
- dist= temp;
- *nurb= nu;
- *bp= 0;
- }
-
- temp= abs(mval[0]- bezt1->s[2][0])+ abs(mval[1]- bezt1->s[2][1]);
- if( (bezt1->f3 & 1)==sel) temp+=5;
- if(temp<dist) {
- hpoint=2;
- *bezt=bezt1;
- dist= temp;
- *nurb= nu;
- *bp= 0;
- }
- }
- bezt1++;
- }
- }
- else {
- bp1= nu->bp;
- a= nu->pntsu*nu->pntsv;
- while(a--) {
- if(bp1->hide==0) {
- temp= abs(mval[0]- bp1->s[0])+ abs(mval[1]- bp1->s[1]);
- if( (bp1->f1 & 1)==sel) temp+=5;
- if(temp<dist) {
- hpoint=0;
- *bp=bp1;
- dist= temp;
- *nurb= nu;
- *bezt= 0;
- }
- }
- bp1++;
- }
+ if (bp) {
+ flag = bp->f1;
+ } else {
+ if (beztindex==0) {
+ flag = bezt->f1;
+ } else if (beztindex==1) {
+ flag = bezt->f2;
+ } else {
+ flag = bezt->f3;
}
- nu= nu->next;
}
- return hpoint;
+ temp = abs(data->mval[0]-x) + abs(data->mval[1]-y);
+ if ((flag&1)==data->select) temp += 5;
+ if (bezt && beztindex==1) temp += 3; /* middle points get a small disadvantage */
+
+ if (temp<data->dist) {
+ data->dist = temp;
+
+ data->bp = bp;
+ data->bezt = bezt;
+ data->nurb = nu;
+ data->hpoint = bezt?beztindex:0;
+ }
+}
+
+static short findnearestNurbvert(short sel, Nurb **nurb, BezTriple **bezt, BPoint **bp)
+{
+ /* sel==1: selected gets a disadvantage */
+ /* in nurb and bezt or bp the nearest is written */
+ /* return 0 1 2: handlepunt */
+ struct { BPoint *bp; BezTriple *bezt; Nurb *nurb; short dist, hpoint, select, mval[2]; } data = {0};
+
+ data.dist = 100;
+ data.hpoint = 0;
+ data.select = sel;
+ getmouseco_areawin(data.mval);
+
+ nurbs_foreachScreenVert(findnearestNurbvert__doClosest, &data);
+
+ *nurb = data.nurb;
+ *bezt = data.bezt;
+ *bp = data.bp;
+
+ return data.hpoint;
}
-void findselectedNurbvert(Nurb **nu, BezTriple **bezt, BPoint **bp)
+static void findselectedNurbvert(Nurb **nu, BezTriple **bezt, BPoint **bp)
{
/* in nu and (bezt or bp) selected are written if there's 1 sel. */
/* if more points selected in 1 spline: return only nu, bezt and bp are 0 */
@@ -2683,8 +2639,6 @@ void addvert_Nurb(int mode)
if(bezt) {
nu->pntsu++;
- newbezt->s[1][0]= G.vd->mx;
- newbezt->s[1][1]= G.vd->my;
if(mode=='e') {
VECCOPY(newbezt->vec[0], bezt->vec[0]);
@@ -2731,8 +2685,6 @@ void addvert_Nurb(int mode)
if(bp) {
nu->pntsu++;
- newbp->s[0]= G.vd->mx;
- newbp->s[1]= G.vd->my;
if(nu->resolu<3) nu->resolu++;
makeknots(nu, 1, nu->flagu>>1);
diff --git a/source/blender/src/editlattice.c b/source/blender/src/editlattice.c
index 89810a2a2b3..2f7eec5149c 100644
--- a/source/blender/src/editlattice.c
+++ b/source/blender/src/editlattice.c
@@ -211,39 +211,32 @@ void deselectall_Latt(void)
BIF_undo_push("(De)select all");
}
+static void findnearestLattvert__doClosest(void *userData, BPoint *bp, int x, int y)
+{
+ struct { BPoint *bp; short dist, select, mval[2]; } *data = userData;
+ short temp = abs(data->mval[0]-x) + abs(data->mval[1]-y);
+
+ if ((bp->f1&1)==data->select) temp += 5;
+ if (temp<data->dist) {
+ data->dist = temp;
+ data->bp = bp;
+ }
+}
static BPoint *findnearestLattvert(int sel)
{
- /* sel==1: selected get a disadvantage */
- /* in bp nearest is written */
- BPoint *bp1, *bp;
- short dist= 100, temp, mval[2], a;
+ /* sel==1: selected gets a disadvantage */
+ /* in nurb and bezt or bp the nearest is written */
+ /* return 0 1 2: handlepunt */
+ struct { BPoint *bp; short dist, select, mval[2]; } data = {0};
- bp= 0;
+ data.dist = 100;
+ data.select = sel;
+ getmouseco_areawin(data.mval);
- /* do projection */
- calc_lattverts_ext(); /* drawobject.c */
-
- getmouseco_areawin(mval);
-
-
- bp1= editLatt->def;
-
- a= editLatt->pntsu*editLatt->pntsv*editLatt->pntsw;
-
- while(a--) {
- if(bp1->hide==0) {
- temp= abs(mval[0]- bp1->s[0])+ abs(mval[1]- bp1->s[1]);
- if( (bp1->f1 & 1)==sel) temp+=5;
- if(temp<dist) {
- bp= bp1;
- dist= temp;
- }
- }
- bp1++;
- }
+ lattice_foreachScreenVert(findnearestLattvert__doClosest, &data);
- return bp;
+ return data.bp;
}
diff --git a/source/blender/src/editmesh_add.c b/source/blender/src/editmesh_add.c
index 5d1fcbf91a3..cd94b12feec 100644
--- a/source/blender/src/editmesh_add.c
+++ b/source/blender/src/editmesh_add.c
@@ -144,8 +144,6 @@ void addvert_mesh(void)
curs= give_cursor();
VECCOPY(eve->co, curs);
- eve->xs= G.vd->mx;
- eve->ys= G.vd->my;
VecSubf(eve->co, eve->co, G.obedit->obmat[3]);
Mat3MulVecfl(imat, eve->co);
diff --git a/source/blender/src/editmesh_loop.c b/source/blender/src/editmesh_loop.c
index bc50ebdce05..c10f7ac4c0d 100644
--- a/source/blender/src/editmesh_loop.c
+++ b/source/blender/src/editmesh_loop.c
@@ -636,8 +636,6 @@ void KnifeSubdivide(char mode)
if(button(&numcuts, 2, 128, "Number of Cuts:")==0) return;
}
- calc_meshverts_ext(); /*Update screen coords for current window */
-
/* Set a knife cursor here */
oldcursor=get_cursor();
diff --git a/source/blender/src/editmesh_mods.c b/source/blender/src/editmesh_mods.c
index 08fd3981f1f..89ee15af77a 100644
--- a/source/blender/src/editmesh_mods.c
+++ b/source/blender/src/editmesh_mods.c
@@ -194,13 +194,22 @@ static unsigned int *read_backbuf(short xmin, short ymin, short xmax, short ymax
/* smart function to sample a rect spiralling outside, nice for backbuf selection */
-static unsigned int sample_backbuf_rect(unsigned int *buf, int size, unsigned int min, unsigned int max, short *dist)
+static unsigned int sample_backbuf_rect(short mval[2], int size, unsigned int min, unsigned int max, short *dist)
{
- unsigned int *bufmin, *bufmax;
+ unsigned int *buf, *bufmin, *bufmax;
+ int minx, miny;
int a, b, rc, nr, amount, dirvec[4][2];
short distance=0;
+ unsigned int index = 0;
amount= (size-1)/2;
+
+ minx = mval[0]-(amount+1);
+ miny = mval[1]-(amount+1);
+ buf = read_backbuf(minx, miny, minx+size-1, miny+size-1);
+ if (!buf)
+ return 0;
+
rc= 0;
dirvec[0][0]= 1; dirvec[0][1]= 0;
@@ -216,23 +225,26 @@ static unsigned int sample_backbuf_rect(unsigned int *buf, int size, unsigned in
for(a=0; a<2; a++) {
for(b=0; b<nr; b++, distance++) {
-
- if(*buf && *buf>=min && *buf<max ) {
- *dist= (short) sqrt( (float)distance );
- return *buf - min+1; // messy yah, but indices start at 1
+ if (*buf && *buf>=min && *buf<max) {
+ *dist= (short) sqrt( (float)distance ); // XXX, this distance is wrong - zr
+ index = *buf - min+1; // messy yah, but indices start at 1
+ goto exit;
}
buf+= (dirvec[rc][0]+dirvec[rc][1]);
if(buf<bufmin || buf>=bufmax) {
- return 0;
+ goto exit;
}
}
rc++;
rc &= 3;
}
}
- return 0;
+
+exit:
+ MEM_freeN(bufmin);
+ return index;
}
/* facilities for border select and circle select */
@@ -302,14 +314,15 @@ int EM_init_backbuf_border(short xmin, short ymin, short xmax, short ymax)
a= (xmax-xmin+1)*(ymax-ymin+1);
while(a--) {
- if(*dr>0 && *dr<=em_vertoffs) selbuf[*dr]= 1;
+ if(*dr>0 && *dr<=em_vertoffs)
+ selbuf[*dr]= 1;
dr++;
}
MEM_freeN(buf);
return 1;
}
-int EM_check_backbuf_border(unsigned int index)
+int EM_check_backbuf(unsigned int index)
{
if(selbuf==NULL) return 1;
if(index>0 && index<=em_vertoffs)
@@ -317,7 +330,7 @@ int EM_check_backbuf_border(unsigned int index)
return 0;
}
-void EM_free_backbuf_border(void)
+void EM_free_backbuf(void)
{
if(selbuf) MEM_freeN(selbuf);
selbuf= NULL;
@@ -416,265 +429,241 @@ int EM_init_backbuf_circle(short xs, short ys, short rads)
}
-
-static EditVert *findnearestvert_f(short *dist, short sel)
+static void findnearestvert__doClosest(void *userData, EditVert *eve, int x, int y, int index)
{
- static EditVert *acto= NULL;
- EditMesh *em = G.editMesh;
- /* if sel==1 the vertices with flag==1 get a disadvantage */
- EditVert *eve,*act=NULL;
- short temp, mval[2];
+ struct { short mval[2], pass, select, dist; int lastIndex, closestIndex; EditVert *closest; } *data = userData;
- if(em->verts.first==NULL) return NULL;
-
- /* do projection */
- calc_meshverts_ext(); /* drawobject.c */
-
- /* we count from acto->next to last, and from first to acto */
- /* does acto exist? */
- eve= em->verts.first;
- while(eve) {
- if(eve==acto) break;
- eve= eve->next;
+ if (data->pass==0) {
+ if (index<=data->lastIndex)
+ return;
+ } else {
+ if (index>data->lastIndex)
+ return;
}
- if(eve==NULL) acto= em->verts.first;
- /* is there an indicated vertex? part 1 */
- getmouseco_areawin(mval);
- eve= acto->next;
- while(eve) {
- if(eve->h==0 && eve->xs!=3200) {
- temp= abs(mval[0]- eve->xs)+ abs(mval[1]- eve->ys);
- if( (eve->f & 1)==sel ) temp+=5;
- if(temp< *dist) {
- act= eve;
- *dist= temp;
- if(*dist<4) break;
- }
- }
- eve= eve->next;
- }
- /* is there an indicated vertex? part 2 */
- if(*dist>3) {
- eve= em->verts.first;
- while(eve) {
- if(eve->h==0 && eve->xs!=3200) {
- temp= abs(mval[0]- eve->xs)+ abs(mval[1]- eve->ys);
- if( (eve->f & 1)==sel ) temp+=5;
- if(temp< *dist) {
- act= eve;
- if(temp<4) break;
- *dist= temp;
- }
- if(eve== acto) break;
- }
- eve= eve->next;
+ if (data->dist>3) {
+ short temp = abs(data->mval[0] - x) + abs(data->mval[1]- y);
+ if ((eve->f&1)==data->select) temp += 5;
+
+ if (temp<data->dist) {
+ data->dist = temp;
+ data->closest = eve;
+ data->closestIndex = index;
}
}
-
- acto= act;
- return act;
}
-
-/* backbuffer version */
static EditVert *findnearestvert(short *dist, short sel)
{
- if(G.vd->drawtype>OB_WIRE && (G.vd->flag & V3D_ZBUF_SELECT)) {
- EditVert *eve=NULL;
- unsigned int *buf;
- int a=1, index;
- short mval[2], distance=255;
-
- getmouseco_areawin(mval);
+ short mval[2];
+
+ getmouseco_areawin(mval);
- // sample colorcode
- buf= read_backbuf(mval[0]-25, mval[1]-25, mval[0]+24, mval[1]+24);
- if(buf) {
- index= sample_backbuf_rect(buf, 50, em_wireoffs, 0xFFFFFF, &distance); // globals, set in drawobject.c
- MEM_freeN(buf);
- if(distance < *dist) {
- if(index>0) for(eve= G.editMesh->verts.first; eve; eve= eve->next, a++) if(index==a) break;
- if(eve) *dist= distance;
- }
+ if(G.vd->drawtype>OB_WIRE && (G.vd->flag & V3D_ZBUF_SELECT)) {
+ short distance;
+ unsigned int index = sample_backbuf_rect(mval, 50, em_wireoffs, 0xFFFFFF, &distance);
+ EditVert *eve = BLI_findlink(&G.editMesh->verts, index-1);
+
+ if (eve && distance < *dist) {
+ *dist = distance;
+ return eve;
+ } else {
+ return NULL;
}
- return eve;
}
- else return findnearestvert_f(dist, sel);
-}
+ else {
+ struct { short mval[2], pass, select, dist; int lastIndex, closestIndex; EditVert *closest; } data;
+ static int lastSelectedIndex=0;
+ static EditVert *lastSelected=NULL;
-/* helper for findnearest edge */
-static float dist_mval_edge(short *mval, EditEdge *eed)
-{
- float v1[2], v2[2], mval2[2];
+ if (lastSelected && BLI_findlink(&G.editMesh->verts, lastSelectedIndex)!=lastSelected) {
+ lastSelectedIndex = 0;
+ lastSelected = NULL;
+ }
- mval2[0] = (float)mval[0];
- mval2[1] = (float)mval[1];
-
- v1[0] = eed->v1->xs;
- v1[1] = eed->v1->ys;
- v2[0] = eed->v2->xs;
- v2[1] = eed->v2->ys;
-
- return PdistVL2Dfl(mval2, v1, v2);
-}
+ data.lastIndex = lastSelectedIndex;
+ data.mval[0] = mval[0];
+ data.mval[1] = mval[1];
+ data.select = sel;
+ data.dist = *dist;
+ data.closest = NULL;
+ data.closestIndex = 0;
-static EditEdge *findnearestedge_f(short *dist)
-{
- EditMesh *em = G.editMesh;
- EditEdge *closest, *eed;
- EditVert *eve;
- short mval[2], distance;
-
- if(em->edges.first==NULL) return NULL;
- else eed= em->edges.first;
-
- calc_meshverts_ext_f2(); /* sets/clears (eve->f & 2) for vertices that aren't visible */
+ data.pass = 0;
+ mesh_foreachScreenVert(findnearestvert__doClosest, &data, 1);
- getmouseco_areawin(mval);
- closest=NULL;
-
- /*compare the distance to the rest of the edges and find the closest one*/
- eed=em->edges.first;
- while(eed) {
- /* Are both vertices of the edge ofscreen or either of them hidden? then don't select the edge*/
- if( !((eed->v1->f & 2) && (eed->v2->f & 2)) && eed->h==0){
-
- distance= dist_mval_edge(mval, eed);
- if(eed->f & SELECT) distance+=5;
- if(distance < *dist) {
- *dist= distance;
- closest= eed;
- }
+ if (data.dist>3) {
+ data.pass = 1;
+ mesh_foreachScreenVert(findnearestvert__doClosest, &data, 1);
}
- eed= eed->next;
- }
-
- /* reset flags */
- for(eve=em->verts.first; eve; eve=eve->next){
- eve->f &= ~2;
+
+ *dist = data.dist;
+ lastSelected = data.closest;
+ lastSelectedIndex = data.closestIndex;
+
+ return data.closest;
}
-
- return closest;
}
-/* backbuffer version */
-EditEdge *findnearestedge(short *dist)
+static void findnearestedge__doClosest(void *userData, EditEdge *eed, int x0, int y0, int x1, int y1, int index)
{
- if(G.vd->drawtype>OB_WIRE && (G.vd->flag & V3D_ZBUF_SELECT)) {
- EditEdge *eed=NULL;
- unsigned int *buf, index;
- int a=1;
- short mval[2], distance=255;
+ struct { float mval[2]; short dist; EditEdge *closest; } *data = userData;
+ float v1[2], v2[2];
+ short distance;
- getmouseco_areawin(mval);
- // sample colorcode
-
- buf= read_backbuf(mval[0]-25, mval[1]-25, mval[0]+24, mval[1]+24);
- if(buf) {
- index= sample_backbuf_rect(buf, 50, em_solidoffs, em_wireoffs, &distance); // global, set in drawobject.c
- MEM_freeN(buf);
- if(distance < *dist) {
- if(index>0 && index<=em_wireoffs-em_solidoffs) {
- for(eed= G.editMesh->edges.first; eed; eed= eed->next, a++)
- if(index==a) break;
- }
- if(eed) *dist= distance;
- }
- }
+ v1[0] = x0;
+ v1[1] = y0;
+ v2[0] = x1;
+ v2[1] = y1;
+
+ distance= PdistVL2Dfl(data->mval, v1, v2);
- return eed;
+ if(eed->f & SELECT) distance+=5;
+ if(distance < data->dist) {
+ data->dist = distance;
+ data->closest = eed;
}
- else return findnearestedge_f(dist);
}
+EditEdge *findnearestedge(short *dist)
+{
+ short mval[2];
+
+ getmouseco_areawin(mval);
+
+ if(G.vd->drawtype>OB_WIRE && (G.vd->flag & V3D_ZBUF_SELECT)) {
+ short distance;
+ unsigned int index = sample_backbuf_rect(mval, 50, em_solidoffs, em_wireoffs, &distance);
+ EditEdge *eed = BLI_findlink(&G.editMesh->edges, index-1);
+
+ if (eed && distance<*dist) {
+ *dist = distance;
+ return eed;
+ } else {
+ return NULL;
+ }
+ }
+ else {
+ struct { float mval[2]; short dist; EditEdge *closest; } data;
+
+ data.mval[0] = mval[0];
+ data.mval[1] = mval[1];
+ data.dist = *dist;
+ data.closest = NULL;
+ mesh_foreachScreenEdge(findnearestedge__doClosest, &data, 2);
+
+ *dist = data.dist;
+ return data.closest;
+ }
+}
-static EditFace *findnearestface_f(short *dist)
+static void findnearestface__getDistance(void *userData, EditFace *efa, int x, int y, int index)
{
- static EditFace *acto= NULL;
- EditMesh *em = G.editMesh;
- /* if selected the faces with flag==1 get a disadvantage */
- EditFace *efa, *act=NULL;
- short temp, mval[2];
+ struct { short mval[2], dist; EditFace *toFace; } *data = userData;
- if(em->faces.first==NULL) return NULL;
+ if (efa==data->toFace) {
+ short temp = abs(data->mval[0]-x) + abs(data->mval[1]-y);
- /* do projection */
- calc_mesh_facedots_ext();
-
- /* we count from acto->next to last, and from first to acto */
- /* does acto exist? */
- efa= em->faces.first;
- while(efa) {
- if(efa==acto) break;
- efa= efa->next;
+ if (temp<data->dist)
+ data->dist = temp;
}
- if(efa==NULL) acto= em->faces.first;
+}
+static void findnearestface__doClosest(void *userData, EditFace *efa, int x, int y, int index)
+{
+ struct { short mval[2], pass, dist; int lastIndex, closestIndex; EditFace *closest; } *data = userData;
- /* is there an indicated face? part 1 */
- getmouseco_areawin(mval);
- efa= acto->next;
- while(efa) {
- if(efa->h==0 && efa->fgonf!=EM_FGON) {
- temp= abs(mval[0]- efa->xs)+ abs(mval[1]- efa->ys);
- if(temp< *dist) {
- act= efa;
- *dist= temp;
- }
- }
- efa= efa->next;
+ if (data->pass==0) {
+ if (index<=data->lastIndex)
+ return;
+ } else {
+ if (index>data->lastIndex)
+ return;
}
- /* is there an indicated face? part 2 */
- if(*dist>3) {
- efa= em->faces.first;
- while(efa) {
- if(efa->h==0 && efa->fgonf!=EM_FGON) {
- temp= abs(mval[0]- efa->xs)+ abs(mval[1]- efa->ys);
- if(temp< *dist) {
- act= efa;
- *dist= temp;
- }
- if(efa== acto) break;
- }
- efa= efa->next;
+
+ if (data->dist>3) {
+ short temp = abs(data->mval[0]-x) + abs(data->mval[1]-y);
+
+ if (temp<data->dist) {
+ data->dist = temp;
+ data->closest = efa;
+ data->closestIndex = index;
}
}
-
- acto= act;
- return act;
}
-
static EditFace *findnearestface(short *dist)
{
+ short mval[2];
+
+ getmouseco_areawin(mval);
+
if(G.vd->drawtype>OB_WIRE && (G.vd->flag & V3D_ZBUF_SELECT)) {
- EditFace *efa=NULL;
- int a=1;
- unsigned int index;
- short mval[2], distance;
+ unsigned int index = sample_backbuf(mval[0], mval[1]);
+ EditFace *efa = BLI_findlink(&G.editMesh->faces, index-1);
- calc_mesh_facedots_ext(); // shouldnt be needed each click
- getmouseco_areawin(mval);
+ if (efa) {
+ struct { short mval[2], dist; EditFace *toFace; } data;
- // sample colorcode
- index= sample_backbuf(mval[0], mval[1]);
-
- if(index && index<=em_solidoffs) {
- for(efa= G.editMesh->faces.first; efa; efa= efa->next, a++) if(index==a) break;
- if(efa) {
- distance= abs(mval[0]- efa->xs)+ abs(mval[1]- efa->ys);
-
- if(G.scene->selectmode == SCE_SELECT_FACE || distance<*dist) { // only faces, no dist check
- *dist= distance;
- return efa;
- }
+ data.mval[0] = mval[0];
+ data.mval[1] = mval[1];
+ data.dist = (1<<20); // just a big number
+ data.toFace = efa;
+
+ mesh_foreachScreenFace(findnearestface__getDistance, &data);
+
+ if(G.scene->selectmode == SCE_SELECT_FACE || data.dist<*dist) { // only faces, no dist check
+ *dist= data.dist;
+ return efa;
}
}
return NULL;
}
- else return findnearestface_f(dist);
+ else {
+ struct { short mval[2], pass, dist; int lastIndex, closestIndex; EditFace *closest; } data;
+ static int lastSelectedIndex=0;
+ static EditFace *lastSelected=NULL;
+
+ if (lastSelected && BLI_findlink(&G.editMesh->faces, lastSelectedIndex)!=lastSelected) {
+ lastSelectedIndex = 0;
+ lastSelected = NULL;
+ }
+
+ data.lastIndex = lastSelectedIndex;
+ data.mval[0] = mval[0];
+ data.mval[1] = mval[1];
+ data.dist = *dist;
+ data.closest = NULL;
+ data.closestIndex = 0;
+
+ data.pass = 0;
+ mesh_foreachScreenFace(findnearestface__doClosest, &data);
+
+ if (data.dist>3) {
+ data.pass = 1;
+ mesh_foreachScreenFace(findnearestface__doClosest, &data);
+ }
+
+ *dist = data.dist;
+ lastSelected = data.closest;
+ lastSelectedIndex = data.closestIndex;
+
+ return data.closest;
+ }
}
/* for interactivity, frontbuffer draw in current window */
+static void draw_dm_mapped_vert__mapFunc(void *theVert, EditVert *eve, float *co, float *no_f, short *no_s)
+{
+ if (eve==theVert) {
+ bglVertex3fv(co);
+ }
+}
+static void draw_dm_mapped_vert(DerivedMesh *dm, EditVert *eve)
+{
+ bglBegin(GL_POINTS);
+ dm->foreachMappedVertEM(dm, draw_dm_mapped_vert__mapFunc, eve);
+ bglEnd();
+}
+
static int draw_dm_mapped_edge__setDrawOptions(void *theEdge, EditEdge *eed)
{
return theEdge==eed;
@@ -684,13 +673,17 @@ static void draw_dm_mapped_edge(DerivedMesh *dm, EditEdge *eed)
dm->drawMappedEdgesEM(dm, draw_dm_mapped_edge__setDrawOptions, eed);
}
-static int draw_dm_mapped_face_center__setDrawOptions(void *theFace, EditFace *efa)
+static void draw_dm_mapped_face_center__mapFunc(void *theFace, EditFace *efa, float *cent, float *no)
{
- return theFace==efa;
+ if (efa==theFace) {
+ bglVertex3fv(cent);
+ }
}
static void draw_dm_mapped_face_center(DerivedMesh *dm, EditFace *efa)
{
- dm->drawMappedFaceCentersEM(dm, draw_dm_mapped_face_center__setDrawOptions, efa);
+ bglBegin(GL_POINTS);
+ dm->foreachMappedFaceCenterEM(dm, draw_dm_mapped_face_center__mapFunc, efa);
+ bglEnd();
}
static void unified_select_draw(EditVert *eve, EditEdge *eed, EditFace *efa)
@@ -750,31 +743,21 @@ static void unified_select_draw(EditVert *eve, EditEdge *eed, EditFace *efa)
draw_dm_mapped_edge(dm, eed);
}
if(G.scene->selectmode & SCE_SELECT_VERTEX) {
- float co[3];
glPointSize(BIF_GetThemeValuef(TH_VERTEX_SIZE));
BIF_ThemeColor((eed->f & SELECT)?TH_VERTEX_SELECT:TH_VERTEX);
- bglBegin(GL_POINTS);
- dm->getMappedVertCoEM(dm, eed->v1, co);
- bglVertex3fv(co);
-
- dm->getMappedVertCoEM(dm, eed->v2, co);
- bglVertex3fv(co);
- bglEnd();
+ draw_dm_mapped_vert(dm, eed->v1);
+ draw_dm_mapped_vert(dm, eed->v2);
}
}
if(eve) {
if(G.scene->selectmode & SCE_SELECT_VERTEX) {
- float co[3];
glPointSize(BIF_GetThemeValuef(TH_VERTEX_SIZE));
BIF_ThemeColor((eve->f & SELECT)?TH_VERTEX_SELECT:TH_VERTEX);
- bglBegin(GL_POINTS);
- dm->getMappedVertCoEM(dm, eve, co);
- bglVertex3fv(co);
- bglEnd();
+ draw_dm_mapped_vert(dm, eve);
}
}
@@ -1294,7 +1277,6 @@ void hide_mesh(int swap)
if(G.scene->selectmode & SCE_SELECT_VERTEX) {
for(eve= em->verts.first; eve; eve= eve->next) {
if((eve->f & SELECT)!=swap) {
- eve->xs= 3200;
eve->f &= ~SELECT;
eve->h= 1;
}
diff --git a/source/blender/src/editmesh_tools.c b/source/blender/src/editmesh_tools.c
index d4be4b6a3a5..78df1b9035a 100644
--- a/source/blender/src/editmesh_tools.c
+++ b/source/blender/src/editmesh_tools.c
@@ -103,14 +103,14 @@ static void free_tagged_facelist(EditFace *efa);
/********* qsort routines *********/
-struct xvertsort {
+typedef struct xvertsort {
float x;
EditVert *v1;
-};
+} xvertsort;
static int vergxco(const void *v1, const void *v2)
{
- const struct xvertsort *x1=v1, *x2=v2;
+ const xvertsort *x1=v1, *x2=v2;
if( x1->x > x2->x ) return 1;
else if( x1->x < x2->x) return -1;
@@ -179,7 +179,7 @@ int removedoublesflag(short flag, float limit) /* return amount */
EditVert *eve, *v1, *nextve;
EditEdge *eed, *e1, *nexted;
EditFace *efa, *nextvl;
- struct xvertsort *sortblock, *sb, *sb1;
+ xvertsort *sortblock, *sb, *sb1;
struct facesort *vlsortblock, *vsb, *vsb1;
float dist;
int a, b, test, amount;
@@ -195,7 +195,7 @@ int removedoublesflag(short flag, float limit) /* return amount */
if(amount==0) return 0;
/* allocate memory and qsort */
- sb= sortblock= (struct xvertsort *)MEM_mallocN(sizeof(struct xvertsort)*amount,"sortremovedoub");
+ sb= sortblock= MEM_mallocN(sizeof(xvertsort)*amount,"sortremovedoub");
eve= em->verts.first;
while(eve) {
if(eve->h==0 && (eve->f & flag)) {
@@ -205,7 +205,7 @@ int removedoublesflag(short flag, float limit) /* return amount */
}
eve= eve->next;
}
- qsort(sortblock, amount, sizeof(struct xvertsort), vergxco);
+ qsort(sortblock, amount, sizeof(xvertsort), vergxco);
/* test for doubles */
sb= sortblock;
@@ -427,45 +427,37 @@ int removedoublesflag(short flag, float limit) /* return amount */
}
/* called from buttons */
+static void xsortvert_flag__doSetX(void *userData, EditVert *eve, int x, int y, int index)
+{
+ xvertsort *sortblock = userData;
+
+ sortblock[index].x = x;
+}
void xsortvert_flag(int flag)
{
EditMesh *em = G.editMesh;
/* all verts with (flag & 'flag') are sorted */
EditVert *eve;
- struct xvertsort *sortblock, *sb;
+ xvertsort *sortblock;
ListBase tbase;
- int amount;
+ int i, amount = BLI_countlist(&em->verts);
- /* count */
- eve= em->verts.first;
- amount= 0;
- while(eve) {
- if(eve->f & flag) amount++;
- eve= eve->next;
- }
- if(amount==0) return;
-
- /* allocate memory and sort */
- sb= sortblock= (struct xvertsort *)MEM_mallocN(sizeof(struct xvertsort)*amount,"sortremovedoub");
- eve= em->verts.first;
- while(eve) {
- if(eve->f & flag) {
- sb->x= eve->xs;
- sb->v1= eve;
- sb++;
- }
- eve= eve->next;
- }
- qsort(sortblock, amount, sizeof(struct xvertsort), vergxco);
+ sortblock = MEM_callocN(sizeof(xvertsort)*amount,"xsort");
+ for (i=0,eve=em->verts.first; eve; i++,eve=eve->next)
+ if(eve->f & flag)
+ sortblock[i].v1 = eve;
+ mesh_foreachScreenVert(xsortvert_flag__doSetX, sortblock, 0);
+ qsort(sortblock, amount, sizeof(xvertsort), vergxco);
- /* make temporal listbase */
+ /* make temporal listbase */
tbase.first= tbase.last= 0;
- sb= sortblock;
- while(amount--) {
- eve= sb->v1;
- BLI_remlink(&em->verts, eve);
- BLI_addtail(&tbase, eve);
- sb++;
+ for (i=0; i<amount; i++) {
+ eve = sortblock[i].v1;
+
+ if (eve) {
+ BLI_remlink(&em->verts, eve);
+ BLI_addtail(&tbase, eve);
+ }
}
addlisttolist(&em->verts, &tbase);
diff --git a/source/blender/src/editview.c b/source/blender/src/editview.c
index 770d7287235..041aa894dcd 100644
--- a/source/blender/src/editview.c
+++ b/source/blender/src/editview.c
@@ -104,7 +104,48 @@ extern ListBase editNurb; /* originally from exports.h, memory from editcurve.c*
extern ListBase editelems;
/* local prototypes */
-void obedit_selectionCB(short , Object *, short *, float ); /* called in edit.c */
+
+void EM_backbuf_checkAndSelectVerts(EditMesh *em, int select)
+{
+ EditVert *eve;
+ int index= em_wireoffs;
+
+ for(eve= em->verts.first; eve; eve= eve->next, index++) {
+ if(eve->h==0) {
+ if(EM_check_backbuf(index)) {
+ eve->f = select?(eve->f|1):(eve->f&~1);
+ }
+ }
+ }
+}
+
+void EM_backbuf_checkAndSelectEdges(EditMesh *em, int select)
+{
+ EditEdge *eed;
+ int index= em_solidoffs;
+
+ for(eed= em->edges.first; eed; eed= eed->next, index++) {
+ if(eed->h==0) {
+ if(EM_check_backbuf(index)) {
+ EM_select_edge(eed, select);
+ }
+ }
+ }
+}
+
+void EM_backbuf_checkAndSelectFaces(EditMesh *em, int select)
+{
+ EditFace *efa;
+ int index= 1;
+
+ for(efa= em->faces.first; efa; efa= efa->next, index++) {
+ if(efa->h==0) {
+ if(EM_check_backbuf(index)) {
+ EM_select_face_fgon(efa, select);
+ }
+ }
+ }
+}
void arrows_move_cursor(unsigned short event)
{
@@ -126,36 +167,29 @@ void arrows_move_cursor(unsigned short event)
/* *********************** GESTURE AND LASSO ******************* */
/* helper also for borderselect */
-static int edge_fully_inside_rect(rcti rect, short x1, short y1, short x2, short y2)
+static int edge_fully_inside_rect(rcti *rect, short x1, short y1, short x2, short y2)
{
-
- // check points in rect
- if(rect.xmin<x1 && rect.xmax>x1 && rect.ymin<y1 && rect.ymax>y1)
- if(rect.xmin<x2 && rect.xmax>x2 && rect.ymin<y2 && rect.ymax>y2) return 1;
-
- return 0;
-
+ return BLI_in_rcti(rect, x1, y1) && BLI_in_rcti(rect, x2, y2);
}
-static int edge_inside_rect(rcti rect, short x1, short y1, short x2, short y2)
+static int edge_inside_rect(rcti *rect, short x1, short y1, short x2, short y2)
{
int d1, d2, d3, d4;
// check points in rect
- if(rect.xmin<x1 && rect.xmax>x1 && rect.ymin<y1 && rect.ymax>y1) return 1;
- if(rect.xmin<x2 && rect.xmax>x2 && rect.ymin<y2 && rect.ymax>y2) return 1;
+ if(edge_fully_inside_rect(rect, x1, y1, x2, y2)) return 1;
- /* check points completely out rect */
- if(x1<rect.xmin && x2<rect.xmin) return 0;
- if(x1>rect.xmax && x2>rect.xmax) return 0;
- if(y1<rect.ymin && y2<rect.ymin) return 0;
- if(y1>rect.ymax && y2>rect.ymax) return 0;
+ // check points completely out rect
+ if(x1<rect->xmin && x2<rect->xmin) return 0;
+ if(x1>rect->xmax && x2>rect->xmax) return 0;
+ if(y1<rect->ymin && y2<rect->ymin) return 0;
+ if(y1>rect->ymax && y2>rect->ymax) return 0;
// simple check lines intersecting.
- d1= (y1-y2)*(x1- rect.xmin ) + (x2-x1)*(y1- rect.ymin );
- d2= (y1-y2)*(x1- rect.xmin ) + (x2-x1)*(y1- rect.ymax );
- d3= (y1-y2)*(x1- rect.xmax ) + (x2-x1)*(y1- rect.ymax );
- d4= (y1-y2)*(x1- rect.xmax ) + (x2-x1)*(y1- rect.ymin );
+ d1= (y1-y2)*(x1- rect->xmin ) + (x2-x1)*(y1- rect->ymin );
+ d2= (y1-y2)*(x1- rect->xmin ) + (x2-x1)*(y1- rect->ymax );
+ d3= (y1-y2)*(x1- rect->xmax ) + (x2-x1)*(y1- rect->ymax );
+ d4= (y1-y2)*(x1- rect->xmax ) + (x2-x1)*(y1- rect->ymin );
if(d1<0 && d2<0 && d3<0 && d4<0) return 0;
if(d1>0 && d2>0 && d3>0 && d4>0) return 0;
@@ -212,10 +246,14 @@ static int lasso_inside(short mcords[][2], short moves, short sx, short sy)
}
/* edge version for lasso select. we assume boundbox check was done */
-static int lasso_inside_edge(short mcords[][2], short moves, short *v1, short *v2)
+static int lasso_inside_edge(short mcords[][2], short moves, int x0, int y0, int x1, int y1)
{
+ short v1[2], v2[2];
int a;
+ v1[0] = x0, v1[1] = y0;
+ v2[0] = x1, v2[1] = y1;
+
// check points in lasso
if(lasso_inside(mcords, moves, v1[0], v1[1])) return 1;
if(lasso_inside(mcords, moves, v2[0], v2[1])) return 1;
@@ -250,7 +288,7 @@ static void do_lasso_select_pose(Object *ob, short mcords[][2], short moves, sho
Mat4MulVecfl(ob->obmat, vec);
project_short(vec, sco2);
- if(lasso_inside_edge(mcords, moves, sco1, sco2)) {
+ if(lasso_inside_edge(mcords, moves, sco1[0], sco1[1], sco2[0], sco2[1])) {
if(select) pchan->bone->flag |= BONE_SELECTED;
else pchan->bone->flag &= ~(BONE_ACTIVE|BONE_SELECTED);
}
@@ -293,171 +331,138 @@ static void lasso_select_boundbox(rcti *rect, short mcords[][2], short moves)
}
}
+static void do_lasso_select_mesh__doSelectVert(void *userData, EditVert *eve, int x, int y, int index)
+{
+ struct { rcti *rect; short (*mcords)[2], moves, select, pass, done; } *data = userData;
+
+ if (BLI_in_rcti(data->rect, x, y) && lasso_inside(data->mcords, data->moves, x, y)) {
+ eve->f = data->select?(eve->f|1):(eve->f&~1);
+ }
+}
+static void do_lasso_select_mesh__doSelectEdge(void *userData, EditEdge *eed, int x0, int y0, int x1, int y1, int index)
+{
+ struct { rcti *rect; short (*mcords)[2], moves, select, pass, done; } *data = userData;
+
+ if (EM_check_backbuf(em_solidoffs+index)) {
+ if (data->pass==0) {
+ if ( edge_fully_inside_rect(data->rect, x0, y0, x1, y1) &&
+ lasso_inside(data->mcords, data->moves, x0, y0) &&
+ lasso_inside(data->mcords, data->moves, x1, y1)) {
+ EM_select_edge(eed, data->select);
+ data->done = 1;
+ }
+ } else {
+ if (lasso_inside_edge(data->mcords, data->moves, x0, y0, x1, y1)) {
+ EM_select_edge(eed, data->select);
+ }
+ }
+ }
+}
+static void do_lasso_select_mesh__doSelectFace(void *userData, EditFace *efa, int x, int y, int index)
+{
+ struct { rcti *rect; short (*mcords)[2], moves, select, pass, done; } *data = userData;
+
+ if (BLI_in_rcti(data->rect, x, y) && lasso_inside(data->mcords, data->moves, x, y)) {
+ EM_select_face_fgon(efa, data->select);
+ }
+}
+
static void do_lasso_select_mesh(short mcords[][2], short moves, short select)
{
+ struct { rcti *rect; short (*mcords)[2], moves, select, pass, done; } data;
EditMesh *em = G.editMesh;
- EditVert *eve;
- EditEdge *eed;
- EditFace *efa;
rcti rect;
- unsigned int index;
- int bbsel=0; // bbsel: no clip needed with screencoords
+ int bbsel;
lasso_select_boundbox(&rect, mcords, moves);
+ data.rect = &rect;
+ data.mcords = mcords;
+ data.moves = moves;
+ data.select = select;
+ data.done = 0;
+ data.pass = 0;
+
bbsel= EM_mask_init_backbuf_border(mcords, moves, rect.xmin, rect.ymin, rect.xmax, rect.ymax);
if(G.scene->selectmode & SCE_SELECT_VERTEX) {
- if(bbsel==0) calc_meshverts_ext(); /* clips, drawobject.c */
- index= em_wireoffs;
- for(eve= em->verts.first; eve; eve= eve->next, index++) {
- if(eve->h==0) {
- if(bbsel) {
- if(EM_check_backbuf_border(index)) {
- if(select) eve->f|= 1;
- else eve->f&= 254;
- }
- }
- else if(eve->xs>rect.xmin && eve->xs<rect.xmax && eve->ys>rect.ymin && eve->ys<rect.ymax) {
- if(lasso_inside(mcords, moves, eve->xs, eve->ys)) {
- if(select) eve->f|= 1;
- else eve->f&= 254;
- }
- }
- }
+ if (bbsel) {
+ EM_backbuf_checkAndSelectVerts(em, select);
+ } else {
+ mesh_foreachScreenVert(do_lasso_select_mesh__doSelectVert, &data, 1);
}
}
if(G.scene->selectmode & SCE_SELECT_EDGE) {
- short done= 0;
-
- calc_meshverts_ext_f2(); /* doesnt clip, drawobject.c */
- index= em_solidoffs;
-
- /* two stages, for nice edge select first do 'both points in rect'
- also when bbsel is true */
- for(eed= em->edges.first; eed; eed= eed->next, index++) {
- if(eed->h==0) {
- if(edge_fully_inside_rect(rect, eed->v1->xs, eed->v1->ys, eed->v2->xs, eed->v2->ys)) {
- if(lasso_inside(mcords, moves, eed->v1->xs, eed->v1->ys)) {
- if(lasso_inside(mcords, moves, eed->v2->xs, eed->v2->ys)) {
- if(EM_check_backbuf_border(index)) {
- EM_select_edge(eed, select);
- done = 1;
- }
- }
- }
- }
- }
- }
-
- if(done==0) {
- index= em_solidoffs;
- for(eed= em->edges.first; eed; eed= eed->next, index++) {
- if(eed->h==0) {
- if(bbsel) {
- if(EM_check_backbuf_border(index))
- EM_select_edge(eed, select);
- }
- else if(lasso_inside_edge(mcords, moves, &eed->v1->xs, &eed->v2->xs)) {
- EM_select_edge(eed, select);
- }
- }
- }
+ /* Does both bbsel and non-bbsel versions (need screen cos for both) */
+
+ data.pass = 0;
+ mesh_foreachScreenEdge(do_lasso_select_mesh__doSelectEdge, &data, 0);
+
+ if (data.done==0) {
+ data.pass = 1;
+ mesh_foreachScreenEdge(do_lasso_select_mesh__doSelectEdge, &data, 0);
}
}
if(G.scene->selectmode & SCE_SELECT_FACE) {
- if(bbsel==0) calc_mesh_facedots_ext();
- index= 1;
- for(efa= em->faces.first; efa; efa= efa->next, index++) {
- if(efa->h==0) {
- if(bbsel) {
- if(EM_check_backbuf_border(index)) {
- EM_select_face_fgon(efa, select);
- }
- }
- else if(efa->xs>rect.xmin && efa->xs<rect.xmax && efa->ys>rect.ymin && efa->ys<rect.ymax) {
- if(lasso_inside(mcords, moves, efa->xs, efa->ys)) {
- EM_select_face_fgon(efa, select);
- }
- }
- }
+ if (bbsel) {
+ EM_backbuf_checkAndSelectFaces(em, select);
+ } else {
+ mesh_foreachScreenFace(do_lasso_select_mesh__doSelectFace, &data);
}
}
- EM_free_backbuf_border();
- EM_selectmode_flush();
-
+ EM_free_backbuf();
+ EM_selectmode_flush();
}
-static void do_lasso_select_curve(short mcords[][2], short moves, short select)
+static void do_lasso_select_curve__doSelect(void *userData, Nurb *nu, BPoint *bp, BezTriple *bezt, int beztindex, int x, int y)
{
- Nurb *nu;
- BPoint *bp;
- BezTriple *bezt;
- int a;
-
- calc_nurbverts_ext(); /* drawobject.c */
- nu= editNurb.first;
- while(nu) {
- if((nu->type & 7)==CU_BEZIER) {
- bezt= nu->bezt;
- a= nu->pntsu;
- while(a--) {
- if(bezt->hide==0) {
- if(lasso_inside(mcords, moves, bezt->s[0][0], bezt->s[0][1])) {
- if(select) bezt->f1|= 1;
- else bezt->f1 &= ~1;
- }
- if(lasso_inside(mcords, moves, bezt->s[1][0], bezt->s[1][1])) {
- if(select) bezt->f2|= 1;
- else bezt->f2 &= ~1;
- }
- if(lasso_inside(mcords, moves, bezt->s[2][0], bezt->s[2][1])) {
- if(select) bezt->f3|= 1;
- else bezt->f3 &= ~1;
- }
- }
- bezt++;
+ struct { short (*mcords)[2]; short moves; short select; } *data = userData;
+
+ if (lasso_inside(data->mcords, data->moves, x, y)) {
+ if (bp) {
+ bp->f1 = data->select?(bp->f1|1):(bp->f1&~1);
+ } else {
+ if (beztindex==0) {
+ bezt->f1 = data->select?(bezt->f1|1):(bezt->f1&~1);
+ } else if (beztindex==1) {
+ bezt->f2 = data->select?(bezt->f2|1):(bezt->f2&~1);
+ } else {
+ bezt->f3 = data->select?(bezt->f3|1):(bezt->f3&~1);
}
}
- else {
- bp= nu->bp;
- a= nu->pntsu*nu->pntsv;
- while(a--) {
- if(bp->hide==0) {
- if(lasso_inside(mcords, moves, bp->s[0], bp->s[1])) {
- if(select) bp->f1|= 1;
- else bp->f1 &= ~1;
- }
- }
- bp++;
- }
- }
- nu= nu->next;
}
}
+static void do_lasso_select_curve(short mcords[][2], short moves, short select)
+{
+ struct { short (*mcords)[2]; short moves; short select; } data;
+
+ data.mcords = mcords;
+ data.moves = moves;
+ data.select = select;
+
+ nurbs_foreachScreenVert(do_lasso_select_curve__doSelect, &data);
+}
-static void do_lasso_select_lattice(short mcords[][2], short moves, short select)
+static void do_lasso_select_lattice__doSelect(void *userData, BPoint *bp, int x, int y)
{
- BPoint *bp;
- int a;
-
- calc_lattverts_ext();
-
- bp= editLatt->def;
-
- a= editLatt->pntsu*editLatt->pntsv*editLatt->pntsw;
- while(a--) {
- if(bp->hide==0) {
- if(lasso_inside(mcords, moves, bp->s[0], bp->s[1])) {
- if(select) bp->f1|= 1;
- else bp->f1 &= ~1;
- }
- }
- bp++;
+ struct { short (*mcords)[2]; short moves; short select; } *data = userData;
+
+ if (lasso_inside(data->mcords, data->moves, x, y)) {
+ bp->f1 = data->select?(bp->f1|1):(bp->f1&~1);
}
}
+static void do_lasso_select_lattice(short mcords[][2], short moves, short select)
+{
+ struct { short (*mcords)[2]; short moves; short select; } data;
+
+ data.mcords = mcords;
+ data.moves = moves;
+ data.select = select;
+
+ lattice_foreachScreenVert(do_lasso_select_lattice__doSelect, &data);
+}
static void do_lasso_select_armature(short mcords[][2], short moves, short select)
{
@@ -486,7 +491,7 @@ static void do_lasso_select_armature(short mcords[][2], short moves, short selec
didpoint= 1;
}
/* if one of points selected, we skip the bone itself */
- if(didpoint==0 && lasso_inside_edge(mcords, moves, sco1, sco2)) {
+ if(didpoint==0 && lasso_inside_edge(mcords, moves, sco1[0], sco1[1], sco2[0], sco2[1])) {
if(select) ebone->flag |= BONE_TIPSEL|BONE_ROOTSEL|BONE_SELECTED;
else ebone->flag &= ~(BONE_ACTIVE|BONE_SELECTED|BONE_TIPSEL|BONE_ROOTSEL);
}
@@ -512,13 +517,12 @@ static void do_lasso_select_facemode(short mcords[][2], short moves, short selec
EM_mask_init_backbuf_border(mcords, moves, rect.xmin, rect.ymin, rect.xmax, rect.ymax);
for(a=1; a<=me->totface; a++, tface++) {
- if(EM_check_backbuf_border(a)) {
- if(select) tface->flag |= TF_SELECT;
- else tface->flag &= ~TF_SELECT;
+ if(EM_check_backbuf(a)) {
+ tface->flag = select?(tface->flag|TF_SELECT):(tface->flag&~TF_SELECT);
}
}
- EM_free_backbuf_border();
+ EM_free_backbuf();
allqueue(REDRAWVIEW3D, 0);
allqueue(REDRAWIMAGE, 0);
@@ -1370,6 +1374,129 @@ static int edge_inside_circle(short centx, short centy, short rad, short x1, sho
return 0;
}
+static void do_nurbs_box_select__doSelect(void *userData, Nurb *nu, BPoint *bp, BezTriple *bezt, int beztindex, int x, int y)
+{
+ struct { rcti *rect; int select; } *data = userData;
+
+ if (BLI_in_rcti(data->rect, x, y)) {
+ if (bp) {
+ bp->f1 = data->select?(bp->f1|1):(bp->f1&~1);
+ } else {
+ if (beztindex==0) {
+ bezt->f1 = data->select?(bezt->f1|1):(bezt->f1&~1);
+ } else if (beztindex==1) {
+ bezt->f2 = data->select?(bezt->f2|1):(bezt->f2&~1);
+ } else {
+ bezt->f3 = data->select?(bezt->f3|1):(bezt->f3&~1);
+ }
+ }
+ }
+}
+static void do_nurbs_box_select(rcti *rect, int select)
+{
+ struct { rcti *rect; int select; } data;
+
+ data.rect = rect;
+ data.select = select;
+
+ nurbs_foreachScreenVert(do_nurbs_box_select__doSelect, &data);
+}
+
+static void do_lattice_box_select__doSelect(void *userData, BPoint *bp, int x, int y)
+{
+ struct { rcti *rect; int select; } *data = userData;
+
+ if (BLI_in_rcti(data->rect, x, y)) {
+ bp->f1 = data->select?(bp->f1|1):(bp->f1&~1);
+ }
+}
+static void do_lattice_box_select(rcti *rect, int select)
+{
+ struct { rcti *rect; short select, pass, done; } data;
+
+ data.rect = rect;
+ data.select = select;
+
+ lattice_foreachScreenVert(do_lattice_box_select__doSelect, &data);
+}
+
+static void do_mesh_box_select__doSelectVert(void *userData, EditVert *eve, int x, int y, int index)
+{
+ struct { rcti *rect; short select, pass, done; } *data = userData;
+
+ if (BLI_in_rcti(data->rect, x, y)) {
+ eve->f = data->select?(eve->f|1):(eve->f&~1);
+ }
+}
+static void do_mesh_box_select__doSelectEdge(void *userData, EditEdge *eed, int x0, int y0, int x1, int y1, int index)
+{
+ struct { rcti *rect; short select, pass, done; } *data = userData;
+
+ if(EM_check_backbuf(em_solidoffs+index)) {
+ if (data->pass==0) {
+ if (edge_fully_inside_rect(data->rect, x0, y0, x1, y1)) {
+ EM_select_edge(eed, data->select);
+ data->done = 1;
+ }
+ } else {
+ if (edge_inside_rect(data->rect, x0, y0, x1, y1)) {
+ EM_select_edge(eed, data->select);
+ }
+ }
+ }
+}
+static void do_mesh_box_select__doSelectFace(void *userData, EditFace *efa, int x, int y, int index)
+{
+ struct { rcti *rect; short select, pass, done; } *data = userData;
+
+ if (BLI_in_rcti(data->rect, x, y)) {
+ EM_select_face_fgon(efa, data->select);
+ }
+}
+static void do_mesh_box_select(rcti *rect, int select)
+{
+ struct { rcti *rect; short select, pass, done; } data;
+ EditMesh *em = G.editMesh;
+ int bbsel;
+
+ data.rect = rect;
+ data.select = select;
+ data.pass = 0;
+ data.done = 0;
+
+ bbsel= EM_init_backbuf_border(rect->xmin, rect->ymin, rect->xmax, rect->ymax);
+
+ if(G.scene->selectmode & SCE_SELECT_VERTEX) {
+ if (bbsel) {
+ EM_backbuf_checkAndSelectVerts(em, select);
+ } else {
+ mesh_foreachScreenVert(do_mesh_box_select__doSelectVert, &data, 1);
+ }
+ }
+ if(G.scene->selectmode & SCE_SELECT_EDGE) {
+ /* Does both bbsel and non-bbsel versions (need screen cos for both) */
+
+ data.pass = 0;
+ mesh_foreachScreenEdge(do_mesh_box_select__doSelectEdge, &data, 0);
+
+ if (data.done==0) {
+ data.pass = 1;
+ mesh_foreachScreenEdge(do_mesh_box_select__doSelectEdge, &data, 0);
+ }
+ }
+
+ if(G.scene->selectmode & SCE_SELECT_FACE) {
+ if(bbsel) {
+ EM_backbuf_checkAndSelectFaces(em, select);
+ } else {
+ mesh_foreachScreenFace(do_mesh_box_select__doSelectFace, &data);
+ }
+ }
+
+ EM_free_backbuf();
+
+ EM_selectmode_flush();
+}
/**
* Does the 'borderselect' command. (Select verts based on selecting with a
@@ -1379,9 +1506,6 @@ void borderselect(void)
{
rcti rect;
Base *base;
- Nurb *nu;
- BezTriple *bezt;
- BPoint *bp;
MetaElem *ml;
unsigned int buffer[MAXPICKBUF];
int a, index;
@@ -1401,135 +1525,11 @@ void borderselect(void)
if(G.obedit) {
if(G.obedit->type==OB_MESH) {
- EditMesh *em = G.editMesh;
- EditVert *eve;
- EditEdge *eed;
- EditFace *efa;
- int index, bbsel=0; // bbsel: no clip needed with screencoords
-
- bbsel= EM_init_backbuf_border(rect.xmin, rect.ymin, rect.xmax, rect.ymax);
-
- if(G.scene->selectmode & SCE_SELECT_VERTEX) {
- if(bbsel==0) calc_meshverts_ext(); /* clips, drawobject.c */
- index= em_wireoffs;
- for(eve= em->verts.first; eve; eve= eve->next, index++) {
- if(eve->h==0) {
- if(bbsel || (eve->xs>rect.xmin && eve->xs<rect.xmax && eve->ys>rect.ymin && eve->ys<rect.ymax)) {
- if(EM_check_backbuf_border(index)) {
- if(val==LEFTMOUSE) eve->f|= 1;
- else eve->f&= 254;
- }
- }
- }
- }
- }
- if(G.scene->selectmode & SCE_SELECT_EDGE) {
- short done= 0;
-
- calc_meshverts_ext_f2(); /* doesnt clip, drawobject.c */
- index= em_solidoffs;
- /* two stages, for nice edge select first do 'both points in rect'
- also when bbsel is true */
- for(eed= em->edges.first; eed; eed= eed->next, index++) {
- if(eed->h==0) {
- if(edge_fully_inside_rect(rect, eed->v1->xs, eed->v1->ys, eed->v2->xs, eed->v2->ys)) {
- if(EM_check_backbuf_border(index)) {
- EM_select_edge(eed, val==LEFTMOUSE);
- done = 1;
- }
- }
- }
- }
-
- if(done==0) {
- index= em_solidoffs;
- for(eed= em->edges.first; eed; eed= eed->next, index++) {
- if(eed->h==0) {
- if(bbsel) {
- if(EM_check_backbuf_border(index))
- EM_select_edge(eed, val==LEFTMOUSE);
- }
- else if(edge_inside_rect(rect, eed->v1->xs, eed->v1->ys, eed->v2->xs, eed->v2->ys)) {
- EM_select_edge(eed, val==LEFTMOUSE);
- }
- }
- }
- }
- }
-
- if(G.scene->selectmode & SCE_SELECT_FACE) {
- if(bbsel==0) calc_mesh_facedots_ext();
- index= 1;
- for(efa= em->faces.first; efa; efa= efa->next, index++) {
- if(efa->h==0) {
- if(bbsel || (efa->xs>rect.xmin && efa->xs<rect.xmax && efa->ys>rect.ymin && efa->ys<rect.ymax)) {
- if(EM_check_backbuf_border(index)) {
- EM_select_face_fgon(efa, val==LEFTMOUSE);
- }
- }
- }
- }
- }
-
- EM_free_backbuf_border();
-
- EM_selectmode_flush();
+ do_mesh_box_select(&rect, (val==LEFTMOUSE));
allqueue(REDRAWVIEW3D, 0);
-
}
else if ELEM(G.obedit->type, OB_CURVE, OB_SURF) {
-
- calc_nurbverts_ext(); /* drawobject.c */
- nu= editNurb.first;
- while(nu) {
- if((nu->type & 7)==CU_BEZIER) {
- bezt= nu->bezt;
- a= nu->pntsu;
- while(a--) {
- if(bezt->hide==0) {
- if(bezt->s[0][0]>rect.xmin && bezt->s[0][0]<rect.xmax) {
- if(bezt->s[0][1]>rect.ymin && bezt->s[0][1]<rect.ymax) {
- if(val==LEFTMOUSE) bezt->f1|= 1;
- else bezt->f1 &= ~1;
- }
- }
- if(bezt->s[1][0]>rect.xmin && bezt->s[1][0]<rect.xmax) {
- if(bezt->s[1][1]>rect.ymin && bezt->s[1][1]<rect.ymax) {
- if(val==LEFTMOUSE) {
- bezt->f1|= 1; bezt->f2|= 1; bezt->f3|= 1;
- }
- else {
- bezt->f1 &= ~1; bezt->f2 &= ~1; bezt->f3 &= ~1;
- }
- }
- }
- if(bezt->s[2][0]>rect.xmin && bezt->s[2][0]<rect.xmax) {
- if(bezt->s[2][1]>rect.ymin && bezt->s[2][1]<rect.ymax) {
- if(val==LEFTMOUSE) bezt->f3|= 1;
- else bezt->f3 &= ~1;
- }
- }
- }
- bezt++;
- }
- }
- else {
- bp= nu->bp;
- a= nu->pntsu*nu->pntsv;
- while(a--) {
- if(bp->hide==0) {
- if(bp->s[0]>rect.xmin && bp->s[0]<rect.xmax) {
- if(bp->s[1]>rect.ymin && bp->s[1]<rect.ymax) {
- if(val==LEFTMOUSE) bp->f1|= 1;
- else bp->f1 &= ~1;
- }
- }
- }
- bp++;
- }
- }
- nu= nu->next;
- }
+ do_nurbs_box_select(&rect, val==LEFTMOUSE);
allqueue(REDRAWVIEW3D, 0);
}
else if(G.obedit->type==OB_MBALL) {
@@ -1590,23 +1590,7 @@ void borderselect(void)
allqueue(REDRAWVIEW3D, 0);
}
else if(G.obedit->type==OB_LATTICE) {
-
- calc_lattverts_ext();
-
- bp= editLatt->def;
-
- a= editLatt->pntsu*editLatt->pntsv*editLatt->pntsw;
- while(a--) {
- if(bp->hide==0) {
- if(bp->s[0]>rect.xmin && bp->s[0]<rect.xmax) {
- if(bp->s[1]>rect.ymin && bp->s[1]<rect.ymax) {
- if(val==LEFTMOUSE) bp->f1|= 1;
- else bp->f1 &= ~1;
- }
- }
- }
- bp++;
- }
+ do_lattice_box_select(&rect, val==LEFTMOUSE);
allqueue(REDRAWVIEW3D, 0);
}
}
@@ -1704,177 +1688,129 @@ void borderselect(void)
XXX These callback functions are still dirty, because they call globals...
*/
+static void mesh_selectionCB__doSelectVert(void *userData, EditVert *eve, int x, int y, int index)
+{
+ struct { short select, mval[2]; float radius; } *data = userData;
+ int mx = x - data->mval[0], my = y - data->mval[1];
+ float r = sqrt(mx*mx + my*my);
+
+ if (r<=data->radius) {
+ eve->f = data->select?(eve->f|1):(eve->f&~1);
+ }
+}
+static void mesh_selectionCB__doSelectEdge(void *userData, EditEdge *eed, int x0, int y0, int x1, int y1, int index)
+{
+ struct { short select, mval[2]; float radius; } *data = userData;
+
+ if (edge_inside_circle(data->mval[0], data->mval[1], (short) data->radius, x0, y0, x1, y1)) {
+ EM_select_edge(eed, data->select);
+ }
+}
+static void mesh_selectionCB__doSelectFace(void *userData, EditFace *efa, int x, int y, int index)
+{
+ struct { short select, mval[2]; float radius; } *data = userData;
+ int mx = x - data->mval[0], my = y - data->mval[1];
+ float r = sqrt(mx*mx + my*my);
+
+ if (r<=data->radius) {
+ EM_select_face_fgon(efa, data->select);
+ }
+}
static void mesh_selectionCB(int selecting, Object *editobj, short *mval, float rad)
{
+ struct { short select, mval[2]; float radius; } data;
EditMesh *em = G.editMesh;
- EditVert *eve;
- EditEdge *eed;
- EditFace *efa;
- float x, y, r;
- int index, bbsel=0; // if bbsel we dont clip with screencoords
- short rads= (short)(rad+1.0);
+ int bbsel;
- bbsel= EM_init_backbuf_circle(mval[0], mval[1], rads);
+ bbsel= EM_init_backbuf_circle(mval[0], mval[1], (short)(rad+1.0));
+ data.select = (selecting==LEFTMOUSE);
+ data.mval[0] = mval[0];
+ data.mval[1] = mval[1];
+ data.radius = rad;
+
if(G.scene->selectmode & SCE_SELECT_VERTEX) {
- if(bbsel==0) calc_meshverts_ext(); /* drawobject.c */
- index= em_wireoffs;
- for(eve= em->verts.first; eve; eve= eve->next, index++) {
- if(eve->h==0) {
- if(bbsel) {
- if(EM_check_backbuf_border(index)) {
- if(selecting==LEFTMOUSE) eve->f|= 1;
- else eve->f&= 254;
- }
- }
- else {
- x= eve->xs-mval[0];
- y= eve->ys-mval[1];
- r= sqrt(x*x+y*y);
- if(r<=rad) {
- if(selecting==LEFTMOUSE) eve->f|= 1;
- else eve->f&= 254;
- }
- }
- }
+ if(bbsel) {
+ EM_backbuf_checkAndSelectVerts(em, selecting==LEFTMOUSE);
+ } else {
+ mesh_foreachScreenVert(mesh_selectionCB__doSelectVert, &data, 1);
}
}
if(G.scene->selectmode & SCE_SELECT_EDGE) {
- if(bbsel==0) calc_meshverts_ext_f2(); /* doesnt clip, drawobject.c */
- index= em_solidoffs;
- for(eed= em->edges.first; eed; eed= eed->next, index++) {
- if(eed->h==0) {
- if(bbsel || edge_inside_circle(mval[0], mval[1], (short)rad, eed->v1->xs, eed->v1->ys, eed->v2->xs, eed->v2->ys)) {
- if(EM_check_backbuf_border(index)) {
- EM_select_edge(eed, selecting==LEFTMOUSE);
- }
- }
- }
+ if (bbsel) {
+ EM_backbuf_checkAndSelectEdges(em, selecting==LEFTMOUSE);
+ } else {
+ mesh_foreachScreenEdge(mesh_selectionCB__doSelectEdge, &data, 0);
}
}
if(G.scene->selectmode & SCE_SELECT_FACE) {
- if(bbsel==0) calc_mesh_facedots_ext();
- index= 1;
- for(efa= em->faces.first; efa; efa= efa->next, index++) {
- if(efa->h==0) {
- if(bbsel) {
- if(EM_check_backbuf_border(index)) {
- EM_select_face_fgon(efa, selecting==LEFTMOUSE);
- }
- }
- else {
- x= efa->xs-mval[0];
- y= efa->ys-mval[1];
- r= sqrt(x*x+y*y);
- if(r<=rad) {
- EM_select_face_fgon(efa, selecting==LEFTMOUSE);
- }
- }
- }
+ if(bbsel) {
+ EM_backbuf_checkAndSelectFaces(em, selecting==LEFTMOUSE);
+ } else {
+ mesh_foreachScreenFace(mesh_selectionCB__doSelectFace, &data);
}
}
- EM_free_backbuf_border();
- EM_selectmode_flush();
-
- draw_sel_circle(0, 0, 0, 0, 0); /* signal */
- force_draw(0);
+ EM_free_backbuf();
+ EM_selectmode_flush();
}
-static void nurbscurve_selectionCB(int selecting, Object *editobj, short *mval, float rad)
+static void nurbscurve_selectionCB__doSelect(void *userData, Nurb *nu, BPoint *bp, BezTriple *bezt, int beztindex, int x, int y)
{
- Nurb *nu;
- BPoint *bp;
- BezTriple *bezt;
- float x, y, r;
- int a;
-
- calc_nurbverts_ext(); /* drawobject.c */
- nu= editNurb.first;
- while(nu) {
- if((nu->type & 7)==CU_BEZIER) {
- bezt= nu->bezt;
- a= nu->pntsu;
- while(a--) {
- if(bezt->hide==0) {
- x= bezt->s[0][0]-mval[0];
- y= bezt->s[0][1]-mval[1];
- r= sqrt(x*x+y*y);
- if(r<=rad) {
- if(selecting==LEFTMOUSE) bezt->f1|= 1;
- else bezt->f1 &= ~1;
- }
- x= bezt->s[1][0]-mval[0];
- y= bezt->s[1][1]-mval[1];
- r= sqrt(x*x+y*y);
- if(r<=rad) {
- if(selecting==LEFTMOUSE) bezt->f2|= 1;
- else bezt->f2 &= ~1;
- }
- x= bezt->s[2][0]-mval[0];
- y= bezt->s[2][1]-mval[1];
- r= sqrt(x*x+y*y);
- if(r<=rad) {
- if(selecting==LEFTMOUSE) bezt->f3|= 1;
- else bezt->f3 &= ~1;
- }
-
- }
- bezt++;
- }
- }
- else {
- bp= nu->bp;
- a= nu->pntsu*nu->pntsv;
- while(a--) {
- if(bp->hide==0) {
- x= bp->s[0]-mval[0];
- y= bp->s[1]-mval[1];
- r= sqrt(x*x+y*y);
- if(r<=rad) {
- if(selecting==LEFTMOUSE) bp->f1|= 1;
- else bp->f1 &= ~1;
- }
- }
- bp++;
+ struct { short select, mval[2]; float radius; } *data = userData;
+ int mx = x - data->mval[0], my = y - data->mval[1];
+ float r = sqrt(mx*mx + my*my);
+
+ if (r<=data->radius) {
+ if (bp) {
+ bp->f1 = data->select?(bp->f1|1):(bp->f1&~1);
+ } else {
+ if (beztindex==0) {
+ bezt->f1 = data->select?(bezt->f1|1):(bezt->f1&~1);
+ } else if (beztindex==1) {
+ bezt->f2 = data->select?(bezt->f2|1):(bezt->f2&~1);
+ } else {
+ bezt->f3 = data->select?(bezt->f3|1):(bezt->f3&~1);
}
}
- nu= nu->next;
}
- draw_sel_circle(0, 0, 0, 0, 0); /* signal */
- force_draw(0);
+}
+static void nurbscurve_selectionCB(int selecting, Object *editobj, short *mval, float rad)
+{
+ struct { short select, mval[2]; float radius; } data;
+ data.select = (selecting==LEFTMOUSE);
+ data.mval[0] = mval[0];
+ data.mval[1] = mval[1];
+ data.radius = rad;
+ nurbs_foreachScreenVert(nurbscurve_selectionCB__doSelect, &data);
}
+
+static void latticecurve_selectionCB__doSelect(void *userData, BPoint *bp, int x, int y)
+{
+ struct { short select, mval[2]; float radius; } *data = userData;
+ int mx = x - data->mval[0], my = y - data->mval[1];
+ float r = sqrt(mx*mx + my*my);
+
+ if (r<=data->radius) {
+ bp->f1 = data->select?(bp->f1|1):(bp->f1&~1);
+ }
+}
static void lattice_selectionCB(int selecting, Object *editobj, short *mval, float rad)
{
- BPoint *bp;
- float x, y, r;
- int a;
+ struct { short select, mval[2]; float radius; } data;
- calc_lattverts_ext();
-
- bp= editLatt->def;
+ data.select = (selecting==LEFTMOUSE);
+ data.mval[0] = mval[0];
+ data.mval[1] = mval[1];
+ data.radius = rad;
- a= editLatt->pntsu*editLatt->pntsv*editLatt->pntsw;
- while(a--) {
- if(bp->hide==0) {
- x= bp->s[0]-mval[0];
- y= bp->s[1]-mval[1];
- r= sqrt(x*x+y*y);
- if(r<=rad) {
- if(selecting==LEFTMOUSE) bp->f1|= 1;
- else bp->f1 &= ~1;
- }
- }
- bp++;
- }
- draw_sel_circle(0, 0, 0, 0, 0); /* signal */
- force_draw(0);
+ lattice_foreachScreenVert(latticecurve_selectionCB__doSelect, &data);
}
/** Callbacks for selection in Editmode */
@@ -1892,7 +1828,12 @@ void obedit_selectionCB(short selecting, Object *editobj, short *mval, float rad
case OB_LATTICE:
lattice_selectionCB(selecting, editobj, mval, rad);
break;
+ default:
+ return;
}
+
+ draw_sel_circle(0, 0, 0, 0, 0); /* signal */
+ force_draw(0);
}
void set_render_border(void)
diff --git a/source/blender/src/transform_manipulator.c b/source/blender/src/transform_manipulator.c
index 55dd981c576..c71abf15134 100644
--- a/source/blender/src/transform_manipulator.c
+++ b/source/blender/src/transform_manipulator.c
@@ -60,7 +60,6 @@
#include "DNA_view3d_types.h"
#include "BKE_armature.h"
-#include "BKE_DerivedMesh.h"
#include "BKE_global.h"
#include "BKE_lattice.h"
#include "BKE_object.h"
@@ -175,8 +174,6 @@ int calc_manipulator_stats(ScrArea *sa)
if((ob->lay & G.vd->lay)==0) return 0;
if(G.obedit->type==OB_MESH) {
- int dmNeedsFree;
- DerivedMesh *dm = editmesh_get_derived_cage(&dmNeedsFree);
EditMesh *em = G.editMesh;
EditVert *eve;
float vec[3];
@@ -201,8 +198,7 @@ int calc_manipulator_stats(ScrArea *sa)
if(no_faces) VECADD(normal, normal, eve->no);
totsel++;
- dm->getMappedVertCoEM(dm, eve, vec);
- calc_tw_center(vec);
+ calc_tw_center(eve->co);
}
}
/* the edge case... */
@@ -218,9 +214,6 @@ int calc_manipulator_stats(ScrArea *sa)
}
}
}
- if (dmNeedsFree) {
- dm->release(dm);
- }
}
else if (G.obedit->type==OB_ARMATURE){
EditBone *ebo;