125 lines
3.4 KiB
C++
Executable file
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
|
|
|