@Override
    public void pipelineRender(RenderManager rm, PipelineContext context, ViewPort vp, float tpf) {
        
        AppProfiler prof = rm.getProfiler();
        
        SafeArrayList<SceneProcessor> processors = vp.getProcessors();
        if (processors.isEmpty()) {
            processors = null;
        }
        
        if (processors != null) {
            if (prof != null) {
                prof.vpStep(VpStep.PreFrame, vp, null);
            }
            for (SceneProcessor p : processors.getArray()) {
                if (!p.isInitialized()) {
                    p.initialize(rm, vp);
                }
                p.setProfiler(prof);
                if (prof != null) {
                    prof.spStep(SpStep.ProcPreFrame, p.getClass().getSimpleName());
                }
                p.preFrame(tpf);
            }
        }
        
        rm.applyViewPort(vp);
        
        if (prof != null) {
            prof.vpStep(VpStep.RenderScene, vp, null);
        }
        // flatten scenes into render queue
        List<Spatial> scenes = vp.getScenes();
        for (int i = scenes.size() - 1; i >= 0; i--) {
            rm.renderScene(scenes.get(i), vp);
        }
        if (processors != null) {
            if (prof != null) {
                prof.vpStep(VpStep.PostQueue, vp, null);
            }
            for (SceneProcessor p : processors.getArray()) {
                if (prof != null) {
                    prof.spStep(SpStep.ProcPostQueue, p.getClass().getSimpleName());
                }
                p.postQueue(vp.getQueue());
            }
        }

        if (prof != null) {
            prof.vpStep(VpStep.FlushQueue, vp, null);
        }
        rm.flushQueue(vp);

        if (processors != null) {
            if (prof != null) {
                prof.vpStep(VpStep.PostFrame, vp, null);
            }
            for (SceneProcessor proc : processors.getArray()) {
                if (prof != null) {
                    prof.spStep(SpStep.ProcPostFrame, proc.getClass().getSimpleName());
                }
                proc.postFrame(vp.getOutputFrameBuffer());
            }
            if (prof != null) {
                prof.vpStep(VpStep.ProcEndRender, vp, null);
            }
        }

        // render the translucent objects queue after processors have been rendered
        rm.renderTranslucentQueue(vp);

        // clear any remaining spatials that were not rendered.
        rm.clearQueue(vp);
        
        rendered = true;

        /*
         * the call to setCamera will indirectly cause a clipRect to be set, must be cleared to avoid surprising results
         * if renderer#copyFrameBuffer is used later
         */
        rm.getRenderer().clearClipRect();

        if (prof != null) {
            prof.vpStep(VpStep.EndRender, vp, null);
        }
        
    }
Port of the standard forward renderer to a pipeline.

@author codex
jme3-core/src/main/java/com/jme3/renderer/pipeline/ForwardPipeline.java