This repository has been archived on 2024-06-13. You can view files and clone it, but cannot push or open issues or pull requests.
mcedit/filters/smooth.py
2012-10-25 00:09:56 -10:00

67 lines
2.2 KiB
Python

from numpy import zeros, array
import itertools
from pymclevel.level import extractHeights
terrainBlocktypes = [1, 2, 3, 7, 12, 13, 14, 15, 16, 56, 73, 74, 87, 88, 89]
terrainBlockmask = zeros((256,), dtype='bool')
terrainBlockmask[terrainBlocktypes] = True
#
inputs = (
("Repeat count", (1, 50)),
)
def perform(level, box, options):
if box.volume > 16000000:
raise ValueError("Volume too big for this filter method!")
repeatCount = options["Repeat count"]
schema = level.extractSchematic(box)
schema.removeEntitiesInBox(schema.bounds)
schema.removeTileEntitiesInBox(schema.bounds)
for i in xrange(repeatCount):
terrainBlocks = terrainBlockmask[schema.Blocks]
heightmap = extractHeights(terrainBlocks)
#terrainBlocks |= schema.Blocks == 0
nonTerrainBlocks = ~terrainBlocks
nonTerrainBlocks &= schema.Blocks != 0
newHeightmap = (heightmap[1:-1, 1:-1] + (heightmap[0:-2, 1:-1] + heightmap[2:, 1:-1] + heightmap[1:-1, 0:-2] + heightmap[1:-1, 2:]) * 0.7) / 3.8
#heightmap -= 0.5;
newHeightmap += 0.5
newHeightmap[newHeightmap < 0] = 0
newHeightmap[newHeightmap > schema.Height] = schema.Height
newHeightmap = array(newHeightmap, dtype='uint16')
for x, z in itertools.product(xrange(1, schema.Width - 1), xrange(1, schema.Length - 1)):
oh = heightmap[x, z]
nh = newHeightmap[x - 1, z - 1]
d = nh - oh
column = array(schema.Blocks[x, z])
column[nonTerrainBlocks[x, z]] = 0
#schema.Blocks[x,z][nonTerrainBlocks[x,z]] = 0
if nh > oh:
column[d:] = schema.Blocks[x, z, :-d]
if d > oh:
column[:d] = schema.Blocks[x, z, 0]
if nh < oh:
column[:d] = schema.Blocks[x, z, -d:]
column[d:oh + 1] = schema.Blocks[x, z, min(oh + 1, schema.Height - 1)]
#preserve non-terrain blocks
column[~terrainBlockmask[column]] = 0
column[nonTerrainBlocks[x, z]] = schema.Blocks[x, z][nonTerrainBlocks[x, z]]
schema.Blocks[x, z] = column
level.copyBlocksFrom(schema, schema.bounds, box.origin)