Haskell-Things / implicitpipe

OpenGL 3D viewer for ImplicitCAD
MIT License
20 stars 2 forks source link
gpipe implicitcad

implicitpipe

IRC

OpenGL 3D viewer for ImplicitCAD.

Allows quick preview of ImplicitCAD SymbolicObj3 objects by transforming NormedTriangleMesh into format accepted by GPipe.

Based on GPipe-Test

Build

With Nix

or enter development shell using nix-shell where you can use

cabal run implicitview

or cabal repl.

With Stack

Executables

implicitview

Like ghcid for ImplicitCAD. Features autoreload functionality that can reload both Haskell modules via hint or ExtOpenSCAD files using ImplicitCADs SCAD engine.

Try it on provided examples:

implicitview examples-haskell/SomeModule.hs

or ExtOpenSCAD variant:

implicitview examples-escad/obj.escad

While the application is running you can open the source file in your editor and it will automatically reload the preview on saves.

Haskell loader expects obj :: SymbolicObj3 variable and optionally allows changing resolution by also defining res variable (tried types for res are Double, Int and Integer).

ExtOpenSCAD loader works with standard $res variable. It renders both 2D and 3D objects by unioning and extruding 2D ones by 1mm. To achieve the same with Haskell loader, extrude your 2D objects using extrudeR 0 (unionR 0 objs2) 1.

implicitview supports viewer configuration via command line, for full list of options see:

implicitview --help

An example of some parameters:

implicitview --rotate  --rotate-init 1 --rotate-step 0.01 --zoom 0.5 example-escad/obj.escad

implicitanim

Demo of animation functionality.

Controls

Left mouse button controls camera rotation, scroll wheel zooming, holding space increases animation speed.

REPL Usage

Via cabal repl:

import Graphics.Implicit
import Graphics.Implicit.Viewer

view $ sphere 10

animate $ \t -> unionR 1 [ sphere 5, cylinder2 1 3 (4 + 5 * t) ]

Animations

Support for animating objects is available - objects can be parametrized by time variable in [0..1] interval and viewed using animate function.

animSample :: Double -> SymbolicObj3
animSample t = sphere (2 + t*2)

animate animSample

Animations are experimental and are currently being reworked to use composable Animation wrapper similar to Reanimate.Animation.

Gallery

implicitview

implicitview

implicitanim

implicitanim

example-haskell object with edges shader

edges

example-haskell wireframe shader

wireframe

demoLetterI with smoothed normals

smoothed demo letter