toxiclibs 0.4.0 → 0.8.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.
- checksums.yaml +4 -4
- data/.gitignore +16 -0
- data/.mvn/extensions.xml +8 -0
- data/.mvn/wrapper/maven-wrapper.properties +1 -0
- data/.travis.yml +23 -0
- data/CHANGELOG.md +7 -0
- data/COPYING.md +14 -0
- data/Gemfile +10 -0
- data/LICENSE +675 -0
- data/README.md +9 -7
- data/Rakefile +25 -81
- data/examples/README.md +5 -0
- data/examples/attract_repel/attract_repel.rb +30 -0
- data/examples/attract_repel/attractor.rb +23 -0
- data/examples/attract_repel/particle.rb +27 -0
- data/examples/data/ReplicaBold.ttf +0 -0
- data/examples/data/ti_yong.png +0 -0
- data/examples/force_directed/cluster.rb +76 -0
- data/examples/force_directed/force_directed_graph.rb +92 -0
- data/examples/force_directed/node.rb +26 -0
- data/examples/gray_scott_image.rb +74 -0
- data/examples/gray_scott_tone_map.rb +77 -0
- data/examples/implicit.rb +139 -0
- data/examples/inflate_mesh.rb +89 -0
- data/examples/model_align.rb +43 -0
- data/examples/physics_type.rb +77 -0
- data/examples/povmesh/data/mask.jpg +0 -0
- data/examples/povmesh/ftest.rb +59 -0
- data/examples/povmesh/mesh_align.rb +47 -0
- data/examples/povmesh/tentacle.rb +71 -0
- data/examples/simple_cluster/cluster.rb +47 -0
- data/examples/simple_cluster/node.rb +27 -0
- data/examples/simple_cluster/simple_cluster.rb +60 -0
- data/examples/soft_body/blanket.rb +45 -0
- data/examples/soft_body/connection.rb +16 -0
- data/examples/soft_body/particle.rb +22 -0
- data/examples/soft_body/soft_body_square_adapted.rb +55 -0
- data/examples/spherical_harmonics_mesh.rb +50 -0
- data/examples/test_rect.rb +32 -0
- data/lib/toxiclibs.jar +0 -0
- data/lib/toxiclibs.rb +72 -22
- data/lib/toxiclibs/version.rb +1 -1
- data/pom.rb +63 -0
- data/pom.xml +124 -0
- data/src/com/toxi/net/ClientListener.java +41 -0
- data/src/com/toxi/net/ServerListener.java +70 -0
- data/src/com/toxi/net/ServerListenerAdapter.java +47 -0
- data/src/com/toxi/net/ServerState.java +18 -0
- data/src/com/toxi/net/UDPConnection.java +66 -0
- data/src/com/toxi/net/UDPSyncClient.java +81 -0
- data/src/com/toxi/net/UDPSyncServer.java +450 -0
- data/src/com/toxi/nio/UDPClient.java +121 -0
- data/src/com/toxi/nio/UDPClientState.java +32 -0
- data/src/com/toxi/nio/UDPServer.java +129 -0
- data/src/toxi/audio/AudioBuffer.java +229 -0
- data/src/toxi/audio/AudioSource.java +288 -0
- data/src/toxi/audio/DecompressInputStream.java +159 -0
- data/src/toxi/audio/IIRFilter.java +197 -0
- data/src/toxi/audio/JOALUtil.java +388 -0
- data/src/toxi/audio/MultiTimbralManager.java +162 -0
- data/src/toxi/audio/SoundListener.java +154 -0
- data/src/toxi/audio/SynthUtil.java +109 -0
- data/src/toxi/color/AccessCriteria.java +114 -0
- data/src/toxi/color/AlphaAccessor.java +67 -0
- data/src/toxi/color/CMYKAccessor.java +122 -0
- data/src/toxi/color/CMYKDistanceProxy.java +40 -0
- data/src/toxi/color/ColorGradient.java +260 -0
- data/src/toxi/color/ColorList.java +699 -0
- data/src/toxi/color/ColorRange.java +671 -0
- data/src/toxi/color/ColorTheme.java +163 -0
- data/src/toxi/color/DistanceProxy.java +44 -0
- data/src/toxi/color/HSVAccessor.java +113 -0
- data/src/toxi/color/HSVDistanceProxy.java +40 -0
- data/src/toxi/color/HistEntry.java +85 -0
- data/src/toxi/color/Histogram.java +185 -0
- data/src/toxi/color/Hue.java +249 -0
- data/src/toxi/color/LuminanceAccessor.java +78 -0
- data/src/toxi/color/NamedColor.java +935 -0
- data/src/toxi/color/ProximityComparator.java +70 -0
- data/src/toxi/color/RGBAccessor.java +113 -0
- data/src/toxi/color/RGBDistanceProxy.java +41 -0
- data/src/toxi/color/ReadonlyTColor.java +296 -0
- data/src/toxi/color/TColor.java +1677 -0
- data/src/toxi/color/TColorAdapter.java +68 -0
- data/src/toxi/color/ToneMap.java +218 -0
- data/src/toxi/color/theory/AnalogousStrategy.java +140 -0
- data/src/toxi/color/theory/ColorTheoryRegistry.java +139 -0
- data/src/toxi/color/theory/ColorTheoryStrategy.java +56 -0
- data/src/toxi/color/theory/ComplementaryStrategy.java +111 -0
- data/src/toxi/color/theory/CompoundTheoryStrategy.java +143 -0
- data/src/toxi/color/theory/LeftSplitComplementaryStrategy.java +82 -0
- data/src/toxi/color/theory/MonochromeTheoryStrategy.java +103 -0
- data/src/toxi/color/theory/RightSplitComplementaryStrategy.java +82 -0
- data/src/toxi/color/theory/SingleComplementStrategy.java +76 -0
- data/src/toxi/color/theory/SplitComplementaryStrategy.java +77 -0
- data/src/toxi/color/theory/TetradTheoryStrategy.java +114 -0
- data/src/toxi/color/theory/TriadTheoryStrategy.java +77 -0
- data/src/toxi/data/csv/CSVAdapter.java +74 -0
- data/src/toxi/data/csv/CSVFieldMapper.java +212 -0
- data/src/toxi/data/csv/CSVListener.java +61 -0
- data/src/toxi/data/csv/CSVParser.java +202 -0
- data/src/toxi/data/feeds/AtomAuthor.java +49 -0
- data/src/toxi/data/feeds/AtomContent.java +50 -0
- data/src/toxi/data/feeds/AtomEntry.java +111 -0
- data/src/toxi/data/feeds/AtomFeed.java +129 -0
- data/src/toxi/data/feeds/AtomLink.java +62 -0
- data/src/toxi/data/feeds/RSSChannel.java +88 -0
- data/src/toxi/data/feeds/RSSEnclosure.java +60 -0
- data/src/toxi/data/feeds/RSSFeed.java +99 -0
- data/src/toxi/data/feeds/RSSItem.java +104 -0
- data/src/toxi/data/feeds/util/EntityStripper.java +2480 -0
- data/src/toxi/data/feeds/util/Iso8601DateAdapter.java +101 -0
- data/src/toxi/data/feeds/util/Rfc822DateAdapter.java +93 -0
- data/src/toxi/geom/AABB.java +658 -0
- data/src/toxi/geom/Axis3D.java +116 -0
- data/src/toxi/geom/AxisAlignedCylinder.java +163 -0
- data/src/toxi/geom/BernsteinPolynomial.java +94 -0
- data/src/toxi/geom/BezierCurve2D.java +159 -0
- data/src/toxi/geom/BezierCurve3D.java +148 -0
- data/src/toxi/geom/BooleanShapeBuilder.java +185 -0
- data/src/toxi/geom/BoxIntersector.java +52 -0
- data/src/toxi/geom/Circle.java +230 -0
- data/src/toxi/geom/CircleIntersector.java +85 -0
- data/src/toxi/geom/Cone.java +150 -0
- data/src/toxi/geom/ConvexPolygonClipper.java +136 -0
- data/src/toxi/geom/CoordinateExtractor.java +16 -0
- data/src/toxi/geom/Ellipse.java +250 -0
- data/src/toxi/geom/GMatrix.java +2599 -0
- data/src/toxi/geom/GVector.java +833 -0
- data/src/toxi/geom/GlobalGridTesselator.java +54 -0
- data/src/toxi/geom/GridTesselator.java +108 -0
- data/src/toxi/geom/Intersector2D.java +49 -0
- data/src/toxi/geom/Intersector3D.java +51 -0
- data/src/toxi/geom/IsectData2D.java +103 -0
- data/src/toxi/geom/IsectData3D.java +103 -0
- data/src/toxi/geom/Line2D.java +534 -0
- data/src/toxi/geom/Line3D.java +471 -0
- data/src/toxi/geom/LineStrip2D.java +430 -0
- data/src/toxi/geom/LineStrip3D.java +230 -0
- data/src/toxi/geom/LocalGridTesselator.java +57 -0
- data/src/toxi/geom/Matrix3d.java +3048 -0
- data/src/toxi/geom/Matrix4f.java +3446 -0
- data/src/toxi/geom/Matrix4x4.java +1076 -0
- data/src/toxi/geom/MatrixSizeException.java +58 -0
- data/src/toxi/geom/OctreeVisitor.java +44 -0
- data/src/toxi/geom/Origin3D.java +148 -0
- data/src/toxi/geom/Plane.java +293 -0
- data/src/toxi/geom/PlaneIntersector.java +57 -0
- data/src/toxi/geom/PointCloud3D.java +253 -0
- data/src/toxi/geom/PointOctree.java +502 -0
- data/src/toxi/geom/PointQuadtree.java +375 -0
- data/src/toxi/geom/Polygon2D.java +1038 -0
- data/src/toxi/geom/PolygonClipper2D.java +45 -0
- data/src/toxi/geom/PolygonTesselator.java +20 -0
- data/src/toxi/geom/QuadtreeVisitor.java +44 -0
- data/src/toxi/geom/Quaternion.java +641 -0
- data/src/toxi/geom/Ray2D.java +146 -0
- data/src/toxi/geom/Ray3D.java +150 -0
- data/src/toxi/geom/Ray3DIntersector.java +75 -0
- data/src/toxi/geom/ReadonlyVec2D.java +575 -0
- data/src/toxi/geom/ReadonlyVec3D.java +628 -0
- data/src/toxi/geom/ReadonlyVec4D.java +431 -0
- data/src/toxi/geom/Rect.java +720 -0
- data/src/toxi/geom/Reflector3D.java +58 -0
- data/src/toxi/geom/Shape2D.java +94 -0
- data/src/toxi/geom/Shape3D.java +42 -0
- data/src/toxi/geom/SingularMatrixException.java +57 -0
- data/src/toxi/geom/SpatialBins.java +182 -0
- data/src/toxi/geom/SpatialIndex.java +61 -0
- data/src/toxi/geom/Sphere.java +224 -0
- data/src/toxi/geom/SphereIntersectorReflector.java +196 -0
- data/src/toxi/geom/Spline2D.java +349 -0
- data/src/toxi/geom/Spline3D.java +351 -0
- data/src/toxi/geom/SutherlandHodgemanClipper.java +151 -0
- data/src/toxi/geom/Triangle2D.java +422 -0
- data/src/toxi/geom/Triangle3D.java +456 -0
- data/src/toxi/geom/TriangleIntersector.java +105 -0
- data/src/toxi/geom/Vec2D.java +1328 -0
- data/src/toxi/geom/Vec3D.java +1832 -0
- data/src/toxi/geom/Vec4D.java +985 -0
- data/src/toxi/geom/VecMathUtil.java +100 -0
- data/src/toxi/geom/XAxisCylinder.java +64 -0
- data/src/toxi/geom/YAxisCylinder.java +65 -0
- data/src/toxi/geom/ZAxisCylinder.java +64 -0
- data/src/toxi/geom/mesh/BezierPatch.java +200 -0
- data/src/toxi/geom/mesh/BoxSelector.java +62 -0
- data/src/toxi/geom/mesh/DefaultSTLColorModel.java +67 -0
- data/src/toxi/geom/mesh/DefaultSelector.java +50 -0
- data/src/toxi/geom/mesh/Face.java +176 -0
- data/src/toxi/geom/mesh/LaplacianSmooth.java +80 -0
- data/src/toxi/geom/mesh/MaterialiseSTLColorModel.java +150 -0
- data/src/toxi/geom/mesh/Mesh3D.java +224 -0
- data/src/toxi/geom/mesh/MeshIntersector.java +91 -0
- data/src/toxi/geom/mesh/OBJWriter.java +194 -0
- data/src/toxi/geom/mesh/PLYWriter.java +167 -0
- data/src/toxi/geom/mesh/PlaneSelector.java +90 -0
- data/src/toxi/geom/mesh/STLColorModel.java +54 -0
- data/src/toxi/geom/mesh/STLReader.java +185 -0
- data/src/toxi/geom/mesh/STLWriter.java +323 -0
- data/src/toxi/geom/mesh/SphereFunction.java +156 -0
- data/src/toxi/geom/mesh/SphericalHarmonics.java +110 -0
- data/src/toxi/geom/mesh/SuperEllipsoid.java +110 -0
- data/src/toxi/geom/mesh/SurfaceFunction.java +75 -0
- data/src/toxi/geom/mesh/SurfaceMeshBuilder.java +149 -0
- data/src/toxi/geom/mesh/Terrain.java +451 -0
- data/src/toxi/geom/mesh/TriangleMesh.java +1201 -0
- data/src/toxi/geom/mesh/Vertex.java +78 -0
- data/src/toxi/geom/mesh/VertexSelector.java +193 -0
- data/src/toxi/geom/mesh/WEFace.java +100 -0
- data/src/toxi/geom/mesh/WEMeshFilterStrategy.java +51 -0
- data/src/toxi/geom/mesh/WETriangleMesh.java +761 -0
- data/src/toxi/geom/mesh/WEVertex.java +134 -0
- data/src/toxi/geom/mesh/WingedEdge.java +115 -0
- data/src/toxi/geom/mesh/subdiv/CentroidSubdiv.java +37 -0
- data/src/toxi/geom/mesh/subdiv/DisplacementSubdivision.java +85 -0
- data/src/toxi/geom/mesh/subdiv/DualDisplacementSubdivision.java +94 -0
- data/src/toxi/geom/mesh/subdiv/DualSubdivision.java +49 -0
- data/src/toxi/geom/mesh/subdiv/EdgeLengthComparator.java +50 -0
- data/src/toxi/geom/mesh/subdiv/FaceCountComparator.java +51 -0
- data/src/toxi/geom/mesh/subdiv/MidpointDisplacementSubdivision.java +80 -0
- data/src/toxi/geom/mesh/subdiv/MidpointSubdiv.java +42 -0
- data/src/toxi/geom/mesh/subdiv/MidpointSubdivision.java +48 -0
- data/src/toxi/geom/mesh/subdiv/NewSubdivStrategy.java +23 -0
- data/src/toxi/geom/mesh/subdiv/NormalDisplacementSubdivision.java +74 -0
- data/src/toxi/geom/mesh/subdiv/SubdivisionStrategy.java +83 -0
- data/src/toxi/geom/mesh/subdiv/TriSubdivision.java +51 -0
- data/src/toxi/geom/mesh2d/DelaunayTriangle.java +222 -0
- data/src/toxi/geom/mesh2d/DelaunayTriangulation.java +327 -0
- data/src/toxi/geom/mesh2d/DelaunayVertex.java +560 -0
- data/src/toxi/geom/mesh2d/Voronoi.java +149 -0
- data/src/toxi/geom/nurbs/BasicNurbsCurve.java +210 -0
- data/src/toxi/geom/nurbs/BasicNurbsSurface.java +233 -0
- data/src/toxi/geom/nurbs/ControlNet.java +148 -0
- data/src/toxi/geom/nurbs/CurveCreator.java +112 -0
- data/src/toxi/geom/nurbs/CurveUtils.java +259 -0
- data/src/toxi/geom/nurbs/InterpolationException.java +65 -0
- data/src/toxi/geom/nurbs/KnotVector.java +333 -0
- data/src/toxi/geom/nurbs/NurbsCreator.java +815 -0
- data/src/toxi/geom/nurbs/NurbsCurve.java +120 -0
- data/src/toxi/geom/nurbs/NurbsMeshCreator.java +145 -0
- data/src/toxi/geom/nurbs/NurbsSurface.java +147 -0
- data/src/toxi/image/util/Filter8bit.java +331 -0
- data/src/toxi/image/util/TiledFrameExporter.java +162 -0
- data/src/toxi/math/BezierInterpolation.java +102 -0
- data/src/toxi/math/CircularInterpolation.java +88 -0
- data/src/toxi/math/CosineInterpolation.java +51 -0
- data/src/toxi/math/DecimatedInterpolation.java +77 -0
- data/src/toxi/math/ExponentialInterpolation.java +68 -0
- data/src/toxi/math/InterpolateStrategy.java +60 -0
- data/src/toxi/math/Interpolation2D.java +93 -0
- data/src/toxi/math/LinearInterpolation.java +46 -0
- data/src/toxi/math/MathUtils.java +990 -0
- data/src/toxi/math/NonLinearScaleMap.java +101 -0
- data/src/toxi/math/ScaleMap.java +183 -0
- data/src/toxi/math/SigmoidInterpolation.java +78 -0
- data/src/toxi/math/SinCosLUT.java +141 -0
- data/src/toxi/math/ThresholdInterpolation.java +58 -0
- data/src/toxi/math/ZoomLensInterpolation.java +126 -0
- data/src/toxi/math/conversion/UnitTranslator.java +161 -0
- data/src/toxi/math/noise/PerlinNoise.java +281 -0
- data/src/toxi/math/noise/SimplexNoise.java +542 -0
- data/src/toxi/math/waves/AMFMSineWave.java +143 -0
- data/src/toxi/math/waves/AbstractWave.java +248 -0
- data/src/toxi/math/waves/ConstantWave.java +48 -0
- data/src/toxi/math/waves/FMHarmonicSquareWave.java +155 -0
- data/src/toxi/math/waves/FMSawtoothWave.java +144 -0
- data/src/toxi/math/waves/FMSineWave.java +142 -0
- data/src/toxi/math/waves/FMSquareWave.java +143 -0
- data/src/toxi/math/waves/FMTriangleWave.java +126 -0
- data/src/toxi/math/waves/SineWave.java +81 -0
- data/src/toxi/math/waves/Wave2D.java +68 -0
- data/src/toxi/math/waves/WaveState.java +69 -0
- data/src/toxi/music/scale/AbstractScale.java +117 -0
- data/src/toxi/music/scale/GenericScale.java +66 -0
- data/src/toxi/music/scale/MajorScale.java +41 -0
- data/src/toxi/newmesh/AttributedEdge.java +106 -0
- data/src/toxi/newmesh/AttributedFace.java +63 -0
- data/src/toxi/newmesh/IndexedTriangleMesh.java +809 -0
- data/src/toxi/newmesh/MeshAttributeCompiler.java +45 -0
- data/src/toxi/newmesh/MeshFaceNormalCompiler.java +52 -0
- data/src/toxi/newmesh/MeshUVCompiler.java +52 -0
- data/src/toxi/newmesh/MeshVertexColorCompiler.java +49 -0
- data/src/toxi/newmesh/MeshVertexCompiler.java +54 -0
- data/src/toxi/newmesh/MeshVertexNormalCompiler.java +55 -0
- data/src/toxi/newmesh/SpatialIndex.java +78 -0
- data/src/toxi/physics2d/ParticlePath2D.java +100 -0
- data/src/toxi/physics2d/ParticleString2D.java +184 -0
- data/src/toxi/physics2d/PullBackSpring2D.java +51 -0
- data/src/toxi/physics2d/VerletConstrainedSpring2D.java +89 -0
- data/src/toxi/physics2d/VerletMinDistanceSpring2D.java +57 -0
- data/src/toxi/physics2d/VerletParticle2D.java +457 -0
- data/src/toxi/physics2d/VerletPhysics2D.java +448 -0
- data/src/toxi/physics2d/VerletSpring2D.java +181 -0
- data/src/toxi/physics2d/behaviors/AttractionBehavior2D.java +212 -0
- data/src/toxi/physics2d/behaviors/ConstantForceBehavior2D.java +112 -0
- data/src/toxi/physics2d/behaviors/GravityBehavior2D.java +61 -0
- data/src/toxi/physics2d/behaviors/ParticleBehavior2D.java +66 -0
- data/src/toxi/physics2d/constraints/AngularConstraint.java +83 -0
- data/src/toxi/physics2d/constraints/AxisConstraint.java +71 -0
- data/src/toxi/physics2d/constraints/CircularConstraint.java +69 -0
- data/src/toxi/physics2d/constraints/MaxConstraint.java +66 -0
- data/src/toxi/physics2d/constraints/MinConstraint.java +66 -0
- data/src/toxi/physics2d/constraints/ParticleConstraint2D.java +47 -0
- data/src/toxi/physics2d/constraints/PolygonConstraint.java +93 -0
- data/src/toxi/physics2d/constraints/RectConstraint.java +114 -0
- data/src/toxi/physics3d/ParticlePath3D.java +100 -0
- data/src/toxi/physics3d/ParticleString3D.java +184 -0
- data/src/toxi/physics3d/PullBackSpring3D.java +50 -0
- data/src/toxi/physics3d/VerletConstrainedSpring3D.java +88 -0
- data/src/toxi/physics3d/VerletMinDistanceSpring3D.java +56 -0
- data/src/toxi/physics3d/VerletParticle3D.java +385 -0
- data/src/toxi/physics3d/VerletPhysics3D.java +417 -0
- data/src/toxi/physics3d/VerletSpring3D.java +180 -0
- data/src/toxi/physics3d/behaviors/AttractionBehavior3D.java +182 -0
- data/src/toxi/physics3d/behaviors/ConstantForceBehavior3D.java +92 -0
- data/src/toxi/physics3d/behaviors/GravityBehavior3D.java +61 -0
- data/src/toxi/physics3d/behaviors/ParticleBehavior3D.java +52 -0
- data/src/toxi/physics3d/constraints/AxisConstraint.java +68 -0
- data/src/toxi/physics3d/constraints/BoxConstraint.java +121 -0
- data/src/toxi/physics3d/constraints/CylinderConstraint.java +87 -0
- data/src/toxi/physics3d/constraints/MaxConstraint.java +65 -0
- data/src/toxi/physics3d/constraints/MinConstraint.java +65 -0
- data/src/toxi/physics3d/constraints/ParticleConstraint3D.java +49 -0
- data/src/toxi/physics3d/constraints/PlaneConstraint.java +78 -0
- data/src/toxi/physics3d/constraints/SoftBoxConstraint.java +87 -0
- data/src/toxi/physics3d/constraints/SphereConstraint.java +108 -0
- data/src/toxi/processing/ArrowModifier.java +116 -0
- data/src/toxi/processing/DashedLineModifier.java +48 -0
- data/src/toxi/processing/DeltaOrientationMapper.java +57 -0
- data/src/toxi/processing/Line2DRenderModifier.java +18 -0
- data/src/toxi/processing/MeshToVBO.java +127 -0
- data/src/toxi/processing/NormalMapper.java +18 -0
- data/src/toxi/processing/POVInterface.java +121 -0
- data/src/toxi/processing/POVMesh.java +219 -0
- data/src/toxi/processing/POVWriter.java +460 -0
- data/src/toxi/processing/RCOpaque.java +77 -0
- data/src/toxi/processing/RCTransp.java +78 -0
- data/src/toxi/processing/TextureBuilder.java +232 -0
- data/src/toxi/processing/Textures.java +110 -0
- data/src/toxi/processing/ToxiclibsSupport.java +1239 -0
- data/src/toxi/processing/Tracing.java +25 -0
- data/src/toxi/processing/XYZNormalMapper.java +30 -0
- data/src/toxi/sim/automata/CAMatrix.java +297 -0
- data/src/toxi/sim/automata/CARule.java +76 -0
- data/src/toxi/sim/automata/CARule2D.java +354 -0
- data/src/toxi/sim/automata/CAWolfram1D.java +309 -0
- data/src/toxi/sim/automata/EvolvableMatrix.java +61 -0
- data/src/toxi/sim/automata/MatrixEvolver.java +42 -0
- data/src/toxi/sim/dla/BottomUpOrder.java +76 -0
- data/src/toxi/sim/dla/DLA.java +497 -0
- data/src/toxi/sim/dla/DLAConfiguration.java +364 -0
- data/src/toxi/sim/dla/DLAEventAdapter.java +64 -0
- data/src/toxi/sim/dla/DLAEventListener.java +57 -0
- data/src/toxi/sim/dla/DLAGuideLines.java +219 -0
- data/src/toxi/sim/dla/DLAParticle.java +102 -0
- data/src/toxi/sim/dla/DLASegment.java +88 -0
- data/src/toxi/sim/dla/PipelineOrder.java +50 -0
- data/src/toxi/sim/dla/RadialDistanceOrder.java +92 -0
- data/src/toxi/sim/erosion/ErosionFunction.java +122 -0
- data/src/toxi/sim/erosion/TalusAngleErosion.java +145 -0
- data/src/toxi/sim/erosion/ThermalErosion.java +75 -0
- data/src/toxi/sim/fluids/FluidSolver2D.java +762 -0
- data/src/toxi/sim/fluids/FluidSolver3D.java +326 -0
- data/src/toxi/sim/grayscott/GrayScott.java +469 -0
- data/src/toxi/util/DateUtils.java +141 -0
- data/src/toxi/util/FileSequenceDescriptor.java +181 -0
- data/src/toxi/util/FileUtils.java +467 -0
- data/src/toxi/util/datatypes/ArraySet.java +128 -0
- data/src/toxi/util/datatypes/ArrayUtil.java +404 -0
- data/src/toxi/util/datatypes/BiasedDoubleRange.java +141 -0
- data/src/toxi/util/datatypes/BiasedFloatRange.java +141 -0
- data/src/toxi/util/datatypes/BiasedIntegerRange.java +141 -0
- data/src/toxi/util/datatypes/DoubleRange.java +251 -0
- data/src/toxi/util/datatypes/FloatRange.java +251 -0
- data/src/toxi/util/datatypes/GenericSet.java +215 -0
- data/src/toxi/util/datatypes/IntegerRange.java +247 -0
- data/src/toxi/util/datatypes/IntegerSet.java +149 -0
- data/src/toxi/util/datatypes/ItemIndex.java +72 -0
- data/src/toxi/util/datatypes/SingletonRegistry.java +91 -0
- data/src/toxi/util/datatypes/TypedProperties.java +291 -0
- data/src/toxi/util/datatypes/UndirectedGraph.java +134 -0
- data/src/toxi/util/datatypes/UniqueItemIndex.java +223 -0
- data/src/toxi/util/datatypes/WeightedRandomEntry.java +76 -0
- data/src/toxi/util/datatypes/WeightedRandomSet.java +125 -0
- data/src/toxi/util/events/EventDispatcher.java +86 -0
- data/src/toxi/volume/AdditiveBrush.java +19 -0
- data/src/toxi/volume/ArrayIsoSurface.java +297 -0
- data/src/toxi/volume/BoxBrush.java +100 -0
- data/src/toxi/volume/BrushMode.java +16 -0
- data/src/toxi/volume/HashIsoSurface.java +354 -0
- data/src/toxi/volume/IsoSurface.java +59 -0
- data/src/toxi/volume/MarchingCubesIndex.java +312 -0
- data/src/toxi/volume/MeshLatticeBuilder.java +358 -0
- data/src/toxi/volume/MeshVoxelizer.java +216 -0
- data/src/toxi/volume/MultiplyBrush.java +20 -0
- data/src/toxi/volume/PeakBrush.java +21 -0
- data/src/toxi/volume/ReplaceBrush.java +19 -0
- data/src/toxi/volume/RoundBrush.java +113 -0
- data/src/toxi/volume/VolumetricBrush.java +160 -0
- data/src/toxi/volume/VolumetricHashMap.java +179 -0
- data/src/toxi/volume/VolumetricSpace.java +195 -0
- data/src/toxi/volume/VolumetricSpaceArray.java +214 -0
- data/toxiclibs.gemspec +28 -0
- metadata +442 -31
@@ -0,0 +1,184 @@
|
|
1
|
+
/*
|
2
|
+
* __ .__ .__ ._____.
|
3
|
+
* _/ |_ _______ __|__| ____ | | |__\_ |__ ______
|
4
|
+
* \ __\/ _ \ \/ / |/ ___\| | | || __ \ / ___/
|
5
|
+
* | | ( <_> > <| \ \___| |_| || \_\ \\___ \
|
6
|
+
* |__| \____/__/\_ \__|\___ >____/__||___ /____ >
|
7
|
+
* \/ \/ \/ \/
|
8
|
+
*
|
9
|
+
* Copyright (c) 2006-2011 Karsten Schmidt
|
10
|
+
*
|
11
|
+
* This library is free software; you can redistribute it and/or
|
12
|
+
* modify it under the terms of the GNU Lesser General Public
|
13
|
+
* License as published by the Free Software Foundation; either
|
14
|
+
* version 2.1 of the License, or (at your option) any later version.
|
15
|
+
*
|
16
|
+
* http://creativecommons.org/licenses/LGPL/2.1/
|
17
|
+
*
|
18
|
+
* This library is distributed in the hope that it will be useful,
|
19
|
+
* but WITHOUT ANY WARRANTY; without even the implied warranty of
|
20
|
+
* MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU
|
21
|
+
* Lesser General Public License for more details.
|
22
|
+
*
|
23
|
+
* You should have received a copy of the GNU Lesser General Public
|
24
|
+
* License along with this library; if not, write to the Free Software
|
25
|
+
* Foundation, Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301, USA
|
26
|
+
*/
|
27
|
+
|
28
|
+
package toxi.physics2d;
|
29
|
+
|
30
|
+
import java.util.ArrayList;
|
31
|
+
import java.util.List;
|
32
|
+
|
33
|
+
import toxi.geom.Vec2D;
|
34
|
+
|
35
|
+
/**
|
36
|
+
* Utility builder/grouping/management class to connect a set of particles into
|
37
|
+
* a physical string/thread. Custom spring types can be used by subclassing this
|
38
|
+
* class and overwriting the
|
39
|
+
* {@link #createSpring(VerletParticle2D, VerletParticle2D, float, float)}
|
40
|
+
* method.
|
41
|
+
*/
|
42
|
+
public class ParticleString2D {
|
43
|
+
|
44
|
+
/**
|
45
|
+
*
|
46
|
+
*/
|
47
|
+
protected VerletPhysics2D physics;
|
48
|
+
|
49
|
+
/**
|
50
|
+
*
|
51
|
+
*/
|
52
|
+
public List<VerletParticle2D> particles;
|
53
|
+
|
54
|
+
/**
|
55
|
+
*
|
56
|
+
*/
|
57
|
+
public List<VerletSpring2D> links;
|
58
|
+
|
59
|
+
/**
|
60
|
+
* Takes a list of already created particles connects them into a continuous
|
61
|
+
* string using springs.
|
62
|
+
*
|
63
|
+
* @param physics
|
64
|
+
* physics engine instance
|
65
|
+
* @param plist
|
66
|
+
* particle list
|
67
|
+
* @param strength
|
68
|
+
* spring strength
|
69
|
+
*/
|
70
|
+
public ParticleString2D(VerletPhysics2D physics,
|
71
|
+
List<VerletParticle2D> plist, float strength) {
|
72
|
+
this.physics = physics;
|
73
|
+
particles = new ArrayList<>(plist);
|
74
|
+
links = new ArrayList<>(particles.size() - 1);
|
75
|
+
VerletParticle2D prev = null;
|
76
|
+
for (VerletParticle2D p : particles) {
|
77
|
+
physics.addParticle(p);
|
78
|
+
if (prev != null) {
|
79
|
+
VerletSpring2D s = createSpring(prev, p, prev.distanceTo(p),
|
80
|
+
strength);
|
81
|
+
links.add(s);
|
82
|
+
physics.addSpring(s);
|
83
|
+
}
|
84
|
+
prev = p;
|
85
|
+
}
|
86
|
+
}
|
87
|
+
|
88
|
+
/**
|
89
|
+
* Creates a number of particles along a line and connects them into a
|
90
|
+
* string using springs.
|
91
|
+
*
|
92
|
+
* @param physics
|
93
|
+
* physics engine
|
94
|
+
* @param pos
|
95
|
+
* start position
|
96
|
+
* @param step
|
97
|
+
* step direction & distance between successive particles
|
98
|
+
* @param num
|
99
|
+
* number of particles
|
100
|
+
* @param mass
|
101
|
+
* particle mass
|
102
|
+
* @param strength
|
103
|
+
* spring strength
|
104
|
+
*/
|
105
|
+
public ParticleString2D(VerletPhysics2D physics, Vec2D pos, Vec2D step,
|
106
|
+
int num, float mass, float strength) {
|
107
|
+
this.physics = physics;
|
108
|
+
particles = new ArrayList<>(num);
|
109
|
+
links = new ArrayList<>(num - 1);
|
110
|
+
float len = step.magnitude();
|
111
|
+
VerletParticle2D prev = null;
|
112
|
+
pos = pos.copy();
|
113
|
+
for (int i = 0; i < num; i++) {
|
114
|
+
VerletParticle2D p = new VerletParticle2D(pos.copy(), mass);
|
115
|
+
particles.add(p);
|
116
|
+
physics.particles.add(p);
|
117
|
+
if (prev != null) {
|
118
|
+
VerletSpring2D s = createSpring(prev, p, len, strength);
|
119
|
+
links.add(s);
|
120
|
+
physics.addSpring(s);
|
121
|
+
}
|
122
|
+
prev = p;
|
123
|
+
pos.addSelf(step);
|
124
|
+
}
|
125
|
+
}
|
126
|
+
|
127
|
+
/**
|
128
|
+
* Removes the entire string from the physics simulation, incl. all of its
|
129
|
+
* particles & springs.
|
130
|
+
*/
|
131
|
+
public void clear() {
|
132
|
+
for (VerletSpring2D s : links) {
|
133
|
+
physics.removeSpringElements(s);
|
134
|
+
}
|
135
|
+
particles.clear();
|
136
|
+
links.clear();
|
137
|
+
}
|
138
|
+
|
139
|
+
/**
|
140
|
+
* Creates a spring instance connecting 2 successive particles of the
|
141
|
+
* string. Overwrite this method to create a string custom spring types
|
142
|
+
* (subclassed from {@link VerletSpring3D}).
|
143
|
+
*
|
144
|
+
* @param a
|
145
|
+
* 1st particle
|
146
|
+
* @param b
|
147
|
+
* 2nd particle
|
148
|
+
* @param len
|
149
|
+
* rest length
|
150
|
+
* @param strength
|
151
|
+
* @return spring
|
152
|
+
*/
|
153
|
+
protected final VerletSpring2D createSpring(VerletParticle2D a,
|
154
|
+
VerletParticle2D b, float len, float strength) {
|
155
|
+
return new VerletSpring2D(a, b, len, strength);
|
156
|
+
}
|
157
|
+
|
158
|
+
/**
|
159
|
+
* Returns the first particle of the string.
|
160
|
+
*
|
161
|
+
* @return first particle
|
162
|
+
*/
|
163
|
+
public VerletParticle2D getHead() {
|
164
|
+
return particles.get(0);
|
165
|
+
}
|
166
|
+
|
167
|
+
/**
|
168
|
+
* Returns number of particles of the string.
|
169
|
+
*
|
170
|
+
* @return particle count
|
171
|
+
*/
|
172
|
+
public int getNumParticles() {
|
173
|
+
return particles.size();
|
174
|
+
}
|
175
|
+
|
176
|
+
/**
|
177
|
+
* Returns last particle of the string.
|
178
|
+
*
|
179
|
+
* @return last particle
|
180
|
+
*/
|
181
|
+
public VerletParticle2D getTail() {
|
182
|
+
return particles.get(particles.size() - 1);
|
183
|
+
}
|
184
|
+
}
|
@@ -0,0 +1,51 @@
|
|
1
|
+
/*
|
2
|
+
* __ .__ .__ ._____.
|
3
|
+
* _/ |_ _______ __|__| ____ | | |__\_ |__ ______
|
4
|
+
* \ __\/ _ \ \/ / |/ ___\| | | || __ \ / ___/
|
5
|
+
* | | ( <_> > <| \ \___| |_| || \_\ \\___ \
|
6
|
+
* |__| \____/__/\_ \__|\___ >____/__||___ /____ >
|
7
|
+
* \/ \/ \/ \/
|
8
|
+
*
|
9
|
+
* Copyright (c) 2006-2011 Karsten Schmidt
|
10
|
+
*
|
11
|
+
* This library is free software; you can redistribute it and/or
|
12
|
+
* modify it under the terms of the GNU Lesser General Public
|
13
|
+
* License as published by the Free Software Foundation; either
|
14
|
+
* version 2.1 of the License, or (at your option) any later version.
|
15
|
+
*
|
16
|
+
* http://creativecommons.org/licenses/LGPL/2.1/
|
17
|
+
*
|
18
|
+
* This library is distributed in the hope that it will be useful,
|
19
|
+
* but WITHOUT ANY WARRANTY; without even the implied warranty of
|
20
|
+
* MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU
|
21
|
+
* Lesser General Public License for more details.
|
22
|
+
*
|
23
|
+
* You should have received a copy of the GNU Lesser General Public
|
24
|
+
* License along with this library; if not, write to the Free Software
|
25
|
+
* Foundation, Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301, USA
|
26
|
+
*/
|
27
|
+
|
28
|
+
package toxi.physics2d;
|
29
|
+
|
30
|
+
/**
|
31
|
+
* Creates a pullback spring (default restlength=0.5) between 2 particles and
|
32
|
+
* locks the first one given at the current position. The spring is only
|
33
|
+
* enforced if the current length of the spring exceeds the rest length. This
|
34
|
+
* behaviour is the opposite to the {@link VerletMinDistanceSpring2D}.
|
35
|
+
*/
|
36
|
+
class PullBackSpring2D extends VerletSpring2D {
|
37
|
+
|
38
|
+
public PullBackSpring2D(VerletParticle2D a, VerletParticle2D b,
|
39
|
+
float strength) {
|
40
|
+
super(a, b, 0, strength);
|
41
|
+
a.lock();
|
42
|
+
setRestLength(0.5f);
|
43
|
+
}
|
44
|
+
|
45
|
+
@Override
|
46
|
+
protected void update(boolean applyConstraints) {
|
47
|
+
if (b.distanceToSquared(a) > restLengthSquared) {
|
48
|
+
super.update(applyConstraints);
|
49
|
+
}
|
50
|
+
}
|
51
|
+
}
|
@@ -0,0 +1,89 @@
|
|
1
|
+
/*
|
2
|
+
* __ .__ .__ ._____.
|
3
|
+
* _/ |_ _______ __|__| ____ | | |__\_ |__ ______
|
4
|
+
* \ __\/ _ \ \/ / |/ ___\| | | || __ \ / ___/
|
5
|
+
* | | ( <_> > <| \ \___| |_| || \_\ \\___ \
|
6
|
+
* |__| \____/__/\_ \__|\___ >____/__||___ /____ >
|
7
|
+
* \/ \/ \/ \/
|
8
|
+
*
|
9
|
+
* Copyright (c) 2006-2011 Karsten Schmidt
|
10
|
+
*
|
11
|
+
* This library is free software; you can redistribute it and/or
|
12
|
+
* modify it under the terms of the GNU Lesser General Public
|
13
|
+
* License as published by the Free Software Foundation; either
|
14
|
+
* version 2.1 of the License, or (at your option) any later version.
|
15
|
+
*
|
16
|
+
* http://creativecommons.org/licenses/LGPL/2.1/
|
17
|
+
*
|
18
|
+
* This library is distributed in the hope that it will be useful,
|
19
|
+
* but WITHOUT ANY WARRANTY; without even the implied warranty of
|
20
|
+
* MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU
|
21
|
+
* Lesser General Public License for more details.
|
22
|
+
*
|
23
|
+
* You should have received a copy of the GNU Lesser General Public
|
24
|
+
* License along with this library; if not, write to the Free Software
|
25
|
+
* Foundation, Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301, USA
|
26
|
+
*/
|
27
|
+
|
28
|
+
package toxi.physics2d;
|
29
|
+
|
30
|
+
import toxi.geom.Vec2D;
|
31
|
+
|
32
|
+
/**
|
33
|
+
* Implements a spring whose maximum relaxation distance at every time step can
|
34
|
+
* be limited to achieve better (if physically incorrect) stability of the whole
|
35
|
+
* spring system.
|
36
|
+
*/
|
37
|
+
public class VerletConstrainedSpring2D extends VerletSpring2D {
|
38
|
+
|
39
|
+
/**
|
40
|
+
* Maximum relaxation distance for either end of the spring in world units
|
41
|
+
* (by default unlimited until set by user)
|
42
|
+
*/
|
43
|
+
public float limit = Float.MAX_VALUE;
|
44
|
+
|
45
|
+
/**
|
46
|
+
* @param a
|
47
|
+
* @param b
|
48
|
+
* @param len
|
49
|
+
* @param str
|
50
|
+
*/
|
51
|
+
public VerletConstrainedSpring2D(VerletParticle2D a, VerletParticle2D b,
|
52
|
+
float len, float str) {
|
53
|
+
super(a, b, len, str);
|
54
|
+
}
|
55
|
+
|
56
|
+
/**
|
57
|
+
* @param a
|
58
|
+
* @param b
|
59
|
+
* @param len
|
60
|
+
* @param str
|
61
|
+
* @param limit
|
62
|
+
*/
|
63
|
+
public VerletConstrainedSpring2D(VerletParticle2D a, VerletParticle2D b,
|
64
|
+
float len, float str, float limit) {
|
65
|
+
super(a, b, len, str);
|
66
|
+
this.limit = limit;
|
67
|
+
}
|
68
|
+
|
69
|
+
@Override
|
70
|
+
protected void update(boolean applyConstraints) {
|
71
|
+
Vec2D delta = b.sub(a);
|
72
|
+
// add minute offset to avoid div-by-zero errors
|
73
|
+
float dist = delta.magnitude() + EPS;
|
74
|
+
float normDistStrength = (dist - restLength)
|
75
|
+
/ (dist * (a.invWeight + b.invWeight)) * strength;
|
76
|
+
if (!a.isLocked && !isALocked) {
|
77
|
+
a.addSelf(delta.scale(normDistStrength * a.invWeight).limit(limit));
|
78
|
+
if (applyConstraints) {
|
79
|
+
a.applyConstraints();
|
80
|
+
}
|
81
|
+
}
|
82
|
+
if (!b.isLocked && !isBLocked) {
|
83
|
+
b.subSelf(delta.scale(normDistStrength * b.invWeight).limit(limit));
|
84
|
+
if (applyConstraints) {
|
85
|
+
b.applyConstraints();
|
86
|
+
}
|
87
|
+
}
|
88
|
+
}
|
89
|
+
}
|
@@ -0,0 +1,57 @@
|
|
1
|
+
/*
|
2
|
+
* __ .__ .__ ._____.
|
3
|
+
* _/ |_ _______ __|__| ____ | | |__\_ |__ ______
|
4
|
+
* \ __\/ _ \ \/ / |/ ___\| | | || __ \ / ___/
|
5
|
+
* | | ( <_> > <| \ \___| |_| || \_\ \\___ \
|
6
|
+
* |__| \____/__/\_ \__|\___ >____/__||___ /____ >
|
7
|
+
* \/ \/ \/ \/
|
8
|
+
*
|
9
|
+
* Copyright (c) 2006-2011 Karsten Schmidt
|
10
|
+
*
|
11
|
+
* This library is free software; you can redistribute it and/or
|
12
|
+
* modify it under the terms of the GNU Lesser General Public
|
13
|
+
* License as published by the Free Software Foundation; either
|
14
|
+
* version 2.1 of the License, or (at your option) any later version.
|
15
|
+
*
|
16
|
+
* http://creativecommons.org/licenses/LGPL/2.1/
|
17
|
+
*
|
18
|
+
* This library is distributed in the hope that it will be useful,
|
19
|
+
* but WITHOUT ANY WARRANTY; without even the implied warranty of
|
20
|
+
* MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU
|
21
|
+
* Lesser General Public License for more details.
|
22
|
+
*
|
23
|
+
* You should have received a copy of the GNU Lesser General Public
|
24
|
+
* License along with this library; if not, write to the Free Software
|
25
|
+
* Foundation, Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301, USA
|
26
|
+
*/
|
27
|
+
|
28
|
+
package toxi.physics2d;
|
29
|
+
|
30
|
+
/**
|
31
|
+
* Implements a string which will only enforce its rest length if the current
|
32
|
+
* distance is less than its rest length. This is handy if you just want to
|
33
|
+
* ensure objects are at least a certain distance from each other, but don't
|
34
|
+
* care if it's bigger than the enforced minimum.
|
35
|
+
*/
|
36
|
+
public class VerletMinDistanceSpring2D extends VerletSpring2D {
|
37
|
+
|
38
|
+
/**
|
39
|
+
*
|
40
|
+
* @param a
|
41
|
+
* @param b
|
42
|
+
* @param len
|
43
|
+
* @param str
|
44
|
+
*/
|
45
|
+
public VerletMinDistanceSpring2D(VerletParticle2D a, VerletParticle2D b,
|
46
|
+
float len, float str) {
|
47
|
+
super(a, b, len, str);
|
48
|
+
setRestLength(len);
|
49
|
+
}
|
50
|
+
|
51
|
+
@Override
|
52
|
+
protected void update(boolean applyConstraints) {
|
53
|
+
if (b.distanceToSquared(a) < restLengthSquared) {
|
54
|
+
super.update(applyConstraints);
|
55
|
+
}
|
56
|
+
}
|
57
|
+
}
|
@@ -0,0 +1,457 @@
|
|
1
|
+
/*
|
2
|
+
* __ .__ .__ ._____.
|
3
|
+
* _/ |_ _______ __|__| ____ | | |__\_ |__ ______
|
4
|
+
* \ __\/ _ \ \/ / |/ ___\| | | || __ \ / ___/
|
5
|
+
* | | ( <_> > <| \ \___| |_| || \_\ \\___ \
|
6
|
+
* |__| \____/__/\_ \__|\___ >____/__||___ /____ >
|
7
|
+
* \/ \/ \/ \/
|
8
|
+
*
|
9
|
+
* Copyright (c) 2006-2011 Karsten Schmidt
|
10
|
+
*
|
11
|
+
* This library is free software; you can redistribute it and/or
|
12
|
+
* modify it under the terms of the GNU Lesser General Public
|
13
|
+
* License as published by the Free Software Foundation; either
|
14
|
+
* version 2.1 of the License, or (at your option) any later version.
|
15
|
+
*
|
16
|
+
* http://creativecommons.org/licenses/LGPL/2.1/
|
17
|
+
*
|
18
|
+
* This library is distributed in the hope that it will be useful,
|
19
|
+
* but WITHOUT ANY WARRANTY; without even the implied warranty of
|
20
|
+
* MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU
|
21
|
+
* Lesser General Public License for more details.
|
22
|
+
*
|
23
|
+
* You should have received a copy of the GNU Lesser General Public
|
24
|
+
* License along with this library; if not, write to the Free Software
|
25
|
+
* Foundation, Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301, USA
|
26
|
+
*/
|
27
|
+
|
28
|
+
package toxi.physics2d;
|
29
|
+
|
30
|
+
import java.util.ArrayList;
|
31
|
+
import java.util.Collection;
|
32
|
+
import java.util.List;
|
33
|
+
|
34
|
+
import toxi.geom.ReadonlyVec2D;
|
35
|
+
import toxi.geom.Rect;
|
36
|
+
import toxi.geom.Vec2D;
|
37
|
+
import toxi.physics2d.behaviors.ParticleBehavior2D;
|
38
|
+
import toxi.physics2d.constraints.ParticleConstraint2D;
|
39
|
+
|
40
|
+
/**
|
41
|
+
* An individual 3D particle for use by the VerletPhysics and VerletSpring
|
42
|
+
* classes. A particle has weight, can be locked in space and its position
|
43
|
+
* constrained inside an (optional) axis-aligned bounding box.
|
44
|
+
*/
|
45
|
+
public class VerletParticle2D extends Vec2D {
|
46
|
+
|
47
|
+
protected Vec2D prev,
|
48
|
+
|
49
|
+
/**
|
50
|
+
*
|
51
|
+
*/
|
52
|
+
|
53
|
+
/**
|
54
|
+
*
|
55
|
+
*/
|
56
|
+
temp;
|
57
|
+
|
58
|
+
/**
|
59
|
+
*
|
60
|
+
*/
|
61
|
+
protected boolean isLocked;
|
62
|
+
|
63
|
+
/**
|
64
|
+
* Bounding box, by default set to null to disable
|
65
|
+
*/
|
66
|
+
public Rect bounds;
|
67
|
+
|
68
|
+
/**
|
69
|
+
* An optional particle constraints, called immediately after a particle is
|
70
|
+
* updated (and only used if particle is unlocked (default)
|
71
|
+
*/
|
72
|
+
public List<ParticleConstraint2D> constraints;
|
73
|
+
|
74
|
+
/**
|
75
|
+
*
|
76
|
+
*/
|
77
|
+
public List<ParticleBehavior2D> behaviors;
|
78
|
+
/**
|
79
|
+
* Particle weight, default = 1
|
80
|
+
*/
|
81
|
+
protected float weight, invWeight;
|
82
|
+
|
83
|
+
/**
|
84
|
+
*
|
85
|
+
*/
|
86
|
+
protected Vec2D force = new Vec2D();
|
87
|
+
|
88
|
+
/**
|
89
|
+
* Creates particle at position xyz
|
90
|
+
*
|
91
|
+
* @param x
|
92
|
+
* @param y
|
93
|
+
*/
|
94
|
+
public VerletParticle2D(float x, float y) {
|
95
|
+
this(x, y, 1);
|
96
|
+
}
|
97
|
+
|
98
|
+
/**
|
99
|
+
* Creates particle at position xyz with weight w
|
100
|
+
*
|
101
|
+
* @param x
|
102
|
+
* @param y
|
103
|
+
* @param w
|
104
|
+
*/
|
105
|
+
public VerletParticle2D(float x, float y, float w) {
|
106
|
+
super(x, y);
|
107
|
+
prev = new Vec2D(this);
|
108
|
+
temp = new Vec2D();
|
109
|
+
setWeight(w);
|
110
|
+
}
|
111
|
+
|
112
|
+
/**
|
113
|
+
* Creates particle at the position of the passed in vector
|
114
|
+
*
|
115
|
+
* @param v
|
116
|
+
* position
|
117
|
+
*/
|
118
|
+
public VerletParticle2D(ReadonlyVec2D v) {
|
119
|
+
this(v.x(), v.y(), 1);
|
120
|
+
}
|
121
|
+
|
122
|
+
/**
|
123
|
+
* Creates particle with weight w at the position of the passed in vector
|
124
|
+
*
|
125
|
+
* @param v
|
126
|
+
* position
|
127
|
+
* @param w
|
128
|
+
* weight
|
129
|
+
*/
|
130
|
+
public VerletParticle2D(ReadonlyVec2D v, float w) {
|
131
|
+
this(v.x(), v.y(), w);
|
132
|
+
}
|
133
|
+
|
134
|
+
/**
|
135
|
+
* Creates a copy of the passed in particle
|
136
|
+
*
|
137
|
+
* @param p
|
138
|
+
*/
|
139
|
+
public VerletParticle2D(VerletParticle2D p) {
|
140
|
+
this(p.x, p.y, p.weight);
|
141
|
+
isLocked = p.isLocked;
|
142
|
+
}
|
143
|
+
|
144
|
+
/**
|
145
|
+
*
|
146
|
+
* @param behavior
|
147
|
+
* @return
|
148
|
+
*/
|
149
|
+
public VerletParticle2D addBehavior(ParticleBehavior2D behavior) {
|
150
|
+
return addBehavior(behavior, 1);
|
151
|
+
}
|
152
|
+
|
153
|
+
/**
|
154
|
+
*
|
155
|
+
* @param behavior
|
156
|
+
* @param timeStep
|
157
|
+
* @return
|
158
|
+
*/
|
159
|
+
public VerletParticle2D addBehavior(ParticleBehavior2D behavior,
|
160
|
+
float timeStep) {
|
161
|
+
if (behaviors == null) {
|
162
|
+
behaviors = new ArrayList<>(1);
|
163
|
+
}
|
164
|
+
behavior.configure(timeStep);
|
165
|
+
behaviors.add(behavior);
|
166
|
+
return this;
|
167
|
+
}
|
168
|
+
|
169
|
+
/**
|
170
|
+
*
|
171
|
+
* @param behaviors
|
172
|
+
* @return
|
173
|
+
*/
|
174
|
+
public VerletParticle2D addBehaviors(
|
175
|
+
Collection<ParticleBehavior2D> behaviors) {
|
176
|
+
return addBehaviors(behaviors, 1);
|
177
|
+
}
|
178
|
+
|
179
|
+
/**
|
180
|
+
*
|
181
|
+
* @param behaviors
|
182
|
+
* @param timeStemp
|
183
|
+
* @return
|
184
|
+
*/
|
185
|
+
public VerletParticle2D addBehaviors(
|
186
|
+
Collection<ParticleBehavior2D> behaviors, float timeStemp) {
|
187
|
+
for (ParticleBehavior2D b : behaviors) {
|
188
|
+
addBehavior(b, timeStemp);
|
189
|
+
}
|
190
|
+
return this;
|
191
|
+
}
|
192
|
+
|
193
|
+
/**
|
194
|
+
* Adds the given constraint implementation to the list of constraints
|
195
|
+
* applied to this particle at each time step.
|
196
|
+
*
|
197
|
+
* @param c
|
198
|
+
* constraint instance
|
199
|
+
* @return itself
|
200
|
+
*/
|
201
|
+
public VerletParticle2D addConstraint(ParticleConstraint2D c) {
|
202
|
+
if (constraints == null) {
|
203
|
+
constraints = new ArrayList<>(1);
|
204
|
+
}
|
205
|
+
constraints.add(c);
|
206
|
+
return this;
|
207
|
+
}
|
208
|
+
|
209
|
+
/**
|
210
|
+
*
|
211
|
+
* @param constraints
|
212
|
+
* @return
|
213
|
+
*/
|
214
|
+
public VerletParticle2D addConstraints(
|
215
|
+
Collection<ParticleConstraint2D> constraints) {
|
216
|
+
for (ParticleConstraint2D c : constraints) {
|
217
|
+
addConstraint(c);
|
218
|
+
}
|
219
|
+
return this;
|
220
|
+
}
|
221
|
+
|
222
|
+
/**
|
223
|
+
*
|
224
|
+
* @param f
|
225
|
+
* @return
|
226
|
+
*/
|
227
|
+
public VerletParticle2D addForce(Vec2D f) {
|
228
|
+
force.addSelf(f);
|
229
|
+
return this;
|
230
|
+
}
|
231
|
+
|
232
|
+
/**
|
233
|
+
*
|
234
|
+
* @param v
|
235
|
+
* @return
|
236
|
+
*/
|
237
|
+
public VerletParticle2D addVelocity(Vec2D v) {
|
238
|
+
prev.subSelf(v);
|
239
|
+
return this;
|
240
|
+
}
|
241
|
+
|
242
|
+
/**
|
243
|
+
*
|
244
|
+
*/
|
245
|
+
public void applyBehaviors() {
|
246
|
+
if (behaviors != null) {
|
247
|
+
for (ParticleBehavior2D b : behaviors) {
|
248
|
+
b.apply(this);
|
249
|
+
}
|
250
|
+
}
|
251
|
+
}
|
252
|
+
|
253
|
+
/**
|
254
|
+
*
|
255
|
+
*/
|
256
|
+
public void applyConstraints() {
|
257
|
+
if (constraints != null) {
|
258
|
+
for (ParticleConstraint2D pc : constraints) {
|
259
|
+
pc.apply(this);
|
260
|
+
}
|
261
|
+
}
|
262
|
+
}
|
263
|
+
|
264
|
+
/**
|
265
|
+
*
|
266
|
+
*/
|
267
|
+
protected void applyForce() {
|
268
|
+
temp.set(this);
|
269
|
+
addSelf(sub(prev).addSelf(force.scale(weight)));
|
270
|
+
prev.set(temp);
|
271
|
+
force.clear();
|
272
|
+
}
|
273
|
+
|
274
|
+
/**
|
275
|
+
*
|
276
|
+
* @return
|
277
|
+
*/
|
278
|
+
public VerletParticle2D clearForce() {
|
279
|
+
force.clear();
|
280
|
+
return this;
|
281
|
+
}
|
282
|
+
|
283
|
+
/**
|
284
|
+
*
|
285
|
+
* @return
|
286
|
+
*/
|
287
|
+
public VerletParticle2D clearVelocity() {
|
288
|
+
prev.set(this);
|
289
|
+
return this;
|
290
|
+
}
|
291
|
+
|
292
|
+
/**
|
293
|
+
*
|
294
|
+
* @return
|
295
|
+
*/
|
296
|
+
public Vec2D getForce() {
|
297
|
+
return force;
|
298
|
+
}
|
299
|
+
|
300
|
+
/**
|
301
|
+
* @return the inverse weight (1/weight)
|
302
|
+
*/
|
303
|
+
public final float getInvWeight() {
|
304
|
+
return invWeight;
|
305
|
+
}
|
306
|
+
|
307
|
+
/**
|
308
|
+
* Returns the particle's position at the most recent time step.
|
309
|
+
*
|
310
|
+
* @return previous position
|
311
|
+
*/
|
312
|
+
public Vec2D getPreviousPosition() {
|
313
|
+
return prev;
|
314
|
+
}
|
315
|
+
|
316
|
+
/**
|
317
|
+
*
|
318
|
+
* @return
|
319
|
+
*/
|
320
|
+
public Vec2D getVelocity() {
|
321
|
+
return sub(prev);
|
322
|
+
}
|
323
|
+
|
324
|
+
/**
|
325
|
+
* @return the weight
|
326
|
+
*/
|
327
|
+
public final float getWeight() {
|
328
|
+
return weight;
|
329
|
+
}
|
330
|
+
|
331
|
+
/**
|
332
|
+
* @return true, if particle is locked
|
333
|
+
*/
|
334
|
+
public final boolean isLocked() {
|
335
|
+
return isLocked;
|
336
|
+
}
|
337
|
+
|
338
|
+
/**
|
339
|
+
* Locks/immobilizes particle in space
|
340
|
+
*
|
341
|
+
* @return itself
|
342
|
+
*/
|
343
|
+
public VerletParticle2D lock() {
|
344
|
+
isLocked = true;
|
345
|
+
return this;
|
346
|
+
}
|
347
|
+
|
348
|
+
/**
|
349
|
+
*
|
350
|
+
* @return
|
351
|
+
*/
|
352
|
+
public VerletParticle2D removeAllBehaviors() {
|
353
|
+
behaviors.clear();
|
354
|
+
return this;
|
355
|
+
}
|
356
|
+
|
357
|
+
/**
|
358
|
+
* Removes any currently applied constraints from this particle.
|
359
|
+
*
|
360
|
+
* @return itself
|
361
|
+
*/
|
362
|
+
public VerletParticle2D removeAllConstraints() {
|
363
|
+
constraints.clear();
|
364
|
+
return this;
|
365
|
+
}
|
366
|
+
|
367
|
+
/**
|
368
|
+
*
|
369
|
+
* @param b
|
370
|
+
* @return
|
371
|
+
*/
|
372
|
+
public boolean removeBehavior(ParticleBehavior2D b) {
|
373
|
+
return behaviors.remove(b);
|
374
|
+
}
|
375
|
+
|
376
|
+
/**
|
377
|
+
*
|
378
|
+
* @param behaviors
|
379
|
+
* @return
|
380
|
+
*/
|
381
|
+
public boolean removeBehaviors(Collection<ParticleBehavior2D> behaviors) {
|
382
|
+
return this.behaviors.removeAll(behaviors);
|
383
|
+
}
|
384
|
+
|
385
|
+
/**
|
386
|
+
* Attempts to remove the given constraint instance from the list of active
|
387
|
+
* constraints.
|
388
|
+
*
|
389
|
+
* @param c
|
390
|
+
* constraint to remove
|
391
|
+
* @return true, if successfully removed
|
392
|
+
*/
|
393
|
+
public boolean removeConstraint(ParticleConstraint2D c) {
|
394
|
+
return constraints.remove(c);
|
395
|
+
}
|
396
|
+
|
397
|
+
/**
|
398
|
+
*
|
399
|
+
* @param constraints
|
400
|
+
* @return
|
401
|
+
*/
|
402
|
+
public boolean removeConstraints(
|
403
|
+
Collection<ParticleConstraint2D> constraints) {
|
404
|
+
return this.constraints.removeAll(constraints);
|
405
|
+
}
|
406
|
+
|
407
|
+
/**
|
408
|
+
*
|
409
|
+
* @param scl
|
410
|
+
* @return
|
411
|
+
*/
|
412
|
+
public VerletParticle2D scaleVelocity(float scl) {
|
413
|
+
prev.interpolateToSelf(this, 1f - scl);
|
414
|
+
return this;
|
415
|
+
}
|
416
|
+
|
417
|
+
/**
|
418
|
+
*
|
419
|
+
* @param p
|
420
|
+
* @return
|
421
|
+
*/
|
422
|
+
public VerletParticle2D setPreviousPosition(Vec2D p) {
|
423
|
+
prev.set(p);
|
424
|
+
return this;
|
425
|
+
}
|
426
|
+
|
427
|
+
/**
|
428
|
+
*
|
429
|
+
* @param w
|
430
|
+
*/
|
431
|
+
public final void setWeight(float w) {
|
432
|
+
weight = w;
|
433
|
+
invWeight = 1f / w;
|
434
|
+
}
|
435
|
+
|
436
|
+
/**
|
437
|
+
* Unlocks particle again
|
438
|
+
*
|
439
|
+
* @return itself
|
440
|
+
*/
|
441
|
+
public VerletParticle2D unlock() {
|
442
|
+
clearVelocity();
|
443
|
+
isLocked = false;
|
444
|
+
return this;
|
445
|
+
}
|
446
|
+
|
447
|
+
/**
|
448
|
+
*
|
449
|
+
*/
|
450
|
+
public void update() {
|
451
|
+
if (!isLocked) {
|
452
|
+
applyBehaviors();
|
453
|
+
applyForce();
|
454
|
+
applyConstraints();
|
455
|
+
}
|
456
|
+
}
|
457
|
+
}
|