// ### OpenGTA3 ###
// interface to original gta_sa.exe

// entities
extern void initializeReferences ();	// >> 5719B0 (1)

extern ColLink * freeColLinks;	// >> 965944 (13)

extern void (*releaseModel)(int index);	// >> 4089A0 (89)

extern int (*getIfpIndexByName)(char * name); // >> 4D3990;
extern void (*ifpAddRef)(int index); // >> 4D3FB0 (36)	TODO: метод либо CIfpFile, либо ifpManager (ifpFiles[index].usageCount++)
extern void (*ifpRelease)(int index); // >> 4D3FD0 TODO: аналогично ifpAddRef

extern BYTE * _A9B0B0;	// флаг создания второго атомика в CModelObjs2c
//-----------------------------------------------------------------------------
//	Texture module (both game and RW)

// TODO: времянки. Убрать после того, как будет подключен CTextureManager
extern void initTxdPool (); // >> 731F20
extern void releaseTxdPool (); // >> 732000


extern short getDefaultTxd (int index);	// >> 7316D0 (1)	TODO: обязательно к реализации, после того, как будет самостоятельно проинициализирован txdPool

// CTextureManager - replacement of RwTextureModule
extern void RwTextureSetFindCallBack (textureCBFind);	// >> 7F34D0 (3)
extern textureCBFind RwTextureGetFindCallBack ();	// >> 7F34F0 (1)
extern void RwTextureSetMipmapping (bool enable);	// >> 7F3530 (8)
extern bool RwTextureGetMipmapping ();	// >> 7F3550 (1)
extern void RwTextureSetAutoMipmapping (bool enable);	// >> 7F3560 (7)
extern bool RwTextureGetAutoMipmapping (); // >> 7F3580 (1)
extern CTexDictionary * RwTexDictionaryCreate ();	// >> 7F3600 (8)
extern void RwTexDictionaryDestroy (CTexDictionary * txd);	// >> 7F36A0 (8)
extern CTexture * RwTextureCreate (RwRaster * raster);	// >> 7F37C0 (10)
extern bool RwTextureDestroy (CTexture *);	// >> 7F3820 (91)
extern void RwTexDictionarySetCurrent (CTexDictionary *);	// >> 7F3A70 (6)
extern const CTexDictionary * RwTexDictionaryGetCurrent ();	// >> 7F3A90 (6)
extern CTexture * RwReadTexture (char * name, char * maskName); // >> 7F3AC0 (61);
extern CTexture * RwTexDictionaryFindNamedTexture(CTexDictionary *dict, char *name);	// >> 7F39F0 (16)

extern RwRaster * RwTextureRasterGenerateMipmaps (RwRaster * raster, RwImage * image);	// >> 7F3CD0 (2) - убрать можно только после того, как будут разобраны модули Raster и Image 

extern int txdAdd (char * name);	// >> 731C80 (21)
extern int txdIndexByName (char * name);	// >> 731850 (47)

extern CTexDictionary * getTexDictionary (int txdIndex);	// >> 408340 (1)	
extern int getTXDEntryParentIndex (int txdIndex);	// >> 408370 (3)
extern void initTexDictionaryEntry (int index);	// >> 731990 (2)
extern CTexDictionary * txdSetCurrent (int index);	// >> 7319C0 (32)
extern void txdAddRef (int index);	// >> 731A00 (23)
// extern void txdRelease (int index);	// >> 731A30 (8)
extern void txdReleaseWithoutUnload (int index);	// >> 731A70 (4)
extern int txdGetUsageCount (int index); // >> 731AA0 (4)
extern int addTxd (char * name); // >> 731C80 (21)
extern void texDictionaryRemove (int index); // >> 731CD0 (11)
extern void txdGarbageCollect (); // >> 732060 (1)


extern CTexture * (*RwReadTextureNative)(CRwStream * stream);	// >> 730E60 (3)
extern RwFrameList * (*_rwFrameListStreamRead)(CRwStream * stream, RwFrameList * fl);	// >> 807970 (1)
//-----------------------------------------------------------------------------
// RenderWare Graphics
// atomic interface
CAtomic * RpAtomicCreate ();
void RpAtomicDestroy (CAtomic * atomic);	// >> 749DC0 (26), >> 7496A0 (1)
CAtomic * RpAtomicClone (CAtomic *); // >> 749E60 (18)

// textures and rasters
struct RwRaster;
extern RwRaster * (*RwRasterCreate)(int width, int height, int depth, DWORD flags);
extern int (*RwRasterDestroy)(RwRaster * raster);

// injectables


// *** Atomic related ***
extern void (*_rtAtomicResyncInterpolatedSphere) (CAtomic * atomic);	// >> 7491F0 (13)
extern CAtomicCallBackRender atomicDefaultRenderCallBack;	// >> 7491C0 (34)	
extern RwObjectHasFrameSyncFunction	worldAtomicSync;	// >> 7507E0 (1)

extern RwSphere * (*RpAtomicGetWorldBoundingSphere)(CAtomic *); // >> 749330 (8)

extern bool (*RwResourcesFreeResEntry)(RwResEntry * entry);	// >> 807DE0 (31)

// clump interface
CClump * RpClumpCreate ();	// >> 74A290 (11)
void RpClumpDestroy (CClump *);	// >> 74A310

extern void (*gtaHAnimDestruct)(CClump *);	// 4D6110

extern RtAnimAnimation  * (*RtAnimAnimationCreate)(int typeID, int numFrames, int flags, float duration);	// >> 7CCE40 (3)
extern bool (*RtAnimInterpolatorSetCurrentAnim)(RtAnimInterpolator *animI, RtAnimAnimation *anim);	// >> 7CD5A0 (7)

extern CAtomic * (*ClumpAtomicStreamRead)(CRwStream * stream, RwFrameList * frames, RpGeometry ** geometryList);	// >> 74B060 (2)

// matrices
extern RwMatrix * (*RwMatrixInvert)(RwMatrix * out, RwMatrix * in); // >> 7F2070
extern RwMatrix * (*RwMatrixTransform)(RwMatrix * matrix, RwMatrix * transform, int combineOp); // >> 7F25A0
extern D3DVECTOR * (*RwTransformPoints)(D3DVECTOR * pointsOut, D3DVECTOR * pointIn, int numPoints, RwMatrix * transformMatrix); // >> 7EDD90
extern RwMatrix * (*RwMatrixRotate)(RwMatrix *, D3DVECTOR *,  float, int);	// >> 7F1FD0 (35)
extern int (*RwMatrixDestroy) (RwMatrix *); // >> 7F2A20 (17)

// light interface 
extern RwObjectHasFrameSyncFunction worldLightSync; // >> 750AC0
extern CLight * (*RpLightStreamRead)(CRwStream *); // >> 751F00 (1)
extern void (*RpLightDestroy)(CLight *);	// >> 7520D0 (8)

// geometry
extern RpGeometry * (*RpGeometryStreamRead) (CRwStream *);	// >> 74D190 (6)
extern void (*RpGeometryDestroy)(RpGeometry *); // >> 74CCC0 (36)

// materials 
extern void (*_rpMaterialListDeinitialize)(RpMaterialList *);	// >> 74E150 (11)
// camera
extern CRwCamera * (*RwCameraStreamRead)(CRwStream *);	// >> 808DE0 (1)
extern void (*RwCameraDestroy)(CRwCamera *);	// >> 7EE4B0 (5)

// frame 
extern CFrame * RwFrameAddChild (CFrame * parent, CFrame * child);	// 7F0B00 (9) 


extern void (*RwFrameDestroyHierarchy)(CFrame *);	// >> 7F08A0 (8)
extern CFrame * (*RwFrameTransform)(CFrame *, RwMatrix *, int combineOp); // >> 7F0F70 (5)


extern CFrame * (*rwFrameCloneAndLinkClones)(CFrame * f);	// >> 7EFFB0 (2)
extern void (*rwFramePurgeClone)(CFrame *root);	// >> 7F01A0

extern CFrame * RwFrameCreate ();	// >> 7F0410 (28)
extern bool RwFrameDestroy (CFrame * frame);	// >> 7F05A0 (30)

// RwObjectHasFrameSyncFunction	atomicSync; // >> 749D20

// skin
extern RwMatrixWeights * (*RpSkinGetVertexBoneWeights)(RpSkin *);	// >> 7C77F0 (6)

// world
extern void (*RpWorldAddClump)(RpWorld *, CClump * c);	// >> 751300 (1)

// memory allocators
void * newWrapper (int size);		// >> 82119A
void deleteWrapper (void * ptr);	// >> 8214BD

void * FreeListCreate (int entrySize,int entriesPerBlock,int alignment, int numBlocksToPreallocate,void *inPlaceSpaceForFreeListStruct,int hint); // 8019B0 (3)
int RwFreeListDestroy (void * freelist); // >> 801B80 (50)
BYTE * _rwFreeListAllocReal (void * freelist, int hint); // >> 801C30 (3)
void * _rwFreeListFreeReal (void * freelist, BYTE * ptr); // >> 801D50 (1)
int RwFreeListPurge (void * freelist); // >> 801E00 (4)
void * RwFreeListForAllUsed (void * freelist, cbaCallback cb, void * param); // >> 801E90 (4)
int RwPurgeAllFreeLists (); // >> 801F90 (1)
bool _rwMemoryOpen (rwMemoryFunctions * mem); // >> 801FD0 (1)
void _rwMemoryClose (); // >> 8020F0 (2)

void * RwMalloc (int size, int flags = 0);	// >> 72F420 (76)
void RwFree (void * ptr);	// >> 72F430 (88)
void * RwRealloc (void * ptr, int size); // >> 72F440 (2)
void * RwCalloc (int size, int count); // >> 72F460 (4)

// file interface
struct ChunkHeaderInfo;	// TODO: объявить в ogRW
extern CRwStream * RwStreamOpen (RwStreamType type, RwStreamAccessType accessType, void * data);	// >> 7ECEF0 (XREF: 23)
extern bool RwStreamClose (CRwStream * stream, void * data);	// >> 7ECE20 (52)
extern int RwStreamRead(CRwStream * stream, void *buffer, int length); // >> 7EC9D0 (164)
extern CRwStream * RwStreamWrite (CRwStream * stream, void * buffer, int length); // >> 7ECB30 (76) -- unsupported
extern CRwStream * RwStreamSkip (CRwStream * stream, int offset); // >> 7ECD00 (23)
// TODO: без _rwStreamInitialize легко можно обойтись, если правильно объявить объект
extern CRwStream * _rwStreamInitialize (CRwStream * stream, bool rwOwned, RwStreamType type, RwStreamAccessType accessType, void * data); // >> 7EC810 (3) - только для rwSTREAMMEMORY
bool _rwStreamReadChunkHeader (CRwStream * stream, DWORD * type, int * length, DWORD * version, DWORD * build); // >> 7ED0F0 (7)
extern CRwStream * _rwStreamReadData (CRwStream * stream, void * data, int bytes);
#define RwStreamReadInt32(s,d,b) _rwStreamReadData (s,d,b)	// >> 7ED540 (58)
#define RwStreamReadReal(s,d,b) _rwStreamReadData (s,d,b)	// >> 7ED4F0 (16)
extern CRwStream * RwStreamReadChunkHeaderInfo (CRwStream * stream, ChunkHeaderInfo * info); // 7ED590 (1)
extern bool RwStreamFindChunk (CRwStream * stream, DWORD type, int * outLength, DWORD * outVersion); // 7ED2D0 (92)

extern int _rwStringStreamGetSize (char * str); // >> 80A470 (6)
extern char * _rwStringStreamFindAndRead(char *string, CRwStream * stream); // >> 80A510 (3);

// NOTE: stream module больше не используется. Достаточно при инициализации memory manager, проинициадизировать __streamAllocator
//extern void * _rwStreamModuleOpen (void * object, int offset, int size);	// >> 7EC780 (XREF: rwEngineInit)
//extern void * _rwStreamModuleClose (void * object, int offset, int size);	// >> 7EC7E0 (XREF: rwEngineInit)
