From ce41f6284a7d6931e6618321fd93264f7ba05fdf Mon Sep 17 00:00:00 2001 From: Olivier Wervers Date: Sun, 3 Dec 2023 15:58:13 +0000 Subject: [PATCH] Fix missing invert multi tile order --- rct-graphics-helper/__init__.py | 5 +- rct-graphics-helper/builders/scene_builder.py | 18 +++++-- rct-graphics-helper/builders/task_builder.py | 13 +++-- rct-graphics-helper/frame.py | 5 +- .../operators/render_tiles_operator.py | 2 +- .../operators/track_render_operator.py | 28 ++++++++++ .../operators/vehicle_render_operator.py | 2 +- .../tile_indices_render_processor.py | 4 ++ .../properties/general_properties.py | 20 ++++---- .../properties/tiles_properties.py | 11 ++-- .../properties/track_properties.py | 31 +++++++++++ .../rct_graphics_helper_panel.py | 48 +++++++++++++++++- rct-graphics-helper/renderer.py | 15 ++++++ .../res/palettes/default_full_palette.bmp | Bin 1034 -> 1034 bytes .../res/palettes/groups/lime_green.png | Bin 142 -> 176 bytes 15 files changed, 178 insertions(+), 24 deletions(-) create mode 100644 rct-graphics-helper/operators/track_render_operator.py create mode 100644 rct-graphics-helper/properties/track_properties.py diff --git a/rct-graphics-helper/__init__.py b/rct-graphics-helper/__init__.py index 7334a1c..9480164 100644 --- a/rct-graphics-helper/__init__.py +++ b/rct-graphics-helper/__init__.py @@ -14,6 +14,7 @@ from .properties.tiles_properties import register_tiles_properties, unregister_tiles_properties from .properties.walls_properties import register_walls_properties, unregister_walls_properties from .properties.general_properties import register_general_properties, unregister_general_properties +from .properties.track_properties import register_track_properties, unregister_track_properties from .rct_graphics_helper_panel import GraphicsHelperPanel from . import developer_utils import importlib @@ -23,7 +24,7 @@ "name": "RCT Graphics Helper", "description": "Render tool to replicate RCT graphics", "author": "Olivier Wervers", - "version": (0, 4, 1), + "version": (0, 4, 6), "blender": (2, 79, 0), "location": "Render", "support": "COMMUNITY", @@ -50,6 +51,7 @@ def register(): register_tiles_properties() register_vehicles_properties() register_walls_properties() + register_track_properties() print("Registered {} with {} modules".format( bl_info["name"], len(modules))) @@ -65,5 +67,6 @@ def unregister(): unregister_tiles_properties() unregister_vehicles_properties() unregister_walls_properties() + unregister_track_properties() print("Unregistered {}".format(bl_info["name"])) diff --git a/rct-graphics-helper/builders/scene_builder.py b/rct-graphics-helper/builders/scene_builder.py index 3d347f7..b8b440d 100644 --- a/rct-graphics-helper/builders/scene_builder.py +++ b/rct-graphics-helper/builders/scene_builder.py @@ -23,6 +23,8 @@ def __init__(self): def build(self, context): scene = context.scene + self.remove_scene_object(context, "Lamp") + # Root rig object rig_obj = self.create_scene_object(context, "Rig", None) rig_obj.location = (0, 0, 0) @@ -112,7 +114,7 @@ def create_main_light(self, context): lamp_data.use_diffuse = True lamp_data.shadow_method = "RAY_SHADOW" lamp_data.shadow_ray_sample_method = "ADAPTIVE_QMC" - lamp_data.shadow_ray_samples = 2 + lamp_data.shadow_ray_samples = 4 lamp_data.shadow_soft_size = 0.5 lamp_data.shadow_adaptive_threshold = 0.001 @@ -129,9 +131,13 @@ def create_filler_light(self, context): lamp_data = self.create_lamp_data(context, "FillerLight", "SUN") lamp_data.energy = 0.5 - lamp_data.use_specular = False + lamp_data.use_specular = True lamp_data.use_diffuse = True - lamp_data.shadow_method = "NOSHADOW" + lamp_data.shadow_method = "RAY_SHADOW" + lamp_data.shadow_ray_sample_method = "ADAPTIVE_QMC" + lamp_data.shadow_ray_samples = 4 + lamp_data.shadow_soft_size = 0.5 + lamp_data.shadow_adaptive_threshold = 0.001 lamp_object = self.create_scene_object( context, 'FillerLight', lamp_data) @@ -162,6 +168,12 @@ def create_scene_object(self, context, name, data=None): context.scene.objects[name], do_unlink=True) return bpy.data.objects.new(name, data) + def remove_scene_object(self, context, name): + if name in context.scene.objects: + bpy.data.objects.remove( + context.scene.objects[name], do_unlink=True) + + def create_lamp_data(self, context, name, type): name = self.prefix + name + self.suffix if name in bpy.data.lamps: diff --git a/rct-graphics-helper/builders/task_builder.py b/rct-graphics-helper/builders/task_builder.py index 3798b48..f0e28e6 100644 --- a/rct-graphics-helper/builders/task_builder.py +++ b/rct-graphics-helper/builders/task_builder.py @@ -28,6 +28,8 @@ def __init__(self): self.width = 1 self.length = 1 + self.invert_tile_positions = False + self.use_anti_aliasing = True self.anti_alias_with_background = False self.maintain_aliased_silhouette = True @@ -65,7 +67,7 @@ def add_viewing_angles(self, number_of_viewing_angles, animation_frame_index=0, frame_index = start_output_index + i * animation_frames + j frame = Frame(frame_index, self.task, angle + self.view_angle, self.bank_angle, self.vertical_angle, self.mid_angle) - frame.set_multi_tile_size(self.width, self.length) + frame.set_multi_tile_size(self.width, self.length, self.invert_tile_positions) frame.set_offset(self.offset_x, self.offset_y) @@ -92,8 +94,12 @@ def add_viewing_angles(self, number_of_viewing_angles, animation_frame_index=0, if frame.oversized: output_indices = [] for k in range(frame.width * frame.length): + tile_index = k + if frame.invert_tile_positions: + tile_index = (frame.width * frame.length - k - 1) output_indices.append( - start_output_index + k * animation_frames * number_of_viewing_angles + j * number_of_viewing_angles + i) + start_output_index + tile_index * animation_frames * number_of_viewing_angles + j * number_of_viewing_angles + i) + frame.set_output_indices(output_indices) self.angles.append(frame) @@ -129,9 +135,10 @@ def set_anti_aliasing_with_background(self, use_anti_aliasing, anti_alias_with_b not anti_alias_with_background) or maintain_aliased_silhouette) and use_anti_aliasing # Sets the size of the render in tiles - def set_size(self, width, length): + def set_size(self, width, length, invert_tile_positions): self.width = width self.length = length + self.invert_tile_positions = invert_tile_positions # Sets the rotation applied to future render angles def set_rotation(self, view_angle, bank_angle=0, vertical_angle=0, mid_angle=0): diff --git a/rct-graphics-helper/frame.py b/rct-graphics-helper/frame.py index ca5f279..5358ad6 100644 --- a/rct-graphics-helper/frame.py +++ b/rct-graphics-helper/frame.py @@ -28,6 +28,7 @@ def __init__(self, frame_index, task, view_angle, bank_angle=0, vertical_angle=0 self.width = 1 self.length = 1 self.oversized = False + self.invert_tile_positions = False self.recolorables = 0 @@ -99,11 +100,13 @@ def set_offset(self, offset_x, offset_y): self.offset_x = offset_x self.offset_y = offset_y - def set_multi_tile_size(self, width, length): + def set_multi_tile_size(self, width, length, invert_tile_positions): self.width = width self.length = length self.oversized = self.width > 1 or self.length > 1 + if self.oversized: + self.invert_tile_positions = invert_tile_positions def set_layer(self, layer_name): self.layer = layer_name diff --git a/rct-graphics-helper/operators/render_tiles_operator.py b/rct-graphics-helper/operators/render_tiles_operator.py index 8bf7952..4717bf5 100644 --- a/rct-graphics-helper/operators/render_tiles_operator.py +++ b/rct-graphics-helper/operators/render_tiles_operator.py @@ -35,7 +35,7 @@ def create_task(self, context): general_props.number_of_recolorables) self.task_builder.set_size( - props.object_width, props.object_length) + props.object_width, props.object_length, props.invert_tile_positions) for animationIndex in range(general_props.number_of_animation_frames): self.task_builder.add_viewing_angles( diff --git a/rct-graphics-helper/operators/track_render_operator.py b/rct-graphics-helper/operators/track_render_operator.py new file mode 100644 index 0000000..bfefd01 --- /dev/null +++ b/rct-graphics-helper/operators/track_render_operator.py @@ -0,0 +1,28 @@ +''' +Copyright (c) 2022 RCT Graphics Helper developers + +For a complete list of all authors, please refer to the addon's meta info. +Interested in contributing? Visit https://github.com/oli414/Blender-RCT-Graphics + +RCT Graphics Helper is licensed under the GNU General Public License version 3. +''' + +import bpy +import math +import os + +from .render_operator import RCTRender + + +class RenderTrack(RCTRender, bpy.types.Operator): + bl_idname = "render.rct_track" + bl_label = "Render RCT Track" + + def create_task(self, context): + scene = context.scene + props = scene.rct_graphics_helper_track_properties + general_props = scene.rct_graphics_helper_general_properties + + # Create the list of frames with our parameters + self.task_builder.clear() + return self.task_builder.create_task(context) diff --git a/rct-graphics-helper/operators/vehicle_render_operator.py b/rct-graphics-helper/operators/vehicle_render_operator.py index ffea7c0..176ee7e 100644 --- a/rct-graphics-helper/operators/vehicle_render_operator.py +++ b/rct-graphics-helper/operators/vehicle_render_operator.py @@ -27,7 +27,7 @@ def create_task(self, context): self.task_builder.set_anti_aliasing_with_background( context.scene.render.use_antialiasing, general_props.anti_alias_with_background, general_props.maintain_aliased_silhouette) self.task_builder.set_output_index(general_props.out_start_index) - self.task_builder.set_size(1, 1) + self.task_builder.set_size(1, 1, False) # Add vehicle frames self.task_builder.set_recolorables( diff --git a/rct-graphics-helper/processors/sub_processes/frame_processors/tile_indices_render_processor.py b/rct-graphics-helper/processors/sub_processes/frame_processors/tile_indices_render_processor.py index 11e10d0..39eb8d3 100644 --- a/rct-graphics-helper/processors/sub_processes/frame_processors/tile_indices_render_processor.py +++ b/rct-graphics-helper/processors/sub_processes/frame_processors/tile_indices_render_processor.py @@ -44,6 +44,10 @@ def process(self, frame, callback): meta_render_output = frame.get_meta_render_output_file_name( output_suffix) + if frame.oversized: + self.renderer.set_multi_tile_size(frame.width, frame.length) + else: + self.renderer.set_multi_tile_size(1, 1) self.renderer.set_layer(frame.layer) self.renderer.set_aa(self.with_anti_aliasing) self.renderer.set_meta_output_path( diff --git a/rct-graphics-helper/properties/general_properties.py b/rct-graphics-helper/properties/general_properties.py index db87757..6d079ad 100644 --- a/rct-graphics-helper/properties/general_properties.py +++ b/rct-graphics-helper/properties/general_properties.py @@ -39,7 +39,7 @@ class GeneralProperties(bpy.types.PropertyGroup): cast_shadows = bpy.props.BoolProperty( name="Shadows", - description="Control wether or not the render contains shadows.", + description="Control whether the lights should cast shadows.", default=True) anti_alias_with_background = bpy.props.BoolProperty( @@ -48,8 +48,8 @@ class GeneralProperties(bpy.types.PropertyGroup): default=False) maintain_aliased_silhouette = bpy.props.BoolProperty( - name="Maintain Aliased Silhouette", - description="Maintains the aliased image's silhouette.", + name="Maintain Aliased Silhouette (For modular pieces)", + description="The image is anti-aliased against the background, but is masked using the aliased silhoutte.", default=False) out_start_index = bpy.props.IntProperty( @@ -101,7 +101,9 @@ class GeneralProperties(bpy.types.PropertyGroup): ("VEHICLE", "Vehicle", "Renders a vehicle from the necesssary angles given a set of track ability flags.", 2), ("WALLS", "Walls", - "Renders a wall piece.", 3) + "Renders a wall piece.", 3), + ("TRACK", "Track", + "Renders track pieces.", 4) ) ) @@ -112,13 +114,13 @@ class GeneralProperties(bpy.types.PropertyGroup): build_gx = bpy.props.BoolProperty( name="Generate GX (optimized sprite file)", - description="Whether or not to create a .dat sprite file.", - default=True) + description="Whether or not to create a .dat sprite file. Having GXC installed is required.", + default=False) build_assetpack = bpy.props.BoolProperty( name="Generate the asset pack file", description="Whether or not to the ORCT2 asset pack file", - default=True) + default=False) copy_assetpack_to_orct2 = bpy.props.BoolProperty( name="Copy to OpenRCT2", @@ -127,12 +129,12 @@ class GeneralProperties(bpy.types.PropertyGroup): build_parkobj = bpy.props.BoolProperty( name="Generate .parkobj file", - description="Automatically build the .parkobj file.", + description="Automatically build the .parkobj file. An object.json file with the object description is required in the output folder.", default=False) copy_parkobj_to_orct2 = bpy.props.BoolProperty( name="Copy to OpenRCT2", - description="Copy the generated .parkobj file to the ORCT2 objects folder.", + description="Copy the generated .parkobj file to the ORCT2 objects folder. Linking your OpenRCT2 Documents folder is required in the add-on preferences.", default=False) diff --git a/rct-graphics-helper/properties/tiles_properties.py b/rct-graphics-helper/properties/tiles_properties.py index b481c04..2415754 100644 --- a/rct-graphics-helper/properties/tiles_properties.py +++ b/rct-graphics-helper/properties/tiles_properties.py @@ -19,20 +19,25 @@ class TilesProperties(bpy.types.PropertyGroup): viewing_angles = bpy.props.IntProperty( name="Viewing Angles", - description="Number of viewing angles to render for", + description="Number of viewing angles to render for.", default=4, min=1) object_width = bpy.props.IntProperty( name="Object Width", - description="Width of the object in tiles. Only used for large scenery", + description="Width of the object in tiles. Only used for large scenery.", default=1, min=1) object_length = bpy.props.IntProperty( name="Object Length", - description="Length of the object in tiles. Only used for large scenery", + description="Length of the object in tiles. Only used for large scenery.", default=1, min=1) + + invert_tile_positions = bpy.props.BoolProperty( + name="Invert Tile Positions", + description="Some large scenery pieces extend into the negative axis, whilst others extends into the positive axis. Use this setting to switch between the two.", + default=False) def register_tiles_properties(): diff --git a/rct-graphics-helper/properties/track_properties.py b/rct-graphics-helper/properties/track_properties.py new file mode 100644 index 0000000..307c19a --- /dev/null +++ b/rct-graphics-helper/properties/track_properties.py @@ -0,0 +1,31 @@ +''' +Copyright (c) 2022 RCT Graphics Helper developers + +For a complete list of all authors, please refer to the addon's meta info. +Interested in contributing? Visit https://github.com/oli414/Blender-RCT-Graphics + +RCT Graphics Helper is licensed under the GNU General Public License version 3. +''' + +import bpy +import math +import os + +from ..builders.task_builder import TaskBuilder + +from ..operators.render_operator import RCTRender + +class TrackProperties(bpy.types.PropertyGroup): + placeholder = bpy.props.BoolProperty( + name="Placeholder", + description="Test.", + default=False) + + +def register_track_properties(): + bpy.types.Scene.rct_graphics_helper_track_properties = bpy.props.PointerProperty( + type=TrackProperties) + + +def unregister_track_properties(): + del bpy.types.Scene.rct_graphics_helper_track_properties diff --git a/rct-graphics-helper/rct_graphics_helper_panel.py b/rct-graphics-helper/rct_graphics_helper_panel.py index ce2e703..28fab1a 100644 --- a/rct-graphics-helper/rct_graphics_helper_panel.py +++ b/rct-graphics-helper/rct_graphics_helper_panel.py @@ -17,12 +17,30 @@ from .operators.walls_render_operator import RenderWalls +from .operators.track_render_operator import RenderTrack + from .operators.render_tiles_operator import RenderTiles from .models.palette import palette_colors, palette_colors_details -class GraphicsHelperPanel(bpy.types.Panel): +class RepairConfirmOperator(bpy.types.Operator): + """This action will clear out the default camera and light. Changes made to the rig object, compositor nodes and recolorable materials will be lost.""" + bl_idname = "rct_graphics_helper.repair_confirm" + bl_label = "Do you want to (re)create the base scene?" + bl_options = {'REGISTER', 'INTERNAL'} + + @classmethod + def poll(cls, context): + return True + + def execute(self, context): + bpy.ops.render.rct_init() + return {'FINISHED'} + + def invoke(self, context, event): + return context.window_manager.invoke_confirm(self, event) +class GraphicsHelperPanel(bpy.types.Panel): bl_label = "RCT Graphics Helper" bl_idname = "VIEW3D_PT_rct_graphics_helper" bl_space_type = 'VIEW_3D' @@ -35,7 +53,7 @@ def draw(self, context): scene = context.scene row = layout.row() - row.operator("render.rct_init", text="Initialize / Repair") + row.operator("rct_graphics_helper.repair_confirm", text="Initialize / Repair") if not "Rig" in context.scene.objects: return @@ -115,6 +133,8 @@ def draw(self, context): self.draw_vehicle_panel(scene, box) elif properties.render_mode == "WALLS": self.draw_walls_panel(scene, box) + elif properties.render_mode == "TRACK": + self.draw_track_panel(scene, box) row = layout.row() row.prop(properties, "build_gx") @@ -145,6 +165,10 @@ def draw_tiles_panel(self, scene, layout): row.prop(properties, "object_width") row.prop(properties, "object_length") + row = layout.row() + if properties.object_width > 1 or properties.object_length > 1: + row.prop(properties, "invert_tile_positions") + row = layout.row() text = "Render" if general_properties.rendering: @@ -170,6 +194,26 @@ def draw_walls_panel(self, scene, layout): text = "Failed" row.operator("render.rct_walls", text=text) + def draw_track_panel(self, scene, layout): + properties = scene.rct_graphics_helper_track_properties + general_properties = scene.rct_graphics_helper_general_properties + + row = layout.row() + row.label("Work in progress") + + #row = layout.row() + #row.operator("render.rct_track", text="Generate Splines") + # + #row = layout.row() + #row.prop(properties, "placeholder") +# + #if "Rig" in context.scene.objects: + # row = layout.row() + # text = "Render" + # if general_properties.rendering: + # text = "Failed" + # row.operator("render.rct_track", text=text) + def draw_vehicle_panel(self, scene, layout): properties = scene.rct_graphics_helper_vehicle_properties general_properties = scene.rct_graphics_helper_general_properties diff --git a/rct-graphics-helper/renderer.py b/rct-graphics-helper/renderer.py index ab089a6..ff257cc 100644 --- a/rct-graphics-helper/renderer.py +++ b/rct-graphics-helper/renderer.py @@ -143,6 +143,21 @@ def set_override_material(self, material): self.context.scene.render.layers["Riders {}".format( i + 1)].material_override = material + def set_multi_tile_size(self, width, length): + width_node = None + length_node = None + for key, value in self.context.scene.node_tree.nodes.items(): + if value.label == "width": + width_node = value + value.outputs[0].default_value = width + if value.label == "length": + length_node = value + value.outputs[0].default_value = length + if width_node is None: + raise Exception("Width composite node could not be found, please click repair") + if length_node is None: + raise Exception("Length composite node could not be found, please click repair") + # Sets the active render layer def set_layer(self, layer_name): layers = ["Editor"] diff --git a/rct-graphics-helper/res/palettes/default_full_palette.bmp b/rct-graphics-helper/res/palettes/default_full_palette.bmp index cca72e586876a30fe2779f5a5962717da8e2e8f2..85f65ee90e247ad5390d75357c86c808af726e0b 100644 GIT binary patch delta 60 zcmV-C0K@-^2#N@>N&+tcKM(%^QxpFHXBYnfdmsM?k0<{ZpEv&}uSfqszgz!T&u{;8 S-;4i`@1y^-|HHF+0+9jiWE}Yb delta 16 XcmeC;=;GMm#WeXDlfmXHrU{GyFtr7Y diff --git a/rct-graphics-helper/res/palettes/groups/lime_green.png b/rct-graphics-helper/res/palettes/groups/lime_green.png index 2de30a4448245bf98d1f72e22c134f4629c74bea..cdeefb447b8675bd75edea5afe52902acb3ab752 100644 GIT binary patch delta 113 zcmV-%0FM8T0k8p(B#|*CXBc!vSaefwW^{L9a%BK;VQFr3E^cLXAT%y9E;jv63FrU- z04_;HK~xx5W8k-E5DsP#PiK&?W>D{EH=i%=zFs|gzkUAs@b3G?i{JMj{=XRjugMMd TjpGQ_00000NkvXXu0mjfd#f&L delta 77 zcmdnM*vB|Qg^RH`$lZxy-8q?;6BRWqls#P>LnOkJpKMQ05M)&36G#$gU>0QLRG1_< gVWPl