polygonjs-engine
Version:
node-based webgl 3D engine https://polygonjs.com
85 lines (75 loc) • 2.72 kB
text/typescript
import {PolyEngine} from '../../../Poly';
import {PolyPlugin, PolyPluginData} from './Plugin';
import {BaseNodeConstructor, BaseOperationConstructor} from '../nodes/NodesRegister';
import {NodeContext} from '../../NodeContext';
import {PolyDictionary} from '../../../../types/GlobalTypes';
export interface PluginsRegisterData {
plugins: PolyDictionary<PolyPluginData>;
nodes: PolyDictionary<PolyDictionary<string>>;
operations: PolyDictionary<PolyDictionary<string>>;
}
export class PluginsRegister {
private _current_plugin: PolyPlugin | undefined;
private _plugins_by_name: Map<string, PolyPlugin> = new Map();
private _plugin_name_by_node_context_by_type: Map<NodeContext, Map<string, string>> = new Map();
private _plugin_name_by_operation_context_by_type: Map<NodeContext, Map<string, string>> = new Map();
constructor(private poly: PolyEngine) {}
register(plugin: PolyPlugin) {
this._current_plugin = plugin;
this._plugins_by_name.set(plugin.name(), plugin);
plugin.init(this.poly);
this._current_plugin = undefined;
}
pluginByName(pluginName: string) {
return this._plugins_by_name.get(pluginName);
}
registerNode(node: BaseNodeConstructor) {
if (!this._current_plugin) {
return;
}
const context = node.nodeContext();
const type = node.type();
let map_for_context = this._plugin_name_by_node_context_by_type.get(context);
if (!map_for_context) {
map_for_context = new Map();
this._plugin_name_by_node_context_by_type.set(context, map_for_context);
}
map_for_context.set(type, this._current_plugin.name());
}
registerOperation(operation: BaseOperationConstructor) {
if (!this._current_plugin) {
return;
}
const context = operation.context();
const type = operation.type();
let map_for_context = this._plugin_name_by_operation_context_by_type.get(context);
if (!map_for_context) {
map_for_context = new Map();
this._plugin_name_by_operation_context_by_type.set(context, map_for_context);
}
map_for_context.set(type, this._current_plugin.name());
}
toJson() {
const data: PluginsRegisterData = {
plugins: {},
nodes: {},
operations: {},
};
this._plugins_by_name.forEach((plugin, name) => {
data.plugins[name] = plugin.toJSON();
});
this._plugin_name_by_node_context_by_type.forEach((map_for_context, context) => {
data.nodes[context] = {};
map_for_context.forEach((plugin_name, type) => {
data.nodes[context][type] = plugin_name;
});
});
this._plugin_name_by_operation_context_by_type.forEach((map_for_context, context) => {
data.operations[context] = {};
map_for_context.forEach((plugin_name, type) => {
data.operations[context][type] = plugin_name;
});
});
return data;
}
}