bool RenderObject::render() { // Objektänderungen validieren validateObject(); // Falls das Objekt nicht sichtbar ist, muss gar nichts gezeichnet werden if (!_visible) return true; // Falls notwendig, wird die Renderreihenfolge der Kinderobjekte aktualisiert. if (_childChanged) { sortRenderObjects(); _childChanged = false; } // Objekt zeichnen. doRender(); // Dann müssen die Kinder gezeichnet werden RENDEROBJECT_ITER it = _children.begin(); for (; it != _children.end(); ++it) if (!(*it)->render()) return false; return true; }
bool RenderObject::updateObjectState() { // Falls sich das Objekt verändert hat, muss der interne Zustand neu berechnet werden und evtl. Update-Regions für den nächsten Frame // registriert werden. if ((calcBoundingBox() != _oldBbox) || (_visible != _oldVisible) || (_x != _oldX) || (_y != _oldY) || (_z != _oldZ) || _refreshForced) { // Renderrang des Objektes neu bestimmen, da sich dieser verändert haben könnte if (_parentPtr.isValid()) _parentPtr->signalChildChange(); // Die Bounding-Box neu berechnen und Update-Regions registrieren. updateBoxes(); // Änderungen Validieren validateObject(); } // Dann muss der Objektstatus der Kinder aktualisiert werden. RENDEROBJECT_ITER it = _children.begin(); for (; it != _children.end(); ++it) if (!(*it)->updateObjectState()) return false; return true; }
void RenderObject::preRender(RenderObjectQueue *renderQueue) { // Objektänderungen validieren validateObject(); if (!_visible) return; // Falls notwendig, wird die Renderreihenfolge der Kinderobjekte aktualisiert. if (_childChanged) { sortRenderObjects(); _childChanged = false; } renderQueue->add(this); RENDEROBJECT_ITER it = _children.begin(); for (; it != _children.end(); ++it) (*it)->preRender(renderQueue); }