import { Transform } from "./transform"; import { BufferStructure, DefaultVertexData, Mesh } from "zogra-renderer"; import { Material } from "zogra-renderer"; import { GlobalContext } from "zogra-renderer"; import { Entity, EntityEvents } from "./entity"; import { RenderContext, RenderData } from "../render-pipeline"; import { EventEmitter, IEventSource, EventKeys } from "zogra-renderer"; export interface RenderObjectEvents< VertexStruct extends BufferStructure = typeof DefaultVertexData, TMaterial extends Material = Material > extends EntityEvents { "render": (obj: RenderObject, context: RenderContext, data: RenderData) => void; } export class RenderObject< VertexStruct extends BufferStructure = typeof DefaultVertexData, TMaterial extends Material = Material > extends Entity implements IEventSource> { meshes: Mesh[] = []; materials: TMaterial[] = []; constructor(ctx = GlobalContext()) { super(); (this.materials as unknown as Material[]) = [ctx.assets.materials.default]; } on>>(event: T, listener: RenderObjectEvents[T]) { this.eventEmitter.with>().on(event, listener); } off>>(event: T, listener: RenderObjectEvents[T]) { this.eventEmitter.with>().off(event, listener); } /** @internal */ render(context: RenderContext, data: RenderData) { this.eventEmitter.with>().emit("render", this, context, data); for (let i = 0; i < this.meshes.length; i++) { context.renderer.drawMesh(this.meshes[i], this.localToWorldMatrix, this.materials[i]); } } }