File: procedural_complex.lua

package info (click to toggle)
crawl 2%3A0.33.1-3
  • links: PTS, VCS
  • area: main
  • in suites: forky, sid
  • size: 95,264 kB
  • sloc: cpp: 358,145; ansic: 27,203; javascript: 9,491; python: 8,359; perl: 3,327; java: 2,667; xml: 2,191; makefile: 1,830; sh: 611; objc: 250; cs: 15; sed: 9; lisp: 3
file content (39 lines) | stat: -rw-r--r-- 1,383 bytes parent folder | download | duplicates (5)
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
------------------------------------------------------------------------------
-- procedural_complex.lua: Complex procedural functions
--
-- These use base primitives to build up more complex shapes
------------------------------------------------------------------------------

crawl_require("dlua/layout/procedural.lua")

complex = {}

-- Creates a cog shape in the -1,-1 -> 1,1 domain
function complex.cog(teeth,inner,gap,offset)
  local fr = procedural.phase(primitive.radial, teeth, offset)
  return function(x,y)
    local dp = primitive.distance(x,y)
    local d = dp/inner
    local r = fr(x,y)
    if d < 1 or dp > 1 then return d end
    if r < gap then return 0.99 end
    return d
  end
end

-- Creates a number of rays around the origin. Offset is 0..1 to denote
-- rotation. If converge is non-nil then the rays will be even-sized
-- all the way along instead of diverging in size; they will converge
-- at the radius given by converge.
function complex.rays(num,offset,converge,diverge)
  local frad = procedural.phase(primitive.radial, num, offset)
  if even == false then return frad end
  if diverge == nil then diverge = 0 end
  return function(x,y)
    local a = frad(x,y)
    local r = primitive.distance(x,y)
    -- TODO: Work out divergence. It means (r/converge) has to tend
    -- more towards 1 for higher values of r.
    return a * r / converge
  end
end