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,417 @@
|
|
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.physics3d;
|
29
|
+
|
30
|
+
import java.util.ArrayList;
|
31
|
+
import java.util.List;
|
32
|
+
|
33
|
+
import toxi.geom.AABB;
|
34
|
+
import toxi.geom.Vec3D;
|
35
|
+
import toxi.physics3d.behaviors.GravityBehavior3D;
|
36
|
+
import toxi.physics3d.behaviors.ParticleBehavior3D;
|
37
|
+
import toxi.physics3d.constraints.ParticleConstraint3D;
|
38
|
+
|
39
|
+
/**
|
40
|
+
* 3D particle physics engine using Verlet integration based on:
|
41
|
+
* http://en.wikipedia.org/wiki/Verlet_integration
|
42
|
+
* http://www.teknikus.dk/tj/gdc2001.htm
|
43
|
+
*
|
44
|
+
*/
|
45
|
+
public class VerletPhysics3D {
|
46
|
+
|
47
|
+
/**
|
48
|
+
*
|
49
|
+
* @param c
|
50
|
+
* @param list
|
51
|
+
*/
|
52
|
+
public static void addConstraintToAll(ParticleConstraint3D c,
|
53
|
+
List<VerletParticle3D> list) {
|
54
|
+
list.stream().forEach((p) -> {
|
55
|
+
p.addConstraint(c);
|
56
|
+
});
|
57
|
+
}
|
58
|
+
|
59
|
+
/**
|
60
|
+
*
|
61
|
+
* @param c
|
62
|
+
* @param list
|
63
|
+
*/
|
64
|
+
public static void removeConstraintFromAll(ParticleConstraint3D c,
|
65
|
+
List<VerletParticle3D> list) {
|
66
|
+
list.stream().forEach((p) -> {
|
67
|
+
p.removeConstraint(c);
|
68
|
+
});
|
69
|
+
}
|
70
|
+
|
71
|
+
/**
|
72
|
+
* List of particles (Vec3D subclassed)
|
73
|
+
*/
|
74
|
+
public List<VerletParticle3D> particles;
|
75
|
+
/**
|
76
|
+
* List of spring/sticks connectors
|
77
|
+
*/
|
78
|
+
public List<VerletSpring3D> springs;
|
79
|
+
|
80
|
+
/**
|
81
|
+
* Default time step = 1.0
|
82
|
+
*/
|
83
|
+
protected float timeStep;
|
84
|
+
|
85
|
+
/**
|
86
|
+
* Default iterations for verlet solver = 50
|
87
|
+
*/
|
88
|
+
protected int numIterations;
|
89
|
+
|
90
|
+
/**
|
91
|
+
* Optional 3D bounding box to constrain particles too
|
92
|
+
*/
|
93
|
+
protected AABB worldBounds;
|
94
|
+
|
95
|
+
/**
|
96
|
+
*
|
97
|
+
*/
|
98
|
+
public final List<ParticleBehavior3D> behaviors = new ArrayList<>(
|
99
|
+
1);
|
100
|
+
|
101
|
+
/**
|
102
|
+
*
|
103
|
+
*/
|
104
|
+
public final List<ParticleConstraint3D> constraints = new ArrayList<>(
|
105
|
+
1);
|
106
|
+
|
107
|
+
/**
|
108
|
+
*
|
109
|
+
*/
|
110
|
+
protected float drag;
|
111
|
+
|
112
|
+
/**
|
113
|
+
* Initializes a Verlet engine instance using the default values.
|
114
|
+
*/
|
115
|
+
public VerletPhysics3D() {
|
116
|
+
this(null, 50, 0, 1);
|
117
|
+
}
|
118
|
+
|
119
|
+
/**
|
120
|
+
* Initializes an Verlet engine instance with the passed in configuration.
|
121
|
+
*
|
122
|
+
* @param gravity
|
123
|
+
* 3D gravity vector
|
124
|
+
* @param numIterations
|
125
|
+
* iterations per time step for verlet solver
|
126
|
+
* @param drag
|
127
|
+
* drag value 0...1
|
128
|
+
* @param timeStep
|
129
|
+
* time step for calculating forces
|
130
|
+
*/
|
131
|
+
public VerletPhysics3D(Vec3D gravity, int numIterations, float drag,
|
132
|
+
float timeStep) {
|
133
|
+
particles = new ArrayList<>();
|
134
|
+
springs = new ArrayList<>();
|
135
|
+
this.numIterations = numIterations;
|
136
|
+
this.timeStep = timeStep;
|
137
|
+
setDrag(drag);
|
138
|
+
if (gravity != null) {
|
139
|
+
addBehavior(new GravityBehavior3D(gravity));
|
140
|
+
}
|
141
|
+
}
|
142
|
+
|
143
|
+
/**
|
144
|
+
*
|
145
|
+
* @param behavior
|
146
|
+
*/
|
147
|
+
public final void addBehavior(ParticleBehavior3D behavior) {
|
148
|
+
behavior.configure(timeStep);
|
149
|
+
behaviors.add(behavior);
|
150
|
+
}
|
151
|
+
|
152
|
+
/**
|
153
|
+
*
|
154
|
+
* @param constraint
|
155
|
+
*/
|
156
|
+
public void addConstraint(ParticleConstraint3D constraint) {
|
157
|
+
constraints.add(constraint);
|
158
|
+
}
|
159
|
+
|
160
|
+
/**
|
161
|
+
* Adds a particle to the list
|
162
|
+
*
|
163
|
+
* @param p
|
164
|
+
* @return itself
|
165
|
+
*/
|
166
|
+
public VerletPhysics3D addParticle(VerletParticle3D p) {
|
167
|
+
particles.add(p);
|
168
|
+
return this;
|
169
|
+
}
|
170
|
+
|
171
|
+
/**
|
172
|
+
* Adds a spring connector
|
173
|
+
*
|
174
|
+
* @param s
|
175
|
+
* @return itself
|
176
|
+
*/
|
177
|
+
public VerletPhysics3D addSpring(VerletSpring3D s) {
|
178
|
+
if (getSpring(s.a, s.b) == null) {
|
179
|
+
springs.add(s);
|
180
|
+
}
|
181
|
+
return this;
|
182
|
+
}
|
183
|
+
|
184
|
+
/**
|
185
|
+
* Applies all global constraints and constrains all particle positions to
|
186
|
+
* the world bounding box set
|
187
|
+
*/
|
188
|
+
protected void applyConstaints() {
|
189
|
+
boolean hasGlobalConstraints = constraints.size() > 0;
|
190
|
+
particles.stream().map((p) -> {
|
191
|
+
if (hasGlobalConstraints) {
|
192
|
+
constraints.stream().forEach((c) -> {
|
193
|
+
c.apply(p);
|
194
|
+
});
|
195
|
+
}
|
196
|
+
return p;
|
197
|
+
}).map((p) -> {
|
198
|
+
if (p.bounds != null) {
|
199
|
+
p.constrain(p.bounds);
|
200
|
+
}
|
201
|
+
return p;
|
202
|
+
}).filter((p) -> (worldBounds != null)).forEach((p) -> {
|
203
|
+
p.constrain(worldBounds);
|
204
|
+
});
|
205
|
+
}
|
206
|
+
|
207
|
+
/**
|
208
|
+
*
|
209
|
+
* @return
|
210
|
+
*/
|
211
|
+
public VerletPhysics3D clear() {
|
212
|
+
behaviors.clear();
|
213
|
+
constraints.clear();
|
214
|
+
particles.clear();
|
215
|
+
springs.clear();
|
216
|
+
return this;
|
217
|
+
}
|
218
|
+
|
219
|
+
/**
|
220
|
+
*
|
221
|
+
* @return
|
222
|
+
*/
|
223
|
+
public AABB getCurrentBounds() {
|
224
|
+
Vec3D min = new Vec3D(Float.MAX_VALUE, Float.MAX_VALUE, Float.MAX_VALUE);
|
225
|
+
Vec3D max = new Vec3D(Float.MIN_VALUE, Float.MIN_VALUE, Float.MIN_VALUE);
|
226
|
+
particles.stream().map((p) -> {
|
227
|
+
min.minSelf(p);
|
228
|
+
return p;
|
229
|
+
}).forEach((p) -> {
|
230
|
+
max.maxSelf(p);
|
231
|
+
});
|
232
|
+
return AABB.fromMinMax(min, max);
|
233
|
+
}
|
234
|
+
|
235
|
+
/**
|
236
|
+
*
|
237
|
+
* @return
|
238
|
+
*/
|
239
|
+
public float getDrag() {
|
240
|
+
return 1f - drag;
|
241
|
+
}
|
242
|
+
|
243
|
+
/**
|
244
|
+
* @return the numIterations
|
245
|
+
*/
|
246
|
+
public int getNumIterations() {
|
247
|
+
return numIterations;
|
248
|
+
}
|
249
|
+
|
250
|
+
/**
|
251
|
+
* Attempts to find the spring element between the 2 particles supplied
|
252
|
+
*
|
253
|
+
* @param a
|
254
|
+
* particle 1
|
255
|
+
* @param b
|
256
|
+
* particle 2
|
257
|
+
* @return spring instance, or null if not found
|
258
|
+
*/
|
259
|
+
public VerletSpring3D getSpring(Vec3D a, Vec3D b) {
|
260
|
+
for (VerletSpring3D s : springs) {
|
261
|
+
if ((s.a == a && s.b == b) || (s.a == b && s.b == a)) {
|
262
|
+
return s;
|
263
|
+
}
|
264
|
+
}
|
265
|
+
return null;
|
266
|
+
}
|
267
|
+
|
268
|
+
/**
|
269
|
+
* @return the timeStep
|
270
|
+
*/
|
271
|
+
public float getTimeStep() {
|
272
|
+
return timeStep;
|
273
|
+
}
|
274
|
+
|
275
|
+
/**
|
276
|
+
* @return the worldBounds
|
277
|
+
*/
|
278
|
+
public AABB getWorldBounds() {
|
279
|
+
return worldBounds;
|
280
|
+
}
|
281
|
+
|
282
|
+
/**
|
283
|
+
*
|
284
|
+
* @param b
|
285
|
+
* @return
|
286
|
+
*/
|
287
|
+
public boolean removeBehavior(ParticleBehavior3D b) {
|
288
|
+
return behaviors.remove(b);
|
289
|
+
}
|
290
|
+
|
291
|
+
/**
|
292
|
+
*
|
293
|
+
* @param c
|
294
|
+
* @return
|
295
|
+
*/
|
296
|
+
public boolean removeConstraint(ParticleConstraint3D c) {
|
297
|
+
return constraints.remove(c);
|
298
|
+
}
|
299
|
+
|
300
|
+
/**
|
301
|
+
* Removes a particle from the simulation.
|
302
|
+
*
|
303
|
+
* @param p
|
304
|
+
* particle to remove
|
305
|
+
* @return true, if removed successfully
|
306
|
+
*/
|
307
|
+
public boolean removeParticle(VerletParticle3D p) {
|
308
|
+
return particles.remove(p);
|
309
|
+
}
|
310
|
+
|
311
|
+
/**
|
312
|
+
* Removes a spring connector from the simulation instance.
|
313
|
+
*
|
314
|
+
* @param s
|
315
|
+
* spring to remove
|
316
|
+
* @return true, if the spring has been removed
|
317
|
+
*/
|
318
|
+
public boolean removeSpring(VerletSpring3D s) {
|
319
|
+
return springs.remove(s);
|
320
|
+
}
|
321
|
+
|
322
|
+
/**
|
323
|
+
* Removes a spring connector and its both end point particles from the
|
324
|
+
* simulation
|
325
|
+
*
|
326
|
+
* @param s
|
327
|
+
* spring to remove
|
328
|
+
* @return true, only if spring AND particles have been removed successfully
|
329
|
+
*/
|
330
|
+
public boolean removeSpringElements(VerletSpring3D s) {
|
331
|
+
if (removeSpring(s)) {
|
332
|
+
return (removeParticle(s.a) && removeParticle(s.b));
|
333
|
+
}
|
334
|
+
return false;
|
335
|
+
}
|
336
|
+
|
337
|
+
/**
|
338
|
+
*
|
339
|
+
* @param drag
|
340
|
+
*/
|
341
|
+
public final void setDrag(float drag) {
|
342
|
+
this.drag = 1f - drag;
|
343
|
+
}
|
344
|
+
|
345
|
+
/**
|
346
|
+
* @param numIterations
|
347
|
+
* the numIterations to set
|
348
|
+
*/
|
349
|
+
public void setNumIterations(int numIterations) {
|
350
|
+
this.numIterations = numIterations;
|
351
|
+
}
|
352
|
+
|
353
|
+
/**
|
354
|
+
* @param timeStep
|
355
|
+
* the timeStep to set
|
356
|
+
*/
|
357
|
+
public void setTimeStep(float timeStep) {
|
358
|
+
this.timeStep = timeStep;
|
359
|
+
behaviors.stream().forEach((b) -> {
|
360
|
+
b.configure(timeStep);
|
361
|
+
});
|
362
|
+
}
|
363
|
+
|
364
|
+
/**
|
365
|
+
* Sets bounding box
|
366
|
+
*
|
367
|
+
* @param world
|
368
|
+
* @return itself
|
369
|
+
*/
|
370
|
+
public VerletPhysics3D setWorldBounds(AABB world) {
|
371
|
+
worldBounds = world;
|
372
|
+
return this;
|
373
|
+
}
|
374
|
+
|
375
|
+
/**
|
376
|
+
* Progresses the physics simulation by 1 time step and updates all forces
|
377
|
+
* and particle positions accordingly
|
378
|
+
*
|
379
|
+
* @return itself
|
380
|
+
*/
|
381
|
+
public VerletPhysics3D update() {
|
382
|
+
updateParticles();
|
383
|
+
updateSprings();
|
384
|
+
applyConstaints();
|
385
|
+
return this;
|
386
|
+
}
|
387
|
+
|
388
|
+
/**
|
389
|
+
* Updates all particle positions
|
390
|
+
*/
|
391
|
+
protected void updateParticles() {
|
392
|
+
behaviors.stream().forEach((b) -> {
|
393
|
+
particles.stream().forEach((p) -> {
|
394
|
+
b.apply(p);
|
395
|
+
});
|
396
|
+
});
|
397
|
+
particles.stream().map((p) -> {
|
398
|
+
p.scaleVelocity(drag);
|
399
|
+
return p;
|
400
|
+
}).forEach((p) -> {
|
401
|
+
p.update();
|
402
|
+
});
|
403
|
+
}
|
404
|
+
|
405
|
+
/**
|
406
|
+
* Updates all spring connections based on new particle positions
|
407
|
+
*/
|
408
|
+
protected void updateSprings() {
|
409
|
+
if (springs.size() > 0) {
|
410
|
+
for (int i = numIterations; i > 0; i--) {
|
411
|
+
for (VerletSpring3D s : springs) {
|
412
|
+
s.update(i == 1);
|
413
|
+
}
|
414
|
+
}
|
415
|
+
}
|
416
|
+
}
|
417
|
+
}
|
@@ -0,0 +1,180 @@
|
|
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.physics3d;
|
29
|
+
|
30
|
+
import toxi.geom.Vec3D;
|
31
|
+
|
32
|
+
/**
|
33
|
+
* <p>
|
34
|
+
* A spring class connecting two VerletParticles in space. Based on the
|
35
|
+
* configuration of the spring instance and that of the physics engine, the
|
36
|
+
* behaviour of the spring can vary between springy and stiff/stick like.
|
37
|
+
* </p>
|
38
|
+
*
|
39
|
+
* <p>
|
40
|
+
* The simulation takes particle weights into account and can be configured to
|
41
|
+
* lock either particle in space in order to force the other one to move. This
|
42
|
+
* is sometimes handy for resolving collisions (currently outside the scope of
|
43
|
+
* this library).
|
44
|
+
* </p>
|
45
|
+
*
|
46
|
+
* @see toxi.physics3d.VerletPhysics3D
|
47
|
+
*/
|
48
|
+
public class VerletSpring3D {
|
49
|
+
|
50
|
+
/**
|
51
|
+
*
|
52
|
+
*/
|
53
|
+
protected static final float EPS = 1e-6f;
|
54
|
+
|
55
|
+
/**
|
56
|
+
* Spring end points / particles
|
57
|
+
*/
|
58
|
+
public VerletParticle3D a, b;
|
59
|
+
|
60
|
+
/**
|
61
|
+
* Spring rest length to which it always wants to return too
|
62
|
+
*/
|
63
|
+
protected float restLength, restLengthSquared;
|
64
|
+
|
65
|
+
/**
|
66
|
+
* Spring strength, possible value range depends on engine configuration
|
67
|
+
* (time step, drag)
|
68
|
+
*/
|
69
|
+
protected float strength;
|
70
|
+
|
71
|
+
/**
|
72
|
+
* Flag, if either particle is locked in space (only within the scope of
|
73
|
+
* this spring)
|
74
|
+
*/
|
75
|
+
protected boolean isALocked, isBLocked;
|
76
|
+
|
77
|
+
/**
|
78
|
+
* @param a
|
79
|
+
* 1st particle
|
80
|
+
* @param b
|
81
|
+
* 2nd particle
|
82
|
+
* @param len
|
83
|
+
* desired rest length
|
84
|
+
* @param str
|
85
|
+
* spring strength
|
86
|
+
*/
|
87
|
+
public VerletSpring3D(VerletParticle3D a, VerletParticle3D b, float len, float str) {
|
88
|
+
this.a = a;
|
89
|
+
this.b = b;
|
90
|
+
restLength = len;
|
91
|
+
strength = str;
|
92
|
+
}
|
93
|
+
|
94
|
+
/**
|
95
|
+
*
|
96
|
+
* @return
|
97
|
+
*/
|
98
|
+
public final float getRestLength() {
|
99
|
+
return restLength;
|
100
|
+
}
|
101
|
+
|
102
|
+
/**
|
103
|
+
*
|
104
|
+
* @return
|
105
|
+
*/
|
106
|
+
public final float getStrength() {
|
107
|
+
return strength;
|
108
|
+
}
|
109
|
+
|
110
|
+
/**
|
111
|
+
* (Un)Locks the 1st end point of the spring. <b>NOTE: this acts purely
|
112
|
+
* within the scope of this spring instance and does NOT call
|
113
|
+
* {@link VerletParticle3D#lock()}</b>
|
114
|
+
*
|
115
|
+
* @param s
|
116
|
+
* @return itself
|
117
|
+
*/
|
118
|
+
public VerletSpring3D lockA(boolean s) {
|
119
|
+
isALocked = s;
|
120
|
+
return this;
|
121
|
+
}
|
122
|
+
|
123
|
+
/**
|
124
|
+
* (Un)Locks the 2nd end point of the spring
|
125
|
+
*
|
126
|
+
* @param s
|
127
|
+
* @return itself
|
128
|
+
*/
|
129
|
+
|
130
|
+
public VerletSpring3D lockB(boolean s) {
|
131
|
+
isBLocked = s;
|
132
|
+
return this;
|
133
|
+
}
|
134
|
+
|
135
|
+
/**
|
136
|
+
*
|
137
|
+
* @param len
|
138
|
+
* @return
|
139
|
+
*/
|
140
|
+
public VerletSpring3D setRestLength(float len) {
|
141
|
+
restLength = len;
|
142
|
+
restLengthSquared = len * len;
|
143
|
+
return this;
|
144
|
+
}
|
145
|
+
|
146
|
+
/**
|
147
|
+
*
|
148
|
+
* @param strength
|
149
|
+
* @return
|
150
|
+
*/
|
151
|
+
public VerletSpring3D setStrength(float strength) {
|
152
|
+
this.strength = strength;
|
153
|
+
return this;
|
154
|
+
}
|
155
|
+
|
156
|
+
/**
|
157
|
+
* Updates both particle positions (if not locked) based on their current
|
158
|
+
* distance, weight and spring configuration *
|
159
|
+
* @param applyConstraints
|
160
|
+
*/
|
161
|
+
protected void update(boolean applyConstraints) {
|
162
|
+
Vec3D delta = b.sub(a);
|
163
|
+
// add minute offset to avoid div-by-zero errors
|
164
|
+
float dist = delta.magnitude() + EPS;
|
165
|
+
float normDistStrength = (dist - restLength)
|
166
|
+
/ (dist * (a.invWeight + b.invWeight)) * strength;
|
167
|
+
if (!a.isLocked && !isALocked) {
|
168
|
+
a.addSelf(delta.scale(normDistStrength * a.invWeight));
|
169
|
+
if (applyConstraints) {
|
170
|
+
a.applyConstraints();
|
171
|
+
}
|
172
|
+
}
|
173
|
+
if (!b.isLocked && !isBLocked) {
|
174
|
+
b.addSelf(delta.scale(-normDistStrength * b.invWeight));
|
175
|
+
if (applyConstraints) {
|
176
|
+
b.applyConstraints();
|
177
|
+
}
|
178
|
+
}
|
179
|
+
}
|
180
|
+
}
|