Rework resources and split main loop.
This commit is contained in:
parent
513d79a67c
commit
af9365c6e0
@ -19,14 +19,15 @@ from engine import (vec3, mat3, buffer,
|
|||||||
INSTANCE_FLAG_SPAWNED, BATCH_MAX_SIZE, param_type, params_format, create_batch, draw_batch, destroy_batch)
|
INSTANCE_FLAG_SPAWNED, BATCH_MAX_SIZE, param_type, params_format, create_batch, draw_batch, destroy_batch)
|
||||||
|
|
||||||
class Batch:
|
class Batch:
|
||||||
__slots__ = '_batch', 'size', 'max_size', 'flags', 'meshes', 'params', '_params', '__dict__'
|
__slots__ = '_batch', 'vertices', 'size', 'max_size', 'flags', 'meshes', 'params', '_params', '__dict__'
|
||||||
|
|
||||||
def __init__(self, vertices, max_size, max_meshes, **params_decls):
|
def __init__(self, vertices, max_size, max_meshes, **params_decls):
|
||||||
assert max_size <= BATCH_MAX_SIZE
|
assert max_size <= BATCH_MAX_SIZE
|
||||||
nparams = len(params_decls)
|
nparams = len(params_decls)
|
||||||
names = params_decls.keys()
|
names = params_decls.keys()
|
||||||
formats = params_decls.values()
|
formats = params_decls.values()
|
||||||
self._batch = create_batch(vertices, max_size, max_meshes, params_format(*formats))
|
self._batch = create_batch(vertices._vertices, max_size, max_meshes, params_format(*formats))
|
||||||
|
self.vertices = vertices
|
||||||
self.size = 0
|
self.size = 0
|
||||||
self.max_size = max_size
|
self.max_size = max_size
|
||||||
self.flags = buffer(c_ubyte, max_size)
|
self.flags = buffer(c_ubyte, max_size)
|
||||||
|
48
game/game.py
48
game/game.py
@ -23,9 +23,10 @@ from game.events import Events
|
|||||||
from game.mouse import Mouse
|
from game.mouse import Mouse
|
||||||
from game.keyboard import Keyboard
|
from game.keyboard import Keyboard
|
||||||
from game.generator import Generator
|
from game.generator import Generator
|
||||||
from game.resources import RuntimeArchive
|
from game.resources import Archive
|
||||||
from game.texture import Texture
|
from game.texture import Texture
|
||||||
from game.shader import Shader
|
from game.shader import Shader
|
||||||
|
from game.vertices import Vertices
|
||||||
from game.camera import Camera
|
from game.camera import Camera
|
||||||
from game.environment import Environment
|
from game.environment import Environment
|
||||||
from game.inputs import InputFloat
|
from game.inputs import InputFloat
|
||||||
@ -60,14 +61,7 @@ def update_sea(time, camera, sea_phase):
|
|||||||
camera.to_km()
|
camera.to_km()
|
||||||
sea_phase.update((time.current * 0.023) % 1.0)
|
sea_phase.update((time.current * 0.023) % 1.0)
|
||||||
|
|
||||||
def main():
|
def create_scene(keyboard, mouse):
|
||||||
print("Initializing...")
|
|
||||||
display = create_display(b'RK Island - Drag to rotate, wheel to zoom, q to quit', 1600, 900)
|
|
||||||
events = Events(display)
|
|
||||||
mouse = Mouse(events, wheel = 60, wheel_min = 20)
|
|
||||||
keyboard = Keyboard(events)
|
|
||||||
render_initialize(__debug__)
|
|
||||||
|
|
||||||
tiles_shader = Shader('tiles', 'common')
|
tiles_shader = Shader('tiles', 'common')
|
||||||
tests_shader = Shader('tests', 'common')
|
tests_shader = Shader('tests', 'common')
|
||||||
sea_shader = Shader('sea')
|
sea_shader = Shader('sea')
|
||||||
@ -88,11 +82,11 @@ def main():
|
|||||||
generated.packed_normals)
|
generated.packed_normals)
|
||||||
|
|
||||||
print("Loading resources...")
|
print("Loading resources...")
|
||||||
archive = RuntimeArchive.load('data/rk_island.rkar')
|
archive = Archive.load('data/rk_island.rkar')
|
||||||
|
|
||||||
print("Building tiles...")
|
print("Building tiles...")
|
||||||
tiles_texture = archive.get_texture('tiles')
|
tiles_texture = Texture(*archive.get_texture('tiles'))
|
||||||
tiles_vertices = archive.get_vertices('tiles')
|
tiles_vertices = Vertices(*archive.get_vertices('tiles'))
|
||||||
water_model = archive.get_model('water')
|
water_model = archive.get_model('water')
|
||||||
sand_model = archive.get_model('sand')
|
sand_model = archive.get_model('sand')
|
||||||
grass_model = archive.get_model('grass')
|
grass_model = archive.get_model('grass')
|
||||||
@ -133,8 +127,8 @@ def main():
|
|||||||
model = rock_model
|
model = rock_model
|
||||||
model.spawn(tiles_batch, vec3(float(((mx - 128) * 8) + 4), float(((127 - my) * 8) + 4), 0.0))
|
model.spawn(tiles_batch, vec3(float(((mx - 128) * 8) + 4), float(((127 - my) * 8) + 4), 0.0))
|
||||||
|
|
||||||
tests_texture = archive.get_texture('tests')
|
tests_texture = Texture(*archive.get_texture('tests'))
|
||||||
tests_vertices = archive.get_vertices('tests')
|
tests_vertices = Vertices(*archive.get_vertices('tests'))
|
||||||
blob_model = archive.get_model('blob')
|
blob_model = archive.get_model('blob')
|
||||||
cube_model = archive.get_model('cube')
|
cube_model = archive.get_model('cube')
|
||||||
clouds_model = archive.get_model('clouds')
|
clouds_model = archive.get_model('clouds')
|
||||||
@ -159,7 +153,7 @@ def main():
|
|||||||
sea_detail_texture = sea.load_detail_texture('data/sea_bump.png')
|
sea_detail_texture = sea.load_detail_texture('data/sea_bump.png')
|
||||||
sea_triangles = sea.sea_triangles(64, proj_far_z - 0.1, proj_ratio)
|
sea_triangles = sea.sea_triangles(64, proj_far_z - 0.1, proj_ratio)
|
||||||
|
|
||||||
scene = SceneNode(
|
return SceneNode(
|
||||||
FuncNode(update_camera, (mouse, camera, environment)),
|
FuncNode(update_camera, (mouse, camera, environment)),
|
||||||
TextureNode((tiles_texture, heightmap, normalmap),
|
TextureNode((tiles_texture, heightmap, normalmap),
|
||||||
ShaderNode(tiles_shader,
|
ShaderNode(tiles_shader,
|
||||||
@ -187,31 +181,29 @@ def main():
|
|||||||
)
|
)
|
||||||
)
|
)
|
||||||
|
|
||||||
|
def loop(display):
|
||||||
|
events = Events(display)
|
||||||
|
keyboard = Keyboard(events)
|
||||||
|
mouse = Mouse(events, wheel = 60, wheel_min = 20)
|
||||||
|
scene = create_scene(keyboard, mouse)
|
||||||
print("Running... Ctrl+c to quit")
|
print("Running... Ctrl+c to quit")
|
||||||
time = Time()
|
time = Time()
|
||||||
try:
|
try:
|
||||||
while not keyboard.quit:
|
while not keyboard.quit:
|
||||||
events.update()
|
events.update()
|
||||||
begin_frame()
|
|
||||||
time.update()
|
time.update()
|
||||||
|
begin_frame()
|
||||||
scene.draw(time)
|
scene.draw(time)
|
||||||
end_frame()
|
end_frame()
|
||||||
swap_buffers(display)
|
swap_buffers(display)
|
||||||
except KeyboardInterrupt:
|
except KeyboardInterrupt:
|
||||||
pass
|
pass
|
||||||
|
|
||||||
|
def main():
|
||||||
|
print("Initializing...")
|
||||||
|
display = create_display(b'RK Island - Drag to rotate, wheel to zoom, q to quit', 1600, 900)
|
||||||
|
render_initialize(__debug__)
|
||||||
|
loop(display)
|
||||||
print("Quitting...")
|
print("Quitting...")
|
||||||
del tests_batch
|
|
||||||
del tiles_batch
|
|
||||||
del sea_triangles
|
|
||||||
del sea_polar_textures
|
|
||||||
del sea_detail_texture
|
|
||||||
del heightmap
|
|
||||||
del normalmap
|
|
||||||
archive.destroy()
|
|
||||||
del tiles_shader
|
|
||||||
del tests_shader
|
|
||||||
del sea_shader
|
|
||||||
render_terminate()
|
render_terminate()
|
||||||
del events
|
|
||||||
destroy_display(display)
|
destroy_display(display)
|
||||||
|
@ -16,11 +16,8 @@
|
|||||||
import struct
|
import struct
|
||||||
from array import array
|
from array import array
|
||||||
from pathlib import Path
|
from pathlib import Path
|
||||||
|
|
||||||
import png
|
import png
|
||||||
|
|
||||||
import engine
|
import engine
|
||||||
from game.texture import Texture
|
|
||||||
|
|
||||||
VERTEX_SIZE = 20
|
VERTEX_SIZE = 20
|
||||||
VERTEX_FORMAT = engine.vertex_format(
|
VERTEX_FORMAT = engine.vertex_format(
|
||||||
@ -117,6 +114,14 @@ class TextureData:
|
|||||||
self.flags = flags
|
self.flags = flags
|
||||||
self.pixels = pixels
|
self.pixels = pixels
|
||||||
|
|
||||||
|
def __iter__(self):
|
||||||
|
yield self.format
|
||||||
|
yield self.width
|
||||||
|
yield self.height
|
||||||
|
yield self.nlevels
|
||||||
|
yield self.flags
|
||||||
|
yield self.pixels
|
||||||
|
|
||||||
@classmethod
|
@classmethod
|
||||||
def from_archive(cls, file):
|
def from_archive(cls, file):
|
||||||
_read_magic(file, b'TX')
|
_read_magic(file, b'TX')
|
||||||
@ -133,9 +138,6 @@ class TextureData:
|
|||||||
_write_struct(file, 'IIIII', (self.format, self.width, self.height, self.nlevels, self.flags))
|
_write_struct(file, 'IIIII', (self.format, self.width, self.height, self.nlevels, self.flags))
|
||||||
_write_blob(file, self.pixels)
|
_write_blob(file, self.pixels)
|
||||||
|
|
||||||
def create_texture(data):
|
|
||||||
return Texture(data.format, data.width, data.height, data.nlevels, data.flags, data.pixels)
|
|
||||||
|
|
||||||
class VerticesData:
|
class VerticesData:
|
||||||
__slots__ = 'name', 'vertices', 'indices'
|
__slots__ = 'name', 'vertices', 'indices'
|
||||||
|
|
||||||
@ -146,6 +148,12 @@ class VerticesData:
|
|||||||
self.vertices = vertices
|
self.vertices = vertices
|
||||||
self.indices = indices
|
self.indices = indices
|
||||||
|
|
||||||
|
def __iter__(self):
|
||||||
|
yield VERTEX_FORMAT
|
||||||
|
yield len(self.vertices) // VERTEX_SIZE
|
||||||
|
yield self.vertices
|
||||||
|
yield self.indices
|
||||||
|
|
||||||
@classmethod
|
@classmethod
|
||||||
def from_archive(cls, file):
|
def from_archive(cls, file):
|
||||||
_read_magic(file, b'VT')
|
_read_magic(file, b'VT')
|
||||||
@ -162,9 +170,6 @@ class VerticesData:
|
|||||||
_write_array(file, self.vertices)
|
_write_array(file, self.vertices)
|
||||||
_write_array(file, self.indices)
|
_write_array(file, self.indices)
|
||||||
|
|
||||||
def create_vertices(data):
|
|
||||||
return engine.create_vertices(VERTEX_FORMAT, len(data.vertices) // VERTEX_SIZE, data.vertices, data.indices)
|
|
||||||
|
|
||||||
class ModelData:
|
class ModelData:
|
||||||
__slots__ = 'name', 'flags', 'mesh'
|
__slots__ = 'name', 'flags', 'mesh'
|
||||||
|
|
||||||
@ -185,19 +190,9 @@ class ModelData:
|
|||||||
_write_string(file, self.name)
|
_write_string(file, self.name)
|
||||||
_write_struct(file, 'II', (self.flags, self.mesh))
|
_write_struct(file, 'II', (self.flags, self.mesh))
|
||||||
|
|
||||||
class Model:
|
|
||||||
__slots__ = 'flags', 'mesh'
|
|
||||||
|
|
||||||
def __init__(self, flags, mesh):
|
|
||||||
self.flags = flags
|
|
||||||
self.mesh = mesh
|
|
||||||
|
|
||||||
def spawn(self, batch, *params):
|
def spawn(self, batch, *params):
|
||||||
return batch.append(self.flags, self.mesh, params)
|
return batch.append(self.flags, self.mesh, params)
|
||||||
|
|
||||||
def create_model(data):
|
|
||||||
return Model(data.flags, data.mesh)
|
|
||||||
|
|
||||||
class Archive:
|
class Archive:
|
||||||
__slots__ = 'textures_db', 'vertices_db', 'models_db'
|
__slots__ = 'textures_db', 'vertices_db', 'models_db'
|
||||||
|
|
||||||
@ -206,13 +201,6 @@ class Archive:
|
|||||||
self.vertices_db = vertices_db or {}
|
self.vertices_db = vertices_db or {}
|
||||||
self.models_db = models_db or {}
|
self.models_db = models_db or {}
|
||||||
|
|
||||||
def destroy(self):
|
|
||||||
for vertices in self.vertices_db.values():
|
|
||||||
engine.destroy_vertices(vertices)
|
|
||||||
self.textures_db.clear()
|
|
||||||
self.vertices_db.clear()
|
|
||||||
self.models_db.clear()
|
|
||||||
|
|
||||||
def get_texture(self, name):
|
def get_texture(self, name):
|
||||||
return self.textures_db[name]
|
return self.textures_db[name]
|
||||||
|
|
||||||
@ -222,18 +210,6 @@ class Archive:
|
|||||||
def get_model(self, name):
|
def get_model(self, name):
|
||||||
return self.models_db[name]
|
return self.models_db[name]
|
||||||
|
|
||||||
@classmethod
|
|
||||||
def _new_texture(cls, data):
|
|
||||||
return data
|
|
||||||
|
|
||||||
@classmethod
|
|
||||||
def _new_vertices(cls, data):
|
|
||||||
return data
|
|
||||||
|
|
||||||
@classmethod
|
|
||||||
def _new_model(cls, data):
|
|
||||||
return data
|
|
||||||
|
|
||||||
@classmethod
|
@classmethod
|
||||||
def from_archive(cls, file):
|
def from_archive(cls, file):
|
||||||
textures_db = {}
|
textures_db = {}
|
||||||
@ -243,22 +219,15 @@ class Archive:
|
|||||||
ntextures, nvertices, nmodels = _read_struct(file, 'III')
|
ntextures, nvertices, nmodels = _read_struct(file, 'III')
|
||||||
for _ in range(ntextures):
|
for _ in range(ntextures):
|
||||||
data = TextureData.from_archive(file)
|
data = TextureData.from_archive(file)
|
||||||
textures_db[data.name] = cls._new_texture(data)
|
textures_db[data.name] = data
|
||||||
for _ in range(nvertices):
|
for _ in range(nvertices):
|
||||||
data = VerticesData.from_archive(file)
|
data = VerticesData.from_archive(file)
|
||||||
vertices_db[data.name] = cls._new_vertices(data)
|
vertices_db[data.name] = data
|
||||||
for _ in range(nmodels):
|
for _ in range(nmodels):
|
||||||
data = ModelData.from_archive(file)
|
data = ModelData.from_archive(file)
|
||||||
models_db[data.name] = cls._new_model(data)
|
models_db[data.name] = data
|
||||||
return cls(textures_db, vertices_db, models_db)
|
return cls(textures_db, vertices_db, models_db)
|
||||||
|
|
||||||
@classmethod
|
|
||||||
def load(cls, filename):
|
|
||||||
file = open(Path(filename), 'rb')
|
|
||||||
archive = cls.from_archive(file)
|
|
||||||
file.close()
|
|
||||||
return archive
|
|
||||||
|
|
||||||
def to_archive(self, file):
|
def to_archive(self, file):
|
||||||
_write_magic(file, b'RKAR')
|
_write_magic(file, b'RKAR')
|
||||||
_write_struct(file, 'III', (len(self.textures_db), len(self.vertices_db), len(self.models_db)))
|
_write_struct(file, 'III', (len(self.textures_db), len(self.vertices_db), len(self.models_db)))
|
||||||
@ -269,20 +238,14 @@ class Archive:
|
|||||||
for _, data in self.models_db.items():
|
for _, data in self.models_db.items():
|
||||||
data.to_archive(file)
|
data.to_archive(file)
|
||||||
|
|
||||||
|
@classmethod
|
||||||
|
def load(cls, filename):
|
||||||
|
file = open(Path(filename), 'rb')
|
||||||
|
archive = cls.from_archive(file)
|
||||||
|
file.close()
|
||||||
|
return archive
|
||||||
|
|
||||||
def save(self, filename):
|
def save(self, filename):
|
||||||
file = open(Path(filename), 'wb')
|
file = open(Path(filename), 'wb')
|
||||||
self.to_archive(file)
|
self.to_archive(file)
|
||||||
file.close()
|
file.close()
|
||||||
|
|
||||||
class RuntimeArchive(Archive):
|
|
||||||
@classmethod
|
|
||||||
def _new_texture(cls, data):
|
|
||||||
return create_texture(data)
|
|
||||||
|
|
||||||
@classmethod
|
|
||||||
def _new_vertices(cls, data):
|
|
||||||
return create_vertices(data)
|
|
||||||
|
|
||||||
@classmethod
|
|
||||||
def _new_model(cls, data):
|
|
||||||
return create_model(data)
|
|
||||||
|
25
game/vertices.py
Normal file
25
game/vertices.py
Normal file
@ -0,0 +1,25 @@
|
|||||||
|
# Copyright (C) 2022 RozK
|
||||||
|
#
|
||||||
|
# This program is free software: you can redistribute it and/or modify
|
||||||
|
# it under the terms of the GNU Affero General Public License as published by
|
||||||
|
# the Free Software Foundation, either version 3 of the License, or
|
||||||
|
# (at your option) any later version.
|
||||||
|
#
|
||||||
|
# This program is distributed in the hope that it will be useful,
|
||||||
|
# but WITHOUT ANY WARRANTY; without even the implied warranty of
|
||||||
|
# MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
|
||||||
|
# GNU Affero General Public License for more details.
|
||||||
|
#
|
||||||
|
# You should have received a copy of the GNU Affero General Public License
|
||||||
|
# along with this program. If not, see <http://www.gnu.org/licenses/>.
|
||||||
|
|
||||||
|
from engine import create_vertices, destroy_vertices
|
||||||
|
|
||||||
|
class Vertices:
|
||||||
|
__slots__ = '_vertices'
|
||||||
|
|
||||||
|
def __init__(self, format, nvertices, vertices, indices):
|
||||||
|
self._vertices = create_vertices(format, nvertices, vertices, indices)
|
||||||
|
|
||||||
|
def __del__(self):
|
||||||
|
destroy_vertices(self._vertices)
|
Loading…
Reference in New Issue
Block a user