def replace_forests(replacements)
objects_to_add = Array.new
num_forests_replaced = 0
last_object_id = if @objects.empty?
0
else
@objects.last.id
end
reset_progress 'Replacing forests', @objects.size / OBJECTS_PER_PROGRESS
@objects.each_with_index do |object, index|
replacement = replacements[object.name]
unless replacement.nil?
forest_id = object.id
block_dir = object.dir
total_proportion = replacement[:models].values.inject(0) do |total, value|
total + value
end
min = replacement[:min].to_f
max = replacement[:max].to_f
to_place = (rand(max - min + 1) + min).floor
sectors = replacement[:sectors]
to_place.times do
pick_proportion = rand() * total_proportion
replacement[:models].each_pair do |model, proportion|
pick_proportion -= proportion
if pick_proportion <= 0
orientation = object.orientation.deep_copy
orientation.dir = rand() * 360
h_offset, v_offset = random_sector_position(sectors)
h_offset, v_offset = rotate(h_offset, v_offset, block_dir)
position = object.position.deep_copy
position.x += h_offset
position.y += v_offset
position.z = height_at(position.x, position.y)
if forest_id.nil?
last_object_id += 1
objects_to_add.push WrpObject.new(model, last_object_id, position, orientation)
else
num_forests_replaced += 1
@objects[index] = WrpObject.new(model, forest_id, position, orientation)
forest_id = nil
end
break
end
end
end
end
increment_progress if index.modulo(OBJECTS_PER_PROGRESS) == 0
end
@objects += objects_to_add
[num_forests_replaced, objects_to_add.size]
end