void scheduleGL(std::tr1::function<void()> glBlock, ZPos z) { // TODO: Document this case: Clipped-away GL blocks are *not* being run. if (clipRectStack.clippedWorldAway()) return; int complementOfBlockIndex = ~(int)glBlocks.size(); glBlocks.push_back(glBlock); DrawOp op; op.verticesOrBlockIndex = complementOfBlockIndex; op.renderState.transform = ¤tTransform(); if (const ClipRect* cr = clipRectStack.maybeEffectiveRect()) op.renderState.clipRect = *cr; op.z = z; ops.push_back(op); }
void performDrawOpsAndCode() { // Apply Z-Ordering. std::stable_sort(ops.begin(), ops.end()); RenderStateManager manager; #ifdef GOSU_IS_IPHONE if (ops.empty()) return; DrawOps::const_iterator current = ops.begin(), last = ops.end() - 1; for (; current != last; ++current) { manager.setRenderState(current->renderState); current->perform(&*(current + 1)); } manager.setRenderState(last->renderState); last->perform(0); #else for (DrawOps::const_iterator current = ops.begin(), last = ops.end(); current != last; ++current) { manager.setRenderState(current->renderState); if (current->verticesOrBlockIndex >= 0) current->perform(0); else { // GL code int blockIndex = ~current->verticesOrBlockIndex; assert (blockIndex >= 0); assert (blockIndex < glBlocks.size()); glBlocks[blockIndex](); manager.enforceAfterUntrustedGL(); } } #endif }