Skip to content
Open
Show file tree
Hide file tree
Changes from all commits
Commits
File filter

Filter by extension

Filter by extension

Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
5 changes: 4 additions & 1 deletion loco-graphics-helper/__init__.py
Original file line number Diff line number Diff line change
Expand Up @@ -16,6 +16,7 @@
from .properties.general_properties import register_general_properties, unregister_general_properties
from .properties.track_properties import register_track_properties, unregister_track_properties
from .properties.object_properties import register_object_properties, unregister_object_properties
from .properties.file_versioning import register_file_updater, unregister_file_updater
from .rct_graphics_helper_panel import GraphicsHelperPanel
from . import developer_utils
import importlib
Expand All @@ -25,7 +26,7 @@
"name": "Loco Graphics Helper",
"description": "Render tool to replicate Locomotion graphics (based on RCT Graphics Helper)",
"author": "Olivier Wervers & OpenLoco Team",
"version": (0, 1, 6),
"version": (0, 1, 10),
"blender": (2, 79, 0),
"location": "Render",
"support": "COMMUNITY",
Expand Down Expand Up @@ -54,6 +55,7 @@ def register():
register_walls_properties()
register_track_properties()
register_object_properties()
register_file_updater()

print("Registered {} with {} modules".format(
bl_info["name"], len(modules)))
Expand All @@ -71,5 +73,6 @@ def unregister():
unregister_walls_properties()
unregister_track_properties()
unregister_object_properties()
unregister_file_updater()

print("Unregistered {}".format(bl_info["name"]))
19 changes: 19 additions & 0 deletions loco-graphics-helper/builders/task_builder.py
Original file line number Diff line number Diff line change
Expand Up @@ -7,12 +7,24 @@
RCT Graphics Helper is licensed under the GNU General Public License version 3.
'''

import bpy
from operator import length_hint
from ..frame import Frame
from ..render_task import RenderTask
from ..vehicle import get_vehicle_y_offset

# Builder for creating render tasks procedurally

def get_offset_y():
properties = bpy.context.scene.loco_graphics_helper_general_properties
if properties.render_mode == "TILES":
return 0
elif properties.render_mode == "VEHICLE":
return get_vehicle_y_offset()
elif properties.render_mode == "WALLS":
return 0
elif properties.render_mode == "TRACK":
return 0

class TaskBuilder:

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

frame.set_target_object(target_object)

frame.set_offset_y(get_offset_y())

self.angles.append(frame)
self.output_index = self.output_index + 1

def add_null_frames(self, number):
self.output_index += number

# Adds render angles for the given number of viewing angles relative to the currently configured rotation
def add_viewing_angles(self, number_of_viewing_angles, animation_frame_index=0, animation_frames=1, rotational_symmetry=False):

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

frame.set_occlusion_layers(self.occlusion_layers)

frame.set_offset_y(get_offset_y())

if self.occlusion_layers > 0:
output_indices = []
for k in range(self.occlusion_layers):
Expand Down
21 changes: 15 additions & 6 deletions loco-graphics-helper/frame.py
Original file line number Diff line number Diff line change
Expand Up @@ -14,6 +14,14 @@
# Representation of a frame that is to be rendered


def recursive_hide_children(object, hide, type = 'NONE'):
object.hide_render = hide
for child in object.children:
if child.loco_graphics_helper_object_properties.object_type != 'NONE':
if type != 'NONE':
continue
recursive_hide_children(child, hide)

class Frame:
def __init__(self, frame_index, task, view_angle, bank_angle=0, vertical_angle=0, mid_angle=0):
self.frame_index = frame_index
Expand Down Expand Up @@ -91,15 +99,13 @@ def prepare_scene(self):
continue
if o.loco_graphics_helper_object_properties.object_type == 'NONE':
continue
o.hide_render = True
for c in o.children:
c.hide_render = True
recursive_hide_children(o,True)

self.target_object.hide_render = False
for c in self.target_object.children:
c.hide_render = False
recursive_hide_children(self.target_object,False, self.target_object.loco_graphics_helper_object_properties.object_type)

object.location = self.target_object.matrix_world.translation
if self.target_object.loco_graphics_helper_vehicle_properties.bounding_box_override:
object.location = self.target_object.loco_graphics_helper_vehicle_properties.bounding_box_override.matrix_world.translation

# This is a little hacky...
if self.layer == 'Top Down Shadow':
Expand All @@ -126,6 +132,9 @@ def set_offset(self, offset_x, offset_y):
self.offset_x = offset_x
self.offset_y = offset_y

def set_offset_y(self, offset_y):
self.offset_y = offset_y

def set_multi_tile_size(self, width, length, invert_tile_positions):
self.width = width
self.length = length
Expand Down
52 changes: 35 additions & 17 deletions loco-graphics-helper/loco_object_helper_panel.py
Original file line number Diff line number Diff line change
Expand Up @@ -60,21 +60,31 @@ def draw_bogie_panel(self, context, layout):

vehicle_properties = context.object.loco_graphics_helper_vehicle_properties

row.prop(vehicle_properties, "null_component")
row = layout.row()

if vehicle_properties.null_component:
return

row.prop(vehicle_properties, "index")
row = layout.row()

row.prop(vehicle_properties, "is_clone")
row = layout.row()

row.prop(vehicle_properties, "is_inverted")
row = layout.row()

if vehicle_properties.is_clone:
row.prop(vehicle_properties, "index",text="Clone of bogie index:")
row = layout.row()
return

row.prop(vehicle_properties, "render_sprite")
row = layout.row()

box = layout.box()

row = box.row()
row.label("Track Properties:")
row.label("Sprite:")

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

row.prop(vehicle_properties, "index")
row = layout.row()

row.prop(vehicle_properties, "number_of_animation_frames")
row = layout.row()

row.prop(vehicle_properties, "rotational_symmetry")
row = layout.row()

row.prop(vehicle_properties, "bounding_box_override")

def draw_body_panel(self, context, layout):
scene = context.scene
general_properties = scene.loco_graphics_helper_general_properties
Expand All @@ -112,21 +121,31 @@ def draw_body_panel(self, context, layout):

vehicle_properties = context.object.loco_graphics_helper_vehicle_properties

row.prop(vehicle_properties, "null_component")
row = layout.row()

if vehicle_properties.null_component:
return

row.prop(vehicle_properties, "index")
row = layout.row()

row.prop(vehicle_properties, "is_clone")
row = layout.row()

row.prop(vehicle_properties, "is_inverted")
row = layout.row()

if vehicle_properties.is_clone:
row.prop(vehicle_properties, "index",text="Clone of body index:")
row = layout.row()
return


row.prop(vehicle_properties, "render_sprite")
row = layout.row()

box = layout.box()

row = box.row()
row.label("Track Properties:")
row.label("Sprites:")

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

row.prop(vehicle_properties, "roll_angle")
row = layout.row()

row.prop(vehicle_properties, "index")
row.prop(vehicle_properties, "tilt_angle")
row = layout.row()

row.prop(vehicle_properties, "number_of_animation_frames")
row = layout.row()

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

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

row.prop(vehicle_properties, "is_airplane")
row = layout.row()

row.prop(vehicle_properties, "bounding_box_override")
7 changes: 7 additions & 0 deletions loco-graphics-helper/operators/init_operator.py
Original file line number Diff line number Diff line change
Expand Up @@ -78,6 +78,13 @@ def execute(self, context):
compositorBuilder = CompositorBuilder()
compositorBuilder.build(context)

# Set project properties
properties = context.scene.loco_graphics_helper_general_properties
addon_prefs = context.user_preferences.addons["loco-graphics-helper"].preferences

properties.RCTPluginVersion = addon_prefs.RCTPluginVersion
properties.RCTPluginName = addon_prefs.printable_idname

return {'FINISHED'}

def delete_default_render_layer(self, context):
Expand Down
23 changes: 13 additions & 10 deletions loco-graphics-helper/operators/vehicle_render_operator.py
Original file line number Diff line number Diff line change
Expand Up @@ -13,6 +13,7 @@

from ..operators.render_operator import RCTRender
from ..angle_sections.track import track_angle_sections, track_angle_sections_names
from ..vehicle import get_number_of_sprites


class RenderVehicle(RCTRender, bpy.types.Operator):
Expand All @@ -36,18 +37,17 @@ def create_task(self, context):
self.task_builder.set_palette(self.palette_manager.get_base_palette(
general_props.palette, general_props.number_of_recolorables, "FULL"))

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]
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]
bodies = sorted(bodies, key=lambda x: x.loco_graphics_helper_vehicle_properties.index)
for body_object in bodies:
self.add_render_angles(body_object)

if bodies[0].loco_graphics_helper_vehicle_properties.is_airplane:
self.task_builder.set_cast_shadows(
True)
self.task_builder.set_cast_shadows(True)
self.task_builder.set_palette(self.palette_manager.get_shadow_palette())
self.add_airplane_shadow_render_angles(bodies[0])
else:
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]
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]
bogies = sorted(bogies, key=lambda x: x.loco_graphics_helper_vehicle_properties.index)
for bogie_object in bogies:
self.add_render_angles(bogie_object)
Expand All @@ -74,10 +74,13 @@ def should_render_feature(self, key, props):

def add_render_angles(self, object):
props = object.loco_graphics_helper_vehicle_properties
if not props.render_sprite:
self.task_builder.add_null_frames(get_number_of_sprites(object))
return
is_bogie = object.loco_graphics_helper_object_properties.object_type == "BOGIE"
target_object = object
animation_frames = props.number_of_animation_frames
roll_frames = 1 if props.roll_angle == 0 else 3
tilt_frames = 1 if props.tilt_angle == 0 else 3

for i in range(len(track_angle_sections_names)):
key = track_angle_sections_names[i]
Expand Down Expand Up @@ -118,12 +121,12 @@ def add_render_angles(self, object):
target_object = object

for i in range(num_viewing_angles):
if roll_frames != 1:
roll_angles = [0, props.roll_angle, -props.roll_angle]
for j, roll_angle in enumerate(roll_angles):
frame_index = start_output_index + i * roll_frames + j
if tilt_frames != 1:
tilt_angles = [0, props.tilt_angle, -props.tilt_angle]
for j, tilt_angle in enumerate(tilt_angles):
frame_index = start_output_index + i * tilt_frames + j
self.task_builder.set_rotation(
base_view_angle, roll_angle, vertical_angle=track_section[2])
base_view_angle, tilt_angle, vertical_angle=track_section[2])
self.task_builder.add_frame(
frame_index, num_viewing_angles, i, j, rotation_range, target_object)
else:
Expand Down
Loading