101 lines
3.0 KiB
Python
101 lines
3.0 KiB
Python
from mc import *
|
|
import pygame.camera
|
|
from time import sleep
|
|
from sys import argv
|
|
|
|
COLORS = ( (35,0, 222,222,222),
|
|
(35,1, 219,125,63),
|
|
(35,2, 180,81,189),
|
|
(35,3, 107,138,201),
|
|
(35,4, 177,166,39),
|
|
(35,5, 66,174,57),
|
|
(35,6, 208,132,153),
|
|
(35,7, 64,64,64),
|
|
(35,8, 155,161,161),
|
|
(35,9, 47,111,137),
|
|
(35,10, 127,62,182),
|
|
(35,11, 46,57,142),
|
|
(35,12, 79,50,31),
|
|
(35,13, 53,71,27),
|
|
(35,14, 151,52,49),
|
|
(35,15, 26,22,22),
|
|
(159,0,210,178,161),
|
|
(159,1,162,84,38),
|
|
(159,2,150,88,109),
|
|
(159,3,113,109,138),
|
|
(159,4,186,133,35),
|
|
(159,5,104,118,53),
|
|
(159,6,162,78,79),
|
|
(159,7,58,42,36),
|
|
(159,8,135,107,98),
|
|
(159,9,87,91,91),
|
|
(159,10,118,70,86),
|
|
(159,11,74,60,91),
|
|
(159,12,77,51,36),
|
|
(159,13,76,83,42),
|
|
(159,14,143,61,47),
|
|
(159,15,37,23,16),
|
|
(155,0,232,228,220),
|
|
(152,0,164,26,9),
|
|
(41,0,250,239,80),
|
|
(173,0,19,19,19) )
|
|
|
|
def colorDist(a,b):
|
|
return (a[0]-b[0])*(a[0]-b[0])+(a[1]-b[1])*(a[1]-b[1])+(a[2]-b[2])*(a[2]-b[2])
|
|
|
|
def getBestColor(rgb):
|
|
bestColor = COLORS[0]
|
|
bestDist = 255*255*3
|
|
for c in COLORS:
|
|
d = colorDist(c[2:],rgb)
|
|
if d < bestDist:
|
|
bestDist = d
|
|
bestColor = c
|
|
return bestColor
|
|
|
|
mc = Minecraft()
|
|
pos = mc.player.getTilePos()
|
|
|
|
dither = True
|
|
width = 80
|
|
if len(argv) >= 2:
|
|
width = int(argv[1])
|
|
height = width * 3 // 4
|
|
|
|
pygame.camera.init()
|
|
camlist = pygame.camera.list_cameras()
|
|
if camlist:
|
|
cam = pygame.camera.Camera(camlist[0],(640,480))
|
|
current = [[(-1,-1) for y in range(height)] for x in range(width)]
|
|
while True:
|
|
image = pygame.transform.scale(cam.get_image(), (width,height))
|
|
if not dither:
|
|
for x in range(width):
|
|
for y in range(height):
|
|
block = getBestColor(image.get_at((x,y)))[0:2]
|
|
if current[x][y] != block:
|
|
mc.setBlock(pos.x+x,pos.y+height-1-y,pos.z,block)
|
|
current[x][y] = block
|
|
else:
|
|
pixels = [[list(image.get_at((x,y))[0:3]) for y in range(height)] for x in range(width)]
|
|
for x in range(width):
|
|
for y in range(height):
|
|
color = getBestColor(pixels[x][y])
|
|
block = color[0:2]
|
|
if current[x][y] != block:
|
|
mc.setBlock(pos.x+x,pos.y+height-1-y,pos.z,block)
|
|
current[x][y] = block
|
|
for i in range(3):
|
|
err = pixels[x][y][i] - color[2+i]
|
|
if x + 1 < width:
|
|
pixels[x+1][y][i] += err * 7 // 16
|
|
if y + 1 < height:
|
|
if 0 < x:
|
|
pixels[x-1][y+1][i] += err * 3 // 16
|
|
pixels[x][y+1][i] += err * 5 // 16
|
|
if x + 1 < width:
|
|
pixels[x+1][y+1][i] += err // 16
|
|
|
|
else:
|
|
mc.postToChat('Camera not found')
|