git add clock basic renderer

This commit is contained in:
MrKBear 2022-02-08 16:05:12 +08:00
parent a7aae62233
commit 2550e2e14f
7 changed files with 251 additions and 44 deletions

View File

@ -0,0 +1,143 @@
import { AbstractRenderer, IRendererParam, IAnyObject } from "@Model/Renderer";
import { EventType } from "@Model/Emitter";
import { GLCanvas, GLCanvasOption } from "./GLCanvas";
import { GLContext } from "./GLContext";
import { Clock } from "@Model/Clock";
interface IRendererOwnParams {}
/**
*
*/
type IRendererParams = IRendererOwnParams & GLCanvasOption;
abstract class BasicRenderer<
P extends IRendererParam = {},
M extends IAnyObject = {},
E extends Record<EventType, any> = {}
> extends AbstractRenderer<P, M & IRendererParams, E> {
/**
*
*/
public param: Partial<M & IRendererParams> = {};
/**
* 使
*/
public canvas: GLCanvas;
/**
*
*/
protected clock: Clock;
public constructor(canvas: HTMLCanvasElement, param: Partial<M & IRendererParams> = {}) {
super();
// 初始化参数
this.param = {
autoResize: param.autoResize ?? true,
mouseEvent: param.autoResize ?? true,
eventLog: param.eventLog ?? false,
className: param.className ?? ""
} as M & IRendererParams;
// 实例化画布对象
this.canvas = new GLCanvas(canvas, this.param);
// 尝试 webgl2
this.gl = this.canvas.can.getContext("webgl2") as any;
if (this.gl) {
this.glVersion = 2;
console.log("Render: Using WebGL2 :)");
} else {
// 尝试 WebGL1
this.gl = this.canvas.can.getContext("webgl") as any;
if (this.gl){
this.glVersion = 1;
console.log("Render: Using WebGL1 :(");
}
// 获取失败发出警告
else {
console.error("Render: Not supported WebGL!");
}
}
/**
*
*/
this.clock = new Clock();
/**
*
*/
this.onLoad(param);
}
/**
*
*/
protected run() {
this.clock.setFn(this.loop.bind(this));
this.clock.run();
}
/**
*
*/
protected resize() {
this.loop(0);
this.gl.viewport(0, 0, this.canvas.width, this.canvas.height);
}
/**
*
*/
protected autoResize() {
this.canvas.on("resize", this.resize.bind(this));
}
/**
*
*/
public cleanColor: [number, number, number, number] = [.1, .1, .1, 1.];
/**
*
*/
public cleanCanvas(){
this.gl.clearColor(
this.cleanColor[0], this.cleanColor[1],
this.cleanColor[2], this.cleanColor[3]
);
this.gl.clear(this.gl.COLOR_BUFFER_BIT | this.gl.DEPTH_BUFFER_BIT);
}
/**
* GL
*/
public gl: GLContext;
/**
* WebGL
*/
public glVersion: (0 | 1 | 2) = 0;
/**
*
* @param param
*/
abstract onLoad(param: Partial<M & IRendererParams>): void;
/**
*
*/
abstract loop(dur: number): void;
}
export default BasicRenderer;
export { BasicRenderer, IRendererParams };

View File

@ -1,49 +1,30 @@
import { AbstractRenderer, ObjectID, ObjectData, ICommonParam } from "@Model/Renderer"; import { ObjectID, ObjectData, ICommonParam } from "@Model/Renderer";
import { GLCanvas, GLCanvasOption } from "./GLCanvas"; import { BasicRenderer, IRendererParams } from "./BasicRenderer";
interface IRendererOwnParams {} interface IClassicRendererParams {}
/** class ClassicRenderer extends BasicRenderer<{}, IClassicRendererParams> {
*
*/
type IRendererParams = IRendererOwnParams & GLCanvasOption;
class ClassicRenderer extends AbstractRenderer<{}, IRendererParams> { onLoad(param: Partial<IClassicRendererParams & IRendererParams>): void {
this.run();
/** this.autoResize();
*
*/
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 { clean(id?: ObjectID | ObjectID[]): this {
throw new Error("Method not implemented."); throw new Error("Method not implemented.");
} }
points(id: ObjectID, position: ObjectData, param?: ICommonParam): this { points(id: ObjectID, position: ObjectData, param?: ICommonParam): this {
throw new Error("Method not implemented."); throw new Error("Method not implemented.");
} }
cube(id: ObjectID, position: ObjectData, param?: ICommonParam): this { cube(id: ObjectID, position: ObjectData, param?: ICommonParam): this {
throw new Error("Method not implemented."); throw new Error("Method not implemented.");
} }
loop(): void {
this.cleanCanvas();
}
} }
export default ClassicRenderer; export default ClassicRenderer;

View File

@ -27,7 +27,7 @@ interface GLCanvasOption {
/** /**
* *
*/ */
clasName?: string className?: string
} }
type GLCanvasEvent = { type GLCanvasEvent = {
@ -270,7 +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.className = opt.className ?? "";
this.div.appendChild(this.canvas); this.div.appendChild(this.canvas);
this.canvas.style.width = "100%"; this.canvas.style.width = "100%";

75
source/Model/Clock.ts Normal file
View File

@ -0,0 +1,75 @@
export {Clock, LoopFunction};
type LoopFunction = (t: number)=>void;
/**
*
*/
class Clock {
/**
*
*/
private allTime: number = 0;
/**
*
*/
public speed: number = 1;
/**
*
*/
private fn: LoopFunction;
/**
*
* @param fn
*/
public constructor(fn?: LoopFunction){
this.fn = fn ?? ((t) => {});
}
/**
*
* @param fn
*/
public setFn(fn:LoopFunction){
this.fn = fn;
}
/**
*
*/
public run(){
// 主循环
let loop = (t:number)=>{
// 时差
let dur = (t - this.allTime) * this.speed / 1000;
// 检测由于失焦导致的丢帧
if (t - this.allTime < 100) {
this.fn(dur);
}
// 更新时间
this.allTime = t;
// 继续循环
requestAnimationFrame(loop);
}
// 获取时间
requestAnimationFrame((t)=>{
// 记录初始时间
this.allTime = t;
// 开启循环
requestAnimationFrame(loop);
})
}
}

View File

@ -57,6 +57,9 @@ interface IRendererConstructor<
/** /**
* API * API
* @template P
* @template M
* @template E
*/ */
abstract class AbstractRenderer< abstract class AbstractRenderer<
P extends IRendererParam = {}, P extends IRendererParam = {},
@ -67,7 +70,7 @@ abstract class AbstractRenderer<
/** /**
* *
*/ */
abstract param: M; abstract param: Partial<M>;
/** /**
* *
@ -119,4 +122,8 @@ abstract class AbstractRenderer<
} }
export default AbstractRenderer; export default AbstractRenderer;
export { AbstractRenderer, ObjectID, ICommonParam, ObjectData, IRendererConstructor }; export {
AbstractRenderer, ObjectID, IAnyObject,
ICommonParam, IRendererParam,
ObjectData, IRendererConstructor
};

View File

@ -2,6 +2,7 @@ div.main-canvas {
position: fixed; position: fixed;
width: 100%; width: 100%;
height: 100%; height: 100%;
background-color: rgba($color: #000000, $alpha: .9);
div.canvas { div.canvas {
width: 100%; width: 100%;

View File

@ -23,7 +23,7 @@ class Laboratory extends Component {
const canvas = document.createElement("canvas"); const canvas = document.createElement("canvas");
const renderer = new ClassicRenderer(canvas, { const renderer = new ClassicRenderer(canvas, {
clasName: "canvas" className: "canvas"
}); });
console.log(renderer); console.log(renderer);