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:
authorMartin Poirier <theeth@yahoo.com>2008-02-18 01:19:02 +0300
committerMartin Poirier <theeth@yahoo.com>2008-02-18 01:19:02 +0300
commit83ddab60b72b693faa77068d77eb35f5555b81d2 (patch)
tree1442000f4bf7ba64fb26b376a7299b3a72bb5713 /source/blender/src/transform.c
parent417687c4ff052fccd6b8da3931fc85d231504773 (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.c579
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 *************************** */