Skip to content

Commit 2c927b1

Browse files
authored
Merging development branch with the master. Updating the master branch to v1.1
Merging the developed version with the main branch
2 parents 17dbea8 + 593874e commit 2c927b1

21 files changed

+288
-122
lines changed

src/gdf/__init__.py

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -12,7 +12,7 @@
1212

1313

1414
# Получить версию библиотеки:
15-
def get_version() -> str: return "v1.0-release"
15+
def get_version() -> str: return "v1.1-release"
1616

1717

1818
# Получить полное название системы:

src/gdf/audio/al.py

Lines changed: 14 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -7,6 +7,18 @@
77
import openal as al
88
from openal import alc
99

10+
11+
# Флаг о том, что openal был закрыт:
12+
_opengl_quited_ = False
13+
14+
15+
# Закрыть OpenAL:
16+
def al_quit() -> None:
17+
global _opengl_quited_
18+
if _opengl_quited_: return
19+
_opengl_quited_ = True
20+
al.oalQuit()
21+
22+
1023
# Если наша программа вылетит из за ошибки, то перед её завершением, выполним функцию ниже в любом случае:
11-
import atexit
12-
atexit.register(al.oalQuit)
24+
import atexit ; atexit.register(al_quit)

src/gdf/audio/environment.py

Lines changed: 4 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -11,9 +11,10 @@
1111

1212
# Класс звукового окружения:
1313
class SoundEnvironment:
14-
def __init__(self, listener: Listener) -> None:
14+
def __init__(self, listener: Listener, volume: float = 1.0) -> None:
1515
self.listener = listener # Слушатель.
1616
self.sounds = [] # Список звуков.
17+
self.volume = volume # Громкость всех звуков в окружении.
1718

1819
# Обновление среды:
1920
def update(self) -> "SoundEnvironment":
@@ -22,7 +23,8 @@ def update(self) -> "SoundEnvironment":
2223
distance = length(self.listener.position.xy-sound.get_position().xy)
2324
min_dst, max_dst, rolloff = sound.get_min_distance(), sound.get_max_distance(), sound.get_rolloff_factor()
2425
normal_val = (distance-max_dst)/(min_dst-max_dst) if min_dst != max_dst else distance-min_dst
25-
sound.set_volume(smoothstep(0.0, 1.0, normal_val**rolloff if distance < max_dst else 0.0))
26+
volume = smoothstep(0.0, 1.0, normal_val**rolloff if distance < max_dst else 0.0)
27+
sound.set_volume(max(volume*float(self.volume), 0.0))
2628
return self
2729

2830
# Добавить новый звук в окружающую среду:

src/gdf/audio/sound.py

Lines changed: 5 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -10,16 +10,18 @@
1010

1111
# Класс звука:
1212
class Sound:
13-
def __init__(self) -> None:
13+
def __init__(self, file_path: str = None) -> None:
14+
self.path = file_path
1415
self.sound = None
1516
self._is_playing_ = False
1617
self._is_paused_ = False
1718
self._is_loop_ = False
1819

1920
# Загрузить звук:
20-
def load(self, file_path: str) -> "Sound":
21+
def load(self, file_path: str = None) -> "Sound":
22+
self.path = file_path if isinstance(file_path, str) else self.path
2123
# Пытаемся загрузить:
22-
try: self.sound = al.oalOpen(file_path)
24+
try: self.sound = al.oalOpen(file_path if isinstance(file_path, str) else self.path)
2325
except Exception as error:
2426
raise Exception(f"Error in \"Sound.load()\": {error}\n")
2527
self.set_min_distance(100.0)

src/gdf/setup.bat renamed to src/gdf/compile.bat

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -3,7 +3,7 @@
33
echo COMPILING CYTHON FILES:
44
echo.
55

6-
python setup.py build_ext --inplace
6+
python compile.py build_ext --inplace
77

88
echo.
99
pause

src/gdf/setup.py renamed to src/gdf/compile.py

Lines changed: 15 additions & 9 deletions
Original file line numberDiff line numberDiff line change
@@ -1,5 +1,5 @@
11
#
2-
# setup.py - В основном нужен для компиляции Cython файлов и для прочих настроек ядра.
2+
# compile.py - В основном нужен для компиляции Cython файлов и для прочих настроек ядра.
33
#
44
# Запуск этого скрипта: python setup.py build_ext --inplace
55
#
@@ -8,6 +8,7 @@
88
# Импортируем:
99
import os
1010
import glob
11+
import numpy
1112
import shutil
1213
from setuptools import setup, Extension
1314
from Cython.Build import cythonize
@@ -40,15 +41,20 @@ def clear() -> None:
4041
pyx_file = file[:-4] + ".pyx"
4142
os.rename(file, pyx_file) # Переименовать .cyt в .pyx
4243

44+
4345
# Устанавливаем ядро:
44-
setup(
45-
ext_modules=cythonize([
46-
Extension(
47-
name=os.path.splitext(os.path.relpath(file))[0].replace(os.path.sep, "."),
48-
sources=[file]
49-
) for file in find_files("pyx")
50-
])
51-
)
46+
try:
47+
setup(
48+
ext_modules=cythonize([
49+
Extension(
50+
name=os.path.splitext(os.path.relpath(file))[0].replace(os.path.sep, "."),
51+
sources=[file],
52+
include_dirs=[numpy.get_include()]
53+
) for file in find_files("pyx")
54+
])
55+
)
56+
except Exception as error: pass
57+
5258

5359
# Переименовать файлы обратно из .pyx в .cyt:
5460
for file in find_files("pyx"):

src/gdf/files.py

Lines changed: 13 additions & 7 deletions
Original file line numberDiff line numberDiff line change
@@ -5,6 +5,7 @@
55

66
# Импортируем:
77
import os
8+
import io
89
import json
910
import pygame
1011
import zipfile
@@ -39,7 +40,8 @@ def save_texture(file_path: str, texture: Texture) -> None:
3940

4041

4142
# Загружаем файл:
42-
def load_file(file_path: str, mode: str = "r+", encoding: str = "utf-8") -> str:
43+
def load_file(file_path: str | io.BytesIO, mode: str = "r+", encoding: str = "utf-8") -> str:
44+
if isinstance(file_path, io.BytesIO): return file_path.getvalue().decode(encoding)
4345
with open(file_path, mode, encoding=encoding) as f: return str(f.read())
4446

4547

@@ -79,16 +81,20 @@ def load_font(file_path: str) -> FontFile:
7981

8082

8183
# Создаем zip-файл и добавляем файлы и папки из списка:
82-
def create_zip_file(file_path: str, file_folder_list: list) -> None:
83-
with zipfile.ZipFile(file_path, "w") as zipf:
84+
def create_zip_file(file_path: str, file_folder_list: list | str) -> None:
85+
if isinstance(file_folder_list, str): file_folder_list = [file_folder_list]
86+
87+
with zipfile.ZipFile(file_path, "w", zipfile.ZIP_DEFLATED) as zipf:
8488
for item in file_folder_list:
85-
if os.path.isfile(item):
86-
zipf.write(item, os.path.basename(item))
89+
if os.path.isfile(item): zipf.write(item, os.path.basename(item))
8790
elif os.path.isdir(item):
91+
# Обходим все подкаталоги и файлы:
8892
for root, dirs, files in os.walk(item):
8993
for file in files:
90-
file_path = os.path.join(root, file)
91-
zipf.write(file_path, os.path.relpath(file_path, os.path.join(item, "..")))
94+
current_file_path = os.path.join(root, file)
95+
# Проверяем, чтобы не добавлять сам архив в себя:
96+
if os.path.abspath(current_file_path) != os.path.abspath(file_path):
97+
zipf.write(current_file_path, os.path.relpath(current_file_path, os.path.join(item, "..")))
9298

9399

94100
# Извлекаем файлы из zip-файла:

src/gdf/graphics/__init__.py

Lines changed: 6 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -11,7 +11,12 @@
1111
# Ускоренная функция поворота вершин полигона спрайта:
1212
try:
1313
# Импортируем скомпилированную библиотеку графических утилит:
14-
from .graphics_utils import _rot2d_vertices_rectangle_, _convert_quads_to_triangles_
14+
from .graphics_utils import (
15+
_rot2d_vertices_rectangle_,
16+
_convert_quads_to_triangles_,
17+
_render_sprite_batch_2d_,
18+
_render_atlas_texture_batch_2d_
19+
)
1520
except (ModuleNotFoundError, ImportError) as error:
1621
raise Exception(f"The compiled module could not be imported: {error}")
1722

src/gdf/graphics/batch.py

Lines changed: 7 additions & 33 deletions
Original file line numberDiff line numberDiff line change
@@ -9,7 +9,7 @@
99
from .sprite import Sprite2D
1010
from .texture import Texture
1111
from .atlas import AtlasTexture
12-
from . import _rot2d_vertices_rectangle_
12+
from . import _rot2d_vertices_rectangle_, _render_sprite_batch_2d_, _render_atlas_texture_batch_2d_
1313
from ..math import *
1414
from ..utils import *
1515

@@ -38,8 +38,8 @@ def draw(self,
3838
sprite: Sprite2D | Texture,
3939
x: float,
4040
y: float,
41-
width: int,
42-
height: int,
41+
width: float,
42+
height: float,
4343
angle: float = 0.0,
4444
cull_sprites: bool = False
4545
) -> "SpriteBatch2D":
@@ -95,21 +95,8 @@ def render(self, color: list = None, clear_batch: bool = True) -> "SpriteBatch2D
9595

9696
gl.glColor(*[1, 1, 1] if color is None else color)
9797

98-
gl.glEnable(gl.GL_TEXTURE_2D)
99-
gl.glEnableClientState(gl.GL_VERTEX_ARRAY)
100-
gl.glEnableClientState(gl.GL_TEXTURE_COORD_ARRAY)
101-
102-
# Пройдитесь по каждой текстуре и отрендерьте все квадраты с этой текстурой:
103-
for texture, vertices in self.texture_batches.items():
104-
gl.glBindTexture(gl.GL_TEXTURE_2D, texture)
105-
gl.glVertexPointer(2, gl.GL_DOUBLE, 0, numpy.array(vertices))
106-
gl.glTexCoordPointer(2, gl.GL_DOUBLE, 0, numpy.array([0, 1, 1, 1, 1, 0, 0, 0] * (len(vertices) // 8)))
107-
gl.glDrawArrays(gl.GL_QUADS, 0, len(vertices) // 2)
108-
gl.glBindTexture(gl.GL_TEXTURE_2D, 0)
109-
110-
gl.glDisableClientState(gl.GL_TEXTURE_COORD_ARRAY)
111-
gl.glDisableClientState(gl.GL_VERTEX_ARRAY)
112-
gl.glDisable(gl.GL_TEXTURE_2D)
98+
# Рисуем пакет спрайтов через ускоренную функцию Cython:
99+
_render_sprite_batch_2d_(self.texture_batches)
113100

114101
if clear_batch: self.texture_batches.clear()
115102

@@ -197,21 +184,8 @@ def render(self, color: list = None, clear_batch: bool = True) -> "AtlasTextureB
197184

198185
gl.glColor(*[1, 1, 1] if color is None else color)
199186

200-
gl.glEnable(gl.GL_TEXTURE_2D)
201-
gl.glEnableClientState(gl.GL_VERTEX_ARRAY)
202-
gl.glEnableClientState(gl.GL_TEXTURE_COORD_ARRAY)
203-
204-
# Пройдитесь по каждой текстуре и отрендерьте все квадраты с этой текстурой:
205-
for texture, (vertices, texcoords) in self.texture_batches.items():
206-
gl.glBindTexture(gl.GL_TEXTURE_2D, texture)
207-
gl.glVertexPointer(2, gl.GL_DOUBLE, 0, numpy.array(vertices))
208-
gl.glTexCoordPointer(2, gl.GL_DOUBLE, 0, numpy.array(texcoords))
209-
gl.glDrawArrays(gl.GL_QUADS, 0, len(vertices) // 2)
210-
gl.glBindTexture(gl.GL_TEXTURE_2D, 0)
211-
212-
gl.glDisableClientState(gl.GL_TEXTURE_COORD_ARRAY)
213-
gl.glDisableClientState(gl.GL_VERTEX_ARRAY)
214-
gl.glDisable(gl.GL_TEXTURE_2D)
187+
# Рисуем пакет спрайтов через ускоренную функцию Cython:
188+
_render_atlas_texture_batch_2d_(self.texture_batches)
215189

216190
if clear_batch: self.texture_batches.clear()
217191

src/gdf/graphics/buffers.py

Lines changed: 8 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -65,9 +65,14 @@ class FrameBuffer:
6565
def __init__(self, texture_id: int) -> None:
6666
self.id = gl.glGenFramebuffers(1)
6767
self._id_before_begin_ = gl.glGetIntegerv(gl.GL_FRAMEBUFFER_BINDING)
68-
gl.glBindFramebuffer(gl.GL_FRAMEBUFFER, self.id)
69-
gl.glFramebufferTexture2D(gl.GL_FRAMEBUFFER, gl.GL_COLOR_ATTACHMENT0, gl.GL_TEXTURE_2D, texture_id, 0)
70-
gl.glBindFramebuffer(gl.GL_FRAMEBUFFER, self._id_before_begin_)
68+
self.attach_texture(texture_id, gl.GL_COLOR_ATTACHMENT0)
69+
70+
# Привязать текстуру к фреймбуферу:
71+
def attach_texture(self, texture_id: int, attach_type: int = gl.GL_COLOR_ATTACHMENT0) -> "FrameBuffer":
72+
self.begin()
73+
gl.glFramebufferTexture2D(gl.GL_FRAMEBUFFER, attach_type, gl.GL_TEXTURE_2D, texture_id, 0)
74+
self.end()
75+
return self
7176

7277
# Использовать буфер:
7378
def begin(self) -> "FrameBuffer":

0 commit comments

Comments
 (0)