コード例 #1
0
ファイル: RenderWorld.py プロジェクト: aapope/OpenGLMaze
class RenderWorld:
    '''This is the class that renders blocks (and the floor that they sit on). Camera angles are handled by another class'''
    WINDOW_WIDTH = 400
    WINDOW_HEIGHT = 400
    
    
    def __init__(self, file_name):
        '''Sets everything up: camera, modes, lighting, and the list of blocks'''
        self.camera = Camera()
        self.set_up_graphics()
        self.makeLights()
        self.objects = LoadWorld.load(file_name)
#        glMaterialfv(GL_FRONT, GL_SPECULAR, [1, 1, 1, 1])
#        glMaterialfv(GL_FRONT, GL_SHININESS, [50])

        glClearColor(.529,.8078,.980,0)

        glutDisplayFunc(self.display)
        glutKeyboardFunc(self.keyPressed)
        glutMainLoop()

    def set_up_graphics(self):
        '''Sets up the gl modes that are necessary'''
        glutInit()
        glutInitDisplayMode(GLUT_SINGLE | GLUT_RGB | GLUT_DEPTH)
        glutInitWindowSize(self.WINDOW_WIDTH, self.WINDOW_HEIGHT)
        glutCreateWindow('World!')
        
        glMatrixMode(GL_PROJECTION)
        gluPerspective(45,1,.15,100)
        glMatrixMode(GL_MODELVIEW)
        
        glEnable(GL_DEPTH_TEST)

    def makeLights(self):
        '''Sets up the light sources and their positions. We have an ambient light and two sets of specular/diffuse lights'''
        self.diffuse_pos1 = (50,5,0,1)
        glLightfv(GL_LIGHT0, GL_DIFFUSE, (.5, .5, .5, 1))
        glLightfv(GL_LIGHT0, GL_POSITION, self.diffuse_pos1)
        
        glLightfv(GL_LIGHT1, GL_AMBIENT, (.2, .2, .2, 1))
        glLightfv(GL_LIGHT1, GL_POSITION, (0, 0, 1, 0))
        
        glLightfv(GL_LIGHT2, GL_SPECULAR, (.8, .8, .8, 1))
        glLightfv(GL_LIGHT2, GL_POSITION, self.diffuse_pos1)

        self.diffuse_pos2 = (0,1,0,1)
        glLightfv(GL_LIGHT3, GL_DIFFUSE, (.5, .5, .5, 1))
        glLightfv(GL_LIGHT3, GL_POSITION, self.diffuse_pos2)
        glLightfv(GL_LIGHT4, GL_SPECULAR, (.8, .8, .8, 1))
        glLightfv(GL_LIGHT4, GL_POSITION, self.diffuse_pos2)

        glEnable(GL_LIGHTING)
        glEnable(GL_LIGHT0)
        glEnable(GL_LIGHT1)
        glEnable(GL_LIGHT2)

    def display(self, x=0, y=0):
        '''Called for every refresh; redraws the floor and blocks and based on the camera angle'''
        glClear(GL_COLOR_BUFFER_BIT | GL_DEPTH_BUFFER_BIT)
        glLoadIdentity()
        
        self.camera.renderCamera()        
        self.renderLightSource()        
        self.makeFloor()
        #Transparent blocks!
        glEnable(GL_BLEND)
        glBlendFunc(GL_SRC_ALPHA, GL_ONE_MINUS_SRC_ALPHA)



        for obj in self.objects:

            glPushMatrix()

            if obj.get_type() == "block":
                self.draw_block(obj)

            elif obj.get_type() == "key":
                self.draw_key(obj)

            glPopMatrix()
        glDisable(GL_BLEND)

        glFlush()


    def draw_block(self, obj):
                #Set the blocks shininess, ambient, diffuse, and specular reflections. The blocks are slightly transparent.
        color = obj.get_color()
        pos = obj.get_pos()
        #glMaterialfv(GL_FRONT_AND_BACK, GL_SHININESS, 75)
        glMaterialfv(GL_FRONT_AND_BACK, GL_AMBIENT, [color[0], color[1], color[2], 1])
        glMaterialfv(GL_FRONT_AND_BACK, GL_DIFFUSE, [.4, .4, .4, 1])
        #glMaterialfv(GL_FRONT_AND_BACK, GL_SPECULAR, [.9, .9, .9, .7])
        glTranslate(pos[0],pos[1],pos[2])
        glutSolidCube(2)

    def draw_key(self, obj):
        color = obj.get_color()
        pos = obj.get_pos()
        glMaterialfv(GL_FRONT_AND_BACK, GL_AMBIENT, [color[0], color[1], color[2], .7])
        glTranslate(pos[0],pos[1],pos[2])
                #glutSolidTorus(.05, .25, 3, 3)
        glutSolidCone(.1, 2.0, 30, 4)


    def keyPressed(self, key, x, y):
        '''Called when a key is pressed'''
        if key == 'a':
            self.camera.strafe(-.1)
        elif key == 'd':
            self.camera.strafe(.1)
        elif key == 'w':
            self.camera.walk(-.1)
        elif key == 's':
            self.camera.walk(.1)
        elif key == 'j':
            self.camera.rotate(0,3,0)
        elif key == 'l':
            self.camera.rotate(0,-3,0)
        elif key == 'i':
            self.camera.rotate(3,0,0)
        elif key == 'k':
            self.camera.rotate(-3,0,0)
        elif key == ' ':
            self.camera.height(.1)
        elif key == 'c':
            self.camera.height(-.1)
        self.display()

    def renderLightSource(self):
        '''Resets the light sources to the right position'''
        glLightfv(GL_LIGHT0, GL_POSITION, self.diffuse_pos1)
        glLightfv(GL_LIGHT2, GL_POSITION, self.diffuse_pos2)
        glLightfv(GL_LIGHT3, GL_POSITION, self.diffuse_pos2)
        glLightfv(GL_LIGHT4, GL_POSITION, self.diffuse_pos2)
        
    def makeFloor(self):
        '''Makes a floor of size size and places an image (texture) on it'''
        glEnable(GL_TEXTURE_2D)
        size = 50
        image = Image.open("OtherMods/checkerboard.bmp")
	
        ix = image.size[0]
        iy = image.size[1]
        image = image.tostring("raw", "RGBX", 0, -1)

        glPixelStorei(GL_UNPACK_ALIGNMENT,1)
        glTexImage2D(GL_TEXTURE_2D, 0, 3, ix, iy, 0, GL_RGBA, GL_UNSIGNED_BYTE, image)
        glTexParameterf(GL_TEXTURE_2D, GL_TEXTURE_WRAP_S, GL_CLAMP)
        glTexParameterf(GL_TEXTURE_2D, GL_TEXTURE_WRAP_T, GL_CLAMP)
        glTexParameterf(GL_TEXTURE_2D, GL_TEXTURE_WRAP_S, GL_REPEAT)
        glTexParameterf(GL_TEXTURE_2D, GL_TEXTURE_WRAP_T, GL_REPEAT)
        glTexParameterf(GL_TEXTURE_2D, GL_TEXTURE_MAG_FILTER, GL_NEAREST)
        glTexParameterf(GL_TEXTURE_2D, GL_TEXTURE_MIN_FILTER, GL_NEAREST)
        glTexEnvf(GL_TEXTURE_ENV, GL_TEXTURE_ENV_MODE, GL_DECAL)
        glBegin(GL_QUADS)
        glTexCoord2f(0.0, 0.0) ; glVertex(-size,-.5,-size)
        glTexCoord2f(1.0, 0.0) ; glVertex(size,-.5,-size)
        glTexCoord2f(1.0, 1.0) ; glVertex(size,-.5,size)
        glTexCoord2f(0.0, 1.0) ; glVertex(-size,-.5,size)
        glEnd()
        glDisable(GL_TEXTURE_2D)
コード例 #2
0
class RenderCube:
    '''This is the class that renders a rainbow cube
    Camera angles are handled by Camera.py.
    '''
    WINDOW_WIDTH = 700
    WINDOW_HEIGHT = 700
    MAP_SIZE =100

    def __init__(self):
        '''Sets up camera, modes, lighting, sounds, and objects.'''
        self.set_up_graphics()
        self.makeLights()
        self.camera = Camera(0,0,5)
        self.verts=self.GenArray()
        self.colors=self.GenArray('color')

        glClearColor(1,1,1,0)

        glutIdleFunc(self.display)
        glutDisplayFunc(self.display)

        glutIgnoreKeyRepeat(GLUT_KEY_REPEAT_OFF)
        glutKeyboardFunc(self.keyPressed)
        glutKeyboardUpFunc(self.keyUp)

        glutSetCursor(GLUT_CURSOR_NONE)
        glutPassiveMotionFunc(self.mouseMove)

        glutMainLoop()

    def set_up_graphics(self):
        '''Sets up OpenGL to provide double buffering, RGB coloring,
        depth testing, the correct window size, and a title.'''
        glutInit()
        glutInitDisplayMode(GLUT_DOUBLE | GLUT_RGB | GLUT_DEPTH)
        glutInitWindowSize(self.WINDOW_WIDTH, self.WINDOW_HEIGHT)
        glutCreateWindow('RainbowCube!')

        glMatrixMode(GL_PROJECTION)
        gluPerspective(45,1,.15,100)
        glMatrixMode(GL_MODELVIEW)

        glEnable(GL_DEPTH_TEST)

    def makeLights(self):
        '''Sets up the light sources and their positions. We have an
        ambient light and two sets of specular/diffuse lights.'''
        self.diffuse_pos1 = (50,5,0,1)
        glLightfv(GL_LIGHT0, GL_DIFFUSE, (.5, .5, .5, 1))
        glLightfv(GL_LIGHT0, GL_POSITION, self.diffuse_pos1)

        glLightfv(GL_LIGHT1, GL_AMBIENT, (.2, .2, .2, 1))
        glLightfv(GL_LIGHT1, GL_POSITION, (0, 0, 1, 0))

        glLightfv(GL_LIGHT2, GL_SPECULAR, (.8, .8, .8, 1))
        glLightfv(GL_LIGHT2, GL_POSITION, self.diffuse_pos1)

        self.diffuse_pos2 = (0,1,0,1)
        glLightfv(GL_LIGHT3, GL_DIFFUSE, (.5, .5, .5, 1))
        glLightfv(GL_LIGHT3, GL_POSITION, self.diffuse_pos2)
        glLightfv(GL_LIGHT4, GL_SPECULAR, (.8, .8, .8, 1))
        glLightfv(GL_LIGHT4, GL_POSITION, self.diffuse_pos2)

        glEnable(GL_LIGHTING)
        glEnable(GL_LIGHT0)
        glEnable(GL_LIGHT1)
        glEnable(GL_LIGHT2)

    def display(self, x=0, y=0):
        '''Called for every refresh; redraws the cube at current position
        based on the camera angle.'''
        glClear(GL_COLOR_BUFFER_BIT | GL_DEPTH_BUFFER_BIT)
        glLoadIdentity()

        self.camera.move()
        self.camera.renderCamera()
        self.renderLightSource()
        glPushMatrix()
        # Set the object shininess, ambient, diffuse, and
        # specular reflections.
        glMaterialfv(GL_FRONT_AND_BACK, GL_SHININESS, 75)
        glMaterialfv(GL_FRONT_AND_BACK, GL_DIFFUSE, [.4, .4, .4, 1])
        glMaterialfv(GL_FRONT_AND_BACK, GL_SPECULAR, [.9, .9, .9, .8])

        glTranslate(0,0,0)
        self.MakeCube()
        glPopMatrix()
        glutSwapBuffers()

    def mouseMove(self, x, y):
        '''Called when the mouse is moved.'''
        factor = 2
        
        tmp_x = (self.camera.mouse_x - x)/factor
        tmp_y = (self.camera.mouse_y - y)/factor
        if tmp_x > self.camera.ROTATE:
            tmp_x = self.camera.ROTATE
        self.camera.rotate(0, tmp_x, 0)
        x = self.WINDOW_WIDTH/2
        y = self.WINDOW_HEIGHT/2
        glutWarpPointer(x, y)
        self.camera.mouse_x = x
        self.camera.mouse_y = y
        
    def keyPressed(self, key, x, y):
        '''Called when a key is pressed.'''
        if key.lower() in self.camera.keys:
            self.camera.keys[key.lower()] = True
        if glutGetModifiers() == GLUT_ACTIVE_SHIFT:
            self.camera.keys["shift"] = True
        if key == 'j':
            self.camera.rotate(0,3,0)
        elif key == 'l':
            self.camera.rotate(0,-3,0)
        elif key == 'i':
            self.camera.rotate(3,0,0)
        elif key == 'k':
            self.camera.rotate(-3,0,0)
        elif key == ' ':
            self.camera.height(.1)
        elif key == 'c':
            self.camera.height(-.1)
        elif key == 'x':
            exit(0)

    def keyUp(self, key, x, y):
        '''Called when a key is released.'''
        self.camera.keys[key.lower()] = False
        if not glutGetModifiers() == GLUT_ACTIVE_SHIFT:
            self.camera.keys["shift"] = False

    def renderLightSource(self):
        '''Resets the light sources to the right position.'''
        glLightfv(GL_LIGHT0, GL_POSITION, self.diffuse_pos1)
        glLightfv(GL_LIGHT2, GL_POSITION, self.diffuse_pos2)
        glLightfv(GL_LIGHT3, GL_POSITION, self.diffuse_pos2)
        glLightfv(GL_LIGHT4, GL_POSITION, self.diffuse_pos2)
        
    def GenArray(self, mode='vert',pts=POINTS):
        vert_ls=[]
        if mode=='color':
            for m in range(pts):
                for n in range(pts):
                    for i in range(pts):
                        tmp_tup=(i*.1,n*.1,m*.1,1)
                        vert_ls.append(tmp_tup)
        elif mode=='vert':
            for m in range(pts):
                for n in range(pts):
                    for i in range(pts):
                        tmp_tup=(i*.1,n*.1,m*.1)
                        vert_ls.append(tmp_tup)
        return vert_ls

    def MakeCube(self):
        '''Makes the desired cube.'''
        #TODO: GET COLORS WORKING/ PAD PIXELS
        ind=[]
        for i in range(len(self.verts)):
            ind.append(i)
        glEnableClientState(GL_COLOR_ARRAY)
        glEnableClientState(GL_VERTEX_ARRAY)
        glVertexPointer(3, GL_FLOAT, 0, self.verts)
        glColorPointer(4, GL_FLOAT, 0, self.colors)
        glBegin(GL_POINTS)
        for i in range(len(self.verts)):
            glArrayElement(i)
        glEnd()
        glDrawElements(GL_POINTS, len(self.verts), GL_UNSIGNED_INT,ind )
        glDrawArrays(GL_POINTS, 0, len(self.verts))
        glDisableClientState(GL_VERTEX_ARRAY)
        glDisableClientState(GL_COLOR_ARRAY)



    def get_visible(self, lst):
        '''Only draws the points sitting in front of the camera.
        Everything behind it is left undrawn.'''
        #works off a cube class that has all the points in it with methods to call information about dist, 
        to_use = []
        for point in lst:
            c = point.dist
            x,z = self.camera.project_move_other()
            b = self.camera.get_camera_distance(x, 0, z)
            a = point.get_dist(x, 0, z)
            angle = 0
            try:
                num = ((b**2)+(c**2)-(a**2))/(2*b*c)
                angle = math.acos(num)/math.pi*180
            except:
                pass
            if angle > 90:
                to_use.append(item)
        return to_use
コード例 #3
0
class RenderWorld:
    '''This is the class that renders maze.
    Camera angles are handled by Camera.py.
    '''
    
    WINDOW_WIDTH = 1000
    WINDOW_HEIGHT = 1000
    SCALE = 1
    X_FACTOR = 1
    Y_FACTOR = 1
    Z_FACTOR = 1
    SEA_LEVEL = 4
    HEIGHT_SCALE = 32

    def __init__(self, transaction):
        '''Sets up camera, modes, lighting, sounds, and objects.'''
        f = open(CONFIG)
        lines = f.read().split("\n")
        self.QUALITY = int(lines[0].split()[1])
        self.MAP_SIZE = int(lines[1].split()[1])
        self.SKYBOX_SIZE = float(lines[2].split()[1])/3
        self.HEIGHT_SCALE = int(float(lines[3].split()[1])*self.MAP_SIZE)
        f.close()
        
        self.set_up_convert()
        self.tex_holder = TextureHolder()
        self.index_list = []
        self.lock = threading.RLock()
        self.need_lists = False
        
        self.trans = transaction
        #self.skybox = Skybox((5000, 5000, 5000))
        #self.sky_index = self.skybox.createCallList(1, 3)
        #self.skybox = Skybox((len(self.heights[0])*self.X_FACTOR, self.Y_FACTOR, len(self.heights)*self.Z_FACTOR))
               
    def set_up(self):
        self.set_up_graphics()
        self.set_up_lighting()
        self.set_up_glut()
        water_path = 'data/textures/water/water.bmp'
        self.tex_holder.hold_my_texture(water_path, 'water')        
        self.camera = Camera(10,20,-10)
        
        self.curr_time = time.time()
        self.count = 0
        self.poly_view = False
        self.load_skybox()
        self.building_index_list = []
        #self.create_building(5,3,-5)


    def set_up_glut(self):
        glutIdleFunc(self.display)
        glutDisplayFunc(self.display)

        glutIgnoreKeyRepeat(GLUT_KEY_REPEAT_OFF)
        glutKeyboardFunc(self.keyPressed)
        glutKeyboardUpFunc(self.keyUp)

        glutSetCursor(GLUT_CURSOR_NONE)
        glutPassiveMotionFunc(self.mouseMove)

        #glGenLists(50)
        #glNewList(1, GL_COMPILE)
        #glNewList(1, GL_COMPILE)
    
    def start_loop(self):
        glutMainLoop()

    def to_gl(self, axis, oldnum):
        if axis == 'x':
            return self.convert.convert_for_triangle('x', oldnum)
        else:
            return self.convert.convert_for_triangle('z', oldnum)

    def create_render_newlist(self):
        self.need_lists = False
        new_list = []
        w_list = []
        #print "trying to render"
        #print self.trans.location_var
        for location, values in self.trans.location_var.items():
            #print "RENDERING IN OPEN GL", location
            tex_file_name, face_norms, vert_norms, heights, offsetx, offsetz, textname, textid = values
            #print vert_norms
            
            self.texture = self.tex_holder.hold_my_texture(tex_file_name, textname)
    
            #offsetx *= .995
            #offsetz *= .995 
            index = glGenLists(1)
            glNewList(index, GL_COMPILE)
            #print "new texture applied"
            self.tex_holder.applyTexture(self.texture)
            zdivide = float(self.MAP_SIZE)
            xdivide = float(self.MAP_SIZE)
            #go by rows
            for z in range(len(heights)-1):
                glBegin(GL_TRIANGLE_STRIP)
                for x in range(len(heights[z])):
                    #start at (0,1)
                    point1x = self.to_gl('x', x)    #first point x value in opengl coordinate
                    point1z = self.to_gl('z', z+1)  #first point z value in opengl coordinate
                    
                    glTexCoord2f(point1x/xdivide, -point1z/zdivide)
                    #print "f1:", point1x/divide, "f2:", -point1z/divide

                    pt = (point1x+offsetx, heights[x][z+1], point1z-offsetz)
                    m_point = (point1x, heights[x][z+1], point1z)
                    norm = vert_norms[m_point]
                    glNormal3f(norm[0],norm[1],norm[2])
                    glVertex3f(pt[0],pt[1],pt[2])
                    #############################################
                    #second point (0,0)

                    point2x = self.to_gl('x',x)     #second point x value in opengl coordinate
                    point2z = self.to_gl('z',z)     #second point z value in opengl coordinate
                    
                    glTexCoord2f(point2x/xdivide, -point2z/zdivide)

                    #print "f1:", point2x/divide, "f2:", -point2z/divide

                    pt = (point2x+offsetx, heights[x][z], point2z-offsetz)
                    m_point = (point2x, heights[x][z], point2z)
                    norm = vert_norms[m_point]
                    glNormal3f(norm[0],norm[1],norm[2])
                    glVertex3f(pt[0],pt[1],pt[2])
                    
                glEnd()
            #print z
            glEndList()

            '''Water plane'''
            indexw = glGenLists(1)
            glNewList(indexw, GL_COMPILE)
            glDisable(GL_LIGHTING)
        

            self.tex_holder.applyTexture('water')
            tile_size = self.tex_holder.images['water'].size
            
            xlen = float(self.convert.gl_x)
            zlen = float(self.convert.gl_z)
            glBlendFunc (GL_SRC_ALPHA, GL_ONE_MINUS_SRC_ALPHA)
            glEnable (GL_BLEND)
            glColor4f(1,1,1,.5)
            glBegin(GL_QUADS)

            glTexCoord2f(0, 0)
            glVertex3f(0+offsetx, self.convert.sea_level, 0-offsetz)

            glTexCoord2f(tile_size[0]/xlen/10, 0)
            glVertex3f(xlen+offsetx, self.convert.sea_level, 0-offsetz)

            glTexCoord2f(tile_size[0]/xlen/10, tile_size[1]/zlen/10)
            glVertex3f(xlen+offsetx, self.convert.sea_level, -zlen-offsetz)

            glTexCoord2f(0, tile_size[1]/zlen/10)
            glVertex3f(0+offsetx, self.convert.sea_level, -zlen-offsetz)
            glEnd()
            glDisable(GL_BLEND)
            glEnable(GL_LIGHTING)

            glEndList()
            
            new_list.append(index)
            w_list.append(indexw)


        self.land_index_list = new_list
        self.water_index_list = w_list
        #self.index_list = new_list

    def set_up_graphics(self):
        '''Sets up OpenGL to provide double buffering, RGB coloring,
        depth testing, the correct window size, perspective
        rendering/fulcrum clipping, and a title.'''
        glutInit()
        glutInitDisplayMode(GLUT_DOUBLE | GLUT_RGB | GLUT_DEPTH)
        glutInitWindowSize(self.WINDOW_WIDTH, self.WINDOW_HEIGHT)
        glutCreateWindow('Terrains!')

        glMatrixMode(GL_PROJECTION)

        gluPerspective(45,1,.1,8000)
        glMatrixMode(GL_MODELVIEW)

        #glClearColor(.529,.8078,.980,0)
        glEnable(GL_NORMALIZE)

        glEnable (GL_DEPTH_TEST)

        glShadeModel(GL_SMOOTH)
        #glPolygonMode(GL_FRONT_AND_BACK, GL_LINE)

        glEnable(GL_FOG)
        glFogi (GL_FOG_MODE, GL_EXP2)
        glFogfv (GL_FOG_COLOR, (.8,.8,.8,1))
        glFogf (GL_FOG_DENSITY, .02)
        glHint (GL_FOG_HINT, GL_FASTEST)
        self.last_time = 0
        #glEnable(GL_POINT_SMOOTH)
    
    def renderLightSource(self):
        '''Resets the light sources to the right position.'''
        glLightfv(GL_LIGHT0, GL_POSITION, self.diffuse_pos1)

    def set_up_lighting(self):
        self.diffuse_pos1 = (0,.5,-1,0)
        glLightfv(GL_LIGHT0, GL_DIFFUSE, (1, 1, 1, 1))
        glLightfv(GL_LIGHT0, GL_POSITION, self.diffuse_pos1)

        
        glLightfv(GL_LIGHT1, GL_AMBIENT, (1, 1, 1, .5))
        glLightfv(GL_LIGHT1, GL_POSITION, (1,1,1,1))

    def set_up_convert(self):
        #heightmap, texture, gl
        self.convert = Convert((1, 1, 1), (self.QUALITY, 1, self.QUALITY), (1*self.SCALE, self.HEIGHT_SCALE*self.SCALE, 1*self.SCALE), self.MAP_SIZE)
        

    def load_map(self, heightmap_filename):
        self.load = LoadTerrain(heightmap_filename, self.convert, self.tex_holder)
        self.heights = self.load.load()
        self.map_index = self.load.createRenderList(self.heights)

    def load_skybox(self):
        #self.skybox = Skybox((len(self.heights[0])*self.X_FACTOR, self.Y_FACTOR, len(self.heights)*self.Z_FACTOR))
        scale = (self.convert.gl_x+self.convert.gl_z)*self.SKYBOX_SIZE
        self.skybox = Skybox(self.tex_holder, (scale,scale,scale))
        self.sky_index = self.skybox.createCallList(1, 3)

    def create_building(self, x, y, z):
        self.load = Structure(self.tex_holder)
        self.building_index_list.append([self.load.create_structure(), (x,y,z)])
        print self.building_index_list

    def display(self, x=0, y=0):
        '''Called for every refresh; redraws the floor and objects
        based on the camera angle. Calls collision detection, handles
        the appropriate objects for keys, doors, etc.'''
        #print "loopdy loop"
        # print self.curr_time - time.time()
        f_rate = 1.0/60
        if self.last_time+f_rate <= time.time():
            self.last_time = time.time()

            glClear(GL_COLOR_BUFFER_BIT | GL_DEPTH_BUFFER_BIT)

            glLoadIdentity()        
            glDisable(GL_LIGHTING)
            self.camera.renderRotateCamera()
            glTranslate(-self.skybox.x/2, -1-self.camera.pos_Y, -self.skybox.z/2)
            glCallList(self.sky_index)

            if abs(self.curr_time - time.time()) >= 1:
                print "FPS:", self.count
                print time.time()
                self.count = 0
                self.curr_time = time.time()
            else:
                self.count+=1
        
            if self.need_lists:
                self.create_render_newlist()

            #self.lock.acquire()
                

            glLoadIdentity()
        #Put camera and light in the correct position
            self.camera.move()
            self.camera.renderRotateCamera()
            self.camera.renderTranslateCamera()

            glEnable(GL_LIGHTING)
            glEnable(GL_LIGHT0)
            glEnable(GL_LIGHT1)
            self.renderLightSource()
            
            for index in self.land_index_list:
            #print "INDEX:", index
                glCallList(index)

            for index in self.water_index_list:
                glCallList(index)

            for index in self.building_index_list:
                glCallList(index[0])
            
            
            glDisable(GL_TEXTURE_2D)
            glutSwapBuffers()

    def renderLightSource(self):
        '''Resets the light sources to the right position.'''
        if self.camera.pos_Y <= self.convert.sea_level:
            glLightfv(GL_LIGHT0, GL_DIFFUSE, (0, .2, 1, 1))
        else:
            glLightfv(GL_LIGHT0, GL_DIFFUSE, (1, 1, 1, 1))
        glLightfv(GL_LIGHT0, GL_POSITION, self.diffuse_pos1)

       
    def mouseMove(self, x, y):
        '''Called when the mouse is moved.'''
        factor = 3
        
        tmp_x = (self.camera.mouse_x - x)/factor
        tmp_y = (self.camera.mouse_y - y)/factor
        if tmp_x > self.camera.ROTATE:
            tmp_x = self.camera.ROTATE
        self.camera.rotate(tmp_y, tmp_x, 0)
        x = self.WINDOW_WIDTH/2
        y = self.WINDOW_HEIGHT/2
        glutWarpPointer(x, y)
        self.camera.mouse_x = x
        self.camera.mouse_y = y
        
    def keyPressed(self, key, x, y):
        '''Called when a key is pressed.'''
        if key.lower() in self.camera.keys:
            self.camera.keys[key.lower()] = True
        if glutGetModifiers() == GLUT_ACTIVE_SHIFT:
            self.camera.keys["shift"] = True
        if key == 'p' and not self.poly_view:
            glPolygonMode(GL_FRONT_AND_BACK, GL_LINE)
            self.poly_view = True
        elif key == 'p' and self.poly_view:
            glPolygonMode(GL_FRONT_AND_BACK, GL_FILL)
            self.poly_view = False
        elif key == 't':
            exit(9)
        if key.lower() == 'q':
            self.camera.WALK *= 1.2
            self.camera.SPRINT *= 1.2
        if key.lower() == 'e':
            self.camera.WALK *= .8
            self.camera.SPRINT *= .8

    def keyUp(self, key, x, y):
        '''Called when a key is released.'''
        self.camera.keys[key.lower()] = False
        if not glutGetModifiers() == GLUT_ACTIVE_SHIFT:
            self.camera.keys["shift"] = False
コード例 #4
0
class TestRender:
    '''This is the class that renders maze.
    Camera angles are handled by Camera.py.
    '''
    WINDOW_WIDTH = 700
    WINDOW_HEIGHT = 700
    SCALE = .5
    MAP_SIZE =100
    X_FACTOR = 1
    Y_FACTOR = 1
    Z_FACTOR = 1
    MAP_SIZE = 100
    SEA_LEVEL = 4

    def __init__(self):
        self.set_up_graphics()
        self.load_object()
	self.set_up_glut()
        self.camera = Camera(0,60,0)
	self.camera.rotate(-75,-150,0)
	self.poly_view = False	
        self.start_loop()


    def set_up_glut(self):
        glutIdleFunc(self.display)
        glutDisplayFunc(self.display)

        glutIgnoreKeyRepeat(GLUT_KEY_REPEAT_OFF)
        glutKeyboardFunc(self.keyPressed)
        glutKeyboardUpFunc(self.keyUp)

        glutSetCursor(GLUT_CURSOR_NONE)
        glutPassiveMotionFunc(self.mouseMove)
	
	#glGenLists(50)
	#glNewList(1, GL_COMPILE)
	#glNewList(1, GL_COMPILE)
    
    def start_loop(self):	
	glutMainLoop()

    def set_up_graphics(self):
        glutInit()
        glutInitDisplayMode(GLUT_DOUBLE | GLUT_RGB | GLUT_DEPTH)
        glutInitWindowSize(self.WINDOW_WIDTH, self.WINDOW_HEIGHT)
        glutCreateWindow('Terrains!')

        glMatrixMode(GL_PROJECTION)

        gluPerspective(45,1,.1,500)
        glMatrixMode(GL_MODELVIEW)

        glBlendFunc (GL_SRC_ALPHA, GL_ONE_MINUS_SRC_ALPHA)
        glEnable (GL_BLEND)
        
        
        glClearColor(.529,.8078,.980,0)
        glEnable(GL_NORMALIZE)

        glEnable (GL_DEPTH_TEST)

        #glPolygonMode(GL_FRONT_AND_BACK, GL_LINE)
    
    def load_object(self):
        self.load = Structure()
        self.structure = self.load.create_structure()

    def load_object2(self):
        self.load = Grass()
        self.structure = self.load.create_grass_list()

    def display(self, x=0, y=0):

        glClear(GL_COLOR_BUFFER_BIT | GL_DEPTH_BUFFER_BIT)
        glLoadIdentity()
        #Put camera and light in the correct position
        self.camera.move()
	self.camera.renderRotateCamera()
        self.camera.renderTranslateCamera()
        glCallList(self.structure)
	
        
        glDisable(GL_TEXTURE_2D)
        glutSwapBuffers()
       
    def mouseMove(self, x, y):
        '''Called when the mouse is moved.'''
        factor = 2
        
        tmp_x = (self.camera.mouse_x - x)/factor
        tmp_y = (self.camera.mouse_y - y)/factor
        if tmp_x > self.camera.ROTATE:
            tmp_x = self.camera.ROTATE
        self.camera.rotate(tmp_y, tmp_x, 0)
        x = self.WINDOW_WIDTH/2
        y = self.WINDOW_HEIGHT/2
        glutWarpPointer(x, y)
        self.camera.mouse_x = x
        self.camera.mouse_y = y
        
    def keyPressed(self, key, x, y):
        '''Called when a key is pressed.'''
        if key.lower() in self.camera.keys:
            self.camera.keys[key.lower()] = True
        if glutGetModifiers() == GLUT_ACTIVE_SHIFT:
            self.camera.keys["shift"] = True
        if key == 'p' and not self.poly_view:
            glPolygonMode(GL_FRONT_AND_BACK, GL_LINE)
            self.poly_view = True
        elif key == 'p' and self.poly_view:
            glPolygonMode(GL_FRONT_AND_BACK, GL_FILL)
            self.poly_view = False
        elif key == 't':
            exit(0)
        if key.lower() == 'q':
            self.camera.WALK *= 1.2
            self.camera.SPRINT *= 1.2
        if key.lower() == 'e':
            self.camera.WALK *= .8
            self.camera.SPRINT *= .8

    def keyUp(self, key, x, y):
        '''Called when a key is released.'''
        self.camera.keys[key.lower()] = False
        if not glutGetModifiers() == GLUT_ACTIVE_SHIFT:
            self.camera.keys["shift"] = False
コード例 #5
0
ファイル: LivePlot.py プロジェクト: ngieseker/Vision-System
class LivePlot(pyglet.window.Window):
    ## Setup Functions --------------------------------------------------------
    def __init__(self, server, *args, **kwargs):
        super(LivePlot, self).__init__(*args, **kwargs)
        
        self.keyboard = key.KeyStateHandler()
        self.push_handlers(self.keyboard)
        
        self.setup_context()
        self.setup_scene()

        self.frequency = 60.5
        pyglet.clock.schedule_interval(self.step, 1/self.frequency)
        
        self.sock = socket.socket(socket.AF_INET, socket.SOCK_STREAM)
        self.sock.connect(server)

    def setup_context(self):
        glClearColor(0, 0, 0, 1)

        glEnable(GL_DEPTH_TEST)
        glDepthMask(GL_TRUE)
        
        glDisable(GL_CULL_FACE)

        glEnable(GL_BLEND)
        glBlendFunc(GL_SRC_ALPHA, GL_ONE_MINUS_SRC_ALPHA)

        #glEnable(GL_MULTISAMPLE_ARB)
        glHint(GL_PERSPECTIVE_CORRECTION_HINT, GL_NICEST)
        
        glEnable(GL_POLYGON_SMOOTH)
        glHint(GL_POLYGON_SMOOTH_HINT, GL_NICEST)
        glEnable(GL_POINT_SMOOTH)
        glHint(GL_POINT_SMOOTH_HINT, GL_NICEST)
        
        #glEnable(GL_LINE_SMOOTH)
        #glHint(GL_LINE_SMOOTH_HINT, GL_NICEST)

    def setup_scene(self):
        self.fps = []
        self.fps_display = pyglet.text.Label(
                '',
                font_name = 'Courier', font_size = 16, bold = True,
                color = (255, 255, 255, 100),
                x = 5, y = 0,
                anchor_x = 'left', anchor_y = 'bottom'
        )
        
        self.camera_mode_display = pyglet.text.Label(
                '',
                font_name = 'Courier', font_size = 16, bold = True,
                color = (255, 255, 255, 200),
                x = 0, y = 0,
                anchor_x = 'right', anchor_y = 'bottom'
        )

        self.camera = Camera(50, [[1],[1],[3000]])
        self.set_exclusive_mouse(True)
        self.camera.look_at(np.array([[0],[0],[0]]))

        self.cameras = []
        self.markers = []
        
        self.cur_view = -1

        self.batch        = pyglet.graphics.Batch()
        self.background   = pyglet.graphics.OrderedGroup(0)
        self.foreground   = pyglet.graphics.OrderedGroup(1)
        
        self.floor_grid   = self.batch.add(1, pyglet.gl.GL_LINES,  self.background, 'v3f', 'c4f')
        self.axes         = self.batch.add(1, pyglet.gl.GL_LINES,  self.foreground, 'v3f', 'c4f')
        self.camera_cones = self.batch.add(1, pyglet.gl.GL_LINES,  self.foreground, 'v3f', 'c4f')
        self.markers      = self.batch.add(1, pyglet.gl.GL_POINTS, self.foreground, 'v3f', 'c4f')

        floor_grid = gridLines((-80000, -80000, 0), (160000, 160000, 0), (1000, 1000), [0.15, 0.15, 0.15, 1])
        self.floor_grid.resize(len(floor_grid[0]) // 3)
        self.floor_grid.vertices = floor_grid[0]
        self.floor_grid.colors   = floor_grid[1]
        
        axes = drawAxes((0, 0, 0), 1000)
        self.axes.resize(len(axes[0]) // 3)
        self.axes.vertices = axes[0]
        self.axes.colors   = axes[1]


    ## Step function, called every tick ---------------------------------------
    def step(self, dt):
        self.fps.append(1/dt)
        self.fps = self.fps[int(-self.frequency):]
        self.fps_display.text = '{:.2f}'.format(sum(self.fps)/len(self.fps))
        
        if self.camera.mode == Camera.FREE:
            self.camera_mode_display.text = "FREE"
        elif self.camera.mode == Camera.FOLLOW:
            self.camera_mode_display.text = "FOLLOW"
        elif self.camera.mode == Camera.XY:
            self.camera_mode_display.text = "XY"
        elif self.camera.mode == Camera.FIXED:
            self.camera_mode_display.text = "FIXED"
        
        ready,_,_ = select.select([self.sock], [], [], 0)
        #ready = False
        if ready:
            msg = getMessage(ready[0])

            for t,d in msg.iteritems():
                if t == "cameras":
                    self.cameras = d
                    self.camera.update_views(self.cameras)
                    
                    cone_color_cycle = [[1.0, 0.3, 0.3, 0.3], \
                                        [0.3, 1.0, 0.3, 0.3], \
                                        [0.3, 0.3, 1.0, 0.3]]
                    area_color_cycle = [[1.0, 0.3, 0.3, 0.5], \
                                        [0.3, 1.0, 0.3, 0.5], \
                                        [0.3, 0.3, 1.0, 0.5]]
                    
                    verts  = []
                    colors = []
                    for cam in d:
                        v,c = drawCameraCone(cam, cone_color_cycle[0], area_color_cycle[0])
                        verts  += v
                        colors += c
                        
                        cone_color_cycle = cone_color_cycle[1:] + cone_color_cycle[:1]
                        area_color_cycle = area_color_cycle[1:] + area_color_cycle[:1]
                    
                    self.camera_cones.resize(len(verts) // 3)
                    self.camera_cones.vertices = verts
                    self.camera_cones.colors   = colors
                        
                elif t == "markers":
                    markers = []
                    for m in d:
                        markers += list(m['mark'])
                        
                    self.markers.resize(len(d))
                    self.markers.vertices = markers
                    self.markers.colors   = [0, 0, 1, 1] * len(d)
        
        
        vc = np.array([[6000 * dt], [6000 * dt], [6000 * dt]])
        vc *= np.array([[self.keyboard[key.W]      - self.keyboard[key.S]], \
                        [self.keyboard[key.D]      - self.keyboard[key.A]], \
                        [self.keyboard[key.LSHIFT] - self.keyboard[key.LCTRL]]])
        
        self.camera.translate(vc)

            
        # Hack for pyglet bug
        try:
            self.switch_to()
            self.dispatch_event('on_draw')
            self.flip()
        except AttributeError:
            pass


    ## Rendering --------------------------------------------------------------
    def render(self):
        w,h = self.get_size()
        self.camera.prerender(w, h)
        
        rot = time.time() * 0.5
        
        glLineWidth(1)
        glPointSize(10)
        glDisable(GL_DEPTH_TEST)
        self.batch.draw()
        
        self.camera.postrender()
        
    def render_2d(self):
        glMatrixMode(GL_PROJECTION)
        glPushMatrix()
        glLoadIdentity()
        
        w,h = self.get_size()
        glOrtho(0, w, 0, h, -1.0, 2.0)
        
        glMatrixMode(GL_MODELVIEW)
        glPushMatrix()
        glLoadIdentity()
        
        ## Draw Text
        glDisable(GL_DEPTH_TEST)
        self.fps_display.draw()
        self.camera_mode_display.draw()
        glEnable(GL_DEPTH_TEST)
        
        glPopMatrix()
        
        glMatrixMode(GL_PROJECTION)
        glPopMatrix()


    ## Events -----------------------------------------------------------------
    ## Input events
    def on_key_press(self, symbol, modifiers):
        pass
    
    def on_key_release(self, symbol, modifiers):
        if symbol == key.ESCAPE:
            self.close()
        elif symbol == key.F:
            if not self.fullscreen:
                pos = self.get_location()
                screens = pyglet.window.get_platform().get_default_display().get_screens()
                
                for s in screens:
                    if pos[0] >= s.x and \
                       pos[0] < s.x + s.width and \
                       pos[1] >= s.y and \
                       pos[1] < s.y + s.height:
                           screen = s
                           break
                    
                self.set_fullscreen(True, screen)
            else:
                self.set_fullscreen(False)
        elif symbol == key._1:
            self.camera.set_mode(Camera.FREE)
            self.set_exclusive_mouse(True)
        elif symbol == key._2:
            self.camera.set_mode(Camera.FOLLOW)
            self.set_exclusive_mouse(False)
        elif symbol == key._3:
            self.camera.set_mode(Camera.XY)
            self.set_exclusive_mouse(False)
        elif symbol == key._4:
            self.camera.set_mode(Camera.FIXED)
            self.set_exclusive_mouse(False)
        elif symbol == key.SPACE:
            self.camera.next_view()
    
    def on_mouse_motion(self, x, y, dx, dy):
        self.camera.rotate(-dx/700, dy/700)
    
    
    ## Window events
    def on_resize(self, width, height):
        glViewport(0, 0, width, height)
        glMatrixMode(GL_PROJECTION)
        glLoadIdentity()
        
        fov = 50
        aspect = width / height

        if width < height:
            fov = 360/math.pi * math.atan(math.tan(fov * math.pi/360) / aspect)
                    
        gluPerspective(fov, aspect, 0.1, 200000)
        
        glMatrixMode(GL_MODELVIEW)
        glLoadIdentity()
        
        # Update text labels
        self.camera_mode_display.x = width - 5

        return pyglet.event.EVENT_HANDLED

    def on_draw(self):
        glClear(GL_COLOR_BUFFER_BIT | GL_DEPTH_BUFFER_BIT)
        
        self.render()
        self.render_2d()