Nun, es gilt eine Aufgabe zu bewältigen, und diese heißt: Verlinken soll funktionieren. Wesentlich – wie immer im Bereich des (manchmal lästigen ;)) Reverse-Engineerings – ist, dass man langsam genug voranschreitet um einzelne Effekte auch klar einer bestimmten Ursache zuzuordnen.
Erste Aktion war, die mit dem Fehler behaftete Version standalone zum Laufen zu bringen. Das ist soweit geglückt, es sind einige Parameter in der OpenSim.ini und eine Standalone-Common.ini im config-include Bereich zu bestücken. Aktuelle Version an der ich bastele ist ja die 0.6.9er. Der standalone-Test ergibt – und in diesem Fall glücklicherweise – dass der Fehler auch dort auftritt. Das ist beruhigend, somit liegt es an der Grundversion und nicht an der falschen Implementierung ins Grid.
Eine kurze Recherche ergibt, dass in der 0.6.9er dieser Fehler bekannt ist, aber eigentlich behoben sein soll, denn was am 15.05.2010 geschrieben wurde : „das OS-0.6.9 (Release) ist heute freigegeben worden. Die bekannten Bugs beim Verlinken von Prims sind behoben.“ macht Hoffnung, jedoch die dort zum Download angebotene Version ist eine 0.6.8er :), zumindest meldet sie sich so in der Estate-Info, nun gut – dass damit keine Probleme beim Verlinken existieren ist mir bekannt. Richtig bringt auch diese Version auf standalone gepatcht ein korrektes Verhalten.
Dank der Tatsache, dass ich mit dem Patchen auf standalone sämtliche Tabellen auf MySQL umgestellt habe, kann ich locker auf denselben Datenbestand zurückgreifen und bin nicht auf das Installations-Verzeichnis angewiesen. Und hier sehen wir die Auswirkungen eines funktionsfähigen Verknüpfens von Objekten:
Der Zustand vorher (ich weiß, dass das im Moment noch bescheiden aussieht, da muss ich mir mal Rat beim Blog-Profi Roland einholen ^^):
[code lang="dos"] mysql> select Name, LinkNumber, PositionX, PositionY, PositionZ, GroupPositionX, GroupPositionY, GroupPositionZ from prims; +------------+------------+-----------+-----------+-----------+------------------+------------------+------------------+ | Name | LinkNumber | PositionX | PositionY | PositionZ | GroupPositionX | GroupPositionY | GroupPositionZ | +------------+------------+-----------+-----------+-----------+------------------+------------------+------------------+ | Primitive1 | 0 | 0 | 0 | 0 | 123.821174621582 | 123.223876953125 | 25.1500091552734 | | Primitive2 | 0 | 0 | 0 | 0 | 124.648696899414 | 122.98787689209 | 25.0113964080811 | | Primitive3 | 0 | 0 | 0 | 0 | 126.941375732422 | 123.339248657227 | 25.0476055145264 | +------------+------------+-----------+-----------+-----------+------------------+------------------+------------------+ 3 rows in set (0.00 sec)[/code]
Ich habe drei Prims angelegt und kurz benannt damit sie sich unterscheiden. Irreführenderweise sind die Platzierungen der Prims nicht in „PositionX“ etc gespeichert wie man sieht, denn dieses Feld und die korrespondierenden Y und Z Felder bleiben leer. Nach dem Starten der 0.6.8er und dem Verknüpfen von Primitive1 und Primitive2 (und nach dem Warten bis die DB sich im Log mit ’storing …‘ gemeldet hat) sieht die Situation folgendermaßen aus:
[code lang="dos"] mysql> select Name, LinkNumber, PositionX, PositionY, PositionZ, GroupPositionX, GroupPositionY, GroupPositionZ from prims; +------------+------------+-------------------+--------------------+--------------------+------------------+------------------+------------------+ | Name | LinkNumber | PositionX | PositionY | PositionZ | GroupPositionX | GroupPositionY | GroupPositionZ | +------------+------------+-------------------+--------------------+--------------------+------------------+------------------+------------------+ | Primitive1 | 1 | 0 | 0 | 0 | 123.821174621582 | 123.223876953125 | 25.1500091552734 | | Primitive2 | 2 | 0.827522277832031 | -0.236000061035156 | -0.138612747192383 | 123.821174621582 | 123.223876953125 | 25.1500091552734 | | Primitive3 | 0 | 0 | 0 | 0 | 126.941375732422 | 123.339248657227 | 25.0476055145264 | +------------+------------+-------------------+--------------------+--------------------+------------------+------------------+------------------+ 3 rows in set (0.00 sec)[/code]
Aha, wir haben jetzt bei 1 und 2 eine von Null abweichende LinkNumber, aber auch nicht mehr initiell vorhandene PositionX, Y und Z Werte, zumindest bei Primitive2. Zusätzlich sehen wir, dass die GroupPositions jetzt bei 1 und 2 identisch sind. 1 wurde zum Master ernannt (der Prim der gelb bleibt nach dem Verknüpfen mit Strg-L) was unter anderem an der LinkNumber 1 ersichtlich ist. Verknüpfen wir umgekehrt (der zuletzt angeklickte beim Verlinken wird der Master), dann haben wir das Folgende:
[code lang="dos"] mysql> select Name, LinkNumber, PositionX, PositionY, PositionZ, GroupPositionX, GroupPositionY, GroupPositionZ from prims; +------------+------------+--------------------+-------------------+-------------------+------------------+------------------+------------------+ | Name | LinkNumber | PositionX | PositionY | PositionZ | GroupPositionX | GroupPositionY | GroupPositionZ | +------------+------------+--------------------+-------------------+-------------------+------------------+------------------+------------------+ | Primitive1 | 2 | -0.827522277832031 | 0.236000061035156 | 0.138612747192383 | 124.648696899414 | 122.98787689209 | 25.0113964080811 | | Primitive2 | 1 | 0 | 0 | 0 | 124.648696899414 | 122.98787689209 | 25.0113964080811 | | Primitive3 | 0 | 0 | 0 | 0 | 126.941375732422 | 123.339248657227 | 25.0476055145264 | +------------+------------+--------------------+-------------------+-------------------+------------------+------------------+------------------+[/code]
Schön zu sehen: Jetzt ist 2 der Master mit seinem Count = 1. Die Position-Werte für 1 sind nahezu identisch zu denen die 2 vorher hatte, abgesehen vom umgekehrten Vorzeichen. Es wird dort die relative Position gespeichert zum Master. Und als GroupPosition (der eigentlichen Speicherstelle der Prims) wurden nun die Koordinaten von 2 übernommen.
Das mag im Moment noch nicht so tiefgreifend weiterführen, jedoch werde ich jetzt in den Code einsteigen und herausfinden, wo diese Inhalte gesetzt werden. Der Plan ist, das c# zu patchen mit debug-Informationen auf der Konsole die für die 0.6.9er dann zeigen woran es scheitert.
Naja, bis auf die Tatsache, dass die Tabellen umbrochen werden, sieht die Darstellung doch okay aus. Das Umbrechen lässt sich auch mit keinem Trick unterbinden, es sei denn, man macht die Tabellenschrift so klein, dass sie keiner mehr lesen kann. 😉
Eine andere Möglichkeit wäre allerdings, aus den Tabellen Bilder zu machen, z.B. 1024 Pixel breit. Wenn man sie dann einbindet, werden sie zwar auf die Breite des Inhaltsbereichs verkleinert, aber die größere Version öffnet sich dann beim Klick darauf 🙂