[Bf-blender-cvs] SVN commit: /data/svn/bf-blender [15513] branches/blender-2.47: Snappiness merged from trunk:

Martin Poirier theeth at yahoo.com
Thu Jul 10 02:09:43 CEST 2008


Revision: 15513
          http://projects.blender.org/plugins/scmsvn/viewcvs.php?view=rev&root=bf-blender&revision=15513
Author:   theeth
Date:     2008-07-10 02:09:43 +0200 (Thu, 10 Jul 2008)

Log Message:
-----------
Snappiness merged from trunk:
	15455
	15323
	15322
	15279
	15243
	15235
	15180
	15179
	15178
	15177
	15176

Modified Paths:
--------------
    branches/blender-2.47/release/datafiles/blenderbuttons
    branches/blender-2.47/source/blender/blenkernel/BKE_object.h
    branches/blender-2.47/source/blender/blenkernel/intern/object.c
    branches/blender-2.47/source/blender/blenlib/BLI_arithb.h
    branches/blender-2.47/source/blender/blenlib/intern/arithb.c
    branches/blender-2.47/source/blender/include/BIF_resources.h
    branches/blender-2.47/source/blender/include/BSE_view.h
    branches/blender-2.47/source/blender/include/transform.h
    branches/blender-2.47/source/blender/makesdna/DNA_scene_types.h
    branches/blender-2.47/source/blender/python/api2_2x/Mathutils.c
    branches/blender-2.47/source/blender/src/blenderbuttons.c
    branches/blender-2.47/source/blender/src/editparticle.c
    branches/blender-2.47/source/blender/src/header_view3d.c
    branches/blender-2.47/source/blender/src/transform.c
    branches/blender-2.47/source/blender/src/transform_generics.c
    branches/blender-2.47/source/blender/src/transform_snap.c
    branches/blender-2.47/source/blender/src/view.c

Modified: branches/blender-2.47/release/datafiles/blenderbuttons
===================================================================
(Binary files differ)

Modified: branches/blender-2.47/source/blender/blenkernel/BKE_object.h
===================================================================
--- branches/blender-2.47/source/blender/blenkernel/BKE_object.h	2008-07-09 21:32:25 UTC (rev 15512)
+++ branches/blender-2.47/source/blender/blenkernel/BKE_object.h	2008-07-10 00:09:43 UTC (rev 15513)
@@ -108,6 +108,7 @@
 void minmax_object(struct Object *ob, float *min, float *max);
 void minmax_object_duplis(struct Object *ob, float *min, float *max);
 void solve_tracking (struct Object *ob, float targetmat[][4]);
+int ray_hit_boundbox(struct BoundBox *bb, float ray_start[3], float ray_normal[3]);
 
 void object_handle_update(struct Object *ob);
 

Modified: branches/blender-2.47/source/blender/blenkernel/intern/object.c
===================================================================
--- branches/blender-2.47/source/blender/blenkernel/intern/object.c	2008-07-09 21:32:25 UTC (rev 15512)
+++ branches/blender-2.47/source/blender/blenkernel/intern/object.c	2008-07-10 00:09:43 UTC (rev 15513)
@@ -2382,3 +2382,31 @@
 	}
 	return 1;
 }
+
+/*
+ * Test a bounding box for ray intersection
+ * assumes the ray is already local to the boundbox space
+ */
+int ray_hit_boundbox(struct BoundBox *bb, float ray_start[3], float ray_normal[3])
+{
+	static int triangle_indexes[12][3] = {{0, 1, 2}, {0, 2, 3},
+										  {3, 2, 6}, {3, 6, 7},
+										  {1, 2, 6}, {1, 6, 5}, 
+										  {5, 6, 7}, {4, 5, 7},
+										  {0, 3, 7}, {0, 4, 7},
+										  {0, 1, 5}, {0, 4, 5}};
+	int result = 0;
+	int i;
+	
+	for (i = 0; i < 12 && result == 0; i++)
+	{
+		float lambda;
+		int v1, v2, v3;
+		v1 = triangle_indexes[i][0];
+		v2 = triangle_indexes[i][1];
+		v3 = triangle_indexes[i][2];
+		result = RayIntersectsTriangle(ray_start, ray_normal, bb->vec[v1], bb->vec[v2], bb->vec[v3], &lambda, NULL);
+	}
+	
+	return result;
+}

Modified: branches/blender-2.47/source/blender/blenlib/BLI_arithb.h
===================================================================
--- branches/blender-2.47/source/blender/blenlib/BLI_arithb.h	2008-07-09 21:32:25 UTC (rev 15512)
+++ branches/blender-2.47/source/blender/blenlib/BLI_arithb.h	2008-07-10 00:09:43 UTC (rev 15513)
@@ -261,6 +261,7 @@
 void Vec2Subf(float *v, float *v1, float *v2);
 void Vec2Copyf(float *v1, float *v2);
 
+void AxisAngleToQuat(float *q, float *axis, float angle);
 void vectoquat(float *vec, short axis, short upflag, float *q);
 
 float VecAngle2(float *v1, float *v2);
@@ -272,6 +273,8 @@
 
 void euler_rot(float *beul, float ang, char axis);
 	
+void NormalShortToFloat(float *out, short *in);
+void NormalFloatToShort(short *out, float *in);
 
 float DistVL2Dfl(float *v1, float *v2, float *v3);
 float PdistVL2Dfl(float *v1, float *v2, float *v3);
@@ -374,7 +377,9 @@
 void tubemap(float x, float y, float z, float *u, float *v);
 void spheremap(float x, float y, float z, float *u, float *v);
 
+int LineIntersectLine(float v1[3], float v2[3], float v3[3], float v4[3], float i1[3], float i2[3]);
 int LineIntersectsTriangle(float p1[3], float p2[3], float v0[3], float v1[3], float v2[3], float *lambda, float *uv);
+int RayIntersectsTriangle(float p1[3], float d[3], float v0[3], float v1[3], float v2[3], float *lambda, float *uv);
 int SweepingSphereIntersectsTriangleUV(float p1[3], float p2[3], float radius, float v0[3], float v1[3], float v2[3], float *lambda, float *ipoint);
 int AxialLineIntersectsTriangle(int axis, float co1[3], float co2[3], float v0[3], float v1[3], float v2[3], float *lambda);
 int AabbIntersectAabb(float min1[3], float max1[3], float min2[3], float max2[3]);

Modified: branches/blender-2.47/source/blender/blenlib/intern/arithb.c
===================================================================
--- branches/blender-2.47/source/blender/blenlib/intern/arithb.c	2008-07-09 21:32:25 UTC (rev 15512)
+++ branches/blender-2.47/source/blender/blenlib/intern/arithb.c	2008-07-10 00:09:43 UTC (rev 15513)
@@ -1335,6 +1335,22 @@
 	}
 }
 
+void AxisAngleToQuat(float *q, float *axis, float angle)
+{
+	float nor[3];
+	float si;
+	
+	VecCopyf(nor, axis);
+	Normalize(nor);
+	
+	angle /= 2;
+	si = (float)sin(angle);
+	q[0] = (float)cos(angle);
+	q[1] = nor[0] * si;
+	q[2] = nor[1] * si;
+	q[3] = nor[2] * si;	
+}
+
 void vectoquat(float *vec, short axis, short upflag, float *q)
 {
 	float q2[4], nor[3], *fp, mat[3][3], angle, si, co, x2, y2, z2, len1;
@@ -2258,6 +2274,20 @@
 	else return exp(log(d)/3);
 }
 
+void NormalShortToFloat(float *out, short *in)
+{
+	out[0] = in[0] / 32767.0;
+	out[1] = in[1] / 32767.0;
+	out[2] = in[2] / 32767.0;
+}
+
+void NormalFloatToShort(short *out, float *in)
+{
+	out[0] = (short)(in[0] * 32767.0);
+	out[1] = (short)(in[1] * 32767.0);
+	out[2] = (short)(in[2] * 32767.0);
+}
+
 /* distance v1 to line v2-v3 */
 /* using Hesse formula, NO LINE PIECE! */
 float DistVL2Dfl( float *v1, float *v2, float *v3)  {
@@ -3671,6 +3701,43 @@
 	return 1;
 }
 
+/* moved from effect.c
+   test if the ray starting at p1 going in d direction intersects the triangle v0..v2
+   return non zero if it does 
+*/
+int RayIntersectsTriangle(float p1[3], float d[3], float v0[3], float v1[3], float v2[3], float *lambda, float *uv)
+{
+	float p[3], s[3], e1[3], e2[3], q[3];
+	float a, f, u, v;
+	
+	VecSubf(e1, v1, v0);
+	VecSubf(e2, v2, v0);
+	
+	Crossf(p, d, e2);
+	a = Inpf(e1, p);
+	if ((a > -0.000001) && (a < 0.000001)) return 0;
+	f = 1.0f/a;
+	
+	VecSubf(s, p1, v0);
+	
+	Crossf(q, s, e1);
+	*lambda = f * Inpf(e2, q);
+	if ((*lambda < 0.0)) return 0;
+	
+	u = f * Inpf(s, p);
+	if ((u < 0.0)||(u > 1.0)) return 0;
+	
+	v = f * Inpf(d, q);
+	if ((v < 0.0)||((u + v) > 1.0)) return 0;
+
+	if(uv) {
+		uv[0]= u;
+		uv[1]= v;
+	}
+	
+	return 1;
+}
+
 /* Adapted from the paper by Kasper Fauerby */
 /* "Improved Collision detection and Response" */
 int SweepingSphereIntersectsTriangleUV(float p1[3], float p2[3], float radius, float v0[3], float v1[3], float v2[3], float *lambda, float *ipoint)
@@ -3965,6 +4032,74 @@
 	return 1;
 }
 
+/* Returns the number of point of interests
+ * 0 - lines are colinear
+ * 1 - lines are coplanar, i1 is set to intersection
+ * 2 - i1 and i2 are the nearest points on line 1 (v1, v2) and line 2 (v3, v4) respectively 
+ * */
+int LineIntersectLine(float v1[3], float v2[3], float v3[3], float v4[3], float i1[3], float i2[3])
+{
+	float a[3], b[3], c[3], ab[3], cb[3], dir1[3], dir2[3];
+	float d;
+	
+	VecSubf(c, v3, v1);
+	VecSubf(a, v2, v1);
+	VecSubf(b, v4, v3);
+
+	VecCopyf(dir1, a);
+	Normalize(dir1);
+	VecCopyf(dir2, b);
+	Normalize(dir2);
+	d = Inpf(dir1, dir2);
+	if (d == 1.0f || d == -1.0f) {
+		/* colinear */
+		return 0;
+	}
+
+	Crossf(ab, a, b);
+	d = Inpf(c, ab);
+
+	/* test if the two lines are coplanar */
+	if (d > -0.000001f && d < 0.000001f) {
+		Crossf(cb, c, b);
+
+		VecMulf(a, Inpf(cb, ab) / Inpf(ab, ab));
+		VecAddf(i1, v1, a);
+		VecCopyf(i2, i1);
+		
+		return 1; /* one intersection only */
+	}
+	/* if not */
+	else {
+		float n[3], t[3];
+		float v3t[3], v4t[3];
+		VecSubf(t, v1, v3);
+
+		/* offset between both plane where the lines lies */
+		Crossf(n, a, b);
+		Projf(t, t, n);
+
+		/* for the first line, offset the second line until it is coplanar */
+		VecAddf(v3t, v3, t);
+		VecAddf(v4t, v4, t);
+		
+		VecSubf(c, v3t, v1);
+		VecSubf(a, v2, v1);
+		VecSubf(b, v4t, v3);
+
+		Crossf(ab, a, b);
+		Crossf(cb, c, b);
+
+		VecMulf(a, Inpf(cb, ab) / Inpf(ab, ab));
+		VecAddf(i1, v1, a);
+
+		/* for the second line, just substract the offset from the first intersection point */
+		VecSubf(i2, i1, t);
+		
+		return 2; /* two nearest points */
+	}
+} 
+
 int AabbIntersectAabb(float min1[3], float max1[3], float min2[3], float max2[3])
 {
 	return (min1[0]<max2[0] && min1[1]<max2[1] && min1[2]<max2[2] &&

Modified: branches/blender-2.47/source/blender/include/BIF_resources.h
===================================================================
--- branches/blender-2.47/source/blender/include/BIF_resources.h	2008-07-09 21:32:25 UTC (rev 15512)
+++ branches/blender-2.47/source/blender/include/BIF_resources.h	2008-07-10 00:09:43 UTC (rev 15513)
@@ -293,7 +293,7 @@
 	ICON_ARMATURE_DEHLT,
 	ICON_SNAP_GEAR,
 	ICON_SNAP_GEO,
-	ICON_BLANK41,
+	ICON_SNAP_NORMAL,
 	ICON_BLANK42,
 	
 	ICON_SMOOTHCURVE,

Modified: branches/blender-2.47/source/blender/include/BSE_view.h
===================================================================
--- branches/blender-2.47/source/blender/include/BSE_view.h	2008-07-09 21:32:25 UTC (rev 15512)
+++ branches/blender-2.47/source/blender/include/BSE_view.h	2008-07-10 00:09:43 UTC (rev 15513)
@@ -66,6 +66,8 @@
 void project_int_noclip(float *vec, int *adr);
 void project_float(float *vec, float *adr);
 void project_float_noclip(float *vec, float *adr);
+void viewray(short mval[2], float ray_start[3], float ray_normal[3]);
+void viewline(short mval[2], float ray_start[3], float ray_end[3]);
 
 int boundbox_clip(float obmat[][4], struct BoundBox *bb);
 void fdrawline(float x1, float y1, float x2, float y2);

Modified: branches/blender-2.47/source/blender/include/transform.h
===================================================================
--- branches/blender-2.47/source/blender/include/transform.h	2008-07-09 21:32:25 UTC (rev 15512)
+++ branches/blender-2.47/source/blender/include/transform.h	2008-07-10 00:09:43 UTC (rev 15513)
@@ -75,6 +75,8 @@
 	int  	status;
 	float	snapPoint[3];
 	float	snapTarget[3];
+	float	snapNormal[3];
+	float	snapTangent[3];
 	float	dist; // Distance from snapPoint to snapTarget
 	double	last;
 	void  (*applySnap)(struct TransInfo *, float *);
@@ -457,6 +459,8 @@
 void resetSnapping(TransInfo *t);
 int  handleSnapping(TransInfo *t, int event);
 void drawSnapping(TransInfo *t);
+int usingSnappingNormal(TransInfo *t);
+int validSnappingNormal(TransInfo *t);
 
 /*********************** Generics ********************************/
 
@@ -487,6 +491,7 @@
 void calculatePropRatio(TransInfo *t);
 
 void getViewVector(float coord[3], float vec[3]);
+void getViewRay(short mval[2], float p[3], float d[3]);
 
 TransInfo * BIF_GetTransInfo(void);
 

Modified: branches/blender-2.47/source/blender/makesdna/DNA_scene_types.h
===================================================================
--- branches/blender-2.47/source/blender/makesdna/DNA_scene_types.h	2008-07-09 21:32:25 UTC (rev 15512)

@@ Diff output truncated at 10240 characters. @@




More information about the Bf-blender-cvs mailing list