{{
from list import
from engine import
from pygame import
from pygame.locals import
import pygame
class OcttreeLeaf:
"Octotree Leaf"
def init(self, x,y,z,w,h,d,depth):
self.x = x
self.y = y
self.z = z
self.w = w
self.h = h
self.d = d
self.depth = 0
self.collide = 0
def isleaf(self): return 1
class OcttreeNode(OcttreeLeaf):
"Octotree Node"
def init(self,x,y,z,w,h,d,depth):
OcttreeLeaf.init(self,x,y,z,w,h,d,depth)
self.nodes = List()
self.collide = 0
def isleaf(self): return 0 def add(self,n): self.nodes.addobject(n)
class Octtree:
"Octtree"
def init(self,x,y,z,w,h,d,depth,room):
self.tree = OcttreeNode(x,y,z,w,h,d,depth)
self.depth = depth
self.room = room
self.diagonaloffset = 120
self.image = pygame.image.load("./pics/tile1-rot-420x420.bmp").convert()
self.image.set_colorkey((0,0,0))
###FIXself.font = room.roomman.font
def add(self,n): self.tree.addobject(n) def generatetree(self,border): self.generatetreerec(self.depth,self.tree,self.tree.x,self.tree.y,self.tree.z,self.tree.w,self.tree.h,self.tree.d,border) def generatetreerec(self,depth,node,x,y,z,w,h,d,border): if depth <= 0:###FIXME1: for i in range(1,4): node.add(OcttreeLeaf(i*x/4, y/4, z/4, w/3,h/3,d/3,depth)) for i in range(1,4): node.add(OcttreeLeaf(i*x/4, i*y/4, z/4, w/3,h/3,d/3,depth)) for i in range(1,4): node.add(OcttreeLeaf(i*x/4, i*y/4, i*z/4, w/3,h/3,d/3,depth)) for i in range(1,4): node.add(OcttreeLeaf(x/4, i*y/4, z/4, w/3,h/3,d/3,depth)) for i in range(1,4): node.add(OcttreeLeaf(x/4, i*y/4, i*z/4, w/3,h/3,d/3,depth)) for i in range(1,4): node.add(OcttreeLeaf(i*x/4, y/4, i*z/4, w/3,h/3,d/3,depth)) for i in range(1,4): node.add(OcttreeLeaf(x/4, y/4, i*z/4, w/3,h/3,d/3,depth)) ### center node for i in range(0,21): tempnode = node.nodes.getwithindex(i) # ###FIXif border < tempnode.x*(self.depth-1) + tempnode.w:### and border > tempnode.x: ### + w/3: # print "leaf border %d\n" % (tempnode.x*(depth-1) ### NOTE: vary for each room, e.g. depth search algorithm ###FIXif border < tempnode.x + tempnode.w: ### border += border ### node.nodes.getwithindex(i).collide = 1 if border < tempnode.x + tempnode.w: border += border node.nodes.getwithindex(i).collide = 1 ###node = leaf return for i in range(1,4): node.add(OcttreeNode(i*x/4, y/4, z/4, w/3,h/3,d/3,depth)) for i in range(1,4): node.add(OcttreeNode(i*x/4, i*y/4, z/4, w/3,h/3,d/3,depth)) for i in range(1,4): node.add(OcttreeNode(i*x/4, i*y/4, i*z/4, w/3,h/3,d/3,depth)) for i in range(1,4): node.add(OcttreeNode(x/4, i*y/4, z/4, w/3,h/3,d/3,depth)) for i in range(1,4): node.add(OcttreeNode(x/4, i*y/4, i*z/4, w/3,h/3,d/3,depth)) for i in range(1,4): node.add(OcttreeNode(i*x/4, y/4, i*z/4, w/3,h/3,d/3,depth)) for i in range(1,4): node.add(OcttreeNode(x/4, y/4, i*z/4, w/3,h/3,d/3,depth)) ### center node ###OBSOLETEfor i in range(0,21): ### tempnode = node.nodes.getwithindex(i) ### if border < tempnode.x: ### node.nodes.getwithindex(i).collide = 1 for i in range(1,4): self.generatetreerec(depth-1,node.nodes.getwithindex(i),i*x/4, y/4, z/4, w/3,h/3,d/3,border) for i in range(1,4): self.generatetreerec(depth-1,node.nodes.getwithindex(i+2),i*x/4, i*y/4, z/4, w/3,h/3,d/3,border) for i in range(1,4): self.generatetreerec(depth-1,node.nodes.getwithindex(i+5),i*x/4, i*y/4, i*z/4, w/3,h/3,d/3,border) for i in range(1,4): self.generatetreerec(depth-1,node.nodes.getwithindex(i+8),x/4, i*y/4, z/4, w/3,h/3,d/3,border) for i in range(1,4): self.generatetreerec(depth-1,node.nodes.getwithindex(i+11),x/4, i*y/4, i*z/4, w/3,h/3,d/3,border) for i in range(1,4): self.generatetreerec(depth-1,node.nodes.getwithindex(i+14),i*x/4, y/4, i*z/4, w/3,h/3,d/3,border) for i in range(1,4): self.generatetreerec(depth-1,node.nodes.getwithindex(i+17),x/4, y/4, i*z/4, w/3,h/3,d/3,border) ### center node def collision(self,player,game): self.result = 0 self.collisionrec(self.depth,self.tree,player,game) return self.result def collisionx(self,player): self.result = 0 self.collisionrecx(self.depth,self.tree,player.x,player.y,player.z) return self.result def collisiony(self,player): self.result = 0 self.collisionrecy(self.depth,self.tree,player.x,player.y,player.z) return self.result def collisionrec(self,depth,node,player,game): x = player.x y = player.y z = player.z ###if depth <= 1 or node.isleaf(): relx = self.room.roomman.room.relativex rely = self.room.roomman.room.relativey ###if node.isleaf(): ###print "leaf! depth=%d" % depth if (x + relx < node.x + node.w*(-depth+1) and x + relx + node.w > node.x) and (y + rely < node.y + node.h*(-depth+1) and y + rely > node.y): print "collision player.depth=%d map.depth=%d!" % (player.depth,depth) if depth <= player.depth: ###if node.collide == 1:### and node.w > 333: self.result = 1 return elif player.depth < depth: ### node.depth -= 1 self.result = 2 return elif player.depth > depth: self.result = 3 return ### ###self.result = 1### ### player.jump(game,0) ###return #NOTE do not return for each node to be switched ###elif node.isleaf(): ### return else: for i in range(0,21): if not node.isleaf(): n = node.nodes.getwithindex(i) if n != None: self.collisionrec(depth-1,n,player,game) return def collisionrecx(self,depth,node,x,y,z): ###if depth <= 1 or node.isleaf(): relx = self.room.roomman.room.relativex rely = self.room.roomman.room.relativey if node.isleaf(): ##print "leaf!" return for i in range(0,21): n = node.nodes.getwithindex(i) if (n != None): if (x < n.x + n.w and x > n.x): print "collision!" if n.collide == 1: self.result = 1 return self.collisionrecx(depth-1,n,x,y,z) def collisionrecy(self,depth,node,x,y,z): ###if depth <= 1 or node.isleaf(): relx = self.room.roomman.room.relativex rely = self.room.roomman.room.relativey if node.isleaf(): ##print "leaf!" return for i in range(0,21): n = node.nodes.getwithindex(i) if (n != None): if (y < n.y + n.h and y > n.y): print "collision!" if n.collide == 1: self.result = 1 return self.collisionrecx(depth-1,n,x,y,z) def walkin(self,player): self.result = 0 self.walkinrec(self.depth,self.tree,player) return self.result def walkinrec(self,depth,node,player): px = player.x py = player.y pz = player.z relx = self.room.roomman.room.relativex rely = self.room.roomman.room.relativey dd = self.depth-1 ## SE dagonal orientation if rely == relx:### or rely == relx-270: ####FIXME node.z ###if node.collide == 1: print "++++++++++++++++++++++++++++++collision in walkin..." self.result = 1 return if node.isleaf(): print "leaf!" return for i in range(0,21): if node.nodes.getwithindex(i) != None: relx = self.room.roomman.room.relativex rely = self.room.roomman.room.relativey ###print "px=%d py=%d to relx=%d rely=%d\n" % (px, py,relx,rely) if px + self.room.roomman.room.relativex < node.nodes.getwithindex(i).x*(depth-1): self.walkinrec(depth-1,node.nodes.getwithindex(i),player) def draw(self,player,screen,rotx,roty,rotz): self.result = 0 self.drawrec(self.depth,self.tree,player,rotx,roty,rotz)
###screen.scr.blit(self.image, (0,0)) return self.result def drawrec(self,depth,node,player,rotx,roty,rotz): ###FIXpygame.display.get_surface().blit(self.font.render("Loading...", 8, (255,255,255)), (140,320)) ###a = pygame.surfarray.pixels3d(self.image)###pygame.display.get_surface()) px = player.x py = player.y pz = player.z relx = self.room.roomman.room.relativex rely = self.room.roomman.room.relativey dd = self.depth-1 ## SE dagonal orientation ###if depth <= 4 and not node.isleaf() and node.nodes.length > 0:###node.isleaf():### or not node.isleaf(): if node.isleaf() and node.collide == 1: r1x = node.x r1y = node.y r1z = node.z r1w = node.w r1h = node.h r1d = node.d ###pygame.draw.line(pygame.display.get_surface(), (0,255,0), (r1x+relx,r1y+rely), (r1x+relx+r1w,r1y+rely)) ###pygame.draw.line(pygame.display.get_surface(), (0,255,0), (r1x+relx+r1w,r1y+rely), (r1x+relx+r1w,r1y+rely+r1h)) ###pygame.draw.line(pygame.display.get_surface(), (0,255,0), (r1x+relx+r1w,r1y+rely+r1h), (r1x+relx,r1y+rely+r1h)) ###pygame.draw.line(pygame.display.get_surface(), (0,255,0), (r1x+relx,r1y+rely+r1h), (r1x+relx,r1y+rely)) for i in range(0,21):###FIXME1 e = engine(rotx,roty,rotz) r1 = Vector3(node.x,node.y,node.z) r2 = Vector3(node.x,node.y,node.z) if rotx: r1 = e.mx.multiply(r1) r2 = e.mx.multiply(r2) if roty: r1 = e.my.multiply(r1) r2 = e.my.multiply(r2) if rotz: r1 = e.mz.multiply(r1) r2 = e.mz.multiply(r2) r1x = r1.array[0] r1y = r1.array[1] r1z = r1.array[2] r2x = r2.array[0] r2y = r2.array[1] r2z = r2.array[2] color = (255,0,0) if node.collide: color = (0,0,255) pygame.draw.line(pygame.display.get_surface(), color, (r1x+relx,r1y+rely), (r2x+relx,r2y+rely)) ###pygame.draw.line(pygame.display.get_surface(), color, (r1x+relx+n1.w*(self.depth-1),r1y+rely+n1.h*(self.depth-1)), (r2x+relx+n2.w*(self.depth-1),r2y+rely+n2.h*(self.depth-1))) ###pygame.draw.line(pygame.display.get_surface(), color, (r1x+relx+n1.w*(self.depth-1),r1y+rely+n1.h*(self.depth-1)), (r2x+relx+n2.w*(self.depth-1),r2y+rely+n2.h*(self.depth-1))) ###pygame.draw.line(pygame.display.get_surface(), color, (r1x+relx,r1y+rely), (r2x+relx+n2.w*(self.depth-1),r2y+rely+n2.h*(self.depth-1))) ###pygame.draw.line(pygame.display.get_surface(), color, (r1x+relx+n1.w*(self.depth-1),r1y+rely+n1.h*(self.depth-1)), (r2x+relx,r2y+rely)) ###if depth <= 0: ### return pygame.display.get_surface().blit(self.image, (r1x+relx,r1y+rely)) ##for j in range(0,node.w): ## for i in range(0,node.h): ## print "--->%d" % (i) ## c = a[i%24][j%24] ## color = (c[0],c[1],c[2]) ## pygame.draw.line(pygame.display.get_surface(),color,(r1x+i+relx,r1y+j+rely),(r1x+i+relx,r1y+j+rely)) for i in range(0,21): if not node.isleaf() and node.nodes.getwithindex(i) != None: self.drawrec(depth-1,node.nodes.getwithindex(i),player,rotx,roty,rotz) def draw2(self,player,screen): self.result = 0 self.drawrec2(self.depth,self.tree,player) return self.result def drawrec2(self,depth,node,player): px = player.x py = player.y pz = player.z relx = self.room.roomman.room.relativex rely = self.room.roomman.room.relativey dd = self.depth-1 ## SE dagonal orientation ###if depth <= 4 and not node.isleaf() and node.nodes.length > 0:###node.isleaf():### or not node.isleaf(): if node.isleaf(): r1x = node.x r1y = node.y r1z = node.z r1w = node.w r1h = node.h r1d = node.d pygame.draw.line(pygame.display.get_surface(), (255,0,0), (r1x+relx,r1y+rely), (r1x+relx+r1w,r1y+rely)) pygame.draw.line(pygame.display.get_surface(), (255,0,0), (r1x+relx+r1w,r1y+rely), (r1x+relx+r1w,r1y+rely+r1h)) pygame.draw.line(pygame.display.get_surface(), (255,0,0), (r1x+relx+r1w,r1y+rely+r1h), (r1x+relx,r1y+rely+r1h)) pygame.draw.line(pygame.display.get_surface(), (255,0,0), (r1x+relx,r1y+rely+r1h), (r1x+relx,r1y+rely)) for i in range(0,21): if not node.isleaf() and node.nodes and node.nodes.length > 0 and node.nodes.getwithindex(i) != None: self.drawrec2(depth-1,node.nodes.getwithindex(i),player) def draw3(self,player,screen): self.result = 0 self.drawrec3(self.depth,self.tree,player) return self.result def drawrec3(self,depth,node,player,rotx,roty,rotz): px = player.x py = player.y pz = player.z relx = self.room.roomman.room.relativex rely = self.room.roomman.room.relativey dd = self.depth-1 ## SE dagonal orientation ###if depth <= 4 and not node.isleaf() and node.nodes.length > 0:###node.isleaf():### or not node.isleaf(): if depth <= 4 and not node.isleaf() and node.nodes.length > 17:###node.isleaf():### or not node.isleaf(): print "leaf!" for i in range(0,21):###FIXME1 n2 = node.nodes.getwithindex(i) for j in range(0,21): n1 = node.nodes.getwithindex(j) e = engine(rotx,roty,rotz) r1 = Vector3(n1.x,n1.y,n1.z) r2 = Vector3(n2.x,n2.y,n2.z) if rotx: r1 = e.mx.multiply(r1) r2 = e.mx.multiply(r2) if roty: r1 = e.my.multiply(r1) r2 = e.my.multiply(r2) if rotz: r1 = e.mz.multiply(r1) r2 = e.mz.multiply(r2) r1x = r1.array[0] r1y = r1.array[1] r1z = r1.array[2] r2x = r2.array[0] r2y = r2.array[1] r2z = r2.array[2] color = (255,0,0) if n2.collide or n1.collide: color = (0,0,255) ##pygame.draw.line(pygame.display.get_surface(), color, (r1x+relx,r1y+rely), (r2x+relx,r2y+rely)) ##pygame.draw.line(pygame.display.get_surface(), color, (r1x+relx+n1.w*(self.depth-1),r1y+rely+n1.h*(self.depth-1)), (r2x+relx+n2.w*(self.depth-1),r2y+rely+n2.h*(self.depth-1))) ##pygame.draw.line(pygame.display.get_surface(), color, (r1x+relx,r1y+rely), (r2x+relx+n2.w*(self.depth-1),r2y+rely+n2.h*(self.depth-1))) ##pygame.draw.line(pygame.display.get_surface(), color, (r1x+relx+n1.w*(self.depth-1),r1y+rely+n1.h*(self.depth-1)), (r2x+relx,r2y+rely)) ###if depth <= 0: ### return if node.isleaf(): r1x = node.x r1y = node.y r1z = node.z r1w = node.w r1h = node.h r1d = node.d pygame.draw.line(pygame.display.get_surface(), (0,255,0), (r1x+relx,r1y+rely), (r1x+relx+r1w,r1y+rely)) pygame.draw.line(pygame.display.get_surface(), (0,255,0), (r1x+relx+r1w,r1y+rely), (r1x+relx+r1w,r1y+rely+r1h)) pygame.draw.line(pygame.display.get_surface(), (0,255,0), (r1x+relx+r1w,r1y+rely+r1h), (r1x+relx,r1y+rely+r1h)) pygame.draw.line(pygame.display.get_surface(), (0,255,0), (r1x+relx,r1y+rely+r1h), (r1x+relx,r1y+rely)) a = pygame.surfarray.pixels3d(self.image)###pygame.display.get_surface()) for j in range(0,24): for i in range(0,24): print "--->%d" % (i) c = a[i][j] color = (c[0],c[1],c[2]) pygame.draw.line(pygame.display.get_surface(),color,(r1x+i+relx,r1y+j+rely),(r1x+i+relx,r1y+j+rely)) for i in range(0,21): ### if not node.isleaf() and node.nodes and node.nodes.length > 0 and node.nodes.getwithindex(i) != None: if not node.isleaf() and node.nodes.getwithindex(i) != None: ###relx = self.room.roomman.room.relativex ###rely = self.room.roomman.room.relativey ###print "px=%d py=%d to relx=%d rely=%d\n" % (px, py,relx,rely) ##if px + self.room.roomman.room.relativex < node.nodes.getwithindex(i).x*(depth-1): self.drawrec3(depth-1,node.nodes.getwithindex(i),player,rotx,roty,rotz) }}