lua scene support with one example, general improvements
This commit is contained in:
@@ -0,0 +1,52 @@
|
||||
local unpack = table.unpack or _G.unpack
|
||||
math.randomseed(os.time())
|
||||
|
||||
local function randab(a, b)
|
||||
return math.random() * (b-a) + a
|
||||
end
|
||||
|
||||
local function randtable(n, a, b)
|
||||
local t = {}
|
||||
for i=1, n do
|
||||
t[i] = randab(a, b)
|
||||
end
|
||||
return t
|
||||
end
|
||||
|
||||
local function choice(list)
|
||||
return list[math.random(1, #list)]
|
||||
end
|
||||
|
||||
local function randomsphere()
|
||||
local pos = vec3.new(unpack(randtable(3, -2, 2)))
|
||||
local radius = randab(0, 0.5)
|
||||
local emission = colorvec.new(unpack(randtable(4, 0, 1)))
|
||||
local reflection = colormat.new(unpack(randtable(16, 0, 1)))
|
||||
local surfacetype = choice({surfacetype.DIFFUSE, surfacetype.REFLECTIVE, surfacetype.STOP})
|
||||
|
||||
return obj.withmaterial(
|
||||
obj.sphere(pos, radius),
|
||||
material.new(emission, reflection, surfacetype)
|
||||
)
|
||||
end
|
||||
|
||||
local function union(objs)
|
||||
local n = #objs
|
||||
if n == 1 then return objs[1] end
|
||||
|
||||
local mid = n//2
|
||||
local left, right = {}, {}
|
||||
for i=1, mid do
|
||||
left[i] = objs[i]
|
||||
end
|
||||
for i=mid+1, n do
|
||||
right[i-mid] = objs[i]
|
||||
end
|
||||
return obj.union(union(left), union(right))
|
||||
end
|
||||
|
||||
local spheres = {}
|
||||
for i=1, 100 do
|
||||
spheres[i] = randomsphere()
|
||||
end
|
||||
return union(spheres)
|
||||
Reference in New Issue
Block a user