Skip to content

Commit 8de72a4

Browse files
committed
convert: Refactor AoCMediaSubprocessor into separate files.
1 parent 5ded36e commit 8de72a4

File tree

7 files changed

+248
-183
lines changed

7 files changed

+248
-183
lines changed

openage/convert/processor/conversion/aoc/CMakeLists.txt

Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -21,4 +21,5 @@ add_subdirectory(ability)
2121
add_subdirectory(auxiliary)
2222
add_subdirectory(civ)
2323
add_subdirectory(effect)
24+
add_subdirectory(media)
2425
add_subdirectory(resistance)
Lines changed: 6 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,6 @@
1+
add_py_modules(
2+
__init__.py
3+
blend.py
4+
graphics.py
5+
sound.py
6+
)
Lines changed: 5 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,5 @@
1+
# Copyright 2025-2025 the openage authors. See copying.md for legal info.
2+
3+
"""
4+
Create media export requests for media files in the AoC data.
5+
"""
Lines changed: 32 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,32 @@
1+
# Copyright 2025-2025 the openage authors. See copying.md for legal info.
2+
3+
"""
4+
Create export requests for blending files.
5+
"""
6+
from __future__ import annotations
7+
import typing
8+
9+
from .....entity_object.export.media_export_request import MediaExportRequest
10+
from .....value_object.read.media_types import MediaType
11+
12+
if typing.TYPE_CHECKING:
13+
from .....entity_object.conversion.aoc.genie_object_container\
14+
import GenieObjectContainer
15+
16+
17+
def create_blend_requests(full_data_set: GenieObjectContainer) -> None:
18+
"""
19+
Create export requests for Blendomatic objects.
20+
21+
TODO: Blendomatic contains multiple files. Better handling?
22+
23+
:param full_data_set: Data set containing all objects and metadata that the export
24+
requests are added to.
25+
"""
26+
export_request = MediaExportRequest(
27+
MediaType.BLEND,
28+
"data/blend/",
29+
full_data_set.game_version.edition.media_paths[MediaType.BLEND][0],
30+
"blendmode"
31+
)
32+
full_data_set.blend_exports.update({0: export_request})
Lines changed: 157 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,157 @@
1+
# Copyright 2025-2025 the openage authors. See copying.md for legal info.
2+
3+
"""
4+
Create export requests for graphics files.
5+
"""
6+
from __future__ import annotations
7+
import typing
8+
9+
from .....entity_object.export.formats.sprite_metadata import LayerMode as SpriteLayerMode
10+
from .....entity_object.export.formats.terrain_metadata import LayerMode as TerrainLayerMode
11+
from .....entity_object.export.media_export_request import MediaExportRequest
12+
from .....entity_object.export.metadata_export import SpriteMetadataExport
13+
from .....entity_object.export.metadata_export import TextureMetadataExport
14+
from .....entity_object.export.metadata_export import TerrainMetadataExport
15+
from .....value_object.read.media_types import MediaType
16+
17+
if typing.TYPE_CHECKING:
18+
from .....entity_object.conversion.aoc.genie_object_container\
19+
import GenieObjectContainer
20+
21+
22+
def create_graphics_requests(full_data_set: GenieObjectContainer) -> None:
23+
"""
24+
Create export requests for graphics referenced by CombinedSprite objects.
25+
26+
:param full_data_set: Data set containing all objects and metadata that the export
27+
requests are added to.
28+
"""
29+
combined_sprites = full_data_set.combined_sprites.values()
30+
handled_graphic_ids = set()
31+
32+
for sprite in combined_sprites:
33+
ref_graphics = sprite.get_graphics()
34+
graphic_targetdirs = sprite.resolve_graphics_location()
35+
36+
# Animation metadata file definiton
37+
sprite_meta_filename = f"{sprite.get_filename()}.sprite"
38+
sprite_meta_export = SpriteMetadataExport(sprite.resolve_sprite_location(),
39+
sprite_meta_filename)
40+
full_data_set.metadata_exports.append(sprite_meta_export)
41+
42+
for graphic in ref_graphics:
43+
graphic_id = graphic.get_id()
44+
if graphic_id in handled_graphic_ids:
45+
continue
46+
47+
# Texture image file definiton
48+
targetdir = graphic_targetdirs[graphic_id]
49+
source_filename = f"{str(graphic['slp_id'].value)}.slp"
50+
target_filename = f"{sprite.get_filename()}_{str(graphic['slp_id'].value)}.png"
51+
52+
export_request = MediaExportRequest(MediaType.GRAPHICS,
53+
targetdir,
54+
source_filename,
55+
target_filename)
56+
full_data_set.graphics_exports.update({graphic_id: export_request})
57+
58+
# Texture metadata file definiton
59+
# Same file stem as the image file and same targetdir
60+
texture_meta_filename = f"{target_filename[:-4]}.texture"
61+
texture_meta_export = TextureMetadataExport(targetdir,
62+
texture_meta_filename)
63+
full_data_set.metadata_exports.append(texture_meta_export)
64+
65+
# Add texture image filename to texture metadata
66+
texture_meta_export.add_imagefile(target_filename)
67+
68+
# Add metadata from graphics to animation metadata
69+
sequence_type = graphic["sequence_type"].value
70+
if sequence_type == 0x00:
71+
layer_mode = SpriteLayerMode.OFF
72+
73+
elif sequence_type & 0x08:
74+
layer_mode = SpriteLayerMode.ONCE
75+
76+
else:
77+
layer_mode = SpriteLayerMode.LOOP
78+
79+
layer_pos = graphic["layer"].value
80+
frame_rate = round(graphic["frame_rate"].value, ndigits=6)
81+
if frame_rate < 0.000001:
82+
frame_rate = None
83+
84+
replay_delay = round(graphic["replay_delay"].value, ndigits=6)
85+
if replay_delay < 0.000001:
86+
replay_delay = None
87+
88+
frame_count = graphic["frame_count"].value
89+
angle_count = graphic["angle_count"].value
90+
mirror_mode = graphic["mirroring_mode"].value
91+
sprite_meta_export.add_graphics_metadata(target_filename,
92+
texture_meta_filename,
93+
layer_mode,
94+
layer_pos,
95+
frame_rate,
96+
replay_delay,
97+
frame_count,
98+
angle_count,
99+
mirror_mode)
100+
101+
# Notify metadata export about SLP metadata when the file is exported
102+
export_request.add_observer(texture_meta_export)
103+
export_request.add_observer(sprite_meta_export)
104+
105+
handled_graphic_ids.add(graphic_id)
106+
107+
combined_terrains = full_data_set.combined_terrains.values()
108+
for texture in combined_terrains:
109+
slp_id = texture.get_terrain()["slp_id"].value
110+
111+
targetdir = texture.resolve_graphics_location()
112+
source_filename = f"{str(slp_id)}.slp"
113+
target_filename = f"{texture.get_filename()}.png"
114+
115+
export_request = MediaExportRequest(MediaType.TERRAIN,
116+
targetdir,
117+
source_filename,
118+
target_filename)
119+
full_data_set.graphics_exports.update({slp_id: export_request})
120+
121+
texture_meta_filename = f"{texture.get_filename()}.texture"
122+
texture_meta_export = TextureMetadataExport(targetdir,
123+
texture_meta_filename)
124+
full_data_set.metadata_exports.append(texture_meta_export)
125+
126+
# Add texture image filename to texture metadata
127+
texture_meta_export.add_imagefile(target_filename)
128+
texture_meta_export.update(
129+
None,
130+
{
131+
f"{target_filename}": {
132+
"size": (481, 481), # TODO: Get actual size = sqrt(slp_frame_count)
133+
"subtex_metadata": [
134+
{
135+
"x": 0,
136+
"y": 0,
137+
"w": 481,
138+
"h": 481,
139+
"cx": 0,
140+
"cy": 0,
141+
}
142+
]
143+
}}
144+
)
145+
146+
terrain_meta_filename = f"{texture.get_filename()}.terrain"
147+
terrain_meta_export = TerrainMetadataExport(targetdir,
148+
terrain_meta_filename)
149+
full_data_set.metadata_exports.append(terrain_meta_export)
150+
151+
terrain_meta_export.add_graphics_metadata(target_filename,
152+
texture_meta_filename,
153+
TerrainLayerMode.OFF,
154+
0,
155+
0.0,
156+
0.0,
157+
1)
Lines changed: 38 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,38 @@
1+
# Copyright 2025-2025 the openage authors. See copying.md for legal info.
2+
3+
"""
4+
Create export requests for sound files.
5+
"""
6+
from __future__ import annotations
7+
import typing
8+
9+
from .....entity_object.export.media_export_request import MediaExportRequest
10+
from .....value_object.read.media_types import MediaType
11+
12+
if typing.TYPE_CHECKING:
13+
from .....entity_object.conversion.aoc.genie_object_container\
14+
import GenieObjectContainer
15+
16+
17+
def create_sound_requests(full_data_set: GenieObjectContainer) -> None:
18+
"""
19+
Create export requests for sounds referenced by CombinedSound objects.
20+
21+
:param full_data_set: Data set containing all objects and metadata that the export
22+
requests are added to.
23+
"""
24+
combined_sounds = full_data_set.combined_sounds.values()
25+
26+
for sound in combined_sounds:
27+
sound_id = sound.get_file_id()
28+
29+
targetdir = sound.resolve_sound_location()
30+
source_filename = f"{str(sound_id)}.wav"
31+
target_filename = f"{sound.get_filename()}.opus"
32+
33+
export_request = MediaExportRequest(MediaType.SOUNDS,
34+
targetdir,
35+
source_filename,
36+
target_filename)
37+
38+
full_data_set.sound_exports.update({sound_id: export_request})

0 commit comments

Comments
 (0)