diff options
Diffstat (limited to 'txtgameengine/app.py')
| -rw-r--r-- | txtgameengine/app.py | 131 | 
1 files changed, 10 insertions, 121 deletions
| diff --git a/txtgameengine/app.py b/txtgameengine/app.py index a8c9913..e651078 100644 --- a/txtgameengine/app.py +++ b/txtgameengine/app.py @@ -1,123 +1,8 @@ -import glfw -from vulkan import *  import time +from .platform import PlatformComponent -class PlatformError(Exception): -    pass - - -class QueueFamilies: -    graphics_i: int -    graphics: object - - -class PlatformComponent: -    def __init__(self, app: 'TxtGameApp'): -        self.app = app - -    def init(self): -        glfw.init() -        self.init_vulkan() -        self.init_window() - -    def init_vulkan(self): -        self.create_instance() -        self.pick_physical_device() -        self.create_logical_device() - -    def is_device_suitable(self, device): -        return 1 - -    def pick_physical_device(self): -        devices = [(d, self.is_device_suitable(d)) -                   for d in vkEnumeratePhysicalDevices(self.instance)] -        if len(devices) == 0: -            raise PlatformError("No vulkan devices available.") -        device, rating = sorted(devices, key=lambda x: x[1])[-1] -        if rating < 0: -            raise PlatformError("No suitable devices available.") -        self.physical_device = device -        self.find_queue_families() - -    def find_queue_families(self): -        self.queues = QueueFamilies() -        for i, queue_family in enumerate(vkGetPhysicalDeviceQueueFamilyProperties(self.physical_device)): -            if queue_family.queueFlags & VK_QUEUE_GRAPHICS_BIT: -                self.queues.graphics_i = i - -    def create_logical_device(self): -        queue_create_info = [VkDeviceQueueCreateInfo( -            queueFamilyIndex=self.queues.graphics_i, -            queueCount=1, -            pQueuePriorities=[1], -            flags=0, -        )] -        device_create = VkDeviceCreateInfo( -            pQueueCreateInfos=queue_create_info, -            pEnabledFeatures=vkGetPhysicalDeviceFeatures(self.physical_device), -            flags=0, -            ppEnabledLayerNames=self.layers, -            ppEnabledExtensionNames=[], -        ) -        self.logical_device = vkCreateDevice( -            self.physical_device, device_create, None) -        self.queues.graphic = vkGetDeviceQueue( -            device=self.logical_device, -            queueFamilyIndex=self.queues.graphics_i, -            queueIndex=0, -        ) - -    def create_instance(self): -        app_info = VkApplicationInfo( -            pApplicationName=self.app.name, -            applicationVersion=VK_MAKE_VERSION(1, 0, 0), -            pEngineName="TxtGameEngine", -            engineVersion=VK_MAKE_VERSION(1, 0, 0), -            apiVersion=VK_API_VERSION_1_0, -        ) -        extensions = glfw.get_required_instance_extensions() -        present_layers = vkEnumerateInstanceLayerProperties() -        missing_layers = set(self.app.requested_validation_layers) - \ -            set(l.layerName for l in present_layers) -        if missing_layers: -            raise PlatformError( -                "Missing validation layers: "+str(missing_layers)) -        self.layers = self.app.requested_validation_layers -        createInfo = VkInstanceCreateInfo( -            pApplicationInfo=app_info, -            flags=0, -            enabledExtensionCount=len(extensions), -            ppEnabledExtensionNames=extensions, -            enabledLayerCount=len(self.layers), -            ppEnabledLayerNames=self.layers, -        ) -        self.instance = vkCreateInstance(createInfo, None) - -    def init_window(self): -        glfw.window_hint(glfw.CLIENT_API, glfw.NO_API) -        glfw.window_hint(glfw.RESIZABLE, glfw.FALSE) -        self.window = glfw.create_window( -            *self.app.size, self.app.name, None, None) -        if not self.window: -            raise PlatformError("Failed to initialize glfw window") - -    @property -    def should_close(self) -> bool: -        return glfw.window_should_close(self.window) - -    @should_close.setter -    def should_close(self, val: bool): -        glfw.set_window_should_close(val) - -    def poll_events(self): -        glfw.poll_events() - -    def cleanup(self): -        vkDestroyDevice(self.logical_device) -        vkDestroyInstance(self.instance) -        glfw.destroy_window(window) -        glfw.terminate() +EPSILON = 1.e-10  class TxtGameApp: @@ -126,17 +11,21 @@ class TxtGameApp:      def __init__(self, size: (int, int), name: str):          self.size = size          self.name = name -        self.platform: self.PLATFORM_CLASS = self.PLATFORM_CLASS(self) +        self.platform = self.PLATFORM_CLASS(self)          self.requested_validation_layers = []      def start(self):          self.platform.init() -        last_update_time = time.monotonic() +        self.platform.set_clear_color(1, 0, 0.75, 1) +        last_update_time = self.platform.monotonic_time()          while not self.platform.should_close: -            update_time = time.monotonic() +            update_time = self.platform.monotonic_time()              self.platform.poll_events()              self.update(update_time - last_update_time) +            self.platform.swap_buffers()              last_update_time = update_time +        self.platform.cleanup()      def update(self, delta: float): -        raise NotImplementedError +        print("Running: delta = %.4fs, approx. fps = %ds" % (delta, 1. / (delta or EPSILON))) +        self.platform.clear_background() | 
