Die SVN-Integration bedarf einer Umstellung der Ordner-Struktur im SVN.



SVN Assets & GMM Assets
============
Jedes Gothic Asset hat einen einzigartigen Dateinamen. Asset-Typen:
Texturen (.tga), Meshes (.3ds), Worldmeshes (beliebig), Animationen (.asc)

Pro Asset-Datei gibt es wip-Dateien (beliebige Dateien die zu diesem Asset speziell gehören) und preview-Dateien (lediglich intern für den GMM wichtig). Die Asset-Dateien selber sowie die wip-Dateien sollen versioniert werden und nicht nur über den GMM veränderbar sein, sondern auch direkt über das Versionierungssystem (SVN). Die preview-Dateien sind nur im Repo des GMM vorhanden und werden von SVN ignoriert (nicht versioniert).
---
Anforderungen an die Ordnerstruktur:
1. SVN muss preview-Dateien identifizieren können, um sie zu ignorieren
2. Der GMM muss in der Lage sein, bei jeder Datei zu wissen, ob es eine Asset-Datei ist oder nicht.
3. Wenn der GMM eine Asset-Datei erkennt, muss er herausfinden können, ob wip oder preview Dateien vorhanden sind und falls ja, wo sich diese befinden.
4. Der GMM muss den Typ einer Asset-Datei zweifelsfrei identifizieren können.
5. Der ModBuilder muss ebenfalls Asset-Dateien und deren Typ erkennen können.
6. Neu: Der GMM muss in der Lage sein, wip Dateien einem Asset-Dateinamen zuzuordnen, selbst wenn die Asset-Datei selbst (noch) nicht existiert. Sobald die Asset-Datei vorhanden ist, gilt 2. und 3.
---
Bisherige Ordnerstruktur im SVN (pro Asset):
<pfad>/<Asset_datei>

Bisherige Ordnerstruktur im GMM (pro Asset):
<pfad>/<name_der_asset_datei>/assets/<asset_datei>
<pfad>/<name_der_asset_datei>/wip/<wip_dateien>
<pfad>/<name_der_asset_datei>/preview/<preview_dateien>

Vorschlag zur neuen Ordnerstruktur für SVN und GMM (pro Asset):
<asset_typ>/<pfad>/<name_der_asset_datei>/<asset_datei>
<asset_typ>/<pfad>/<name_der_asset_datei>/wip/<wip_dateien>
<asset_typ>/<pfad>/<name_der_asset_datei>/preview/<preview_dateien>(nicht im SVN vorhanden)
---
Anforderungen erfüllt?
1. SVN ignoriert alle Ordner namens "preview"
2. Der Ordnername <name_der_asset_datei> ist der vollständige Name der Asset-Datei und beinhaltet somit auch eine Dateiendung (z.B. .tga). Da dies unüblich ist für Ordner, nimmt der GMM an, dass es sich um einen Asset-Ordner handelt, nicht um einen normalen Ordner. In diesem Ordner darf nur eine einzige Datei vorhanden sein, welche den gleichen Namen hat wie der Ordner (case-insensitive). Dabei handelt es sich um die Asset-Datei.
3. Im Asset-Ordner dürfen sich lediglich die beiden Unterordner "wip" und "preview" befinden, mit den jeweiligen Dateien. Falls nicht vorhanden, werden diese als "leer" interpretiert.
4. Es gibt für jeden Asset-Typ einen Hauptordner, in dem sich alle Assets dieses Typs befinden.
5. Wie der GMM, siehe 2. & 4.
6. Da der Asset-Ordner vorhanden sein muss (sonst könnte sich darin kein wip-Ordner befinden), kann der Asset-Name aus dem Ordnernamen erfasst werden (siehe 2. und 3.).

Nachteile: Die Navigation durch die Assets wird im Datei-Explorer unschöner.
---
Durchführung der Änderungen:
Gruppieren nach Asset-Type sollte von Hand kein großer Aufwand sein. Asset-Ordner und wip-Ordner sind etwas komplizierter:
Es wird ein Batch-Skript erstellt, welches alle Asset-Dateien in Ordner mit dem gleichen Namen packt. Voraussetzung ist, das keine Nicht-Assets im SVN vorhanden sind (ansonsten müssen diese entweder gelöscht oder per Hand über das Skript in die wip-Ordner des dazugeörigen Assets kopiert werden).
Die Datenstruktur sollte dann valide sein wie oben beschrieben, und der GMM kann die Daten einlesen und weiterverarbeiten  (siehe unten).


SVN Assets & GMM Tasks
============
Der GMM verwaltet eine Menge an Tasks. Spezielle Tasks (Asset-Tasks) können einem Asset zugeordnet werden. Diese Zuordnung erfolgt über den case-insensitiven Asset-Ordnernamen (unabhängig vom Pfad). Der Asset-Ordnername wird im Task persistiert und funktioniert wie ein primary key für diesen Task.
(Der Key selbst ist case-sensitive, wird aber über einen case-insensitiven Vergleich einem Asset-Ordner zugeordnet. Sobald sich der Case des Ordners verändert, wird diese Änderung in den Key übernommen.)
Damit der direkte Vergleich zwischen Original-Asset (Vanilla Gothic Assets) und GRM-Asset möglich ist, kann ein Asset-Task gleichzeitig einem weiteren, gleichnamigen Original-Asset zugeordnet werden (auch case-insensitiv). Die Original-Assets befinden sich nicht im SVN sondern in einem externen Ordner.
Damit ein Asset-Task schnell auf sein GRM-Asset und das Original-Asset zugreifen kann, muss er den Pfad zu diesen Assets speichern/cachen. Diese Pfade müssen bei jedem Start des GMMs neu erkannt werden, da sich in der Zeit seit dem Beenden des GMMs Pfade geändert haben könnten. Der Asset-Task erkennt die richtigen Assets bzw. Asset-Ordner über den im Task gespeicherten Asset-Namen(Key), wie oben beschrieben.
Es kann Asset-Tasks geben, für die es (noch) keine Assets gibt. Tasks sind schließlich Aufgaben, nicht schon Ergebnisse. Andersherum kann es auch Assets geben, für die ein Task nicht nötig ist.
---
Folgen von SVN-Commits:
- Wenn ein Asset über SVN gelöscht wird, wird der dazugehörige Asset-Task nicht gelöscht. Es könnte ja sein, dass es sich lediglich um eine Verschiebung handelt (gleicher Asset-Name, aber anderer Pfad). Asset-Tasks müssen manuell gelöscht werden, wenn sie nicht mehr benötigt werden!
- Wenn ein Asset über SVN hochgeladen wird, für das es einen passenden Asset-Task gibt, wird der Asset-Task mit dem Asset (wieder) verknüpft.
- Wenn ein Asset über SVN hochgeladen wird, für das es noch keinen passenden Asset-Task gibt, wird automatisch ein neuer Asset-Task erzeugt. Wenn das hinzugefügte Asset den gleichen Namen hat wie ein Original-Asset, wird auch das Original-Asset zum Vergleich mit dem Asset-Task verknüpft.

Folgen & Auswirkungen bei GMM-Start und Benutztung der GMM-Weboberfläche (Interface):
- (?) Wenn der GMM nach dem Start Assets findet, für die es noch keinen Asset-Task gibt, so werden entsprechende neue Asset-Tasks erstellt (=> Dank Import evtl. unnötig, Import erlaubt bessere Kontrolle, außerdem werden so nicht unötig Tasks für nicht verwendete Original-Assets erstellt).
- Wenn im GMM-Interface ein neuer AssetTask erstellt wird, muss der Asset-Name angegeben werden. Dieser Name wird benutzt, um wie vorher beschrieben beim SVN-Upload automatisch zu verknüpfen. Außerdem wird bei der Erstellung ein Original-Asset mit dem angegebenen Namen gesucht und verknüpft, falls vorhanden. Es kann nicht mehrere Asset-Tasks mit dem gleichen Asset-Namen geben!
- Wenn im GMM-Interface ein Asset-Task gelöscht wird, wird der entsprechende Asset-Ordner ebenfalls gelöscht und daraufhin committet!
- Wenn im GMM-Interface eine Asset-Datei oder eine wip-Datei zu einem Asset-Task hochgeladen wird, wird diese Datei ins SVN eingefügt und daraufhin committet!
- Wenn im GMM-Interface eine Asset-Datei hochgeladen wird, die nicht dem Asset-Dateinamen des Asset-Tasks entspricht, wird der User gewarnt und die hochgeladene Datei wird umbenannt, sodass sie zum Asset-Task passt.

Sonstiges erwähnenswertes Verhalten:
- Sobald sich eine Asset-Datei ändert (durch einen SVN-Commit oder durch Upload), werden neue Previews vom GMM generiert, falls es sich um ein Asset mit Preview-Funktion handelt.
- Der GMM ignoriert sämtliche Dateien, die nicht in Asset-Ordnern oder Asset-Unterordnern liegen.
- Der GMM ignoriert sämtliche Dateien, die nicht in Asset-Typ-Ordnern (= Typ-Ordner im SVN-Root) liegen.
- Der GMM cacht für jeden Asset-Task den Status-Flag "invalid file system". Ist dieser Flag gesetzt, generiert der GMM für diesen Task keine Previews und zeigt statt der Asset-Dateien einen Fehler in der Listenansicht an. Der Fehler beschreibt eines der folgenden Probleme, welche den Flag auslösen, wenn:
=> Daten in einem Asset-Ordner abgelegt wurden, welche nicht den gleichen Namen haben wie der Asset-Ordner.
=> Asset-Ordner erstellt wurden (=> Ordnernamen enhält Punkt), deren Dateiendung nicht zu dem Typ passt, zu dem der Asset-Ordner gehören müsste (Für jeden Asset-Typ-Ordner sind nur bestimmte Dateendungen erlaubt).
=> Mehr als eine Datei im Asset-Ordner liegt (es darf zusätzlich zu den Asset-Unterordnern nur die Asset-Datei vorhanden sein)
=> Ein oder mehrere andere Asset-Ordner mit dem gleichen Namen unter einem anderen Pfad existieren

---
Nice-To-Have:
- Eine Funktion "Asset-Name korrigieren", welche es erlaubt, den persistierten Asset-Ordnernamen (Key) eines Asset-Tasks zu ändern. Dies erlaubt nach dem manuellen Umbennen eines Asset-Ordners (über SVN) den dazugehörigen Task wieder korrekt zu verknüpfen.
- Erweiterung der Funktion "Asset-Name korrigieren" hin zu "Asset-Name ändern", welche als zusätzliche Funktionalität Asset-Ordner mit umbenennt, die momentan verknüpft sind. Man könnte dann Umbenennungen des Asset-Ordners über diese Funktion ausführen, ohne SVN manuell zu benutzen.
