Main Page | Alphabetical List | Compound List | File List | Compound Members | File Members

Sound3d.c File Reference

#include <math.h>
#include "Trace.h"
#include "Vec3d.h"
#include "XForm3d.h"
#include "Camera.h"
#include "Sound3d.h"

Go to the source code of this file.

Compounds

struct  geSound3d_Cfg

Typedefs

typedef geSound3d_Cfg geSound3d_Cfg

Functions

void geSound3D_RollOut (geSound3d_Cfg *Cfg, geFloat Dist, geFloat Min, geFloat Max)
void geSound3D_Pan (geSound3d_Cfg *Cfg, geFloat FaceOffset)
void geSound3D_Doppler (geSound3d_Cfg *Cfg, geFloat Mps)
GENESISAPI void geSound3D_GetConfig (const geWorld *World, const geXForm3d *MXForm, const geVec3d *SndPos, geFloat Min, geFloat Ds, geFloat *Volume, geFloat *Pan, geFloat *Frequency)
GENESISAPI void geSound3D_GetConfigIgnoreObstructions (const geWorld *World, const geXForm3d *MXForm, const geVec3d *SndPos, geFloat Min, geFloat Ds, geFloat *Volume, geFloat *Pan, geFloat *Frequency)


Typedef Documentation

typedef struct geSound3d_Cfg geSound3d_Cfg
 


Function Documentation

void geSound3D_Doppler geSound3d_Cfg Cfg,
geFloat  Mps
[static]
 

Definition at line 75 of file Sound3d.c.

References geSound3d_Cfg::Frequency, and NULL.

Referenced by geSound3D_GetConfig(), and geSound3D_GetConfigIgnoreObstructions().

00076 {
00077         //331 mps is the velocity of sound through air in standard conditions.
00078         assert(Cfg != NULL);
00079         Cfg->Frequency = 1.0f + (Mps/ 331.0f );
00080 }

GENESISAPI void geSound3D_GetConfig const geWorld World,
const geXForm3d MXForm,
const geVec3d SndPos,
geFloat  Min,
geFloat  Ds,
geFloat Volume,
geFloat Pan,
geFloat Frequency
 

Definition at line 87 of file Sound3d.c.

References geSound3d_Cfg::Frequency, GE_COLLIDE_MODELS, GE_CONTENTS_SOLID_CLIP, geCamera_ConvertWorldSpaceToCameraSpace(), geFloat, GENESISAPI, geSound3D_Doppler(), geSound3D_Pan(), geSound3D_RollOut(), geVec3d_Length(), geVec3d_Subtract(), geWorld_GetLeaf(), geWorld_LeafMightSeeLeaf(), geXForm3d_Transform(), int32, NULL, geSound3d_Cfg::Pan, Trace_GEWorldCollision(), geXForm3d::Translation, geSound3d_Cfg::Volume, geVec3d::X, and geVec3d::Z.

Referenced by Electric_Frame(), and ReadServerMessages().

00096 {
00097         geVec3d                 ViewPos, LocalPos, Dist;
00098         geSound3d_Cfg   Cfg;
00099         geFloat                 Magnitude;
00100         geVec3d                 Origin = {0.0f, 0.0f, 0.0f};
00101         geXForm3d               CXForm;
00102         int32                   Leaf1, Leaf2;
00103 
00104         assert( World     != NULL );
00105         assert( MXForm    != NULL );
00106         assert( SndPos    != NULL );
00107         assert( Volume    != NULL );
00108         assert( Pan       != NULL );
00109         assert( Frequency != NULL );
00110 
00111         
00112         LocalPos = MXForm->Translation;
00113         // Transform the sound to view space
00114         geCamera_ConvertWorldSpaceToCameraSpace(MXForm, &CXForm);
00115         geXForm3d_Transform( &CXForm, SndPos, &ViewPos);
00116         // FIXME: Need to check these and return TRUE or FALSE
00117         if( !geWorld_GetLeaf((geWorld*)World, &LocalPos, &Leaf1) )
00118                 return;
00119         if( !geWorld_GetLeaf((geWorld*)World, SndPos, &Leaf2) )
00120                 return;
00121         
00122         if (!geWorld_LeafMightSeeLeaf((geWorld*)World, Leaf1, Leaf2, 0))
00123         {
00124                 Magnitude = 0.0f;
00125                 Dist.X = 0.0f;                          // Shut up compiler warning
00126                 Cfg.Volume = 0.0f;
00127         }
00128         else
00129         {
00130                 GE_Collision    Col;
00131 
00132                 // Find the distance from the camera to the original light pos
00133                 geVec3d_Subtract(&LocalPos, SndPos, &Dist);
00134 
00135                 Magnitude = geVec3d_Length(&Dist);
00136                 
00137                 if (Trace_GEWorldCollision((geWorld*)World, NULL, NULL, &LocalPos, SndPos, GE_CONTENTS_SOLID_CLIP, GE_COLLIDE_MODELS, 0, NULL, NULL, &Col))
00138                         Magnitude *= 1.5f;
00139                 
00140                 geSound3D_RollOut(&Cfg, Magnitude, Min, Min*10);
00141         }
00142 
00143         geSound3D_Pan(&Cfg, (geFloat)atan2( (double)ViewPos.X, (double)ViewPos.Z ) );
00144         //Cfg->Frequency = 1.0f;
00145         geSound3D_Doppler(&Cfg, Ds);
00146 
00147         *Volume    = Cfg.Volume;
00148         *Pan       = Cfg.Pan;
00149         *Frequency = Cfg.Frequency;
00150 }

GENESISAPI void geSound3D_GetConfigIgnoreObstructions const geWorld World,
const geXForm3d MXForm,
const geVec3d SndPos,
geFloat  Min,
geFloat  Ds,
geFloat Volume,
geFloat Pan,
geFloat Frequency
 

Definition at line 156 of file Sound3d.c.

References geSound3d_Cfg::Frequency, geCamera_ConvertWorldSpaceToCameraSpace(), geFloat, GENESISAPI, geSound3D_Doppler(), geSound3D_Pan(), geSound3D_RollOut(), geVec3d_Length(), geVec3d_Subtract(), geWorld_GetLeaf(), geWorld_LeafMightSeeLeaf(), geXForm3d_Transform(), int32, NULL, geSound3d_Cfg::Pan, geXForm3d::Translation, geSound3d_Cfg::Volume, geVec3d::X, and geVec3d::Z.

00165 {
00166         geVec3d                 ViewPos, LocalPos, Dist;
00167         geSound3d_Cfg   Cfg;
00168         geFloat                 Magnitude;
00169         geVec3d                 Origin = {0.0f, 0.0f, 0.0f};
00170         geXForm3d               CXForm;
00171         int32                   Leaf1, Leaf2;
00172 
00173         assert( World     != NULL );
00174         assert( MXForm    != NULL );
00175         assert( SndPos    != NULL );
00176         assert( Volume    != NULL );
00177         assert( Pan       != NULL );
00178         assert( Frequency != NULL );
00179 
00180         
00181         LocalPos = MXForm->Translation;
00182         // Transform the sound to view space
00183         geCamera_ConvertWorldSpaceToCameraSpace(MXForm, &CXForm);
00184         geXForm3d_Transform( &CXForm, SndPos, &ViewPos);
00185         // FIXME: Need to check these and return TRUE or FALSE
00186         if( !geWorld_GetLeaf((geWorld*)World, &LocalPos, &Leaf1) )
00187                 return;
00188         if( !geWorld_GetLeaf((geWorld*)World, SndPos, &Leaf2) )
00189                 return;
00190         
00191         if (!geWorld_LeafMightSeeLeaf((geWorld*)World, Leaf1, Leaf2, 0))
00192         {
00193                 Magnitude = 0.0f;
00194                 Dist.X = 0.0f;                          // Shut up compiler warning
00195                 Cfg.Volume = 0.0f;
00196         }
00197         else
00198         {
00199                 // Find the distance from the camera to the original light pos
00200                 geVec3d_Subtract(&LocalPos, SndPos, &Dist);
00201 
00202                 Magnitude = geVec3d_Length(&Dist);
00203                 
00204                 geSound3D_RollOut(&Cfg, Magnitude, Min, Min*10);
00205         }
00206 
00207         geSound3D_Pan(&Cfg, (geFloat)atan2( (double)ViewPos.X, (double)ViewPos.Z ) );
00208         //Cfg->Frequency = 1.0f;
00209         geSound3D_Doppler(&Cfg, Ds);
00210 
00211         *Volume    = Cfg.Volume;
00212         *Pan       = Cfg.Pan;
00213         *Frequency = Cfg.Frequency;
00214 }

void geSound3D_Pan geSound3d_Cfg Cfg,
geFloat  FaceOffset
[static]
 

Definition at line 66 of file Sound3d.c.

References geFloat, NULL, and geSound3d_Cfg::Pan.

Referenced by geSound3D_GetConfig(), and geSound3D_GetConfigIgnoreObstructions().

00067 {
00068         assert(Cfg != NULL);
00069         Cfg->Pan = (geFloat)sin((double)FaceOffset )*0.1f;
00070 }

void geSound3D_RollOut geSound3d_Cfg Cfg,
geFloat  Dist,
geFloat  Min,
geFloat  Max
[static]
 

Definition at line 45 of file Sound3d.c.

References geFloat, NULL, and geSound3d_Cfg::Volume.

Referenced by geSound3D_GetConfig(), and geSound3D_GetConfigIgnoreObstructions().

00046 {
00047         geFloat Volume;
00048         assert( Cfg != NULL );
00049 
00050         if( Dist > Max )
00051         {
00052                 Volume = 0.0f;
00053         }
00054         else if( Dist < Min )
00055         {
00056                 Volume = 1.0f;
00057         }
00058         else
00059                 Volume = 1.0f - (Dist/Min - 1)*0.1f;
00060         Cfg->Volume = Volume;
00061 }


Generated on Tue Sep 30 12:38:08 2003 for GTestAndEngine by doxygen 1.3.2