Add classic renderer

This commit is contained in:
MrKBear 2022-02-08 00:23:21 +08:00
parent c7c40bddea
commit a7aae62233
4 changed files with 100 additions and 12 deletions

View File

@ -0,0 +1,50 @@
import { AbstractRenderer, ObjectID, ObjectData, ICommonParam } from "@Model/Renderer";
import { GLCanvas, GLCanvasOption } from "./GLCanvas";
interface IRendererOwnParams {}
/**
*
*/
type IRendererParams = IRendererOwnParams & GLCanvasOption;
class ClassicRenderer extends AbstractRenderer<{}, IRendererParams> {
/**
*
*/
public param: IRendererParams;
/**
* 使
*/
public canvas: GLCanvas;
public constructor(canvas: HTMLCanvasElement, param: IRendererParams = {}) {
super();
// 初始化参数
this.param = {
autoResize: param.autoResize ?? true,
mouseEvent: param.autoResize ?? true,
eventLog: param.eventLog ?? false,
clasName: param.clasName ?? ""
}
// 实例化画布对象
this.canvas = new GLCanvas(canvas, this.param);
}
clean(id?: ObjectID | ObjectID[]): this {
throw new Error("Method not implemented.");
}
points(id: ObjectID, position: ObjectData, param?: ICommonParam): this {
throw new Error("Method not implemented.");
}
cube(id: ObjectID, position: ObjectData, param?: ICommonParam): this {
throw new Error("Method not implemented.");
}
}
export default ClassicRenderer;
export { ClassicRenderer };

View File

@ -22,7 +22,12 @@ interface GLCanvasOption {
* 使
*
*/
eventLog?: boolean
eventLog?: boolean,
/**
*
*/
clasName?: string
}
type GLCanvasEvent = {
@ -265,6 +270,7 @@ class GLCanvas extends Emitter<GLCanvasEvent> {
this.canvas = ele ?? document.createElement("canvas");
this.div = document.createElement("div");
this.div.className = opt.clasName ?? "";
this.div.appendChild(this.canvas);
this.canvas.style.width = "100%";

View File

@ -47,14 +47,46 @@ type ObjectID = Symbol | string | number;
*/
type ObjectData = Array<number> | Float32Array | Float64Array;
interface IRendererConstructor<
M extends IAnyObject = {}
> {
new (canvas: HTMLCanvasElement, param?: M): AbstractRenderer<
IRendererParam, IAnyObject, Record<EventType, any>
>
}
/**
* API
*/
abstract class AbstractRenderer<
P extends IRendererParam,
P extends IRendererParam = {},
M extends IAnyObject = {},
E extends Record<EventType, any> = {}
> extends Emitter<E> {
/**
*
*/
abstract param: M;
/**
*
*/
get isRenderer() {
return true;
}
/**
*
*/
public static isRenderer(render: any): render is AbstractRenderer {
if (render instanceof Object) {
return !!(render as AbstractRenderer).isRenderer;
} else {
return false;
}
};
/**
* @function start
* \
@ -87,4 +119,4 @@ abstract class AbstractRenderer<
}
export default AbstractRenderer;
export { AbstractRenderer };
export { AbstractRenderer, ObjectID, ICommonParam, ObjectData, IRendererConstructor };

View File

@ -1,6 +1,5 @@
import { Component, ReactNode, createRef } from "react";
import { GLCanvas } from "@GLRender/GLCanvas";
import { Group } from "@Model/Group";
import { ClassicRenderer } from "@GLRender/ClassicRenderer";
import { Entry } from "../Entry/Entry";
import "./Laboratory.scss";
@ -17,18 +16,19 @@ class Laboratory extends Component {
throw new Error("Laboratory: 无法获取到 Canvas 容器节点");
}
if (this.canvasContRef.current.getElementsByTagName("canvas").length > 0) {
if (this.canvasContRef.current.querySelector("*")) {
throw new Error("Laboratory: 重复引用 canvas 节点");
}
const glCanvas = new GLCanvas(undefined, {
autoResize: true,
mouseEvent: true,
eventLog: false
const canvas = document.createElement("canvas");
const renderer = new ClassicRenderer(canvas, {
clasName: "canvas"
});
glCanvas.dom.className = "canvas";
this.canvasContRef.current.appendChild(glCanvas.dom);
console.log(renderer);
this.canvasContRef.current.appendChild(renderer.canvas.dom);
}
}