@woosh/meep-engine 2.33.23 → 2.33.27

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.
Files changed (302) hide show
  1. package/core/binary/BitSet.js +151 -167
  2. package/core/binary/BitSet.spec.js +99 -1
  3. package/core/binary/ValidatingBitSetWrapper.js +81 -0
  4. package/core/bvh2/BinaryNode.js +1 -1
  5. package/core/bvh2/aabb3/AABB3.js +21 -10
  6. package/core/bvh2/aabb3/AABB3Math.js +1 -1
  7. package/core/bvh2/binary/2/BinaryUint32BVH.js +498 -0
  8. package/core/bvh2/binary/2/BinaryUint32BVH.spec.js +54 -0
  9. package/core/bvh2/binary/IndexedBinaryBVH.js +22 -26
  10. package/core/bvh2/traversal/ThreeClippingPlaneComputingBVHVisitor.js +5 -1
  11. package/core/bvh2/traversal/__detailed_box_volume_intersection.js +22 -5
  12. package/core/cache/Cache.d.ts +4 -2
  13. package/core/cache/Cache.js +5 -2
  14. package/core/collection/ArrayUtils.js +1 -1
  15. package/core/collection/HashMap.d.ts +9 -2
  16. package/core/collection/HashSet.d.ts +7 -2
  17. package/core/collection/HashSet.js +7 -2
  18. package/core/collection/array/arrayQuickSort.js +9 -6
  19. package/core/collection/array/array_swap.js +22 -0
  20. package/core/collection/array/binarySearchHighIndex.js +1 -1
  21. package/core/collection/array/computeHashArray.js +22 -0
  22. package/core/collection/array/computeHashIntegerArray.js +15 -0
  23. package/core/collection/array/copyArray.js +2 -2
  24. package/core/collection/array/typed/typed_array_copy.js +1 -1
  25. package/core/collection/table/DataType2TypedArrayConstructorMapping.js +15 -0
  26. package/core/color/Color.js +2 -1
  27. package/core/function/FunctionCompiler.js +2 -1
  28. package/core/geom/3d/aabb/aabb3_computeDistanceAbovePlane.js +9 -33
  29. package/core/geom/3d/frustum/array_setFromProjectionMatrix.js +3 -3
  30. package/core/geom/3d/frustum/frustum3_computeNearestPointToPoint.js +1 -1
  31. package/core/geom/3d/line/line3_computeSegmentPointDistance_sqr.js +41 -0
  32. package/core/geom/3d/morton/mortonEncode_magicbits.js +2 -1
  33. package/core/geom/3d/morton/reinterpret_float32_as_int32.js +13 -0
  34. package/core/geom/3d/morton/v3_morton_encode_transformed.js +33 -0
  35. package/core/geom/3d/normal/hemioct/unit_hemioct.spec.js +1 -1
  36. package/core/geom/3d/ray/ray_computeNearestPointToPoint.js +37 -0
  37. package/core/geom/3d/shape/AbstractShape3D.js +65 -0
  38. package/core/geom/3d/shape/TransformedShape3D.js +181 -0
  39. package/core/geom/3d/shape/TransformedShape3D.spec.js +33 -0
  40. package/core/geom/3d/shape/UnionShape3D.js +255 -0
  41. package/core/geom/3d/shape/UnitCubeShape3D.js +101 -0
  42. package/core/geom/3d/shape/UnitCubeShape3D.spec.js +42 -0
  43. package/core/geom/3d/shape/UnitSphereShape3D.js +55 -0
  44. package/core/geom/3d/shape/util/compute_signed_distance_gradient_by_sampling.js +48 -0
  45. package/core/geom/3d/shape/util/shape_to_visual_entity.js +159 -0
  46. package/core/geom/AABB2.js +1 -1
  47. package/core/geom/ConicRay.js +3 -1
  48. package/core/geom/LineSegment.js +0 -78
  49. package/core/geom/Matrix4.js +7 -8
  50. package/core/geom/Rectangle.js +2 -1
  51. package/core/geom/Vector1.js +1 -1
  52. package/core/geom/Vector3.js +2 -1
  53. package/core/geom/Vector4.js +2 -1
  54. package/core/geom/random/randomPointInBox.js +7 -3
  55. package/core/geom/random/randomPointInPoint.js +6 -3
  56. package/core/geom/random/randomPointInSphere.js +9 -5
  57. package/core/geom/random/randomPointOnBox.js +7 -3
  58. package/core/geom/random/randomPointOnSphere.js +6 -3
  59. package/core/geom/v3_length.js +8 -3
  60. package/core/graph/graph_k_means_cluster.js +1 -1
  61. package/core/json/resolvePathByArray.js +2 -2
  62. package/core/math/MathUtils.js +0 -354
  63. package/core/math/MathUtils.spec.js +7 -1
  64. package/core/math/gaussian.js +9 -0
  65. package/core/math/hash/computeHashFloat.js +17 -0
  66. package/core/math/hash/computeHashFloatArray.js +34 -0
  67. package/core/math/hash/computeObjectHash.js +54 -0
  68. package/core/math/intersects1D.js +19 -0
  69. package/core/math/interval/NumericInterval.js +2 -2
  70. package/core/math/isValueBetween.js +10 -0
  71. package/core/math/isValueBetweenInclusive.js +10 -0
  72. package/core/math/noise/curl_noise_3dt.js +1 -1
  73. package/core/math/noise/sdnoise.js +10 -10
  74. package/core/math/overlap1D.js +19 -0
  75. package/core/math/pingpong.js +17 -0
  76. package/core/math/random/makeRangedRandom.js +19 -0
  77. package/core/math/random/randomFloatBetween.js +14 -0
  78. package/core/math/random/randomFromArray.js +19 -0
  79. package/core/math/random/randomGaussian.js +15 -0
  80. package/core/math/random/randomIntegerBetween.js +14 -0
  81. package/core/math/random/roundFair.js +15 -0
  82. package/core/math/separation1D.js +21 -0
  83. package/core/math/solveQuadratic.js +25 -0
  84. package/core/model/BoundedValue.js +1 -1
  85. package/core/model/node-graph/node/NodeInstancePortReference.js +1 -1
  86. package/core/model/node-graph/node/Port.js +1 -1
  87. package/core/model/reactive/evaluation/MultiPredicateEvaluator.spec.js +3 -1
  88. package/core/model/reactive/model/ReactiveBinaryExpression.js +1 -1
  89. package/core/model/reactive/model/terminal/ReactiveLiteralNumber.js +1 -1
  90. package/core/model/reactive/model/terminal/ReactiveReference.js +1 -1
  91. package/core/model/reactive/model/util/createRandomReactiveExpression.js +1 -1
  92. package/core/model/stat/LinearModifier.js +1 -1
  93. package/core/parser/simple/Token.d.ts +13 -0
  94. package/core/parser/simple/Token.js +61 -27
  95. package/{engine/graphics/render/forward_plus/materials → core/primitives/strings}/insert_after.js +3 -0
  96. package/core/primitives/strings/insert_after_or_replace.js +27 -0
  97. package/editor/process/symbolic/makeHelperBoxGeometry.js +44 -0
  98. package/editor/tools/FoliagePaintTool.js +4 -4
  99. package/editor/view/ecs/EntityEditor.js +2 -2
  100. package/editor/view/ecs/components/particles/ParticleEmitterController.js +2 -2
  101. package/engine/EngineHarness.js +1 -0
  102. package/engine/animation/AnimationUtils.js +5 -5
  103. package/engine/animation/curve/AnimationCurve.js +72 -0
  104. package/engine/animation/curve/Keyframe.js +27 -0
  105. package/engine/animation/keyed2/AnimationTrack.js +27 -3
  106. package/engine/asset/Asset.js +1 -1
  107. package/engine/asset/loaders/GLTFAssetLoader.d.ts +1 -1
  108. package/engine/asset/loaders/GLTFAssetLoader.js +62 -1
  109. package/engine/asset/loaders/image/ImageDecoderWorker.js +4 -3
  110. package/engine/asset/loaders/image/ImageRGBADataAsset.js +10 -2
  111. package/engine/asset/loaders/image/ImageRGBADataLoader.js +3 -3
  112. package/engine/asset/loaders/image/codec/NativeImageDecoder.js +2 -1
  113. package/engine/asset/loaders/image/png/PNG.js +113 -6
  114. package/engine/asset/loaders/image/png/PNGReader.js +5 -0
  115. package/engine/asset/loaders/material/bitmap2sampler_gl.js +1 -1
  116. package/engine/asset/loaders/material/computeImageBitmapEquality.js +6 -1
  117. package/engine/asset/loaders/material/computeMaterialHash.js +3 -1
  118. package/engine/asset/loaders/material/computeTextureEquality.js +40 -49
  119. package/engine/asset/loaders/material/computeTextureHash.js +2 -1
  120. package/engine/ecs/EntityBuilder.js +25 -5
  121. package/engine/ecs/EntityComponentDataset.js +1 -1
  122. package/engine/ecs/animation/Animation.js +2 -1
  123. package/engine/ecs/animation/InverseKinematics.js +2 -1
  124. package/engine/ecs/attachment/AttachmentBinding.js +8 -0
  125. package/engine/ecs/attachment/AttachmentSystem.js +4 -0
  126. package/engine/ecs/attachment/TransformAttachmentBinding.js +14 -44
  127. package/engine/ecs/components/Tag.js +27 -6
  128. package/engine/ecs/dynamic_actions/DynamicActorSystem.js +2 -1
  129. package/engine/ecs/dynamic_actions/DynamicRuleDescriptionTable.spec.js +3 -5
  130. package/engine/ecs/dynamic_actions/actions/definition/WeightedRandomActionDescription.js +1 -1
  131. package/engine/ecs/evaluation/complex/PointFitnessGaussianBlur.js +1 -1
  132. package/engine/ecs/foliage/InstancedFoliage.js +277 -266
  133. package/engine/ecs/foliage/ecs/Foliage2System.js +7 -7
  134. package/engine/ecs/foliage/ecs/InstancedMeshComponent.js +37 -0
  135. package/engine/ecs/foliage/ecs/{Foliage2.js → InstancedMeshLayer.js} +3 -45
  136. package/engine/ecs/foliage/ecs/InstancedMeshSerializationAdapter.js +6 -5
  137. package/engine/ecs/foliage/ecs/InstancedMeshUtils.js +7 -6
  138. package/engine/ecs/fow/FogOfWar.js +4 -0
  139. package/engine/ecs/fow/FogOfWarSystem.js +2 -0
  140. package/engine/ecs/fow/shader/FogOfWarRenderer.js +1 -1
  141. package/engine/ecs/gui/GUIElement.js +1 -1
  142. package/engine/ecs/gui/hud/HeadsUpDisplay.js +1 -1
  143. package/engine/ecs/gui/hud/HeadsUpDisplaySystem.js +2 -0
  144. package/engine/ecs/gui/position/ViewportPosition.js +2 -1
  145. package/engine/ecs/storage/binary/BinarySerializationRegistry.js +1 -1
  146. package/engine/ecs/system/AbstractContextSystem.js +1 -1
  147. package/engine/ecs/systems/RangedAttackSystem.js +1 -1
  148. package/engine/ecs/systems/SteeringSystem.js +1 -1
  149. package/engine/ecs/systems/TagSystem.js +17 -0
  150. package/engine/ecs/terrain/ecs/layers/TerrainLayer.js +12 -16
  151. package/engine/ecs/terrain/tiles/TerrainTileManager.js +1 -1
  152. package/engine/ecs/tooltip/TooltipComponent.js +15 -0
  153. package/engine/ecs/transform/Transform.js +19 -6
  154. package/engine/graphics/GraphicsEngine.js +11 -6
  155. package/engine/graphics/composit/CompositLayer.js +17 -4
  156. package/engine/graphics/composit/CompositingStages.js +8 -0
  157. package/engine/graphics/composit/LayerCompositer.js +35 -6
  158. package/engine/graphics/ecs/animation/animator/AnimationClip.js +2 -1
  159. package/engine/graphics/ecs/animation/animator/AnimationClipDefinition.js +2 -1
  160. package/engine/graphics/ecs/animation/animator/AnimationNotification.js +2 -1
  161. package/engine/graphics/ecs/animation/animator/AnimationNotificationDefinition.js +2 -1
  162. package/engine/graphics/ecs/animation/animator/graph/AnimationGraph.js +2 -1
  163. package/engine/graphics/ecs/animation/animator/graph/definition/AnimationGraphDefinition.js +2 -1
  164. package/engine/graphics/ecs/animation/animator/graph/definition/AnimationStateDefinition.js +1 -1
  165. package/engine/graphics/ecs/animation/animator/graph/definition/AnimationTransitionDefinition.js +2 -1
  166. package/engine/graphics/ecs/camera/CameraClippingPlaneComputer.js +1 -1
  167. package/engine/graphics/ecs/highlight/HighlightDefinition.js +2 -1
  168. package/engine/graphics/ecs/highlight/plugin/OutlineRenderPlugin.js +11 -7
  169. package/engine/graphics/ecs/light/Light.d.ts +1 -1
  170. package/engine/graphics/ecs/light/Light.js +5 -0
  171. package/engine/graphics/ecs/light/binding/three/ThreeLightBinding.js +5 -1
  172. package/engine/graphics/ecs/mesh/Mesh.js +2 -1
  173. package/engine/graphics/ecs/mesh-v2/DrawMode.js +5 -0
  174. package/engine/graphics/ecs/mesh-v2/ShadedGeometry.d.ts +13 -0
  175. package/engine/graphics/ecs/mesh-v2/ShadedGeometry.js +32 -18
  176. package/engine/graphics/ecs/mesh-v2/ShadedGeometrySystem.d.ts +6 -0
  177. package/engine/graphics/geometry/AttributeSpec.js +105 -0
  178. package/engine/graphics/{micron/format/MicronVertexDataSpec.js → geometry/VertexDataSpec.js} +56 -25
  179. package/engine/graphics/geometry/instancing/InstancedMeshGroup.js +14 -72
  180. package/engine/graphics/geometry/instancing/rewriteMaterial.js +70 -0
  181. package/engine/graphics/material/manager/MaterialManager.js +2 -1
  182. package/engine/graphics/micron/build/buildMicronGeometryFromBufferGeometry.js +7 -7
  183. package/engine/graphics/micron/build/fill_patch_geometry_data.js +1 -1
  184. package/engine/graphics/micron/buildPatchwork.js +1 -1
  185. package/engine/graphics/micron/format/MicronGeometry.js +3 -3
  186. package/engine/graphics/micron/format/serialization/MicronGeometryBinarySerializationAdapter.js +2 -2
  187. package/engine/graphics/micron/format/serialization/deserialize_attribute_spec.js +1 -1
  188. package/engine/graphics/micron/format/serialization/serialize_attribute_spec.js +1 -1
  189. package/engine/graphics/micron/render/PatchCacheKey.js +1 -1
  190. package/engine/graphics/micron/render/instanced/AttributeDataTexture.js +11 -9
  191. package/engine/graphics/micron/render/instanced/ThreeInstancedAdapter.js +0 -2
  192. package/engine/graphics/micron/render/v1/ThreeVirtualGeometryAdapter.js +1 -1
  193. package/engine/graphics/particles/ParticleEmitterLibrary.js +3 -0
  194. package/engine/graphics/particles/ecs/{ParticleEmitterSystem2.js → ParticleEmitterSystem.js} +17 -9
  195. package/engine/graphics/particles/particular/engine/ParticularEngine.js +8 -2
  196. package/engine/graphics/particles/particular/engine/emitter/PARTICULAR_PARTICLE_SPECIFICATION.js +80 -16
  197. package/engine/graphics/particles/particular/engine/emitter/ParticleEmitter.js +71 -77
  198. package/engine/graphics/particles/particular/engine/emitter/ParticleEmitterFlag.js +5 -0
  199. package/engine/graphics/particles/particular/engine/emitter/ParticleLayer.js +2 -1
  200. package/engine/graphics/particles/particular/engine/emitter/ParticlePool.js +141 -14
  201. package/engine/graphics/particles/particular/engine/emitter/ParticlePool.spec.js +8 -7
  202. package/engine/graphics/particles/particular/engine/emitter/computeEmissionFunction.js +1 -1
  203. package/engine/graphics/particles/particular/engine/emitter/serde/ParameterLookupTableSerializationAdapter.js +8 -2
  204. package/engine/graphics/particles/particular/engine/parameter/ParameterLookupTable.js +2 -1
  205. package/engine/graphics/particles/particular/engine/parameter/ParameterTrack.js +1 -1
  206. package/engine/graphics/particles/particular/engine/parameter/ParticleParameter.js +1 -1
  207. package/engine/graphics/particles/particular/engine/renderers/billboard/BILLBOARD_PARTICLE_SPECIFICATION.js +24 -0
  208. package/engine/graphics/particles/particular/engine/renderers/billboard/ParticleBillboardMaterial.js +262 -71
  209. package/engine/graphics/particles/particular/engine/renderers/billboard/prototypeBillboardRenderer.js +9 -9
  210. package/engine/graphics/particles/particular/engine/shader/ShaderManager.js +81 -48
  211. package/engine/graphics/particles/particular/engine/shader/debugAtlas.js +14 -0
  212. package/engine/graphics/particles/particular/engine/simulator/SimulationStepApplyForce.js +2 -5
  213. package/engine/graphics/particles/particular/engine/simulator/SimulationStepCurlNoiseAcceleration.js +2 -6
  214. package/engine/graphics/particles/particular/engine/simulator/SimulationStepCurlNoiseVelocity.js +2 -7
  215. package/engine/graphics/particles/particular/engine/simulator/SimulationStepFixedPhysics.js +2 -5
  216. package/engine/graphics/particles/particular/engine/simulator/update_parameters.js +1 -1
  217. package/engine/graphics/particles/particular/engine/utils/distributeParticlesOnObject3D.js +1 -1
  218. package/engine/graphics/particles/particular/engine/utils/distrubuteParticlesOnMesh.js +1 -1
  219. package/engine/graphics/particles/particular/engine/utils/volume/AttributeValue.js +141 -0
  220. package/engine/graphics/particles/particular/engine/utils/volume/ParticleVolume.js +478 -0
  221. package/engine/graphics/particles/particular/engine/utils/volume/lut_to_sampler.js +27 -0
  222. package/engine/graphics/particles/particular/engine/utils/volume/prototypeParticleVolume.js +938 -0
  223. package/engine/graphics/particles/particular/group/Operation.js +18 -0
  224. package/engine/graphics/particles/particular/group/OperationType.js +9 -0
  225. package/engine/graphics/particles/particular/group/ParticleAttribute.js +2 -1
  226. package/engine/graphics/particles/particular/group/ParticleAttributeType.js +11 -0
  227. package/engine/graphics/particles/particular/group/ParticleDataType.js +10 -0
  228. package/engine/graphics/particles/particular/group/ParticleGroup.js +7 -245
  229. package/engine/graphics/particles/particular/group/ParticleGroup.spec.js +3 -1
  230. package/engine/graphics/particles/particular/group/ParticleSpecification.js +21 -14
  231. package/engine/graphics/particles/particular/group/itemSizeFromAttributeType.js +20 -0
  232. package/engine/graphics/particles/particular/group/optimizeCommandQueue.js +162 -0
  233. package/engine/graphics/particles/particular/group/typedArrayConstructorFromDataType.js +19 -0
  234. package/engine/graphics/render/buffer/simple-fx/ao/AmbientOcclusionPostProcessEffect.js +16 -11
  235. package/engine/graphics/render/buffer/slot/parameter/ProgramValueSlotParameter.js +2 -1
  236. package/engine/graphics/render/buffer/slot/parameter/ProgramValueSlotParameterSet.js +1 -1
  237. package/engine/graphics/render/forward_plus/LightManager.js +117 -94
  238. package/engine/graphics/render/forward_plus/PointLight.js +9 -0
  239. package/engine/graphics/render/forward_plus/PointLightData.js +1 -1
  240. package/engine/graphics/render/forward_plus/SpotLight.js +9 -0
  241. package/engine/graphics/render/forward_plus/cluster/compute_light_data_hash_0.js +2 -2
  242. package/engine/graphics/render/forward_plus/materials/FP_INJECTION_POINT_ACCUMULATION.js +1 -0
  243. package/engine/graphics/render/forward_plus/materials/FP_SHADER_CHUNK_ACCUMULATION.js +32 -0
  244. package/engine/graphics/render/forward_plus/materials/FP_SHADER_CHUNK_DECODE_PARS.js +51 -0
  245. package/engine/graphics/render/forward_plus/materials/FP_SHADER_CHUNK_PREAMBLE.js +25 -0
  246. package/engine/graphics/render/forward_plus/materials/FPlusDebugMaterial.js +3 -3
  247. package/engine/graphics/render/forward_plus/materials/ForwardPlusThreeMaterial.js +1 -1
  248. package/engine/graphics/render/forward_plus/materials/fp_build_fragment_shader.js +31 -120
  249. package/engine/graphics/render/forward_plus/materials/fp_build_vertex_lighting_shared.js +35 -0
  250. package/engine/graphics/render/forward_plus/materials/fp_build_vertex_shader.js +4 -5
  251. package/engine/graphics/render/forward_plus/plugin/ForwardPlusRenderingPlugin.js +1 -1
  252. package/engine/graphics/render/forward_plus/plugin/MaterialTransformer.js +10 -3
  253. package/engine/graphics/render/forward_plus/plugin/ptototypeFPPlugin.js +594 -59
  254. package/engine/graphics/render/forward_plus/prototypeLightManager.js +208 -89
  255. package/engine/graphics/render/forward_plus/query/analytical_triplanar_corner_mapping.js +8 -0
  256. package/engine/graphics/render/forward_plus/query/cube_mapping.js +38 -0
  257. package/engine/graphics/render/forward_plus/query/detailed_sphere_frustum_intersection_test.js +86 -0
  258. package/engine/graphics/render/forward_plus/query/point_light_inside_volume.js +74 -0
  259. package/engine/graphics/render/forward_plus/query/query_bvh_frustum_from_objects.js +131 -0
  260. package/engine/graphics/render/forward_plus/query/query_bvh_frustum_from_texture.js +129 -0
  261. package/engine/graphics/render/forward_plus/query/spot_light_inside_volume.js +33 -0
  262. package/engine/graphics/render/forward_plus/read_frustum_corner.js +14 -0
  263. package/engine/graphics/render/forward_plus/testClusterEquality.js +22 -0
  264. package/engine/graphics/render/visibility/IncrementalDeltaSet.js +11 -0
  265. package/engine/graphics/render/visibility/hiz/prototypeHiZ.js +1 -1
  266. package/engine/graphics/shaders/TerrainShader.js +4 -5
  267. package/engine/graphics/shadows/ShadowMapRenderer.js +8 -2
  268. package/engine/graphics/texture/atlas/ManagedTextureAtlas.js +12 -1
  269. package/engine/graphics/texture/sampler/HarmonicDiffusionGrid.spec.js +1 -1
  270. package/engine/graphics/texture/sampler/SampleTraverser.js +1 -1
  271. package/engine/graphics/texture/sampler/Sampler2D.js +3 -1
  272. package/engine/graphics/texture/sampler/convertTexture2Sampler2D.js +1 -1
  273. package/engine/graphics/texture/sampler/copy_Sampler2D_channel_data.js +66 -0
  274. package/engine/graphics/texture/sampler/distanceField.spec.js +1 -1
  275. package/engine/graphics/util/composeMatrix4.js +33 -23
  276. package/engine/graphics/util/decompose_matrix_4_array.js +61 -0
  277. package/engine/grid/components/GridObstacle.js +1 -1
  278. package/engine/intelligence/behavior/ecs/BehaviorComponent.js +30 -14
  279. package/engine/intelligence/behavior/selector/WeightedElement.js +2 -1
  280. package/engine/intelligence/optimization/RandomOptimizer.js +1 -1
  281. package/engine/knowledge/database/StaticKnowledgeDataTable.js +6 -1
  282. package/engine/navigation/ecs/components/Path.js +1 -6
  283. package/engine/navigation/grid/FastBinaryHeap.spec.js +1 -1
  284. package/engine/sound/ecs/emitter/SoundEmitter.js +2 -1
  285. package/engine/sound/ecs/emitter/SoundTrack.js +2 -1
  286. package/engine/sound/material/concrete/RandomSoundMaterial.js +1 -1
  287. package/engine/ui/notification/notificationGenerator.js +1 -1
  288. package/generation/filtering/numeric/complex/CellFilterGaussianBlur.js +1 -1
  289. package/generation/grid/generation/GridTaskExecuteRuleTimes.js +2 -1
  290. package/generation/markers/actions/MarkerNodeActionSelectRandom.js +1 -1
  291. package/generation/markers/transform/MarkerNodeTransformerRecordUniqueRandomEnum.js +1 -1
  292. package/generation/placement/action/random/CellActionSelectRandom.js +1 -1
  293. package/generation/theme/ThemeEngine.js +1 -1
  294. package/misc/makeMaterialIconCached.js +2 -2
  295. package/package.json +1 -1
  296. package/view/elements/image/HTMLElementCacheKey.js +2 -1
  297. package/view/elements/radial/RadialText.js +2 -1
  298. package/view/minimap/gl/MinimapMarkersGL.js +6 -100
  299. package/view/minimap/gl/MinimapWorldGL.js +12 -5
  300. package/view/minimap/gl/buildMaterial.js +94 -0
  301. package/engine/graphics/micron/format/MicronGeometryBufferAttributeSpec.js +0 -71
  302. package/engine/graphics/render/forward_plus/queryBVH_Frustum.js +0 -357
@@ -0,0 +1,8 @@
1
+ /**
2
+ * @readonly
3
+ * @enum {number}
4
+ */
5
+ export const CompositingStages = {
6
+ POST_OPAQUE: 1,
7
+ POST_TRANSPARENT: 0
8
+ }
@@ -52,8 +52,6 @@ class LayerCompositer {
52
52
 
53
53
  layer.renderTarget.dispose();
54
54
 
55
- this.scene.remove(layer.object);
56
-
57
55
  return true;
58
56
  }
59
57
 
@@ -113,8 +111,6 @@ class LayerCompositer {
113
111
 
114
112
  this.layerTargets.push(layer);
115
113
 
116
- this.scene.add(layer.object);
117
-
118
114
  return true;
119
115
  }
120
116
 
@@ -138,13 +134,46 @@ class LayerCompositer {
138
134
 
139
135
  /**
140
136
  *
141
- * @param {WebGLRenderer} renderer
137
+ * @param {number} stage
138
+ * @private
142
139
  */
143
- composite(renderer) {
140
+ __prepare_scene_for_stage(stage) {
141
+ const layers = this.layerTargets;
142
+ const layer_count = layers.length;
143
+
144
+ const scene = this.scene;
145
+
146
+ let child_count = 0;
147
+
148
+ for (let i = 0; i < layer_count; i++) {
149
+ const layer = layers[i];
150
+
151
+ if (layer.stage !== stage) {
152
+ continue;
153
+ }
154
+
155
+ scene.children[child_count++] = layer.object;
156
+
157
+ layer.on.preRender.send0();
158
+ }
159
+
160
+ scene.children.length = child_count;
161
+ }
162
+
163
+ /**
164
+ *
165
+ * @param {THREE.WebGLRenderer} renderer
166
+ * @param {number} stage
167
+ */
168
+ composite(renderer, stage) {
169
+ assert.isNonNegativeInteger(stage, 'stage');
170
+
144
171
  if (!this.hasActiveLayers()) {
145
172
  return;
146
173
  }
147
174
 
175
+ this.__prepare_scene_for_stage(stage);
176
+
148
177
  const camera = this.camera;
149
178
  const scene = this.scene;
150
179
 
@@ -1,8 +1,9 @@
1
- import { computeHashFloat, computeHashIntegerArray} from "../../../../../core/math/MathUtils.js";
2
1
  import { min2 } from "../../../../../core/math/min2.js";
3
2
  import { AnimationClipFlag } from "./AnimationClipFlag.js";
4
3
  import { LoopOnce, LoopRepeat } from "three";
5
4
  import { AnimationEventTypes } from "./AnimationEventTypes.js";
5
+ import { computeHashIntegerArray } from "../../../../../core/collection/array/computeHashIntegerArray.js";
6
+ import { computeHashFloat } from "../../../../../core/math/hash/computeHashFloat.js";
6
7
 
7
8
  export class AnimationClip {
8
9
  constructor() {
@@ -1,7 +1,8 @@
1
1
  import { isArrayEqual } from "../../../../../core/collection/ArrayUtils.js";
2
- import { computeHashArray, computeHashIntegerArray } from "../../../../../core/math/MathUtils.js";
3
2
  import { computeStringHash } from "../../../../../core/primitives/strings/computeStringHash.js";
4
3
  import { invokeObjectHash } from "../../../../../core/model/object/invokeObjectHash.js";
4
+ import { computeHashArray } from "../../../../../core/collection/array/computeHashArray.js";
5
+ import { computeHashIntegerArray } from "../../../../../core/collection/array/computeHashIntegerArray.js";
5
6
 
6
7
  /**
7
8
  *
@@ -1,4 +1,5 @@
1
- import { computeHashFloat, computeHashIntegerArray } from "../../../../../core/math/MathUtils.js";
1
+ import { computeHashIntegerArray } from "../../../../../core/collection/array/computeHashIntegerArray.js";
2
+ import { computeHashFloat } from "../../../../../core/math/hash/computeHashFloat.js";
2
3
 
3
4
  export class AnimationNotification {
4
5
  constructor() {
@@ -1,6 +1,7 @@
1
- import { computeHashIntegerArray, computeObjectHash } from "../../../../../core/math/MathUtils.js";
2
1
  import { objectDeepEquals } from "../../../../../core/model/object/objectDeepEquals.js";
3
2
  import { computeStringHash } from "../../../../../core/primitives/strings/computeStringHash.js";
3
+ import { computeHashIntegerArray } from "../../../../../core/collection/array/computeHashIntegerArray.js";
4
+ import { computeObjectHash } from "../../../../../core/math/hash/computeObjectHash.js";
4
5
 
5
6
  export class AnimationNotificationDefinition {
6
7
  constructor() {
@@ -3,11 +3,12 @@ import { AnimationTransition } from "./AnimationTransition.js";
3
3
  import { AnimationStateType } from "./AnimationStateType.js";
4
4
  import { AnimationMixer } from "three";
5
5
  import { AnimationGraphFlag } from "./AnimationGraphFlag.js";
6
- import { computeHashFloat, computeHashIntegerArray } from "../../../../../../core/math/MathUtils.js";
7
6
  import { writeAnimationGraphDefinitionToJSON } from "./definition/serialization/writeAnimationGraphDefinitionToJSON.js";
8
7
  import { readAnimationGraphDefinitionFromJSON } from "./definition/serialization/readAnimationGraphDefinitionFromJSON.js";
9
8
  import { assert } from "../../../../../../core/assert.js";
10
9
  import { threeUpdateTransform } from "../../../../util/threeUpdateTransform.js";
10
+ import { computeHashIntegerArray } from "../../../../../../core/collection/array/computeHashIntegerArray.js";
11
+ import { computeHashFloat } from "../../../../../../core/math/hash/computeHashFloat.js";
11
12
 
12
13
  export class AnimationGraph {
13
14
  constructor() {
@@ -4,8 +4,9 @@ import { AnimationStateDefinition } from "./AnimationStateDefinition.js";
4
4
  import { AnimationClipDefinition } from "../../AnimationClipDefinition.js";
5
5
  import { AnimationClip } from "../../AnimationClip.js";
6
6
  import { isArrayEqual } from "../../../../../../../core/collection/ArrayUtils.js";
7
- import { computeHashArray, computeHashIntegerArray } from "../../../../../../../core/math/MathUtils.js";
8
7
  import { invokeObjectHash } from "../../../../../../../core/model/object/invokeObjectHash.js";
8
+ import { computeHashArray } from "../../../../../../../core/collection/array/computeHashArray.js";
9
+ import { computeHashIntegerArray } from "../../../../../../../core/collection/array/computeHashIntegerArray.js";
9
10
 
10
11
  export class AnimationGraphDefinition {
11
12
  constructor() {
@@ -1,5 +1,5 @@
1
1
  import { AnimationStateType } from "../AnimationStateType.js";
2
- import { computeHashIntegerArray } from "../../../../../../../core/math/MathUtils.js";
2
+ import { computeHashIntegerArray } from "../../../../../../../core/collection/array/computeHashIntegerArray.js";
3
3
 
4
4
  export class AnimationStateDefinition {
5
5
  constructor() {
@@ -1,5 +1,6 @@
1
- import { computeHashFloat, computeHashIntegerArray } from "../../../../../../../core/math/MathUtils.js";
2
1
  import { computeStringHash } from "../../../../../../../core/primitives/strings/computeStringHash.js";
2
+ import { computeHashIntegerArray } from "../../../../../../../core/collection/array/computeHashIntegerArray.js";
3
+ import { computeHashFloat } from "../../../../../../../core/math/hash/computeHashFloat.js";
3
4
 
4
5
  export class AnimationTransitionDefinition {
5
6
  constructor() {
@@ -1,7 +1,7 @@
1
- import { isValueBetweenInclusive } from "../../../../core/math/MathUtils.js";
2
1
  import { frustumFromCamera } from "./CameraSystem.js";
3
2
  import { Frustum as ThreeFrustum } from "three";
4
3
  import { v3_dot } from "../../../../core/geom/v3_dot.js";
4
+ import { isValueBetweenInclusive } from "../../../../core/math/isValueBetweenInclusive.js";
5
5
 
6
6
  const CLIPPING_EPSILON = 0.001;
7
7
 
@@ -1,7 +1,8 @@
1
1
  import { Color } from "../../../../core/color/Color.js";
2
2
  import { assert } from "../../../../core/assert.js";
3
- import { computeHashFloat, computeHashIntegerArray } from "../../../../core/math/MathUtils.js";
4
3
  import { COMPONENT_SERIALIZATION_TRANSIENT_FIELD } from "../../../ecs/storage/COMPONENT_SERIALIZATION_TRANSIENT_FIELD.js";
4
+ import { computeHashIntegerArray } from "../../../../core/collection/array/computeHashIntegerArray.js";
5
+ import { computeHashFloat } from "../../../../core/math/hash/computeHashFloat.js";
5
6
 
6
7
  export class HighlightDefinition {
7
8
  constructor() {
@@ -7,6 +7,7 @@ import { HighlightRenderGroup } from "../renderer/HighlightRenderGroup.js";
7
7
  import { ObjectPoolFactory } from "../../../../../core/model/object/ObjectPoolFactory.js";
8
8
  import { HighlightRenderElement } from "../renderer/HighlightRenderElement.js";
9
9
  import { noop } from "../../../../../core/function/Functions.js";
10
+ import { CompositingStages } from "../../../composit/CompositingStages.js";
10
11
 
11
12
  export class OutlineRenderPlugin extends EnginePlugin {
12
13
  constructor() {
@@ -99,12 +100,14 @@ export class OutlineRenderPlugin extends EnginePlugin {
99
100
 
100
101
  /**
101
102
  *
102
- * @param {WebGLRenderer} renderer
103
- * @param {Camera} camera
104
- * @param {ThreeScene} scene
105
103
  * @private
106
104
  */
107
- __render(renderer, camera, scene) {
105
+ __render() {
106
+ const engine = this.engine;
107
+ const graphics = engine.graphics;
108
+
109
+ const camera = graphics.camera;
110
+
108
111
  // collect elements
109
112
  const source_count = this.__sources.length;
110
113
 
@@ -139,11 +142,12 @@ export class OutlineRenderPlugin extends EnginePlugin {
139
142
 
140
143
  viewport_size.process(this.__set_viewport_size, this);
141
144
 
142
- graphics.on.preComposite.add(this.__render, this);
143
-
144
145
  // create compositing layer
145
146
  this.__compositing_layer = graphics.layerComposer.createLayer(this.__renderer.__renderTargetFinal, BlendingType.MultiplyAdd);
146
147
  this.__compositing_layer.name = "Silhouette Outline";
148
+ this.__compositing_layer.stage = CompositingStages.POST_TRANSPARENT;
149
+
150
+ graphics.on.preRender.add(this.__render, this);
147
151
 
148
152
 
149
153
  // set rendering resolution
@@ -156,7 +160,7 @@ export class OutlineRenderPlugin extends EnginePlugin {
156
160
 
157
161
  const graphics = this.engine.graphics;
158
162
 
159
- graphics.on.preComposite.remove(this.__render, this);
163
+ graphics.on.preRender.remove(this.__render, this);
160
164
 
161
165
  graphics.viewport.size.onChanged.remove(this.__set_viewport_size, this);
162
166
 
@@ -1,6 +1,6 @@
1
1
  import ObservedEnum from "../../../../core/model/ObservedEnum";
2
2
  import {Color} from "../../../../core/color/Color";
3
- import {Vector1} from "../../../../core/geom/Vector1";
3
+ import Vector1 from "../../../../core/geom/Vector1";
4
4
  import ObservedBoolean from "../../../../core/model/ObservedBoolean";
5
5
  import {LightType} from "./LightType";
6
6
 
@@ -103,9 +103,14 @@ export class Light {
103
103
 
104
104
  if (json.intensity !== undefined) {
105
105
  this.intensity.fromJSON(json.intensity);
106
+ } else {
107
+ this.intensity.set(1);
106
108
  }
109
+
107
110
  if (json.castShadow !== undefined) {
108
111
  this.castShadow.fromJSON(json.castShadow);
112
+ } else {
113
+ this.castShadow.set(false);
109
114
  }
110
115
 
111
116
  const actual_type = this.type.getValue();
@@ -99,7 +99,8 @@ export class ThreeLightBinding extends LightBinding {
99
99
  */
100
100
  const cache = this.__system.__three_light_cache;
101
101
 
102
- threeEnsureLightObject(this.__c_light, cache);
102
+ const c_light = this.__c_light;
103
+ threeEnsureLightObject(c_light, cache);
103
104
 
104
105
  super.link(ctx);
105
106
  }
@@ -112,6 +113,9 @@ export class ThreeLightBinding extends LightBinding {
112
113
 
113
114
  cache.release(this.__three_getLight());
114
115
 
116
+ // clear bound light
117
+ this.__c_light.__threeObject = null;
118
+
115
119
  this.__shadowmap_unlink();
116
120
 
117
121
  super.unlink(ctx);
@@ -3,13 +3,14 @@
3
3
  */
4
4
  import { AABB3 } from "../../../../core/bvh2/aabb3/AABB3.js";
5
5
  import { LeafNode } from "../../../../core/bvh2/LeafNode.js";
6
- import { computeHashFloat, computeHashIntegerArray } from "../../../../core/math/MathUtils.js";
7
6
  import { getSkeletonBoneByType } from "./SkeletonUtils.js";
8
7
  import { assert } from "../../../../core/assert.js";
9
8
  import { computeStringHash } from "../../../../core/primitives/strings/computeStringHash.js";
10
9
  import { Transform } from "../../../ecs/transform/Transform.js";
11
10
  import { updateNodeByTransformAndBBB } from "./updateNodeByTransformAndBBB.js";
12
11
  import { applyTransformToThreeObject } from "./applyTransformToThreeObject.js";
12
+ import { computeHashIntegerArray } from "../../../../core/collection/array/computeHashIntegerArray.js";
13
+ import { computeHashFloat } from "../../../../core/math/hash/computeHashFloat.js";
13
14
 
14
15
  /**
15
16
  *
@@ -0,0 +1,5 @@
1
+ export const DrawMode = {
2
+ Triangles: 0,
3
+ Lines: 2,
4
+ LineSegments: 3
5
+ };
@@ -0,0 +1,13 @@
1
+ import {BufferGeometry, Material} from "three";
2
+ import {AABB3} from "../../../../core/bvh2/aabb3/AABB3";
3
+
4
+ export class ShadedGeometry {
5
+ readonly geometry: BufferGeometry
6
+ readonly material: Material
7
+
8
+ readonly bvh: Readonly<AABB3>
9
+
10
+ from(geometry: BufferGeometry, material: Material): void
11
+
12
+ static from(geometry: BufferGeometry, material: Material): ShadedGeometry
13
+ }
@@ -1,9 +1,10 @@
1
- import { Mesh, Quaternion } from "three";
1
+ import { Line, LineSegments, Mesh } from "three";
2
2
  import { updateNodeByMatrix4AndBBB } from "../mesh/updateNodeByTransformAndBBB.js";
3
3
  import { LeafNode } from "../../../../core/bvh2/LeafNode.js";
4
4
  import { AABB3 } from "../../../../core/bvh2/aabb3/AABB3.js";
5
+ import { DrawMode } from "./DrawMode.js";
6
+ import { applyTransformToThreeObject } from "../mesh/applyTransformToThreeObject.js";
5
7
 
6
- const _q = new Quaternion();
7
8
  const _aabb3 = new AABB3();
8
9
 
9
10
  export class ShadedGeometry {
@@ -19,6 +20,12 @@ export class ShadedGeometry {
19
20
  */
20
21
  this.material = null;
21
22
 
23
+ /**
24
+ *
25
+ * @type {DrawMode|number}
26
+ */
27
+ this.mode = DrawMode.Triangles;
28
+
22
29
  /**
23
30
  *
24
31
  * @type {THREE.Object3D|null}
@@ -34,6 +41,19 @@ export class ShadedGeometry {
34
41
  this.__bvh_leaf = new LeafNode(this, 0, 0, 0, 0, 0, 0);
35
42
  }
36
43
 
44
+ __build_object() {
45
+ const mode = this.mode;
46
+ if (mode === DrawMode.Triangles) {
47
+ this.__cached_object = new Mesh(this.geometry, this.material);
48
+ } else if (mode === DrawMode.Lines) {
49
+ this.__cached_object = new Line(this.geometry, this.material);
50
+ } else if (mode === DrawMode.LineSegments) {
51
+ this.__cached_object = new LineSegments(this.geometry, this.material);
52
+ } else {
53
+ throw new Error(`Unsupported draw mode '${mode}'`);
54
+ }
55
+ }
56
+
37
57
  get bvh() {
38
58
  return this.__bvh_leaf;
39
59
  }
@@ -42,10 +62,12 @@ export class ShadedGeometry {
42
62
  *
43
63
  * @param {THREE.BufferGeometry} geometry
44
64
  * @param {THREE.Material} material
65
+ * @param draw_mode
45
66
  */
46
- from(geometry, material) {
67
+ from(geometry, material, draw_mode = DrawMode.Triangles) {
47
68
  this.geometry = geometry;
48
69
  this.material = material;
70
+ this.mode = draw_mode;
49
71
 
50
72
  // ensure that geometry has a bounding box
51
73
  if (geometry.boundingBox === null) {
@@ -53,7 +75,7 @@ export class ShadedGeometry {
53
75
  }
54
76
 
55
77
  if (this.__cached_object === null) {
56
- this.__cached_object = new Mesh(geometry, material);
78
+ this.__build_object();
57
79
  } else {
58
80
  this.__cached_object.material = material;
59
81
  this.__cached_object.geometry = geometry;
@@ -64,12 +86,13 @@ export class ShadedGeometry {
64
86
  *
65
87
  * @param geometry
66
88
  * @param material
89
+ * @param mode
67
90
  * @return {ShadedGeometry}
68
91
  */
69
- static from(geometry, material) {
92
+ static from(geometry, material, mode) {
70
93
  const r = new ShadedGeometry();
71
94
 
72
- r.from(geometry, material);
95
+ r.from(geometry, material, mode);
73
96
 
74
97
  return r;
75
98
  }
@@ -77,6 +100,7 @@ export class ShadedGeometry {
77
100
  updateTransform() {
78
101
  // update matrix
79
102
  this.__cached_object.updateMatrix();
103
+ this.__cached_object.updateMatrixWorld();
80
104
 
81
105
  // update bounds
82
106
 
@@ -116,9 +140,7 @@ export class ShadedGeometry {
116
140
  */
117
141
  setRotationByComponents(x, y, z, w) {
118
142
 
119
- _q.set(x, y, z, w);
120
-
121
- this.__cached_object.rotation.setFromQuaternion(_q);
143
+ this.__cached_object.quaternion.set(x, y, z, w);
122
144
 
123
145
  this.updateTransform();
124
146
  }
@@ -140,15 +162,7 @@ export class ShadedGeometry {
140
162
  * @param {Transform} t
141
163
  */
142
164
  applyTransform(t) {
143
- // TODO this can be optimized quite a lot
144
- const position = t.position;
145
- this.setPositionByComponents(position.x, position.y, position.z);
146
-
147
- const rotation = t.rotation;
148
- this.setRotationByComponents(rotation.x, rotation.y, rotation.z, rotation.w);
149
-
150
- const scale = t.scale;
151
- this.setScaleByComponents(scale.x, scale.y, scale.z);
165
+ applyTransformToThreeObject(this.__cached_object, t);
152
166
 
153
167
  this.updateTransform();
154
168
  }
@@ -0,0 +1,6 @@
1
+ import {System} from "../../../ecs/System";
2
+ import Engine from "../../../Engine";
3
+
4
+ export class ShadedGeometrySystem extends System {
5
+ constructor(engine: Engine)
6
+ }
@@ -0,0 +1,105 @@
1
+ import { DataType } from "../../../core/collection/table/DataType.js";
2
+ import { computeStringHash } from "../../../core/primitives/strings/computeStringHash.js";
3
+ import { DataTypeByteSizes } from "../../../core/collection/table/DataTypeByteSizes.js";
4
+ import { assert } from "../../../core/assert.js";
5
+
6
+ export class AttributeSpec {
7
+ constructor() {
8
+ /**
9
+ *
10
+ * @type {string}
11
+ */
12
+ this.name = "";
13
+
14
+ /**
15
+ *
16
+ * @type {DataType}
17
+ */
18
+ this.type = DataType.Float32;
19
+
20
+ /**
21
+ *
22
+ * @type {number}
23
+ */
24
+ this.itemSize = 1;
25
+
26
+ /**
27
+ * Normalized values will be automatically converted to float32 in the shader
28
+ * This gives good optimization opportunities for things like normal vectors
29
+ * Applies to integer types only
30
+ * @type {boolean}
31
+ */
32
+ this.normalized = false;
33
+ }
34
+
35
+ static fromJSON(j) {
36
+ const r = new AttributeSpec();
37
+
38
+ r.fromJSON(j);
39
+
40
+ return r;
41
+ }
42
+
43
+ fromJSON({
44
+ name,
45
+ type,
46
+ itemSize,
47
+ normalized = false
48
+ }) {
49
+
50
+ assert.isString(name, 'name');
51
+ assert.enum(type, DataType, 'type');
52
+
53
+ assert.isNumber(itemSize, 'itemSize');
54
+ assert.isNonNegativeInteger(itemSize, 'itemSize');
55
+ assert.greaterThanOrEqual(itemSize, 1, 'itemSize must be >= 1');
56
+
57
+ assert.isBoolean(normalized, 'normalized');
58
+
59
+ this.name = name;
60
+ this.type = type;
61
+ this.itemSize = itemSize;
62
+ this.normalized = normalized;
63
+ }
64
+
65
+ hash() {
66
+ return computeStringHash(this.name);
67
+ }
68
+
69
+ /**
70
+ *
71
+ * @param {AttributeSpec} other
72
+ * @returns {boolean}
73
+ */
74
+ equals(other) {
75
+ return this.type === other.type
76
+ && this.itemSize === other.itemSize
77
+ && this.normalized === other.normalized
78
+ && this.name === other.name
79
+ ;
80
+ }
81
+
82
+ /**
83
+ *
84
+ * @returns {number}
85
+ */
86
+ getByteSize() {
87
+ return this.itemSize * DataTypeByteSizes[this.type];
88
+ }
89
+
90
+ /**
91
+ *
92
+ * @param {AttributeSpec} a
93
+ * @param {AttributeSpec} b
94
+ * @return {number}
95
+ */
96
+ static byName(a, b) {
97
+ return a.name.localeCompare(b.name);
98
+ }
99
+ }
100
+
101
+ /**
102
+ * @readonly
103
+ * @type {boolean}
104
+ */
105
+ AttributeSpec.prototype.isAttributeSpec = true;
@@ -1,14 +1,14 @@
1
- import { isArrayEqual } from "../../../../core/collection/ArrayUtils.js";
2
- import { computeHashArray } from "../../../../core/math/MathUtils.js";
3
- import { invokeObjectHash } from "../../../../core/model/object/invokeObjectHash.js";
1
+ import { isArrayEqual } from "../../../core/collection/ArrayUtils.js";
2
+ import { invokeObjectHash } from "../../../core/model/object/invokeObjectHash.js";
3
+ import { computeHashArray } from "../../../core/collection/array/computeHashArray.js";
4
4
 
5
5
  const DEFAULT_HASH = 123456;
6
6
 
7
- export class MicronVertexDataSpec {
7
+ export class VertexDataSpec {
8
8
  constructor() {
9
9
  /**
10
10
  *
11
- * @type {MicronGeometryBufferAttributeSpec[]}
11
+ * @type {AttributeSpec[]}
12
12
  */
13
13
  this.attributes = [];
14
14
 
@@ -22,7 +22,49 @@ export class MicronVertexDataSpec {
22
22
 
23
23
  /**
24
24
  *
25
- * @param {MicronGeometryBufferAttributeSpec[]} attributes
25
+ * @param {string} name
26
+ * @return {AttributeSpec|undefined}
27
+ */
28
+ getAttributeByName(name) {
29
+
30
+ const attributes = this.attributes;
31
+ const n = attributes.length;
32
+
33
+ for (let i = 0; i < n; i++) {
34
+ const attribute = attributes[i];
35
+
36
+ if (attribute.name === name) {
37
+ return attribute;
38
+ }
39
+ }
40
+
41
+ return undefined;
42
+ }
43
+
44
+ /**
45
+ *
46
+ * @param {AttributeSpec} attribute
47
+ * @return {VertexDataSpec}
48
+ */
49
+ add(attribute) {
50
+
51
+ //check uniqueness of name
52
+ if (this.getAttributeByName(attribute.name) !== undefined) {
53
+ throw new Error(`Attribute named '${attribute.name}' already exists`);
54
+ }
55
+
56
+ this.attributes.push(attribute);
57
+
58
+ // reset hash
59
+ this.__hash = DEFAULT_HASH;
60
+
61
+ //for chaining, return self
62
+ return this;
63
+ }
64
+
65
+ /**
66
+ *
67
+ * @param {AttributeSpec[]} attributes
26
68
  */
27
69
  setAttributes(attributes) {
28
70
  this.attributes = attributes;
@@ -33,7 +75,7 @@ export class MicronVertexDataSpec {
33
75
 
34
76
  /**
35
77
  *
36
- * @param {MicronVertexDataSpec} other
78
+ * @param {VertexDataSpec} other
37
79
  * @returns {boolean}
38
80
  */
39
81
  equals(other) {
@@ -56,24 +98,6 @@ export class MicronVertexDataSpec {
56
98
  return this.__hash;
57
99
  }
58
100
 
59
- /**
60
- *
61
- * @param {string} name
62
- * @return {MicronGeometryBufferAttributeSpec|undefined}
63
- */
64
- getAttributeByName(name) {
65
- const attributes = this.attributes;
66
- const n = attributes.length;
67
- for (let i = 0; i < n; i++) {
68
- const spec = attributes[i];
69
-
70
- if (spec.name === name) {
71
- return spec;
72
- }
73
- }
74
-
75
- }
76
-
77
101
  /**
78
102
  *
79
103
  * @returns {number}
@@ -93,3 +117,10 @@ export class MicronVertexDataSpec {
93
117
  return result;
94
118
  }
95
119
  }
120
+
121
+
122
+ /**
123
+ * @readonly
124
+ * @type {boolean}
125
+ */
126
+ VertexDataSpec.prototype.isVertexDataSpec = true;