Example #1
0
class Display(object):
    '''
    Handles the rendering
    '''


    def __init__(self, size):
        '''
        Constructor
        '''
        
        self.size = size
        self.ctx = None
        
    def setup_opencl(self):
        platforms = cl.get_platforms()
        if not platforms:
            raise OpenCLError("No OpenCL platforms found.")
        self.ctx =   cl.Context(platforms[0].get_devices(device_type=cl.device_type.GPU))
        self.queue = cl.CommandQueue(self.ctx)
        
    def setup_kernels(self):
        self.cl_program = build_program(self.ctx, "kernels")
        self.raytrace = self.cl_program.raytrace
        self.init_chunk_array = self.cl_program.init_chunk_array
        
    def setup_scene(self):
        self.scene = Scene(self.ctx, self.queue)
        
        self._h_img_canvas = numpy.empty((self.size[0]*4, self.size[1]), dtype=numpy.ubyte)
        im_format = cl.ImageFormat(cl.channel_order.RGBA, cl.channel_type.UNORM_INT8)
        self._d_img_canvas = cl.Image(self.ctx, cl.mem_flags.WRITE_ONLY, im_format, self.size)
        
    def setup_pygame(self):
        pygame.init()
        self.surface = pygame.display.set_mode(self.size)
        
    def init_chunk_array(self):
        self.init_chunk_array(self.queue, )
        
    def render(self):
        self.scene.upload_buffers()
        self.raytrace(self.queue, (16, 4), self.size, self._d_img_canvas, self.scene._cam_buffer)
        
        cl.enqueue_copy(self.queue, self._h_img_canvas, self._d_img_canvas)
        self.surface.blit(pygame.image.fromstring(self._h_img_canvas.tostring(), self.size, 'RGBA'), (0,0))
        
    def render_loop(self):
        self.setup_opencl()
        
        self.setup_kernels()
        self.setup_scene()
        
        self.setup_pygame()
        
        self.render()
        
        clock = pygame.time.Clock()
        while True:
            elapsed = clock.tick(30)/1000.0
            
            for event in pygame.event.get():
                if event.type == pygame.QUIT:
                    return
            
            self.render()