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,985 @@
1
+ /*
2
+ * __ .__ .__ ._____.
3
+ * _/ |_ _______ __|__| ____ | | |__\_ |__ ______
4
+ * \ __\/ _ \ \/ / |/ ___\| | | || __ \ / ___/
5
+ * | | ( <_> > <| \ \___| |_| || \_\ \\___ \
6
+ * |__| \____/__/\_ \__|\___ >____/__||___ /____ >
7
+ * \/ \/ \/ \/
8
+ *
9
+ * Copyright (c) 2006-2011 Karsten Schmidt
10
+ *
11
+ * This library is free software; you can redistribute it and/or
12
+ * modify it under the terms of the GNU Lesser General Public
13
+ * License as published by the Free Software Foundation; either
14
+ * version 2.1 of the License, or (at your option) any later version.
15
+ *
16
+ * http://creativecommons.org/licenses/LGPL/2.1/
17
+ *
18
+ * This library is distributed in the hope that it will be useful,
19
+ * but WITHOUT ANY WARRANTY; without even the implied warranty of
20
+ * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU
21
+ * Lesser General Public License for more details.
22
+ *
23
+ * You should have received a copy of the GNU Lesser General Public
24
+ * License along with this library; if not, write to the Free Software
25
+ * Foundation, Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301, USA
26
+ */
27
+
28
+ package toxi.geom;
29
+
30
+ import javax.xml.bind.annotation.XmlAttribute;
31
+
32
+ import toxi.math.InterpolateStrategy;
33
+ import toxi.math.MathUtils;
34
+ import toxi.math.ScaleMap;
35
+
36
+ /**
37
+ *
38
+ * @author tux
39
+ */
40
+ public class Vec4D implements ReadonlyVec4D, Cloneable {
41
+
42
+ /** X coordinate */
43
+ @XmlAttribute(required = true)
44
+ public float x;
45
+
46
+ /** Y coordinate */
47
+ @XmlAttribute(required = true)
48
+ public float y;
49
+
50
+ /** Z coordinate */
51
+ @XmlAttribute(required = true)
52
+ public float z;
53
+
54
+ /** W coordinate (weight) */
55
+ @XmlAttribute(required = true)
56
+ public float w;
57
+
58
+ /**
59
+ *
60
+ */
61
+ public Vec4D() {
62
+ }
63
+
64
+ /**
65
+ *
66
+ * @param x
67
+ * @param y
68
+ * @param z
69
+ * @param w
70
+ */
71
+ public Vec4D(float x, float y, float z, float w) {
72
+ this.x = x;
73
+ this.y = y;
74
+ this.z = z;
75
+ this.w = w;
76
+ }
77
+
78
+ /**
79
+ *
80
+ * @param v
81
+ * @param w
82
+ */
83
+ public Vec4D(ReadonlyVec3D v, float w) {
84
+ this.x = v.x();
85
+ this.y = v.y();
86
+ this.z = v.z();
87
+ this.w = w;
88
+ }
89
+
90
+ /**
91
+ *
92
+ * @param v
93
+ */
94
+ public Vec4D(ReadonlyVec4D v) {
95
+ set(v);
96
+ }
97
+
98
+ /**
99
+ *
100
+ * @return
101
+ */
102
+ public Vec4D abs() {
103
+ x = MathUtils.abs(x);
104
+ y = MathUtils.abs(y);
105
+ z = MathUtils.abs(z);
106
+ w = MathUtils.abs(w);
107
+ return this;
108
+ }
109
+
110
+ @Override
111
+ public final Vec4D add(ReadonlyVec4D v) {
112
+ return new Vec4D(x + v.x(), y + v.y(), z + v.z(), w + v.w());
113
+ }
114
+
115
+ /**
116
+ *
117
+ * @param t
118
+ * @param s
119
+ * @return
120
+ */
121
+ @Override
122
+ public final Vec4D addScaled(ReadonlyVec4D t, float s) {
123
+ return new Vec4D(s * t.x(), s * t.y(), s * t.z(), s * t.w());
124
+ }
125
+
126
+ /**
127
+ *
128
+ * @param t
129
+ * @param s
130
+ * @return
131
+ */
132
+ public final Vec4D addScaledSelf(ReadonlyVec4D t, float s) {
133
+ x += s * t.x();
134
+ y += s * t.y();
135
+ z += s * t.z();
136
+ w += s * t.w();
137
+ return this;
138
+ }
139
+
140
+ /**
141
+ *
142
+ * @param v
143
+ * @return
144
+ */
145
+ public final Vec4D addSelf(ReadonlyVec4D v) {
146
+ this.x += v.x();
147
+ this.y += v.y();
148
+ this.z += v.z();
149
+ this.w += v.w();
150
+ return this;
151
+ }
152
+
153
+ @Override
154
+ public final Vec4D addXYZ(float xx, float yy, float zz) {
155
+ return new Vec4D(x + xx, y + yy, z + zz, w);
156
+ }
157
+
158
+ /**
159
+ *
160
+ * @param v
161
+ * @return
162
+ */
163
+ public final Vec4D addXYZ(ReadonlyVec3D v) {
164
+ return new Vec4D(x + v.x(), y + v.y(), z + v.z(), w);
165
+ }
166
+
167
+ /**
168
+ *
169
+ * @param xx
170
+ * @param yy
171
+ * @param zz
172
+ * @return
173
+ */
174
+ public final Vec4D addXYZSelf(float xx, float yy, float zz) {
175
+ x += xx;
176
+ y += yy;
177
+ z += zz;
178
+ return this;
179
+ }
180
+
181
+ /**
182
+ *
183
+ * @param v
184
+ * @return
185
+ */
186
+ public final Vec4D addXYZSelf(ReadonlyVec3D v) {
187
+ this.x += v.x();
188
+ this.y += v.y();
189
+ this.z += v.z();
190
+ return this;
191
+ }
192
+
193
+ /**
194
+ * Returns the (4-space) angle in radians between this vector and the vector
195
+ * parameter; the return value is constrained to the range [0,PI].
196
+ *
197
+ * @param v
198
+ * the other vector
199
+ * @return the angle in radians in the range [0,PI]
200
+ */
201
+ @Override
202
+ public final float angleBetween(ReadonlyVec4D v) {
203
+ double vDot = dot(v) / (magnitude() * v.magnitude());
204
+ if (vDot < -1.0) {
205
+ vDot = -1.0;
206
+ }
207
+ if (vDot > 1.0) {
208
+ vDot = 1.0;
209
+ }
210
+ return (float) (Math.acos(vDot));
211
+ }
212
+
213
+ @Override
214
+ public int compareTo(ReadonlyVec4D o) {
215
+ if (this.equals(o)) {
216
+ return 0;
217
+ }
218
+ int result = (this.magSquared() < o.magSquared()) ? -1 : 1;
219
+ return result;
220
+ }
221
+
222
+ @Override
223
+ public final Vec4D copy() {
224
+ return new Vec4D(this);
225
+ }
226
+
227
+ @Override
228
+ public final float distanceTo(ReadonlyVec4D v) {
229
+ if (v != null) {
230
+ final float dx = x - v.x();
231
+ final float dy = y - v.y();
232
+ final float dz = z - v.z();
233
+ final float dw = w - v.z();
234
+ return (float) Math.sqrt(dx * dx + dy * dy + dz * dz + dw * dw);
235
+ } else {
236
+ return Float.NaN;
237
+ }
238
+ }
239
+
240
+ @Override
241
+ public final float distanceToSquared(ReadonlyVec4D v) {
242
+ if (v != null) {
243
+ final float dx = x - v.x();
244
+ final float dy = y - v.y();
245
+ final float dz = z - v.z();
246
+ final float dw = w - v.z();
247
+ return dx * dx + dy * dy + dz * dz + dw * dw;
248
+ } else {
249
+ return Float.NaN;
250
+ }
251
+ }
252
+
253
+ @Override
254
+ public final float dot(ReadonlyVec4D v) {
255
+ return (x * v.x() + y * v.y() + z * v.z() + w * v.w());
256
+ }
257
+
258
+ /**
259
+ * Returns true if the Object v is of type ReadonlyVec4D and all of the data
260
+ * members of v are equal to the corresponding data members in this vector.
261
+ *
262
+ * @param v
263
+ * the Object with which the comparison is made
264
+ * @return true or false
265
+ */
266
+ @Override
267
+ public boolean equals(Object v) {
268
+ if (v instanceof ReadonlyVec4D) {
269
+ ReadonlyVec4D vv = (ReadonlyVec4D) v;
270
+ if (!((Float) x).equals(vv.x())) {
271
+ return false;
272
+ }
273
+ if (!((Float) y).equals(vv.y())) {
274
+ return false;
275
+ }
276
+ if (!((Float) z).equals(vv.z())) {
277
+ return false;
278
+ }
279
+ return ((Float) w).equals(vv.w());
280
+ }
281
+ return false;
282
+ }
283
+
284
+ /**
285
+ * Returns a hash code value based on the data values in this object. Two
286
+ * different Vec4D objects with identical data values (i.e., Vec4D.equals
287
+ * returns true) will return the same hash code value. Two objects with
288
+ * different data members may return the same hash value, although this is
289
+ * not likely.
290
+ *
291
+ * @return the integer hash code value
292
+ */
293
+
294
+ @Override
295
+ public int hashCode() {
296
+ int hash = 7;
297
+ hash = 29 * hash + Float.floatToIntBits(this.x);
298
+ hash = 29 * hash + Float.floatToIntBits(this.y);
299
+ hash = 29 * hash + Float.floatToIntBits(this.z);
300
+ hash = 29 * hash + Float.floatToIntBits(this.w);
301
+ return hash;
302
+ }
303
+
304
+ /**
305
+ * Returns true if the Object v is of type Vec4D and all of the data members
306
+ * of v are equal to the corresponding data members in this vector.
307
+ *
308
+ * @param v
309
+ * the vector with which the comparison is made
310
+ * @return true or false
311
+ */
312
+ public boolean equals(ReadonlyVec4D v) {
313
+ if (!((Float) x).equals(v.x())) {
314
+ return false;
315
+ }
316
+ if (!((Float) y).equals(v.y())) {
317
+ return false;
318
+ }
319
+ if (!((Float) z).equals(v.z())) {
320
+ return false;
321
+ }
322
+ return ((Float) w).equals(v.w());
323
+ }
324
+
325
+ @Override
326
+ public boolean equalsWithTolerance(ReadonlyVec4D v, float tolerance) {
327
+ if (v instanceof ReadonlyVec4D) {
328
+ float diff = x - v.x();
329
+ if (Float.isNaN(diff)) {
330
+ return false;
331
+ }
332
+ if ((diff < 0 ? -diff : diff) > tolerance) {
333
+ return false;
334
+ }
335
+ diff = y - v.y();
336
+ if (Float.isNaN(diff)) {
337
+ return false;
338
+ }
339
+ if ((diff < 0 ? -diff : diff) > tolerance) {
340
+ return false;
341
+ }
342
+ diff = z - v.z();
343
+ if (Float.isNaN(diff)) {
344
+ return false;
345
+ }
346
+ if ((diff < 0 ? -diff : diff) > tolerance) {
347
+ return false;
348
+ }
349
+ diff = w - v.w();
350
+ if (Float.isNaN(diff)) {
351
+ return false;
352
+ }
353
+ return ((diff > 0 ? -diff : diff) < tolerance);
354
+ }
355
+ return false;
356
+ }
357
+
358
+ @Override
359
+ public Vec4D getAbs() {
360
+ return copy().abs();
361
+ }
362
+
363
+ @Override
364
+ public final Vec4D getInvertedXYZ() {
365
+ return copy().invertXYZ();
366
+ }
367
+
368
+ @Override
369
+ public Vec4D getMapped(ScaleMap map) {
370
+ return new Vec4D((float) map.getClippedValueFor(x),
371
+ (float) map.getClippedValueFor(y),
372
+ (float) map.getClippedValueFor(z),
373
+ (float) map.getClippedValueFor(w));
374
+ }
375
+
376
+ @Override
377
+ public Vec4D getMappedXYZ(ScaleMap map) {
378
+ return new Vec4D((float) map.getClippedValueFor(x),
379
+ (float) map.getClippedValueFor(y),
380
+ (float) map.getClippedValueFor(z), w);
381
+ }
382
+
383
+ @Override
384
+ public Vec4D getNormalized() {
385
+ return copy().normalize();
386
+ }
387
+
388
+ @Override
389
+ public Vec4D getNormalizedTo(float len) {
390
+ return copy().normalizeTo(len);
391
+ }
392
+
393
+ @Override
394
+ public Vec4D getRotatedAroundAxis(ReadonlyVec3D axis, float theta) {
395
+ return copy().rotateAroundAxis(axis, theta);
396
+ }
397
+
398
+ @Override
399
+ public Vec4D getRotatedX(float theta) {
400
+ return copy().rotateX(theta);
401
+ }
402
+
403
+ @Override
404
+ public Vec4D getRotatedY(float theta) {
405
+ return copy().rotateY(theta);
406
+ }
407
+
408
+ @Override
409
+ public Vec4D getRotatedZ(float theta) {
410
+ return copy().rotateZ(theta);
411
+ }
412
+
413
+ @Override
414
+ public Vec4D getRoundedXYZTo(float prec) {
415
+ return copy().roundXYZTo(prec);
416
+ }
417
+
418
+ /**
419
+ *
420
+ * @return
421
+ */
422
+ @Override
423
+ public Vec4D getUnweighted() {
424
+ return copy().unweight();
425
+ }
426
+
427
+ /**
428
+ *
429
+ * @return
430
+ */
431
+ @Override
432
+ public Vec4D getWeighted() {
433
+ return copy().weight();
434
+ }
435
+
436
+ @Override
437
+ public final Vec4D interpolateTo(ReadonlyVec4D v, float t) {
438
+ return copy().interpolateToSelf(v, t);
439
+ }
440
+
441
+ @Override
442
+ public final Vec4D interpolateTo(ReadonlyVec4D v, float f,
443
+ InterpolateStrategy s) {
444
+ return new Vec4D(s.interpolate(x, v.x(), f),
445
+ s.interpolate(y, v.y(), f), s.interpolate(z, v.z(), f),
446
+ s.interpolate(w, v.w(), f));
447
+ }
448
+
449
+ /**
450
+ *
451
+ * @param v
452
+ * @param t
453
+ * @return
454
+ */
455
+ public final Vec4D interpolateToSelf(ReadonlyVec4D v, float t) {
456
+ this.x += (v.x() - x) * t;
457
+ this.y += (v.y() - y) * t;
458
+ this.z += (v.z() - z) * t;
459
+ this.w += (v.w() - w) * t;
460
+ return this;
461
+ }
462
+
463
+ /**
464
+ *
465
+ * @param v
466
+ * @param f
467
+ * @param s
468
+ * @return
469
+ */
470
+ public final Vec4D interpolateToSelf(ReadonlyVec4D v, float f,
471
+ InterpolateStrategy s) {
472
+ x = s.interpolate(x, v.x(), f);
473
+ y = s.interpolate(y, v.y(), f);
474
+ z = s.interpolate(z, v.z(), f);
475
+ w = s.interpolate(w, v.w(), f);
476
+ return this;
477
+ }
478
+
479
+ /**
480
+ *
481
+ * @return
482
+ */
483
+ public final Vec4D invertXYZ() {
484
+ this.x *= -1;
485
+ this.y *= -1;
486
+ this.z *= -1;
487
+ return this;
488
+ }
489
+
490
+ @Override
491
+ public final boolean isZeroVector() {
492
+ return MathUtils.abs(x) < MathUtils.EPS
493
+ && MathUtils.abs(y) < MathUtils.EPS
494
+ && MathUtils.abs(z) < MathUtils.EPS
495
+ && MathUtils.abs(w) < MathUtils.EPS;
496
+ }
497
+
498
+ @Override
499
+ public final float magnitude() {
500
+ return (float) Math.sqrt(x * x + y * y + z * z + w * w);
501
+ }
502
+
503
+ @Override
504
+ public final float magSquared() {
505
+ return x * x + y * y + z * z + w * w;
506
+ }
507
+
508
+ /**
509
+ * Normalizes the vector so that its magnitude = 1.
510
+ *
511
+ * @return itself
512
+ */
513
+ public final Vec4D normalize() {
514
+ float mag = (float) Math.sqrt(x * x + y * y + z * z);
515
+ if (mag > 0) {
516
+ mag = 1f / mag;
517
+ x *= mag;
518
+ y *= mag;
519
+ z *= mag;
520
+ w *= mag;
521
+ }
522
+ return this;
523
+ }
524
+
525
+ /**
526
+ * Normalizes the vector to the given length.
527
+ *
528
+ * @param len
529
+ * desired length
530
+ * @return itself
531
+ */
532
+ public final Vec4D normalizeTo(float len) {
533
+ float mag = (float) Math.sqrt(x * x + y * y + z * z);
534
+ if (mag > 0) {
535
+ mag = len / mag;
536
+ x *= mag;
537
+ y *= mag;
538
+ z *= mag;
539
+ w *= mag;
540
+ }
541
+ return this;
542
+ }
543
+
544
+ /**
545
+ * Rotates the vector around the giving axis.
546
+ *
547
+ * @param axis
548
+ * rotation axis vector
549
+ * @param theta
550
+ * rotation angle (in radians)
551
+ *
552
+ * @return itself
553
+ */
554
+ public final Vec4D rotateAroundAxis(ReadonlyVec3D axis, float theta) {
555
+ final float ax = axis.x();
556
+ final float ay = axis.y();
557
+ final float az = axis.z();
558
+ final float ux = ax * x;
559
+ final float uy = ax * y;
560
+ final float uz = ax * z;
561
+ final float vx = ay * x;
562
+ final float vy = ay * y;
563
+ final float vz = ay * z;
564
+ final float wx = az * x;
565
+ final float wy = az * y;
566
+ final float wz = az * z;
567
+ final double si = Math.sin(theta);
568
+ final double co = Math.cos(theta);
569
+ float xx = (float) (ax * (ux + vy + wz)
570
+ + (x * (ay * ay + az * az) - ax * (vy + wz)) * co + (-wy + vz)
571
+ * si);
572
+ float yy = (float) (ay * (ux + vy + wz)
573
+ + (y * (ax * ax + az * az) - ay * (ux + wz)) * co + (wx - uz)
574
+ * si);
575
+ float zz = (float) (az * (ux + vy + wz)
576
+ + (z * (ax * ax + ay * ay) - az * (ux + vy)) * co + (-vx + uy)
577
+ * si);
578
+ x = xx;
579
+ y = yy;
580
+ z = zz;
581
+ return this;
582
+ }
583
+
584
+ /**
585
+ * Rotates the vector by the given angle around the X axis.
586
+ *
587
+ * @param theta
588
+ * the theta
589
+ *
590
+ * @return itself
591
+ */
592
+ public final Vec4D rotateX(float theta) {
593
+ final float co = (float) Math.cos(theta);
594
+ final float si = (float) Math.sin(theta);
595
+ final float zz = co * z - si * y;
596
+ y = si * z + co * y;
597
+ z = zz;
598
+ return this;
599
+ }
600
+
601
+ /**
602
+ * Rotates the vector by the given angle around the Y axis.
603
+ *
604
+ * @param theta
605
+ * the theta
606
+ *
607
+ * @return itself
608
+ */
609
+ public final Vec4D rotateY(float theta) {
610
+ final float co = (float) Math.cos(theta);
611
+ final float si = (float) Math.sin(theta);
612
+ final float xx = co * x - si * z;
613
+ z = si * x + co * z;
614
+ x = xx;
615
+ return this;
616
+ }
617
+
618
+ /**
619
+ * Rotates the vector by the given angle around the Z axis.
620
+ *
621
+ * @param theta
622
+ * the theta
623
+ *
624
+ * @return itself
625
+ */
626
+ public final Vec4D rotateZ(float theta) {
627
+ final float co = (float) Math.cos(theta);
628
+ final float si = (float) Math.sin(theta);
629
+ final float xx = co * x - si * y;
630
+ y = si * x + co * y;
631
+ x = xx;
632
+ return this;
633
+ }
634
+
635
+ /**
636
+ *
637
+ * @param prec
638
+ * @return
639
+ */
640
+ public Vec4D roundXYZTo(float prec) {
641
+ x = MathUtils.roundTo(x, prec);
642
+ y = MathUtils.roundTo(y, prec);
643
+ z = MathUtils.roundTo(z, prec);
644
+ return this;
645
+ }
646
+
647
+ @Override
648
+ public final Vec4D scale(float s) {
649
+ return new Vec4D(x * s, y * s, z * s, w * s);
650
+ }
651
+
652
+ @Override
653
+ public final Vec4D scale(float xx, float yy, float zz, float ww) {
654
+ return new Vec4D(x * xx, y * yy, z * zz, w * ww);
655
+ }
656
+
657
+ @Override
658
+ public Vec4D scale(ReadonlyVec4D s) {
659
+ return copy().scaleSelf(s);
660
+ }
661
+
662
+ /**
663
+ *
664
+ * @param s
665
+ * @return
666
+ */
667
+ public final Vec4D scaleSelf(float s) {
668
+ this.x *= s;
669
+ this.y *= s;
670
+ this.z *= s;
671
+ this.w *= s;
672
+ return this;
673
+ }
674
+
675
+ /**
676
+ *
677
+ * @param s
678
+ * @return
679
+ */
680
+ public Vec4D scaleSelf(ReadonlyVec4D s) {
681
+ this.x *= s.x();
682
+ this.y *= s.y();
683
+ this.z *= s.z();
684
+ this.w *= s.w();
685
+ return this;
686
+ }
687
+
688
+ /**
689
+ *
690
+ * @param s
691
+ * @return
692
+ */
693
+ public final Vec4D scaleXYZSelf(float s) {
694
+ this.x *= s;
695
+ this.y *= s;
696
+ this.z *= s;
697
+ return this;
698
+ }
699
+
700
+ /**
701
+ *
702
+ * @param xscale
703
+ * @param yscale
704
+ * @param zscale
705
+ * @return
706
+ */
707
+ public final Vec4D scaleXYZSelf(float xscale, float yscale, float zscale) {
708
+ this.x *= xscale;
709
+ this.y *= yscale;
710
+ this.z *= zscale;
711
+ return this;
712
+ }
713
+
714
+ /**
715
+ * Overrides coordinates with the given values.
716
+ *
717
+ * @param x
718
+ * the x
719
+ * @param y
720
+ * the y
721
+ * @param z
722
+ * the z
723
+ * @param w
724
+ * the w
725
+ *
726
+ * @return itself
727
+ */
728
+ public Vec4D set(float x, float y, float z, float w) {
729
+ this.x = x;
730
+ this.y = y;
731
+ this.z = z;
732
+ this.w = w;
733
+ return this;
734
+ }
735
+
736
+ /**
737
+ *
738
+ * @param v
739
+ * @return
740
+ */
741
+ public final Vec4D set(ReadonlyVec4D v) {
742
+ this.x = v.x();
743
+ this.y = v.y();
744
+ this.z = v.z();
745
+ this.w = v.w();
746
+ return this;
747
+ }
748
+
749
+ /**
750
+ *
751
+ * @param w
752
+ * @return
753
+ */
754
+ public Vec4D setW(float w) {
755
+ this.w = w;
756
+ return this;
757
+ }
758
+
759
+ /**
760
+ *
761
+ * @param x
762
+ * @return
763
+ */
764
+ public Vec4D setX(float x) {
765
+ this.x = x;
766
+ return this;
767
+ }
768
+
769
+ /**
770
+ *
771
+ * @param v
772
+ * @return
773
+ */
774
+ public final Vec4D setXYZ(ReadonlyVec3D v) {
775
+ this.x = v.x();
776
+ this.y = v.y();
777
+ this.z = v.z();
778
+ return this;
779
+ }
780
+
781
+ /**
782
+ *
783
+ * @param y
784
+ * @return
785
+ */
786
+ public Vec4D setY(float y) {
787
+ this.y = y;
788
+ return this;
789
+ }
790
+
791
+ /**
792
+ *
793
+ * @param z
794
+ * @return
795
+ */
796
+ public Vec4D setZ(float z) {
797
+ this.z = z;
798
+ return this;
799
+ }
800
+
801
+ @Override
802
+ public final Vec4D sub(ReadonlyVec4D v) {
803
+ return new Vec4D(x - v.x(), y - v.y(), z - v.z(), w - v.w());
804
+ }
805
+
806
+ /**
807
+ *
808
+ * @param v
809
+ * @return
810
+ */
811
+ public final Vec4D subSelf(ReadonlyVec4D v) {
812
+ this.x -= v.x();
813
+ this.y -= v.y();
814
+ this.z -= v.z();
815
+ this.w -= v.w();
816
+ return this;
817
+ }
818
+
819
+ @Override
820
+ public final Vec4D subXYZ(float xx, float yy, float zz) {
821
+ return new Vec4D(x - xx, y - yy, z - zz, w);
822
+ }
823
+
824
+ /**
825
+ *
826
+ * @param v
827
+ * @return
828
+ */
829
+ public final Vec4D subXYZ(ReadonlyVec3D v) {
830
+ return new Vec4D(x - v.x(), y - v.y(), z - v.z(), w);
831
+ }
832
+
833
+ /**
834
+ *
835
+ * @param xx
836
+ * @param yy
837
+ * @param zz
838
+ * @return
839
+ */
840
+ public final Vec4D subXYZSelf(float xx, float yy, float zz) {
841
+ this.x -= xx;
842
+ this.y -= yy;
843
+ this.z -= zz;
844
+ return this;
845
+ }
846
+
847
+ /**
848
+ *
849
+ * @param v
850
+ * @return
851
+ */
852
+ public final Vec4D subXYZSelf(ReadonlyVec3D v) {
853
+ this.x -= v.x();
854
+ this.y -= v.y();
855
+ this.z -= v.z();
856
+ return this;
857
+ }
858
+
859
+ /**
860
+ *
861
+ * @return
862
+ */
863
+ public final Vec3D to3D() {
864
+ return new Vec3D(x, y, z);
865
+ }
866
+
867
+ /**
868
+ *
869
+ * @return
870
+ */
871
+ @Override
872
+ public float[] toArray() {
873
+ return new float[] {
874
+ x, y, z, w
875
+ };
876
+ }
877
+
878
+ /**
879
+ *
880
+ * @return
881
+ */
882
+ @Override
883
+ public String toString() {
884
+ return "[x=" + x + ", y=" + y + ", z=" + z + ", w=" + w + "]";
885
+ }
886
+
887
+ /**
888
+ *
889
+ * @param xx
890
+ * @param yy
891
+ * @param zz
892
+ * @return
893
+ */
894
+ public final Vec4D translate(float xx, float yy, float zz) {
895
+ this.x += w * xx;
896
+ this.y += w * yy;
897
+ this.z += w * zz;
898
+ return this;
899
+ }
900
+
901
+ /**
902
+ * Divides each coordinate bythe weight with and sets the coordinate to the
903
+ * newly calculatd ones.
904
+ * @return
905
+ */
906
+ public final Vec4D unweight() {
907
+ float iw = MathUtils.abs(w) > MathUtils.EPS ? 1f / w : 0;
908
+ x *= iw;
909
+ y *= iw;
910
+ z *= iw;
911
+ return this;
912
+ }
913
+
914
+ /**
915
+ *
916
+ * @param out
917
+ * @return
918
+ */
919
+ @Override
920
+ public final Vec3D unweightInto(Vec3D out) {
921
+ float iw = MathUtils.abs(w) > MathUtils.EPS ? 1f / w : 0;
922
+ out.x = x * iw;
923
+ out.y = y * iw;
924
+ out.z = z * iw;
925
+ return out;
926
+ }
927
+
928
+ /**
929
+ * @return the w
930
+ */
931
+ @Override
932
+ public final float w() {
933
+ return w;
934
+ }
935
+
936
+ /**
937
+ * Multiplies the weight with each coordinate and sets the coordinate to the
938
+ * newly calculatd ones.
939
+ *
940
+ * @return itself
941
+ */
942
+ public final Vec4D weight() {
943
+ x *= w;
944
+ y *= w;
945
+ z *= w;
946
+ return this;
947
+ }
948
+
949
+ /**
950
+ *
951
+ * @param out
952
+ * @return
953
+ */
954
+ @Override
955
+ public final Vec3D weightInto(Vec3D out) {
956
+ out.x = x * w;
957
+ out.y = y * w;
958
+ out.z = z * w;
959
+ return out;
960
+ }
961
+
962
+ /**
963
+ * @return the x
964
+ */
965
+ @Override
966
+ public final float x() {
967
+ return x;
968
+ }
969
+
970
+ /**
971
+ * @return the y
972
+ */
973
+ @Override
974
+ public final float y() {
975
+ return y;
976
+ }
977
+
978
+ /**
979
+ * @return the z
980
+ */
981
+ @Override
982
+ public final float z() {
983
+ return z;
984
+ }
985
+ }