import Vec2 from "../../DataTypes/Vec2"; import Line from "../../Nodes/Graphics/Line"; import Point from "../../Nodes/Graphics/Point"; import Rect from "../../Nodes/Graphics/Rect"; import ResourceManager from "../../ResourceManager/ResourceManager"; import Scene from "../../Scene/Scene"; /** * A utility class to help the @reference[CanvasRenderer] render @reference[Graphic]s */ export default class GraphicRenderer { /** The resource manager of the game engine */ protected resourceManager: ResourceManager; /** The current scene */ protected scene: Scene; /** The rendering context */ protected ctx: CanvasRenderingContext2D; constructor(ctx: CanvasRenderingContext2D){ this.resourceManager = ResourceManager.getInstance(); this.ctx = ctx; } /** * Sets the scene of this GraphicRenderer * @param scene The current scene */ setScene(scene: Scene): void { this.scene = scene; } /** * Renders a point * @param point The point to render * @param zoom The zoom level */ renderPoint(point: Point, zoom: number): void { this.ctx.fillStyle = point.color.toStringRGBA(); this.ctx.fillRect((-point.size.x/2)*zoom, (-point.size.y/2)*zoom, point.size.x*zoom, point.size.y*zoom); } renderLine(line: Line, origin: Vec2, zoom: number): void { this.ctx.strokeStyle = line.color.toStringRGBA(); this.ctx.lineWidth = line.thickness; this.ctx.beginPath(); this.ctx.moveTo(0, 0); this.ctx.lineTo((line.end.x - line.start.x)*zoom, (line.end.y - line.start.y)*zoom); this.ctx.closePath(); this.ctx.stroke(); } /** * Renders a rect * @param rect The rect to render * @param zoom The zoom level */ renderRect(rect: Rect, zoom: number): void { // Draw the interior of the rect if(rect.color.a !== 0){ this.ctx.fillStyle = rect.color.toStringRGB(); if (rect.fillWidth !== null) { this.ctx.fillRect((-rect.size.x/2)*zoom, (-rect.size.y/2)*zoom, rect.fillWidth*zoom, rect.size.y*zoom); } else { this.ctx.fillRect((-rect.size.x/2)*zoom, (-rect.size.y/2)*zoom, rect.size.x*zoom, rect.size.y*zoom); } } // Draw the border of the rect if it isn't transparent if(rect.borderColor.a !== 0){ this.ctx.strokeStyle = rect.getBorderColor().toStringRGB(); this.ctx.lineWidth = rect.getBorderWidth(); this.ctx.strokeRect((-rect.size.x/2)*zoom, (-rect.size.y/2)*zoom, rect.size.x*zoom, rect.size.y*zoom); } } }