diff options
author | Martin Poirier <theeth@yahoo.com> | 2008-02-18 01:19:02 +0300 |
---|---|---|
committer | Martin Poirier <theeth@yahoo.com> | 2008-02-18 01:19:02 +0300 |
commit | 83ddab60b72b693faa77068d77eb35f5555b81d2 (patch) | |
tree | 1442000f4bf7ba64fb26b376a7299b3a72bb5713 /source/blender/src/transform.c | |
parent | 417687c4ff052fccd6b8da3931fc85d231504773 (diff) |
== Transform Orientations ==
Merge Normal orientation calculations with Custom Orientations, to make it work the same all accross the table:
- One or more faces: use average face normal (first edge of faces define tangent)
- One edge: use edge itself as normal (vertex normals define tangent)
- One vertex: use vertex normal (tangent is perpendicular to normal and z-axis)
- Two vertices => edge orientation
- Two vertices => face orientation
*I tested quite a bit but please report any bugs this might have caused.*
ADDED FILE WARNING: source/blender/src/transform_orientations.c
Diffstat (limited to 'source/blender/src/transform.c')
-rw-r--r-- | source/blender/src/transform.c | 579 |
1 files changed, 0 insertions, 579 deletions
diff --git a/source/blender/src/transform.c b/source/blender/src/transform.c index 8f8601da88e..87ca52dcfad 100644 --- a/source/blender/src/transform.c +++ b/source/blender/src/transform.c @@ -57,8 +57,6 @@ #include "DNA_object_types.h" #include "DNA_scene_types.h" /* PET modes */ #include "DNA_screen_types.h" /* area dimensions */ -#include "DNA_scene_types.h" -#include "DNA_screen_types.h" #include "DNA_texture_types.h" #include "DNA_userdef_types.h" #include "DNA_view3d_types.h" @@ -158,584 +156,7 @@ static void helpline(TransInfo *t, float *vec) } } -/* *********************** TransSpace ************************** */ - -void BIF_clearTransformOrientation(void) -{ - ListBase *transform_spaces = &G.scene->transform_spaces; - BLI_freelistN(transform_spaces); - - if (G.vd->twmode >= V3D_MANIP_CUSTOM) - G.vd->twmode = V3D_MANIP_GLOBAL; /* fallback to global */ -} - -void BIF_manageTransformOrientation(int confirm, int set) { - int index = -1; - - if (G.obedit) { - if (G.obedit->type == OB_MESH) - index = manageMeshSpace(confirm, set); - } - else { - index = manageObjectSpace(confirm, set); - } - - if (set && index != -1) - { - BIF_selectTransformOrientationFromIndex(index); - } -} - -int manageObjectSpace(int confirm, int set) { - Base *base = BASACT; - - if (base == NULL) - return -1; - - if (confirm == 0) { - if (set && pupmenu("Custom Orientation %t|Add and Use Active Object%x1") != 1) { - return -1; - } - else if (set == 0 && pupmenu("Custom Orientation %t|Add Active Object%x1") != 1) { - return -1; - } - } - - return addObjectSpace(base->object); -} -/* return 1 on confirm */ -int confirmSpace(int set, char text[]) -{ - char menu[64]; - - if (set) { - sprintf(menu, "Custom Orientation %%t|Add and Use %s%%x1", text); - } - else { - sprintf(menu, "Custom Orientation %%t|Add %s%%x1", text); - } - - if (pupmenu(menu) == 1) { - return 1; - } - else { - return 0; - } -} - - -int manageMeshSpace(int confirm, int set) { - EditMesh *em = G.editMesh; - float mat[3][3]; - char name[36] = ""; - int index; - - /* Vertice Selected */ - if (G.scene->selectmode & SCE_SELECT_VERTEX && (G.totvertsel == 1 || G.totvertsel == 2 || G.totvertsel == 3)) { - if (G.totvertsel == 1) { - /* EditSelection *ese; */ - EditVert *eve = NULL; - float normal[3]; - - /* - for (ese = em->selected.first; ese; ese = ese->next) - { - if ( ese->type == EDITVERT ) { - eve = (EditVert *)ese->data; - break; - } - } - */ - - for (eve = em->verts.first; eve; eve = eve->next) - { - if (eve->f & SELECT) - { - break; - } - } - - if (eve == NULL) - return -1; - - if (confirm == 0 && confirmSpace(set, "vertex") == 0) { - return -1; - } - - VECCOPY(normal, eve->no); - Mat4Mul3Vecfl(G.obedit->obmat, normal); - - if (createSpaceNormal(mat, normal) == 0) { - error("Cannot use vertex with zero-length normal"); - return -1; - } - - strcpy(name, "Vertex"); - } - else if (G.totvertsel == 2) { - /* EditSelection *ese; */ - EditVert *eve; - EditVert *v1 = NULL, *v2 = NULL; - float normal[3]; - - /* - for (ese = em->selected.first; ese; ese = ese->next) - { - if ( ese->type == EDITVERT ) { - if (v1 == NULL) { - v1 = (EditVert *)ese->data; - } - else { - v2 = (EditVert *)ese->data; - break; - } - } - } - */ - - 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) - return -1; - - if (confirm == 0 && confirmSpace(set, "Edge") == 0) { - return -1; - } - - VecSubf(normal, v2->co, v1->co); - Mat4Mul3Vecfl(G.obedit->obmat, normal); - - if (createSpaceNormal(mat, normal) == 0) { - error("Cannot use zero-length edge"); - return -1; - } - - strcpy(name, "Edge"); - } - else if (G.totvertsel == 3) { - /* EditSelection *ese; */ - EditVert *eve; - EditVert *v1 = NULL, *v2 = NULL, *v3 = NULL; - float normal[3], tangent[3], cotangent[3]; - - /* - for (ese = em->selected.first; ese; ese = ese->next) - { - if ( ese->type == EDITVERT ) { - if (v1 == NULL) { - v1 = (EditVert *)ese->data; - } - else if (v2 == NULL) { - v2 = (EditVert *)ese->data; - } - else { - v3 = (EditVert *)ese->data; - break; - } - } - } - */ - - 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) - return -1; - - if (confirm == 0 && confirmSpace(set, "Face") == 0) { - return -1; - } - - VecSubf(tangent, v2->co, v1->co); - VecSubf(cotangent, v3->co, v2->co); - Crossf(normal, cotangent, tangent); - - Mat4Mul3Vecfl(G.obedit->obmat, normal); - Mat4Mul3Vecfl(G.obedit->obmat, tangent); - - if (createSpaceNormal(mat, normal) == 0) { - error("Cannot use zero-area face"); - return -1; - } - - strcpy(name, "Face"); - } - - } - /* Edge Selected */ - else if(G.scene->selectmode & SCE_SELECT_EDGE && (G.totedgesel == 1 || G.totedgesel == 2)) { - if (G.totedgesel == 1) { - /* EditSelection *ese; */ - EditEdge *eed = NULL; - float normal[3]; - - /* - for (ese = em->selected.first; ese; ese = ese->next) - { - if ( ese->type == EDITEDGE ) { - eed = (EditEdge *)ese->data; - break; - } - } - */ - - for (eed = em->edges.first; eed; eed = eed->next) - { - if ( eed->f & SELECT ) { - break; - } - } - - if (eed == NULL) - return -1; - - if (confirm == 0 && confirmSpace(set, "Edge") == 0) { - return -1; - } - - VecSubf(normal, eed->v2->co, eed->v1->co); - Mat4Mul3Vecfl(G.obedit->obmat, normal); - - if (createSpaceNormal(mat, normal) == 0) { - error("Cannot use zero-length edge"); - return -1; - } - - strcpy(name, "Edge"); - } - /* If selected edges form a triangle */ - else if (G.totedgesel == 2 && G.totvertsel == 3) { - /* EditSelection *ese; */ - EditEdge *eed; - EditEdge *e1 = NULL, *e2 = NULL; - EditVert *v1 = NULL, *v2 = NULL, *v3 = NULL; - float normal[3], tangent[3], cotangent[3]; - - /* - for (ese = em->selected.first; ese; ese = ese->next) - { - if ( ese->type == EDITEDGE ) { - if (e1 == NULL) { - e1 = (EditEdge *)ese->data; - } - else { - e2 = (EditEdge *)ese->data; - break; - } - } - } - */ - - 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) { - v1 = e1->v2; - v2 = e1->v1; - v3 = e2->v2; - } - else if (e1->v1 == e2->v2) { - v1 = e1->v2; - v2 = e1->v1; - v3 = e2->v1; - } - else if (e1->v2 == e2->v1) { - v1 = e1->v1; - v2 = e1->v2; - v3 = e2->v2; - } - else if (e1->v2 == e2->v2) { - v1 = e1->v1; - v2 = e1->v2; - v3 = e2->v1; - } - - if (v1 == NULL) - return -1; - - if (confirm == 0 && confirmSpace(set, "Face") == 0) { - return -1; - } - - VecSubf(tangent, v2->co, v1->co); - VecSubf(cotangent, v3->co, v2->co); - Crossf(normal, cotangent, tangent); - - Mat4Mul3Vecfl(G.obedit->obmat, normal); - Mat4Mul3Vecfl(G.obedit->obmat, tangent); - - if (createSpaceNormal(mat, normal) == 0) { - error("Cannot use zero-area face"); - return -1; - } - - strcpy(name, "Face"); - } - - } - /* Face Selected */ - else if(G.scene->selectmode & SCE_SELECT_FACE && G.totfacesel == 1) { - /* EditSelection *ese; */ - EditFace *efa = NULL; - float normal[3], tangent[3]; - - /* - for (ese = em->selected.first; ese; ese = ese->next) - { - if ( ese->type == EDITFACE ) { - efa = (EditFace *)ese->data; - break; - } - } - */ - - for (efa = em->faces.first; efa; efa = efa->next) - { - if (efa->f & SELECT) - { - break; - } - } - - if (efa == NULL) - return -1; - - if (confirm == 0 && confirmSpace(set, "Face") == 0) { - return -1; - } - - VECCOPY(normal, efa->n); - VecSubf(tangent, efa->v2->co, efa->v1->co); - - Mat4Mul3Vecfl(G.obedit->obmat, normal); - Mat4Mul3Vecfl(G.obedit->obmat, tangent); - - if (createSpaceNormalTangent(mat, normal, tangent) == 0) { - error("Cannot use zero-area face"); - return -1; - } - - strcpy(name, "Face"); - } - else { - return -1; - } - - /* Input name */ - sbutton(name, 1, 35, "name: "); - - index = addMatrixSpace(mat, name); - return index; -} - -int createSpaceNormal(float mat[3][3], float normal[3]) -{ - float tangent[3] = {0.0f, 0.0f, 1.0f}; - - VECCOPY(mat[2], normal); - if (Normalize(mat[2]) == 0.0f) { - return 0; /* error return */ - } - - Crossf(mat[0], mat[2], tangent); - if (Inpf(mat[0], mat[0]) == 0.0f) { - tangent[0] = 1.0f; - tangent[1] = tangent[2] = 0.0f; - Crossf(mat[0], tangent, mat[2]); - } - - Crossf(mat[1], mat[2], mat[0]); - - Mat3Ortho(mat); - - return 1; -} - -int createSpaceNormalTangent(float mat[3][3], float normal[3], float tangent[3]) -{ - VECCOPY(mat[2], normal); - if (Normalize(mat[2]) == 0.0f) { - return 0; /* error return */ - } - - Crossf(mat[0], mat[2], tangent); - if (Normalize(mat[0]) == 0.0f) { - return 0; /* error return */ - } - - Crossf(mat[1], mat[2], mat[0]); - - Mat3Ortho(mat); - - return 1; -} - - -int addObjectSpace(Object *ob) { - float mat[3][3]; - char name[36] = ""; - - Mat3CpyMat4(mat, ob->obmat); - Mat3Ortho(mat); - - strncpy(name, ob->id.name+2, 35); - - /* Input name */ - sbutton(name, 1, 35, "name: "); - - return addMatrixSpace(mat, name); -} - -int addMatrixSpace(float mat[3][3], char name[]) { - ListBase *transform_spaces = &G.scene->transform_spaces; - TransformOrientation *ts; - int index = 0; - - /* if name is found in list, reuse that transform space */ - for (index = 0, ts = transform_spaces->first; ts; ts = ts->next, index++) { - if (strncmp(ts->name, name, 35) == 0) { - break; - } - } - - /* if not, create a new one */ - if (ts == NULL) - { - ts = MEM_callocN(sizeof(TransformOrientation), "UserTransSpace from matrix"); - BLI_addtail(transform_spaces, ts); - strncpy(ts->name, name, 35); - } - - /* copy matrix into transform space */ - Mat3CpyMat3(ts->mat, mat); - - BIF_undo_push("Add/Update Transform Orientation"); - - return index; -} - -void BIF_removeTransformOrientation(TransformOrientation *target) { - ListBase *transform_spaces = &G.scene->transform_spaces; - TransformOrientation *ts = transform_spaces->first; - int selected_index = (G.vd->twmode - V3D_MANIP_CUSTOM); - int i; - - for (i = 0, ts = transform_spaces->first; ts; ts = ts->next, i++) { - if (ts == target) { - if (selected_index == i) { - G.vd->twmode = V3D_MANIP_GLOBAL; /* fallback to global */ - } - else if (selected_index > i) - G.vd->twmode--; - - BLI_freelinkN(transform_spaces, ts); - break; - } - } - BIF_undo_push("Remove Transform Orientation"); -} - -void BIF_selectTransformOrientation(TransformOrientation *target) { - ListBase *transform_spaces = &G.scene->transform_spaces; - TransformOrientation *ts = transform_spaces->first; - int i; - - for (i = 0, ts = transform_spaces->first; ts; ts = ts->next, i++) { - if (ts == target) { - G.vd->twmode = V3D_MANIP_CUSTOM + i; - break; - } - } -} - -void BIF_selectTransformOrientationFromIndex(int index) { - G.vd->twmode = V3D_MANIP_CUSTOM + index; -} - -char * BIF_menustringTransformOrientation() { - char menu[] = "Orientation%t|Global%x0|Local%x1|Normal%x2|View%x3"; - ListBase *transform_spaces = &G.scene->transform_spaces; - TransformOrientation *ts; - int i = V3D_MANIP_CUSTOM; - char *str_menu, *p; - - - str_menu = MEM_callocN(strlen(menu) + 40 * BIF_countTransformOrientation(), "UserTransSpace from matrix"); - p = str_menu; - - p += sprintf(str_menu, "%s", menu); - - for (ts = transform_spaces->first; ts; ts = ts->next) { - p += sprintf(p, "|%s%%x%d", ts->name, i++); - } - - return str_menu; -} - -int BIF_countTransformOrientation() { - ListBase *transform_spaces = &G.scene->transform_spaces; - TransformOrientation *ts; - int count = 0; - - for (ts = transform_spaces->first; ts; ts = ts->next) { - count++; - } - - return count; -} - -void applyTransformOrientation() { - TransInfo *t = BIF_GetTransInfo(); - TransformOrientation *ts; - int selected_index = (G.vd->twmode - V3D_MANIP_CUSTOM); - int i; - - if (selected_index >= 0) { - for (i = 0, ts = G.scene->transform_spaces.first; ts; ts = ts->next, i++) { - if (selected_index == i) { - strcpy(t->spacename, ts->name); - Mat3CpyMat3(t->spacemtx, ts->mat); - Mat4CpyMat3(G.vd->twmat, ts->mat); - break; - } - } - } -} /* ************************** INPUT FROM MOUSE *************************** */ |