#!/usr/bin/python

import victor

gray = (192,192,192)

class shape:
	def __init__(self):
		self.center = (0,0,0)
		self.pointlist = []
		self.polylist = []
		#poly = (indexlist=[],color=(0,0,0))

	def rotate_x(self,rad):
		for i in range(len(self.pointlist)):
			self.pointlist[i] = victor.rotate_x(self.pointlist[i],rad)

	def rotate_y(self,rad):
		for i in range(len(self.pointlist)):
			self.pointlist[i] = victor.rotate_y(self.pointlist[i],rad)

	def rotate_z(self,rad):
		for i in range(len(self.pointlist)):
			self.pointlist[i] = victor.rotate_z(self.pointlist[i],rad)

	def move(self,vector):
		self.center = victor.add(self.center,vector)

	def grow(self,factor):
		for i in range(len(self.pointlist)):
			self.pointlist[i] = victor.mul(self.pointlist[i],(factor,factor,factor))

	def get_polys(self):
		polylist = []
		for n in self.polylist:
			plist = []
			z = 0.0
			for i in n[0]:
				p = self.pointlist[i]
				if -p[2] < z:
					z = -p[2]
				p = victor.add(p,self.center)
				p = (2*p[0]/p[2], 2*p[1]/p[2])
				plist.append(p)
			polylist.append((z, plist, n[1]))
		return polylist

class cube(shape):
	def __init__(self,color=gray):
		self.center = (0,0,0)
		self.pointlist = [(-0.5,-0.5,-0.5),(0.5,-0.5,-0.5),(0.5,0.5,-0.5),(-0.5,0.5,-0.5),(-0.5,-0.5,0.5),(0.5,-0.5,0.5),(0.5,0.5,0.5),(-0.5,0.5,0.5)]
		self.polylist = [([0,1,2,3], color), ([4,5,6,7], color), ([0,1,5,4], color), ([2,3,7,6], color), ([1,2,6,5], color), ([3,0,4,7],color)]

	def grow_x(self,factor):
		for i in range(len(self.pointlist)):
			self.pointlist[i] = victor.mul(self.pointlist[i],(factor,1,1))

	def grow_y(self,factor):
		for i in range(len(self.pointlist)):
			self.pointlist[i] = victor.mul(self.pointlist[i],(1,factor,1))

	def grow_z(self,factor):
		for i in range(len(self.pointlist)):
			self.pointlist[i] = victor.mul(self.pointlist[i],(1,1,factor))


class pyramid(shape):
	def __init__(self, color=gray):
		self.center = (0,0,0)
		self.pointlist = [(-0.5, 0.5, -0.5), (0.5, 0.5, -0.5), (0.5, 0.5, 0.5), (-0.5, 0.5, 0.5), (0,-0.5,0)]
		self.polylist = [([0,1,2,3], color), ([0,1,4], color), ([1,2,4], color), ([2,3,4], color), ([3,0,4], color)]


class deequat(shape):
	def __init__(self, color=gray):
		self.center = (0,0,0)
		self.pointlist = [(0, 0.433, 0.5), (0.433, 0.433, -0.249), (-0.433, 0.433, -0.249), (0, -0.5, 0)]
		self.polylist = [([0,1,2], color), ([0,1,3], color), ([0,2,3], color), ([2,1,3], color)]

class deehuit(shape):
	def __init__(self, color=gray):
		self.center = (0,0,0)
		self.pointlist = [(0,0.5,0), (0.5,0,0), (0,0,0.5), (-0.5,0,0), (0,0,-0.5), (0,-0.5,0)]
		self.polylist = [([0,1,2], color), ([0,2,3], color), ([0,3,4], color), ([0,4,1], color), ([5,1,2], color), ([5,2,3], color), ([5,3,4], color), ([5,4,1], color) ]

if __name__ == "__main__":
	import spiele
	import heapq

	#the start of a painter algorithm

	solid = deehuit()
	solid.move((-0.5,0,1.5))
	solid.grow(0.5)
	solid2 = cube()
	solid2.move((0.5,0,1.5))
	solid2.grow(0.5)
	solid3 = pyramid()
	solid3.move((0,0.5,1.5))
	solid3.grow(0.5)

	def loop():
		solid.rotate_y(0.02)
		solid.rotate_x(0.005)
		solid2.rotate_x(0.01)
		solid2.rotate_y(0.005)
		solid3.rotate_y(0.005)
		l = solid.get_polys()
		l2 = solid2.get_polys()
		l3 = solid3.get_polys()
		h = l + l2 + l3
		heapq.heapify(h)
		while h:
			i = heapq.heappop(h)
			npl = spiele.points(i[1])
			spiele.draw(npl,i[2])

	spiele.init()
	spiele.loop(loop)

