toxiclibs 1.0.0 → 2.0.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 (368) hide show
  1. checksums.yaml +4 -4
  2. data/.mvn/extensions.xml +1 -1
  3. data/.travis.yml +3 -4
  4. data/CHANGELOG.md +3 -0
  5. data/README.md +2 -2
  6. data/Rakefile +0 -1
  7. data/examples/attract_repel/attractor.rb +1 -1
  8. data/examples/attract_repel/particle.rb +1 -1
  9. data/examples/boolean_shapes.rb +9 -5
  10. data/examples/force_directed/node.rb +1 -1
  11. data/examples/inflate_mesh.rb +1 -1
  12. data/examples/model_align.rb +1 -1
  13. data/examples/physics_type.rb +1 -1
  14. data/examples/povmesh/ftest.rb +3 -3
  15. data/examples/toxiclibs_color_theme.rb +91 -0
  16. data/lib/toxiclibs.rb +52 -37
  17. data/lib/toxiclibs/version.rb +1 -1
  18. data/pom.rb +22 -26
  19. data/pom.xml +42 -64
  20. data/src/{toxi → main/java/toxi}/color/AccessCriteria.java +0 -0
  21. data/src/{toxi → main/java/toxi}/color/AlphaAccessor.java +0 -0
  22. data/src/{toxi → main/java/toxi}/color/CMYKAccessor.java +0 -0
  23. data/src/{toxi → main/java/toxi}/color/CMYKDistanceProxy.java +0 -0
  24. data/src/{toxi → main/java/toxi}/color/ColorGradient.java +0 -0
  25. data/src/{toxi → main/java/toxi}/color/ColorList.java +2 -4
  26. data/src/{toxi → main/java/toxi}/color/ColorRange.java +0 -0
  27. data/src/{toxi → main/java/toxi}/color/ColorTheme.java +0 -0
  28. data/src/{toxi → main/java/toxi}/color/DistanceProxy.java +0 -0
  29. data/src/{toxi → main/java/toxi}/color/HSVAccessor.java +0 -0
  30. data/src/{toxi → main/java/toxi}/color/HSVDistanceProxy.java +0 -0
  31. data/src/{toxi → main/java/toxi}/color/HistEntry.java +0 -0
  32. data/src/{toxi → main/java/toxi}/color/Histogram.java +0 -0
  33. data/src/{toxi → main/java/toxi}/color/Hue.java +0 -0
  34. data/src/{toxi → main/java/toxi}/color/LuminanceAccessor.java +0 -0
  35. data/src/{toxi → main/java/toxi}/color/NamedColor.java +0 -0
  36. data/src/{toxi → main/java/toxi}/color/ProximityComparator.java +0 -0
  37. data/src/{toxi → main/java/toxi}/color/RGBAccessor.java +0 -0
  38. data/src/{toxi → main/java/toxi}/color/RGBDistanceProxy.java +0 -0
  39. data/src/{toxi → main/java/toxi}/color/ReadonlyTColor.java +0 -0
  40. data/src/{toxi → main/java/toxi}/color/TColor.java +0 -0
  41. data/src/{toxi → main/java/toxi}/color/TColorAdapter.java +4 -4
  42. data/src/{toxi → main/java/toxi}/color/ToneMap.java +0 -0
  43. data/src/{toxi → main/java/toxi}/color/theory/AnalogousStrategy.java +0 -0
  44. data/src/{toxi → main/java/toxi}/color/theory/ColorTheoryRegistry.java +0 -0
  45. data/src/{toxi → main/java/toxi}/color/theory/ColorTheoryStrategy.java +0 -0
  46. data/src/{toxi → main/java/toxi}/color/theory/ComplementaryStrategy.java +0 -0
  47. data/src/{toxi → main/java/toxi}/color/theory/CompoundTheoryStrategy.java +0 -0
  48. data/src/{toxi → main/java/toxi}/color/theory/LeftSplitComplementaryStrategy.java +0 -0
  49. data/src/{toxi → main/java/toxi}/color/theory/MonochromeTheoryStrategy.java +0 -0
  50. data/src/{toxi → main/java/toxi}/color/theory/RightSplitComplementaryStrategy.java +0 -0
  51. data/src/{toxi → main/java/toxi}/color/theory/SingleComplementStrategy.java +0 -0
  52. data/src/{toxi → main/java/toxi}/color/theory/SplitComplementaryStrategy.java +0 -0
  53. data/src/{toxi → main/java/toxi}/color/theory/TetradTheoryStrategy.java +0 -0
  54. data/src/{toxi → main/java/toxi}/color/theory/TriadTheoryStrategy.java +0 -0
  55. data/src/{toxi → main/java/toxi}/data/csv/CSVAdapter.java +0 -0
  56. data/src/{toxi → main/java/toxi}/data/csv/CSVFieldMapper.java +0 -0
  57. data/src/{toxi → main/java/toxi}/data/csv/CSVListener.java +0 -0
  58. data/src/{toxi → main/java/toxi}/data/csv/CSVParser.java +0 -0
  59. data/src/{toxi → main/java/toxi}/data/feeds/AtomAuthor.java +2 -2
  60. data/src/{toxi → main/java/toxi}/data/feeds/AtomContent.java +3 -4
  61. data/src/{toxi → main/java/toxi}/data/feeds/AtomEntry.java +9 -13
  62. data/src/main/java/toxi/data/feeds/AtomFeed.java +91 -0
  63. data/src/{toxi → main/java/toxi}/data/feeds/AtomLink.java +3 -2
  64. data/src/{toxi → main/java/toxi}/data/feeds/RSSChannel.java +10 -11
  65. data/src/{toxi → main/java/toxi}/data/feeds/RSSEnclosure.java +3 -3
  66. data/src/{toxi → main/java/toxi}/data/feeds/RSSItem.java +11 -13
  67. data/src/{toxi → main/java/toxi}/data/feeds/util/EntityStripper.java +0 -0
  68. data/src/{toxi → main/java/toxi}/data/feeds/util/Iso8601DateAdapter.java +6 -7
  69. data/src/{toxi → main/java/toxi}/data/feeds/util/Rfc822DateAdapter.java +5 -6
  70. data/src/{toxi → main/java/toxi}/geom/AABB.java +8 -9
  71. data/src/{toxi → main/java/toxi}/geom/Axis3D.java +0 -0
  72. data/src/{toxi → main/java/toxi}/geom/AxisAlignedCylinder.java +0 -0
  73. data/src/{toxi → main/java/toxi}/geom/BernsteinPolynomial.java +0 -0
  74. data/src/{toxi → main/java/toxi}/geom/BezierCurve2D.java +0 -0
  75. data/src/{toxi → main/java/toxi}/geom/BezierCurve3D.java +0 -0
  76. data/src/{toxi → main/java/toxi}/geom/BooleanShapeBuilder.java +0 -0
  77. data/src/{toxi → main/java/toxi}/geom/BoxIntersector.java +0 -0
  78. data/src/{toxi → main/java/toxi}/geom/Circle.java +2 -2
  79. data/src/{toxi → main/java/toxi}/geom/CircleIntersector.java +0 -0
  80. data/src/{toxi → main/java/toxi}/geom/Cone.java +0 -0
  81. data/src/{toxi → main/java/toxi}/geom/ConvexPolygonClipper.java +0 -0
  82. data/src/{toxi → main/java/toxi}/geom/CoordinateExtractor.java +0 -0
  83. data/src/{toxi → main/java/toxi}/geom/Ellipse.java +0 -0
  84. data/src/{toxi → main/java/toxi}/geom/GMatrix.java +0 -0
  85. data/src/{toxi → main/java/toxi}/geom/GVector.java +0 -0
  86. data/src/{toxi → main/java/toxi}/geom/GlobalGridTesselator.java +0 -0
  87. data/src/{toxi → main/java/toxi}/geom/GridTesselator.java +0 -0
  88. data/src/{toxi → main/java/toxi}/geom/Intersector2D.java +0 -0
  89. data/src/{toxi → main/java/toxi}/geom/Intersector3D.java +0 -0
  90. data/src/{toxi → main/java/toxi}/geom/IsectData2D.java +0 -0
  91. data/src/{toxi → main/java/toxi}/geom/IsectData3D.java +0 -0
  92. data/src/{toxi → main/java/toxi}/geom/Line2D.java +1 -2
  93. data/src/{toxi → main/java/toxi}/geom/Line3D.java +1 -2
  94. data/src/{toxi → main/java/toxi}/geom/LineStrip2D.java +2 -2
  95. data/src/{toxi → main/java/toxi}/geom/LineStrip3D.java +2 -2
  96. data/src/{toxi → main/java/toxi}/geom/LocalGridTesselator.java +0 -0
  97. data/src/{toxi → main/java/toxi}/geom/Matrix3d.java +0 -0
  98. data/src/{toxi → main/java/toxi}/geom/Matrix4f.java +0 -0
  99. data/src/{toxi → main/java/toxi}/geom/Matrix4x4.java +0 -0
  100. data/src/{toxi → main/java/toxi}/geom/MatrixSizeException.java +0 -0
  101. data/src/{toxi → main/java/toxi}/geom/OctreeVisitor.java +0 -0
  102. data/src/{toxi → main/java/toxi}/geom/Origin3D.java +12 -6
  103. data/src/{toxi → main/java/toxi}/geom/Plane.java +3 -5
  104. data/src/{toxi → main/java/toxi}/geom/PlaneIntersector.java +0 -0
  105. data/src/{toxi → main/java/toxi}/geom/PointCloud3D.java +15 -12
  106. data/src/{toxi → main/java/toxi}/geom/PointOctree.java +0 -0
  107. data/src/{toxi → main/java/toxi}/geom/PointQuadtree.java +0 -0
  108. data/src/{toxi → main/java/toxi}/geom/Polygon2D.java +34 -45
  109. data/src/{toxi → main/java/toxi}/geom/PolygonClipper2D.java +0 -0
  110. data/src/{toxi → main/java/toxi}/geom/PolygonTesselator.java +0 -0
  111. data/src/{toxi → main/java/toxi}/geom/QuadtreeVisitor.java +0 -0
  112. data/src/{toxi → main/java/toxi}/geom/Quaternion.java +3 -5
  113. data/src/{toxi → main/java/toxi}/geom/Ray2D.java +4 -5
  114. data/src/{toxi → main/java/toxi}/geom/Ray3D.java +3 -5
  115. data/src/{toxi → main/java/toxi}/geom/Ray3DIntersector.java +0 -0
  116. data/src/{toxi → main/java/toxi}/geom/ReadonlyVec2D.java +0 -0
  117. data/src/{toxi → main/java/toxi}/geom/ReadonlyVec3D.java +0 -0
  118. data/src/{toxi → main/java/toxi}/geom/ReadonlyVec4D.java +0 -0
  119. data/src/{toxi → main/java/toxi}/geom/Rect.java +3 -5
  120. data/src/{toxi → main/java/toxi}/geom/Reflector3D.java +0 -0
  121. data/src/{toxi → main/java/toxi}/geom/Shape2D.java +0 -0
  122. data/src/{toxi → main/java/toxi}/geom/Shape3D.java +0 -0
  123. data/src/{toxi → main/java/toxi}/geom/SingularMatrixException.java +0 -0
  124. data/src/{toxi → main/java/toxi}/geom/SpatialBins.java +0 -0
  125. data/src/{toxi → main/java/toxi}/geom/SpatialIndex.java +0 -0
  126. data/src/{toxi → main/java/toxi}/geom/Sphere.java +3 -5
  127. data/src/{toxi → main/java/toxi}/geom/SphereIntersectorReflector.java +0 -0
  128. data/src/{toxi → main/java/toxi}/geom/Spline2D.java +12 -16
  129. data/src/{toxi → main/java/toxi}/geom/Spline3D.java +12 -16
  130. data/src/{toxi → main/java/toxi}/geom/SutherlandHodgemanClipper.java +0 -0
  131. data/src/{toxi → main/java/toxi}/geom/Triangle2D.java +4 -7
  132. data/src/{toxi → main/java/toxi}/geom/Triangle3D.java +5 -8
  133. data/src/{toxi → main/java/toxi}/geom/TriangleIntersector.java +0 -0
  134. data/src/{toxi → main/java/toxi}/geom/Vec2D.java +3 -3
  135. data/src/{toxi → main/java/toxi}/geom/Vec3D.java +4 -4
  136. data/src/{toxi → main/java/toxi}/geom/Vec4D.java +5 -5
  137. data/src/{toxi → main/java/toxi}/geom/VecMathUtil.java +0 -0
  138. data/src/{toxi → main/java/toxi}/geom/XAxisCylinder.java +0 -0
  139. data/src/{toxi → main/java/toxi}/geom/YAxisCylinder.java +0 -0
  140. data/src/{toxi → main/java/toxi}/geom/ZAxisCylinder.java +0 -0
  141. data/src/{toxi → main/java/toxi}/geom/mesh/BezierPatch.java +0 -0
  142. data/src/{toxi → main/java/toxi}/geom/mesh/BoxSelector.java +0 -0
  143. data/src/{toxi → main/java/toxi}/geom/mesh/DefaultSTLColorModel.java +0 -0
  144. data/src/{toxi → main/java/toxi}/geom/mesh/DefaultSelector.java +0 -0
  145. data/src/{toxi → main/java/toxi}/geom/mesh/Face.java +0 -0
  146. data/src/{toxi → main/java/toxi}/geom/mesh/LaplacianSmooth.java +0 -0
  147. data/src/{toxi → main/java/toxi}/geom/mesh/MaterialiseSTLColorModel.java +0 -0
  148. data/src/{toxi → main/java/toxi}/geom/mesh/Mesh3D.java +0 -0
  149. data/src/{toxi → main/java/toxi}/geom/mesh/MeshIntersector.java +0 -0
  150. data/src/{toxi → main/java/toxi}/geom/mesh/OBJWriter.java +0 -0
  151. data/src/{toxi → main/java/toxi}/geom/mesh/PLYWriter.java +0 -0
  152. data/src/{toxi → main/java/toxi}/geom/mesh/PlaneSelector.java +0 -0
  153. data/src/{toxi → main/java/toxi}/geom/mesh/STLColorModel.java +0 -0
  154. data/src/{toxi → main/java/toxi}/geom/mesh/STLReader.java +0 -0
  155. data/src/{toxi → main/java/toxi}/geom/mesh/STLWriter.java +0 -0
  156. data/src/{toxi → main/java/toxi}/geom/mesh/SphereFunction.java +0 -0
  157. data/src/{toxi → main/java/toxi}/geom/mesh/SphericalHarmonics.java +0 -0
  158. data/src/{toxi → main/java/toxi}/geom/mesh/SuperEllipsoid.java +0 -0
  159. data/src/{toxi → main/java/toxi}/geom/mesh/SurfaceFunction.java +0 -0
  160. data/src/{toxi → main/java/toxi}/geom/mesh/SurfaceMeshBuilder.java +0 -0
  161. data/src/{toxi → main/java/toxi}/geom/mesh/Terrain.java +0 -0
  162. data/src/{toxi → main/java/toxi}/geom/mesh/TriangleMesh.java +0 -0
  163. data/src/{toxi → main/java/toxi}/geom/mesh/Vertex.java +0 -0
  164. data/src/{toxi → main/java/toxi}/geom/mesh/VertexSelector.java +0 -0
  165. data/src/{toxi → main/java/toxi}/geom/mesh/WEFace.java +0 -0
  166. data/src/{toxi → main/java/toxi}/geom/mesh/WEMeshFilterStrategy.java +0 -0
  167. data/src/{toxi → main/java/toxi}/geom/mesh/WETriangleMesh.java +0 -0
  168. data/src/{toxi → main/java/toxi}/geom/mesh/WEVertex.java +0 -0
  169. data/src/{toxi → main/java/toxi}/geom/mesh/WingedEdge.java +2 -2
  170. data/src/{toxi → main/java/toxi}/geom/mesh/subdiv/CentroidSubdiv.java +0 -0
  171. data/src/{toxi → main/java/toxi}/geom/mesh/subdiv/DisplacementSubdivision.java +0 -0
  172. data/src/{toxi → main/java/toxi}/geom/mesh/subdiv/DualDisplacementSubdivision.java +0 -0
  173. data/src/{toxi → main/java/toxi}/geom/mesh/subdiv/DualSubdivision.java +0 -0
  174. data/src/{toxi → main/java/toxi}/geom/mesh/subdiv/EdgeLengthComparator.java +0 -0
  175. data/src/{toxi → main/java/toxi}/geom/mesh/subdiv/FaceCountComparator.java +0 -0
  176. data/src/{toxi → main/java/toxi}/geom/mesh/subdiv/MidpointDisplacementSubdivision.java +0 -0
  177. data/src/{toxi → main/java/toxi}/geom/mesh/subdiv/MidpointSubdiv.java +0 -0
  178. data/src/{toxi → main/java/toxi}/geom/mesh/subdiv/MidpointSubdivision.java +0 -0
  179. data/src/{toxi → main/java/toxi}/geom/mesh/subdiv/NewSubdivStrategy.java +0 -0
  180. data/src/{toxi → main/java/toxi}/geom/mesh/subdiv/NormalDisplacementSubdivision.java +0 -0
  181. data/src/{toxi → main/java/toxi}/geom/mesh/subdiv/SubdivisionStrategy.java +0 -0
  182. data/src/{toxi → main/java/toxi}/geom/mesh/subdiv/TriSubdivision.java +0 -0
  183. data/src/{toxi → main/java/toxi}/geom/mesh2d/DelaunayTriangle.java +0 -0
  184. data/src/{toxi → main/java/toxi}/geom/mesh2d/DelaunayTriangulation.java +5 -7
  185. data/src/{toxi → main/java/toxi}/geom/mesh2d/DelaunayVertex.java +0 -0
  186. data/src/{toxi → main/java/toxi}/geom/mesh2d/Voronoi.java +0 -0
  187. data/src/{toxi → main/java/toxi}/geom/nurbs/BasicNurbsCurve.java +0 -0
  188. data/src/{toxi → main/java/toxi}/geom/nurbs/BasicNurbsSurface.java +0 -0
  189. data/src/{toxi → main/java/toxi}/geom/nurbs/ControlNet.java +0 -0
  190. data/src/{toxi → main/java/toxi}/geom/nurbs/CurveCreator.java +0 -0
  191. data/src/{toxi → main/java/toxi}/geom/nurbs/CurveUtils.java +0 -0
  192. data/src/{toxi → main/java/toxi}/geom/nurbs/InterpolationException.java +0 -0
  193. data/src/{toxi → main/java/toxi}/geom/nurbs/KnotVector.java +0 -0
  194. data/src/{toxi → main/java/toxi}/geom/nurbs/NurbsCreator.java +2 -2
  195. data/src/{toxi → main/java/toxi}/geom/nurbs/NurbsCurve.java +0 -0
  196. data/src/{toxi → main/java/toxi}/geom/nurbs/NurbsMeshCreator.java +0 -0
  197. data/src/{toxi → main/java/toxi}/geom/nurbs/NurbsSurface.java +0 -0
  198. data/src/{toxi → main/java/toxi}/image/util/Filter8bit.java +0 -0
  199. data/src/{toxi → main/java/toxi}/image/util/TiledFrameExporter.java +0 -0
  200. data/src/{toxi → main/java/toxi}/math/BezierInterpolation.java +0 -0
  201. data/src/{toxi → main/java/toxi}/math/CircularInterpolation.java +0 -0
  202. data/src/{toxi → main/java/toxi}/math/CosineInterpolation.java +0 -0
  203. data/src/{toxi → main/java/toxi}/math/DecimatedInterpolation.java +0 -0
  204. data/src/{toxi → main/java/toxi}/math/ExponentialInterpolation.java +0 -0
  205. data/src/{toxi → main/java/toxi}/math/InterpolateStrategy.java +0 -0
  206. data/src/{toxi → main/java/toxi}/math/Interpolation2D.java +0 -0
  207. data/src/{toxi → main/java/toxi}/math/LinearInterpolation.java +0 -0
  208. data/src/{toxi → main/java/toxi}/math/MathUtils.java +0 -0
  209. data/src/{toxi → main/java/toxi}/math/NonLinearScaleMap.java +0 -0
  210. data/src/{toxi → main/java/toxi}/math/ScaleMap.java +0 -0
  211. data/src/{toxi → main/java/toxi}/math/SigmoidInterpolation.java +0 -0
  212. data/src/{toxi → main/java/toxi}/math/SinCosLUT.java +0 -0
  213. data/src/{toxi → main/java/toxi}/math/ThresholdInterpolation.java +0 -0
  214. data/src/{toxi → main/java/toxi}/math/ZoomLensInterpolation.java +0 -0
  215. data/src/{toxi → main/java/toxi}/math/conversion/UnitTranslator.java +0 -0
  216. data/src/{toxi → main/java/toxi}/math/noise/PerlinNoise.java +0 -0
  217. data/src/{toxi → main/java/toxi}/math/noise/SimplexNoise.java +0 -0
  218. data/src/{toxi → main/java/toxi}/math/waves/AMFMSineWave.java +0 -0
  219. data/src/{toxi → main/java/toxi}/math/waves/AbstractWave.java +0 -0
  220. data/src/{toxi → main/java/toxi}/math/waves/ConstantWave.java +0 -0
  221. data/src/{toxi → main/java/toxi}/math/waves/FMHarmonicSquareWave.java +0 -0
  222. data/src/{toxi → main/java/toxi}/math/waves/FMSawtoothWave.java +0 -0
  223. data/src/{toxi → main/java/toxi}/math/waves/FMSineWave.java +0 -0
  224. data/src/{toxi → main/java/toxi}/math/waves/FMSquareWave.java +0 -0
  225. data/src/{toxi → main/java/toxi}/math/waves/FMTriangleWave.java +0 -0
  226. data/src/{toxi → main/java/toxi}/math/waves/SineWave.java +2 -2
  227. data/src/{toxi → main/java/toxi}/math/waves/Wave2D.java +0 -0
  228. data/src/{toxi → main/java/toxi}/math/waves/WaveState.java +0 -0
  229. data/src/{toxi → main/java/toxi}/music/scale/AbstractScale.java +0 -0
  230. data/src/{toxi → main/java/toxi}/music/scale/GenericScale.java +0 -0
  231. data/src/{toxi → main/java/toxi}/music/scale/MajorScale.java +0 -0
  232. data/src/{toxi → main/java/toxi}/newmesh/AttributedEdge.java +0 -0
  233. data/src/{toxi → main/java/toxi}/newmesh/AttributedFace.java +0 -0
  234. data/src/{toxi → main/java/toxi}/newmesh/IndexedTriangleMesh.java +70 -69
  235. data/src/{toxi → main/java/toxi}/newmesh/MeshAttributeCompiler.java +0 -0
  236. data/src/{toxi → main/java/toxi}/newmesh/MeshFaceNormalCompiler.java +0 -0
  237. data/src/{toxi → main/java/toxi}/newmesh/MeshUVCompiler.java +0 -0
  238. data/src/{toxi → main/java/toxi}/newmesh/MeshVertexColorCompiler.java +0 -0
  239. data/src/{toxi → main/java/toxi}/newmesh/MeshVertexCompiler.java +0 -0
  240. data/src/{toxi → main/java/toxi}/newmesh/MeshVertexNormalCompiler.java +0 -0
  241. data/src/{toxi → main/java/toxi}/newmesh/SpatialIndex.java +0 -0
  242. data/src/{toxi → main/java/toxi}/physics2d/ParticlePath2D.java +4 -3
  243. data/src/{toxi → main/java/toxi}/physics2d/ParticleString2D.java +2 -2
  244. data/src/{toxi → main/java/toxi}/physics2d/PullBackSpring2D.java +0 -0
  245. data/src/{toxi → main/java/toxi}/physics2d/VerletConstrainedSpring2D.java +0 -0
  246. data/src/{toxi → main/java/toxi}/physics2d/VerletMinDistanceSpring2D.java +0 -0
  247. data/src/main/java/toxi/physics2d/VerletParticle2D.java +449 -0
  248. data/src/main/java/toxi/physics2d/VerletPhysics2D.java +440 -0
  249. data/src/{toxi → main/java/toxi}/physics2d/VerletSpring2D.java +0 -0
  250. data/src/main/java/toxi/physics2d/behaviors/AttractionBehavior2D.java +211 -0
  251. data/src/{toxi → main/java/toxi}/physics2d/behaviors/ConstantForceBehavior2D.java +0 -0
  252. data/src/{toxi → main/java/toxi}/physics2d/behaviors/GravityBehavior2D.java +0 -0
  253. data/src/{toxi → main/java/toxi}/physics2d/behaviors/ParticleBehavior2D.java +0 -0
  254. data/src/{toxi → main/java/toxi}/physics2d/constraints/AngularConstraint.java +0 -0
  255. data/src/{toxi → main/java/toxi}/physics2d/constraints/AxisConstraint.java +0 -0
  256. data/src/{toxi → main/java/toxi}/physics2d/constraints/CircularConstraint.java +0 -0
  257. data/src/{toxi → main/java/toxi}/physics2d/constraints/MaxConstraint.java +0 -0
  258. data/src/{toxi → main/java/toxi}/physics2d/constraints/MinConstraint.java +0 -0
  259. data/src/{toxi → main/java/toxi}/physics2d/constraints/ParticleConstraint2D.java +0 -0
  260. data/src/{toxi → main/java/toxi}/physics2d/constraints/PolygonConstraint.java +0 -0
  261. data/src/{toxi → main/java/toxi}/physics2d/constraints/RectConstraint.java +0 -0
  262. data/src/{toxi → main/java/toxi}/physics3d/ParticlePath3D.java +4 -3
  263. data/src/{toxi → main/java/toxi}/physics3d/ParticleString3D.java +2 -2
  264. data/src/{toxi → main/java/toxi}/physics3d/PullBackSpring3D.java +0 -0
  265. data/src/{toxi → main/java/toxi}/physics3d/VerletConstrainedSpring3D.java +0 -0
  266. data/src/{toxi → main/java/toxi}/physics3d/VerletMinDistanceSpring3D.java +0 -0
  267. data/src/main/java/toxi/physics3d/VerletParticle3D.java +377 -0
  268. data/src/{toxi → main/java/toxi}/physics3d/VerletPhysics3D.java +0 -0
  269. data/src/{toxi → main/java/toxi}/physics3d/VerletSpring3D.java +0 -0
  270. data/src/{toxi → main/java/toxi}/physics3d/behaviors/AttractionBehavior3D.java +0 -0
  271. data/src/{toxi → main/java/toxi}/physics3d/behaviors/ConstantForceBehavior3D.java +0 -0
  272. data/src/{toxi → main/java/toxi}/physics3d/behaviors/GravityBehavior3D.java +0 -0
  273. data/src/{toxi → main/java/toxi}/physics3d/behaviors/ParticleBehavior3D.java +0 -0
  274. data/src/{toxi → main/java/toxi}/physics3d/constraints/AxisConstraint.java +1 -0
  275. data/src/{toxi → main/java/toxi}/physics3d/constraints/BoxConstraint.java +0 -0
  276. data/src/{toxi → main/java/toxi}/physics3d/constraints/CylinderConstraint.java +1 -0
  277. data/src/{toxi → main/java/toxi}/physics3d/constraints/MaxConstraint.java +1 -0
  278. data/src/{toxi → main/java/toxi}/physics3d/constraints/MinConstraint.java +1 -0
  279. data/src/{toxi → main/java/toxi}/physics3d/constraints/ParticleConstraint3D.java +0 -0
  280. data/src/{toxi → main/java/toxi}/physics3d/constraints/PlaneConstraint.java +0 -0
  281. data/src/{toxi → main/java/toxi}/physics3d/constraints/SoftBoxConstraint.java +38 -38
  282. data/src/{toxi → main/java/toxi}/physics3d/constraints/SphereConstraint.java +1 -0
  283. data/src/{toxi → main/java/toxi}/processing/ArrowModifier.java +0 -0
  284. data/src/{toxi → main/java/toxi}/processing/DashedLineModifier.java +0 -0
  285. data/src/{toxi → main/java/toxi}/processing/DeltaOrientationMapper.java +0 -0
  286. data/src/{toxi → main/java/toxi}/processing/Line2DRenderModifier.java +0 -0
  287. data/src/{toxi → main/java/toxi}/processing/MeshToVBO.java +0 -0
  288. data/src/{toxi → main/java/toxi}/processing/NormalMapper.java +0 -0
  289. data/src/{toxi → main/java/toxi}/processing/POVInterface.java +0 -0
  290. data/src/{toxi → main/java/toxi}/processing/POVMesh.java +0 -0
  291. data/src/{toxi → main/java/toxi}/processing/POVWriter.java +0 -0
  292. data/src/{toxi → main/java/toxi}/processing/RCOpaque.java +0 -0
  293. data/src/{toxi → main/java/toxi}/processing/RCTransp.java +0 -0
  294. data/src/{toxi → main/java/toxi}/processing/TextureBuilder.java +0 -0
  295. data/src/{toxi → main/java/toxi}/processing/Textures.java +0 -0
  296. data/src/{toxi → main/java/toxi}/processing/ToxiclibsSupport.java +0 -0
  297. data/src/{toxi → main/java/toxi}/processing/Tracing.java +0 -0
  298. data/src/{toxi → main/java/toxi}/processing/XYZNormalMapper.java +0 -0
  299. data/src/{toxi → main/java/toxi}/sim/automata/CAMatrix.java +0 -0
  300. data/src/{toxi → main/java/toxi}/sim/automata/CARule.java +0 -0
  301. data/src/{toxi → main/java/toxi}/sim/automata/CARule2D.java +0 -0
  302. data/src/{toxi → main/java/toxi}/sim/automata/CAWolfram1D.java +0 -0
  303. data/src/{toxi → main/java/toxi}/sim/automata/EvolvableMatrix.java +0 -0
  304. data/src/{toxi → main/java/toxi}/sim/automata/MatrixEvolver.java +0 -0
  305. data/src/{toxi → main/java/toxi}/sim/dla/BottomUpOrder.java +0 -0
  306. data/src/{toxi → main/java/toxi}/sim/dla/DLA.java +0 -0
  307. data/src/{toxi → main/java/toxi}/sim/dla/DLAConfiguration.java +0 -0
  308. data/src/{toxi → main/java/toxi}/sim/dla/DLAEventAdapter.java +0 -0
  309. data/src/{toxi → main/java/toxi}/sim/dla/DLAEventListener.java +0 -0
  310. data/src/{toxi → main/java/toxi}/sim/dla/DLAGuideLines.java +0 -0
  311. data/src/{toxi → main/java/toxi}/sim/dla/DLAParticle.java +0 -0
  312. data/src/{toxi → main/java/toxi}/sim/dla/DLASegment.java +0 -0
  313. data/src/{toxi → main/java/toxi}/sim/dla/PipelineOrder.java +0 -0
  314. data/src/{toxi → main/java/toxi}/sim/dla/RadialDistanceOrder.java +0 -0
  315. data/src/{toxi → main/java/toxi}/sim/erosion/ErosionFunction.java +0 -0
  316. data/src/{toxi → main/java/toxi}/sim/erosion/TalusAngleErosion.java +0 -0
  317. data/src/{toxi → main/java/toxi}/sim/erosion/ThermalErosion.java +0 -0
  318. data/src/{toxi → main/java/toxi}/sim/fluids/FluidSolver2D.java +0 -0
  319. data/src/{toxi → main/java/toxi}/sim/fluids/FluidSolver3D.java +0 -0
  320. data/src/{toxi → main/java/toxi}/sim/grayscott/GrayScott.java +0 -0
  321. data/src/{toxi → main/java/toxi}/util/DateUtils.java +0 -0
  322. data/src/{toxi → main/java/toxi}/util/FileSequenceDescriptor.java +0 -0
  323. data/src/main/java/toxi/util/FileUtils.java +443 -0
  324. data/src/{toxi → main/java/toxi}/util/datatypes/ArraySet.java +0 -0
  325. data/src/{toxi → main/java/toxi}/util/datatypes/ArrayUtil.java +0 -0
  326. data/src/{toxi → main/java/toxi}/util/datatypes/BiasedDoubleRange.java +3 -3
  327. data/src/{toxi → main/java/toxi}/util/datatypes/BiasedFloatRange.java +2 -3
  328. data/src/{toxi → main/java/toxi}/util/datatypes/BiasedIntegerRange.java +3 -3
  329. data/src/{toxi → main/java/toxi}/util/datatypes/DoubleRange.java +3 -3
  330. data/src/{toxi → main/java/toxi}/util/datatypes/FloatRange.java +3 -3
  331. data/src/{toxi → main/java/toxi}/util/datatypes/GenericSet.java +0 -0
  332. data/src/{toxi → main/java/toxi}/util/datatypes/IntegerRange.java +3 -3
  333. data/src/{toxi → main/java/toxi}/util/datatypes/IntegerSet.java +0 -0
  334. data/src/{toxi → main/java/toxi}/util/datatypes/ItemIndex.java +0 -0
  335. data/src/{toxi → main/java/toxi}/util/datatypes/SingletonRegistry.java +0 -0
  336. data/src/{toxi → main/java/toxi}/util/datatypes/TypedProperties.java +0 -0
  337. data/src/{toxi → main/java/toxi}/util/datatypes/UndirectedGraph.java +0 -0
  338. data/src/{toxi → main/java/toxi}/util/datatypes/UniqueItemIndex.java +0 -0
  339. data/src/{toxi → main/java/toxi}/util/datatypes/WeightedRandomEntry.java +0 -0
  340. data/src/{toxi → main/java/toxi}/util/datatypes/WeightedRandomSet.java +0 -0
  341. data/src/{toxi → main/java/toxi}/util/events/EventDispatcher.java +0 -0
  342. data/src/{toxi → main/java/toxi}/volume/AdditiveBrush.java +0 -0
  343. data/src/{toxi → main/java/toxi}/volume/ArrayIsoSurface.java +0 -0
  344. data/src/{toxi → main/java/toxi}/volume/BoxBrush.java +0 -0
  345. data/src/{toxi → main/java/toxi}/volume/BrushMode.java +0 -0
  346. data/src/{toxi → main/java/toxi}/volume/HashIsoSurface.java +0 -0
  347. data/src/{toxi → main/java/toxi}/volume/IsoSurface.java +0 -0
  348. data/src/{toxi → main/java/toxi}/volume/MarchingCubesIndex.java +0 -0
  349. data/src/{toxi → main/java/toxi}/volume/MeshLatticeBuilder.java +0 -0
  350. data/src/{toxi → main/java/toxi}/volume/MeshVoxelizer.java +0 -0
  351. data/src/{toxi → main/java/toxi}/volume/MultiplyBrush.java +0 -0
  352. data/src/{toxi → main/java/toxi}/volume/PeakBrush.java +0 -0
  353. data/src/{toxi → main/java/toxi}/volume/ReplaceBrush.java +0 -0
  354. data/src/{toxi → main/java/toxi}/volume/RoundBrush.java +0 -0
  355. data/src/{toxi → main/java/toxi}/volume/VolumetricBrush.java +0 -0
  356. data/src/{toxi → main/java/toxi}/volume/VolumetricHashMap.java +0 -0
  357. data/src/{toxi → main/java/toxi}/volume/VolumetricSpace.java +0 -0
  358. data/src/{toxi → main/java/toxi}/volume/VolumetricSpaceArray.java +0 -0
  359. data/src/{BooleanShapes.java → test/java/BooleanShapes.java} +0 -0
  360. data/toxiclibs.gemspec +6 -7
  361. metadata +345 -347
  362. data/src/toxi/data/feeds/AtomFeed.java +0 -129
  363. data/src/toxi/data/feeds/RSSFeed.java +0 -99
  364. data/src/toxi/physics2d/VerletParticle2D.java +0 -457
  365. data/src/toxi/physics2d/VerletPhysics2D.java +0 -448
  366. data/src/toxi/physics2d/behaviors/AttractionBehavior2D.java +0 -212
  367. data/src/toxi/physics3d/VerletParticle3D.java +0 -385
  368. data/src/toxi/util/FileUtils.java +0 -467
@@ -60,6 +60,7 @@ public class CylinderConstraint implements ParticleConstraint3D {
60
60
  setCylinder(cylinder);
61
61
  }
62
62
 
63
+ @Override
63
64
  public void apply(VerletParticle3D p) {
64
65
  if (cylinder.containsPoint(p)) {
65
66
  centroid.setComponent(axis, p.getComponent(axis));
@@ -56,6 +56,7 @@ public class MaxConstraint implements ParticleConstraint3D {
56
56
  this.threshold = threshold;
57
57
  }
58
58
 
59
+ @Override
59
60
  public void apply(VerletParticle3D p) {
60
61
  if (p.getComponent(axis) > threshold) {
61
62
  p.setComponent(axis, threshold);
@@ -56,6 +56,7 @@ public class MinConstraint implements ParticleConstraint3D {
56
56
  this.threshold = threshold;
57
57
  }
58
58
 
59
+ @Override
59
60
  public void apply(VerletParticle3D p) {
60
61
  if (p.getComponent(axis) < threshold) {
61
62
  p.setComponent(axis, threshold);
@@ -24,7 +24,6 @@
24
24
  * License along with this library; if not, write to the Free Software
25
25
  * Foundation, Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301, USA
26
26
  */
27
-
28
27
  package toxi.physics3d.constraints;
29
28
 
30
29
  import java.util.LinkedList;
@@ -40,48 +39,49 @@ import toxi.physics3d.VerletParticle3D;
40
39
  */
41
40
  public class SoftBoxConstraint implements ParticleConstraint3D {
42
41
 
43
- /**
44
- *
45
- */
46
- public AABB box;
42
+ /**
43
+ *
44
+ */
45
+ public AABB box;
47
46
 
48
- /**
49
- *
50
- */
51
- public List<Axis> axes = new LinkedList<Axis>();
47
+ /**
48
+ *
49
+ */
50
+ public List<Axis> axes = new LinkedList<>();
52
51
 
53
- /**
54
- *
55
- */
56
- public float smooth;
52
+ /**
53
+ *
54
+ */
55
+ public float smooth;
57
56
 
58
- /**
59
- *
60
- * @param box
61
- * @param smooth
62
- */
63
- public SoftBoxConstraint(AABB box, float smooth) {
64
- this.box = box;
65
- this.smooth = smooth;
66
- }
57
+ /**
58
+ *
59
+ * @param box
60
+ * @param smooth
61
+ */
62
+ public SoftBoxConstraint(AABB box, float smooth) {
63
+ this.box = box;
64
+ this.smooth = smooth;
65
+ }
67
66
 
68
- /**
69
- *
70
- * @param a
71
- * @return
72
- */
73
- public SoftBoxConstraint addAxis(Axis a) {
74
- axes.add(a);
75
- return this;
76
- }
67
+ /**
68
+ *
69
+ * @param a
70
+ * @return
71
+ */
72
+ public SoftBoxConstraint addAxis(Axis a) {
73
+ axes.add(a);
74
+ return this;
75
+ }
77
76
 
78
- public void apply(VerletParticle3D p) {
79
- if (p.isInAABB(box)) {
80
- for (Axis a : axes) {
81
- float val = p.getComponent(a);
82
- p.setComponent(a, val + (box.getComponent(a) - val) * smooth);
83
- }
84
- }
77
+ @Override
78
+ public void apply(VerletParticle3D p) {
79
+ if (p.isInAABB(box)) {
80
+ axes.forEach((a) -> {
81
+ float val = p.getComponent(a);
82
+ p.setComponent(a, val + (box.getComponent(a) - val) * smooth);
83
+ });
85
84
  }
85
+ }
86
86
 
87
87
  }
@@ -98,6 +98,7 @@ public class SphereConstraint implements ParticleConstraint3D {
98
98
  * toxi.physics.constraints.ParticleConstraint#apply(toxi.physics.VerletParticle
99
99
  * )
100
100
  */
101
+ @Override
101
102
  public void apply(VerletParticle3D p) {
102
103
  boolean isInside = sphere.containsPoint(p);
103
104
  if ((isBoundingSphere && !isInside) || (!isBoundingSphere && isInside)) {
@@ -0,0 +1,443 @@
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
+ package toxi.util;
28
+
29
+ import java.awt.FileDialog;
30
+ import java.awt.Frame;
31
+ import java.io.BufferedInputStream;
32
+ import java.io.BufferedReader;
33
+ import java.io.BufferedWriter;
34
+ import java.io.ByteArrayOutputStream;
35
+ import java.io.File;
36
+ import java.io.FileInputStream;
37
+ import java.io.FileOutputStream;
38
+ import java.io.FilenameFilter;
39
+ import java.io.IOException;
40
+ import java.io.InputStream;
41
+ import java.io.InputStreamReader;
42
+ import java.io.OutputStream;
43
+ import java.io.OutputStreamWriter;
44
+ import java.io.UnsupportedEncodingException;
45
+ import java.util.zip.GZIPInputStream;
46
+ import java.util.zip.GZIPOutputStream;
47
+
48
+ /**
49
+ * A collection of file handling utilities.
50
+ */
51
+ public class FileUtils {
52
+
53
+ /**
54
+ * {@link FileDialog} constant
55
+ */
56
+ public static final int LOAD = FileDialog.LOAD;
57
+
58
+ /**
59
+ * {@link FileDialog} constant
60
+ */
61
+ public static final int SAVE = FileDialog.SAVE;
62
+
63
+ /**
64
+ * Attempts to create the full path of directories as specified by the given
65
+ * target path. The path is assumed to be a directory, NOT a file in a
66
+ * directory. For the latter, use {@link #createDirectoriesForFile(File)}.
67
+ *
68
+ * @param path
69
+ * @return true, if the operation succeeded
70
+ */
71
+ static public boolean createDirectories(File path) {
72
+ try {
73
+ if (!path.exists()) {
74
+ path.mkdirs();
75
+ }
76
+ return true;
77
+ } catch (SecurityException se) {
78
+ System.err.println("No permissions to create "
79
+ + path.getAbsolutePath());
80
+ }
81
+ return false;
82
+ }
83
+
84
+ /**
85
+ * Attempts to create the full path of directories as specified by the given
86
+ * target file.
87
+ *
88
+ * @param file
89
+ * @return true, if the operation succeeded
90
+ */
91
+ static public boolean createDirectoriesForFile(File file) {
92
+ try {
93
+ String parentName = file.getParent();
94
+ if (parentName != null) {
95
+ File parent = new File(parentName);
96
+ if (!parent.exists()) {
97
+ parent.mkdirs();
98
+ }
99
+ }
100
+ return true;
101
+ } catch (SecurityException se) {
102
+ System.err.println("No permissions to create "
103
+ + file.getAbsolutePath());
104
+ }
105
+ return false;
106
+ }
107
+
108
+ /**
109
+ * Creates an {@link InputStream} for the given file. If the file extension
110
+ * ends with ".gz" the stream is automatically wrapped in a
111
+ * {@link GZIPInputStream} as well.
112
+ *
113
+ * @param file input file
114
+ * @return input stream
115
+ * @throws IOException
116
+ */
117
+ static public InputStream createInputStream(File file) throws IOException {
118
+ if (file == null) {
119
+ throw new IllegalArgumentException("file can't be null");
120
+ }
121
+ InputStream stream = new FileInputStream(file);
122
+ if (file.getName().toLowerCase().endsWith(".gz")) {
123
+ stream = new GZIPInputStream(stream);
124
+ }
125
+ return stream;
126
+ }
127
+
128
+ /**
129
+ * Creates an {@link OutputStream} for the given file. If the file extension
130
+ * ends with ".gz" the stream is automatically wrapped in a
131
+ * {@link GZIPOutputStream} as well. Also attempts to create any intermediate
132
+ * directories for the file using {@link #createDirectoriesForFile(File)}.
133
+ *
134
+ * @param file output file
135
+ * @return output stream
136
+ * @throws IOException
137
+ */
138
+ static public OutputStream createOutputStream(File file) throws IOException {
139
+ if (file == null) {
140
+ throw new IllegalArgumentException("file can't be null");
141
+ }
142
+ createDirectoriesForFile(file);
143
+ OutputStream stream = new FileOutputStream(file);
144
+ if (file.getName().toLowerCase().endsWith(".gz")) {
145
+ stream = new GZIPOutputStream(stream);
146
+ }
147
+ return stream;
148
+ }
149
+
150
+ /**
151
+ * Creates a {@link BufferedReader} for the given file using UTF-8 encoding.
152
+ *
153
+ * @param file
154
+ * @return reader instance
155
+ * @throws IOException
156
+ */
157
+ public static BufferedReader createReader(File file) throws IOException {
158
+ return createReader(createInputStream(file));
159
+ }
160
+
161
+ /**
162
+ * Creates a {@link BufferedReader} for the given {@link InputStream} using
163
+ * UTF-8 encoding.
164
+ *
165
+ * @param input stream
166
+ * @return reader instance
167
+ */
168
+ public static BufferedReader createReader(InputStream input) {
169
+ return createReader(input, "UTF-8");
170
+ }
171
+
172
+ /**
173
+ * Creates a {@link BufferedReader} for the given {@link InputStream} and
174
+ * using the specified encoding.
175
+ *
176
+ * @param input stream
177
+ * @param encoding text encoding to use
178
+ * @return reader instance
179
+ */
180
+ public static BufferedReader createReader(InputStream input, String encoding) {
181
+ InputStreamReader isr = null;
182
+ try {
183
+ isr = new InputStreamReader(input, encoding);
184
+ } catch (UnsupportedEncodingException e) {
185
+ }
186
+ return new BufferedReader(isr, 0x10000);
187
+ }
188
+
189
+ /**
190
+ * Creates a {@link BufferedWriter} for the given file using UTF-8 encoding.
191
+ *
192
+ * @param file
193
+ * @return writer instance
194
+ * @throws IOException
195
+ */
196
+ public static BufferedWriter createWriter(File file) throws IOException {
197
+ return createWriter(createOutputStream(file));
198
+ }
199
+
200
+ /**
201
+ * Creates a {@link BufferedWriter} for the given {@link OutputStream} using
202
+ * UTF-8 encoding.
203
+ *
204
+ * @param out
205
+ * @return writer instance
206
+ */
207
+ public static BufferedWriter createWriter(OutputStream out) {
208
+ return createWriter(out, "UTF-8");
209
+ }
210
+
211
+ /**
212
+ * Creates a {@link BufferedWriter} for the given {@link OutputStream} and
213
+ * using the specified encoding.
214
+ *
215
+ * @param out stream
216
+ * @param encoding text encoding to use
217
+ * @return writer instance
218
+ */
219
+ public static BufferedWriter createWriter(OutputStream out, String encoding) {
220
+ OutputStreamWriter w = null;
221
+ try {
222
+ w = new OutputStreamWriter(out, encoding);
223
+ } catch (UnsupportedEncodingException e) {
224
+ }
225
+ return new BufferedWriter(w, 0x10000);
226
+ }
227
+
228
+ /**
229
+ * <p>
230
+ * Analyses the given file path for a file sequence pattern and returns a
231
+ * {@link FileSequenceDescriptor} instance for further use to handle this
232
+ * sequence. The file pattern should be in one of these formats:
233
+ * </p>
234
+ * <ul>
235
+ * <li>base_path-00001.ext</li>
236
+ * <li>base_path001.ext</li>
237
+ * </ul>
238
+ * <p>
239
+ * The sequence index should be using leading zeros, but the number of digits
240
+ * will be identified automatically.
241
+ * </p>
242
+ *
243
+ * @param path file path of the first file in the sequence
244
+ * @return descriptor, or null, if the path could not be analysed
245
+ */
246
+ public static FileSequenceDescriptor getFileSequenceDescriptorFor(
247
+ String path) {
248
+ int dotIndex = path.lastIndexOf('.');
249
+ int zeroIndex = path.lastIndexOf('-') + 1;
250
+ if (zeroIndex == 0) {
251
+ zeroIndex = dotIndex - 1;
252
+ while (path.charAt(zeroIndex) >= '0'
253
+ && path.charAt(zeroIndex) <= '9') {
254
+ zeroIndex--;
255
+ }
256
+ zeroIndex++;
257
+ }
258
+ int numDigits = dotIndex - zeroIndex;
259
+ if (dotIndex != -1 && numDigits > 0) {
260
+ String base = path.substring(0, zeroIndex);
261
+ String extension = path.substring(dotIndex);
262
+ String filePattern = base + "%0" + numDigits + "d" + extension;
263
+ int start = Integer.parseInt(path.substring(zeroIndex, dotIndex));
264
+ return new FileSequenceDescriptor(filePattern, extension, dotIndex
265
+ - zeroIndex, start);
266
+ } else {
267
+ return null;
268
+ }
269
+ }
270
+
271
+ /**
272
+ * Loads the given {@link InputStream} into a byte array buffer.
273
+ *
274
+ * @param stream
275
+ * @return byte array
276
+ * @throws IOException
277
+ */
278
+ static public byte[] loadBytes(InputStream stream) throws IOException {
279
+ BufferedInputStream input = new BufferedInputStream(stream);
280
+ ByteArrayOutputStream buffer = new ByteArrayOutputStream();
281
+ int c;
282
+ while ((c = input.read()) != -1) {
283
+ buffer.write(c);
284
+ }
285
+ return buffer.toByteArray();
286
+ }
287
+
288
+ /**
289
+ * Loads the given {@link BufferedReader} as text, line by line into a
290
+ * {@link String}.
291
+ *
292
+ * @param reader
293
+ * @return reader contents as string
294
+ * @throws IOException
295
+ */
296
+ public static String loadText(BufferedReader reader) throws IOException {
297
+ StringBuilder result = new StringBuilder();
298
+ String line;
299
+ while ((line = reader.readLine()) != null) {
300
+ result.append(line).append("\n");
301
+ }
302
+ return result.toString();
303
+ }
304
+
305
+ /**
306
+ * Loads the given {@link InputStream} as text, line by line into a
307
+ * {@link String} using UTF-8 encoding.
308
+ *
309
+ * @param input stream
310
+ * @return stream contents as string
311
+ * @throws IOException
312
+ */
313
+ public static String loadText(InputStream input) throws IOException {
314
+ return loadText(input, "UTF-8");
315
+ }
316
+
317
+ /**
318
+ * Loads the given {@link InputStream} as text, line by line into a
319
+ * {@link String} using the specified encoding.
320
+ *
321
+ * @param input stream
322
+ * @param encoding
323
+ * @return stream contents as single string
324
+ * @throws IOException
325
+ */
326
+ public static String loadText(InputStream input, String encoding)
327
+ throws IOException {
328
+ byte[] raw = loadBytes(input);
329
+ return new String(raw, encoding);
330
+ }
331
+
332
+ /**
333
+ * Saves the given text to the specified {@link BufferedWriter} instance, then
334
+ * closes the writer afterwards.
335
+ *
336
+ * @param writer
337
+ * @param string
338
+ * @throws IOException
339
+ */
340
+ static public void saveText(BufferedWriter writer, String string)
341
+ throws IOException {
342
+ try (writer) {
343
+ writer.write(string);
344
+ writer.flush();
345
+ }
346
+ }
347
+
348
+ /**
349
+ * Saves the given text to the specified {@link OutputStream} instance, then
350
+ * closes the underlying writer afterwards.
351
+ *
352
+ * @param output
353
+ * @param string
354
+ * @throws IOException
355
+ */
356
+ static public void saveText(OutputStream output, String string)
357
+ throws IOException {
358
+ saveText(createWriter(output), string);
359
+ }
360
+
361
+ /**
362
+ * Displays a standard AWT file dialog for choosing a folder (no files!).
363
+ *
364
+ * @param frame parent frame
365
+ * @param title dialog title
366
+ * @param path base directory (or null)
367
+ * @return path to chosen directory or null, if user has canceled
368
+ */
369
+ public static String showDirectoryChooser(final Frame frame,
370
+ final String title, String path) {
371
+ System.setProperty("apple.awt.fileDialogForDirectories", "true");
372
+ String result = showFileDialog(frame, title, path, (File dir, String name) -> new File(dir + "/" + name).isDirectory(), LOAD);
373
+ System.setProperty("apple.awt.fileDialogForDirectories", "false");
374
+ return result;
375
+ }
376
+
377
+ /**
378
+ * Displays a standard AWT file dialog for choosing a file for loading or
379
+ * saving.
380
+ *
381
+ * @param frame parent frame
382
+ * @param title dialog title
383
+ * @param path base directory (or null)
384
+ * @param filter a FilenameFilter implementation (or null)
385
+ * @param mode either FileUtils.LOAD or FileUtils.SAVE
386
+ * @return path to chosen file or null, if user has canceled
387
+ */
388
+ public static String showFileDialog(final Frame frame, final String title,
389
+ String path, FilenameFilter filter, final int mode) {
390
+ String fileID = null;
391
+ FileDialog fd = new FileDialog(frame, title, mode);
392
+ if (path != null) {
393
+ fd.setDirectory(path);
394
+ }
395
+ if (filter != null) {
396
+ fd.setFilenameFilter(filter);
397
+ }
398
+ fd.setVisible(true);
399
+ if (fd.getFile() != null) {
400
+ fileID = fd.getFile();
401
+ fileID = fd.getDirectory() + fileID;
402
+ }
403
+ return fileID;
404
+ }
405
+
406
+ /**
407
+ * Displays a standard AWT file dialog for choosing a file for loading or
408
+ * saving.
409
+ *
410
+ * @param frame parent frame
411
+ * @param title dialog title
412
+ * @param path base directory (or null)
413
+ * @param formats an array of allowed file extensions (or null to allow all)
414
+ * @param mode either FileUtils.LOAD or FileUtils.SAVE
415
+ * @return path to chosen file or null, if user has canceled
416
+ */
417
+ public static String showFileDialog(final Frame frame, final String title,
418
+ String path, final String[] formats, final int mode) {
419
+ String fileID = null;
420
+ FileDialog fd = new FileDialog(frame, title, mode);
421
+ if (path != null) {
422
+ fd.setDirectory(path);
423
+ }
424
+ if (formats != null) {
425
+ fd.setFilenameFilter((File dir, String name) -> {
426
+ boolean isAccepted = false;
427
+ for (String ext : formats) {
428
+ if (name.contains(ext)) {
429
+ isAccepted = true;
430
+ break;
431
+ }
432
+ }
433
+ return isAccepted;
434
+ });
435
+ }
436
+ fd.setVisible(true);
437
+ if (fd.getFile() != null) {
438
+ fileID = fd.getFile();
439
+ fileID = fd.getDirectory() + fileID;
440
+ }
441
+ return fileID;
442
+ }
443
+ }