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.
- checksums.yaml +4 -4
- data/.gitignore +16 -0
- data/CHANGELOG.md +4 -0
- data/LICENSE +675 -0
- data/README.md +12 -5
- data/Rakefile +25 -82
- data/examples/attract_repel/attract_repel.rb +30 -0
- data/examples/attract_repel/attractor.rb +23 -0
- data/examples/attract_repel/particle.rb +27 -0
- data/examples/data/ti_yong.png +0 -0
- data/examples/force_directed/cluster.rb +76 -0
- data/examples/force_directed/force_directed_graph.rb +92 -0
- data/examples/force_directed/node.rb +26 -0
- data/examples/gray_scott_image.rb +75 -0
- data/examples/gray_scott_tone_map.rb +77 -0
- data/examples/implicit.rb +139 -0
- data/examples/inflate_mesh.rb +89 -0
- data/examples/model_align.rb +44 -0
- data/examples/povmesh/ftest.rb +46 -0
- data/examples/povmesh/tentacle.rb +73 -0
- data/examples/simple_cluster/cluster.rb +47 -0
- data/examples/simple_cluster/node.rb +27 -0
- data/examples/simple_cluster/simple_cluster.rb +60 -0
- data/examples/soft_body/blanket.rb +45 -0
- data/examples/soft_body/connection.rb +16 -0
- data/examples/soft_body/particle.rb +22 -0
- data/examples/soft_body/soft_body_square_adapted.rb +55 -0
- data/lib/toxiclibs.jar +0 -0
- data/lib/toxiclibs.rb +91 -32
- data/lib/toxiclibs/version.rb +1 -1
- data/pom.xml +122 -0
- data/src/com/toxi/net/ClientListener.java +41 -0
- data/src/com/toxi/net/ServerListener.java +70 -0
- data/src/com/toxi/net/ServerListenerAdapter.java +47 -0
- data/src/com/toxi/net/ServerState.java +18 -0
- data/src/com/toxi/net/UDPConnection.java +66 -0
- data/src/com/toxi/net/UDPSyncClient.java +81 -0
- data/src/com/toxi/net/UDPSyncServer.java +450 -0
- data/src/com/toxi/nio/UDPClient.java +121 -0
- data/src/com/toxi/nio/UDPClientState.java +32 -0
- data/src/com/toxi/nio/UDPServer.java +129 -0
- data/src/toxi/color/AccessCriteria.java +114 -0
- data/src/toxi/color/AlphaAccessor.java +67 -0
- data/src/toxi/color/CMYKAccessor.java +122 -0
- data/src/toxi/color/CMYKDistanceProxy.java +40 -0
- data/src/toxi/color/ColorGradient.java +260 -0
- data/src/toxi/color/ColorList.java +699 -0
- data/src/toxi/color/ColorRange.java +671 -0
- data/src/toxi/color/ColorTheme.java +163 -0
- data/src/toxi/color/DistanceProxy.java +44 -0
- data/src/toxi/color/HSVAccessor.java +113 -0
- data/src/toxi/color/HSVDistanceProxy.java +40 -0
- data/src/toxi/color/HistEntry.java +85 -0
- data/src/toxi/color/Histogram.java +185 -0
- data/src/toxi/color/Hue.java +249 -0
- data/src/toxi/color/LuminanceAccessor.java +78 -0
- data/src/toxi/color/NamedColor.java +935 -0
- data/src/toxi/color/ProximityComparator.java +70 -0
- data/src/toxi/color/RGBAccessor.java +113 -0
- data/src/toxi/color/RGBDistanceProxy.java +41 -0
- data/src/toxi/color/ReadonlyTColor.java +296 -0
- data/src/toxi/color/TColor.java +1677 -0
- data/src/toxi/color/TColorAdapter.java +68 -0
- data/src/toxi/color/ToneMap.java +218 -0
- data/src/toxi/color/theory/AnalogousStrategy.java +140 -0
- data/src/toxi/color/theory/ColorTheoryRegistry.java +139 -0
- data/src/toxi/color/theory/ColorTheoryStrategy.java +56 -0
- data/src/toxi/color/theory/ComplementaryStrategy.java +111 -0
- data/src/toxi/color/theory/CompoundTheoryStrategy.java +143 -0
- data/src/toxi/color/theory/LeftSplitComplementaryStrategy.java +82 -0
- data/src/toxi/color/theory/MonochromeTheoryStrategy.java +103 -0
- data/src/toxi/color/theory/RightSplitComplementaryStrategy.java +82 -0
- data/src/toxi/color/theory/SingleComplementStrategy.java +76 -0
- data/src/toxi/color/theory/SplitComplementaryStrategy.java +77 -0
- data/src/toxi/color/theory/TetradTheoryStrategy.java +114 -0
- data/src/toxi/color/theory/TriadTheoryStrategy.java +77 -0
- data/src/toxi/data/csv/CSVAdapter.java +74 -0
- data/src/toxi/data/csv/CSVFieldMapper.java +212 -0
- data/src/toxi/data/csv/CSVListener.java +61 -0
- data/src/toxi/data/csv/CSVParser.java +202 -0
- data/src/toxi/data/feeds/AtomAuthor.java +49 -0
- data/src/toxi/data/feeds/AtomContent.java +50 -0
- data/src/toxi/data/feeds/AtomEntry.java +111 -0
- data/src/toxi/data/feeds/AtomFeed.java +129 -0
- data/src/toxi/data/feeds/AtomLink.java +62 -0
- data/src/toxi/data/feeds/RSSChannel.java +88 -0
- data/src/toxi/data/feeds/RSSEnclosure.java +60 -0
- data/src/toxi/data/feeds/RSSFeed.java +99 -0
- data/src/toxi/data/feeds/RSSItem.java +104 -0
- data/src/toxi/data/feeds/util/EntityStripper.java +2480 -0
- data/src/toxi/data/feeds/util/Iso8601DateAdapter.java +101 -0
- data/src/toxi/data/feeds/util/Rfc822DateAdapter.java +93 -0
- data/src/toxi/geom/AABB.java +658 -0
- data/src/toxi/geom/Axis3D.java +116 -0
- data/src/toxi/geom/AxisAlignedCylinder.java +163 -0
- data/src/toxi/geom/BernsteinPolynomial.java +94 -0
- data/src/toxi/geom/BezierCurve2D.java +159 -0
- data/src/toxi/geom/BezierCurve3D.java +148 -0
- data/src/toxi/geom/BooleanShapeBuilder.java +185 -0
- data/src/toxi/geom/BoxIntersector.java +52 -0
- data/src/toxi/geom/Circle.java +230 -0
- data/src/toxi/geom/CircleIntersector.java +85 -0
- data/src/toxi/geom/Cone.java +150 -0
- data/src/toxi/geom/ConvexPolygonClipper.java +136 -0
- data/src/toxi/geom/CoordinateExtractor.java +16 -0
- data/src/toxi/geom/Ellipse.java +250 -0
- data/src/toxi/geom/GMatrix.java +2599 -0
- data/src/toxi/geom/GVector.java +833 -0
- data/src/toxi/geom/GlobalGridTesselator.java +54 -0
- data/src/toxi/geom/GridTesselator.java +108 -0
- data/src/toxi/geom/Intersector2D.java +49 -0
- data/src/toxi/geom/Intersector3D.java +51 -0
- data/src/toxi/geom/IsectData2D.java +103 -0
- data/src/toxi/geom/IsectData3D.java +103 -0
- data/src/toxi/geom/Line2D.java +534 -0
- data/src/toxi/geom/Line3D.java +471 -0
- data/src/toxi/geom/LineStrip2D.java +430 -0
- data/src/toxi/geom/LineStrip3D.java +230 -0
- data/src/toxi/geom/LocalGridTesselator.java +57 -0
- data/src/toxi/geom/Matrix3d.java +3048 -0
- data/src/toxi/geom/Matrix4f.java +3446 -0
- data/src/toxi/geom/Matrix4x4.java +1076 -0
- data/src/toxi/geom/MatrixSizeException.java +58 -0
- data/src/toxi/geom/OctreeVisitor.java +44 -0
- data/src/toxi/geom/Origin3D.java +148 -0
- data/src/toxi/geom/Plane.java +293 -0
- data/src/toxi/geom/PlaneIntersector.java +57 -0
- data/src/toxi/geom/PointCloud3D.java +253 -0
- data/src/toxi/geom/PointOctree.java +502 -0
- data/src/toxi/geom/PointQuadtree.java +375 -0
- data/src/toxi/geom/Polygon2D.java +1038 -0
- data/src/toxi/geom/PolygonClipper2D.java +45 -0
- data/src/toxi/geom/PolygonTesselator.java +20 -0
- data/src/toxi/geom/QuadtreeVisitor.java +44 -0
- data/src/toxi/geom/Quaternion.java +641 -0
- data/src/toxi/geom/Ray2D.java +146 -0
- data/src/toxi/geom/Ray3D.java +150 -0
- data/src/toxi/geom/Ray3DIntersector.java +75 -0
- data/src/toxi/geom/ReadonlyVec2D.java +575 -0
- data/src/toxi/geom/ReadonlyVec3D.java +628 -0
- data/src/toxi/geom/ReadonlyVec4D.java +431 -0
- data/src/toxi/geom/Rect.java +720 -0
- data/src/toxi/geom/Reflector3D.java +58 -0
- data/src/toxi/geom/Shape2D.java +94 -0
- data/src/toxi/geom/Shape3D.java +42 -0
- data/src/toxi/geom/SingularMatrixException.java +57 -0
- data/src/toxi/geom/SpatialBins.java +182 -0
- data/src/toxi/geom/SpatialIndex.java +61 -0
- data/src/toxi/geom/Sphere.java +224 -0
- data/src/toxi/geom/SphereIntersectorReflector.java +196 -0
- data/src/toxi/geom/Spline2D.java +349 -0
- data/src/toxi/geom/Spline3D.java +351 -0
- data/src/toxi/geom/SutherlandHodgemanClipper.java +151 -0
- data/src/toxi/geom/Triangle2D.java +422 -0
- data/src/toxi/geom/Triangle3D.java +456 -0
- data/src/toxi/geom/TriangleIntersector.java +105 -0
- data/src/toxi/geom/Vec2D.java +1328 -0
- data/src/toxi/geom/Vec3D.java +1832 -0
- data/src/toxi/geom/Vec4D.java +985 -0
- data/src/toxi/geom/VecMathUtil.java +100 -0
- data/src/toxi/geom/XAxisCylinder.java +64 -0
- data/src/toxi/geom/YAxisCylinder.java +65 -0
- data/src/toxi/geom/ZAxisCylinder.java +64 -0
- data/src/toxi/geom/mesh/BezierPatch.java +200 -0
- data/src/toxi/geom/mesh/BoxSelector.java +62 -0
- data/src/toxi/geom/mesh/DefaultSTLColorModel.java +67 -0
- data/src/toxi/geom/mesh/DefaultSelector.java +50 -0
- data/src/toxi/geom/mesh/Face.java +176 -0
- data/src/toxi/geom/mesh/LaplacianSmooth.java +80 -0
- data/src/toxi/geom/mesh/MaterialiseSTLColorModel.java +150 -0
- data/src/toxi/geom/mesh/Mesh3D.java +224 -0
- data/src/toxi/geom/mesh/MeshIntersector.java +91 -0
- data/src/toxi/geom/mesh/OBJWriter.java +194 -0
- data/src/toxi/geom/mesh/PLYWriter.java +167 -0
- data/src/toxi/geom/mesh/PlaneSelector.java +90 -0
- data/src/toxi/geom/mesh/STLColorModel.java +54 -0
- data/src/toxi/geom/mesh/STLReader.java +185 -0
- data/src/toxi/geom/mesh/STLWriter.java +323 -0
- data/src/toxi/geom/mesh/SphereFunction.java +156 -0
- data/src/toxi/geom/mesh/SphericalHarmonics.java +110 -0
- data/src/toxi/geom/mesh/SuperEllipsoid.java +110 -0
- data/src/toxi/geom/mesh/SurfaceFunction.java +75 -0
- data/src/toxi/geom/mesh/SurfaceMeshBuilder.java +149 -0
- data/src/toxi/geom/mesh/Terrain.java +451 -0
- data/src/toxi/geom/mesh/TriangleMesh.java +1201 -0
- data/src/toxi/geom/mesh/Vertex.java +78 -0
- data/src/toxi/geom/mesh/VertexSelector.java +193 -0
- data/src/toxi/geom/mesh/WEFace.java +100 -0
- data/src/toxi/geom/mesh/WEMeshFilterStrategy.java +51 -0
- data/src/toxi/geom/mesh/WETriangleMesh.java +761 -0
- data/src/toxi/geom/mesh/WEVertex.java +134 -0
- data/src/toxi/geom/mesh/WingedEdge.java +115 -0
- data/src/toxi/geom/mesh/subdiv/CentroidSubdiv.java +37 -0
- data/src/toxi/geom/mesh/subdiv/DisplacementSubdivision.java +85 -0
- data/src/toxi/geom/mesh/subdiv/DualDisplacementSubdivision.java +94 -0
- data/src/toxi/geom/mesh/subdiv/DualSubdivision.java +49 -0
- data/src/toxi/geom/mesh/subdiv/EdgeLengthComparator.java +50 -0
- data/src/toxi/geom/mesh/subdiv/FaceCountComparator.java +51 -0
- data/src/toxi/geom/mesh/subdiv/MidpointDisplacementSubdivision.java +80 -0
- data/src/toxi/geom/mesh/subdiv/MidpointSubdiv.java +42 -0
- data/src/toxi/geom/mesh/subdiv/MidpointSubdivision.java +48 -0
- data/src/toxi/geom/mesh/subdiv/NewSubdivStrategy.java +23 -0
- data/src/toxi/geom/mesh/subdiv/NormalDisplacementSubdivision.java +74 -0
- data/src/toxi/geom/mesh/subdiv/SubdivisionStrategy.java +83 -0
- data/src/toxi/geom/mesh/subdiv/TriSubdivision.java +51 -0
- data/src/toxi/geom/mesh2d/DelaunayTriangle.java +222 -0
- data/src/toxi/geom/mesh2d/DelaunayTriangulation.java +327 -0
- data/src/toxi/geom/mesh2d/DelaunayVertex.java +560 -0
- data/src/toxi/geom/mesh2d/Voronoi.java +149 -0
- data/src/toxi/geom/nurbs/BasicNurbsCurve.java +210 -0
- data/src/toxi/geom/nurbs/BasicNurbsSurface.java +233 -0
- data/src/toxi/geom/nurbs/ControlNet.java +148 -0
- data/src/toxi/geom/nurbs/CurveCreator.java +112 -0
- data/src/toxi/geom/nurbs/CurveUtils.java +259 -0
- data/src/toxi/geom/nurbs/InterpolationException.java +65 -0
- data/src/toxi/geom/nurbs/KnotVector.java +333 -0
- data/src/toxi/geom/nurbs/NurbsCreator.java +815 -0
- data/src/toxi/geom/nurbs/NurbsCurve.java +120 -0
- data/src/toxi/geom/nurbs/NurbsMeshCreator.java +145 -0
- data/src/toxi/geom/nurbs/NurbsSurface.java +147 -0
- data/src/toxi/image/util/Filter8bit.java +331 -0
- data/src/toxi/image/util/TiledFrameExporter.java +162 -0
- data/src/toxi/math/BezierInterpolation.java +102 -0
- data/src/toxi/math/CircularInterpolation.java +88 -0
- data/src/toxi/math/CosineInterpolation.java +51 -0
- data/src/toxi/math/DecimatedInterpolation.java +77 -0
- data/src/toxi/math/ExponentialInterpolation.java +68 -0
- data/src/toxi/math/InterpolateStrategy.java +60 -0
- data/src/toxi/math/Interpolation2D.java +93 -0
- data/src/toxi/math/LinearInterpolation.java +46 -0
- data/src/toxi/math/MathUtils.java +990 -0
- data/src/toxi/math/NonLinearScaleMap.java +101 -0
- data/src/toxi/math/ScaleMap.java +183 -0
- data/src/toxi/math/SigmoidInterpolation.java +78 -0
- data/src/toxi/math/SinCosLUT.java +141 -0
- data/src/toxi/math/ThresholdInterpolation.java +58 -0
- data/src/toxi/math/ZoomLensInterpolation.java +126 -0
- data/src/toxi/math/conversion/UnitTranslator.java +161 -0
- data/src/toxi/math/noise/PerlinNoise.java +281 -0
- data/src/toxi/math/noise/SimplexNoise.java +542 -0
- data/src/toxi/math/waves/AMFMSineWave.java +143 -0
- data/src/toxi/math/waves/AbstractWave.java +248 -0
- data/src/toxi/math/waves/ConstantWave.java +48 -0
- data/src/toxi/math/waves/FMHarmonicSquareWave.java +155 -0
- data/src/toxi/math/waves/FMSawtoothWave.java +144 -0
- data/src/toxi/math/waves/FMSineWave.java +142 -0
- data/src/toxi/math/waves/FMSquareWave.java +143 -0
- data/src/toxi/math/waves/FMTriangleWave.java +126 -0
- data/src/toxi/math/waves/SineWave.java +81 -0
- data/src/toxi/math/waves/Wave2D.java +68 -0
- data/src/toxi/math/waves/WaveState.java +69 -0
- data/src/toxi/music/scale/AbstractScale.java +117 -0
- data/src/toxi/music/scale/GenericScale.java +66 -0
- data/src/toxi/music/scale/MajorScale.java +41 -0
- data/src/toxi/newmesh/AttributedEdge.java +106 -0
- data/src/toxi/newmesh/AttributedFace.java +63 -0
- data/src/toxi/newmesh/IndexedTriangleMesh.java +809 -0
- data/src/toxi/newmesh/MeshAttributeCompiler.java +45 -0
- data/src/toxi/newmesh/MeshFaceNormalCompiler.java +52 -0
- data/src/toxi/newmesh/MeshUVCompiler.java +52 -0
- data/src/toxi/newmesh/MeshVertexColorCompiler.java +49 -0
- data/src/toxi/newmesh/MeshVertexCompiler.java +54 -0
- data/src/toxi/newmesh/MeshVertexNormalCompiler.java +55 -0
- data/src/toxi/newmesh/SpatialIndex.java +78 -0
- data/src/toxi/physics2d/ParticlePath2D.java +100 -0
- data/src/toxi/physics2d/ParticleString2D.java +184 -0
- data/src/toxi/physics2d/PullBackSpring2D.java +51 -0
- data/src/toxi/physics2d/VerletConstrainedSpring2D.java +89 -0
- data/src/toxi/physics2d/VerletMinDistanceSpring2D.java +57 -0
- data/src/toxi/physics2d/VerletParticle2D.java +457 -0
- data/src/toxi/physics2d/VerletPhysics2D.java +448 -0
- data/src/toxi/physics2d/VerletSpring2D.java +181 -0
- data/src/toxi/physics2d/behaviors/AttractionBehavior2D.java +212 -0
- data/src/toxi/physics2d/behaviors/ConstantForceBehavior2D.java +112 -0
- data/src/toxi/physics2d/behaviors/GravityBehavior2D.java +61 -0
- data/src/toxi/physics2d/behaviors/ParticleBehavior2D.java +66 -0
- data/src/toxi/physics2d/constraints/AngularConstraint.java +83 -0
- data/src/toxi/physics2d/constraints/AxisConstraint.java +71 -0
- data/src/toxi/physics2d/constraints/CircularConstraint.java +69 -0
- data/src/toxi/physics2d/constraints/MaxConstraint.java +66 -0
- data/src/toxi/physics2d/constraints/MinConstraint.java +66 -0
- data/src/toxi/physics2d/constraints/ParticleConstraint2D.java +47 -0
- data/src/toxi/physics2d/constraints/PolygonConstraint.java +93 -0
- data/src/toxi/physics2d/constraints/RectConstraint.java +114 -0
- data/src/toxi/physics3d/ParticlePath3D.java +100 -0
- data/src/toxi/physics3d/ParticleString3D.java +184 -0
- data/src/toxi/physics3d/PullBackSpring3D.java +50 -0
- data/src/toxi/physics3d/VerletConstrainedSpring3D.java +88 -0
- data/src/toxi/physics3d/VerletMinDistanceSpring3D.java +56 -0
- data/src/toxi/physics3d/VerletParticle3D.java +385 -0
- data/src/toxi/physics3d/VerletPhysics3D.java +417 -0
- data/src/toxi/physics3d/VerletSpring3D.java +180 -0
- data/src/toxi/physics3d/behaviors/AttractionBehavior3D.java +182 -0
- data/src/toxi/physics3d/behaviors/ConstantForceBehavior3D.java +92 -0
- data/src/toxi/physics3d/behaviors/GravityBehavior3D.java +61 -0
- data/src/toxi/physics3d/behaviors/ParticleBehavior3D.java +52 -0
- data/src/toxi/physics3d/constraints/AxisConstraint.java +68 -0
- data/src/toxi/physics3d/constraints/BoxConstraint.java +121 -0
- data/src/toxi/physics3d/constraints/CylinderConstraint.java +87 -0
- data/src/toxi/physics3d/constraints/MaxConstraint.java +65 -0
- data/src/toxi/physics3d/constraints/MinConstraint.java +65 -0
- data/src/toxi/physics3d/constraints/ParticleConstraint3D.java +49 -0
- data/src/toxi/physics3d/constraints/PlaneConstraint.java +78 -0
- data/src/toxi/physics3d/constraints/SoftBoxConstraint.java +87 -0
- data/src/toxi/physics3d/constraints/SphereConstraint.java +108 -0
- data/src/toxi/processing/ArrowModifier.java +116 -0
- data/src/toxi/processing/DashedLineModifier.java +48 -0
- data/src/toxi/processing/DeltaOrientationMapper.java +57 -0
- data/src/toxi/processing/Line2DRenderModifier.java +18 -0
- data/src/toxi/processing/MeshToVBO.java +94 -0
- data/src/toxi/processing/NormalMapper.java +18 -0
- data/src/toxi/processing/POVInterface.java +121 -0
- data/src/toxi/processing/POVMesh.java +219 -0
- data/src/toxi/processing/POVWriter.java +460 -0
- data/src/toxi/processing/RCOpaque.java +77 -0
- data/src/toxi/processing/RCTransp.java +78 -0
- data/src/toxi/processing/TextureBuilder.java +232 -0
- data/src/toxi/processing/Textures.java +110 -0
- data/src/toxi/processing/ToxiclibsSupport.java +1239 -0
- data/src/toxi/processing/Tracing.java +25 -0
- data/src/toxi/processing/XYZNormalMapper.java +30 -0
- data/src/toxi/sim/automata/CAMatrix.java +297 -0
- data/src/toxi/sim/automata/CARule.java +76 -0
- data/src/toxi/sim/automata/CARule2D.java +354 -0
- data/src/toxi/sim/automata/CAWolfram1D.java +309 -0
- data/src/toxi/sim/automata/EvolvableMatrix.java +61 -0
- data/src/toxi/sim/automata/MatrixEvolver.java +42 -0
- data/src/toxi/sim/dla/BottomUpOrder.java +76 -0
- data/src/toxi/sim/dla/DLA.java +497 -0
- data/src/toxi/sim/dla/DLAConfiguration.java +364 -0
- data/src/toxi/sim/dla/DLAEventAdapter.java +64 -0
- data/src/toxi/sim/dla/DLAEventListener.java +57 -0
- data/src/toxi/sim/dla/DLAGuideLines.java +219 -0
- data/src/toxi/sim/dla/DLAParticle.java +102 -0
- data/src/toxi/sim/dla/DLASegment.java +88 -0
- data/src/toxi/sim/dla/PipelineOrder.java +50 -0
- data/src/toxi/sim/dla/RadialDistanceOrder.java +92 -0
- data/src/toxi/sim/erosion/ErosionFunction.java +122 -0
- data/src/toxi/sim/erosion/TalusAngleErosion.java +145 -0
- data/src/toxi/sim/erosion/ThermalErosion.java +75 -0
- data/src/toxi/sim/fluids/FluidSolver2D.java +762 -0
- data/src/toxi/sim/fluids/FluidSolver3D.java +326 -0
- data/src/toxi/sim/grayscott/GrayScott.java +469 -0
- data/src/toxi/util/DateUtils.java +141 -0
- data/src/toxi/util/FileSequenceDescriptor.java +181 -0
- data/src/toxi/util/FileUtils.java +467 -0
- data/src/toxi/util/datatypes/ArraySet.java +128 -0
- data/src/toxi/util/datatypes/ArrayUtil.java +404 -0
- data/src/toxi/util/datatypes/BiasedDoubleRange.java +141 -0
- data/src/toxi/util/datatypes/BiasedFloatRange.java +141 -0
- data/src/toxi/util/datatypes/BiasedIntegerRange.java +141 -0
- data/src/toxi/util/datatypes/DoubleRange.java +251 -0
- data/src/toxi/util/datatypes/FloatRange.java +251 -0
- data/src/toxi/util/datatypes/GenericSet.java +215 -0
- data/src/toxi/util/datatypes/IntegerRange.java +247 -0
- data/src/toxi/util/datatypes/IntegerSet.java +149 -0
- data/src/toxi/util/datatypes/ItemIndex.java +72 -0
- data/src/toxi/util/datatypes/SingletonRegistry.java +91 -0
- data/src/toxi/util/datatypes/TypedProperties.java +291 -0
- data/src/toxi/util/datatypes/UndirectedGraph.java +134 -0
- data/src/toxi/util/datatypes/UniqueItemIndex.java +223 -0
- data/src/toxi/util/datatypes/WeightedRandomEntry.java +76 -0
- data/src/toxi/util/datatypes/WeightedRandomSet.java +125 -0
- data/src/toxi/util/events/EventDispatcher.java +86 -0
- data/src/toxi/volume/AdditiveBrush.java +19 -0
- data/src/toxi/volume/ArrayIsoSurface.java +297 -0
- data/src/toxi/volume/BoxBrush.java +100 -0
- data/src/toxi/volume/BrushMode.java +16 -0
- data/src/toxi/volume/HashIsoSurface.java +354 -0
- data/src/toxi/volume/IsoSurface.java +59 -0
- data/src/toxi/volume/MarchingCubesIndex.java +312 -0
- data/src/toxi/volume/MeshLatticeBuilder.java +358 -0
- data/src/toxi/volume/MeshVoxelizer.java +216 -0
- data/src/toxi/volume/MultiplyBrush.java +20 -0
- data/src/toxi/volume/PeakBrush.java +21 -0
- data/src/toxi/volume/ReplaceBrush.java +19 -0
- data/src/toxi/volume/RoundBrush.java +113 -0
- data/src/toxi/volume/VolumetricBrush.java +160 -0
- data/src/toxi/volume/VolumetricHashMap.java +179 -0
- data/src/toxi/volume/VolumetricSpace.java +195 -0
- data/src/toxi/volume/VolumetricSpaceArray.java +214 -0
- data/toxiclibs.gemspec +34 -0
- metadata +424 -27
|
@@ -0,0 +1,101 @@
|
|
|
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.data.feeds.util;
|
|
29
|
+
|
|
30
|
+
import java.text.ParseException;
|
|
31
|
+
import java.text.SimpleDateFormat;
|
|
32
|
+
import java.util.Date;
|
|
33
|
+
import java.util.GregorianCalendar;
|
|
34
|
+
|
|
35
|
+
import javax.xml.bind.annotation.adapters.XmlAdapter;
|
|
36
|
+
import javax.xml.datatype.DatatypeFactory;
|
|
37
|
+
import javax.xml.datatype.XMLGregorianCalendar;
|
|
38
|
+
|
|
39
|
+
import com.sun.org.apache.xerces.internal.jaxp.datatype.DatatypeFactoryImpl;
|
|
40
|
+
|
|
41
|
+
/**
|
|
42
|
+
*
|
|
43
|
+
* @author tux
|
|
44
|
+
*/
|
|
45
|
+
public class Iso8601DateAdapter extends
|
|
46
|
+
XmlAdapter<String, XMLGregorianCalendar> {
|
|
47
|
+
|
|
48
|
+
/**
|
|
49
|
+
*
|
|
50
|
+
*/
|
|
51
|
+
public static final SimpleDateFormat[] ISO8601_FORMATS = new SimpleDateFormat[] {
|
|
52
|
+
new SimpleDateFormat("yyyy-MM-dd'T'HH:mm:ssZ"),
|
|
53
|
+
new SimpleDateFormat("yyyy-MM-dd'T'HH:mm:ss'Z'") };
|
|
54
|
+
|
|
55
|
+
/**
|
|
56
|
+
*
|
|
57
|
+
* @param date
|
|
58
|
+
* @return
|
|
59
|
+
* @throws Exception
|
|
60
|
+
*/
|
|
61
|
+
@Override
|
|
62
|
+
public String marshal(XMLGregorianCalendar date) throws Exception {
|
|
63
|
+
return ISO8601_FORMATS[0].format(date);
|
|
64
|
+
}
|
|
65
|
+
|
|
66
|
+
/**
|
|
67
|
+
*
|
|
68
|
+
* @param dateString
|
|
69
|
+
* @return
|
|
70
|
+
* @throws Exception
|
|
71
|
+
*/
|
|
72
|
+
@Override
|
|
73
|
+
public XMLGregorianCalendar unmarshal(String dateString) throws Exception {
|
|
74
|
+
XMLGregorianCalendar calendar = null;
|
|
75
|
+
GregorianCalendar cal = new GregorianCalendar();
|
|
76
|
+
DatatypeFactory dataType = DatatypeFactoryImpl.newInstance();
|
|
77
|
+
for (SimpleDateFormat f : ISO8601_FORMATS) {
|
|
78
|
+
try {
|
|
79
|
+
Date d = f.parse(dateString);
|
|
80
|
+
cal.setTime(d);
|
|
81
|
+
calendar = dataType.newXMLGregorianCalendar(cal);
|
|
82
|
+
break;
|
|
83
|
+
} catch (ParseException e) {
|
|
84
|
+
}
|
|
85
|
+
}
|
|
86
|
+
if (calendar == null) {
|
|
87
|
+
String timeZone = dateString.substring(dateString.length() - 6);
|
|
88
|
+
dateString = dateString.substring(0, dateString.length() - 6);
|
|
89
|
+
try {
|
|
90
|
+
Date d = ISO8601_FORMATS[0]
|
|
91
|
+
.parse(dateString + "GMT" + timeZone);
|
|
92
|
+
cal.setTime(d);
|
|
93
|
+
calendar = dataType.newXMLGregorianCalendar(cal);
|
|
94
|
+
} catch (ParseException e) {
|
|
95
|
+
cal.setTimeInMillis(0);
|
|
96
|
+
calendar = dataType.newXMLGregorianCalendar(cal);
|
|
97
|
+
}
|
|
98
|
+
}
|
|
99
|
+
return calendar;
|
|
100
|
+
}
|
|
101
|
+
}
|
|
@@ -0,0 +1,93 @@
|
|
|
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.data.feeds.util;
|
|
29
|
+
|
|
30
|
+
import java.text.ParseException;
|
|
31
|
+
import java.text.SimpleDateFormat;
|
|
32
|
+
import java.util.Date;
|
|
33
|
+
import java.util.GregorianCalendar;
|
|
34
|
+
|
|
35
|
+
import javax.xml.bind.annotation.adapters.XmlAdapter;
|
|
36
|
+
import javax.xml.datatype.DatatypeFactory;
|
|
37
|
+
import javax.xml.datatype.XMLGregorianCalendar;
|
|
38
|
+
|
|
39
|
+
import com.sun.org.apache.xerces.internal.jaxp.datatype.DatatypeFactoryImpl;
|
|
40
|
+
|
|
41
|
+
/**
|
|
42
|
+
*
|
|
43
|
+
* @author tux
|
|
44
|
+
*/
|
|
45
|
+
public class Rfc822DateAdapter extends XmlAdapter<String, XMLGregorianCalendar> {
|
|
46
|
+
|
|
47
|
+
/**
|
|
48
|
+
*
|
|
49
|
+
*/
|
|
50
|
+
public static final SimpleDateFormat[] RFC822_FORMATS = new SimpleDateFormat[] {
|
|
51
|
+
new SimpleDateFormat("EEE, d MMM yy HH:mm:ss z"),
|
|
52
|
+
new SimpleDateFormat("EEE, d MMM yy HH:mm z"),
|
|
53
|
+
new SimpleDateFormat("EEE, d MMM yyyy HH:mm:ss z"),
|
|
54
|
+
new SimpleDateFormat("EEE, d MMM yyyy HH:mm z"),
|
|
55
|
+
new SimpleDateFormat("d MMM yy HH:mm z"),
|
|
56
|
+
new SimpleDateFormat("d MMM yy HH:mm:ss z"),
|
|
57
|
+
new SimpleDateFormat("d MMM yyyy HH:mm z"),
|
|
58
|
+
new SimpleDateFormat("d MMM yyyy HH:mm:ss z"), };
|
|
59
|
+
|
|
60
|
+
/**
|
|
61
|
+
*
|
|
62
|
+
* @param date
|
|
63
|
+
* @return
|
|
64
|
+
* @throws Exception
|
|
65
|
+
*/
|
|
66
|
+
@Override
|
|
67
|
+
public String marshal(XMLGregorianCalendar date) throws Exception {
|
|
68
|
+
return RFC822_FORMATS[0].format(date);
|
|
69
|
+
}
|
|
70
|
+
|
|
71
|
+
/**
|
|
72
|
+
*
|
|
73
|
+
* @param dateString
|
|
74
|
+
* @return
|
|
75
|
+
* @throws Exception
|
|
76
|
+
*/
|
|
77
|
+
@Override
|
|
78
|
+
public XMLGregorianCalendar unmarshal(String dateString) throws Exception {
|
|
79
|
+
XMLGregorianCalendar calendar = null;
|
|
80
|
+
GregorianCalendar cal = new GregorianCalendar();
|
|
81
|
+
for (SimpleDateFormat f : RFC822_FORMATS) {
|
|
82
|
+
try {
|
|
83
|
+
Date d = f.parse(dateString);
|
|
84
|
+
cal.setTime(d);
|
|
85
|
+
DatatypeFactory dataType = DatatypeFactoryImpl.newInstance();
|
|
86
|
+
calendar = dataType.newXMLGregorianCalendar(cal);
|
|
87
|
+
break;
|
|
88
|
+
} catch (ParseException e) {
|
|
89
|
+
}
|
|
90
|
+
}
|
|
91
|
+
return calendar;
|
|
92
|
+
}
|
|
93
|
+
}
|
|
@@ -0,0 +1,658 @@
|
|
|
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 java.util.List;
|
|
31
|
+
|
|
32
|
+
import javax.xml.bind.annotation.XmlAccessType;
|
|
33
|
+
import javax.xml.bind.annotation.XmlAccessorType;
|
|
34
|
+
import javax.xml.bind.annotation.XmlElement;
|
|
35
|
+
import javax.xml.bind.annotation.XmlTransient;
|
|
36
|
+
|
|
37
|
+
import toxi.geom.mesh.Mesh3D;
|
|
38
|
+
import toxi.geom.mesh.TriangleMesh;
|
|
39
|
+
import toxi.math.MathUtils;
|
|
40
|
+
|
|
41
|
+
/**
|
|
42
|
+
* Axis-aligned bounding box with basic intersection features for Ray, AABB and
|
|
43
|
+
* Sphere classes.
|
|
44
|
+
*/
|
|
45
|
+
@XmlAccessorType(XmlAccessType.FIELD)
|
|
46
|
+
public class AABB extends Vec3D implements Shape3D {
|
|
47
|
+
|
|
48
|
+
/**
|
|
49
|
+
* Creates a new instance from two vectors specifying opposite corners of
|
|
50
|
+
* the box
|
|
51
|
+
*
|
|
52
|
+
* @param min
|
|
53
|
+
* first corner point
|
|
54
|
+
* @param max
|
|
55
|
+
* second corner point
|
|
56
|
+
* @return new AABB with centre at the half point between the 2 input
|
|
57
|
+
* vectors
|
|
58
|
+
*/
|
|
59
|
+
public static final AABB fromMinMax(Vec3D min, Vec3D max) {
|
|
60
|
+
Vec3D a = Vec3D.min(min, max);
|
|
61
|
+
Vec3D b = Vec3D.max(min, max);
|
|
62
|
+
return new AABB(a.interpolateTo(b, 0.5f), b.sub(a).scaleSelf(0.5f));
|
|
63
|
+
}
|
|
64
|
+
|
|
65
|
+
/**
|
|
66
|
+
* Factory method, computes & returns the bounding box for the given list of
|
|
67
|
+
* points.
|
|
68
|
+
*
|
|
69
|
+
* @param points
|
|
70
|
+
* @return bounding rect
|
|
71
|
+
*/
|
|
72
|
+
public static final AABB getBoundingBox(List<? extends Vec3D> points) {
|
|
73
|
+
if (points == null || points.isEmpty()) {
|
|
74
|
+
return null;
|
|
75
|
+
}
|
|
76
|
+
Vec3D first = points.get(0);
|
|
77
|
+
Vec3D min = first.copy();
|
|
78
|
+
Vec3D max = first.copy();
|
|
79
|
+
for (Vec3D p : points) {
|
|
80
|
+
min.minSelf(p);
|
|
81
|
+
max.maxSelf(p);
|
|
82
|
+
}
|
|
83
|
+
return fromMinMax(min, max);
|
|
84
|
+
}
|
|
85
|
+
|
|
86
|
+
/**
|
|
87
|
+
*
|
|
88
|
+
*/
|
|
89
|
+
@XmlElement(required = true)
|
|
90
|
+
protected Vec3D extent;
|
|
91
|
+
|
|
92
|
+
@XmlTransient
|
|
93
|
+
protected Vec3D min,
|
|
94
|
+
|
|
95
|
+
/**
|
|
96
|
+
*
|
|
97
|
+
*/
|
|
98
|
+
|
|
99
|
+
/**
|
|
100
|
+
*
|
|
101
|
+
*/
|
|
102
|
+
max;
|
|
103
|
+
|
|
104
|
+
/**
|
|
105
|
+
*
|
|
106
|
+
*/
|
|
107
|
+
public AABB() {
|
|
108
|
+
super();
|
|
109
|
+
setExtent(new Vec3D());
|
|
110
|
+
}
|
|
111
|
+
|
|
112
|
+
/**
|
|
113
|
+
* Creates an independent copy of the passed in box
|
|
114
|
+
*
|
|
115
|
+
* @param box
|
|
116
|
+
*/
|
|
117
|
+
public AABB(AABB box) {
|
|
118
|
+
this(box, box.getExtent());
|
|
119
|
+
}
|
|
120
|
+
|
|
121
|
+
/**
|
|
122
|
+
* Creates a new box of the given size at the world origin.
|
|
123
|
+
*
|
|
124
|
+
* @param extent
|
|
125
|
+
*/
|
|
126
|
+
public AABB(float extent) {
|
|
127
|
+
this(new Vec3D(), extent);
|
|
128
|
+
}
|
|
129
|
+
|
|
130
|
+
/**
|
|
131
|
+
* Creates a new instance from centre point and uniform extent in all
|
|
132
|
+
* directions.
|
|
133
|
+
*
|
|
134
|
+
* @param pos
|
|
135
|
+
* @param extent
|
|
136
|
+
*/
|
|
137
|
+
public AABB(ReadonlyVec3D pos, float extent) {
|
|
138
|
+
super(pos);
|
|
139
|
+
setExtent(new Vec3D(extent, extent, extent));
|
|
140
|
+
}
|
|
141
|
+
|
|
142
|
+
/**
|
|
143
|
+
* Creates a new instance from centre point and extent
|
|
144
|
+
*
|
|
145
|
+
* @param pos
|
|
146
|
+
* @param extent
|
|
147
|
+
* box dimensions (the box will be double the size in each
|
|
148
|
+
* direction)
|
|
149
|
+
*/
|
|
150
|
+
public AABB(ReadonlyVec3D pos, ReadonlyVec3D extent) {
|
|
151
|
+
super(pos);
|
|
152
|
+
setExtent(extent);
|
|
153
|
+
}
|
|
154
|
+
|
|
155
|
+
@Override
|
|
156
|
+
public boolean containsPoint(ReadonlyVec3D p) {
|
|
157
|
+
return p.isInAABB(this);
|
|
158
|
+
}
|
|
159
|
+
|
|
160
|
+
@Override
|
|
161
|
+
public AABB copy() {
|
|
162
|
+
return new AABB(this);
|
|
163
|
+
}
|
|
164
|
+
|
|
165
|
+
/**
|
|
166
|
+
*
|
|
167
|
+
* @return
|
|
168
|
+
*/
|
|
169
|
+
public Sphere getBoundingSphere() {
|
|
170
|
+
return new Sphere(this, extent.magnitude());
|
|
171
|
+
}
|
|
172
|
+
|
|
173
|
+
/**
|
|
174
|
+
* Returns the current box size as new Vec3D instance (updating this vector
|
|
175
|
+
* will NOT update the box size! Use {@link #setExtent(ReadonlyVec3D)} for
|
|
176
|
+
* those purposes)
|
|
177
|
+
*
|
|
178
|
+
* @return box size
|
|
179
|
+
*/
|
|
180
|
+
public final Vec3D getExtent() {
|
|
181
|
+
return extent.copy();
|
|
182
|
+
}
|
|
183
|
+
|
|
184
|
+
/**
|
|
185
|
+
*
|
|
186
|
+
* @return
|
|
187
|
+
*/
|
|
188
|
+
public final Vec3D getMax() {
|
|
189
|
+
// return this.add(extent);
|
|
190
|
+
return max.copy();
|
|
191
|
+
}
|
|
192
|
+
|
|
193
|
+
/**
|
|
194
|
+
*
|
|
195
|
+
* @return
|
|
196
|
+
*/
|
|
197
|
+
public final Vec3D getMin() {
|
|
198
|
+
return min.copy();
|
|
199
|
+
}
|
|
200
|
+
|
|
201
|
+
/**
|
|
202
|
+
*
|
|
203
|
+
* @param p
|
|
204
|
+
* @return
|
|
205
|
+
*/
|
|
206
|
+
public Vec3D getNormalForPoint(ReadonlyVec3D p) {
|
|
207
|
+
p = p.sub(this);
|
|
208
|
+
Vec3D pabs = extent.sub(p.getAbs());
|
|
209
|
+
Vec3D psign = p.getSignum();
|
|
210
|
+
Vec3D normal = Vec3D.X_AXIS.scale(psign.x);
|
|
211
|
+
float minDist = pabs.x;
|
|
212
|
+
if (pabs.y < minDist) {
|
|
213
|
+
minDist = pabs.y;
|
|
214
|
+
normal = Vec3D.Y_AXIS.scale(psign.y);
|
|
215
|
+
}
|
|
216
|
+
if (pabs.z < minDist) {
|
|
217
|
+
normal = Vec3D.Z_AXIS.scale(psign.z);
|
|
218
|
+
}
|
|
219
|
+
return normal;
|
|
220
|
+
}
|
|
221
|
+
|
|
222
|
+
/**
|
|
223
|
+
* Adjusts the box size and position such that it includes the given point.
|
|
224
|
+
*
|
|
225
|
+
* @param p
|
|
226
|
+
* point to include
|
|
227
|
+
* @return itself
|
|
228
|
+
*/
|
|
229
|
+
public AABB growToContainPoint(ReadonlyVec3D p) {
|
|
230
|
+
min.minSelf(p);
|
|
231
|
+
max.maxSelf(p);
|
|
232
|
+
set(min.interpolateTo(max, 0.5f));
|
|
233
|
+
extent.set(max.sub(min).scaleSelf(0.5f));
|
|
234
|
+
return this;
|
|
235
|
+
}
|
|
236
|
+
|
|
237
|
+
/**
|
|
238
|
+
* Checks if the box intersects the passed in one.
|
|
239
|
+
*
|
|
240
|
+
* @param box
|
|
241
|
+
* box to check
|
|
242
|
+
* @return true, if boxes overlap
|
|
243
|
+
*/
|
|
244
|
+
public boolean intersectsBox(AABB box) {
|
|
245
|
+
Vec3D t = box.sub(this);
|
|
246
|
+
return MathUtils.abs(t.x) <= (extent.x + box.extent.x)
|
|
247
|
+
&& MathUtils.abs(t.y) <= (extent.y + box.extent.y)
|
|
248
|
+
&& MathUtils.abs(t.z) <= (extent.z + box.extent.z);
|
|
249
|
+
}
|
|
250
|
+
|
|
251
|
+
/**
|
|
252
|
+
* Calculates intersection with the given ray between a certain distance
|
|
253
|
+
* interval.
|
|
254
|
+
*
|
|
255
|
+
* Ray-box intersection is using IEEE numerical properties to ensure the
|
|
256
|
+
* test is both robust and efficient, as described in:
|
|
257
|
+
*
|
|
258
|
+
* Amy Williams, Steve Barrus, R. Keith Morley, and Peter Shirley: "An
|
|
259
|
+
* Efficient and Robust Ray-Box Intersection Algorithm" Journal of graphics
|
|
260
|
+
* tools, 10(1):49-54, 2005
|
|
261
|
+
*
|
|
262
|
+
* @param ray
|
|
263
|
+
* incident ray
|
|
264
|
+
* @param minDist
|
|
265
|
+
* @param maxDist
|
|
266
|
+
* @return intersection point on the bounding box (only the first is
|
|
267
|
+
* returned) or null if no intersection
|
|
268
|
+
*/
|
|
269
|
+
public Vec3D intersectsRay(Ray3D ray, float minDist, float maxDist) {
|
|
270
|
+
Vec3D invDir = ray.getDirection().reciprocal();
|
|
271
|
+
boolean signDirX = invDir.x < 0;
|
|
272
|
+
boolean signDirY = invDir.y < 0;
|
|
273
|
+
boolean signDirZ = invDir.z < 0;
|
|
274
|
+
Vec3D bbox = signDirX ? max : min;
|
|
275
|
+
float tmin = (bbox.x - ray.x) * invDir.x;
|
|
276
|
+
bbox = signDirX ? min : max;
|
|
277
|
+
float tmax = (bbox.x - ray.x) * invDir.x;
|
|
278
|
+
bbox = signDirY ? max : min;
|
|
279
|
+
float tymin = (bbox.y - ray.y) * invDir.y;
|
|
280
|
+
bbox = signDirY ? min : max;
|
|
281
|
+
float tymax = (bbox.y - ray.y) * invDir.y;
|
|
282
|
+
if ((tmin > tymax) || (tymin > tmax)) {
|
|
283
|
+
return null;
|
|
284
|
+
}
|
|
285
|
+
if (tymin > tmin) {
|
|
286
|
+
tmin = tymin;
|
|
287
|
+
}
|
|
288
|
+
if (tymax < tmax) {
|
|
289
|
+
tmax = tymax;
|
|
290
|
+
}
|
|
291
|
+
bbox = signDirZ ? max : min;
|
|
292
|
+
float tzmin = (bbox.z - ray.z) * invDir.z;
|
|
293
|
+
bbox = signDirZ ? min : max;
|
|
294
|
+
float tzmax = (bbox.z - ray.z) * invDir.z;
|
|
295
|
+
if ((tmin > tzmax) || (tzmin > tmax)) {
|
|
296
|
+
return null;
|
|
297
|
+
}
|
|
298
|
+
if (tzmin > tmin) {
|
|
299
|
+
tmin = tzmin;
|
|
300
|
+
}
|
|
301
|
+
if (tzmax < tmax) {
|
|
302
|
+
tmax = tzmax;
|
|
303
|
+
}
|
|
304
|
+
if ((tmin < maxDist) && (tmax > minDist)) {
|
|
305
|
+
return ray.getPointAtDistance(tmin);
|
|
306
|
+
}
|
|
307
|
+
return null;
|
|
308
|
+
}
|
|
309
|
+
|
|
310
|
+
/**
|
|
311
|
+
*
|
|
312
|
+
* @param s
|
|
313
|
+
* @return
|
|
314
|
+
*/
|
|
315
|
+
public boolean intersectsSphere(Sphere s) {
|
|
316
|
+
return intersectsSphere(s, s.radius);
|
|
317
|
+
}
|
|
318
|
+
|
|
319
|
+
/**
|
|
320
|
+
* @param c
|
|
321
|
+
* sphere centre
|
|
322
|
+
* @param r
|
|
323
|
+
* sphere radius
|
|
324
|
+
* @return true, if AABB intersects with sphere
|
|
325
|
+
*/
|
|
326
|
+
public boolean intersectsSphere(Vec3D c, float r) {
|
|
327
|
+
float s, d = 0;
|
|
328
|
+
// find the square of the distance
|
|
329
|
+
// from the sphere to the box
|
|
330
|
+
if (c.x < min.x) {
|
|
331
|
+
s = c.x - min.x;
|
|
332
|
+
d = s * s;
|
|
333
|
+
} else if (c.x > max.x) {
|
|
334
|
+
s = c.x - max.x;
|
|
335
|
+
d += s * s;
|
|
336
|
+
}
|
|
337
|
+
|
|
338
|
+
if (c.y < min.y) {
|
|
339
|
+
s = c.y - min.y;
|
|
340
|
+
d += s * s;
|
|
341
|
+
} else if (c.y > max.y) {
|
|
342
|
+
s = c.y - max.y;
|
|
343
|
+
d += s * s;
|
|
344
|
+
}
|
|
345
|
+
|
|
346
|
+
if (c.z < min.z) {
|
|
347
|
+
s = c.z - min.z;
|
|
348
|
+
d += s * s;
|
|
349
|
+
} else if (c.z > max.z) {
|
|
350
|
+
s = c.z - max.z;
|
|
351
|
+
d += s * s;
|
|
352
|
+
}
|
|
353
|
+
|
|
354
|
+
return d <= r * r;
|
|
355
|
+
}
|
|
356
|
+
|
|
357
|
+
/**
|
|
358
|
+
*
|
|
359
|
+
* @param tri
|
|
360
|
+
* @return
|
|
361
|
+
*/
|
|
362
|
+
public boolean intersectsTriangle(Triangle3D tri) {
|
|
363
|
+
// use separating axis theorem to test overlap between triangle and box
|
|
364
|
+
// need to test for overlap in these directions:
|
|
365
|
+
//
|
|
366
|
+
// 1) the {x,y,z}-directions (actually, since we use the AABB of the
|
|
367
|
+
// triangle
|
|
368
|
+
// we do not even need to test these)
|
|
369
|
+
// 2) normal of the triangle
|
|
370
|
+
// 3) crossproduct(edge from tri, {x,y,z}-directin)
|
|
371
|
+
// this gives 3x3=9 more tests
|
|
372
|
+
Vec3D v0, v1, v2;
|
|
373
|
+
Vec3D normal, e0, e1, e2, f;
|
|
374
|
+
|
|
375
|
+
// move everything so that the boxcenter is in (0,0,0)
|
|
376
|
+
v0 = tri.a.sub(this);
|
|
377
|
+
v1 = tri.b.sub(this);
|
|
378
|
+
v2 = tri.c.sub(this);
|
|
379
|
+
|
|
380
|
+
// compute triangle edges
|
|
381
|
+
e0 = v1.sub(v0);
|
|
382
|
+
e1 = v2.sub(v1);
|
|
383
|
+
e2 = v0.sub(v2);
|
|
384
|
+
|
|
385
|
+
// test the 9 tests first (this was faster)
|
|
386
|
+
f = e0.getAbs();
|
|
387
|
+
if (testAxis(e0.z, -e0.y, f.z, f.y, v0.y, v0.z, v2.y, v2.z, extent.y,
|
|
388
|
+
extent.z)) {
|
|
389
|
+
return false;
|
|
390
|
+
}
|
|
391
|
+
if (testAxis(-e0.z, e0.x, f.z, f.x, v0.x, v0.z, v2.x, v2.z, extent.x,
|
|
392
|
+
extent.z)) {
|
|
393
|
+
return false;
|
|
394
|
+
}
|
|
395
|
+
if (testAxis(e0.y, -e0.x, f.y, f.x, v1.x, v1.y, v2.x, v2.y, extent.x,
|
|
396
|
+
extent.y)) {
|
|
397
|
+
return false;
|
|
398
|
+
}
|
|
399
|
+
|
|
400
|
+
f = e1.getAbs();
|
|
401
|
+
if (testAxis(e1.z, -e1.y, f.z, f.y, v0.y, v0.z, v2.y, v2.z, extent.y,
|
|
402
|
+
extent.z)) {
|
|
403
|
+
return false;
|
|
404
|
+
}
|
|
405
|
+
if (testAxis(-e1.z, e1.x, f.z, f.x, v0.x, v0.z, v2.x, v2.z, extent.x,
|
|
406
|
+
extent.z)) {
|
|
407
|
+
return false;
|
|
408
|
+
}
|
|
409
|
+
if (testAxis(e1.y, -e1.x, f.y, f.x, v0.x, v0.y, v1.x, v1.y, extent.x,
|
|
410
|
+
extent.y)) {
|
|
411
|
+
return false;
|
|
412
|
+
}
|
|
413
|
+
|
|
414
|
+
f = e2.getAbs();
|
|
415
|
+
if (testAxis(e2.z, -e2.y, f.z, f.y, v0.y, v0.z, v1.y, v1.z, extent.y,
|
|
416
|
+
extent.z)) {
|
|
417
|
+
return false;
|
|
418
|
+
}
|
|
419
|
+
if (testAxis(-e2.z, e2.x, f.z, f.x, v0.x, v0.z, v1.x, v1.z, extent.x,
|
|
420
|
+
extent.z)) {
|
|
421
|
+
return false;
|
|
422
|
+
}
|
|
423
|
+
if (testAxis(e2.y, -e2.x, f.y, f.x, v1.x, v1.y, v2.x, v2.y, extent.x,
|
|
424
|
+
extent.y)) {
|
|
425
|
+
return false;
|
|
426
|
+
}
|
|
427
|
+
|
|
428
|
+
// first test overlap in the {x,y,z}-directions
|
|
429
|
+
// find min, max of the triangle each direction, and test for overlap in
|
|
430
|
+
// that direction -- this is equivalent to testing a minimal AABB around
|
|
431
|
+
// the triangle against the AABB
|
|
432
|
+
|
|
433
|
+
// test in X-direction
|
|
434
|
+
if (MathUtils.min(v0.x, v1.x, v2.x) > extent.x
|
|
435
|
+
|| MathUtils.max(v0.x, v1.x, v2.x) < -extent.x) {
|
|
436
|
+
return false;
|
|
437
|
+
}
|
|
438
|
+
|
|
439
|
+
// test in Y-direction
|
|
440
|
+
if (MathUtils.min(v0.y, v1.y, v2.y) > extent.y
|
|
441
|
+
|| MathUtils.max(v0.y, v1.y, v2.y) < -extent.y) {
|
|
442
|
+
return false;
|
|
443
|
+
}
|
|
444
|
+
|
|
445
|
+
// test in Z-direction
|
|
446
|
+
if (MathUtils.min(v0.z, v1.z, v2.z) > extent.z
|
|
447
|
+
|| MathUtils.max(v0.z, v1.z, v2.z) < -extent.z) {
|
|
448
|
+
return false;
|
|
449
|
+
}
|
|
450
|
+
|
|
451
|
+
// test if the box intersects the plane of the triangle
|
|
452
|
+
// compute plane equation of triangle: normal*x+d=0
|
|
453
|
+
normal = e0.cross(e1);
|
|
454
|
+
float d = -normal.dot(v0);
|
|
455
|
+
return planeBoxOverlap(normal, d, extent);
|
|
456
|
+
}
|
|
457
|
+
|
|
458
|
+
private boolean planeBoxOverlap(Vec3D normal, float d, Vec3D maxbox) {
|
|
459
|
+
Vec3D vmin = new Vec3D();
|
|
460
|
+
Vec3D vmax = new Vec3D();
|
|
461
|
+
|
|
462
|
+
if (normal.x > 0.0f) {
|
|
463
|
+
vmin.x = -maxbox.x;
|
|
464
|
+
vmax.x = maxbox.x;
|
|
465
|
+
} else {
|
|
466
|
+
vmin.x = maxbox.x;
|
|
467
|
+
vmax.x = -maxbox.x;
|
|
468
|
+
}
|
|
469
|
+
|
|
470
|
+
if (normal.y > 0.0f) {
|
|
471
|
+
vmin.y = -maxbox.y;
|
|
472
|
+
vmax.y = maxbox.y;
|
|
473
|
+
} else {
|
|
474
|
+
vmin.y = maxbox.y;
|
|
475
|
+
vmax.y = -maxbox.y;
|
|
476
|
+
}
|
|
477
|
+
|
|
478
|
+
if (normal.z > 0.0f) {
|
|
479
|
+
vmin.z = -maxbox.z;
|
|
480
|
+
vmax.z = maxbox.z;
|
|
481
|
+
} else {
|
|
482
|
+
vmin.z = maxbox.z;
|
|
483
|
+
vmax.z = -maxbox.z;
|
|
484
|
+
}
|
|
485
|
+
if (normal.dot(vmin) + d > 0.0f) {
|
|
486
|
+
return false;
|
|
487
|
+
}
|
|
488
|
+
return (normal.dot(vmax) + d >= 0.0f); // returns true or false
|
|
489
|
+
}
|
|
490
|
+
|
|
491
|
+
/**
|
|
492
|
+
*
|
|
493
|
+
* @param box
|
|
494
|
+
* @return
|
|
495
|
+
*/
|
|
496
|
+
public AABB set(AABB box) {
|
|
497
|
+
extent.set(box.extent);
|
|
498
|
+
return set((ReadonlyVec3D) box);
|
|
499
|
+
}
|
|
500
|
+
|
|
501
|
+
/**
|
|
502
|
+
* Updates the position of the box in space and calls
|
|
503
|
+
* {@link #updateBounds()} immediately
|
|
504
|
+
*
|
|
505
|
+
* @return
|
|
506
|
+
* @see toxi.geom.Vec3D#set(float, float, float)
|
|
507
|
+
*/
|
|
508
|
+
@Override
|
|
509
|
+
public Vec3D set(float x, float y, float z) {
|
|
510
|
+
this.x = x;
|
|
511
|
+
this.y = y;
|
|
512
|
+
this.z = z;
|
|
513
|
+
updateBounds();
|
|
514
|
+
return this;
|
|
515
|
+
}
|
|
516
|
+
|
|
517
|
+
/**
|
|
518
|
+
* Updates the position of the box in space and calls
|
|
519
|
+
* {@link #updateBounds()} immediately
|
|
520
|
+
*
|
|
521
|
+
* @param v
|
|
522
|
+
* @return
|
|
523
|
+
* @see toxi.geom.Vec3D#set(toxi.geom.Vec3D)
|
|
524
|
+
*/
|
|
525
|
+
@Override
|
|
526
|
+
public AABB set(ReadonlyVec3D v) {
|
|
527
|
+
x = v.x();
|
|
528
|
+
y = v.y();
|
|
529
|
+
z = v.z();
|
|
530
|
+
updateBounds();
|
|
531
|
+
return this;
|
|
532
|
+
}
|
|
533
|
+
|
|
534
|
+
/**
|
|
535
|
+
* Updates the size of the box and calls {@link #updateBounds()} immediately
|
|
536
|
+
*
|
|
537
|
+
* @param extent
|
|
538
|
+
* new box size
|
|
539
|
+
* @return itself, for method chaining
|
|
540
|
+
*/
|
|
541
|
+
public final AABB setExtent(ReadonlyVec3D extent) {
|
|
542
|
+
this.extent = extent.copy();
|
|
543
|
+
return updateBounds();
|
|
544
|
+
}
|
|
545
|
+
|
|
546
|
+
private boolean testAxis(float a, float b, float fa, float fb, float va,
|
|
547
|
+
float vb, float wa, float wb, float ea, float eb) {
|
|
548
|
+
float p0 = a * va + b * vb;
|
|
549
|
+
float p2 = a * wa + b * wb;
|
|
550
|
+
float amin, amax;
|
|
551
|
+
if (p0 < p2) {
|
|
552
|
+
amin = p0;
|
|
553
|
+
amax = p2;
|
|
554
|
+
} else {
|
|
555
|
+
amin = p2;
|
|
556
|
+
amax = p0;
|
|
557
|
+
}
|
|
558
|
+
float rad = fa * ea + fb * eb;
|
|
559
|
+
return (amin > rad || amax < -rad);
|
|
560
|
+
}
|
|
561
|
+
|
|
562
|
+
/**
|
|
563
|
+
*
|
|
564
|
+
* @return
|
|
565
|
+
*/
|
|
566
|
+
public Mesh3D toMesh() {
|
|
567
|
+
return toMesh(null);
|
|
568
|
+
}
|
|
569
|
+
|
|
570
|
+
/**
|
|
571
|
+
*
|
|
572
|
+
* @param mesh
|
|
573
|
+
* @return
|
|
574
|
+
*/
|
|
575
|
+
public Mesh3D toMesh(Mesh3D mesh) {
|
|
576
|
+
if (mesh == null) {
|
|
577
|
+
mesh = new TriangleMesh("aabb", 8, 12);
|
|
578
|
+
}
|
|
579
|
+
Vec3D a = min;
|
|
580
|
+
Vec3D g = max;
|
|
581
|
+
Vec3D b = new Vec3D(a.x, a.y, g.z);
|
|
582
|
+
Vec3D c = new Vec3D(g.x, a.y, g.z);
|
|
583
|
+
Vec3D d = new Vec3D(g.x, a.y, a.z);
|
|
584
|
+
Vec3D e = new Vec3D(a.x, g.y, a.z);
|
|
585
|
+
Vec3D f = new Vec3D(a.x, g.y, g.z);
|
|
586
|
+
Vec3D h = new Vec3D(g.x, g.y, a.z);
|
|
587
|
+
Vec2D ua = new Vec2D(0, 0);
|
|
588
|
+
Vec2D ub = new Vec2D(1, 0);
|
|
589
|
+
Vec2D uc = new Vec2D(1, 1);
|
|
590
|
+
Vec2D ud = new Vec2D(0, 1);
|
|
591
|
+
// left
|
|
592
|
+
mesh.addFace(a, b, f, ud, uc, ub);
|
|
593
|
+
mesh.addFace(a, f, e, ud, ub, ua);
|
|
594
|
+
// front
|
|
595
|
+
mesh.addFace(b, c, g, ud, uc, ub);
|
|
596
|
+
mesh.addFace(b, g, f, ud, ub, ua);
|
|
597
|
+
// right
|
|
598
|
+
mesh.addFace(c, d, h, ud, uc, ub);
|
|
599
|
+
mesh.addFace(c, h, g, ud, ub, ua);
|
|
600
|
+
// back
|
|
601
|
+
mesh.addFace(d, a, e, ud, uc, ub);
|
|
602
|
+
mesh.addFace(d, e, h, ud, ub, ua);
|
|
603
|
+
// top
|
|
604
|
+
mesh.addFace(e, f, h, ua, ud, ub);
|
|
605
|
+
mesh.addFace(f, g, h, ud, uc, ub);
|
|
606
|
+
// bottom
|
|
607
|
+
mesh.addFace(a, d, b, ud, uc, ua);
|
|
608
|
+
mesh.addFace(b, d, c, ua, uc, ub);
|
|
609
|
+
return mesh;
|
|
610
|
+
}
|
|
611
|
+
|
|
612
|
+
/*
|
|
613
|
+
* (non-Javadoc)
|
|
614
|
+
*
|
|
615
|
+
* @see toxi.geom.Vec3D#toString()
|
|
616
|
+
*/
|
|
617
|
+
|
|
618
|
+
/**
|
|
619
|
+
*
|
|
620
|
+
* @return
|
|
621
|
+
*/
|
|
622
|
+
|
|
623
|
+
@Override
|
|
624
|
+
public String toString() {
|
|
625
|
+
StringBuilder sb = new StringBuilder();
|
|
626
|
+
sb.append("<aabb> pos: ").append(super.toString()).append(" ext: ")
|
|
627
|
+
.append(extent);
|
|
628
|
+
return sb.toString();
|
|
629
|
+
}
|
|
630
|
+
|
|
631
|
+
/**
|
|
632
|
+
*
|
|
633
|
+
* @param box
|
|
634
|
+
* @return
|
|
635
|
+
*/
|
|
636
|
+
public AABB union(AABB box) {
|
|
637
|
+
min.minSelf(box.getMin());
|
|
638
|
+
max.maxSelf(box.getMax());
|
|
639
|
+
set(min.interpolateTo(max, 0.5f));
|
|
640
|
+
extent.set(max.sub(min).scaleSelf(0.5f));
|
|
641
|
+
return this;
|
|
642
|
+
}
|
|
643
|
+
|
|
644
|
+
/**
|
|
645
|
+
* Updates the min/max corner points of the box. MUST be called after moving
|
|
646
|
+
* the box in space by manipulating the public x,y,z coordinates directly.
|
|
647
|
+
*
|
|
648
|
+
* @return itself
|
|
649
|
+
*/
|
|
650
|
+
public final AABB updateBounds() {
|
|
651
|
+
// this is check is necessary for the constructor
|
|
652
|
+
if (extent != null) {
|
|
653
|
+
this.min = this.sub(extent);
|
|
654
|
+
this.max = this.add(extent);
|
|
655
|
+
}
|
|
656
|
+
return this;
|
|
657
|
+
}
|
|
658
|
+
}
|