UNPKG

@polygonjs/polygonjs

Version:

node-based WebGL 3D engine https://polygonjs.com

130 lines (119 loc) 4.39 kB
import {Object3D} from 'three'; import {AbstractRenderer} from '../../engine/viewers/Common'; import {CoreParticlesAttribute} from './CoreParticlesAttribute'; import {CoreParticlesGpuComputeController} from './CoreParticlesGpuComputeController'; import {CoreParticlesRenderController} from './CoreParticlesRenderController'; import type {PolyScene} from '../../engine/scene/PolyScene'; import {ShaderName} from '../../engine/nodes/utils/shaders/ShaderName'; import {ParticlesSystemGpuSopNode} from '../../engine/nodes/sop/ParticlesSystemGpu'; import {TextureAllocationsController} from '../../engine/nodes/gl/code/utils/TextureAllocationsController'; import {GPUComputationConfigRef} from './gpuCompute/GPUComputationRenderer'; // import {CoreGroup} from '../geometry/Group'; export class CoreParticlesController { public readonly gpuController: CoreParticlesGpuComputeController; public readonly renderController: CoreParticlesRenderController; private _shadersByName: Map<ShaderName, string> = new Map(); private _shaderNames: ShaderName[] = []; private _uniformNames: string[] = []; protected _object: Object3D | undefined; protected _renderer: AbstractRenderer | undefined; constructor(public readonly scene: PolyScene, private _node: ParticlesSystemGpuSopNode) { this.gpuController = new CoreParticlesGpuComputeController(this); this.renderController = new CoreParticlesRenderController(this); this._node.initCoreParticlesControllerFromPersistedConfig(this); } object() { return this._object; } renderer() { return this._renderer; } dispose() { this.gpuController.dispose(); this.renderController.dispose(); } async init(object: Object3D, renderer: AbstractRenderer) { this._object = object; this._renderer = renderer; this.setShadersByName(this._node.shadersByName()); // const coreGroup = new CoreGroup(); // coreGroup.setObjects([this.object]); // if (isOnStartFrame) { // this._coreGroupSet = false; this.gpuController.reset(); // this.gpuController.resetParticleGroups(); // } // if (!this.gpuController.initialized()) { // this.debugMessage('particles:this.gpuController.init(coreGroup) START'); const configRef = this.gpuController.init(); if (!configRef) { console.warn('no configRef created'); return; } // this.debugMessage('particles:this.gpuController.init(coreGroup) END'); // } // if (!this.renderController.initialized()) { // this.renderController.init(); // this.debugMessage('particles:this.renderController.initRenderMaterial() START'); await this.renderController.init(); // this.debugMessage('particles:this.renderController.initRenderMaterial() END'); // } // this.gpuController.restartSimulationIfRequired(); // this.gpuController.computeSimulationIfRequired(0); const preRollFramesCount = CoreParticlesAttribute.getPreRollFramesCount(this._object); for (let i = 0; i < preRollFramesCount; i++) { this.gpuController.computeSimulation(1 / 60, configRef); } return configRef; } stepSimulation(delta: number, configRef: GPUComputationConfigRef) { this.gpuController.computeSimulation(delta, configRef); } async reset() { this.gpuController.reset(); this.renderController.reset(); if (this._object && this._renderer) { return await this.init(this._object, this._renderer); } else { console.log('no object or renderer', this._object, this._renderer); } } setError(message: string) { this._node.states.error.set(message); } // assemblerController(){ // return this._node.assemblerController() // } node() { return this._node; } setShadersByName(shadersByName: Map<ShaderName, string>) { this._shadersByName.clear(); this._shaderNames.length = 0; this._uniformNames.length = 0; shadersByName.forEach((shader, shaderName) => { this._shadersByName.set(shaderName, shader); this._shaderNames.push(shaderName); this._uniformNames.push(`texture_${shaderName}`); }); } shadersByName() { return this._shadersByName; } shaderNames() { return this._shaderNames; } uniformNames() { return this._uniformNames; } setPersistedTextureAllocationController(controller: TextureAllocationsController) { this.gpuController.setPersistedTextureAllocationController(controller); } private _debugCook = false; debugMessage(message: string) { if (!this._debugCook) { return; } console.log(message); } }