private void renderSubScene(Spatial scene, ViewPort vp) {
        // check culling first
        if (!scene.checkCulling(vp.getCamera())) {
            return;
        }
        scene.runControlRender(this, vp);
        if (scene instanceof Node) {
            // Recurse for all children
            Node n = (Node) scene;
            List<Spatial> children = n.getChildren();
            // Saving cam state for culling
            int camState = vp.getCamera().getPlaneState();
            for (int i = 0; i < children.size(); i++) {
                // Restoring cam state before proceeding children recursively
                vp.getCamera().setPlaneState(camState);
                renderSubScene(children.get(i), vp);
            }
        } else if (scene instanceof Geometry) {
            // addUserEvent to the render queue
            Geometry gm = (Geometry) scene;
            if (gm.getMaterial() == null) {
                throw new IllegalStateException("No material is set for Geometry: " + gm.getName());
            }
            vp.getQueue().addToQueue(gm, scene.getQueueBucket());
        }
    }
Recursively renders the scene.

@param scene the scene to be rendered (not null)
@param vp the ViewPort to render in (not null)
jme3-core/src/main/java/com/jme3/renderer/RenderManager.java