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,1677 @@
1
+ /*
2
+ * Some classes in this package have been partly inspired by & bits ported from
3
+ * Python code written by Tom De Smedt & Frederik De Bleser for the "colors" library
4
+ * of Nodebox.net.
5
+ *
6
+ * http://nodebox.net/code/index.php/Colors
7
+ *
8
+ * Copyright (c) 2006-2011 Karsten Schmidt
9
+ *
10
+ * This library is free software; you can redistribute it and/or
11
+ * modify it under the terms of the GNU Lesser General Public
12
+ * License as published by the Free Software Foundation; either
13
+ * version 2.1 of the License, or (at your option) any later version.
14
+ *
15
+ * http://creativecommons.org/licenses/LGPL/2.1/
16
+ *
17
+ * This library is distributed in the hope that it will be useful,
18
+ * but WITHOUT ANY WARRANTY; without even the implied warranty of
19
+ * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU
20
+ * Lesser General Public License for more details.
21
+ *
22
+ * You should have received a copy of the GNU Lesser General Public
23
+ * License along with this library; if not, write to the Free Software
24
+ * Foundation, Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301, USA
25
+ */
26
+
27
+ package toxi.color;
28
+
29
+ import toxi.geom.ReadonlyVec3D;
30
+ import toxi.geom.Vec2D;
31
+ import toxi.geom.Vec3D;
32
+ import toxi.math.MathUtils;
33
+
34
+ /**
35
+ * Floating point color class with implicit RGB, HSV, CMYK access modes,
36
+ * conversion and color theory utils. Based on the <a href="">Colors library</a>
37
+ * for <a href="http:/Nodebox.net/">NodeBox</a>
38
+ *
39
+ */
40
+ public class TColor implements ReadonlyTColor {
41
+
42
+ /**
43
+ *
44
+ */
45
+ protected static final float INV60DEGREES = 60.0f / 360;
46
+
47
+ /**
48
+ *
49
+ */
50
+ protected static final float INV8BIT = 1f / 255;
51
+
52
+ /**
53
+ *
54
+ */
55
+ protected static final double EPS = .001;
56
+
57
+ /**
58
+ *
59
+ */
60
+ protected static final Vec2D[] RYB_WHEEL = new Vec2D[] {
61
+ new Vec2D(0, 0), new Vec2D(15, 8), new Vec2D(30, 17),
62
+ new Vec2D(45, 26), new Vec2D(60, 34), new Vec2D(75, 41),
63
+ new Vec2D(90, 48), new Vec2D(105, 54), new Vec2D(120, 60),
64
+ new Vec2D(135, 81), new Vec2D(150, 103), new Vec2D(165, 123),
65
+ new Vec2D(180, 138), new Vec2D(195, 155), new Vec2D(210, 171),
66
+ new Vec2D(225, 187), new Vec2D(240, 204), new Vec2D(255, 219),
67
+ new Vec2D(270, 234), new Vec2D(285, 251), new Vec2D(300, 267),
68
+ new Vec2D(315, 282), new Vec2D(330, 298), new Vec2D(345, 329),
69
+ new Vec2D(360, 0)
70
+ };
71
+
72
+ /**
73
+ * Maximum rgb component value for a color to be classified as black.
74
+ *
75
+ * @see #isBlack()
76
+ */
77
+ public static float BLACK_POINT = 0.08f;
78
+
79
+ /**
80
+ * Minimum rgb component value for a color to be classified as white.
81
+ *
82
+ * @see #isWhite()
83
+ */
84
+ public static float WHITE_POINT = 1f;
85
+
86
+ /**
87
+ * Maximum saturations value for a color to be classified as grey
88
+ *
89
+ * @see #isGrey()
90
+ */
91
+ public static float GREY_THRESHOLD = 0.01f;
92
+
93
+ /**
94
+ *
95
+ */
96
+ public static final ReadonlyTColor RED = newRGB(1, 0, 0);
97
+
98
+ /**
99
+ *
100
+ */
101
+ public static final ReadonlyTColor GREEN = newRGB(0, 1, 0);
102
+
103
+ /**
104
+ *
105
+ */
106
+ public static final ReadonlyTColor BLUE = newRGB(0, 0, 1);
107
+
108
+ /**
109
+ *
110
+ */
111
+ public static final ReadonlyTColor CYAN = newRGB(0, 1, 1);
112
+
113
+ /**
114
+ *
115
+ */
116
+ public static final ReadonlyTColor MAGENTA = newRGB(1, 0, 1);
117
+
118
+ /**
119
+ *
120
+ */
121
+ public static final ReadonlyTColor YELLOW = newRGB(1, 1, 0);
122
+
123
+ /**
124
+ *
125
+ */
126
+ public static final ReadonlyTColor BLACK = newRGB(0, 0, 0);
127
+
128
+ /**
129
+ *
130
+ */
131
+ public static final ReadonlyTColor WHITE = newRGB(1, 1, 1);
132
+
133
+ /**
134
+ * Converts CMYK floats into an RGB array.
135
+ *
136
+ * @param c
137
+ * @param m
138
+ * @param y
139
+ * @param k
140
+ * @return rgb array
141
+ */
142
+ public static final float[] cmykToRGB(float c, float m, float y, float k) {
143
+ return cmykToRGB(c, m, y, k, new float[3]);
144
+ }
145
+
146
+ /**
147
+ * Converts CMYK floats into the given RGB array.
148
+ *
149
+ * @param c
150
+ * @param m
151
+ * @param y
152
+ * @param k
153
+ * @param rgb
154
+ * @return rgb array
155
+ */
156
+ public static final float[] cmykToRGB(float c, float m, float y, float k,
157
+ float[] rgb) {
158
+ rgb[0] = 1.0f - MathUtils.min(1.0f, c + k);
159
+ rgb[1] = 1.0f - MathUtils.min(1.0f, m + k);
160
+ rgb[2] = 1.0f - MathUtils.min(1.0f, y + k);
161
+ return rgb;
162
+ }
163
+
164
+ /**
165
+ * Converts hex string into a RGB array.
166
+ *
167
+ * @param hexRGB
168
+ * @return rgb array
169
+ */
170
+ public static final float[] hexToRGB(String hexRGB) {
171
+ return hexToRGB(hexRGB, new float[3]);
172
+ }
173
+
174
+ /**
175
+ *
176
+ * @param hexRGB
177
+ * @param rgb
178
+ * @return
179
+ */
180
+ public static final float[] hexToRGB(String hexRGB, float[] rgb) {
181
+ try {
182
+ if (hexRGB.length() > 6) {
183
+ hexRGB = hexRGB.substring(hexRGB.length() - 6);
184
+ }
185
+ int rgbInt = Integer.parseInt(hexRGB, 16);
186
+ rgb[0] = ((rgbInt >> 16) & 0xff) * INV8BIT;
187
+ rgb[1] = ((rgbInt >> 8) & 0xff) * INV8BIT;
188
+ rgb[2] = (rgbInt & 0xff) * INV8BIT;
189
+ } catch (NumberFormatException e) {
190
+ rgb[0] = rgb[1] = rgb[2] = 0;
191
+ }
192
+ return rgb;
193
+ }
194
+
195
+ /**
196
+ * Converts HSV values into RGB array.
197
+ *
198
+ * @param h
199
+ * @param s
200
+ * @param v
201
+ * @return rgb array
202
+ */
203
+ public static final float[] hsvToRGB(float h, float s, float v) {
204
+ return hsvToRGB(h, s, v, new float[3]);
205
+ }
206
+
207
+ /**
208
+ *
209
+ * @param h
210
+ * @param s
211
+ * @param v
212
+ * @param rgb
213
+ * @return
214
+ */
215
+ public static final float[] hsvToRGB(float h, float s, float v, float[] rgb) {
216
+ if (Float.compare(s, 0.0f) == 0) {
217
+ rgb[0] = rgb[1] = rgb[2] = v;
218
+ } else {
219
+ h /= INV60DEGREES;
220
+ int i = (int) h;
221
+ float f = h - i;
222
+ float p = v * (1 - s);
223
+ float q = v * (1 - s * f);
224
+ float t = v * (1 - s * (1 - f));
225
+
226
+ if (i == 0) {
227
+ rgb[0] = v;
228
+ rgb[1] = t;
229
+ rgb[2] = p;
230
+ } else if (i == 1) {
231
+ rgb[0] = q;
232
+ rgb[1] = v;
233
+ rgb[2] = p;
234
+ } else if (i == 2) {
235
+ rgb[0] = p;
236
+ rgb[1] = v;
237
+ rgb[2] = t;
238
+ } else if (i == 3) {
239
+ rgb[0] = p;
240
+ rgb[1] = q;
241
+ rgb[2] = v;
242
+ } else if (i == 4) {
243
+ rgb[0] = t;
244
+ rgb[1] = p;
245
+ rgb[2] = v;
246
+ } else {
247
+ rgb[0] = v;
248
+ rgb[1] = p;
249
+ rgb[2] = q;
250
+ }
251
+ }
252
+ return rgb;
253
+ }
254
+
255
+ /**
256
+ *
257
+ * @param l
258
+ * @param a
259
+ * @param b
260
+ * @return
261
+ */
262
+ public static final float[] labToRGB(float l, float a, float b) {
263
+ return labToRGB(l, a, b, new float[3]);
264
+ }
265
+
266
+ /**
267
+ * Converts CIE Lab to RGB components.
268
+ *
269
+ * First we have to convert to XYZ color space. Conversion involves using a
270
+ * white point, in this case D65 which represents daylight illumination.
271
+ *
272
+ * Algorithm adopted from: http://www.easyrgb.com/math.php
273
+ *
274
+ * @param l
275
+ * @param a
276
+ * @param b
277
+ * @param rgb
278
+ * @return rgb array
279
+ */
280
+ public static final float[] labToRGB(float l, float a, float b, float[] rgb) {
281
+ float y = (l + 16) / 116.0f;
282
+ float x = a / 500.0f + y;
283
+ float z = y - b / 200.0f;
284
+ rgb[0] = x;
285
+ rgb[1] = y;
286
+ rgb[2] = z;
287
+ for (int i = 0; i < 3; i++) {
288
+ float p = (float) Math.pow(rgb[i], 3);
289
+ if (p > 0.008856) {
290
+ rgb[i] = p;
291
+ } else {
292
+ rgb[i] = (rgb[i] - 16 / 116.0f) / 7.787f;
293
+ }
294
+ }
295
+
296
+ // Observer = 2, Illuminant = D65
297
+ x = rgb[0] * 0.95047f;
298
+ y = rgb[1];
299
+ z = rgb[2] * 1.08883f;
300
+
301
+ rgb[0] = x * 3.2406f + y * -1.5372f + z * -0.4986f;
302
+ rgb[1] = x * -0.9689f + y * 1.8758f + z * 0.0415f;
303
+ rgb[2] = x * 0.0557f + y * -0.2040f + z * 1.0570f;
304
+ double tpow = 1 / 2.4;
305
+ for (int i = 0; i < 3; i++) {
306
+ if (rgb[i] > 0.0031308) {
307
+ rgb[i] = (float) (1.055 * Math.pow(rgb[i], tpow) - 0.055);
308
+ } else {
309
+ rgb[i] = 12.92f * rgb[i];
310
+ }
311
+ }
312
+ return rgb;
313
+ }
314
+
315
+ /**
316
+ * Factory method. Creates new color from ARGB int.
317
+ *
318
+ * @param argb
319
+ * @return new color
320
+ */
321
+ public static final TColor newARGB(int argb) {
322
+ return newRGBA(((argb >> 16) & 0xff) * INV8BIT, ((argb >> 8) & 0xff)
323
+ * INV8BIT, (argb & 0xff) * INV8BIT, (argb >>> 24) * INV8BIT);
324
+ }
325
+
326
+ /**
327
+ * Factory method. Creates new color from CMYK values.
328
+ *
329
+ * @param c
330
+ * @param m
331
+ * @param y
332
+ * @param k
333
+ * @return new color
334
+ */
335
+ public static final TColor newCMYK(float c, float m, float y, float k) {
336
+ return newCMYKA(c, m, y, k, 1);
337
+ }
338
+
339
+ /**
340
+ * Factory method. Creates new color from CMYK + alpha values.
341
+ *
342
+ * @param c
343
+ * @param m
344
+ * @param y
345
+ * @param k
346
+ * @param a
347
+ * @return new color
348
+ */
349
+ public static final TColor newCMYKA(float c, float m, float y, float k,
350
+ float a) {
351
+ TColor col = new TColor();
352
+ col.setCMYK(new float[] {
353
+ c, m, y, k
354
+ });
355
+ col.alpha = MathUtils.clip(a, 0, 1);
356
+ return col;
357
+ }
358
+
359
+ /**
360
+ * Factory method. Creates a new shade of gray with alpha set to 100%.
361
+ *
362
+ * @param gray
363
+ * @return new color.
364
+ */
365
+ public static final TColor newGray(float gray) {
366
+ return newGrayAlpha(gray, 1);
367
+ }
368
+
369
+ /**
370
+ * Factory method. Creates a new shade of gray + alpha.
371
+ *
372
+ * @param gray
373
+ * @param alpha
374
+ * @return new color.
375
+ */
376
+ public static final TColor newGrayAlpha(float gray, float alpha) {
377
+ TColor c = new TColor();
378
+ c.setRGB(new float[] {
379
+ gray, gray, gray
380
+ });
381
+ c.alpha = alpha;
382
+ return c;
383
+ }
384
+
385
+ /**
386
+ * Factory method. Creates a new color from hex string. Supports standard 6
387
+ * digit RGB colors or 8 digit ARGB.
388
+ *
389
+ * @param hexRGB
390
+ * @return new color
391
+ */
392
+ public static final TColor newHex(String hexRGB) {
393
+ TColor c = new TColor();
394
+ if (hexRGB.length() <= 6) {
395
+ c.setRGB(hexToRGB(hexRGB));
396
+ c.alpha = 1;
397
+ } else if (hexRGB.length() == 8) {
398
+ c.setRGB(hexToRGB(hexRGB));
399
+ c.setAlpha(Integer.parseInt(hexRGB.substring(0, 2), 16) * INV8BIT);
400
+ }
401
+ return c;
402
+ }
403
+
404
+ /**
405
+ * Factory method. New color from hsv values.
406
+ *
407
+ * @param h
408
+ * @param s
409
+ * @param v
410
+ * @return new color
411
+ */
412
+ public static final TColor newHSV(float h, float s, float v) {
413
+ return newHSVA(h, s, v, 1);
414
+ }
415
+
416
+ /**
417
+ *
418
+ * @param h
419
+ * @param s
420
+ * @param v
421
+ * @return
422
+ */
423
+ public static ReadonlyTColor newHSV(Hue h, float s, float v) {
424
+ return newHSV(h.getHue(), s, v);
425
+ }
426
+
427
+ /**
428
+ *
429
+ * @param h
430
+ * @param s
431
+ * @param v
432
+ * @param a
433
+ * @return
434
+ */
435
+ public static final TColor newHSVA(float h, float s, float v, float a) {
436
+ TColor c = new TColor();
437
+ c.setHSV(h, s, v);
438
+ c.alpha = MathUtils.clip(a, 0, 1);
439
+ return c;
440
+ }
441
+
442
+ /**
443
+ * Factory method. Creates new random color. Alpha is always 1.0.
444
+ *
445
+ * @return random color
446
+ */
447
+ public static final TColor newRandom() {
448
+ return newRGBA(MathUtils.random(1f), MathUtils.random(1f),
449
+ MathUtils.random(1f), 1);
450
+ }
451
+
452
+ /**
453
+ * Factory method. Creates new color from RGB values. Alpha is set to 1.0.
454
+ *
455
+ * @param r
456
+ * @param g
457
+ * @param b
458
+ * @return new color
459
+ */
460
+ public static final TColor newRGB(float r, float g, float b) {
461
+ return newRGBA(r, g, b, 1);
462
+ }
463
+
464
+ /**
465
+ *
466
+ * @param r
467
+ * @param g
468
+ * @param b
469
+ * @param a
470
+ * @return
471
+ */
472
+ public static final TColor newRGBA(float r, float g, float b, float a) {
473
+ TColor c = new TColor();
474
+ c.setRGB(new float[] {
475
+ r, g, b
476
+ });
477
+ c.alpha = MathUtils.clip(a, 0, 1);
478
+ return c;
479
+ }
480
+
481
+ /**
482
+ * Converts the RGB values into a CMYK array.
483
+ *
484
+ * @param r
485
+ * @param g
486
+ * @param b
487
+ * @return cmyk array
488
+ */
489
+ public static final float[] rgbToCMYK(float r, float g, float b) {
490
+ return rgbToCMYK(r, g, b, new float[4]);
491
+ }
492
+
493
+ /**
494
+ *
495
+ * @param r
496
+ * @param g
497
+ * @param b
498
+ * @param cmyk
499
+ * @return
500
+ */
501
+ public static final float[] rgbToCMYK(float r, float g, float b,
502
+ float[] cmyk) {
503
+ cmyk[0] = 1 - r;
504
+ cmyk[1] = 1 - g;
505
+ cmyk[2] = 1 - b;
506
+ cmyk[3] = MathUtils.min(cmyk[0], cmyk[1], cmyk[2]);
507
+ cmyk[0] = MathUtils.clip(cmyk[0] - cmyk[3], 0, 1);
508
+ cmyk[1] = MathUtils.clip(cmyk[1] - cmyk[3], 0, 1);
509
+ cmyk[2] = MathUtils.clip(cmyk[2] - cmyk[3], 0, 1);
510
+ cmyk[3] = MathUtils.clip(cmyk[3], 0, 1);
511
+ return cmyk;
512
+ }
513
+
514
+ /**
515
+ * Formats the RGB float values into hex integers.
516
+ *
517
+ * @param r
518
+ * @param g
519
+ * @param b
520
+ * @return hex string
521
+ */
522
+ public static final String rgbToHex(float r, float g, float b) {
523
+ String hex = Integer
524
+ .toHexString((int) (MathUtils.clip(r, 0, 1) * 0xff))
525
+ + Integer.toHexString((int) (MathUtils.clip(g, 0, 1) * 0xff))
526
+ + Integer.toHexString((int) (MathUtils.clip(b, 0, 1) * 0xff));
527
+ return hex;
528
+ }
529
+
530
+ /**
531
+ * Converts the RGB values into an HSV array.
532
+ *
533
+ * @param r
534
+ * @param g
535
+ * @param b
536
+ * @return hsv array
537
+ */
538
+ public static final float[] rgbToHSV(float r, float g, float b) {
539
+ return rgbToHSV(r, g, b, new float[3]);
540
+ }
541
+
542
+ /**
543
+ *
544
+ * @param r
545
+ * @param g
546
+ * @param b
547
+ * @param hsv
548
+ * @return
549
+ */
550
+ public static final float[] rgbToHSV(float r, float g, float b, float[] hsv) {
551
+ float h = 0, s = 0;
552
+ float v = MathUtils.max(r, g, b);
553
+ float d = v - MathUtils.min(r, g, b);
554
+
555
+ if (v != 0.0) {
556
+ s = d / v;
557
+ }
558
+ if (s != 0.0) {
559
+ if (Float.compare(r, v) == 0) {
560
+ h = (g - b) / d;
561
+ } else if (Float.compare(g, v) == 0) {
562
+ h = 2 + (b - r) / d;
563
+ } else {
564
+ h = 4 + (r - g) / d;
565
+ }
566
+ }
567
+
568
+ h *= INV60DEGREES;
569
+
570
+ if (h < 0) {
571
+ h += 1.0f;
572
+ }
573
+
574
+ hsv[0] = h;
575
+ hsv[1] = s;
576
+ hsv[2] = v;
577
+ return hsv;
578
+ }
579
+
580
+ /**
581
+ *
582
+ */
583
+ protected float[] rgb;
584
+
585
+ /**
586
+ *
587
+ */
588
+ protected float[] cmyk;
589
+
590
+ /**
591
+ *
592
+ */
593
+ protected float[] hsv;
594
+
595
+ /**
596
+ *
597
+ */
598
+ public float alpha;
599
+
600
+ /**
601
+ * Only for internal use. Color instances should be created with factory
602
+ * methods.
603
+ */
604
+ protected TColor() {
605
+ rgb = new float[3];
606
+ hsv = new float[3];
607
+ cmyk = new float[4];
608
+ }
609
+
610
+ /**
611
+ * Creates a deep copy of the given color.
612
+ *
613
+ * @param c
614
+ */
615
+ public TColor(ReadonlyTColor c) {
616
+ this();
617
+ float[] buffer = c.toCMYKAArray(null);
618
+ cmyk[0] = buffer[0];
619
+ cmyk[1] = buffer[1];
620
+ cmyk[2] = buffer[2];
621
+ cmyk[3] = buffer[3];
622
+ c.toHSVAArray(buffer);
623
+ hsv[0] = buffer[0];
624
+ hsv[1] = buffer[1];
625
+ hsv[2] = buffer[2];
626
+ c.toRGBAArray(buffer);
627
+ rgb[0] = buffer[0];
628
+ rgb[1] = buffer[1];
629
+ rgb[2] = buffer[2];
630
+ this.alpha = c.alpha();
631
+ }
632
+
633
+ /**
634
+ *
635
+ * @param c
636
+ * @return
637
+ */
638
+ public TColor add(TColor c) {
639
+ return copy().addSelf(c);
640
+ }
641
+
642
+ /**
643
+ *
644
+ * @param c
645
+ * @return
646
+ */
647
+ public TColor addSelf(TColor c) {
648
+ rgb[0] = MathUtils.min(rgb[0] + c.rgb[0], 1);
649
+ rgb[1] = MathUtils.min(rgb[1] + c.rgb[1], 1);
650
+ rgb[2] = MathUtils.min(rgb[2] + c.rgb[2], 1);
651
+ return setRGB(rgb);
652
+ }
653
+
654
+ /**
655
+ * Changes the brightness of the color by the given amount in the direction
656
+ * towards either the black or white point (depending on if current
657
+ * brightness >= 50%)
658
+ *
659
+ * @param amount
660
+ * @return itself
661
+ */
662
+ public TColor adjustConstrast(float amount) {
663
+ return hsv[2] < 0.5 ? darken(amount) : lighten(amount);
664
+ }
665
+
666
+ /**
667
+ * Adds the given HSV values as offsets to the current color. Hue will
668
+ * automatically wrap.
669
+ *
670
+ * @param h
671
+ * @param s
672
+ * @param v
673
+ * @return itself
674
+ */
675
+ public TColor adjustHSV(float h, float s, float v) {
676
+ return setHSV(new float[] {
677
+ hsv[0] + h, hsv[1] + s, hsv[2] + v
678
+ });
679
+ }
680
+
681
+ /**
682
+ * Adds the given RGB values as offsets to the current color. TColor will
683
+ * clip at black or white.
684
+ *
685
+ * @param r
686
+ * @param g
687
+ * @param b
688
+ * @return itself
689
+ */
690
+ public TColor adjustRGB(float r, float g, float b) {
691
+ return setRGB(new float[] {
692
+ rgb[0] + r, rgb[1] + g, rgb[2] + b
693
+ });
694
+ }
695
+
696
+ /*
697
+ * (non-Javadoc)
698
+ *
699
+ * @see toxi.color.ReadonlyTColor#alpha()
700
+ */
701
+ @Override
702
+ public float alpha() {
703
+ return alpha;
704
+ }
705
+
706
+ /**
707
+ * Rotates this color by a random amount (not exceeding the one specified)
708
+ * and creates variations in saturation and brightness based on the 2nd
709
+ * parameter.
710
+ *
711
+ * @param theta
712
+ * max. rotation angle (in radians)
713
+ * @param delta
714
+ * max. sat/bri variance
715
+ * @return itself
716
+ */
717
+ public TColor analog(float theta, float delta) {
718
+ return analog((int) MathUtils.degrees(theta), delta);
719
+ }
720
+
721
+ /**
722
+ *
723
+ * @param angle
724
+ * @param delta
725
+ * @return
726
+ */
727
+ public TColor analog(int angle, float delta) {
728
+ rotateRYB((int) (angle * MathUtils.normalizedRandom()));
729
+ hsv[1] += delta * MathUtils.normalizedRandom();
730
+ hsv[2] += delta * MathUtils.normalizedRandom();
731
+ return setHSV(hsv);
732
+ }
733
+
734
+ /*
735
+ * (non-Javadoc)
736
+ *
737
+ * @see toxi.color.ReadonlyTColor#black()
738
+ */
739
+ @Override
740
+ public float black() {
741
+ return cmyk[3];
742
+ }
743
+
744
+ /**
745
+ * Blends the color with the given one by the stated amount
746
+ *
747
+ * @param c
748
+ * target color
749
+ * @param t
750
+ * interpolation factor
751
+ * @return itself
752
+ */
753
+ public TColor blend(ReadonlyTColor c, float t) {
754
+ float[] crgb = c.toRGBAArray(null);
755
+ rgb[0] += (crgb[0] - rgb[0]) * t;
756
+ rgb[1] += (crgb[1] - rgb[1]) * t;
757
+ rgb[2] += (crgb[2] - rgb[2]) * t;
758
+ alpha += (c.alpha() - alpha) * t;
759
+ return setRGB(rgb);
760
+ }
761
+
762
+ /*
763
+ * (non-Javadoc)
764
+ *
765
+ * @see toxi.color.ReadonlyTColor#blue()
766
+ */
767
+ @Override
768
+ public float blue() {
769
+ return rgb[2];
770
+ }
771
+
772
+ /*
773
+ * (non-Javadoc)
774
+ *
775
+ * @see toxi.color.ReadonlyTColor#brightness()
776
+ */
777
+ @Override
778
+ public float brightness() {
779
+ return hsv[2];
780
+ }
781
+
782
+ /**
783
+ * @return ifself, as complementary color
784
+ */
785
+ public TColor complement() {
786
+ return rotateRYB(180);
787
+ }
788
+
789
+ /*
790
+ * (non-Javadoc)
791
+ *
792
+ * @see toxi.color.ReadonlyTColor#copy()
793
+ */
794
+ @Override
795
+ public TColor copy() {
796
+ return new TColor(this);
797
+ }
798
+
799
+ /*
800
+ * (non-Javadoc)
801
+ *
802
+ * @see toxi.color.ReadonlyTColor#cyan()
803
+ */
804
+ @Override
805
+ public float cyan() {
806
+ return cmyk[0];
807
+ }
808
+
809
+ /**
810
+ * Reduces the color's brightness by the given amount (e.g 0.1 = 10%
811
+ * darker).
812
+ *
813
+ * @param step
814
+ * @return itself
815
+ */
816
+ public TColor darken(float step) {
817
+ return setBrightness(hsv[2] - step);
818
+ }
819
+
820
+ /**
821
+ * Reduced the color's saturation by the given amount.
822
+ *
823
+ * @param step
824
+ * @return itself
825
+ */
826
+ public TColor desaturate(float step) {
827
+ return setSaturation(hsv[1] - step);
828
+ }
829
+
830
+ /**
831
+ *
832
+ * @param c
833
+ * @return
834
+ */
835
+ public TColor differenceTo(TColor c) {
836
+ return TColor.newRGB(MathUtils.abs(rgb[0] - c.rgb[0]),
837
+ MathUtils.abs(rgb[1] - c.rgb[1]),
838
+ MathUtils.abs(rgb[2] - c.rgb[2]));
839
+ }
840
+
841
+ /*
842
+ * (non-Javadoc)
843
+ *
844
+ * @see toxi.color.ReadonlyTColor#distanceToCMYK(toxi.color.TColor)
845
+ */
846
+ @Override
847
+ public float distanceToCMYK(ReadonlyTColor c) {
848
+ float[] ccmyk = c.toCMYKAArray(null);
849
+ float dc = cmyk[0] - ccmyk[0];
850
+ float dm = cmyk[1] - ccmyk[1];
851
+ float dy = cmyk[2] - ccmyk[2];
852
+ float dk = cmyk[3] - ccmyk[3];
853
+ return (float) Math.sqrt(dc * dc + dm * dm + dy * dy + dk * dk);
854
+ }
855
+
856
+ /*
857
+ * (non-Javadoc)
858
+ *
859
+ * @see toxi.color.ReadonlyTColor#distanceToHSV(toxi.color.TColor)
860
+ */
861
+ @Override
862
+ public float distanceToHSV(ReadonlyTColor c) {
863
+ float hue = hsv[0] * MathUtils.TWO_PI;
864
+ float hue2 = c.hue() * MathUtils.TWO_PI;
865
+ ReadonlyVec3D v1 = new Vec3D((MathUtils.cos(hue) * hsv[1]),
866
+ (MathUtils.sin(hue) * hsv[1]), hsv[2]);
867
+ Vec3D v2 = new Vec3D((MathUtils.cos(hue2) * c.saturation()),
868
+ (MathUtils.sin(hue2) * c.saturation()), c.brightness());
869
+ return v1.distanceTo(v2);
870
+ }
871
+
872
+ /*
873
+ * (non-Javadoc)
874
+ *
875
+ * @see toxi.color.ReadonlyTColor#distanceToRGB(toxi.color.TColor)
876
+ */
877
+ @Override
878
+ public float distanceToRGB(ReadonlyTColor c) {
879
+ float[] crgb = c.toRGBAArray(null);
880
+ float dr = rgb[0] - crgb[0];
881
+ float dg = rgb[1] - crgb[1];
882
+ float db = rgb[2] - crgb[2];
883
+ return (float) Math.sqrt(dr * dr + dg * dg + db * db);
884
+ }
885
+
886
+ /**
887
+ *
888
+ * @param o
889
+ * @return
890
+ */
891
+ @Override
892
+ public boolean equals(Object o) {
893
+ if (o != null && o instanceof TColor) {
894
+ TColor c = (TColor) o;
895
+ float dr = c.rgb[0] - rgb[0];
896
+ float dg = c.rgb[1] - rgb[1];
897
+ float db = c.rgb[2] - rgb[2];
898
+ float da = c.alpha - alpha;
899
+ double d = Math.sqrt(dr * dr + dg * dg + db * db + da * da);
900
+ return d < EPS;
901
+ }
902
+ return false;
903
+ }
904
+
905
+ /*
906
+ * (non-Javadoc)
907
+ *
908
+ * @see toxi.color.ReadonlyTColor#getAnalog(float, float)
909
+ */
910
+
911
+ /**
912
+ *
913
+ * @param theta
914
+ * @param delta
915
+ * @return
916
+ */
917
+
918
+ @Override
919
+ public TColor getAnalog(float theta, float delta) {
920
+ return new TColor(this).analog(theta, delta);
921
+ }
922
+
923
+ /*
924
+ * (non-Javadoc)
925
+ *
926
+ * @see toxi.color.ReadonlyTColor#getAnalog(int, float)
927
+ */
928
+
929
+ /**
930
+ *
931
+ * @param angle
932
+ * @param delta
933
+ * @return
934
+ */
935
+
936
+ @Override
937
+ public TColor getAnalog(int angle, float delta) {
938
+ return new TColor(this).analog(angle, delta);
939
+ }
940
+
941
+ /*
942
+ * (non-Javadoc)
943
+ *
944
+ * @see toxi.color.ReadonlyTColor#getBlended(toxi.color.ReadonlyTColor,
945
+ * float)
946
+ */
947
+
948
+ /**
949
+ *
950
+ * @param c
951
+ * @param t
952
+ * @return
953
+ */
954
+
955
+ @Override
956
+ public TColor getBlended(ReadonlyTColor c, float t) {
957
+ return new TColor(this).blend(c, t);
958
+ }
959
+
960
+ /*
961
+ * (non-Javadoc)
962
+ *
963
+ * @see toxi.color.ReadonlyTColor#getClosestHue()
964
+ */
965
+ @Override
966
+ public Hue getClosestHue() {
967
+ return Hue.getClosest(hsv[0], false);
968
+ }
969
+
970
+ /*
971
+ * (non-Javadoc)
972
+ *
973
+ * @see toxi.color.ReadonlyTColor#getClosestHue(boolean)
974
+ */
975
+ @Override
976
+ public Hue getClosestHue(boolean primaryOnly) {
977
+ return Hue.getClosest(hsv[0], primaryOnly);
978
+ }
979
+
980
+ /*
981
+ * (non-Javadoc)
982
+ *
983
+ * @see toxi.color.ReadonlyTColor#getComplement()
984
+ */
985
+
986
+ /**
987
+ *
988
+ * @return
989
+ */
990
+
991
+ @Override
992
+ public TColor getComplement() {
993
+ return new TColor(this).complement();
994
+ }
995
+
996
+ /*
997
+ * (non-Javadoc)
998
+ *
999
+ * @see
1000
+ * toxi.color.ReadonlyTColor#getComponentValue(toxi.color.AccessCriteria)
1001
+ */
1002
+
1003
+ /**
1004
+ *
1005
+ * @param criteria
1006
+ * @return
1007
+ */
1008
+
1009
+ @Override
1010
+ public float getComponentValue(AccessCriteria criteria) {
1011
+ return criteria.getComponentValueFor(this);
1012
+ }
1013
+
1014
+ /*
1015
+ * (non-Javadoc)
1016
+ *
1017
+ * @see toxi.color.ReadonlyTColor#getDarkened(float)
1018
+ */
1019
+ @Override
1020
+ public TColor getDarkened(float step) {
1021
+ return new TColor(this).darken(step);
1022
+ }
1023
+
1024
+ /*
1025
+ * (non-Javadoc)
1026
+ *
1027
+ * @see toxi.color.ReadonlyTColor#getDesaturated(float)
1028
+ */
1029
+ @Override
1030
+ public TColor getDesaturated(float step) {
1031
+ return new TColor(this).desaturate(step);
1032
+ }
1033
+
1034
+ /**
1035
+ *
1036
+ * @param c
1037
+ * @return
1038
+ */
1039
+ public TColor getDifferenceTo(TColor c) {
1040
+ return copy().differenceTo(c);
1041
+ }
1042
+
1043
+ /*
1044
+ * (non-Javadoc)
1045
+ *
1046
+ * @see toxi.color.ReadonlyTColor#getInverted()
1047
+ */
1048
+ @Override
1049
+ public TColor getInverted() {
1050
+ return new TColor(this).invert();
1051
+ }
1052
+
1053
+ /*
1054
+ * (non-Javadoc)
1055
+ *
1056
+ * @see toxi.color.ReadonlyTColor#getLightened(float)
1057
+ */
1058
+ @Override
1059
+ public TColor getLightened(float step) {
1060
+ return new TColor(this).lighten(step);
1061
+ }
1062
+
1063
+ /*
1064
+ * (non-Javadoc)
1065
+ *
1066
+ * @see toxi.color.ReadonlyTColor#getRotatedRYB(float)
1067
+ */
1068
+ @Override
1069
+ public TColor getRotatedRYB(float theta) {
1070
+ return new TColor(this).rotateRYB(theta);
1071
+ }
1072
+
1073
+ /*
1074
+ * (non-Javadoc)
1075
+ *
1076
+ * @see toxi.color.ReadonlyTColor#getRotatedRYB(int)
1077
+ */
1078
+ @Override
1079
+ public TColor getRotatedRYB(int angle) {
1080
+ return new TColor(this).rotateRYB(angle);
1081
+ }
1082
+
1083
+ /*
1084
+ * (non-Javadoc)
1085
+ *
1086
+ * @see toxi.color.ReadonlyTColor#getSaturated(float)
1087
+ */
1088
+ @Override
1089
+ public TColor getSaturated(float step) {
1090
+ return new TColor(this).saturate(step);
1091
+ }
1092
+
1093
+ /*
1094
+ * (non-Javadoc)
1095
+ *
1096
+ * @see toxi.color.ReadonlyTColor#green()
1097
+ */
1098
+ @Override
1099
+ public float green() {
1100
+ return rgb[1];
1101
+ }
1102
+
1103
+ /**
1104
+ *
1105
+ * @return
1106
+ */
1107
+ @Override
1108
+ public int hashCode() {
1109
+ int hash = 37;
1110
+ hash += 37 * hash + Float.floatToIntBits(rgb[0]);
1111
+ hash += 37 * hash + Float.floatToIntBits(rgb[1]);
1112
+ hash += 37 * hash + Float.floatToIntBits(rgb[2]);
1113
+ hash += 37 * hash + Float.floatToIntBits(alpha);
1114
+ return hash;
1115
+ }
1116
+
1117
+ /*
1118
+ * (non-Javadoc)
1119
+ *
1120
+ * @see toxi.color.ReadonlyTColor#hue()
1121
+ */
1122
+ @Override
1123
+ public float hue() {
1124
+ return hsv[0];
1125
+ }
1126
+
1127
+ /**
1128
+ * Inverts the color.
1129
+ *
1130
+ * @return itself
1131
+ */
1132
+ public TColor invert() {
1133
+ rgb[0] = 1 - rgb[0];
1134
+ rgb[1] = 1 - rgb[1];
1135
+ rgb[2] = 1 - rgb[2];
1136
+ return setRGB(rgb);
1137
+ }
1138
+
1139
+ /*
1140
+ * (non-Javadoc)
1141
+ *
1142
+ * @see toxi.color.ReadonlyTColor#isBlack()
1143
+ */
1144
+ @Override
1145
+ public boolean isBlack() {
1146
+ return (rgb[0] <= BLACK_POINT && Float.compare(rgb[0], rgb[1]) == 0 && Float
1147
+ .compare(rgb[0], rgb[2]) == 0);
1148
+ }
1149
+
1150
+ /*
1151
+ * (non-Javadoc)
1152
+ *
1153
+ * @see toxi.color.ReadonlyTColor#isGrey()
1154
+ */
1155
+ @Override
1156
+ public boolean isGrey() {
1157
+ return hsv[1] < GREY_THRESHOLD;
1158
+ }
1159
+
1160
+ /*
1161
+ * (non-Javadoc)
1162
+ *
1163
+ * @see toxi.color.ReadonlyTColor#isPrimary()
1164
+ */
1165
+ @Override
1166
+ public boolean isPrimary() {
1167
+ return Hue.isPrimary(hsv[0]);
1168
+ }
1169
+
1170
+ /*
1171
+ * (non-Javadoc)
1172
+ *
1173
+ * @see toxi.color.ReadonlyTColor#isWhite()
1174
+ */
1175
+ @Override
1176
+ public boolean isWhite() {
1177
+ return (rgb[0] >= WHITE_POINT && Float.compare(rgb[0], rgb[1]) == 0 && Float
1178
+ .compare(rgb[0], rgb[2]) == 0);
1179
+ }
1180
+
1181
+ /**
1182
+ * Lightens the color by stated amount.
1183
+ *
1184
+ * @param step
1185
+ * lighten amount
1186
+ * @return itself
1187
+ */
1188
+ public TColor lighten(float step) {
1189
+ return setBrightness(hsv[2] + step);
1190
+ }
1191
+
1192
+ /*
1193
+ * (non-Javadoc)
1194
+ *
1195
+ * @see toxi.color.ReadonlyTColor#luminance()
1196
+ */
1197
+ @Override
1198
+ public float luminance() {
1199
+ return rgb[0] * 0.299f + rgb[1] * 0.587f + rgb[2] * 0.114f;
1200
+ }
1201
+
1202
+ /*
1203
+ * (non-Javadoc)
1204
+ *
1205
+ * @see toxi.color.ReadonlyTColor#magenta()
1206
+ */
1207
+ @Override
1208
+ public float magenta() {
1209
+ return cmyk[1];
1210
+ }
1211
+
1212
+ /*
1213
+ * (non-Javadoc)
1214
+ *
1215
+ * @see toxi.color.ReadonlyTColor#red()
1216
+ */
1217
+ @Override
1218
+ public float red() {
1219
+ return rgb[0];
1220
+ }
1221
+
1222
+ /**
1223
+ *
1224
+ * @param theta
1225
+ * @return
1226
+ */
1227
+ public TColor rotateRYB(float theta) {
1228
+ return rotateRYB((int) MathUtils.degrees(theta));
1229
+ }
1230
+
1231
+ /**
1232
+ * Rotates the color by x degrees along the <a
1233
+ * href="http://en.wikipedia.org/wiki/RYB_color_model">RYB color wheel</a>
1234
+ *
1235
+ * @param theta
1236
+ * @return itself
1237
+ */
1238
+ public TColor rotateRYB(int theta) {
1239
+ float h = hsv[0] * 360;
1240
+ theta %= 360;
1241
+
1242
+ float resultHue = 0;
1243
+ for (int i = 0; i < RYB_WHEEL.length - 1; i++) {
1244
+ Vec2D p = RYB_WHEEL[i];
1245
+ Vec2D q = RYB_WHEEL[i + 1];
1246
+ if (q.y < p.y) {
1247
+ q.y += 360;
1248
+ }
1249
+ if (p.y <= h && h <= q.y) {
1250
+ resultHue = p.x + (q.x - p.x) * (h - p.y) / (q.y - p.y);
1251
+ break;
1252
+ }
1253
+ }
1254
+
1255
+ // And the user-given angle (e.g. complement).
1256
+ resultHue = (resultHue + theta) % 360;
1257
+
1258
+ // For the given angle, find out what hue is
1259
+ // located there on the artistic color wheel.
1260
+ for (int i = 0; i < RYB_WHEEL.length - 1; i++) {
1261
+ Vec2D p = RYB_WHEEL[i];
1262
+ Vec2D q = RYB_WHEEL[i + 1];
1263
+ if (q.y < p.y) {
1264
+ q.y += 360;
1265
+ }
1266
+ if (p.x <= resultHue && resultHue <= q.x) {
1267
+ h = p.y + (q.y - p.y) * (resultHue - p.x) / (q.x - p.x);
1268
+ break;
1269
+ }
1270
+ }
1271
+
1272
+ hsv[0] = (h % 360) / 360.0f;
1273
+ return setHSV(hsv);
1274
+ }
1275
+
1276
+ /**
1277
+ * Adds the given value to the current saturation component.
1278
+ *
1279
+ * @param step
1280
+ * @return itself
1281
+ */
1282
+ public TColor saturate(float step) {
1283
+ return setSaturation(hsv[1] + step);
1284
+ }
1285
+
1286
+ /*
1287
+ * (non-Javadoc)
1288
+ *
1289
+ * @see toxi.color.ReadonlyTColor#saturation()
1290
+ */
1291
+ @Override
1292
+ public float saturation() {
1293
+ return hsv[1];
1294
+ }
1295
+
1296
+ /**
1297
+ *
1298
+ * @param alpha
1299
+ * @return
1300
+ */
1301
+ public TColor setAlpha(float alpha) {
1302
+ this.alpha = alpha;
1303
+ return this;
1304
+ }
1305
+
1306
+ /**
1307
+ * Sets all color components to new values interpreted from the given packed
1308
+ * ARGB 32bit color value.
1309
+ *
1310
+ * @param argb
1311
+ * @return itself
1312
+ */
1313
+ public TColor setARGB(int argb) {
1314
+ setRGB(((argb >> 16) & 0xff) * INV8BIT, ((argb >> 8) & 0xff) * INV8BIT,
1315
+ (argb & 0xff) * INV8BIT);
1316
+ alpha = (argb >>> 24) * INV8BIT;
1317
+ return this;
1318
+ }
1319
+
1320
+ /**
1321
+ *
1322
+ * @param val
1323
+ * @return
1324
+ */
1325
+ public TColor setBlack(float val) {
1326
+ cmyk[3] = MathUtils.clip(val, 0f, 1f);
1327
+ cmykToRGB(cmyk[0], cmyk[1], cmyk[2], cmyk[3], rgb);
1328
+ rgbToHSV(rgb[0], rgb[1], rgb[2], hsv);
1329
+ return this;
1330
+ }
1331
+
1332
+ /**
1333
+ *
1334
+ * @param blue
1335
+ * @return
1336
+ */
1337
+ public TColor setBlue(float blue) {
1338
+ rgb[2] = MathUtils.clip(blue, 0f, 1f);
1339
+ rgbToCMYK(rgb[0], rgb[1], rgb[2], cmyk);
1340
+ rgbToHSV(rgb[0], rgb[1], rgb[2], hsv);
1341
+ return this;
1342
+ }
1343
+
1344
+ /**
1345
+ *
1346
+ * @param brightness
1347
+ * @return
1348
+ */
1349
+ public TColor setBrightness(float brightness) {
1350
+ hsv[2] = MathUtils.clip(brightness, 0, 1);
1351
+ hsvToRGB(hsv[0], hsv[1], hsv[2], rgb);
1352
+ rgbToCMYK(rgb[0], rgb[1], rgb[2], cmyk);
1353
+ return this;
1354
+ }
1355
+
1356
+ /**
1357
+ *
1358
+ * @param c
1359
+ * @param m
1360
+ * @param y
1361
+ * @param k
1362
+ * @return
1363
+ */
1364
+ public TColor setCMYK(float c, float m, float y, float k) {
1365
+ cmyk[0] = c;
1366
+ cmyk[1] = m;
1367
+ cmyk[2] = y;
1368
+ cmyk[3] = k;
1369
+ return setCMYK(cmyk);
1370
+ }
1371
+
1372
+ /**
1373
+ *
1374
+ * @param newCMYK
1375
+ * @return
1376
+ */
1377
+ public TColor setCMYK(float[] newCMYK) {
1378
+ cmyk[0] = MathUtils.clip(newCMYK[0], 0, 1);
1379
+ cmyk[1] = MathUtils.clip(newCMYK[1], 0, 1);
1380
+ cmyk[2] = MathUtils.clip(newCMYK[2], 0, 1);
1381
+ cmyk[3] = MathUtils.clip(newCMYK[3], 0, 1);
1382
+ cmykToRGB(cmyk[0], cmyk[1], cmyk[2], cmyk[3], rgb);
1383
+ rgbToHSV(rgb[0], rgb[1], rgb[2], hsv);
1384
+ return this;
1385
+ }
1386
+
1387
+ /**
1388
+ * Sets a color component by name.
1389
+ *
1390
+ * @param criteria
1391
+ * @param val
1392
+ * @return itself
1393
+ *
1394
+ * @see AccessCriteria
1395
+ */
1396
+ public TColor setComponent(AccessCriteria criteria, float val) {
1397
+ criteria.setComponentValueFor(this, val);
1398
+ return this;
1399
+ }
1400
+
1401
+ /**
1402
+ *
1403
+ * @param val
1404
+ * @return
1405
+ */
1406
+ public TColor setCyan(float val) {
1407
+ cmyk[0] = MathUtils.clip(val, 0f, 1f);
1408
+ cmykToRGB(cmyk[0], cmyk[1], cmyk[2], cmyk[3], rgb);
1409
+ rgbToHSV(rgb[0], rgb[1], rgb[2], hsv);
1410
+ return this;
1411
+ }
1412
+
1413
+ /**
1414
+ *
1415
+ * @param green
1416
+ * @return
1417
+ */
1418
+ public TColor setGreen(float green) {
1419
+ rgb[1] = MathUtils.clip(green, 0f, 1f);
1420
+ rgbToCMYK(rgb[0], rgb[1], rgb[2], cmyk);
1421
+ rgbToHSV(rgb[0], rgb[1], rgb[2], hsv);
1422
+ return this;
1423
+ }
1424
+
1425
+ /**
1426
+ *
1427
+ * @param h
1428
+ * @param s
1429
+ * @param v
1430
+ * @return
1431
+ */
1432
+ public TColor setHSV(float h, float s, float v) {
1433
+ hsv[0] = h;
1434
+ hsv[1] = s;
1435
+ hsv[2] = v;
1436
+ return setHSV(hsv);
1437
+ }
1438
+
1439
+ /**
1440
+ *
1441
+ * @param newHSV
1442
+ * @return
1443
+ */
1444
+ public TColor setHSV(float[] newHSV) {
1445
+ hsv[0] = newHSV[0] % 1;
1446
+ if (hsv[0] < 0) {
1447
+ hsv[0]++;
1448
+ }
1449
+ hsv[1] = MathUtils.clip(newHSV[1], 0, 1);
1450
+ hsv[2] = MathUtils.clip(newHSV[2], 0, 1);
1451
+ hsvToRGB(hsv[0], hsv[1], hsv[2], rgb);
1452
+ rgbToCMYK(rgb[0], rgb[1], rgb[2], cmyk);
1453
+ return this;
1454
+ }
1455
+
1456
+ /**
1457
+ *
1458
+ * @param hue
1459
+ * @return
1460
+ */
1461
+ public TColor setHue(float hue) {
1462
+ hue %= 1.0;
1463
+ if (hue < 0.0) {
1464
+ hue++;
1465
+ }
1466
+ hsv[0] = hue;
1467
+ hsvToRGB(hsv[0], hsv[1], hsv[2], rgb);
1468
+ rgbToCMYK(rgb[0], rgb[1], rgb[2], cmyk);
1469
+ return this;
1470
+ }
1471
+
1472
+ /**
1473
+ *
1474
+ * @param val
1475
+ * @return
1476
+ */
1477
+ public TColor setMagenta(float val) {
1478
+ cmyk[1] = MathUtils.clip(val, 0f, 1f);
1479
+ cmykToRGB(cmyk[0], cmyk[1], cmyk[2], cmyk[3], rgb);
1480
+ rgbToHSV(rgb[0], rgb[1], rgb[2], hsv);
1481
+ return this;
1482
+ }
1483
+
1484
+ /**
1485
+ *
1486
+ * @param red
1487
+ * @return
1488
+ */
1489
+ public TColor setRed(float red) {
1490
+ rgb[0] = MathUtils.clip(red, 0f, 1f);
1491
+ rgbToCMYK(rgb[0], rgb[1], rgb[2], cmyk);
1492
+ rgbToHSV(rgb[0], rgb[1], rgb[2], hsv);
1493
+ return this;
1494
+ }
1495
+
1496
+ /**
1497
+ *
1498
+ * @param r
1499
+ * @param g
1500
+ * @param b
1501
+ * @return
1502
+ */
1503
+ public TColor setRGB(float r, float g, float b) {
1504
+ rgb[0] = r;
1505
+ rgb[1] = g;
1506
+ rgb[2] = b;
1507
+ return setRGB(rgb);
1508
+ }
1509
+
1510
+ /**
1511
+ *
1512
+ * @param newRGB
1513
+ * @return
1514
+ */
1515
+ public TColor setRGB(float[] newRGB) {
1516
+ rgb[0] = MathUtils.clip(newRGB[0], 0, 1);
1517
+ rgb[1] = MathUtils.clip(newRGB[1], 0, 1);
1518
+ rgb[2] = MathUtils.clip(newRGB[2], 0, 1);
1519
+ rgbToCMYK(rgb[0], rgb[1], rgb[2], cmyk);
1520
+ rgbToHSV(rgb[0], rgb[1], rgb[2], hsv);
1521
+ return this;
1522
+ }
1523
+
1524
+ /**
1525
+ *
1526
+ * @param saturation
1527
+ * @return
1528
+ */
1529
+ public TColor setSaturation(float saturation) {
1530
+ hsv[1] = MathUtils.clip(saturation, 0, 1);
1531
+ hsvToRGB(hsv[0], hsv[1], hsv[2], rgb);
1532
+ rgbToCMYK(rgb[0], rgb[1], rgb[2], cmyk);
1533
+ return this;
1534
+ }
1535
+
1536
+ /**
1537
+ *
1538
+ * @param val
1539
+ * @return
1540
+ */
1541
+ public TColor setYellow(float val) {
1542
+ cmyk[2] = MathUtils.clip(val, 0f, 1f);
1543
+ cmykToRGB(cmyk[0], cmyk[1], cmyk[2], cmyk[3], rgb);
1544
+ rgbToHSV(rgb[0], rgb[1], rgb[2], hsv);
1545
+ return this;
1546
+ }
1547
+
1548
+ /**
1549
+ *
1550
+ * @param c
1551
+ * @return
1552
+ */
1553
+ public TColor sub(TColor c) {
1554
+ return copy().subSelf(c);
1555
+ }
1556
+
1557
+ /**
1558
+ *
1559
+ * @param c
1560
+ * @return
1561
+ */
1562
+ public TColor subSelf(TColor c) {
1563
+ rgb[0] = MathUtils.max(rgb[0] - c.rgb[0], 0);
1564
+ rgb[1] = MathUtils.max(rgb[1] - c.rgb[1], 0);
1565
+ rgb[2] = MathUtils.max(rgb[2] - c.rgb[2], 0);
1566
+ return setRGB(rgb);
1567
+ }
1568
+
1569
+ /*
1570
+ * (non-Javadoc)
1571
+ *
1572
+ * @see toxi.color.ReadonlyTColor#toARGB()
1573
+ */
1574
+ @Override
1575
+ public int toARGB() {
1576
+ return (int) (rgb[0] * 255) << 16 | (int) (rgb[1] * 255) << 8
1577
+ | (int) (rgb[2] * 255) | (int) (alpha * 255) << 24;
1578
+ }
1579
+
1580
+ /*
1581
+ * (non-Javadoc)
1582
+ *
1583
+ * @see toxi.color.ReadonlyTColor#toCMYKAArray(float[])
1584
+ */
1585
+ @Override
1586
+ public float[] toCMYKAArray(float[] cmyka) {
1587
+ if (cmyka == null || cmyka.length < 5) {
1588
+ cmyka = new float[5];
1589
+ }
1590
+ cmyka[0] = cmyk[0];
1591
+ cmyka[1] = cmyk[1];
1592
+ cmyka[2] = cmyk[2];
1593
+ cmyka[3] = cmyk[3];
1594
+ cmyka[4] = alpha;
1595
+ return cmyka;
1596
+ }
1597
+
1598
+ /**
1599
+ * Converts the color into a 6 digit hex string.
1600
+ *
1601
+ * @return color as hex
1602
+ */
1603
+ public String toHex() {
1604
+ String hex = Integer.toHexString(toARGB());
1605
+ if (hex.length() > 6) {
1606
+ hex = hex.substring(2);
1607
+ }
1608
+ return hex;
1609
+ }
1610
+
1611
+ /*
1612
+ * (non-Javadoc)
1613
+ *
1614
+ * @see toxi.color.ReadonlyTColor#toHSVAArray(float[])
1615
+ */
1616
+ @Override
1617
+ public float[] toHSVAArray(float[] hsva) {
1618
+ if (hsva == null || hsva.length < 4) {
1619
+ hsva = new float[4];
1620
+ }
1621
+ hsva[0] = hsv[0];
1622
+ hsva[1] = hsv[1];
1623
+ hsva[2] = hsv[2];
1624
+ hsva[3] = alpha;
1625
+ return hsva;
1626
+ }
1627
+
1628
+ /*
1629
+ * (non-Javadoc)
1630
+ *
1631
+ * @see toxi.color.ReadonlyTColor#toRGBAArray(float[])
1632
+ */
1633
+ @Override
1634
+ public float[] toRGBAArray(float[] rgba) {
1635
+ return toRGBAArray(rgba, 0);
1636
+ }
1637
+
1638
+ /*
1639
+ * (non-Javadoc)
1640
+ *
1641
+ * @see toxi.color.ReadonlyTColor#toRGBAArray(float[], int)
1642
+ */
1643
+ @Override
1644
+ public float[] toRGBAArray(float[] rgba, int offset) {
1645
+ if (rgba == null || rgba.length < offset + 4) {
1646
+ rgba = new float[4];
1647
+ offset = 0;
1648
+ }
1649
+ rgba[offset++] = rgb[0];
1650
+ rgba[offset++] = rgb[1];
1651
+ rgba[offset++] = rgb[2];
1652
+ rgba[offset] = alpha;
1653
+ return rgba;
1654
+ }
1655
+
1656
+ /**
1657
+ *
1658
+ * @return
1659
+ */
1660
+ @Override
1661
+ public String toString() {
1662
+ return "TColor: rgb: " + rgb[0] + "," + rgb[1] + "," + rgb[2]
1663
+ + " hsv: " + hsv[0] + "," + hsv[1] + "," + hsv[2] + " cmyk: "
1664
+ + cmyk[0] + "," + cmyk[1] + "," + cmyk[2] + "," + cmyk[3]
1665
+ + " alpha: " + alpha;
1666
+ }
1667
+
1668
+ /*
1669
+ * (non-Javadoc)
1670
+ *
1671
+ * @see toxi.color.ReadonlyTColor#yellow()
1672
+ */
1673
+ @Override
1674
+ public float yellow() {
1675
+ return cmyk[2];
1676
+ }
1677
+ }