gitextract_sbtft37o/ ├── .gitignore ├── .isort.cfg ├── .pre-commit-config.yaml ├── .travis.yml ├── CODE_OF_CONDUCT.md ├── LICENSE ├── README.md ├── addons/ │ └── addons.README ├── io_xplane2blender/ │ ├── __init__.py │ ├── resources/ │ │ ├── Commands.txt │ │ ├── DataRefs.txt │ │ └── lights.txt │ ├── tests/ │ │ ├── __init__.py │ │ ├── animation_file_mappings.py │ │ └── test_creation_helpers.py │ ├── xplane_config.py │ ├── xplane_constants.py │ ├── xplane_export.py │ ├── xplane_helpers.py │ ├── xplane_ops.py │ ├── xplane_ops_dev.py │ ├── xplane_props.py │ ├── xplane_types/ │ │ ├── __init__.py │ │ ├── xplane_attribute.py │ │ ├── xplane_attributes.py │ │ ├── xplane_bone.py │ │ ├── xplane_commands.py │ │ ├── xplane_empty.py │ │ ├── xplane_face.py │ │ ├── xplane_file.py │ │ ├── xplane_header.py │ │ ├── xplane_keyframe.py │ │ ├── xplane_keyframe_collection.py │ │ ├── xplane_light.py │ │ ├── xplane_manipulator.py │ │ ├── xplane_material.py │ │ ├── xplane_material_utils.py │ │ ├── xplane_mesh.py │ │ ├── xplane_object.py │ │ ├── xplane_primitive.py │ │ └── xplane_vlights.py │ ├── xplane_ui.py │ ├── xplane_updater.py │ └── xplane_utils/ │ ├── __init__.py │ ├── xplane_commands_txt_parser.py │ ├── xplane_datarefs_txt_parser.py │ ├── xplane_effective_gloss.py │ ├── xplane_lights_txt_parser.py │ ├── xplane_updater_helpers.py │ └── xplane_wiper_gradient.py ├── mkbuild.py ├── pylintrc ├── pyproject.toml ├── requirements.txt ├── run.py ├── tests/ │ ├── addon/ │ │ ├── addon.test.py │ │ ├── fixtures/ │ │ │ ├── test_multiple_export_works_anim_bone.obj │ │ │ ├── test_multiple_export_works_simple.obj │ │ │ └── test_multiple_export_works_uv_map.obj │ │ ├── multiple_export_works.test.blend │ │ └── multiple_export_works.test.py │ ├── animation/ │ │ ├── TestCase1.test.blend │ │ ├── TestCase1.test.py │ │ ├── TestCase2.test.blend │ │ ├── TestCase2.test.py │ │ ├── TestCase3.test.blend │ │ ├── TestCase3.test.py │ │ ├── TestCase4.test.blend │ │ ├── TestCase4.test.py │ │ ├── TestCase5_nested_sets.test.blend │ │ ├── TestCase5_nested_sets.test.py │ │ ├── TestCase6_scaling_rot.test.blend │ │ ├── TestCase6_scaling_rot.test.py │ │ ├── TestCase7_scaling_rotloc.test.blend │ │ ├── TestCase7_scaling_rotloc.test.py │ │ ├── TestCase8_bone_optimization.test.blend │ │ ├── TestCase8_bone_optimization.test.py │ │ ├── TestCase9_keyframe_loops.test.blend │ │ ├── TestCase9_keyframe_loops.test.py │ │ ├── armature_bone_block_parent_relationships.test.blend │ │ ├── armature_bone_block_parent_relationships.test.py │ │ ├── armature_nested_offset.test.blend │ │ ├── armature_nested_offset.test.py │ │ ├── axis.test.blend │ │ ├── axis.test.disabled.py │ │ ├── bone_animations.test.blend │ │ ├── bone_animations.test.py │ │ ├── fixtures/ │ │ │ ├── TestCase1/ │ │ │ │ ├── armature_rotation_arbitrary_axis.obj │ │ │ │ ├── armature_rotation_twoaxis_3keys.obj │ │ │ │ ├── armature_translation_arbitrary.obj │ │ │ │ ├── object_rotation_X_axis_angle.obj │ │ │ │ ├── object_rotation_X_quaternion.obj │ │ │ │ ├── object_rotation_X_xyz_euler.obj │ │ │ │ ├── object_rotation_X_xzy_euler.obj │ │ │ │ ├── object_rotation_X_yxz_euler.obj │ │ │ │ ├── object_rotation_X_yzx_euler.obj │ │ │ │ ├── object_rotation_X_zxy_euler.obj │ │ │ │ ├── object_rotation_X_zyx_euler.obj │ │ │ │ ├── object_rotation_Y_axis_angle.obj │ │ │ │ ├── object_rotation_Y_quaternion.obj │ │ │ │ ├── object_rotation_Y_xyz_euler.obj │ │ │ │ ├── object_rotation_Y_xzy_euler.obj │ │ │ │ ├── object_rotation_Y_yxz_euler.obj │ │ │ │ ├── object_rotation_Y_yzx_euler.obj │ │ │ │ ├── object_rotation_Y_zxy_euler.obj │ │ │ │ ├── object_rotation_Y_zyx_euler.obj │ │ │ │ └── object_translation.obj │ │ │ ├── TestCase2/ │ │ │ │ ├── object_rotation_Z_axis_angle.obj │ │ │ │ ├── object_rotation_Z_quaternion.obj │ │ │ │ ├── object_rotation_Z_xyz_euler.obj │ │ │ │ ├── object_rotation_Z_xzy_euler.obj │ │ │ │ ├── object_rotation_Z_yxz_euler.obj │ │ │ │ ├── object_rotation_Z_yzx_euler.obj │ │ │ │ ├── object_rotation_Z_zxy_euler.obj │ │ │ │ ├── object_rotation_Z_zyx_euler.obj │ │ │ │ ├── object_rotation_arbitrary_3key_axis_angle.obj │ │ │ │ ├── object_rotation_arbitrary_3key_quaternion.obj │ │ │ │ ├── object_rotation_arbitrary_3key_xyz_euler.obj │ │ │ │ ├── object_rotation_arbitrary_3key_xzy_euler.obj │ │ │ │ ├── object_rotation_arbitrary_3key_yxz_euler.obj │ │ │ │ ├── object_rotation_arbitrary_3key_yzx_euler.obj │ │ │ │ ├── object_rotation_arbitrary_3key_zxy_euler.obj │ │ │ │ └── object_rotation_arbitrary_3key_zyx_euler.obj │ │ │ ├── TestCase3/ │ │ │ │ ├── object_rotation_translation_arbitrary_axis_angle.obj │ │ │ │ ├── object_rotation_translation_arbitrary_quaternion.obj │ │ │ │ ├── object_rotation_translation_arbitrary_xyz_euler.obj │ │ │ │ ├── object_rotation_translation_arbitrary_xzy_euler.obj │ │ │ │ ├── object_rotation_translation_arbitrary_yxz_euler.obj │ │ │ │ ├── object_rotation_translation_arbitrary_yzx_euler.obj │ │ │ │ ├── object_rotation_translation_arbitrary_zxy_euler.obj │ │ │ │ └── object_rotation_translation_arbitrary_zyx_euler.obj │ │ │ ├── TestCase4/ │ │ │ │ ├── armature_combined_rotation_translation.obj │ │ │ │ ├── object_orthagonal_2axis_3keys_axis_angle.obj │ │ │ │ ├── object_orthagonal_2axis_3keys_quaternion.obj │ │ │ │ ├── object_orthagonal_2axis_3keys_xyz_euler.obj │ │ │ │ ├── object_orthagonal_2axis_3keys_xzy_euler.obj │ │ │ │ ├── object_orthagonal_2axis_3keys_yxz_euler.obj │ │ │ │ ├── object_orthagonal_2axis_3keys_yzx_euler.obj │ │ │ │ ├── object_orthagonal_2axis_3keys_zxy_euler.obj │ │ │ │ ├── object_orthagonal_2axis_3keys_zyx_euler.obj │ │ │ │ ├── object_orthogonal_3keys.obj │ │ │ │ └── object_rotation_translation_orthogonal.obj │ │ │ ├── TestCase5_nested_sets/ │ │ │ │ ├── armature_locrot_nested_armature_locrot.obj │ │ │ │ ├── armature_locrot_whereOBJ_trans_rotation_arbitrary.obj │ │ │ │ ├── armature_locrot_whereOBJ_trans_rotation_single_axis.obj │ │ │ │ ├── armature_rot_nested_armature_rot.obj │ │ │ │ ├── armature_rot_nested_armature_rot_3keys.obj │ │ │ │ ├── mega_nested_mega.obj │ │ │ │ ├── object_trans_arbitrary_nested_object_trans_arbitrary.obj │ │ │ │ └── object_trans_ortho_nested_object_trans_ortho.obj │ │ │ ├── TestCase6_scaling_rot/ │ │ │ │ └── TestCase6_scaling_rot.obj │ │ │ ├── TestCase7_scaling_rotloc/ │ │ │ │ └── TestCase7_scaling_rotloc.obj │ │ │ ├── TestCase8_bone_optimization/ │ │ │ │ ├── TestCase8_loc.obj │ │ │ │ ├── TestCase8_rot.obj │ │ │ │ ├── TestCase8_rot_loc.obj │ │ │ │ └── TestCase8_static.obj │ │ │ ├── TestCase9_keyframe_loops/ │ │ │ │ ├── TestCase9_loop_arm.obj │ │ │ │ ├── TestCase9_loop_arm_bone.obj │ │ │ │ ├── TestCase9_loop_bone.obj │ │ │ │ └── TestCase9_loop_none.obj │ │ │ ├── armature_bone_block_parent_relationships/ │ │ │ │ ├── test_Armature_arm_anim_bone_anim.obj │ │ │ │ ├── test_Armature_arm_anim_bone_no_anim.obj │ │ │ │ ├── test_Armature_arm_no_anim_bone_anim.obj │ │ │ │ ├── test_Armature_arm_no_anim_bone_no_anim.obj │ │ │ │ └── test_no_parent.obj │ │ │ ├── nested_bones/ │ │ │ │ ├── test_1_Armature_child_bones_one_leaf_mesh.obj │ │ │ │ ├── test_2_Armature_child_bones_mesh_on_each.obj │ │ │ │ ├── test_3_Armature_multiple_arms_one_leaf_mesh.obj │ │ │ │ └── test_4_Armature_multiple_arms_child_bones_on_each.obj │ │ │ ├── test_01_datablock_datablock.obj │ │ │ ├── test_02_bone_datablock.obj │ │ │ ├── test_03_bone_bone_connected_offset_translation.obj │ │ │ ├── test_05_bone_bone_connected_no_offset_translation.obj │ │ │ ├── test_bone_animations.obj │ │ │ ├── test_kf_points_1_ignored_2_used.obj │ │ │ ├── test_multiple_armatures.obj │ │ │ ├── test_nested_armatures.obj │ │ │ ├── test_nested_bone_animations.obj │ │ │ ├── test_no_drop_dup_trans_rot_aa.obj │ │ │ ├── test_no_drop_dup_trans_rot_euler.obj │ │ │ ├── test_no_drop_dup_trans_rot_quat.obj │ │ │ ├── test_show_hide_hide_near_0.obj │ │ │ ├── test_show_hide_show_near_0.obj │ │ │ ├── test_single_bone_initial_rotation.obj │ │ │ └── transform_stack/ │ │ │ ├── test_transform_stack_cube_loc_w_parent.obj │ │ │ ├── test_transform_stack_cube_loc_wo_parent.obj │ │ │ ├── test_transform_stack_cube_locrot_w_parent.obj │ │ │ ├── test_transform_stack_cube_locrot_wo_parent.obj │ │ │ ├── test_transform_stack_cube_none_w_parent.obj │ │ │ ├── test_transform_stack_cube_none_wo_parent.obj │ │ │ ├── test_transform_stack_cube_rot_w_parent.obj │ │ │ └── test_transform_stack_cube_rot_wo_parent.obj │ │ ├── list.rtf │ │ ├── multiple_armatures.test.blend │ │ ├── multiple_armatures.test.py │ │ ├── nested_armatures.test.blend │ │ ├── nested_armatures.test.py │ │ ├── nested_bones.test.blend │ │ ├── nested_bones.test.py │ │ ├── no_dropped_dup_keys.test.blend │ │ ├── no_dropped_dup_keys.test.py │ │ ├── one_kf_point_fcurve_ignored.test.blend │ │ ├── one_kf_point_fcurve_ignored.test.py │ │ ├── show_hide_anim_types.test.blend │ │ ├── show_hide_anim_types.test.py │ │ ├── single_bone_initial_rotation.test.blend │ │ ├── single_bone_initial_rotation.test.py │ │ ├── transform_stack_w_parent.test.blend │ │ ├── transform_stack_w_parent.test.py │ │ ├── transform_stack_wo_parent.test.blend │ │ └── transform_stack_wo_parent.test.py │ ├── build_system/ │ │ ├── build_number_obj_footer.test.py │ │ ├── build_number_prop.test.py │ │ ├── build_number_updater.test.py │ │ ├── build_number_verstruct.test.py │ │ └── originals/ │ │ ├── v3_20_14.blend │ │ ├── v3_3_13.blend │ │ └── v3_4_0-beta_4.blend │ ├── features/ │ │ ├── cockpit_features/ │ │ │ ├── cockpit_device.test.blend │ │ │ ├── cockpit_device.test.py │ │ │ ├── cockpit_lit_only.test.blend │ │ │ ├── cockpit_lit_only.test.py │ │ │ ├── cockpit_material.test.blend │ │ │ ├── cockpit_material.test.py │ │ │ ├── cockpit_panel_luminance.test.blend │ │ │ ├── cockpit_panel_luminance.test.py │ │ │ ├── cockpit_regions.test.blend │ │ │ ├── cockpit_regions.test.py │ │ │ ├── fixtures/ │ │ │ │ ├── test_01_cockpit_lit_only_exported.obj │ │ │ │ ├── test_03_cockpit_lit_only_no_export_regions.obj │ │ │ │ ├── test_04_cockpit_lit_no_export_panel_mode_default.obj │ │ │ │ ├── test_05_cockpit_lit_only_no_export_wrong_version.obj │ │ │ │ ├── test_06_cockpit_lit_only_exported.obj │ │ │ │ ├── test_07_cockpit_lit_only_resets.obj │ │ │ │ ├── test_aircraft_material.obj │ │ │ │ ├── test_cockpit_material.obj │ │ │ │ ├── test_cockpit_regions_used_aircraft.obj │ │ │ │ ├── test_cockpit_regions_used_cockpit.obj │ │ │ │ ├── test_device_mix_with_panel.obj │ │ │ │ ├── test_device_passing_auto_adjust_off.obj │ │ │ │ ├── test_device_passing_bitfield.obj │ │ │ │ ├── test_device_passing_lighting_channel.obj │ │ │ │ ├── test_device_passing_names.obj │ │ │ │ ├── test_hud_glass_and_reset.obj │ │ │ │ ├── test_hud_glass_panel_device.obj │ │ │ │ ├── test_hud_glass_panel_emissive.obj │ │ │ │ ├── test_hud_glass_panel_regions.obj │ │ │ │ ├── test_hud_glass_panel_texture.obj │ │ │ │ ├── test_panel_luminance_cockpit.obj │ │ │ │ ├── test_panel_luminance_cockpit_device.obj │ │ │ │ ├── test_panel_luminance_cockpit_lit_only.obj │ │ │ │ └── test_panel_luminance_cockpit_regions.obj │ │ │ ├── hud_glass.test.blend │ │ │ └── hud_glass.test.py │ │ ├── draped.test.blend │ │ ├── draped.test.py │ │ ├── draw_enabled.test.blend │ │ ├── draw_enabled.test.py │ │ ├── export_control_methods.test.blend │ │ ├── export_control_methods.test.py │ │ ├── export_control_methods_lights.test.blend │ │ ├── export_control_methods_lights.test.py │ │ ├── export_control_methods_object.test.blend │ │ ├── export_control_methods_object.test.py │ │ ├── export_path_dir/ │ │ │ ├── Custom Scenery/ │ │ │ │ └── Kansas City/ │ │ │ │ └── cars/ │ │ │ │ ├── fixtures/ │ │ │ │ │ └── honda_1.obj │ │ │ │ ├── honda_1.test.blend │ │ │ │ └── honda_1.test.py │ │ │ └── default_scenery/ │ │ │ ├── Kansas City/ │ │ │ │ ├── cars/ │ │ │ │ │ ├── fixtures/ │ │ │ │ │ │ └── honda_2.obj │ │ │ │ │ ├── honda_2.test.blend │ │ │ │ │ └── honda_2.test.py │ │ │ │ ├── fixtures/ │ │ │ │ │ └── honda_3.obj │ │ │ │ ├── honda_3.test.blend │ │ │ │ └── honda_3.test.py │ │ │ ├── four/ │ │ │ │ └── levels/ │ │ │ │ └── deep/ │ │ │ │ └── cars/ │ │ │ │ ├── fixtures/ │ │ │ │ │ └── honda_5.obj │ │ │ │ ├── honda_5.test.blend │ │ │ │ └── honda_5.test.py │ │ │ ├── honda_4.test.blend │ │ │ └── honda_4.test.py │ │ ├── fixtures/ │ │ │ ├── test_01_ll1.obj │ │ │ ├── test_02_no_ll_ll1.obj │ │ │ ├── test_03_ll1_ll1.obj │ │ │ ├── test_04_ll1_ll2.obj │ │ │ ├── test_05_ll1_no_ll_ll2.obj │ │ │ ├── test_06_ll1_no_ll.obj │ │ │ ├── test_1_NotVisibleByItself_Exp.obj │ │ │ ├── test_1_NotVisibleByItself_Exp_anim.obj │ │ │ ├── test_2_VisibleParent_Exp.obj │ │ │ ├── test_2_VisibleParent_Exp_anim.obj │ │ │ ├── test_3_SplitParentVisibleChildren_Exp_anim.obj │ │ │ ├── test_3_VisibleButSplitParent_Exp_anim.obj │ │ │ ├── test_4_NotVisibleButSplitParent_Exp_anim.obj │ │ │ ├── test_4_SplitParentNotVisibleChildren_Exp_anim.obj │ │ │ ├── test_DisabledInViewport.obj │ │ │ ├── test_HiddenInViewport.obj │ │ │ ├── test_conditions.obj │ │ │ ├── test_cube_empty_cube.obj │ │ │ ├── test_custom_anim_prop.obj │ │ │ ├── test_custom_header_props.obj │ │ │ ├── test_custom_prop.obj │ │ │ ├── test_draped.obj │ │ │ ├── test_draw_enabled.obj │ │ │ ├── test_export_in_layers_disabled.obj │ │ │ ├── test_export_in_layers_enabled.obj │ │ │ ├── test_exports_mixed_ll_correctly.obj │ │ │ ├── test_exports_photometric_correctly.obj │ │ │ ├── test_exports_with_photometric_ignored.obj │ │ │ ├── test_float_prec_manip_props_wysiwyg.obj │ │ │ ├── test_float_prec_start_end_height_cmp.obj │ │ │ ├── test_group_instances.obj │ │ │ ├── test_has_global_luminance_6000.obj │ │ │ ├── test_instanced.obj │ │ │ ├── test_instanced_header_empty_cube.obj │ │ │ ├── test_lights.obj │ │ │ ├── test_lod_layer_1.obj │ │ │ ├── test_lod_layer_2.obj │ │ │ ├── test_lod_layer_3.obj │ │ │ ├── test_lod_layer_4.obj │ │ │ ├── test_lod_layer_5.obj │ │ │ ├── test_manipulators.obj │ │ │ ├── test_materials.obj │ │ │ ├── test_optimize.obj │ │ │ ├── test_pass_1_validations_not_applied.obj │ │ │ ├── test_pass_2a_additive_ordered.obj │ │ │ ├── test_pass_3a_selective_ordered.obj │ │ │ ├── test_pass_4a_additive_not_mixed.obj │ │ │ ├── test_pass_4b_selective_not_mixed.obj │ │ │ ├── test_pass_5a_selective_far_near_equal.obj │ │ │ ├── test_pass_6a_selective_1st_near_is_0.obj │ │ │ ├── test_pass_7a_1st_lod_is_1st_command.obj │ │ │ ├── test_passing_magnets.obj │ │ │ ├── test_show_hide_animation.obj │ │ │ ├── test_texture_composition_nm.obj │ │ │ ├── test_texture_composition_nm_spec.obj │ │ │ ├── test_texture_composition_spec.obj │ │ │ ├── test_texture_coords.obj │ │ │ └── texture_composition.obj │ │ ├── float_prop_follows_precision.test.blend │ │ ├── float_prop_follows_precision.test.py │ │ ├── global_luminance.test.blend │ │ ├── global_luminance.test.py │ │ ├── instanced.test.blend │ │ ├── instanced.test.py │ │ ├── instant_export_from_menu.test.blend │ │ ├── instant_export_from_menu.test.py │ │ ├── light_level_photometric.test.blend │ │ ├── light_level_photometric.test.py │ │ ├── light_level_reset.test.blend │ │ ├── light_level_reset.test.py │ │ ├── lights.test.blend │ │ ├── lights.test.py │ │ ├── lod.test.blend │ │ ├── lod.test.py │ │ ├── lod_overrides/ │ │ │ ├── fixtures/ │ │ │ │ ├── test_AllIgnored.obj │ │ │ │ ├── test_ExportableObjectOverride_object_special_1_2_3.obj │ │ │ │ ├── test_IncludeAndIgnore.obj │ │ │ │ ├── test_LooksPastUnconvertedXPlaneObjects.obj │ │ │ │ ├── test_NestedDuplicateOverrides.obj │ │ │ │ ├── test_NoOverridesTakesParents.obj │ │ │ │ ├── test_NonSequentialOverrides.obj │ │ │ │ ├── test_OverridesAppliedToAllChildren.obj │ │ │ │ └── test_OverridesCombined.obj │ │ │ ├── lod_overrides_applied.test.blend │ │ │ └── lod_overrides_applied.test.py │ │ ├── lod_validation.test.blend │ │ ├── lod_validation.test.py │ │ ├── magnets.test.blend │ │ ├── magnets.test.py │ │ ├── manipulators.test.blend │ │ ├── manipulators.test.py │ │ ├── materials.test.blend │ │ ├── materials.test.py │ │ ├── no_material.test.blend │ │ ├── no_material.test.py │ │ ├── passive_resetting.test.blend │ │ ├── passive_resetting.test.py │ │ ├── rain/ │ │ │ ├── bake_wiper_texture.test.blend │ │ │ ├── bake_wiper_texture.test.py │ │ │ ├── bake_wiper_texture_bad_rgb_only.test.blend │ │ │ ├── bake_wiper_texture_bad_rgb_only.test.py │ │ │ ├── fixtures/ │ │ │ │ ├── test_inst_scenery_no_options.obj │ │ │ │ ├── test_missing_paths_no_options.obj │ │ │ │ ├── test_none_enabled_no_options.obj │ │ │ │ ├── test_scenery_no_options.obj │ │ │ │ ├── test_thermal_options.obj │ │ │ │ └── test_wiper_options.obj │ │ │ ├── rain_header_props.test.blend │ │ │ └── rain_header_props.test.py │ │ ├── various.test.blend │ │ └── various.test.py │ ├── lights/ │ │ ├── aim_non_spot_light.test.blend │ │ ├── aim_non_spot_light.test.py │ │ ├── anim_vs_non_anim_vs_is_nested.test.blend │ │ ├── anim_vs_non_anim_vs_is_nested.test.py │ │ ├── automatic_detect/ │ │ │ ├── automatic_ignore_old_lights.test.blend │ │ │ ├── automatic_ignore_old_lights.test.py │ │ │ ├── automatic_is_omni_light.test.blend │ │ │ ├── automatic_is_omni_light.test.py │ │ │ ├── automatic_light_properties.test.blend │ │ │ ├── automatic_light_properties.test.py │ │ │ ├── automatic_parent_and_self_animated.test.blend │ │ │ ├── automatic_parent_and_self_animated.test.py │ │ │ ├── automatic_point_vs_spot.test.blend │ │ │ ├── automatic_point_vs_spot.test.py │ │ │ ├── automatic_special_animation_cases.test.blend │ │ │ ├── automatic_special_animation_cases.test.py │ │ │ ├── automatic_width_recalc.test.blend │ │ │ ├── automatic_width_recalc.test.py │ │ │ └── fixtures/ │ │ │ ├── test_automatic_light_properties.obj │ │ │ ├── test_automatic_special_animation_cases.obj │ │ │ ├── test_automatic_special_animation_dir_mag_calc_cases.obj │ │ │ ├── test_non_omni_lights.obj │ │ │ ├── test_omni_lights.obj │ │ │ ├── test_parent_animated_lights.obj │ │ │ ├── test_self_animated_lights.obj │ │ │ ├── test_spot_params_bb.obj │ │ │ ├── test_spot_params_bb_rotated_90.obj │ │ │ └── test_spot_params_bb_rotated_off_axis.obj │ │ ├── custom_light_rgb_override.test.blend │ │ ├── custom_light_rgb_override.test.py │ │ ├── fixtures/ │ │ │ ├── light_spill_custom/ │ │ │ │ ├── test_light_spill_custom_dref.obj │ │ │ │ ├── test_light_spill_custom_dxyz.obj │ │ │ │ ├── test_light_spill_custom_rgb.obj │ │ │ │ ├── test_light_spill_custom_semi_point.obj │ │ │ │ ├── test_light_spill_custom_semi_spot.obj │ │ │ │ ├── test_light_spill_custom_size.obj │ │ │ │ └── test_light_spill_custom_xyz.obj │ │ │ ├── test_Custom_Spot_RGB_values_disabled.obj │ │ │ ├── test_Custom_Spot_RGB_values_enabled.obj │ │ │ ├── test_aim_non_spot_light.obj │ │ │ ├── test_anim_vs_non_anim_vs_has_parent.obj │ │ │ ├── test_bb_and_sp_both.obj │ │ │ ├── test_bb_omni_param.obj │ │ │ ├── test_dir_and_sp.obj │ │ │ ├── test_named.obj │ │ │ ├── test_point_vs_is_omni_vs_is_optimized.obj │ │ │ ├── test_rotation_delta_autocorrect.obj │ │ │ ├── test_spot_vs_is_omni_vs_is_optimized.obj │ │ │ ├── test_sw_light_callback_used.obj │ │ │ ├── test_unused_param_pass.obj │ │ │ ├── test_v12_lights_have_candela.obj │ │ │ ├── test_v12_lights_have_candela_bb_omni.obj │ │ │ ├── test_v12_lights_have_candela_bb_sp.obj │ │ │ ├── test_v12_lights_have_candela_pm_omni.obj │ │ │ └── test_v12_lights_have_candela_pm_sp.obj │ │ ├── known_vs_unknown_named_vs_param.test.blend │ │ ├── known_vs_unknown_named_vs_param.test.py │ │ ├── light_spill_custom_attributes.test.blend │ │ ├── light_spill_custom_attributes.test.py │ │ ├── light_type_vs_is_omni_vs_is_optimized.test.blend │ │ ├── light_type_vs_is_omni_vs_is_optimized.test.py │ │ ├── omni_dir_param_name_bb_sp_both.test.blend │ │ ├── omni_dir_param_name_bb_sp_both.test.py │ │ ├── param_light_params.test.blend │ │ ├── param_light_params.test.py │ │ ├── rotation_delta_autocorrect.test.blend │ │ ├── rotation_delta_autocorrect.test.py │ │ ├── sw_light_callback_applied.test.blend │ │ ├── sw_light_callback_applied.test.py │ │ ├── v12_lights_cd_export.test.blend │ │ └── v12_lights_cd_export.test.py │ ├── materials/ │ │ ├── blend_glass/ │ │ │ ├── blend_glass.test.blend │ │ │ ├── blend_glass.test.py │ │ │ └── fixtures/ │ │ │ ├── test_air_glass_off_expect_no_dir.obj │ │ │ ├── test_air_glass_on_expect_dir.obj │ │ │ ├── test_ckpt_glass_off_expect_no_dir.obj │ │ │ ├── test_ckpt_glass_on_expect_dir.obj │ │ │ ├── test_panel_glass_off_expect_no_dir.obj │ │ │ └── test_panel_glass_on_expect_dir.obj │ │ ├── fixtures/ │ │ │ ├── TEXTURE_MAP_normal.obj │ │ │ ├── TEXTURE_MAP_normal_gloss.obj │ │ │ ├── TEXTURE_MAP_normal_material_gloss.obj │ │ │ ├── test_AOTC_2Mats_PNL.obj │ │ │ ├── test_COTC_2Mat_Hard.obj │ │ │ ├── test_COTC_2Mat_Manip_SolidCamera.obj │ │ │ ├── test_IST_2Mats_SameSPEC_DifSURF.obj │ │ │ ├── test_IST_2Mats_wDraping.obj │ │ │ ├── test_SSO_2compatibleMats_Draped.obj │ │ │ ├── test_SSO_3compatibleMats.obj │ │ │ └── test_blend_ratio.obj │ │ ├── normal_metalness/ │ │ │ ├── fixtures/ │ │ │ │ ├── draped_spec_scenery/ │ │ │ │ │ ├── test_norm_met_off_one_drap_inst.obj │ │ │ │ │ ├── test_norm_met_off_one_drap_scen.obj │ │ │ │ │ ├── test_norm_met_on_one_drap_inst.obj │ │ │ │ │ ├── test_norm_met_on_one_drap_scen.obj │ │ │ │ │ ├── test_norm_met_on_two_drap_inst.obj │ │ │ │ │ └── test_norm_met_on_two_drap_scen.obj │ │ │ │ ├── norm_met_basic/ │ │ │ │ │ ├── test_D_metal_NON_D_metal.obj │ │ │ │ │ ├── test_D_metal_NON_D_non_metal.obj │ │ │ │ │ ├── test_D_metal_NON_D_none.obj │ │ │ │ │ ├── test_D_non_metal_NON_D_metal.obj │ │ │ │ │ ├── test_D_non_metal_NON_D_non_metal.obj │ │ │ │ │ ├── test_D_non_metal_NON_D_none.obj │ │ │ │ │ ├── test_D_none_NON_D_metal.obj │ │ │ │ │ ├── test_D_none_NON_D_non_metal.obj │ │ │ │ │ └── test_D_none_NON_D_none.obj │ │ │ │ └── norm_met_spec/ │ │ │ │ ├── test_none_1_mat_inst.obj │ │ │ │ ├── test_none_1_mat_scen.obj │ │ │ │ ├── test_none_2_mat_scen.obj │ │ │ │ ├── test_norm_1_mat_inst.obj │ │ │ │ ├── test_norm_1_mat_scen.obj │ │ │ │ ├── test_norm_2_mat_inst.obj │ │ │ │ └── test_norm_2_mat_scen.obj │ │ │ ├── norm_met_basic.test.blend │ │ │ ├── norm_met_basic.test.py │ │ │ ├── norm_met_draped_spec_scenery.test.blend │ │ │ ├── norm_met_draped_spec_scenery.test.py │ │ │ ├── norm_met_spec.test.blend │ │ │ ├── norm_met_spec.test.py │ │ │ ├── norm_met_validations.test.blend │ │ │ └── norm_met_validations.test.py │ │ ├── objects/ │ │ │ ├── AOTC_2Mat_ManipRJECT.test.blend │ │ │ ├── AOTC_2Mat_ManipRJECT.test.py │ │ │ ├── AOTC_2Mats_PNL.test.blend │ │ │ ├── AOTC_2Mats_PNL.test.py │ │ │ ├── AOTC_Draped_RJECT.test.blend │ │ │ ├── AOTC_Draped_RJECT.test.py │ │ │ ├── COTC_2Mat_Draped.test.blend │ │ │ ├── COTC_2Mat_Draped.test.py │ │ │ ├── COTC_2Mat_Hard.test.blend │ │ │ ├── COTC_2Mat_Hard.test.py │ │ │ ├── COTC_2Mat_Manip_SolidCamera.test.blend │ │ │ ├── COTC_2Mat_Manip_SolidCamera.test.py │ │ │ ├── IST_2Mats_SameSPEC_DifSURF.test.blend │ │ │ ├── IST_2Mats_SameSPEC_DifSURF.test.py │ │ │ ├── IST_2Mats_VarSPEC.test.blend │ │ │ ├── IST_2Mats_VarSPEC.test.py │ │ │ ├── IST_2Mats_wDraping.test.blend │ │ │ ├── IST_2Mats_wDraping.test.py │ │ │ ├── SSO_2compatibleMats_Draped.test.blend │ │ │ ├── SSO_2compatibleMats_Draped.test.py │ │ │ ├── SSO_2incompatibleATTRs_Draped.test.blend │ │ │ ├── SSO_2incompatibleATTRs_Draped.test.py │ │ │ ├── SSO_2incompatibleDraped_Mats.test.blend │ │ │ ├── SSO_2incompatibleDraped_Mats.test.py │ │ │ ├── SSO_illegal_usePanel_tex.test.blend │ │ │ ├── SSO_illegal_usePanel_tex.test.py │ │ │ ├── TEXTURE_MAP.test.blend │ │ │ ├── TEXTURE_MAP.test.py │ │ │ ├── blend_ratio.test.blend │ │ │ └── blend_ratio.test.py │ │ └── shadow/ │ │ ├── fixtures/ │ │ │ ├── test_01_all_cast_local_off.obj │ │ │ ├── test_01_all_cast_shadows_off.obj │ │ │ ├── test_02_all_cast_local_on.obj │ │ │ ├── test_02_all_cast_shadows_on.obj │ │ │ ├── test_03_1_cast_shadows_off.obj │ │ │ ├── test_03a_1_cast_local_off.obj │ │ │ ├── test_03b_1_or_more_cast_local_off_on_off.obj │ │ │ ├── test_04_1_or_more_but_not_all_off.obj │ │ │ └── test_05_all_cast_shadows_off_non_scenery.obj │ │ ├── shadow_no_shadow.test.blend │ │ ├── shadow_no_shadow.test.py │ │ ├── shadow_no_shadow_non_scenery_type.test.blend │ │ └── shadow_no_shadow_non_scenery_type.test.py │ ├── monkey/ │ │ ├── fixtures/ │ │ │ └── test_monkey.obj │ │ ├── monkey.test.blend │ │ └── monkey.test.py │ ├── object/ │ │ ├── axis_detent_ranges.test.blend │ │ ├── axis_detent_ranges.test.py │ │ ├── bone_configurations_drag_axis.test.py │ │ ├── bone_configurations_drag_axis_detent.test.py │ │ ├── bone_configurations_drag_rotate.test.py │ │ ├── bone_configurations_drag_rotate_detent.test.py │ │ ├── bone_configurations_drag_rotate_detent_arm.test.py │ │ ├── bone_configurations_drag_rotate_detent_bone.test.py │ │ ├── drag_axis_autodetect.test.blend │ │ ├── drag_axis_autodetect.test.py │ │ ├── drag_axis_w_detents.test.blend │ │ ├── drag_axis_w_detents.test.py │ │ ├── drag_rotate_obj_lib.blend │ │ ├── drag_rotate_start_end_the_same.test.blend │ │ ├── drag_rotate_start_end_the_same.test.py │ │ ├── fixtures/ │ │ │ ├── test_01_2_rot_kf_0_detents_0_manip_kf.obj │ │ │ ├── test_01_known_good_test.obj │ │ │ ├── test_01_mesh_ll_overload_emits.obj │ │ │ ├── test_02_3_rot_kf_0_detents_1_manip_kf.obj │ │ │ ├── test_02_mesh_ll_overload_emits_not_material.obj │ │ │ ├── test_03_4_rot_kf_0_detents_2_manip_kf.obj │ │ │ ├── test_03_mesh_ll_overload_weird_cases.obj │ │ │ ├── test_04_5_rot_kf_3_detents_3_manip_kf.obj │ │ │ ├── test_04_known_good_drag_axis_autodetect.obj │ │ │ ├── test_04_mesh_ll_overload_emits_not_material_nts.obj │ │ │ ├── test_05_6_rot_kf_4_detents_1_pit_4_manip_kf.obj │ │ │ ├── test_07_counter_clockwise_also_allowed.obj │ │ │ ├── test_08_neg_15_15_degree_animation_allowed.obj │ │ │ ├── test_08_no_detents_also_allowed.obj │ │ │ ├── test_08_pit_at_start_and_end.obj │ │ │ ├── test_10_known_good_drag_axis_w_detents.obj │ │ │ ├── test_10_known_good_translation_bone.obj │ │ │ ├── test_11_known_good_rotation_bone.obj │ │ │ ├── test_drag_rotate_start_end_the_same.obj │ │ │ ├── test_override_autodetect_datarefs_drag_axis.obj │ │ │ ├── test_override_autodetect_datarefs_drag_axis_w_detents.obj │ │ │ ├── test_override_autodetect_datarefs_drag_rotate.obj │ │ │ └── test_override_autodetect_datarefs_drag_rotate_dentent.obj │ │ ├── manip_keyframe.test.blend │ │ ├── manip_keyframe.test.py │ │ ├── object_ll_override.test.blend │ │ ├── object_ll_override.test.py │ │ ├── override_autodetect_datarefs.test.blend │ │ ├── override_autodetect_datarefs.test.py │ │ ├── rotation_bone_rules.test.blend │ │ ├── rotation_bone_rules.test.py │ │ ├── translation_bone_rules.test.blend │ │ └── translation_bone_rules.test.py │ ├── particles/ │ │ ├── fixtures/ │ │ │ ├── particle_test.pss │ │ │ ├── test_02_Empty_index_enabled.obj │ │ │ ├── test_03_Empty_index_disabled.obj │ │ │ ├── test_file_pss_and_real.obj │ │ │ ├── test_file_pss_but_not_real.obj │ │ │ ├── test_particle_emitter_animated.obj │ │ │ ├── test_particle_emitter_static.obj │ │ │ └── test_particle_non_colocated_anim.obj │ │ ├── particle_name_and_index.test.blend │ │ ├── particle_name_and_index.test.py │ │ ├── particle_non_colocated_anim.test.blend │ │ ├── particle_non_colocated_anim.test.py │ │ ├── particle_pss_file.test.blend │ │ ├── particle_pss_file.test.py │ │ ├── particle_static_anim.test.blend │ │ └── particle_static_anim.test.py │ ├── template.py │ ├── template.test.blend │ ├── updater/ │ │ ├── blend_mode_blend_glass_update.test.blend │ │ ├── blend_mode_blend_glass_update.test.py │ │ ├── custom_startup/ │ │ │ └── no_xp2b.blend │ │ ├── in_place_update.test.blend │ │ ├── in_place_update.test.py │ │ ├── layers_to_collections.test.blend │ │ ├── layers_to_collections.test.py │ │ ├── move_global_mat_props.test.blend │ │ ├── move_global_mat_props.test.py │ │ ├── part_of_panel_to_cockpit_feature.test.blend │ │ ├── part_of_panel_to_cockpit_feature.test.py │ │ ├── pre_4_0_0_alpha_6.test.blend │ │ ├── pre_4_0_0_alpha_6.test.py │ │ ├── pre_4_1_0_beta_1_regions_changes_panel_mode.test.blend │ │ ├── pre_4_1_0_beta_1_regions_changes_panel_mode.test.py │ │ ├── pre_automatic_default_lights_as_default.test.blend │ │ ├── pre_automatic_default_lights_as_default.test.py │ │ ├── shadow/ │ │ │ ├── fixtures/ │ │ │ │ ├── test_01_aircraft_force_global_shadows.obj │ │ │ │ ├── test_01_aircraft_force_global_shadows_root.obj │ │ │ │ ├── test_01_global_off_layers.obj │ │ │ │ ├── test_01_global_off_root_objects.obj │ │ │ │ ├── test_02_cockpit_force_global_shadows.obj │ │ │ │ ├── test_02_cockpit_force_global_shadows_root.obj │ │ │ │ ├── test_02_global_on_layers.obj │ │ │ │ └── test_02_global_on_root_objects.obj │ │ │ ├── shadow_local_off_non_scenery.test.blend │ │ │ ├── shadow_local_off_non_scenery.test.py │ │ │ ├── update_cast_shadow.test.blend │ │ │ ├── update_cast_shadow.test.py │ │ │ ├── update_cast_shadow_table_output.test.blend │ │ │ └── update_cast_shadow_table_output.test.py │ │ ├── synchronize_version_numbers.test.py │ │ └── updater.test.disabled.py │ ├── utils/ │ │ ├── command_parser.test.py │ │ ├── dataref_parser.test.py │ │ ├── lights_column_name.test.py │ │ ├── lights_parser.test.py │ │ ├── test_commands_txts/ │ │ │ ├── Commands_desc_line_has_trailing_whitespace.txt │ │ │ ├── Commands_empty_file.txt │ │ │ ├── Commands_empty_line.txt │ │ │ ├── Commands_line_starts_with_whitespace.txt │ │ │ ├── Commands_no_desc_line_has_trailing_whitespace.txt │ │ │ └── Commands_no_description_passes.txt │ │ ├── test_datarefs_txts/ │ │ │ ├── DataRefs_empty.txt │ │ │ ├── DataRefs_header_completely_wrong.txt │ │ │ ├── DataRefs_header_file_version_is_one.txt │ │ │ ├── DataRefs_header_xp_version_is_wrong.txt │ │ │ ├── DataRefs_invalid_array_type.txt │ │ │ ├── DataRefs_invalid_array_type_index_wrong.txt │ │ │ ├── DataRefs_invalid_iswritable.txt │ │ │ ├── DataRefs_invalid_type_wrong.txt │ │ │ ├── DataRefs_line_starts_with_whitespace.txt │ │ │ ├── DataRefs_no_blank_second_line.txt │ │ │ └── DataRefs_no_datarefs_in_it.txt │ │ └── test_lights_txts/ │ │ ├── arguments_sorted_well.txt │ │ ├── lights_comments_ignored.txt │ │ └── lights_empty.txt │ ├── xplane_export.test.disabled.py │ └── xplane_types/ │ ├── xplane_bone/ │ │ ├── collect_animations.test.blend │ │ ├── collect_animations.test.py │ │ ├── object_matrices.test.blend │ │ └── object_matrices.test.py │ └── xplane_file/ │ ├── bad_nested_exportable_roots.test.blend │ ├── bad_nested_exportable_roots.test.py │ ├── create_from_layers.test.blend │ ├── create_from_layers.test.py │ ├── create_from_root_objects.test.blend │ ├── create_from_root_objects.test.py │ ├── current_scene_exclusive_collection.test.blend │ ├── current_scene_exclusive_collection.test.py │ ├── fixtures/ │ │ ├── root_object_offsets.test_a.obj │ │ ├── root_object_offsets.test_b.obj │ │ ├── root_object_offsets.test_c.obj │ │ ├── root_object_offsets_animated_a.obj │ │ ├── root_object_offsets_animated_b.obj │ │ ├── root_object_offsets_animated_c.obj │ │ ├── test_ExportableCollection.obj │ │ ├── test_ExportableObject.obj │ │ ├── test_ExportableObjectArmatureCases.obj │ │ ├── test_Exportable_child_out_of_scene_warn_and_ignore.obj │ │ ├── test_Exportable_no_convert_makes_bones.obj │ │ ├── test_Exportable_out_of_collection_no_error.obj │ │ ├── test_current_scene_exclusive_collection.obj │ │ ├── test_export_root_objects_1.obj │ │ ├── test_export_root_objects_2.obj │ │ ├── test_one_of_each_animation_type.obj │ │ ├── test_resource_paths_cases_1_4.obj │ │ ├── test_resource_paths_cases_5_and_10.obj │ │ ├── test_write_static.obj │ │ ├── test_write_trans_anim.obj │ │ └── test_write_transrot_anim.obj │ ├── frame_set_optimization.test.blend │ ├── frame_set_optimization.test.py │ ├── performance_spheres_no_anim.test.blend │ ├── performance_spheres_no_anim.test.disabled.py │ ├── recursive_collection_collects.test.blend │ ├── recursive_collection_collects.test.py │ ├── recursive_collection_edge_cases.test.blend │ ├── recursive_collection_edge_cases.test.py │ ├── resource_path_new_file.test.py │ ├── resource_paths.test.blend │ ├── resource_paths.test.py │ ├── root_object_offsets.test.blend │ ├── root_object_offsets.test.py │ ├── root_object_offsets_animated.test.blend │ ├── root_object_offsets_animated.test.py │ ├── sort_by_weight.test.blend │ ├── sort_by_weight.test.py │ ├── split_parent/ │ │ ├── fixtures/ │ │ │ ├── test_1_LandingGearCollection.obj │ │ │ ├── test_1_WheelCollection.obj │ │ │ ├── test_1_reuse_of_parent.obj │ │ │ ├── test_1_reuse_of_parent_out_of_order.obj │ │ │ ├── test_2_LandingGearExpObject.obj │ │ │ ├── test_2_WheelCollection.obj │ │ │ ├── test_2_reuse_of_parent.obj │ │ │ ├── test_3_ButtonCollection.obj │ │ │ ├── test_4_ExportableCollection.obj │ │ │ ├── test_AAA_animation.obj │ │ │ ├── test_AAA_mesh.obj │ │ │ ├── test_AAn_animation.obj │ │ │ ├── test_AAn_mesh.obj │ │ │ ├── test_AnA_animation.obj │ │ │ ├── test_AnA_mesh.obj │ │ │ ├── test_Ann_animation.obj │ │ │ ├── test_Ann_mesh.obj │ │ │ ├── test_Collection_not_really_animated.obj │ │ │ ├── test_ExpCollWalkToColl.obj │ │ │ ├── test_ExpCollWalkToExpColl.obj │ │ │ ├── test_ExpCollWalkToMasterCollection.obj │ │ │ ├── test_ExpCollWalkToRoot.obj │ │ │ ├── test_ExpCollection_not_really_animated.obj │ │ │ ├── test_HasManip_Exp.obj │ │ │ ├── test_HasVisuals_Exp.obj │ │ │ ├── test_ParentOutOfScene.obj │ │ │ ├── test_SnakeOut_Exp.obj │ │ │ ├── test_nAA_animation.obj │ │ │ ├── test_nAA_mesh.obj │ │ │ ├── test_nAn_animation.obj │ │ │ ├── test_nAn_mesh.obj │ │ │ ├── test_new_branch_index_0.obj │ │ │ ├── test_new_branch_index_1.obj │ │ │ ├── test_new_branch_index_2.obj │ │ │ ├── test_new_branch_index_last.obj │ │ │ ├── test_nnA_animation.obj │ │ │ └── test_nnA_mesh.obj │ │ ├── parent_out_of_collection_find_anim.test.blend │ │ ├── parent_out_of_collection_find_anim.test.py │ │ ├── parent_out_of_collection_index_preserved.test.blend │ │ ├── parent_out_of_collection_index_preserved.test.py │ │ ├── parent_out_of_collection_no_attr_share.test.blend │ │ ├── parent_out_of_collection_no_attr_share.test.py │ │ ├── parent_out_of_collection_not_anim.test.blend │ │ ├── parent_out_of_collection_not_anim.test.py │ │ ├── parent_out_of_collection_snake_out.test.blend │ │ ├── parent_out_of_collection_snake_out.test.py │ │ ├── parent_out_of_collection_will_walk_up.test.blend │ │ ├── parent_out_of_collection_will_walk_up.test.py │ │ ├── parent_out_of_collection_workflows.test.blend │ │ └── parent_out_of_collection_workflows.test.py │ ├── write.test.blend │ └── write.test.py └── tests.py