From d1bce280c9d79321621b362f10bbddeb2b50a3c8 Mon Sep 17 00:00:00 2001 From: Spacek531 Date: Sun, 12 Mar 2023 00:51:36 -0800 Subject: [PATCH 1/9] initial implementation of new sprite groups --- rct-graphics-helper/angle_sections/track.py | 267 +++++++++++++++--- .../operators/vehicle_render_operator.py | 93 +++--- .../properties/vehicle_properties.py | 104 +++---- .../rct_graphics_helper_panel.py | 48 +++- 4 files changed, 330 insertions(+), 182 deletions(-) diff --git a/rct-graphics-helper/angle_sections/track.py b/rct-graphics-helper/angle_sections/track.py index 38f13b7..4727952 100644 --- a/rct-graphics-helper/angle_sections/track.py +++ b/rct-graphics-helper/angle_sections/track.py @@ -1,5 +1,5 @@ ''' -Copyright (c) 2022 RCT Graphics Helper developers +Copyright (c) 2023 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 @@ -7,45 +7,47 @@ RCT Graphics Helper is licensed under the GNU General Public License version 3. ''' -track_angle_sections_names = [ - "VEHICLE_SPRITE_FLAG_FLAT", - "VEHICLE_SPRITE_FLAG_GENTLE_SLOPES", - "VEHICLE_SPRITE_FLAG_STEEP_SLOPES", - "VEHICLE_SPRITE_FLAG_VERTICAL_SLOPES", - "VEHICLE_SPRITE_FLAG_DIAGONAL_SLOPES", - "VEHICLE_SPRITE_FLAG_FLAT_BANKED", - "VEHICLE_SPRITE_FLAG_INLINE_TWISTS", - "VEHICLE_SPRITE_FLAG_FLAT_TO_GENTLE_SLOPE_BANKED_TRANSITIONS", - "VEHICLE_SPRITE_FLAG_DIAGONAL_GENTLE_SLOPE_BANKED_TRANSITIONS", - "VEHICLE_SPRITE_FLAG_GENTLE_SLOPE_BANKED_TRANSITIONS", - "VEHICLE_SPRITE_FLAG_GENTLE_SLOPE_BANKED_TURNS", - "VEHICLE_SPRITE_FLAG_FLAT_TO_GENTLE_SLOPE_WHILE_BANKED_TRANSITIONS", - "VEHICLE_SPRITE_FLAG_CORKSCREWS", - "VEHICLE_SPRITE_FLAG_RESTRAINT_ANIMATION", - "VEHICLE_SPRITE_FLAG_CURVED_LIFT_HILL" +# This is the order sprite groups are rendered in +sprite_group_names = [ + "slopeFlat", "slopes12", "slopes25", "slopes42", "slopes60", + "slopes75", "slopes90", "slopesLoop", "slopeInverted", "slopes8", + "slopes16", "slopes50", "flatBanked22", "flatBanked45", "flatBanked67", + "flatBanked90", "inlineTwists", "slopes12Banked22", "slopes8Banked22", "slopes25Banked22", + "slopes25Banked45", "slopes12Banked45", "slopes25Banked67", "slopes25Banked90", "slopes25InlineTwists", + "slopes42Banked22", "slopes42Banked45", "slopes42Banked67", "slopes42Banked90", "slopes60Banked22", + "corkscrews", "restraintAnimation", "curvedLiftHillUp", "curvedLiftHillDown" ] -track_angle_sections = { - "VEHICLE_SPRITE_FLAG_FLAT": [ +# The sprites to render in each sprite group. The given rotation values are used in simple mode +sprite_group_manifest = { + 'slopeFlat': [ [False, 32, 0, 0, 0] ], - "VEHICLE_SPRITE_FLAG_GENTLE_SLOPES": [ + 'slopes12': [ [False, 4, 11.1026, 0, 0], - [False, 4, -11.1026, 0, 0], + [False, 4, -11.1026, 0, 0] + ], + 'slopes25': [ [False, 32, 22.2052, 0, 0], [False, 32, -22.2052, 0, 0] ], - "VEHICLE_SPRITE_FLAG_STEEP_SLOPES": [ + 'slopes42': [ [False, 8, 40.36, 0, 0], - [False, 8, -40.36, 0, 0], + [False, 8, -40.36, 0, 0] + ], + 'slopes60': [ [False, 32, 58.5148, 0, 0], [False, 32, -58.5148, 0, 0] ], - "VEHICLE_SPRITE_FLAG_VERTICAL_SLOPES": [ + 'slopes75': [ [False, 4, 75, 0, 0], - [False, 4, -75, 0, 0], + [False, 4, -75, 0, 0] + ], + 'slopes90': [ [False, 32, 90, 0, 0], - [False, 32, -90, 0, 0], + [False, 32, -90, 0, 0] + ], + 'slopesLoop': [ [False, 4, 105, 0, 0], [False, 4, -105, 0, 0], [False, 4, 120, 0, 0], @@ -55,29 +57,40 @@ [False, 4, 150, 0, 0], [False, 4, -150, 0, 0], [False, 4, 165, 0, 0], - [False, 4, -165, 0, 0], + [False, 4, -165, 0, 0] + ], + 'slopeInverted': [ [False, 4, 180, 0, 0] ], - "VEHICLE_SPRITE_FLAG_DIAGONAL_SLOPES": [ + 'slopes8': [ [True, 4, 8.0503, 0, 0], - [True, 4, -8.0503, 0, 0], + [True, 4, -8.0503, 0, 0] + ], + 'slopes16': [ [True, 4, 16.1005, 0, 0], - [True, 4, -16.1005, 0, 0], + [True, 4, -16.1005, 0, 0] + ], + 'slopes50': [ [True, 4, 49.1035, 0, 0], [True, 4, -49.1035, 0, 0] ], - "VEHICLE_SPRITE_FLAG_FLAT_BANKED": [ + 'flatBanked22': [ [False, 8, 0, -22.5, 0], - [False, 8, 0, 22.5, 0], + [False, 8, 0, 22.5, 0] + ], + 'flatBanked45': [ [False, 32, 0, -45, 0], [False, 32, 0, 45, 0] ], - "VEHICLE_SPRITE_FLAG_INLINE_TWISTS": [ - # The banking sprites are used at the start of a twist ((180-MAX_BANK)/6*FRAME)+MAX_BANK + 'flatBanked67': [ [False, 4, 0, -67.5, 0], - [False, 4, 0, 67.5, 0], + [False, 4, 0, 67.5, 0] + ], + 'flatBanked90': [ [False, 4, 0, -90, 0], - [False, 4, 0, 90, 0], + [False, 4, 0, 90, 0] + ], + 'inlineTwists': [ [False, 4, 0, -112.5, 0], [False, 4, 0, 112.5, 0], [False, 4, 0, -135, 0], @@ -85,37 +98,93 @@ [False, 4, 0, -157.5, 0], [False, 4, 0, 157.5, 0] ], - "VEHICLE_SPRITE_FLAG_FLAT_TO_GENTLE_SLOPE_BANKED_TRANSITIONS": [ + 'slopes12Banked22': [ [False, 32, 11.1026, -22.5, 0], [False, 32, 11.1026, 22.5, 0], [False, 32, -11.1026, -22.5, 0], [False, 32, -11.1026, 22.5, 0] ], - "VEHICLE_SPRITE_FLAG_DIAGONAL_GENTLE_SLOPE_BANKED_TRANSITIONS": [ + 'slopes8Banked22': [ [True, 4, 8.0503, -22.5, 0], [True, 4, 8.0503, 22.5, 0], [True, 4, -8.0503, -22.5, 0], [True, 4, -8.0503, 22.5, 0] ], - "VEHICLE_SPRITE_FLAG_GENTLE_SLOPE_BANKED_TRANSITIONS": [ + 'slopes25Banked22': [ [False, 4, 22.2052, -22.5, 0], [False, 4, 22.2052, 22.5, 0], [False, 4, -22.2052, -22.5, 0], [False, 4, -22.2052, 22.5, 0] ], - "VEHICLE_SPRITE_FLAG_GENTLE_SLOPE_BANKED_TURNS": [ + 'slopes25Banked45': [ [False, 32, 22.2052, -45, 0], [False, 32, 22.2052, 45, 0], [False, 32, -22.2052, -45, 0], [False, 32, -22.2052, 45, 0] ], - "VEHICLE_SPRITE_FLAG_FLAT_TO_GENTLE_SLOPE_WHILE_BANKED_TRANSITIONS": [ + 'slopes12Banked45': [ [False, 4, 11.1026, -45, 0], [False, 4, 11.1026, 45, 0], [False, 4, -11.1026, -45, 0], [False, 4, -11.1026, 45, 0] ], - "VEHICLE_SPRITE_FLAG_CORKSCREWS": [ + 'slopes25Banked67': [ + [False, 4, 22.2052, -67.5, 0], + [False, 4, 22.2052, 67.5, 0], + [False, 4, -22.2052, -67.5, 0], + [False, 4, -22.2052, 67.5, 0] + ], + 'slopes25Banked90': [ + [False, 4, 22.2052, -90, 0], + [False, 4, 22.2052, 90, 0], + [False, 4, -22.2052, -90, 0], + [False, 4, -22.2052, 90, 0] + ], + 'slopes25InlineTwists': [ + [False, 4, 22.2052, -112.5, 0], + [False, 4, 22.2052, 112.5, 0], + [False, 4, 22.2052, -135, 0], + [False, 4, 22.2052, 135, 0], + [False, 4, 22.2052, -157.5, 0], + [False, 4, 22.2052, 157.5, 0], + [False, 4, -22.2052, -112.5, 0], + [False, 4, -22.2052, 112.5, 0], + [False, 4, -22.2052, -135, 0], + [False, 4, -22.2052, 135, 0], + [False, 4, -22.2052, -157.5, 0], + [False, 4, -22.2052, 157.5, 0] + ], + 'slopes42Banked22': [ + [False, 8, 40.36, -22.5, 0], + [False, 8, 40.36, 22.5, 0], + [False, 8, -40.36, -22.5, 0], + [False, 8, -40.36, 22.5, 0] + ], + 'slopes42Banked45': [ + [False, 8, 40.36, -45, 0], + [False, 8, 40.36, 45, 0], + [False, 8, -40.36, -45, 0], + [False, 8, -40.36, 45, 0] + ], + 'slopes42Banked67': [ + [False, 8, 40.36, -67.5, 0], + [False, 8, 40.36, 67.5, 0], + [False, 8, -40.36,-67.5, 0], + [False, 8, -40.36, 67.5, 0] + ], + 'slopes42Banked90': [ + [False, 8, 40.36, -90, 0], + [False, 8, 40.36, 90, 0], + [False, 8, -40.36, -90, 0], + [False, 8, -40.36, 90, 0] + ], + 'slopes60Banked22': [ + [False, 32, 58.5148, -22.5, 0], + [False, 32, 58.5148, 22.5, 0], + [False, 32, -58.5148, -22.5, 0], + [False, 32, -58.5148, 22.5, 0] + ], + 'corkscrews': [ [False, 4, 22.21, 20.7, 4.11], [False, 4, 50.77, 37.76, 18.43], [False, 4, 90, 45, 45], @@ -140,10 +209,120 @@ [False, 4, -129.23, 37.76, -71.57], [False, 4, -157.79, 20.7, -85.89], ], - "VEHICLE_SPRITE_FLAG_RESTRAINT_ANIMATION": [ + 'restraintAnimation': [ [False, 4, 0, 0, 0] ], - "VEHICLE_SPRITE_FLAG_CURVED_LIFT_HILL": [ + 'curvedLiftHillUp': [ + [False, 32, 9.8287, 0, 0] + ], + 'curvedLiftHillDown': [ [False, 32, 9.8287, 0, 0] ] } + +# Default sprite precision for full mode, the tooltip for the sprite group, and if the sprite group should be hidden from the list of sprite groups +sprite_group_metadata = { + "slopeFlat": [32, "Flat track"], + "slopes12": [4, "Orthogonal flat-to-gentle slope track"], + "slopes25": [32, "Orthogonal gentle slope track"], + "slopes42": [8, "Gentle-to-steep slope track"], + "slopes60": [32, "Orthogonal steep slope track"], + "slopes75": [4, "Steep-to-vertical slope track"], + "slopes90": [4, "Vertical track"], + "slopesLoop": [4,"Loop track"], + "slopeInverted": [4, "Fully inverted track"], + "slopes8": [4, "Diagonal flat-to-gentle slope track"], + "slopes16": [4, "Diagonal gentle slope track"], + "slopes50": [4, "Diagonal steep track"], + "flatBanked22": [8, "Flat-to-bank transition track"], + "flatBanked45": [32, "Flat banked track"], + "flatBanked67": [4, "Flat steep banked track"], + "flatBanked90": [4, "Flat vertically-banked track"], + "inlineTwists": [4, "Flat inline twists"], + "slopes12Banked22": [32, "Orthogonal flat-to-gentle-and-flat-to-banked transition track"], + "slopes8Banked22": [4, "Diagonal flat-to-gentle-and-flat-to-banked transition track"], + "slopes25Banked22": [4, "Orthogonal gentle slope flat-to-bank transition track"], + "slopes25Banked45": [32, "Gentle sloped banked turns"], + "slopes12Banked45": [4, "Orthogonal flat-to-gentle-slope banked transition track"], + "slopes25Banked67": [4, "Part of small zero-G rolls"], + "slopes25Banked90": [4, "Part of small zero-G rolls"], + "slopes25InlineTwists": [4, "Part of large zero-G roll"], + "slopes42Banked22": [4, "Part of large zero-G roll"], + "slopes42Banked45": [4, "Part of large zero-G roll"], + "slopes42Banked67": [4, "Part of large zero-G roll"], + "slopes42Banked90": [4, "Part of large zero-G roll"], + "slopes60Banked22": [4, "Part of large zero-G roll"], + "corkscrews": [4, "Corkscrew track"], + "restraintAnimation": [4, "Animated restraints"], + "curvedLiftHillUp": [32, "Sprial lifthill up track"], + "curvedLiftHillDown": [32, "Spiral lifthill down track"] +} + +legacy_group_names = [ + "VEHICLE_SPRITE_FLAG_FLAT", + "VEHICLE_SPRITE_FLAG_GENTLE_SLOPES", + "VEHICLE_SPRITE_FLAG_STEEP_SLOPES", + "VEHICLE_SPRITE_FLAG_VERTICAL_SLOPES", + "VEHICLE_SPRITE_FLAG_DIAGONAL_SLOPES", + "VEHICLE_SPRITE_FLAG_FLAT_BANKED", + "VEHICLE_SPRITE_FLAG_INLINE_TWISTS", + "VEHICLE_SPRITE_FLAG_FLAT_TO_GENTLE_SLOPE_BANKED_TRANSITIONS", + "VEHICLE_SPRITE_FLAG_DIAGONAL_GENTLE_SLOPE_BANKED_TRANSITIONS", + "VEHICLE_SPRITE_FLAG_GENTLE_SLOPE_BANKED_TRANSITIONS", + "VEHICLE_SPRITE_FLAG_GENTLE_SLOPE_BANKED_TURNS", + "VEHICLE_SPRITE_FLAG_FLAT_TO_GENTLE_SLOPE_WHILE_BANKED_TRANSITIONS", + "VEHICLE_SPRITE_FLAG_CORKSCREWS", + "VEHICLE_SPRITE_FLAG_RESTRAINT_ANIMATION", + "VEHICLE_SPRITE_FLAG_CURVED_LIFT_HILL", + "VEHICLE_SPRITE_FLAG_ZERO_G_ROLLS" +] + +# Display name of each sprite group, tooltip for each sprite group, default state of each sprite group +legacy_group_metadata = { + "VEHICLE_SPRITE_FLAG_FLAT": ["Flat", "Render sprites for flat track", True], + "VEHICLE_SPRITE_FLAG_GENTLE_SLOPES": ["Gentle Slopes", "Render sprites for gentle sloped track", True], + "VEHICLE_SPRITE_FLAG_STEEP_SLOPES": ["Steep Slopes", "Render sprites for steep sloped track", False], + "VEHICLE_SPRITE_FLAG_VERTICAL_SLOPES": ["Vertical Loops", "Render sprites for vertical slopes and loops", False], + "VEHICLE_SPRITE_FLAG_DIAGONAL_SLOPES": ["Diagonal Slopes", "Render sprites for diagonal slopes", True], + "VEHICLE_SPRITE_FLAG_FLAT_BANKED": ["Flat Banked","Render sprites for flat banked track", False], + "VEHICLE_SPRITE_FLAG_INLINE_TWISTS": ["Inline Twist", "Render sprites for the inline twist element", False], + "VEHICLE_SPRITE_FLAG_FLAT_TO_GENTLE_SLOPE_BANKED_TRANSITIONS": ["", "", False], + "VEHICLE_SPRITE_FLAG_DIAGONAL_GENTLE_SLOPE_BANKED_TRANSITIONS": ["", "", False], + "VEHICLE_SPRITE_FLAG_GENTLE_SLOPE_BANKED_TRANSITIONS": ["", "", False], + "VEHICLE_SPRITE_FLAG_GENTLE_SLOPE_BANKED_TURNS": ["Sloped Banked Turns","Render sprites for sloped banked turns", False], + "VEHICLE_SPRITE_FLAG_FLAT_TO_GENTLE_SLOPE_WHILE_BANKED_TRANSITIONS": ["", "", False], + "VEHICLE_SPRITE_FLAG_CORKSCREWS": ["Corkscrew", "Render sprites for corkscrews", False], + "VEHICLE_SPRITE_FLAG_RESTRAINT_ANIMATION": ["Animated Restraints", "Render animated restraints", False], + "VEHICLE_SPRITE_FLAG_CURVED_LIFT_HILL": ["Spiral Lifthill", "Render sprites for spiral lifthills", False], + "VEHICLE_SPRITE_FLAG_ZERO_G_ROLLS": ["Zero-G Rolls", "Render sprites for zero-G rolls", False] +} + +# What full sprite groups each legacy group maps to +legacy_group_map = { + 'VEHICLE_SPRITE_FLAG_FLAT': [ 'slopeFlat' ], + 'VEHICLE_SPRITE_FLAG_GENTLE_SLOPES': ['slopes12', 'slopes25'], + 'VEHICLE_SPRITE_FLAG_STEEP_SLOPES': ['slopes42', 'slopes60'], + 'VEHICLE_SPRITE_FLAG_VERTICAL_SLOPES': ['slopes75', 'slopes90', 'slopesLoop','slopeInverted'], + 'VEHICLE_SPRITE_FLAG_DIAGONAL_SLOPES': ['slopes8', 'slopes16','slopes50'], + 'VEHICLE_SPRITE_FLAG_FLAT_BANKED': ['flatBanked22','flatBanked45'], + 'VEHICLE_SPRITE_FLAG_INLINE_TWISTS': ['flatBanked67', 'flatBanked90', 'inlineTwists'], + 'VEHICLE_SPRITE_FLAG_FLAT_TO_GENTLE_SLOPE_BANKED_TRANSITIONS': ['slopes12Banked22'], + 'VEHICLE_SPRITE_FLAG_DIAGONAL_GENTLE_SLOPE_BANKED_TRANSITIONS': ['slopes8Banked22'], + 'VEHICLE_SPRITE_FLAG_GENTLE_SLOPE_BANKED_TRANSITIONS': ['slopes25Banked22'], + 'VEHICLE_SPRITE_FLAG_GENTLE_SLOPE_BANKED_TURNS': ['slopes25Banked45'], + 'VEHICLE_SPRITE_FLAG_FLAT_TO_GENTLE_SLOPE_WHILE_BANKED_TRANSITIONS': ['slopes12Banked45'], + 'VEHICLE_SPRITE_FLAG_CORKSCREWS': ['corkscrews'], + 'VEHICLE_SPRITE_FLAG_RESTRAINT_ANIMATION': ['restraintAnimation'], + 'VEHICLE_SPRITE_FLAG_CURVED_LIFT_HILL': ['curvedLiftHillUp', 'curvedLiftHillDown'], + 'VEHICLE_SPRITE_FLAG_ZERO_G_ROLLS': ["slopes60Banked22", "slopes42Banked22","slopes42Banked45","slopes42Banked67","slopes42Banked90", "slopes25InlineTwists", "slopes25Banked67","slopes25Banked90"] +} + +# What legacy groups are implied by combinations of other legacy sprite groups +legacy_group_implications = { + frozenset({'VEHICLE_SPRITE_FLAG_GENTLE_SLOPE_BANKED_TURNS'}): frozenset({'VEHICLE_SPRITE_FLAG_GENTLE_SLOPE_BANKED_TRANSITIONS','VEHICLE_SPRITE_FLAG_FLAT_TO_GENTLE_SLOPE_WHILE_BANKED_TRANSITIONS','VEHICLE_SPRITE_FLAG_FLAT_TO_GENTLE_SLOPE_BANKED_TRANSITIONS'}), + frozenset({'VEHICLE_SPRITE_FLAG_FLAT_BANKED','VEHICLE_SPRITE_FLAG_GENTLE_SLOPES'}): frozenset({'VEHICLE_SPRITE_FLAG_FLAT_TO_GENTLE_SLOPE_BANKED_TRANSITIONS'}), + frozenset({'VEHICLE_SPRITE_FLAG_FLAT_BANKED','VEHICLE_SPRITE_FLAG_DIAGONAL_SLOPES'}): frozenset({'VEHICLE_SPRITE_FLAG_DIAGONAL_GENTLE_SLOPE_BANKED_TRANSITIONS'}), + frozenset({'VEHICLE_SPRITE_FLAG_INLINE_TWISTS'}): frozenset({'VEHICLE_SPRITE_FLAG_FLAT_BANKED', 'VEHICLE_SPRITE_FLAG_VERTICAL_SLOPES'}), + frozenset({'VEHICLE_SPRITE_FLAG_CORKSCREWS'}): frozenset({'VEHICLE_SPRITE_FLAG_VERTICAL_SLOPES'}), + frozenset({'VEHICLE_SPRITE_FLAG_ZERO_G_ROLLS'}): frozenset({'VEHICLE_SPRITE_FLAG_GENTLE_SLOPE_BANKED_TURNS', 'VEHICLE_SPRITE_FLAG_GENTLE_SLOPE_BANKED_TRANSITIONS', 'VEHICLE_SPRITE_FLAG_GENTLE_SLOPES', 'VEHICLE_SPRITE_FLAG_VERTICAL_SLOPES'}) +} \ No newline at end of file diff --git a/rct-graphics-helper/operators/vehicle_render_operator.py b/rct-graphics-helper/operators/vehicle_render_operator.py index 176ee7e..53d36bc 100644 --- a/rct-graphics-helper/operators/vehicle_render_operator.py +++ b/rct-graphics-helper/operators/vehicle_render_operator.py @@ -1,5 +1,5 @@ ''' -Copyright (c) 2022 RCT Graphics Helper developers +Copyright (c) 2023 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 @@ -12,7 +12,7 @@ import os from ..operators.render_operator import RCTRender -from ..angle_sections.track import track_angle_sections, track_angle_sections_names +from ..angle_sections.track import sprite_group_names, sprite_group_manifest class RenderVehicle(RCTRender, bpy.types.Operator): @@ -57,67 +57,38 @@ def create_task(self, context): return self.task_builder.create_task(context) - def key_is_property(self, key, props): - for sprite_track_flagset in props.sprite_track_flags_list: - if sprite_track_flagset.section_id == key: - return True - - def property_value(self, key, props): - i = 0 - for sprite_track_flagset in props.sprite_track_flags_list: - if sprite_track_flagset.section_id == key: - return props.sprite_track_flags[i] - i += 1 - - def should_render_feature(self, key, context): - props = context.scene.rct_graphics_helper_vehicle_properties - - inverted = False - if self.key_is_property(key, props): - if self.property_value(key, props): - return True - elif key == "VEHICLE_SPRITE_FLAG_GENTLE_SLOPE_BANKED_TURNS" or key == "VEHICLE_SPRITE_FLAG_GENTLE_SLOPE_BANKED_TRANSITIONS": - if self.property_value("SLOPED_TURNS", props): - return True - elif key == "VEHICLE_SPRITE_FLAG_FLAT_TO_GENTLE_SLOPE_WHILE_BANKED_TRANSITIONS": - if self.property_value("SLOPED_TURNS", props) and self.property_value("VEHICLE_SPRITE_FLAG_FLAT_BANKED", props): - return True - elif key == "VEHICLE_SPRITE_FLAG_DIAGONAL_GENTLE_SLOPE_BANKED_TRANSITIONS": - if self.property_value("VEHICLE_SPRITE_FLAG_FLAT_BANKED", props) and self.property_value("VEHICLE_SPRITE_FLAG_DIAGONAL_SLOPES", props): - return True - elif key == "VEHICLE_SPRITE_FLAG_FLAT_TO_GENTLE_SLOPE_BANKED_TRANSITIONS": - if self.property_value("VEHICLE_SPRITE_FLAG_FLAT_BANKED", props) and self.property_value("VEHICLE_SPRITE_FLAG_GENTLE_SLOPES", props): - return True - elif key == "VEHICLE_SPRITE_FLAG_RESTRAINT_ANIMATION" and inverted == False: - if props.restraint_animation: - return True - return False - def add_render_angles(self, context, is_inverted=False, animation_frames=1): + properties = context.scene.rct_graphics_helper_vehicle_properties extra_roll = 0 if is_inverted: extra_roll = 180 - for i in range(len(track_angle_sections_names)): - key = track_angle_sections_names[i] - if self.should_render_feature(key, context): - track_sections = track_angle_sections[key] - for track_section in track_sections: - - base_view_angle = 0 - if track_section[0]: - base_view_angle = 45 - self.task_builder.set_rotation( - base_view_angle, -track_section[3] + extra_roll, track_section[2], track_section[4]) - - if key == "VEHICLE_SPRITE_FLAG_RESTRAINT_ANIMATION": - for j in range(3): - for k in range(track_section[1]): - for l in range(animation_frames): - self.task_builder.set_rotation( - base_view_angle + k / track_section[1] * 360, -track_section[3] + extra_roll, track_section[2], track_section[4]) - self.task_builder.add_viewing_angles( - 1, animation_frames + j, 1) - else: - self.task_builder.add_viewing_angles( - track_section[1], 0, animation_frames) + for sprite_group_name in sprite_group_names: + track_sections = sprite_group_manifest[sprite_group_name] + + if sprite_group_name not in properties: + continue + precision = int(properties[sprite_group_name]) + if precision == 0: + continue + + for track_section in track_sections: + # If the sprite angle is intended to be diagonal, offset by 45 degrees unless diagonal sprites will be present + base_view_angle = 0 + if track_section[0] and precision < 8: + base_view_angle = 45 + + self.task_builder.set_rotation( + base_view_angle, -track_section[3] + extra_roll, track_section[2], track_section[4]) + + if sprite_group_name == "restraintAnimation": + for j in range(3): + for k in range(precision): + for l in range(animation_frames): + self.task_builder.set_rotation( + base_view_angle + k / precision * 360, -track_section[3] + extra_roll, track_section[2], track_section[4]) + self.task_builder.add_viewing_angles( + 1, animation_frames + j, 1) + else: + self.task_builder.add_viewing_angles( + precision, 0, animation_frames) diff --git a/rct-graphics-helper/properties/vehicle_properties.py b/rct-graphics-helper/properties/vehicle_properties.py index 9668a1f..77e9aff 100644 --- a/rct-graphics-helper/properties/vehicle_properties.py +++ b/rct-graphics-helper/properties/vehicle_properties.py @@ -1,5 +1,5 @@ ''' -Copyright (c) 2022 RCT Graphics Helper developers +Copyright (c) 2023 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 @@ -12,7 +12,7 @@ import os from ..operators.render_operator import RCTRender - +from ..angle_sections.track import sprite_group_metadata, legacy_group_names, legacy_group_metadata class SpriteTrackFlag(object): name = "" @@ -27,80 +27,56 @@ def __init__(self, section_id, name, description, default_value): self.default_value = default_value +def CreateSpriteEnum(defaultValue): + return ( + ("0", "Disabled" + (defaultValue == 0 and " (Default)" or ""), "No sprites are rendered", 0), + ("1", "1" + (defaultValue == 1 and " (Default)" or ""), "One sprite rendered", 1), + ("2", "2" + (defaultValue == 2 and " (Default)" or ""), "Two sprites rendered", 2), + ("4", "4" + (defaultValue == 4 and " (Default)" or ""), "Four sprites rendered", 4), + ("8", "8" + (defaultValue == 8 and " (Default)" or ""), "Eight sprites rendered", 8), + ("16", "16" + (defaultValue == 16 and " (Default)" or ""), "Sixteen sprites rendered", 16), + ("32", "32" + (defaultValue == 32 and " (Default)" or ""), "Thirty-two sprites rendered", 32), + ("64", "64" + (defaultValue == 64 and " (Default)" or ""), "Sixty-four sprites rendered", 64) + ) + class VehicleProperties(bpy.types.PropertyGroup): - sprite_track_flags_list = [] - - sprite_track_flags_list.append(SpriteTrackFlag( - "VEHICLE_SPRITE_FLAG_FLAT", - "Flat", - "Render sprites for flat track", - True)) - sprite_track_flags_list.append(SpriteTrackFlag( - "VEHICLE_SPRITE_FLAG_GENTLE_SLOPES", - "Gentle Slopes", - "Render sprites for gentle sloped track", - True)) - sprite_track_flags_list.append(SpriteTrackFlag( - "VEHICLE_SPRITE_FLAG_STEEP_SLOPES", - "Steep Slopes", - "Render sprites for steep sloped track", - False)) - sprite_track_flags_list.append(SpriteTrackFlag( - "VEHICLE_SPRITE_FLAG_VERTICAL_SLOPES", - "Vertical Slopes And Invert", - "Render sprites for vertically sloped track and inverts", - False)) - sprite_track_flags_list.append(SpriteTrackFlag( - "VEHICLE_SPRITE_FLAG_DIAGONAL_SLOPES", - "Diagonal Slopes", - "Render sprites for diagonal slopes", - False)) - sprite_track_flags_list.append(SpriteTrackFlag( - "VEHICLE_SPRITE_FLAG_FLAT_BANKED", - "Flat Banked", - "Render sprites for flat banked track", - False)) - sprite_track_flags_list.append(SpriteTrackFlag( - "SLOPED_TURNS", - "Gentle Sloped Banked", - "Render sprites for gently sloped banked track and turns", - False)) - sprite_track_flags_list.append(SpriteTrackFlag( - "VEHICLE_SPRITE_FLAG_INLINE_TWISTS", - "Inline twist", - "Render sprites for the inline twist element", - False)) - sprite_track_flags_list.append(SpriteTrackFlag( - "VEHICLE_SPRITE_FLAG_CORKSCREWS", - "Corkscrew", - "Render sprites for corkscrews", - False)) - sprite_track_flags_list.append(SpriteTrackFlag( - "VEHICLE_SPRITE_FLAG_CURVED_LIFT_HILL", - "Curved Lift Hill", - "Render sprites for a curved lift hill", - False)) - - defaults = [] - for sprite_track_flag in sprite_track_flags_list: - defaults.append(sprite_track_flag.default_value) + # Create legacy sprite groups + legacy_defaults = [] + legacy_spritegroups = {} + for legacy_group_name in legacy_group_names: + config = legacy_group_metadata[legacy_group_name] + legacy_spritegroups[legacy_group_name] = SpriteTrackFlag(legacy_group_name, *config) + legacy_defaults.append(config[2]) sprite_track_flags = bpy.props.BoolVectorProperty( name="Track Pieces", - default=defaults, + default=legacy_defaults, description="Which track pieces to render sprites for", - size=len(sprite_track_flags_list)) + size=len(legacy_spritegroups)) - restraint_animation = bpy.props.BoolProperty( - name="Restraint Animation", - description="Render with restraint animation. The restrain animation is 3 frames long and starts at frame 1", - default=False) + # Create modern sprite groups + for key, config in sprite_group_metadata.items(): + locals()[key] = bpy.props.EnumProperty( + name = key, + description = config[1], + items = CreateSpriteEnum(config[0]) + ) inverted_set = bpy.props.BoolProperty( name="Inverted Set", description="Used for rides which can invert for an extended amount of time like the flying and lay-down rollercoasters", default=False) + sprite_group_mode = bpy.props.EnumProperty( + name="Sprite group mode", + items=( + ("SIMPLE", "Simple sprite groups", + "Combines several sprite groups and sets their sprite precisions automatically", 1), + ("FULL", "Full sprite groups", + "Set all sprite group precisions manually", 2), + ) + ) + def register_vehicles_properties(): bpy.types.Scene.rct_graphics_helper_vehicle_properties = bpy.props.PointerProperty( diff --git a/rct-graphics-helper/rct_graphics_helper_panel.py b/rct-graphics-helper/rct_graphics_helper_panel.py index 4f519d4..6d72b84 100644 --- a/rct-graphics-helper/rct_graphics_helper_panel.py +++ b/rct-graphics-helper/rct_graphics_helper_panel.py @@ -1,5 +1,5 @@ ''' -Copyright (c) 2022 RCT Graphics Helper developers +Copyright (c) 2023 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 @@ -16,6 +16,7 @@ from .operators.render_switch_operator import RenderRCTSwitch from .models.palette import palette_colors, palette_colors_details +from .angle_sections.track import sprite_group_names, legacy_group_names 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.""" @@ -41,6 +42,21 @@ def addRenderButton(layout, hasFailed = False): text = "Render failed" row.operator("render.rct_switch", text=text) +legacy_group_display_order = [ + "VEHICLE_SPRITE_FLAG_FLAT", + "VEHICLE_SPRITE_FLAG_GENTLE_SLOPES", + "VEHICLE_SPRITE_FLAG_STEEP_SLOPES", + "VEHICLE_SPRITE_FLAG_DIAGONAL_SLOPES", + "VEHICLE_SPRITE_FLAG_FLAT_BANKED", + "VEHICLE_SPRITE_FLAG_GENTLE_SLOPE_BANKED_TURNS", + "VEHICLE_SPRITE_FLAG_VERTICAL_SLOPES", + "VEHICLE_SPRITE_FLAG_INLINE_TWISTS", + "VEHICLE_SPRITE_FLAG_CORKSCREWS", + "VEHICLE_SPRITE_FLAG_ZERO_G_ROLLS", + "VEHICLE_SPRITE_FLAG_CURVED_LIFT_HILL", + "VEHICLE_SPRITE_FLAG_RESTRAINT_ANIMATION" +] + class GraphicsHelperPanel(bpy.types.Panel): bl_label = "RCT Graphics Helper" bl_idname = "VIEW3D_PT_rct_graphics_helper" @@ -211,21 +227,27 @@ def draw_vehicle_panel(self, scene, layout): properties = scene.rct_graphics_helper_vehicle_properties general_properties = scene.rct_graphics_helper_general_properties - box = layout.box() - - row = box.row() - row.label("Ride Vehicle Track Properties:") + row = layout.row() + row.prop(properties,"sprite_group_mode") - split = box.split(.50) + box = layout.box() + split = box.split(0.5) columns = [split.column(), split.column()] i = 0 - for sprite_track_flagset in properties.sprite_track_flags_list: - columns[i % 2].row().prop(properties, "sprite_track_flags", - index=i, text=sprite_track_flagset.name) - i += 1 - - row = layout.row() - row.prop(properties, "restraint_animation") + if properties.sprite_group_mode == "SIMPLE": + for legacy_group_name in self.legacy_group_display_order: + sprite_track_flagset = properties.legacy_spritegroups[legacy_group_name] + index = legacy_group_names.index(legacy_group_name) + columns[i % 2].row().prop(properties, "sprite_track_flags", + index=index, text=sprite_track_flagset.name, description = sprite_track_flagset.description) + i += 1 + else: + columns = [column.split(0.667) for column in columns] + subcolumns = [columns[0].column(), columns[0].column(),columns[1].column(), columns[1].column()] + for sprite_group_name in sprite_group_names: + subcolumns[(i * 2) % 4].row().label(sprite_group_name+":") + subcolumns[(i * 2 + 1) % 4].row().prop(properties, sprite_group_name, text = "") + i += 1 row = layout.row() row.prop(properties, "inverted_set") From de00bc4b9a431f909d346c8fb90f5897404117e5 Mon Sep 17 00:00:00 2001 From: Spacek531 Date: Sun, 12 Mar 2023 23:06:28 -0700 Subject: [PATCH 2/9] display new sprite groups vertically --- rct-graphics-helper/rct_graphics_helper_panel.py | 7 ++++--- 1 file changed, 4 insertions(+), 3 deletions(-) diff --git a/rct-graphics-helper/rct_graphics_helper_panel.py b/rct-graphics-helper/rct_graphics_helper_panel.py index 6d72b84..2ab5f76 100644 --- a/rct-graphics-helper/rct_graphics_helper_panel.py +++ b/rct-graphics-helper/rct_graphics_helper_panel.py @@ -239,14 +239,15 @@ def draw_vehicle_panel(self, scene, layout): sprite_track_flagset = properties.legacy_spritegroups[legacy_group_name] index = legacy_group_names.index(legacy_group_name) columns[i % 2].row().prop(properties, "sprite_track_flags", - index=index, text=sprite_track_flagset.name, description = sprite_track_flagset.description) + index=index, text=sprite_track_flagset.name) i += 1 else: columns = [column.split(0.667) for column in columns] subcolumns = [columns[0].column(), columns[0].column(),columns[1].column(), columns[1].column()] + splitpoint = len(sprite_group_names) // 2 for sprite_group_name in sprite_group_names: - subcolumns[(i * 2) % 4].row().label(sprite_group_name+":") - subcolumns[(i * 2 + 1) % 4].row().prop(properties, sprite_group_name, text = "") + subcolumns[(i > splitpoint) * 2].row().label(sprite_group_name+":") + subcolumns[(i > splitpoint) * 2 + 1].row().prop(properties, sprite_group_name, text = "") i += 1 row = layout.row() From 08d2d760cd5399f1ec055b2023c0a81756e7a1aa Mon Sep 17 00:00:00 2001 From: Spacek531 Date: Sun, 12 Mar 2023 23:07:11 -0700 Subject: [PATCH 3/9] add diagonal banked and add legacy inverted sprite --- rct-graphics-helper/angle_sections/track.py | 60 +++++++++++++++------ 1 file changed, 44 insertions(+), 16 deletions(-) diff --git a/rct-graphics-helper/angle_sections/track.py b/rct-graphics-helper/angle_sections/track.py index 4727952..a3648c4 100644 --- a/rct-graphics-helper/angle_sections/track.py +++ b/rct-graphics-helper/angle_sections/track.py @@ -9,16 +9,19 @@ # This is the order sprite groups are rendered in sprite_group_names = [ - "slopeFlat", "slopes12", "slopes25", "slopes42", "slopes60", - "slopes75", "slopes90", "slopesLoop", "slopeInverted", "slopes8", - "slopes16", "slopes50", "flatBanked22", "flatBanked45", "flatBanked67", - "flatBanked90", "inlineTwists", "slopes12Banked22", "slopes8Banked22", "slopes25Banked22", - "slopes25Banked45", "slopes12Banked45", "slopes25Banked67", "slopes25Banked90", "slopes25InlineTwists", - "slopes42Banked22", "slopes42Banked45", "slopes42Banked67", "slopes42Banked90", "slopes60Banked22", - "corkscrews", "restraintAnimation", "curvedLiftHillUp", "curvedLiftHillDown" + "slopeFlat", "slopes12", "slopes25", "slopes42", + "slopes60", "slopes75", "slopes90", "slopesLoop", + "slopeInverted", "slopes8", "slopes16", "slopes50", + "flatBanked22", "flatBanked45", "flatBanked67", "flatBanked90", + "inlineTwists", "slopes12Banked22", "slopes8Banked22", "slopes25Banked22", + "slopes8Banked45", "slopes16Banked22", "slopes16Banked45", "slopes25Banked45", + "slopes12Banked45", "slopes25Banked67", "slopes25Banked90", "slopes25InlineTwists", + "slopes42Banked22", "slopes42Banked45", "slopes42Banked67", "slopes42Banked90", + "slopes60Banked22", "corkscrews", "restraintAnimation", "curvedLiftHillUp", + "curvedLiftHillDown" ] -# The sprites to render in each sprite group. The given rotation values are used in simple mode +# The sprites to render in each sprite group. The given rotation values are unused sprite_group_manifest = { 'slopeFlat': [ [False, 32, 0, 0, 0] @@ -116,6 +119,24 @@ [False, 4, -22.2052, -22.5, 0], [False, 4, -22.2052, 22.5, 0] ], + 'slopes8Banked45': [ + [True, 4, 8.0503, -45, 0], + [True, 4, 8.0503, 45, 0], + [True, 4, -8.0503, -45, 0], + [True, 4, -8.0503, 45, 0] + ], + 'Slopes16Banked22': [ + [True, 4, 16.1005, -22.5, 0], + [True, 4, 16.1005, 22.5, 0], + [True, 4, -16.1005, -22.5, 0], + [True, 4, -16.1005, 22.5, 0] + ], + 'Slopes16Banked45': [ + [True, 4, 16.1005, -45, 0], + [True, 4, 16.1005, 45, 0], + [True, 4, -16.1005, -45, 0], + [True, 4, -16.1005, 45, 0] + ], 'slopes25Banked45': [ [False, 32, 22.2052, -45, 0], [False, 32, 22.2052, 45, 0], @@ -243,6 +264,9 @@ "slopes8Banked22": [4, "Diagonal flat-to-gentle-and-flat-to-banked transition track"], "slopes25Banked22": [4, "Orthogonal gentle slope flat-to-bank transition track"], "slopes25Banked45": [32, "Gentle sloped banked turns"], + "slopes8Banked45": [4, "Diagonal flat-to-gentle slope banked transition track"], + "slopes16Banked22": [4, "Diagonal gentle slope flat-to-banked transition track"], + "slopes16Banked45": [4, "Diagonal gentle slope banked track"], "slopes12Banked45": [4, "Orthogonal flat-to-gentle-slope banked transition track"], "slopes25Banked67": [4, "Part of small zero-G rolls"], "slopes25Banked90": [4, "Part of small zero-G rolls"], @@ -274,7 +298,8 @@ "VEHICLE_SPRITE_FLAG_CORKSCREWS", "VEHICLE_SPRITE_FLAG_RESTRAINT_ANIMATION", "VEHICLE_SPRITE_FLAG_CURVED_LIFT_HILL", - "VEHICLE_SPRITE_FLAG_ZERO_G_ROLLS" + "VEHICLE_SPRITE_FLAG_ZERO_G_ROLLS", + "VEHICLE_SPRITE_FLAG_INVERTED" ] # Display name of each sprite group, tooltip for each sprite group, default state of each sprite group @@ -288,13 +313,15 @@ "VEHICLE_SPRITE_FLAG_INLINE_TWISTS": ["Inline Twist", "Render sprites for the inline twist element", False], "VEHICLE_SPRITE_FLAG_FLAT_TO_GENTLE_SLOPE_BANKED_TRANSITIONS": ["", "", False], "VEHICLE_SPRITE_FLAG_DIAGONAL_GENTLE_SLOPE_BANKED_TRANSITIONS": ["", "", False], + "VEHICLE_SPRITE_FLAG_DIAGONAL_GENTLE_SLOPE_BANKED_TRANSITIONS": ["", "", False], "VEHICLE_SPRITE_FLAG_GENTLE_SLOPE_BANKED_TRANSITIONS": ["", "", False], "VEHICLE_SPRITE_FLAG_GENTLE_SLOPE_BANKED_TURNS": ["Sloped Banked Turns","Render sprites for sloped banked turns", False], "VEHICLE_SPRITE_FLAG_FLAT_TO_GENTLE_SLOPE_WHILE_BANKED_TRANSITIONS": ["", "", False], "VEHICLE_SPRITE_FLAG_CORKSCREWS": ["Corkscrew", "Render sprites for corkscrews", False], "VEHICLE_SPRITE_FLAG_RESTRAINT_ANIMATION": ["Animated Restraints", "Render animated restraints", False], "VEHICLE_SPRITE_FLAG_CURVED_LIFT_HILL": ["Spiral Lifthill", "Render sprites for spiral lifthills", False], - "VEHICLE_SPRITE_FLAG_ZERO_G_ROLLS": ["Zero-G Rolls", "Render sprites for zero-G rolls", False] + "VEHICLE_SPRITE_FLAG_ZERO_G_ROLLS": ["Zero-G Rolls", "Render sprites for zero-G rolls", False], + "VEHICLE_SPRITE_FLAG_INVERTED": ["", "", False], } # What full sprite groups each legacy group maps to @@ -302,7 +329,7 @@ 'VEHICLE_SPRITE_FLAG_FLAT': [ 'slopeFlat' ], 'VEHICLE_SPRITE_FLAG_GENTLE_SLOPES': ['slopes12', 'slopes25'], 'VEHICLE_SPRITE_FLAG_STEEP_SLOPES': ['slopes42', 'slopes60'], - 'VEHICLE_SPRITE_FLAG_VERTICAL_SLOPES': ['slopes75', 'slopes90', 'slopesLoop','slopeInverted'], + 'VEHICLE_SPRITE_FLAG_VERTICAL_SLOPES': ['slopes75', 'slopes90', 'slopesLoop'], 'VEHICLE_SPRITE_FLAG_DIAGONAL_SLOPES': ['slopes8', 'slopes16','slopes50'], 'VEHICLE_SPRITE_FLAG_FLAT_BANKED': ['flatBanked22','flatBanked45'], 'VEHICLE_SPRITE_FLAG_INLINE_TWISTS': ['flatBanked67', 'flatBanked90', 'inlineTwists'], @@ -314,7 +341,8 @@ 'VEHICLE_SPRITE_FLAG_CORKSCREWS': ['corkscrews'], 'VEHICLE_SPRITE_FLAG_RESTRAINT_ANIMATION': ['restraintAnimation'], 'VEHICLE_SPRITE_FLAG_CURVED_LIFT_HILL': ['curvedLiftHillUp', 'curvedLiftHillDown'], - 'VEHICLE_SPRITE_FLAG_ZERO_G_ROLLS': ["slopes60Banked22", "slopes42Banked22","slopes42Banked45","slopes42Banked67","slopes42Banked90", "slopes25InlineTwists", "slopes25Banked67","slopes25Banked90"] + 'VEHICLE_SPRITE_FLAG_ZERO_G_ROLLS': ["slopes60Banked22", "slopes42Banked22","slopes42Banked45","slopes42Banked67","slopes42Banked90", "slopes25InlineTwists", "slopes25Banked67","slopes25Banked90"], + 'VEHICLE_SPRITE_FLAG_INVERTED': ['slopeInverted'] } # What legacy groups are implied by combinations of other legacy sprite groups @@ -322,7 +350,7 @@ frozenset({'VEHICLE_SPRITE_FLAG_GENTLE_SLOPE_BANKED_TURNS'}): frozenset({'VEHICLE_SPRITE_FLAG_GENTLE_SLOPE_BANKED_TRANSITIONS','VEHICLE_SPRITE_FLAG_FLAT_TO_GENTLE_SLOPE_WHILE_BANKED_TRANSITIONS','VEHICLE_SPRITE_FLAG_FLAT_TO_GENTLE_SLOPE_BANKED_TRANSITIONS'}), frozenset({'VEHICLE_SPRITE_FLAG_FLAT_BANKED','VEHICLE_SPRITE_FLAG_GENTLE_SLOPES'}): frozenset({'VEHICLE_SPRITE_FLAG_FLAT_TO_GENTLE_SLOPE_BANKED_TRANSITIONS'}), frozenset({'VEHICLE_SPRITE_FLAG_FLAT_BANKED','VEHICLE_SPRITE_FLAG_DIAGONAL_SLOPES'}): frozenset({'VEHICLE_SPRITE_FLAG_DIAGONAL_GENTLE_SLOPE_BANKED_TRANSITIONS'}), - frozenset({'VEHICLE_SPRITE_FLAG_INLINE_TWISTS'}): frozenset({'VEHICLE_SPRITE_FLAG_FLAT_BANKED', 'VEHICLE_SPRITE_FLAG_VERTICAL_SLOPES'}), - frozenset({'VEHICLE_SPRITE_FLAG_CORKSCREWS'}): frozenset({'VEHICLE_SPRITE_FLAG_VERTICAL_SLOPES'}), - frozenset({'VEHICLE_SPRITE_FLAG_ZERO_G_ROLLS'}): frozenset({'VEHICLE_SPRITE_FLAG_GENTLE_SLOPE_BANKED_TURNS', 'VEHICLE_SPRITE_FLAG_GENTLE_SLOPE_BANKED_TRANSITIONS', 'VEHICLE_SPRITE_FLAG_GENTLE_SLOPES', 'VEHICLE_SPRITE_FLAG_VERTICAL_SLOPES'}) -} \ No newline at end of file + frozenset({'VEHICLE_SPRITE_FLAG_INLINE_TWISTS'}): frozenset({'VEHICLE_SPRITE_FLAG_FLAT_BANKED', 'VEHICLE_SPRITE_FLAG_INVERTED'}), + frozenset({'VEHICLE_SPRITE_FLAG_CORKSCREWS'}): frozenset({'VEHICLE_SPRITE_FLAG_INVERTED_SLOPES'}), + frozenset({'VEHICLE_SPRITE_FLAG_ZERO_G_ROLLS'}): frozenset({'VEHICLE_SPRITE_FLAG_GENTLE_SLOPE_BANKED_TURNS', 'VEHICLE_SPRITE_FLAG_GENTLE_SLOPE_BANKED_TRANSITIONS', 'VEHICLE_SPRITE_FLAG_GENTLE_SLOPES', 'VEHICLE_SPRITE_FLAG_INVERTED'}) +} From 8bf04c828c1c00496fe2c67335c8ed6635d38566 Mon Sep 17 00:00:00 2001 From: Spacek531 Date: Sun, 12 Mar 2023 23:07:43 -0700 Subject: [PATCH 4/9] begin implementing legacy groups set function --- .../properties/vehicle_properties.py | 24 ++++++++++++------- 1 file changed, 15 insertions(+), 9 deletions(-) diff --git a/rct-graphics-helper/properties/vehicle_properties.py b/rct-graphics-helper/properties/vehicle_properties.py index 77e9aff..b511ac8 100644 --- a/rct-graphics-helper/properties/vehicle_properties.py +++ b/rct-graphics-helper/properties/vehicle_properties.py @@ -29,16 +29,20 @@ def __init__(self, section_id, name, description, default_value): def CreateSpriteEnum(defaultValue): return ( - ("0", "Disabled" + (defaultValue == 0 and " (Default)" or ""), "No sprites are rendered", 0), - ("1", "1" + (defaultValue == 1 and " (Default)" or ""), "One sprite rendered", 1), - ("2", "2" + (defaultValue == 2 and " (Default)" or ""), "Two sprites rendered", 2), - ("4", "4" + (defaultValue == 4 and " (Default)" or ""), "Four sprites rendered", 4), - ("8", "8" + (defaultValue == 8 and " (Default)" or ""), "Eight sprites rendered", 8), - ("16", "16" + (defaultValue == 16 and " (Default)" or ""), "Sixteen sprites rendered", 16), - ("32", "32" + (defaultValue == 32 and " (Default)" or ""), "Thirty-two sprites rendered", 32), - ("64", "64" + (defaultValue == 64 and " (Default)" or ""), "Sixty-four sprites rendered", 64) + ("0", "Disabled" + (defaultValue == 0 and " (Default)" or ""), "No sprites rendered", 0), + ("1", "1" + (defaultValue == 1 and " (Default)" or ""), "1 sprite", 1), + ("2", "2" + (defaultValue == 2 and " (Default)" or ""), "2 sprites", 2), + ("4", "4" + (defaultValue == 4 and " (Default)" or ""), "4 sprites (recommended minimum)", 4), + ("8", "8" + (defaultValue == 8 and " (Default)" or ""), "8 sprites", 8), + ("16", "16" + (defaultValue == 16 and " (Default)" or ""), "16 sprites (RCT1 default)", 16), + ("32", "32" + (defaultValue == 32 and " (Default)" or ""), "32 sprites (RCT2 default)", 32), + ("64", "64" + (defaultValue == 64 and " (Default)" or ""), "64 sprites (OpenRCT2 not yet implemented)", 64) ) +# this is called with self as VehicleProperties +def legacy_groups_to_set(self, value): + difference = [(self.sprite_track_flags[i] != value[i]) * (value[i] and 1 or -1) for i in range(len(self.sprite_track_flags))] + class VehicleProperties(bpy.types.PropertyGroup): # Create legacy sprite groups legacy_defaults = [] @@ -52,7 +56,9 @@ class VehicleProperties(bpy.types.PropertyGroup): name="Track Pieces", default=legacy_defaults, description="Which track pieces to render sprites for", - size=len(legacy_spritegroups)) + size=len(legacy_spritegroups), + set = legacy_groups_to_set + ) # Create modern sprite groups for key, config in sprite_group_metadata.items(): From 5de7fe27a89a20a79d5ce846b342e71718aaee10 Mon Sep 17 00:00:00 2001 From: Spacek531 Date: Wed, 15 Mar 2023 21:13:32 -0700 Subject: [PATCH 5/9] finish implementation --- rct-graphics-helper/angle_sections/track.py | 28 +++++++--- .../properties/vehicle_properties.py | 54 ++++++++++++++++--- .../rct_graphics_helper_panel.py | 9 ++-- 3 files changed, 73 insertions(+), 18 deletions(-) diff --git a/rct-graphics-helper/angle_sections/track.py b/rct-graphics-helper/angle_sections/track.py index a3648c4..29272eb 100644 --- a/rct-graphics-helper/angle_sections/track.py +++ b/rct-graphics-helper/angle_sections/track.py @@ -125,13 +125,13 @@ [True, 4, -8.0503, -45, 0], [True, 4, -8.0503, 45, 0] ], - 'Slopes16Banked22': [ + 'slopes16Banked22': [ [True, 4, 16.1005, -22.5, 0], [True, 4, 16.1005, 22.5, 0], [True, 4, -16.1005, -22.5, 0], [True, 4, -16.1005, 22.5, 0] ], - 'Slopes16Banked45': [ + 'slopes16Banked45': [ [True, 4, 16.1005, -45, 0], [True, 4, 16.1005, 45, 0], [True, 4, -16.1005, -45, 0], @@ -282,6 +282,7 @@ "curvedLiftHillDown": [32, "Spiral lifthill down track"] } +# All legacy groups. See list in rct_graphics_helper_panel.py for which ones are displayed legacy_group_names = [ "VEHICLE_SPRITE_FLAG_FLAT", "VEHICLE_SPRITE_FLAG_GENTLE_SLOPES", @@ -299,6 +300,16 @@ "VEHICLE_SPRITE_FLAG_RESTRAINT_ANIMATION", "VEHICLE_SPRITE_FLAG_CURVED_LIFT_HILL", "VEHICLE_SPRITE_FLAG_ZERO_G_ROLLS", + "VEHICLE_SPRITE_FLAG_INVERTED", + "VEHICLE_SPRITE_FLAG_DIAGONAL_SLOPE_BANKED" +] + +# Legacy sprite groups that are reset every time the user makes a selection +legacy_groups_implied = [ + "VEHICLE_SPRITE_FLAG_FLAT_TO_GENTLE_SLOPE_BANKED_TRANSITIONS", + "VEHICLE_SPRITE_FLAG_DIAGONAL_GENTLE_SLOPE_BANKED_TRANSITIONS", + "VEHICLE_SPRITE_FLAG_FLAT_TO_GENTLE_SLOPE_WHILE_BANKED_TRANSITIONS", + "VEHICLE_SPRITE_FLAG_GENTLE_SLOPE_BANKED_TRANSITIONS", "VEHICLE_SPRITE_FLAG_INVERTED" ] @@ -322,6 +333,7 @@ "VEHICLE_SPRITE_FLAG_CURVED_LIFT_HILL": ["Spiral Lifthill", "Render sprites for spiral lifthills", False], "VEHICLE_SPRITE_FLAG_ZERO_G_ROLLS": ["Zero-G Rolls", "Render sprites for zero-G rolls", False], "VEHICLE_SPRITE_FLAG_INVERTED": ["", "", False], + "VEHICLE_SPRITE_FLAG_DIAGONAL_SLOPE_BANKED": ["Diagonal Sloped Banked", "Render sprites for diagonal sloped banked track", False], } # What full sprite groups each legacy group maps to @@ -342,15 +354,19 @@ 'VEHICLE_SPRITE_FLAG_RESTRAINT_ANIMATION': ['restraintAnimation'], 'VEHICLE_SPRITE_FLAG_CURVED_LIFT_HILL': ['curvedLiftHillUp', 'curvedLiftHillDown'], 'VEHICLE_SPRITE_FLAG_ZERO_G_ROLLS': ["slopes60Banked22", "slopes42Banked22","slopes42Banked45","slopes42Banked67","slopes42Banked90", "slopes25InlineTwists", "slopes25Banked67","slopes25Banked90"], - 'VEHICLE_SPRITE_FLAG_INVERTED': ['slopeInverted'] + 'VEHICLE_SPRITE_FLAG_INVERTED': ['slopeInverted'], + 'VEHICLE_SPRITE_FLAG_DIAGONAL_SLOPE_BANKED': ['slopes8Banked45', 'slopes16Banked22', 'slopes16Banked45'] } # What legacy groups are implied by combinations of other legacy sprite groups -legacy_group_implications = { +legacy_group_dependencies = { frozenset({'VEHICLE_SPRITE_FLAG_GENTLE_SLOPE_BANKED_TURNS'}): frozenset({'VEHICLE_SPRITE_FLAG_GENTLE_SLOPE_BANKED_TRANSITIONS','VEHICLE_SPRITE_FLAG_FLAT_TO_GENTLE_SLOPE_WHILE_BANKED_TRANSITIONS','VEHICLE_SPRITE_FLAG_FLAT_TO_GENTLE_SLOPE_BANKED_TRANSITIONS'}), frozenset({'VEHICLE_SPRITE_FLAG_FLAT_BANKED','VEHICLE_SPRITE_FLAG_GENTLE_SLOPES'}): frozenset({'VEHICLE_SPRITE_FLAG_FLAT_TO_GENTLE_SLOPE_BANKED_TRANSITIONS'}), frozenset({'VEHICLE_SPRITE_FLAG_FLAT_BANKED','VEHICLE_SPRITE_FLAG_DIAGONAL_SLOPES'}): frozenset({'VEHICLE_SPRITE_FLAG_DIAGONAL_GENTLE_SLOPE_BANKED_TRANSITIONS'}), frozenset({'VEHICLE_SPRITE_FLAG_INLINE_TWISTS'}): frozenset({'VEHICLE_SPRITE_FLAG_FLAT_BANKED', 'VEHICLE_SPRITE_FLAG_INVERTED'}), - frozenset({'VEHICLE_SPRITE_FLAG_CORKSCREWS'}): frozenset({'VEHICLE_SPRITE_FLAG_INVERTED_SLOPES'}), - frozenset({'VEHICLE_SPRITE_FLAG_ZERO_G_ROLLS'}): frozenset({'VEHICLE_SPRITE_FLAG_GENTLE_SLOPE_BANKED_TURNS', 'VEHICLE_SPRITE_FLAG_GENTLE_SLOPE_BANKED_TRANSITIONS', 'VEHICLE_SPRITE_FLAG_GENTLE_SLOPES', 'VEHICLE_SPRITE_FLAG_INVERTED'}) + frozenset({'VEHICLE_SPRITE_FLAG_CORKSCREWS'}): frozenset({'VEHICLE_SPRITE_FLAG_INVERTED'}), + frozenset({'VEHICLE_SPRITE_FLAG_ZERO_G_ROLLS'}): frozenset({'VEHICLE_SPRITE_FLAG_GENTLE_SLOPE_BANKED_TURNS', 'VEHICLE_SPRITE_FLAG_GENTLE_SLOPE_BANKED_TRANSITIONS', 'VEHICLE_SPRITE_FLAG_GENTLE_SLOPES', 'VEHICLE_SPRITE_FLAG_INVERTED'}), + frozenset({'VEHICLE_SPRITE_FLAG_DIAGONAL_SLOPE_BANKED'}): frozenset({'VEHICLE_SPRITE_FLAG_DIAGONAL_GENTLE_SLOPE_BANKED_TRANSITIONS'}) } + + diff --git a/rct-graphics-helper/properties/vehicle_properties.py b/rct-graphics-helper/properties/vehicle_properties.py index b511ac8..310fa03 100644 --- a/rct-graphics-helper/properties/vehicle_properties.py +++ b/rct-graphics-helper/properties/vehicle_properties.py @@ -12,7 +12,7 @@ import os from ..operators.render_operator import RCTRender -from ..angle_sections.track import sprite_group_metadata, legacy_group_names, legacy_group_metadata +from ..angle_sections.track import sprite_group_metadata, legacy_group_names, legacy_group_metadata, legacy_groups_implied, legacy_group_dependencies, legacy_group_map class SpriteTrackFlag(object): name = "" @@ -29,19 +29,44 @@ def __init__(self, section_id, name, description, default_value): def CreateSpriteEnum(defaultValue): return ( - ("0", "Disabled" + (defaultValue == 0 and " (Default)" or ""), "No sprites rendered", 0), + ("0", "None" + (defaultValue == 0 and " (Default)" or ""), "No sprites rendered", 0), ("1", "1" + (defaultValue == 1 and " (Default)" or ""), "1 sprite", 1), ("2", "2" + (defaultValue == 2 and " (Default)" or ""), "2 sprites", 2), ("4", "4" + (defaultValue == 4 and " (Default)" or ""), "4 sprites (recommended minimum)", 4), ("8", "8" + (defaultValue == 8 and " (Default)" or ""), "8 sprites", 8), - ("16", "16" + (defaultValue == 16 and " (Default)" or ""), "16 sprites (RCT1 default)", 16), + ("16", "16" + (defaultValue == 16 and " (Default)" or ""), "16 sprites", 16), ("32", "32" + (defaultValue == 32 and " (Default)" or ""), "32 sprites (RCT2 default)", 32), - ("64", "64" + (defaultValue == 64 and " (Default)" or ""), "64 sprites (OpenRCT2 not yet implemented)", 64) + ("64", "64" + (defaultValue == 64 and " (Default)" or ""), "64 sprites ", 64) ) +def set_groups_by_legacy_set(self, set): + for groupname, newgroups in legacy_group_map.items(): + for group in newgroups: + self[group] = sprite_group_metadata[group][0] * (groupname in set) + # this is called with self as VehicleProperties -def legacy_groups_to_set(self, value): - difference = [(self.sprite_track_flags[i] != value[i]) * (value[i] and 1 or -1) for i in range(len(self.sprite_track_flags))] +def legacy_groups_set(self, value): + new_with_implied = { legacy_group_names[i] for i in range(len(value)) if value[i] or (legacy_group_names[i] in legacy_groups_implied) } + new = { legacy_group_names[i] for i in range(len(value)) if value[i] and not legacy_group_names[i] in legacy_groups_implied } + for implied, dependencies in legacy_group_dependencies.items(): + if implied.issubset(new_with_implied): + for group in dependencies: + new.add(group) + if not implied.issubset(new_with_implied) and len(implied) == 1: + for group in implied: + new.discard(group) + set_groups_by_legacy_set(self, new) + value = [group in new for group in legacy_group_names] + for i in range(len(value)): + self.sprite_track_flags[i] = value[i] + +def legacy_flags_get(self): + return [x for x in self.sprite_track_flags] + +# When the user switches from full to simple mode, force the groups to match the simple mode +def sprite_group_mode_updated(self, context): + if self.sprite_group_mode == "SIMPLE": + set_groups_by_legacy_set(self, self.get_legacy_set()) class VehicleProperties(bpy.types.PropertyGroup): # Create legacy sprite groups @@ -53,11 +78,19 @@ class VehicleProperties(bpy.types.PropertyGroup): legacy_defaults.append(config[2]) sprite_track_flags = bpy.props.BoolVectorProperty( + name="Track Pieces", + default=legacy_defaults, + description="Which track pieces to render sprites for", + size=len(legacy_spritegroups) + ) + + legacy_flags = bpy.props.BoolVectorProperty( name="Track Pieces", default=legacy_defaults, description="Which track pieces to render sprites for", size=len(legacy_spritegroups), - set = legacy_groups_to_set + set = legacy_groups_set, + get = legacy_flags_get ) # Create modern sprite groups @@ -80,9 +113,14 @@ class VehicleProperties(bpy.types.PropertyGroup): "Combines several sprite groups and sets their sprite precisions automatically", 1), ("FULL", "Full sprite groups", "Set all sprite group precisions manually", 2), - ) + ), + update = sprite_group_mode_updated ) + def get_legacy_set(self): + return { legacy_group_names[i] for i in range(len(self.sprite_track_flags)) if self.sprite_track_flags[i] } + + def register_vehicles_properties(): bpy.types.Scene.rct_graphics_helper_vehicle_properties = bpy.props.PointerProperty( diff --git a/rct-graphics-helper/rct_graphics_helper_panel.py b/rct-graphics-helper/rct_graphics_helper_panel.py index 2ab5f76..0e98098 100644 --- a/rct-graphics-helper/rct_graphics_helper_panel.py +++ b/rct-graphics-helper/rct_graphics_helper_panel.py @@ -44,11 +44,12 @@ def addRenderButton(layout, hasFailed = False): legacy_group_display_order = [ "VEHICLE_SPRITE_FLAG_FLAT", - "VEHICLE_SPRITE_FLAG_GENTLE_SLOPES", - "VEHICLE_SPRITE_FLAG_STEEP_SLOPES", - "VEHICLE_SPRITE_FLAG_DIAGONAL_SLOPES", "VEHICLE_SPRITE_FLAG_FLAT_BANKED", + "VEHICLE_SPRITE_FLAG_GENTLE_SLOPES", "VEHICLE_SPRITE_FLAG_GENTLE_SLOPE_BANKED_TURNS", + "VEHICLE_SPRITE_FLAG_DIAGONAL_SLOPES", + "VEHICLE_SPRITE_FLAG_DIAGONAL_SLOPE_BANKED", + "VEHICLE_SPRITE_FLAG_STEEP_SLOPES", "VEHICLE_SPRITE_FLAG_VERTICAL_SLOPES", "VEHICLE_SPRITE_FLAG_INLINE_TWISTS", "VEHICLE_SPRITE_FLAG_CORKSCREWS", @@ -238,7 +239,7 @@ def draw_vehicle_panel(self, scene, layout): for legacy_group_name in self.legacy_group_display_order: sprite_track_flagset = properties.legacy_spritegroups[legacy_group_name] index = legacy_group_names.index(legacy_group_name) - columns[i % 2].row().prop(properties, "sprite_track_flags", + columns[i % 2].row().prop(properties, "legacy_flags", index=index, text=sprite_track_flagset.name) i += 1 else: From bd8adfaf4c53337da37553a196910bd326000ed7 Mon Sep 17 00:00:00 2001 From: Spacek531 Date: Mon, 6 Oct 2025 19:55:12 -0700 Subject: [PATCH 6/9] move the table with the other ones and draw columns as columns --- rct-graphics-helper/angle_sections/track.py | 16 ++++++++++++ .../rct_graphics_helper_panel.py | 25 ++++--------------- 2 files changed, 21 insertions(+), 20 deletions(-) diff --git a/rct-graphics-helper/angle_sections/track.py b/rct-graphics-helper/angle_sections/track.py index 29272eb..fd04b83 100644 --- a/rct-graphics-helper/angle_sections/track.py +++ b/rct-graphics-helper/angle_sections/track.py @@ -304,6 +304,22 @@ "VEHICLE_SPRITE_FLAG_DIAGONAL_SLOPE_BANKED" ] +legacy_group_display_order = [ + "VEHICLE_SPRITE_FLAG_FLAT", + "VEHICLE_SPRITE_FLAG_GENTLE_SLOPES", + "VEHICLE_SPRITE_FLAG_STEEP_SLOPES", + "VEHICLE_SPRITE_FLAG_DIAGONAL_SLOPES", + "VEHICLE_SPRITE_FLAG_VERTICAL_SLOPES", + "VEHICLE_SPRITE_FLAG_INLINE_TWISTS", + "VEHICLE_SPRITE_FLAG_CORKSCREWS", + "VEHICLE_SPRITE_FLAG_ZERO_G_ROLLS", + "VEHICLE_SPRITE_FLAG_FLAT_BANKED", + "VEHICLE_SPRITE_FLAG_DIAGONAL_SLOPE_BANKED", + "VEHICLE_SPRITE_FLAG_GENTLE_SLOPE_BANKED_TURNS", + "VEHICLE_SPRITE_FLAG_CURVED_LIFT_HILL", + "VEHICLE_SPRITE_FLAG_RESTRAINT_ANIMATION" +] + # Legacy sprite groups that are reset every time the user makes a selection legacy_groups_implied = [ "VEHICLE_SPRITE_FLAG_FLAT_TO_GENTLE_SLOPE_BANKED_TRANSITIONS", diff --git a/rct-graphics-helper/rct_graphics_helper_panel.py b/rct-graphics-helper/rct_graphics_helper_panel.py index 0e98098..324f07b 100644 --- a/rct-graphics-helper/rct_graphics_helper_panel.py +++ b/rct-graphics-helper/rct_graphics_helper_panel.py @@ -16,7 +16,7 @@ from .operators.render_switch_operator import RenderRCTSwitch from .models.palette import palette_colors, palette_colors_details -from .angle_sections.track import sprite_group_names, legacy_group_names +from .angle_sections.track import sprite_group_names, legacy_group_names, legacy_group_display_order 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.""" @@ -42,22 +42,6 @@ def addRenderButton(layout, hasFailed = False): text = "Render failed" row.operator("render.rct_switch", text=text) -legacy_group_display_order = [ - "VEHICLE_SPRITE_FLAG_FLAT", - "VEHICLE_SPRITE_FLAG_FLAT_BANKED", - "VEHICLE_SPRITE_FLAG_GENTLE_SLOPES", - "VEHICLE_SPRITE_FLAG_GENTLE_SLOPE_BANKED_TURNS", - "VEHICLE_SPRITE_FLAG_DIAGONAL_SLOPES", - "VEHICLE_SPRITE_FLAG_DIAGONAL_SLOPE_BANKED", - "VEHICLE_SPRITE_FLAG_STEEP_SLOPES", - "VEHICLE_SPRITE_FLAG_VERTICAL_SLOPES", - "VEHICLE_SPRITE_FLAG_INLINE_TWISTS", - "VEHICLE_SPRITE_FLAG_CORKSCREWS", - "VEHICLE_SPRITE_FLAG_ZERO_G_ROLLS", - "VEHICLE_SPRITE_FLAG_CURVED_LIFT_HILL", - "VEHICLE_SPRITE_FLAG_RESTRAINT_ANIMATION" -] - class GraphicsHelperPanel(bpy.types.Panel): bl_label = "RCT Graphics Helper" bl_idname = "VIEW3D_PT_rct_graphics_helper" @@ -236,11 +220,12 @@ def draw_vehicle_panel(self, scene, layout): columns = [split.column(), split.column()] i = 0 if properties.sprite_group_mode == "SIMPLE": - for legacy_group_name in self.legacy_group_display_order: + splitpoint = len(legacy_group_display_order) // 2 + for legacy_group_name in legacy_group_display_order: sprite_track_flagset = properties.legacy_spritegroups[legacy_group_name] index = legacy_group_names.index(legacy_group_name) - columns[i % 2].row().prop(properties, "legacy_flags", - index=index, text=sprite_track_flagset.name) + columns[i > splitpoint].row().prop(properties, "legacy_flags", + index=index, text=sprite_track_flagset.name) i += 1 else: columns = [column.split(0.667) for column in columns] From 8323259e20f894024ca436baf9bd8ce86312d50e Mon Sep 17 00:00:00 2001 From: Spacek531 Date: Mon, 6 Oct 2025 23:02:36 -0700 Subject: [PATCH 7/9] add dive loop rendering --- rct-graphics-helper/angle_sections/track.py | 129 +++++++++++------- .../operators/vehicle_render_operator.py | 4 +- .../properties/vehicle_properties.py | 45 +++--- .../rct_graphics_helper_panel.py | 8 +- 4 files changed, 111 insertions(+), 75 deletions(-) diff --git a/rct-graphics-helper/angle_sections/track.py b/rct-graphics-helper/angle_sections/track.py index fd04b83..d6d1f58 100644 --- a/rct-graphics-helper/angle_sections/track.py +++ b/rct-graphics-helper/angle_sections/track.py @@ -7,18 +7,36 @@ RCT Graphics Helper is licensed under the GNU General Public License version 3. ''' -# This is the order sprite groups are rendered in -sprite_group_names = [ - "slopeFlat", "slopes12", "slopes25", "slopes42", - "slopes60", "slopes75", "slopes90", "slopesLoop", - "slopeInverted", "slopes8", "slopes16", "slopes50", - "flatBanked22", "flatBanked45", "flatBanked67", "flatBanked90", - "inlineTwists", "slopes12Banked22", "slopes8Banked22", "slopes25Banked22", - "slopes8Banked45", "slopes16Banked22", "slopes16Banked45", "slopes25Banked45", - "slopes12Banked45", "slopes25Banked67", "slopes25Banked90", "slopes25InlineTwists", - "slopes42Banked22", "slopes42Banked45", "slopes42Banked67", "slopes42Banked90", - "slopes60Banked22", "corkscrews", "restraintAnimation", "curvedLiftHillUp", - "curvedLiftHillDown" +# Order that the modern sprite groups are rendered in and the order they are placed in the menu +sprite_group_display_order = [ + "slopeFlat", "slopes12", "slopes25", "slopes42", + "slopes60", "slopes75", "slopes90", "slopesLoop", + "slopeInverted", "slopes8", "slopes16", "slopes50", + "flatBanked22", "flatBanked45", "flatBanked67", "flatBanked90", + "inlineTwists", "slopes12Banked22", "slopes8Banked22", "slopes25Banked22", + "slopes8Banked45", "slopes16Banked22", "slopes16Banked45", "slopes25Banked45", + "slopes12Banked45", "slopes25Banked67", "slopes25Banked90", "slopes25InlineTwists", + "slopes42Banked22", "slopes42Banked45", "slopes42Banked67", "slopes42Banked90", + "slopes60Banked22", "slopes50Banked45", "slopes50Banked67", "slopes50Banked90", + "corkscrews", "restraintAnimation", "curvedLiftHillUp", "curvedLiftHillDown", +] + +# Order the legacy sprite groups are placed in the menu +legacy_group_display_order = [ + "VEHICLE_SPRITE_FLAG_FLAT", + "VEHICLE_SPRITE_FLAG_GENTLE_SLOPES", + "VEHICLE_SPRITE_FLAG_STEEP_SLOPES", + "VEHICLE_SPRITE_FLAG_DIAGONAL_SLOPES", + "VEHICLE_SPRITE_FLAG_VERTICAL_SLOPES", + "VEHICLE_SPRITE_FLAG_INLINE_TWISTS", + "VEHICLE_SPRITE_FLAG_CORKSCREWS", + "VEHICLE_SPRITE_FLAG_ZERO_G_ROLLS", + "VEHICLE_SPRITE_FLAG_DIVE_LOOPS", + "VEHICLE_SPRITE_FLAG_FLAT_BANKED", + "VEHICLE_SPRITE_FLAG_GENTLE_SLOPE_BANKED_TURNS", + "VEHICLE_SPRITE_FLAG_DIAGONAL_SLOPE_BANKED", + "VEHICLE_SPRITE_FLAG_CURVED_LIFT_HILL", + "VEHICLE_SPRITE_FLAG_RESTRAINT_ANIMATION" ] # The sprites to render in each sprite group. The given rotation values are unused @@ -205,6 +223,24 @@ [False, 32, -58.5148, -22.5, 0], [False, 32, -58.5148, 22.5, 0] ], + 'slopes50Banked45': [ + [True, 32, 49.1035, -45.0, 0], + [True, 32, 49.1035, 45.0, 0], + [True, 32, -49.1035, -45.0, 0], + [True, 32, -49.1035, 45.0, 0] + ], + 'slopes50Banked67': [ + [True, 32, 49.1035, -67.5, 0], + [True, 32, 49.1035, 67.5, 0], + [True, 32, -49.1035, -67.5, 0], + [True, 32, -49.1035, 67.5, 0] + ], + 'slopes50Banked90': [ + [True, 32, 49.1035, -90.0, 0], + [True, 32, 49.1035, 90.0, 0], + [True, 32, -49.1035, -90.0, 0], + [True, 32, -49.1035, 90.0, 0] + ], 'corkscrews': [ [False, 4, 22.21, 20.7, 4.11], [False, 4, 50.77, 37.76, 18.43], @@ -241,7 +277,7 @@ ] } -# Default sprite precision for full mode, the tooltip for the sprite group, and if the sprite group should be hidden from the list of sprite groups +# Default sprite precision for full mode and the tooltip for the sprite group sprite_group_metadata = { "slopeFlat": [32, "Flat track"], "slopes12": [4, "Orthogonal flat-to-gentle slope track"], @@ -275,14 +311,17 @@ "slopes42Banked45": [4, "Part of large zero-G roll"], "slopes42Banked67": [4, "Part of large zero-G roll"], "slopes42Banked90": [4, "Part of large zero-G roll"], - "slopes60Banked22": [4, "Part of large zero-G roll"], + "slopes60Banked22": [8, "4 with only zero-G roll, 8 with dive loop"], + "slopes50Banked45": [4, "Part of dive loop"], + "slopes50Banked67": [4, "Part of dive loop"], + "slopes50Banked90": [4, "Part of dive loop"], "corkscrews": [4, "Corkscrew track"], "restraintAnimation": [4, "Animated restraints"], "curvedLiftHillUp": [32, "Sprial lifthill up track"], "curvedLiftHillDown": [32, "Spiral lifthill down track"] } -# All legacy groups. See list in rct_graphics_helper_panel.py for which ones are displayed +# All legacy groups legacy_group_names = [ "VEHICLE_SPRITE_FLAG_FLAT", "VEHICLE_SPRITE_FLAG_GENTLE_SLOPES", @@ -301,23 +340,8 @@ "VEHICLE_SPRITE_FLAG_CURVED_LIFT_HILL", "VEHICLE_SPRITE_FLAG_ZERO_G_ROLLS", "VEHICLE_SPRITE_FLAG_INVERTED", - "VEHICLE_SPRITE_FLAG_DIAGONAL_SLOPE_BANKED" -] - -legacy_group_display_order = [ - "VEHICLE_SPRITE_FLAG_FLAT", - "VEHICLE_SPRITE_FLAG_GENTLE_SLOPES", - "VEHICLE_SPRITE_FLAG_STEEP_SLOPES", - "VEHICLE_SPRITE_FLAG_DIAGONAL_SLOPES", - "VEHICLE_SPRITE_FLAG_VERTICAL_SLOPES", - "VEHICLE_SPRITE_FLAG_INLINE_TWISTS", - "VEHICLE_SPRITE_FLAG_CORKSCREWS", - "VEHICLE_SPRITE_FLAG_ZERO_G_ROLLS", - "VEHICLE_SPRITE_FLAG_FLAT_BANKED", "VEHICLE_SPRITE_FLAG_DIAGONAL_SLOPE_BANKED", - "VEHICLE_SPRITE_FLAG_GENTLE_SLOPE_BANKED_TURNS", - "VEHICLE_SPRITE_FLAG_CURVED_LIFT_HILL", - "VEHICLE_SPRITE_FLAG_RESTRAINT_ANIMATION" + "VEHICLE_SPRITE_FLAG_DIVE_LOOPS", ] # Legacy sprite groups that are reset every time the user makes a selection @@ -326,30 +350,33 @@ "VEHICLE_SPRITE_FLAG_DIAGONAL_GENTLE_SLOPE_BANKED_TRANSITIONS", "VEHICLE_SPRITE_FLAG_FLAT_TO_GENTLE_SLOPE_WHILE_BANKED_TRANSITIONS", "VEHICLE_SPRITE_FLAG_GENTLE_SLOPE_BANKED_TRANSITIONS", - "VEHICLE_SPRITE_FLAG_INVERTED" + "VEHICLE_SPRITE_FLAG_INVERTED", + "VEHICLE_SPRITE_FLAG_DIAGONAL_SLOPED_BANK_TRANSITIONS", ] # Display name of each sprite group, tooltip for each sprite group, default state of each sprite group legacy_group_metadata = { - "VEHICLE_SPRITE_FLAG_FLAT": ["Flat", "Render sprites for flat track", True], - "VEHICLE_SPRITE_FLAG_GENTLE_SLOPES": ["Gentle Slopes", "Render sprites for gentle sloped track", True], - "VEHICLE_SPRITE_FLAG_STEEP_SLOPES": ["Steep Slopes", "Render sprites for steep sloped track", False], - "VEHICLE_SPRITE_FLAG_VERTICAL_SLOPES": ["Vertical Loops", "Render sprites for vertical slopes and loops", False], - "VEHICLE_SPRITE_FLAG_DIAGONAL_SLOPES": ["Diagonal Slopes", "Render sprites for diagonal slopes", True], - "VEHICLE_SPRITE_FLAG_FLAT_BANKED": ["Flat Banked","Render sprites for flat banked track", False], - "VEHICLE_SPRITE_FLAG_INLINE_TWISTS": ["Inline Twist", "Render sprites for the inline twist element", False], + "VEHICLE_SPRITE_FLAG_FLAT": ["Flat", "", True], + "VEHICLE_SPRITE_FLAG_GENTLE_SLOPES": ["Gentle Slopes", "", True], + "VEHICLE_SPRITE_FLAG_STEEP_SLOPES": ["Steep Slopes", "", False], + "VEHICLE_SPRITE_FLAG_VERTICAL_SLOPES": ["Vertical Loops", "", False], + "VEHICLE_SPRITE_FLAG_DIAGONAL_SLOPES": ["Diagonal Slopes", "", True], + "VEHICLE_SPRITE_FLAG_FLAT_BANKED": ["Flat Banked","", False], + "VEHICLE_SPRITE_FLAG_INLINE_TWISTS": ["Inline Twist", "Depends on Vertical Loops and Flat Banked", False], "VEHICLE_SPRITE_FLAG_FLAT_TO_GENTLE_SLOPE_BANKED_TRANSITIONS": ["", "", False], "VEHICLE_SPRITE_FLAG_DIAGONAL_GENTLE_SLOPE_BANKED_TRANSITIONS": ["", "", False], - "VEHICLE_SPRITE_FLAG_DIAGONAL_GENTLE_SLOPE_BANKED_TRANSITIONS": ["", "", False], "VEHICLE_SPRITE_FLAG_GENTLE_SLOPE_BANKED_TRANSITIONS": ["", "", False], - "VEHICLE_SPRITE_FLAG_GENTLE_SLOPE_BANKED_TURNS": ["Sloped Banked Turns","Render sprites for sloped banked turns", False], + "VEHICLE_SPRITE_FLAG_GENTLE_SLOPE_BANKED_TURNS": ["Sloped Banked Turns","", False], "VEHICLE_SPRITE_FLAG_FLAT_TO_GENTLE_SLOPE_WHILE_BANKED_TRANSITIONS": ["", "", False], - "VEHICLE_SPRITE_FLAG_CORKSCREWS": ["Corkscrew", "Render sprites for corkscrews", False], - "VEHICLE_SPRITE_FLAG_RESTRAINT_ANIMATION": ["Animated Restraints", "Render animated restraints", False], - "VEHICLE_SPRITE_FLAG_CURVED_LIFT_HILL": ["Spiral Lifthill", "Render sprites for spiral lifthills", False], - "VEHICLE_SPRITE_FLAG_ZERO_G_ROLLS": ["Zero-G Rolls", "Render sprites for zero-G rolls", False], + "VEHICLE_SPRITE_FLAG_CORKSCREWS": ["Corkscrew", "", False], + "VEHICLE_SPRITE_FLAG_RESTRAINT_ANIMATION": ["Animated Restraints", "3-sprite restraint opening animation", False], + "VEHICLE_SPRITE_FLAG_CURVED_LIFT_HILL": ["Spiral Lifthill", "", False], + "VEHICLE_SPRITE_FLAG_ZERO_G_ROLLS": ["Zero-G Rolls", "Depends on Sloped Banked Turns", False], "VEHICLE_SPRITE_FLAG_INVERTED": ["", "", False], - "VEHICLE_SPRITE_FLAG_DIAGONAL_SLOPE_BANKED": ["Diagonal Sloped Banked", "Render sprites for diagonal sloped banked track", False], + "VEHICLE_SPRITE_FLAG_DIAGONAL_SLOPE_BANKED": ["Diagonal Sloped Banked", "", False], + "VEHICLE_SPRITE_FLAG_DIVE_LOOPS": ["Dive loop", "Depends on Zero-G Rolls and Sloped Banked Turns", False], + "VEHICLE_SPRITE_FLAG_DIAGONAL_SLOPED_BANK_TRANSITIONS": ["", "", False], + "VEHICLE_SPRITE_FLAG_DIAGONAL_SLOPE_BANKED_TURNS": ["Diagonal slope banked turns", "Depends on Sloped Banked Turns", False], } # What full sprite groups each legacy group maps to @@ -371,18 +398,20 @@ 'VEHICLE_SPRITE_FLAG_CURVED_LIFT_HILL': ['curvedLiftHillUp', 'curvedLiftHillDown'], 'VEHICLE_SPRITE_FLAG_ZERO_G_ROLLS': ["slopes60Banked22", "slopes42Banked22","slopes42Banked45","slopes42Banked67","slopes42Banked90", "slopes25InlineTwists", "slopes25Banked67","slopes25Banked90"], 'VEHICLE_SPRITE_FLAG_INVERTED': ['slopeInverted'], - 'VEHICLE_SPRITE_FLAG_DIAGONAL_SLOPE_BANKED': ['slopes8Banked45', 'slopes16Banked22', 'slopes16Banked45'] + 'VEHICLE_SPRITE_FLAG_DIAGONAL_SLOPE_BANKED': ['slopes8Banked45', 'slopes16Banked22', 'slopes16Banked45'], } -# What legacy groups are implied by combinations of other legacy sprite groups +# What legacy groups depend on other legacy groups legacy_group_dependencies = { frozenset({'VEHICLE_SPRITE_FLAG_GENTLE_SLOPE_BANKED_TURNS'}): frozenset({'VEHICLE_SPRITE_FLAG_GENTLE_SLOPE_BANKED_TRANSITIONS','VEHICLE_SPRITE_FLAG_FLAT_TO_GENTLE_SLOPE_WHILE_BANKED_TRANSITIONS','VEHICLE_SPRITE_FLAG_FLAT_TO_GENTLE_SLOPE_BANKED_TRANSITIONS'}), frozenset({'VEHICLE_SPRITE_FLAG_FLAT_BANKED','VEHICLE_SPRITE_FLAG_GENTLE_SLOPES'}): frozenset({'VEHICLE_SPRITE_FLAG_FLAT_TO_GENTLE_SLOPE_BANKED_TRANSITIONS'}), frozenset({'VEHICLE_SPRITE_FLAG_FLAT_BANKED','VEHICLE_SPRITE_FLAG_DIAGONAL_SLOPES'}): frozenset({'VEHICLE_SPRITE_FLAG_DIAGONAL_GENTLE_SLOPE_BANKED_TRANSITIONS'}), frozenset({'VEHICLE_SPRITE_FLAG_INLINE_TWISTS'}): frozenset({'VEHICLE_SPRITE_FLAG_FLAT_BANKED', 'VEHICLE_SPRITE_FLAG_INVERTED'}), + frozenset({'VEHICLE_SPRITE_FLAG_VERTICAL_SLOPES'}): frozenset({'VEHICLE_SPRITE_FLAG_FLAT_BANKED', 'VEHICLE_SPRITE_FLAG_INVERTED'}), frozenset({'VEHICLE_SPRITE_FLAG_CORKSCREWS'}): frozenset({'VEHICLE_SPRITE_FLAG_INVERTED'}), - frozenset({'VEHICLE_SPRITE_FLAG_ZERO_G_ROLLS'}): frozenset({'VEHICLE_SPRITE_FLAG_GENTLE_SLOPE_BANKED_TURNS', 'VEHICLE_SPRITE_FLAG_GENTLE_SLOPE_BANKED_TRANSITIONS', 'VEHICLE_SPRITE_FLAG_GENTLE_SLOPES', 'VEHICLE_SPRITE_FLAG_INVERTED'}), - frozenset({'VEHICLE_SPRITE_FLAG_DIAGONAL_SLOPE_BANKED'}): frozenset({'VEHICLE_SPRITE_FLAG_DIAGONAL_GENTLE_SLOPE_BANKED_TRANSITIONS'}) + frozenset({'VEHICLE_SPRITE_FLAG_ZERO_G_ROLLS'}): frozenset({'VEHICLE_SPRITE_FLAG_GENTLE_SLOPE_BANKED_TURNS', 'VEHICLE_SPRITE_FLAG_GENTLE_SLOPE_BANKED_TRANSITIONS','VEHICLE_SPRITE_FLAG_FLAT_TO_GENTLE_SLOPE_WHILE_BANKED_TRANSITIONS', 'VEHICLE_SPRITE_FLAG_FLAT_TO_GENTLE_SLOPE_BANKED_TRANSITIONS', 'VEHICLE_SPRITE_FLAG_INVERTED'}), + frozenset({'VEHICLE_SPRITE_FLAG_DIVE_LOOPS'}): frozenset({'VEHICLE_SPRITE_FLAG_ZERO_G_ROLLS','VEHICLE_SPRITE_FLAG_GENTLE_SLOPE_BANKED_TURNS', 'VEHICLE_SPRITE_FLAG_GENTLE_SLOPE_BANKED_TRANSITIONS','VEHICLE_SPRITE_FLAG_FLAT_TO_GENTLE_SLOPE_WHILE_BANKED_TRANSITIONS', 'VEHICLE_SPRITE_FLAG_FLAT_TO_GENTLE_SLOPE_BANKED_TRANSITIONS', 'VEHICLE_SPRITE_FLAG_INVERTED'}), + frozenset({'VEHICLE_SPRITE_FLAG_DIAGONAL_SLOPE_BANKED'}): frozenset({'VEHICLE_SPRITE_FLAG_GENTLE_SLOPE_BANKED_TURNS', 'VEHICLE_SPRITE_FLAG_GENTLE_SLOPE_BANKED_TRANSITIONS','VEHICLE_SPRITE_FLAG_FLAT_TO_GENTLE_SLOPE_WHILE_BANKED_TRANSITIONS', 'VEHICLE_SPRITE_FLAG_FLAT_TO_GENTLE_SLOPE_BANKED_TRANSITIONS'}), } diff --git a/rct-graphics-helper/operators/vehicle_render_operator.py b/rct-graphics-helper/operators/vehicle_render_operator.py index 53d36bc..f8e6518 100644 --- a/rct-graphics-helper/operators/vehicle_render_operator.py +++ b/rct-graphics-helper/operators/vehicle_render_operator.py @@ -12,7 +12,7 @@ import os from ..operators.render_operator import RCTRender -from ..angle_sections.track import sprite_group_names, sprite_group_manifest +from ..angle_sections.track import sprite_group_display_order, sprite_group_manifest class RenderVehicle(RCTRender, bpy.types.Operator): @@ -63,7 +63,7 @@ def add_render_angles(self, context, is_inverted=False, animation_frames=1): if is_inverted: extra_roll = 180 - for sprite_group_name in sprite_group_names: + for sprite_group_name in sprite_group_display_order: track_sections = sprite_group_manifest[sprite_group_name] if sprite_group_name not in properties: diff --git a/rct-graphics-helper/properties/vehicle_properties.py b/rct-graphics-helper/properties/vehicle_properties.py index 310fa03..d60ad7d 100644 --- a/rct-graphics-helper/properties/vehicle_properties.py +++ b/rct-graphics-helper/properties/vehicle_properties.py @@ -36,7 +36,7 @@ def CreateSpriteEnum(defaultValue): ("8", "8" + (defaultValue == 8 and " (Default)" or ""), "8 sprites", 8), ("16", "16" + (defaultValue == 16 and " (Default)" or ""), "16 sprites", 16), ("32", "32" + (defaultValue == 32 and " (Default)" or ""), "32 sprites (RCT2 default)", 32), - ("64", "64" + (defaultValue == 64 and " (Default)" or ""), "64 sprites ", 64) +# ("64", "64" + (defaultValue == 64 and " (Default)" or ""), "64 sprites", 64) ) def set_groups_by_legacy_set(self, set): @@ -44,22 +44,27 @@ def set_groups_by_legacy_set(self, set): for group in newgroups: self[group] = sprite_group_metadata[group][0] * (groupname in set) -# this is called with self as VehicleProperties -def legacy_groups_set(self, value): - new_with_implied = { legacy_group_names[i] for i in range(len(value)) if value[i] or (legacy_group_names[i] in legacy_groups_implied) } - new = { legacy_group_names[i] for i in range(len(value)) if value[i] and not legacy_group_names[i] in legacy_groups_implied } - for implied, dependencies in legacy_group_dependencies.items(): - if implied.issubset(new_with_implied): +# this is called with self as VehicleProperties and bool_array as an array of bools in legacy_group_names order +def legacy_groups_set(self, bool_array): + + # convert bool array to set of legacy groups, and disable all implied groups + enabled_groups = { legacy_group_names[i] for i in range(len(bool_array)) if bool_array[i] and not legacy_group_names[i] in legacy_groups_implied } + + # include all the groups that are dependent on other groups + for group_with_dependencies, dependencies in legacy_group_dependencies.items(): + if group_with_dependencies.issubset(enabled_groups): for group in dependencies: - new.add(group) - if not implied.issubset(new_with_implied) and len(implied) == 1: - for group in implied: - new.discard(group) - set_groups_by_legacy_set(self, new) - value = [group in new for group in legacy_group_names] - for i in range(len(value)): - self.sprite_track_flags[i] = value[i] + enabled_groups.add(group) + + # set the modern groups based on the set of legacy groups + set_groups_by_legacy_set(self, enabled_groups) + # set the internal property to the selected groups + bool_array = [group in enabled_groups for group in legacy_group_names] + for i in range(len(bool_array)): + self.sprite_track_flags[i] = bool_array[i] + +# Return bool array of current state def legacy_flags_get(self): return [x for x in self.sprite_track_flags] @@ -73,17 +78,19 @@ class VehicleProperties(bpy.types.PropertyGroup): legacy_defaults = [] legacy_spritegroups = {} for legacy_group_name in legacy_group_names: - config = legacy_group_metadata[legacy_group_name] - legacy_spritegroups[legacy_group_name] = SpriteTrackFlag(legacy_group_name, *config) - legacy_defaults.append(config[2]) + legacy_group_config = legacy_group_metadata[legacy_group_name] + legacy_spritegroups[legacy_group_name] = SpriteTrackFlag(legacy_group_name, *legacy_group_config) + legacy_defaults.append(legacy_group_config[2]) + # The actual property that is saved sprite_track_flags = bpy.props.BoolVectorProperty( name="Track Pieces", default=legacy_defaults, description="Which track pieces to render sprites for", size=len(legacy_spritegroups) ) - + + # Alias property which intercepts user input, to prevent recursive setter calls legacy_flags = bpy.props.BoolVectorProperty( name="Track Pieces", default=legacy_defaults, diff --git a/rct-graphics-helper/rct_graphics_helper_panel.py b/rct-graphics-helper/rct_graphics_helper_panel.py index 324f07b..4ecb767 100644 --- a/rct-graphics-helper/rct_graphics_helper_panel.py +++ b/rct-graphics-helper/rct_graphics_helper_panel.py @@ -16,7 +16,7 @@ from .operators.render_switch_operator import RenderRCTSwitch from .models.palette import palette_colors, palette_colors_details -from .angle_sections.track import sprite_group_names, legacy_group_names, legacy_group_display_order +from .angle_sections.track import sprite_group_display_order, legacy_group_names, legacy_group_display_order 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.""" @@ -224,14 +224,14 @@ def draw_vehicle_panel(self, scene, layout): for legacy_group_name in legacy_group_display_order: sprite_track_flagset = properties.legacy_spritegroups[legacy_group_name] index = legacy_group_names.index(legacy_group_name) - columns[i > splitpoint].row().prop(properties, "legacy_flags", + columns[i >= splitpoint].row().prop(properties, "legacy_flags", index=index, text=sprite_track_flagset.name) i += 1 else: columns = [column.split(0.667) for column in columns] subcolumns = [columns[0].column(), columns[0].column(),columns[1].column(), columns[1].column()] - splitpoint = len(sprite_group_names) // 2 - for sprite_group_name in sprite_group_names: + splitpoint = len(sprite_group_display_order) // 2 + for sprite_group_name in sprite_group_display_order: subcolumns[(i > splitpoint) * 2].row().label(sprite_group_name+":") subcolumns[(i > splitpoint) * 2 + 1].row().prop(properties, sprite_group_name, text = "") i += 1 From e6edf1725c4ebbf87963d65528b7fac87991a560 Mon Sep 17 00:00:00 2001 From: Spacek531 Date: Mon, 6 Oct 2025 23:11:53 -0700 Subject: [PATCH 8/9] update copyright info --- rct-graphics-helper/angle_sections/track.py | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/rct-graphics-helper/angle_sections/track.py b/rct-graphics-helper/angle_sections/track.py index d6d1f58..fc3dde7 100644 --- a/rct-graphics-helper/angle_sections/track.py +++ b/rct-graphics-helper/angle_sections/track.py @@ -1,8 +1,8 @@ ''' -Copyright (c) 2023 RCT Graphics Helper developers +Copyright (c) 2025 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 +Interested in contributing? Visit https://github.com/openrct2/Blender-RCT-Graphics RCT Graphics Helper is licensed under the GNU General Public License version 3. ''' From d557a04c7820405e4c7cbd448e1e713ded8cc3b5 Mon Sep 17 00:00:00 2001 From: Spacek531 Date: Mon, 6 Oct 2025 23:42:18 -0700 Subject: [PATCH 9/9] bump version --- rct-graphics-helper/__init__.py | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/rct-graphics-helper/__init__.py b/rct-graphics-helper/__init__.py index 3f74aef..e15462a 100644 --- a/rct-graphics-helper/__init__.py +++ b/rct-graphics-helper/__init__.py @@ -25,7 +25,7 @@ "name": "RCT Graphics Helper", "description": "Render tool to replicate RCT graphics", "author": "Olivier Wervers", - "version": (0, 6, 1), + "version": (0, 6, 2), "blender": (2, 79, 0), "location": "Render", "support": "COMMUNITY",