@polygonjs/polygonjs
Version:
node-based WebGL 3D engine https://polygonjs.com
53 lines (48 loc) • 1.82 kB
text/typescript
import {Object3D, Material} from 'three';
import {clothControllerFromObject} from './ClothControllerRegister';
import {
ClothMaterialUniformConfig,
ClothMaterialUniformConfigRef,
ClothMaterialUniformNameConfig,
} from './modules/ClothFBOController';
import {MaterialUserDataUniforms} from '../../engine/nodes/gl/code/assemblers/materials/OnBeforeCompile';
import {UNIFORM_PARAM_PREFIX, UNIFORM_TEXTURE_PREFIX} from '../material/uniform';
function _addParamPrefix(uniformName: string): string {
return `${UNIFORM_PARAM_PREFIX}${uniformName}`;
}
function _addTexturePrefix(uniformName: string): string {
return `${UNIFORM_TEXTURE_PREFIX}${uniformName}`;
}
export function clothSolverStepSimulation(
clothObject: Object3D,
stepsCount: number,
constraintInfluence: number,
viscosity: number,
spring: number,
uniformConfig: ClothMaterialUniformConfigRef
) {
const controller = clothControllerFromObject(clothObject);
if (!controller) {
console.log('no controller for', clothObject.uuid);
return;
}
controller.stepsCount = stepsCount;
controller.constraintInfluence = constraintInfluence;
controller.viscosity = viscosity;
controller.spring = spring;
controller.update(uniformConfig);
}
export function clothSolverUpdateMaterial(
material: Material,
uniformConfig: ClothMaterialUniformConfig,
uniformNameConfig: ClothMaterialUniformNameConfig
) {
const uniforms = MaterialUserDataUniforms.getUniforms(material);
if (!uniforms) {
return;
}
uniforms[_addParamPrefix(uniformNameConfig.tSize)].value = uniformConfig.tSize;
uniforms[_addTexturePrefix(uniformNameConfig.tPosition0)].value = uniformConfig.tPosition0;
uniforms[_addTexturePrefix(uniformNameConfig.tPosition1)].value = uniformConfig.tPosition1;
uniforms[_addTexturePrefix(uniformNameConfig.tNormal)].value = uniformConfig.tNormal;
}