fmodex/src/fmod_geometry_mgr.h

125 lines
3.4 KiB
C++
Executable file

#ifndef _FMOD_GEOMETRYMGR_H
#define _FMOD_GEOMETRYMGR_H
#include "fmod_settings.h"
#ifdef FMOD_SUPPORT_GEOMETRY
#include "fmod_octree.h"
#include "fmod_geometryi.h"
#include "fmod_thread.h"
#include "fmod_channeli.h"
#ifndef _FMOD_MEMORYTRACKER_H
#include "fmod_memorytracker.h"
#endif
namespace FMOD
{
class GeometryI;
class SystemI;
class GeometryMgr;
#ifdef FMOD_SUPPORT_GEOMETRY_THREADED
typedef enum
{
OCCLUSION_STATE_READY,
OCCLUSION_STATE_UPDATED,
OCCLUSION_STATE_CHECKED
} OCCLUSION_STATE;
struct OCCLUSION_TASK : LinkedListNode
{
OCCLUSION_STATE state;
unsigned int currenthandle;
FMOD_VECTOR position;
float directocclusion;
float reverbocclusion;
#ifdef FMOD_SUPPORT_MULTIREVERB
float reverbgain;
#endif
};
class OcclusionThread : public Thread
{
public:
friend class GeometryMgr;
OcclusionThread();
FMOD_RESULT threadFunc();
void init();
FMOD_RESULT release();
void enqueue(unsigned int index, unsigned int currentHandle, FMOD_VECTOR *worldposition);
OCCLUSION_TASK* retrieveOcclusion(unsigned int index);
private:
bool mInitialized;
OCCLUSION_TASK* dequeue();
OCCLUSION_TASK *mTasks;
LinkedListNode mQueueRoot;
FMOD_OS_CRITICALSECTION *mQueueCrit;
GeometryMgr *mGeometryMgr;
};
#endif //FMOD_SUPPORT_GEOMETRY_THREADED
class GeometryMgr
{
DECLARE_MEMORYTRACKER
public:
friend class GeometryI;
friend class ChannelI;
SystemI *mSystem;
bool mMoved;
#if defined(FMOD_GEOMETRY_DEBUGGING)
static GeometryMgr *sThis;
#endif
GeometryMgr();
~GeometryMgr();
FMOD_RESULT aquireMainOctree ();
void releaseMainOctree ();
#ifdef _DEBUG
Octree *mainOctree ();
#else
Octree *mainOctree () { return mMainOctree; }
#endif
FMOD_RESULT setWorldSize (float worldSize);
float getWorldSize () { return mWorldSize; }
FMOD_RESULT lineTestAll (const FMOD_VECTOR* start, const FMOD_VECTOR* end, float* directOcclusion, float* reverbOcclusion);
#ifdef FMOD_SUPPORT_GEOMETRY_THREADED
friend class OcclusionThread;
FMOD_RESULT initCritalSection ();
FMOD_RESULT releaseOcclusionThread ();
#endif
#if defined(FMOD_GEOMETRY_DEBUGGING)
FMOD_RESULT renderTree (void (*renderBox)(float xMin, float xMax, float yMin, float yMax, float zMin, float zMax));
FMOD_RESULT testLineTestForEachPolygon();
#endif
static bool mainOctreeLineTestCallback (OctreeNode* item, void* data);
private:
FMOD_RESULT flushAll ();
#ifdef FMOD_SUPPORT_GEOMETRY_THREADED
OcclusionThread mOcclusionThread;
FMOD_OS_CRITICALSECTION *mGeometryCrit;
#endif
Octree *mMainOctree;
int mRefCount;
GeometryI *mFirstUpdateItem;
float mWorldSize;
};
}
#endif
#endif