#include "SND\snddef.h"
 
#include "SNDinc.h"
#include "SND.h"
 
#include "sndvect.h"
 
/*
//////////////////////////////////////////////////////
//	SNDVECT.CXX - Librairie SOUNDxd version 2.0		//
//////////////////////////////////////////////////////
//	Definitions des fonctions	de gestion			//
//	des vecteurs spatiaux							//
//////////////////////////////////////////////////////
*/
 
SndReal SND_CALL SND_fn_rNormeVectorSnd(SndVector *v)
{
	long sdc;
 
	sdc=(v->x>>8)*(v->x>>8)+(v->y>>8)*(v->y>>8)+(v->z>>8)*(v->z>>8);
 
	return sdc;
}
 
/*------------------------------------------------------------------*/
/*	calcul_pseudo_d: calcul approximatif de la norme d'un vecteur 2D*/
/*	Entrees:a,b=coordonnees du vecteur*/
/*	Sortie:norme de ce vecteur*/
/**/
/*pseudo_d est une approximation de la distance entre les 2 points*/
/* droites d'equidistance avec O : y=-x/2+1 ou y=-2x+2 (selon le demi-quadrant)*/
/*------------------------------------------------------------------------*/
SndReal calcul_pseudo_d(SndReal a,SndReal b)
{
    SndReal aa,bb;
	aa=abs(a);bb=abs(b);
 
    if (aa<bb)
        return (bb+(aa>>1));
    else
        return (aa+(bb>>1));
}
 
/*-----------------------------------------------------------*/
/*	PseudoNormeVectorSnd:calcul rapide de la norme approvee d'un vecteur 3D*/
/*	Entree:v=vecteur concerne*/
/*	Sortie:norme approchee de ce vecteur*/
/*-------------------------------------------------------------*/
SndReal SND_CALL SND_fn_rPseudoNormeVectorSnd(SndVector *v)
{
    SndReal dx,dy,dz;
 
    dx=abs(v->x);
    dy=abs(v->y);
    dz=abs(v->z);
 
    return calcul_pseudo_d(calcul_pseudo_d(dx,dy),dz);
}
 
SndReal SND_CALL SND_fn_rScalaireVectorSnd(SndVector *v1,SndVector *v2)
{
	return (SND_fn_rMulRealRealSnd(v1->x,v2->x)
		+SND_fn_rMulRealRealSnd(v1->y,v2->y)
		+SND_fn_rMulRealRealSnd(v1->z,v2->z));
}
 
SndReal SND_CALL SND_fn_rPseudoScalaireNormeVectorSnd(SndVector *v1,SndVector *v2)
{
	return (SND_fn_rMulRealRealQuickSnd(v1->x,v2->x)
		+SND_fn_rMulRealRealQuickSnd(v1->y,v2->y)
		+SND_fn_rMulRealRealQuickSnd(v1->z,v2->z));
}
 
void SND_CALL SND_fn_vProduitVectorSnd(SndVector *v1,SndVector *v2,SndVector *v)
{
    v->x=SND_fn_rMulRealRealSnd(v1->y,v2->z)-SND_fn_rMulRealRealSnd(v1->z,v2->y);
    v->y=SND_fn_rMulRealRealSnd(v1->z,v2->x)-SND_fn_rMulRealRealSnd(v1->x,v2->z);
    v->z=SND_fn_rMulRealRealSnd(v1->x,v2->y)-SND_fn_rMulRealRealSnd(v1->y,v2->x);
}
 
