class structure

Klassenmodell


eTom basiert auf einer streng hierarchischen Klassenstruktur, bei der jede Klasse möglichst nur den Teil bearbeitet, den sie auch verwaltet. Die Übersichtlichkeit ist dadurch stark gesteigert und eine Einarbeitung in den Quellcode ist schnell möglich.
Eine konsequente Klassenstruktur ist bei der Verwendung von JOGL unerlässlich. Der Aufbau muss vorher gut durchdacht sein, da der jeweilige OpenGL Kontext den einzelnen Objekten zugeordnet werden muss. Traditionell würde man bei der objektorientierten Programmierung die jeweiligen Inhalte bei Erstellung der Instanz mit erzeugen. Wir haben dieses verlagert und lassen den Inhalt erst erstellen, wenn das einzelne Objekt aus der RenderList aufgerufen wird. Der dazugehörige OpenGL Kontext ist so eindeutig definiert. Jedes Objekt welches OpenGL nutzt, muss deshalb eine abgeleitete Klasse von „Structur“ oder „File“ sein. Diese Klassen beinhalten den grundsätzlichen Aufbau der Objekterstellung. Die zwei Methoden generate (eTom.objects.Structur.generate()) und glgenerate (eTom.objects.Stru-ctur.glgenerate()) dienen zur Erstellung der Modelle.

Pre-Compiling

Da jedes Objekt nur bei Bedarf generiert wird, kann dieses auch direkt verlagert werden, so dass es in eine glList abgelegt wird. Dieses erhöht die Performance und ist für starre Objekte auch sehr komfortabel.
Jedes Objekt hat deshalb einen protected int glListed welches die jeweilige Listennummer enthält. Bei Atomen (die alle gleich aussehen) ist dieses sogar static, da es eine Grundform ist und keine Variation im aussehen erwartet wird.
Die Listenverwaltung ist eine Kombination aus der Zeichenfunktion draw() (eTom.ob-jects.structur.draw()) und der Initialisierungsfunktion isInit() (eTom.objects.strctur.isInit()).
Die draw Funktion prüft über isInit ob das Objekt bereits pre-compiled wurde bzw. lässt dieses direkt erzeugen, falls dieses noch nicht der Fall ist. Da es sich pro Objekt dann jeweils um einen int handelt, ist dieses mit relativ geringem Aufwand verbunden.
Die Init() Funktion verarbeitet dann die in der jeweiligen objektabhängigen Variablen „atome“ (ein Stack an Atomobjekten, welcher typischerweise in der „generate“ Funktion gefüllt wird) und kompiliert diese zu einer glList welche dann nur noch dargestellt wird.
Die Funktion glgenerate wird auch von init aufgerufen, jedoch können dort die GL Objekte ‚wild‘ angelegt werden. Das daraus resultierende Modell wird also nicht ‚anklickbar‘ sein, da die Polygone keinen Unterobjekt zugeordnet werden können.
Eine minimale Klasse, welche ein sinnvolles Objekt erzeugt, braucht also weder Konstruktor noch weitere Funktionen, bis auf generate oder glgenerate.

public class MyFirstObject extends Structure {
		public void generate(){
			atome.add(new AtomNeighbours());
		}
	}

Diese Klasse würde bei Einbindung in die RenderList ein Atom darstellen, welches anklickbar wäre und bereits in einer eigenen Rendering-Liste gespeichert wurde.
Durch diesen Aufbau ist auch der didaktische Zweck des Programms gegeben. Ohne große, unlogische Gebilde erhalten Interessierte direkt die Möglichkeit, simple Gebilde bis hin zu komplexen Konstrukten zu kreieren.
Die Klasse File ruft noch eine weitere Funktion durch den default Konstruktor auf. Diese heißt readFile() (eTom.objects.File) und soll dazu dienen, weitere Daten wie z. B. Nachbarschaftsbeziehungen zwischen Atomen zu definieren.
Der vordefinierte Ablauf ist folgender:

  • glgenerate (eTom.objects.Structure.glgenerate)
  • generate (eTom.objects.Structure.generate)
  • readFile (eTom.objects.File.readFile)

Sollte readFile zur Generierung benötigt werden, so kann aus readFile die Methode reinit() aufgerufen werden, welche dann einen erneuten Aufruf der generate Methode verursacht, sobald das Objekt dargestellt werden soll.