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