mahlendur/_work/Data/Scripts/Content/LeGo/Render.d
Daniel Heße 892a40ff0f Initial commit with Subversion-codebase from 13/05/2022.
Cleaned up the mess, at this time, only viable data get synced (_work directory for Gothic-data, miranda for mdc-scripts.
Need to symlink files to a working directory.
2022-05-13 17:38:52 +02:00

162 lines
4.5 KiB
D

const int _render_wld = 0;
var int _render_list;
class RenderItem {
var int inst;
var int itmPtr; // oCItem*
var int view;
var int view_open;
var int priority; // standardmäßig 0! TODO: Höhere Priorität = weiter oben oder unten?
};
instance RenderItem@(RenderItem);
func int Render_AddItemPrio(var int itemInst, var int x1, var int y1, var int x2, var int y2, var int priority) {
var int h; h = new(RenderItem@);
var RenderItem itm; itm = get(h);
itm.inst = itemInst;
itm.view = View_Create(x1, y1, x2, y2);
itm.priority = priority;
View_Open(itm.view);
itm.itmPtr = Itm_GetPtr(itemInst);
var zCList l; l = get(_render_list);
if (l.data) {
List_InsertSorted(getPtr(_render_list), h, _Render_Comparator);
} else {
l.data = h;
};
return +h;
};
func int Render_AddItem(var int itemInst, var int x1, var int y1, var int x2, var int y2) {
return +Render_AddItemPrio(itemInst, x1, y1, x2, y2, 0);
};
func int Render_AddViewPrio(var int view, var int priority) {
var int h; h = new(RenderItem@);
var RenderItem itm; itm = get(h);
itm.inst = 0;
itm.view = view;
itm.priority = priority;
itm.view_open = 1;
itm.itmPtr = 0;
var zCList l; l = get(_render_list);
if (l.data) {
List_InsertSorted(getPtr(_render_list), h, _Render_Comparator);
} else {
l.data = h;
};
return +h;
};
func int Render_AddView(var int view) {
return +Render_AddViewPrio(view, 0);
};
func void Render_OpenView(var int ID) {
var RenderItem itm; itm = get(ID);
itm.view_open = 1;
/* Item-Views werden nur gerendert, wenn sie auch offen sind. */
if (itm.itmPtr) {
View_Open(itm.view);
};
};
func void Render_CloseView(var int ID) {
var RenderItem itm; itm = get(ID);
itm.view_open = 0;
/* Item-Views werden nur gerendert, wenn sie auch offen sind. */
if (itm.itmPtr) {
View_Close(itm.view);
};
};
func void Render_Remove(var int ID) {
var RenderItem itm; itm = get(ID);
if (itm.view) {
View_Delete(itm.view);
};
MEMINT_GetMemHelper();
Npc_RemoveInvItem(MEM_Helper, itm.inst); // Alle Gegenstände, die der MEM_Helper hat, werden auch gerade gebraucht.
List_Delete(getPtr(_render_list), List_Contains(getPtr(_render_list), ID));
delete(ID);
};
func void _Render_Hook_Sub(var int list) {
var RenderItem itm;
var zCList l; l = _^(list);
if (l.data) {
itm = get(l.data);
if (itm.itmPtr) {
SB_New();
SB("itmPtr: ");
SBi(itm.itmPtr);
SB(" WorldPtr: ");
SBi(_render_wld);
SB(" ViewHandle: ");
SBi(itm.view);
SB(" ViewPtr: ");
SBi(View_GetPtr(itm.view));
MEM_Info(SB_ToString());
SB_Destroy();
oCItem_Render(itm.itmPtr, _render_wld, View_GetPtr(itm.view), floatNULL);
} else if ((itm.view_open) && (Hlp_IsValidHandle(itm.view))) {
View_Render(itm.view);
};
};
};
// TODO: Neues Spiel -> Neues Spiel crasht noch.
func void _Render_Hook() {
if (!(getPtr(_render_list))) { return; };
if (MEM_Game.singleStep) { return; };
List_ForF(getPtr(_render_list), _Render_Hook_Sub);
};
func int _Render_Comparator(var int data1, var int data2) {
var RenderItem itm1; itm1 = get(data1);
var RenderItem itm2; itm2 = get(data2);
return (itm1.priority > itm2.priority);
};
func void _Render_RestorePointer_Sub(var int list) {
// TODO: Nach dieser Funktion hat der Render immer nur 1 Item von jeder Instanz im Inventar, das könnte gehörig schief gehen?
var RenderItem itm;
var zCList l; l = _^(list);
if (l.data) {
itm = get(l.data);
if (itm.inst) {
itm.itmPtr = Itm_GetPtr(itm.inst);
};
};
};
func void _Render_RestorePointer() {
List_ForF(getPtr(_render_list), _Render_RestorePointer_Sub);
};
func void _Render_RestorePointer_Listener(var int state) {
if (state == GAMESTATE_SAVING || state == GAMESTATE_LOADED) {
_Render_RestorePointer();
};
};
instance oWorld@(oWorld);
func void _Render_Init() {
if(_render_wld) { return; };
HookEngineF(oCGame__RenderX, 6, _Render_Hook);
// Welt zum Rendern
_render_wld = create(oWorld@);
CALL__thiscall(_render_wld, zCWorld__zCWorld);
/* G2 only, using offset due to G1G2 compatibility
var oWorld w; w = MEM_PtrToInst(_render_wld);
w.m_bIsInventoryWorld = 1; */
if (MEMINT_SwitchG1G2(false, true)) {
MEM_WriteInt (_render_wld+136, 1);
};
};