Files
noggit-red/scripts/prop_placer.lua
2021-09-02 02:07:56 +03:00

88 lines
2.6 KiB
Lua

-- This file is part of Noggit3, licensed under GNU General Public License (version 3).
local prop_placer = brush("Prop Placer")
local seed = prop_placer:add_string_tag("Seed","noggit")
local dist = prop_placer:add_int_tag("Distance",1,50,5)
local delete_all = prop_placer:add_bool_tag("Delete all models",false)
local circle_brush = prop_placer:add_bool_tag("Circle brush",false)
function Prop(index)
local prop = {}
prop.model_name = prop_placer:add_string_tag("Prop "..index)
prop.min_scale = prop_placer:add_real_tag("Prop "..index.." Min Scale",0.001,10,0.7,2)
prop.max_scale = prop_placer:add_real_tag("Prop "..index.." Max Scale",0.001,10,0.7,2)
return prop
end
prop_placer:add_null_tag()
local prop1 = Prop(1);
prop_placer:add_null_tag();
local prop2 = Prop(2);
prop_placer:add_null_tag();
local prop3 = Prop(3);
local props = {prop1,prop2,prop3}
function prop_placer:on_left_hold(evt)
local cur_props = {}
local count = 0
for _,v in pairs(props) do
if string.len(v.model_name:get())>0 then
table.insert(cur_props,v)
count = count + 1
end
end
if count == 0 then
print("No models selected")
return
end
local sel = select_origin(evt:pos(),evt:outer_radius(),evt:outer_radius())
for _,v in pairs(cur_props) do
for i,model in pairs(sel:models()) do
if(
(delete_all:get() or model:has_filename(v))
and
((not circle_brush:get())
or dist_2d(
model:get_pos()
, evt:pos()) < evt:outer_radius())
) then
model:remove()
end
end
end
local map = make_noise(
sel:min().x-dist:get()
, sel:min().z-dist:get()
, sel:size().x+2*dist:get()
, sel:size().z+2*dist:get()
, 1
, "SIMPLEX"
, seed:get()
)
for i,vert in pairs(sel:verts()) do
if (not circle_brush:get()) or dist_2d(
vert:get_pos(),
evt:pos()
) < evt:outer_radius() then
local loc = vert:get_pos()
if map:is_highest(loc,dist:get()) then
local rnd = random_from_seed(seed:get().." "..loc.x.." "..loc.z)
local index = rnd:integer(1,count+1)
local prop = cur_props[index]
local size = rnd:real(prop.min_scale:get(),prop.max_scale:get())
local rot = rnd:real(0,360.0)
add_m2(prop.model_name:get(),loc,size,vec(0,rot,0))
end
end
end
sel:apply()
end