reman3/Rayman_X/cpa/tempgrp/SND/src/sndvect.c

82 lines
2.4 KiB
C

#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);
}