Skip to content

Commit f7647f0

Browse files
Initial changes for airplane shadows
1 parent 7bf0fa5 commit f7647f0

14 files changed

+144
-9
lines changed

loco-graphics-helper/builders/materials_builder.py

Lines changed: 13 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -28,6 +28,8 @@ def build(self, context):
2828
self.create_recolorable_material("Recolorable 1", (0.4, 0.3, 0.5), 1)
2929
self.create_recolorable_material("Recolorable 2", (0.9, 0.1, 0.4), 2)
3030

31+
self.create_shadow_capture_material("Shadow Capture")
32+
3133
def create_recolorable_material(self, name, color, pass_index):
3234
material = self.create_material(name)
3335

@@ -43,6 +45,17 @@ def create_recolorable_material(self, name, color, pass_index):
4345

4446
return material
4547

48+
def create_shadow_capture_material(self, name):
49+
material = self.create_material(name)
50+
51+
material.diffuse_color = (0.8, 0.8, 0.8)
52+
material.diffuse_intensity = 1
53+
54+
material.use_only_shadow = True
55+
material.shadow_only_type = 'SHADOW_ONLY'
56+
57+
return material
58+
4659
def create_world_position_material(self, context):
4760
material = self.create_material("WorldPosition")
4861

loco-graphics-helper/builders/scene_builder.py

Lines changed: 39 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -71,6 +71,15 @@ def build(self, context):
7171

7272
scene.objects.link(dome_light_obj)
7373
dome_light_obj.parent = vertical_joint_obj
74+
75+
# Airplane shadows light
76+
airplane_light_obj = self.create_airplane_shadow_light(context)
77+
78+
b = scene.objects.link(airplane_light_obj)
79+
airplane_light_obj.parent = vertical_joint_obj
80+
airplane_light_obj.layers[2] = True
81+
airplane_light_obj.layers[0] = False
82+
print(airplane_light_obj.layers[0])
7483

7584
# Environment lighting
7685
light_settings = scene.world.light_settings
@@ -81,6 +90,15 @@ def build(self, context):
8190
light_settings.distance = 0
8291
light_settings.samples = 1
8392

93+
bpy.ops.mesh.primitive_plane_add(location=(0,0,0), radius=20)
94+
shadow_catcher = bpy.context.active_object
95+
shadow_catcher.name = "ShadowCatcher"
96+
shadow_catcher.layers[2] = True
97+
shadow_catcher.layers[0] = False
98+
shadow_catcher.hide = True
99+
shadow_catcher.hide_select = True
100+
shadow_catcher.data.materials.append(bpy.data.materials.get("Shadow Capture"))
101+
84102
def create_camera(self, context):
85103
name = self.prefix + "Camera" + self.suffix
86104
if name in bpy.data.cameras:
@@ -163,6 +181,27 @@ def create_light_dome(self, context):
163181

164182
return lamp_object
165183

184+
def create_airplane_shadow_light(self, context):
185+
lamp_data = self.create_lamp_data(context, "AirplaneShadowLight", "SUN")
186+
187+
lamp_data.energy = 1.3
188+
lamp_data.use_specular = True
189+
lamp_data.use_diffuse = True
190+
lamp_data.shadow_method = "RAY_SHADOW"
191+
lamp_data.shadow_ray_sample_method = "ADAPTIVE_QMC"
192+
lamp_data.shadow_ray_samples = 4
193+
lamp_data.shadow_soft_size = 0.5
194+
lamp_data.shadow_adaptive_threshold = 0.001
195+
196+
lamp_object = self.create_scene_object(context, 'AirplaneShadowLight', lamp_data)
197+
198+
lamp_object.hide = True
199+
lamp_object.hide_select = True
200+
lamp_object.location = (0, 0, 0)
201+
lamp_object.rotation_euler = (math.radians(0), 0, math.radians(90))
202+
203+
return lamp_object
204+
166205
def create_scene_object(self, context, name, data=None):
167206
name = self.prefix + name + self.suffix
168207
if name in context.scene.objects:

loco-graphics-helper/builders/task_builder.py

Lines changed: 10 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -38,6 +38,8 @@ def __init__(self):
3838

3939
self.recolorables = 0
4040

41+
self.cast_shadows = True
42+
4143
self.layer = "Editor"
4244

4345
self.palette = None
@@ -67,6 +69,8 @@ def add_frame(self, frame_index, number_of_viewing_angles, angle_index, animatio
6769

6870
frame.set_recolorables(self.recolorables)
6971

72+
frame.set_cast_shadows(self.cast_shadows)
73+
7074
frame.set_layer(self.layer)
7175

7276
frame.set_base_palette(self.palette)
@@ -104,6 +108,8 @@ def add_viewing_angles(self, number_of_viewing_angles, animation_frame_index=0,
104108

105109
frame.set_recolorables(self.recolorables)
106110

111+
frame.set_cast_shadows(self.cast_shadows)
112+
107113
frame.set_layer(self.layer)
108114

109115
frame.set_base_palette(self.palette)
@@ -146,6 +152,10 @@ def add_viewing_angles(self, number_of_viewing_angles, animation_frame_index=0,
146152
def set_recolorables(self, number_of_recolorables):
147153
self.recolorables = number_of_recolorables
148154

155+
# Sets the number of recolorable materials
156+
def set_cast_shadows(self, cast_shadows):
157+
self.cast_shadows = cast_shadows
158+
149159
# Sets the base palette to use
150160
def set_palette(self, palette):
151161
self.palette = palette

loco-graphics-helper/frame.py

Lines changed: 5 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -42,6 +42,8 @@ def __init__(self, frame_index, task, view_angle, bank_angle=0, vertical_angle=0
4242
self.anti_alias_with_background = False
4343
self.maintain_aliased_silhouette = True
4444

45+
self.cast_shadows = True
46+
4547
self.offset_x = 0
4648
self.offset_y = 0
4749

@@ -150,3 +152,6 @@ def set_output_indices(self, indices):
150152

151153
def set_target_object(self, object):
152154
self.target_object = object
155+
156+
def set_cast_shadows(self, cast_shadows):
157+
self.cast_shadows = cast_shadows

loco-graphics-helper/loco_object_helper_panel.py

Lines changed: 3 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -130,3 +130,6 @@ def draw_car_panel(self, context, layout):
130130
if vehicle_properties.braking_lights and vehicle_properties.roll_angle != 0:
131131
row.label("WARNING CANNOT HAVE BOTH BRAKING LIGHTS AND ROLL ANGLE SET")
132132
row = layout.row()
133+
134+
row.prop(vehicle_properties, "is_airplane")
135+
row = layout.row()

loco-graphics-helper/operators/init_operator.py

Lines changed: 12 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -57,18 +57,27 @@ def execute(self, context):
5757
True, False, False, False, False, False, False, False, False, False, False)
5858
braking_lights_layer.use = False
5959

60+
braking_lights_layer = self.create_render_layer(context, "Top Down Shadow")
61+
braking_lights_layer.layers = (False, False, True, False, False, False, False, False,
62+
False, False, False, False, False, False, False, False, False, False, False, False)
63+
braking_lights_layer.layers_zmask = (False, False, True, False, False, False, False, False, False,
64+
False, False, False, False, False, False, False, False, False, False, False)
65+
braking_lights_layer.use = False
66+
6067
self.delete_default_render_layer(context)
6168

6269
# Create dependencies in the context
70+
71+
# Materials used in scene builder so do this first
72+
materialsBuilder = MaterialsBuilder()
73+
materialsBuilder.build(context)
74+
6375
sceneBuilder = SceneBuilder()
6476
sceneBuilder.build(context)
6577

6678
compositorBuilder = CompositorBuilder()
6779
compositorBuilder.build(context)
6880

69-
materialsBuilder = MaterialsBuilder()
70-
materialsBuilder.build(context)
71-
7281
return {'FINISHED'}
7382

7483
def delete_default_render_layer(self, context):

loco-graphics-helper/operators/render_tiles_operator.py

Lines changed: 3 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -34,6 +34,9 @@ def create_task(self, context):
3434
self.task_builder.set_recolorables(
3535
general_props.number_of_recolorables)
3636

37+
self.task_builder.set_cast_shadows(
38+
general_props.cast_shadows)
39+
3740
self.task_builder.set_size(
3841
props.object_width, props.object_length, props.invert_tile_positions)
3942

loco-graphics-helper/operators/vehicle_render_operator.py

Lines changed: 39 additions & 4 deletions
Original file line numberDiff line numberDiff line change
@@ -31,6 +31,8 @@ def create_task(self, context):
3131
# Add vehicle frames
3232
self.task_builder.set_recolorables(
3333
general_props.number_of_recolorables)
34+
self.task_builder.set_cast_shadows(
35+
general_props.cast_shadows)
3436
self.task_builder.set_palette(self.palette_manager.get_base_palette(
3537
general_props.palette, general_props.number_of_recolorables, "FULL"))
3638

@@ -39,10 +41,15 @@ def create_task(self, context):
3941
for car_object in cars:
4042
self.add_render_angles(car_object)
4143

42-
bogies = [x for x in context.scene.objects if x.loco_graphics_helper_object_properties.object_type == "BOGIE"]
43-
bogies = sorted(bogies, key=lambda x: x.loco_graphics_helper_vehicle_properties.index)
44-
for bogie_object in bogies:
45-
self.add_render_angles(bogie_object)
44+
if cars[0].loco_graphics_helper_vehicle_properties.is_airplane:
45+
self.task_builder.set_cast_shadows(
46+
True)
47+
self.add_airplane_shadow_render_angles(cars[0])
48+
else:
49+
bogies = [x for x in context.scene.objects if x.loco_graphics_helper_object_properties.object_type == "BOGIE"]
50+
bogies = sorted(bogies, key=lambda x: x.loco_graphics_helper_vehicle_properties.index)
51+
for bogie_object in bogies:
52+
self.add_render_angles(bogie_object)
4653

4754
return self.task_builder.create_task(context)
4855

@@ -122,3 +129,31 @@ def add_render_angles(self, car_object):
122129
self.task_builder.add_frame(
123130
frame_index, num_viewing_angles, i, 0, rotation_range, car_object)
124131
self.task_builder.set_layer("Editor")
132+
133+
def add_airplane_shadow_render_angles(self, car_object):
134+
props = car_object.loco_graphics_helper_vehicle_properties
135+
136+
track_sections = track_angle_sections["VEHICLE_SPRITE_FLAG_FLAT"]
137+
for track_section in track_sections:
138+
139+
base_view_angle = 0
140+
self.task_builder.set_rotation(
141+
base_view_angle, 0, vertical_angle=track_section[2])
142+
143+
num_viewing_angles = int(props.flat_viewing_angles)
144+
145+
rotational_symmetry = props.rotational_symmetry
146+
147+
if rotational_symmetry:
148+
num_viewing_angles = int(num_viewing_angles / 2)
149+
150+
rotation_range = 180 if rotational_symmetry else 360
151+
152+
start_output_index = self.task_builder.output_index
153+
154+
for i in range(num_viewing_angles):
155+
self.task_builder.set_layer("Top Down Shadow")
156+
frame_index = start_output_index + i
157+
self.task_builder.add_frame(
158+
frame_index, num_viewing_angles, i, 0, rotation_range, car_object)
159+
self.task_builder.set_layer("Editor")

loco-graphics-helper/operators/walls_render_operator.py

Lines changed: 3 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -94,6 +94,9 @@ def create_task(self, context):
9494
self.task_builder.set_recolorables(
9595
general_props.number_of_recolorables)
9696

97+
self.task_builder.set_cast_shadows(
98+
general_props.cast_shadows)
99+
97100
sloped_a_anim_frame = general_props.number_of_animation_frames
98101
sloped_b_anim_frame = general_props.number_of_animation_frames * 2
99102

loco-graphics-helper/processors/sub_processes/frame_processors/render_processor.py

Lines changed: 2 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -35,6 +35,8 @@ def process(self, frame, callback):
3535

3636
self.renderer.set_aa(frame.use_anti_aliasing)
3737
self.renderer.set_aa_with_background(frame.anti_alias_with_background)
38+
39+
self.renderer.set_cast_shadows(frame.cast_shadows)
3840

3941
self.renderer.set_animation_frame(frame.animation_frame_index)
4042

0 commit comments

Comments
 (0)