PDA

View Full Version : Newbs looking for vector class - I've put mine up on my site..



Robbo
07-21-2002, 01:51 AM
www.orbsoftware.com (http://www.orbsoftware.com)
(go to the nurd zone).

Comments appreciated. Especially ideas on improvement, things I'm doing wrong etc.

Thanks.

zeckensack
07-21-2002, 05:08 PM
1)Some of the inner product stuff is wrong (unary operator in vector3.h and both in vector2.h).

2)Your sincos asm won't work. You store the results to the pointer variables, so you're missing one level of indirection.
Hint
MOV ESI,Cos
MOV EDI,Sin
FSTP [DWORD PTR] ESI
FSTP [DWORD PTR] EDI

3)Vector division? What's that? http://www.opengl.org/discussion_boards/ubb/wink.gif

Robbo
07-21-2002, 10:20 PM
Why is the inner product wrong? (please point it out!) and I'm not sure about the sincos bit.

Help me out here!

zeckensack
07-21-2002, 10:37 PM
Look here, both are from your code (vector3d.h):

//Good
// Multiply (inner product) of two vectors.
//

inline REAL operator * ( const CVector3D& Left, const CVector3D& Right )
{
return ( ( Left.x * Right.x ) + ( Left.y * Right.y ) + ( Left.z * Right.z ) );
}


//Bad!
// Multiply this vector with another (inner product).
//

inline CVector3D& operator *= ( const CVector3D& Left )
{
x *= Left.x;
y *= Left.y;
z *= Left.z;

return ( *this );
}
Notice the difference? http://www.opengl.org/discussion_boards/ubb/smile.gif
While I'm already at it, this would be the correct version:


inline CVector3D& operator *= ( const CVector3D& Left )
{
x=y=z=x*Left.x+y*Left.y+z*Left.z;
return ( *this );
}Similar mistake in vector2d.h (twice).

As for the sincos thing, a reference ( & ) is the same as a pointer, as far as inline assembly is concerned. You're storing the calculated sine and cosine to the (temporary) pointers on the stack. You need to dereference them. Like I posted above.


void Sincos(float radians,float& sine,float& cosine)
{
__asm {
FLD radians
FSINCOS
MOV ESI,sine //load target address for sine
MOV EDI,cosine //ditto for cosine
FSTP DWORD PTR [EDI] //store cos
FSTP DWORD PTR [ESI] //store sine
}
}If you want to store to double precision, you just omit the 'DWORD PTR' stuff. If you want to store long double, you can use 'TBYTE PTR' (aka ten bytes).

Robbo
07-22-2002, 12:40 AM
Ah! Of course - thanks for these.

Doh!