@woosh/meep-engine 2.56.1 → 2.57.0
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/editor/ecs/component/editors/ColorEditor.js +1 -1
- package/editor/ecs/component/editors/ImagePathEditor.js +2 -2
- package/editor/ecs/component/editors/{LargeStrongEditor.js → LargeStringEditor.js} +1 -1
- package/editor/tools/GridPaintTool.js +3 -3
- package/editor/tools/TopDownCameraControlTool.js +1 -1
- package/editor/tools/TransformTool.js +1 -1
- package/editor/tools/engine/Tool.js +9 -23
- package/editor/tools/engine/ToolEngine.js +5 -7
- package/editor/tools/paint/TerrainHeightPaintTool.js +2 -2
- package/editor/tools/paint/TerrainPaintTool.js +2 -2
- package/editor/tools/paint/TerrainTexturePaintTool.js +2 -2
- package/package.json +1 -1
- package/src/core/bvh2/bvh3/query/compute_tight_near_far_clipping_planes.js +1 -1
- package/src/core/bvh2/traversal/ThreeClippingPlaneComputingBVHVisitor.js +1 -1
- package/src/core/bvh2/traversal/__process_point_if_within_planes.js +1 -1
- package/src/core/cache/LoadingCache.js +3 -2
- package/src/core/collection/array/arraySetSortingDiff.spec.js +12 -12
- package/src/core/collection/array/weightedRandomFromArray.js +2 -2
- package/src/core/color/Color.js +6 -6
- package/src/core/color/YCbCr/YCbCr.spec.js +16 -0
- package/src/core/color/{YCbCr_to_rgb_uint24.js → YCbCr/YCbCr_to_rgb_uint24.js} +6 -6
- package/src/core/color/YCbCr/rgb_to_YCbCr_uint24.js +16 -0
- package/src/core/color/{hex2rgb.js → hex/hex2rgb.js} +1 -1
- package/src/core/color/{rgb2hex.js → hex/rgb2hex.js} +1 -1
- package/src/core/color/{hsv2rgb.js → hsv/hsv2rgb.js} +3 -3
- package/src/core/color/hsv/rgb2hsv.js +49 -0
- package/src/core/color/{kelvin_to_rgb.js → kelvin/kelvin_to_rgb.js} +1 -1
- package/src/core/color/{kelvin_to_rgb.spec.js → kelvin/kelvin_to_rgb.spec.js} +2 -2
- package/src/core/color/{prototype_kelvin_to_rgb.js → kelvin/prototype_kelvin_to_rgb.js} +5 -5
- package/src/core/color/{rgb_to_kelvin.spec.js → kelvin/rgb_to_kelvin.spec.js} +1 -1
- package/src/core/color/{parseColor.js → parse_color.js} +4 -4
- package/src/core/color/parse_color.spec.js +18 -0
- package/src/core/color/rgb2uint24.js +3 -3
- package/src/core/color/sRGB/sRGB.spec.js +16 -0
- package/src/core/color/xyz/XYZ.spec.js +16 -0
- package/src/core/color/xyz/rgb_to_xyz.js +15 -0
- package/src/core/color/xyz/xyz_to_rgb.js +14 -0
- package/src/core/events/signal/Signal.js +5 -0
- package/src/core/events/signal/{signalAggregateByTimeWindow.js → signal_aggregate_by_time_window.js} +1 -1
- package/src/core/events/signal/{SignalUtils.js → signal_filter.js} +1 -2
- package/src/core/geom/2d/spline_bezier2_2d.js +26 -0
- package/src/core/geom/2d/spline_bezier2_2d.spec.js +16 -0
- package/src/core/geom/3d/SurfacePoint3.js +1 -1
- package/src/core/geom/3d/aabb/aabb3_compute_plane_side.js +1 -1
- package/src/core/geom/3d/aabb/aabb3_detailed_volume_intersection.js +1 -1
- package/src/core/geom/3d/aabb/aabb3_transformed_compute_plane_side.js +1 -1
- package/src/core/geom/3d/compute_circle_bounding_box.js +1 -1
- package/src/core/geom/3d/cone/computeConeBoundingBox.js +1 -1
- package/src/core/geom/3d/frustum/frustum3_computeNearestPointToPoint.js +1 -1
- package/src/core/geom/3d/line/line3_computeSegmentPointDistance_sqr.js +1 -1
- package/src/core/geom/3d/line/line3_compute_nearest_point_to_point.js +1 -1
- package/src/core/geom/3d/normal/hemioct/unit_hemioct.spec.js +1 -1
- package/src/core/geom/3d/normal/spherical/sphere_map_transform.js +1 -1
- package/src/core/geom/3d/plane/is_point_within_planes.js +1 -1
- package/src/core/geom/3d/plane/lerp_planes_to_array.js +1 -1
- package/src/core/geom/3d/plane/plane3_compute_convex_3_plane_intersection.js +1 -1
- package/src/core/geom/3d/plane/plane3_compute_line_segment_intersection.js +1 -1
- package/src/core/geom/3d/plane/plane3_compute_ray_intersection.js +1 -1
- package/src/core/geom/3d/plane/plane3_lerp.js +2 -2
- package/src/core/geom/3d/plane/plane3_projectPoint.js +1 -1
- package/src/core/geom/3d/plane/plane3_slerp.js +3 -3
- package/src/core/geom/3d/ray/ray_computeNearestPointToPoint.js +1 -1
- package/src/core/geom/3d/ray/ray_distance_to_point.js +1 -1
- package/src/core/geom/3d/shape/UnionShape3D.js +3 -3
- package/src/core/geom/3d/shape/UnitCubeShape3D.js +1 -1
- package/src/core/geom/3d/shape/UnitSphereShape3D.js +1 -1
- package/src/core/geom/3d/sphere/sphere_intersects_ray.js +1 -1
- package/src/core/geom/3d/tetrahedra/TetrahedralMesh.js +6 -0
- package/src/core/geom/3d/tetrahedra/compute_bounding_simplex_3d.js +1 -1
- package/src/core/geom/3d/tetrahedra/compute_bounding_simplex_3d.spec.js +1 -1
- package/src/core/geom/3d/tetrahedra/compute_circumsphere.js +1 -1
- package/src/core/geom/3d/tetrahedra/delaunay/compute_delaunay_tetrahedral_mesh.js +1 -0
- package/src/core/geom/3d/tetrahedra/delaunay/compute_delaunay_tetrahedral_mesh.spec.js +10 -2
- package/src/core/geom/3d/topology/bounds/computeTriangleClusterNormalBoundingCone.js +1 -1
- package/src/core/geom/3d/topology/samples/sampleFloodFill.js +1 -1
- package/src/core/geom/3d/topology/simplify/compute_face_normal_change_dot_product.js +1 -1
- package/src/core/geom/3d/topology/simplify/quadratic/Quadratic3.js +1 -1
- package/src/core/geom/3d/topology/simplify/tm_edge_collapse_is_degenerate_flip.js +2 -2
- package/src/core/geom/3d/topology/struct/TopoVertex.js +1 -1
- package/src/core/geom/3d/topology/util/compute_face_connection_weight.js +2 -2
- package/src/core/geom/3d/triangle/computeTrianglePlaneSide.js +1 -1
- package/src/core/geom/3d/triangle/computeTriangleRayIntersection.js +1 -1
- package/src/core/geom/3d/triangle/computeTriangleRayIntersectionBarycentricEdge.js +1 -1
- package/src/core/geom/3d/v3_compute_triangle_normal.js +1 -1
- package/src/core/geom/Quaternion.js +1 -1
- package/src/core/geom/Vector3.js +7 -7
- package/src/core/geom/Vector3.spec.js +68 -1
- package/src/core/geom/mat2/m2_add.js +17 -0
- package/src/core/geom/mat2/m2_determinant.js +8 -0
- package/src/core/geom/mat2/m2_multiply.js +17 -0
- package/src/core/geom/mat2/m2_multiply_scalar.js +18 -0
- package/src/core/geom/mat2/m2_multiply_transposed.js +18 -0
- package/src/core/geom/mat2/m2_sub_transposed.js +17 -0
- package/src/{view → core/geom/mat3}/m3_cm_compose_transform.js +0 -29
- package/src/core/geom/mat3/m3_cm_extract_rotation.js +8 -0
- package/src/core/geom/mat3/m3_cm_from_translation.js +19 -0
- package/src/{view/multiplyMatrices3.js → core/geom/mat3/m3_multiply.js} +2 -2
- package/src/{view → core/geom/mat3}/m3_rm_compose_transform.js +0 -9
- package/src/core/geom/mat3/m3_rm_extract_scale.js +7 -0
- package/src/core/geom/{3d/vector/allocate_v3.js → vec3/v3_allocate.js} +1 -1
- package/src/core/geom/{v3_angle_between.js → vec3/v3_angle_between.js} +1 -1
- package/src/core/geom/vec3/v3_dot_array_array.js +20 -0
- package/src/core/geom/{v3_lerp.js → vec3/v3_lerp.js} +1 -1
- package/src/core/graph/SquareMatrix.js +26 -3
- package/src/core/graph/SquareMatrix.spec.js +52 -2
- package/src/core/math/clamp01.js +1 -0
- package/src/core/math/fract.js +3 -1
- package/src/core/math/inverseLerp.js +7 -5
- package/src/core/math/lerp.js +5 -5
- package/src/core/math/physics/spring/computeHookeForce.js +9 -0
- package/src/core/math/remap.js +19 -0
- package/src/core/math/remap.spec.js +15 -0
- package/src/core/math/smoothStep.spec.js +16 -0
- package/src/core/math/spline/spline_bezier2.js +13 -0
- package/src/core/math/spline/spline_bezier2.spec.js +13 -0
- package/src/core/model/object/compareValues.js +2 -2
- package/src/core/model/object/read_property.js +10 -2
- package/src/core/model/object/write_property.js +3 -23
- package/src/core/model/object/write_property.spec.js +26 -0
- package/src/core/primitives/numbers/number_pretty_print.spec.js +19 -0
- package/src/engine/ecs/ik/OneBoneSurfaceAlignmentSolver.js +2 -2
- package/src/engine/ecs/ik/TwoBoneInverseKinematicsSolver.js +2 -2
- package/src/engine/ecs/systems/SteeringSystem.js +1 -1
- package/src/engine/ecs/terrain/ecs/splat/SplatMapOptimizerDebugger.js +1 -1
- package/src/engine/graphics/ecs/camera/Camera.js +1 -1
- package/src/engine/graphics/ecs/camera/CameraClippingPlaneComputer.js +1 -1
- package/src/engine/graphics/ecs/decal/v2/FPDecalSystem.js +3 -11
- package/src/engine/graphics/ecs/highlight/Highlight.js +20 -102
- package/src/engine/graphics/ecs/mesh/Mesh.js +12 -18
- package/src/engine/graphics/ecs/mesh/MeshSystem.js +41 -26
- package/src/engine/graphics/ecs/mesh-v2/ShadedGeometrySystem.js +1 -1
- package/src/engine/graphics/ecs/path/tube/build/TubePathBuilder.js +1 -1
- package/src/engine/graphics/ecs/path/tube/build/makeTubeGeometry.js +1 -1
- package/src/engine/graphics/ecs/path/tube/build/make_cap.js +3 -3
- package/src/engine/graphics/ecs/path/tube/build/make_ring_vertices.js +1 -1
- package/src/engine/graphics/geometry/MikkT/InitTriInfo.js +5 -6
- package/src/engine/graphics/geometry/MikkT/MikkTSpace.js +3 -3
- package/src/engine/graphics/geometry/MikkT/NormalizeSafe.js +1 -2
- package/src/engine/graphics/geometry/MikkT/STSpace.js +3 -3
- package/src/engine/graphics/geometry/MikkT/v3_scale_dot_sub_normalize.js +2 -2
- package/src/engine/graphics/geometry/bvh/buffered/BVHGeometryRaycaster.js +1 -1
- package/src/engine/graphics/geometry/clipping/ClippedGeometry.js +1 -1
- package/src/engine/graphics/particles/particular/engine/emitter/ParticleEmitter.js +102 -95
- package/src/engine/graphics/particles/particular/engine/emitter/ParticleLayer.spec.js +25 -0
- package/src/engine/graphics/particles/particular/engine/emitter/ParticlePool.js +0 -35
- package/src/engine/graphics/particles/particular/engine/emitter/ParticlePool.spec.js +39 -2
- package/src/engine/graphics/particles/particular/engine/shader/ShaderManager.js +22 -6
- package/src/engine/graphics/render/forward_plus/LightManager.js +1 -1
- package/src/engine/graphics/render/forward_plus/plugin/ptototypeFPPlugin.js +2 -2
- package/src/engine/graphics/render/forward_plus/prototype/prototypeLightManager.js +3 -3
- package/src/engine/graphics/render/forward_plus/query/detailed_sphere_frustum_intersection_test.js +1 -1
- package/src/engine/graphics/render/layers/RenderLayerUtils.js +1 -1
- package/src/engine/graphics/render/visibility/hiz/prototypeHiZ.js +3 -2
- package/src/engine/graphics/sh3/LightProbeVolume.js +1 -1
- package/src/engine/graphics/sh3/path_tracer/PathTracer.js +2 -2
- package/src/engine/graphics/sh3/path_tracer/prototypePathTracer.js +2 -2
- package/src/engine/graphics/sh3/path_tracer/random_in_hemisphere.js +1 -1
- package/src/engine/graphics/sh3/path_tracer/ray_hit_apply_transform.js +1 -1
- package/src/engine/graphics/sh3/path_tracer/ray_reflect.js +1 -1
- package/src/engine/graphics/sh3/sky/hosek/data.js +3744 -0
- package/src/engine/graphics/sh3/sky/hosek/sky_hosek_compute_irradiance_by_direction.js +10 -3786
- package/src/engine/graphics/texture/atlas/AbstractTextureAtlas.js +1 -1
- package/src/engine/graphics/texture/atlas/AtlasPatch.js +0 -1
- package/src/engine/graphics/texture/atlas/AtlasPatchFlag.js +8 -1
- package/src/engine/graphics/texture/atlas/CachingTextureAtlas.js +25 -0
- package/src/engine/graphics/texture/atlas/CachingTextureAtlas.spec.js +54 -0
- package/src/engine/graphics/texture/atlas/ManagedTextureAtlas.js +101 -160
- package/src/engine/graphics/texture/atlas/TextureAtlas.js +18 -1
- package/src/engine/graphics/texture/sampler/sampler2d_ensure_uint8_RGBA.js +22 -0
- package/src/engine/graphics/util/projectSphere.js +1 -1
- package/src/engine/navigation/ecs/components/Path.js +1 -1
- package/src/engine/physics/mls-mpm/MLS_MPM.js +11 -106
- package/src/engine/reference/v2/Reference.js +6 -2
- package/src/engine/sound/ecs/emitter/SoundEmitter.js +7 -7
- package/src/engine/sound/ecs/emitter/SoundTrack.js +6 -6
- package/src/generation/filtering/numeric/complex/CellFilterAngleToNormal.js +1 -1
- package/src/generation/grid/generation/road/GridTaskGenerateRoads.js +2 -4
- package/src/generation/placement/action/random/weighted/CellActionSelectWeightedRandom.js +2 -2
- package/src/generation/theme/ThemeEngine.js +2 -2
- package/src/generation/theme/ThemeEngine.spec.js +7 -0
- package/src/view/View.js +21 -13
- package/src/view/elements/ColorPickerView.js +2 -2
- package/src/view/minimap/gl/MarkerGL.js +20 -18
- package/src/view/minimap/gl/MinimapMarkersGL.js +2 -1
- package/editor/tools/FoliagePaintTool.js +0 -168
- package/editor/tools/engine/ToolStateMachine.js +0 -53
- package/src/core/NumberFormat.js +0 -4
- package/src/core/color/rgb2hsv.js +0 -47
- package/src/core/color/rgb_to_YCbCr_uint24.js +0 -16
- package/src/core/fsm/StateMachine.js +0 -440
- package/src/core/fsm/Transition.js +0 -65
- package/src/core/geom/Bezier.js +0 -24
- package/src/core/geom/Bezier.spec.js +0 -16
- package/src/core/math/spline/quadraticCurve.js +0 -11
- package/src/core/math/spline/quadraticCurve.spec.js +0 -13
- package/src/core/primitives/numbers/compareNumbers.js +0 -9
- package/src/engine/graphics/ecs/decal/Decal.js +0 -10
- package/src/engine/graphics/ecs/decal/DecalSystem.js +0 -99
- package/src/engine/graphics/ecs/decal/threejs/DecalGeometry.js +0 -298
- package/src/engine/graphics/ecs/trail/Trail.js +0 -83
- package/src/engine/graphics/ecs/trail/TrailMaterial.js +0 -67
- package/src/engine/graphics/ecs/trail/TrailMaterial2.js +0 -73
- package/src/engine/graphics/ecs/trail/TrailSystem.js +0 -162
- package/src/engine/graphics/ecs/water2/NodeWaterShader1.js +0 -213
- package/src/engine/graphics/ecs/water2/shader/JBWaterShader.js +0 -315
- package/src/engine/graphics/geometry/MikkT/Length.js +0 -10
- package/src/engine/graphics/texture/ImageLoader.js +0 -33
- package/src/engine/graphics/three/DDSLoader.js +0 -286
- package/src/engine/graphics/three/Water2.js +0 -343
- package/src/engine/physics/spring/computeHookeForce.js +0 -9
- package/src/engine/reference/v1/ReferenceManager.js +0 -124
- /package/src/core/color/{hex2rgb.spec.js → hex/hex2rgb.spec.js} +0 -0
- /package/src/core/color/{rgb2hex.spec.js → hex/rgb2hex.spec.js} +0 -0
- /package/src/core/color/{hsv2rgb.spec.js → hsv/hsv2rgb.spec.js} +0 -0
- /package/src/core/color/{rgb_to_kelvin.js → kelvin/rgb_to_kelvin.js} +0 -0
- /package/src/core/color/{linear_to_sRGB.js → sRGB/linear_to_sRGB.js} +0 -0
- /package/src/core/color/{sRGB_to_linear.js → sRGB/sRGB_to_linear.js} +0 -0
- /package/src/core/geom/{m3_determinant.js → mat3/m3_determinant.js} +0 -0
- /package/src/core/geom/{v3_distance.js → vec3/v3_distance.js} +0 -0
- /package/src/core/geom/{v3_distance_above_plane.js → vec3/v3_distance_above_plane.js} +0 -0
- /package/src/core/geom/{v3_distance_above_plane.spec.js → vec3/v3_distance_above_plane.spec.js} +0 -0
- /package/src/core/geom/{v3_distance_sqr.d.ts → vec3/v3_distance_sqr.d.ts} +0 -0
- /package/src/core/geom/{v3_distance_sqr.js → vec3/v3_distance_sqr.js} +0 -0
- /package/src/core/geom/{v3_dot.js → vec3/v3_dot.js} +0 -0
- /package/src/core/geom/{v3_length.js → vec3/v3_length.js} +0 -0
- /package/src/core/geom/{v3_length_sqr.js → vec3/v3_length_sqr.js} +0 -0
- /package/src/core/geom/{v3_slerp.js → vec3/v3_slerp.js} +0 -0
|
@@ -1,440 +0,0 @@
|
|
|
1
|
-
/**
|
|
2
|
-
* Created by Alex on 01/09/2014.
|
|
3
|
-
*/
|
|
4
|
-
|
|
5
|
-
|
|
6
|
-
import { assert } from "../assert.js";
|
|
7
|
-
import { dispatchViaProxy } from "../events/signal/Signal.js";
|
|
8
|
-
import Graph from "../graph/Graph.js";
|
|
9
|
-
import Future from "../process/Future.js";
|
|
10
|
-
import Transition from "./Transition.js";
|
|
11
|
-
|
|
12
|
-
/**
|
|
13
|
-
*
|
|
14
|
-
* @enum {number}
|
|
15
|
-
*/
|
|
16
|
-
export const StateMachineEventType = {
|
|
17
|
-
StateEntered: 0,
|
|
18
|
-
StateExited: 1
|
|
19
|
-
};
|
|
20
|
-
|
|
21
|
-
/**
|
|
22
|
-
* @template {T}
|
|
23
|
-
* @constructor
|
|
24
|
-
*/
|
|
25
|
-
function StateMachine() {
|
|
26
|
-
this.graph = new Graph();
|
|
27
|
-
this.state = null;
|
|
28
|
-
this.isLocked = false;
|
|
29
|
-
|
|
30
|
-
/**
|
|
31
|
-
*
|
|
32
|
-
* @type {Map<any, Array>}
|
|
33
|
-
*/
|
|
34
|
-
this.stateProcessorMap = new Map();
|
|
35
|
-
|
|
36
|
-
this.stateEntryHandlers = new Map();
|
|
37
|
-
this.stateExitHandlers = new Map();
|
|
38
|
-
|
|
39
|
-
/**
|
|
40
|
-
* Used for debug mainly
|
|
41
|
-
* @type {Array<T>}
|
|
42
|
-
* @private
|
|
43
|
-
*/
|
|
44
|
-
this.__history = [];
|
|
45
|
-
}
|
|
46
|
-
|
|
47
|
-
/**
|
|
48
|
-
*
|
|
49
|
-
* @param {T} source
|
|
50
|
-
* @param {T} target
|
|
51
|
-
* @param {Transition~action} action
|
|
52
|
-
* @param {Transition~condition} [condition]
|
|
53
|
-
* @returns {Transition}
|
|
54
|
-
*/
|
|
55
|
-
StateMachine.prototype.createTransition = function (source, target, action, condition) {
|
|
56
|
-
const transition = new Transition(source, target, action, condition);
|
|
57
|
-
this.addTransition(transition);
|
|
58
|
-
return transition;
|
|
59
|
-
};
|
|
60
|
-
|
|
61
|
-
/**
|
|
62
|
-
*
|
|
63
|
-
* @param {T} state
|
|
64
|
-
* @param {StateMachineEventType} type
|
|
65
|
-
* @param {function} handler
|
|
66
|
-
*/
|
|
67
|
-
StateMachine.prototype.addEventHandler = function (state, type, handler) {
|
|
68
|
-
let eventMap;
|
|
69
|
-
|
|
70
|
-
if (type === StateMachineEventType.StateEntered) {
|
|
71
|
-
eventMap = this.stateEntryHandlers;
|
|
72
|
-
} else if (type === StateMachineEventType.StateExited) {
|
|
73
|
-
eventMap = this.stateExitHandlers;
|
|
74
|
-
} else {
|
|
75
|
-
throw new Error(`Unknown event type '${type}'`);
|
|
76
|
-
}
|
|
77
|
-
|
|
78
|
-
const handlers = eventMap.get(state);
|
|
79
|
-
if (handlers === undefined) {
|
|
80
|
-
eventMap.set(state, [handler]);
|
|
81
|
-
} else {
|
|
82
|
-
handlers.push(handler);
|
|
83
|
-
}
|
|
84
|
-
};
|
|
85
|
-
|
|
86
|
-
/**
|
|
87
|
-
*
|
|
88
|
-
* @param {T} state
|
|
89
|
-
* @param {StateMachineEventType} type
|
|
90
|
-
* @param {function} handler
|
|
91
|
-
*/
|
|
92
|
-
StateMachine.prototype.removeEventHandler = function (state, type, handler) {
|
|
93
|
-
let eventMap;
|
|
94
|
-
|
|
95
|
-
if (type === StateMachineEventType.StateEntered) {
|
|
96
|
-
eventMap = this.stateEntryHandlers;
|
|
97
|
-
} else if (type === StateMachineEventType.StateExited) {
|
|
98
|
-
eventMap = this.stateExitHandlers;
|
|
99
|
-
} else {
|
|
100
|
-
throw new Error(`Unknown event type '${type}'`);
|
|
101
|
-
}
|
|
102
|
-
|
|
103
|
-
|
|
104
|
-
const handlers = eventMap.get(state);
|
|
105
|
-
if (handlers === undefined) {
|
|
106
|
-
//no handlers, clearly handler was not registered
|
|
107
|
-
console.warn('No listeners registered');
|
|
108
|
-
} else {
|
|
109
|
-
const i = handlers.indexOf(handler);
|
|
110
|
-
|
|
111
|
-
if (i === -1) {
|
|
112
|
-
console.warn('Listener not found');
|
|
113
|
-
return;
|
|
114
|
-
}
|
|
115
|
-
|
|
116
|
-
handlers.splice(i, 1);
|
|
117
|
-
}
|
|
118
|
-
};
|
|
119
|
-
|
|
120
|
-
/**
|
|
121
|
-
*
|
|
122
|
-
* @param {Transition} t
|
|
123
|
-
*/
|
|
124
|
-
StateMachine.prototype.addTransition = function (t) {
|
|
125
|
-
this.graph.addEdge(t);
|
|
126
|
-
};
|
|
127
|
-
|
|
128
|
-
/**
|
|
129
|
-
*
|
|
130
|
-
* @param {T} s
|
|
131
|
-
*/
|
|
132
|
-
StateMachine.prototype.addState = function (s) {
|
|
133
|
-
this.graph.addNode(s);
|
|
134
|
-
};
|
|
135
|
-
|
|
136
|
-
/**
|
|
137
|
-
*
|
|
138
|
-
* @param {T} state
|
|
139
|
-
* @param {function():Promise<T>} processor
|
|
140
|
-
*/
|
|
141
|
-
StateMachine.prototype.addStateProcessor = function (state, processor) {
|
|
142
|
-
assert.notEqual(state, undefined, 'state was undefined');
|
|
143
|
-
assert.equal(typeof processor, 'function', `processor must be a function, instead was '${typeof processor}'`)
|
|
144
|
-
|
|
145
|
-
if (!this.graph.containsNode(state)) {
|
|
146
|
-
throw new Error(`State ${state} is not found in the graph`);
|
|
147
|
-
}
|
|
148
|
-
|
|
149
|
-
const processors = this.stateProcessorMap.get(state);
|
|
150
|
-
|
|
151
|
-
if (processors === undefined) {
|
|
152
|
-
this.stateProcessorMap.set(state, [processor]);
|
|
153
|
-
} else {
|
|
154
|
-
processors.push(state);
|
|
155
|
-
}
|
|
156
|
-
};
|
|
157
|
-
|
|
158
|
-
/**
|
|
159
|
-
*
|
|
160
|
-
* @param {Array.<*>} states
|
|
161
|
-
*/
|
|
162
|
-
StateMachine.prototype.addAllStates = function (states) {
|
|
163
|
-
let i = 0;
|
|
164
|
-
const l = states.length;
|
|
165
|
-
for (; i < l; i++) {
|
|
166
|
-
this.addState(states[i]);
|
|
167
|
-
}
|
|
168
|
-
};
|
|
169
|
-
|
|
170
|
-
|
|
171
|
-
/**
|
|
172
|
-
*
|
|
173
|
-
* @param {T} s
|
|
174
|
-
*/
|
|
175
|
-
StateMachine.prototype.setState = function (s) {
|
|
176
|
-
// console.warn('setState', s);
|
|
177
|
-
|
|
178
|
-
const oldState = this.state;
|
|
179
|
-
|
|
180
|
-
this.state = s;
|
|
181
|
-
|
|
182
|
-
const exitHandlers = this.stateExitHandlers.get(oldState);
|
|
183
|
-
|
|
184
|
-
if (exitHandlers !== undefined) {
|
|
185
|
-
dispatchViaProxy(exitHandlers, [oldState, s]);
|
|
186
|
-
}
|
|
187
|
-
|
|
188
|
-
const entryHandlers = this.stateEntryHandlers.get(s);
|
|
189
|
-
|
|
190
|
-
if (entryHandlers !== undefined) {
|
|
191
|
-
dispatchViaProxy(entryHandlers, [s, oldState]);
|
|
192
|
-
}
|
|
193
|
-
|
|
194
|
-
this.__history.push(s);
|
|
195
|
-
};
|
|
196
|
-
|
|
197
|
-
/**
|
|
198
|
-
*
|
|
199
|
-
* @returns {T}
|
|
200
|
-
*/
|
|
201
|
-
StateMachine.prototype.getState = function () {
|
|
202
|
-
return this.state;
|
|
203
|
-
};
|
|
204
|
-
|
|
205
|
-
/**
|
|
206
|
-
* Causes the state machine to enter a given state
|
|
207
|
-
* @param {T} s
|
|
208
|
-
*/
|
|
209
|
-
StateMachine.prototype.enterState = function (s) {
|
|
210
|
-
if (this.isLocked) {
|
|
211
|
-
throw new Error(`State Machine is locked, unable to set state from '${this.state}' to '${s}'`);
|
|
212
|
-
}
|
|
213
|
-
|
|
214
|
-
this.setState(s);
|
|
215
|
-
|
|
216
|
-
//try all state processors in turn until all have been tried and failed or one has succeeded
|
|
217
|
-
const processors = this.stateProcessorMap.get(s);
|
|
218
|
-
|
|
219
|
-
const self = this;
|
|
220
|
-
|
|
221
|
-
|
|
222
|
-
function executeStateProcessors(sm, processors) {
|
|
223
|
-
|
|
224
|
-
let i = 0;
|
|
225
|
-
const numProcessors = processors.length;
|
|
226
|
-
|
|
227
|
-
function lockSM() {
|
|
228
|
-
sm.isLocked = true;
|
|
229
|
-
}
|
|
230
|
-
|
|
231
|
-
function unlockSM() {
|
|
232
|
-
sm.isLocked = false;
|
|
233
|
-
}
|
|
234
|
-
|
|
235
|
-
function executeNext() {
|
|
236
|
-
|
|
237
|
-
const processor = processors[i];
|
|
238
|
-
|
|
239
|
-
i++;
|
|
240
|
-
|
|
241
|
-
let pendingProcess;
|
|
242
|
-
|
|
243
|
-
try {
|
|
244
|
-
pendingProcess = processor();
|
|
245
|
-
} catch (e) {
|
|
246
|
-
console.warn('Exception in state processor function, treating as failure and continuing.', e);
|
|
247
|
-
handleTaskFailure();
|
|
248
|
-
return;
|
|
249
|
-
}
|
|
250
|
-
|
|
251
|
-
assert.ok((pendingProcess instanceof Promise || pendingProcess instanceof Future), `processor must return a promise or a future, instead returned something else (${pendingProcess})`);
|
|
252
|
-
|
|
253
|
-
self.__pendingProcess = pendingProcess;
|
|
254
|
-
|
|
255
|
-
pendingProcess.then(handleTaskCompletion, handleTaskFailure);
|
|
256
|
-
}
|
|
257
|
-
|
|
258
|
-
function handleTaskCompletion(newState) {
|
|
259
|
-
if (!self.graph.containsNode(newState)) {
|
|
260
|
-
//produced state is not contained in the graph, treat as failure
|
|
261
|
-
console.error(`Processor produced state that is not present in the graph, treating as failure.`);
|
|
262
|
-
|
|
263
|
-
handleTaskFailure();
|
|
264
|
-
} else {
|
|
265
|
-
let foundTraversableEdge = false;
|
|
266
|
-
|
|
267
|
-
self.graph.findTraversableEdges(s, newState, function (edge) {
|
|
268
|
-
foundTraversableEdge = true;
|
|
269
|
-
});
|
|
270
|
-
|
|
271
|
-
if (!foundTraversableEdge) {
|
|
272
|
-
console.error(`Processor requests an illegal move from state '${s}' to '${newState}', no valid transition exists. Treating as failure`);
|
|
273
|
-
handleTaskFailure();
|
|
274
|
-
} else {
|
|
275
|
-
//unlock
|
|
276
|
-
unlockSM();
|
|
277
|
-
//transition
|
|
278
|
-
self.enterState(newState);
|
|
279
|
-
}
|
|
280
|
-
}
|
|
281
|
-
}
|
|
282
|
-
|
|
283
|
-
function handleTaskFailure() {
|
|
284
|
-
if (i === numProcessors) {
|
|
285
|
-
//we're done
|
|
286
|
-
unlockSM();
|
|
287
|
-
} else {
|
|
288
|
-
executeNext();
|
|
289
|
-
}
|
|
290
|
-
}
|
|
291
|
-
|
|
292
|
-
lockSM();
|
|
293
|
-
|
|
294
|
-
executeNext();
|
|
295
|
-
}
|
|
296
|
-
|
|
297
|
-
if (processors === undefined || processors.length === 0) {
|
|
298
|
-
//no state processors
|
|
299
|
-
} else {
|
|
300
|
-
executeStateProcessors(this, processors);
|
|
301
|
-
}
|
|
302
|
-
};
|
|
303
|
-
|
|
304
|
-
StateMachine.prototype.canTransitionTo = function (nextState) {
|
|
305
|
-
const source = this.state;
|
|
306
|
-
let result = false;
|
|
307
|
-
this.traverseValidTransitions(function (node, edge) {
|
|
308
|
-
if (node === nextState && edge.condition(source, node)) {
|
|
309
|
-
result = true;
|
|
310
|
-
//stop traversal
|
|
311
|
-
return false;
|
|
312
|
-
}
|
|
313
|
-
});
|
|
314
|
-
return result;
|
|
315
|
-
};
|
|
316
|
-
|
|
317
|
-
/**
|
|
318
|
-
*
|
|
319
|
-
* @param {Graph~visitor} visitor
|
|
320
|
-
*/
|
|
321
|
-
StateMachine.prototype.traverseValidTransitions = function (visitor) {
|
|
322
|
-
const source = this.state;
|
|
323
|
-
this.graph.traverseSuccessors(source, function (node, edge) {
|
|
324
|
-
if (edge.condition(source, node)) {
|
|
325
|
-
return visitor(node, edge);
|
|
326
|
-
}
|
|
327
|
-
});
|
|
328
|
-
};
|
|
329
|
-
|
|
330
|
-
|
|
331
|
-
/**
|
|
332
|
-
*
|
|
333
|
-
* @param {Transition} transition
|
|
334
|
-
* @param {T} targetState
|
|
335
|
-
* @returns {Promise}
|
|
336
|
-
*/
|
|
337
|
-
StateMachine.prototype.transitionOn = function (transition, targetState) {
|
|
338
|
-
assert.equal(transition.second, targetState, `transition destination is not equal to targetState`);
|
|
339
|
-
|
|
340
|
-
const sm = this;
|
|
341
|
-
return new Promise(function (resolve, reject) {
|
|
342
|
-
if (transition === null) {
|
|
343
|
-
//no transition was found
|
|
344
|
-
reject("no transition found");
|
|
345
|
-
}
|
|
346
|
-
//check lock on state machine
|
|
347
|
-
if (sm.isLocked) {
|
|
348
|
-
reject("state machine is locked, can not execute transition");
|
|
349
|
-
}
|
|
350
|
-
|
|
351
|
-
const stateFrom = sm.state;
|
|
352
|
-
|
|
353
|
-
//lock state machine
|
|
354
|
-
sm.isLocked = true;
|
|
355
|
-
|
|
356
|
-
let promise;
|
|
357
|
-
|
|
358
|
-
try {
|
|
359
|
-
promise = transition.action(stateFrom, targetState);
|
|
360
|
-
} catch (e) {
|
|
361
|
-
//failed to perform transition
|
|
362
|
-
promise = Promise.reject(e);
|
|
363
|
-
}
|
|
364
|
-
|
|
365
|
-
function handleTransitionSuccess() {
|
|
366
|
-
sm.isLocked = false;
|
|
367
|
-
sm.enterState(targetState);
|
|
368
|
-
resolve();
|
|
369
|
-
}
|
|
370
|
-
|
|
371
|
-
function handleTransitionFailed(e) {
|
|
372
|
-
sm.isLocked = false;
|
|
373
|
-
reject(e);
|
|
374
|
-
}
|
|
375
|
-
|
|
376
|
-
promise.then(handleTransitionSuccess, handleTransitionFailed);
|
|
377
|
-
});
|
|
378
|
-
};
|
|
379
|
-
|
|
380
|
-
/**
|
|
381
|
-
*
|
|
382
|
-
* @param {T} nextState Adjacent state
|
|
383
|
-
* @returns {Promise}
|
|
384
|
-
*/
|
|
385
|
-
StateMachine.prototype.transitionTo = function (nextState) {
|
|
386
|
-
const sm = this;
|
|
387
|
-
const state = sm.state;
|
|
388
|
-
|
|
389
|
-
return new Promise(function (resolve, reject) {
|
|
390
|
-
if (state === nextState) {
|
|
391
|
-
//already there
|
|
392
|
-
resolve();
|
|
393
|
-
}
|
|
394
|
-
let transition = null;
|
|
395
|
-
|
|
396
|
-
sm.traverseValidTransitions(function (target, t) {
|
|
397
|
-
if (t.second !== nextState) {
|
|
398
|
-
//wrong target
|
|
399
|
-
return;
|
|
400
|
-
}
|
|
401
|
-
|
|
402
|
-
transition = t;
|
|
403
|
-
//stop traversal
|
|
404
|
-
return false;
|
|
405
|
-
});
|
|
406
|
-
|
|
407
|
-
sm.transitionOn(transition, nextState).then(resolve, reject);
|
|
408
|
-
});
|
|
409
|
-
};
|
|
410
|
-
|
|
411
|
-
/**
|
|
412
|
-
*
|
|
413
|
-
* @param {*} targetState
|
|
414
|
-
* @returns {Promise}
|
|
415
|
-
*/
|
|
416
|
-
StateMachine.prototype.navigateTo = function (targetState) {
|
|
417
|
-
//find path
|
|
418
|
-
const graph = this.graph;
|
|
419
|
-
|
|
420
|
-
const start = this.state;
|
|
421
|
-
|
|
422
|
-
const path = graph.findPath(start, targetState);
|
|
423
|
-
|
|
424
|
-
if (path === null) {
|
|
425
|
-
return Promise.reject(`no path found from ${start} to '${targetState}'`);
|
|
426
|
-
}
|
|
427
|
-
|
|
428
|
-
let result = Promise.resolve();
|
|
429
|
-
|
|
430
|
-
let i = 1;
|
|
431
|
-
const l = path.length;
|
|
432
|
-
for (; i < l; i++) {
|
|
433
|
-
const next = path[i];
|
|
434
|
-
result = result.then(this.transitionTo(next));
|
|
435
|
-
}
|
|
436
|
-
|
|
437
|
-
return result;
|
|
438
|
-
};
|
|
439
|
-
|
|
440
|
-
export { StateMachine };
|
|
@@ -1,65 +0,0 @@
|
|
|
1
|
-
/**
|
|
2
|
-
* Created by Alex on 24/03/2016.
|
|
3
|
-
*/
|
|
4
|
-
|
|
5
|
-
|
|
6
|
-
import { Edge, EdgeDirectionType } from "../graph/Edge.js";
|
|
7
|
-
|
|
8
|
-
const TransitionExecutionMode = {
|
|
9
|
-
Synchronous: 0,
|
|
10
|
-
Asynchronous: 1
|
|
11
|
-
};
|
|
12
|
-
|
|
13
|
-
/**
|
|
14
|
-
* @callback Transition~action
|
|
15
|
-
* @param {*} source Node of transition origin
|
|
16
|
-
* @param {*} target Node of destination
|
|
17
|
-
* @returns {Promise} Promise is evaluated to perform transition, and transition is not finished until promise is resolved
|
|
18
|
-
*/
|
|
19
|
-
|
|
20
|
-
/**
|
|
21
|
-
* @callback Transition~condition
|
|
22
|
-
* @param {*} source
|
|
23
|
-
* @param {*} target
|
|
24
|
-
* @returns {boolean} judgement on validity of transition from source to target
|
|
25
|
-
*/
|
|
26
|
-
|
|
27
|
-
/**
|
|
28
|
-
*
|
|
29
|
-
* @param {*} source
|
|
30
|
-
* @param {*} target
|
|
31
|
-
* @returns {boolean}
|
|
32
|
-
*/
|
|
33
|
-
function fTrue(source, target) {
|
|
34
|
-
return true;
|
|
35
|
-
}
|
|
36
|
-
|
|
37
|
-
class Transition extends Edge {
|
|
38
|
-
/**
|
|
39
|
-
*
|
|
40
|
-
* @param {*} source
|
|
41
|
-
* @param {*} target
|
|
42
|
-
* @param {Transition~action} action
|
|
43
|
-
* @param {Transition~condition} condition
|
|
44
|
-
* @constructor
|
|
45
|
-
* @extends Edge
|
|
46
|
-
*/
|
|
47
|
-
constructor(source, target, action, condition) {
|
|
48
|
-
super(source, target);
|
|
49
|
-
//make it a directed edge
|
|
50
|
-
this.direction = EdgeDirectionType.Forward;
|
|
51
|
-
|
|
52
|
-
this.action = action;
|
|
53
|
-
this.condition = (typeof condition === "function") ? condition : fTrue;
|
|
54
|
-
}
|
|
55
|
-
|
|
56
|
-
/**
|
|
57
|
-
* @inheritDoc Transition~action
|
|
58
|
-
*/
|
|
59
|
-
static EmptyAction(source, target) {
|
|
60
|
-
return Promise.resolve();
|
|
61
|
-
}
|
|
62
|
-
}
|
|
63
|
-
|
|
64
|
-
|
|
65
|
-
export default Transition;
|
package/src/core/geom/Bezier.js
DELETED
|
@@ -1,24 +0,0 @@
|
|
|
1
|
-
/**
|
|
2
|
-
*
|
|
3
|
-
* @param {Vector2} result
|
|
4
|
-
* @param {number} p0x
|
|
5
|
-
* @param {number} p0y
|
|
6
|
-
* @param {number} p1x
|
|
7
|
-
* @param {number} p1y
|
|
8
|
-
* @param {number} p2x
|
|
9
|
-
* @param {number} p2y
|
|
10
|
-
* @param {number} t
|
|
11
|
-
*/
|
|
12
|
-
export function computeQuadraticBezier2D(result, p0x, p0y, p1x, p1y, p2x, p2y, t) {
|
|
13
|
-
const minus = 1 - t;
|
|
14
|
-
const minus2 = minus * minus;
|
|
15
|
-
|
|
16
|
-
const f = minus * 2 * t;
|
|
17
|
-
const t2 = t * t;
|
|
18
|
-
|
|
19
|
-
|
|
20
|
-
const x0 = p0x * minus2 + p1x * f + p2x * t2;
|
|
21
|
-
const y0 = p0y * minus2 + p1y * f + p2y * t2;
|
|
22
|
-
|
|
23
|
-
result.set(x0, y0);
|
|
24
|
-
}
|
|
@@ -1,16 +0,0 @@
|
|
|
1
|
-
import { computeQuadraticBezier2D } from "./Bezier.js";
|
|
2
|
-
import Vector2 from "./Vector2.js";
|
|
3
|
-
|
|
4
|
-
test("computeQuadraticBezier2D hits knots",()=>{
|
|
5
|
-
const v2 = new Vector2();
|
|
6
|
-
|
|
7
|
-
computeQuadraticBezier2D(v2,1,3,5,7,11,13,0);
|
|
8
|
-
|
|
9
|
-
expect(v2.x).toBeCloseTo(1);
|
|
10
|
-
expect(v2.y).toBeCloseTo(3);
|
|
11
|
-
|
|
12
|
-
computeQuadraticBezier2D(v2,1,3,5,7,11,13,1);
|
|
13
|
-
|
|
14
|
-
expect(v2.x).toBeCloseTo(11);
|
|
15
|
-
expect(v2.y).toBeCloseTo(13);
|
|
16
|
-
});
|
|
@@ -1,13 +0,0 @@
|
|
|
1
|
-
import { quadraticCurve } from "./quadraticCurve.js";
|
|
2
|
-
|
|
3
|
-
test("quadraticCurve", () => {
|
|
4
|
-
expect(quadraticCurve(2, 0.1, 0.2, 3)).toBe(11.3);
|
|
5
|
-
|
|
6
|
-
expect(quadraticCurve(1, -1, -2, -3)).toBe(-3);
|
|
7
|
-
|
|
8
|
-
expect(quadraticCurve(-1, -1, 0, 0)).toBe(-4);
|
|
9
|
-
|
|
10
|
-
expect(quadraticCurve(-1, -1, 1, 0)).toBe(-8);
|
|
11
|
-
|
|
12
|
-
expect(quadraticCurve(-1, 0, 0, 0)).toBe(0);
|
|
13
|
-
});
|
|
@@ -1,9 +0,0 @@
|
|
|
1
|
-
import { number_compare_ascending } from "./number_compare_ascending.js";
|
|
2
|
-
|
|
3
|
-
/**
|
|
4
|
-
* @deprecated use {@link number_compare_ascending} directly
|
|
5
|
-
* @param {number} a
|
|
6
|
-
* @param {number} b
|
|
7
|
-
* @returns {number}
|
|
8
|
-
*/
|
|
9
|
-
export const compareNumbers = number_compare_ascending;
|
|
@@ -1,99 +0,0 @@
|
|
|
1
|
-
/**
|
|
2
|
-
* Created by Alex on 16/09/2015.
|
|
3
|
-
*/
|
|
4
|
-
import { System } from '../../../ecs/System.js';
|
|
5
|
-
import { Euler as ThreeEuler, MaterialLoader, Mesh as ThreeMesh, Vector3 as ThreeVector3 } from 'three';
|
|
6
|
-
import { Transform } from '../../../ecs/transform/Transform.js';
|
|
7
|
-
import Mesh from '../mesh/Mesh.js';
|
|
8
|
-
import Renderable from '../../../ecs/renderable/Renderable.js';
|
|
9
|
-
import LoadMaterial from "../../material/LoadMaterial.js";
|
|
10
|
-
|
|
11
|
-
import Decal from "./Decal.js";
|
|
12
|
-
import DecalGeometry from "./threejs/DecalGeometry.js";
|
|
13
|
-
import { computeStringHash } from "../../../../core/primitives/strings/computeStringHash.js";
|
|
14
|
-
|
|
15
|
-
const MaterialCache = function () {
|
|
16
|
-
this.materialLoader = new MaterialLoader();
|
|
17
|
-
this.table = {};
|
|
18
|
-
};
|
|
19
|
-
|
|
20
|
-
MaterialCache.prototype.get = function (json) {
|
|
21
|
-
const str = JSON.stringify(json);
|
|
22
|
-
const hash = computeStringHash(str);
|
|
23
|
-
if (this.table.hasOwnProperty(hash)) {
|
|
24
|
-
return this.table[hash];
|
|
25
|
-
} else {
|
|
26
|
-
const options = Object.assign({ assetManager }, json);
|
|
27
|
-
|
|
28
|
-
const material = LoadMaterial(options);
|
|
29
|
-
material.depthTest = true;
|
|
30
|
-
material.depthWrite = false;
|
|
31
|
-
material.polygonOffset = true;
|
|
32
|
-
material.polygonOffsetFactor = -4;
|
|
33
|
-
this.table[hash] = material;
|
|
34
|
-
return material;
|
|
35
|
-
}
|
|
36
|
-
};
|
|
37
|
-
|
|
38
|
-
class DecalSystem extends System {
|
|
39
|
-
/**
|
|
40
|
-
*
|
|
41
|
-
* @param scene
|
|
42
|
-
* @param {AssetManager} assetManager
|
|
43
|
-
*/
|
|
44
|
-
constructor(scene, assetManager) {
|
|
45
|
-
super();
|
|
46
|
-
this.scene = scene;
|
|
47
|
-
this.assetManager = assetManager;
|
|
48
|
-
|
|
49
|
-
this.dependencies = [Decal];
|
|
50
|
-
|
|
51
|
-
this.materialCache = new MaterialCache();
|
|
52
|
-
}
|
|
53
|
-
|
|
54
|
-
remove(component, entity) {
|
|
55
|
-
this.scene.remove(component.mesh);
|
|
56
|
-
}
|
|
57
|
-
|
|
58
|
-
add(component, entity) {
|
|
59
|
-
const meshes = [];
|
|
60
|
-
|
|
61
|
-
const targetModel = this.entityManager.getComponent(component.target, Mesh);
|
|
62
|
-
const targetRenderable = this.entityManager.getComponent(component.target, Renderable);
|
|
63
|
-
|
|
64
|
-
if (targetModel !== null) {
|
|
65
|
-
//TODO implement
|
|
66
|
-
}
|
|
67
|
-
|
|
68
|
-
if (targetRenderable !== null) {
|
|
69
|
-
processObjectTHREE(targetRenderable.mesh, meshes);
|
|
70
|
-
}
|
|
71
|
-
|
|
72
|
-
const transform = this.entityManager.getComponent(entity, Transform);
|
|
73
|
-
|
|
74
|
-
const material = this.materialCache.get(component.material);
|
|
75
|
-
|
|
76
|
-
const r = new ThreeEuler();
|
|
77
|
-
r.setFromQuaternion(transform.rotation);
|
|
78
|
-
const size = new ThreeVector3(component.size, component.size, component.size);
|
|
79
|
-
const check = new ThreeVector3(1, 1, 1);
|
|
80
|
-
const geometry = new DecalGeometry(meshes, transform.position, r, size, check);
|
|
81
|
-
const mesh = component.mesh = new ThreeMesh(geometry, material);
|
|
82
|
-
this.scene.add(mesh);
|
|
83
|
-
}
|
|
84
|
-
}
|
|
85
|
-
|
|
86
|
-
|
|
87
|
-
function processObjectTHREE(object, meshes) {
|
|
88
|
-
if (object.hasOwnProperty("geometry")) {
|
|
89
|
-
meshes.push(object);
|
|
90
|
-
}
|
|
91
|
-
let i = 0;
|
|
92
|
-
const l = object.children.length;
|
|
93
|
-
for (; i < l; i++) {
|
|
94
|
-
const c = object.children[i];
|
|
95
|
-
processObjectTHREE(c, meshes);
|
|
96
|
-
}
|
|
97
|
-
}
|
|
98
|
-
|
|
99
|
-
export default DecalSystem;
|