Advertisement
Not a member of Pastebin yet?
Sign Up,
it unlocks many cool features!
- from pyglet.gl import *
- from pyglet.window import key
- from pyglet.window import mouse
- import math
- import time
- class Camera:
- def __init__(self, pos, rot):
- self.pos = list(pos)
- self.rot = list(rot)
- def update_pos(self, dt, keys):
- s = dt*10
- rotY = -self.rot[1]/180*math.pi
- dx,dz = s*math.sin(rotY),s*math.cos(rotY)
- if keys[key.W]: self.pos[0]+=dx; self.pos[2]-=dz
- if keys[key.S]: self.pos[0]-=dx; self.pos[2]+=dz
- if keys[key.A]: self.pos[0]-=dz; self.pos[2]-=dx
- if keys[key.D]: self.pos[0]+=dz; self.pos[2]+=dx
- if keys[key.SPACE]: self.pos[1]+=s
- if keys[key.LSHIFT]: self.pos[1]-=s
- def update_rot(self, dx, dy):
- dx/=8; dy/=8; self.rot[0]+=dy; self.rot[1]-=dx
- if self.rot[0]>90: self.rot[0] = 90
- elif self.rot[0]<-90: self.rot[0] = -90
- def apply(self):
- glLoadIdentity()
- glRotatef(-self.rot[0],1,0,0)
- glRotatef(-self.rot[1],0,1,0)
- glTranslatef(-self.pos[0],-self.pos[1],-self.pos[2])
- class Texture_loader:
- def load_texture(self,file):
- texture = pyglet.image.load(file).get_texture() # loading a texture
- glTexParameterf(GL_TEXTURE_2D,GL_TEXTURE_MIN_FILTER,GL_NEAREST)
- glTexParameterf(GL_TEXTURE_2D,GL_TEXTURE_MAG_FILTER,GL_NEAREST)
- return pyglet.graphics.TextureGroup(texture)
- class Player:
- def __init__(self,pos=(0,0,0),rot=(0,0)):
- self.camera = Camera(pos, rot)
- self.get_tex = Texture_loader()
- self.box = self.get_tex.load_texture('art/box2.png')
- self.batch = pyglet.graphics.Batch()
- self.wall_list = []
- self.wall_list.append(self)
- def delete(self):
- self.wall_list.remove(self)
- def place_wall(self,pos=None):
- print("wall created: ")
- if not pos:
- pos = self.camera.pos
- print(int(self.camera.pos[0]), int(self.camera.pos[1]), int(self.camera.pos[2]))
- wall_texture = ('t2f',(0,0, 1,0, 1,1, 0,1))
- self.batch.add(4,GL_QUADS,self.box,('v3f',(pos[0],0,pos[2], pos[0],0,pos[2]+10, pos[0],5,pos[2]+10, pos[0],5,pos[2])), wall_texture)
- def place_wall_2(self,pos=None):
- print("wall created: ")
- if not pos:
- pos = self.camera.pos
- print(int(self.camera.pos[0]), int(self.camera.pos[1]), int(self.camera.pos[2]))
- wall_texture = ('t2f', (0,0, 1,0, 1,1, 0,1))
- self.batch.add(4,GL_QUADS,self.box,('v3f',(pos[0],0,pos[2], pos[0]+10,0,pos[2], pos[0]+10,5,pos[2], pos[0],5,pos[2])), wall_texture)
- def reset_pos(self,pos=None):
- if not pos:
- pos = self.camera.pos
- pos[0] = pos[0]
- pos[1] = 1.5
- pos[2] = pos[2]
- def draw(self):
- self.batch.draw()
- class Wall:
- def __init__(self,pos=(0,0,0),rot=(0,0)):
- self.camera = Camera(pos, rot)
- self.get_tex = Texture_loader()
- self.box = self.get_tex.load_texture('art/box2.png')
- self.batch = pyglet.graphics.Batch()
- def place_wall(self,pos=None):
- wall = []
- print("wall created: ")
- print(wall)
- if not pos:
- pos = self.camera.pos
- print(int(self.camera.pos[0]), int(self.camera.pos[1]), int(self.camera.pos[2]))
- wall_texture = ('t2f',(0,0, 1,0, 1,1, 0,1))
- self.batch.add(4,GL_QUADS,self.box,('v3f',(pos[0],0,pos[2], pos[0],0,pos[2]+10, pos[0],5,pos[2]+10, pos[0],5,pos[2])), wall_texture)
- objwall = []
- objwall.append(Wall())
- class Window(pyglet.window.Window):
- def set3d(self):
- glMatrixMode(GL_PROJECTION)
- glLoadIdentity()
- gluPerspective(90,self.width/self.height,0.05,1000)
- glMatrixMode(GL_MODELVIEW)
- glLoadIdentity()
- def setLock(self,state):
- self.lock = state
- self.set_exclusive_mouse(state)
- mouse_lock = property(lambda self:self.lock,setLock)
- def __init__(self,*args,**kwargs):
- super().__init__(*args,**kwargs)
- self.lock = False
- self.set_minimum_size(300,200)
- self.keys = key.KeyStateHandler()
- self.push_handlers(self.keys)
- pyglet.clock.schedule(self.update)
- self.player = Player((0.5,1.5,1.5),(-30,0))
- def on_mouse_motion(self,x,y,dx,dy):
- if self.mouse_lock:
- self.player.camera.update_rot(dx, dy)
- def on_key_press(self,KEY,MOD):
- if KEY == key.ESCAPE:
- self.close()
- if KEY == key.E: self.mouse_lock = not self.mouse_lock
- if KEY == key.G:
- self.player.reset_pos()
- if KEY == key.R:
- self.player.place_wall()
- if KEY == key.T:
- self.player.place_wall_2()
- def update(self, dt):
- self.player.camera.update_pos(dt, self.keys)
- def on_draw(self):
- self.clear()
- self.set3d()
- self.player.camera.apply()
- self.player.draw()
- if __name__ == '__main__':
- # Add basic config with 4 x MSAA
- #config = pyglet.gl.Config(double_buffer=True, sample_buffers=1, samples=4)
- #window = Window(width=854,height=480,caption='3d test',resizable=True, config=config)
- window = Window(width=854,height=480,caption='3d test',resizable=True)
- glClearColor(0,0,0,1)
- glEnable(GL_DEPTH_TEST)
- #glEnable(GL_CULL_FACE)
- pyglet.app.run()
Advertisement
Add Comment
Please, Sign In to add comment
Advertisement