Index: ode.c
===================================================================
--- ode.c	(revision 1194)
+++ ode.c	(revision 1195)
@@ -57,6 +57,7 @@
 raydium_ode_element[i]._touched=0;
 raydium_ode_element[i]._movesfrom=-1;
 raydium_ode_element[i].isplayer=0;
+raydium_ode_element[i].auto_align_f_v=-1;
 raydium_ode_element[i].playerangle=0;
 raydium_ode_element[i].slip=0;
 raydium_ode_element[i].rotfriction=0;
@@ -2200,6 +2201,27 @@
 raydium_ode_element_rotate_direction(raydium_ode_element_find(e),Force0OrVel1);
 }
 
+void raydium_ode_element_auto_rotate_direction(int elem, signed char Force0OrVel1)
+{
+if(!raydium_ode_element_isvalid(elem))
+    {
+    raydium_log("ODE: Error: Cannot Auto align element: invalid index or name");
+    return;
+    }
+
+if(raydium_ode_element[elem].state==RAYDIUM_ODE_STATIC)
+    {
+    raydium_log("ODE: Error: Cannot Auto align a static element");
+    return;
+    }
+    raydium_ode_element[elem].auto_align_f_v=Force0OrVel1;
+}
+
+void raydium_ode_element_auto_rotate_direction_name(char *e, signed char Force0OrVel1)
+{
+    raydium_ode_element_auto_rotate_direction(raydium_ode_element_find(e),Force0OrVel1);
+}
+
 void raydium_ode_element_rotate_rotq(int elem, dReal *rotq)
 {
 dReal i_rot[4];
@@ -5039,6 +5061,9 @@
             raydium_ode_element_addtorque_3f(i,torqueinv[0],torqueinv[1],torqueinv[2]);
             }
 
+        if (raydium_ode_element[i].auto_align_f_v>=0)
+            raydium_ode_element_rotate_direction(i,raydium_ode_element[i].auto_align_f_v);
+
         for(j=0;j<RAYDIUM_ODE_MAX_RAYS;j++)
           if(raydium_ode_element[i].ray[j].state)
             {