Skip to content

Commit ce445bb

Browse files
committed
Add walls support. Add GXC support. Add assetpack support
1 parent f163ca2 commit ce445bb

26 files changed

+916
-331
lines changed

rct-graphics-helper/__init__.py

Lines changed: 4 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -12,6 +12,7 @@
1212
from .properties.preferences import RCTGraphicsHelperPreferences
1313
from .properties.vehicle_properties import register_vehicles_properties, unregister_vehicles_properties
1414
from .properties.tiles_properties import register_tiles_properties, unregister_tiles_properties
15+
from .properties.walls_properties import register_walls_properties, unregister_walls_properties
1516
from .properties.general_properties import register_general_properties, unregister_general_properties
1617
from .rct_graphics_helper_panel import GraphicsHelperPanel
1718
from . import developer_utils
@@ -22,7 +23,7 @@
2223
"name": "RCT Graphics Helper",
2324
"description": "Render tool to replicate RCT graphics",
2425
"author": "Olivier Wervers",
25-
"version": (0, 3, 4),
26+
"version": (0, 4, 0),
2627
"blender": (2, 79, 0),
2728
"location": "Render",
2829
"support": "COMMUNITY",
@@ -48,6 +49,7 @@ def register():
4849
register_general_properties()
4950
register_tiles_properties()
5051
register_vehicles_properties()
52+
register_walls_properties()
5153

5254
print("Registered {} with {} modules".format(
5355
bl_info["name"], len(modules)))
@@ -62,5 +64,6 @@ def unregister():
6264
unregister_general_properties()
6365
unregister_tiles_properties()
6466
unregister_vehicles_properties()
67+
unregister_walls_properties()
6568

6669
print("Unregistered {}".format(bl_info["name"]))

rct-graphics-helper/builders/compositor_builder.py

Lines changed: 9 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -115,6 +115,14 @@ def create_metadata_image(self, layers_node):
115115

116116
self.link(layers_node, 15, map_range_node, 0)
117117

118+
map_range_node_blue = self.create_node("CompositorNodeMapRange")
119+
map_range_node_blue.inputs[1].default_value = 0
120+
map_range_node_blue.inputs[2].default_value = 255
121+
map_range_node_blue.inputs[3].default_value = 0
122+
map_range_node_blue.inputs[4].default_value = 1
123+
124+
self.link(layers_node, 14, map_range_node_blue, 0)
125+
118126
alpha_convert_node = self.create_node("CompositorNodePremulKey")
119127
alpha_convert_node.mapping = "PREMUL_TO_STRAIGHT"
120128

@@ -167,6 +175,7 @@ def create_metadata_image(self, layers_node):
167175
combine_node = self.create_node("CompositorNodeCombRGBA")
168176
self.link(map_range_node, 0, combine_node, 0)
169177
self.link(map_range_node2, 0, combine_node, 1)
178+
self.link(map_range_node_blue, 0, combine_node, 2)
170179

171180
self.next_process()
172181

rct-graphics-helper/builders/task_builder.py

Lines changed: 34 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -40,11 +40,20 @@ def __init__(self):
4040

4141
self.palette = None
4242

43+
self.offset_x = 0
44+
self.offset_y = 0
45+
46+
self.occlusion_layers = 0
47+
4348
self.task = RenderTask(None)
4449

4550
def set_output_index(self, output_index):
4651
self.output_index = output_index
4752

53+
def set_offset(self, offset_x, offset_y):
54+
self.offset_x = offset_x
55+
self.offset_y = offset_y
56+
4857
# Adds render angles for the given number of viewing angles relative to the currently configured rotation
4958
def add_viewing_angles(self, number_of_viewing_angles, animation_frame_index=0, animation_frames=1):
5059

@@ -58,6 +67,8 @@ def add_viewing_angles(self, number_of_viewing_angles, animation_frame_index=0,
5867
self.bank_angle, self.vertical_angle, self.mid_angle)
5968
frame.set_multi_tile_size(self.width, self.length)
6069

70+
frame.set_offset(self.offset_x, self.offset_y)
71+
6172
frame.set_recolorables(self.recolorables)
6273

6374
frame.set_layer(self.layer)
@@ -69,6 +80,15 @@ def add_viewing_angles(self, number_of_viewing_angles, animation_frame_index=0,
6980

7081
frame.animation_frame_index = animation_frame_index + j
7182

83+
frame.set_occlusion_layers(self.occlusion_layers)
84+
85+
if self.occlusion_layers > 0:
86+
output_indices = []
87+
for k in range(self.occlusion_layers):
88+
output_indices.append(
89+
start_output_index + k * animation_frames * number_of_viewing_angles + j * number_of_viewing_angles + i)
90+
frame.set_output_indices(output_indices)
91+
7292
if frame.oversized:
7393
output_indices = []
7494
for k in range(frame.width * frame.length):
@@ -78,8 +98,12 @@ def add_viewing_angles(self, number_of_viewing_angles, animation_frame_index=0,
7898

7999
self.angles.append(frame)
80100

81-
self.output_index += number_of_viewing_angles * \
101+
frames = number_of_viewing_angles * \
82102
animation_frames * self.width * self.length
103+
if self.occlusion_layers > 0:
104+
frames *= self.occlusion_layers
105+
106+
self.output_index += frames
83107

84108
# Sets the number of recolorable materials
85109
def set_recolorables(self, number_of_recolorables):
@@ -110,7 +134,7 @@ def set_size(self, width, length):
110134
self.length = length
111135

112136
# Sets the rotation applied to future render angles
113-
def set_rotation(self, view_angle, bank_angle, vertical_angle, mid_angle):
137+
def set_rotation(self, view_angle, bank_angle=0, vertical_angle=0, mid_angle=0):
114138
self.view_angle = view_angle
115139
self.bank_angle = bank_angle
116140
self.vertical_angle = vertical_angle
@@ -123,6 +147,10 @@ def reset_rotation(self):
123147
self.vertical_angle = 0
124148
self.mid_angle = 0
125149

150+
# Sets the number of occlusion layers
151+
def set_occlusion_layers(self, layers):
152+
self.occlusion_layers = layers
153+
126154
# Creates a render task with the supplied angles. Clears the buffer for reuse of the task builder
127155
def create_task(self, context):
128156
task = self.task
@@ -137,6 +165,10 @@ def clear(self):
137165
self.width = 1
138166
self.length = 1
139167

168+
self.set_offset(0, 0)
169+
170+
self.set_occlusion_layers(0)
171+
140172
self.recolorables = 0
141173

142174
self.task = RenderTask(None)

rct-graphics-helper/frame.py

Lines changed: 20 additions & 5 deletions
Original file line numberDiff line numberDiff line change
@@ -35,10 +35,15 @@ def __init__(self, frame_index, task, view_angle, bank_angle=0, vertical_angle=0
3535

3636
self.animation_frame_index = 0
3737

38+
self.occlusion_layers = 0
39+
3840
self.use_anti_aliasing = True
3941
self.anti_alias_with_background = False
4042
self.maintain_aliased_silhouette = True
4143

44+
self.offset_x = 0
45+
self.offset_y = 0
46+
4247
self.base_palette = None
4348

4449
def get_meta_render_output_path(self, suffix=""):
@@ -62,14 +67,14 @@ def get_quantized_render_output_path(self):
6267
return os.path.join(self.task.get_temporary_output_folder(), "quantized_{}.png".format(self.frame_index))
6368

6469
def get_final_output_paths(self):
65-
if self.oversized:
70+
if self.oversized or self.occlusion_layers > 0:
6671
output_paths = []
6772
for output_index in self.output_indices:
6873
output_paths.append(os.path.join(
69-
self.task.get_output_folder(), "sprite_{}.png".format(output_index)))
74+
self.task.get_output_folder(), "sprites", "sprite_{}.png".format(output_index)))
7075
return output_paths
7176
else:
72-
return [os.path.join(self.task.get_output_folder(), "sprite_{}.png".format(self.frame_index))]
77+
return [os.path.join(self.task.get_output_folder(), "sprites", "sprite_{}.png".format(self.frame_index))]
7378

7479
def prepare_scene(self):
7580
object = bpy.data.objects['Rig']
@@ -90,6 +95,10 @@ def set_anti_aliasing_with_background(self, use_anti_aliasing, anti_alias_with_b
9095
self.maintain_aliased_silhouette = ((
9196
not anti_alias_with_background) or maintain_aliased_silhouette) and use_anti_aliasing
9297

98+
def set_offset(self, offset_x, offset_y):
99+
self.offset_x = offset_x
100+
self.offset_y = offset_y
101+
93102
def set_multi_tile_size(self, width, length):
94103
self.width = width
95104
self.length = length
@@ -105,9 +114,15 @@ def set_recolorables(self, number_of_recolorables):
105114
def set_base_palette(self, palette):
106115
self.base_palette = palette
107116

117+
def set_occlusion_layers(self, layers):
118+
self.occlusion_layers = layers
119+
108120
def set_output_indices(self, indices):
109121
self.output_indices = indices
110122

111-
if len(self.output_indices) != self.width * self.length:
123+
layers = self.occlusion_layers
124+
if layers == 0:
125+
layers = 1
126+
if len(self.output_indices) != self.width * self.length * layers:
112127
raise Exception(
113-
"The number of output indices does not match the number of expected output sprites for this frame's tile footprint")
128+
"The number of output indices does not match the number of expected output sprites for this frame")

rct-graphics-helper/magick_command.py

Lines changed: 7 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -36,7 +36,7 @@ def quantize(self, palette, amount):
3636
def trim(self):
3737
self.use_repage = True
3838
self.full_command += \
39-
" -bordercolor none -compose Copy -border 1 -trim -format \"%[fx:page.x - page.width/2] %[fx:page.y - page.height/2]\" -write info:"
39+
" -bordercolor none -compose Copy -border 1 -trim -format \"%[fx:page.x-page.width/2] %[fx:page.y-page.height/2]\" -write info:"
4040

4141
# Sets a number of channels (Red, Green, Blue) to 0
4242
def nullify_channels(self, channels_to_nullify):
@@ -92,6 +92,12 @@ def set_bit_depth(self, depth):
9292
def output(self, file):
9393
self.full_command += " -write PNG8:" + file
9494

95+
def clone(self):
96+
mc = MagickCommand("")
97+
mc.full_command = self.full_command
98+
mc.use_repage = self.use_repage
99+
return mc
100+
95101
# Gets the cli command to perform the ImageMagick operation
96102

97103
def get_command_string(self, magick_path, output):

rct-graphics-helper/operators/init_operator.py

Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -89,6 +89,7 @@ def create_render_layer(self, context, name):
8989

9090
layer.use_pass_combined = True
9191
layer.use_pass_material_index = True
92+
layer.use_pass_object_index = True
9293
layer.use_zmask = True
9394

9495
return layer

rct-graphics-helper/operators/render_operator.py

Lines changed: 3 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -55,6 +55,9 @@ def execute(self, context):
5555
bpy.data.cameras["Camera"].ortho_scale = 169.72 / \
5656
(1920 / context.scene.render.resolution_x)
5757

58+
bpy.data.cameras["Camera"].shift_x = -0.000345 * \
59+
96 / context.scene.render.resolution_x
60+
5861
def finish():
5962
general_props.rendering = False
6063
rotate_rig(0, 0, 0, 0)

rct-graphics-helper/operators/vehicle_render_operator.py

Lines changed: 0 additions & 35 deletions
Original file line numberDiff line numberDiff line change
@@ -121,38 +121,3 @@ def add_render_angles(self, context, is_inverted=False, animation_frames=1):
121121
else:
122122
self.task_builder.add_viewing_angles(
123123
track_section[1], 0, animation_frames)
124-
125-
def OLD_append_angles_to_rendertask(self, render_layer, inverted):
126-
start_anim = 0
127-
"""
128-
if self.scene.rct_graphics_helper_general_properties.number_of_animation_frames != 1:
129-
start_anim = 4
130-
anim_count = self.scene.rct_graphics_helper_general_properties.number_of_animation_frames
131-
for i in range(len(track_angle_sections_names)):
132-
key = track_angle_sections_names[i]
133-
track_section = track_angle_sections[key]
134-
if self.key_is_property(key):
135-
if self.property_value(key):
136-
self.renderTask.add(
137-
track_section, render_layer, inverted, start_anim, anim_count)
138-
elif key == "VEHICLE_SPRITE_FLAG_GENTLE_SLOPE_BANKED_TURNS" or key == "VEHICLE_SPRITE_FLAG_GENTLE_SLOPE_BANKED_TRANSITIONS":
139-
if self.property_value("SLOPED_TURNS"):
140-
self.renderTask.add(
141-
track_section, render_layer, inverted, start_anim, anim_count)
142-
elif key == "VEHICLE_SPRITE_FLAG_FLAT_TO_GENTLE_SLOPE_WHILE_BANKED_TRANSITIONS":
143-
if self.property_value("SLOPED_TURNS") and self.property_value("VEHICLE_SPRITE_FLAG_FLAT_BANKED"):
144-
self.renderTask.add(
145-
track_section, render_layer, inverted, start_anim, anim_count)
146-
elif key == "VEHICLE_SPRITE_FLAG_DIAGONAL_GENTLE_SLOPE_BANKED_TRANSITIONS":
147-
if self.property_value("SLOPED_TURNS") and self.property_value("VEHICLE_SPRITE_FLAG_DIAGONAL_SLOPES"):
148-
self.renderTask.add(
149-
track_section, render_layer, inverted, start_anim, anim_count)
150-
elif key == "VEHICLE_SPRITE_FLAG_FLAT_TO_GENTLE_SLOPE_BANKED_TRANSITIONS":
151-
if self.property_value("VEHICLE_SPRITE_FLAG_FLAT_BANKED") and self.property_value("VEHICLE_SPRITE_FLAG_GENTLE_SLOPES"):
152-
self.renderTask.add(
153-
track_section, render_layer, inverted, start_anim, anim_count)
154-
elif key == "VEHICLE_SPRITE_FLAG_RESTRAINT_ANIMATION" and inverted == False:
155-
if self.props.restraint_animation:
156-
self.renderTask.add(
157-
track_section, render_layer, inverted, 1, 3)
158-
"""

0 commit comments

Comments
 (0)