[odejava] matrix bug report & patch

Hi i found that i got inconsistent reading from Geom.getRotation
it seems that ODE continuosly move matrix structures around so we need an updateReference before every read. (I think we also need to call updateReference also before getPosition while getQuaternion always copy the correct ode quaternion)
I don’t know if this is correct ODE behaviour or is caused by some other bug.
I also found that indices for both body.setRotation and geom.setRotation were wrong and different from the ones from getRotation (as ODE uses always vectors of 4 element even if it needs only 3)
so here’s my cumulative patch for both of this bug.
Index: Geom.java

RCS file: /cvs/odejava/odejava/src/org/odejava/Geom.java,v
retrieving revision 1.4
diff -r1.4 Geom.java
136,141c136,141
< Ode.floatArray_setitem(tmpArray, 3, r.getElement(1, 0));
< Ode.floatArray_setitem(tmpArray, 4, r.getElement(1, 1));
< Ode.floatArray_setitem(tmpArray, 5, r.getElement(1, 2));
< Ode.floatArray_setitem(tmpArray, 6, r.getElement(2, 0));
< Ode.floatArray_setitem(tmpArray, 7, r.getElement(2, 1));
< Ode.floatArray_setitem(tmpArray, 8, r.getElement(2, 2));

          Ode.floatArray_setitem(tmpArray, 4, r.getElement(1, 0));
          Ode.floatArray_setitem(tmpArray, 5, r.getElement(1, 1));
          Ode.floatArray_setitem(tmpArray, 6, r.getElement(1, 2));
          Ode.floatArray_setitem(tmpArray, 8, r.getElement(2, 0));
          Ode.floatArray_setitem(tmpArray, 9, r.getElement(2, 1));
          Ode.floatArray_setitem(tmpArray, 10, r.getElement(2, 2));

172a173

          updateReferences();

202a204

          updateReferences();

Index: Body.java

RCS file: /cvs/odejava/odejava/src/org/odejava/Body.java,v
retrieving revision 1.27
diff -r1.27 Body.java
296,301c298,303
< Ode.floatArray_setitem(tmpArray, 3, r.getElement(1, 0));
< Ode.floatArray_setitem(tmpArray, 4, r.getElement(1, 1));
< Ode.floatArray_setitem(tmpArray, 5, r.getElement(1, 2));
< Ode.floatArray_setitem(tmpArray, 6, r.getElement(2, 0));
< Ode.floatArray_setitem(tmpArray, 7, r.getElement(2, 1));
< Ode.floatArray_setitem(tmpArray, 8, r.getElement(2, 2));

    Ode.floatArray_setitem(tmpArray, 4, r.getElement(1, 0));
    Ode.floatArray_setitem(tmpArray, 5, r.getElement(1, 1));
    Ode.floatArray_setitem(tmpArray, 6, r.getElement(1, 2));
    Ode.floatArray_setitem(tmpArray, 8, r.getElement(2, 0));
    Ode.floatArray_setitem(tmpArray, 9, r.getElement(2, 1));
    Ode.floatArray_setitem(tmpArray, 10, r.getElement(2, 2));

Would someone with CVS access check in this in HEAD?

ok, it’s in.

Will.