forked from bartvdbraak/blender
=== Custom Transform Orientation ===
Switch away from using selected list in editmesh, since it isn't always up to date. This fixes the bug where CTO where not created correctly with box/lasso selecting elements and many others.
This commit is contained in:
parent
7ad378e0b3
commit
91439e7604
@ -234,10 +234,11 @@ int manageMeshSpace(int confirm, int set) {
|
|||||||
/* Vertice Selected */
|
/* Vertice Selected */
|
||||||
if (G.scene->selectmode & SCE_SELECT_VERTEX && (G.totvertsel == 1 || G.totvertsel == 2 || G.totvertsel == 3)) {
|
if (G.scene->selectmode & SCE_SELECT_VERTEX && (G.totvertsel == 1 || G.totvertsel == 2 || G.totvertsel == 3)) {
|
||||||
if (G.totvertsel == 1) {
|
if (G.totvertsel == 1) {
|
||||||
EditSelection *ese;
|
/* EditSelection *ese; */
|
||||||
EditVert *eve = NULL;
|
EditVert *eve = NULL;
|
||||||
float normal[3];
|
float normal[3];
|
||||||
|
|
||||||
|
/*
|
||||||
for (ese = em->selected.first; ese; ese = ese->next)
|
for (ese = em->selected.first; ese; ese = ese->next)
|
||||||
{
|
{
|
||||||
if ( ese->type == EDITVERT ) {
|
if ( ese->type == EDITVERT ) {
|
||||||
@ -245,6 +246,15 @@ int manageMeshSpace(int confirm, int set) {
|
|||||||
break;
|
break;
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
*/
|
||||||
|
|
||||||
|
for (eve = em->verts.first; eve; eve = eve->next)
|
||||||
|
{
|
||||||
|
if (eve->f & SELECT)
|
||||||
|
{
|
||||||
|
break;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
if (eve == NULL)
|
if (eve == NULL)
|
||||||
return -1;
|
return -1;
|
||||||
@ -264,10 +274,12 @@ int manageMeshSpace(int confirm, int set) {
|
|||||||
strcpy(name, "Vertex");
|
strcpy(name, "Vertex");
|
||||||
}
|
}
|
||||||
else if (G.totvertsel == 2) {
|
else if (G.totvertsel == 2) {
|
||||||
EditSelection *ese;
|
/* EditSelection *ese; */
|
||||||
|
EditVert *eve;
|
||||||
EditVert *v1 = NULL, *v2 = NULL;
|
EditVert *v1 = NULL, *v2 = NULL;
|
||||||
float normal[3];
|
float normal[3];
|
||||||
|
|
||||||
|
/*
|
||||||
for (ese = em->selected.first; ese; ese = ese->next)
|
for (ese = em->selected.first; ese; ese = ese->next)
|
||||||
{
|
{
|
||||||
if ( ese->type == EDITVERT ) {
|
if ( ese->type == EDITVERT ) {
|
||||||
@ -280,6 +292,20 @@ int manageMeshSpace(int confirm, int set) {
|
|||||||
}
|
}
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
*/
|
||||||
|
|
||||||
|
for (eve = em->verts.first; eve; eve = eve->next)
|
||||||
|
{
|
||||||
|
if ( eve->f & SELECT ) {
|
||||||
|
if (v1 == NULL) {
|
||||||
|
v1 = eve;
|
||||||
|
}
|
||||||
|
else {
|
||||||
|
v2 = eve;
|
||||||
|
break;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
if (v2 == NULL)
|
if (v2 == NULL)
|
||||||
return -1;
|
return -1;
|
||||||
@ -299,10 +325,12 @@ int manageMeshSpace(int confirm, int set) {
|
|||||||
strcpy(name, "Edge");
|
strcpy(name, "Edge");
|
||||||
}
|
}
|
||||||
else if (G.totvertsel == 3) {
|
else if (G.totvertsel == 3) {
|
||||||
EditSelection *ese;
|
/* EditSelection *ese; */
|
||||||
|
EditVert *eve;
|
||||||
EditVert *v1 = NULL, *v2 = NULL, *v3 = NULL;
|
EditVert *v1 = NULL, *v2 = NULL, *v3 = NULL;
|
||||||
float normal[3], tangent[3], cotangent[3];
|
float normal[3], tangent[3], cotangent[3];
|
||||||
|
|
||||||
|
/*
|
||||||
for (ese = em->selected.first; ese; ese = ese->next)
|
for (ese = em->selected.first; ese; ese = ese->next)
|
||||||
{
|
{
|
||||||
if ( ese->type == EDITVERT ) {
|
if ( ese->type == EDITVERT ) {
|
||||||
@ -318,6 +346,23 @@ int manageMeshSpace(int confirm, int set) {
|
|||||||
}
|
}
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
*/
|
||||||
|
|
||||||
|
for (eve = em->verts.first; eve; eve = eve->next)
|
||||||
|
{
|
||||||
|
if ( eve->f & SELECT ) {
|
||||||
|
if (v1 == NULL) {
|
||||||
|
v1 = eve;
|
||||||
|
}
|
||||||
|
else if (v2 == NULL) {
|
||||||
|
v2 = eve;
|
||||||
|
}
|
||||||
|
else {
|
||||||
|
v3 = eve;
|
||||||
|
break;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
if (v3 == NULL)
|
if (v3 == NULL)
|
||||||
return -1;
|
return -1;
|
||||||
@ -345,10 +390,11 @@ int manageMeshSpace(int confirm, int set) {
|
|||||||
/* Edge Selected */
|
/* Edge Selected */
|
||||||
else if(G.scene->selectmode & SCE_SELECT_EDGE && (G.totedgesel == 1 || G.totedgesel == 2)) {
|
else if(G.scene->selectmode & SCE_SELECT_EDGE && (G.totedgesel == 1 || G.totedgesel == 2)) {
|
||||||
if (G.totedgesel == 1) {
|
if (G.totedgesel == 1) {
|
||||||
EditSelection *ese;
|
/* EditSelection *ese; */
|
||||||
EditEdge *eed = NULL;
|
EditEdge *eed = NULL;
|
||||||
float normal[3];
|
float normal[3];
|
||||||
|
|
||||||
|
/*
|
||||||
for (ese = em->selected.first; ese; ese = ese->next)
|
for (ese = em->selected.first; ese; ese = ese->next)
|
||||||
{
|
{
|
||||||
if ( ese->type == EDITEDGE ) {
|
if ( ese->type == EDITEDGE ) {
|
||||||
@ -356,6 +402,14 @@ int manageMeshSpace(int confirm, int set) {
|
|||||||
break;
|
break;
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
*/
|
||||||
|
|
||||||
|
for (eed = em->edges.first; eed; eed = eed->next)
|
||||||
|
{
|
||||||
|
if ( eed->f & SELECT ) {
|
||||||
|
break;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
if (eed == NULL)
|
if (eed == NULL)
|
||||||
return -1;
|
return -1;
|
||||||
@ -376,11 +430,13 @@ int manageMeshSpace(int confirm, int set) {
|
|||||||
}
|
}
|
||||||
/* If selected edges form a triangle */
|
/* If selected edges form a triangle */
|
||||||
else if (G.totedgesel == 2 && G.totvertsel == 3) {
|
else if (G.totedgesel == 2 && G.totvertsel == 3) {
|
||||||
EditSelection *ese;
|
/* EditSelection *ese; */
|
||||||
|
EditEdge *eed;
|
||||||
EditEdge *e1 = NULL, *e2 = NULL;
|
EditEdge *e1 = NULL, *e2 = NULL;
|
||||||
EditVert *v1 = NULL, *v2 = NULL, *v3 = NULL;
|
EditVert *v1 = NULL, *v2 = NULL, *v3 = NULL;
|
||||||
float normal[3], tangent[3], cotangent[3];
|
float normal[3], tangent[3], cotangent[3];
|
||||||
|
|
||||||
|
/*
|
||||||
for (ese = em->selected.first; ese; ese = ese->next)
|
for (ese = em->selected.first; ese; ese = ese->next)
|
||||||
{
|
{
|
||||||
if ( ese->type == EDITEDGE ) {
|
if ( ese->type == EDITEDGE ) {
|
||||||
@ -393,6 +449,20 @@ int manageMeshSpace(int confirm, int set) {
|
|||||||
}
|
}
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
*/
|
||||||
|
|
||||||
|
for (eed = em->edges.first; eed; eed = eed->next)
|
||||||
|
{
|
||||||
|
if ( eed->f & SELECT ) {
|
||||||
|
if (e1 == NULL) {
|
||||||
|
e1 = eed;
|
||||||
|
}
|
||||||
|
else {
|
||||||
|
e2 = eed;
|
||||||
|
break;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
if (e1->v1 == e2->v1) {
|
if (e1->v1 == e2->v1) {
|
||||||
v1 = e1->v2;
|
v1 = e1->v2;
|
||||||
@ -440,14 +510,11 @@ int manageMeshSpace(int confirm, int set) {
|
|||||||
}
|
}
|
||||||
/* Face Selected */
|
/* Face Selected */
|
||||||
else if(G.scene->selectmode & SCE_SELECT_FACE && G.totfacesel == 1) {
|
else if(G.scene->selectmode & SCE_SELECT_FACE && G.totfacesel == 1) {
|
||||||
EditSelection *ese;
|
/* EditSelection *ese; */
|
||||||
EditFace *efa = NULL;
|
EditFace *efa = NULL;
|
||||||
float normal[3], tangent[3];
|
float normal[3], tangent[3];
|
||||||
|
|
||||||
if (confirm == 0 && confirmSpace(set, "Face") == 0) {
|
/*
|
||||||
return -1;
|
|
||||||
}
|
|
||||||
|
|
||||||
for (ese = em->selected.first; ese; ese = ese->next)
|
for (ese = em->selected.first; ese; ese = ese->next)
|
||||||
{
|
{
|
||||||
if ( ese->type == EDITFACE ) {
|
if ( ese->type == EDITFACE ) {
|
||||||
@ -455,10 +522,23 @@ int manageMeshSpace(int confirm, int set) {
|
|||||||
break;
|
break;
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
*/
|
||||||
|
|
||||||
|
for (efa = em->faces.first; efa; efa = efa->next)
|
||||||
|
{
|
||||||
|
if (efa->f & SELECT)
|
||||||
|
{
|
||||||
|
break;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
if (efa == NULL)
|
if (efa == NULL)
|
||||||
return -1;
|
return -1;
|
||||||
|
|
||||||
|
if (confirm == 0 && confirmSpace(set, "Face") == 0) {
|
||||||
|
return -1;
|
||||||
|
}
|
||||||
|
|
||||||
VECCOPY(normal, efa->n);
|
VECCOPY(normal, efa->n);
|
||||||
VecSubf(tangent, efa->v2->co, efa->v1->co);
|
VecSubf(tangent, efa->v2->co, efa->v1->co);
|
||||||
|
|
||||||
|
Loading…
Reference in New Issue
Block a user