[Bf-blender-cvs] SVN commit: /data/svn/bf-blender [13738] trunk/blender/source/blender: == Transform Orientations ==

Martin Poirier theeth at yahoo.com
Sun Feb 17 23:19:03 CET 2008


Revision: 13738
          http://projects.blender.org/plugins/scmsvn/viewcvs.php?view=rev&root=bf-blender&revision=13738
Author:   theeth
Date:     2008-02-17 23:19:02 +0100 (Sun, 17 Feb 2008)

Log Message:
-----------
== 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

Modified Paths:
--------------
    trunk/blender/source/blender/include/transform.h
    trunk/blender/source/blender/src/transform.c
    trunk/blender/source/blender/src/transform_manipulator.c

Added Paths:
-----------
    trunk/blender/source/blender/src/transform_orientations.c

Modified: trunk/blender/source/blender/include/transform.h
===================================================================
--- trunk/blender/source/blender/include/transform.h	2008-02-17 22:11:05 UTC (rev 13737)
+++ trunk/blender/source/blender/include/transform.h	2008-02-17 22:19:02 UTC (rev 13738)
@@ -481,6 +481,17 @@
 int addObjectSpace(struct Object *ob);
 void applyTransformOrientation(void);
 
+
+#define ORIENTATION_NONE	0
+#define ORIENTATION_NORMAL	1
+#define ORIENTATION_VERT	2
+#define ORIENTATION_EDGE	3
+#define ORIENTATION_FACE	4
+
+int getTransformOrientation(float normal[3], float plane[3], int activeOnly);
+int createSpaceNormal(float mat[3][3], float normal[3]);
+int createSpaceNormalTangent(float mat[3][3], float normal[3], float tangent[3]);
+
 #endif
 
 

Modified: trunk/blender/source/blender/src/transform.c
===================================================================
--- trunk/blender/source/blender/src/transform.c	2008-02-17 22:11:05 UTC (rev 13737)
+++ trunk/blender/source/blender/src/transform.c	2008-02-17 22:19:02 UTC (rev 13738)
@@ -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 @@
 	}
 }
 
-/* *********************** 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);
-}
-

@@ Diff output truncated at 10240 characters. @@




More information about the Bf-blender-cvs mailing list