renderers_Renderer.js

const ConstraintRenderer = require("./ConstraintRenderer");
const ParticleRenderer = require("./ParticleRenderer");
const WallRenderer = require("./WallRenderer");

/**
 * `Renderer` is the general renderer class that renders `Particle`s, `Constraint`s and `Wall`s. Overall, this is a simplistic renderer
 * intended for quick visualization. It is encouraged to write a custom renderer for more complex/efficient scenes.
 */
class Renderer {
    constructor(solver, canvas) {
        this.solver = solver;
        this.canvas = canvas;
        this.context = this.canvas.getContext("2d");
        this.constraintRenderer = new ConstraintRenderer(solver, this.context);
        this.particleRenderer = new ParticleRenderer(solver, this.context);
        this.wallRenderer = new WallRenderer(solver, this.context);
    }

    /**
     * Updates the particles in the `particleRenderer`. Must be called every time the list of particles is reassigned.
     * @param {Particle[]} list 
     * @public
     */
    updateRendererParticles(list) {
        this.particleRenderer.particles = list;
    }

    /**
     * Updates the HTMLCanvas context of each sub-renderer
     * @param {context} context 
     */
    updateContext(context) {
        this.constraintRenderer.context = context;
        this.particleRenderer.context = context;
        this.WallRenderer.context = context;
    }

    /**
     * Renders a single frame of the solver
     * @public
     */
    renderFrame() {
        this.clear();
        this.particleRenderer.renderFrame();
        this.constraintRenderer.renderFrame();
        this.wallRenderer.renderFrame();
    }

    /**
     * Clears the frame
     * @public
     */
    clear() {
        this.context.clearRect(0, 0, this.canvas.width, this.canvas.height);
    }
}

module.exports = Renderer;