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 = { type GLCanvasEvent = {
@ -265,6 +270,7 @@ class GLCanvas extends Emitter<GLCanvasEvent> {
this.canvas = ele ?? document.createElement("canvas"); this.canvas = ele ?? document.createElement("canvas");
this.div = document.createElement("div"); this.div = document.createElement("div");
this.div.className = opt.clasName ?? "";
this.div.appendChild(this.canvas); this.div.appendChild(this.canvas);
this.canvas.style.width = "100%"; this.canvas.style.width = "100%";

View File

@ -47,14 +47,46 @@ type ObjectID = Symbol | string | number;
*/ */
type ObjectData = Array<number> | Float32Array | Float64Array; type ObjectData = Array<number> | Float32Array | Float64Array;
interface IRendererConstructor<
M extends IAnyObject = {}
> {
new (canvas: HTMLCanvasElement, param?: M): AbstractRenderer<
IRendererParam, IAnyObject, Record<EventType, any>
>
}
/** /**
* API * API
*/ */
abstract class AbstractRenderer< abstract class AbstractRenderer<
P extends IRendererParam, P extends IRendererParam = {},
M extends IAnyObject = {},
E extends Record<EventType, any> = {} E extends Record<EventType, any> = {}
> extends Emitter<E> { > 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 * @function start
* \ * \
@ -87,4 +119,4 @@ abstract class AbstractRenderer<
} }
export default 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 { Component, ReactNode, createRef } from "react";
import { GLCanvas } from "@GLRender/GLCanvas"; import { ClassicRenderer } from "@GLRender/ClassicRenderer";
import { Group } from "@Model/Group";
import { Entry } from "../Entry/Entry"; import { Entry } from "../Entry/Entry";
import "./Laboratory.scss"; import "./Laboratory.scss";
@ -17,18 +16,19 @@ class Laboratory extends Component {
throw new Error("Laboratory: 无法获取到 Canvas 容器节点"); throw new Error("Laboratory: 无法获取到 Canvas 容器节点");
} }
if (this.canvasContRef.current.getElementsByTagName("canvas").length > 0) { if (this.canvasContRef.current.querySelector("*")) {
throw new Error("Laboratory: 重复引用 canvas 节点"); throw new Error("Laboratory: 重复引用 canvas 节点");
} }
const glCanvas = new GLCanvas(undefined, { const canvas = document.createElement("canvas");
autoResize: true,
mouseEvent: true, const renderer = new ClassicRenderer(canvas, {
eventLog: false clasName: "canvas"
}); });
glCanvas.dom.className = "canvas"; console.log(renderer);
this.canvasContRef.current.appendChild(glCanvas.dom);
this.canvasContRef.current.appendChild(renderer.canvas.dom);
} }
} }