addPlane(plane) {
        if(plane.type === "PingPongPlane") {
            this.stacks.pingPong.push(plane);
        }
        else if(plane.target) {
            this.addToRenderTargetsStack(plane);
        }
        else {
            if(plane._transparent) {
                // rebuild a stack of all transparent planes
                const planeStack = this.addToRegularPlaneStack(plane);

                // sort by their depth position
                planeStack.sort((a, b) => b.relativeTranslation.z - a.relativeTranslation.z);

                // then sort by their render order
                planeStack.sort((a, b) => b.renderOrder - a.renderOrder);

                this.stacks.transparent = planeStack;
            }
            else {
                // rebuild a stack of all opaque planes
                const planeStack = this.addToRegularPlaneStack(plane);

                // then sort by their render order
                planeStack.sort((a, b) => b.renderOrder - a.renderOrder);

                this.stacks.opaque = planeStack;
            }
        }
    }
This function will add a plane into one of our 4 stacks : pingPong, renderTargets, transparent and opaque
     - pingPong is just a simple array (ordered by order of creation)
     - renderTargets array is ordered by render target creation order, planes renderOrder value and then planes indexes (order of creation)
     - transparent array is ordered by renderOrder, Z positions, geometry IDs and then indexes (first added first drawn)
     - opaque array is ordered by renderOrder, geometry IDs and then indexes (first added first drawn)

     This is done to improve speed and reduce GL calls

     params:
     @plane (Plane object): plane to add to our scene
*