toxiclibs 0.2-java → 0.5.0-java
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/CHANGELOG.md +4 -0
- data/LICENSE +675 -0
- data/README.md +12 -5
- data/Rakefile +25 -82
- 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/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 +75 -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 +44 -0
- data/examples/povmesh/ftest.rb +46 -0
- data/examples/povmesh/tentacle.rb +73 -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/lib/toxiclibs.jar +0 -0
- data/lib/toxiclibs.rb +91 -32
- data/lib/toxiclibs/version.rb +1 -1
- data/pom.xml +122 -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/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 +94 -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 +34 -0
- metadata +424 -27
|
@@ -0,0 +1,326 @@
|
|
|
1
|
+
package toxi.sim.fluids;
|
|
2
|
+
|
|
3
|
+
import toxi.geom.ReadonlyVec3D;
|
|
4
|
+
import toxi.geom.Vec3D;
|
|
5
|
+
|
|
6
|
+
/**
|
|
7
|
+
*
|
|
8
|
+
* @author tux
|
|
9
|
+
*/
|
|
10
|
+
public class FluidSolver3D {
|
|
11
|
+
|
|
12
|
+
private final int size, size2, size3, sm1, sm2;
|
|
13
|
+
private final float dt;
|
|
14
|
+
|
|
15
|
+
/**
|
|
16
|
+
*
|
|
17
|
+
*/
|
|
18
|
+
public float diff;
|
|
19
|
+
|
|
20
|
+
/**
|
|
21
|
+
*
|
|
22
|
+
*/
|
|
23
|
+
public float visc;
|
|
24
|
+
|
|
25
|
+
private final float[] s;
|
|
26
|
+
private final float[] density;
|
|
27
|
+
|
|
28
|
+
private final float[] velX, velY, velZ;
|
|
29
|
+
private final float[] velX0, velY0, velZ0;
|
|
30
|
+
private final int numIterations = 10;
|
|
31
|
+
|
|
32
|
+
/**
|
|
33
|
+
*
|
|
34
|
+
* @param size
|
|
35
|
+
* @param diffusion
|
|
36
|
+
* @param viscosity
|
|
37
|
+
* @param dt
|
|
38
|
+
*/
|
|
39
|
+
public FluidSolver3D(int size, float diffusion, float viscosity, float dt) {
|
|
40
|
+
this.size = size;
|
|
41
|
+
this.size2 = size * size;
|
|
42
|
+
this.size3 = size2 * size;
|
|
43
|
+
this.sm1 = size - 1;
|
|
44
|
+
this.sm2 = size - 2;
|
|
45
|
+
this.diff = diffusion;
|
|
46
|
+
this.visc = viscosity;
|
|
47
|
+
this.dt = dt;
|
|
48
|
+
this.s = new float[size3];
|
|
49
|
+
this.density = new float[size3];
|
|
50
|
+
this.velX = new float[size3];
|
|
51
|
+
this.velY = new float[size3];
|
|
52
|
+
this.velZ = new float[size3];
|
|
53
|
+
this.velX0 = new float[size3];
|
|
54
|
+
this.velY0 = new float[size3];
|
|
55
|
+
this.velZ0 = new float[size3];
|
|
56
|
+
}
|
|
57
|
+
|
|
58
|
+
/**
|
|
59
|
+
*
|
|
60
|
+
* @param x
|
|
61
|
+
* @param y
|
|
62
|
+
* @param z
|
|
63
|
+
* @param amount
|
|
64
|
+
*/
|
|
65
|
+
public void addDensity(int x, int y, int z, float amount) {
|
|
66
|
+
density[IX(x, y, z)] += amount;
|
|
67
|
+
}
|
|
68
|
+
|
|
69
|
+
/**
|
|
70
|
+
*
|
|
71
|
+
* @param x
|
|
72
|
+
* @param y
|
|
73
|
+
* @param z
|
|
74
|
+
* @param amount
|
|
75
|
+
*/
|
|
76
|
+
public void addVelocity(int x, int y, int z, Vec3D amount) {
|
|
77
|
+
int idx = IX(x, y, z);
|
|
78
|
+
velX[idx] += amount.x;
|
|
79
|
+
velY[idx] += amount.y;
|
|
80
|
+
velZ[idx] += amount.z;
|
|
81
|
+
}
|
|
82
|
+
|
|
83
|
+
private void advect(final int b, final float[] d, final float[] d0,
|
|
84
|
+
final float[] velocX, final float[] velocY, final float[] velocZ) {
|
|
85
|
+
int i0, j0, k0;
|
|
86
|
+
|
|
87
|
+
final float scaledTime = dt * sm2;
|
|
88
|
+
|
|
89
|
+
float s0, s1, t0, t1, u0, u1;
|
|
90
|
+
float x, y, z;
|
|
91
|
+
|
|
92
|
+
float maxSize = sm2 + 0.5f;
|
|
93
|
+
float ifloat, jfloat, kfloat;
|
|
94
|
+
int i, j, k;
|
|
95
|
+
|
|
96
|
+
for (k = 1, kfloat = 1; k < sm1; k++, kfloat++) {
|
|
97
|
+
for (j = 1, jfloat = 1; j < sm1; j++, jfloat++) {
|
|
98
|
+
for (i = 1, ifloat = 1; i < sm1; i++, ifloat++) {
|
|
99
|
+
final int idx = IX(i, j, k);
|
|
100
|
+
x = i - scaledTime * velocX[idx];
|
|
101
|
+
y = j - scaledTime * velocY[idx];
|
|
102
|
+
z = k - scaledTime * velocZ[idx];
|
|
103
|
+
|
|
104
|
+
if (x < 0.5f) {
|
|
105
|
+
x = 0.5f;
|
|
106
|
+
}
|
|
107
|
+
if (x > maxSize) {
|
|
108
|
+
x = maxSize;
|
|
109
|
+
}
|
|
110
|
+
i0 = (int) x;
|
|
111
|
+
if (y < 0.5f) {
|
|
112
|
+
y = 0.5f;
|
|
113
|
+
}
|
|
114
|
+
if (y > maxSize) {
|
|
115
|
+
y = maxSize;
|
|
116
|
+
}
|
|
117
|
+
j0 = (int) y;
|
|
118
|
+
if (z < 0.5f) {
|
|
119
|
+
z = 0.5f;
|
|
120
|
+
}
|
|
121
|
+
if (z > maxSize) {
|
|
122
|
+
z = maxSize;
|
|
123
|
+
}
|
|
124
|
+
k0 = (int) z;
|
|
125
|
+
|
|
126
|
+
s1 = x - i0;
|
|
127
|
+
s0 = 1.0f - s1;
|
|
128
|
+
t1 = y - j0;
|
|
129
|
+
t0 = 1.0f - t1;
|
|
130
|
+
u1 = z - k0;
|
|
131
|
+
u0 = 1.0f - u1;
|
|
132
|
+
|
|
133
|
+
final int ix = IX(i0, j0, k0);
|
|
134
|
+
d[idx] =
|
|
135
|
+
|
|
136
|
+
s0
|
|
137
|
+
* (t0 * (u0 * d0[ix] + u1 * d0[ix + size2]) + (t1 * (u0
|
|
138
|
+
* d0[ix + size] + u1
|
|
139
|
+
* d0[ix + size + size2])))
|
|
140
|
+
+ s1
|
|
141
|
+
* (t0 * (u0 * d0[ix + 1] + u1 * d0[ix + 1 + size2]) + (t1 * (u0
|
|
142
|
+
* d0[ix + 1 + size] + u1
|
|
143
|
+
* d0[ix + 1 + size + size2])));
|
|
144
|
+
}
|
|
145
|
+
}
|
|
146
|
+
}
|
|
147
|
+
set_bnd(b, d);
|
|
148
|
+
}
|
|
149
|
+
|
|
150
|
+
/**
|
|
151
|
+
*
|
|
152
|
+
* @param x
|
|
153
|
+
* @param y
|
|
154
|
+
* @param z
|
|
155
|
+
*/
|
|
156
|
+
public void clearAt(int x, int y, int z) {
|
|
157
|
+
final int idx = IX(x, y, z);
|
|
158
|
+
if (idx >= 0 && idx < density.length) {
|
|
159
|
+
density[idx] = 0;
|
|
160
|
+
velX[idx] = velY[idx] = velZ[idx] = 0;
|
|
161
|
+
}
|
|
162
|
+
}
|
|
163
|
+
|
|
164
|
+
/**
|
|
165
|
+
*
|
|
166
|
+
* @param decay
|
|
167
|
+
*/
|
|
168
|
+
public final void decay(float decay) {
|
|
169
|
+
for (int i = 0; i < density.length; i++) {
|
|
170
|
+
density[i] *= decay;
|
|
171
|
+
}
|
|
172
|
+
}
|
|
173
|
+
|
|
174
|
+
private void diffuse(final int b, final float[] x, final float[] x0,
|
|
175
|
+
final float diff) {
|
|
176
|
+
float a = dt * diff * sm2 * sm2;
|
|
177
|
+
lin_solve(b, x, x0, a, 1 + 6 * a);
|
|
178
|
+
}
|
|
179
|
+
|
|
180
|
+
/**
|
|
181
|
+
* @return the density
|
|
182
|
+
*/
|
|
183
|
+
public float[] getDensity() {
|
|
184
|
+
return density;
|
|
185
|
+
}
|
|
186
|
+
|
|
187
|
+
private int IX(int x, int y, int z) {
|
|
188
|
+
return x + y * size + z * size2;
|
|
189
|
+
}
|
|
190
|
+
|
|
191
|
+
void lin_solve(final int b, final float[] x, final float[] x0,
|
|
192
|
+
final float a, final float c) {
|
|
193
|
+
float cRecip = 1.0f / c;
|
|
194
|
+
for (int k = 0; k < numIterations; k++) {
|
|
195
|
+
for (int m = 1; m < sm1; m++) {
|
|
196
|
+
for (int j = 1, idx = m * size2 + size + 1; j < sm1; j++) {
|
|
197
|
+
for (int i = 1; i < sm1; i++) {
|
|
198
|
+
x[idx] = (x0[idx] + a
|
|
199
|
+
* (x[idx + 1] + x[idx - 1] + x[idx + size]
|
|
200
|
+
+ x[idx - size] + x[idx + size2] + x[idx
|
|
201
|
+
- size2]))
|
|
202
|
+
* cRecip;
|
|
203
|
+
idx++;
|
|
204
|
+
}
|
|
205
|
+
}
|
|
206
|
+
}
|
|
207
|
+
set_bnd(b, x);
|
|
208
|
+
}
|
|
209
|
+
}
|
|
210
|
+
|
|
211
|
+
private void project(final float[] velocX, final float[] velocY,
|
|
212
|
+
final float[] velocZ, final float[] p, final float[] div) {
|
|
213
|
+
final float invSize = -0.5f * 1f / size;
|
|
214
|
+
for (int k = 1; k < sm1; k++) {
|
|
215
|
+
for (int j = 1; j < sm1; j++) {
|
|
216
|
+
for (int i = 1; i < sm1; i++) {
|
|
217
|
+
final int idx = IX(i, j, k);
|
|
218
|
+
div[idx] = (velocX[idx + 1] - velocX[idx - 1]
|
|
219
|
+
+ velocY[idx + size] - velocY[idx - size]
|
|
220
|
+
+ velocZ[idx + size2] - velocZ[idx - size2])
|
|
221
|
+
* invSize;
|
|
222
|
+
p[idx] = 0;
|
|
223
|
+
}
|
|
224
|
+
}
|
|
225
|
+
}
|
|
226
|
+
set_bnd(0, div);
|
|
227
|
+
set_bnd(0, p);
|
|
228
|
+
lin_solve(0, p, div, 1, 6);
|
|
229
|
+
|
|
230
|
+
float hs = 0.5f * size;
|
|
231
|
+
for (int k = 1; k < sm1; k++) {
|
|
232
|
+
for (int j = 1; j < sm1; j++) {
|
|
233
|
+
for (int i = 1; i < sm1; i++) {
|
|
234
|
+
final int idx = IX(i, j, k);
|
|
235
|
+
velocX[idx] -= hs * (p[idx + 1] - p[idx - 1]);
|
|
236
|
+
velocY[idx] -= hs * (p[idx + size] - p[idx - size]);
|
|
237
|
+
velocZ[idx] -= hs * (p[idx + size2] - p[idx - size2]);
|
|
238
|
+
}
|
|
239
|
+
}
|
|
240
|
+
}
|
|
241
|
+
set_bnd(1, velocX);
|
|
242
|
+
set_bnd(2, velocY);
|
|
243
|
+
set_bnd(3, velocZ);
|
|
244
|
+
}
|
|
245
|
+
|
|
246
|
+
private void set_bnd(int b, float[] x) {
|
|
247
|
+
for (int j = 1; j < sm1; j++) {
|
|
248
|
+
for (int i = 1; i < sm1; i++) {
|
|
249
|
+
final int idx = IX(i, j, 0);
|
|
250
|
+
x[idx] = b == 3 ? -x[idx + size2] : x[idx + size2];
|
|
251
|
+
x[idx + sm1 * size2] = b == 3 ? -x[idx + sm2 * size2] : x[idx
|
|
252
|
+
+ sm2 * size2];
|
|
253
|
+
}
|
|
254
|
+
}
|
|
255
|
+
for (int k = 1; k < sm1; k++) {
|
|
256
|
+
for (int i = 1; i < sm1; i++) {
|
|
257
|
+
final int idx = IX(i, 0, k);
|
|
258
|
+
x[idx] = b == 2 ? -x[idx + size] : x[idx + size];
|
|
259
|
+
x[idx + sm1 * size] = b == 2 ? -x[idx + size * sm2] : x[idx
|
|
260
|
+
+ size * sm2];
|
|
261
|
+
}
|
|
262
|
+
}
|
|
263
|
+
for (int k = 1; k < sm1; k++) {
|
|
264
|
+
for (int j = 1; j < sm1; j++) {
|
|
265
|
+
final int idx = IX(0, j, k);
|
|
266
|
+
x[idx] = b == 1 ? -x[idx + 1] : x[idx + 1];
|
|
267
|
+
x[idx + sm1] = b == 1 ? -x[idx + sm2] : x[idx + sm2];
|
|
268
|
+
}
|
|
269
|
+
}
|
|
270
|
+
|
|
271
|
+
x[0] = 0.33f * (x[IX(1, 0, 0)] + x[IX(0, 1, 0)] + x[IX(0, 0, 1)]);
|
|
272
|
+
x[IX(0, sm1, 0)] = 0.33f * (x[IX(1, sm1, 0)] + x[IX(0, sm2, 0)] + x[IX(
|
|
273
|
+
0, sm1, 1)]);
|
|
274
|
+
x[IX(0, 0, sm1)] = 0.33f * (x[IX(1, 0, sm1)] + x[IX(0, 1, sm1)] + x[IX(
|
|
275
|
+
0, 0, sm1)]);
|
|
276
|
+
x[IX(0, sm1, sm1)] = 0.33f * (x[IX(1, sm1, sm1)] + x[IX(0, sm2, sm1)] + x[IX(
|
|
277
|
+
0, sm1, sm2)]);
|
|
278
|
+
x[IX(sm1, 0, 0)] = 0.33f * (x[IX(sm2, 0, 0)] + x[IX(sm1, 1, 0)] + x[IX(
|
|
279
|
+
sm1, 0, 1)]);
|
|
280
|
+
x[IX(sm1, sm1, 0)] = 0.33f * (x[IX(sm2, sm1, 0)] + x[IX(sm1, sm2, 0)] + x[IX(
|
|
281
|
+
sm1, sm1, 1)]);
|
|
282
|
+
x[IX(sm1, 0, sm1)] = 0.33f * (x[IX(sm2, 0, sm1)] + x[IX(sm1, 1, sm1)] + x[IX(
|
|
283
|
+
sm1, 0, sm2)]);
|
|
284
|
+
x[IX(sm1, sm1, sm1)] = 0.33f * (x[IX(sm2, sm1, sm1)]
|
|
285
|
+
+ x[IX(sm1, sm2, sm1)] + x[IX(sm1, sm1, sm2)]);
|
|
286
|
+
}
|
|
287
|
+
|
|
288
|
+
/**
|
|
289
|
+
*
|
|
290
|
+
* @param x
|
|
291
|
+
* @param y
|
|
292
|
+
* @param z
|
|
293
|
+
* @param dens
|
|
294
|
+
* @param vel
|
|
295
|
+
*/
|
|
296
|
+
public void setAt(int x, int y, int z, float dens, ReadonlyVec3D vel) {
|
|
297
|
+
final int idx = IX(x, y, z);
|
|
298
|
+
if (idx >= 0 && idx < density.length) {
|
|
299
|
+
density[idx] = dens;
|
|
300
|
+
velX[idx] = vel.x();
|
|
301
|
+
velY[idx] = vel.y();
|
|
302
|
+
velZ[idx] = vel.z();
|
|
303
|
+
}
|
|
304
|
+
}
|
|
305
|
+
|
|
306
|
+
/**
|
|
307
|
+
*
|
|
308
|
+
*/
|
|
309
|
+
public void update() {
|
|
310
|
+
diffuse(1, velX0, velX, visc);
|
|
311
|
+
diffuse(2, velY0, velY, visc);
|
|
312
|
+
diffuse(3, velZ0, velZ, visc);
|
|
313
|
+
|
|
314
|
+
project(velX0, velY0, velZ0, velX, velY);
|
|
315
|
+
|
|
316
|
+
advect(1, velX, velX0, velX0, velY0, velZ0);
|
|
317
|
+
advect(2, velY, velY0, velX0, velY0, velZ0);
|
|
318
|
+
advect(3, velZ, velZ0, velX0, velY0, velZ0);
|
|
319
|
+
|
|
320
|
+
project(velX, velY, velZ, velX0, velY0);
|
|
321
|
+
|
|
322
|
+
diffuse(0, s, density, diff);
|
|
323
|
+
advect(0, density, s, velX, velY, velZ);
|
|
324
|
+
}
|
|
325
|
+
|
|
326
|
+
}
|
|
@@ -0,0 +1,469 @@
|
|
|
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.sim.grayscott;
|
|
29
|
+
|
|
30
|
+
import toxi.geom.Rect;
|
|
31
|
+
import toxi.math.MathUtils;
|
|
32
|
+
|
|
33
|
+
/**
|
|
34
|
+
* Implementation of the Gray-Scott reaction diffusion model described in detail
|
|
35
|
+
* on the links below:
|
|
36
|
+
* <ul>
|
|
37
|
+
* <li>http://groups.csail.mit.edu/mac/projects/amorphous/GrayScott/</li>
|
|
38
|
+
* <li>http://ix.cs.uoregon.edu/~jlidbeck/java/rd/</li>
|
|
39
|
+
* <li>http://www.mrob.com/pub/comp/xmorphia/</li>
|
|
40
|
+
* </ul>
|
|
41
|
+
*/
|
|
42
|
+
public class GrayScott {
|
|
43
|
+
|
|
44
|
+
public float[] u,
|
|
45
|
+
|
|
46
|
+
/**
|
|
47
|
+
*
|
|
48
|
+
*/
|
|
49
|
+
|
|
50
|
+
/**
|
|
51
|
+
*
|
|
52
|
+
*/
|
|
53
|
+
v;
|
|
54
|
+
protected float[] uu,
|
|
55
|
+
|
|
56
|
+
/**
|
|
57
|
+
*
|
|
58
|
+
*/
|
|
59
|
+
|
|
60
|
+
/**
|
|
61
|
+
*
|
|
62
|
+
*/
|
|
63
|
+
vv;
|
|
64
|
+
|
|
65
|
+
protected int width,
|
|
66
|
+
|
|
67
|
+
/**
|
|
68
|
+
*
|
|
69
|
+
*/
|
|
70
|
+
|
|
71
|
+
/**
|
|
72
|
+
*
|
|
73
|
+
*/
|
|
74
|
+
height;
|
|
75
|
+
|
|
76
|
+
protected float f,
|
|
77
|
+
|
|
78
|
+
/**
|
|
79
|
+
*
|
|
80
|
+
*/
|
|
81
|
+
|
|
82
|
+
/**
|
|
83
|
+
*
|
|
84
|
+
*/
|
|
85
|
+
k;
|
|
86
|
+
protected float dU,
|
|
87
|
+
|
|
88
|
+
/**
|
|
89
|
+
*
|
|
90
|
+
*/
|
|
91
|
+
|
|
92
|
+
/**
|
|
93
|
+
*
|
|
94
|
+
*/
|
|
95
|
+
dV;
|
|
96
|
+
|
|
97
|
+
/**
|
|
98
|
+
*
|
|
99
|
+
*/
|
|
100
|
+
protected boolean isTiling;
|
|
101
|
+
|
|
102
|
+
/**
|
|
103
|
+
*
|
|
104
|
+
* @param width
|
|
105
|
+
* @param height
|
|
106
|
+
* @param wrap
|
|
107
|
+
*/
|
|
108
|
+
public GrayScott(int width, int height, boolean wrap) {
|
|
109
|
+
this.width = width;
|
|
110
|
+
this.height = height;
|
|
111
|
+
this.u = new float[width * height];
|
|
112
|
+
this.v = new float[u.length];
|
|
113
|
+
this.uu = new float[u.length];
|
|
114
|
+
this.vv = new float[u.length];
|
|
115
|
+
this.isTiling = wrap;
|
|
116
|
+
reset();
|
|
117
|
+
// default config
|
|
118
|
+
setCoefficients(0.023f, 0.077f, 0.16f, 0.08f);
|
|
119
|
+
}
|
|
120
|
+
|
|
121
|
+
/**
|
|
122
|
+
* Convenience method to access U array using 2D coordinates.
|
|
123
|
+
*
|
|
124
|
+
* @param x
|
|
125
|
+
* @param y
|
|
126
|
+
* @return current u value at the given position
|
|
127
|
+
*/
|
|
128
|
+
public float getCurrentUAt(int x, int y) {
|
|
129
|
+
if (y >= 0 && y < height && x >= 0 && x < width) {
|
|
130
|
+
return u[y * width + x];
|
|
131
|
+
}
|
|
132
|
+
return 0;
|
|
133
|
+
}
|
|
134
|
+
|
|
135
|
+
/**
|
|
136
|
+
* Convenience method to access V array using 2D coordinates.
|
|
137
|
+
*
|
|
138
|
+
* @param x
|
|
139
|
+
* @param y
|
|
140
|
+
* @return current v value at the given position
|
|
141
|
+
*/
|
|
142
|
+
public float getCurrentVAt(int x, int y) {
|
|
143
|
+
if (y >= 0 && y < height && x >= 0 && x < width) {
|
|
144
|
+
return v[y * width + x];
|
|
145
|
+
}
|
|
146
|
+
return 0;
|
|
147
|
+
}
|
|
148
|
+
|
|
149
|
+
/**
|
|
150
|
+
* @return the diffuse U coefficient
|
|
151
|
+
*/
|
|
152
|
+
public float getDiffuseU() {
|
|
153
|
+
return dU;
|
|
154
|
+
}
|
|
155
|
+
|
|
156
|
+
/**
|
|
157
|
+
* @return the diffuse V coefficient
|
|
158
|
+
*/
|
|
159
|
+
public float getDiffuseV() {
|
|
160
|
+
return dV;
|
|
161
|
+
}
|
|
162
|
+
|
|
163
|
+
/**
|
|
164
|
+
* @return the F coefficient
|
|
165
|
+
*/
|
|
166
|
+
public float getF() {
|
|
167
|
+
return f;
|
|
168
|
+
}
|
|
169
|
+
|
|
170
|
+
/**
|
|
171
|
+
* Extension point for subclasses to modulate the F coefficient of the
|
|
172
|
+
* reaction diffusion, based on spatial (or other) parameters. This method
|
|
173
|
+
* is called for every cell/pixel of the simulation space from the main
|
|
174
|
+
* {@link #update(float)} cycle and can be used to create parameter
|
|
175
|
+
* gradients, animations and other spatial or temporal modulations.
|
|
176
|
+
*
|
|
177
|
+
* @param x
|
|
178
|
+
* @param y
|
|
179
|
+
* @return the active F coefficient at the given position
|
|
180
|
+
*/
|
|
181
|
+
public float getFCoeffAt(int x, int y) {
|
|
182
|
+
return f;
|
|
183
|
+
}
|
|
184
|
+
|
|
185
|
+
/**
|
|
186
|
+
* @return the K coefficient
|
|
187
|
+
*/
|
|
188
|
+
public float getK() {
|
|
189
|
+
return k;
|
|
190
|
+
}
|
|
191
|
+
|
|
192
|
+
/**
|
|
193
|
+
* Extension point for subclasses to modulate the K coefficient of the
|
|
194
|
+
* reaction diffusion, based on spatial (or other) parameters. This method
|
|
195
|
+
* is called for every cell/pixel of the simulation space and can be used to
|
|
196
|
+
* create parameter gradients, animations and other spatial or temporal
|
|
197
|
+
* modulations.
|
|
198
|
+
*
|
|
199
|
+
* @param x
|
|
200
|
+
* @param y
|
|
201
|
+
* @return the active K coefficient at the given position
|
|
202
|
+
*/
|
|
203
|
+
public float getKCoeffAt(int x, int y) {
|
|
204
|
+
return k;
|
|
205
|
+
}
|
|
206
|
+
|
|
207
|
+
/**
|
|
208
|
+
* @return the isTiling
|
|
209
|
+
*/
|
|
210
|
+
public boolean isTiling() {
|
|
211
|
+
return isTiling;
|
|
212
|
+
}
|
|
213
|
+
|
|
214
|
+
/**
|
|
215
|
+
* Resets the simulation matrix to an initial, clean state.
|
|
216
|
+
*/
|
|
217
|
+
public final void reset() {
|
|
218
|
+
for (int i = 0; i < uu.length; i++) {
|
|
219
|
+
uu[i] = 1.0f;
|
|
220
|
+
vv[i] = 0.0f;
|
|
221
|
+
}
|
|
222
|
+
}
|
|
223
|
+
|
|
224
|
+
/**
|
|
225
|
+
*
|
|
226
|
+
* @param pixels
|
|
227
|
+
* @param imgWidth
|
|
228
|
+
* @param imgHeight
|
|
229
|
+
*/
|
|
230
|
+
public void seedImage(int[] pixels, int imgWidth, int imgHeight) {
|
|
231
|
+
int xo = MathUtils.clip((width - imgWidth) / 2, 0, width - 1);
|
|
232
|
+
int yo = MathUtils.clip((height - imgHeight) / 2, 0, height - 1);
|
|
233
|
+
imgWidth = MathUtils.min(imgWidth, width);
|
|
234
|
+
imgHeight = MathUtils.min(imgHeight, height);
|
|
235
|
+
for (int y = 0; y < imgHeight; y++) {
|
|
236
|
+
int i = y * imgWidth;
|
|
237
|
+
for (int x = 0; x < imgWidth; x++) {
|
|
238
|
+
if (0 < (pixels[i + x] & 0xff)) {
|
|
239
|
+
int idx = (yo + y) * width + xo + x;
|
|
240
|
+
uu[idx] = 0.5f;
|
|
241
|
+
vv[idx] = 0.25f;
|
|
242
|
+
}
|
|
243
|
+
}
|
|
244
|
+
}
|
|
245
|
+
}
|
|
246
|
+
|
|
247
|
+
/**
|
|
248
|
+
*
|
|
249
|
+
* @param f
|
|
250
|
+
* @param k
|
|
251
|
+
* @param dU
|
|
252
|
+
* @param dV
|
|
253
|
+
*/
|
|
254
|
+
public final void setCoefficients(float f, float k, float dU, float dV) {
|
|
255
|
+
this.f = f;
|
|
256
|
+
this.k = k;
|
|
257
|
+
this.dU = dU;
|
|
258
|
+
this.dV = dV;
|
|
259
|
+
}
|
|
260
|
+
|
|
261
|
+
/**
|
|
262
|
+
* @param dU
|
|
263
|
+
* the diffuse U coefficient to set
|
|
264
|
+
*/
|
|
265
|
+
public void setDiffuseU(float dU) {
|
|
266
|
+
this.dU = dU;
|
|
267
|
+
}
|
|
268
|
+
|
|
269
|
+
/**
|
|
270
|
+
* @param dV
|
|
271
|
+
* the diffuse V coefficient to set
|
|
272
|
+
*/
|
|
273
|
+
public void setDiffuseV(float dV) {
|
|
274
|
+
this.dV = dV;
|
|
275
|
+
}
|
|
276
|
+
|
|
277
|
+
/**
|
|
278
|
+
* @param f
|
|
279
|
+
* the F coefficient to set
|
|
280
|
+
*/
|
|
281
|
+
public void setF(float f) {
|
|
282
|
+
this.f = f;
|
|
283
|
+
}
|
|
284
|
+
|
|
285
|
+
/**
|
|
286
|
+
* @param k
|
|
287
|
+
* the K coefficient to set
|
|
288
|
+
*/
|
|
289
|
+
public void setK(float k) {
|
|
290
|
+
this.k = k;
|
|
291
|
+
}
|
|
292
|
+
|
|
293
|
+
/**
|
|
294
|
+
* @param x
|
|
295
|
+
* @param y
|
|
296
|
+
* @param w
|
|
297
|
+
* @param h
|
|
298
|
+
*/
|
|
299
|
+
public void setRect(int x, int y, int w, int h) {
|
|
300
|
+
int mix = MathUtils.clip(x - w / 2, 0, width);
|
|
301
|
+
int max = MathUtils.clip(x + w / 2, 0, width);
|
|
302
|
+
int miy = MathUtils.clip(y - h / 2, 0, height);
|
|
303
|
+
int may = MathUtils.clip(y + h / 2, 0, height);
|
|
304
|
+
for (int yy = miy; yy < may; yy++) {
|
|
305
|
+
for (int xx = mix; xx < max; xx++) {
|
|
306
|
+
int idx = yy * width + xx;
|
|
307
|
+
uu[idx] = 0.5f;
|
|
308
|
+
vv[idx] = 0.25f;
|
|
309
|
+
}
|
|
310
|
+
}
|
|
311
|
+
}
|
|
312
|
+
|
|
313
|
+
/**
|
|
314
|
+
*
|
|
315
|
+
* @param r
|
|
316
|
+
*/
|
|
317
|
+
public void setRect(Rect r) {
|
|
318
|
+
setRect((int) r.x, (int) r.y, (int) r.width, (int) r.height);
|
|
319
|
+
}
|
|
320
|
+
|
|
321
|
+
/**
|
|
322
|
+
* @param isTiling
|
|
323
|
+
* the isTiling to set
|
|
324
|
+
*/
|
|
325
|
+
public void setTiling(boolean isTiling) {
|
|
326
|
+
this.isTiling = isTiling;
|
|
327
|
+
}
|
|
328
|
+
|
|
329
|
+
/**
|
|
330
|
+
*
|
|
331
|
+
* @param t
|
|
332
|
+
*/
|
|
333
|
+
public void update(float t) {
|
|
334
|
+
t = MathUtils.clip(t, 0, 1f);
|
|
335
|
+
int w1 = width - 1;
|
|
336
|
+
int h1 = height - 1;
|
|
337
|
+
for (int y = 1; y < h1; y++) {
|
|
338
|
+
for (int x = 1; x < w1; x++) {
|
|
339
|
+
int idx = y * width + x;
|
|
340
|
+
int top = idx - width;
|
|
341
|
+
int bottom = idx + width;
|
|
342
|
+
int left = idx - 1;
|
|
343
|
+
int right = idx + 1;
|
|
344
|
+
float currF = getFCoeffAt(x, y);
|
|
345
|
+
float currK = getKCoeffAt(x, y);
|
|
346
|
+
float currU = uu[idx];
|
|
347
|
+
float currV = vv[idx];
|
|
348
|
+
float d2 = currU * currV * currV;
|
|
349
|
+
u[idx] = MathUtils
|
|
350
|
+
.max(0,
|
|
351
|
+
currU
|
|
352
|
+
+ t
|
|
353
|
+
* ((dU
|
|
354
|
+
* ((uu[right] + uu[left]
|
|
355
|
+
+ uu[bottom] + uu[top]) - 4 * currU) - d2) + currF
|
|
356
|
+
* (1.0f - currU)));
|
|
357
|
+
v[idx] = MathUtils
|
|
358
|
+
.max(0,
|
|
359
|
+
currV
|
|
360
|
+
+ t
|
|
361
|
+
* ((dV
|
|
362
|
+
* ((vv[right] + vv[left]
|
|
363
|
+
+ vv[bottom] + vv[top]) - 4 * currV) + d2) - currK
|
|
364
|
+
* currV));
|
|
365
|
+
}
|
|
366
|
+
}
|
|
367
|
+
|
|
368
|
+
if (isTiling) {
|
|
369
|
+
int w2 = w1 - 1;
|
|
370
|
+
int idxH1 = h1 * width;
|
|
371
|
+
int idxH2 = (h1 - 1) * width;
|
|
372
|
+
for (int x = 0; x < width; x++) {
|
|
373
|
+
int left = (x == 0 ? w1 : x - 1);
|
|
374
|
+
int right = (x == w1 ? 0 : x + 1);
|
|
375
|
+
int idx = idxH1 + x;
|
|
376
|
+
float cu = uu[x];
|
|
377
|
+
float cv = vv[x];
|
|
378
|
+
float cui = uu[idx];
|
|
379
|
+
float cvi = vv[idx];
|
|
380
|
+
float d = cu * cv * cv;
|
|
381
|
+
u[x] = MathUtils
|
|
382
|
+
.max(0,
|
|
383
|
+
cu
|
|
384
|
+
+ t
|
|
385
|
+
* ((dU
|
|
386
|
+
* ((uu[right] + uu[left]
|
|
387
|
+
+ uu[width + x] + cui) - 4 * cu) - d) + f
|
|
388
|
+
* (1.0f - cu)));
|
|
389
|
+
v[x] = MathUtils
|
|
390
|
+
.max(0,
|
|
391
|
+
cv
|
|
392
|
+
+ t
|
|
393
|
+
* ((dV
|
|
394
|
+
* ((vv[right] + vv[left]
|
|
395
|
+
+ vv[width + x] + cvi) - 4 * cv) + d) - k
|
|
396
|
+
* cv));
|
|
397
|
+
d = cui * cvi * cvi;
|
|
398
|
+
u[idx] = MathUtils
|
|
399
|
+
.max(0,
|
|
400
|
+
cui
|
|
401
|
+
+ t
|
|
402
|
+
* ((dU
|
|
403
|
+
* ((uu[idxH1 + right]
|
|
404
|
+
+ uu[idxH1 + left] + cu + uu[idxH2
|
|
405
|
+
+ x]) - 4 * cui) - d) + f
|
|
406
|
+
* (1.0f - cui)));
|
|
407
|
+
v[idx] = MathUtils
|
|
408
|
+
.max(0,
|
|
409
|
+
cvi
|
|
410
|
+
+ t
|
|
411
|
+
* ((dU
|
|
412
|
+
* ((vv[idxH1 + right]
|
|
413
|
+
+ vv[idxH1 + left] + cv + vv[idxH2
|
|
414
|
+
+ x]) - 4 * cvi) + d) - k
|
|
415
|
+
* cvi));
|
|
416
|
+
}
|
|
417
|
+
|
|
418
|
+
for (int y = 0; y < height; y++) {
|
|
419
|
+
int idx = y * width;
|
|
420
|
+
int idxW1 = idx + w1;
|
|
421
|
+
int idxW2 = idx + w2;
|
|
422
|
+
float cu = uu[idx];
|
|
423
|
+
float cv = vv[idx];
|
|
424
|
+
float cui = uu[idxW1];
|
|
425
|
+
float cvi = vv[idxW1];
|
|
426
|
+
float d = cu * cv * cv;
|
|
427
|
+
int up = (y == 0 ? h1 : y - 1) * width;
|
|
428
|
+
int down = (y == h1 ? 0 : y + 1) * width;
|
|
429
|
+
u[idx] = MathUtils
|
|
430
|
+
.max(0,
|
|
431
|
+
cu
|
|
432
|
+
+ t
|
|
433
|
+
* ((dU
|
|
434
|
+
* ((uu[idx + 1] + cui
|
|
435
|
+
+ uu[down] + uu[up]) - 4 * cu) - d) + f
|
|
436
|
+
* (1.0f - cu)));
|
|
437
|
+
v[idx] = MathUtils
|
|
438
|
+
.max(0,
|
|
439
|
+
cv
|
|
440
|
+
+ t
|
|
441
|
+
* ((dV
|
|
442
|
+
* ((vv[idx + 1] + cvi
|
|
443
|
+
+ vv[down] + vv[up]) - 4 * cv) + d) - k
|
|
444
|
+
* cv));
|
|
445
|
+
d = cui * cvi * cvi;
|
|
446
|
+
u[idxW1] = MathUtils
|
|
447
|
+
.max(0,
|
|
448
|
+
cui
|
|
449
|
+
+ t
|
|
450
|
+
* ((dU
|
|
451
|
+
* ((cu + uu[idxW2]
|
|
452
|
+
+ uu[down + w1] + uu[up
|
|
453
|
+
+ w1]) - 4 * cui) - d) + f
|
|
454
|
+
* (1.0f - cui)));
|
|
455
|
+
v[idxW1] = MathUtils
|
|
456
|
+
.max(0,
|
|
457
|
+
cvi
|
|
458
|
+
+ t
|
|
459
|
+
* ((dV
|
|
460
|
+
* ((cv + vv[idxW2]
|
|
461
|
+
+ vv[down + w1] + vv[up
|
|
462
|
+
+ w1]) - 4 * cvi) + d) - k
|
|
463
|
+
* cvi));
|
|
464
|
+
}
|
|
465
|
+
}
|
|
466
|
+
System.arraycopy(u, 0, uu, 0, u.length);
|
|
467
|
+
System.arraycopy(v, 0, vv, 0, v.length);
|
|
468
|
+
}
|
|
469
|
+
}
|