// ### OpenGTA3 ###
// Custom R* plugins
// NOTE: после разбора всех мест связанных с плагинами (как R*, так и RW), 
//		архитектура плагинов передывается на более удобную (с массивом вместо списка), 
//		либо, вообще производится полный отказ от плагинов (под девизом "такая расширяемость нам не нужна"), с переносом 
//		полей плагинов внутрь соответствующих структур
#include "stdafx.h"
#include "gtasaQueue.h"
#include "ogEngine.h"

/*
// ### plugin offsets
int	nodeNamePluginOffset;	// 0x253F2FE: (18) NodeName (Frame)

int (*_RwFrameRegisterPlugin)(int size, DWORD pluginID, pluginConstructCB constructCB, pluginDestructCB destrictCB, pluginCopyCB copyCB) =
(int (__cdecl *)(int, DWORD, pluginConstructCB, pluginDestructCB, pluginCopyCB))0x7F1260;
int (*_RwFrameRegisterPluginStream)(DWORD pluginID, pluginReadCB readCB, pluginWriteCB writeCB, pluginGetSizeCB getSizeCB) = 
(int (__cdecl *)(DWORD, pluginReadCB, pluginWriteCB, pluginGetSizeCB))0x807580;

//=============================================================================
// 0x253F2F5: (4) ParentDictionary (TexDictionary)

//=============================================================================
// 0x253F2FE: (18) NodeName (Frame)
static void * nodeNamePluginContructor (void * object, int offsetInObject, int sizeInObject) {
	*(((char *)object)+nodeNamePluginOffset) = '\0';
	return object;
}
static void * nodeNamePluginDestructor (void * object, int offsetInObject, int sizeInObject) {
	return object;
}
static void * nodeNamePluginCopy (void * dst, const void * src, int offsetInObject, int sizeInObject) {
	memcpy (((char *)dst)+nodeNamePluginOffset, ((char *)src)+nodeNamePluginOffset, 0x17);
	return dst;
}
static RwStream * nodeNamePluginWrite (RwStream * stream, int binaryLength, const void *object, int offsetInObject, int sizeInObject) {
	return stream;	// NOTE: do nothing
}
static RwStream * nodeNamePluginRead (RwStream *stream, int binaryLength, void *object, int offsetInObject, int sizeInObject) {
	RwStreamRead (stream, ((BYTE *)object)+nodeNamePluginOffset, binaryLength);
	*(((BYTE *)object)+nodeNamePluginOffset+binaryLength) = '\0';
	return stream;
}
static int nodeNamePluginGetSize (const void *object, int offsetInObject, int sizeInObject) {
	return object ? strlen (((char *)object)+nodeNamePluginOffset) : 0;
}

bool nodeNamePluginAttach () {	// >> 72FAB0 (AttachPlugins)
	nodeNamePluginOffset = _RwFrameRegisterPlugin (24, 0x253F2FE, nodeNamePluginContructor, nodeNamePluginDestructor, nodeNamePluginCopy);
	_RwFrameRegisterPluginStream (0x253F2FE, nodeNamePluginRead, nodeNamePluginWrite, nodeNamePluginGetSize);
	return nodeNamePluginOffset > 0;
}
char * getFrameNodeName (RwFrame * frame) {	// >> 72FB30 (18)
	return nodeNamePluginOffset <= 0 ? NULL : ((char *)frame)+nodeNamePluginOffset;
}
//=============================================================================

*/