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