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>2005-06-28 11:58:16 +0400
committerMartin Poirier <theeth@yahoo.com>2005-06-28 11:58:16 +0400
commita344dca9cfb1262f375483cb89c716019f44a782 (patch)
tree4abb3c0ec36b735676b02a175bcfe10d3a1ef864 /source/blender/src/transform_constraints.c
parent12d10f45ea4818fb1eb203c6e655aee24cc51c00 (diff)
Transform stuff
Cleanup in transform.c: removed uneeded includes and removed REPEAT experiment. Split off manipulator init function, no need to resort on hacks to setup stuff before starting transform anymore. Fix0r3d single axis projection for constraints. It deals with perspective correctly now (as much as planar constraints).
Diffstat (limited to 'source/blender/src/transform_constraints.c')
-rwxr-xr-xsource/blender/src/transform_constraints.c100
1 files changed, 38 insertions, 62 deletions
diff --git a/source/blender/src/transform_constraints.c b/source/blender/src/transform_constraints.c
index 063f4ed6b57..3714b48fd40 100755
--- a/source/blender/src/transform_constraints.c
+++ b/source/blender/src/transform_constraints.c
@@ -32,7 +32,6 @@
#include <stdlib.h>
#include <string.h>
-#include <math.h>
#ifdef HAVE_CONFIG_H
#include <config.h>
@@ -44,58 +43,24 @@
#include <io.h>
#endif
-#include "MEM_guardedalloc.h"
-
-#include "DNA_action_types.h"
-#include "DNA_armature_types.h"
-#include "DNA_camera_types.h"
-#include "DNA_curve_types.h"
-#include "DNA_effect_types.h"
-#include "DNA_ika_types.h"
-#include "DNA_image_types.h"
-#include "DNA_ipo_types.h"
-#include "DNA_key_types.h"
-#include "DNA_lamp_types.h"
-#include "DNA_lattice_types.h"
-#include "DNA_mesh_types.h"
-#include "DNA_meshdata_types.h"
-#include "DNA_meta_types.h"
#include "DNA_object_types.h"
#include "DNA_scene_types.h"
#include "DNA_screen_types.h"
-#include "DNA_texture_types.h"
#include "DNA_view3d_types.h"
-#include "DNA_world_types.h"
-#include "DNA_userdef_types.h"
-#include "DNA_property_types.h"
-#include "DNA_vfont_types.h"
-#include "DNA_constraint_types.h"
#include "BIF_screen.h"
-#include "BIF_space.h"
-#include "BIF_editview.h"
#include "BIF_resources.h"
#include "BIF_mywindow.h"
#include "BIF_gl.h"
-#include "BIF_editlattice.h"
-#include "BIF_editarmature.h"
-#include "BIF_editmesh.h"
#include "BKE_global.h"
-#include "BKE_object.h"
#include "BKE_utildefines.h"
-#include "BKE_lattice.h"
-#include "BKE_armature.h"
-#include "BKE_curve.h"
-#include "BKE_displist.h"
#include "BSE_view.h"
-#include "BSE_edit.h"
#include "BLI_arithb.h"
-#include "BLI_editVert.h"
-#include "BDR_drawobject.h"
+#include "BDR_drawobject.h" /* drawcircball */
#include "blendef.h"
@@ -188,22 +153,12 @@ static void postConstraintChecks(TransInfo *t, float vec[3], float pvec[3]) {
static void axisProjection(TransInfo *t, float axis[3], float in[3], float out[3]) {
- float norm[3], n[3], vec[3], factor;
-
- VecAddf(vec, in, t->con.center);
- getViewVector(vec, norm);
-
- Normalise(axis);
-
- VECCOPY(n, axis);
- Mat4MulVecfl(t->viewmat, n);
- n[2] = t->viewmat[3][2];
- Mat4MulVecfl(t->viewinv, n);
+ float norm[3], n[3], n2[3], vec[3], factor;
/* For when view is parallel to constraint... will cause NaNs otherwise
So we take vertical motion in 3D space and apply it to the
constraint axis. Nice for camera grab + MMB */
- if(n[0]*n[0] + n[1]*n[1] + n[2]*n[2] < 0.000001f) {
+ if(1.0f - Inpf(axis, t->viewinv[2]) < 0.000001f) {
Projf(vec, in, t->viewinv[1]);
factor = Inpf(t->viewinv[1], vec) * 2.0f;
/* since camera distance is quite relative, use quadratic relationship. holding shift can compensate */
@@ -217,11 +172,24 @@ static void axisProjection(TransInfo *t, float axis[3], float in[3], float out[3
else {
// prevent division by zero, happens on constrainting without initial delta transform */
if(in[0]!=0.0f || in[1]!=0.0f || in[2]!=0.0) {
- Projf(vec, in, n);
- factor = Normalise(vec);
- // prevent NaN for 0.0/0.0
- if(factor!=0.0f)
- factor /= Inpf(axis, vec);
+ /* project axis on viewplane */
+ Projf(vec, axis, t->viewinv[2]);
+ VecSubf(vec, axis, vec);
+ /* project input on the new axis */
+ Projf(vec, in, vec);
+ /* get view vector on that point (account for perspective) */
+ VecAddf(vec, vec, t->con.center);
+ getViewVector(vec, norm);
+
+ /* cross product twice to get a full space definition */
+ Crossf(n, axis, norm);
+ Crossf(n2, norm, n);
+
+ /* Project input on plane perpendicular to the axis (as drawn on screen) */
+ Projf(vec, in, n2);
+
+ /* Adjust output */
+ factor = Inpf(vec, vec) / Inpf(axis, vec);
VecMulf(axis, factor);
VECCOPY(out, axis);
@@ -230,23 +198,19 @@ static void axisProjection(TransInfo *t, float axis[3], float in[3], float out[3
}
static void planeProjection(TransInfo *t, float in[3], float out[3]) {
- float vec[3], factor, angle, norm[3];
+ float vec[3], factor, norm[3];
VecAddf(vec, in, t->con.center);
getViewVector(vec, norm);
VecSubf(vec, out, in);
- factor = Normalise(vec);
- angle = Inpf(vec, norm);
- if (angle * angle >= 0.000001f) {
- factor /= angle;
+ factor = Inpf(vec, vec) / Inpf(vec, norm);
- VECCOPY(vec, norm);
- VecMulf(vec, factor);
+ VECCOPY(vec, norm);
+ VecMulf(vec, factor);
- VecAddf(out, in, vec);
- }
+ VecAddf(out, in, vec);
}
/*
@@ -326,6 +290,18 @@ static void applyObjectConstraintVec(TransInfo *t, TransData *td, float in[3], f
VECCOPY(out, pvec);
}
else {
+ int i=0;
+
+ out[0] = out[1] = out[2] = 0.0f;
+ if (t->con.mode & CON_AXIS0) {
+ out[0] = in[i++];
+ }
+ if (t->con.mode & CON_AXIS1) {
+ out[1] = in[i++];
+ }
+ if (t->con.mode & CON_AXIS2) {
+ out[2] = in[i++];
+ }
Mat3MulVecfl(td->axismtx, out);
}
}