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,18 @@
|
|
|
1
|
+
package toxi.processing;
|
|
2
|
+
|
|
3
|
+
import toxi.color.ReadonlyTColor;
|
|
4
|
+
import toxi.geom.Vec3D;
|
|
5
|
+
|
|
6
|
+
/**
|
|
7
|
+
*
|
|
8
|
+
* @author tux
|
|
9
|
+
*/
|
|
10
|
+
public interface NormalMapper {
|
|
11
|
+
|
|
12
|
+
/**
|
|
13
|
+
*
|
|
14
|
+
* @param normal
|
|
15
|
+
* @return
|
|
16
|
+
*/
|
|
17
|
+
public ReadonlyTColor getRGBForNormal(Vec3D normal);
|
|
18
|
+
}
|
|
@@ -0,0 +1,121 @@
|
|
|
1
|
+
/*
|
|
2
|
+
* This library adds PovRAY export facility to toxiclibscore
|
|
3
|
+
* Copyright (c) 2015 Martin Prout
|
|
4
|
+
*
|
|
5
|
+
* This library is free software; you can redistribute it and/or modify it under
|
|
6
|
+
* the terms of the GNU Lesser General Public License as published by the Free
|
|
7
|
+
* Software Foundation; either version 2.1 of the License, or (at your option)
|
|
8
|
+
* any later version.
|
|
9
|
+
*
|
|
10
|
+
* http://creativecommons.org/licenses/LGPL/2.1/
|
|
11
|
+
*
|
|
12
|
+
* This library is distributed in the hope that it will be useful, but WITHOUT
|
|
13
|
+
* ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or FITNESS
|
|
14
|
+
* FOR A PARTICULAR PURPOSE. See the GNU Lesser General Public License for more
|
|
15
|
+
* details.
|
|
16
|
+
*
|
|
17
|
+
* You should have received a copy of the GNU Lesser General Public License
|
|
18
|
+
* along with this library; if not, write to the Free Software Foundation, Inc.,
|
|
19
|
+
* 51 Franklin St, Fifth Floor, Boston, MA 02110-1301, USA
|
|
20
|
+
*/
|
|
21
|
+
|
|
22
|
+
package toxi.processing;
|
|
23
|
+
|
|
24
|
+
import toxi.geom.Vec3D;
|
|
25
|
+
|
|
26
|
+
/**
|
|
27
|
+
*
|
|
28
|
+
* @author Martin Prout
|
|
29
|
+
*/
|
|
30
|
+
public interface POVInterface {
|
|
31
|
+
|
|
32
|
+
/**
|
|
33
|
+
* Output start of face_indices
|
|
34
|
+
*
|
|
35
|
+
* @param count
|
|
36
|
+
*/
|
|
37
|
+
void beginIndices(int count);
|
|
38
|
+
|
|
39
|
+
/**
|
|
40
|
+
* Begin the mesh2 output as a PovRAY declaration
|
|
41
|
+
*
|
|
42
|
+
* @param name
|
|
43
|
+
*/
|
|
44
|
+
void beginMesh2(String name);
|
|
45
|
+
|
|
46
|
+
/**
|
|
47
|
+
* Output start of normal_vectors
|
|
48
|
+
*
|
|
49
|
+
* @param count
|
|
50
|
+
*/
|
|
51
|
+
void beginNormals(int count);
|
|
52
|
+
|
|
53
|
+
/**
|
|
54
|
+
* close the mesh declaration
|
|
55
|
+
*/
|
|
56
|
+
void endSave();
|
|
57
|
+
|
|
58
|
+
/**
|
|
59
|
+
* End the current section ie vertex_vector, normal_vector or face_indices
|
|
60
|
+
*/
|
|
61
|
+
void endSection();
|
|
62
|
+
|
|
63
|
+
/**
|
|
64
|
+
* Write face indices as as vector
|
|
65
|
+
*
|
|
66
|
+
* @param a
|
|
67
|
+
* @param b
|
|
68
|
+
* @param c
|
|
69
|
+
*/
|
|
70
|
+
void face(int a, int b, int c);
|
|
71
|
+
|
|
72
|
+
/**
|
|
73
|
+
* Track the number of normals written to file
|
|
74
|
+
*
|
|
75
|
+
* @return current normal offset
|
|
76
|
+
*/
|
|
77
|
+
int getCurrNormalOffset();
|
|
78
|
+
|
|
79
|
+
/**
|
|
80
|
+
* Track the number of vertices written to file
|
|
81
|
+
*
|
|
82
|
+
* @return vertex offset
|
|
83
|
+
*/
|
|
84
|
+
int getCurrVertexOffset();
|
|
85
|
+
|
|
86
|
+
/**
|
|
87
|
+
* Required to keep in sync with current option
|
|
88
|
+
*
|
|
89
|
+
* @return option Textures
|
|
90
|
+
*/
|
|
91
|
+
Textures getTexture();
|
|
92
|
+
|
|
93
|
+
/**
|
|
94
|
+
* Write normal as PovRAY vector
|
|
95
|
+
*
|
|
96
|
+
* @param n
|
|
97
|
+
*/
|
|
98
|
+
void normal(Vec3D n);
|
|
99
|
+
|
|
100
|
+
/**
|
|
101
|
+
* Required to keep in sync with current option
|
|
102
|
+
*
|
|
103
|
+
* @param opt
|
|
104
|
+
*/
|
|
105
|
+
void setTexture(Textures opt);
|
|
106
|
+
|
|
107
|
+
/**
|
|
108
|
+
* Used to output total count vertex_vector, normal_vector & face_indices
|
|
109
|
+
*
|
|
110
|
+
* @param count
|
|
111
|
+
*/
|
|
112
|
+
void total(int count);
|
|
113
|
+
|
|
114
|
+
/**
|
|
115
|
+
* Write vertex as PovRAY vector
|
|
116
|
+
*
|
|
117
|
+
* @param v
|
|
118
|
+
*/
|
|
119
|
+
void vertex(Vec3D v);
|
|
120
|
+
|
|
121
|
+
}
|
|
@@ -0,0 +1,219 @@
|
|
|
1
|
+
/*
|
|
2
|
+
* This library adds PovRAY export facility to toxiclibscore
|
|
3
|
+
* Copyright (c) 2015 Martin Prout
|
|
4
|
+
*
|
|
5
|
+
* This library is free software; you can redistribute it and/or modify it under
|
|
6
|
+
* the terms of the GNU Lesser General Public License as published by the Free
|
|
7
|
+
* Software Foundation; either version 2.1 of the License, or (at your option)
|
|
8
|
+
* any later version.
|
|
9
|
+
*
|
|
10
|
+
* http://creativecommons.org/licenses/LGPL/2.1/
|
|
11
|
+
*
|
|
12
|
+
* This library is distributed in the hope that it will be useful, but WITHOUT
|
|
13
|
+
* ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or FITNESS
|
|
14
|
+
* FOR A PARTICULAR PURPOSE. See the GNU Lesser General Public License for more
|
|
15
|
+
* details.
|
|
16
|
+
*
|
|
17
|
+
* You should have received a copy of the GNU Lesser General Public License
|
|
18
|
+
* along with this library; if not, write to the Free Software Foundation, Inc.,
|
|
19
|
+
* 51 Franklin St, Fifth Floor, Boston, MA 02110-1301, USA
|
|
20
|
+
*/
|
|
21
|
+
package toxi.processing;
|
|
22
|
+
|
|
23
|
+
import java.io.File;
|
|
24
|
+
import processing.core.PApplet;
|
|
25
|
+
import toxi.geom.AABB;
|
|
26
|
+
import toxi.geom.Vec3D;
|
|
27
|
+
|
|
28
|
+
/**
|
|
29
|
+
* This class provides access to underlying TriangleMesh parameters to allow
|
|
30
|
+
* export in PovRAY mesh2 format (with or without normals)
|
|
31
|
+
*
|
|
32
|
+
* @author Martin Prout
|
|
33
|
+
*/
|
|
34
|
+
public class POVMesh {
|
|
35
|
+
|
|
36
|
+
private POVWriter pov;
|
|
37
|
+
private Textures opt;
|
|
38
|
+
private final PApplet parent;
|
|
39
|
+
/**
|
|
40
|
+
*
|
|
41
|
+
*/
|
|
42
|
+
static String VERSION = "0.58";
|
|
43
|
+
|
|
44
|
+
/**
|
|
45
|
+
* Default constructor this mesh no texture
|
|
46
|
+
*
|
|
47
|
+
* @param app
|
|
48
|
+
*/
|
|
49
|
+
public POVMesh(PApplet app) {
|
|
50
|
+
parent = app;
|
|
51
|
+
parent.registerMethod("dispose", this);
|
|
52
|
+
}
|
|
53
|
+
|
|
54
|
+
/**
|
|
55
|
+
* Allows the option to change texture option per mesh
|
|
56
|
+
*
|
|
57
|
+
* @param opt
|
|
58
|
+
*/
|
|
59
|
+
public void setTexture(Textures opt) {
|
|
60
|
+
this.opt = opt;
|
|
61
|
+
}
|
|
62
|
+
|
|
63
|
+
/**
|
|
64
|
+
* Saves the mesh as PovRAY mesh2 format by appending it to the given mesh
|
|
65
|
+
* {@link POVWriter} instance. Saves normals.
|
|
66
|
+
*
|
|
67
|
+
* @param meshArray
|
|
68
|
+
*/
|
|
69
|
+
public void saveAsPOV(toxi.geom.mesh.TriangleMesh[] meshArray) {
|
|
70
|
+
saveAsMesh(meshArray, true);
|
|
71
|
+
}
|
|
72
|
+
|
|
73
|
+
/**
|
|
74
|
+
* Saves the mesh as PovRAY mesh2 format by appending it to the given mesh
|
|
75
|
+
* {@link POVWriter} instance. Saves normals.
|
|
76
|
+
*
|
|
77
|
+
* @param mesh
|
|
78
|
+
*/
|
|
79
|
+
public void saveAsPOV(toxi.geom.mesh.TriangleMesh mesh) {
|
|
80
|
+
saveAsPOV(mesh, true);
|
|
81
|
+
}
|
|
82
|
+
|
|
83
|
+
/**
|
|
84
|
+
* Saves the mesh as PovRAY mesh2 format to the given {@link PrintWriter}.
|
|
85
|
+
* Without normals (when saveNormal is false), checks if option has changed,
|
|
86
|
+
* changes option if required (implies serial use of saveAsPov)
|
|
87
|
+
*
|
|
88
|
+
* @param mesh
|
|
89
|
+
* @param saveNormals boolean
|
|
90
|
+
*/
|
|
91
|
+
public void saveAsPOV(toxi.geom.mesh.TriangleMesh mesh, boolean saveNormals) {
|
|
92
|
+
AABB boundingBox = mesh.getBoundingBox();
|
|
93
|
+
Vec3D min = boundingBox.getMin();
|
|
94
|
+
Vec3D max = boundingBox.getMax();
|
|
95
|
+
pov.boundingBox(min, max);
|
|
96
|
+
if (opt != pov.getTexture()) {
|
|
97
|
+
pov.setTexture(opt);
|
|
98
|
+
}
|
|
99
|
+
pov.beginMesh2(mesh.name);
|
|
100
|
+
int vOffset = pov.getCurrVertexOffset();
|
|
101
|
+
// vertices
|
|
102
|
+
pov.total(mesh.vertices.size());
|
|
103
|
+
mesh.vertices.values().stream().forEach((v) -> {
|
|
104
|
+
pov.vertex(v);
|
|
105
|
+
});
|
|
106
|
+
pov.endSection();
|
|
107
|
+
// faces
|
|
108
|
+
if (saveNormals) {
|
|
109
|
+
// normals
|
|
110
|
+
pov.beginNormals(mesh.vertices.size());
|
|
111
|
+
mesh.vertices.values().stream().forEach((v) -> {
|
|
112
|
+
pov.normal(v.normal.getNormalized());
|
|
113
|
+
});
|
|
114
|
+
pov.endSection();
|
|
115
|
+
}
|
|
116
|
+
pov.beginIndices(mesh.faces.size());
|
|
117
|
+
mesh.faces.stream().forEach((f) -> {
|
|
118
|
+
pov.face(f.b.id + vOffset, f.a.id + vOffset, f.c.id + vOffset);
|
|
119
|
+
});
|
|
120
|
+
pov.endSection();
|
|
121
|
+
pov.endSave();
|
|
122
|
+
}
|
|
123
|
+
|
|
124
|
+
/**
|
|
125
|
+
* Saves the mesh as PovRAY mesh2 format to the given {@link PrintWriter}.
|
|
126
|
+
* Without normals (when saveNormal is false) Check on option is included
|
|
127
|
+
* for completeness
|
|
128
|
+
*
|
|
129
|
+
* @param meshArray
|
|
130
|
+
* @param saveNormals boolean
|
|
131
|
+
*/
|
|
132
|
+
public void saveAsMesh(toxi.geom.mesh.TriangleMesh[] meshArray, boolean saveNormals) {
|
|
133
|
+
AABB boundingBox;
|
|
134
|
+
Vec3D min;
|
|
135
|
+
Vec3D max;
|
|
136
|
+
|
|
137
|
+
if (opt != pov.getTexture()) {
|
|
138
|
+
pov.setTexture(opt);
|
|
139
|
+
}
|
|
140
|
+
for (toxi.geom.mesh.TriangleMesh mesh : meshArray) {
|
|
141
|
+
pov.beginMesh2(mesh.name);
|
|
142
|
+
boundingBox = mesh.getBoundingBox();
|
|
143
|
+
min = boundingBox.getMin();
|
|
144
|
+
max = boundingBox.getMax();
|
|
145
|
+
pov.boundingBox(min, max);
|
|
146
|
+
int vOffset = pov.getCurrVertexOffset();
|
|
147
|
+
// vertices
|
|
148
|
+
pov.total(mesh.vertices.size());
|
|
149
|
+
mesh.vertices.values().stream().forEach((v) -> {
|
|
150
|
+
pov.vertex(v);
|
|
151
|
+
});
|
|
152
|
+
pov.endSection();
|
|
153
|
+
// faces
|
|
154
|
+
if (saveNormals) {
|
|
155
|
+
// normals
|
|
156
|
+
pov.beginNormals(mesh.vertices.size());
|
|
157
|
+
mesh.vertices.values().stream().forEach((v) -> {
|
|
158
|
+
pov.normal(v.normal.getNormalized());
|
|
159
|
+
});
|
|
160
|
+
pov.endSection();
|
|
161
|
+
}
|
|
162
|
+
pov.beginIndices(mesh.faces.size());
|
|
163
|
+
mesh.faces.stream().forEach((f) -> {
|
|
164
|
+
pov.face(f.b.id + vOffset, f.a.id + vOffset, f.c.id + vOffset);
|
|
165
|
+
});
|
|
166
|
+
pov.endSection();
|
|
167
|
+
pov.endSave();
|
|
168
|
+
}
|
|
169
|
+
}
|
|
170
|
+
|
|
171
|
+
/**
|
|
172
|
+
* Start writing *.inc file
|
|
173
|
+
*
|
|
174
|
+
* @param fileName main.inc File
|
|
175
|
+
*/
|
|
176
|
+
public void beginSave(File fileName) {
|
|
177
|
+
opt = Textures.RAW;
|
|
178
|
+
this.pov = new POVWriter(fileName);
|
|
179
|
+
pov.beginForeground();
|
|
180
|
+
}
|
|
181
|
+
|
|
182
|
+
/**
|
|
183
|
+
* Finish writing *.inc file and close PrintWriter
|
|
184
|
+
*/
|
|
185
|
+
public void endSave() {
|
|
186
|
+
pov.endForeground();
|
|
187
|
+
}
|
|
188
|
+
|
|
189
|
+
// /**
|
|
190
|
+
// *
|
|
191
|
+
// * @param e
|
|
192
|
+
// */
|
|
193
|
+
// public void keyEvent(KeyEvent e) {
|
|
194
|
+
// if (e.getAction() == KeyEvent.RELEASED) {
|
|
195
|
+
// switch (e.getKey()) {
|
|
196
|
+
// case 't':
|
|
197
|
+
// case 'T':
|
|
198
|
+
// status = Tracing.EXPORTING;
|
|
199
|
+
// System.out.println("tracing");
|
|
200
|
+
// break;
|
|
201
|
+
// }
|
|
202
|
+
// }
|
|
203
|
+
// }
|
|
204
|
+
/**
|
|
205
|
+
* Required by processing
|
|
206
|
+
*/
|
|
207
|
+
public void dispose() {
|
|
208
|
+
endSave();
|
|
209
|
+
}
|
|
210
|
+
|
|
211
|
+
/**
|
|
212
|
+
* Required by processing
|
|
213
|
+
*
|
|
214
|
+
* @return version String
|
|
215
|
+
*/
|
|
216
|
+
public String version() {
|
|
217
|
+
return VERSION;
|
|
218
|
+
}
|
|
219
|
+
}
|
|
@@ -0,0 +1,460 @@
|
|
|
1
|
+
/*
|
|
2
|
+
* This library adds PovRAY export facility to toxiclibscore
|
|
3
|
+
* Copyright (c) 2015 Martin Prout
|
|
4
|
+
*
|
|
5
|
+
* This library is free software; you can redistribute it and/or modify it under
|
|
6
|
+
* the terms of the GNU Lesser General Public License as published by the Free
|
|
7
|
+
* Software Foundation; either version 2.1 of the License, or (at your option)
|
|
8
|
+
* any later version.
|
|
9
|
+
*
|
|
10
|
+
* http://creativecommons.org/licenses/LGPL/2.1/
|
|
11
|
+
*
|
|
12
|
+
* This library is distributed in the hope that it will be useful, but WITHOUT
|
|
13
|
+
* ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or FITNESS
|
|
14
|
+
* FOR A PARTICULAR PURPOSE. See the GNU Lesser General Public License for more
|
|
15
|
+
* details.
|
|
16
|
+
*
|
|
17
|
+
* You should have received a copy of the GNU Lesser General Public License
|
|
18
|
+
* along with this library; if not, write to the Free Software Foundation, Inc.,
|
|
19
|
+
* 51 Franklin St, Fifth Floor, Boston, MA 02110-1301, USA
|
|
20
|
+
*/
|
|
21
|
+
package toxi.processing;
|
|
22
|
+
|
|
23
|
+
import java.io.*;
|
|
24
|
+
import java.util.EnumSet;
|
|
25
|
+
import java.util.logging.Level;
|
|
26
|
+
import java.util.logging.Logger;
|
|
27
|
+
import toxi.geom.Vec3D;
|
|
28
|
+
|
|
29
|
+
/**
|
|
30
|
+
* Fairly bare bones PovRAY 3D format exporter. Purely handles the writing of
|
|
31
|
+
* data to the .inc file, as a mesh2 object. Logic heavily borrowed from toxis
|
|
32
|
+
* STL/obj writer, but adjusted for PovRAY and external use/
|
|
33
|
+
*
|
|
34
|
+
* @see POVMesh#saveAsPOV(TriangleMesh)
|
|
35
|
+
*/
|
|
36
|
+
public class POVWriter implements POVInterface {
|
|
37
|
+
|
|
38
|
+
final String COMMA = ", ";
|
|
39
|
+
final String eol = System.getProperty("line.separator");
|
|
40
|
+
private float adjust = 0.0f; //we must only hava one adjustment
|
|
41
|
+
private boolean adjustIsSet = false;
|
|
42
|
+
/**
|
|
43
|
+
*
|
|
44
|
+
*/
|
|
45
|
+
public final String VERSION = "0.60";
|
|
46
|
+
/**
|
|
47
|
+
*
|
|
48
|
+
*/
|
|
49
|
+
protected PrintWriter povWriter;
|
|
50
|
+
/**
|
|
51
|
+
* Track the number of vertices written to file
|
|
52
|
+
*/
|
|
53
|
+
protected int numVerticesWritten = 0;
|
|
54
|
+
/**
|
|
55
|
+
* Track the number of normals written to file
|
|
56
|
+
*/
|
|
57
|
+
protected int numNormalsWritten = 0;
|
|
58
|
+
private volatile Textures opt;
|
|
59
|
+
private final EnumSet<Textures> declaredOpt;
|
|
60
|
+
private String spath;
|
|
61
|
+
|
|
62
|
+
/**
|
|
63
|
+
* Handles File input
|
|
64
|
+
*
|
|
65
|
+
* @param meshObj
|
|
66
|
+
*/
|
|
67
|
+
// public POVWriter(PrintWriter pw) {
|
|
68
|
+
// this.opt = Textures.RAW;
|
|
69
|
+
// povWriter = pw;
|
|
70
|
+
// declaredOpt = EnumSet.of(Textures.RAW);
|
|
71
|
+
// handleBeginSave();
|
|
72
|
+
// }
|
|
73
|
+
public POVWriter(File meshObj) {
|
|
74
|
+
this.opt = Textures.RAW;
|
|
75
|
+
String path = meshObj.getAbsolutePath();
|
|
76
|
+
spath = path.replaceFirst(meshObj.getName(), "");
|
|
77
|
+
try {
|
|
78
|
+
this.povWriter = new PrintWriter(new BufferedWriter(new OutputStreamWriter(new FileOutputStream(meshObj), "UTF8")));
|
|
79
|
+
} catch (IOException ex) {
|
|
80
|
+
Logger.getLogger(POVWriter.class.getName()).log(Level.SEVERE, null, ex);
|
|
81
|
+
}
|
|
82
|
+
declaredOpt = EnumSet.of(Textures.RAW);
|
|
83
|
+
handleBeginSave();
|
|
84
|
+
}
|
|
85
|
+
|
|
86
|
+
/**
|
|
87
|
+
* Handles PrintWriter input
|
|
88
|
+
*
|
|
89
|
+
* @param pw
|
|
90
|
+
* @param opt
|
|
91
|
+
*/
|
|
92
|
+
// public POVWriter(PrintWriter pw, Textures opt) {
|
|
93
|
+
// this.opt = opt;
|
|
94
|
+
// povWriter = pw;
|
|
95
|
+
// declaredOpt = EnumSet.of(opt);
|
|
96
|
+
// handleBeginSave();
|
|
97
|
+
// }
|
|
98
|
+
/**
|
|
99
|
+
* close the mesh declaration
|
|
100
|
+
*/
|
|
101
|
+
@Override
|
|
102
|
+
public void endSave() {
|
|
103
|
+
declaredOpt.add(opt);
|
|
104
|
+
switch (opt) {
|
|
105
|
+
case GLASS:
|
|
106
|
+
povWriter.println(TextureBuilder.getRCTrans(9));
|
|
107
|
+
povWriter.println(TextureBuilder.FINISH5);
|
|
108
|
+
break;
|
|
109
|
+
case METAL:
|
|
110
|
+
povWriter.println(TextureBuilder.getRCOpaque(9));
|
|
111
|
+
povWriter.println(TextureBuilder.MFINISHE);
|
|
112
|
+
break;
|
|
113
|
+
case PHONG:
|
|
114
|
+
povWriter.println(TextureBuilder.getRCOpaque(9));
|
|
115
|
+
povWriter.println(TextureBuilder.PHONG);
|
|
116
|
+
break;
|
|
117
|
+
case RED:
|
|
118
|
+
povWriter.println(TextureBuilder.getRed());
|
|
119
|
+
povWriter.println(TextureBuilder.PHONG);
|
|
120
|
+
break;
|
|
121
|
+
case WHITE:
|
|
122
|
+
povWriter.println(TextureBuilder.getWhite());
|
|
123
|
+
povWriter.println(TextureBuilder.PHONG);
|
|
124
|
+
break;
|
|
125
|
+
case RANDOM:
|
|
126
|
+
povWriter.println(TextureBuilder.getRandRCTrans());
|
|
127
|
+
povWriter.println(TextureBuilder.FINISH5);
|
|
128
|
+
break;
|
|
129
|
+
case TWOTONE:
|
|
130
|
+
povWriter.println(TextureBuilder.getTwoTone());
|
|
131
|
+
povWriter.println(TextureBuilder.PHONG);
|
|
132
|
+
break;
|
|
133
|
+
case MIRROR:
|
|
134
|
+
povWriter.println(TextureBuilder.getBlack());
|
|
135
|
+
povWriter.println(TextureBuilder.MIRROR);
|
|
136
|
+
break;
|
|
137
|
+
case MARBLE:
|
|
138
|
+
povWriter.println(TextureBuilder.getMarble());
|
|
139
|
+
break;
|
|
140
|
+
case CHROME:
|
|
141
|
+
povWriter.println(TextureBuilder.getChrome());
|
|
142
|
+
break;
|
|
143
|
+
default:
|
|
144
|
+
break;
|
|
145
|
+
}
|
|
146
|
+
povWriter.println("}"); // end of mesh2
|
|
147
|
+
}
|
|
148
|
+
|
|
149
|
+
/**
|
|
150
|
+
* A side effect of this method is to set the value of the y adjust. This
|
|
151
|
+
* value is used to set the lowest value of y to be 0, and hence expect all
|
|
152
|
+
* other y values to be positive (to cope with the totally crap convention
|
|
153
|
+
* in processing where up is negative). Works best for a single mesh object
|
|
154
|
+
* in the sketch, or when lowest object in sketch is given first.
|
|
155
|
+
* @param min
|
|
156
|
+
* @param max
|
|
157
|
+
*/
|
|
158
|
+
public void boundingBox(Vec3D min, Vec3D max) {
|
|
159
|
+
float lowest = (min.y * -1 < max.y * -1)? min.y : max.y;
|
|
160
|
+
if (!adjustIsSet) { // adjust must only be set once for a sketch
|
|
161
|
+
adjust = (Math.abs(0 - lowest) > 0.0001f)? lowest : adjust;
|
|
162
|
+
adjustIsSet = true;
|
|
163
|
+
}
|
|
164
|
+
StringBuilder pov = new StringBuilder(100);
|
|
165
|
+
pov.append("// bounding_box").append(buildVector(min));
|
|
166
|
+
pov.append(buildVector(max)).append(eol);
|
|
167
|
+
povWriter.print(pov.append(eol));
|
|
168
|
+
}
|
|
169
|
+
|
|
170
|
+
/**
|
|
171
|
+
* Write face indices as as vector
|
|
172
|
+
*
|
|
173
|
+
* @param a
|
|
174
|
+
* @param b
|
|
175
|
+
* @param c
|
|
176
|
+
*/
|
|
177
|
+
@Override
|
|
178
|
+
public void face(int a, int b, int c) {
|
|
179
|
+
povWriter.println(buildVector(a, b, c));
|
|
180
|
+
}
|
|
181
|
+
|
|
182
|
+
/**
|
|
183
|
+
* Track the number of normals written to file
|
|
184
|
+
*
|
|
185
|
+
* @return current normal offset
|
|
186
|
+
*/
|
|
187
|
+
@Override
|
|
188
|
+
public int getCurrNormalOffset() {
|
|
189
|
+
return numNormalsWritten;
|
|
190
|
+
}
|
|
191
|
+
|
|
192
|
+
/**
|
|
193
|
+
* Track the number of vertices written to file
|
|
194
|
+
*
|
|
195
|
+
* @return vertex offset
|
|
196
|
+
*/
|
|
197
|
+
@Override
|
|
198
|
+
public int getCurrVertexOffset() {
|
|
199
|
+
return numVerticesWritten;
|
|
200
|
+
}
|
|
201
|
+
|
|
202
|
+
/**
|
|
203
|
+
* Helper function for writing declared textures to an *.inc file
|
|
204
|
+
*
|
|
205
|
+
* @param pw PrintWriter
|
|
206
|
+
* @param opt expected to be an EnumSet rather than an enum
|
|
207
|
+
*/
|
|
208
|
+
protected final void declareTexture(PrintWriter pw, Textures opt) {
|
|
209
|
+
switch (opt) {
|
|
210
|
+
case GLASS:
|
|
211
|
+
case RANDOM:
|
|
212
|
+
pw.println(TextureBuilder.declareRCTrans());
|
|
213
|
+
pw.println(TextureBuilder.DFINISH5);
|
|
214
|
+
break;
|
|
215
|
+
case METAL:
|
|
216
|
+
pw.println(TextureBuilder.declareRCOpaque());
|
|
217
|
+
pw.println(TextureBuilder.DMFINISHE);
|
|
218
|
+
break;
|
|
219
|
+
case PHONG:
|
|
220
|
+
pw.println(TextureBuilder.declareRCOpaque());
|
|
221
|
+
pw.println(TextureBuilder.DPHONG);
|
|
222
|
+
break;
|
|
223
|
+
case MARBLE:
|
|
224
|
+
pw.println(TextureBuilder.declareMarble());
|
|
225
|
+
break;
|
|
226
|
+
case CHROME:
|
|
227
|
+
pw.println(TextureBuilder.DMFINISHE);
|
|
228
|
+
break;
|
|
229
|
+
case RED:
|
|
230
|
+
case TWOTONE:
|
|
231
|
+
case WHITE:
|
|
232
|
+
pw.println(TextureBuilder.DPHONG);
|
|
233
|
+
break;
|
|
234
|
+
default:
|
|
235
|
+
break;
|
|
236
|
+
}
|
|
237
|
+
|
|
238
|
+
}
|
|
239
|
+
|
|
240
|
+
/**
|
|
241
|
+
* Print a header, and initialise counts
|
|
242
|
+
*/
|
|
243
|
+
protected final void handleBeginSave() {
|
|
244
|
+
povWriter.println("// generated by POVExport v" + VERSION);
|
|
245
|
+
// declareTexture();
|
|
246
|
+
}
|
|
247
|
+
|
|
248
|
+
/**
|
|
249
|
+
* Begin the mesh2 output as a PovRAY declaration
|
|
250
|
+
*
|
|
251
|
+
* @param name
|
|
252
|
+
*/
|
|
253
|
+
@Override
|
|
254
|
+
public void beginMesh2(String name) {
|
|
255
|
+
numVerticesWritten = 0;
|
|
256
|
+
numNormalsWritten = 0;
|
|
257
|
+
StringBuilder pov = new StringBuilder(30);
|
|
258
|
+
pov.append("mesh2{");
|
|
259
|
+
pov.append(eol);
|
|
260
|
+
pov.append(String.format("/** %s */%s", name, eol));
|
|
261
|
+
pov.append("\tvertex_vectors {");
|
|
262
|
+
povWriter.println(pov);
|
|
263
|
+
}
|
|
264
|
+
|
|
265
|
+
/**
|
|
266
|
+
*
|
|
267
|
+
* @param v
|
|
268
|
+
*/
|
|
269
|
+
public void beginBox(Vec3D v) {
|
|
270
|
+
StringBuilder pov = new StringBuilder("box{");
|
|
271
|
+
pov.append('<').append(v.x);
|
|
272
|
+
pov.append(COMMA).append(v.y);
|
|
273
|
+
pov.append(COMMA).append(v.z);
|
|
274
|
+
pov.append('>').append(COMMA);
|
|
275
|
+
povWriter.print(pov);
|
|
276
|
+
}
|
|
277
|
+
|
|
278
|
+
/**
|
|
279
|
+
*
|
|
280
|
+
* @param v
|
|
281
|
+
*/
|
|
282
|
+
public void endBox(Vec3D v) {
|
|
283
|
+
StringBuilder pov = new StringBuilder();
|
|
284
|
+
pov.append('<').append(v.x);
|
|
285
|
+
pov.append(COMMA).append(v.y);
|
|
286
|
+
pov.append(COMMA).append(v.z);
|
|
287
|
+
pov.append('>').append("}");
|
|
288
|
+
povWriter.println(pov);
|
|
289
|
+
}
|
|
290
|
+
|
|
291
|
+
/**
|
|
292
|
+
* End the current section ie vertex_vector, normal_vector or face_indices
|
|
293
|
+
*/
|
|
294
|
+
@Override
|
|
295
|
+
public void endSection() {
|
|
296
|
+
povWriter.println("\t}");
|
|
297
|
+
}
|
|
298
|
+
|
|
299
|
+
/**
|
|
300
|
+
* Output start of normal_vectors
|
|
301
|
+
*
|
|
302
|
+
* @param count
|
|
303
|
+
*/
|
|
304
|
+
@Override
|
|
305
|
+
public void beginNormals(int count) {
|
|
306
|
+
povWriter.println("\tnormal_vectors{");
|
|
307
|
+
total(count);
|
|
308
|
+
}
|
|
309
|
+
|
|
310
|
+
/**
|
|
311
|
+
* Output start of face_indices
|
|
312
|
+
*
|
|
313
|
+
* @param count
|
|
314
|
+
*/
|
|
315
|
+
@Override
|
|
316
|
+
public void beginIndices(int count) {
|
|
317
|
+
povWriter.println("\tface_indices{");
|
|
318
|
+
total(count);
|
|
319
|
+
}
|
|
320
|
+
|
|
321
|
+
/**
|
|
322
|
+
* Used to output total count vertex_vector, normal_vector & face_indices
|
|
323
|
+
*
|
|
324
|
+
* @param count
|
|
325
|
+
*/
|
|
326
|
+
@Override
|
|
327
|
+
public void total(int count) {
|
|
328
|
+
povWriter.println(String.format("\t%d,", count));
|
|
329
|
+
}
|
|
330
|
+
|
|
331
|
+
/**
|
|
332
|
+
* Write normal as PovRAY vector
|
|
333
|
+
*
|
|
334
|
+
* @param n
|
|
335
|
+
*/
|
|
336
|
+
@Override
|
|
337
|
+
public void normal(Vec3D n) {
|
|
338
|
+
povWriter.println(buildVector(n));
|
|
339
|
+
numNormalsWritten++;
|
|
340
|
+
}
|
|
341
|
+
|
|
342
|
+
/**
|
|
343
|
+
* Write vertex as PovRAY vector
|
|
344
|
+
*
|
|
345
|
+
* @param v
|
|
346
|
+
*/
|
|
347
|
+
@Override
|
|
348
|
+
public void vertex(Vec3D v) {
|
|
349
|
+
povWriter.println(buildVector(v));
|
|
350
|
+
numVerticesWritten++;
|
|
351
|
+
}
|
|
352
|
+
|
|
353
|
+
/**
|
|
354
|
+
* This version was strictly for scale, translate and rotate
|
|
355
|
+
*
|
|
356
|
+
* @param a
|
|
357
|
+
* @param b
|
|
358
|
+
* @param c
|
|
359
|
+
* @return povray vector (floats)
|
|
360
|
+
*/
|
|
361
|
+
// private StringBuilder buildVector(float a, float b, float c) {
|
|
362
|
+
// StringBuilder my_vector = new StringBuilder(120);
|
|
363
|
+
// my_vector.append('<');
|
|
364
|
+
// my_vector.append(a).append(COMMA);
|
|
365
|
+
// my_vector.append(b).append(COMMA);
|
|
366
|
+
// return my_vector.append(c).append('>');
|
|
367
|
+
// }
|
|
368
|
+
|
|
369
|
+
/**
|
|
370
|
+
* This version is strictly for face indices (possibly normals/uv)
|
|
371
|
+
*
|
|
372
|
+
* @param a
|
|
373
|
+
* @param b
|
|
374
|
+
* @param c
|
|
375
|
+
* @return povray vector (integers)
|
|
376
|
+
*/
|
|
377
|
+
private StringBuilder buildVector(int a, int b, int c) {
|
|
378
|
+
StringBuilder my_vector = new StringBuilder(120);
|
|
379
|
+
my_vector.append('\t').append('<');
|
|
380
|
+
my_vector.append(a).append(COMMA);
|
|
381
|
+
my_vector.append(b).append(COMMA);
|
|
382
|
+
my_vector.append(c).append('>');
|
|
383
|
+
return my_vector.append(COMMA);
|
|
384
|
+
}
|
|
385
|
+
|
|
386
|
+
/**
|
|
387
|
+
* The Y and Z coordinates are multiplied by -1 to handle the conversion of
|
|
388
|
+
* processing coordinate system to PovRAY coordinate system. Further the y
|
|
389
|
+
* coordinate is adjusted to give non-negative values (but only if the object
|
|
390
|
+
* with lowest value is processed first)
|
|
391
|
+
* @param v
|
|
392
|
+
* @return povray vector
|
|
393
|
+
*/
|
|
394
|
+
private StringBuilder buildVector(Vec3D v) {
|
|
395
|
+
StringBuilder my_vector = new StringBuilder(120);
|
|
396
|
+
my_vector.append('\t').append('<');
|
|
397
|
+
my_vector.append(v.x).append(COMMA);
|
|
398
|
+
my_vector.append(v.y * -1 + adjust).append(COMMA);
|
|
399
|
+
my_vector.append(v.z * -1).append('>');
|
|
400
|
+
return my_vector.append(COMMA);
|
|
401
|
+
}
|
|
402
|
+
|
|
403
|
+
/**
|
|
404
|
+
* Begin writing union of mesh objects
|
|
405
|
+
*/
|
|
406
|
+
protected void beginForeground() {
|
|
407
|
+
povWriter.append("#declare mesh_objects = union {");
|
|
408
|
+
povWriter.append(eol);
|
|
409
|
+
}
|
|
410
|
+
|
|
411
|
+
/**
|
|
412
|
+
* Finish writing union of mesh objects Write declared texture to
|
|
413
|
+
* "my_texture.inc" file
|
|
414
|
+
*/
|
|
415
|
+
protected void endForeground() {
|
|
416
|
+
povWriter.append("}");
|
|
417
|
+
povWriter.append(eol);
|
|
418
|
+
|
|
419
|
+
String outFile = spath + "my_texture.inc";
|
|
420
|
+
// if (declaredOpt.size() > 1) { // guard against only RAW
|
|
421
|
+
try {
|
|
422
|
+
PrintWriter pw;
|
|
423
|
+
pw = new PrintWriter(new File(outFile), "UTF8");
|
|
424
|
+
try {
|
|
425
|
+
pw.append(String.format("// %s%s", outFile, eol));
|
|
426
|
+
declaredOpt.stream().forEach((dopt) -> {
|
|
427
|
+
declareTexture(pw, dopt);
|
|
428
|
+
});
|
|
429
|
+
} finally {
|
|
430
|
+
pw.flush();
|
|
431
|
+
pw.close();
|
|
432
|
+
povWriter.flush();
|
|
433
|
+
povWriter.close();
|
|
434
|
+
}
|
|
435
|
+
} catch (IOException ex) {
|
|
436
|
+
Logger.getLogger(POVWriter.class.getName()).log(Level.SEVERE, null, ex);
|
|
437
|
+
}
|
|
438
|
+
|
|
439
|
+
}
|
|
440
|
+
|
|
441
|
+
/**
|
|
442
|
+
* Required to keep in sync with current option
|
|
443
|
+
*
|
|
444
|
+
* @param opt Textures
|
|
445
|
+
*/
|
|
446
|
+
@Override
|
|
447
|
+
public void setTexture(Textures opt) {
|
|
448
|
+
this.opt = opt;
|
|
449
|
+
}
|
|
450
|
+
|
|
451
|
+
/**
|
|
452
|
+
* Required to keep in sync with current option
|
|
453
|
+
*
|
|
454
|
+
* @return option Textures
|
|
455
|
+
*/
|
|
456
|
+
@Override
|
|
457
|
+
public Textures getTexture() {
|
|
458
|
+
return this.opt;
|
|
459
|
+
}
|
|
460
|
+
}
|