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,1076 @@
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 toxi.math.MathUtils;
31
+
32
+ /**
33
+ * Implements a simple row-major 4x4 matrix class, all matrix operations are
34
+ * applied to new instances. Use {@link #transpose()} to convert from
35
+ * column-major formats...
36
+ */
37
+ public class Matrix4x4 {
38
+
39
+ private static final Matrix4x4 TEMP = new Matrix4x4();
40
+
41
+ /**
42
+ * Given a MxM array "matrix0", this function replaces it with the LU
43
+ * decomposition of a row-wise permutation of itself. The input parameters
44
+ * are "matrix0" and "dimen". The array "matrix0" is also an output
45
+ * parameter. The vector "row_perm[4]" is an output parameter that contains
46
+ * the row permutations resulting from partial pivoting. The output
47
+ * parameter "even_row_xchg" is 1 when the number of row exchanges is even,
48
+ * or -1 otherwise. Assumes data type is always double.
49
+ *
50
+ * This function is similar to luDecomposition, except that it is tuned
51
+ * specifically for 4x4 matrices.
52
+ *
53
+ * Reference: Press, Flannery, Teukolsky, Vetterling,
54
+ * _Numerical_Recipes_in_C_, Cambridge University Press, 1988, pp 40-45.
55
+ *
56
+ * @param matrix0
57
+ * @param row_perm
58
+ * @param width
59
+ * @return true if the matrix is nonsingular, or false otherwise.
60
+ */
61
+ static boolean LUDecomposition(double[] matrix0, int[] row_perm, int width) {
62
+ double row_scale[] = new double[width];
63
+ // Determine implicit scaling information by looping over rows
64
+ {
65
+ int i, j;
66
+ int ptr, rs;
67
+ double big, temp;
68
+
69
+ ptr = 0;
70
+ rs = 0;
71
+
72
+ // For each row ...
73
+ i = width;
74
+ while (i-- != 0) {
75
+ big = 0.0;
76
+
77
+ // For each column, find the largest element in the row
78
+ j = width;
79
+ while (j-- != 0) {
80
+ temp = matrix0[ptr++];
81
+ temp = Math.abs(temp);
82
+ if (temp > big) {
83
+ big = temp;
84
+ }
85
+ }
86
+ // Is the matrix singular?
87
+ if (big == 0.0) {
88
+ return false;
89
+ }
90
+ row_scale[rs++] = 1.0 / big;
91
+ }
92
+ }
93
+
94
+ {
95
+ int j;
96
+ int mtx = 0;
97
+
98
+ // For all columns, execute Crout's method
99
+ for (j = 0; j < width; j++) {
100
+ int i, imax, k;
101
+ int target, p1, p2;
102
+ double sum, big, temp;
103
+
104
+ // Determine elements of upper diagonal matrix U
105
+ for (i = 0; i < j; i++) {
106
+ target = mtx + (width * i) + j;
107
+ sum = matrix0[target];
108
+ k = i;
109
+ p1 = mtx + (width * i);
110
+ p2 = mtx + j;
111
+ while (k-- != 0) {
112
+ sum -= matrix0[p1] * matrix0[p2];
113
+ p1++;
114
+ p2 += width;
115
+ }
116
+ matrix0[target] = sum;
117
+ }
118
+
119
+ // Search for largest pivot element and calculate
120
+ // intermediate elements of lower diagonal matrix L.
121
+ big = 0.0;
122
+ imax = -1;
123
+ for (i = j; i < width; i++) {
124
+ target = mtx + (width * i) + j;
125
+ sum = matrix0[target];
126
+ k = j;
127
+ p1 = mtx + (width * i);
128
+ p2 = mtx + j;
129
+ while (k-- != 0) {
130
+ sum -= matrix0[p1] * matrix0[p2];
131
+ p1++;
132
+ p2 += width;
133
+ }
134
+ matrix0[target] = sum;
135
+
136
+ // Is this the best pivot so far?
137
+ if ((temp = row_scale[i] * Math.abs(sum)) >= big) {
138
+ big = temp;
139
+ imax = i;
140
+ }
141
+ }
142
+
143
+ if (imax < 0) {
144
+ throw new RuntimeException();
145
+ }
146
+
147
+ // Is a row exchange necessary?
148
+ if (j != imax) {
149
+ // Yes: exchange rows
150
+ k = width;
151
+ p1 = mtx + (width * imax);
152
+ p2 = mtx + (width * j);
153
+ while (k-- != 0) {
154
+ temp = matrix0[p1];
155
+ matrix0[p1++] = matrix0[p2];
156
+ matrix0[p2++] = temp;
157
+ }
158
+
159
+ // Record change in scale factor
160
+ row_scale[imax] = row_scale[j];
161
+ }
162
+
163
+ // Record row permutation
164
+ row_perm[j] = imax;
165
+
166
+ // Is the matrix singular
167
+ if (matrix0[(mtx + (width * j) + j)] == 0.0) {
168
+ return false;
169
+ }
170
+
171
+ // Divide elements of lower diagonal matrix L by pivot
172
+ if (j != width - 1) {
173
+ temp = 1.0 / (matrix0[(mtx + (width * j) + j)]);
174
+ target = mtx + (width * (j + 1)) + j;
175
+ i = (width - 1) - j;
176
+ while (i-- != 0) {
177
+ matrix0[target] *= temp;
178
+ target += width;
179
+ }
180
+ }
181
+ }
182
+ }
183
+ return true;
184
+ }
185
+
186
+ /**
187
+ *
188
+ */
189
+ public double[][] matrix;
190
+
191
+ /**
192
+ *
193
+ */
194
+ protected double[] temp = new double[4];
195
+
196
+ /**
197
+ *
198
+ */
199
+ public Matrix4x4() {
200
+ init();
201
+ matrix[0][0] = 1;
202
+ matrix[1][1] = 1;
203
+ matrix[2][2] = 1;
204
+ matrix[3][3] = 1;
205
+ }
206
+
207
+ /**
208
+ *
209
+ * @param v11
210
+ * @param v12
211
+ * @param v13
212
+ * @param v14
213
+ * @param v21
214
+ * @param v22
215
+ * @param v23
216
+ * @param v24
217
+ * @param v31
218
+ * @param v32
219
+ * @param v33
220
+ * @param v34
221
+ * @param v41
222
+ * @param v42
223
+ * @param v43
224
+ * @param v44
225
+ */
226
+ public Matrix4x4(double v11, double v12, double v13, double v14,
227
+ double v21, double v22, double v23, double v24, double v31,
228
+ double v32, double v33, double v34, double v41, double v42,
229
+ double v43, double v44) {
230
+ init();
231
+ double[] m = matrix[0];
232
+ m[0] = v11;
233
+ m[1] = v12;
234
+ m[2] = v13;
235
+ m[3] = v14;
236
+ m = matrix[1];
237
+ m[0] = v21;
238
+ m[1] = v22;
239
+ m[2] = v23;
240
+ m[3] = v24;
241
+ m = matrix[2];
242
+ m[0] = v31;
243
+ m[1] = v32;
244
+ m[2] = v33;
245
+ m[3] = v34;
246
+ m = matrix[3];
247
+ m[0] = v41;
248
+ m[1] = v42;
249
+ m[2] = v43;
250
+ m[3] = v44;
251
+ }
252
+
253
+ /**
254
+ * Initialising constructor from a 1d array. Assumes row-major ordering
255
+ * (column index increases faster).
256
+ *
257
+ * @param array
258
+ */
259
+ public Matrix4x4(double[] array) {
260
+ if (array.length != 9 && array.length != 16) {
261
+ throw new RuntimeException("Array.length must == 9 or 16");
262
+ }
263
+ init();
264
+ if (array.length == 16) {
265
+ matrix[0][0] = array[0];
266
+ matrix[0][1] = array[1];
267
+ matrix[0][2] = array[2];
268
+ matrix[0][3] = array[3];
269
+
270
+ matrix[1][0] = array[4];
271
+ matrix[1][1] = array[5];
272
+ matrix[1][2] = array[6];
273
+ matrix[1][3] = array[7];
274
+
275
+ matrix[2][0] = array[8];
276
+ matrix[2][1] = array[9];
277
+ matrix[2][2] = array[10];
278
+ matrix[2][3] = array[11];
279
+
280
+ matrix[3][0] = array[12];
281
+ matrix[3][1] = array[13];
282
+ matrix[3][2] = array[14];
283
+ matrix[3][3] = array[15];
284
+ } else {
285
+ matrix[0][0] = array[0];
286
+ matrix[0][1] = array[1];
287
+ matrix[0][2] = array[2];
288
+
289
+ matrix[1][0] = array[3];
290
+ matrix[1][1] = array[4];
291
+ matrix[1][2] = array[5];
292
+
293
+ matrix[2][0] = array[6];
294
+ matrix[2][1] = array[7];
295
+ matrix[2][2] = array[8];
296
+
297
+ matrix[3][0] = array[9];
298
+ matrix[3][1] = array[10];
299
+ matrix[3][2] = array[11];
300
+ matrix[3][3] = 1;
301
+ }
302
+ }
303
+
304
+ /**
305
+ *
306
+ * @param m
307
+ */
308
+ public Matrix4x4(Matrix4x4 m) {
309
+ init();
310
+ for (int i = 0; i < 4; i++) {
311
+ double[] mi = matrix[i];
312
+ double[] mmi = m.matrix[i];
313
+ mi[0] = mmi[0];
314
+ mi[1] = mmi[1];
315
+ mi[2] = mmi[2];
316
+ mi[3] = mmi[3];
317
+ }
318
+ }
319
+
320
+ /**
321
+ *
322
+ * @param rhs
323
+ * @return
324
+ */
325
+ public Matrix4x4 add(Matrix4x4 rhs) {
326
+ Matrix4x4 result = new Matrix4x4(this);
327
+ return result.addSelf(rhs);
328
+ }
329
+
330
+ /**
331
+ *
332
+ * @param m
333
+ * @return
334
+ */
335
+ public Matrix4x4 addSelf(Matrix4x4 m) {
336
+ for (int i = 0; i < 4; i++) {
337
+ double[] mi = matrix[i];
338
+ double[] rhsm = m.matrix[i];
339
+ mi[0] += rhsm[0];
340
+ mi[1] += rhsm[1];
341
+ mi[2] += rhsm[2];
342
+ mi[3] += rhsm[3];
343
+ }
344
+ return this;
345
+ }
346
+
347
+ /**
348
+ * Creates a copy of the given vector, transformed by this matrix.
349
+ *
350
+ * @param v
351
+ * @return transformed vector
352
+ */
353
+ public Vec3D applyTo(ReadonlyVec3D v) {
354
+ return applyToSelf(new Vec3D(v));
355
+ }
356
+
357
+ /**
358
+ *
359
+ * @param v
360
+ * @return
361
+ */
362
+ public Vec3D applyToSelf(Vec3D v) {
363
+ for (int i = 0; i < 4; i++) {
364
+ double[] m = matrix[i];
365
+ temp[i] = v.x * m[0] + v.y * m[1] + v.z * m[2] + m[3];
366
+ }
367
+ v.set((float) temp[0], (float) temp[1], (float) temp[2]).scaleSelf(
368
+ (float) (1.0 / temp[3]));
369
+ return v;
370
+ }
371
+
372
+ /**
373
+ *
374
+ * @return
375
+ */
376
+ public Matrix4x4 copy() {
377
+ return new Matrix4x4(this);
378
+ }
379
+
380
+ /**
381
+ *
382
+ * @return
383
+ */
384
+ public Matrix4x4 getInverted() {
385
+ return new Matrix4x4(this).invert();
386
+ }
387
+
388
+ /**
389
+ *
390
+ * @param axis
391
+ * @param theta
392
+ * @return
393
+ */
394
+ public Matrix4x4 getRotatedAroundAxis(ReadonlyVec3D axis, double theta) {
395
+ return new Matrix4x4(this).rotateAroundAxis(axis, theta);
396
+ }
397
+
398
+ /**
399
+ *
400
+ * @param theta
401
+ * @return
402
+ */
403
+ public Matrix4x4 getRotatedX(double theta) {
404
+ return new Matrix4x4(this).rotateX(theta);
405
+ }
406
+
407
+ /**
408
+ *
409
+ * @param theta
410
+ * @return
411
+ */
412
+ public Matrix4x4 getRotatedY(double theta) {
413
+ return new Matrix4x4(this).rotateY(theta);
414
+ }
415
+
416
+ /**
417
+ *
418
+ * @param theta
419
+ * @return
420
+ */
421
+ public Matrix4x4 getRotatedZ(double theta) {
422
+ return new Matrix4x4(this).rotateZ(theta);
423
+ }
424
+
425
+ /**
426
+ *
427
+ * @return
428
+ */
429
+ public Matrix4x4 getTransposed() {
430
+ return new Matrix4x4(this).transpose();
431
+ }
432
+
433
+ /**
434
+ *
435
+ * @return
436
+ */
437
+ public Matrix4x4 identity() {
438
+ double[] m;
439
+ m = matrix[0];
440
+ m[1] = m[2] = m[3] = 0;
441
+ m = matrix[1];
442
+ m[0] = m[2] = m[3] = 0;
443
+ m = matrix[2];
444
+ m[0] = m[1] = m[3] = 0;
445
+ m = matrix[3];
446
+ m[0] = m[1] = m[2] = 0;
447
+ matrix[0][0] = 1;
448
+ matrix[1][1] = 1;
449
+ matrix[2][2] = 1;
450
+ matrix[3][3] = 1;
451
+ return this;
452
+ }
453
+
454
+ private void init() {
455
+ matrix = new double[][] {
456
+ new double[4], new double[4], new double[4], new double[4]
457
+ };
458
+ }
459
+
460
+ /**
461
+ * Matrix Inversion using Cramer's Method Computes Adjoint matrix divided by
462
+ * determinant Code modified from
463
+ * http://www.intel.com/design/pentiumiii/sml/24504301.pdf
464
+ *
465
+ * @return itself
466
+ */
467
+ public Matrix4x4 invert() {
468
+ final double[] tmp = new double[12];
469
+ final double[] src = new double[16];
470
+ final double[] dst = new double[16];
471
+ final double[] mat = toArray(null);
472
+
473
+ for (int i = 0; i < 4; i++) {
474
+ int i4 = i << 2;
475
+ src[i] = mat[i4];
476
+ src[i + 4] = mat[i4 + 1];
477
+ src[i + 8] = mat[i4 + 2];
478
+ src[i + 12] = mat[i4 + 3];
479
+ }
480
+
481
+ // calculate pairs for first 8 elements (cofactors)
482
+ tmp[0] = src[10] * src[15];
483
+ tmp[1] = src[11] * src[14];
484
+ tmp[2] = src[9] * src[15];
485
+ tmp[3] = src[11] * src[13];
486
+ tmp[4] = src[9] * src[14];
487
+ tmp[5] = src[10] * src[13];
488
+ tmp[6] = src[8] * src[15];
489
+ tmp[7] = src[11] * src[12];
490
+ tmp[8] = src[8] * src[14];
491
+ tmp[9] = src[10] * src[12];
492
+ tmp[10] = src[8] * src[13];
493
+ tmp[11] = src[9] * src[12];
494
+
495
+ // calculate first 8 elements (cofactors)
496
+ double src0 = src[0];
497
+ double src1 = src[1];
498
+ double src2 = src[2];
499
+ double src3 = src[3];
500
+ double src4 = src[4];
501
+ double src5 = src[5];
502
+ double src6 = src[6];
503
+ double src7 = src[7];
504
+ dst[0] = tmp[0] * src5 + tmp[3] * src6 + tmp[4] * src7;
505
+ dst[0] -= tmp[1] * src5 + tmp[2] * src6 + tmp[5] * src7;
506
+ dst[1] = tmp[1] * src4 + tmp[6] * src6 + tmp[9] * src7;
507
+ dst[1] -= tmp[0] * src4 + tmp[7] * src6 + tmp[8] * src7;
508
+ dst[2] = tmp[2] * src4 + tmp[7] * src5 + tmp[10] * src7;
509
+ dst[2] -= tmp[3] * src4 + tmp[6] * src5 + tmp[11] * src7;
510
+ dst[3] = tmp[5] * src4 + tmp[8] * src5 + tmp[11] * src6;
511
+ dst[3] -= tmp[4] * src4 + tmp[9] * src5 + tmp[10] * src6;
512
+ dst[4] = tmp[1] * src1 + tmp[2] * src2 + tmp[5] * src3;
513
+ dst[4] -= tmp[0] * src1 + tmp[3] * src2 + tmp[4] * src3;
514
+ dst[5] = tmp[0] * src0 + tmp[7] * src2 + tmp[8] * src3;
515
+ dst[5] -= tmp[1] * src0 + tmp[6] * src2 + tmp[9] * src3;
516
+ dst[6] = tmp[3] * src0 + tmp[6] * src1 + tmp[11] * src3;
517
+ dst[6] -= tmp[2] * src0 + tmp[7] * src1 + tmp[10] * src3;
518
+ dst[7] = tmp[4] * src0 + tmp[9] * src1 + tmp[10] * src2;
519
+ dst[7] -= tmp[5] * src0 + tmp[8] * src1 + tmp[11] * src2;
520
+
521
+ // calculate pairs for second 8 elements (cofactors)
522
+ tmp[0] = src2 * src7;
523
+ tmp[1] = src3 * src6;
524
+ tmp[2] = src1 * src7;
525
+ tmp[3] = src3 * src5;
526
+ tmp[4] = src1 * src6;
527
+ tmp[5] = src2 * src5;
528
+ tmp[6] = src0 * src7;
529
+ tmp[7] = src3 * src4;
530
+ tmp[8] = src0 * src6;
531
+ tmp[9] = src2 * src4;
532
+ tmp[10] = src0 * src5;
533
+ tmp[11] = src1 * src4;
534
+
535
+ // calculate second 8 elements (cofactors)
536
+ src0 = src[8];
537
+ src1 = src[9];
538
+ src2 = src[10];
539
+ src3 = src[11];
540
+ src4 = src[12];
541
+ src5 = src[13];
542
+ src6 = src[14];
543
+ src7 = src[15];
544
+ dst[8] = tmp[0] * src5 + tmp[3] * src6 + tmp[4] * src7;
545
+ dst[8] -= tmp[1] * src5 + tmp[2] * src6 + tmp[5] * src7;
546
+ dst[9] = tmp[1] * src4 + tmp[6] * src6 + tmp[9] * src7;
547
+ dst[9] -= tmp[0] * src4 + tmp[7] * src6 + tmp[8] * src7;
548
+ dst[10] = tmp[2] * src4 + tmp[7] * src5 + tmp[10] * src7;
549
+ dst[10] -= tmp[3] * src4 + tmp[6] * src5 + tmp[11] * src7;
550
+ dst[11] = tmp[5] * src4 + tmp[8] * src5 + tmp[11] * src6;
551
+ dst[11] -= tmp[4] * src4 + tmp[9] * src5 + tmp[10] * src6;
552
+ dst[12] = tmp[2] * src2 + tmp[5] * src3 + tmp[1] * src1;
553
+ dst[12] -= tmp[4] * src3 + tmp[0] * src1 + tmp[3] * src2;
554
+ dst[13] = tmp[8] * src3 + tmp[0] * src0 + tmp[7] * src2;
555
+ dst[13] -= tmp[6] * src2 + tmp[9] * src3 + tmp[1] * src0;
556
+ dst[14] = tmp[6] * src1 + tmp[11] * src3 + tmp[3] * src0;
557
+ dst[14] -= tmp[10] * src3 + tmp[2] * src0 + tmp[7] * src1;
558
+ dst[15] = tmp[10] * src2 + tmp[4] * src0 + tmp[9] * src1;
559
+ dst[15] -= tmp[8] * src1 + tmp[11] * src2 + tmp[5] * src0;
560
+
561
+ double det = 1.0 / (src[0] * dst[0] + src[1] * dst[1] + src[2] * dst[2] + src[3]
562
+ * dst[3]);
563
+
564
+ for (int i = 0, k = 0; i < 4; i++) {
565
+ double[] m = matrix[i];
566
+ for (int j = 0; j < 4; j++) {
567
+ m[j] = dst[k++] * det;
568
+ }
569
+ }
570
+ return this;
571
+ }
572
+
573
+ /**
574
+ *
575
+ * @param eye
576
+ * @param target
577
+ * @param up
578
+ * @return
579
+ */
580
+ public Matrix4x4 lookAt(ReadonlyVec3D eye, ReadonlyVec3D target,
581
+ ReadonlyVec3D up) {
582
+ Vec3D f = eye.sub(target).normalize();
583
+ Vec3D s = up.cross(f).normalize();
584
+ Vec3D t = f.cross(s).normalize();
585
+ return set(s.x, s.y, s.z, -s.dot(eye), t.x, t.y, t.z, -t.dot(eye), f.x,
586
+ f.y, f.z, -f.dot(eye), 0, 0, 0, 1);
587
+ }
588
+
589
+ /**
590
+ *
591
+ * @param factor
592
+ * @return
593
+ */
594
+
595
+ public Matrix4x4 multiply(double factor) {
596
+ return new Matrix4x4(this).multiplySelf(factor);
597
+ }
598
+
599
+ /**
600
+ * Matrix-Matrix Right-multiplication.
601
+ *
602
+ * @param mat
603
+ * @return product as new matrix
604
+ */
605
+ public Matrix4x4 multiply(Matrix4x4 mat) {
606
+ return new Matrix4x4(this).multiplySelf(mat);
607
+ }
608
+
609
+ /**
610
+ * In-place matrix-scalar multiplication.
611
+ *
612
+ * @param factor
613
+ * @return product applied to this matrix.
614
+ */
615
+ public Matrix4x4 multiplySelf(double factor) {
616
+ for (int i = 0; i < 4; i++) {
617
+ double[] m = matrix[i];
618
+ m[0] *= factor;
619
+ m[1] *= factor;
620
+ m[2] *= factor;
621
+ m[3] *= factor;
622
+ }
623
+ return this;
624
+ }
625
+
626
+ /**
627
+ *
628
+ * @param mat
629
+ * @return
630
+ */
631
+ public Matrix4x4 multiplySelf(Matrix4x4 mat) {
632
+ double[] mm0 = mat.matrix[0];
633
+ double[] mm1 = mat.matrix[1];
634
+ double[] mm2 = mat.matrix[2];
635
+ double[] mm3 = mat.matrix[3];
636
+ for (int i = 0; i < 4; i++) {
637
+ double[] m = matrix[i];
638
+ for (int j = 0; j < 4; j++) {
639
+ temp[j] = m[0] * mm0[j] + m[1] * mm1[j] + m[2] * mm2[j] + m[3]
640
+ * mm3[j];
641
+ }
642
+ m[0] = temp[0];
643
+ m[1] = temp[1];
644
+ m[2] = temp[2];
645
+ m[3] = temp[3];
646
+ }
647
+ return this;
648
+ }
649
+
650
+ /**
651
+ * Applies rotation about arbitrary axis to matrix
652
+ *
653
+ * @param axis
654
+ * @param theta
655
+ * @return rotation applied to this matrix
656
+ */
657
+ public Matrix4x4 rotateAroundAxis(ReadonlyVec3D axis, double theta) {
658
+ double x, y, z, s, c, t, tx, ty;
659
+ x = axis.x();
660
+ y = axis.y();
661
+ z = axis.z();
662
+ s = Math.sin(theta);
663
+ c = Math.cos(theta);
664
+ t = 1 - c;
665
+ tx = t * x;
666
+ ty = t * y;
667
+ TEMP.set(tx * x + c, tx * y + s * z, tx * z - s * y, 0, tx * y - s * z,
668
+ ty * y + c, ty * z + s * x, 0, tx * z + s * y, ty * z - s * x,
669
+ t * z * z + c, 0, 0, 0, 0, 1);
670
+ return this.multiplySelf(TEMP);
671
+ }
672
+
673
+ /**
674
+ * Applies rotation about X to this matrix.
675
+ *
676
+ * @param theta
677
+ * rotation angle in radians
678
+ * @return itself
679
+ */
680
+ public Matrix4x4 rotateX(double theta) {
681
+ TEMP.identity();
682
+ TEMP.matrix[1][1] = TEMP.matrix[2][2] = Math.cos(theta);
683
+ TEMP.matrix[2][1] = Math.sin(theta);
684
+ TEMP.matrix[1][2] = -TEMP.matrix[2][1];
685
+ return this.multiplySelf(TEMP);
686
+ }
687
+
688
+ /**
689
+ * Applies rotation about Y to this matrix.
690
+ *
691
+ * @param theta
692
+ * rotation angle in radians
693
+ * @return itself
694
+ */
695
+ public Matrix4x4 rotateY(double theta) {
696
+ TEMP.identity();
697
+ TEMP.matrix[0][0] = TEMP.matrix[2][2] = Math.cos(theta);
698
+ TEMP.matrix[0][2] = Math.sin(theta);
699
+ TEMP.matrix[2][0] = -TEMP.matrix[0][2];
700
+ return this.multiplySelf(TEMP);
701
+ }
702
+
703
+ // Apply Rotation about Z to Matrix
704
+
705
+ /**
706
+ *
707
+ * @param theta
708
+ * @return
709
+ */
710
+ public Matrix4x4 rotateZ(double theta) {
711
+ TEMP.identity();
712
+ TEMP.matrix[0][0] = TEMP.matrix[1][1] = Math.cos(theta);
713
+ TEMP.matrix[1][0] = Math.sin(theta);
714
+ TEMP.matrix[0][1] = -TEMP.matrix[1][0];
715
+ return this.multiplySelf(TEMP);
716
+ }
717
+
718
+ /**
719
+ *
720
+ * @param scale
721
+ * @return
722
+ */
723
+ public Matrix4x4 scale(double scale) {
724
+ return new Matrix4x4(this).scaleSelf(scale);
725
+ }
726
+
727
+ /**
728
+ *
729
+ * @param scaleX
730
+ * @param scaleY
731
+ * @param scaleZ
732
+ * @return
733
+ */
734
+ public Matrix4x4 scale(double scaleX, double scaleY, double scaleZ) {
735
+ return new Matrix4x4(this).scaleSelf(scaleX, scaleY, scaleZ);
736
+ }
737
+
738
+ /**
739
+ *
740
+ * @param scale
741
+ * @return
742
+ */
743
+ public Matrix4x4 scale(ReadonlyVec3D scale) {
744
+ return new Matrix4x4(this).scaleSelf(scale.x(), scale.y(), scale.z());
745
+ }
746
+
747
+ /**
748
+ *
749
+ * @param scale
750
+ * @return
751
+ */
752
+ public Matrix4x4 scaleSelf(double scale) {
753
+ return scaleSelf(scale, scale, scale);
754
+ }
755
+
756
+ /**
757
+ *
758
+ * @param scaleX
759
+ * @param scaleY
760
+ * @param scaleZ
761
+ * @return
762
+ */
763
+ public Matrix4x4 scaleSelf(double scaleX, double scaleY, double scaleZ) {
764
+ TEMP.identity();
765
+ TEMP.setScale(scaleX, scaleY, scaleZ);
766
+ return this.multiplySelf(TEMP);
767
+ }
768
+
769
+ /**
770
+ *
771
+ * @param scale
772
+ * @return
773
+ */
774
+ public Matrix4x4 scaleSelf(ReadonlyVec3D scale) {
775
+ return scaleSelf(scale.x(), scale.y(), scale.z());
776
+ }
777
+
778
+ /**
779
+ *
780
+ * @param a
781
+ * @param b
782
+ * @param c
783
+ * @param d
784
+ * @param e
785
+ * @param f
786
+ * @param g
787
+ * @param h
788
+ * @param i
789
+ * @param j
790
+ * @param k
791
+ * @param l
792
+ * @param m
793
+ * @param n
794
+ * @param o
795
+ * @param p
796
+ * @return
797
+ */
798
+ public Matrix4x4 set(double a, double b, double c, double d, double e,
799
+ double f, double g, double h, double i, double j, double k,
800
+ double l, double m, double n, double o, double p) {
801
+ double[] mat = matrix[0];
802
+ mat[0] = a;
803
+ mat[1] = b;
804
+ mat[2] = c;
805
+ mat[3] = d;
806
+ mat = matrix[1];
807
+ mat[0] = e;
808
+ mat[1] = f;
809
+ mat[2] = g;
810
+ mat[3] = h;
811
+ mat = matrix[2];
812
+ mat[0] = i;
813
+ mat[1] = j;
814
+ mat[2] = k;
815
+ mat[3] = l;
816
+ mat = matrix[3];
817
+ mat[0] = m;
818
+ mat[1] = n;
819
+ mat[2] = o;
820
+ mat[3] = p;
821
+ return this;
822
+ }
823
+
824
+ /**
825
+ *
826
+ * @param mat
827
+ * @return
828
+ */
829
+ public Matrix4x4 set(Matrix4x4 mat) {
830
+ for (int i = 0; i < 4; i++) {
831
+ double[] m = matrix[i];
832
+ double[] n = mat.matrix[i];
833
+ m[0] = n[0];
834
+ m[1] = n[1];
835
+ m[2] = n[2];
836
+ m[3] = n[3];
837
+ }
838
+ return this;
839
+ }
840
+
841
+ /**
842
+ *
843
+ * @param left
844
+ * @param right
845
+ * @param top
846
+ * @param bottom
847
+ * @param near
848
+ * @param far
849
+ * @return
850
+ */
851
+ public Matrix4x4 setFrustum(double left, double right, double top,
852
+ double bottom, double near, double far) {
853
+ return set((2.0 * near) / (right - left), 0, (left + right)
854
+ / (right - left), 0, 0, (2.0 * near) / (top - bottom),
855
+ (top + bottom) / (top - bottom), 0, 0, 0, -(near + far)
856
+ / (far - near), (-2 * near * far) / (far - near), 0, 0,
857
+ -1, 0);
858
+ }
859
+
860
+ /**
861
+ *
862
+ * @param left
863
+ * @param right
864
+ * @param top
865
+ * @param bottom
866
+ * @param near
867
+ * @param far
868
+ * @return
869
+ */
870
+ public Matrix4x4 setOrtho(double left, double right, double top,
871
+ double bottom, double near, double far) {
872
+ return set(2.0 / (right - left), 0, 0, (left + right) / (right - left),
873
+ 0, 2.0 / (top - bottom), 0, (top + bottom) / (top - bottom), 0,
874
+ 0, -2.0 / (far - near), (far + near) / (far - near), 0, 0, 0, 1);
875
+ }
876
+
877
+ /**
878
+ *
879
+ * @param fov
880
+ * @param aspect
881
+ * @param near
882
+ * @param far
883
+ * @return
884
+ */
885
+ public Matrix4x4 setPerspective(double fov, double aspect, double near,
886
+ double far) {
887
+ double y = near * Math.tan(0.5 * MathUtils.radians(fov));
888
+ double x = aspect * y;
889
+ return setFrustum(-x, x, y, -y, near, far);
890
+ }
891
+
892
+ /**
893
+ *
894
+ * @param x
895
+ * @param y
896
+ * @param z
897
+ * @return
898
+ */
899
+ public Matrix4x4 setPosition(double x, double y, double z) {
900
+ matrix[0][3] = x;
901
+ matrix[1][3] = y;
902
+ matrix[2][3] = z;
903
+ return this;
904
+ }
905
+
906
+ /**
907
+ *
908
+ * @param scaleX
909
+ * @param scaleY
910
+ * @param scaleZ
911
+ * @return
912
+ */
913
+ public Matrix4x4 setScale(double scaleX, double scaleY, double scaleZ) {
914
+ matrix[0][0] = scaleX;
915
+ matrix[1][1] = scaleY;
916
+ matrix[2][2] = scaleZ;
917
+ return this;
918
+ }
919
+
920
+ /**
921
+ *
922
+ * @param m
923
+ * @return
924
+ */
925
+ public Matrix4x4 sub(Matrix4x4 m) {
926
+ return new Matrix4x4(this).subSelf(m);
927
+ }
928
+
929
+ /**
930
+ *
931
+ * @param mat
932
+ * @return
933
+ */
934
+ public Matrix4x4 subSelf(Matrix4x4 mat) {
935
+ for (int i = 0; i < 4; i++) {
936
+ double[] m = matrix[i];
937
+ double[] n = mat.matrix[i];
938
+ m[0] -= n[0];
939
+ m[1] -= n[1];
940
+ m[2] -= n[2];
941
+ m[3] -= n[3];
942
+ }
943
+ return this;
944
+ }
945
+
946
+ /**
947
+ * Copies all matrix elements into an linear array.
948
+ *
949
+ * @param result
950
+ * array (or null to create a new one)
951
+ * @return matrix as 16 element array
952
+ */
953
+ public double[] toArray(double[] result) {
954
+ if (result == null) {
955
+ result = new double[16];
956
+ }
957
+ for (int i = 0, k = 0; i < 4; i++) {
958
+ double[] m = matrix[i];
959
+ for (int j = 0; j < 4; j++) {
960
+ result[k++] = m[j];
961
+ }
962
+ }
963
+ return result;
964
+ }
965
+
966
+ /**
967
+ *
968
+ * @param result
969
+ * @return
970
+ */
971
+ public float[] toFloatArray(float[] result) {
972
+ if (result == null) {
973
+ result = new float[16];
974
+ }
975
+ double[] tmp = toArray(null);
976
+ for (int i = 0; i < 16; i++) {
977
+ result[i] = (float) tmp[i];
978
+ }
979
+ return result;
980
+ }
981
+
982
+ /*
983
+ * (non-Javadoc)
984
+ *
985
+ * @see java.lang.Object#toString()
986
+ */
987
+
988
+ /**
989
+ *
990
+ * @return
991
+ */
992
+
993
+ @Override
994
+ public String toString() {
995
+ return "| " + matrix[0][0] + " " + matrix[0][1] + " " + matrix[0][2]
996
+ + " " + matrix[0][3] + " |\n" + "| " + matrix[1][0] + " "
997
+ + matrix[1][1] + " " + matrix[1][2] + " " + matrix[1][3]
998
+ + " |\n" + "| " + matrix[2][0] + " " + matrix[2][1] + " "
999
+ + matrix[2][2] + " " + matrix[2][3] + " |\n" + "| "
1000
+ + matrix[3][0] + " " + matrix[3][1] + " " + matrix[3][2] + " "
1001
+ + matrix[3][3] + " |";
1002
+ }
1003
+
1004
+ /**
1005
+ *
1006
+ * @param result
1007
+ * @return
1008
+ */
1009
+ public float[] toTransposedFloatArray(float[] result) {
1010
+ if (result == null) {
1011
+ result = new float[16];
1012
+ }
1013
+ for (int i = 0, k = 0; i < 4; i++) {
1014
+ for (int j = 0; j < 4; j++) {
1015
+ result[k++] = (float) matrix[j][i];
1016
+ }
1017
+ }
1018
+ return result;
1019
+ }
1020
+
1021
+ /**
1022
+ *
1023
+ * @param dx
1024
+ * @param dy
1025
+ * @param dz
1026
+ * @return
1027
+ */
1028
+ public Matrix4x4 translate(double dx, double dy, double dz) {
1029
+ return new Matrix4x4(this).translateSelf(dx, dy, dz);
1030
+ }
1031
+
1032
+ /**
1033
+ *
1034
+ * @param trans
1035
+ * @return
1036
+ */
1037
+ public Matrix4x4 translate(ReadonlyVec3D trans) {
1038
+ return new Matrix4x4(this).translateSelf(trans.x(), trans.y(),
1039
+ trans.z());
1040
+ }
1041
+
1042
+ /**
1043
+ *
1044
+ * @param dx
1045
+ * @param dy
1046
+ * @param dz
1047
+ * @return
1048
+ */
1049
+ public Matrix4x4 translateSelf(double dx, double dy, double dz) {
1050
+ TEMP.identity();
1051
+ TEMP.setPosition(dx, dy, dz);
1052
+ return this.multiplySelf(TEMP);
1053
+ }
1054
+
1055
+ /**
1056
+ *
1057
+ * @param trans
1058
+ * @return
1059
+ */
1060
+ public Matrix4x4 translateSelf(ReadonlyVec3D trans) {
1061
+ return translateSelf(trans.x(), trans.y(), trans.z());
1062
+ }
1063
+
1064
+ /**
1065
+ * Converts the matrix (in-place) between column-major to row-major order
1066
+ * (and vice versa).
1067
+ *
1068
+ * @return itself
1069
+ */
1070
+ public Matrix4x4 transpose() {
1071
+ return set(matrix[0][0], matrix[1][0], matrix[2][0], matrix[3][0],
1072
+ matrix[0][1], matrix[1][1], matrix[2][1], matrix[3][1],
1073
+ matrix[0][2], matrix[1][2], matrix[2][2], matrix[3][2],
1074
+ matrix[0][3], matrix[1][3], matrix[2][3], matrix[3][3]);
1075
+ }
1076
+ }