Files
esengine/source/src/ECS/Utils/RenderableComponentList.ts

108 lines
4.2 KiB
TypeScript
Raw Normal View History

///<reference path="../../Graphics/Renderers/IRenderable.ts" />
module es {
export class RenderableComponentList {
/**
* IRenderable列表的全局updatePrder排序
*/
public static compareUpdatableOrder = new RenderableComparer();
/**
*
*/
public _components: IRenderable[] = [];
/**
* 便
*/
public _componentsByRenderLayer: Map<number, IRenderable[]> = new Map<number, IRenderable[]>();
public _unsortedRenderLayers: number[] = [];
2020-11-18 14:56:08 +08:00
private _componentsNeedSort: boolean = true;
public get componentsNeedSort(): boolean {
return this._componentsNeedSort;
}
public set componentsNeedSort(value: boolean) {
this._componentsNeedSort = value;
}
public get count() {
return this._components.length;
}
public get buffer() {
return this._components;
}
public add(component: IRenderable) {
this._components.push(component);
this.addToRenderLayerList(component, component.renderLayer);
}
public remove(component: IRenderable) {
this._components.remove(component);
this._componentsByRenderLayer.get(component.renderLayer).remove(component);
}
public updateRenderableRenderLayer(component: IRenderable, oldRenderLayer: number, newRenderLayer: number) {
// 需要注意的是如果渲染层在组件update之前发生了改变
if (this._componentsByRenderLayer.has(oldRenderLayer) && this._componentsByRenderLayer.get(oldRenderLayer).contains(component)) {
this._componentsByRenderLayer.get(oldRenderLayer).remove(component);
this.addToRenderLayerList(component, newRenderLayer);
}
}
/**
*
* @param renderLayer
*/
public setRenderLayerNeedsComponentSort(renderLayer: number) {
if (!this._unsortedRenderLayers.contains(renderLayer))
this._unsortedRenderLayers.push(renderLayer);
2020-11-18 14:56:08 +08:00
this.componentsNeedSort = true;
}
public setNeedsComponentSort() {
2020-11-18 14:56:08 +08:00
this.componentsNeedSort = true;
}
public addToRenderLayerList(component: IRenderable, renderLayer: number) {
let list = this.componentsWithRenderLayer(renderLayer);
2020-08-08 14:43:43 +08:00
if (list.contains(component)) {
2020-08-08 09:43:03 +08:00
console.warn("组件呈现层列表已经包含此组件");
return;
}
list.push(component);
if (!this._unsortedRenderLayers.contains(renderLayer))
this._unsortedRenderLayers.push(renderLayer);
2020-11-18 14:56:08 +08:00
this.componentsNeedSort = true;
}
/**
* 使
* @param renderLayer
*/
public componentsWithRenderLayer(renderLayer: number): IRenderable[] {
if (!this._componentsByRenderLayer.get(renderLayer)) {
this._componentsByRenderLayer.set(renderLayer, []);
}
return this._componentsByRenderLayer.get(renderLayer);
}
public updateList() {
2020-11-18 14:56:08 +08:00
if (this.componentsNeedSort) {
this._components.sort(RenderableComponentList.compareUpdatableOrder.compare);
2020-11-18 14:56:08 +08:00
this.componentsNeedSort = false;
}
if (this._unsortedRenderLayers.length > 0) {
for (let i = 0, count = this._unsortedRenderLayers.length; i < count; i++) {
let renderLayerComponents = this._componentsByRenderLayer.get(this._unsortedRenderLayers[i]);
if (renderLayerComponents) {
renderLayerComponents.sort(RenderableComponentList.compareUpdatableOrder.compare);
}
}
this._unsortedRenderLayers.length = 0;
2020-08-08 09:43:03 +08:00
}
}
}
}