Skip to content

Commit 6401850

Browse files
committed
yep those improvements are assorted alright
1 parent b6c4eee commit 6401850

16 files changed

+502
-155
lines changed

loco-graphics-helper/__init__.py

Lines changed: 4 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -16,6 +16,7 @@
1616
from .properties.general_properties import register_general_properties, unregister_general_properties
1717
from .properties.track_properties import register_track_properties, unregister_track_properties
1818
from .properties.object_properties import register_object_properties, unregister_object_properties
19+
from .properties.file_versioning import register_file_updater, unregister_file_updater
1920
from .rct_graphics_helper_panel import GraphicsHelperPanel
2021
from . import developer_utils
2122
import importlib
@@ -25,7 +26,7 @@
2526
"name": "Loco Graphics Helper",
2627
"description": "Render tool to replicate Locomotion graphics (based on RCT Graphics Helper)",
2728
"author": "Olivier Wervers & OpenLoco Team",
28-
"version": (0, 1, 6),
29+
"version": (0, 1, 10),
2930
"blender": (2, 79, 0),
3031
"location": "Render",
3132
"support": "COMMUNITY",
@@ -54,6 +55,7 @@ def register():
5455
register_walls_properties()
5556
register_track_properties()
5657
register_object_properties()
58+
register_file_updater()
5759

5860
print("Registered {} with {} modules".format(
5961
bl_info["name"], len(modules)))
@@ -71,5 +73,6 @@ def unregister():
7173
unregister_walls_properties()
7274
unregister_track_properties()
7375
unregister_object_properties()
76+
unregister_file_updater()
7477

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

loco-graphics-helper/builders/task_builder.py

Lines changed: 19 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -7,12 +7,24 @@
77
RCT Graphics Helper is licensed under the GNU General Public License version 3.
88
'''
99

10+
import bpy
1011
from operator import length_hint
1112
from ..frame import Frame
1213
from ..render_task import RenderTask
14+
from ..vehicle import get_vehicle_y_offset
1315

1416
# Builder for creating render tasks procedurally
1517

18+
def get_offset_y():
19+
properties = bpy.context.scene.loco_graphics_helper_general_properties
20+
if properties.render_mode == "TILES":
21+
return 0
22+
elif properties.render_mode == "VEHICLE":
23+
return get_vehicle_y_offset()
24+
elif properties.render_mode == "WALLS":
25+
return 0
26+
elif properties.render_mode == "TRACK":
27+
return 0
1628

1729
class TaskBuilder:
1830

@@ -82,9 +94,14 @@ def add_frame(self, frame_index, number_of_viewing_angles, angle_index, animatio
8294

8395
frame.set_target_object(target_object)
8496

97+
frame.set_offset_y(get_offset_y())
98+
8599
self.angles.append(frame)
86100
self.output_index = self.output_index + 1
87101

102+
def add_null_frames(self, number):
103+
self.output_index += number
104+
88105
# Adds render angles for the given number of viewing angles relative to the currently configured rotation
89106
def add_viewing_angles(self, number_of_viewing_angles, animation_frame_index=0, animation_frames=1, rotational_symmetry=False):
90107

@@ -121,6 +138,8 @@ def add_viewing_angles(self, number_of_viewing_angles, animation_frame_index=0,
121138

122139
frame.set_occlusion_layers(self.occlusion_layers)
123140

141+
frame.set_offset_y(get_offset_y())
142+
124143
if self.occlusion_layers > 0:
125144
output_indices = []
126145
for k in range(self.occlusion_layers):

loco-graphics-helper/frame.py

Lines changed: 5 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -104,6 +104,8 @@ def prepare_scene(self):
104104
recursive_hide_children(self.target_object,False, self.target_object.loco_graphics_helper_object_properties.object_type)
105105

106106
object.location = self.target_object.matrix_world.translation
107+
if self.target_object.loco_graphics_helper_vehicle_properties.bounding_box_override:
108+
object.location = self.target_object.loco_graphics_helper_vehicle_properties.bounding_box_override.matrix_world.translation
107109

108110
# This is a little hacky...
109111
if self.layer == 'Top Down Shadow':
@@ -130,6 +132,9 @@ def set_offset(self, offset_x, offset_y):
130132
self.offset_x = offset_x
131133
self.offset_y = offset_y
132134

135+
def set_offset_y(self, offset_y):
136+
self.offset_y = offset_y
137+
133138
def set_multi_tile_size(self, width, length, invert_tile_positions):
134139
self.width = width
135140
self.length = length

loco-graphics-helper/loco_object_helper_panel.py

Lines changed: 35 additions & 17 deletions
Original file line numberDiff line numberDiff line change
@@ -60,21 +60,31 @@ def draw_bogie_panel(self, context, layout):
6060

6161
vehicle_properties = context.object.loco_graphics_helper_vehicle_properties
6262

63+
row.prop(vehicle_properties, "null_component")
64+
row = layout.row()
65+
66+
if vehicle_properties.null_component:
67+
return
68+
69+
row.prop(vehicle_properties, "index")
70+
row = layout.row()
71+
6372
row.prop(vehicle_properties, "is_clone")
6473
row = layout.row()
6574

6675
row.prop(vehicle_properties, "is_inverted")
6776
row = layout.row()
6877

6978
if vehicle_properties.is_clone:
70-
row.prop(vehicle_properties, "index",text="Clone of bogie index:")
71-
row = layout.row()
7279
return
7380

81+
row.prop(vehicle_properties, "render_sprite")
82+
row = layout.row()
83+
7484
box = layout.box()
7585

7686
row = box.row()
77-
row.label("Track Properties:")
87+
row.label("Sprite:")
7888

7989
split = box.split(.50)
8090
columns = [split.column(), split.column()]
@@ -92,15 +102,14 @@ def draw_bogie_panel(self, context, layout):
92102
row.label("Sloped Viewing Angles: 32")
93103
row = layout.row()
94104

95-
row.prop(vehicle_properties, "index")
96-
row = layout.row()
97-
98105
row.prop(vehicle_properties, "number_of_animation_frames")
99106
row = layout.row()
100107

101108
row.prop(vehicle_properties, "rotational_symmetry")
102109
row = layout.row()
103110

111+
row.prop(vehicle_properties, "bounding_box_override")
112+
104113
def draw_body_panel(self, context, layout):
105114
scene = context.scene
106115
general_properties = scene.loco_graphics_helper_general_properties
@@ -112,21 +121,31 @@ def draw_body_panel(self, context, layout):
112121

113122
vehicle_properties = context.object.loco_graphics_helper_vehicle_properties
114123

124+
row.prop(vehicle_properties, "null_component")
125+
row = layout.row()
126+
127+
if vehicle_properties.null_component:
128+
return
129+
130+
row.prop(vehicle_properties, "index")
131+
row = layout.row()
132+
115133
row.prop(vehicle_properties, "is_clone")
116134
row = layout.row()
117135

118136
row.prop(vehicle_properties, "is_inverted")
119137
row = layout.row()
120138

121139
if vehicle_properties.is_clone:
122-
row.prop(vehicle_properties, "index",text="Clone of body index:")
123-
row = layout.row()
124140
return
125-
141+
142+
row.prop(vehicle_properties, "render_sprite")
143+
row = layout.row()
144+
126145
box = layout.box()
127146

128147
row = box.row()
129-
row.label("Track Properties:")
148+
row.label("Sprites:")
130149

131150
split = box.split(.50)
132151
columns = [split.column(), split.column()]
@@ -148,17 +167,14 @@ def draw_body_panel(self, context, layout):
148167
row.prop(vehicle_properties, "sloped_viewing_angles", text="")
149168
row = layout.row()
150169

151-
row.prop(vehicle_properties, "roll_angle")
152-
row = layout.row()
153-
154-
row.prop(vehicle_properties, "index")
170+
row.prop(vehicle_properties, "tilt_angle")
155171
row = layout.row()
156172

157173
row.prop(vehicle_properties, "number_of_animation_frames")
158174
row = layout.row()
159175

160-
if vehicle_properties.number_of_animation_frames != 1 and vehicle_properties.roll_angle != 0:
161-
row.label("WARNING CANNOT HAVE BOTH ANIMATION FRAMES AND ROLL ANGLE SET")
176+
if vehicle_properties.number_of_animation_frames != 1 and vehicle_properties.tilt_angle != 0:
177+
row.label("WARNING: cannot have tilt frames and animation frames")
162178
row = layout.row()
163179

164180
row.prop(vehicle_properties, "rotational_symmetry")
@@ -167,8 +183,10 @@ def draw_body_panel(self, context, layout):
167183
row.prop(vehicle_properties, "braking_lights")
168184
row = layout.row()
169185
if vehicle_properties.braking_lights and vehicle_properties.roll_angle != 0:
170-
row.label("WARNING CANNOT HAVE BOTH BRAKING LIGHTS AND ROLL ANGLE SET")
186+
row.label("WARNING: cannot have brake lights and tilt frames")
171187
row = layout.row()
172188

173189
row.prop(vehicle_properties, "is_airplane")
174190
row = layout.row()
191+
192+
row.prop(vehicle_properties, "bounding_box_override")

loco-graphics-helper/operators/init_operator.py

Lines changed: 7 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -78,6 +78,13 @@ def execute(self, context):
7878
compositorBuilder = CompositorBuilder()
7979
compositorBuilder.build(context)
8080

81+
# Set project properties
82+
properties = context.scene.loco_graphics_helper_general_properties
83+
addon_prefs = context.user_preferences.addons["loco-graphics-helper"].preferences
84+
85+
properties.RCTPluginVersion = addon_prefs.RCTPluginVersion
86+
properties.RCTPluginName = addon_prefs.printable_idname
87+
8188
return {'FINISHED'}
8289

8390
def delete_default_render_layer(self, context):

loco-graphics-helper/operators/vehicle_render_operator.py

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

1414
from ..operators.render_operator import RCTRender
1515
from ..angle_sections.track import track_angle_sections, track_angle_sections_names
16+
from ..vehicle import get_number_of_sprites
1617

1718

1819
class RenderVehicle(RCTRender, bpy.types.Operator):
@@ -36,7 +37,7 @@ def create_task(self, context):
3637
self.task_builder.set_palette(self.palette_manager.get_base_palette(
3738
general_props.palette, general_props.number_of_recolorables, "FULL"))
3839

39-
bodies = [x for x in context.scene.objects if x.loco_graphics_helper_object_properties.object_type == "BODY" and not x.loco_graphics_helper_vehicle_properties.is_clone]
40+
bodies = [x for x in context.scene.objects if x.loco_graphics_helper_object_properties.object_type == "BODY" and not x.loco_graphics_helper_vehicle_properties.is_clone and not x.loco_graphics_helper_vehicle_properties.null_component]
4041
bodies = sorted(bodies, key=lambda x: x.loco_graphics_helper_vehicle_properties.index)
4142
for body_object in bodies:
4243
self.add_render_angles(body_object)
@@ -46,7 +47,7 @@ def create_task(self, context):
4647
self.task_builder.set_palette(self.palette_manager.get_shadow_palette())
4748
self.add_airplane_shadow_render_angles(bodies[0])
4849
else:
49-
bogies = [x for x in context.scene.objects if x.loco_graphics_helper_object_properties.object_type == "BOGIE" and not x.loco_graphics_helper_vehicle_properties.is_clone]
50+
bogies = [x for x in context.scene.objects if x.loco_graphics_helper_object_properties.object_type == "BOGIE" and not x.loco_graphics_helper_vehicle_properties.is_clone and not x.loco_graphics_helper_vehicle_properties.null_component]
5051
bogies = sorted(bogies, key=lambda x: x.loco_graphics_helper_vehicle_properties.index)
5152
for bogie_object in bogies:
5253
self.add_render_angles(bogie_object)
@@ -73,10 +74,13 @@ def should_render_feature(self, key, props):
7374

7475
def add_render_angles(self, object):
7576
props = object.loco_graphics_helper_vehicle_properties
77+
if not props.render_sprite:
78+
self.task_builder.add_null_frames(get_number_of_sprites(object))
79+
return
7680
is_bogie = object.loco_graphics_helper_object_properties.object_type == "BOGIE"
7781
target_object = object
7882
animation_frames = props.number_of_animation_frames
79-
tilt_frames = 1 if props.roll_angle == 0 else 3
83+
tilt_frames = 1 if props.tilt_angle == 0 else 3
8084

8185
for i in range(len(track_angle_sections_names)):
8286
key = track_angle_sections_names[i]
@@ -118,11 +122,11 @@ def add_render_angles(self, object):
118122

119123
for i in range(num_viewing_angles):
120124
if tilt_frames != 1:
121-
roll_angles = [0, props.roll_angle, -props.roll_angle]
122-
for j, roll_angle in enumerate(roll_angles):
125+
tilt_angles = [0, props.tilt_angle, -props.tilt_angle]
126+
for j, tilt_angle in enumerate(tilt_angles):
123127
frame_index = start_output_index + i * tilt_frames + j
124128
self.task_builder.set_rotation(
125-
base_view_angle, roll_angle, vertical_angle=track_section[2])
129+
base_view_angle, tilt_angle, vertical_angle=track_section[2])
126130
self.task_builder.add_frame(
127131
frame_index, num_viewing_angles, i, j, rotation_range, target_object)
128132
else:
Lines changed: 81 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,81 @@
1+
'''
2+
Copyright (c) 2024 RCT Graphics Helper developers
3+
4+
For a complete list of all authors, please refer to the addon's meta info.
5+
Interested in contributing? Visit https://github.com/oli414/Blender-RCT-Graphics
6+
7+
RCT Graphics Helper is licensed under the GNU General Public License version 3.
8+
'''
9+
10+
import bpy
11+
from bpy.app.handlers import persistent
12+
13+
# Updating a project file to a newer version
14+
15+
# each function updates the file to the version in the name
16+
# if only new features were added, copy the format of version0
17+
18+
current_file_version = 4
19+
20+
def getAllComponents():
21+
return [x for x in bpy.context.scene.objects if x.loco_graphics_helper_object_properties.object_type != 'NONE']
22+
23+
class FileVersionUpdater:
24+
# plugin version 0.1.6
25+
def version0():
26+
pass
27+
28+
# plugin version 0.1.7
29+
# move component index from 1-index to 0-index
30+
def version1():
31+
for object in getAllComponents():
32+
object.loco_graphics_helper_vehicle_properties.index -= 1
33+
34+
# plugin version 0.1.8
35+
# rename roll_angle to tilt_angle
36+
def version2():
37+
for object in getAllComponents():
38+
if "roll_angle" in object.loco_graphics_helper_vehicle_properties:
39+
object.loco_graphics_helper_vehicle_properties.tilt_angle = object.loco_graphics_helper_vehicle_properties["roll_angle"]
40+
41+
# plugin version 0.1.9
42+
# add null component boolean
43+
def version3():
44+
for object in getAllComponents():
45+
if object.loco_graphics_helper_vehicle_properties.index >= 255:
46+
object.loco_graphics_helper_vehicle_properties.null_component = True
47+
48+
# plugin version 0.1.10
49+
# add specific Y-offsets per entity type
50+
def version4():
51+
bpy.context.scene.loco_graphics_helper_general_properties.y_offset += 17
52+
53+
update_functions = [getattr(FileVersionUpdater, func) for func in dir(FileVersionUpdater) if callable(getattr(FileVersionUpdater, func)) and not func.startswith("__")]
54+
55+
def apply_update():
56+
print("loco-graphics-helper: Applying updates to file")
57+
general_properties = bpy.context.scene.loco_graphics_helper_general_properties
58+
addon_prefs = bpy.context.user_preferences.addons["loco-graphics-helper"].preferences
59+
assert len(update_functions) == bpy.context.user_preferences.addons["loco-graphics-helper"].preferences.RCTPluginVersion + 1
60+
for i in range(int(general_properties.RCTPluginVersion)+1, int(addon_prefs.RCTPluginVersion)+1):
61+
update_functions[i]()
62+
general_properties.RCTPluginVersion = i
63+
general_properties.RCTPluginName = addon_prefs.printable_idname
64+
65+
@persistent
66+
def check_for_update(_=None):
67+
print("loco-graphics-helper: Checking for update")
68+
general_properties = bpy.context.scene.loco_graphics_helper_general_properties
69+
addon_prefs = bpy.context.user_preferences.addons["loco-graphics-helper"].preferences
70+
if general_properties.RCTPluginName != addon_prefs.printable_idname:
71+
return
72+
if int(general_properties.RCTPluginVersion) >= int(addon_prefs.RCTPluginVersion):
73+
return
74+
print("File version is {}, plugin version is {}".format(general_properties.RCTPluginVersion, addon_prefs.RCTPluginVersion))
75+
apply_update()
76+
77+
def register_file_updater():
78+
bpy.app.handlers.load_post.append(check_for_update)
79+
80+
def unregister_file_updater():
81+
bpy.app.handlers.load_post.remove(check_for_update)

0 commit comments

Comments
 (0)