# all files / src/compositor/ Compositor.js

4.35% Statements 1/23
0% Branches 0/4
0% Functions 0/7
4.35% Lines 1/23

    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    15
    16
    17
    18
    19
    20
    21
    22
    23
    24
    25
    26
    27
    28
    29
    30
    31
    32
    33
    34
    35
    36
    37
    38
    39
    40
    41
    42
    43
    44
    45
    46
    47
    48
    49
    50
    51
    52
    53
    54
    55
    56
    57
    58
    59
    60
    61
    62
    63
    64
    65
    66
    67
    68
    69
    70
    71
    72
    73
    74
    75
    76
    77
    78
    79
    80
    81
    82
    83
    84
    85
    86
    87

    1×

     import Graph from './Graph';
    import TexturePool from './TexturePool';
    import FrameBuffer from '../FrameBuffer';

    /**
     * Compositor provide graph based post processing
     *
     * @constructor clay.compositor.Compositor
     * @extends clay.compositor.Graph
     *
     */
    var Compositor = Graph.extend(function() {
        return {
            // Output node
            _outputs: [],

            _texturePool: new TexturePool(),

            _frameBuffer: new FrameBuffer({
                depthBuffer: false
            })
        };
    },
    /** @lends clay.compositor.Compositor.prototype */
    {
        addNode: function(node) {
            Graph.prototype.addNode.call(this, node);
            node._compositor = this;
        },
        /**
         * @param  {clay.Renderer} renderer
         */
        render: function(renderer, frameBuffer) {
            if (this._dirty) {
                this.update();
                this._dirty = false;

                this._outputs.length = 0;
                for (var i = 0; i < this.nodes.length; i++) {
                    if (!this.nodes[i].outputs) {
                        this._outputs.push(this.nodes[i]);
                    }
                }
            }

            for (var i = 0; i < this.nodes.length; i++) {
                // Update the reference number of each output texture
                this.nodes[i].beforeFrame();
            }

            for (var i = 0; i < this._outputs.length; i++) {
                this._outputs[i].updateReference();
            }

            for (var i = 0; i < this._outputs.length; i++) {
                this._outputs[i].render(renderer, frameBuffer);
            }

            for (var i = 0; i < this.nodes.length; i++) {
                // Clear up
                this.nodes[i].afterFrame();
            }
        },

        allocateTexture: function (parameters) {
            return this._texturePool.get(parameters);
        },

        releaseTexture: function (parameters) {
            this._texturePool.put(parameters);
        },

        getFrameBuffer: function () {
            return this._frameBuffer;
        },

        /**
         * Dispose compositor
         * @param {clay.Renderer} renderer
         */
        dispose: function (renderer) {
            this._texturePool.clear(renderer);
        }
    });

    export default Compositor;