Skip to content

Commit 6791195

Browse files
Generate meta data details
1 parent 297862b commit 6791195

File tree

5 files changed

+141
-33
lines changed

5 files changed

+141
-33
lines changed

loco-graphics-helper/loco_object_helper_panel.py

Lines changed: 14 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -26,8 +26,8 @@ def draw(self, context):
2626
return
2727
row.prop(object_properties, "object_type")
2828

29-
if object_properties.object_type == "CAR":
30-
self.draw_car_panel(context, layout)
29+
if object_properties.object_type == "BODY":
30+
self.draw_body_panel(context, layout)
3131

3232
if object_properties.object_type == "BOGIE":
3333
self.draw_bogie_panel(context, layout)
@@ -43,6 +43,14 @@ def draw_bogie_panel(self, context, layout):
4343

4444
vehicle_properties = context.object.loco_graphics_helper_vehicle_properties
4545

46+
row.prop(vehicle_properties, "is_clone_bogie")
47+
row = layout.row()
48+
49+
if vehicle_properties.is_clone_bogie:
50+
row.prop(vehicle_properties, "index",text="Clone of bogie index:")
51+
row = layout.row()
52+
return
53+
4654
box = layout.box()
4755

4856
row = box.row()
@@ -67,13 +75,16 @@ def draw_bogie_panel(self, context, layout):
6775
row.prop(vehicle_properties, "index")
6876
row = layout.row()
6977

78+
row.prop(vehicle_properties, "bogie_parent_index")
79+
row = layout.row()
80+
7081
row.prop(vehicle_properties, "number_of_animation_frames")
7182
row = layout.row()
7283

7384
row.prop(vehicle_properties, "rotational_symmetry")
7485
row = layout.row()
7586

76-
def draw_car_panel(self, context, layout):
87+
def draw_body_panel(self, context, layout):
7788
scene = context.scene
7889
general_properties = scene.loco_graphics_helper_general_properties
7990
row = layout.row()

loco-graphics-helper/operators/vehicle_render_operator.py

Lines changed: 15 additions & 15 deletions
Original file line numberDiff line numberDiff line change
@@ -36,18 +36,18 @@ def create_task(self, context):
3636
self.task_builder.set_palette(self.palette_manager.get_base_palette(
3737
general_props.palette, general_props.number_of_recolorables, "FULL"))
3838

39-
cars = [x for x in context.scene.objects if x.loco_graphics_helper_object_properties.object_type == "CAR"]
40-
cars = sorted(cars, key=lambda x: x.loco_graphics_helper_vehicle_properties.index)
41-
for car_object in cars:
42-
self.add_render_angles(car_object)
39+
bodies = [x for x in context.scene.objects if x.loco_graphics_helper_object_properties.object_type == "BODY"]
40+
bodies = sorted(bodies, key=lambda x: x.loco_graphics_helper_vehicle_properties.index)
41+
for body_object in bodies:
42+
self.add_render_angles(body_object)
4343

44-
if cars[0].loco_graphics_helper_vehicle_properties.is_airplane:
44+
if bodies[0].loco_graphics_helper_vehicle_properties.is_airplane:
4545
self.task_builder.set_cast_shadows(
4646
True)
4747
self.task_builder.set_palette(self.palette_manager.get_shadow_palette())
48-
self.add_airplane_shadow_render_angles(cars[0])
48+
self.add_airplane_shadow_render_angles(bodies[0])
4949
else:
50-
bogies = [x for x in context.scene.objects if x.loco_graphics_helper_object_properties.object_type == "BOGIE"]
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_bogie]
5151
bogies = sorted(bogies, key=lambda x: x.loco_graphics_helper_vehicle_properties.index)
5252
for bogie_object in bogies:
5353
self.add_render_angles(bogie_object)
@@ -72,10 +72,10 @@ def should_render_feature(self, key, props):
7272
return True
7373
return False
7474

75-
def add_render_angles(self, car_object):
76-
props = car_object.loco_graphics_helper_vehicle_properties
77-
is_bogie = car_object.loco_graphics_helper_object_properties.object_type == "BOGIE"
78-
target_object = car_object
75+
def add_render_angles(self, object):
76+
props = object.loco_graphics_helper_vehicle_properties
77+
is_bogie = object.loco_graphics_helper_object_properties.object_type == "BOGIE"
78+
target_object = object
7979
animation_frames = props.number_of_animation_frames
8080
roll_frames = 1 if props.roll_angle == 0 else 3
8181

@@ -115,7 +115,7 @@ def add_render_angles(self, car_object):
115115
# to the rig (could use anything though that can't render)
116116
target_object = bpy.data.objects['Rig']
117117
else:
118-
target_object = car_object
118+
target_object = object
119119

120120
for i in range(num_viewing_angles):
121121
if roll_frames != 1:
@@ -140,8 +140,8 @@ def add_render_angles(self, car_object):
140140
frame_index, num_viewing_angles, i, 0, rotation_range, target_object)
141141
self.task_builder.set_layer("Editor")
142142

143-
def add_airplane_shadow_render_angles(self, car_object):
144-
props = car_object.loco_graphics_helper_vehicle_properties
143+
def add_airplane_shadow_render_angles(self, object):
144+
props = object.loco_graphics_helper_vehicle_properties
145145

146146
track_sections = track_angle_sections["VEHICLE_SPRITE_FLAG_FLAT"]
147147
for track_section in track_sections:
@@ -165,5 +165,5 @@ def add_airplane_shadow_render_angles(self, car_object):
165165
self.task_builder.set_layer("Top Down Shadow")
166166
frame_index = start_output_index + i
167167
self.task_builder.add_frame(
168-
frame_index, num_viewing_angles, i, 0, rotation_range, car_object)
168+
frame_index, num_viewing_angles, i, 0, rotation_range, object)
169169
self.task_builder.set_layer("Editor")

loco-graphics-helper/properties/object_properties.py

Lines changed: 3 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -21,8 +21,8 @@ def object_type_update_func(self, context):
2121
props.braking_lights = False
2222
props.is_airplane = False
2323

24-
# Reset to default for cars
25-
if object.loco_graphics_helper_object_properties.object_type == "CAR":
24+
# Reset to default for bodies
25+
if object.loco_graphics_helper_object_properties.object_type == "BODY":
2626
props = object.loco_graphics_helper_vehicle_properties
2727
props.flat_viewing_angles = "64"
2828
props.sloped_viewing_angles = "32"
@@ -33,7 +33,7 @@ class ObjectProperties(bpy.types.PropertyGroup):
3333
name="Object Type",
3434
items=(
3535
("NONE", "None", "", 0),
36-
("CAR", "Car", "", 1),
36+
("BODY", "Body", "", 1),
3737
("BOGIE", "Bogie", "", 2),
3838
("CARGO", "Cargo", "", 3),
3939
),

loco-graphics-helper/properties/vehicle_properties.py

Lines changed: 14 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -87,8 +87,8 @@ class VehicleProperties(bpy.types.PropertyGroup):
8787
min=0)
8888

8989
index = bpy.props.IntProperty(
90-
name="Car/Bogie Index",
91-
description="Controls the order of the cars/bogies",
90+
name="Body/Bogie Index",
91+
description="Controls the order of the bodies/bogies",
9292
default=1,
9393
min=1)
9494

@@ -116,6 +116,18 @@ class VehicleProperties(bpy.types.PropertyGroup):
116116
default=False
117117
)
118118

119+
is_clone_bogie = bpy.props.BoolProperty(
120+
name="Is a clone of another bogie",
121+
description="If a bogie clone will not be rendered and here just for show/location data",
122+
default=False
123+
)
124+
125+
bogie_parent_index = bpy.props.IntProperty(
126+
name="Parent Body Index",
127+
description="Set to the parent body index",
128+
default=1,
129+
min=1)
130+
119131

120132
def register_vehicles_properties():
121133
bpy.types.Object.loco_graphics_helper_vehicle_properties = bpy.props.PointerProperty(

loco-graphics-helper/rct_graphics_helper_panel.py

Lines changed: 95 additions & 10 deletions
Original file line numberDiff line numberDiff line change
@@ -8,8 +8,9 @@
88
'''
99

1010
import bpy
11-
import math
11+
#import math
1212
import os
13+
from mathutils import Vector
1314

1415
from .operators.init_operator import Init
1516

@@ -237,39 +238,123 @@ def get_number_of_sprites(object):
237238
num_sprites = num_sprites + int(props.flat_viewing_angles) * multiplier / 2
238239
return int(num_sprites)
239240

241+
@staticmethod
242+
def get_min_max_x_bound_box_corners(object):
243+
bbox_corners = [object.matrix_world * Vector(corner) for corner in object.bound_box]
244+
min_x = min([x[0] for x in bbox_corners])
245+
max_x = max([x[0] for x in bbox_corners])
246+
return (min_x, max_x)
247+
248+
@staticmethod
249+
def get_longest_component_edge(front, back, body):
250+
mins = []
251+
maxs = []
252+
if not front is None:
253+
min_x, max_x = GraphicsHelperPanel.get_min_max_x_bound_box_corners(front)
254+
mins.append(min_x)
255+
maxs.append(max_x)
256+
257+
if not back is None:
258+
min_x, max_x = GraphicsHelperPanel.get_min_max_x_bound_box_corners(back)
259+
mins.append(min_x)
260+
maxs.append(max_x)
261+
262+
body_min_x, body_max_x = GraphicsHelperPanel.get_min_max_x_bound_box_corners(body)
263+
mins.append(body_min_x)
264+
maxs.append(body_max_x)
265+
266+
min_x = body.location[0] - min(mins)
267+
max_x = max(maxs) - body.location[0]
268+
return max(min_x, max_x)
269+
270+
@staticmethod
271+
def get_bogie_position_from_component(bogie, body, half_width):
272+
body_x = body.location[0]
273+
bogie_x = bogie.location[0]
274+
position_from_centre = max(body_x, bogie_x) - min(body_x, bogie_x)
275+
return half_width - position_from_centre
276+
277+
@staticmethod
278+
def get_car_components(bogies, bodies):
279+
components = []
280+
for body in bodies:
281+
component_bogies = [x for x in bogies if x.loco_graphics_helper_vehicle_properties.bogie_parent_index == body.loco_graphics_helper_vehicle_properties.index]
282+
if len(component_bogies) != 2:
283+
components.append((None, None, body))
284+
continue
285+
286+
front_bogie = component_bogies[0] if component_bogies[0].location[0] > component_bogies[1].location[0] else component_bogies[1]
287+
back_bogie = component_bogies[1] if component_bogies[0].location[0] > component_bogies[1].location[0] else component_bogies[0]
288+
289+
components.append((front_bogie, back_bogie, body))
290+
return components
291+
292+
@staticmethod
293+
def blender_to_loco_dist(dist):
294+
return int(dist * 32 + 0.5)
295+
240296
def draw_vehicle_panel(self, scene, layout):
241297
general_properties = scene.loco_graphics_helper_general_properties
242-
cars = [x for x in scene.objects if x.loco_graphics_helper_object_properties.object_type == "CAR"]
243-
cars = sorted(cars, key=lambda x: x.loco_graphics_helper_vehicle_properties.index)
298+
bodies = [x for x in scene.objects if x.loco_graphics_helper_object_properties.object_type == "BODY"]
299+
bodies = sorted(bodies, key=lambda x: x.loco_graphics_helper_vehicle_properties.index)
244300
bogies = [x for x in scene.objects if x.loco_graphics_helper_object_properties.object_type == "BOGIE"]
245301
bogies = sorted(bogies, key=lambda x: x.loco_graphics_helper_vehicle_properties.index)
246302

247303
total_number_of_sprites = 0
248304

249-
if len(cars) > 0:
305+
components = self.get_car_components(bogies, bodies)
306+
if len(components) > 0:
250307
row = layout.row()
251308
row.label("Car(s) details:")
252-
for idx, car in enumerate(cars):
309+
310+
for component in components:
311+
front, back, body = component
312+
idx = body.loco_graphics_helper_vehicle_properties.index
313+
half_width = self.get_longest_component_edge(front, back, body)
314+
315+
front_position = 0
316+
back_position = 0
317+
front_idx = 255
318+
back_idx = 255
319+
320+
if not front is None:
321+
front_position = self.get_bogie_position_from_component(front, body, half_width)
322+
back_position = self.get_bogie_position_from_component(back, body, half_width)
323+
324+
front_idx = front.loco_graphics_helper_vehicle_properties.index - 1
325+
back_idx = back.loco_graphics_helper_vehicle_properties.index - 1
326+
327+
row = layout.row()
328+
row.label(" {}. {}, Half-Width: {}, Front Position: {}, Back Position: {}".format(idx, body.name, self.blender_to_loco_dist(half_width), self.blender_to_loco_dist(front_position), self.blender_to_loco_dist(back_position)))
253329
row = layout.row()
254-
number_of_sprites = self.get_number_of_sprites(car)
255-
row.label(" {}. {}, Number of sprites: {}".format(idx + 1, car.name, number_of_sprites))
330+
row.label(" Body Sprite Index: {}, Front Bogie Sprite Index: {}, Back Bogie Sprite Index: {},".format(idx - 1, front_idx, back_idx))
331+
332+
if len(bodies) > 0:
333+
row = layout.row()
334+
row.label("Body(s) details:")
335+
for idx, body in enumerate(bodies):
336+
row = layout.row()
337+
number_of_sprites = self.get_number_of_sprites(body)
338+
row.label(" {}. {}, Number of sprites: {}".format(idx + 1, body.name, number_of_sprites))
256339
total_number_of_sprites = total_number_of_sprites + number_of_sprites
257340

258341
if len(bogies) > 0:
259342
row = layout.row()
260343
row.label("Bogie(s) details:")
261344
for idx, bogie in enumerate(bogies):
262345
row = layout.row()
263-
number_of_sprites = self.get_number_of_sprites(bogie)
346+
number_of_sprites = 0
347+
if not bogie.loco_graphics_helper_vehicle_properties.is_clone_bogie:
348+
number_of_sprites = self.get_number_of_sprites(bogie)
349+
total_number_of_sprites = total_number_of_sprites + number_of_sprites
264350
row.label(" {}. {}, Number of sprites: {}".format(idx + 1, bogie.name, number_of_sprites))
265-
total_number_of_sprites = total_number_of_sprites + number_of_sprites
266351

267352
row = layout.row()
268353
row.label("Total number of sprites: {}".format(total_number_of_sprites))
269354

270355
if total_number_of_sprites == 0:
271356
row = layout.row()
272-
row.label("NO CARS OR BOGIES SET!")
357+
row.label("NO BODIES OR BOGIES SET!")
273358
row = layout.row()
274359
row.label("NOTHING WILL BE RENDERED!")
275360

0 commit comments

Comments
 (0)