@hology/core 0.0.44 → 0.0.45
Sign up to get free protection for your applications and to get access to all the features.
- package/dist/csm.d.ts +8 -2
- package/dist/csm.js +1 -1
- package/dist/effects/vfx/behaviours.d.ts +28 -0
- package/dist/effects/vfx/behaviours.js +1 -1
- package/dist/effects/vfx/initializsers.d.ts +16 -0
- package/dist/effects/vfx/initializsers.js +1 -1
- package/dist/effects/vfx/rates.d.ts +7 -2
- package/dist/effects/vfx/rates.js +1 -1
- package/dist/effects/vfx/vfx-actor.js +1 -1
- package/dist/effects/vfx/vfx-asset.d.ts +7 -5
- package/dist/effects/vfx/vfx-asset.js +1 -1
- package/dist/effects/vfx/vfx-defs.d.ts +28 -2
- package/dist/effects/vfx/vfx-defs.js +1 -1
- package/dist/effects/vfx/vfx-materializer.d.ts +2 -2
- package/dist/effects/vfx/vfx-materializer.js +1 -1
- package/dist/effects/vfx/vfx-param.d.ts +31 -1
- package/dist/effects/vfx/vfx-param.js +1 -1
- package/dist/effects/vfx/vfx-renderers.d.ts +36 -0
- package/dist/effects/vfx/vfx-renderers.js +5 -0
- package/dist/gameplay/actors/builtin/components/character/character-animation.js +1 -1
- package/dist/gameplay/services/physics/physics-system.js +1 -1
- package/dist/rendering.d.ts +1 -1
- package/dist/rendering.js +1 -1
- package/dist/scene/asset-resource-loader.js +1 -1
- package/dist/scene/landscape/landscape-manager.js +1 -1
- package/dist/scene/landscape/landscape.js +1 -1
- package/dist/scene/materializer.d.ts +3 -2
- package/dist/scene/materializer.js +1 -1
- package/dist/scene/objects/ramp-geometry.d.ts +1 -1
- package/dist/scene/objects/shapes.d.ts +3 -3
- package/dist/scene/objects/stairs-geometry.d.ts +2 -2
- package/dist/scene/scene-data-service.js +1 -1
- package/dist/scene/sky.d.ts +1 -1
- package/dist/scene/sky.js +1 -1
- package/dist/shader-nodes/particle.d.ts +1 -0
- package/dist/shader-nodes/particle.js +1 -1
- package/dist/utils/materials.d.ts +2 -1
- package/dist/utils/three/outline-pass.d.ts +8 -8
- package/dist/utils/three/positional-audio-helper.d.ts +2 -1
- package/dist/utils/three/transform-controls.d.ts +5 -3
- package/dist/utils/three/traverse.d.ts +1 -1
- package/package.json +8 -8
- package/tsconfig.tsbuildinfo +1 -1
package/dist/csm.d.ts
CHANGED
@@ -1,7 +1,13 @@
|
|
1
|
-
import { Material
|
1
|
+
import { Material } from 'three';
|
2
2
|
import { RenderingView } from './rendering.js';
|
3
|
+
import * as THREE from 'three';
|
3
4
|
export declare const CSMUtil: {
|
4
5
|
renderingView: RenderingView;
|
5
|
-
onBeforeCompile(material: Material, shader:
|
6
|
+
onBeforeCompile(material: Material, shader: THREE.WebGLProgramParametersWithUniforms): void;
|
6
7
|
patchThreeAdd(): void;
|
7
8
|
};
|
9
|
+
export declare const CSMShader: {
|
10
|
+
lights_fragment_begin: (cascades: number) => string;
|
11
|
+
lights_fragment_begi2: (cascades: number) => string;
|
12
|
+
lights_pars_begin: (maxCascades: number) => string;
|
13
|
+
};
|
package/dist/csm.js
CHANGED
@@ -1,4 +1,4 @@
|
|
1
|
-
import*as e from"three";const n=e.Object3D.prototype.add,r=new WeakMap,a=new WeakMap;export const CSMUtil=new class{constructor(){this.renderingView=null}onBeforeCompile(n,r){n.defines=n.defines||{},n.defines.USE_CSM=1,n.defines.CSM_CASCADES=this.renderingView.csm.cascades;const a=this.renderingView.camera instanceof e.PerspectiveCamera?this.renderingView.camera.far:Number.MAX_SAFE_INTEGER,t=this.renderingView.camera instanceof e.PerspectiveCamera?this.renderingView.camera.near:0,i=Math.min(a,this.renderingView.csm.maxFar),s=[];this.renderingView.csm.getExtendedBreaks(s),r.uniforms.CSM_cascades={value:s},r.uniforms.cameraNear={value:t},r.uniforms.shadowFar={value:i}}patchThreeAdd(){const t=this.renderingView;r.set(t.scene,t.csm),e.Object3D.prototype.add=function(...t){let i=this;for(;null!=i.parent;)i=i.parent;const s=i,c=r.get(s);if(null==c)return n.apply(this,arguments),this;a.has(s)||a.set(s,new WeakSet);const o=a.get(s);function d(e){e&&!o.has(e)&&(o.add(e),c?.setupMaterial(e))}return t.forEach((n=>n?.traverse((n=>{if(n instanceof e.Mesh||n instanceof e.SkinnedMesh)if(n.material instanceof Array)for(const e of n.material)d(e);else d(n.material)})))),n.apply(this,arguments),this}}};
|
1
|
+
import*as t from"three";const i={add:t.Object3D.prototype.add,attach:t.Object3D.prototype.attach},e=new WeakMap,n=new WeakMap;export const CSMUtil=new class{constructor(){this.renderingView=null}onBeforeCompile(i,e){i.defines=i.defines||{},i.defines.USE_CSM=1,i.defines.CSM_CASCADES=this.renderingView.csm.cascades,console.log(e.fragmentShader);const n=this.renderingView.camera instanceof t.PerspectiveCamera?this.renderingView.camera.far:Number.MAX_SAFE_INTEGER,o=this.renderingView.camera instanceof t.PerspectiveCamera?this.renderingView.camera.near:0,a=Math.min(n,this.renderingView.csm.maxFar),r=[];this.renderingView.csm.getExtendedBreaks(r),e.uniforms.CSM_cascades={value:r},e.uniforms.cameraNear={value:o},e.uniforms.shadowFar={value:a}}patchThreeAdd(){const o=this.renderingView;e.set(o.scene,o.csm);for(const[o,a]of Object.entries(i))t.Object3D.prototype[o]=function(...i){let o=this;for(;null!=o.parent;)o=o.parent;const r=o,d=e.get(r);if(null==d)return a.apply(this,arguments),this;n.has(r)||n.set(r,new WeakSet);const h=n.get(r);function c(t){t&&!h.has(t)&&(h.add(t),d?.setupMaterial(t))}return i.forEach((i=>i?.traverse((i=>{if(i instanceof t.Mesh||i instanceof t.SkinnedMesh)if(i.material instanceof Array)for(const t of i.material)c(t);else c(i.material)})))),a.apply(this,arguments),this}}};import{ShaderChunk as o}from"three";const a=o.lights_pars_begin;export const CSMShader={lights_fragment_begin:t=>"\nvec3 geometryPosition = - vViewPosition;\nvec3 geometryNormal = normal;\nvec3 geometryViewDir = ( isOrthographic ) ? vec3( 0, 0, 1 ) : normalize( vViewPosition );\n\nvec3 geometryClearcoatNormal = vec3( 0.0 );\n\n#ifdef USE_CLEARCOAT\n\n\tgeometryClearcoatNormal = clearcoatNormal;\n\n#endif\n\n#ifdef USE_IRIDESCENCE\n\n\tfloat dotNVi = saturate( dot( normal, geometryViewDir ) );\n\n\tif ( material.iridescenceThickness == 0.0 ) {\n\n\t\tmaterial.iridescence = 0.0;\n\n\t} else {\n\n\t\tmaterial.iridescence = saturate( material.iridescence );\n\n\t}\n\n\tif ( material.iridescence > 0.0 ) {\n\n\t\tmaterial.iridescenceFresnel = evalIridescence( 1.0, material.iridescenceIOR, dotNVi, material.iridescenceThickness, material.specularColor );\n\n\t\t// Iridescence F0 approximation\n\t\tmaterial.iridescenceF0 = Schlick_to_F0( material.iridescenceFresnel, 1.0, dotNVi );\n\n\t}\n\n#endif\n\nIncidentLight directLight;\n\n#if ( NUM_POINT_LIGHTS > 0 ) && defined( RE_Direct )\n\n\tPointLight pointLight;\n\t#if defined( USE_SHADOWMAP ) && NUM_POINT_LIGHT_SHADOWS > 0\n\tPointLightShadow pointLightShadow;\n\t#endif\n\n\t#pragma unroll_loop_start\n\tfor ( int i = 0; i < NUM_POINT_LIGHTS; i ++ ) {\n\n\t\tpointLight = pointLights[ i ];\n\n\t\tgetPointLightInfo( pointLight, geometryPosition, directLight );\n\n\t\t#if defined( USE_SHADOWMAP ) && ( UNROLLED_LOOP_INDEX < NUM_POINT_LIGHT_SHADOWS )\n\t\tpointLightShadow = pointLightShadows[ i ];\n\t\tdirectLight.color *= ( directLight.visible && receiveShadow ) ? getPointShadow( pointShadowMap[ i ], pointLightShadow.shadowMapSize, pointLightShadow.shadowIntensity, pointLightShadow.shadowBias, pointLightShadow.shadowRadius, vPointShadowCoord[ i ], pointLightShadow.shadowCameraNear, pointLightShadow.shadowCameraFar ) : 1.0;\n\t\t#endif\n\n\t\tRE_Direct( directLight, geometryPosition, geometryNormal, geometryViewDir, geometryClearcoatNormal, material, reflectedLight );\n\n\t}\n\t#pragma unroll_loop_end\n\n#endif\n\n#if ( NUM_SPOT_LIGHTS > 0 ) && defined( RE_Direct )\n\n\tSpotLight spotLight;\n\tvec4 spotColor;\n\tvec3 spotLightCoord;\n\tbool inSpotLightMap;\n\n\t#if defined( USE_SHADOWMAP ) && NUM_SPOT_LIGHT_SHADOWS > 0\n\tSpotLightShadow spotLightShadow;\n\t#endif\n\n\t#pragma unroll_loop_start\n\tfor ( int i = 0; i < NUM_SPOT_LIGHTS; i ++ ) {\n\n\t\tspotLight = spotLights[ i ];\n\n\t\tgetSpotLightInfo( spotLight, geometryPosition, directLight );\n\n\t\t// spot lights are ordered [shadows with maps, shadows without maps, maps without shadows, none]\n\t\t#if ( UNROLLED_LOOP_INDEX < NUM_SPOT_LIGHT_SHADOWS_WITH_MAPS )\n\t\t#define SPOT_LIGHT_MAP_INDEX UNROLLED_LOOP_INDEX\n\t\t#elif ( UNROLLED_LOOP_INDEX < NUM_SPOT_LIGHT_SHADOWS )\n\t\t#define SPOT_LIGHT_MAP_INDEX NUM_SPOT_LIGHT_MAPS\n\t\t#else\n\t\t#define SPOT_LIGHT_MAP_INDEX ( UNROLLED_LOOP_INDEX - NUM_SPOT_LIGHT_SHADOWS + NUM_SPOT_LIGHT_SHADOWS_WITH_MAPS )\n\t\t#endif\n\n\t\t#if ( SPOT_LIGHT_MAP_INDEX < NUM_SPOT_LIGHT_MAPS )\n\t\t\tspotLightCoord = vSpotLightCoord[ i ].xyz / vSpotLightCoord[ i ].w;\n\t\t\tinSpotLightMap = all( lessThan( abs( spotLightCoord * 2. - 1. ), vec3( 1.0 ) ) );\n\t\t\tspotColor = texture2D( spotLightMap[ SPOT_LIGHT_MAP_INDEX ], spotLightCoord.xy );\n\t\t\tdirectLight.color = inSpotLightMap ? directLight.color * spotColor.rgb : directLight.color;\n\t\t#endif\n\n\t\t#undef SPOT_LIGHT_MAP_INDEX\n\n\t\t#if defined( USE_SHADOWMAP ) && ( UNROLLED_LOOP_INDEX < NUM_SPOT_LIGHT_SHADOWS )\n\t\tspotLightShadow = spotLightShadows[ i ];\n\t\tdirectLight.color *= ( directLight.visible && receiveShadow ) ? getShadow( spotShadowMap[ i ], spotLightShadow.shadowMapSize, spotLightShadow.shadowIntensity, spotLightShadow.shadowBias, spotLightShadow.shadowRadius, vSpotLightCoord[ i ] ) : 1.0;\n\t\t#endif\n\n\t\tRE_Direct( directLight, geometryPosition, geometryNormal, geometryViewDir, geometryClearcoatNormal, material, reflectedLight );\n\n\t}\n\t#pragma unroll_loop_end\n\n#endif\n\n#if ( NUM_DIR_LIGHTS > 0 ) && defined( RE_Direct )\n\n\tDirectionalLight directionalLight;\n\t#if defined( USE_SHADOWMAP ) && NUM_DIR_LIGHT_SHADOWS > 0\n\tDirectionalLightShadow directionalLightShadow;\n\t#endif\n\n\t#pragma unroll_loop_start\n\tfor ( int i = 0; i < NUM_DIR_LIGHTS; i ++ ) {\n\n\t\tdirectionalLight = directionalLights[ i ];\n\n\t\tgetDirectionalLightInfo( directionalLight, directLight );\n\n\t\t#if defined( USE_SHADOWMAP ) && ( UNROLLED_LOOP_INDEX < NUM_DIR_LIGHT_SHADOWS )\n\t\tdirectionalLightShadow = directionalLightShadows[ i ];\n\t\tdirectLight.color *= ( directLight.visible && receiveShadow ) ? getShadow( directionalShadowMap[ i ], directionalLightShadow.shadowMapSize, directionalLightShadow.shadowIntensity, directionalLightShadow.shadowBias, directionalLightShadow.shadowRadius, vDirectionalShadowCoord[ i ] ) : 1.0;\n\t\t#endif\n\n\t\tRE_Direct( directLight, geometryPosition, geometryNormal, geometryViewDir, geometryClearcoatNormal, material, reflectedLight );\n\n\t}\n\t#pragma unroll_loop_end\n\n#endif\n\n#if ( NUM_RECT_AREA_LIGHTS > 0 ) && defined( RE_Direct_RectArea )\n\n\tRectAreaLight rectAreaLight;\n\n\t#pragma unroll_loop_start\n\tfor ( int i = 0; i < NUM_RECT_AREA_LIGHTS; i ++ ) {\n\n\t\trectAreaLight = rectAreaLights[ i ];\n\t\tRE_Direct_RectArea( rectAreaLight, geometryPosition, geometryNormal, geometryViewDir, geometryClearcoatNormal, material, reflectedLight );\n\n\t}\n\t#pragma unroll_loop_end\n\n#endif\n\n#if defined( RE_IndirectDiffuse )\n\n\tvec3 iblIrradiance = vec3( 0.0 );\n\n\tvec3 irradiance = getAmbientLightIrradiance( ambientLightColor );\n\n\t#if defined( USE_LIGHT_PROBES )\n\n\t\tirradiance += getLightProbeIrradiance( lightProbe, geometryNormal );\n\n\t#endif\n\n\t#if ( NUM_HEMI_LIGHTS > 0 )\n\n\t\t#pragma unroll_loop_start\n\t\tfor ( int i = 0; i < NUM_HEMI_LIGHTS; i ++ ) {\n\n\t\t\tirradiance += getHemisphereLightIrradiance( hemisphereLights[ i ], geometryNormal );\n\n\t\t}\n\t\t#pragma unroll_loop_end\n\n\t#endif\n\n#endif\n\n#if defined( RE_IndirectSpecular )\n\n\tvec3 radiance = vec3( 0.0 );\n\tvec3 clearcoatRadiance = vec3( 0.0 );\n\n#endif\n\t",lights_fragment_begi2:t=>`\nGeometricContext geometry;\n\ngeometry.position = - vViewPosition;\ngeometry.normal = normal;\ngeometry.viewDir = ( isOrthographic ) ? vec3( 0, 0, 1 ) : normalize( vViewPosition );\n\n#ifdef CLEARCOAT\n\n\tgeometry.clearcoatNormal = clearcoatNormal;\n\n#endif\n\nIncidentLight directLight;\n\n#if ( NUM_POINT_LIGHTS > 0 ) && defined( RE_Direct )\n\n\tPointLight pointLight;\n\t#if defined( USE_SHADOWMAP ) && NUM_POINT_LIGHT_SHADOWS > 0\n\tPointLightShadow pointLightShadow;\n\t#endif\n\n\t#pragma unroll_loop_start\n\tfor ( int i = 0; i < NUM_POINT_LIGHTS; i ++ ) {\n\n\t\tpointLight = pointLights[ i ];\n\n\t\tgetPointLightInfo( pointLight, geometry, directLight );\n\n\t\t#if defined( USE_SHADOWMAP ) && ( UNROLLED_LOOP_INDEX < NUM_POINT_LIGHT_SHADOWS )\n\t\tpointLightShadow = pointLightShadows[ i ];\n\t\tdirectLight.color *= all( bvec2( directLight.visible, receiveShadow ) ) ? getPointShadow( pointShadowMap[ i ], pointLightShadow.shadowMapSize, pointLightShadow.shadowBias, pointLightShadow.shadowRadius, vPointShadowCoord[ i ], pointLightShadow.shadowCameraNear, pointLightShadow.shadowCameraFar ) : 1.0;\n\t\t#endif\n\n\t\tRE_Direct( directLight, geometry, material, reflectedLight );\n\n\t}\n\t#pragma unroll_loop_end\n\n#endif\n\n#if ( NUM_SPOT_LIGHTS > 0 ) && defined( RE_Direct )\n\n\tSpotLight spotLight;\n\t#if defined( USE_SHADOWMAP ) && NUM_SPOT_LIGHT_SHADOWS > 0\n\tSpotLightShadow spotLightShadow;\n\t#endif\n\n\t#pragma unroll_loop_start\n\tfor ( int i = 0; i < NUM_SPOT_LIGHTS; i ++ ) {\n\n\t\tspotLight = spotLights[ i ];\n\n\t\tgetSpotLightInfo( spotLight, geometry, directLight );\n\n\t\t#if defined( USE_SHADOWMAP ) && ( UNROLLED_LOOP_INDEX < NUM_SPOT_LIGHT_SHADOWS )\n\t\tspotLightShadow = spotLightShadows[ i ];\n\t\tdirectLight.color *= all( bvec2( directLight.visible, receiveShadow ) ) ? getShadow( spotShadowMap[ i ], spotLightShadow.shadowMapSize, spotLightShadow.shadowBias, spotLightShadow.shadowRadius, vSpotShadowCoord[ i ] ) : 1.0;\n\t\t#endif\n\n\t\tRE_Direct( directLight, geometry, material, reflectedLight );\n\n\t}\n\t#pragma unroll_loop_end\n\n#endif\n\n#if ( NUM_DIR_LIGHTS > 0) && defined( RE_Direct ) && defined( USE_CSM ) && defined( CSM_CASCADES )\n\n\tDirectionalLight directionalLight;\n\tfloat linearDepth = (vViewPosition.z) / (shadowFar - cameraNear);\n\t#if defined( USE_SHADOWMAP ) && NUM_DIR_LIGHT_SHADOWS > 0\n\tDirectionalLightShadow directionalLightShadow;\n\t#endif\n\n\t#if defined( USE_SHADOWMAP ) && defined( CSM_FADE ) && CSM_FADE == 1\n\tvec2 cascade;\n\tfloat cascadeCenter;\n\tfloat closestEdge;\n\tfloat margin;\n\tfloat csmx;\n\tfloat csmy;\n\n\t#pragma unroll_loop_start\n\tfor ( int i = 0; i < NUM_DIR_LIGHTS; i ++ ) {\n\n\t\tdirectionalLight = directionalLights[ i ];\n\t\tgetDirectionalLightInfo( directionalLight, geometry, directLight );\n\n\t \t#if defined( USE_SHADOWMAP ) && ( UNROLLED_LOOP_INDEX < NUM_DIR_LIGHT_SHADOWS )\n\t\t\t// NOTE: Depth gets larger away from the camera.\n\t\t\t// cascade.x is closer, cascade.y is further\n\n\t\t\t\t#if ( UNROLLED_LOOP_INDEX < ${t} )\n\n\t\t\t\t\t// NOTE: Apply CSM shadows\n\n\t\t\t\t\tcascade = CSM_cascades[ i ];\n\t\t\t\t\tcascadeCenter = ( cascade.x + cascade.y ) / 2.0;\n\t\t\t\t\tclosestEdge = linearDepth < cascadeCenter ? cascade.x : cascade.y;\n\t\t\t\t\tmargin = 0.25 * pow( closestEdge, 2.0 );\n\t\t\t\t\tcsmx = cascade.x - margin / 2.0;\n\t\t\t\t\tcsmy = cascade.y + margin / 2.0;\n\t\t\t\t\tif( linearDepth >= csmx && ( linearDepth < csmy || UNROLLED_LOOP_INDEX == CSM_CASCADES - 1 ) ) {\n\n\t\t\t\t\t\tfloat dist = min( linearDepth - csmx, csmy - linearDepth );\n\t\t\t\t\t\tfloat ratio = clamp( dist / margin, 0.0, 1.0 );\n\n\t\t\t\t\t\tvec3 prevColor = directLight.color;\n\t\t\t\t\t\tdirectionalLightShadow = directionalLightShadows[ i ];\n\t\t\t\t\t\tdirectLight.color *= all( bvec2( directLight.visible, receiveShadow ) ) ? getShadow( directionalShadowMap[ i ], directionalLightShadow.shadowMapSize, directionalLightShadow.shadowBias, directionalLightShadow.shadowRadius, vDirectionalShadowCoord[ i ] ) : 1.0;\n\n\t\t\t\t\t\tbool shouldFadeLastCascade = UNROLLED_LOOP_INDEX == CSM_CASCADES - 1 && linearDepth > cascadeCenter;\n\t\t\t\t\t\tdirectLight.color = mix( prevColor, directLight.color, shouldFadeLastCascade ? ratio : 1.0 );\n\n\t\t\t\t\t\tReflectedLight prevLight = reflectedLight;\n\t\t\t\t\t\tRE_Direct( directLight, geometry, material, reflectedLight );\n\n\t\t\t\t\t\tbool shouldBlend = UNROLLED_LOOP_INDEX != CSM_CASCADES - 1 || UNROLLED_LOOP_INDEX == CSM_CASCADES - 1 && linearDepth < cascadeCenter;\n\t\t\t\t\t\tfloat blendRatio = shouldBlend ? ratio : 1.0;\n\n\t\t\t\t\t\treflectedLight.directDiffuse = mix( prevLight.directDiffuse, reflectedLight.directDiffuse, blendRatio );\n\t\t\t\t\t\treflectedLight.directSpecular = mix( prevLight.directSpecular, reflectedLight.directSpecular, blendRatio );\n\t\t\t\t\t\treflectedLight.indirectDiffuse = mix( prevLight.indirectDiffuse, reflectedLight.indirectDiffuse, blendRatio );\n\t\t\t\t\t\treflectedLight.indirectSpecular = mix( prevLight.indirectSpecular, reflectedLight.indirectSpecular, blendRatio );\n\n\t\t\t\t\t}\n\n\t\t\t\t#else\n\n\t\t\t\t\t// NOTE: Apply the reminder of directional lights\n\n\t\t\t\t\tdirectionalLightShadow = directionalLightShadows[ i ];\n\t\t\t\t\tdirectLight.color *= ( directLight.visible && receiveShadow ) ? getShadow( directionalShadowMap[ i ], directionalLightShadow.shadowMapSize, directionalLightShadow.shadowBias, directionalLightShadow.shadowRadius, vDirectionalShadowCoord[ i ] ) : 1.0;\n\n\t\t\t\t\tRE_Direct( directLight, geometry, material, reflectedLight );\n\n\t\t\t\t#endif\n\n\t \t#endif\n\n\t}\n\t#pragma unroll_loop_end\n\t#else\n\n\t\t#pragma unroll_loop_start\n\t\tfor ( int i = 0; i < NUM_DIR_LIGHTS; i ++ ) {\n\n\t\t\tdirectionalLight = directionalLights[ i ];\n\t\t\tgetDirectionalLightInfo( directionalLight, geometry, directLight );\n\n\t\t\t#if defined( USE_SHADOWMAP ) && ( UNROLLED_LOOP_INDEX < NUM_DIR_LIGHT_SHADOWS ) \n\n\t\t\t\t#if ( UNROLLED_LOOP_INDEX < ${t} )\n\n\t\t\t\t\t// NOTE: Apply CSM shadows\n\n\t\t\t\t\tdirectionalLightShadow = directionalLightShadows[ i ];\n\t\t\t\t\tif(linearDepth >= CSM_cascades[UNROLLED_LOOP_INDEX].x && linearDepth < CSM_cascades[UNROLLED_LOOP_INDEX].y) directLight.color *= all( bvec2( directLight.visible, receiveShadow ) ) ? getShadow( directionalShadowMap[ i ], directionalLightShadow.shadowMapSize, directionalLightShadow.shadowBias, directionalLightShadow.shadowRadius, vDirectionalShadowCoord[ i ] ) : 1.0;\n\n\t\t\t\t\tif(linearDepth >= CSM_cascades[UNROLLED_LOOP_INDEX].x && (linearDepth < CSM_cascades[UNROLLED_LOOP_INDEX].y || UNROLLED_LOOP_INDEX == CSM_CASCADES - 1)) RE_Direct( directLight, geometry, material, reflectedLight );\n\n\t\t\t\t#else\n\n\t\t\t\t\t// NOTE: Apply the reminder of directional lights\n\n\t\t\t\t\tdirectionalLightShadow = directionalLightShadows[ i ];\n\t\t\t\t\tdirectLight.color *= ( directLight.visible && receiveShadow ) ? getShadow( directionalShadowMap[ i ], directionalLightShadow.shadowMapSize, directionalLightShadow.shadowBias, directionalLightShadow.shadowRadius, vDirectionalShadowCoord[ i ] ) : 1.0;\n\t\n\t\t\t\t\tRE_Direct( directLight, geometry, material, reflectedLight );\n\n\t\t\t\t#endif\n\n\t\t\t#endif\n\n\t\t}\n\t\t#pragma unroll_loop_end\n\n\t#endif\n\n\t#if ( NUM_DIR_LIGHTS > NUM_DIR_LIGHT_SHADOWS)\n\t\t// compute the lights not casting shadows (if any)\n\n\t\t#pragma unroll_loop_start\n\t\tfor ( int i = NUM_DIR_LIGHT_SHADOWS; i < NUM_DIR_LIGHTS; i ++ ) {\n\n\t\t\tdirectionalLight = directionalLights[ i ];\n\n\t\t\tgetDirectionalLightInfo( directionalLight, geometry, directLight );\n\n\t\t\tRE_Direct( directLight, geometry, material, reflectedLight );\n\n\t\t}\n\t\t#pragma unroll_loop_end\n\n\t#endif\n\n#endif\n\n\n#if ( NUM_DIR_LIGHTS > 0 ) && defined( RE_Direct ) && !defined( USE_CSM ) && !defined( CSM_CASCADES )\n\n\tDirectionalLight directionalLight;\n\t#if defined( USE_SHADOWMAP ) && NUM_DIR_LIGHT_SHADOWS > 0\n\tDirectionalLightShadow directionalLightShadow;\n\t#endif\n\n\t#pragma unroll_loop_start\n\tfor ( int i = 0; i < NUM_DIR_LIGHTS; i ++ ) {\n\n\t\tdirectionalLight = directionalLights[ i ];\n\n\t\tgetDirectionalLightInfo( directionalLight, geometry, directLight );\n\n\t\t#if defined( USE_SHADOWMAP ) && ( UNROLLED_LOOP_INDEX < NUM_DIR_LIGHT_SHADOWS )\n\t\tdirectionalLightShadow = directionalLightShadows[ i ];\n\t\tdirectLight.color *= all( bvec2( directLight.visible, receiveShadow ) ) ? getShadow( directionalShadowMap[ i ], directionalLightShadow.shadowMapSize, directionalLightShadow.shadowBias, directionalLightShadow.shadowRadius, vDirectionalShadowCoord[ i ] ) : 1.0;\n\t\t#endif\n\n\t\tRE_Direct( directLight, geometry, material, reflectedLight );\n\n\t}\n\t#pragma unroll_loop_end\n\n#endif\n\n#if ( NUM_RECT_AREA_LIGHTS > 0 ) && defined( RE_Direct_RectArea )\n\n\tRectAreaLight rectAreaLight;\n\n\t#pragma unroll_loop_start\n\tfor ( int i = 0; i < NUM_RECT_AREA_LIGHTS; i ++ ) {\n\n\t\trectAreaLight = rectAreaLights[ i ];\n\t\tRE_Direct_RectArea( rectAreaLight, geometry, material, reflectedLight );\n\n\t}\n\t#pragma unroll_loop_end\n\n#endif\n\n#if defined( RE_IndirectDiffuse )\n\n\tvec3 iblIrradiance = vec3( 0.0 );\n\n\tvec3 irradiance = getAmbientLightIrradiance( ambientLightColor );\n\n\tirradiance += getLightProbeIrradiance( lightProbe, geometry.normal );\n\n\t#if ( NUM_HEMI_LIGHTS > 0 )\n\n\t\t#pragma unroll_loop_start\n\t\tfor ( int i = 0; i < NUM_HEMI_LIGHTS; i ++ ) {\n\n\t\t\tirradiance += getHemisphereLightIrradiance( hemisphereLights[ i ], geometry.normal );\n\n\t\t}\n\t\t#pragma unroll_loop_end\n\n\t#endif\n\n#endif\n\n#if defined( RE_IndirectSpecular )\n\n\tvec3 radiance = vec3( 0.0 );\n\tvec3 clearcoatRadiance = vec3( 0.0 );\n\n#endif\n`,lights_pars_begin:t=>a};
|
2
2
|
/*
|
3
3
|
* Copyright (©) 2023. All rights reserved.
|
4
4
|
* See the LICENSE.md file for details.
|
@@ -1,4 +1,5 @@
|
|
1
1
|
import { Behaviour, Emitter, Particle, EasingFunction } from "three-nebula";
|
2
|
+
import * as THREE from 'three';
|
2
3
|
/**
|
3
4
|
* Rotate position around an axis.
|
4
5
|
*/
|
@@ -9,11 +10,38 @@ export declare class RotatePosition extends Behaviour {
|
|
9
10
|
private axis3D;
|
10
11
|
mutate(target: Particle | Emitter, time: number, index: number): void;
|
11
12
|
}
|
13
|
+
export declare enum AxisDirection {
|
14
|
+
x = 0,
|
15
|
+
y = 1,
|
16
|
+
z = 2,
|
17
|
+
mx = 3,
|
18
|
+
my = 4,
|
19
|
+
mz = 5
|
20
|
+
}
|
21
|
+
export declare class OrientAlongVelocity extends Behaviour {
|
22
|
+
private axisDirection;
|
23
|
+
constructor(axisDirection: AxisDirection);
|
24
|
+
initialize(particle: Particle): void;
|
25
|
+
mutate(target: Particle | Emitter, time: number, index: number): void;
|
26
|
+
}
|
12
27
|
export declare class LinearDamping extends Behaviour {
|
13
28
|
private factor;
|
14
29
|
constructor(factor: number);
|
15
30
|
mutate(target: Particle | Emitter, time: number, index: number): void;
|
16
31
|
}
|
32
|
+
export declare enum AxisPlane {
|
33
|
+
xy = 0,
|
34
|
+
xz = 1,
|
35
|
+
yz = 2,
|
36
|
+
xyz = 3
|
37
|
+
}
|
38
|
+
export declare class Disperse extends Behaviour {
|
39
|
+
private distance;
|
40
|
+
private plane;
|
41
|
+
constructor(distance: number, plane: AxisPlane, easing?: EasingFunction);
|
42
|
+
initialize(particle: Particle): void;
|
43
|
+
mutate(target: Particle | Emitter, time: number, index: number): void;
|
44
|
+
}
|
17
45
|
export declare class MoveOverLife extends Behaviour {
|
18
46
|
private x;
|
19
47
|
private y;
|
@@ -1,4 +1,4 @@
|
|
1
|
-
import{Behaviour as i,Vector3D as t,ease as s}from"three-nebula";export class RotatePosition extends i{constructor(i,s){super(),this.axis=i,this.angle=s,this.axis3D=new t(this.axis.x,this.axis.y,this.axis.z)}mutate(i,t,s){this.energize(i,t),i.position.sub(i.parent.position),i.position.applyAxisAngle(this.axis3D,this.angle*t),i.position.add(i.parent.position)}}export class LinearDamping extends i{constructor(i){super(),this.factor=i}mutate(i,t,s){this.energize(i,t);const
|
1
|
+
import{Behaviour as i,Vector3D as t,ease as s}from"three-nebula";import*as e from"three";export class RotatePosition extends i{constructor(i,s){super(),this.axis=i,this.angle=s,this.axis3D=new t(this.axis.x,this.axis.y,this.axis.z)}mutate(i,t,s){this.energize(i,t),i.position.sub(i.parent.position),i.position.applyAxisAngle(this.axis3D,this.angle*t),i.position.add(i.parent.position)}}export var AxisDirection;!function(i){i[i.x=0]="x",i[i.y=1]="y",i[i.z=2]="z",i[i.mx=3]="mx",i[i.my=4]="my",i[i.mz=5]="mz"}(AxisDirection||(AxisDirection={}));export class OrientAlongVelocity extends i{constructor(i){super(),this.axisDirection=i}initialize(i){i.transform.orientAlongVelocity=!0}mutate(i,t,s){i.target,e.Object3D}}export class LinearDamping extends i{constructor(i){super(),this.factor=i}mutate(i,t,s){this.energize(i,t);const e=n.copy(i.velocity).multiplyScalar(-this.factor*t);i.velocity.add(e)}}const n=new t;export var AxisPlane;!function(i){i[i.xy=0]="xy",i[i.xz=1]="xz",i[i.yz=2]="yz",i[i.xyz=3]="xyz"}(AxisPlane||(AxisPlane={}));export class Disperse extends i{constructor(i,t,e=s.easeLinear){super(void 0,e,void 0,!0),this.distance=i,this.plane=t}initialize(i){i.transform.initialPos=i.position.clone();const t=o.copy(i.transform.initialPos).sub(i.parent.position).normalize();switch(this.plane){case AxisPlane.xy:t.setComponent(2,0);break;case AxisPlane.xz:t.setComponent(1,0);break;case AxisPlane.yz:t.setComponent(0,0)}i.transform.displacement=t.clone().multiplyScalar(this.distance),i.transform.prevEnergy=1}mutate(i,t,s){this.energize(i,t);i.transform.initialPos;const e=i.transform.displacement,n=i.transform.prevEnergy-this.energy;i.transform.prevEnergy=this.energy;i.position.x+=e.x*n,i.position.y+=e.y*n,i.position.z+=e.z*n}}export class MoveOverLife extends i{constructor(i,t,e,n=s.easeLinear){super(void 0,n,void 0,!0),this.x=i,this.y=t,this.z=e}initialize(i){i.transform.initialPos=i.position.clone()}mutate(i,t,s){this.energize(i,t);const e=i.transform.initialPos,n=1-this.energy;i.position.x=e.x+this.x*n,i.position.y=e.y+this.y*n,i.position.z=e.z+this.z*n}}const o=new t;
|
2
2
|
/*
|
3
3
|
* Copyright (©) 2023. All rights reserved.
|
4
4
|
* See the LICENSE.md file for details.
|
@@ -1,17 +1,33 @@
|
|
1
1
|
import { Vector3 } from "three";
|
2
2
|
import { Emitter, Particle } from "three-nebula";
|
3
|
+
declare const DefaultInitializer_base: any;
|
4
|
+
export declare class DefaultInitializer extends DefaultInitializer_base {
|
5
|
+
init(emitter: Emitter, particle: Particle): void;
|
6
|
+
}
|
3
7
|
declare const Rotation_base: any;
|
4
8
|
export declare class Rotation extends Rotation_base {
|
5
9
|
private rotation;
|
6
10
|
constructor(rotation: Vector3);
|
7
11
|
init(emitter: Emitter, particle: Particle): void;
|
8
12
|
}
|
13
|
+
declare const RandomRotation_base: any;
|
14
|
+
export declare class RandomRotation extends RandomRotation_base {
|
15
|
+
constructor();
|
16
|
+
init(emitter: Emitter, particle: Particle): void;
|
17
|
+
private randomAngle;
|
18
|
+
}
|
9
19
|
declare const InitialScale_base: any;
|
10
20
|
export declare class InitialScale extends InitialScale_base {
|
11
21
|
private scale;
|
12
22
|
constructor(scale: number);
|
13
23
|
init(emitter: Emitter, particle: Particle): void;
|
14
24
|
}
|
25
|
+
declare const InitialScaleComponents_base: any;
|
26
|
+
export declare class InitialScaleComponents extends InitialScaleComponents_base {
|
27
|
+
private scale;
|
28
|
+
constructor(scale: Vector3);
|
29
|
+
init(emitter: Emitter, particle: Particle): void;
|
30
|
+
}
|
15
31
|
declare const AdditiveVelocity_base: any;
|
16
32
|
export declare class AdditiveVelocity extends AdditiveVelocity_base {
|
17
33
|
private velocity;
|
@@ -1,4 +1,4 @@
|
|
1
|
-
import{Vector3 as t}from"three";import{Span as e,Position as i}from"three-nebula";export class Rotation extends(Object.getPrototypeOf(i)){constructor(t){super(),this.rotation=t}init(t,e){"number"!=typeof e.rotation&&e.rotation.copy(this.rotation)}}export class InitialScale extends(Object.getPrototypeOf(i)){constructor(t){super(),this.scale=t}init(t,e){e.scale=this.scale}}export class AdditiveVelocity extends(Object.getPrototypeOf(i)){constructor(t){super(),this.velocity=t}init(t,e){e.velocity.x+=this.velocity.x,e.velocity.y+=this.velocity.y,e.velocity.z+=this.velocity.z}}export class RandomDirection extends(Object.getPrototypeOf(i)){constructor(t){super(),this.speed=t}init(t,e){s.set(2*Math.random()-1,2*Math.random()-1,2*Math.random()-1).normalize().multiplyScalar(this.speed),e.velocity.x+=s.x,e.velocity.y+=s.y,e.velocity.z+=s.z}}export class RandomComponentsDirection extends(Object.getPrototypeOf(i)){constructor(t,i,s){super(),this.speed=t,this.min=i,this.max=s,this.x=new e(this.min.x,this.max.x),this.y=new e(this.min.y,this.max.y),this.z=new e(this.min.z,this.max.z)}init(t,e){s.set(this.x.getValue(),this.y.getValue(),this.z.getValue()).normalize().multiplyScalar(this.speed),e.velocity.x+=s.x,e.velocity.y+=s.y,e.velocity.z+=s.z}}export class RandomVelocity extends(Object.getPrototypeOf(i)){constructor(t,i){super(),this.min=t,this.max=i,this.x=new e(this.min.x,this.max.x),this.y=new e(this.min.y,this.max.y),this.z=new e(this.min.z,this.max.z)}init(t,e){e.velocity.x+=this.x.getValue(),e.velocity.y+=this.y.getValue(),e.velocity.z+=this.z.getValue()}}const s=new t;
|
1
|
+
import{Vector3 as t}from"three";import{Span as e,Position as i}from"three-nebula";export class DefaultInitializer extends(Object.getPrototypeOf(i)){init(t,e){e.parent=t}}export class Rotation extends(Object.getPrototypeOf(i)){constructor(t){super(),this.rotation=t}init(t,e){"number"!=typeof e.rotation&&e.rotation.copy(this.rotation)}}export class RandomRotation extends(Object.getPrototypeOf(i)){constructor(){super()}init(t,e){e.rotation.set(this.randomAngle(),this.randomAngle(),this.randomAngle())}randomAngle(){return 2*Math.PI*Math.random()}}export class InitialScale extends(Object.getPrototypeOf(i)){constructor(t){super(),this.scale=t}init(t,e){e.scale=this.scale}}export class InitialScaleComponents extends(Object.getPrototypeOf(i)){constructor(t){super(),this.scale=t}init(t,e){e.transform.initialScale=this.scale}}export class AdditiveVelocity extends(Object.getPrototypeOf(i)){constructor(t){super(),this.velocity=t}init(t,e){e.velocity.x+=this.velocity.x,e.velocity.y+=this.velocity.y,e.velocity.z+=this.velocity.z}}export class RandomDirection extends(Object.getPrototypeOf(i)){constructor(t){super(),this.speed=t}init(t,e){s.set(2*Math.random()-1,2*Math.random()-1,2*Math.random()-1).normalize().multiplyScalar(this.speed),e.velocity.x+=s.x,e.velocity.y+=s.y,e.velocity.z+=s.z}}export class RandomComponentsDirection extends(Object.getPrototypeOf(i)){constructor(t,i,s){super(),this.speed=t,this.min=i,this.max=s,this.x=new e(this.min.x,this.max.x),this.y=new e(this.min.y,this.max.y),this.z=new e(this.min.z,this.max.z)}init(t,e){s.set(this.x.getValue(),this.y.getValue(),this.z.getValue()).normalize().multiplyScalar(this.speed),e.velocity.x+=s.x,e.velocity.y+=s.y,e.velocity.z+=s.z}}export class RandomVelocity extends(Object.getPrototypeOf(i)){constructor(t,i){super(),this.min=t,this.max=i,this.x=new e(this.min.x,this.max.x),this.y=new e(this.min.y,this.max.y),this.z=new e(this.min.z,this.max.z)}init(t,e){e.velocity.x+=this.x.getValue(),e.velocity.y+=this.y.getValue(),e.velocity.z+=this.z.getValue()}}const s=new t;
|
2
2
|
/*
|
3
3
|
* Copyright (©) 2023. All rights reserved.
|
4
4
|
* See the LICENSE.md file for details.
|
@@ -1,6 +1,11 @@
|
|
1
1
|
import { Rate } from "three-nebula";
|
2
|
+
import type { RateNumPan, RateTimePan } from "three-nebula/src/initializer/Rate";
|
2
3
|
export { Rate } from 'three-nebula';
|
3
|
-
export declare class
|
4
|
-
|
4
|
+
export declare class DelayRate extends Rate {
|
5
|
+
readonly delay: number;
|
6
|
+
constructor(delay?: number, numPan?: RateNumPan, timePan?: RateTimePan);
|
5
7
|
restart(): void;
|
6
8
|
}
|
9
|
+
export declare class OnceRate extends DelayRate {
|
10
|
+
constructor(delay: number, count?: number);
|
11
|
+
}
|
@@ -1,4 +1,4 @@
|
|
1
|
-
import{Rate as e}from"three-nebula";export{Rate}from"three-nebula";export class
|
1
|
+
import{Rate as e}from"three-nebula";export{Rate}from"three-nebula";export class DelayRate extends e{constructor(e=0,t,s){super(t,s),this.delay=e,this.restart()}restart(){this.nextTime=0,null!=this.delay&&this.delay>0&&(this.startTime=-this.delay)}}export class OnceRate extends DelayRate{constructor(e,t=1){super(e,t,1/0)}}
|
2
2
|
/*
|
3
3
|
* Copyright (©) 2023. All rights reserved.
|
4
4
|
* See the LICENSE.md file for details.
|
@@ -1,4 +1,4 @@
|
|
1
|
-
import{__decorate as s}from"tslib";import{Actor as t,BaseActor as e,AssetLoader as i,inject as o,World as r}from"../../gameplay/index.js";import{Rate as a}from"three-nebula";import{materializeVfx as h}from"./vfx-materializer.js";import*as m from"three";let
|
1
|
+
import{__decorate as s}from"tslib";import{Actor as t,BaseActor as e,AssetLoader as i,inject as o,World as r}from"../../gameplay/index.js";import{Rate as a}from"three-nebula";import{materializeVfx as h}from"./vfx-materializer.js";import*as m from"three";import{DelayRate as d}from"./rates.js";let n=class extends e{constructor(){super(...arguments),this.timescale=1,this.paused=!1,this.assetLoader=o(i),this.world=o(r),this._worldPos=new m.Vector3,this.max=0}async fromAsset(s){null!=this.system&&(this.system.destroy(),this.system.emitters.forEach((s=>s.reset()))),this.sourceAsset=s,this.disposeSystem&&this.disposeSystem();const{system:t,dispose:e}=await h(s,this.world.scene,{getAsset:s=>this.assetLoader.getAsset(s),getMaterial:s=>this.assetLoader.getMaterialByAssetId(s),getTexture:s=>this.assetLoader.getTextureByAssetId(s),getMesh:s=>this.assetLoader.getModelByAssetId(s).then((s=>s.scene))});this.system=t,this.disposeSystem=e}play(){this.paused=!1;this.system.emitters.every((s=>s.dead))&&this.restart()}pause(){this.paused=!0}stop(){this.system.emitters.forEach((s=>{const t=s.rate;t instanceof a&&(console.log("set rate to infinity",t),t.nextTime=1/0)}))}restart(){for(const s of this.system.emitters){const t=s.rate;t instanceof d?t.restart():t.nextTime=0,s.removeAllParticles()}}onUpdate(s){this.paused||(this.object.getWorldPosition(this._worldPos),this.system?.emitters.forEach((s=>{s.setPosition(this._worldPos)})),this.system?.update(s*this.timescale))}getParticleCount(){return this.system?.getCount()??0}onEndPlay(){this.stop(),null!=this.disposeSystem&&this.disposeSystem()}};n=s([t()],n);export{n as VfxActor};
|
2
2
|
/*
|
3
3
|
* Copyright (©) 2023. All rights reserved.
|
4
4
|
* See the LICENSE.md file for details.
|
@@ -1,15 +1,16 @@
|
|
1
1
|
import { LibraryShapeType } from '../../scene/objects/shapes.js';
|
2
2
|
import { AssetId, CustomParamValue, SerializedParamType } from '../../scene/model.js';
|
3
3
|
import { LibraryVfxBehaviourType, LibraryVfxInitalizerType } from './vfx-defs.js';
|
4
|
-
import * as THREE from "three";
|
5
4
|
export type OnceRateData = {
|
6
5
|
type: 'once';
|
7
6
|
count: number;
|
7
|
+
delay: number;
|
8
8
|
};
|
9
9
|
export type ContinuousRateData = {
|
10
10
|
type: 'continuous';
|
11
11
|
count: number;
|
12
12
|
time: number;
|
13
|
+
delay: number;
|
13
14
|
};
|
14
15
|
export type RateData = OnceRateData | ContinuousRateData;
|
15
16
|
export type InitializerData = {
|
@@ -26,10 +27,10 @@ export type Vector3Data = [number, number, number];
|
|
26
27
|
export declare const BlendingModes: readonly ["additive", "subtractive", "multiply", "normal"];
|
27
28
|
export type BlendingMode = (typeof BlendingModes)[number];
|
28
29
|
export declare const ThreeBlendingMode: {
|
29
|
-
normal:
|
30
|
-
additive:
|
31
|
-
subtractive:
|
32
|
-
multiply:
|
30
|
+
normal: 1;
|
31
|
+
additive: 2;
|
32
|
+
subtractive: 3;
|
33
|
+
multiply: 4;
|
33
34
|
};
|
34
35
|
export type SpriteOutput = {
|
35
36
|
type: 'sprite';
|
@@ -75,6 +76,7 @@ export declare function EmitterDataConstructor(): {
|
|
75
76
|
type: "continuous";
|
76
77
|
count: number;
|
77
78
|
time: number;
|
79
|
+
delay: number;
|
78
80
|
};
|
79
81
|
position: [number, number, number];
|
80
82
|
rotation: [number, number, number];
|
@@ -1,4 +1,4 @@
|
|
1
|
-
import{SerializedParamType as t}from"../../scene/model.js";import*as e from"three";import{randomString as i}from"../../utils/math.js";export const BlendingModes=["additive","subtractive","multiply","normal"];export const ThreeBlendingMode={normal:e.NormalBlending,additive:e.AdditiveBlending,subtractive:e.SubtractiveBlending,multiply:e.MultiplyBlending};export function EmitterDataConstructor(){return{id:i(),name:"Emitter",rate:{type:"continuous",count:1,time:.5},position:[0,0,0],rotation:[0,0,0],initializers:[{id:i(),type:"lifetime",params:{duration:{type:t.Number,value:1}}}],behaviours:[],children:[],output:{type:"sprite",texture:null,color:"#ffffff",blendingMode:"normal"}}}
|
1
|
+
import{SerializedParamType as t}from"../../scene/model.js";import*as e from"three";import{randomString as i}from"../../utils/math.js";export const BlendingModes=["additive","subtractive","multiply","normal"];export const ThreeBlendingMode={normal:e.NormalBlending,additive:e.AdditiveBlending,subtractive:e.SubtractiveBlending,multiply:e.MultiplyBlending};export function EmitterDataConstructor(){return{id:i(),name:"Emitter",rate:{type:"continuous",count:1,time:.5,delay:0},position:[0,0,0],rotation:[0,0,0],initializers:[{id:i(),type:"lifetime",params:{duration:{type:t.Number,value:1}}}],behaviours:[],children:[],output:{type:"sprite",texture:null,color:"#ffffff",blendingMode:"normal"}}}
|
2
2
|
/*
|
3
3
|
* Copyright (©) 2023. All rights reserved.
|
4
4
|
* See the LICENSE.md file for details.
|
@@ -99,12 +99,22 @@ declare class RotationDef extends BaseIniDef<RotationDef> {
|
|
99
99
|
};
|
100
100
|
make(params?: ParamsType<this>): Initializer;
|
101
101
|
}
|
102
|
+
declare class RandomRotationDef extends BaseIniDef<RandomRotationDef> {
|
103
|
+
parameters: {};
|
104
|
+
make(params?: ParamsType<this>): Initializer;
|
105
|
+
}
|
102
106
|
declare class InitialScaleDef extends BaseIniDef<InitialScaleDef> {
|
103
107
|
parameters: {
|
104
108
|
scale: FloatParameterDef;
|
105
109
|
};
|
106
110
|
make(params?: ParamsType<this>): Initializer;
|
107
111
|
}
|
112
|
+
declare class InitialScaleComponentsDef extends BaseIniDef<InitialScaleComponentsDef> {
|
113
|
+
parameters: {
|
114
|
+
scale: ShapeParameterDef<Vector3>;
|
115
|
+
};
|
116
|
+
make(params?: ParamsType<this>): Initializer;
|
117
|
+
}
|
108
118
|
declare class ForceDef extends BaseBevDef<ForceDef> {
|
109
119
|
parameters: {
|
110
120
|
force: ShapeParameterDef<Vector3>;
|
@@ -134,6 +144,14 @@ declare class RandomDriftDef extends BaseBevDef<RandomDriftDef> {
|
|
134
144
|
};
|
135
145
|
make(params?: ParamsType<this>): Behaviour;
|
136
146
|
}
|
147
|
+
declare class DisperseDef extends BaseBevDef<DisperseDef> {
|
148
|
+
parameters: {
|
149
|
+
distance: FloatParameterDef;
|
150
|
+
axis: SelectParameterDef<string>;
|
151
|
+
ease: SelectParameterDef<string>;
|
152
|
+
};
|
153
|
+
make(params?: ParamsType<this>): Behaviour;
|
154
|
+
}
|
137
155
|
declare class RotateDef extends BaseBevDef<RotateDef> {
|
138
156
|
parameters: {
|
139
157
|
rotation: ShapeParameterDef<Vector3>;
|
@@ -141,6 +159,10 @@ declare class RotateDef extends BaseBevDef<RotateDef> {
|
|
141
159
|
};
|
142
160
|
make(params?: ParamsType<this>): Behaviour;
|
143
161
|
}
|
162
|
+
declare class OrientAlongVelocityDef extends BaseBevDef<OrientAlongVelocityDef> {
|
163
|
+
parameters: {};
|
164
|
+
make(params?: ParamsType<this>): Behaviour;
|
165
|
+
}
|
144
166
|
declare class ChangeColorDef extends BaseBevDef<ChangeColorDef> {
|
145
167
|
parameters: {
|
146
168
|
a: ShapeParameterDef<`#${string}`>;
|
@@ -184,7 +206,9 @@ declare const vfxInitializsers: {
|
|
184
206
|
positionSphere: PositionSphereDef;
|
185
207
|
positionLine: PositionLineDef;
|
186
208
|
rotation: RotationDef;
|
209
|
+
randomRotation: RandomRotationDef;
|
187
210
|
scale: InitialScaleDef;
|
211
|
+
scaleComponents: InitialScaleComponentsDef;
|
188
212
|
mass: MassDef;
|
189
213
|
velocity: VelocityDef;
|
190
214
|
randomDirection: RandomDirectionDef;
|
@@ -194,7 +218,9 @@ declare const vfxBehaviours: {
|
|
194
218
|
gravity: GravityDef;
|
195
219
|
scale: ScaleDef;
|
196
220
|
randomDrift: RandomDriftDef;
|
221
|
+
disperse: DisperseDef;
|
197
222
|
rotate: RotateDef;
|
223
|
+
orientAlongVelocity: OrientAlongVelocityDef;
|
198
224
|
changeColor: ChangeColorDef;
|
199
225
|
changeOpacity: ChangeOpacityDef;
|
200
226
|
vortex: VortexDef;
|
@@ -203,8 +229,8 @@ declare const vfxBehaviours: {
|
|
203
229
|
};
|
204
230
|
export type LibraryVfxInitalizerType = keyof typeof vfxInitializsers;
|
205
231
|
export declare const VfxInitializserLibrary: Record<LibraryVfxInitalizerType, InitializerDefinition>;
|
206
|
-
export declare const VfxInitializserLibraryKeys: ("rotation" | "mass" | "scale" | "velocity" | "lifetime" | "positionPoint" | "positionBox" | "positionSphere" | "positionLine" | "randomDirection")[];
|
232
|
+
export declare const VfxInitializserLibraryKeys: ("rotation" | "mass" | "scale" | "velocity" | "lifetime" | "positionPoint" | "positionBox" | "positionSphere" | "positionLine" | "randomRotation" | "scaleComponents" | "randomDirection")[];
|
207
233
|
export type LibraryVfxBehaviourType = keyof typeof vfxBehaviours;
|
208
234
|
export declare const VfxBehaviourLibrary: Record<LibraryVfxBehaviourType, BehaviourDefinition>;
|
209
|
-
export declare const VfxBehaviourLibraryKeys: ("scale" | "force" | "gravity" | "randomDrift" | "rotate" | "changeColor" | "changeOpacity" | "vortex" | "moveTo" | "linearDamping")[];
|
235
|
+
export declare const VfxBehaviourLibraryKeys: ("scale" | "orientAlongVelocity" | "force" | "gravity" | "randomDrift" | "disperse" | "rotate" | "changeColor" | "changeOpacity" | "vortex" | "moveTo" | "linearDamping")[];
|
210
236
|
export {};
|
@@ -1,4 +1,4 @@
|
|
1
|
-
import{Color as e,MathUtils as r,Vector2 as t,Vector3 as s}from"three";import{Life as n,Force as a,Gravity as o,Scale as i,RandomDrift as c,Color as u,Alpha as p,Rotate as m,Mass as
|
1
|
+
import{Color as e,MathUtils as r,Vector2 as t,Vector3 as s}from"three";import{Life as n,Force as a,Gravity as o,Scale as i,RandomDrift as c,Color as u,Alpha as p,Rotate as m,Mass as l,ease as d,Position as w,BoxZone as f,LineZone as x}from"three-nebula";import{AxisDirection as y,AxisPlane as h,Disperse as k,LinearDamping as b,MoveOverLife as v,OrientAlongVelocity as z,RotatePosition as g}from"./behaviours.js";import{AdditiveVelocity as L,InitialScale as j,InitialScaleComponents as V,RandomDirection as O,RandomRotation as B,Rotation as C}from"./initializsers.js";import{SphereZone as R,PointZone as T}from"./zones.js";Object.getPrototypeOf(n);class X{build(e={}){const r=P(e,this.parameters);return this.make(r)}}class Y{build(e={}){const r=P(e,this.parameters);return this.make(r)}}function Z(e,r,t){return{type:"number",default:e,float:!0,min:r,max:t}}function A(e){return{type:"vec3",default:(new s).fromArray(e)}}function D(e){return{type:"color",default:e}}function I(e,r){return{type:"select",opts:e,default:r}}function K(){return I(Array.from(Object.keys(d)).map((e=>e.substring(4))),"Linear")}function P(e,r){const t={};for(let s in r)null==e[s]?t[s]=r[s].default:t[s]=e[s];return t}function S(e){return null!=e?d["ease"+e]:d.easeLinear}const q={lifetime:new class extends Y{constructor(){var e;super(...arguments),this.parameters={duration:(e=1,{type:"number",default:e})}}make(e={}){return new n(e.duration)}},positionPoint:new class extends Y{constructor(){super(...arguments),this.parameters={position:A([0,0,0])}}make(e={}){const{x:r,y:t,z:s}=e.position;return new w(new T(r,t,s))}},positionBox:new class extends Y{constructor(){super(...arguments),this.parameters={position:A([0,0,0]),dimensions:A([0,0,0])}}make(e={}){const{x:r,y:t,z:s}=e.position,{x:n,y:a,z:o}=e.dimensions;return new w(new f(r,t,s,n,a,o))}},positionSphere:new class extends Y{constructor(){super(...arguments),this.parameters={position:A([0,0,0]),radius:Z(1)}}make(e={}){const{x:r,y:t,z:s}=e.position;return new w(new R(r,t,s,e.radius))}},positionLine:new class extends Y{constructor(){super(...arguments),this.parameters={a:A([0,0,0]),b:A([0,0,1])}}make(e={}){const{x:r,y:t,z:s}=e.a,{x:n,y:a,z:o}=e.b;return new w(new x(r,t,s,n,a,o))}},rotation:new class extends Y{constructor(){super(...arguments),this.parameters={rotation:A([0,0,0])}}make(e={}){const{x:r,y:t,z:n}=e.rotation;return new C(new s(r,t,n))}},randomRotation:new class extends Y{constructor(){super(...arguments),this.parameters={}}make(e={}){return new B}},scale:new class extends Y{constructor(){super(...arguments),this.parameters={scale:Z(1)}}make(e={}){return new j(e.scale)}},scaleComponents:new class extends Y{constructor(){super(...arguments),this.parameters={scale:A([1,1,1])}}make(e={}){return new V(e.scale)}},mass:new class extends Y{constructor(){super(...arguments),this.parameters={min:Z(1)}}make(e={}){return new l(e.min)}},velocity:new class extends Y{constructor(){super(...arguments),this.parameters={velocity:A([0,0,0])}}make(e={}){const{x:r,y:t,z:n}=e.velocity;return new L(new s(r,t,n))}},randomDirection:new class extends Y{constructor(){super(...arguments),this.parameters={speed:Z(1)}}make(e={}){return new O(e.speed)}}},E={force:new class extends X{constructor(){super(...arguments),this.parameters={force:A([0,0,0]),ease:K()}}make(e={}){return new a(e.force.x,e.force.y,e.force.z,void 0,S(e.ease))}},gravity:new class extends X{constructor(){super(...arguments),this.parameters={gravity:Z(8)}}make(e={}){return new o(e.gravity)}},scale:new class extends X{constructor(){super(...arguments),this.parameters={a:Z(1),b:Z(1),ease:K()}}make(e={}){return new i(e.a,e.b,void 0,S(e.ease))}},randomDrift:new class extends X{constructor(){super(...arguments),this.parameters={drift:A([1,1,1]),delay:Z(0),ease:K()}}make(e={}){return new c(e.drift.x,e.drift.y,e.drift.z,e.delay,void 0,S(e.ease))}},disperse:new class extends X{constructor(){super(...arguments),this.parameters={distance:Z(1),axis:I(["XYZ","XZ","XY","YZ"],"XYZ"),ease:K()}}make(e={}){return new k(e.distance,h[e.axis.toLowerCase()],S(e.ease))}},rotate:new class extends X{constructor(){super(...arguments),this.parameters={rotation:A([0,0,0]),ease:K()}}make(e={}){const{x:t,y:s,z:n}=e.rotation;return new m(r.degToRad(t),r.degToRad(s),r.degToRad(n),void 0,S(e.ease))}},orientAlongVelocity:new class extends X{constructor(){super(...arguments),this.parameters={}}make(e={}){return new z(y.z)}},changeColor:new class extends X{constructor(){super(...arguments),this.parameters={a:D("#ffffff"),b:D("#ffffff"),ease:K()}}make(r={}){return new u(new e(r.a),new e(r.b),void 0,S(r.ease))}},changeOpacity:new class extends X{constructor(){super(...arguments),this.parameters={a:Z(1,0,1),b:Z(0,0,1),ease:K()}}make(e={}){return new p(e.a,e.b,void 0,S(e.ease))}},vortex:new class extends X{constructor(){super(...arguments),this.parameters={axis:A([0,1,0]),amount:Z(1)}}make(e={}){return new g(e.axis,e.amount)}},moveTo:new class extends X{constructor(){super(...arguments),this.parameters={target:A([0,1,0]),ease:K()}}make(e={}){return new v(e.target.x,e.target.y,e.target.z,S(e.ease))}},linearDamping:new class extends X{constructor(){super(...arguments),this.parameters={factor:Z(.1,0,1)}}make(e={}){return new b(e.factor)}}};export const VfxInitializserLibrary=q;export const VfxInitializserLibraryKeys=Object.keys(VfxInitializserLibrary);export const VfxBehaviourLibrary=E;export const VfxBehaviourLibraryKeys=Object.keys(VfxBehaviourLibrary);
|
2
2
|
/*
|
3
3
|
* Copyright (©) 2023. All rights reserved.
|
4
4
|
* See the LICENSE.md file for details.
|
@@ -10,11 +10,11 @@ export type VfxAssetProvider = {
|
|
10
10
|
};
|
11
11
|
export declare function materializeVfx(asset: VfxAsset, target: Object3D, assetProvider: VfxAssetProvider): Promise<{
|
12
12
|
system: System;
|
13
|
-
dispose: () =>
|
13
|
+
dispose: () => void;
|
14
14
|
}>;
|
15
15
|
export declare function materializeVfxOld(asset: VfxAsset, target: Object3D): {
|
16
16
|
system: System;
|
17
17
|
rate: Rate;
|
18
18
|
renderer: MeshRenderer;
|
19
|
-
dispose: () => Object3D<THREE.
|
19
|
+
dispose: () => Object3D<THREE.Object3DEventMap>;
|
20
20
|
};
|
@@ -1,4 +1,4 @@
|
|
1
|
-
import{Object3D as e}from"three";import*as t from"three";import a,{Behaviour as
|
1
|
+
import{Object3D as e}from"three";import*as t from"three";import a,{Behaviour as n,Body as r,BoxZone as o,Emitter as s,Force as i,Life as l,Mass as m,MeshRenderer as c,PointZone as w,Position as d,RadialVelocity as u,Radius as f,Rate as p,Rotate as A,Scale as h,Span as g,Vector3D as y,ease as b}from"three-nebula";import{RotatePosition as M}from"./behaviours.js";import{DelayRate as x,OnceRate as I}from"./rates.js";import{VfxBehaviourLibrary as B,VfxInitializserLibrary as E}from"./vfx-defs.js";import{ThreeBlendingMode as R}from"./vfx-asset.js";import{ShapeLibrary as S}from"../../scene/objects/shapes.js";import{prepareShapeParameters as v}from"../../scene/materializer.js";import{particleEnergyUniformName as j,particleVelcoityUniformName as Q}from"../../shader-nodes/particle.js";import{AttributeVec3Node as V,NodeShaderMaterial as U,RgbNode as k,Vec3ExpressionNode as F,lambertMaterial as H,varyingVec3 as P}from"three-shader-graph";import{DefaultInitializer as J}from"./initializsers.js";import{MultiRenderer as q}from"./vfx-renderers.js";export async function materializeVfx(n,o,i){let l=o;if(!0!==n.vfx.localSpace)for(;null!=l.parent;)l=l.parent;const m=new e;m.name="particle system",l.add(m);const c=new q(m,t),w=new a,d=await Promise.all(n.vfx.emitters.map((async a=>{let n,o;switch(a.rate.type){case"continuous":n=new x(a.rate.delay??0,a.rate.count,a.rate.time);break;case"once":n=new I(a.rate.delay??0,a.rate.count);break;default:console.warn(`Failed to configure r\n ate for emitter: ${JSON.stringify(a)}`),n=new p(0,1/0)}switch(a.output.type){case"sprite":o=new r(await async function(e,a){const n=null!=e.texture?await a.getTexture(e.texture):T;var r=new t.SpriteMaterial({map:n,color:e.color??16777215,blending:R[e.blendingMode]??t.NormalBlending,fog:!0,transparent:!0});const o=new t.Sprite(r);return o}(a.output,i));break;case"shape":o=new r(await async function(a,n){const r=S[a.shape];if(null==r)return console.error(`No shape with type ${a.shape}`),new e;const o=v(a.params??{}),s=r.geometry(o),i=null!=a.material?await n.getMaterial(a.material):function(){const e=P(new F("instanceColor")).rgb(),t=P(new V("particleData")).x();return new U({color:H({color:e}).rgb().rgba(t),transparent:!0})}();return new t.Mesh(s,i)}(a.output,i));break;case"mesh":o=new r(await async function(a,n){if(null==a.assetId)return console.warn("Can't use mesh as particle without asset id"),new e;const r=await n.getMesh(a.assetId),o=await n.getAsset(a.assetId),s=[];if(null!=o.materialAssignments)for(const e of o.materialAssignments)r.traverse((a=>{a instanceof t.Mesh&&a.material instanceof t.Material&&a.material.color instanceof t.Color&&(a.material.name!=e.name&&null!=e.name||"#"+a.material.color.getHexString()!==e.color||s.push(n.getMaterial(e.materialId).then((e=>a.material=e))))}));return await Promise.all(s),r.traverse((e=>{})),r}(a.output,i));break;default:console.error("Failed to create particly system body: "+JSON.stringify(a))}const l=(new s).setRate(n),m=await Promise.all(a.initializers.filter((e=>null!=E[e.type])).map((async e=>{const t=E[e.type],a=await v(e.params??{});return t.build(a)})));m.push(o,new J),l.addInitializers(m);const c=await Promise.all(a.behaviours.filter((e=>null!=B[e.type])).map((async e=>{const t=B[e.type],a=await v(e.params??{});return t.build(a)})));return c.push(new W),l.addBehaviours(c),l.emit()})));return d.forEach((e=>w.addEmitter(e))),w.addRenderer(c).emit({onEnd:()=>{console.log("ended")}}),{system:w,dispose:()=>{m.removeFromParent(),c.dispose()}}}const T=(new t.TextureLoader).load("data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAACAAAAAgCAYAAABzenr0AAAABGdBTUEAAK/INwWK6QAAABl0RVh0U29mdHdhcmUAQWRvYmUgSW1hZ2VSZWFkeXHJZTwAAAJkSURBVHjaxJeJbusgEEW94S1L//83X18M2MSuLd2pbqc4wZGqRLrKBsyZhQHny7Jk73xVL8xpVhWrcmiB5lX+6GJ5YgQ2owbAm8oIwH1VgKZUmGcRqKGGPgtEQQAzGR8hQ59fAmhJHSAagigJ4E7GPWRXOYC6owAd1JM6wDQPADyMWUqZRMqmAojHp1Vn6EQQEgUNMJLnUjMyJsM49wygBkAPw9dVFwXRkncCIIW3GRgoTQUZn6HxCMAFEFd8TwEQ78X4rHbILoAUmeT+RFG4UhQ6MiIAE4W/UsYFjuVjAIa2nIY4q1R0GFtQWG3E84lqw2GO2QOoCKBVu0BAPgDSU0eUDjjQenNkV/AW/pWChhpMTelo1a64AOKM30vk18GzTHXCNtI/Knz3DFBgsUqBGIjTInXRY1yA9xkVoqW5tVq3pDR9A0hfF5BSARmVnh7RMDCaIdcNgbPBkgzn1Bu+SfIEFSpSBmkxyrMicb0fAEuCZrWnN89veA/4XcakrPcjBWzkTuLjlbfTQPOlBhz+HwkqqPXmPQDdrQItxE1moGof1S74j/8txk8EHhTQrAE8qlwfqS5yukm1x/rAJ9Jiaa6nyATqD78aUVBhFo8b1V4DdTXdCW+IxA1zB4JhiOhZMEWO1HqnvdoHZ4FAMIhV9REF8FiUm0jsYPEJx/Fm/N8OhH90HI9YRHesWbXXZwAShU8qThe7H8YAuJmw5yOd989uRINKRTJAhoF8jbqrHKfeCYdIISZfSq26bk/K+yO3YvfKrVgiwQBHnwt8ynPB25+M8hceTt/ybPhnryJ78+tLgAEAuCFyiQgQB30AAAAASUVORK5CYII=");export function materializeVfxOld(n,x){let B=x;if(!0!==n.vfx.localSpace)for(;null!=B.parent;)B=B.parent;const E=new e;E.name="particle system",B.add(E);const R=new c(E,t),S=new t.Mesh(new t.BoxGeometry(.3,.3,.3),new t.MeshStandardMaterial({color:16777215})),v=new p(new g(3,9),new g(.02,.15)),j=new s,Q=new a;j.setLife(4).setRate(v).addInitializers([new m(1),new f(1),new l(1),new r(S),new d(new o(.5)),new u(10,new y(0,0,1),30)]).addBehaviours([new M(new t.Vector3(0,0,1),4),new i(0,0,.1),new A("random",2.5*-Math.PI,2*Math.PI,1,b.easeOutCubic),new h(1,.2)]).emit();const V=new I(0),U=(new s).setLife(5).addInitializers([new m(1),new f(1),new l(3),new r(S),new d(new w(0,0,0))]).addBehaviours([new h(4,6,void 0,b.easeOutExpo)]).setRate(V).emit();return V.nextTime=0,Q.addEmitter(j).addEmitter(U).addRenderer(R).emit({onEnd:()=>{console.log("ended")}}),{system:Q,rate:v,renderer:R,dispose:()=>E.removeFromParent()}}class W extends n{initialize(e){if(e.body instanceof t.Mesh){const t=e.body.material;t instanceof U&&(null!=t.uniforms[j]||null!=t.uniforms[Q])&&(e.body.material=t.clone())}}mutate(e,a,n){if(e.target instanceof t.Mesh){const t=e.target.material;t instanceof U&&(null!=t.uniforms[j]&&(t.uniforms[j].value=this.energy),null!=t.uniforms[Q]&&(t.uniforms[Q].value=e.velocity))}}}
|
2
2
|
/*
|
3
3
|
* Copyright (©) 2023. All rights reserved.
|
4
4
|
* See the LICENSE.md file for details.
|
@@ -7,5 +7,35 @@ export declare class VisualEffect {
|
|
7
7
|
private actorProvider;
|
8
8
|
private asset;
|
9
9
|
constructor(actorProvider: ActorProvider, asset: VfxAsset);
|
10
|
-
|
10
|
+
/**
|
11
|
+
* Create a new instance of the VFX Actor.
|
12
|
+
* Make sure to add the actor to the world for it to be visible
|
13
|
+
* and call play. Remove the actor from the world using world.removeActor
|
14
|
+
* to clean up.
|
15
|
+
* @param parent The object that the VFX should be parented to to make particles spawn relative to its location.
|
16
|
+
*/
|
17
|
+
create(parent: Object3D | BaseActor): Promise<VfxActor>;
|
18
|
+
/**
|
19
|
+
* Create a pool that can be used to create actors and reuse them.
|
20
|
+
* @param parent The object that the VFX should be parented to to make particles spawn relative to its location.
|
21
|
+
* @returns
|
22
|
+
*/
|
23
|
+
createPool(parent: Object3D | BaseActor): Pool<VfxActor>;
|
11
24
|
}
|
25
|
+
declare class Pool<T extends VfxActor> {
|
26
|
+
private creator;
|
27
|
+
instances: T[];
|
28
|
+
constructor(creator: () => Promise<T>);
|
29
|
+
/**
|
30
|
+
* Creates a new instance of a VFX actor or
|
31
|
+
* reuses a previously released one.
|
32
|
+
*/
|
33
|
+
get(): Promise<T>;
|
34
|
+
/**
|
35
|
+
* Release the VFX Actor to be reusable in future
|
36
|
+
* calls to the get function.
|
37
|
+
*/
|
38
|
+
release(instance: T): void;
|
39
|
+
dispose(): void;
|
40
|
+
}
|
41
|
+
export {};
|
@@ -1,4 +1,4 @@
|
|
1
|
-
import{VfxActor as t}from"./vfx-actor.js";import{BaseActor as s}from"../../gameplay/index.js";export class VisualEffect{constructor(t,s){this.actorProvider=t,this.asset=s}async
|
1
|
+
import{VfxActor as t}from"./vfx-actor.js";import{BaseActor as s}from"../../gameplay/index.js";export class VisualEffect{constructor(t,s){this.actorProvider=t,this.asset=s}async create(e){const a=await this.actorProvider.create(t);return e instanceof s?e.object.add(a.object):e.add(a.object),await a.fromAsset(this.asset),a}createPool(t){return new e((()=>this.create(t)))}}class e{constructor(t){this.creator=t,this.instances=[]}async get(){0==this.instances.length&&this.instances.push(await this.creator());const t=this.instances.shift();return t.restart(),t}release(t){this.instances.push(t)}dispose(){this.instances.length=0}}
|
2
2
|
/*
|
3
3
|
* Copyright (©) 2023. All rights reserved.
|
4
4
|
* See the LICENSE.md file for details.
|
@@ -0,0 +1,36 @@
|
|
1
|
+
import * as THREE from 'three';
|
2
|
+
import { Object3D } from 'three';
|
3
|
+
import { CustomRenderer, MeshRenderer, Particle } from 'three-nebula';
|
4
|
+
export declare class MultiRenderer extends CustomRenderer {
|
5
|
+
private container;
|
6
|
+
private three;
|
7
|
+
private renderers;
|
8
|
+
constructor(container: Object3D, three: typeof THREE);
|
9
|
+
onSystemUpdate(): void;
|
10
|
+
onParticleCreated(particle: Particle): void;
|
11
|
+
onParticleUpdate(particle: Particle): void;
|
12
|
+
onParticleDead(particle: Particle): void;
|
13
|
+
private getRenderer;
|
14
|
+
dispose(): void;
|
15
|
+
}
|
16
|
+
export declare class CombinedRenderer extends MeshRenderer {
|
17
|
+
dispose(): void;
|
18
|
+
scale(particle: any): void;
|
19
|
+
rotate(particle: any): void;
|
20
|
+
onParticleCreated(particle: Particle & {
|
21
|
+
body?: MeshRenderer['_body'];
|
22
|
+
target: THREE.Mesh | Object3D;
|
23
|
+
}): void;
|
24
|
+
onParticleUpdate(particle: any): void;
|
25
|
+
onParticleDead(particle: any): void;
|
26
|
+
}
|
27
|
+
export declare class InstancedRenderer extends MeshRenderer {
|
28
|
+
dispose(): void;
|
29
|
+
private meshes;
|
30
|
+
onParticleCreated(particle: Particle & {
|
31
|
+
body?: MeshRenderer['_body'];
|
32
|
+
target: any;
|
33
|
+
}): void;
|
34
|
+
onParticleUpdate(particle: any): void;
|
35
|
+
onParticleDead(particle: any): void;
|
36
|
+
}
|
@@ -0,0 +1,5 @@
|
|
1
|
+
import*as e from"three";import{Object3D as t}from"three";import{CustomRenderer as r,MeshRenderer as i,PUID as a}from"three-nebula";import{NodeShaderMaterial as s}from"three-shader-graph";var n;!function(e){e[e.mesh=0]="mesh",e[e.instanced=1]="instanced",e[e.sprite=2]="sprite"}(n||(n={}));export class MultiRenderer extends r{constructor(e,t){super(),this.container=e,this.three=t,this.renderers=[]}onSystemUpdate(){}onParticleCreated(e){this.getRenderer(e)?.onParticleCreated(e)}onParticleUpdate(e){this.getRenderer(e)?.onParticleUpdate(e)}onParticleDead(e){this.getRenderer(e)?.onParticleDead(e)}getRenderer(t){return t._renderer?t._renderer:t.body instanceof e.Sprite?(this.renderers[n.sprite]||(this.renderers[n.sprite]=new CombinedRenderer(this.container,this.three)),t._renderer=this.renderers[n.sprite]):t.body instanceof e.Mesh&&0==t.body.children.length&&t.body.material instanceof s?(this.renderers[n.instanced]||(this.renderers[n.instanced]=new InstancedRenderer(this.container,this.three)),t._renderer=this.renderers[n.instanced]):t.body instanceof e.Object3D?(this.renderers[n.mesh]||(this.renderers[n.mesh]=new CombinedRenderer(this.container,this.three)),t._renderer=this.renderers[n.mesh]):void 0}dispose(){this.renderers.forEach((e=>{e instanceof InstancedRenderer&&e.dispose()}))}}export class CombinedRenderer extends i{dispose(){}scale(t){const r=t.transform.initialScale;t.target instanceof e.Sprite?null!=r?t.target.scale.set(r.x*t.scale*t.radius,r.y*t.scale*t.radius,1):t.target.scale.set(t.scale*t.radius,t.scale*t.radius,1):null!=r?t.target.scale.set(r.x*t.scale,r.y*t.scale,r.z*t.scale):super.scale(t)}rotate(e){e.target.material.rotation=e.rotation.z}onParticleCreated(r){r.target||(r.target=this._targetPool.get(r.body),(r.useAlpha||r.useColor)&&(r.target instanceof e.Mesh||r.target instanceof e.Sprite&&r.target.material instanceof e.Material)&&(r.target.material.__puid=a.id(r.body.material),r.target.material=this._materialPool.get(r.target.material))),r.target&&r.target instanceof t&&(r.target.position.set(r.position.x,r.position.y,r.position.z),this.container.add(r.target))}onParticleUpdate(r){const{target:i,useAlpha:a,useColor:s,rotation:n}=r;if(i){if(i.position.copy(r.position),this.isThreeSprite(r)||i.rotation.set(n.x,n.y,n.z),this.scale(r),r.transform&&r.transform.orientAlongVelocity&&i instanceof t){const e=o.set(r.velocity.x,r.velocity.y,r.velocity.z).normalize(),t=i.getWorldDirection(l);t.applyAxisAngle(d,Math.PI/-2),c.setFromUnitVectors(t,e),i.quaternion.copy(c)}i.material instanceof e.Material&&(a&&(i.material.opacity=r.alpha,i.material.transparent=!0),s&&null!=i.material.color&&i.material.color.copy(r.color))}}onParticleDead(e){e.target&&(e.target.material&&(e.useAlpha||e.useColor)&&this._materialPool.expire(e.target.material),this._targetPool.expire(e.target),this.container.remove(e.target),e.target=null)}}const o=new e.Vector3,l=new e.Vector3,c=new e.Quaternion,d=new e.Vector3(1,0,0);export class InstancedRenderer extends i{constructor(){super(...arguments),this.meshes=[]}dispose(){this.meshes.forEach((e=>e.mesh.dispose()))}onParticleCreated(t){if(!(t.body instanceof e.Sprite)){if(null==t.target){const r=t.body;let i=this.meshes.find((e=>e.mesh.geometry.uuid===r.geometry.uuid&&e.mesh.material.uuid===r.material.uuid));if(null==i){const a=t.parent.rate,s=Math.min(Math.ceil(a.numPan.b/Math.min(Math.max(a.timePan.a,.01),1)),1e5);i={mesh:new e.InstancedMesh(r.geometry,r.material,s),indices:new Array(s).fill(null)},i.mesh.setColorAt(0,x.copy(new e.Color(t.color)));const n=new Float32Array(3*s);u.makeScale(0,0,0);for(let e=0;e<s;e++)n[3*e+0]=1,n[3*e+1]=1,i.mesh.setMatrixAt(e,u);i.mesh.instanceMatrix.needsUpdate=!0,i.mesh.geometry.setAttribute("particleData",new e.InstancedBufferAttribute(n,3)),this.meshes.push(i),this.container.add(i.mesh)}let a=i.indices.findIndex((e=>null==e));a<0&&(a=i.indices.indexOf(Math.min(...i.indices))),i.indices[a]=performance.now(),t.target=a}if("number"==typeof t.target){t.transform.initialScale;const e=t.body;let r=this.meshes.find((t=>t.mesh.geometry.uuid===e.geometry.uuid&&t.mesh.material.uuid===e.material.uuid));h(t,r.mesh),t.useAlpha&&(r.mesh.material.transparent=!0)}}}onParticleUpdate(e){const{target:t,useAlpha:r,useColor:i,rotation:a}=e;if(null==t)return;const s=e.body;let n=this.meshes.find((e=>e.mesh.geometry.uuid===s.geometry.uuid&&e.mesh.material.uuid===s.material.uuid));if(h(e,n.mesh),i&&(n.mesh.setColorAt(e.target,x.copy(e.color)),n.mesh.instanceColor.needsUpdate=!0),r){const t=n.mesh.geometry.getAttribute("particleData");t.setX(e.target,e.alpha),t.needsUpdate=!0}}onParticleDead(e){if(null!=e.target){const t=e.body;let r=this.meshes.find((e=>e.mesh.geometry.uuid===t.geometry.uuid&&e.mesh.material.uuid===t.material.uuid));r.indices[e.target]=null,e.scale=0,h(e,r.mesh),r.mesh.instanceMatrix.needsUpdate=!0,e.target=null}}}const m=new t;function h(e,t){if(g.set(e.position.x,e.position.y,e.position.z),e.transform&&e.transform.orientAlongVelocity){const r=o.set(e.position.x-e.old.position.x,e.position.y-e.old.position.y,e.position.z-e.old.position.z).normalize();t.getMatrixAt(e.target,m.matrix);const i=m.getWorldDirection(f);i.applyAxisAngle(d,Math.PI/-2),p.setFromUnitVectors(i,r)}else y.set(e.rotation.x,e.rotation.y,e.rotation.z),p.setFromEuler(y);const r=e.transform.initialScale;null!=r?f.set(r.x*e.scale,r.y*e.scale,r.z*e.scale):f.set(e.scale,e.scale,e.scale),u.compose(g,p,f),t.setMatrixAt(e.target,u),t.instanceMatrix.needsUpdate=!0}const u=new e.Matrix4,p=new e.Quaternion,g=new e.Vector3,f=new e.Vector3,y=new e.Euler,x=new e.Color(0);
|
2
|
+
/*
|
3
|
+
* Copyright (©) 2023. All rights reserved.
|
4
|
+
* See the LICENSE.md file for details.
|
5
|
+
*/
|
@@ -1,4 +1,4 @@
|
|
1
|
-
import{__decorate as t}from"tslib";import{ActorComponent as i,Component as e}from"../../../component.js";import{RootMotionClip as
|
1
|
+
import{__decorate as t}from"tslib";import{ActorComponent as i,Component as e}from"../../../component.js";import{RootMotionClip as s}from"../../../../animation/root-motion.js";import{inject as r}from"../../../../inject.js";import{ViewController as o}from"../../../../services/render.js";import{AnimationMixer as n,Bone as p,LoopOnce as l}from"three";let h=class extends i{constructor(){super(...arguments),this.viewController=r(o),this.stateMachines=[],this.upperStateMachines=[],this.fadeTime=.2,this.movementSpeed=null,this.upperBodyTimer=0,this.upperBodyOverride=!1,this.fullBodyTimer=0,this.currentFullBodyPriority=-1,this.currentUpperBodyPriority=-1,this.getFullBodyClip=a((t=>t.uuid),(t=>u(this.fullBodyMask,t))),this.getUpperBodyClip=a((t=>t.uuid),(t=>u(this.upperBodyMask,t)))}onInit(){this.viewController.onUpdate(this.actor).subscribe((t=>this.updateInternal(t)))}getRootMotionAction(){if(this.fullBodyAction.getClip()instanceof s)return this.fullBodyAction}setup(t,i,e){null!=i&&(this.upperBodyMask=c(i),this.fullBodyMask=function(t,i){const e=new Set(c(i).map((t=>t.uuid))),s=[];return t.traverse((t=>{(t instanceof p||t.isBone)&&!e.has(t.uuid)&&s.push(t)})),s}(function(t){let i;return t.traverse((t=>{(t instanceof p||t.isBone)&&null==i&&(i=t)})),i}(t),i)),null!=this.mixer&&this.mixer.stopAllAction(),this.mixer=new n(t)}updateStateMachines(t){this.stateMachines.forEach((i=>{i.step(t);const e=i.current.clip;null!=e&&this.play(e,{priority:0})})),this.upperStateMachines.forEach((i=>{i.step(t);const e=i.current.clip;null!=e?this.playUpper(e,{priority:0}):this.play(this.fullBodyClip)}))}updateInternal(t){null!=this.mixer&&(this.upperBodyTimer+=t,this.fullBodyTimer+=t,this.upperBodyAction&&this.upperBodyOverride&&this.upperBodyAction.getClip().duration-2*this.fadeTime<this.upperBodyTimer&&(this.upperBodyOverride=!1,null!=this.fullBodyClip&&this.transition(this.upperBodyAction,this.getUpperBodyClip(this.fullBodyClip))),this.fullBodyAction&&this.fullBodyAction.loop===l&&this.fullBodyAction.getClip().duration-2*this.fadeTime<this.fullBodyTimer&&(this.currentFullBodyPriority=-1),this.updateStateMachines(t),this.syncMovementSpeed(this.fullBodyAction),this.upperBodyOverride||this.syncMovementSpeed(this.upperBodyAction),this.mixer.update(t))}syncMovementSpeed(t){if(null!=t){const i=t.getClip();i instanceof s&&i.fixedInPlace&&null!=this.movementSpeed&&(t.timeScale=i.duration/i.displacement*this.movementSpeed)}}playStateMachine(t){this.stateMachines.push(t)}playUpperStateMachine(t){this.upperStateMachines.push(t)}removeStateMachine(t){this.stateMachines.splice(this.stateMachines.indexOf(t))}removeUpperStateMachine(t){this.upperStateMachines.splice(this.upperStateMachines.indexOf(t))}playUpper(t,i={}){const e=i?.priority??1;e<this.currentUpperBodyPriority||(this.currentUpperBodyPriority=e,this.upperBodyAction=this.transition(this.upperBodyAction,this.getUpperBodyClip(t),i),this.upperBodyTimer=0,this.upperBodyOverride=!0)}play(t,i={}){!function(t,i){if(!1===t||"function"==typeof t&&!1===t())throw new Error(i)}(null!=this.mixer,"Can't play animation before setup is called");const e=i.priority??1;e<this.currentFullBodyPriority||(this.currentFullBodyPriority=e,this.fullBodyTimer=0,this.upperBodyOverride||(this.upperBodyAction=this.transition(this.upperBodyAction,this.getUpperBodyClip(t),i)),this.fullBodyClip=t,this.fullBodyAction=this.transition(this.fullBodyAction,this.getFullBodyClip(t),i),this.fullBodyAction.getClip().uuid==this.upperBodyAction.getClip().uuid&&this.upperBodyAction.syncWith(this.fullBodyAction))}onActionDone(t){return new Promise((i=>{const e=s=>{s.action===t&&(i(s.action),this.mixer.removeEventListener("finished",e))};this.mixer.addEventListener("finished",e)}))}transition(t,i,e={}){if(null!=t&&t.getClip().uuid===i.uuid)return t;if(t){const e=t,s=t=this.mixer.clipAction(i);s.play(),s.enabled=!0,s.setEffectiveTimeScale(1),s.setEffectiveWeight(1),s.time=0,e.crossFadeTo(s,this.fadeTime,!0)}else t=this.mixer.clipAction(i),t?.fadeIn(.3),t?.play();return!1===e.loop&&(t.setLoop(l,1),t.clampWhenFinished=!0,t.reset()),t}};h=t([e()],h);export{h as CharacterAnimationComponent};function u(t,i){if(null==t)return i;const e=i.clone(),s=new Set(t.map((t=>t.name)));return e.tracks=e.tracks.filter((t=>s.has(t.name.split(".")[0]))),e}function c(t){return t.flatMap((t=>function(t){const i=[];return t.traverse((t=>{i.push(t)})),i}(t))).filter((t=>t instanceof p))}function a(t,i){const e=new Map;return(s,...r)=>{const o=t(s);return e.has(o)||e.set(o,i(s,...r)),e.get(o)}}
|
2
2
|
/*
|
3
3
|
* Copyright (©) 2023. All rights reserved.
|
4
4
|
* See the LICENSE.md file for details.
|