|
|
-
[Skript] Mehr Alpha-Vobs und Alpha-Polys in Gothic 2
Ich erlaube mir einen eigenen Thread zu eröffnen, weil ich mir einbilde, dass das Thema nicht nur versierte Ikarus Nutzer interessiert.
Gothic hat Probleme, wenn viele Vobs oder Polygone einen (nicht 1-bit) Alphakanal haben. Dies äußert sich durch eine der beiden Fehlermeldungen
Code:
X: XD3D_AlphaBlendPoly: xd3d_numAlphaPolys>=MAXALPHAPOLYS (Too many alphapolys)
D: RNDMAN: too few alphaVOBs!
und im zweiten Fall zudem meist durch einen Absturz / Freeze.
Es folgt Code um in Gothic 2 die Alpha-Vob Grenze und die Alpha-Poly Grenze zu erhöhen. Der Fix ist skriptseitig und ist ergo nicht auf den Spacer übertragbar. Benötigt wird Ikarus.
Code:
//************************************************
// Alpha-Vob Fix
//************************************************
func void MoreAlphaVobs(var int newCount) {
MEM_InitAll();
/* This is an alpha vob:
class zCRndAlphaSortObject_Vob {
var int _vtbl;
var int nextSortObject; //zCRndAlphaSortObject_Vob*
var int zvalue; //zREAL
var int vob; //zCVob*
var int alpha; //zREAL
};
*/
const int sizeOf_zCRndAlphaSortObject_Vob = 20;
const int zCRndAlphaSortObject_Vob__vtbl = 8592292; //0x831BA4
const int newAlphaVobPool = 0; //wird jedes Laden zurückgesetzt
//nur fixen wenn noch nicht gefixt.
if (!newAlphaVobPool) {
//neuer Pool der angegebenen Größe
newAlphaVobPool = MEM_Alloc(sizeOf_zCRndAlphaSortObject_Vob * newCount);
//Neue Liste bauen, dabei _vtbl und vob initialsieren.
var int i; i = 0;
var int loop; loop = MEM_StackPos.position;
if (i < newCount) {
var int theSortObj; theSortObj = newAlphaVobPool + i * sizeOf_zCRndAlphaSortObject_Vob;
MEM_WriteInt(theSortObj + 0, zCRndAlphaSortObject_Vob__vtbl);
MEM_WriteInt(theSortObj + 12, 0);
i += 1;
MEM_StackPos.position = loop;
};
//Vergleichsinstruktion:
var int ptr; ptr = 5427853; //0x52D28D
MemoryProtectionOverride(ptr, 4);
MEM_WriteInt(ptr, newCount);
//Der Indexzugriff
ptr = 5427979; //0x52D30B
MemoryProtectionOverride(ptr, 4);
MEM_WriteInt(ptr, newAlphaVobPool);
//Verschobener Indexzugriff
ptr = 5427972; //0x52D304
MemoryProtectionOverride(ptr, 4);
MEM_WriteInt(ptr, newAlphaVobPool + 12);
};
};
//************************************************
// Alpha-Poly Fix
//************************************************
func void MoreAlphaPolys(var int newCount) {
MEM_InitAll();
const int sizeOf_zD3D_alphaPoly = 260; //die Teile sind recht groß! Man kriegt nur 4000 pro MB
const int zD3D_alphaPoly__vtbl = 8631300; //0x83B404
//nur anlegen wenn noch nicht geschehen.
const int newAlphaPolyPool = 0;
if (!newAlphaPolyPool) {
newAlphaPolyPool = MEM_Alloc(sizeOf_zD3D_alphaPoly * newCount);
//Neue Liste bauen (vtbl initialisieren).
var int i; i = 0;
var int loop; loop = MEM_StackPos.position;
if (i < newCount) {
MEM_WriteInt(newAlphaPolyPool + i * sizeOf_zD3D_alphaPoly, zD3D_alphaPoly__vtbl);
i += 1;
MEM_StackPos.position = loop;
};
//Den Vergleich fixen:
var int ptr; ptr = 6605188; //0x64C984
MemoryProtectionOverride(ptr, 4);
MEM_WriteInt(ptr, newCount - 300); //warning-level (ab hier werden keine neuen Vobs angenommen).
//Noch ein Vergleich
ptr = 6605201; //0x64C991
MemoryProtectionOverride(ptr, 4);
MEM_WriteInt(ptr, newCount); //limit (ab hier: Fehlermeldung)
//Fix XD3D_AlphaBlendPoly
ptr = 6605403; //0x064CA5B
//lea ebx, [ebx + newAlphaPolyPool]
MemoryProtectionOverride(ptr, 7);
MEM_WriteByte(ptr, 141); ptr += 1; //0x8D
MEM_WriteByte(ptr, 155); ptr += 1; //0x9B
MEM_WriteInt(ptr, newAlphaPolyPool); ptr += 4;
MEM_WriteByte(ptr, 144); //0x90 = nop
//Fix AddAlphaPoly
ptr = 6607092; //0x064D0F4
//lea ebx, [edx+newAlphaPolyPool
MemoryProtectionOverride(ptr, 7);
MEM_WriteByte(ptr, 141); ptr += 1; //0x8D
MEM_WriteByte(ptr, 154); ptr += 1; //0x9A
MEM_WriteInt(ptr, newAlphaPolyPool); ptr += 4;
MEM_WriteByte(ptr, 144); //0x90 = nop
};
};
Die Benutzung ist denkbar einfach. In der Funktion Init_Global (das heißt insbesondere bevor der erste Frame gerendert wird) ist dazu folgender Code auszuführen:
Code:
MoreAlphaVobs(2048); //normal: 256
MoreAlphaPolys(16384); //normal: 2048
Die neuen Grezen können beliebig gewählt werden (im Beispiel ist die jeweils 8 fache Menge eingesetzt). Dies ist kein Freibrief beliebig viele Alpha-Vobs in Welten zu platzieren, weil diese Welt dann im Spacer nicht mehr sinnvoll bearbeitet werden kann.
Aber wenn im Spacer mit moderater Sichtweite gearbeitet wird (und das Betrachten einer großen Fläche aus der Vogelperspektive vermieden wird) kann man sich doch schon ziemlich frei austoben ohne mit den Grenzen zu kollidieren.
Ich hoffe der Code ist fehlerfrei und wird dem ein oder anderen helfen. Bei Problemen bitte melden.
-
Falls ich nochmal für G2 modde, kriegste dafür beim nächsten Moddertreffen nen Kuss 
Ich hab so viele Ideen, was man mit Alphapolys schönes machen könnte.
Vielen Dank!
-
Ich würde dir auch ein Küsschen spendieren.. oder zwei.
"Weltmacht mit drei Buchstaben?" – Fred & Günther
-
Yeah! Endlich - super geile Sache!
-
Vielen Danke dafür. Das ist eine super Sache.
-
Klasse Sache, Besten Dank 
Bisher Umging ich in Outdoor Leveln das Problem in dem ich eben die meisten alphas in die mesh gesetzt habe. Das funktioniert aber nicht in Portalen, da die meisten alpha vobs eben den Portalraum schneiden und es dadurch nicht geht. Wenn man sie dann im Spacer setzt, gibt es eben diese Grenze, äh gab es diese Grenze
Die gefährlichste aller Weltanschauungen ist die Weltanschauung der Leute, welche die Welt nicht angeschaut haben.
Alexander von Humboldt
-
Danke, hervorragende Arbeit
-
Das ist eine der besten Nachrichten der letzten Jahre .... danke!
EWAGA MOD .... "echtes Gothic"!
-
Super, dass werde ich auf jedenfall verwenden können. Da du die Küsse von Thiel und Kurzer bekommst, kriegst du von mir eher ein bier, was aber auch nicht gerade schlimm ist
Vorzeitig nicht mehr aktiv, aber per PN erreichbar
Sektenwahn
[/CENTER]
-
Vielen dank Sektenspinner
-
Super Sache Sektenspinner, das Problem hat mich schon mal eingeholt.
These days, most of my projects can be found on github.
-
Auch ich werde das SICHER gut gebrauchen können.
Danke Sektenspinner.
Das Sythera-Mod-Team sucht derzeit nur noch einen weiteren netten Kollegen / Kollegin zur Erstellung von Gebäude-Meshs. Weitere Infos in der Jobbörse.
-
Hey, das ist ja wahnsinn, Hammer 
Vielen Dank, das macht einige Sachen echt viel leichter
Download Orkkrieg
„Nach göttlichem Recht gebühre es der Kirche [...] zu bestimmen, was zu glauben und was zu tun sei.“-Papst Leo XIII
-
Großartig, auf so etwas habe ich schon lange gewartet 
MfG Gottfried
-
Ich habe eine Frage zu der MEM_InitALL();
Die wird ja in Ikarus benötigt und deshalb rufe ich sie in der Startup.d auf, genauer gesagt in der INIT_GLOBAL.
Die Func MoreAlphaVobs und MoreAlphaPolys ruft nun in der ersten Zeile ebenfalls die MEM_InitALL() auf.
Könnte ich nun in der INIT_GLOBAL diesen ersten MEM_InitALL(); Aufruf weglasen ?
Code:
MEM_InitALL();
MoreAlphaVobs(2048); //normal: 256
MoreAlphaPolys(16384); //normal: 2048
Ansonsten habe ich in Gynaikos viiiele kombinierte alphas also sehr viele in der mesh und viele im Spacer(ZEN) gesetzt und bisher gab es keinerlei Probleme. Auch die Performance ist so wie vorher.
einfach nur klasse
Die gefährlichste aller Weltanschauungen ist die Weltanschauung der Leute, welche die Welt nicht angeschaut haben.
Alexander von Humboldt
-
 Zitat von Zaphod Beeblebrox
Ich habe eine Frage zu der MEM_InitALL();
Die wird ja in Ikarus benötigt und deshalb rufe ich sie in der Startup.d auf, genauer gesagt in der INIT_GLOBAL.
Die Func MoreAlphaVobs und MoreAlphaPolys ruft nun in der ersten Zeile ebenfalls die MEM_InitALL() auf.
Könnte ich nun in der INIT_GLOBAL diesen ersten MEM_InitALL(); Aufruf weglasen ?
Ja, könntest du. Beziehungsweise umgekehrt könntest du den Aufruf an MEM_InitAll aus den beiden MoreAlpha* Methoden entfernen, wenn du den von dir angesprochenen drinlässt.
Mit anderne Worten: MEM_InitAll muss nach jedem Laden vor gewissen Ikarusaktivitäten mindestens einmal aufgerufen worden sein, damit diese fehlerfrei laufen.
Ein zusätzlicher Aufruf tut aber auch nicht weh und verbraucht, solange man die unnötigen Aufrufe nicht tausendfach anhäuft, auch nicht spürbar Zeit.
 Zitat von Zaphod
Ansonsten habe ich in Gynaikos viiiele kombinierte alphas also sehr viele in der mesh und viele im Spacer(ZEN) gesetzt und bisher gab es keinerlei Probleme. Auch die Performance ist so wie vorher.
Gut zu wissen, dass es nicht nur in meiner Testwelt läuft. 
Ansonsten freu ich mich mit allen anderen hier im Thread mit. Wer die Exodus Präsentation am Moddertreffen gesehen hat, der weiß, dass dieser Fix auch aus Eigennutz entstanden ist.
-
Schöne Sache, wirklich ne sehr schöne Sache.
Auch die Performance ist so wie vorher.
Das ist wohl der Punkt, der mich dabei interessieren würde: Inwiefern wirkt sich das auf die Performance aus? Bei dir scheinbar nicht. Kann das noch jemand anders bestätigen?
-
 Zitat von Zuben2
Kann das noch jemand anders bestätigen?
Also ich habe jetzt ein wenig herumgespielt und meinen FlipScale verzehnfacht(!!!!!) hat wohlgemerkt zu keinem Error geführt. Und wer denkt ich habe wenige Vobs in der Welt, der irrt sich. Solange man immer gerade aus schaut, ist das bild flüssig, aber bei kameraschwenks ruckelt es ein wenig. Naja, übertreiben muss man es ja nicht, bei dem fünfachen Flipscale war bei mir alles komplett flüssig.
Und 3840*1080 funktioniert jetzt auch endlich ohne Spielabsturz 
Download Orkkrieg
„Nach göttlichem Recht gebühre es der Kirche [...] zu bestimmen, was zu glauben und was zu tun sei.“-Papst Leo XIII
-
Nun, den FarClip verzehnfachen bringt AFAIK gar nicht so viel, da doch bei 5 schon die Mesh-Sicherweite nahezu erreicht ist...
-
Lehrling
 Zitat von Gorilla
Und 3840*1080 funktioniert jetzt auch endlich ohne Spielabsturz
Das ist über zwei Monitore im Vollbild, richtig? Wie macht man das?
Berechtigungen
- Neue Themen erstellen: Nein
- Themen beantworten: Nein
- Anhänge hochladen: Nein
- Beiträge bearbeiten: Nein
|
|