parent
33da339432
commit
694fdf8e2b
After Width: | Height: | Size: 176 KiB |
@ -0,0 +1,128 @@ |
|||||||
|
local unpack = table.unpack or _G.unpack |
||||||
|
math.randomseed(os.time()) |
||||||
|
|
||||||
|
local SCALE = 0.3 |
||||||
|
local N_EACH = 25 |
||||||
|
|
||||||
|
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 MATERIALS = {surfacetype.DIFFUSE, surfacetype.REFLECTIVE, surfacetype.STOP} |
||||||
|
local function randommaterial() |
||||||
|
local emission = colorvec.new(unpack(randtable(4, 0, 1))) |
||||||
|
local reflection = colormat.new(unpack(randtable(16, 0, 1))) |
||||||
|
local surfacetype = choice(MATERIALS) |
||||||
|
|
||||||
|
return material.new(emission, reflection, surfacetype) |
||||||
|
end |
||||||
|
|
||||||
|
local ORIENTATIONS = { |
||||||
|
mat3.new( |
||||||
|
1, 0, 0, |
||||||
|
0, 1, 0, |
||||||
|
0, 0, 1 |
||||||
|
), |
||||||
|
mat3.new( |
||||||
|
1, 0, 0, |
||||||
|
0, 0, 1, |
||||||
|
0, 1, 0 |
||||||
|
), |
||||||
|
mat3.new( |
||||||
|
0, 1, 0, |
||||||
|
1, 0, 0, |
||||||
|
0, 0, 1 |
||||||
|
), |
||||||
|
mat3.new( |
||||||
|
0, 1, 0, |
||||||
|
0, 0, 1, |
||||||
|
1, 0, 0 |
||||||
|
), |
||||||
|
mat3.new( |
||||||
|
0, 0, 1, |
||||||
|
0, 1, 0, |
||||||
|
1, 0, 0 |
||||||
|
), |
||||||
|
mat3.new( |
||||||
|
0, 0, 1, |
||||||
|
1, 0, 0, |
||||||
|
0, 1, 0 |
||||||
|
) |
||||||
|
} |
||||||
|
local function randomorientation() |
||||||
|
return choice(ORIENTATIONS) |
||||||
|
end |
||||||
|
|
||||||
|
local function randomsphere() |
||||||
|
local pos = vec3.new(unpack(randtable(3, -2, 2))) |
||||||
|
local radius = randab(0, SCALE) |
||||||
|
|
||||||
|
return obj.sphere(pos, radius) |
||||||
|
end |
||||||
|
|
||||||
|
local function randomtorus() |
||||||
|
local pos = vec3.new(unpack(randtable(3, -2, 2))) |
||||||
|
local radius = randab(0, SCALE) |
||||||
|
local thickness = randab(radius/4, radius) |
||||||
|
local orientation = randomorientation() |
||||||
|
|
||||||
|
return obj.affinetransform(obj.torus(pos, radius, thickness), orientation, vec3.O) |
||||||
|
end |
||||||
|
|
||||||
|
local function randomcuboid() |
||||||
|
local pos = vec3.new(unpack(randtable(3, -2, 2))) |
||||||
|
local radius = randab(0, SCALE) |
||||||
|
|
||||||
|
return obj.cuboid(pos, vec3.new(radius, radius, radius)) |
||||||
|
end |
||||||
|
|
||||||
|
local function randomcylinder() |
||||||
|
local pos = vec3.new(unpack(randtable(3, -2, 2))) |
||||||
|
local radius = randab(0, SCALE) |
||||||
|
local height = randab(0, SCALE) |
||||||
|
local orientation = randomorientation() |
||||||
|
|
||||||
|
return obj.affinetransform( |
||||||
|
obj.intersection( |
||||||
|
obj.cylinder(pos, radius), |
||||||
|
obj.cuboid(pos, vec3.new(radius, height, radius)) |
||||||
|
), |
||||||
|
orientation, |
||||||
|
vec3.O |
||||||
|
) |
||||||
|
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 objects = {} |
||||||
|
for i=1, N_EACH do table.insert(objects, randomsphere()) end |
||||||
|
for i=1, N_EACH do table.insert(objects, randomtorus()) end |
||||||
|
for i=1, N_EACH do table.insert(objects, randomcuboid()) end |
||||||
|
for i=1, N_EACH do table.insert(objects, randomcylinder()) end |
||||||
|
for i, object in ipairs(objects) do objects[i] = obj.withmaterial(object, randommaterial()) end |
||||||
|
return union(objects) |
Loading…
Reference in new issue