Home My Page Projects IceSL
 Summary Activity Tracker SCM Files Mediawiki

# Scripting - IceSL-Next

(Redirected from Scripting)

This is the official IceSL scripting language documentation wiki. Examples featured here are for the most part self-contained unless they use an external asset (svg or stl files). Their associated illustrations are accurate depictions of their output.

We welcome IceSL users to redirect their questions about the scripting language in the IceSL forum page.

Legend:

## Syntax

The scripting language of IceSL (hereafter refered to as IceSL) is a superset of Lua. Moreover, IceSL has been designed to facilitate conversion from/to OpenSCAD. IceSL also extends Lua's types in order to specify shapes and transforms. The main basic types are:

1. Vector (e.g.  v(1,0,0) )
2. Matrix (e.g.  m(1,0,0,1, 0,1,0,1, 0,0,1,1, 0,0,0,1) )
3. Shapes:
1. Primitives (e.g.  sphere(1) ),
2. Meshes (e.g. load('fox.stl')),
3. Implicits,
4. Voxels.

## Drawing and Scale

Creating a shape in IceSL does not automatically render it in the final scene. In order to do this, you need to emit it.

 emit( shape, brush )  IceSL | IceSL-online

•  shape : the shape to render
•  brush : the brush's index to render the shape with. 0 by default

Brushes are an internalized concept of IceSL, there are a total of 128 indexes starting from 0. Their use is meant to group shapes under a set of parameters (usally printing parameters like infill percentage). In case of overlapping, the group with the lower index takes priority. The next code exemplifies the use of emit:

 b = box(10) emit( b, 0 ) c = sphere(5) emit( translate(0,0,5) * c, 1 )

Finally, a unit in the scripting language corresponds to 1mm in the printing world. IceSL always renders a scene with a virtual printing bed; a grid that represents the 3d printer bed (see image below). Each square of IceSL's printing bed corresponds to 1cm2.

Notice that, in order to have a visual aid on view orientation, axes are drown in the bottom-left corner. The red, green and blue lines correspond to the positive X, Y, and Z axes respectively.

## Vectors, Matrices, Constants and Trigonometric Functions

### Vectors

Construction:
•  v(x,y,z)
• or  v{x,y,z} : creates the vector $\begin{bmatrix} x \\ y \\ z \end{bmatrix}$.
•  v(x,y)
• or  v{x,y} : creates the vector$\begin{bmatrix} x \\ y \\ 0 \end{bmatrix}$.
Members:
•  v.x : x coordinate
•  v.y : y coordinate
•  v.z : z coordinate

Operations:

Let v and u be vectors and n a number.

•  v + u : vector addition.
•  v - u : vector subtraction.
•  v * u : vector component-wise multiplication.
•  v / u : vector component-wise division
•  v * n  or  n * v : vector scalar multiplication.
•  v / n : vector scalar division.
•  -v : syntatic sugar for -1 * v.
•  dot(v, u) : dot product.
•  cross(v, u) : cross product.
•  normalize(v) : returns the unit vector $\hat{v}$.
•  length(v) : return the norm of v (i.e. | | v | | ).

### Matrices

Construction:
 m( m11, m12, m13, m14,
m21, m22, m23, m24,
m31, m32, m33, m34,
m41, m42, m43, m44 )
or
 m{ m11, m12, m13, m14,
m21, m22, m23, m24,
m31, m32, m33, m34,
m41, m42, m43, m44 }

Creates the matrix $\begin{bmatrix} m_{11} & m_{12} & m_{13} & m_{14} \\ m_{21} & m_{22} & m_{23} & m_{24} \\ m_{31} & m_{32} & m_{33} & m_{34}\\ m_{41} & m_{42} & m_{43} & m_{44}\end{bmatrix}$.

Operations: Let M and Q be matrices, let v be a vector and let s be a shape.
•  M * Q : matrix multiplication. Returns a matrix
•  M * v : matrix-vector multiplication. Returns a vector
•  M * s : shape transformation. Returns the shape transformed by M .
•  inverse(M) : matrix inversion. Returns the inverse of matrix M.

### Constants, Trigonometric Functions and Angles

The following are constants in IceSL

•  Pi : the π constant.
•  X : the vector v(1,0,0).
•  Y : the vector v(0,1,0).
•  Z : the vector v(0,0,1).
•  Path : the path of the current script.

IceSl can calculate the next trigonometric functions: sin,asin,cos,acos,tan,atan,atan2.

Angles in IceSL are expected to be written in degrees.

## Shapes

### Primitive Shapes

 load(path)  IceSL

loadmesh(path)  IceSL

Loads the 3d mesh at path. The mesh must be watertight.
•  path : Absolute path to a 3d mesh. It supports the following extensions:
• stl
• obj
• 3ds

 sphere(r, c)  IceSL | IceSL-online

Creates a sphere of radius r centered on c. sphere(r) is syntactic sugar for sphere(r,v(0,0,0)) -a centered sphere.
•  r : the sphere's radius
•  c : the sphere's center

 cube(dx, dy, dz)  IceSL | IceSL-online

Creates a cube with with sides dx, dy, dz with its bottom face centered on the origin. cube(d) and cube(v) are syntactic sugars for  cube(d,d,d) and cube(v.x,v.y,v.z) respectively.
•  dx : length of the face perdendicular to the X-axis
•  dy : length of the face perpendicular to the Y-axis
•  dz : length of the face perpendicular to the Z-axis

 cone(r0, r1, c0, c1)  IceSL | IceSL-online

Creates a cone with base radius r0, top radius r1, base center c0 and top center c1. Moreover,  cone(r0,r1,h) is syntactic sugar for cone(r0,r1,v(0,0,0),v(0,0,h)).
•  r0 : the cone's base radius
•  r1 : the cone's top radius
•  c0 : the cone's base center
•  c1 : the cone's top center

 cylinder(r, c0, c1)  IceSL | IceSL-online

Creates a cylinder with radius r, base center c0 and top center c1. It is syntactic sugar for cone(r,r,c0,c1). Additionally, cylinder(r,h) is also syntactic sugar for cone(r,r,h).

 polyhedron(points,indices)  IceSL | IceSL-online

Creates a polyhedron with points as its vertex and indices to specify its faces.
•  points : an array of vectors containing the polyhedron's vertex
•  indices : an array of vectors specifying the polyhedron's faces. Each vector specifies the three vertex's indices indices (starting with 0) to build a face. Indices specified counterclockwise face outwards.
 p = polyhedron( { v(0,0,0), v(1,0,0), v(0,1,0), v(1,1,0), v(0.5,0.5,1) }, { v(0,3,1), v(0,2,3), v(0,1,4), v(1,3,4), v(3,2,4), v(2,0,4) } ) emit( p )

 Void  IceSL | IceSL-online

Creates an empty primitive

### Centered Primitives

Many primitives can be automatically centered at creation to their center of symmetry with respect to their bounding boxes. The following table lists their centered versions.

Primitive Centered Version Alternative Centered Version
load(path) load_centered(path) load_centered_on_plate(path)
cube(dx,dy,dz) ccube(dx,dy,dz) box(dx,dy,dz)
cone(r0,r1,h) ccone(r0,r1,h)
cylinder(r,h) ccylinder(r,h)

Additionally, the cube and box primitives have the versions  ocube(dx,dy,dz)  and cornerbox(dx,dy,dz) that position their front lower-left corners at the origin.

### Non-primitive Shapes

 linear_extrude(dir, points)  IceSL | IceSL-online

Creates a closed object from the extrusion of a polygon along a direction dir. The polygon's orientations is specified as set of either clockwise or counter-clockwise 2D vertices in points.
•  dir : extruding direction
•  points : polygon specification
 triangle = { v(-10,0), v(0,10), v(10,0) } -- 50 units along the Z-axis dir = v(0,0,50) emit( linear_extrude(dir, triangle) )

 linear_extrude_from_oriented(dir, points)  IceSL | IceSL-online

Creates a closed object from the extrusion of a polygon along a direction dir. Solid geometry is specified as set of closed (i.e. the last vertex matches the first one) counter-clockwise 2D vertices and hollow geometry is specified as a set of closed clockwise 2D vertices in points.
•  dir : extruding direction
•  points : polygon specification
 polygon = { v(10,10), v(-10,10), v(-10,-10), v(10,-10), v(10,10), -- Solid v(0,6), v(6,-6), v(-6,-6), v(0,6) } -- Hollow dir = v(0,0,10) emit( linear_extrude_from_oriented(dir, polygon))

 rotate_extrude(points, nsteps)  IceSL | IceSL-online

Creates a closed object from the spinning of a polygon along the Z-axis (axis of revolution). The polygon is specified as set of counter-clockwise 2D vertices in points. nsteps defines the number of steps in the revolution of the polygon, the more steps the smoother the resulting shape is.
 radius = v(10,0,0) triangle = { radius + v(1,0,0), radius + v(0,1,0), radius + v(-1,0,0) } emit( rotate_extrude( triangle, 100 ) )

 sections_extrude(contours)  IceSL

Crates a closed object by conecting each polygon contained in contours. Similar to the functions above, a polygon is defined as a table of at least three points. contours is a table of more than one polygon and all polygons must contain the same number of points.
 se = sections_extrude({ {rotate( 0,Z) * v( 0, 0, 0), rotate( 0,Z) * v(10, 0, 0), rotate( 0,Z) * v(10,10, 0), rotate( 0,Z) * v( 0,10, 0)},   {rotate( 60,Z) * v( 0, 0,10), rotate( 60,Z) * v(10, 0,10), rotate( 60,Z) * v(10,10,10), rotate( 60,Z) * v( 0,10,10)},   {rotate(120,Z) * v( 0, 0,20), rotate(120,Z) * v(10, 0,20), rotate(120,Z) * v(10,10,20), rotate(120,Z) * v( 0,10,20)} }) emit(se)

### Implicits

IceSL supports implicits by way of the GL Shading Language (GLSL). A comprehensive list of the built-in functions of GLSL can be found here

implicit_distance_field(boxMin, boxMax, fragment) IceSL

implicit_solid(boxMin, boxMax, voxSize, fragment) IceSL

Creates an object out of the implicit geometry calculated in fragment. The bounding box constructed by boxMin and boxMax defines the boundaries of the implicit shape.
•  boxMin, boxMax : domain of the implicit. The domain is specified by the box constructed with corners boxMin and boxMax
•  voxSize : voxel output size. Lower values result in greater quality at the expense of higher calculation costs.
• fragment : string containing the GLSL progam. This program calculates the implicit function that defines the output geometry.

Implicits are calculated in IceSL with a sphere tracing method (detailed here). The program specified in fragment must contain a function called either float distance(vec3 p), in the case of implicit_distance_field, or float solid(vec3 p) in the case of implicit_solid. This function calculates the distance field or the solid/empty classification respectively for every point of the domain of the box. A resulting negative value is interpreted as solid whereas a positive value means hollow. Consider the following example.

 cube = implicit_distance_field( v(-10,-10,-10), v(10,10,10), [[ float distance(vec3 p) { return -1; } ]]) emit (cube)

Above, every point in the domain of the implicit is marked as solid, therefore the geometry created has the shape of the boundary box.

Choosing implicit_distance_field over implicit_solid can be summarized as follows: The former requires to estimate a distance to the surface, which can prove difficult and prone to artifacts (when the estimate is too far off from reality). The latter is much easier, as the function simply has to return negative for solid and positive for empty.

IceSL by default progressively renders implicits, consequently all the implicit's geometry may not render in one single frame. The order of rendering is defined by the distance to the camera (i.e. scene's point of view). To disable/enable this behavior use the following:

enable_progressive_rendering(implicit, bool) IceSL

• implicit: output from either implicit_distance_field or implicit_solid
• bool: either true or false

#### Uniform variables and file support

It is possible to set values for uniform variables specified inside the implicit's GLSL program via lua commands.

set_uniform_{boolean|scalar|vector|matrix|texture3d}(implicit, var_name, var_value) IceSL

sets var_name to var_value inside implicit.
• implicit : a created implicit
• var_name : string specifying the name of the uniform variable in the implicit
• var_value : new boolean/scalar/vector/matrix/texture3d/voxel_distance_field value

Furthermore, implicits can be loaded directly from files as the next function shows.

implicit_distance_field_from_file(boxMin, boxMax, fileName) IceSL

implicit_solid_from_file(boxMin, boxMax, voxSize, fileName) IceSL

Similar to implicit_distance_field and implicit_solid but the fragment program is in fileName.
•  boxMin, boxMax : domain of the implicit. The domain is specified by the box constructed with corners boxMin and boxMax
• fileName: file containing the GLSL implicit program.
• voxSize: voxel output size.

In the next example, we create an implicit whose points inside an origin-centered sphere are considered solid. The radius of the sphere is changed using set_uniform_scalar.

 sphere = implicit_solid(v(-10,-10,-10), v(10,10,10), 0.25, [[ uniform float r = 5; float solid(vec3 p) { return length(p) - r; } ]]) set_uniform_scalar(sphere, 'r', 10.5) emit(sphere)

Notice how in the above example, the implicit boundary cuts off some parts of the sphere. Implicits are commonly used to construct geometry that is impossible to create with CSG or low-resolution meshes. See the following example.

 spahe = implicit_distance_field(v(-2,-2,0), v(2,2,8), [[ float distance(vec3 p) { return 0.01 * ((pow(sqrt(p.x*p.x + p.y*p.y) - 3, 3) + p.z*p.z - 1) + noise(p)); } ]]) emit(scale(5) * shape)

#### 3D Textures

IceSL features the ability to construct 3D textures programatically. There is support for single channel textures as well as RGB textures in 8bit and 32bit variants.

tex3d_{rgb32f|r32f|rgb8f|r8f}(w,h,d)

Creates a 3d texture class with the following possible specifications:
• rgb32f: rgb 32bit float texture
• r32f: luminance 32bit float texture
• rgb8f: rgb 8bit float texture
• r8f: luminance 8bit float texture

The 3D texture class possesses the following methods:

• w(): return the texture's width
• h(): return the texture's height
• d(): return the texture's depth
• set(u,v,w,val): sets the value val at texture coordinate (u,v,w)

The following example shows a 1-channel 3D texture created programatically and used as input in an implicit. Two solid cubes (one on each corner) made of the value -1.0 are drawn into the texture while the rest is left at value 10.0. The implicit maps each point of the implicit area to a point of the texture repated twice.

 tex_dim = v(10,10,10) tex = tex3d_r32f(tex_dim.x,tex_dim.y,tex_dim.z) for ucoord = 0, tex_dim.x-1 do for vcoord = 0, tex_dim.y-1 do for wcoord = 0, tex_dim.z-1 do if (ucoord < tex_dim.x/2 and vcoord < tex_dim.y/2 and wcoord < tex_dim.z/2) or (ucoord >= tex_dim.x/2 and vcoord >= tex_dim.y/2 and wcoord >= tex_dim.z/2) then tex:set(ucoord,vcoord,wcoord,v(-1.0,0.0,0.0)) else tex:set(ucoord,vcoord,wcoord,v(10.0,0.0,0.0)) end end end end   imp_dim = v(20,20,20) imp = implicit(v(0,0,0), imp_dim, [[ uniform sampler3D tex_data; uniform vec3 imp_ext; float distance(vec3 p) { return 0.01 * texture(tex_data,(p/imp_ext)*2.0).x; } ]]) set_uniform_vector(imp, 'imp_ext', imp_dim) set_uniform_texture3d(imp, 'tex_data', tex)   emit(imp)

## Transformations

This section deals with linear transformations. IceSL offers functions to calculate matrices of transformations. To apply a transformation, a transformation matrix is multiplied with a shape. In order to combine more than one transformation, the result of successive multiplications of transformation matrices may also be multiplied with a shape. All applications of transformations should be consistent with a right-handed coordinate system. This means the rightmost transformation in a combination takes precedence.

translate(dx,dy,dz)  IceSL | IceSL-online

Returns a transformation matrix that translates a shape by dx,dy,dz units in the X-axis, Y-axis and Z-axis respectively.
• dx : number of units to translate in the X-axis
• dy : number of units to translate in the X-axis
• dy : number of units to translate in the X-axis

translate(v) IceSL | IceSL-online

Syntactic sugar for translate(v.x,v.y,v.z).

rotate(angle,axis) IceSL | IceSL-online

Returns a transformation matrix that rotates a shape by angle degrees around the vector axis.
• angle : angle of roation. In degrees
• axis : a vector specifying the axis of rotation

rotate(rx,ry,rz) IceSL | IceSL-online

rotate(v) IceSL | IceSL-online

Syntactic sugar for rotate(rz,Z) * rotate(ry,Y) * rotate(rx,X)  and rotate(v.z,Z) * rotate(v.y,Y) * rotate(v.x,X)  respectively.

 scale(sx, sy, sz)  IceSL | IceSL-online

Returns a transformation matrix that scales a shape by sx,sy,sz factors in the X-axis, Y-axis and Z-axis respectively.
• sx : scale factor in the X-axis
• sy : scale factor in the X-axis
• sy : scale factor in the X-axis

 scale(s)  IceSL | IceSL-online

 scale(v)  IceSL | IceSL-online

Syntactic sugar for scale(s,s,s) and scale(v.x,v.y,v.z) respectively.

The above transformations have alternative names (mainly for compatibility purposes). The next table summarizes them:

Transformation Alternative
translate translation
rotate rotation
scale scaling

 mirror(normal)  IceSL | IceSL-online

Returns a transformation matrix that mirrors a shape along the vector normal.
• normal : vector specifying the direction to mirror
 mesh = load_centered('fox.stl') emit( mesh ) emit( translate(0,-100,0) * mirror(v(0,1,0)) * mesh )

frame(v) IceSL | IceSL-online

Returns a transformation matrix that orients (i.e. aligns) a shape's up vector to the direction v.
• v : a vector specifying the direction to orientate in the transformation.

### Magnets

Magnets are volumeless shapes that help building objects by way of assembling parts. Think of a magnet as a fastener that eventually couples with other magnets from different shapes.

magnet('name') IceSL | IceSL-online

name : magnet name
 case = union( cylinder(5,10), translate(0,0,10) * magnet('m1') ) head = union( cone(5,1,10), translate(0,0,0) * rotate(180,X) * magnet('m2') ) emit(case) emit(translate(-20,0,0) * head)

Magnets have orientation (the coupling orientation). To couple the magnets, the function snap returns a transformation matrix that assembles one shape's magnet (i.e. shape1) to another (i.e. shape0). The example below builds upon the previous one with the last two emit statements removed.

snap(shape0, magnet0, shape1, magnet1) IceSL | IceSL-online

• shape0 : base shape
• magnet0 : the base shape's magnet name
• shape1 : shape to be coupled
• magnet1 : coupling shape's magnet name
 smatrix = snap(case, 'm1', head, 'm2') emit(union(smatrix * head, case))

Snap matrices are not commutative with respect to their connecting magnets. Notice in the previous example that multiplying smatrix with case does not yield the same result.

## Operations

IceSL suports Constructive Solid Geometry (hereafter refered to as CSG). The following is a list of CSG operations:

### CSG Operations

 union(s0,s1)  IceSL | IceSL-online

Returns a shape as the union of shape s0 and shape s1. This operation is commutative.
•  s0 : A shape
•  s1 : A shape

 intersection(s0,s1)  IceSL | IceSL-online

Returns a shape as the intersection of shape s0 and shape s1. This operation is commutative.
•  s0 : A shape
•  s1 : A shape

 difference(s0,s1)  IceSL | IceSL-online

Returns a shape as the difference of shape s0 and shape s1. This operation is not commutative.
•  s0 : A shape
•  s1 : A shape

IceSL supports abbreviated multi-input versions of these operations. Assume s is a shape and S is a table of shapes. The following table summarizes these operations.

Operation N-Argument Version Short Version
union(s0,s1) union{s0,...,sn}, union(S) U(s0,s1), U{s0,...,sn}, U(S)
intersection(s0,s1) intersection{s0,...,sn}, intersection(S) I(s0,s1), I{s0,...,sn}, I(S)
difference(s0,s1) difference{s0,...,sn}, difference(S) D(s0,s1), D{s0,...,sn}, D(S)

N-ary versions from the above table are associative to the left. For example D{s0,s1,s2,s3} is equivalent to D(D(D(s0,s1),s2),s3). For this to be computationally sound12, the result of n-ary operations over a single shape is defined as the shape itself (i.e. U{s} = s, I{s} = s and D{s} = s).

### Other Operations

 merge{ s0,...,sn }  IceSL | IceSL-online

Same as union, however this operation internally discards the CSG tree. merge therefore creates a shape that produces less computational overhead, specially when the union consists of a large number of shapes. When merging shapes created with linear_extrude_from_oriented, make sure the outermost geometry is solid (i.e., specified counter-clockwise). If the outermost geometry is hollow (i.e., specified clockwise) then all geometry inside will not be visible. This is especially important when loading svg contours that may be specified as hollow geometry.

 flip(m)  IceSL

Inverts the orientation of the faces from the mesh m. This is specially useful when loading a mesh that has its faces defined clockwise.
•  m : input mesh

 convex_hull(shape)  IceSL

Creates the convex hull of shape. It only works with meshes or union of meshes.
•  shape : input primitive
 mesh = load('crystal.stl') emit( translate(100,0,0) * mesh ) emit( convex_hull(mesh) )

 dilate(mesh, factor)  IceSL

 erode(mesh, factor)  IceSL

Dilates and erodes a mesh respectively by factor. The vertices in mesh need to be merged a priori (use merge_vertices).
•  mesh : input mesh
•  factor : dilation/erosion factor
 mesh = scale(0.1) * merge_vertices(load_centered('fox.stl')) emit(translate(0,0,-6) * erode(mesh,0.3)) emit(translate(15,0,0) * dilate(mesh,0.5))

 linear_offset(mesh,direction,offset)  IceSL

Creates a linear offset of mesh in the direction direction by factor offset. Depending on the sign of offset, the offset either goes inwards (i.e. negative sign) or outwards (i.e. positive sign). Only works with meshes with connectivity information, call merge_vertices when such information does not exist (e.g. stl meshes).
• mesh : input mesh
• direction : offset direction
• offset : offset factor
 mesh = merge_vertices(load('fox.stl')) emit( mesh ) emit( translate(100,0,0) * linear_offset(mesh,v(0,1,0),10) )

 linear_offsets(mesh,directions,offsets)  IceSL

Same as linear_offset but multiple offsets can be applied at the same time. directions and offsets are arrays of vectors and numbers respectively and they have an ordered one-to-one correspondance.

## Shape Representation

IceSL offers several functions for calculating representations of shapes (i.e., meshes, voxels, etc).

 to_voxel_solid(shape, voxSize)

 to_voxel_solid(tex3d, voxSize)  IceSL

Creates a solid voxel volume from shape or tex3d<code> where each voxel measures <code>voxSize units.
•  shape : input shape
•  tex3d: 3D texture
•  voxSize : voxel size (in mm)

 to_voxel_solid(tex3d, boxMin, boxMax)

Creates a solid voxel volume from tex3d. boxMin and boxMax specify the volume in space to create the solid. Values in tex3d above 0.5 are considered solid, otherwise they are considered empty.

 to_voxel_distance_field(shape, voxSize)  IceSL

Creates a voxel distance field from shape using this technique. Each voxel measures voxSize units.
•  shape : input shape
•  voxSize : voxel size (in mm)

set_distance_field_iso(voxels, threshold) IceSL

In a distance field, sets the threshold to classify voxels as empty/solid whenever it is less/greater than threshold respectively.
•  voxels : voxel shape obtained by to_voxel_distance_field
• threshold: Number between 0 (empty) and 1(solid). Default is 0.5

 smooth_voxels(voxShape, windowSize)  IceSL

Smooths the voxel shape voxShape using a trilinear interpolation with a windows size of windowSize. This functions does not return a shape, instead it modifies the shape specified on the first parameter.
•  voxShape : input shape. Only supports voxels
•  windowSize : interpolation 3D window size

 smooth_voxels_preserve_volume(voxShape, windowSize)  IceSL

Same as above but tries to preserve the shape's volume.
 s = sphere(5) vs1 = to_voxel_solid(s, 0.1) vs2 = to_voxel_solid(s, 0.1) smooth_voxels(vs2,10) emit(translate(0,0,0) * s) emit(translate(15,0,0) * vs1) emit(translate(30,0,0) * vs2)

 to_mesh(shape, voxSize)  IceSL

Creates a mesh from shape using the marching cubes algorithm. Before calculating the resulting mesh, the 3D space containing the shape is discretized using voxels of size voxSize units.
•  shape : input shape
•  voxSize : voxel size of space discretization (in mm)

voxelize_to_file(shape, voxSize, fileName) IceSL

Dumps the voxelization of shape into fileName with voxel size voxSize. Additionally, a file named filename.dim is created specifying the dimensions of the processing box (in world space and in number of voxels).
• shape: shape to voxelize
• voxSize: voxel size
• fileName: destination file to dump the voxel information

### From Asset

 svg_ex(file,dpi)  IceSL

Extracts contours out of a SVG file. Returns a table of SVGContour objects.
• file : input svg file
• dpi : dots per inch. Use 90 for Inkscape files

The SVGContour object has the following members:

•  outline : (table) The contour
•  fill : (triplet) fill color for the contour
•  stroke: (triplet) stroke color for the contour
•  strokeWidth: (num) stroke width for the contour
•  hasFill: (bool) contour is color-filled
•  hasStroke: (bool) contour is color-bordered
 svg_shapes = svg_ex('restroom.svg',90) for i,contour in pairs(svg_shapes) do if contour:hasFill() then set_brush_color(i, contour:fill()[1], contour:fill()[2], contour:fill()[3]) end emit(linear_extrude(v(0,0,5),contour:outline()), i) end

 font(ttf)  IceSL

Creates a font object based on the font described in the TrueType Font file ttf.
•  ttf : TrueType Font file

The interface to the font object is the following:

•  str(string, tracking)  : Returns a 3D geometry of the string string. If the font has kerning information, the argument tracking is ignored.
 f = font(Path .. 'LiberationMono-Regular.ttf') text = f:str('IceSL', 10) emit(scale(0.5,0.5,10) * text)

load_raw_voxels(fileName, thicken)

Creates a shape out of raw voxel data in fileName. thicken stands for the thickening applied to the voxels.
• fileName: input file
• thicken: thickening of voxels

The format of the file is a continuous chunk of voxels with the following information in sequence:

1. Position (3 ints)
2. Normal (3 floats)
3. Color (3 unsigned chars)
4. State (1 bool)

### Distribute

Additionally to changing the representations of a shape, IceSL also provides a function to calculate an evenly distributed set of points covering a surface. For each point this function also reports its surface normal and maximum distance to the set of nearest points.

 distribute(shape, density)  IceSL

Returns a Lua array describing the surface of shape using Voronoid Iteration. The array is made out of triplets wherein the first element is a position of the surface, the second its surface normal and the third its distance to the furthest neighboring position in the array. How sparse the positions are is determined by the argument density.
•  shape : input shape
•  density : position density. This argument is clamped to the unit inverval where 1 signifies high density and 0 no density
 shape = cube(10) s = distribute(shape, 0.2) centroids = {} for i = 1,#s,1 do centroids[i] = translate(s[i][1]) * frame(s[i][2]) * merge{ cone(s[i][3],0,1), mirror(Z) * cone(s[i][3],0,1) } end emit(merge(centroids))

## Other Functionality

### Variable caching

It is possible to turn on/off variable caching in IceSL with the system variable enable_variable_cache. Variable caching is usefull when editing a script that constructs an object or perfoms a calculation that is cpu intensive (i.e. consumes signficant time).

In the following example it is possible to change the scaling of mesh without incurring in the penalty of re-calculating the result of to_mesh:

 enable_variable_cache = true s = sphere(10) if not mesh then mesh = to_mesh(s,1) end emit(scale(1) * mesh)

### Tweaks

ui_scalar(name, default, min, max)

Creates a sliding bar to interactively set a float value between min and max.
• name: the sliding bar's name
• default: default value
• min: minimum value
• max: maximum value
 r = ui_scalar("Radius",10,1,20) emit(sphere(r))

### Fields

Fields are UI objects for interactively building 3D textures. They are usefull for carving, sculpting and specifying surfaces among other things.

ui_field(name, boxMin, boxMax)

Creates a labeled button to build a 3D texture in the box space specified by boxMin and boxMax.
• name: field name
• boxMin: left corner of the 3D texture
• boxMax: right corner of the 3D texture

ui_field_value_at(name, p)

Retrieves the value of the field name (created by ui_field) at position p.
• name: field name
• p: position to inquire

ui_file(fileName)

Creates a UI to load/save all the script's tweaks and field values from/into fileName.
• fileName: file path to load/save tweaks and fields values

The following example scuplts a sphere usind a field named Sculpting and saves the field values into the file sculpt.xml

 s = sphere(10) bx = bbox(s) bx:enlarge(1) f = ui_field('Sculpting',bx:min_corner(),bx:max_corner()) ui_file(Path..'sculpt.xml') result = intersection(s,to_voxel_solid(f,bx:min_corner(),bx:max_corner())) emit(result)

In the next example, we use a field to avoid distributing (i.e. function distribute) parts of the shape surface.

 enable_variable_cache = true shape = sphere(10) if not s then s = distribute(shape, 0.5) end bx = bbox(shape) bx:enlarge(1) f = ui_field('surface', bx:min_corner(),bx:max_corner()) cubes = {} for i = 1,#s do if ui_field_value_at('surface', s[i][1]) > 0.5 then cubes[#cubes+1] = translate(s[i][1]) * frame(s[i][2]) * ccube(s[i][3]) end end emit(union(shape,merge(cubes)))

### Mesh Information

 bbox(shape)  IceSL

Returns the bounding box of shape as an object AAB.
•  shape : Input shape

The AAB object has the following members:

•  min_corner : (vector) Minimum corner of the bounding box
•  max_corner : (vector) Maximum corner of the bounding box
•  center : (vector) Center of the bounding box
•  extent : (vector) Dimensions of the bounding box
•  empty : (bool) Boolean value indicating wether the bounding box is
•  enlarge(mm): Enlarges the box by mm millimeters

mesh_vertices(mesh) IceSL

Returns a table containing the vertices of a mesh.
•  mesh : Input mesh

 mesh_normals(mesh)  IceSL

Returns a table containing the normals of a mesh.
•  mesh : Input mesh

mesh_local_edge_size(mesh) IceSL

Returns a table containing the average connecting edge length of every vertex of a mesh.

### Miscellaneous Functions

 print(str)  IceSL

Prints the message str
• str : input string

screenshot() IceSL

Saves a screenshot in the pictures folder or current script folder for the windows and linux builds respectively.

set_tesselation_factor(factor)

Sets the tesselation factor of non-mesh shapes. A high factor results in smoother shapes.
• factor: tesselation factor.

 sleep(ms)  IceSL

Suspends execution of IceSL by ms milliseconds.
• ms : numer of milliseconds

 dofile(path)  IceSL

Executes the scipt in path
• path : path to the script file

dump(shape, filename)  IceSL

Saves the shape shape in file filename
• shape : shape to save
• filename : destination file to save the shape. Supports stl and obj extensions