summaryrefslogtreecommitdiff
path: root/txtgameengine/app.py
diff options
context:
space:
mode:
Diffstat (limited to 'txtgameengine/app.py')
-rw-r--r--txtgameengine/app.py131
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()