====== glNewList() ====== glNewList ist definiert im OpenGL zugehörigen [[Include]] des jeweiligen Betriebsystems. ===== Funktion ===== glNewList erzeugt eine neue Liste von Konstruktionsanweisungen, um einen Körper zu generieren. Es wird gewissermaßen ein Bauplan in der Grafikkarte abgelegt. Die Konstruktion eines Körpers ist anschließend mit [[glCallList()]] bzw. [[glCallLists()]] möglich. Dabei werden alle Anweisungen sogleich mit den übergebenen Werten an die Grafikkarte übermittelt. Berechnungen werden also einmalig durchgeführt und der berechnete Bauplan in den Grafikspeicher geladen. Da die Berechnungen einmalig sind, spart das Zeit, allerdings kann eine in die Grafikkarte geladener DisplayList nicht mehr geändert werden. Möchte man beispielsweise die Farbe eines Bauteils ändern, so empfielt es sich, die Farbe nicht Teil des Bauplans werden zu lassen, sondern erst die Farbe zu setzen und dann die Liste mit der gesetzten Farbe konstruieren zu lassen. In eine DisplayListe können grundsätzliche alle Befehle zum Konstruieren aufgenommen werden, wie [[glTranslate()]], [[glRotate]], [[glScale]], sowie die eigentliche Übergabe von Polygonen mit [[glBegin()]]/[[glEnd()]]. Wichtig ist, dass man auch mit [[glCallList()]]/[[glCallLists()]] auf bereits vorhandene DisplayListen zugreifen kann. Dabei werden die Listen nicht in die hier zu definierende Liste einkopiert, sondern wirklich aufgerufen. Ändern sich die aufgerufenen DisplayListen, so ändern sich damit auch das, was durch diese Liste erzeugt wird. ===== Signatur ===== void glNewList(GLuint list, GLenum mode); **list**: Der Index, der zu verändernden DisplayListe. \\ **mode**: Gibt an, ob bei der Eingabe direkt ein Objekt erzeugt werden soll \\ \\ ^ mode ^ Bedeutung ^ | GL_COMPILE | Die Anweisungen direkt in die DisplayListe kompilieren \\ Dies eignet sich, um vor dem Zeichnen, Objektbeschreibungen in die Grafikkarte zu laden, um diese später beim Zeichnen der Szene zu verwenden. | | GL_COMPILE_AND_EXECUTE | Die Anweisungen in die DisplayListe kompilieren und gleichzeitig sofort ausführen \\ Dies eignet sich, um eine Szene zu zeichnen und dieses Element später noch wiederholt in die Szene zu kopieren. | ===== Hinweise ===== Die folgenden Befehle werden nicht in die DisplayListe einkompiliert.[[glAreTexturesResident()]], [[glColorPointer()]], [[glDeleteLists()]], [[glDeleteTextures()]], [[glDisableClientState()]], [[glEdgeFlagPointer()]], [[glEnableClientState()]], [[glFeedbackBuffer()]], [[glFinish()]], [[glFlush()]], [[glGenLists()]], [[glGenTextures()]], [[glIndexPointer()]], [[glInterleavedArrays()]], [[glIsEnabled()]], [[glIsList()]], [[glIsTexture()]], [[glNormalPointer()]], [[glPopClientAttrib()]], [[glPixelStore()]], [[glPushClientAttrib()]], [[glReadPixels()]], [[glRenderMode()]], [[glSelectBuffer()]], [[glTexCoordPointer()]], [[glVertexPointer()]], sowie alle [[glGet()]] Befehle. [[glTexImage1D()]], [[glTexImage2D()]] und [[glTexImage3D()]] werden ebenso sofort ausgeführt und nicht in die DisplayListe einkompiliert, wenn ihr erstes Argument ''GL_PROXY_TEXTURE_1D'', ''GL_PROXY_TEXTURE_2D'', oder ''GL_PROXY_TEXTURE_3D'' ist. Sofern die ARB_imaging Erweiterung unterstützt wird, wird [[glHistogram()]] sofort ausgeführt, wenn es mit ''GL_PROXY_HISTOGRAM'' gerufen wird. Ähnlich dazu wird [[glColorTable()]] sofort ausgeführt, wenn das erste Argument ''GL_PROXY_COLOR_TABLE'', ''GL_PROXY_POST_CONVOLUTION_COLOR_TABLE'' oder ''GL_PROXY_POST_COLOR_MATRIX_COLOR_TABLE'' ist. Bei OpenGL V1.3 und höher oder wenn die ARB_multitexture Erweiterung unterstützt wird, so wird [[glClientActiveTexture()]] nicht in die Liste kompiliert sondern sofort ausgeführt. In Kurzfassung ergibt sich, dass Veränderungen am Grafikspeicher, sowie Abfragen sofort ausgeführt werden, da Abfragen in einem statischen Baupaln zur Laufzeit nicht mehr ausgewertet würden und Veränderungen im Grafikspeicher (Texturen, Listen) durch die wiederholte Konstruktion eines Objektes keinen Sinn ergeben. Wenn [[glEndList()]] gerufen wird, wird die erstellte DisplayListe vollständig an dem übergebenen Index ''list'' gebunden. Sofern der Index bereits mit einer anderen DisplayListe belegt war, so wird die Liste ausgetauscht. ===== Abfragen ===== [[glIsList()]] \\ [[glGet()]] mit GL_LIST_INDEX \\ [[glGet()]] mit GL_LIST_MODE \\ ===== Fehler ===== Folgende Werte können als [[glGetError|Fehler]] generiert werden: ''GL_INVALID_VALUE'': ''list'' ist 0. \\ ''GL_INVALID_ENUM'': Als ''mode'' wurde ein ungültiger Wert übergeben. \\ ''GL_INVALID_OPERATION'': ''[[glEndList()]]'' wurde ohne vorhergehendes ''glNewList()'' gerufen oder ''glNewList()'' wird gerufen, während bereits eine DisplayListe definiert wird, also vor ''[[glEndList()]]''. \\ ''GL_INVALID_OPERATION'': ''glNewList()'' oder ''[[glEndList()]]'' wurde zwischen einen [[glBegin()]] und [[glEnd()]]-Abschnitt aufgerufen. \\ ''GL_OUT_OF_MEMORY'': Es ist nicht mehr genug Speicher vorhanden, um diese DisplayListe zu kompilieren. Sofern die OpenGL Version 1.1. oder höher ist, so werden keine Änderungen an den bisherigen DisplayListen durchgeführt und auch der Status der GL-Engine wird nicht verändert, so als wäre nie versucht worden, eine DisplayListe zu verändern. ===== Beispiel ===== -- ===== siehe auch ===== [[ogl:lib:start|OpenGL]]: [[ogl:lib:glDeleteLists()]], [[ogl:lib:glNewList()]], [[ogl:lib:glEndList()]], [[ogl:lib:glCallList()]], [[ogl:lib:glCallLists()]]