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.
Files changed (404) hide show
  1. checksums.yaml +4 -4
  2. data/.gitignore +16 -0
  3. data/.mvn/extensions.xml +8 -0
  4. data/.mvn/wrapper/maven-wrapper.properties +1 -0
  5. data/.travis.yml +23 -0
  6. data/CHANGELOG.md +7 -0
  7. data/COPYING.md +14 -0
  8. data/Gemfile +10 -0
  9. data/LICENSE +675 -0
  10. data/README.md +9 -7
  11. data/Rakefile +25 -81
  12. data/examples/README.md +5 -0
  13. data/examples/attract_repel/attract_repel.rb +30 -0
  14. data/examples/attract_repel/attractor.rb +23 -0
  15. data/examples/attract_repel/particle.rb +27 -0
  16. data/examples/data/ReplicaBold.ttf +0 -0
  17. data/examples/data/ti_yong.png +0 -0
  18. data/examples/force_directed/cluster.rb +76 -0
  19. data/examples/force_directed/force_directed_graph.rb +92 -0
  20. data/examples/force_directed/node.rb +26 -0
  21. data/examples/gray_scott_image.rb +74 -0
  22. data/examples/gray_scott_tone_map.rb +77 -0
  23. data/examples/implicit.rb +139 -0
  24. data/examples/inflate_mesh.rb +89 -0
  25. data/examples/model_align.rb +43 -0
  26. data/examples/physics_type.rb +77 -0
  27. data/examples/povmesh/data/mask.jpg +0 -0
  28. data/examples/povmesh/ftest.rb +59 -0
  29. data/examples/povmesh/mesh_align.rb +47 -0
  30. data/examples/povmesh/tentacle.rb +71 -0
  31. data/examples/simple_cluster/cluster.rb +47 -0
  32. data/examples/simple_cluster/node.rb +27 -0
  33. data/examples/simple_cluster/simple_cluster.rb +60 -0
  34. data/examples/soft_body/blanket.rb +45 -0
  35. data/examples/soft_body/connection.rb +16 -0
  36. data/examples/soft_body/particle.rb +22 -0
  37. data/examples/soft_body/soft_body_square_adapted.rb +55 -0
  38. data/examples/spherical_harmonics_mesh.rb +50 -0
  39. data/examples/test_rect.rb +32 -0
  40. data/lib/toxiclibs.jar +0 -0
  41. data/lib/toxiclibs.rb +72 -22
  42. data/lib/toxiclibs/version.rb +1 -1
  43. data/pom.rb +63 -0
  44. data/pom.xml +124 -0
  45. data/src/com/toxi/net/ClientListener.java +41 -0
  46. data/src/com/toxi/net/ServerListener.java +70 -0
  47. data/src/com/toxi/net/ServerListenerAdapter.java +47 -0
  48. data/src/com/toxi/net/ServerState.java +18 -0
  49. data/src/com/toxi/net/UDPConnection.java +66 -0
  50. data/src/com/toxi/net/UDPSyncClient.java +81 -0
  51. data/src/com/toxi/net/UDPSyncServer.java +450 -0
  52. data/src/com/toxi/nio/UDPClient.java +121 -0
  53. data/src/com/toxi/nio/UDPClientState.java +32 -0
  54. data/src/com/toxi/nio/UDPServer.java +129 -0
  55. data/src/toxi/audio/AudioBuffer.java +229 -0
  56. data/src/toxi/audio/AudioSource.java +288 -0
  57. data/src/toxi/audio/DecompressInputStream.java +159 -0
  58. data/src/toxi/audio/IIRFilter.java +197 -0
  59. data/src/toxi/audio/JOALUtil.java +388 -0
  60. data/src/toxi/audio/MultiTimbralManager.java +162 -0
  61. data/src/toxi/audio/SoundListener.java +154 -0
  62. data/src/toxi/audio/SynthUtil.java +109 -0
  63. data/src/toxi/color/AccessCriteria.java +114 -0
  64. data/src/toxi/color/AlphaAccessor.java +67 -0
  65. data/src/toxi/color/CMYKAccessor.java +122 -0
  66. data/src/toxi/color/CMYKDistanceProxy.java +40 -0
  67. data/src/toxi/color/ColorGradient.java +260 -0
  68. data/src/toxi/color/ColorList.java +699 -0
  69. data/src/toxi/color/ColorRange.java +671 -0
  70. data/src/toxi/color/ColorTheme.java +163 -0
  71. data/src/toxi/color/DistanceProxy.java +44 -0
  72. data/src/toxi/color/HSVAccessor.java +113 -0
  73. data/src/toxi/color/HSVDistanceProxy.java +40 -0
  74. data/src/toxi/color/HistEntry.java +85 -0
  75. data/src/toxi/color/Histogram.java +185 -0
  76. data/src/toxi/color/Hue.java +249 -0
  77. data/src/toxi/color/LuminanceAccessor.java +78 -0
  78. data/src/toxi/color/NamedColor.java +935 -0
  79. data/src/toxi/color/ProximityComparator.java +70 -0
  80. data/src/toxi/color/RGBAccessor.java +113 -0
  81. data/src/toxi/color/RGBDistanceProxy.java +41 -0
  82. data/src/toxi/color/ReadonlyTColor.java +296 -0
  83. data/src/toxi/color/TColor.java +1677 -0
  84. data/src/toxi/color/TColorAdapter.java +68 -0
  85. data/src/toxi/color/ToneMap.java +218 -0
  86. data/src/toxi/color/theory/AnalogousStrategy.java +140 -0
  87. data/src/toxi/color/theory/ColorTheoryRegistry.java +139 -0
  88. data/src/toxi/color/theory/ColorTheoryStrategy.java +56 -0
  89. data/src/toxi/color/theory/ComplementaryStrategy.java +111 -0
  90. data/src/toxi/color/theory/CompoundTheoryStrategy.java +143 -0
  91. data/src/toxi/color/theory/LeftSplitComplementaryStrategy.java +82 -0
  92. data/src/toxi/color/theory/MonochromeTheoryStrategy.java +103 -0
  93. data/src/toxi/color/theory/RightSplitComplementaryStrategy.java +82 -0
  94. data/src/toxi/color/theory/SingleComplementStrategy.java +76 -0
  95. data/src/toxi/color/theory/SplitComplementaryStrategy.java +77 -0
  96. data/src/toxi/color/theory/TetradTheoryStrategy.java +114 -0
  97. data/src/toxi/color/theory/TriadTheoryStrategy.java +77 -0
  98. data/src/toxi/data/csv/CSVAdapter.java +74 -0
  99. data/src/toxi/data/csv/CSVFieldMapper.java +212 -0
  100. data/src/toxi/data/csv/CSVListener.java +61 -0
  101. data/src/toxi/data/csv/CSVParser.java +202 -0
  102. data/src/toxi/data/feeds/AtomAuthor.java +49 -0
  103. data/src/toxi/data/feeds/AtomContent.java +50 -0
  104. data/src/toxi/data/feeds/AtomEntry.java +111 -0
  105. data/src/toxi/data/feeds/AtomFeed.java +129 -0
  106. data/src/toxi/data/feeds/AtomLink.java +62 -0
  107. data/src/toxi/data/feeds/RSSChannel.java +88 -0
  108. data/src/toxi/data/feeds/RSSEnclosure.java +60 -0
  109. data/src/toxi/data/feeds/RSSFeed.java +99 -0
  110. data/src/toxi/data/feeds/RSSItem.java +104 -0
  111. data/src/toxi/data/feeds/util/EntityStripper.java +2480 -0
  112. data/src/toxi/data/feeds/util/Iso8601DateAdapter.java +101 -0
  113. data/src/toxi/data/feeds/util/Rfc822DateAdapter.java +93 -0
  114. data/src/toxi/geom/AABB.java +658 -0
  115. data/src/toxi/geom/Axis3D.java +116 -0
  116. data/src/toxi/geom/AxisAlignedCylinder.java +163 -0
  117. data/src/toxi/geom/BernsteinPolynomial.java +94 -0
  118. data/src/toxi/geom/BezierCurve2D.java +159 -0
  119. data/src/toxi/geom/BezierCurve3D.java +148 -0
  120. data/src/toxi/geom/BooleanShapeBuilder.java +185 -0
  121. data/src/toxi/geom/BoxIntersector.java +52 -0
  122. data/src/toxi/geom/Circle.java +230 -0
  123. data/src/toxi/geom/CircleIntersector.java +85 -0
  124. data/src/toxi/geom/Cone.java +150 -0
  125. data/src/toxi/geom/ConvexPolygonClipper.java +136 -0
  126. data/src/toxi/geom/CoordinateExtractor.java +16 -0
  127. data/src/toxi/geom/Ellipse.java +250 -0
  128. data/src/toxi/geom/GMatrix.java +2599 -0
  129. data/src/toxi/geom/GVector.java +833 -0
  130. data/src/toxi/geom/GlobalGridTesselator.java +54 -0
  131. data/src/toxi/geom/GridTesselator.java +108 -0
  132. data/src/toxi/geom/Intersector2D.java +49 -0
  133. data/src/toxi/geom/Intersector3D.java +51 -0
  134. data/src/toxi/geom/IsectData2D.java +103 -0
  135. data/src/toxi/geom/IsectData3D.java +103 -0
  136. data/src/toxi/geom/Line2D.java +534 -0
  137. data/src/toxi/geom/Line3D.java +471 -0
  138. data/src/toxi/geom/LineStrip2D.java +430 -0
  139. data/src/toxi/geom/LineStrip3D.java +230 -0
  140. data/src/toxi/geom/LocalGridTesselator.java +57 -0
  141. data/src/toxi/geom/Matrix3d.java +3048 -0
  142. data/src/toxi/geom/Matrix4f.java +3446 -0
  143. data/src/toxi/geom/Matrix4x4.java +1076 -0
  144. data/src/toxi/geom/MatrixSizeException.java +58 -0
  145. data/src/toxi/geom/OctreeVisitor.java +44 -0
  146. data/src/toxi/geom/Origin3D.java +148 -0
  147. data/src/toxi/geom/Plane.java +293 -0
  148. data/src/toxi/geom/PlaneIntersector.java +57 -0
  149. data/src/toxi/geom/PointCloud3D.java +253 -0
  150. data/src/toxi/geom/PointOctree.java +502 -0
  151. data/src/toxi/geom/PointQuadtree.java +375 -0
  152. data/src/toxi/geom/Polygon2D.java +1038 -0
  153. data/src/toxi/geom/PolygonClipper2D.java +45 -0
  154. data/src/toxi/geom/PolygonTesselator.java +20 -0
  155. data/src/toxi/geom/QuadtreeVisitor.java +44 -0
  156. data/src/toxi/geom/Quaternion.java +641 -0
  157. data/src/toxi/geom/Ray2D.java +146 -0
  158. data/src/toxi/geom/Ray3D.java +150 -0
  159. data/src/toxi/geom/Ray3DIntersector.java +75 -0
  160. data/src/toxi/geom/ReadonlyVec2D.java +575 -0
  161. data/src/toxi/geom/ReadonlyVec3D.java +628 -0
  162. data/src/toxi/geom/ReadonlyVec4D.java +431 -0
  163. data/src/toxi/geom/Rect.java +720 -0
  164. data/src/toxi/geom/Reflector3D.java +58 -0
  165. data/src/toxi/geom/Shape2D.java +94 -0
  166. data/src/toxi/geom/Shape3D.java +42 -0
  167. data/src/toxi/geom/SingularMatrixException.java +57 -0
  168. data/src/toxi/geom/SpatialBins.java +182 -0
  169. data/src/toxi/geom/SpatialIndex.java +61 -0
  170. data/src/toxi/geom/Sphere.java +224 -0
  171. data/src/toxi/geom/SphereIntersectorReflector.java +196 -0
  172. data/src/toxi/geom/Spline2D.java +349 -0
  173. data/src/toxi/geom/Spline3D.java +351 -0
  174. data/src/toxi/geom/SutherlandHodgemanClipper.java +151 -0
  175. data/src/toxi/geom/Triangle2D.java +422 -0
  176. data/src/toxi/geom/Triangle3D.java +456 -0
  177. data/src/toxi/geom/TriangleIntersector.java +105 -0
  178. data/src/toxi/geom/Vec2D.java +1328 -0
  179. data/src/toxi/geom/Vec3D.java +1832 -0
  180. data/src/toxi/geom/Vec4D.java +985 -0
  181. data/src/toxi/geom/VecMathUtil.java +100 -0
  182. data/src/toxi/geom/XAxisCylinder.java +64 -0
  183. data/src/toxi/geom/YAxisCylinder.java +65 -0
  184. data/src/toxi/geom/ZAxisCylinder.java +64 -0
  185. data/src/toxi/geom/mesh/BezierPatch.java +200 -0
  186. data/src/toxi/geom/mesh/BoxSelector.java +62 -0
  187. data/src/toxi/geom/mesh/DefaultSTLColorModel.java +67 -0
  188. data/src/toxi/geom/mesh/DefaultSelector.java +50 -0
  189. data/src/toxi/geom/mesh/Face.java +176 -0
  190. data/src/toxi/geom/mesh/LaplacianSmooth.java +80 -0
  191. data/src/toxi/geom/mesh/MaterialiseSTLColorModel.java +150 -0
  192. data/src/toxi/geom/mesh/Mesh3D.java +224 -0
  193. data/src/toxi/geom/mesh/MeshIntersector.java +91 -0
  194. data/src/toxi/geom/mesh/OBJWriter.java +194 -0
  195. data/src/toxi/geom/mesh/PLYWriter.java +167 -0
  196. data/src/toxi/geom/mesh/PlaneSelector.java +90 -0
  197. data/src/toxi/geom/mesh/STLColorModel.java +54 -0
  198. data/src/toxi/geom/mesh/STLReader.java +185 -0
  199. data/src/toxi/geom/mesh/STLWriter.java +323 -0
  200. data/src/toxi/geom/mesh/SphereFunction.java +156 -0
  201. data/src/toxi/geom/mesh/SphericalHarmonics.java +110 -0
  202. data/src/toxi/geom/mesh/SuperEllipsoid.java +110 -0
  203. data/src/toxi/geom/mesh/SurfaceFunction.java +75 -0
  204. data/src/toxi/geom/mesh/SurfaceMeshBuilder.java +149 -0
  205. data/src/toxi/geom/mesh/Terrain.java +451 -0
  206. data/src/toxi/geom/mesh/TriangleMesh.java +1201 -0
  207. data/src/toxi/geom/mesh/Vertex.java +78 -0
  208. data/src/toxi/geom/mesh/VertexSelector.java +193 -0
  209. data/src/toxi/geom/mesh/WEFace.java +100 -0
  210. data/src/toxi/geom/mesh/WEMeshFilterStrategy.java +51 -0
  211. data/src/toxi/geom/mesh/WETriangleMesh.java +761 -0
  212. data/src/toxi/geom/mesh/WEVertex.java +134 -0
  213. data/src/toxi/geom/mesh/WingedEdge.java +115 -0
  214. data/src/toxi/geom/mesh/subdiv/CentroidSubdiv.java +37 -0
  215. data/src/toxi/geom/mesh/subdiv/DisplacementSubdivision.java +85 -0
  216. data/src/toxi/geom/mesh/subdiv/DualDisplacementSubdivision.java +94 -0
  217. data/src/toxi/geom/mesh/subdiv/DualSubdivision.java +49 -0
  218. data/src/toxi/geom/mesh/subdiv/EdgeLengthComparator.java +50 -0
  219. data/src/toxi/geom/mesh/subdiv/FaceCountComparator.java +51 -0
  220. data/src/toxi/geom/mesh/subdiv/MidpointDisplacementSubdivision.java +80 -0
  221. data/src/toxi/geom/mesh/subdiv/MidpointSubdiv.java +42 -0
  222. data/src/toxi/geom/mesh/subdiv/MidpointSubdivision.java +48 -0
  223. data/src/toxi/geom/mesh/subdiv/NewSubdivStrategy.java +23 -0
  224. data/src/toxi/geom/mesh/subdiv/NormalDisplacementSubdivision.java +74 -0
  225. data/src/toxi/geom/mesh/subdiv/SubdivisionStrategy.java +83 -0
  226. data/src/toxi/geom/mesh/subdiv/TriSubdivision.java +51 -0
  227. data/src/toxi/geom/mesh2d/DelaunayTriangle.java +222 -0
  228. data/src/toxi/geom/mesh2d/DelaunayTriangulation.java +327 -0
  229. data/src/toxi/geom/mesh2d/DelaunayVertex.java +560 -0
  230. data/src/toxi/geom/mesh2d/Voronoi.java +149 -0
  231. data/src/toxi/geom/nurbs/BasicNurbsCurve.java +210 -0
  232. data/src/toxi/geom/nurbs/BasicNurbsSurface.java +233 -0
  233. data/src/toxi/geom/nurbs/ControlNet.java +148 -0
  234. data/src/toxi/geom/nurbs/CurveCreator.java +112 -0
  235. data/src/toxi/geom/nurbs/CurveUtils.java +259 -0
  236. data/src/toxi/geom/nurbs/InterpolationException.java +65 -0
  237. data/src/toxi/geom/nurbs/KnotVector.java +333 -0
  238. data/src/toxi/geom/nurbs/NurbsCreator.java +815 -0
  239. data/src/toxi/geom/nurbs/NurbsCurve.java +120 -0
  240. data/src/toxi/geom/nurbs/NurbsMeshCreator.java +145 -0
  241. data/src/toxi/geom/nurbs/NurbsSurface.java +147 -0
  242. data/src/toxi/image/util/Filter8bit.java +331 -0
  243. data/src/toxi/image/util/TiledFrameExporter.java +162 -0
  244. data/src/toxi/math/BezierInterpolation.java +102 -0
  245. data/src/toxi/math/CircularInterpolation.java +88 -0
  246. data/src/toxi/math/CosineInterpolation.java +51 -0
  247. data/src/toxi/math/DecimatedInterpolation.java +77 -0
  248. data/src/toxi/math/ExponentialInterpolation.java +68 -0
  249. data/src/toxi/math/InterpolateStrategy.java +60 -0
  250. data/src/toxi/math/Interpolation2D.java +93 -0
  251. data/src/toxi/math/LinearInterpolation.java +46 -0
  252. data/src/toxi/math/MathUtils.java +990 -0
  253. data/src/toxi/math/NonLinearScaleMap.java +101 -0
  254. data/src/toxi/math/ScaleMap.java +183 -0
  255. data/src/toxi/math/SigmoidInterpolation.java +78 -0
  256. data/src/toxi/math/SinCosLUT.java +141 -0
  257. data/src/toxi/math/ThresholdInterpolation.java +58 -0
  258. data/src/toxi/math/ZoomLensInterpolation.java +126 -0
  259. data/src/toxi/math/conversion/UnitTranslator.java +161 -0
  260. data/src/toxi/math/noise/PerlinNoise.java +281 -0
  261. data/src/toxi/math/noise/SimplexNoise.java +542 -0
  262. data/src/toxi/math/waves/AMFMSineWave.java +143 -0
  263. data/src/toxi/math/waves/AbstractWave.java +248 -0
  264. data/src/toxi/math/waves/ConstantWave.java +48 -0
  265. data/src/toxi/math/waves/FMHarmonicSquareWave.java +155 -0
  266. data/src/toxi/math/waves/FMSawtoothWave.java +144 -0
  267. data/src/toxi/math/waves/FMSineWave.java +142 -0
  268. data/src/toxi/math/waves/FMSquareWave.java +143 -0
  269. data/src/toxi/math/waves/FMTriangleWave.java +126 -0
  270. data/src/toxi/math/waves/SineWave.java +81 -0
  271. data/src/toxi/math/waves/Wave2D.java +68 -0
  272. data/src/toxi/math/waves/WaveState.java +69 -0
  273. data/src/toxi/music/scale/AbstractScale.java +117 -0
  274. data/src/toxi/music/scale/GenericScale.java +66 -0
  275. data/src/toxi/music/scale/MajorScale.java +41 -0
  276. data/src/toxi/newmesh/AttributedEdge.java +106 -0
  277. data/src/toxi/newmesh/AttributedFace.java +63 -0
  278. data/src/toxi/newmesh/IndexedTriangleMesh.java +809 -0
  279. data/src/toxi/newmesh/MeshAttributeCompiler.java +45 -0
  280. data/src/toxi/newmesh/MeshFaceNormalCompiler.java +52 -0
  281. data/src/toxi/newmesh/MeshUVCompiler.java +52 -0
  282. data/src/toxi/newmesh/MeshVertexColorCompiler.java +49 -0
  283. data/src/toxi/newmesh/MeshVertexCompiler.java +54 -0
  284. data/src/toxi/newmesh/MeshVertexNormalCompiler.java +55 -0
  285. data/src/toxi/newmesh/SpatialIndex.java +78 -0
  286. data/src/toxi/physics2d/ParticlePath2D.java +100 -0
  287. data/src/toxi/physics2d/ParticleString2D.java +184 -0
  288. data/src/toxi/physics2d/PullBackSpring2D.java +51 -0
  289. data/src/toxi/physics2d/VerletConstrainedSpring2D.java +89 -0
  290. data/src/toxi/physics2d/VerletMinDistanceSpring2D.java +57 -0
  291. data/src/toxi/physics2d/VerletParticle2D.java +457 -0
  292. data/src/toxi/physics2d/VerletPhysics2D.java +448 -0
  293. data/src/toxi/physics2d/VerletSpring2D.java +181 -0
  294. data/src/toxi/physics2d/behaviors/AttractionBehavior2D.java +212 -0
  295. data/src/toxi/physics2d/behaviors/ConstantForceBehavior2D.java +112 -0
  296. data/src/toxi/physics2d/behaviors/GravityBehavior2D.java +61 -0
  297. data/src/toxi/physics2d/behaviors/ParticleBehavior2D.java +66 -0
  298. data/src/toxi/physics2d/constraints/AngularConstraint.java +83 -0
  299. data/src/toxi/physics2d/constraints/AxisConstraint.java +71 -0
  300. data/src/toxi/physics2d/constraints/CircularConstraint.java +69 -0
  301. data/src/toxi/physics2d/constraints/MaxConstraint.java +66 -0
  302. data/src/toxi/physics2d/constraints/MinConstraint.java +66 -0
  303. data/src/toxi/physics2d/constraints/ParticleConstraint2D.java +47 -0
  304. data/src/toxi/physics2d/constraints/PolygonConstraint.java +93 -0
  305. data/src/toxi/physics2d/constraints/RectConstraint.java +114 -0
  306. data/src/toxi/physics3d/ParticlePath3D.java +100 -0
  307. data/src/toxi/physics3d/ParticleString3D.java +184 -0
  308. data/src/toxi/physics3d/PullBackSpring3D.java +50 -0
  309. data/src/toxi/physics3d/VerletConstrainedSpring3D.java +88 -0
  310. data/src/toxi/physics3d/VerletMinDistanceSpring3D.java +56 -0
  311. data/src/toxi/physics3d/VerletParticle3D.java +385 -0
  312. data/src/toxi/physics3d/VerletPhysics3D.java +417 -0
  313. data/src/toxi/physics3d/VerletSpring3D.java +180 -0
  314. data/src/toxi/physics3d/behaviors/AttractionBehavior3D.java +182 -0
  315. data/src/toxi/physics3d/behaviors/ConstantForceBehavior3D.java +92 -0
  316. data/src/toxi/physics3d/behaviors/GravityBehavior3D.java +61 -0
  317. data/src/toxi/physics3d/behaviors/ParticleBehavior3D.java +52 -0
  318. data/src/toxi/physics3d/constraints/AxisConstraint.java +68 -0
  319. data/src/toxi/physics3d/constraints/BoxConstraint.java +121 -0
  320. data/src/toxi/physics3d/constraints/CylinderConstraint.java +87 -0
  321. data/src/toxi/physics3d/constraints/MaxConstraint.java +65 -0
  322. data/src/toxi/physics3d/constraints/MinConstraint.java +65 -0
  323. data/src/toxi/physics3d/constraints/ParticleConstraint3D.java +49 -0
  324. data/src/toxi/physics3d/constraints/PlaneConstraint.java +78 -0
  325. data/src/toxi/physics3d/constraints/SoftBoxConstraint.java +87 -0
  326. data/src/toxi/physics3d/constraints/SphereConstraint.java +108 -0
  327. data/src/toxi/processing/ArrowModifier.java +116 -0
  328. data/src/toxi/processing/DashedLineModifier.java +48 -0
  329. data/src/toxi/processing/DeltaOrientationMapper.java +57 -0
  330. data/src/toxi/processing/Line2DRenderModifier.java +18 -0
  331. data/src/toxi/processing/MeshToVBO.java +127 -0
  332. data/src/toxi/processing/NormalMapper.java +18 -0
  333. data/src/toxi/processing/POVInterface.java +121 -0
  334. data/src/toxi/processing/POVMesh.java +219 -0
  335. data/src/toxi/processing/POVWriter.java +460 -0
  336. data/src/toxi/processing/RCOpaque.java +77 -0
  337. data/src/toxi/processing/RCTransp.java +78 -0
  338. data/src/toxi/processing/TextureBuilder.java +232 -0
  339. data/src/toxi/processing/Textures.java +110 -0
  340. data/src/toxi/processing/ToxiclibsSupport.java +1239 -0
  341. data/src/toxi/processing/Tracing.java +25 -0
  342. data/src/toxi/processing/XYZNormalMapper.java +30 -0
  343. data/src/toxi/sim/automata/CAMatrix.java +297 -0
  344. data/src/toxi/sim/automata/CARule.java +76 -0
  345. data/src/toxi/sim/automata/CARule2D.java +354 -0
  346. data/src/toxi/sim/automata/CAWolfram1D.java +309 -0
  347. data/src/toxi/sim/automata/EvolvableMatrix.java +61 -0
  348. data/src/toxi/sim/automata/MatrixEvolver.java +42 -0
  349. data/src/toxi/sim/dla/BottomUpOrder.java +76 -0
  350. data/src/toxi/sim/dla/DLA.java +497 -0
  351. data/src/toxi/sim/dla/DLAConfiguration.java +364 -0
  352. data/src/toxi/sim/dla/DLAEventAdapter.java +64 -0
  353. data/src/toxi/sim/dla/DLAEventListener.java +57 -0
  354. data/src/toxi/sim/dla/DLAGuideLines.java +219 -0
  355. data/src/toxi/sim/dla/DLAParticle.java +102 -0
  356. data/src/toxi/sim/dla/DLASegment.java +88 -0
  357. data/src/toxi/sim/dla/PipelineOrder.java +50 -0
  358. data/src/toxi/sim/dla/RadialDistanceOrder.java +92 -0
  359. data/src/toxi/sim/erosion/ErosionFunction.java +122 -0
  360. data/src/toxi/sim/erosion/TalusAngleErosion.java +145 -0
  361. data/src/toxi/sim/erosion/ThermalErosion.java +75 -0
  362. data/src/toxi/sim/fluids/FluidSolver2D.java +762 -0
  363. data/src/toxi/sim/fluids/FluidSolver3D.java +326 -0
  364. data/src/toxi/sim/grayscott/GrayScott.java +469 -0
  365. data/src/toxi/util/DateUtils.java +141 -0
  366. data/src/toxi/util/FileSequenceDescriptor.java +181 -0
  367. data/src/toxi/util/FileUtils.java +467 -0
  368. data/src/toxi/util/datatypes/ArraySet.java +128 -0
  369. data/src/toxi/util/datatypes/ArrayUtil.java +404 -0
  370. data/src/toxi/util/datatypes/BiasedDoubleRange.java +141 -0
  371. data/src/toxi/util/datatypes/BiasedFloatRange.java +141 -0
  372. data/src/toxi/util/datatypes/BiasedIntegerRange.java +141 -0
  373. data/src/toxi/util/datatypes/DoubleRange.java +251 -0
  374. data/src/toxi/util/datatypes/FloatRange.java +251 -0
  375. data/src/toxi/util/datatypes/GenericSet.java +215 -0
  376. data/src/toxi/util/datatypes/IntegerRange.java +247 -0
  377. data/src/toxi/util/datatypes/IntegerSet.java +149 -0
  378. data/src/toxi/util/datatypes/ItemIndex.java +72 -0
  379. data/src/toxi/util/datatypes/SingletonRegistry.java +91 -0
  380. data/src/toxi/util/datatypes/TypedProperties.java +291 -0
  381. data/src/toxi/util/datatypes/UndirectedGraph.java +134 -0
  382. data/src/toxi/util/datatypes/UniqueItemIndex.java +223 -0
  383. data/src/toxi/util/datatypes/WeightedRandomEntry.java +76 -0
  384. data/src/toxi/util/datatypes/WeightedRandomSet.java +125 -0
  385. data/src/toxi/util/events/EventDispatcher.java +86 -0
  386. data/src/toxi/volume/AdditiveBrush.java +19 -0
  387. data/src/toxi/volume/ArrayIsoSurface.java +297 -0
  388. data/src/toxi/volume/BoxBrush.java +100 -0
  389. data/src/toxi/volume/BrushMode.java +16 -0
  390. data/src/toxi/volume/HashIsoSurface.java +354 -0
  391. data/src/toxi/volume/IsoSurface.java +59 -0
  392. data/src/toxi/volume/MarchingCubesIndex.java +312 -0
  393. data/src/toxi/volume/MeshLatticeBuilder.java +358 -0
  394. data/src/toxi/volume/MeshVoxelizer.java +216 -0
  395. data/src/toxi/volume/MultiplyBrush.java +20 -0
  396. data/src/toxi/volume/PeakBrush.java +21 -0
  397. data/src/toxi/volume/ReplaceBrush.java +19 -0
  398. data/src/toxi/volume/RoundBrush.java +113 -0
  399. data/src/toxi/volume/VolumetricBrush.java +160 -0
  400. data/src/toxi/volume/VolumetricHashMap.java +179 -0
  401. data/src/toxi/volume/VolumetricSpace.java +195 -0
  402. data/src/toxi/volume/VolumetricSpaceArray.java +214 -0
  403. data/toxiclibs.gemspec +28 -0
  404. 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
+ }