Copy disabled (too large)
Download .txt
Showing preview only (58,901K chars total). Download the full file to get everything.
Repository: SCSSoftware/BlenderTools
Branch: master
Commit: 34dff5239e0f
Files: 1453
Total size: 55.9 MB
Directory structure:
gitextract_a_wlanqb/
├── .gitattributes
├── .gitignore
├── LICENSE
├── README.md
├── addon/
│ └── io_scs_tools/
│ ├── __init__.py
│ ├── consts.py
│ ├── exp/
│ │ ├── __init__.py
│ │ ├── pia.py
│ │ ├── pic.py
│ │ ├── pim/
│ │ │ ├── bones.py
│ │ │ ├── exporter.py
│ │ │ ├── globall.py
│ │ │ ├── header.py
│ │ │ ├── locator.py
│ │ │ ├── material.py
│ │ │ ├── part.py
│ │ │ ├── piece.py
│ │ │ ├── piece_skin.py
│ │ │ ├── piece_skin_stream.py
│ │ │ └── piece_stream.py
│ │ ├── pim_ef/
│ │ │ ├── bones.py
│ │ │ ├── exporter.py
│ │ │ ├── globall.py
│ │ │ ├── header.py
│ │ │ ├── locator.py
│ │ │ ├── material.py
│ │ │ ├── part.py
│ │ │ ├── piece.py
│ │ │ ├── piece_face.py
│ │ │ ├── piece_skin.py
│ │ │ ├── piece_skin_stream.py
│ │ │ └── piece_stream.py
│ │ ├── pip/
│ │ │ ├── curve.py
│ │ │ ├── curve_bezier.py
│ │ │ ├── exporter.py
│ │ │ ├── globall.py
│ │ │ ├── header.py
│ │ │ ├── intersection.py
│ │ │ ├── map_point.py
│ │ │ ├── node.py
│ │ │ ├── node_stream.py
│ │ │ ├── semaphore.py
│ │ │ ├── sign.py
│ │ │ ├── spawn_point.py
│ │ │ └── trigger_point.py
│ │ ├── pis.py
│ │ ├── pit.py
│ │ ├── pit_ef.py
│ │ ├── pix.py
│ │ ├── tobj.py
│ │ └── transition_structs/
│ │ ├── bones.py
│ │ ├── materials.py
│ │ ├── parts.py
│ │ └── terrain_points.py
│ ├── imp/
│ │ ├── __init__.py
│ │ ├── pia.py
│ │ ├── pic.py
│ │ ├── pim.py
│ │ ├── pim_ef.py
│ │ ├── pip.py
│ │ ├── pis.py
│ │ ├── pit.py
│ │ ├── pix.py
│ │ ├── tobj.py
│ │ └── transition_structs/
│ │ └── terrain_points.py
│ ├── internals/
│ │ ├── callbacks/
│ │ │ ├── lighting_east_lock.py
│ │ │ ├── open_gl.py
│ │ │ └── persistent.py
│ │ ├── connections/
│ │ │ ├── collector.py
│ │ │ ├── core.py
│ │ │ └── wrappers/
│ │ │ └── collection.py
│ │ ├── containers/
│ │ │ ├── config.py
│ │ │ ├── mat.py
│ │ │ ├── parsers/
│ │ │ │ ├── mat.py
│ │ │ │ ├── pix.py
│ │ │ │ ├── sii.py
│ │ │ │ └── tobj.py
│ │ │ ├── pix.py
│ │ │ ├── sii.py
│ │ │ ├── tobj.py
│ │ │ └── writers/
│ │ │ ├── pix.py
│ │ │ └── sii.py
│ │ ├── icons/
│ │ │ └── __init__.py
│ │ ├── inventory.py
│ │ ├── looks/
│ │ │ └── __init__.py
│ │ ├── open_gl/
│ │ │ ├── cache.py
│ │ │ ├── core.py
│ │ │ ├── locators/
│ │ │ │ ├── __init__.py
│ │ │ │ ├── collider.py
│ │ │ │ ├── model.py
│ │ │ │ └── prefab.py
│ │ │ ├── primitive.py
│ │ │ ├── shaders/
│ │ │ │ ├── __init__.py
│ │ │ │ ├── smooth_color_clipped_3d_frag.glsl
│ │ │ │ ├── smooth_color_clipped_3d_vert.glsl
│ │ │ │ ├── smooth_color_stipple_clipped_3d_frag.glsl
│ │ │ │ └── smooth_color_stipple_clipped_3d_vert.glsl
│ │ │ └── storage/
│ │ │ └── terrain_points.py
│ │ ├── persistent/
│ │ │ ├── file_load.py
│ │ │ ├── file_save.py
│ │ │ ├── initialization.py
│ │ │ ├── loop_check.py
│ │ │ ├── open_gl.py
│ │ │ └── shaders_update.py
│ │ ├── preview_models/
│ │ │ ├── __init__.py
│ │ │ └── cache.py
│ │ ├── shader_presets/
│ │ │ ├── __init__.py
│ │ │ ├── cache.py
│ │ │ └── ui_shader_preset_item.py
│ │ ├── shaders/
│ │ │ ├── __init__.py
│ │ │ ├── base.py
│ │ │ ├── eut2/
│ │ │ │ ├── __init__.py
│ │ │ │ ├── building/
│ │ │ │ │ ├── add_env_day.py
│ │ │ │ │ ├── day.py
│ │ │ │ │ └── lvcol_day.py
│ │ │ │ ├── decalshadow/
│ │ │ │ │ └── __init__.py
│ │ │ │ ├── dif/
│ │ │ │ │ └── __init__.py
│ │ │ │ ├── dif_anim/
│ │ │ │ │ ├── __init__.py
│ │ │ │ │ └── anim_blend_factor_ng.py
│ │ │ │ ├── dif_lum/
│ │ │ │ │ └── __init__.py
│ │ │ │ ├── dif_lum_spec/
│ │ │ │ │ └── __init__.py
│ │ │ │ ├── dif_spec/
│ │ │ │ │ └── __init__.py
│ │ │ │ ├── dif_spec_add_env/
│ │ │ │ │ ├── __init__.py
│ │ │ │ │ └── nofresnel.py
│ │ │ │ ├── dif_spec_fade_dif_spec/
│ │ │ │ │ ├── __init__.py
│ │ │ │ │ ├── detail_nmap.py
│ │ │ │ │ └── detail_setup_ng.py
│ │ │ │ ├── dif_spec_mult_dif_spec/
│ │ │ │ │ ├── __init__.py
│ │ │ │ │ └── add_env.py
│ │ │ │ ├── dif_spec_mult_dif_spec_iamod_dif_spec/
│ │ │ │ │ └── __init__.py
│ │ │ │ ├── dif_spec_oclu/
│ │ │ │ │ └── __init__.py
│ │ │ │ ├── dif_spec_oclu_add_env/
│ │ │ │ │ └── __init__.py
│ │ │ │ ├── dif_spec_oclu_weight_add_env/
│ │ │ │ │ └── __init__.py
│ │ │ │ ├── dif_spec_over_dif_opac/
│ │ │ │ │ └── __init__.py
│ │ │ │ ├── dif_spec_weight/
│ │ │ │ │ └── __init__.py
│ │ │ │ ├── dif_spec_weight_add_env/
│ │ │ │ │ └── __init__.py
│ │ │ │ ├── dif_spec_weight_mult2/
│ │ │ │ │ └── __init__.py
│ │ │ │ ├── dif_spec_weight_mult2_weight2/
│ │ │ │ │ └── __init__.py
│ │ │ │ ├── dif_spec_weight_weight_dif_spec_weight/
│ │ │ │ │ └── __init__.py
│ │ │ │ ├── dif_weight_dif/
│ │ │ │ │ └── __init__.py
│ │ │ │ ├── fakeshadow/
│ │ │ │ │ └── __init__.py
│ │ │ │ ├── flare/
│ │ │ │ │ └── __init__.py
│ │ │ │ ├── glass/
│ │ │ │ │ └── __init__.py
│ │ │ │ ├── grass/
│ │ │ │ │ └── __init__.py
│ │ │ │ ├── lamp/
│ │ │ │ │ ├── __init__.py
│ │ │ │ │ └── add_env.py
│ │ │ │ ├── light_tex/
│ │ │ │ │ └── __init__.py
│ │ │ │ ├── lightmap/
│ │ │ │ │ └── night.py
│ │ │ │ ├── mlaaweight/
│ │ │ │ │ └── __init__.py
│ │ │ │ ├── none/
│ │ │ │ │ └── __init__.py
│ │ │ │ ├── parameters.py
│ │ │ │ ├── reflective/
│ │ │ │ │ └── __init__.py
│ │ │ │ ├── retroreflective/
│ │ │ │ │ └── __init__.py
│ │ │ │ ├── shadowmap/
│ │ │ │ │ └── __init__.py
│ │ │ │ ├── shadowonly/
│ │ │ │ │ └── __init__.py
│ │ │ │ ├── sign/
│ │ │ │ │ └── __init__.py
│ │ │ │ ├── sky/
│ │ │ │ │ ├── __init__.py
│ │ │ │ │ ├── texture_types.py
│ │ │ │ │ └── uv_rescale_ng.py
│ │ │ │ ├── std_node_groups/
│ │ │ │ │ ├── add_env_ng.py
│ │ │ │ │ ├── alpha_remap_ng.py
│ │ │ │ │ ├── compose_lighting_ng.py
│ │ │ │ │ ├── fresnel_legacy_ng.py
│ │ │ │ │ ├── fresnel_schlick_ng.py
│ │ │ │ │ ├── lampmask_mixer_ng.py
│ │ │ │ │ ├── lighting_evaluator_ng.py
│ │ │ │ │ ├── linear_to_srgb_ng.py
│ │ │ │ │ ├── mult2_mix_ng.py
│ │ │ │ │ ├── refl_normal_ng.py
│ │ │ │ │ ├── scs_uvs_combine_ng.py
│ │ │ │ │ ├── scs_uvs_separate_ng.py
│ │ │ │ │ └── vcolor_input_ng.py
│ │ │ │ ├── std_passes/
│ │ │ │ │ ├── add_env.py
│ │ │ │ │ └── lum.py
│ │ │ │ ├── truckpaint/
│ │ │ │ │ ├── __init__.py
│ │ │ │ │ ├── airbrush.py
│ │ │ │ │ └── colormask.py
│ │ │ │ ├── unlit_tex/
│ │ │ │ │ └── __init__.py
│ │ │ │ ├── unlit_vcol_tex/
│ │ │ │ │ └── __init__.py
│ │ │ │ ├── water/
│ │ │ │ │ ├── __init__.py
│ │ │ │ │ ├── mix_factor_ng.py
│ │ │ │ │ └── water_stream_ng.py
│ │ │ │ └── window/
│ │ │ │ ├── lit.py
│ │ │ │ ├── window_final_uv_ng.py
│ │ │ │ ├── window_offset_factor_ng.py
│ │ │ │ └── window_uv_offset_ng.py
│ │ │ ├── flavors/
│ │ │ │ ├── alpha_test.py
│ │ │ │ ├── asafew.py
│ │ │ │ ├── awhite.py
│ │ │ │ ├── blend_add.py
│ │ │ │ ├── blend_mult.py
│ │ │ │ ├── blend_over.py
│ │ │ │ ├── fadesheet/
│ │ │ │ │ ├── __init__.py
│ │ │ │ │ └── fadesheet_compute_ng.py
│ │ │ │ ├── flipsheet/
│ │ │ │ │ ├── __init__.py
│ │ │ │ │ └── flipsheet_compute_ng.py
│ │ │ │ ├── nmap/
│ │ │ │ │ ├── __init__.py
│ │ │ │ │ ├── dds16_ng.py
│ │ │ │ │ └── scale_ng.py
│ │ │ │ ├── paint.py
│ │ │ │ ├── sky_back.py
│ │ │ │ ├── sky_stars.py
│ │ │ │ ├── tg0.py
│ │ │ │ └── tg1.py
│ │ │ ├── shader.py
│ │ │ └── std_node_groups/
│ │ │ ├── alpha_test_ng.py
│ │ │ ├── animsheet_frame_idx_to_col_row_ng.py
│ │ │ ├── animsheet_frame_ng.py
│ │ │ ├── animsheet_loop_frame_ng.py
│ │ │ ├── animsheet_xfade_ng.py
│ │ │ ├── blend_add_ng.py
│ │ │ ├── blend_mult_ng.py
│ │ │ └── output_shader_ng.py
│ │ └── structure.py
│ ├── operators/
│ │ ├── __init__.py
│ │ ├── bases/
│ │ │ ├── export.py
│ │ │ ├── selection.py
│ │ │ └── view.py
│ │ ├── material.py
│ │ ├── mesh.py
│ │ ├── object.py
│ │ ├── scene.py
│ │ ├── wm.py
│ │ └── world.py
│ ├── properties/
│ │ ├── __init__.py
│ │ ├── action.py
│ │ ├── addon_preferences.py
│ │ ├── dynamic/
│ │ │ ├── __init__.py
│ │ │ ├── object.py
│ │ │ └── scene.py
│ │ ├── material.py
│ │ ├── mesh.py
│ │ ├── object.py
│ │ ├── scene.py
│ │ └── workspace.py
│ ├── shader_presets.txt
│ ├── ui/
│ │ ├── __init__.py
│ │ ├── banners/
│ │ │ ├── .scs_bt_banner.tga
│ │ │ └── .scs_bt_banner_with_ctrls.tga
│ │ ├── material.py
│ │ ├── mesh.py
│ │ ├── object.py
│ │ ├── output.py
│ │ ├── shared.py
│ │ ├── tool_shelf.py
│ │ ├── workspace.py
│ │ └── world.py
│ ├── unused/
│ │ ├── import_pmg.py
│ │ ├── import_pmx.py
│ │ └── pim.py
│ └── utils/
│ ├── __init__.py
│ ├── animation.py
│ ├── collection.py
│ ├── convert.py
│ ├── curve.py
│ ├── info.py
│ ├── material.py
│ ├── math.py
│ ├── mesh.py
│ ├── name.py
│ ├── object.py
│ ├── path.py
│ ├── printout.py
│ ├── property.py
│ └── view3d.py
├── data/
│ ├── sample_base/
│ │ ├── def/
│ │ │ ├── cargo/
│ │ │ │ └── milk/
│ │ │ │ └── food_cistern_sample.sii
│ │ │ ├── climate/
│ │ │ │ └── default/
│ │ │ │ ├── bad.sii
│ │ │ │ └── nice.sii
│ │ │ ├── vehicle/
│ │ │ │ ├── f_rim/
│ │ │ │ │ └── steel_sample.sii
│ │ │ │ ├── f_tire/
│ │ │ │ │ ├── 1_sample.sii
│ │ │ │ │ ├── 2_sample.sii
│ │ │ │ │ └── 3_sample.sii
│ │ │ │ ├── f_wheel/
│ │ │ │ │ └── steel_sample.sii
│ │ │ │ ├── r_rim/
│ │ │ │ │ └── steel_sample.sii
│ │ │ │ ├── r_tire/
│ │ │ │ │ ├── 1_sample.sii
│ │ │ │ │ ├── 2_sample.sii
│ │ │ │ │ └── 3_sample.sii
│ │ │ │ ├── r_wheel/
│ │ │ │ │ └── steel_sample.sii
│ │ │ │ ├── traffic_storage_semi_trailer.sample.sii
│ │ │ │ ├── trailer/
│ │ │ │ │ ├── food_cistern_sample/
│ │ │ │ │ │ └── chassis.sii
│ │ │ │ │ ├── food_cistern_sample.sii
│ │ │ │ │ └── food_cistern_traffic_sample.sii
│ │ │ │ ├── trailer_storage.sample.sii
│ │ │ │ └── truck/
│ │ │ │ └── scania.r/
│ │ │ │ └── accessory/
│ │ │ │ └── f_grill/
│ │ │ │ └── shape_sample.sii
│ │ │ └── world/
│ │ │ ├── model.sample.sii
│ │ │ ├── mover.sample.sii
│ │ │ ├── semaphore_profile.sii
│ │ │ ├── sign.sii
│ │ │ └── traffic_rules.sii
│ │ ├── material/
│ │ │ ├── environment/
│ │ │ │ ├── building_reflection/
│ │ │ │ │ ├── building_ref.tga
│ │ │ │ │ └── building_ref.tobj
│ │ │ │ ├── generic_s.tga
│ │ │ │ └── vehicle_reflection.tobj
│ │ │ └── road/
│ │ │ ├── kerb_tile.tga
│ │ │ ├── kerb_tile.tobj
│ │ │ ├── rough_asphalt.tga
│ │ │ ├── rough_asphalt.tobj
│ │ │ ├── small_block_pavement.tga
│ │ │ ├── small_block_pavement.tobj
│ │ │ ├── small_starblock_pavement.tga
│ │ │ └── small_starblock_pavement.tobj
│ │ ├── model/
│ │ │ ├── building/
│ │ │ │ └── administration/
│ │ │ │ ├── corner_1.tga
│ │ │ │ ├── corner_1.tobj
│ │ │ │ ├── corner_2.tga
│ │ │ │ ├── corner_2.tobj
│ │ │ │ ├── corner_3.tga
│ │ │ │ ├── corner_3.tobj
│ │ │ │ ├── corner_sample.pim
│ │ │ │ └── corner_sample.pit
│ │ │ ├── mover/
│ │ │ │ ├── characters/
│ │ │ │ │ ├── animations/
│ │ │ │ │ │ └── man/
│ │ │ │ │ │ └── walk/
│ │ │ │ │ │ └── walk_sample.pia
│ │ │ │ │ ├── models/
│ │ │ │ │ │ └── generic/
│ │ │ │ │ │ ├── m_vanilla_ice_sample.pim
│ │ │ │ │ │ └── m_vanilla_ice_sample.pit
│ │ │ │ │ ├── skeletons/
│ │ │ │ │ │ └── man_sample.pis
│ │ │ │ │ └── textures/
│ │ │ │ │ ├── body/
│ │ │ │ │ │ ├── man_body_02_lum.tga
│ │ │ │ │ │ ├── man_body_02_lum.tobj
│ │ │ │ │ │ ├── man_body_02_no.tga
│ │ │ │ │ │ ├── man_body_02_no.tobj
│ │ │ │ │ │ ├── wear_str_01.tga
│ │ │ │ │ │ └── wear_str_01.tobj
│ │ │ │ │ └── heads/
│ │ │ │ │ ├── man_vanila_ice.tga
│ │ │ │ │ ├── man_vanila_ice.tobj
│ │ │ │ │ ├── man_vanila_ice_no.tga
│ │ │ │ │ └── man_vanila_ice_no.tobj
│ │ │ │ ├── wind_powerplant.tga
│ │ │ │ ├── wind_powerplant.tobj
│ │ │ │ ├── wind_powerplant_sample.pim
│ │ │ │ ├── wind_powerplant_sample.pis
│ │ │ │ ├── wind_powerplant_sample.pit
│ │ │ │ └── wind_pp_sample.pia
│ │ │ └── village_far/
│ │ │ └── village_cz/
│ │ │ ├── village_cz.tga
│ │ │ ├── village_cz.tobj
│ │ │ ├── village_cz_4_sample.pim
│ │ │ └── village_cz_4_sample.pit
│ │ ├── unit/
│ │ │ └── hookup/
│ │ │ ├── billboard_manager.sii
│ │ │ ├── cutscene_instance.sii
│ │ │ ├── fire2.sii
│ │ │ ├── foto_01.sii
│ │ │ ├── foto_02.sii
│ │ │ ├── foto_03.sii
│ │ │ ├── garage_door.sii
│ │ │ ├── gas_lamp_small.sii
│ │ │ ├── lamp.sii
│ │ │ ├── lamp_scale_2.sii
│ │ │ ├── lamp_small.sii
│ │ │ ├── lamp_verysmall.sii
│ │ │ ├── lamp_verysmall_2.sii
│ │ │ ├── license_plate.sii
│ │ │ ├── license_plate_rear.sii
│ │ │ ├── lights/
│ │ │ │ ├── 2_shaped_lamp_light.sii
│ │ │ │ ├── 2_shaped_lamp_lux_light.sii
│ │ │ │ ├── aberdeen_bridge_light.sii
│ │ │ │ ├── ambient_no_source.sii
│ │ │ │ ├── amsterdam_port_omni_light.sii
│ │ │ │ ├── aquaducts_netherlands_light.sii
│ │ │ │ ├── arlberg_tunnel_light.sii
│ │ │ │ ├── basement_omni_light.sii
│ │ │ │ ├── block_of_flats_omni_light.sii
│ │ │ │ ├── bus_noflare.sii
│ │ │ │ ├── cholupice_tunnel_light.sii
│ │ │ │ ├── city_tunnel_light.sii
│ │ │ │ ├── delaer_int_big.sii
│ │ │ │ ├── exp_garage_door_light.sii
│ │ │ │ ├── exp_garage_interior_omni_light.sii
│ │ │ │ ├── ferry_interior_backlight_north.sii
│ │ │ │ ├── ferry_interior_north.sii
│ │ │ │ ├── garage_door_light.sii
│ │ │ │ ├── garage_interior_omni_light.sii
│ │ │ │ ├── garage_lamp_light.sii
│ │ │ │ ├── gas_ceiling_light.sii
│ │ │ │ ├── gas_light.sii
│ │ │ │ ├── gas_spot_light.sii
│ │ │ │ ├── grimsby_bridge_light.sii
│ │ │ │ ├── heigh10m_nar_light.sii
│ │ │ │ ├── heigh10m_small_light.sii
│ │ │ │ ├── heigh13m_light.sii
│ │ │ │ ├── heigh15m_lamp_light.sii
│ │ │ │ ├── heigh15m_no_flare.sii
│ │ │ │ ├── heigh16m_big_light.sii
│ │ │ │ ├── heigh17m_lamp_light.sii
│ │ │ │ ├── heigh17m_no_flare.sii
│ │ │ │ ├── heigh18m_no_flare.sii
│ │ │ │ ├── heigh19m_cut17m_lamp_no_flare.sii
│ │ │ │ ├── heigh19m_lamp_light.sii
│ │ │ │ ├── heigh21m_no_flare.sii
│ │ │ │ ├── heigh22m_lamp_light.sii
│ │ │ │ ├── heigh25m_no_flare.sii
│ │ │ │ ├── heigh28m_no_flare.sii
│ │ │ │ ├── heigh3m_no_flare.sii
│ │ │ │ ├── heigh6m_no_flare.sii
│ │ │ │ ├── heigh6m_small_light.sii
│ │ │ │ ├── heigh9m_no_flare.sii
│ │ │ │ ├── heigh9m_small_light.sii
│ │ │ │ ├── highway_tunnel_light.sii
│ │ │ │ ├── highway_uk_tunnel_light.sii
│ │ │ │ ├── hotel_const_omni_light.sii
│ │ │ │ ├── hotel_restaurant_omni_light.sii
│ │ │ │ ├── hw2_tunnel_light.sii
│ │ │ │ ├── hw2_tunnel_rounded_light.sii
│ │ │ │ ├── koln_bridge_light.sii
│ │ │ │ ├── lamp_light_20m.sii
│ │ │ │ ├── lamp_nl_light.sii
│ │ │ │ ├── lamp_platform.sii
│ │ │ │ ├── lamp_poland_2hape_light.sii
│ │ │ │ ├── lochkov_single.sii
│ │ │ │ ├── lochkov_tshaped.sii
│ │ │ │ ├── lochkov_tunnel_light.sii
│ │ │ │ ├── mall_omni_light.sii
│ │ │ │ ├── netherl_molo_2_light.sii
│ │ │ │ ├── omni.sii
│ │ │ │ ├── parked_omni_light.sii
│ │ │ │ ├── poor_garage_interior_o_light.sii
│ │ │ │ ├── port_lamp_light.sii
│ │ │ │ ├── quarry_small_light.sii
│ │ │ │ ├── sculpture_omni.sii
│ │ │ │ ├── sellplan_lamp.sii
│ │ │ │ ├── sellplan_lamp_single.sii
│ │ │ │ ├── ship_light.sii
│ │ │ │ ├── sikorskiego_bridge_light.sii
│ │ │ │ ├── small_bl_of_flats_light.sii
│ │ │ │ ├── small_road_tunnel_light.sii
│ │ │ │ ├── small_tunnel_scan.sii
│ │ │ │ ├── stadium_omni_light.sii
│ │ │ │ ├── tollgate_lamp_light.sii
│ │ │ │ ├── train_light.sii
│ │ │ │ ├── truck_dealer_omni_light.sii
│ │ │ │ ├── tunnel_light_3lane_hw1.sii
│ │ │ │ ├── university_omni_light.sii
│ │ │ │ └── warehouse_greu_lamp_light.sii
│ │ │ ├── model_particle_dirt.sii
│ │ │ ├── model_particle_fog1.sii
│ │ │ ├── model_particle_fog2.sii
│ │ │ ├── no_weather_10x36.sii
│ │ │ ├── no_weather_13x11.sii
│ │ │ ├── no_weather_13x19.sii
│ │ │ ├── no_weather_13x50.sii
│ │ │ ├── no_weather_14x90.sii
│ │ │ ├── no_weather_15x34.sii
│ │ │ ├── no_weather_15x43.sii
│ │ │ ├── no_weather_15x75.sii
│ │ │ ├── no_weather_16x110.sii
│ │ │ ├── no_weather_18x30.sii
│ │ │ ├── no_weather_19x55.sii
│ │ │ ├── no_weather_20x21.sii
│ │ │ ├── no_weather_20x25.sii
│ │ │ ├── no_weather_20x30.sii
│ │ │ ├── no_weather_20x40.sii
│ │ │ ├── no_weather_25x47.sii
│ │ │ ├── no_weather_28x11.sii
│ │ │ ├── no_weather_28x13.sii
│ │ │ ├── no_weather_28x32.sii
│ │ │ ├── no_weather_30x150.sii
│ │ │ ├── no_weather_33x52.sii
│ │ │ ├── no_weather_36x70.sii
│ │ │ ├── no_weather_40x24.sii
│ │ │ ├── no_weather_40x30.sii
│ │ │ ├── no_weather_40x40.sii
│ │ │ ├── no_weather_40x70.sii
│ │ │ ├── no_weather_60x36.sii
│ │ │ ├── no_weather_60x64.sii
│ │ │ ├── no_weather_7x18.sii
│ │ │ ├── no_weather_9x90.sii
│ │ │ ├── orange_blinking.sii
│ │ │ ├── parked_car.sii
│ │ │ ├── pedestrians.sii
│ │ │ ├── red.sii
│ │ │ ├── red_blinking.sii
│ │ │ ├── ship_flare.sii
│ │ │ ├── sign_area.sii
│ │ │ ├── sign_city1_b0.sii
│ │ │ ├── sign_city1_b1.sii
│ │ │ ├── sign_city1_b2.sii
│ │ │ ├── sign_city1_small_b0.sii
│ │ │ ├── sign_city1_small_b1.sii
│ │ │ ├── sign_city1_small_b2.sii
│ │ │ ├── sign_city2_b0.sii
│ │ │ ├── sign_city2_b1.sii
│ │ │ ├── sign_city2_b2.sii
│ │ │ ├── sign_city2_small_b0.sii
│ │ │ ├── sign_city2_small_b1.sii
│ │ │ ├── sign_city2_small_b2.sii
│ │ │ ├── sign_flare.sii
│ │ │ ├── sign_road_0.sii
│ │ │ ├── sign_road_1.sii
│ │ │ ├── sign_road_2.sii
│ │ │ ├── sign_road_small_0.sii
│ │ │ ├── sign_road_small_1.sii
│ │ │ ├── sign_road_small_2.sii
│ │ │ ├── speed_camera.sii
│ │ │ ├── tollgate.sii
│ │ │ ├── tr_light_flares.sii
│ │ │ ├── trailer_beacon.sii
│ │ │ ├── tube_smoke.sii
│ │ │ ├── tube_smoke_slow.sii
│ │ │ ├── vehicle_aux_lights.sii
│ │ │ ├── vehicle_beacon.sii
│ │ │ ├── vehicle_bluel.sii
│ │ │ ├── vehicle_brakel.sii
│ │ │ ├── vehicle_halogenl.sii
│ │ │ ├── vehicle_headl.sii
│ │ │ ├── vehicle_high_beam.sii
│ │ │ ├── vehicle_lblinkerl.sii
│ │ │ ├── vehicle_orange_led_l.sii
│ │ │ ├── vehicle_orangel.sii
│ │ │ ├── vehicle_parkl.sii
│ │ │ ├── vehicle_rblinkerl.sii
│ │ │ ├── vehicle_rearl.sii
│ │ │ ├── vehicle_redl.sii
│ │ │ ├── vehicle_reversel.sii
│ │ │ ├── vehicle_white_led_l.sii
│ │ │ ├── vehicle_whitel.sii
│ │ │ ├── wheel_particle_dirt.sii
│ │ │ ├── wheel_particle_rain.sii
│ │ │ ├── wheel_particle_skid.sii
│ │ │ ├── wheel_particle_snow.sii
│ │ │ ├── wheel_particles.sii
│ │ │ └── yell_garage_light.sii
│ │ └── vehicle/
│ │ ├── trailer_eu/
│ │ │ ├── company/
│ │ │ │ ├── empty.tga
│ │ │ │ ├── empty.tobj
│ │ │ │ ├── euroacres.tga
│ │ │ │ ├── euroacres.tobj
│ │ │ │ ├── fcp.tga
│ │ │ │ ├── fcp.tobj
│ │ │ │ ├── trameri.tga
│ │ │ │ └── trameri.tobj
│ │ │ └── food_cistern/
│ │ │ ├── lamp_mask.tga
│ │ │ ├── lamp_mask.tobj
│ │ │ ├── lod_01_sample.pim
│ │ │ ├── lod_01_sample.pit
│ │ │ ├── lod_02_sample.pim
│ │ │ ├── lod_02_sample.pit
│ │ │ ├── plain.tga
│ │ │ ├── plain.tobj
│ │ │ ├── shadow.tga
│ │ │ ├── shadow.tobj
│ │ │ ├── trailer_sample.pic
│ │ │ ├── trailer_sample.pim
│ │ │ ├── trailer_sample.pit
│ │ │ ├── ui_shadow_sample.pim
│ │ │ └── ui_shadow_sample.pit
│ │ ├── truck/
│ │ │ └── upgrade/
│ │ │ ├── frontgrill/
│ │ │ │ └── scania_rcab_2009/
│ │ │ │ ├── frontgrill_09_sample.pim
│ │ │ │ └── frontgrill_09_sample.pit
│ │ │ ├── rim/
│ │ │ │ ├── front_steel_sample.pim
│ │ │ │ ├── front_steel_sample.pit
│ │ │ │ ├── rear_steel_sample.pim
│ │ │ │ └── rear_steel_sample.pit
│ │ │ ├── share/
│ │ │ │ ├── fence_wires.tga
│ │ │ │ ├── fence_wires.tobj
│ │ │ │ ├── upg_chrome.tga
│ │ │ │ ├── upg_chrome.tobj
│ │ │ │ ├── upg_shared.tga
│ │ │ │ └── upg_shared.tobj
│ │ │ ├── tire/
│ │ │ │ ├── front_1_sample.pim
│ │ │ │ ├── front_1_sample.pit
│ │ │ │ ├── rear_1_sample.pim
│ │ │ │ └── rear_1_sample.pit
│ │ │ └── wheel/
│ │ │ ├── front_1.tga
│ │ │ ├── front_1.tobj
│ │ │ ├── front_3.tga
│ │ │ ├── front_3.tobj
│ │ │ ├── front_5.tga
│ │ │ └── front_5.tobj
│ │ └── wheel/
│ │ └── steel/
│ │ ├── front_new.tga
│ │ ├── front_new.tobj
│ │ ├── front_sample.pim
│ │ ├── front_sample.pit
│ │ ├── rear_new_2.tga
│ │ ├── rear_new_2.tobj
│ │ ├── rear_sample.pim
│ │ ├── rear_sample.pit
│ │ ├── rear_trailer_new.tga
│ │ └── rear_trailer_new.tobj
│ ├── sample_prefab_base/
│ │ ├── def/
│ │ │ └── world/
│ │ │ ├── prefab.sample.sii
│ │ │ ├── semaphore_model.sample.sii
│ │ │ ├── semaphore_model.sii
│ │ │ ├── semaphore_profile.sample.sii
│ │ │ ├── semaphore_profile.sii
│ │ │ ├── sign.dlc_north.sii
│ │ │ ├── sign.sii
│ │ │ ├── traffic_rules.sii
│ │ │ └── trigger_action.sii
│ │ ├── material/
│ │ │ ├── environment/
│ │ │ │ └── building_reflection/
│ │ │ │ ├── building_ref.tobj
│ │ │ │ ├── building_ref1.tga
│ │ │ │ ├── building_ref2.tga
│ │ │ │ ├── building_ref3.tga
│ │ │ │ ├── building_ref4.tga
│ │ │ │ ├── building_ref5.tga
│ │ │ │ └── building_ref6.tga
│ │ │ ├── road/
│ │ │ │ ├── asphalt.mat
│ │ │ │ ├── asphalt.tga
│ │ │ │ ├── asphalt.tobj
│ │ │ │ ├── dark_c2.mat
│ │ │ │ ├── dark_c2.tga
│ │ │ │ ├── dark_c2.tobj
│ │ │ │ ├── lines.mat
│ │ │ │ ├── lines.tga
│ │ │ │ ├── lines.tobj
│ │ │ │ ├── road_template/
│ │ │ │ │ └── sc/
│ │ │ │ │ ├── asphalt_def_dk.tga
│ │ │ │ │ ├── asphalt_def_dk.tobj
│ │ │ │ │ ├── asphalt_def_swe.tga
│ │ │ │ │ ├── asphalt_def_swe.tobj
│ │ │ │ │ ├── asphalt_gray_dk.tga
│ │ │ │ │ ├── asphalt_gray_dk.tobj
│ │ │ │ │ ├── asphalt_light_gray.tga
│ │ │ │ │ ├── asphalt_light_gray.tobj
│ │ │ │ │ ├── asphalt_new_sc.tga
│ │ │ │ │ ├── asphalt_new_sc.tobj
│ │ │ │ │ ├── decal_def_dk.mat
│ │ │ │ │ ├── decal_def_dk.tga
│ │ │ │ │ ├── decal_def_dk.tobj
│ │ │ │ │ ├── dirt_def_dk.mat
│ │ │ │ │ ├── dirt_def_dk.tga
│ │ │ │ │ ├── dirt_def_dk.tobj
│ │ │ │ │ ├── dirt_def_swe.mat
│ │ │ │ │ ├── dirt_def_swe.tga
│ │ │ │ │ ├── dirt_def_swe.tobj
│ │ │ │ │ ├── dirt_gray_dk.mat
│ │ │ │ │ ├── dirt_gray_dk.tga
│ │ │ │ │ ├── dirt_gray_dk.tobj
│ │ │ │ │ ├── dirt_light_gray.mat
│ │ │ │ │ ├── dirt_light_gray.tga
│ │ │ │ │ ├── dirt_light_gray.tobj
│ │ │ │ │ ├── dirt_new_sc.mat
│ │ │ │ │ ├── dirt_new_sc.tga
│ │ │ │ │ ├── dirt_new_sc.tobj
│ │ │ │ │ ├── shoulder_01.mat
│ │ │ │ │ ├── shoulder_01.tga
│ │ │ │ │ ├── shoulder_01.tobj
│ │ │ │ │ ├── ter_trans_placeholder.mat
│ │ │ │ │ ├── ter_trans_placeholder.tga
│ │ │ │ │ └── ter_trans_placeholder.tobj
│ │ │ │ ├── rough_asphalt.mat
│ │ │ │ ├── rough_asphalt.tga
│ │ │ │ └── rough_asphalt.tobj
│ │ │ ├── special/
│ │ │ │ ├── cargo_01.dds
│ │ │ │ ├── cargo_01.tobj
│ │ │ │ ├── containers_gs_01.dds
│ │ │ │ ├── containers_gs_01.tobj
│ │ │ │ ├── containers_over_01.dds
│ │ │ │ ├── containers_over_01.tobj
│ │ │ │ ├── decal_ground_01.dds
│ │ │ │ ├── decal_ground_01.tobj
│ │ │ │ ├── decal_light_01.dds
│ │ │ │ ├── decal_light_01.tobj
│ │ │ │ ├── decal_typo_01.dds
│ │ │ │ ├── decal_typo_01.tobj
│ │ │ │ ├── doors_00.dds
│ │ │ │ ├── doors_00.tobj
│ │ │ │ ├── electro_00.dds
│ │ │ │ ├── electro_00.tobj
│ │ │ │ ├── glass_building_01.dds
│ │ │ │ ├── glass_building_01.tobj
│ │ │ │ ├── lights_01.dds
│ │ │ │ ├── lights_01.tobj
│ │ │ │ ├── lines_eu_01.dds
│ │ │ │ ├── lines_eu_01.tobj
│ │ │ │ ├── vegetation_city_01.dds
│ │ │ │ ├── vegetation_city_01.tobj
│ │ │ │ ├── window_frames_01.dds
│ │ │ │ ├── window_frames_01.tobj
│ │ │ │ ├── window_interior_01.dds
│ │ │ │ └── window_interior_01.tobj
│ │ │ ├── terrain/
│ │ │ │ ├── asphalt_tiles_eu_01.dds
│ │ │ │ ├── asphalt_tiles_eu_01.mat
│ │ │ │ ├── asphalt_tiles_eu_01.tobj
│ │ │ │ ├── dirt_2_512.dds
│ │ │ │ ├── dirt_2_512.mat
│ │ │ │ ├── dirt_2_512.tobj
│ │ │ │ ├── dirt_3_512.dds
│ │ │ │ ├── dirt_3_512.mat
│ │ │ │ ├── dirt_3_512.tobj
│ │ │ │ ├── grass_city_main_sc.dds
│ │ │ │ ├── grass_city_main_sc.mat
│ │ │ │ ├── grass_city_main_sc.tobj
│ │ │ │ ├── grass_dusty_main.dds
│ │ │ │ ├── grass_dusty_main.mat
│ │ │ │ ├── grass_dusty_main.tobj
│ │ │ │ ├── grass_ger_main.dds
│ │ │ │ ├── grass_ger_main.mat
│ │ │ │ ├── grass_ger_main.tobj
│ │ │ │ ├── grass_ger_x_semidry_main.dds
│ │ │ │ ├── grass_ger_x_semidry_main.mat
│ │ │ │ ├── grass_ger_x_semidry_main.tobj
│ │ │ │ ├── grass_green_main.dds
│ │ │ │ ├── grass_green_main.mat
│ │ │ │ ├── grass_green_main.tobj
│ │ │ │ ├── grass_light_green_main.dds
│ │ │ │ ├── grass_light_green_main.mat
│ │ │ │ └── grass_light_green_main.tobj
│ │ │ └── tiled/
│ │ │ ├── asphalt_tiles_eu_01.tobj
│ │ │ ├── bricks_gs_01.dds
│ │ │ ├── bricks_gs_01.tobj
│ │ │ ├── bricks_over_01.dds
│ │ │ ├── bricks_over_01.tobj
│ │ │ ├── concrete_gs_01.dds
│ │ │ ├── concrete_gs_01.tobj
│ │ │ ├── concrete_over_01.dds
│ │ │ ├── concrete_over_01.tobj
│ │ │ ├── decal_building_01.dds
│ │ │ ├── decal_building_01.tobj
│ │ │ ├── iamod_building_01.dds
│ │ │ ├── iamod_building_01.tobj
│ │ │ ├── metal_alpha_01.dds
│ │ │ ├── metal_alpha_01.tobj
│ │ │ ├── metal_fences_01.dds
│ │ │ ├── metal_fences_01.tobj
│ │ │ ├── metal_gs_01.dds
│ │ │ ├── metal_gs_01.tobj
│ │ │ ├── metal_over_01.dds
│ │ │ ├── metal_over_01.tobj
│ │ │ ├── metal_plates_gs_01.dds
│ │ │ ├── metal_plates_gs_01.tobj
│ │ │ ├── metal_plates_gs_02.dds
│ │ │ ├── metal_plates_gs_02.tobj
│ │ │ ├── metal_plates_over_02.dds
│ │ │ ├── metal_plates_over_02.tobj
│ │ │ ├── plaster_gs_01.dds
│ │ │ ├── plaster_gs_01.tobj
│ │ │ ├── plaster_over_01.dds
│ │ │ ├── plaster_over_01.tobj
│ │ │ ├── sidewalk_scan_01.dds
│ │ │ ├── sidewalk_scan_01.tobj
│ │ │ ├── stripes_01.dds
│ │ │ ├── stripes_01.tobj
│ │ │ ├── wood_gs_01.dds
│ │ │ ├── wood_gs_01.tobj
│ │ │ ├── wood_over_01.dds
│ │ │ └── wood_over_01.tobj
│ │ ├── prefab/
│ │ │ ├── company/
│ │ │ │ ├── seafood_company_sample.pim
│ │ │ │ ├── seafood_company_sample.pip
│ │ │ │ └── seafood_company_sample.pit
│ │ │ ├── cross/
│ │ │ │ ├── road2_x_road1_sample.pim
│ │ │ │ ├── road2_x_road1_sample.pip
│ │ │ │ └── road2_x_road1_sample.pit
│ │ │ ├── cross_temp/
│ │ │ │ └── sample/
│ │ │ │ ├── r1_x_r1_y_tmpl.pim
│ │ │ │ ├── r1_x_r1_y_tmpl.pip
│ │ │ │ └── r1_x_r1_y_tmpl.pit
│ │ │ ├── gas/
│ │ │ │ ├── gas_small_road_sample.pim
│ │ │ │ ├── gas_small_road_sample.pip
│ │ │ │ └── gas_small_road_sample.pit
│ │ │ └── tollgate/
│ │ │ └── tollgate_sample/
│ │ │ ├── france.tga
│ │ │ ├── france.tobj
│ │ │ ├── italy.tga
│ │ │ ├── italy.tobj
│ │ │ ├── kanal.tga
│ │ │ ├── kanal.tobj
│ │ │ ├── road_decal_001.tga
│ │ │ ├── road_decal_001.tobj
│ │ │ ├── t_small_dwn.pia
│ │ │ ├── t_small_up.pia
│ │ │ ├── toll_small_blue.dds
│ │ │ ├── toll_small_blue.tobj
│ │ │ ├── toll_small_red.dds
│ │ │ ├── toll_small_red.tobj
│ │ │ ├── toll_small_yellow.dds
│ │ │ ├── toll_small_yellow.tobj
│ │ │ ├── tollgate_small.pim
│ │ │ ├── tollgate_small.pip
│ │ │ ├── tollgate_small.pit
│ │ │ ├── tollgate_small_anim.pic
│ │ │ ├── tollgate_small_anim.pim
│ │ │ ├── tollgate_small_anim.pis
│ │ │ ├── tollgate_small_anim.pit
│ │ │ ├── warehouse_orange_fence.tga
│ │ │ └── warehouse_orange_fence.tobj
│ │ └── unit/
│ │ └── hookup/
│ │ ├── billboard_manager.sii
│ │ ├── cutscene_instance.sii
│ │ ├── fire2.sii
│ │ ├── foto_01.sii
│ │ ├── foto_02.sii
│ │ ├── foto_03.sii
│ │ ├── garage_door.sii
│ │ ├── gas_lamp_small.sii
│ │ ├── lamp.sii
│ │ ├── lamp_scale_2.sii
│ │ ├── lamp_small.sii
│ │ ├── lamp_verysmall.sii
│ │ ├── lamp_verysmall_2.sii
│ │ ├── license_plate.sii
│ │ ├── license_plate_rear.sii
│ │ ├── lights/
│ │ │ ├── 2_shaped_lamp_light.sii
│ │ │ ├── 2_shaped_lamp_lux_light.sii
│ │ │ ├── aberdeen_bridge_light.sii
│ │ │ ├── ambient_no_source.sii
│ │ │ ├── amsterdam_port_omni_light.sii
│ │ │ ├── aquaducts_netherlands_light.sii
│ │ │ ├── arlberg_tunnel_light.sii
│ │ │ ├── basement_omni_light.sii
│ │ │ ├── block_of_flats_omni_light.sii
│ │ │ ├── bus_noflare.sii
│ │ │ ├── cholupice_tunnel_light.sii
│ │ │ ├── city_tunnel_light.sii
│ │ │ ├── delaer_int_big.sii
│ │ │ ├── exp_garage_door_light.sii
│ │ │ ├── exp_garage_interior_omni_light.sii
│ │ │ ├── ferry_interior_backlight_north.sii
│ │ │ ├── ferry_interior_north.sii
│ │ │ ├── garage_door_light.sii
│ │ │ ├── garage_interior_omni_light.sii
│ │ │ ├── garage_lamp_light.sii
│ │ │ ├── gas_ceiling_light.sii
│ │ │ ├── gas_light.sii
│ │ │ ├── gas_spot_light.sii
│ │ │ ├── grimsby_bridge_light.sii
│ │ │ ├── heigh10m_nar_light.sii
│ │ │ ├── heigh10m_small_light.sii
│ │ │ ├── heigh13m_light.sii
│ │ │ ├── heigh15m_lamp_light.sii
│ │ │ ├── heigh15m_no_flare.sii
│ │ │ ├── heigh16m_big_light.sii
│ │ │ ├── heigh17m_lamp_light.sii
│ │ │ ├── heigh17m_no_flare.sii
│ │ │ ├── heigh18m_no_flare.sii
│ │ │ ├── heigh19m_cut17m_lamp_no_flare.sii
│ │ │ ├── heigh19m_lamp_light.sii
│ │ │ ├── heigh21m_no_flare.sii
│ │ │ ├── heigh22m_lamp_light.sii
│ │ │ ├── heigh25m_no_flare.sii
│ │ │ ├── heigh28m_no_flare.sii
│ │ │ ├── heigh3m_no_flare.sii
│ │ │ ├── heigh6m_no_flare.sii
│ │ │ ├── heigh6m_small_light.sii
│ │ │ ├── heigh9m_no_flare.sii
│ │ │ ├── heigh9m_small_light.sii
│ │ │ ├── highway_tunnel_light.sii
│ │ │ ├── highway_uk_tunnel_light.sii
│ │ │ ├── hotel_const_omni_light.sii
│ │ │ ├── hotel_restaurant_omni_light.sii
│ │ │ ├── hw2_tunnel_light.sii
│ │ │ ├── hw2_tunnel_rounded_light.sii
│ │ │ ├── koln_bridge_light.sii
│ │ │ ├── lamp_light_20m.sii
│ │ │ ├── lamp_nl_light.sii
│ │ │ ├── lamp_platform.sii
│ │ │ ├── lamp_poland_2hape_light.sii
│ │ │ ├── lochkov_single.sii
│ │ │ ├── lochkov_tshaped.sii
│ │ │ ├── lochkov_tunnel_light.sii
│ │ │ ├── mall_omni_light.sii
│ │ │ ├── netherl_molo_2_light.sii
│ │ │ ├── omni.sii
│ │ │ ├── parked_omni_light.sii
│ │ │ ├── poor_garage_interior_o_light.sii
│ │ │ ├── port_lamp_light.sii
│ │ │ ├── quarry_small_light.sii
│ │ │ ├── sculpture_omni.sii
│ │ │ ├── sellplan_lamp.sii
│ │ │ ├── sellplan_lamp_single.sii
│ │ │ ├── ship_light.sii
│ │ │ ├── sikorskiego_bridge_light.sii
│ │ │ ├── small_bl_of_flats_light.sii
│ │ │ ├── small_road_tunnel_light.sii
│ │ │ ├── small_tunnel_scan.sii
│ │ │ ├── stadium_omni_light.sii
│ │ │ ├── tollgate_lamp_light.sii
│ │ │ ├── train_light.sii
│ │ │ ├── truck_dealer_omni_light.sii
│ │ │ ├── tunnel_light_3lane_hw1.sii
│ │ │ ├── university_omni_light.sii
│ │ │ └── warehouse_greu_lamp_light.sii
│ │ ├── model_particle_dirt.sii
│ │ ├── model_particle_fog1.sii
│ │ ├── model_particle_fog2.sii
│ │ ├── no_weather_10x36.sii
│ │ ├── no_weather_13x11.sii
│ │ ├── no_weather_13x19.sii
│ │ ├── no_weather_13x50.sii
│ │ ├── no_weather_14x90.sii
│ │ ├── no_weather_15x34.sii
│ │ ├── no_weather_15x43.sii
│ │ ├── no_weather_15x75.sii
│ │ ├── no_weather_16x110.sii
│ │ ├── no_weather_18x30.sii
│ │ ├── no_weather_19x55.sii
│ │ ├── no_weather_20x21.sii
│ │ ├── no_weather_20x25.sii
│ │ ├── no_weather_20x30.sii
│ │ ├── no_weather_20x40.sii
│ │ ├── no_weather_25x47.sii
│ │ ├── no_weather_28x11.sii
│ │ ├── no_weather_28x13.sii
│ │ ├── no_weather_28x32.sii
│ │ ├── no_weather_30x150.sii
│ │ ├── no_weather_33x52.sii
│ │ ├── no_weather_36x70.sii
│ │ ├── no_weather_40x24.sii
│ │ ├── no_weather_40x30.sii
│ │ ├── no_weather_40x40.sii
│ │ ├── no_weather_40x70.sii
│ │ ├── no_weather_60x36.sii
│ │ ├── no_weather_60x64.sii
│ │ ├── no_weather_7x18.sii
│ │ ├── no_weather_9x90.sii
│ │ ├── orange_blinking.sii
│ │ ├── parked_car.sii
│ │ ├── pedestrians.sii
│ │ ├── red.sii
│ │ ├── red_blinking.sii
│ │ ├── ship_flare.sii
│ │ ├── sign_area.sii
│ │ ├── sign_city1_b0.sii
│ │ ├── sign_city1_b1.sii
│ │ ├── sign_city1_b2.sii
│ │ ├── sign_city1_small_b0.sii
│ │ ├── sign_city1_small_b1.sii
│ │ ├── sign_city1_small_b2.sii
│ │ ├── sign_city2_b0.sii
│ │ ├── sign_city2_b1.sii
│ │ ├── sign_city2_b2.sii
│ │ ├── sign_city2_small_b0.sii
│ │ ├── sign_city2_small_b1.sii
│ │ ├── sign_city2_small_b2.sii
│ │ ├── sign_flare.sii
│ │ ├── sign_road_0.sii
│ │ ├── sign_road_1.sii
│ │ ├── sign_road_2.sii
│ │ ├── sign_road_small_0.sii
│ │ ├── sign_road_small_1.sii
│ │ ├── sign_road_small_2.sii
│ │ ├── speed_camera.sii
│ │ ├── tollgate.sii
│ │ ├── tr_light_flares.sii
│ │ ├── trailer_beacon.sii
│ │ ├── tube_smoke.sii
│ │ ├── tube_smoke_slow.sii
│ │ ├── vehicle_aux_lights.sii
│ │ ├── vehicle_beacon.sii
│ │ ├── vehicle_bluel.sii
│ │ ├── vehicle_brakel.sii
│ │ ├── vehicle_halogenl.sii
│ │ ├── vehicle_headl.sii
│ │ ├── vehicle_high_beam.sii
│ │ ├── vehicle_lblinkerl.sii
│ │ ├── vehicle_orange_led_l.sii
│ │ ├── vehicle_orangel.sii
│ │ ├── vehicle_parkl.sii
│ │ ├── vehicle_rblinkerl.sii
│ │ ├── vehicle_rearl.sii
│ │ ├── vehicle_redl.sii
│ │ ├── vehicle_reversel.sii
│ │ ├── vehicle_white_led_l.sii
│ │ ├── vehicle_whitel.sii
│ │ ├── wheel_particle_dirt.sii
│ │ ├── wheel_particle_rain.sii
│ │ ├── wheel_particle_skid.sii
│ │ ├── wheel_particle_snow.sii
│ │ ├── wheel_particles.sii
│ │ └── yell_garage_light.sii
│ └── sample_truck_base/
│ ├── def/
│ │ └── vehicle/
│ │ ├── truck/
│ │ │ └── man.tgx.sample/
│ │ │ ├── accessory/
│ │ │ │ ├── b_grill/
│ │ │ │ │ └── shape1.sii
│ │ │ │ ├── beacon/
│ │ │ │ │ └── shape1.sii
│ │ │ │ ├── codrv_plate/
│ │ │ │ │ └── plate.sii
│ │ │ │ ├── curtain_f/
│ │ │ │ │ └── curtain_f.dlc_toys.sii
│ │ │ │ ├── doorhndl/
│ │ │ │ │ └── shape1.sii
│ │ │ │ ├── doorstep/
│ │ │ │ │ └── shape1.sii
│ │ │ │ ├── drv_plate/
│ │ │ │ │ └── plate.sii
│ │ │ │ ├── exhaust_l/
│ │ │ │ │ └── shape1.sii
│ │ │ │ ├── exhaust_r/
│ │ │ │ │ └── shape1.sii
│ │ │ │ ├── f_grill/
│ │ │ │ │ └── shape2.sii
│ │ │ │ ├── f_mirror/
│ │ │ │ │ └── shape2.sii
│ │ │ │ ├── mirror/
│ │ │ │ │ └── shape1.sii
│ │ │ │ ├── r_grill/
│ │ │ │ │ └── shape1_c.sii
│ │ │ │ ├── s_mirror/
│ │ │ │ │ └── shape1.sii
│ │ │ │ ├── set_dashbrd/
│ │ │ │ │ └── set1.dlc_toys.sii
│ │ │ │ ├── set_glass/
│ │ │ │ │ └── set1.dlc_toys.sii
│ │ │ │ ├── set_lglass/
│ │ │ │ │ └── gps.dlc_toys.sii
│ │ │ │ ├── sideskirt/
│ │ │ │ │ └── shape1.sii
│ │ │ │ ├── sunshld/
│ │ │ │ │ └── shape1_c.sii
│ │ │ │ ├── toybig/
│ │ │ │ │ └── coolbox.dlc_toys.sii
│ │ │ │ ├── toyhang/
│ │ │ │ │ └── ball_cue.dlc_toys.sii
│ │ │ │ ├── toyseat/
│ │ │ │ │ └── sportbag.dlc_toys.sii
│ │ │ │ └── toystand/
│ │ │ │ └── cap.dlc_toys.sii
│ │ │ ├── badge/
│ │ │ │ └── 18320.sii
│ │ │ ├── cabin/
│ │ │ │ └── xl_cab.sii
│ │ │ ├── chassis/
│ │ │ │ ├── 4x2.sii
│ │ │ │ └── 6x2_4_midlift.sii
│ │ │ ├── chs_badges/
│ │ │ │ ├── chs_badges_18.sii
│ │ │ │ └── chs_badges_26.sii
│ │ │ ├── data.sii
│ │ │ ├── engine/
│ │ │ │ └── d2066_235.sii
│ │ │ ├── head_light/
│ │ │ │ └── standard.sii
│ │ │ ├── interior/
│ │ │ │ ├── animations.sui
│ │ │ │ ├── animations_uk.sui
│ │ │ │ ├── dashboard_color.sui
│ │ │ │ ├── exclusive_low.sii
│ │ │ │ ├── exclusive_uk_low.sii
│ │ │ │ ├── seat.sui
│ │ │ │ ├── seat_uk.sui
│ │ │ │ ├── standard_low.sii
│ │ │ │ └── standard_uk_low.sii
│ │ │ ├── paint_job/
│ │ │ │ ├── color0.sii
│ │ │ │ ├── color0m.sii
│ │ │ │ └── style2_c.sii
│ │ │ ├── sound/
│ │ │ │ ├── exterior.sii
│ │ │ │ └── interior.sii
│ │ │ └── transmission/
│ │ │ ├── 12_speed.sii
│ │ │ └── 12_speed_ret.sii
│ │ ├── truck_dealer/
│ │ │ └── man/
│ │ │ └── man_0.sii
│ │ ├── truck_dealer_uk/
│ │ │ └── man/
│ │ │ └── man_0.sii
│ │ ├── truck_desktop/
│ │ │ └── man_sample.sii
│ │ └── truck_desktop_uk/
│ │ └── man_sample.sii
│ ├── material/
│ │ ├── environment/
│ │ │ ├── building_reflection/
│ │ │ │ ├── building_ref.tga
│ │ │ │ └── building_ref.tobj
│ │ │ ├── generic_b.tga
│ │ │ ├── generic_reflection.tobj
│ │ │ ├── generic_s.tga
│ │ │ ├── generic_t.tga
│ │ │ ├── interior_reflection.tobj
│ │ │ └── vehicle_reflection.tobj
│ │ └── ui/
│ │ └── accessory/
│ │ └── man_sample.mat
│ ├── unit/
│ │ └── hookup/
│ │ ├── billboard_manager.sii
│ │ ├── cutscene_instance.sii
│ │ ├── fire2.sii
│ │ ├── foto_01.sii
│ │ ├── foto_02.sii
│ │ ├── foto_03.sii
│ │ ├── garage_door.sii
│ │ ├── gas_lamp_small.sii
│ │ ├── lamp.sii
│ │ ├── lamp_scale_2.sii
│ │ ├── lamp_small.sii
│ │ ├── lamp_verysmall.sii
│ │ ├── lamp_verysmall_2.sii
│ │ ├── license_plate.sii
│ │ ├── license_plate_rear.sii
│ │ ├── lights/
│ │ │ ├── 2_shaped_lamp_light.sii
│ │ │ ├── 2_shaped_lamp_lux_light.sii
│ │ │ ├── aberdeen_bridge_light.sii
│ │ │ ├── ambient_no_source.sii
│ │ │ ├── amsterdam_port_omni_light.sii
│ │ │ ├── aquaducts_netherlands_light.sii
│ │ │ ├── arlberg_tunnel_light.sii
│ │ │ ├── basement_omni_light.sii
│ │ │ ├── block_of_flats_omni_light.sii
│ │ │ ├── bus_noflare.sii
│ │ │ ├── cholupice_tunnel_light.sii
│ │ │ ├── city_tunnel_light.sii
│ │ │ ├── delaer_int_big.sii
│ │ │ ├── exp_garage_door_light.sii
│ │ │ ├── exp_garage_interior_omni_light.sii
│ │ │ ├── ferry_interior_backlight_north.sii
│ │ │ ├── ferry_interior_north.sii
│ │ │ ├── garage_door_light.sii
│ │ │ ├── garage_interior_omni_light.sii
│ │ │ ├── garage_lamp_light.sii
│ │ │ ├── gas_ceiling_light.sii
│ │ │ ├── gas_light.sii
│ │ │ ├── gas_spot_light.sii
│ │ │ ├── grimsby_bridge_light.sii
│ │ │ ├── heigh10m_nar_light.sii
│ │ │ ├── heigh10m_small_light.sii
│ │ │ ├── heigh13m_light.sii
│ │ │ ├── heigh15m_lamp_light.sii
│ │ │ ├── heigh15m_no_flare.sii
│ │ │ ├── heigh16m_big_light.sii
│ │ │ ├── heigh17m_lamp_light.sii
│ │ │ ├── heigh17m_no_flare.sii
│ │ │ ├── heigh18m_no_flare.sii
│ │ │ ├── heigh19m_cut17m_lamp_no_flare.sii
│ │ │ ├── heigh19m_lamp_light.sii
│ │ │ ├── heigh21m_no_flare.sii
│ │ │ ├── heigh22m_lamp_light.sii
│ │ │ ├── heigh25m_no_flare.sii
│ │ │ ├── heigh28m_no_flare.sii
│ │ │ ├── heigh3m_no_flare.sii
│ │ │ ├── heigh6m_no_flare.sii
│ │ │ ├── heigh6m_small_light.sii
│ │ │ ├── heigh9m_no_flare.sii
│ │ │ ├── heigh9m_small_light.sii
│ │ │ ├── highway_tunnel_light.sii
│ │ │ ├── highway_uk_tunnel_light.sii
│ │ │ ├── hotel_const_omni_light.sii
│ │ │ ├── hotel_restaurant_omni_light.sii
│ │ │ ├── hw2_tunnel_light.sii
│ │ │ ├── hw2_tunnel_rounded_light.sii
│ │ │ ├── koln_bridge_light.sii
│ │ │ ├── lamp_light_20m.sii
│ │ │ ├── lamp_nl_light.sii
│ │ │ ├── lamp_platform.sii
│ │ │ ├── lamp_poland_2hape_light.sii
│ │ │ ├── lochkov_single.sii
│ │ │ ├── lochkov_tshaped.sii
│ │ │ ├── lochkov_tunnel_light.sii
│ │ │ ├── mall_omni_light.sii
│ │ │ ├── netherl_molo_2_light.sii
│ │ │ ├── omni.sii
│ │ │ ├── parked_omni_light.sii
│ │ │ ├── poor_garage_interior_o_light.sii
│ │ │ ├── port_lamp_light.sii
│ │ │ ├── quarry_small_light.sii
│ │ │ ├── sculpture_omni.sii
│ │ │ ├── sellplan_lamp.sii
│ │ │ ├── sellplan_lamp_single.sii
│ │ │ ├── ship_light.sii
│ │ │ ├── sikorskiego_bridge_light.sii
│ │ │ ├── small_bl_of_flats_light.sii
│ │ │ ├── small_road_tunnel_light.sii
│ │ │ ├── small_tunnel_scan.sii
│ │ │ ├── stadium_omni_light.sii
│ │ │ ├── tollgate_lamp_light.sii
│ │ │ ├── train_light.sii
│ │ │ ├── truck_dealer_omni_light.sii
│ │ │ ├── tunnel_light_3lane_hw1.sii
│ │ │ ├── university_omni_light.sii
│ │ │ └── warehouse_greu_lamp_light.sii
│ │ ├── model_particle_dirt.sii
│ │ ├── model_particle_fog1.sii
│ │ ├── model_particle_fog2.sii
│ │ ├── no_weather_10x36.sii
│ │ ├── no_weather_13x11.sii
│ │ ├── no_weather_13x19.sii
│ │ ├── no_weather_13x50.sii
│ │ ├── no_weather_14x90.sii
│ │ ├── no_weather_15x34.sii
│ │ ├── no_weather_15x43.sii
│ │ ├── no_weather_15x75.sii
│ │ ├── no_weather_16x110.sii
│ │ ├── no_weather_18x30.sii
│ │ ├── no_weather_19x55.sii
│ │ ├── no_weather_20x21.sii
│ │ ├── no_weather_20x25.sii
│ │ ├── no_weather_20x30.sii
│ │ ├── no_weather_20x40.sii
│ │ ├── no_weather_25x47.sii
│ │ ├── no_weather_28x11.sii
│ │ ├── no_weather_28x13.sii
│ │ ├── no_weather_28x32.sii
│ │ ├── no_weather_30x150.sii
│ │ ├── no_weather_33x52.sii
│ │ ├── no_weather_36x70.sii
│ │ ├── no_weather_40x24.sii
│ │ ├── no_weather_40x30.sii
│ │ ├── no_weather_40x40.sii
│ │ ├── no_weather_40x70.sii
│ │ ├── no_weather_60x36.sii
│ │ ├── no_weather_60x64.sii
│ │ ├── no_weather_7x18.sii
│ │ ├── no_weather_9x90.sii
│ │ ├── orange_blinking.sii
│ │ ├── parked_car.sii
│ │ ├── pedestrians.sii
│ │ ├── red.sii
│ │ ├── red_blinking.sii
│ │ ├── ship_flare.sii
│ │ ├── sign_area.sii
│ │ ├── sign_city1_b0.sii
│ │ ├── sign_city1_b1.sii
│ │ ├── sign_city1_b2.sii
│ │ ├── sign_city1_small_b0.sii
│ │ ├── sign_city1_small_b1.sii
│ │ ├── sign_city1_small_b2.sii
│ │ ├── sign_city2_b0.sii
│ │ ├── sign_city2_b1.sii
│ │ ├── sign_city2_b2.sii
│ │ ├── sign_city2_small_b0.sii
│ │ ├── sign_city2_small_b1.sii
│ │ ├── sign_city2_small_b2.sii
│ │ ├── sign_flare.sii
│ │ ├── sign_road_0.sii
│ │ ├── sign_road_1.sii
│ │ ├── sign_road_2.sii
│ │ ├── sign_road_small_0.sii
│ │ ├── sign_road_small_1.sii
│ │ ├── sign_road_small_2.sii
│ │ ├── speed_camera.sii
│ │ ├── tollgate.sii
│ │ ├── tr_light_flares.sii
│ │ ├── trailer_beacon.sii
│ │ ├── tube_smoke.sii
│ │ ├── tube_smoke_slow.sii
│ │ ├── vehicle_aux_lights.sii
│ │ ├── vehicle_beacon.sii
│ │ ├── vehicle_bluel.sii
│ │ ├── vehicle_brakel.sii
│ │ ├── vehicle_halogenl.sii
│ │ ├── vehicle_headl.sii
│ │ ├── vehicle_high_beam.sii
│ │ ├── vehicle_lblinkerl.sii
│ │ ├── vehicle_orange_led_l.sii
│ │ ├── vehicle_orangel.sii
│ │ ├── vehicle_parkl.sii
│ │ ├── vehicle_rblinkerl.sii
│ │ ├── vehicle_rearl.sii
│ │ ├── vehicle_redl.sii
│ │ ├── vehicle_reversel.sii
│ │ ├── vehicle_white_led_l.sii
│ │ ├── vehicle_whitel.sii
│ │ ├── wheel_particle_dirt.sii
│ │ ├── wheel_particle_rain.sii
│ │ ├── wheel_particle_skid.sii
│ │ ├── wheel_particle_snow.sii
│ │ ├── wheel_particles.sii
│ │ └── yell_garage_light.sii
│ └── vehicle/
│ └── truck/
│ ├── man_tgx_sample/
│ │ ├── color.tga
│ │ ├── color.tobj
│ │ ├── interior/
│ │ │ ├── anim.pim
│ │ │ ├── anim.pis
│ │ │ ├── anim.pit
│ │ │ ├── blinker_l.pia
│ │ │ ├── blinker_r.pia
│ │ │ ├── brushed_metal.tga
│ │ │ ├── brushed_metal.tobj
│ │ │ ├── carpet_dark.tga
│ │ │ ├── carpet_dark.tobj
│ │ │ ├── cl_light.pia
│ │ │ ├── cl_light_s.pia
│ │ │ ├── dashboard.tga
│ │ │ ├── dashboard.tobj
│ │ │ ├── f_light.pia
│ │ │ ├── f_light_s.pia
│ │ │ ├── fabric_001.tga
│ │ │ ├── fabric_001.tobj
│ │ │ ├── fabric_002.tga
│ │ │ ├── fabric_002.tobj
│ │ │ ├── fabric_brown.tga
│ │ │ ├── fabric_brown.tobj
│ │ │ ├── fabric_dark.tga
│ │ │ ├── fabric_dark.tobj
│ │ │ ├── fabric_gray.tga
│ │ │ ├── fabric_gray.tobj
│ │ │ ├── fuel.pia
│ │ │ ├── fuel_s.pia
│ │ │ ├── leather_gray.tga
│ │ │ ├── leather_gray.tobj
│ │ │ ├── light.tga
│ │ │ ├── light.tobj
│ │ │ ├── mesh.tga
│ │ │ ├── mesh.tobj
│ │ │ ├── model.pic
│ │ │ ├── model.pim
│ │ │ ├── model.pit
│ │ │ ├── oil_s.pia
│ │ │ ├── parking_s.pia
│ │ │ ├── plastic_black.tga
│ │ │ ├── plastic_black.tobj
│ │ │ ├── plastic_dark_bolts.tga
│ │ │ ├── plastic_dark_bolts.tobj
│ │ │ ├── plastic_dark_bolts2.tga
│ │ │ ├── plastic_dark_bolts2.tobj
│ │ │ ├── plastic_gray.tga
│ │ │ ├── plastic_gray.tobj
│ │ │ ├── plastic_gray_pattern.tga
│ │ │ ├── plastic_gray_pattern.tobj
│ │ │ ├── plastic_leather.tga
│ │ │ ├── plastic_leather.tobj
│ │ │ ├── plastic_pattern.tga
│ │ │ ├── plastic_pattern.tobj
│ │ │ ├── psi.pia
│ │ │ ├── psi_s.pia
│ │ │ ├── retarder_st.pia
│ │ │ ├── rpm.pia
│ │ │ ├── rubber.tga
│ │ │ ├── rubber.tobj
│ │ │ ├── rubber_pattern.tga
│ │ │ ├── rubber_pattern.tobj
│ │ │ ├── s_wheel.pia
│ │ │ ├── speed.pia
│ │ │ ├── swheel_01.tga
│ │ │ ├── swheel_01.tobj
│ │ │ ├── turn_st.pia
│ │ │ ├── uk/
│ │ │ │ ├── anim.pim
│ │ │ │ ├── anim.pis
│ │ │ │ ├── anim.pit
│ │ │ │ ├── blinker_l.pia
│ │ │ │ ├── blinker_r.pia
│ │ │ │ ├── cl_light.pia
│ │ │ │ ├── cl_light_s.pia
│ │ │ │ ├── dashboard.tga
│ │ │ │ ├── dashboard.tobj
│ │ │ │ ├── f_light.pia
│ │ │ │ ├── f_light_s.pia
│ │ │ │ ├── fuel.pia
│ │ │ │ ├── fuel_s.pia
│ │ │ │ ├── model.pic
│ │ │ │ ├── model.pim
│ │ │ │ ├── model.pit
│ │ │ │ ├── oil_s.pia
│ │ │ │ ├── parking_s.pia
│ │ │ │ ├── psi.pia
│ │ │ │ ├── psi_s.pia
│ │ │ │ ├── retarder_st.pia
│ │ │ │ ├── rpm.pia
│ │ │ │ ├── s_wheel.pia
│ │ │ │ ├── speed.pia
│ │ │ │ ├── turn_st.pia
│ │ │ │ ├── water.pia
│ │ │ │ ├── water_s.pia
│ │ │ │ ├── wiper_st.pia
│ │ │ │ └── wipers.pia
│ │ │ ├── water.pia
│ │ │ ├── water_s.pia
│ │ │ ├── wiper_st.pia
│ │ │ └── wipers.pia
│ │ ├── lightmask.tga
│ │ ├── lightmask.tobj
│ │ ├── shadow_4x2.tga
│ │ ├── shadow_4x2.tobj
│ │ ├── shadow_6x2.tga
│ │ ├── shadow_6x2.tobj
│ │ ├── truck.pic
│ │ ├── truck.pim
│ │ ├── truck.pit
│ │ ├── ui_shadow_4x2.pim
│ │ ├── ui_shadow_4x2.pit
│ │ ├── ui_shadow_6x2.pim
│ │ ├── ui_shadow_6x2.pit
│ │ ├── wipers.pia
│ │ ├── wipers.pim
│ │ ├── wipers.pis
│ │ ├── wipers.pit
│ │ ├── wipers_uk.pia
│ │ ├── wipers_uk.pim
│ │ ├── wipers_uk.pis
│ │ └── wipers_uk.pit
│ ├── share/
│ │ ├── dashboard.tga
│ │ ├── dashboard.tobj
│ │ ├── glass.tga
│ │ ├── glass.tobj
│ │ ├── glass_ex.tga
│ │ ├── glass_ex.tobj
│ │ ├── gps.tga
│ │ └── gps.tobj
│ └── upgrade/
│ ├── ext_interior/
│ │ └── man_tgx_sample/
│ │ ├── stock.pim
│ │ ├── stock.pit
│ │ ├── stock_c.tga
│ │ ├── stock_c.tobj
│ │ ├── stock_exclusive_c.tga
│ │ └── stock_exclusive_c.tobj
│ └── paintjob/
│ ├── empty.tga
│ └── empty.tobj
└── test/
└── sikuli/
├── README.md
├── config/
│ ├── META-INF/
│ │ └── MANIFEST.MF
│ ├── README.md
│ ├── install_configurator.sh
│ ├── scs_bt_config.ini
│ ├── scs_bt_configurator/
│ │ ├── __init__.py
│ │ └── scs_bt_configurator.py
│ └── scs_bt_configurator.jar
├── installation/
│ └── README.md
└── tests/
├── README.md
└── unit/
├── 001_reset_blender.sikuli/
│ ├── 001_reset_blender.py
│ └── startup.blend
├── generic/
│ ├── 01_unparent_parent.sikuli/
│ │ ├── 01_unparent_parent.py
│ │ └── startup.blend
│ └── run_tests.sh
├── geometry/
│ ├── common/
│ │ ├── 01_view_only_operators.sikuli/
│ │ │ ├── 01_view_only_operators.py
│ │ │ └── all_objects.blend
│ │ ├── 03_select_operators.sikuli/
│ │ │ ├── 03_select_operators.py
│ │ │ └── all_objects.blend
│ │ └── run_tests.sh
│ └── run_tests.sh
├── import-export/
│ ├── 01_cube_flat.sikuli/
│ │ ├── 01_cube_flat.py
│ │ └── Default_Scene_with_Cube.blend
│ ├── 02_mats_and_triangles.sikuli/
│ │ ├── 02_mats_and_triangles.py
│ │ └── 2_Triangles_2_Materials.blend
│ ├── 03_ico_sphere_2_materials.sikuli/
│ │ ├── 03_ico_sphere_2_materials.py
│ │ └── 3_Ico_Sphere_2_Materials.blend
│ ├── 04_locators_colliders.sikuli/
│ │ ├── 04_locators_colliders.html
│ │ ├── 04_locators_colliders.py
│ │ └── 4_locators_collision.blend
│ ├── 05_locators_models.sikuli/
│ │ ├── 05_locators_models.html
│ │ ├── 05_locators_models.py
│ │ └── 5_locators_model.blend
│ ├── 06_locators_prefabs.sikuli/
│ │ ├── 06_locators_prefabs.html
│ │ ├── 06_locators_prefabs.py
│ │ └── 6_locators_prefab.blend
│ ├── 07_export_with_preview.sikuli/
│ │ ├── 07_export_with_preview.py
│ │ └── startup.blend
│ ├── 08_locators_colliders_2.sikuli/
│ │ ├── 08_locators_colliders_2.py
│ │ └── 8_locators_collision_rotated.blend
│ ├── 09_looks.sikuli/
│ │ ├── 09_looks.py
│ │ └── looks.blend
│ ├── 10_cube_smooth.sikuli/
│ │ ├── 10_cube_smooth.py
│ │ └── Default_Scene_with_Cube.blend
│ ├── 11_cube_custom_normals.sikuli/
│ │ ├── 11_cube_custom_normals.py
│ │ └── Default_Scene_with_Cube.blend
│ ├── 12_animated_cube.sikuli/
│ │ ├── 12_animated_cube.py
│ │ ├── Default_Scene_with_Cube.blend
│ │ └── Default_Scene_with_Cube.blend1
│ └── run_tests.sh
├── locators/
│ ├── collider/
│ │ ├── 01_creating_collider.sikuli/
│ │ │ ├── 01_creating_collider.py
│ │ │ └── startup.blend
│ │ ├── 02_modify_box.sikuli/
│ │ │ ├── 02_modify_box.py
│ │ │ └── collider_box.blend
│ │ ├── 03_modify_sphere.sikuli/
│ │ │ ├── 03_modify_sphere.py
│ │ │ └── collider_sphere.blend
│ │ ├── 04_modify_capsule.sikuli/
│ │ │ ├── 04_modify_capsule.py
│ │ │ └── collider_capsule.blend
│ │ ├── 05_modify_cylinder.sikuli/
│ │ │ ├── 05_modify_cylinder.py
│ │ │ └── collider_cylinder.blend
│ │ ├── 06_modify_convex.sikuli/
│ │ │ ├── 06_modify_convex.py
│ │ │ └── collider_convex.blend
│ │ └── run_tests.sh
│ ├── common/
│ │ ├── 01_view_only_operators.sikuli/
│ │ │ ├── 01_view_only_operators.py
│ │ │ └── all_objects.blend
│ │ ├── 03_select_operators.sikuli/
│ │ │ ├── 03_select_operators.py
│ │ │ └── all_objects.blend
│ │ └── run_tests.sh
│ ├── model/
│ │ ├── 01_creating_model_locator.sikuli/
│ │ │ ├── 01_creating_model_locator.py
│ │ │ └── startup.blend
│ │ ├── 02_modify_values.sikuli/
│ │ │ ├── 02_modify_values.py
│ │ │ └── model_locator.blend
│ │ ├── 03_preview_models.sikuli/
│ │ │ ├── 03_preview_models.py
│ │ │ ├── model_locator.blend
│ │ │ ├── stop.pic
│ │ │ ├── stop.pim
│ │ │ └── stop.pit
│ │ └── run_tests.sh
│ ├── prefab/
│ │ ├── 01_creating_prefab_locator.sikuli/
│ │ │ ├── 01_creating_prefab_locator.py
│ │ │ └── startup.blend
│ │ ├── 02_modify_node.sikuli/
│ │ │ ├── 02_modify_node.py
│ │ │ └── prefab_locator_node.blend
│ │ ├── 03_modify_sign.sikuli/
│ │ │ ├── 03_modify_sign.py
│ │ │ └── prefab_locator_sign.blend
│ │ ├── 04_modify_spawn.sikuli/
│ │ │ ├── 04_modify_spawn.py
│ │ │ └── prefab_locator_spawn.blend
│ │ ├── 05_modify_semaphore.sikuli/
│ │ │ ├── 05_modify_semaphore.py
│ │ │ └── prefab_locator_semaphore.blend
│ │ ├── 06_modify_navigation.sikuli/
│ │ │ ├── 06_modify_navigation.py
│ │ │ └── prefab_locator_navigation.blend
│ │ ├── 07_modify_map_point.sikuli/
│ │ │ ├── 07_modify_map_point.py
│ │ │ └── prefab_locator_map_point.blend
│ │ ├── 08_modify_trigger.sikuli/
│ │ │ ├── 08_modify_trigger.py
│ │ │ └── prefab_locator_trigger.blend
│ │ └── run_tests.sh
│ └── run_tests.sh
├── looks/
│ ├── 01_create.sikuli/
│ │ ├── 01_create.py
│ │ └── looks.blend
│ ├── 02_modify_mats.sikuli/
│ │ ├── 02_modify_mats.py
│ │ └── looks.blend
│ ├── 03_remove.sikuli/
│ │ ├── 03_remove.py
│ │ └── looks.blend
│ └── run_tests.sh
├── materials/
│ ├── 01_switch_materials.sikuli/
│ │ ├── 01_switch_materials.py
│ │ └── startup.blend
│ ├── 02_remove_material.sikuli/
│ │ ├── 02_remove_material.py
│ │ └── startup.blend
│ ├── 03_merge_scs_materials.sikuli/
│ │ ├── 03_merge_scs_materials.py
│ │ └── startup.blend
│ ├── 04_switch_shader_preset.sikuli/
│ │ ├── 04_switch_shader_preset.py
│ │ └── startup.blend
│ └── run_tests.sh
├── part-variant/
│ ├── run_tests.sh
│ └── variants/
│ ├── 01_create_variants.sikuli/
│ │ ├── 01_create_variants.py
│ │ └── scs_game_cubes.blend
│ ├── 02_variant_renaming.sikuli/
│ │ ├── 02_variant_renaming.py
│ │ └── default_3_variants.blend
│ ├── 03_variant_deletion.sikuli/
│ │ ├── 03_variant_deletion.py
│ │ └── default_3_variants_named.blend
│ ├── 04_variant_list_select_operator.sikuli/
│ │ ├── 04_variant_list_select_operator.py
│ │ └── default_3_variants_named.blend
│ ├── 05_variant_list_view_operator.sikuli/
│ │ ├── 05_variant_list_view_operator.py
│ │ └── default_3_variants_named.blend
│ └── run_tests.sh
└── run_tests.sh
================================================
FILE CONTENTS
================================================
================================================
FILE: .gitattributes
================================================
*.txt eol=lf
*.py eol=lf
================================================
FILE: .gitignore
================================================
# Byte-compiled / optimized / DLL files
__pycache__/
*.py[cod]
# C extensions
*.so
# Distribution / packaging
.Python
env/
build/
develop-eggs/
dist/
downloads/
eggs/
lib/
lib64/
parts/
sdist/
var/
*.egg-info/
.installed.cfg
*.egg
# PyInstaller
# Usually these files are written by a python script from a template
# before PyInstaller builds the exe, so as to inject date/other infos into it.
*.manifest
*.spec
# Installer logs
pip-log.txt
pip-delete-this-directory.txt
# Unit test / coverage reports
htmlcov/
.tox/
.coverage
.cache
nosetests.xml
coverage.xml
# Translations
*.mo
*.pot
# Django stuff:
*.log
# Sphinx documentation
docs/_build/
# PyBuilder
target/
# SCS Blender Tools
addon/io_scs_tools/config.txt
addon/io_scs_tools/debug.py
*.patch
================================================
FILE: LICENSE
================================================
GNU GENERAL PUBLIC LICENSE
Version 2, June 1991
Copyright (C) 1989, 1991 Free Software Foundation, Inc., <http://fsf.org/>
51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA
Everyone is permitted to copy and distribute verbatim copies
of this license document, but changing it is not allowed.
Preamble
The licenses for most software are designed to take away your
freedom to share and change it. By contrast, the GNU General Public
License is intended to guarantee your freedom to share and change free
software--to make sure the software is free for all its users. This
General Public License applies to most of the Free Software
Foundation's software and to any other program whose authors commit to
using it. (Some other Free Software Foundation software is covered by
the GNU Lesser General Public License instead.) You can apply it to
your programs, too.
When we speak of free software, we are referring to freedom, not
price. Our General Public Licenses are designed to make sure that you
have the freedom to distribute copies of free software (and charge for
this service if you wish), that you receive source code or can get it
if you want it, that you can change the software or use pieces of it
in new free programs; and that you know you can do these things.
To protect your rights, we need to make restrictions that forbid
anyone to deny you these rights or to ask you to surrender the rights.
These restrictions translate to certain responsibilities for you if you
distribute copies of the software, or if you modify it.
For example, if you distribute copies of such a program, whether
gratis or for a fee, you must give the recipients all the rights that
you have. You must make sure that they, too, receive or can get the
source code. And you must show them these terms so they know their
rights.
We protect your rights with two steps: (1) copyright the software, and
(2) offer you this license which gives you legal permission to copy,
distribute and/or modify the software.
Also, for each author's protection and ours, we want to make certain
that everyone understands that there is no warranty for this free
software. If the software is modified by someone else and passed on, we
want its recipients to know that what they have is not the original, so
that any problems introduced by others will not reflect on the original
authors' reputations.
Finally, any free program is threatened constantly by software
patents. We wish to avoid the danger that redistributors of a free
program will individually obtain patent licenses, in effect making the
program proprietary. To prevent this, we have made it clear that any
patent must be licensed for everyone's free use or not licensed at all.
The precise terms and conditions for copying, distribution and
modification follow.
GNU GENERAL PUBLIC LICENSE
TERMS AND CONDITIONS FOR COPYING, DISTRIBUTION AND MODIFICATION
0. This License applies to any program or other work which contains
a notice placed by the copyright holder saying it may be distributed
under the terms of this General Public License. The "Program", below,
refers to any such program or work, and a "work based on the Program"
means either the Program or any derivative work under copyright law:
that is to say, a work containing the Program or a portion of it,
either verbatim or with modifications and/or translated into another
language. (Hereinafter, translation is included without limitation in
the term "modification".) Each licensee is addressed as "you".
Activities other than copying, distribution and modification are not
covered by this License; they are outside its scope. The act of
running the Program is not restricted, and the output from the Program
is covered only if its contents constitute a work based on the
Program (independent of having been made by running the Program).
Whether that is true depends on what the Program does.
1. You may copy and distribute verbatim copies of the Program's
source code as you receive it, in any medium, provided that you
conspicuously and appropriately publish on each copy an appropriate
copyright notice and disclaimer of warranty; keep intact all the
notices that refer to this License and to the absence of any warranty;
and give any other recipients of the Program a copy of this License
along with the Program.
You may charge a fee for the physical act of transferring a copy, and
you may at your option offer warranty protection in exchange for a fee.
2. You may modify your copy or copies of the Program or any portion
of it, thus forming a work based on the Program, and copy and
distribute such modifications or work under the terms of Section 1
above, provided that you also meet all of these conditions:
a) You must cause the modified files to carry prominent notices
stating that you changed the files and the date of any change.
b) You must cause any work that you distribute or publish, that in
whole or in part contains or is derived from the Program or any
part thereof, to be licensed as a whole at no charge to all third
parties under the terms of this License.
c) If the modified program normally reads commands interactively
when run, you must cause it, when started running for such
interactive use in the most ordinary way, to print or display an
announcement including an appropriate copyright notice and a
notice that there is no warranty (or else, saying that you provide
a warranty) and that users may redistribute the program under
these conditions, and telling the user how to view a copy of this
License. (Exception: if the Program itself is interactive but
does not normally print such an announcement, your work based on
the Program is not required to print an announcement.)
These requirements apply to the modified work as a whole. If
identifiable sections of that work are not derived from the Program,
and can be reasonably considered independent and separate works in
themselves, then this License, and its terms, do not apply to those
sections when you distribute them as separate works. But when you
distribute the same sections as part of a whole which is a work based
on the Program, the distribution of the whole must be on the terms of
this License, whose permissions for other licensees extend to the
entire whole, and thus to each and every part regardless of who wrote it.
Thus, it is not the intent of this section to claim rights or contest
your rights to work written entirely by you; rather, the intent is to
exercise the right to control the distribution of derivative or
collective works based on the Program.
In addition, mere aggregation of another work not based on the Program
with the Program (or with a work based on the Program) on a volume of
a storage or distribution medium does not bring the other work under
the scope of this License.
3. You may copy and distribute the Program (or a work based on it,
under Section 2) in object code or executable form under the terms of
Sections 1 and 2 above provided that you also do one of the following:
a) Accompany it with the complete corresponding machine-readable
source code, which must be distributed under the terms of Sections
1 and 2 above on a medium customarily used for software interchange; or,
b) Accompany it with a written offer, valid for at least three
years, to give any third party, for a charge no more than your
cost of physically performing source distribution, a complete
machine-readable copy of the corresponding source code, to be
distributed under the terms of Sections 1 and 2 above on a medium
customarily used for software interchange; or,
c) Accompany it with the information you received as to the offer
to distribute corresponding source code. (This alternative is
allowed only for noncommercial distribution and only if you
received the program in object code or executable form with such
an offer, in accord with Subsection b above.)
The source code for a work means the preferred form of the work for
making modifications to it. For an executable work, complete source
code means all the source code for all modules it contains, plus any
associated interface definition files, plus the scripts used to
control compilation and installation of the executable. However, as a
special exception, the source code distributed need not include
anything that is normally distributed (in either source or binary
form) with the major components (compiler, kernel, and so on) of the
operating system on which the executable runs, unless that component
itself accompanies the executable.
If distribution of executable or object code is made by offering
access to copy from a designated place, then offering equivalent
access to copy the source code from the same place counts as
distribution of the source code, even though third parties are not
compelled to copy the source along with the object code.
4. You may not copy, modify, sublicense, or distribute the Program
except as expressly provided under this License. Any attempt
otherwise to copy, modify, sublicense or distribute the Program is
void, and will automatically terminate your rights under this License.
However, parties who have received copies, or rights, from you under
this License will not have their licenses terminated so long as such
parties remain in full compliance.
5. You are not required to accept this License, since you have not
signed it. However, nothing else grants you permission to modify or
distribute the Program or its derivative works. These actions are
prohibited by law if you do not accept this License. Therefore, by
modifying or distributing the Program (or any work based on the
Program), you indicate your acceptance of this License to do so, and
all its terms and conditions for copying, distributing or modifying
the Program or works based on it.
6. Each time you redistribute the Program (or any work based on the
Program), the recipient automatically receives a license from the
original licensor to copy, distribute or modify the Program subject to
these terms and conditions. You may not impose any further
restrictions on the recipients' exercise of the rights granted herein.
You are not responsible for enforcing compliance by third parties to
this License.
7. If, as a consequence of a court judgment or allegation of patent
infringement or for any other reason (not limited to patent issues),
conditions are imposed on you (whether by court order, agreement or
otherwise) that contradict the conditions of this License, they do not
excuse you from the conditions of this License. If you cannot
distribute so as to satisfy simultaneously your obligations under this
License and any other pertinent obligations, then as a consequence you
may not distribute the Program at all. For example, if a patent
license would not permit royalty-free redistribution of the Program by
all those who receive copies directly or indirectly through you, then
the only way you could satisfy both it and this License would be to
refrain entirely from distribution of the Program.
If any portion of this section is held invalid or unenforceable under
any particular circumstance, the balance of the section is intended to
apply and the section as a whole is intended to apply in other
circumstances.
It is not the purpose of this section to induce you to infringe any
patents or other property right claims or to contest validity of any
such claims; this section has the sole purpose of protecting the
integrity of the free software distribution system, which is
implemented by public license practices. Many people have made
generous contributions to the wide range of software distributed
through that system in reliance on consistent application of that
system; it is up to the author/donor to decide if he or she is willing
to distribute software through any other system and a licensee cannot
impose that choice.
This section is intended to make thoroughly clear what is believed to
be a consequence of the rest of this License.
8. If the distribution and/or use of the Program is restricted in
certain countries either by patents or by copyrighted interfaces, the
original copyright holder who places the Program under this License
may add an explicit geographical distribution limitation excluding
those countries, so that distribution is permitted only in or among
countries not thus excluded. In such case, this License incorporates
the limitation as if written in the body of this License.
9. The Free Software Foundation may publish revised and/or new versions
of the General Public License from time to time. Such new versions will
be similar in spirit to the present version, but may differ in detail to
address new problems or concerns.
Each version is given a distinguishing version number. If the Program
specifies a version number of this License which applies to it and "any
later version", you have the option of following the terms and conditions
either of that version or of any later version published by the Free
Software Foundation. If the Program does not specify a version number of
this License, you may choose any version ever published by the Free Software
Foundation.
10. If you wish to incorporate parts of the Program into other free
programs whose distribution conditions are different, write to the author
to ask for permission. For software which is copyrighted by the Free
Software Foundation, write to the Free Software Foundation; we sometimes
make exceptions for this. Our decision will be guided by the two goals
of preserving the free status of all derivatives of our free software and
of promoting the sharing and reuse of software generally.
NO WARRANTY
11. BECAUSE THE PROGRAM IS LICENSED FREE OF CHARGE, THERE IS NO WARRANTY
FOR THE PROGRAM, TO THE EXTENT PERMITTED BY APPLICABLE LAW. EXCEPT WHEN
OTHERWISE STATED IN WRITING THE COPYRIGHT HOLDERS AND/OR OTHER PARTIES
PROVIDE THE PROGRAM "AS IS" WITHOUT WARRANTY OF ANY KIND, EITHER EXPRESSED
OR IMPLIED, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES OF
MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE. THE ENTIRE RISK AS
TO THE QUALITY AND PERFORMANCE OF THE PROGRAM IS WITH YOU. SHOULD THE
PROGRAM PROVE DEFECTIVE, YOU ASSUME THE COST OF ALL NECESSARY SERVICING,
REPAIR OR CORRECTION.
12. IN NO EVENT UNLESS REQUIRED BY APPLICABLE LAW OR AGREED TO IN WRITING
WILL ANY COPYRIGHT HOLDER, OR ANY OTHER PARTY WHO MAY MODIFY AND/OR
REDISTRIBUTE THE PROGRAM AS PERMITTED ABOVE, BE LIABLE TO YOU FOR DAMAGES,
INCLUDING ANY GENERAL, SPECIAL, INCIDENTAL OR CONSEQUENTIAL DAMAGES ARISING
OUT OF THE USE OR INABILITY TO USE THE PROGRAM (INCLUDING BUT NOT LIMITED
TO LOSS OF DATA OR DATA BEING RENDERED INACCURATE OR LOSSES SUSTAINED BY
YOU OR THIRD PARTIES OR A FAILURE OF THE PROGRAM TO OPERATE WITH ANY OTHER
PROGRAMS), EVEN IF SUCH HOLDER OR OTHER PARTY HAS BEEN ADVISED OF THE
POSSIBILITY OF SUCH DAMAGES.
END OF TERMS AND CONDITIONS
How to Apply These Terms to Your New Programs
If you develop a new program, and you want it to be of the greatest
possible use to the public, the best way to achieve this is to make it
free software which everyone can redistribute and change under these terms.
To do so, attach the following notices to the program. It is safest
to attach them to the start of each source file to most effectively
convey the exclusion of warranty; and each file should have at least
the "copyright" line and a pointer to where the full notice is found.
{description}
Copyright (C) {year} {fullname}
This program is free software; you can redistribute it and/or modify
it under the terms of the GNU General Public License as published by
the Free Software Foundation; either version 2 of the License, or
(at your option) any later version.
This program is distributed in the hope that it will be useful,
but WITHOUT ANY WARRANTY; without even the implied warranty of
MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
GNU General Public License for more details.
You should have received a copy of the GNU General Public License along
with this program; if not, write to the Free Software Foundation, Inc.,
51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA.
Also add information on how to contact you by electronic and paper mail.
If the program is interactive, make it output a short notice like this
when it starts in an interactive mode:
Gnomovision version 69, Copyright (C) year name of author
Gnomovision comes with ABSOLUTELY NO WARRANTY; for details type `show w'.
This is free software, and you are welcome to redistribute it
under certain conditions; type `show c' for details.
The hypothetical commands `show w' and `show c' should show the appropriate
parts of the General Public License. Of course, the commands you use may
be called something other than `show w' and `show c'; they could even be
mouse-clicks or menu items--whatever suits your program.
You should also get your employer (if you work as a programmer) or your
school, if any, to sign a "copyright disclaimer" for the program, if
necessary. Here is a sample; alter the names:
Yoyodyne, Inc., hereby disclaims all copyright interest in the program
`Gnomovision' (which makes passes at compilers) written by James Hacker.
{signature of Ty Coon}, 1 April 1989
Ty Coon, President of Vice
This General Public License does not permit incorporating your program into
proprietary programs. If your program is a subroutine library, you may
consider it more useful to permit linking proprietary applications with the
library. If this is what you want to do, use the GNU Lesser General
Public License instead of this License.
================================================
FILE: README.md
================================================
SCS Blender Tools
=================
SCS Blender Tools are official tools for model and asset creation for
trucking games by SCS Software. You can download actual version free
of charge using GitHub repository "https://github.com/SCSSoftware/BlenderTools".
Blender is multi-platform Open Source application for 3D content creation
and you can download it free of charge on "http://www.blender.org".
What tools are included:
------------------------
- SCS mid-format importer
- SCS mid-format exporter
- Multi-object system
- Part/Variant system
- Special Locators
- SCS Material system (using shader presets)
- Special tool-shelf with additional tools
Installation and Usage:
-------------
Addon is located in "addon/io_scs_tools" folder.
Use standard Blender addon installation procedure for installing it.
For more information visit wiki at
"http://modding.scssoft.com/wiki/Documentation/Tools/SCS_Blender_Tools".
Notes:
------
- In case of trouble installing SCS Blender Tools make sure you're using
compatible Blender version. SCS Blender Tools for Blender versions
prior 2.73 are not supported.
Help, questions, troubleshooting:
---------------------------------
If you encounter any problems or have questions regarding SCS Blender Tools,
please visit forum at "http://forum.scssoft.com/viewforum.php?f=159" and
don't hesitate to ask if your problem wasn't addressed already. Also
don't miss wiki ("http://modding.scssoft.com/wiki/Documentation/Tools/SCS_Blender_Tools")
for many useful tips and docs.
Bugs:
-----
For reporting bugs please visit forum at
"http://forum.scssoft.com/viewforum.php?f=163".
License:
--------
SCS Blender Tools are developed and distributed under GNU GPL v2
("http://www.gnu.org/licenses/gpl-2.0.html").
SCS Blender Tools Team
================================================
FILE: addon/io_scs_tools/__init__.py
================================================
# ##### BEGIN GPL LICENSE BLOCK #####
#
# This program is free software; you can redistribute it and/or
# modify it under the terms of the GNU General Public License
# as published by the Free Software Foundation; either version 2
# of the License, or (at your option) any later version.
#
# This program is distributed in the hope that it will be useful,
# but WITHOUT ANY WARRANTY; without even the implied warranty of
# MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
# GNU General Public License for more details.<
#
# You should have received a copy of the GNU General Public License
# along with this program; if not, write to the Free Software Foundation,
# Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301, USA.
#
# ##### END GPL LICENSE BLOCK #####
# Copyright (C) 2013-2021: SCS Software
bl_info = {
"name": "SCS Tools",
"description": "Setup models, Import-Export SCS data format",
"author": "Simon Lusenc (50keda), Milos Zajic (4museman)",
"version": (2, 4, "aeadde03"),
"blender": (3, 2, 0),
"location": "File > Import-Export",
"doc_url": "http://modding.scssoft.com/wiki/Documentation/Tools/SCS_Blender_Tools",
"tracker_url": "http://forum.scssoft.com/viewforum.php?f=163",
"support": "COMMUNITY",
"category": "Import-Export"}
import bpy
import os
import traceback
from time import time
from bpy.props import CollectionProperty, StringProperty, PointerProperty, BoolProperty
from bpy_extras.io_utils import ImportHelper, ExportHelper
from io_scs_tools.consts import Icons as _ICONS_consts
from io_scs_tools.imp import pix as _pix_import
from io_scs_tools.internals.callbacks import open_gl as _open_gl_callback
from io_scs_tools.internals.callbacks import persistent as _persistent_callback
from io_scs_tools.internals import icons as _icons
from io_scs_tools.operators.bases.export import SCSExportHelper as _SCSExportHelper
from io_scs_tools.utils import get_scs_globals as _get_scs_globals
from io_scs_tools.utils.view3d import has_view3d_space as _has_view3d_space
from io_scs_tools.utils.printout import lprint
class SCS_TOOLS_OT_Import(bpy.types.Operator, ImportHelper):
"""
Load various SCS file formats containing geometries and numerous settings.
"""
bl_idname = "scs_tools.import_pim"
bl_label = "SCS Import"
bl_description = "Load various SCS file formats containing geometries and numerous settings."
bl_options = {'UNDO'}
filename_ext = "*.pim;*.pim.ef;"
files: CollectionProperty(name="File Path",
description="File path used for importing the SCS files",
type=bpy.types.OperatorFileListElement)
scs_project_path_mode: BoolProperty(
default=False,
description="Set currently selected directory as SCS Project Path"
)
directory: StringProperty()
filter_glob: StringProperty(default=filename_ext, options={'HIDDEN'})
def check(self, context):
if self.scs_project_path_mode:
_get_scs_globals().scs_project_path = os.path.dirname(self.filepath)
self.scs_project_path_mode = False
return True
def execute(self, context):
from io_scs_tools.internals.containers.config import AsyncPathsInit
# if paths are still initializing report that to user and don't execute import
if AsyncPathsInit.is_running():
self.report({'INFO'}, "Can't import yet, paths initialization is still in progress! Try again in few moments.")
# revoke to add new fileselect dialog otherwise this operator will finish
return self.invoke(context, None)
if not _has_view3d_space(context.screen):
message = "Cannot import SCS Models, no 3D viewport found! Make sure you have at least one 3D view visible."
self.report({'ERROR'}, message)
lprint("E " + message)
return {'FINISHED'}
paths = [os.path.join(self.directory, name.name) for name in self.files]
if not paths:
paths.append(self.path)
start_time = time()
failed_files = []
for filepath in paths:
result = False
if filepath.endswith(".pim") or filepath.endswith(".pim.ef"):
# check extension for DEF format and properly assign it to name suffix
ef_format_suffix = ""
if filepath.endswith(".ef"):
ef_format_suffix = ".ef"
filepath = filepath[:-len(ef_format_suffix)]
filepath = filepath[:-4]
try:
_get_scs_globals().import_in_progress = True
result = _pix_import.load(context, filepath, name_suffix=ef_format_suffix)
_get_scs_globals().import_in_progress = False
except Exception as e:
_get_scs_globals().import_in_progress = False
context.window.cursor_modal_restore()
trace_str = traceback.format_exc().replace("\n", "\n\t ")
lprint("E Unexpected %r accured during import:\n\t %s", (type(e).__name__, trace_str))
if result is False:
failed_files.append(str(filepath).replace("\\", "/"))
if len(failed_files) > 0:
err_message = "E Following files failed to load:"
for _ in failed_files:
err_message += "\n\t -> %r\n"
lprint(err_message, tuple(failed_files), report_warnings=1, report_errors=1)
end_time = time()
self.report({'INFO'}, "Import finished and took %.3f sec." % (end_time - start_time))
return {'FINISHED'}
def draw(self, context):
"""
:param context:
:return:
"""
from io_scs_tools.ui.shared import get_on_off_icon
from io_scs_tools.ui.shared import draw_common_settings
from io_scs_tools.internals.containers.config import AsyncPathsInit
scs_globals = _get_scs_globals()
# importer_version = round(import_pix.version(), 2)
layout = self.layout
# SCS Project Path
box1 = layout.box()
layout_box_col = box1.column(align=True)
layout_box_col.label(text="SCS Project Base Path:", icon='FILE_FOLDER')
layout_box_col.separator()
layout_box_row = layout_box_col.row(align=True)
layout_box_row.alert = not os.path.isdir(scs_globals.scs_project_path)
layout_box_row.prop(scs_globals, 'scs_project_path', text="")
layout_box_row = layout_box_col.row(align=True)
layout_box_row.prop(self, "scs_project_path_mode", toggle=True, text="Set Current Dir as Project Base", icon='PASTEDOWN')
if AsyncPathsInit.is_running(): # report running path initialization operator
layout_box_row = layout_box_col.row(align=True)
layout_box_row.scale_y = 2
layout_box_row.label(text="Paths initialization in progress...")
layout_box_row.label(text="", icon='SORTTIME')
# import settings
box2 = layout.box()
col = box2.column()
col.label(text="Import Options:", icon='SETTINGS')
col.separator()
col.prop(scs_globals, "import_scale")
col.prop(scs_globals, "import_preserve_path_for_export")
col.prop(scs_globals, "import_pim_file", toggle=True, icon=get_on_off_icon(scs_globals.import_pim_file))
if scs_globals.import_pim_file:
col.prop(scs_globals, "import_use_normals")
col.prop(scs_globals, "import_use_welding")
if scs_globals.import_use_welding:
col.prop(scs_globals, "import_welding_precision")
col.prop(scs_globals, "import_pit_file", toggle=True, icon=get_on_off_icon(scs_globals.import_pit_file))
if scs_globals.import_pit_file:
col.prop(scs_globals, "import_load_textures")
col.prop(scs_globals, "import_pic_file", toggle=True, icon=get_on_off_icon(scs_globals.import_pic_file))
col.prop(scs_globals, "import_pip_file", toggle=True, icon=get_on_off_icon(scs_globals.import_pip_file))
col.prop(scs_globals, "import_pis_file", toggle=True, icon=get_on_off_icon(scs_globals.import_pis_file))
if scs_globals.import_pis_file:
col.prop(scs_globals, "import_bone_scale")
col.prop(scs_globals, "import_pia_file", toggle=True, icon=get_on_off_icon(scs_globals.import_pia_file))
if scs_globals.import_pia_file:
col.prop(scs_globals, "import_include_subdirs_for_pia")
# Common global settings
box3 = layout.box()
box3.label(text="Log Level:", icon='MOD_EXPLODE')
box3.prop(scs_globals, 'dump_level', text="")
class SCS_TOOLS_OT_Export(bpy.types.Operator, _SCSExportHelper, ExportHelper):
"""
Export complex geometries to the SCS file formats.
"""
bl_idname = "scs_tools.export_pim"
bl_label = "SCS Export"
bl_description = "Export complex geometries to the SCS file formats."
bl_options = set()
filename_ext = ".pim"
filter_glob: StringProperty(default=str("*" + filename_ext), options={'HIDDEN'})
def execute(self, context):
# convert filepath to None if empty, so export will ignore given menu file path and try to export to other none menu set paths
if self.filepath == "":
filepath = None
else:
filepath = os.path.dirname(self.filepath)
return self.execute_export(context, True, menu_filepath=filepath)
def draw(self, context):
from io_scs_tools.ui.shared import draw_export_panel
box0 = self.layout.box()
box0.use_property_split = True
box0.use_property_decorate = False
box0.label(text="Export Options:", icon='SETTINGS')
box0.prop(_get_scs_globals(), 'export_scope', expand=True)
draw_export_panel(box0, ignore_extra_boxes=True)
class SCS_TOOLS_MT_AddObject(bpy.types.Menu):
bl_label = "Add"
bl_description = "Creates menu for adding SCS objects"
def draw(self, context):
self.layout.operator_enum("object.scs_tools_add_object", "new_object_type")
class SCS_TOOLS_MT_ObjectsMisc(bpy.types.Menu):
bl_label = "Objects Misc"
bl_description = "Creates menu for SCS objects miscellaneous actions"
def draw(self, context):
self.layout.operator("object.scs_tools_fix_model_locator_hookups")
class SCS_TOOLS_MT_MaterialsMisc(bpy.types.Menu):
bl_label = "Materials Misc"
bl_description = "Creates menu for SCS materials miscellaneous actions"
def draw(self, context):
self.layout.operator("material.scs_tools_reload_materials")
self.layout.operator("material.scs_tools_merge_materials")
self.layout.operator("material.scs_tools_adapt_color_management")
class SCS_TOOLS_MT_MainMenu(bpy.types.Menu):
bl_label = "SCS Tools"
bl_description = "Global menu for accessing all SCS Blender Tools features in one place"
__static_popovers = {
"sidebar": [],
"props": [],
"output": []
}
@staticmethod
def append_sidebar_entry(menu_item_name, panel_id):
SCS_TOOLS_MT_MainMenu.__static_popovers["sidebar"].append((menu_item_name, panel_id))
@staticmethod
def append_props_entry(menu_item_name, panel_id):
SCS_TOOLS_MT_MainMenu.__static_popovers["props"].append((menu_item_name, panel_id))
@staticmethod
def append_output_entry(menu_item_name, panel_id):
SCS_TOOLS_MT_MainMenu.__static_popovers["output"].append((menu_item_name, panel_id))
@classmethod
def unregister(cls):
for category in SCS_TOOLS_MT_MainMenu.__static_popovers:
SCS_TOOLS_MT_MainMenu.__static_popovers[category].clear()
def draw(self, context):
layout = self.layout
column = layout.column()
# sub-menus
column.menu(SCS_TOOLS_MT_AddObject.__name__)
column.menu(SCS_TOOLS_MT_ObjectsMisc.__name__)
column.menu(SCS_TOOLS_MT_MaterialsMisc.__name__)
# popovers by category
for category in SCS_TOOLS_MT_MainMenu.__static_popovers:
column.separator()
for menu_item_name, panel_id in SCS_TOOLS_MT_MainMenu.__static_popovers[category]:
column.popover(panel_id, text=menu_item_name)
def add_menu_func(self, context):
self.layout.menu(SCS_TOOLS_MT_AddObject.__name__, text="SCS Object", icon_value=_icons.get_icon(_ICONS_consts.Types.scs_object_menu))
self.layout.separator()
def menu_func_import(self, context):
self.layout.operator(SCS_TOOLS_OT_Import.bl_idname, text="SCS Game Object (.pim)",
icon_value=_icons.get_icon(_ICONS_consts.Types.scs_object_menu))
def menu_func_export(self, context):
self.layout.operator(SCS_TOOLS_OT_Export.bl_idname, text="SCS Game Object(s) (.pim)",
icon_value=_icons.get_icon(_ICONS_consts.Types.scs_object_menu))
def menu_scs_tools(self, context):
self.layout.menu(SCS_TOOLS_MT_MainMenu.__name__)
classes = (
SCS_TOOLS_OT_Import,
SCS_TOOLS_OT_Export,
SCS_TOOLS_MT_AddObject,
SCS_TOOLS_MT_ObjectsMisc,
SCS_TOOLS_MT_MaterialsMisc,
SCS_TOOLS_MT_MainMenu
)
# #################################################
def register():
# CUSTOM ICONS INITIALIZATION
_icons.register()
# REGISTRATION OF OUR PROPERTIES
from io_scs_tools.properties import register as props_register
props_register()
# PROPERTIES REGISTRATION INTO EXISTING CLASSES
bpy.types.Object.scs_object_look_inventory = CollectionProperty(
type=properties.object.ObjectLooksInventoryItem
)
bpy.types.Object.scs_object_part_inventory = CollectionProperty(
type=properties.object.ObjectPartInventoryItem
)
bpy.types.Object.scs_object_variant_inventory = CollectionProperty(
type=properties.object.ObjectVariantInventoryItem
)
bpy.types.Object.scs_object_animation_inventory = CollectionProperty(
type=properties.object.ObjectAnimationInventoryItem
)
bpy.types.WorkSpace.scs_props = PointerProperty(
name="SCS Tools Workspace Variables",
type=properties.workspace.WorkspaceSCSProps,
description="SCS Tools workspace variables"
)
bpy.types.Object.scs_props = PointerProperty(
name="SCS Tools Object Variables",
type=properties.object.ObjectSCSTools,
description="SCS Tools object variables",
)
bpy.types.Scene.scs_props = PointerProperty(
name="SCS Tools Scene Variables",
type=properties.scene.SceneSCSProps,
description="SCS Tools scene variables",
)
bpy.types.Mesh.scs_props = PointerProperty(
name="SCS Tools Mesh Variables",
type=properties.mesh.MeshSCSTools,
description="SCS Tools Mesh variables",
)
bpy.types.Material.scs_props = PointerProperty(
name="SCS Tools Material Variables",
type=properties.material.MaterialSCSTools,
description="SCS Tools Material variables",
)
bpy.types.Action.scs_props = PointerProperty(
name="SCS Tools Action Variables",
type=properties.action.ActionSCSTools,
description="SCS Tools Action variables",
)
# REGISTER UI
from io_scs_tools.ui import register as ui_register
ui_register()
# REGISTER OPERATORS
from io_scs_tools.operators import register as ops_register
ops_register()
# MAIN MODULE REGISTRATION
for cls in classes:
bpy.utils.register_class(cls)
# MENU REGISTRATION
bpy.types.TOPBAR_MT_editor_menus.append(menu_scs_tools)
bpy.types.TOPBAR_MT_file_import.append(menu_func_import)
bpy.types.TOPBAR_MT_file_export.append(menu_func_export)
bpy.types.VIEW3D_MT_add.prepend(add_menu_func)
# PERSISTENT HANDLERS
_persistent_callback.enable()
def unregister():
# DELETE CUSTOM ICONS
_icons.unregister()
# REMOVE OPENGL HANDLERS
_open_gl_callback.disable()
# REMOVE PERSISTENT HANDLERS
_persistent_callback.disable()
# REMOVE MENU ENTRIES
bpy.types.TOPBAR_MT_editor_menus.remove(menu_scs_tools)
bpy.types.TOPBAR_MT_file_import.remove(menu_func_export)
bpy.types.TOPBAR_MT_file_export.remove(menu_func_import)
bpy.types.VIEW3D_MT_add.remove(add_menu_func)
# REMOVE MAIN MODULE CLASSES
for cls in classes:
bpy.utils.unregister_class(cls)
# UNREGISTER OPERATORS
from io_scs_tools.operators import unregister as ops_unregister
ops_unregister()
# UNREGISTER UI
from io_scs_tools.ui import unregister as ui_unregister
ui_unregister()
# REMOVE PROPERTIES FROM DATA
del bpy.types.Action.scs_props
del bpy.types.Material.scs_props
del bpy.types.Mesh.scs_props
del bpy.types.Scene.scs_props
del bpy.types.Object.scs_props
del bpy.types.WorkSpace.scs_props
del bpy.types.Object.scs_object_look_inventory
del bpy.types.Object.scs_object_part_inventory
del bpy.types.Object.scs_object_variant_inventory
del bpy.types.Object.scs_object_animation_inventory
# UNREGISTER PROPS
from io_scs_tools.properties import unregister as props_unregister
props_unregister()
if __name__ == "__main__":
register()
print("Running from if in main module!")
================================================
FILE: addon/io_scs_tools/consts.py
================================================
# ##### BEGIN GPL LICENSE BLOCK #####
#
# This program is free software you can redistribute it and/or
# modify it under the terms of the GNU General Public License
# as published by the Free Software Foundation; either version 2
# of the License, or (at your option) any later version.
#
# This program is distributed in the hope that it will be useful,
# but WITHOUT ANY WARRANTY; without even the implied warranty of
# MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
# GNU General Public License for more details.
#
# You should have received a copy of the GNU General Public License
# along with this program; if not, write to the Free Software Foundation,
# Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301, USA.
#
# ##### END GPL LICENSE BLOCK #####
# Copyright (C) 2013-2019: SCS Software
"""
Constants for data group of map and navigation curves
"""
from math import cos, pi
from enum import Enum
from zipfile import ZIP_STORED, ZIP_DEFLATED, ZIP_BZIP2
class ConnectionsStorage:
"""Constants related for storage of connections used in custom drawing
"""
collection_name = ".scs_connection_storage"
"""Name of bpy.data.collection which will be used for storing Custom Property for connections dictionary"""
custom_prop_name = "scs_locator_connections"
"""Name of the Blender Custom Property where dictionary for connections will be stored"""
class Operators:
class SelectionType:
"""Constants related to type of selection in operators all over the tools
"""
undecided = -1
deselect = 0
select = 1
shift_select = 2
ctrl_select = 3
class ViewType:
"""Constants related to type of view in operators all over the tools
"""
undecided = -1
hide = 0
viewonly = 1
shift_view = 2
ctrl_view = 3
class TerrainPoints:
"""Constants related to terrain points operators.
"""
vg_name_prefix = ".scs_terrain_points_node:"
"""Name prefix of terrain points vertex group."""
vg_name_regex = "^" + vg_name_prefix.replace(".", "\\.") + "\d$"
"""Regex for matching terrain points vertex groups names on export."""
class View3DReport:
"""Constants related to 3D view report operator.
"""
# constants defining BT banner image and texts/positions of close/hide controls
BT_BANNER_IMG_NAME = ".scs_bt_banner.tga"
BT_BANNER_WITH_CTRLS_IMG_NAME = ".scs_bt_banner_with_ctrls.tga"
CLOSE_BTN_AREA = (240, 260, -25, -5)
CLOSE_BTN_TEXT_POS = (242, -9)
CLOSE_BTN_TEXT = "×"
HIDE_BTN_AREA = (215, 235, -25, -5)
HIDE_BTN_TEXT_POS = (220, -5)
HIDE_BTN_TEXT = "–"
SCROLLUP_BTN_AREA = (-17, -3, 22, 47)
SCROLLUP_BTN_TEXT_POS = (-18, 40)
SCROLLUP_BTN_TEXT = "↑"
SCROLLDOWN_BTN_AREA = (-17, -3, 52, 77)
SCROLLDOWN_BTN_TEXT_POS = (-18, 71)
SCROLLDOWN_BTN_TEXT = "↓"
class InventoryMoveType:
"""Constants related to moving type in operators for inventories items moving.
"""
move_down = "down"
move_up = "up"
class Icons:
"""Constants related to loading of custom icons.
"""
default_icon_theme = "white"
class Types:
"""This class saves names of all custom icons for Blender Tools.
"""
mesh = ".01_mesh_model_object.png"
mesh_shadow_caster = ".02_object_with_shadow_caster_material.png"
mesh_glass = ".03_object_with_glass_material.png"
mesh_with_physics = ".04_object_with_physical_material.png"
loc = ".05_locator_all_types.png"
loc_model = ".06_locator_model.png"
loc_prefab = ".07_locator_prefab.png"
loc_collider = ".08_locator_collision.png"
loc_prefab_node = ".09_locator_prefab_node.png"
loc_prefab_sign = ".10_locator_prefab_sign.png"
loc_prefab_spawn = ".11_locator_prefab_spawn.png"
loc_prefab_semaphore = ".12_locator_prefab_semaphore.png"
loc_prefab_navigation = ".13_locator_prefab_navigation.png"
loc_prefab_map = ".14_locator_prefab_map.png"
loc_prefab_trigger = ".15_locator_prefab_trigger.png"
loc_collider_box = ".16_collider_box.png"
loc_collider_sphere = ".17_collider_sphere.png"
loc_collider_capsule = ".18_collider_capsule.png"
loc_collider_cylinder = ".19_collider_cylinder.png"
loc_collider_convex = ".20_collider_convex.png"
scs_root = ".21_scs_root_object.png"
scs_object_menu = ".22_scs_object_menu.png"
scs_logo = ".icon_scs_bt_logo.png"
@staticmethod
def as_list():
"""Gets file names of all custom icons defined in Blender Tools
:return: list of all custom icon files
:rtype: list
"""
return [Icons.Types.mesh, Icons.Types.mesh_shadow_caster, Icons.Types.mesh_glass, Icons.Types.mesh_with_physics,
Icons.Types.loc, Icons.Types.loc_model, Icons.Types.loc_prefab, Icons.Types.loc_collider,
Icons.Types.loc_prefab_node, Icons.Types.loc_prefab_sign, Icons.Types.loc_prefab_spawn, Icons.Types.loc_prefab_semaphore,
Icons.Types.loc_prefab_navigation, Icons.Types.loc_prefab_map, Icons.Types.loc_prefab_trigger,
Icons.Types.loc_collider_box, Icons.Types.loc_collider_sphere, Icons.Types.loc_collider_capsule,
Icons.Types.loc_collider_cylinder, Icons.Types.loc_collider_convex, Icons.Types.scs_root,
Icons.Types.scs_object_menu, Icons.Types.scs_logo]
class Part:
"""Constants related to 'SCS Parts'
"""
default_name = "defaultpart"
"""Default name for part"""
class Variant:
"""Constants related to 'SCS Variants'
"""
default_name = "default"
"""Default name for variant"""
class Look:
"""Constants related to 'SCS Looks'
"""
custom_prop_name = "scs_looks_data"
"""Name of the Blender Custom Property where dictionary for looks will be stored"""
default_name = "default"
"""Default name for look"""
class Material:
"""Constants related to materials
"""
unset_bitmap_filepath = ""
"""Unset value of each texture filepath (used for identifying if this value in material was set)"""
unset_substance = "None"
"""Unset value of material substance (used for identifying if this value in material was set)"""
node_group_prefix = ".SCS_NG_"
"""Prefix for naming node groups used by SCS materials"""
prevm_material_name = ".scs_prevm"
"""Name of the material used on SCS preview models."""
class Colors:
"""Constants related to colors in Blender
"""
gamma = 2.2
"""Gamma value used by Blender for correcting display colors."""
prevm_color = (0.36, 0.29, 0.57, 1)
"""Color array used for preview models."""
class LampTools:
"""Constants related to lampmask and it's tools
"""
class VehicleSides(Enum):
"""Defined sides of vehicles.
"""
FrontLeft = 0
FrontRight = 1
RearLeft = 2
RearRight = 3
Middle = 4
class VehicleLampTypes(Enum):
"""Defined lamp types for vehicles.
"""
LeftTurn = 0
RightTurn = 1
Brake = 2
HighBeam = 3
LowBeam = 4
Reverse = 5
DRL = 6
Positional = 7
class AuxiliaryLampColors(Enum):
"""Defined vehicle auxiliary light colors.
"""
White = 0
Orange = 1
class AuxiliaryLampTypes(Enum):
"""Defined lamp types for vehicle auxiliary lights.
"""
Dim = 0
Bright = 1
class TrafficLightTypes(Enum):
"""Defined lamp types for traffic lights.
"""
Red = 0
Yellow = 1
Green = 2
class VertexColorTools:
"""Constants related to vertex color tools
"""
class WrapType:
All = "all"
Selected = "selected"
class ColoringLayersTypes:
"""Constants for vertex coloring that hold names of the layers we use.
"""
Color = "color"
Decal = "decal"
AO = "ao"
AO2 = "ao2"
@staticmethod
def as_list():
"""Gets assets vertex color layers names
:return: list of all layer types as name
:rtype: list
"""
return [
VertexColorTools.ColoringLayersTypes.Color,
VertexColorTools.ColoringLayersTypes.Decal,
VertexColorTools.ColoringLayersTypes.AO,
VertexColorTools.ColoringLayersTypes.AO2
]
class Mesh:
"""Constants for mesh data used either on import or in general.
"""
none_uv = "~"
vcol_a_suffix = "_alpha"
default_uv = "UV"
default_vcol = "Col"
class PrefabLocators:
"""Constants for prefab locator properties, flags and exporter.
"""
NAVIGATION_NEXT_PREV_MAX = 4
"""Maximun navigation next/previus curve count constant."""
PREFAB_LANE_COUNT_MAX = 8
"""Maximum lane count constant."""
PREFAB_NODE_COUNT_MAX = 6
"""Maximum node count constant."""
# START: not in original constants
TSEM_COUNT_MAX = 32
"""Maximum traffic semaphore count. NOTE: it can be bigger, but no need"""
TP_NEIGHBOURS_COUNT_MAX = 2
"""Maximum neighbours count for trigger points."""
CURVE_MEASURE_STEPS = 300
"""Number of segments that curves use for measuing it's length."""
CURVE_STEPS_COUNT = 10
"""Number of segments that curves are using during export calculations"""
CURVE_CLOSEST_POINT_ITER = 30
"""Number of iterations for closest point calculations."""
CURVE_SPLIT_CROSS_DOT = cos(60.0 * pi / 180.0)
"""Dot product constante which marsk split croos intersection as sharp."""
SAFE_DISTANCE = 4.0
"""Minimal distance between two intersecting curves to be meet until we reach safe point."""
TERRAIN_POINTS_MIN_DISTANCE = 0.01
"""Minimal distance between two terrain points to be recognized as different."""
# END: not in original constants
class PNCF:
"""Constants used for calculation of navigation curve flag variable.
"""
FORCE_NO_BLINKER = 0x00000004
RIGHT_BLINKER = 0x00000008
LEFT_BLINKER = 0x00000010
SMALL_VEHICLES = 0x00000020
LARGE_VEHICLES = 0x00000040
ALLOWED_VEHICLES_MASK = (SMALL_VEHICLES | LARGE_VEHICLES)
PRIORITY_MASK = 0x000F0000
PRIORITY_SHIFT = 16
LOW_PROBABILITY = 0x00002000
LIMIT_DISPLACEMENT = 0x00004000
ADDITIVE_PRIORITY = 0x00008000
START_NAV_POINT_FLAGS = (FORCE_NO_BLINKER | RIGHT_BLINKER | LEFT_BLINKER |
PRIORITY_MASK | ADDITIVE_PRIORITY | LIMIT_DISPLACEMENT)
END_NAV_POINT_FLAGS = (ALLOWED_VEHICLES_MASK | LOW_PROBABILITY)
class PNLF:
"""Constants used for calculation of navigation point leads to nodes variable.
"""
END_NODE_MASK = 0x000000FF
END_NODE_SHIFT = 0
END_LANE_MASK = 0x0000FF00
END_LANE_SHIFT = 8
START_NODE_MASK = 0x00FF0000
START_NODE_SHIFT = 16
START_LANE_MASK = 0xFF000000
START_LANE_SHIFT = 24
class PSP:
"""Constants used for calculateion of spawn point flag variable.
"""
NONE = 0
TRAILER_POS = 1
UNLOAD_EASY_POS = 2
GAS_POS = 3
SERVICE_POS = 4
TRUCKSTOP_POS = 5
WEIGHT_POS = 6
TRUCKDEALER_POS = 7
HOTEL = 8
CUSTOM = 9
PARKING = 10
TASK = 11
MEET_POS = 12
COMPANY_POS = 13
GARAGE_POS = 14
BUY_POS = 15
RECRUITMENT_POS = 16
CAMERA_POINT = 17
BUS_STATION = 18
UNLOAD_MEDIUM_POS = 19
UNLOAD_HARD_POS = 20
UNLOAD_RIGID_POS = 21
WEIGHT_CAT_POS = 22
COMPANY_UNLOAD_POS = 23
TRAILER_SPAWN = 24
LONG_TRAILER_POS = 25
class TST:
"""Constants representing type of traffic semaphores.
"""
PROFILE = 0
MODEL_ONLY = 1
TRAFFIC_LIGHT = 2
TRAFFIC_LIGHT_MINOR = 3
TRAFFIC_LIGHT_MAJOR = 4
BARRIER_MANUAL_TIMED = 5
BARRIER_DISTANCE = 6
TRAFFIC_LIGHT_BLOCKABLE = 7
BARRIER_GAS = 8
TRAFFIC_LIGHT_VIRTUAL = 9
BARRIER_AUTOMATIC = 10
class MPVF:
"""Constants represeting map point visual flags.
"""
ROAD_SIZE_ONE_WAY = 0x00000000
ROAD_SIZE_1_LANE = 0x00000100
ROAD_SIZE_2_LANE = 0x00000200
ROAD_SIZE_3_LANE = 0x00000300
ROAD_SIZE_4_LANE = 0x00000400
ROAD_SIZE_2_LANE_SPLIT = 0x00000500
ROAD_SIZE_3_LANE_SPLIT = 0x00000600
ROAD_SIZE_4_LANE_SPLIT = 0x00000700
ROAD_SIZE_3_LANE_ONE_WAY = 0x00000800
ROAD_SIZE_MANUAL = 0x00000D00
ROAD_SIZE_AUTO = 0x00000E00
ROAD_SIZE_MASK = 0x00000F00
ROAD_OFFSET_0 = 0x00000000
ROAD_OFFSET_1 = 0x00001000
ROAD_OFFSET_2 = 0x00002000
ROAD_OFFSET_5 = 0x00003000
ROAD_OFFSET_10 = 0x00004000
ROAD_OFFSET_15 = 0x00005000
ROAD_OFFSET_20 = 0x00006000
ROAD_OFFSET_25 = 0x00007000
ROAD_OFFSET_LANE = 0x00008000
ROAD_OFFSET_MASK = 0x0000F000
ROAD_EXT_VALUE_MASK = 0x000000FF
ROAD_OVER = 0x00010000
CUSTOM_COLOR1 = 0x00020000
CUSTOM_COLOR2 = 0x00040000
CUSTOM_COLOR3 = 0x00080000
NO_OUTLINE = 0x00100000
NO_ARROW = 0x00200000
class MPNF:
"""Constants representing map point navigation flags.
"""
NAV_NODE_0 = 0x00000001
NAV_NODE_1 = 0x00000002
NAV_NODE_2 = 0x00000004
NAV_NODE_3 = 0x00000008
NAV_NODE_4 = 0x00000010
NAV_NODE_5 = 0x00000020
NAV_NODE_6 = 0x00000040
NAV_NODE_CUSTOM_TARGET = 0x00000080
NAV_NODE_ALL = 0x000000FF
NAV_NODE_MASK = 0x000000FF
NAV_NODE_START = 0x00000100
NAV_BASE = 0x00000200
PREFAB_EXIT = 0x00000400
class TPF:
"""Constants represetning trigger point navigation flags.
"""
MANUAL = 0x0001
SPHERE = 0x0002
PARTIAL = 0x0004
ONETIME = 0x0008
class PIF:
"""Constants for intersections flag.
"""
SIBLING_COUNT_MASK = 0x000000F0
SIBLING_COUNT_SHIFT = 4
TYPE_START = 0x00010000
TYPE_END = 0x00020000
TYPE_CROSS_SHARP = 0x00040000
class Bones:
init_scale_key = "scs_init_scale"
"""Pose bone custom property dictionary key for saving initial bone scale on PIS import."""
class ConvHlpr:
"""Conversion helper constants
"""
NoZip = "No Archive"
StoredZip = str(ZIP_STORED)
DeflatedZip = str(ZIP_DEFLATED)
Bzip2Zip = str(ZIP_BZIP2)
class SCSLigthing:
"""Constants for scs lighting.
"""
scene_name = ".scs_lighting"
"""Name of lighting scene. It should be prefixed with dot to be partially hidden in scene selection theme."""
sun_lamp_name = ".scs_sun"
"""Name of scs sun object in the lighting scene."""
default_ambient = (0.3,) * 3
default_diffuse = (0.9,) * 3
default_specular = (0.5,) * 3
default_env = 1.0
"""Default lighting values used when scs lighting is disabled, gotten from effect/eut/defaults.sii"""
class PaintjobTools:
"""Constants for paintjob tools.
"""
class VehicleTypes:
"""Vehicle types, defining where vehicle will be placed in defs and model paths.
"""
NONE = "none"
TRUCK = "truck"
TRAILER = "trailer_owned"
uvs_name_2nd = "scs_paintjob_2nd"
"""2nd uvs layer name used during unification on export"""
uvs_name_3rd = "scs_paintjob_3rd"
"""3rd uvs layer name used during unification on export."""
model_refs_to_sii = ".scs_model_refs_to_sii_files"
"""Name of the property for saving references paths to models inside a group data-block."""
export_tag_obj_name = ".scs_export_group"
"""Name of the object inside the group which visibility tells us either group should be exported or no."""
model_variant_prop = ".scs_variant"
"""Name of the property for saving variant of the model inside group encapsulating imported paintable model."""
main_coll_name = ".scs_main_collection"
"""Name of the collection where left over objects will be linked to, when importing from sii data."""
id_mask_colors = (
(51, 0, 0),
(255, 136, 0),
(217, 202, 0),
(134, 179, 140),
(0, 190, 204),
(0, 31, 115),
(117, 70, 140),
(191, 96, 147),
(242, 61, 61),
(127, 68, 0),
(102, 95, 0),
(64, 255, 140),
(0, 204, 255),
(0, 0, 51),
(41, 0, 51),
(204, 0, 82),
(204, 102, 102),
(178, 137, 89),
(173, 179, 89),
(0, 77, 41),
(0, 41, 51),
(108, 108, 217),
(230, 128, 255),
(89, 0, 36),
(230, 172, 172),
(230, 203, 172),
(100, 102, 77),
(48, 191, 124),
(0, 170, 255),
(191, 191, 255),
(83, 0, 89),
(166, 124, 141),
(140, 49, 35),
(128, 113, 96),
(57, 77, 19),
(57, 77, 68),
(64, 106, 128),
(38, 38, 51),
(217, 0, 202),
(127, 0, 34),
(255, 115, 64),
(229, 172, 57),
(234, 255, 191),
(0, 51, 34),
(0, 68, 128),
(34, 0, 255),
(64, 32, 62),
(115, 57, 65),
(76, 34, 19),
(102, 77, 26),
(133, 204, 51),
(0, 255, 238),
(0, 27, 51),
(48, 0, 179),
(255, 191, 251),
(51, 26, 29),
(191, 156, 143),
(51, 38, 13),
(68, 255, 0),
(0, 115, 107),
(153, 180, 204),
(119, 54, 217),
(153, 0, 122),
(204, 112, 51),
(51, 47, 38),
(32, 128, 45),
(143, 191, 188),
(83, 116, 166),
(119, 105, 140),
(255, 64, 166)
)
"""Array of unique colors for building ID mask texture."""
class Cache:
dir_name = "blender_scs_blender_tools"
"""Name of the directory inside tmp directory, that will be used for cache storage."""
max_size = 40 * 1024 * 1024 # 40MB
"""Maximum size of tmp directory cache."""
================================================
FILE: addon/io_scs_tools/exp/__init__.py
================================================
# ##### BEGIN GPL LICENSE BLOCK #####
#
# This program is free software; you can redistribute it and/or
# modify it under the terms of the GNU General Public License
# as published by the Free Software Foundation; either version 2
# of the License, or (at your option) any later version.
#
# This program is distributed in the hope that it will be useful,
# but WITHOUT ANY WARRANTY; without even the implied warranty of
# MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
# GNU General Public License for more details.
#
# You should have received a copy of the GNU General Public License
# along with this program; if not, write to the Free Software Foundation,
# Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301, USA.
#
# ##### END GPL LICENSE BLOCK #####
# Copyright (C) 2013-2014: SCS Software
import bpy
import os
from io_scs_tools.exp import pia
from io_scs_tools.exp import pic
from io_scs_tools.exp import pip
from io_scs_tools.exp import pis
from io_scs_tools.exp import pix
from io_scs_tools.utils import name as _name_utils
from io_scs_tools.utils import object as _object_utils
from io_scs_tools.utils import path as _path_utils
from io_scs_tools.utils import get_scs_globals as _get_scs_globals
from io_scs_tools.utils.printout import lprint
def batch_export(operator_instance, init_obj_list, name_suffix="", menu_filepath=None):
"""This function calls other sorting functions and depending on the resulting output
dictionary it exports all available 'SCS Game Objects' into specified locations.
:param operator_instance: operator from within this function is called (used for report)
:type operator_instance: bpy.types.Operator
:param init_obj_list: initial object list which should be exported
:type init_obj_list: tuple of Blender objects
:param name_suffix: files name suffix (exchange format is using .ef)
:type name_suffix: str
:param menu_filepath: filepath used from menu export
:type menu_filepath: str
"""
lprint("", report_errors=-1, report_warnings=-1) # Clear the 'error_messages' and 'warning_messages'
game_objects_dict = _object_utils.sort_out_game_objects_for_export(init_obj_list)
# exclude game objects that were manually omitted from export by property
game_objects_dict = _object_utils.exclude_switched_off(game_objects_dict)
if game_objects_dict:
scs_game_objects_exported = []
scs_game_objects_rejected = []
global_filepath = _path_utils.get_global_export_path()
for root_object in game_objects_dict:
if not _name_utils.is_valid_scs_root_object_name(root_object.name):
lprint("E Rejecting Game Object with invalid SCS Root Object name: %r.\n\t "
"Only a-z, A-Z, 0-9 and \"._-\" characters can be used." % root_object.name)
scs_game_objects_rejected.append("> \"" + root_object.name + "\"")
continue
game_object_list = game_objects_dict[root_object]
if len(game_object_list) == 0:
lprint("E Rejecting empty Game Object with SCS Root Object name: %r\n\t " +
"Game Object has to have at least one mesh object or model locator!",
(root_object.name,))
scs_game_objects_rejected.append("> \"" + root_object.name + "\"")
continue
# GET CUSTOM FILE PATH
custom_filepath = _path_utils.get_custom_scs_root_export_path(root_object)
# MAKE FINAL FILEPATH
if menu_filepath:
filepath = _path_utils.readable_norm(menu_filepath)
filepath_message = "Export path selected in file browser:\n\t \"" + filepath + "\""
elif custom_filepath:
filepath = _path_utils.readable_norm(custom_filepath)
filepath_message = "Custom export path used for \"" + root_object.name + "\" is:\n\t \"" + filepath + "\""
else:
filepath = _path_utils.readable_norm(global_filepath)
filepath_message = "Default export path used for \"" + root_object.name + "\":\n\t \"" + filepath + "\""
scs_project_path = _path_utils.readable_norm(_get_scs_globals().scs_project_path)
if os.path.isdir(filepath) and _path_utils.startswith(filepath, scs_project_path) and scs_project_path != "":
# EXPORT ENTRY POINT
export_success = pix.export(filepath, name_suffix, root_object, game_object_list)
if export_success:
scs_game_objects_exported.append("> \"" + root_object.name + "\" exported to: '" + filepath + "'")
else:
scs_game_objects_rejected.append("> \"" + root_object.name + "\"")
else:
if filepath:
message = (
"No valid export path found!\n\t " +
"Export path does not exists or it's not inside SCS Project Base Path.\n\t " +
"SCS Project Base Path:\n\t \"" + scs_project_path + "\"\n\t " +
filepath_message
)
else:
message = "No valid export path found! Please check 'SCS Project Base Path' first."
lprint('E ' + message)
operator_instance.report({'ERROR'}, message.replace("\t", "").replace(" ", ""))
return {'CANCELLED'}
if not lprint("\nI Export procces completed, summaries are printed below!", report_errors=True, report_warnings=True):
operator_instance.report({'INFO'}, "Export successfully completed, exported %s game object(s)!" % len(scs_game_objects_exported))
bpy.ops.wm.scs_tools_show_3dview_report('INVOKE_DEFAULT', abort=True) # abort 3d view reporting operator
if len(scs_game_objects_exported) > 0:
message = "EXPORTED GAME OBJECTS (" + str(len(scs_game_objects_exported)) + "):\n\t " + "=" * 26 + "\n\t "
for scs_game_object_export_message in scs_game_objects_exported:
message += scs_game_object_export_message + "\n\t "
message += "=" * 26
lprint("I " + message)
if len(scs_game_objects_rejected) > 0:
message = "REJECTED GAME OBJECTS (" + str(len(scs_game_objects_rejected)) + "):\n\t " + "=" * 26 + "\n\t "
for scs_game_object_export_message in scs_game_objects_rejected:
message += scs_game_object_export_message + "\n\t "
message += "=" * 26
lprint("I " + message)
if len(scs_game_objects_exported) + len(scs_game_objects_rejected) == 0:
message = "Nothing to export! Please setup at least one SCS Root Object."
lprint('E ' + message)
operator_instance.report({'ERROR'}, message)
return {'CANCELLED'}
else:
message = "No Game Objects to export because:\n\t " \
"1. Selection export is used and none of selected objects belongs to any SCS Game Object or\n\t " \
"2. all of the SCS Root Objects were manually exluded from export or\n\t " \
"3. there is no SCS Root Objects in the scene."
lprint('E ' + message)
operator_instance.report({'ERROR'}, message.replace("\n\t ", "\n"))
return {'CANCELLED'}
return {'FINISHED'}
================================================
FILE: addon/io_scs_tools/exp/pia.py
================================================
# ##### BEGIN GPL LICENSE BLOCK #####
#
# This program is free software; you can redistribute it and/or
# modify it under the terms of the GNU General Public License
# as published by the Free Software Foundation; either version 2
# of the License, or (at your option) any later version.
#
# This program is distributed in the hope that it will be useful,
# but WITHOUT ANY WARRANTY; without even the implied warranty of
# MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
# GNU General Public License for more details.
#
# You should have received a copy of the GNU General Public License
# along with this program; if not, write to the Free Software Foundation,
# Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301, USA.
#
# ##### END GPL LICENSE BLOCK #####
# Copyright (C) 2013-2014: SCS Software
import os
import bpy
from collections import OrderedDict
from mathutils import Vector, Matrix, Euler, Quaternion
from io_scs_tools.utils import convert as _convert_utils
from io_scs_tools.utils import get_scs_globals as _get_scs_globals
from io_scs_tools.utils.info import get_combined_ver_str
from io_scs_tools.utils.printout import lprint
from io_scs_tools.internals.structure import SectionData as _SectionData
from io_scs_tools.internals.containers import pix as _pix_container
def _get_custom_channels(scs_animation, action):
custom_channels = []
frame_start = scs_animation.anim_start
frame_end = scs_animation.anim_end
anim_export_step = action.scs_props.anim_export_step
total_frames = (frame_end - frame_start) / anim_export_step
loc_curves = {} # dictionary for storing "location" curves of action
# get curves which are related to moving of armature object
for fcurve in action.fcurves:
if fcurve.data_path == 'location':
loc_curves[fcurve.array_index] = fcurve
# write custom channel only if location curves were found
if len(loc_curves) > 0:
# GO THOUGH FRAMES
actual_frame = frame_start
previous_frame_value = None
timings_stream = []
movement_stream = []
while actual_frame <= frame_end:
location = Vector()
# LOCATION MATRIX
if len(loc_curves) > 0:
for index in range(3):
if index in loc_curves:
location[index] = loc_curves[index].evaluate(actual_frame)
# COMPUTE SCS FRAME LOCATION
frame_loc = _convert_utils.convert_location_to_scs(location)
if previous_frame_value is None:
previous_frame_value = frame_loc
frame_movement = frame_loc - previous_frame_value
previous_frame_value = frame_loc
lprint('S actual_frame: %s - value: %s', (actual_frame, frame_loc))
timings_stream.append(("__time__", scs_animation.length / total_frames), )
movement_stream.append(frame_movement)
actual_frame += anim_export_step
anim_timing = ("_TIME", timings_stream)
anim_movement = ("_MOVEMENT", movement_stream)
bone_anim = (anim_timing, anim_movement)
bone_data = ("Prism Movement", bone_anim)
custom_channels.append(bone_data)
return custom_channels
def _get_bone_channels(scs_root_obj, armature, scs_animation, action, export_scale):
"""Takes armature and action and returns bone channels.
bone_channels structure example:
[("Bone", [("_TIME", [0.1, 0.1, 0.1, 0.1, 0.1, 0.1, 0.1, 0.1, 0.1, 0.1, 0.1, 0.1]), ("_MATRIX", [])])]"""
bone_channels = []
frame_start = scs_animation.anim_start
frame_end = scs_animation.anim_end
anim_export_step = action.scs_props.anim_export_step
total_frames = (frame_end - frame_start) / anim_export_step
# armature matrix stores transformation of armature object against scs root
# and has to be added to all bones as they only armature space transformations
armature_mat = scs_root_obj.matrix_world.inverted() @ armature.matrix_world
invalid_data = False # flag to indicate invalid data state
curves_per_bone = OrderedDict() # store all the curves we are interested in per bone names
for bone in armature.data.bones:
for fcurve in action.fcurves:
# check if curve belongs to bone
if '["' + bone.name + '"]' in fcurve.data_path:
data_path = fcurve.data_path
array_index = fcurve.array_index
if data_path.endswith("location"):
curve_type = "location"
elif data_path.endswith("rotation_euler"):
curve_type = "euler_rotation"
elif data_path.endswith("rotation_quaternion"):
curve_type = "quat_rotation"
elif data_path.endswith("scale"):
curve_type = "scale"
else:
curve_type = None
# write only recognized curves
if curve_type is not None:
if bone.name not in curves_per_bone:
curves_per_bone[bone.name] = {
"location": {},
"euler_rotation": {},
"quat_rotation": {},
"scale": {}
}
curves_per_bone[bone.name][curve_type][array_index] = fcurve
for bone_name, bone_curves in curves_per_bone.items():
bone = armature.data.bones[bone_name]
pose_bone = armature.pose.bones[bone_name]
loc_curves = bone_curves["location"]
euler_rot_curves = bone_curves["euler_rotation"]
quat_rot_curves = bone_curves["quat_rotation"]
sca_curves = bone_curves["scale"]
bone_rest_mat = armature_mat @ bone.matrix_local
if bone.parent:
parent_bone_rest_mat = (Matrix.Scale(export_scale, 4) @
_convert_utils.scs_to_blend_matrix().inverted() @
armature_mat @
bone.parent.matrix_local)
else:
parent_bone_rest_mat = Matrix()
# GO THOUGH FRAMES
actual_frame = frame_start
timings_stream = []
matrices_stream = []
while actual_frame <= frame_end:
mat_loc = Matrix()
mat_rot = Matrix()
mat_sca = Matrix()
# LOCATION MATRIX
if len(loc_curves) > 0:
location = Vector()
for index in range(3):
if index in loc_curves:
location[index] = loc_curves[index].evaluate(actual_frame)
mat_loc = Matrix.Translation(location)
# ROTATION MATRIX
if len(euler_rot_curves) > 0 and pose_bone.rotation_mode != 'QUATERNION':
rotation = Euler()
for index in range(3):
if index in euler_rot_curves:
rotation[index] = euler_rot_curves[index].evaluate(actual_frame)
mat_rot = Euler(rotation, pose_bone.rotation_mode).to_matrix().to_4x4() # calc rotation by pose rotation mode
elif len(quat_rot_curves) > 0 and pose_bone.rotation_mode == 'QUATERNION':
rotation = Quaternion()
for index in range(4):
if index in quat_rot_curves:
rotation[index] = quat_rot_curves[index].evaluate(actual_frame)
mat_rot = rotation.to_matrix().to_4x4()
else:
if len(euler_rot_curves) > 0 and pose_bone.rotation_mode == 'QUATERNION':
lprint("W Rotation mode of bone %r from scs animation %r is desycned with it's stored keyframes mode\n\t "
"(keyframes are stored in Eulers but bone pose rotation mode is set to Quaternions), "
"no rotation will be stored for this bone!",
(bone_name, scs_animation.name))
elif len(quat_rot_curves) > 0 and pose_bone.rotation_mode != 'QUATERNION':
lprint("W Rotation mode of bone %r from scs animation %r is desycned with it's stored keyframes mode\n\t "
"(keyframes are stored in Eulers but bone pose rotation mode is set to Quaternions), "
"no rotation will be stored for this bone!",
(bone_name, scs_animation.name))
# SCALE MATRIX
if len(sca_curves) > 0:
scale = Vector((1.0, 1.0, 1.0))
for index in range(3):
if index in sca_curves:
scale[index] = sca_curves[index].evaluate(actual_frame)
if scale[index] < 0:
lprint(str("E Negative scale detected on bone %r:\n\t "
"(Action: %r, keyframe no.: %s, SCS Animation: %r)."),
(bone_name, action.name, actual_frame, scs_animation.name))
invalid_data = True
mat_sca = Matrix()
mat_sca[0] = (scale[0], 0, 0, 0)
mat_sca[1] = (0, scale[1], 0, 0)
mat_sca[2] = (0, 0, scale[2], 0)
mat_sca[3] = (0, 0, 0, 1)
# BLENDER FRAME MATRIX
mat = mat_loc @ mat_rot @ mat_sca
# SCALE REMOVAL MATRIX
rest_location, rest_rotation, rest_scale = bone_rest_mat.decompose()
# print(' BONES rest_scale: %s' % str(rest_scale))
rest_scale = rest_scale * export_scale
scale_removal_matrix = Matrix()
scale_removal_matrix[0] = (1.0 / rest_scale[0], 0, 0, 0)
scale_removal_matrix[1] = (0, 1.0 / rest_scale[1], 0, 0)
scale_removal_matrix[2] = (0, 0, 1.0 / rest_scale[2], 0)
scale_removal_matrix[3] = (0, 0, 0, 1)
# SCALE MATRIX
scale_matrix = Matrix.Scale(export_scale, 4)
# COMPUTE SCS FRAME MATRIX
frame_matrix = (parent_bone_rest_mat.inverted() @
_convert_utils.scs_to_blend_matrix().inverted() @
scale_matrix.inverted() @
bone_rest_mat @
mat @
scale_removal_matrix.inverted())
# print(' actual_frame: %s - value: %s' % (actual_frame, frame_matrix))
timings_stream.append(("__time__", scs_animation.length / total_frames), )
matrices_stream.append(("__matrix__", frame_matrix.transposed()), )
actual_frame += anim_export_step
anim_timing = ("_TIME", timings_stream)
anim_matrices = ("_MATRIX", matrices_stream)
bone_anim = (anim_timing, anim_matrices)
bone_data = (bone_name, bone_anim)
bone_channels.append(bone_data)
# return empty bone channels if data are invalid
if invalid_data:
return []
return bone_channels
def _fill_header_section(anim_name, sign_export):
"""Fills up "Header" section."""
section = _SectionData("Header")
section.props.append(("FormatVersion", 3))
section.props.append(("Source", get_combined_ver_str()))
section.props.append(("Type", "Animation"))
section.props.append(("Name", anim_name))
if sign_export:
section.props.append(("SourceFilename", str(bpy.data.filepath)))
author = bpy.context.user_preferences.system.author
if author:
section.props.append(("Author", str(author)))
return section
def _fill_global_section(skeleton_file, total_time, bone_channel_cnt, custom_channel_cnt):
"""Fills up "Global" section."""
section = _SectionData("Global")
section.props.append(("Skeleton", skeleton_file.replace("\\", "/")))
section.props.append(("TotalTime", total_time))
# section.props.append(("#", "...in seconds"))
section.props.append(("BoneChannelCount", bone_channel_cnt))
section.props.append(("CustomChannelCount", custom_channel_cnt))
return section
def _fill_channel_sections(data_list, channel_type="BoneChannel"):
"""Fills up Channel sections."""
sections = []
for item_i, item in enumerate(data_list):
section = _SectionData(channel_type)
section.props.append(("Name", item[0]))
section.props.append(("StreamCount", len(item[1])))
section.props.append(("KeyframeCount", len(item[1][0][1])))
for stream in item[1]:
# print(' stream[0]: %s\n stream[1]: %s' % (str(stream[0]), str(stream[1])))
section.sections.append(_pix_container.make_stream_section(stream[1], stream[0], ()))
sections.append(section)
return sections
def export(scs_root_obj, armature, scs_animation, dirpath, name_suffix, skeleton_filepath):
"""Exports PIA animation
:param scs_root_obj: root object of current animation
:type scs_root_obj: bpy.types.Object
:param armature: armature object of current animation
:type armature: bpy.types.Object
:param scs_animation: animation which should get exported
:type scs_animation: io_scs_tools.properties.object.ObjectAnimationInventoryItem
:param dirpath: path to export
:type dirpath: str
:param name_suffix: file name suffix
:type name_suffix: str
:param skeleton_filepath: name of skeleton file that this animation works on
:type skeleton_filepath: str
"""
# safety checks
if scs_animation.action not in bpy.data.actions:
lprint(str("E Action %r requested by %r animation doesn't exists. Animation won't be exported!\n\t "
"Make sure proper action is assigned to SCS Animation."),
(scs_animation.action, scs_animation.name))
return False
scs_globals = _get_scs_globals()
print("\n************************************")
print("** SCS PIA Exporter **")
print("** (c)2014 SCS Software **")
print("************************************\n")
# DATA GATHERING
total_time = scs_animation.length
action = bpy.data.actions[scs_animation.action]
bone_channels = _get_bone_channels(scs_root_obj, armature, scs_animation, action, scs_globals.export_scale)
custom_channels = _get_custom_channels(scs_animation, action)
# DATA CREATION
header_section = _fill_header_section(scs_animation.name, scs_globals.export_write_signature)
custom_channel_sections = _fill_channel_sections(custom_channels, "CustomChannel")
bone_channel_sections = _fill_channel_sections(bone_channels, "BoneChannel")
global_section = _fill_global_section(skeleton_filepath, total_time, len(bone_channels), len(custom_channels))
# post creation safety checks
if len(bone_channels) + len(custom_channels) == 0:
lprint(str("E PIA file won't be exported, as SCS Animation %r\n\t "
"doesn't effect armature or it's bones or data are invalid."),
(scs_animation.name,))
return False
# DATA ASSEMBLING
pia_container = [header_section, global_section]
for section in custom_channel_sections:
pia_container.append(section)
for section in bone_channel_sections:
pia_container.append(section)
# FILE EXPORT
ind = " "
filepath = os.path.join(dirpath, scs_animation.name + ".pia" + name_suffix)
# print("************************************")
return _pix_container.write_data_to_file(pia_container, filepath, ind)
================================================
FILE: addon/io_scs_tools/exp/pic.py
================================================
# ##### BEGIN GPL LICENSE BLOCK #####
#
# This program is free software; you can redistribute it and/or
# modify it under the terms of the GNU General Public License
# as published by the Free Software Foundation; either version 2
# of the License, or (at your option) any later version.
#
# This program is distributed in the hope that it will be useful,
# but WITHOUT ANY WARRANTY; without even the implied warranty of
# MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
# GNU General Public License for more details.
#
# You should have received a copy of the GNU General Public License
# along with this program; if not, write to the Free Software Foundation,
# Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301, USA.
#
# ##### END GPL LICENSE BLOCK #####
# Copyright (C) 2013-2014: SCS Software
import bpy
from mathutils import Vector, Matrix
from io_scs_tools.internals.structure import SectionData as _SectionData
from io_scs_tools.internals.containers import pix as _pix_container
from io_scs_tools.utils import convert as _convert_utils
from io_scs_tools.utils import name as _name_utils
from io_scs_tools.utils import mesh as _mesh_utils
from io_scs_tools.utils import get_scs_globals as _get_scs_globals
from io_scs_tools.utils.info import get_combined_ver_str
from io_scs_tools.utils.object import get_scs_root as _get_scs_root
def _fill_header_section(file_name, sign_export):
"""Fills up "Header" section."""
section = _SectionData("Header")
section.props.append(("FormatVersion", 2))
section.props.append(("Source", get_combined_ver_str()))
section.props.append(("Type", "Collision"))
# section.props.append(("Name", str(os.path.basename(bpy.data.filepath)[:-6])))
section.props.append(("Name", file_name))
if sign_export:
section.props.append(("SourceFilename", str(bpy.data.filepath)))
author = bpy.context.user_preferences.system.author
if author:
section.props.append(("Author", str(author)))
return section
def _fill_global_section(vertices, triangles, materials, pieces, parts, locators):
"""Fills up "Global" section."""
section = _SectionData("Global")
section.props.append(("VertexCount", vertices))
section.props.append(("TriangleCount", triangles))
section.props.append(("MaterialCount", materials))
section.props.append(("PieceCount", pieces))
section.props.append(("PartCount", parts))
section.props.append(("LocatorCount", locators))
return section
def _fill_coll_material_section():
"""Fills up "Material" section for convex colliders."""
section = _SectionData("Material")
section.props.append(("Alias", "convex")) # Static value
section.props.append(("Effect", "dry.void")) # Static value
return section
def _fill_piece_sections(convex_coll_locators, export_scale):
"""Fills up "Piece" sections for convex colliders."""
len_vertices = 0
len_faces = 0
piece_sections = []
index = 0
for item in convex_coll_locators:
stream_cnt = 0
verts = item.scs_props.get("coll_convex_verts", 0)
faces = item.scs_props.get("coll_convex_faces", 0)
if verts:
stream_cnt += 1
len_vertices += len(verts)
len_faces += len(faces)
section = _SectionData("Piece")
section.props.append(("Index", index))
section.props.append(("Material", 0))
section.props.append(("VertexCount", len(verts)))
section.props.append(("TriangleCount", len(faces)))
section.props.append(("StreamCount", stream_cnt))
section.props.append(("", ""))
# VERTICES
if verts:
vector_verts = []
for vert in verts:
# scs_position = Matrix.Scale(scs_globals.export_scale, 4) * io_utils.scs_to_blend_matrix().inverted() * mat_world * position ##
# POSITION
scs_position = Matrix.Scale(export_scale, 4) @ _convert_utils.scs_to_blend_matrix().inverted() @ Vector(vert) # POSITION
vector_verts.append(Vector(scs_position))
section.sections.append(_pix_container.make_stream_section(vector_verts, "_POSITION", ()))
# FACES (TRIANGLES)
if faces:
# FACE FLIPPING
flipped_faces = _mesh_utils.flip_faceverts(faces)
section.sections.append(_pix_container.make_triangle_stream(flipped_faces))
index += 1
piece_sections.append(section)
return len_vertices, len_faces, piece_sections
def _fill_part_sections(locator_list, used_parts):
"""Fills up "Parts" sections.
:param locator_list: list of Blender Objects - only 'Empty' typs, set as 'SCS Model Locators'
:type locator_list: list
:param used_parts: parts transitional structure for storing used parts inside this PIC export
:type used_parts: io_scs_tools.exp.transition_structs.parts.PartsTrans
:return: list of 'part_sections'
:rtype: list
"""
locator_parts = {}
for locator_i, locator in enumerate(locator_list):
scs_part = used_parts.ensure_part(locator)
if scs_part not in locator_parts:
locator_parts[scs_part] = [locator_i]
else:
locator_parts[scs_part].append(locator_i)
# PART SECTIONS
ordered_part_sections = []
for part_name in used_parts.get_as_list():
locator_count = 0
pieces = None # just make zero pieces as we are not using that in PIC
piece_count = 0
# LOCATOR COUNT
if part_name in locator_parts:
locator_count = len(locator_parts[part_name])
# LOCATORS
locators = None
if part_name in locator_parts:
if locator_parts[part_name]:
locators = locator_parts[part_name]
# MAKE SECTION
part_section = _SectionData("Part")
part_section.props.append(("Name", part_name))
part_section.props.append(("PieceCount", piece_count))
part_section.props.append(("LocatorCount", locator_count))
part_section.props.append(("Pieces", pieces))
part_section.props.append(("Locators", locators))
ordered_part_sections.append(part_section)
return ordered_part_sections
def _make_common_part(item, index, col_type):
scs_root = _get_scs_root(item)
if not item.scs_props.locator_collider_centered:
if item.scs_props.locator_collider_type == 'Box':
offset_matrix = (item.matrix_world @
Matrix.Translation((0.0, -item.scs_props.locator_collider_box_y / 2, 0.0)) @
(Matrix.Scale(item.scs_props.locator_collider_box_x, 4, (1.0, 0.0, 0.0)) @
Matrix.Scale(item.scs_props.locator_collider_box_y, 4, (0.0, 1.0, 0.0)) @
Matrix.Scale(item.scs_props.locator_collider_box_z, 4, (0.0, 0.0, 1.0))))
elif item.scs_props.locator_collider_type == 'Sphere':
offset_matrix = (item.matrix_world @
Matrix.Translation((0.0, -item.scs_props.locator_collider_dia / 2, 0.0)) @
Matrix.Scale(item.scs_props.locator_collider_dia, 4))
elif item.scs_props.locator_collider_type in ('Capsule', 'Cylinder'):
offset_matrix = (item.matrix_world @
Matrix.Translation((0.0, -item.scs_props.locator_collider_len / 2, 0.0)) @
Matrix.Scale(item.scs_props.locator_collider_dia, 4))
else:
offset_matrix = item.matrix_world
loc, qua, sca = _convert_utils.get_scs_transformation_components(scs_root.matrix_world.inverted() @ offset_matrix)
else:
loc, qua, sca = _convert_utils.get_scs_transformation_components(scs_root.matrix_world.inverted() @ item.matrix_world)
section = _SectionData("Locator")
section.props.append(("Name", _name_utils.tokenize_name(item.name)))
section.props.append(("Index", index))
section.props.append(("Position", ["&&", loc]))
section.props.append(("Rotation", ["&&", qua]))
section.props.append(("Alias", ""))
section.props.append(("Weight", ["&", (item.scs_props.locator_collider_mass,)]))
section.props.append(("Type", col_type))
return section
def _fill_collision_locator_sections(collision_locator_list):
"""Fills up "Locator" sections."""
collision_locator_sections = []
piece_index = 0
for item_i, item in enumerate(collision_locator_list):
loc_type = item.scs_props.locator_collider_type
section = _make_common_part(item, item_i, loc_type)
if loc_type == "Box":
# dimX dimY dimZ
section.props.append(("Parameters", ["&&", (
item.scs_props.locator_collider_box_x, item.scs_props.locator_collider_box_z, item.scs_props.locator_collider_box_y, 0.0)]))
elif loc_type == "Sphere":
# radius
section.props.append(("Parameters", ["&&", (item.scs_props.locator_collider_dia / 2, 0.0, 0.0, 0.0)]))
elif loc_type == "Capsule":
# radius length
section.props.append(("Parameters", ["&&", (item.scs_props.locator_collider_dia / 2, item.scs_props.locator_collider_len, 0.0, 0.0)]))
elif loc_type == "Cylinder":
# radius length
section.props.append(("Parameters", ["&&", (item.scs_props.locator_collider_dia / 2, item.scs_props.locator_collider_len, 0.0, 0.0)]))
elif loc_type == "Convex":
section.props.append(("ConvexPiece", piece_index))
piece_index += 1
collision_locator_sections.append(section)
return collision_locator_sections
def _sort_collision_locators(collision_locator_list):
box_coll_locators = {}
sphere_coll_locators = {}
capsule_coll_locators = {}
cylinder_coll_locators = {}
convex_coll_locators = {}
for item_i, item in enumerate(collision_locator_list):
if item.scs_props.locator_collider_type == 'Box':
box_coll_locators[item_i] = item
if item.scs_props.locator_collider_type == 'Sphere':
sphere_coll_locators[item_i] = item
if item.scs_props.locator_collider_type == 'Capsule':
capsule_coll_locators[item_i] = item
if item.scs_props.locator_collider_type == 'Cylinder':
cylinder_coll_locators[item_i] = item
if item.scs_props.locator_collider_type == 'Convex':
convex_coll_locators[item_i] = item
return box_coll_locators, sphere_coll_locators, capsule_coll_locators, cylinder_coll_locators, convex_coll_locators
def export(collision_locator_list, filepath, name_suffix, filename, used_parts):
"""Exports PIC colliders
:param collision_locator_list:
:type collision_locator_list:
:param filepath:
:type filepath:
:param name_suffix: file name suffix
:type name_suffix: str
:param filename:
:type filename:
:param used_parts: parts transitional structure for storing used parts inside this PIC export
:type used_parts: io_scs_tools.exp.transition_structs.parts.PartsTrans
"""
scs_globals = _get_scs_globals()
print("\n************************************")
print("** SCS PIC Exporter **")
print("** (c)2014 SCS Software **")
print("************************************\n")
# DATA CREATION
header_section = _fill_header_section(filename, scs_globals.export_write_signature)
piece_sections = []
materials = 0
len_vertices = 0
len_faces = 0
convex_coll_locators = [loc for loc in collision_locator_list if loc.scs_props.locator_collider_type == "Convex"]
if convex_coll_locators:
len_vertices, len_faces, piece_sections = _fill_piece_sections(convex_coll_locators, scs_globals.export_scale)
materials += 1
part_sections = _fill_part_sections(collision_locator_list, used_parts)
collision_locator_sections = _fill_collision_locator_sections(collision_locator_list)
global_section = _fill_global_section(len_vertices, len_faces, materials,
len(piece_sections), used_parts.count(), len(collision_locator_sections))
# DATA ASSEMBLING
pic_container = [header_section, global_section]
if convex_coll_locators:
material_section = _fill_coll_material_section()
pic_container.append(material_section)
if piece_sections:
for section in piece_sections:
pic_container.append(section)
for section in part_sections:
pic_container.append(section)
for section in collision_locator_sections:
pic_container.append(section)
# print(' pic_container:\n%s' % str(pic_container))
# FILE EXPORT
ind = " "
pic_filepath = str(filepath + ".pic" + name_suffix)
result = _pix_container.write_data_to_file(pic_container, pic_filepath, ind)
# print("************************************")
return result
================================================
FILE: addon/io_scs_tools/exp/pim/bones.py
================================================
# ##### BEGIN GPL LICENSE BLOCK #####
#
# This program is free software; you can redistribute it and/or
# modify it under the terms of the GNU General Public License
# as published by the Free Software Foundation; either version 2
# of the License, or (at your option) any later version.
#
# This program is distributed in the hope that it will be useful,
# but WITHOUT ANY WARRANTY; without even the implied warranty of
# MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
# GNU General Public License for more details.
#
# You should have received a copy of the GNU General Public License
# along with this program; if not, write to the Free Software Foundation,
# Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301, USA.
#
# ##### END GPL LICENSE BLOCK #####
# Copyright (C) 2013-2015: SCS Software
from collections import OrderedDict
from io_scs_tools.internals.structure import SectionData as _SectionData
class Bones:
__bones = OrderedDict() # list of all bone names used in game object ( order should be the same as in PIS file )
__global_bones_counter = 0
@staticmethod
def reset_counter():
Bones.__global_bones_counter = 0
@staticmethod
def get_global_bones_count():
return Bones.__global_bones_counter
def __init__(self):
"""Initalize new bones instance for PIM file.
"""
self.__bones = OrderedDict()
def add_bone(self, bone_name):
"""Adds bone name to bone list.
WARNING: if bone with the names is already on the list it won't be added
:param bone_name:
:type bone_name:
:return: True if bone was successfully added to list; False otherwise
:rtype: bool
"""
if bone_name not in self.__bones:
self.__bones[bone_name] = len(self.__bones)
Bones.__global_bones_counter += 1
return True
return False
def get_bone_index(self, bone_name):
"""Gets bone index by bone name.
NOTE: This shall be used when reading vertex groups weights for vertex.
:param bone_name: name of the bone for which index should be returned
:type bone_name: str
:return: index of the bone; if not found -1 is returned
:rtype: int
"""
if bone_name not in self.__bones:
return -1
return self.__bones[bone_name]
def get_as_section(self):
"""Gets bones information represented with SectionData structure class.
:return: packed bones names as section data
:rtype: io_scs_tools.internals.structure.SectionData
"""
section = _SectionData("Bones")
for bone_name in self.__bones.keys():
section.data.append(("__string__", bone_name))
return section
================================================
FILE: addon/io_scs_tools/exp/pim/exporter.py
================================================
# ##### BEGIN GPL LICENSE BLOCK #####
#
# This program is free software; you can redistribute it and/or
# modify it under the terms of the GNU General Public License
# as published by the Free Software Foundation; either version 2
# of the License, or (at your option) any later version.
#
# This program is distributed in the hope that it will be useful,
# but WITHOUT ANY WARRANTY; without even the implied warranty of
# MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
# GNU General Public License for more details.
#
# You should have received a copy of the GNU General Public License
# along with this program; if not, write to the Free Software Foundation,
# Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301, USA.
#
# ##### END GPL LICENSE BLOCK #####
# Copyright (C) 2013-2022: SCS Software
import os
import collections
from re import match
from mathutils import Matrix, Vector, Color
from io_scs_tools.consts import Mesh as _MESH_consts
from io_scs_tools.consts import Operators as _OP_consts
from io_scs_tools.consts import PrefabLocators as _PL_consts
from io_scs_tools.exp.pim.header import Header
from io_scs_tools.exp.pim.globall import Globall
from io_scs_tools.exp.pim.material import Material
from io_scs_tools.exp.pim.piece import Piece
from io_scs_tools.exp.pim.part import Part
from io_scs_tools.exp.pim.locator import Locator
from io_scs_tools.exp.pim.bones import Bones
from io_scs_tools.exp.pim.piece_skin import PieceSkin
from io_scs_tools.exp.pim.piece_skin import PieceSkinStream
from io_scs_tools.internals.containers import pix as _pix_container
from io_scs_tools.utils import mesh as _mesh_utils
from io_scs_tools.utils import name as _name_utils
from io_scs_tools.utils import object as _object_utils
from io_scs_tools.utils import get_scs_globals as _get_scs_globals
from io_scs_tools.utils.convert import change_to_scs_uv_coordinates as _change_to_scs_uv_coordinates
from io_scs_tools.utils.convert import get_scs_transformation_components as _get_scs_transformation_components
from io_scs_tools.utils.convert import scs_to_blend_matrix as _scs_to_blend_matrix
from io_scs_tools.utils.convert import hookup_name_to_hookup_id as _hookup_name_to_hookup_id
from io_scs_tools.utils.printout import lprint
_ZERO_NORMAL = Vector.Fill(3)
""":type: Vector"""
def execute(dirpath, name_suffix, root_object, armature_object, skeleton_filepath, mesh_objects, model_locators,
used_parts, used_materials, used_bones, used_terrain_points):
"""Executes export of PIM file for given data.
:param dirpath: directory path for PIM file
:type dirpath: str
:param name_suffix: file name suffix
:type name_suffix: str
:param root_object: Blender SCS Root empty object
:type root_object: bpy.types.Object
:param armature_object: Blender Aramture object belonging to this SCS game object
:type armature_object: bpy.types.Object
:param skeleton_filepath: relative file path of PIS file
:type skeleton_filepath: str
:param mesh_objects: all the meshes which should be exported for current game object
:type mesh_objects: list of bpy.types.Object
:param model_locators: all Blender empty objecs which represents model locators and should be exported for current game object
:type model_locators: list of bpy.types.Object
:param used_parts: parts transitional structure for storing used parts inside this PIM export
:type used_parts: io_scs_tools.exp.transition_structs.parts.PartsTrans
:param used_materials: materials transitional structure for storing used materials inside this PIM export
:type used_materials: io_scs_tools.exp.transition_structs.materials.MaterialsTrans
:param used_bones: bones transitional structure for storing used bones inside this PIM export
:type used_bones: io_scs_tools.exp.transition_structs.bones.BonesTrans
:param used_terrain_points: terrain points transitional structure for storing used terrain points
:type used_terrain_points: io_scs_tools.exp.transition_structs.terrain_points.TerrainPntsTrans
:return: True if export was successfull; False otherwise
:rtype: bool
"""
print("\n************************************")
print("** SCS PIM Exporter **")
print("** (c)2017 SCS Software **")
print("************************************\n")
scs_globals = _get_scs_globals()
format_version = 5
is_skin_used = (armature_object and root_object.scs_props.scs_root_animated == "anim")
pim_header = Header("", format_version, root_object.name)
pim_global = Globall(used_parts.count(), skeleton_filepath)
pim_materials = collections.OrderedDict() # dict of Material class instances representing used materials
""":type: dict[str, Material]"""
pim_pieces = [] # list of Piece class instances representing mesh pieces
""":type: list[Piece]"""
pim_parts = {} # list of Part class instances representing used parts
""":type: dict[str, Part]"""
pim_locators = [] # list of Locator class instances representing model locators
""":type: list[Locator]"""
pim_piece_skins = collections.OrderedDict()
""":type: dict[str, PieceSkin"""
objects_with_default_material = {} # stores object names which has no material set
missing_mappings_data = {} # indicates if material doesn't have set any uv layer for export
invalid_objects_for_tangents = set() # stores object names which tangents calculation failed because of N-gons existence
bones = None
if is_skin_used:
invalid_bone_names = set() # set for saving bones with invalid names, they are used for reporting to user
# create bones data section
bones = Bones()
for bone in armature_object.data.bones:
bones.add_bone(bone.name)
used_bones.add(bone.name)
# do bones name checks
if _name_utils.tokenize_name(bone.name) != bone.name:
invalid_bone_names.add(bone.name)
# report invalid bone names
if len(invalid_bone_names) > 0:
lprint("W Invalid bone names detected, max. length of valid bone name is 12 and must consists from [a-z, 0-9 and _ ] characters.\n\t "
"Conversion will generalize names, however expect problems by re-import! List of invalid bone names for %r:\n\t "
"%r",
(armature_object.name, list(invalid_bone_names)))
mesh_pieces = collections.OrderedDict()
""":type: dict[str, Piece]"""
# create mesh object data sections
mesh_objects_count = len(mesh_objects)
for mesh_i, mesh_obj in enumerate(mesh_objects):
if mesh_obj.mode != 'OBJECT':
lprint("W Invalid object mode detected on: %r, skipping it on export!", (mesh_obj.name,))
continue
lprint("I Preparing mesh object: %r - %i/%i (%i%%) ...",
(mesh_obj.name, mesh_i + 1, mesh_objects_count, ((mesh_i + 1) / mesh_objects_count * 100)),
immediate_timeout=2.5)
# create part if it doesn't exists yet
part_name = used_parts.ensure_part(mesh_obj)
if part_name not in pim_parts:
pim_parts[part_name] = Part(part_name)
vert_groups = mesh_obj.vertex_groups
# calculate faces flip state from all ancestors of current object
scale_sign = 1
parent = mesh_obj
while parent and parent.scs_props.empty_object_type != "SCS_Root":
for scale_axis in parent.scale:
scale_sign *= scale_axis
for scale_axis in parent.delta_scale:
scale_sign *= scale_axis
parent = parent.parent
face_flip = scale_sign < 0
# calculate transformation matrix for current object (root object transforms are always subtracted!)
mesh_transf_mat = root_object.matrix_world.inverted() @ mesh_obj.matrix_world
""":type: mathutils.Matrix"""
# calculate vertex position transformation matrix for this object
pos_transf_mat = Matrix.Scale(scs_globals.export_scale, 4) @ _scs_to_blend_matrix().inverted()
""":type: mathutils.Matrix"""
# calculate vertex normals transformation matrix for this object
# NOTE: as normals will be read from none export prepared mesh we have to add rotation and scale from mesh transformation matrix
_, rot, scale = mesh_transf_mat.decompose()
scale_matrix_x = Matrix.Scale(scale.x, 3, Vector((1, 0, 0))).to_4x4()
scale_matrix_y = Matrix.Scale(scale.y, 3, Vector((0, 1, 0))).to_4x4()
scale_matrix_z = Matrix.Scale(scale.z, 3, Vector((0, 0, 1))).to_4x4()
nor_transf_mat = _scs_to_blend_matrix().inverted() @ rot.to_matrix().to_4x4() @ scale_matrix_x @ scale_matrix_y @ scale_matrix_z
""":type: mathutils.Matrix"""
tangent_transf_mat = _scs_to_blend_matrix().inverted()
""":type: mathutils.Matrix"""
# get initial mesh & extra copy of the mesh for normals
mesh = _object_utils.get_mesh(mesh_obj)
mesh_for_normals = _mesh_utils.get_mesh_for_normals(mesh)
# prepare meshes
faces_mapping = _mesh_utils.bm_prepare_mesh_for_export(mesh, mesh_transf_mat, triangulate=True)
# cache terrain points status, to avoid vertex group checking on each vertex if not present
terrain_point_vert_groups_names = set()
for vert_group in vert_groups:
# if vertex group name doesn't match prescribed one ignore this vertex group
if match(_OP_consts.TerrainPoints.vg_name_regex, vert_group.name):
terrain_point_vert_groups_names.add(vert_group.name)
has_terrain_points = len(terrain_point_vert_groups_names) > 0
missing_uv_layers = {} # stores missing uvs specified by materials of this object
missing_vcolor = False # indicates if object is missing vertex color layer
missing_vcolor_a = False # indicates if object is missing vertex color alpha layer
missing_skinned_verts = set() # indicates if object is having only partial skin, which is not allowed in our models
has_unnormalized_skin = False # indicates if object has vertices which bones weight sum is smaller then one
last_tangents_uv_layer = None # stores uv layer for which tangents were calculated, so tangents won't be calculated all over again
max_vcolor = 0 # indicates maximum vertex color inside this model and is used to report unnormalized vertex color over 1.0
for poly in mesh.polygons:
mat_index = poly.material_index
# check material existence and decide what material name and effect has to be used
if mat_index >= len(mesh_obj.material_slots) or mesh_obj.material_slots[mat_index].material is None: # no material or invalid index
material = None
pim_mat_name = "_default_material_-_default_settings_"
pim_mat_effect = "eut2.dif"
objects_with_default_material[mesh_obj.name] = 1
else:
material = mesh_obj.material_slots[mat_index].material
pim_mat_name = material.name
pim_mat_effect = material.scs_props.mat_effect_name
# create new pim material if material with that name doesn't yet exists
if pim_mat_name not in pim_materials:
pim_material = Material(len(pim_materials), pim_mat_name, pim_mat_effect, material)
pim_materials[pim_mat_name] = pim_material
used_materials.add(pim_mat_name, material)
# if there is uv layer used for normal maps and that uv layer exists on mesh then calculate tangents on it otherwise report warning
nmap_uv_layer = pim_materials[pim_mat_name].get_nmap_uv_name()
if nmap_uv_layer and nmap_uv_layer != last_tangents_uv_layer:
# save last uv layer that tangents were calculated on, so it won't be recalculated for each polygon
last_tangents_uv_layer = nmap_uv_layer
if nmap_uv_layer in mesh.uv_layers:
try:
mesh.calc_tangents(uvmap=nmap_uv_layer)
except RuntimeError:
invalid_objects_for_tangents.add(mesh_obj.name)
else:
lprint("W Unable to calculate normal map tangents for object %r,\n\t "
"as it's missing UV layer with name: %r, expect problems!",
(mesh_obj.name, nmap_uv_layer))
# construct piece dictonary key (can divide even one mesh to more if they have multiple materials)
if is_skin_used: # if animated we try to merge as many pieces as possible
piece_key = pim_mat_name + "|" + part_name
else: # if rigid just expot each mesh as own piece (conversion tools should take care about merging)
piece_key = pim_mat_name + "|" + part_name + "|" + str(mesh_i)
# create mesh piece object if max number of vertices is reached or no p piece for current piece dictonary key exists
if piece_key in mesh_pieces and mesh_pieces[piece_key].get_vertex_count() > 65536 - 3:
piece = mesh_pieces[piece_key]
# put current piece of current mesh to global list
pim_pieces.append(piece)
# add pieces of current mesh to part
pim_part = pim_parts[part_name]
pim_part.add_piece(piece)
del mesh_pieces[piece_key]
mesh_pieces[piece_key] = Piece(len(pim_pieces) + len(mesh_pieces), pim_materials[pim_mat_name])
elif piece_key not in mesh_pieces:
mesh_pieces[piece_key] = Piece(len(pim_pieces) + len(mesh_pieces), pim_materials[pim_mat_name])
mesh_piece = mesh_pieces[piece_key]
""":type: Piece"""
# create/get skin data section for current piece
if is_skin_used:
mesh_piece_idx = mesh_piece.get_index()
if mesh_piece_idx not in pim_piece_skins:
new_skin_stream = PieceSkinStream(PieceSkinStream.Types.POSITION)
pim_piece_skins[mesh_piece_idx] = PieceSkin(mesh_piece_idx, new_skin_stream)
skin_stream = pim_piece_skins[mesh_piece_idx].get_skin_stream_by_type(PieceSkinStream.Types.POSITION)
else:
skin_stream = None
# get polygon loop indices for normals depending on mapped triangulated face
if poly.index in faces_mapping:
normals_poly_loop_indices = list(mesh_for_normals.polygons[faces_mapping[poly.index]].loop_indices)
normals_poly_i = faces_mapping[poly.index]
else:
normals_poly_loop_indices = list(mesh_for_normals.polygons[poly.index].loop_indices)
normals_poly_i = poly.index
# vertex data
triangle_pvert_indices = [] # storing vertex indices for this polygon triangle
for loop_i in poly.loop_indices:
loop = mesh.loops[loop_i]
""":type: bpy.types.MeshLoop"""
vert_i = loop.vertex_index
# get data of current vertex
# 1. position -> mesh.vertices[loop.vertex_index].co
position = tuple(pos_transf_mat @ mesh.vertices[vert_i].co)
# 2. normal -> mesh_for_normals.loops[loop_i].normal -> calc_normals_split() has to be called before
if mesh_for_normals.has_custom_normals or poly.use_smooth:
for i, normals_poly_loop_i in enumerate(normals_poly_loop_indices):
normal_loop = mesh_for_normals.loops[normals_poly_loop_i]
# match by vertex index as triangle will for sure have three unique vertices
if vert_i == normal_loop.vertex_index:
vert_normal = normal_loop.normal
del normals_poly_loop_indices[i]
break
else:
vert_normal = _ZERO_NORMAL
lprint("E Normals data gathering went wrong, expect corrupted mesh! Shouldn't happen...")
else:
vert_normal = mesh_for_normals.polygons[normals_poly_i].normal
normal = tuple((nor_transf_mat @ vert_normal).normalized())
# 3. uvs -> uv_lay = mesh.uv_layers[0].data; uv_lay[loop_i].uv
uvs = []
uvs_aliases = []
tex_coord_alias_map = pim_materials[pim_mat_name].get_tex_coord_map()
if len(tex_coord_alias_map) < 1: # no textures or none uses uv mapping in current material effect
uvs.append((0.0, 0.0))
uvs_aliases.append(["_TEXCOORD0"])
# report missing mappings only on actual materials with textures using uv mappings
if material and pim_materials[pim_mat_name].uses_textures_with_uv():
if material.name not in missing_mappings_data:
missing_mappings_data[material.name] = {}
if mesh_obj.name not in missing_mappings_data[material.name]:
missing_mappings_data[material.name][mesh_obj.name] = 1
else:
for uv_lay_name in tex_coord_alias_map:
if uv_lay_name not in mesh.uv_layers:
uvs.append((0.0, 0.0))
# properly report missing uv layers where name of uv layout is key and materials that misses it are values
if uv_lay_name not in missing_uv_layers:
missing_uv_layers[uv_lay_name] = []
if pim_mat_name not in missing_uv_layers[uv_lay_name]: # add material if not already there
missing_uv_layers[uv_lay_name].append(pim_mat_name)
else:
uv_lay = mesh.uv_layers[uv_lay_name]
uvs.append(_change_to_scs_uv_coordinates(uv_lay.data[loop_i].uv))
aliases = []
for alias_index in tex_coord_alias_map[uv_lay_name]:
aliases.append("_TEXCOORD" + str(alias_index))
uvs_aliases.append(aliases)
# 4. vcol -> vcol_lay = mesh.color_attributes[0].data; vcol_lay[loop_i].color
if _MESH_consts.default_vcol not in mesh.color_attributes: # get RGB component of RGBA
vcol = (1.0,) * 3
missing_vcolor = True
else:
vcolors = mesh.color_attributes[_MESH_consts.default_vcol]
if vcolors.domain == 'POINT':
color = Color(vcolors.data[vert_i].color[:3])
elif vcolors.domain == 'CORNER':
color = Color(vcolors.data[loop_i].color[:3])
else:
raise TypeError("Invalid vertex color domain type!")
color = color.from_scene_linear_to_srgb()
if vcolors.data_type == 'BYTE_COLOR':
for i in range(0, 3):
# for byte color 8-bits 0.5 can not be set, thus clamp 128/255 to 0.5 or report to big vcolor otherwise
if 0.5 < color[i] <= 0.50198:
color[i] = 0.5
elif color[i] > 0.50198 and color[i] > max_vcolor:
max_vcolor = color[i]
elif vcolors.data_type == 'FLOAT_COLOR':
for i in range(0, 3):
if color[i] > 0.5 and color[i] > max_vcolor:
max_vcolor = color[i]
else:
raise TypeError("Invalid vertex color type!")
vcol = (color[0] * 2, color[1] * 2, color[2] * 2)
if _MESH_consts.default_vcol + _MESH_consts.vcol_a_suffix not in mesh.color_attributes: # get A component of RGBA
vcol += (1.0,)
missing_vcolor_a = True
else:
vcolors = mesh.color_attributes[_MESH_consts.default_vcol + _MESH_consts.vcol_a_suffix]
if vcolors.domain == 'POINT':
alpha = Color(vcolors.data[vert_i].color[:3])
elif vcolors.domain == 'CORNER':
alpha = Color(vcolors.data[loop_i].color[:3])
else:
raise TypeError("Invalid vertex color domain type!")
alpha = alpha.from_scene_linear_to_srgb()
alpha = (alpha[0] + alpha[1] + alpha[2]) / 3.0 # take avg of colors for alpha
# since blender is saving vcolor in 8-bits 0.5 can not be set, thus clamp 128/255 to 0.5 or report to big vcolor otherwise
if vcolors.data_type == 'BYTE_COLOR':
# for byte color 8-bits 0.5 can not be set, thus clamp 128/255 to 0.5 or report to big vcolor otherwise
if 0.5 < alpha <= 0.50198:
alpha = 0.5
elif alpha > 0.50198 and alpha > max_vcolor:
max_vcolor = alpha
elif vcolors.data_type == 'FLOAT_COLOR':
if alpha > 0.5 and alpha > max_vcolor:
max_vcolor = alpha
else:
raise TypeError("Invalid vertex color type!")
vcol += (alpha * 2,)
# 5. tangent -> loop.tangent; loop.bitangent_sign -> calc_tangents() has to be called before
if pim_materials[pim_mat_name].get_nmap_uv_name(): # calculate tangents only if needed
tangent = (tangent_transf_mat @ loop.tangent).normalized()
tangent = (tangent[0], tangent[1], tangent[2], loop.bitangent_sign)
else:
tangent = None
# 6. There we go, vertex data collected! Now create internal vertex index, for triangle and skin stream construction
# Construct unique vertex index - donated by mesh and vertex index, as we may export more mesh objects into same piece,
# thus only vertex index wouldn't be unique representation.
unique_vert_i = "%i|%i" % (mesh_i, vert_i)
piece_vert_index = mesh_piece.add_vertex(unique_vert_i, position, normal, uvs, uvs_aliases, vcol, tangent)
# 7. Add vertex to triangle creation list
triangle_pvert_indices.append(piece_vert_index)
# 8. Get skinning data for vertex and save it to skin stream
if is_skin_used:
bone_weights = {}
bone_weights_sum = 0
for v_group_entry in mesh.vertices[vert_i].groups:
bone_indx = bones.get_bone_index(vert_groups[v_group_entry.group].name)
bone_weight = v_group_entry.weight
# proceed only if bone exists in our armature
if bone_indx != -1:
bone_weights[bone_indx] = bone_weight
bone_weights_sum += bone_weight
if bone_weights_sum > 0:
skin_entry = PieceSkinStream.Entry(piece_vert_index, position, bone_weights, bone_weights_sum)
skin_stream.add_entry(skin_entry)
else:
# report un-skinned vertices (no bones or zero sum weight) or badly skinned model
missing_skinned_verts.add(vert_i)
if bone_weights_sum < 1:
has_unnormalized_skin = True
# 9. Terrain Points: save vertex to terrain points storage, if present in correct vertex group
if has_terrain_points:
for group in mesh.vertices[vert_i].groups:
# if current object doesn't have vertex group found in mesh data, then ignore that group
# This can happen if multiple objects are using same mesh and
# some of them have vertex groups, but others not.
if group.group >= len(mesh_obj.vertex_groups):
continue
curr_vg_name = mesh_obj.vertex_groups[group.group].name
# if vertex group name doesn't match prescribed one ignore this vertex group
if curr_vg_name not in terrain_point_vert_groups_names:
continue
# if node index is not in bounds ignore this vertex group
node_index = int(curr_vg_name[-1])
if node_index >= _PL_consts.PREFAB_NODE_COUNT_MAX:
continue
# if no variants defined add globally (without variant block)
if len(root_object.scs_object_variant_inventory) == 0:
used_terrain_points.add(-1, node_index, position, normal)
continue
# finally iterate variant parts entries to find where this part is included
# and add terrain points to transitional structure
#
# NOTE: variant index is donated by direct order of variants in inventory
# so export in PIT has to use the same order otherwise variant
# indices will be misplaced
for variant_i, variant in enumerate(root_object.scs_object_variant_inventory):
used_terrain_points.ensure_entry(variant_i, node_index)
for variant_part in variant.parts:
if variant_part.name == mesh_obj.scs_props.scs_part and variant_part.include:
used_terrain_points.add(variant_i, node_index, position, normal)
break
# triangles
if face_flip:
mesh_piece.add_triangle(tuple(triangle_pvert_indices))
else:
mesh_piece.add_triangle(tuple(triangle_pvert_indices[::-1])) # yep it's weird but it simply works vice versa
# free normals calculations & remove temporary mesh
_mesh_utils.cleanup_mesh(mesh_for_normals)
mesh_obj.to_mesh_clear()
# report missing data for each object
if len(missing_uv_layers) > 0:
for uv_lay_name in missing_uv_layers:
lprint("W Object %r is missing UV layer %r specified by materials: %r",
(mesh_obj.name, uv_lay_name, missing_uv_layers[uv_lay_name]))
if missing_vcolor:
lprint("W Object %r is missing vertex color layer with name %r! Default RGB color will be exported (0.5, 0.5, 0.5)!",
(mesh_obj.name, _MESH_consts.default_vcol))
if missing_vcolor_a:
lprint("W Object %r is missing vertex color alpha layer with name %r! Default alpha will be exported (0.5)",
(mesh_obj.name, _MESH_consts.default_vcol + _MESH_consts.vcol_a_suffix))
if len(missing_skinned_verts) > 0:
lprint("E Object %r from SCS Root %r has %s vertices which are not skinned to any bone, expect errors during conversion!",
(mesh_obj.name, root_object.name, len(missing_skinned_verts)))
if has_unnormalized_skin:
lprint("W Object %r from SCS Root %r has unormalized skinning, exporting normalized weights!\n\t "
"You can normalize weights by selecting object & executing 'Normalize All Vertex Groups'.",
(mesh_obj.name, root_object.name))
if max_vcolor != 0:
lprint("W Object %r from SCS Root %r has unormalized vertex color, some vertices use: %.5f. instead of max 0.5",
(mesh_obj.name, root_object.name, max_vcolor))
# add rest of the pieces to global list
for piece_key in mesh_pieces:
part_name = piece_key.split("|")[1] # get part from piece key (<material name>|<part name>|(optional)<mesh index>)
piece = mesh_pieces[piece_key]
# put pieces of current mesh to global list
pim_pieces.append(piece)
# add pieces of current mesh to part
pim_part = pim_parts[part_name]
pim_part.add_piece(piece)
# report missing data for whole model
if len(missing_mappings_data) > 0:
for material_name in missing_mappings_data:
lprint("W Material '%s' is missing mapping data! Objects using it are exported with default UV:\n\t %s",
(material_name, list(missing_mappings_data[material_name].keys())))
if len(objects_with_default_material) > 0:
lprint("W Some objects don't use any material. Default material and UV mapping is used on them:\n\t %s",
(list(objects_with_default_material.keys()),))
if len(invalid_objects_for_tangents) > 0:
lprint("E N-gons present in some objects, thus normal map tangent calculation failed.\n\t "
"Visualization in game will be distorted for this objects:\n\t %s",
(list(invalid_objects_for_tangents),))
# create locators data sections
model_locators_count = len(model_locators)
for loc_i, loc_obj in enumerate(model_locators):
lprint("I Preparing model locator: %r - %i/%i (%i%%) ...",
(loc_obj.name, loc_i + 1, model_locators_count, (loc_i + 1) / model_locators_count * 100),
immediate_timeout=2.5)
pos, qua, sca = _get_scs_transformation_components(root_object.matrix_world.inverted() @ loc_obj.matrix_world)
if sca[0] * sca[1] * sca[2] < 0:
lprint("W Model locator %r inside SCS Root Object %r not exported because of invalid scale.\n\t " +
"Model locators must have positive scale!", (loc_obj.name, root_object.name))
continue
hookup_string = loc_obj.scs_props.locator_model_hookup
hookup_id = _hookup_name_to_hookup_id(hookup_string)
if hookup_id:
hookup_payload = _object_utils.get_hookup_payload_string(loc_obj)
if len(hookup_payload) > 0:
hookup_id += '#'
hookup_id += hookup_payload
if hookup_string != "" and hookup_id is None:
lprint("W Model locator %r has unexpected hookup value %r.", (loc_obj.name, loc_obj.scs_props.locator_model_hookup))
# create locator object for export
name = _name_utils.tokenize_name(loc_obj.name)
locator = Locator(len(pim_locators), name, hookup_id)
locator.set_position(pos)
locator.set_rotation(qua)
locator.set_scale(sca)
# create part if it doesn't exists yet
part_name = used_parts.ensure_part(loc_obj)
if part_name not in pim_parts:
pim_parts[part_name] = Part(part_name)
# add locator to part
pim_part = pim_parts[part_name]
pim_part.add_locator(locator)
# add locator to locator list
pim_locators.append(locator)
# create container
pim_container = [pim_header.get_as_section(), pim_global.get_as_section()]
for mat_name in pim_materials:
pim_container.append(pim_materials[mat_name].get_as_section())
for pim_piece in pim_pieces:
pim_container.append(pim_piece.get_as_section())
for part_name in used_parts.get_as_list():
# export all parts even empty ones used only in PIC and/or PIP
if part_name in pim_parts:
pim_container.append(pim_parts[part_name].get_as_section())
else:
pim_container.append(Part(part_name).get_as_section())
for locator in pim_locators:
pim_container.append(locator.get_as_section())
if is_skin_used:
pim_container.append(bones.get_as_section())
for piece_key in pim_piece_skins:
pim_container.append(pim_piece_skins[piece_key].get_as_section())
# write to file
ind = " "
pim_filepath = os.path.join(dirpath, root_object.name + ".pim" + name_suffix)
lprint("I Writting PIM file to %r ...", (pim_filepath,), immediate_timeout=0)
return _pix_container.write_data_to_file(pim_container, pim_filepath, ind, print_progress=True)
================================================
FILE: addon/io_scs_tools/exp/pim/globall.py
================================================
# ##### BEGIN GPL LICENSE BLOCK #####
#
# This program is free software; you can redistribute it and/or
# modify it under the terms of the GNU General Public License
# as published by the Free Software Foundation; either version 2
# of the License, or (at your option) any later version.
#
# This program is distributed in the hope that it will be useful,
# but WITHOUT ANY WARRANTY; without even the implied warranty of
# MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
# GNU General Public License for more details.
#
# You should have received a copy of the GNU General Public License
# along with this program; if not, write to the Free Software Foundation,
# Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301, USA.
#
# ##### END GPL LICENSE BLOCK #####
# Copyright (C) 2013-2019: SCS Software
from io_scs_tools.exp.pim.piece import Piece
from io_scs_tools.exp.pim.material import Material
from io_scs_tools.exp.pim.locator import Locator
from io_scs_tools.exp.pim.bones import Bones
from io_scs_tools.exp.pim.piece_skin import PieceSkin
from io_scs_tools.internals.structure import SectionData as _SectionData
class Globall:
__skeleton = ""
def __init__(self, part_count, skeleton):
"""Constructs global for PIM
:param part_count: parts counter for current game object (including any parts from PIC and PIT
:type part_count: int
:param skeleton: file name of the skeleton file
:type skeleton: str
"""
Piece.reset_counters()
Material.reset_counter()
Locator.reset_counter()
Bones.reset_counter()
PieceSkin.reset_counter()
self.__part_count = part_count
self.__skeleton = skeleton.replace("\\", "/") # make sure to replace backslashes for windows paths
def get_as_section(self):
"""Gets global model information represented with SectionData structure class.
:return: packed globals as section data
:rtype: io_scs_tools.internals.structure.SectionData
"""
section = _SectionData("Global")
section.props.append(("VertexCount", Piece.get_global_vertex_count()))
section.props.append(("TriangleCount", Piece.get_global_triangle_count()))
section.props.append(("MaterialCount", Material.get_global_material_count()))
section.props.append(("PieceCount", Piece.get_global_piece_count()))
section.props.append(("PartCount", self.__part_count))
section.props.append(("BoneCount", Bones.get_global_bones_count()))
section.props.append(("LocatorCount", Locator.get_global_locator_count()))
section.props.append(("Skeleton", self.__skeleton))
section.props.append(("PieceSkinCount", PieceSkin.get_global_piece_skin_count()))
return section
================================================
FILE: addon/io_scs_tools/exp/pim/header.py
================================================
# ##### BEGIN GPL LICENSE BLOCK #####
#
# This program is free software; you can redistribute it and/or
# modify it under the terms of the GNU General Public License
# as published by the Free Software Foundation; either version 2
# of the License, or (at your option) any later version.
#
# This program is distributed in the hope that it will be useful,
# but WITHOUT ANY WARRANTY; without even the implied warranty of
# MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
# GNU General Public License for more details.
#
# You should have received a copy of the GNU General Public License
# along with this program; if not, write to the Free Software Foundation,
# Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301, USA.
#
# ##### END GPL LICENSE BLOCK #####
# Copyright (C) 2013-2014: SCS Software
from io_scs_tools.internals.structure import SectionData as _SectionData
from io_scs_tools.utils.info import get_combined_ver_str
class Header:
__format_type = ""
__format_version = 0
__source = "Blender"
__name = ""
def __init__(self, format_type, format_version, name):
"""Constructs header of PIM model.
:param format_type: type of PIM file format (used only for Data Exchange Format)
:type format_type: str
:param format_version: version of PIM file format
:type format_version: int
:param name: name of the model
:type name: str
"""
self.__format_type = format_type
self.__format_version = format_version
self.__source = get_combined_ver_str()
self.__name = name
def get_as_section(self):
"""Gets header information represented with SectionData structure class.
:return: packed header as section data
:rtype: io_scs_tools.internals.structure.SectionData
"""
section = _SectionData("Header")
if self.__format_type and self.__format_type != "":
section.props.append(("FormatType", self.__format_type))
section.props.append(("FormatVersion", self.__format_version))
section.props.append(("Source", self.__source))
section.props.append(("Type", "Model"))
section.props.append(("Name", self.__name))
return section
================================================
FILE: addon/io_scs_tools/exp/pim/locator.py
================================================
# ##### BEGIN GPL LICENSE BLOCK #####
#
# This program is free software; you can redistribute it and/or
# modify it under the terms of the GNU General Public License
# as published by the Free Software Foundation; either version 2
# of the License, or (at your option) any later version.
#
# This program is distributed in the hope that it will be useful,
# but WITHOUT ANY WARRANTY; without even the implied warranty of
# MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
# GNU General Public License for more details.
#
# You should have received a copy of the GNU General Public License
# along with this program; if not, write to the Free Software Foundation,
# Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301, USA.
#
# ##### END GPL LICENSE BLOCK #####
# Copyright (C) 2013-2014: SCS Software
from io_scs_tools.internals.structure import SectionData as _SectionData
class Locator:
__index = -1
__name = ""
__hookup = ""
__position = None
__rotation = None
__scale = None
__global_locator_counter = 0
@staticmethod
def reset_counter():
Locator.__global_locator_counter = 0
@staticmethod
def get_global_locator_count():
return Locator.__global_locator_counter
def __init__(self, index, name, hookup):
"""Constructor for locator.
NOTE: position, rotation and scale has to be set with methods
:param index: index of locator in PIM file
:type index: int
:param name: name of the locator
:type name: str
:param hookup: hookup of the locator
:type hookup: str
"""
self.__index = index
self.__name = name
self.__hookup = hookup
Locator.__global_locator_counter += 1
def set_position(self, position):
"""Sets position of the locator.
:param position: global position of the locator in SCS coordinates
:type position: tuple | Vector
"""
self.__position = position
def set_rotation(self, rotation):
"""Sets rotation of the locator.
:param rotation: absolute rotation of the locator in SCS coordinates
:type rotation: tuple | Quaternion
"""
self.__rotation = rotation
def set_scale(self, scale):
"""Sets scale of the locator.
:param scale: scale of the locator in SCS coordinates
:type scale: tuple | Vector
"""
self.__scale = scale
def get_index(self):
return self.__index
def get_as_section(self):
"""Gets locator represented with SectionData structure class.
:return: packed locator as section data
:rtype: io_scs_tools.internals.structure.SectionData
"""
section = _SectionData("Locator")
section.props.append(("Name", self.__name))
if self.__hookup and self.__hookup != "":
section.props.append(("Hookup", self.__hookup))
section.props.append(("Index", self.__index))
section.props.append(("Position", ["&&", self.__position]))
section.props.append(("Rotation", ["&&", self.__rotation]))
section.props.append(("Scale", ["&&", self.__scale]))
return section
================================================
FILE: addon/io_scs_tools/exp/pim/material.py
================================================
# ##### BEGIN GPL LICENSE BLOCK #####
#
# This program is free software; you can redistribute it and/or
# modify it under the terms of the GNU General Public License
# as published by the Free Software Foundation; either version 2
# of the License, or (at your option) any later version.
#
# This program is distributed in the hope that it will be useful,
# but WITHOUT ANY WARRANTY; without even the implied warranty of
# MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
# GNU General Public License for more details.
#
# You should have received a copy of the GNU General Public License
# along with this program; if not, write to the Free Software Foundation,
# Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301, USA.
#
# ##### END GPL LICENSE BLOCK #####
# Copyright (C) 2013-2014: SCS Software
from collections import OrderedDict
from io_scs_tools.internals.structure import SectionData as _SectionData
from io_scs_tools.utils.printout import lprint
class Material:
__index = -1
__alias = ""
__effect = ""
__global_material_counter = 0
@staticmethod
def reset_counter():
Material.__global_material_counter = 0
@staticmethod
def get_global_material_count():
return Material.__global_material_counter
def __init__(self, index, alias, effect, blend_mat):
"""Constructs material for PIM.
:param index: index of material in pim file
:type index: int
:param alias: name of the material in pim file
:type alias: str
:param effect: effect name of current material
:type effect: str
"""
self.__index = index
self.__alias = alias
self.__effect = effect
self.__nmap_uv_layer_name = None # saving uv layer name on which normal maps are used
self.__used_textures_count = 0 # counter indicating number of used textures
self.__used_textures_without_uv_count = 0 # counter indicating number of used textures which don't require uv layer
# map uv layer names to corresponding "tex_coord_x" field
tex_coord_map = {}
if blend_mat and "scs_shader_attributes" in blend_mat and "textures" in blend_mat["scs_shader_attributes"]:
for tex_entry in blend_mat["scs_shader_attributes"]["textures"].values():
self.__used_textures_count += 1
if "Tag" in tex_entry:
tex_type = tex_entry["Tag"].split(":")[1][8:].strip()
mappings = getattr(blend_mat.scs_props, "shader_texture_" + tex_type + "_uv", [])
# if imported just use custom mappings defined separetly
if blend_mat.scs_props.active_shader_preset_name == "<imported>":
custom_tex_coord_maps = blend_mat.scs_props.custom_tex_coord_maps
for custom_tex_coord_map in custom_tex_coord_maps:
if custom_tex_coord_map.value != "":
tex_coord = int(custom_tex_coord_map.name[10:]) # index of custom tex coord field is saved in name as "tex_coord_0"
tex_coord_map[tex_coord] = custom_tex_coord_map.value
if tex_type == "nmap" and not self.__nmap_uv_layer_name:
# try to extract uv field for normal maps from it's mapping
# otherwise use first defined mapping in custom mappings
if len(mappings) > 0 and mappings[0].value != "":
self.__nmap_uv_layer_name = mappings[0].value
else:
self.__nmap_uv_layer_name = custom_tex_coord_map.value
lprint("D Normal map layer for material '%s' set to: %s", (blend_mat.name, self.__nmap_uv_layer_name))
else:
for uv_map_i, uv_map in enumerate(mappings):
if uv_map.value != "": # filter out none specified mappings
tex_coord_map[uv_map.tex_coord] = uv_map.value
if tex_type == "nmap" and uv_map_i == 0: # if normal map texture has more tex_coord fields use first
self.__nmap_uv_layer_name = uv_map.value
elif uv_map.tex_coord != -1: # if tex coord is -1 texture doesn't use uvs
lprint("W Texture type '%s' on material '%s' is missing UV mapping value, expect problems in game!",
(tex_type, blend_mat.name))
else: # if texture doesn't have mappings it means uv is not required for it
self.__used_textures_without_uv_count += 1
# create uv layer map with used tex_coord on it (this tex_coords now represents aliases for given uv layers)
# It also uses ordered dictionary because order of keys now defines actually physical order for uvs in PIM file
self.__uvs_map_by_name = OrderedDict()
for tex_coord in sorted(tex_coord_map.keys()):
uv_lay_name = tex_coord_map[tex_coord]
if uv_lay_name not in self.__uvs_map_by_name:
self.__uvs_map_by_name[uv_lay_name] = []
self.__uvs_map_by_name[uv_lay_name].append(tex_coord)
Material.__global_material_counter += 1
def uses_textures_with_uv(self):
"""Tells if material is using any textures with required uv layers or not.
:return: True if material has textures; False otherwise
:rtype: bool
"""
return (self.__used_textures_count - self.__used_textures_without_uv_count) > 0
def get_nmap_uv_name(self):
"""Returns name of the uv layer on which normal maps are used.
:return: name of the uv layer used for normal maps; None if material doesn't uses normal maps
:rtype: str | None
"""
return self.__nmap_uv_layer_name
def get_tex_coord_map(self):
"""Gets the mapping dictionary which keys are physical uv layer names (ordered) and
values are list of tex_coord integer aliases for this physical uv layer.
EXAMPLE: { "UVMap0" : [ 0, 2 ], "UVMap1" : [ 1 ]}
:return: dictionary of aliases which belongs to physical layer names (keys of dictionary)
:rtype: collections.OrderedDict
"""
return self.__uvs_map_by_name
def get_index(self):
"""Gets index of material
:return: index of material within PIM file
:rtype: int
"""
return self.__index
def get_as_section(self):
"""Gets material represented with SectionData structure class.
:return: packed material as section data
:rtype: io_scs_tools.internals.structure.SectionData
"""
section = _SectionData("Material")
section.props.append(("Index", self.__index))
section.props.append(("Alias", self.__alias))
section.props.append(("Effect", self.__effect))
return section
================================================
FILE: addon/io_scs_tools/exp/pim/part.py
================================================
# ##### BEGIN GPL LICENSE BLOCK #####
#
# This program is free software; you can redistribute it and/or
# modify it under the terms of the GNU General Public License
# as published by the Free Software Foundation; either version 2
# of the License, or (at your option) any later version.
#
# This program is distributed in the hope that it will be useful,
# but WITHOUT ANY WARRANTY; without even the implied warranty of
# MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
# GNU General Public License for more details.
#
# You should have received a copy of the GNU General Public License
# along with this program; if not, write to the Free Software Foundation,
# Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301, USA.
#
# ##### END GPL LICENSE BLOCK #####
# Copyright (C) 2013-2014: SCS Software
from io_scs_tools.internals.structure import SectionData as _SectionData
class Part:
__name = ""
__piece_count = 0
__locator_count = 0
__pieces = {} # references to Piece classes used in this part
__locators = {} # references to Locator classes used in this part
def __init__(self, name):
"""Constructor for part with it's name.
NOTE: all of the pieces and locators are added later with methods.
:param name: name of the part
:type name: str
"""
self.__pieces = {}
self.__locators = {}
self.__name = name
def add_piece(self, piece):
"""Adds piece to part.
NOTE: if piece is already in it won't be added
:param piece: piece that should be in part
:type piece: io_scs_tools.exp.pim.piece.Piece
:return: True if piece was added; False otherwise
:rtype: bool
"""
if piece.get_index() in self.__pieces:
return False
self.__pieces[piece.get_index()] = piece
return True
def add_locator(self, locator):
"""Adds locator to part.
NOTE: if locator is already in it won't be added
:param locator: locator that should be in part
:type locator: io_scs_tools.exp.pim.locator.Locator
:return: True if locator was added; False otherwise
:rtype: bool
"""
if locator.get_index() in self.__locators:
return False
self.__locators[locator.get_index()] = locator
return True
def get_as_section(self):
"""Gets part represented with SectionData structure class.
:return: packed part as section data
:rtype: io_scs_tools.internals.structure.SectionData
"""
# update counters first
self.__piece_count = len(self.__pieces)
self.__locator_count = len(self.__locators)
section = _SectionData("Part")
section.props.append(("Name", self.__name))
section.props.append(("PieceCount", self.__piece_count))
section.props.append(("LocatorCount", self.__locator_count))
if self.__piece_count == 0:
section.props.append(("Pieces", None))
else:
section.props.append(("Pieces", list(self.__pieces.keys())))
if self.__locator_count == 0:
section.props.append(("Locators", None))
else:
section.props.append(("Locators", list(self.__locators.keys())))
return section
================================================
FILE: addon/io_scs_tools/exp/pim/piece.py
================================================
# ##### BEGIN GPL LICENSE BLOCK #####
#
# This program is free software; you can redistribute it and/or
# modify it under the terms of the GNU General Public License
# as published by the Free Software Foundation; either version 2
# of the License, or (at your option) any later version.
#
# This program is distributed in the hope that it will be useful,
# but WITHOUT ANY WARRANTY; without even the implied warranty of
# MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
# GNU General Public License for more details.
#
# You should have received a copy of the GNU General Public License
# along with this program; if not, write to the Free Software Foundation,
# Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301, USA.
#
# ##### END GPL LICENSE BLOCK #####
# Copyright (C) 2013-2022: SCS Software
from collections import OrderedDict
from io_scs_tools.exp.pim.piece_stream import Stream
from io_scs_tools.internals.structure import SectionData as _SectionData
from io_scs_tools.utils.printout import lprint
class Piece:
__index = 0
__vertex_count = 0
__triangle_count = 0
__stream_count = 0
__material = None # save whole material reference to get index out of it when packing
__streams = OrderedDict() # dict of Stream class
__triangles = [] # list of Triangle class
__vertices_hash = {}
__global_piece_count = 0
__global_vertex_count = 0
__global_triangle_count = 0
@staticmethod
def reset_counters():
Piece.__global_piece_count = 0
Piece.__global_triangle_count = 0
Piece.__global_vertex_count = 0
@staticmethod
def get_global_piece_count():
return Piece.__global_piece_count
@staticmethod
def get_global_vertex_count():
return Piece.__global_vertex_count
@staticmethod
def get_global_triangle_count():
return Piece.__global_triangle_count
@staticmethod
def __calc_vertex_hash(index, normal, uvs, rgba, tangent):
"""Calculates vertex hash from original vertex index, uvs components and vertex color.
:param index: original index from Blender mesh
:type index: str
:param normal: normalized vector representation of the normal
:type normal: tuple | mathutils.Vector
:param uvs: list of uvs used on vertex (each uv must be in SCS coordinates)
:type uvs: list of (tuple | mathutils.Vector)
:param rgba: rgba representation of vertex color in SCS values
:type rgba: tuple | mathutils.Color
:param tangent: vertex tangent in SCS coordinates or none, if piece doesn't have tangents
:type tangent: tuple | None
:return: calculated vertex hash
:rtype: str
"""
fprec = 10 ** 4
if tangent:
vertex_hash = (index,
int(normal[0] * fprec),
int(normal[1] * fprec),
int(normal[2] * fprec),
int(rgba[0] * fprec),
int(rgba[1] * fprec),
int(rgba[2] * fprec),
int(rgba[3] * fprec),
int(tangent[0] * fprec),
int(tangent[1] * fprec),
int(tangent[2] * fprec),
int(tangent[3] * fprec))
else:
vertex_hash = (index,
int(normal[0] * fprec),
int(normal[1] * fprec),
int(normal[2] * fprec),
int(rgba[0] * fprec),
int(rgba[1] * fprec),
int(rgba[2] * fprec),
int(rgba[3] * fprec))
for uv in uvs:
vertex_hash += (int(uv[0] * fprec),
int(uv[1] * fprec))
return vertex_hash
def __init__(self, index, material):
"""Constructs empty piece.
NOTE: empty piece will contain for mandatory stream which will be empty: POSITION, NORMAL, UV0, RGBA
:param index:
:type index:
:param material: material that should be used on for this piece
:type material: io_scs_tools.exp.pim.material.Material
"""
self.__vertex_count = 0
self.__triangle_count = 0
self.__stream_count = 0
self.__streams = OrderedDict()
self.__triangles = []
self.__vertices_hash = {}
self.__index = index
self.__material = material
# CONSTRUCT ALL MANDATORY STREAMS
stream = Stream(Stream.Types.POSITION, -1)
self.__streams[Stream.Types.POSITION] = stream
stream = Stream(Stream.Types.NORMAL, -1)
self.__streams[Stream.Types.NORMAL] = stream
Piece.__global_piece_count += 1
def add_triangle(self, triangle):
"""Adds new triangle to piece
NOTE: if length of given triangle iterable is different than 3 it will be refused!
:param triangle: tuple of 3 integers representing vertex indices
:type triangle: tuple
:return: True if added; False otherwise
:rtype:
"""
# expensive safety checks not needed for release but keep them for debug purposes
# if len(triangle) != 3:
# return False
# check indecies integrity
for vertex in triangle:
if vertex < 0 or vertex >= self.__vertex_count:
return False
self.__triangles.append(tuple(triangle))
Piece.__global_triangle_count += 1
return True
def add_vertex(self, vert_index, position, normal, uvs, uvs_aliases, rgba, tangent):
"""Adds new vertex to position and normal streams
:param vert_index: original vertex index from Blender mesh
:type vert_index: str
:param position: vector or tuple of vertex position in SCS coordinates
:type position: tuple | mathutils.Vector
:param normal: vector or tuple of vertex normal in SCS coordinates
:type normal: tuple | mathutils.Vector
:param uvs: list of uvs used on vertex (each uv must be in SCS coordinates)
:type uvs: list of (tuple | mathutils.Vector)
:param uvs_aliases: list of uv aliases names per uv layer
:type uvs_aliases: list[list[str]]
:param rgba: rgba representation of vertex color in SCS values
:type rgba: tuple | mathutils.Color
:param tangent: tuple representation of vertex tangent in SCS values or None if piece doesn't have tangents
:type tangent: tuple | None
:return: vertex index inside piece streams ( use it for adding triangles )
:rtype: int
"""
vertex_hash = self.__calc_vertex_hash(vert_index, normal, uvs, rgba, tangent)
# save vertex if the vertex with the same properties doesn't exists yet in streams
if vertex_hash not in self.__vertices_hash:
stream = self.__streams[Stream.Types.POSITION]
stream.add_entry(position)
stream = self.__streams[Stream.Types.NORMAL]
stream.add_entry(normal)
for i, uv in enumerate(uvs):
uv_type = "%s%i" % (Stream.Types.UV, i)
# create more uv streams on demand
if uv_type not in self.__streams:
self.__streams[uv_type] = Stream(Stream.Types.UV, i)
stream = self.__streams[uv_type]
""":type: Stream"""
stream.add_entry(uv)
for alias in uvs_aliases[i]:
stream.add_alias(alias)
if tangent:
# create tangent stream on demand
if Stream.Types.TANGENT not in self.__streams:
self.__streams[Stream.Types.TANGENT] = Stream(Stream.Types.TANGENT, -1)
stream = self.__streams[Stream.Types.TANGENT]
stream.add_entry(tangent)
if Stream.Types.RGBA not in self.__streams:
self.__streams[Stream.Types.RGBA] = Stream(Stream.Types.RGBA, -1)
stream = self.__streams[Stream.Types.RGBA]
stream.add_entry(rgba)
vert_index_internal = stream.get_size() - 1 # streams has to be alligned so I can take last one for the index
self.__vertices_hash[vertex_hash] = vert_index_internal
self.__vertex_count = vert_index_internal + 1
Piece.__global_vertex_count += 1
return self.__vertices_hash[vertex_hash]
def get_index(self):
return self.__index
def get_vertex_count(self):
return self.__streams[Stream.Types.POSITION].get_size()
def get_as_section(self):
"""Gets piece represented with SectionData structure class.
:return: packed piece as section data
:rtype: io_scs_tools.internals.structure.SectionData
"""
# UPDATE COUNTERS
self.__vertex_count = self.__streams[Stream.Types.POSITION].get_size()
self.__triangle_count = len(self.__triangles)
self.__stream_count = len(self.__streams)
section = _SectionData("Piece")
section.props.append(("Index", self.__index))
if not self.__material or self.__material.get_index() == -1:
lprint("W Piece with index %s doesn't have data about material, expect errors in game!", (self.__index,))
section.props.append(("Material", -1))
else:
section.props.append(("Material", self.__material.get_index()))
section.props.append(("VertexCount", self.__vertex_count))
section.props.append(("TriangleCount", self.__triangle_count))
section.props.append(("StreamCount", self.__stream_count))
stream_size = None
for stream_tag in self.__streams:
stream = self.__streams[stream_tag]
# CHECK SYNC OF STREAMS
if not stream_size:
stream_size = stream.get_size()
elif stream_size != stream.get_size():
lprint("W Piece with index %s has desynced stream sizes, expect errors in game!", (self.__index,))
break
# APPEND STREAMS
section.sections.append(stream.get_as_section())
# APPEND TRIANGLES
triangle_section = _SectionData("Triangles")
triangle_section.data = self.__triangles
section.sections.append(triangle_section)
return section
================================================
FILE: addon/io_scs_tools/exp/pim/piece_skin.py
================================================
# ##### BEGIN GPL LICENSE BLOCK #####
#
# This program is free software; you can redistribute it and/or
# modify it under the terms of the GNU General Public License
# as published by the Free Software Foundation; either version 2
# of the License, or (at your option) any later version.
#
# This program is distributed in the hope that it will be useful,
# but WITHOUT ANY WARRANTY; without even the implied warranty of
# MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
# GNU General Public License for more details.
#
# You should have received a copy of the GNU General Public License
# along with this program; if not, write to the Free Software Foundation,
# Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301, USA.
#
# ##### END GPL LICENSE BLOCK #####
# Copyright (C) 2013-2019: SCS Software
from collections import OrderedDict
from io_scs_tools.exp.pim.piece_skin_stream import PieceSkinStream
from io_scs_tools.internals.structure import SectionData as _SectionData
class PieceSkin:
__global_piece_skin_counter = 0
@staticmethod
def reset_counter():
PieceSkin.__global_piece_skin_counter = 0
@staticmethod
def get_global_piece_skin_count():
return PieceSkin.__global_piece_skin_counter
__piece = -1
__skin_streams_count = 0
__piece_skin_streams = None
def __init__(self, piece_idx, skin_stream):
"""Initialize skin with given skin stream object.
:param piece_idx: index of the piece inside SCS game object
:type piece_idx: int
:param skin_stream: position skin stream for this skin
:type skin_stream: PieceSkinStream
"""
self.__piece = piece_idx
self.__skin_streams_count = 0
self.__piece_skin_streams = OrderedDict()
self.__piece_skin_streams[skin_stream.get_tag()] = skin_stream
PieceSkin.__global_piece_skin_counter += 1
def get_skin_stream_by_type(self, stream_type):
"""Gets skin stream by given type.
:param stream_type: type of the stream to get, one of PieceSkinStream.Types
:type stream_type: str
:return: piece skin stream of given type or None if stream type deosn't exists
:rtype: PieceSkinStream | None
"""
skin_types = (PieceSkinStream.Types.POSITION, PieceSkinStream.Types.NORMAL, PieceSkinStream.Types.TANGENT)
if stream_type in skin_types and stream_type in self.__piece_skin_streams:
return self.__piece_skin_streams[stream_type]
return None
def get_as_section(self):
"""Gets whole model skin represented with SectionData structure class.
:return: packed skin as section data
:rtype: io_scs_tools.internals.structure.SectionData
"""
self.__skin_streams_count = len(self.__piece_skin_streams)
section = _SectionData("PieceSkin")
section.props.append(("Piece", self.__piece))
section.props.append(("StreamCount", self.__skin_streams_count))
for piece_skin_stream in self.__piece_skin_streams.values():
section.sections.append(piece_skin_stream.get_as_section())
return section
================================================
FILE: addon/io_scs_tools/exp/pim/piece_skin_stream.py
================================================
# ##### BEGIN GPL LICENSE BLOCK #####
#
# This program is free software; you can redistribute it and/or
# modify it under the terms of the GNU General Public License
# as published by the Free Software Foundation; either version 2
# of the License, or (at your option) any later version.
#
# This program is distributed in the hope that it will be useful,
# but WITHOUT ANY WARRANTY; without even the implied warranty of
# MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
# GNU General Public License for more details.
#
# You should have received a copy of the GNU General Public License
# along with this program; if not, write to the Free Software Foundation,
# Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301, USA.
#
# ##### END GPL LICENSE BLOCK #####
# Copyright (C) 2013-2019: SCS Software
from collections import OrderedDict
from io_scs_tools.internals.structure import SectionData as _SectionData
class PieceSkinStream:
class Types:
"""Enumerator class for storing types of possible PIM streams
"""
POSITION = "_POSITION"
NORMAL = "_NORMAL"
TANGENT = "_TANGENT"
class Entry:
"""Skin stream entry class for easy storing and identifying entries
when adding new entries to skin stream.
"""
PERCISION = 6
"""Percision constant for float values inside entry hash."""
__position = None
__bone_weights = None
__vertex_indices = None
def __init__(self, vertex_index, vertex_pos, bone_weights, bone_weights_sum):
"""Create new entry instance with given indices, position and bone weights.
NOTE: There is no check-up for zero bone weights sum, which will result in division by zero error
:param vertex_index: index of the vertex inside piece
:type vertex_index: int
:param vertex_pos: global position of the vertex in non animated state
:type vertex_pos: tuple
:param bone_weights: bone weights dictonary where key is bone index and value is bone weight
:type bone_weights: dict
:param bone_weights_sum: none-zero summary of weights of all the bones vertex is skinned to
:type bone_weights_sum: float
"""
self.__bone_weights = OrderedDict()
self.__vertex_indices = OrderedDict()
self.__position = vertex_pos
# always normalize weights as game binary format is expecting normalized weights
for bone_indx in bone_weights.keys():
self.__bone_weights[bone_indx] = bone_weights[bone_indx] / bone_weights_sum
self.add_vertex_index(vertex_index)
def add_vertex_index(self, vertex_index):
"""Add vertex index to this skin entry.
NOTE: in case of already existing clone value will be overwritten; so there are only unique entries
:param vertex_index: index of the vertex inside piece
:type vertex_index: int
:return: True if clone was added; False if clone already exists;
:rtype: bool
"""
if vertex_index not in self.__vertex_indices:
self.__vertex_indices[vertex_index] = None
return True
return False
def get_first_vertex_index(self):
"""Get first index from vertex indices in this entry..
:return: first vertex index which should be also origin of this skin entry
:rtype: int
"""
return next(iter(self.__vertex_indices.keys()))
def get_hash(self):
"""Gets hash for this entry used for identifying clones in skin streams.
:return: hash generated from position, bone indices and it's weights
:rtype: str
"""
perc = 10 ** self.PERCISION # represent precision for maximal float precision inside hash key
key = str(self.__position)
for bone_index in sorted(self.__bone_weights.keys()):
key += str(bone_index) + str(int(self.__bone_weights[bone_index] * perc))
return key
def get_weight_count(self):
"""Gets number of weights written in this skin entry. Shall be used as helper for global
weight count inside skin stream.
:return: number of weights
:rtype: int
"""
return len(self.__bone_weights)
def get_section_repr(self):
"""Gets representation of skin entry used in skin stream section.
:return: tuple of (position, list of (bone_index, bone_weight), list of (piece_index, vertex_index)
:rtype: tuple
"""
weights = []
for bone_indx in sorted(self.__bone_weights.keys()):
weights.append((bone_indx, self.__bone_weights[bone_indx]))
vertex_indices = []
for vertex_indx in sorted(self.__vertex_indices.keys()):
vertex_indices.append(vertex_indx)
return self.__position, weights, vertex_indices
__format = "" # defined by type of tag
__tag = Types.POSITION
__item_count = 0
__total_weight_count = 0
__total_vertex_index_count = 0
_data = None
def __init__(self, stream_type):
"""Creates new skin stream with specified type.
:param stream_type: stream type for skin
:type stream_type: PieceSkinStream.Types
"""
self.__tag = stream_type
if stream_type == PieceSkinStream.Types.POSITION:
self.__format = "FLOAT3"
elif stream_type == PieceSkinStream.Types.NORMAL:
self.__format = "FLOAT3"
elif stream_type == PieceSkinStream.Types.TANGENT:
self.__format = "FLOAT4"
self.__total_weight_count = 0
self.__total_vertex_index_count = 0
self._data = OrderedDict()
def add_entry(self, skin_entry):
"""Adds new skin stream entry to list.
NOTE: same entries can be added as duplicates will be ignored!
:param skin_entry: entry of the skin stream
:type skin_entry: PieceSkinStream.Entry
"""
entry_hash = skin_entry.get_hash()
if entry_hash not in self._data: # create new entry
self._data[entry_hash] = skin_entry
self.__total_weight_count += skin_entry.get_weight_count()
self.__total_vertex_index_count += 1
else: # add new vertex indedx and increment vertex index count if index was actually added
vertex_index = skin_entry.get_first_vertex_index()
if self._data[entry_hash].add_vertex_index(vertex_index):
self.__total_vertex_index_count += 1
def get_tag(self):
"""Returns tag which represents type of this skin stream
:return: type tag for this skin stream
:rtype: string
"""
return self.__tag
def get_as_section(self):
"""Gets skin stream represented with SectionData structure class.
:return: packed skin stream as section data
:rtype: io_scs_tools.internals.structure.SectionData
"""
self.__item_count = len(self._data)
section = _SectionData("PieceSkinStream")
section.props.append(("Format", self.__format))
section.props.append(("Tag", self.__tag))
section.props.append(("ItemCount", self.__item_count))
section.props.append(("TotalWeightCount", self.__total_weight_count))
section.props.append(("TotalVertexIndexCount", self.__total_vertex_index_count))
for skin_entry in self._data.values():
section.data.append(("__skin__", skin_entry.get_section_repr()))
return section
================================================
FILE: addon/io_scs_tools/exp/pim/piece_stream.py
================================================
# ##### BEGIN GPL LICENSE BLOCK #####
#
# This program is free software; you can redistribute it and/or
# modify it under the terms of the GNU General Public License
# as published by the Free Software Foundation; either version 2
# of the License, or (at your option) any later version.
#
# This program is distributed in the hope that it will be useful,
# but WITHOUT ANY WARRANTY; without even the implied warranty of
# MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
# GNU General Public License for more details.
#
# You should have received a copy of the GNU General Public License
# along with this program; if not, write to the Free Software Foundation,
# Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301, USA.
#
# ##### END GPL LICENSE BLOCK #####
# Copyright (C) 2013-2021: SCS Software
from io_scs_tools.internals.structure import SectionData as _SectionData
class Stream:
class Types:
"""Enumerator class for storing types of possible PIM streams
"""
POSITION = "_POSITION"
NORMAL = "_NORMAL"
TANGENT = "_TANGENT"
RGB = "_RGB"
RGBA = "_RGBA"
UV = "_UV" # NOTE: there can be up to 9 uv streams
TUV = "_TUV" # NOTE: there can be up to 9 tuv streams
__format = "" # defined by type of tag
__tag = Types.POSITION
__tag_index = -1 # used for UV and TUV
__aliases = {}
__data = []
def __init__(self, stream_type, index):
"""Constructor for stream with given type and index.
NOTE: index is used only for SCALAR, UV and TUV stream types
:param stream_type: type of stream (eg. Stream.Types.POSITION)
:type stream_type: str
:param index: index of stream, used only for SCALAR, UV and TUV
:type index: int
"""
self.__aliases = {}
self.__data = []
self.__tag = stream_type
if stream_type == Stream.Types.POSITION:
self.__format = "FLOAT3"
elif stream_type == Stream.Types.NORMAL:
self.__format = "FLOAT3"
elif stream_type == Stream.Types.TANGENT:
self.__format = "FLOAT4"
elif stream_type == Stream.Types.RGB:
self.__format = "FLOAT3"
elif stream_type == Stream.Types.RGBA:
self.__format = "FLOAT4"
elif stream_type == Stream.Types.UV:
self.__tag_index = index
self.__format = "FLOAT2"
elif stream_type == Stream.Types.TUV:
self.__tag_index = index
self.__format = "UNKNOWN" # TODO: ask someone what is actually tuv stream
def add_entry(self, value):
"""Adds new entry to data of stream.
:param value: tuple or list value
:type value: tuple | list
:return: True if length is correct; otherwise false
:rtype: bool
"""
# expensive safety checks not needed for release but keep them for debug purposes
# if self.__tag == Stream.Types.POSITION and len(value) != 3:
# return False
# if self.__tag == Stream.Types.NORMAL and len(value) != 3:
# return False
# if self.__tag == Stream.Types.TANGENT and len(value) != 4:
# return False
# if self.__tag == Stream.Types.RGB and len(value) != 3:
# return False
# if self.__tag == Stream.Types.RGBA and len(value) != 4:
# return False
# if self.__tag == Stream.Types.UV and len(value) != 2:
# return False
self.__data.append(tuple(value))
return True
def add_alias(self, alias):
"""Adds alias to stream.
NOTE: only unique aliases will be kept
:param alias: string representing alias
:type alias: str
:return: True if alias is added; otherwise false
:rtype: bool
"""
if alias not in self.__aliases:
self.__aliases[alias] = 1
return True
return False
def get_size(self):
"""Gets size of the stream
:return: size of stream
:rtype: int
"""
return len(self.__data)
def get_tag(self):
"""Gets the tag of the stream
:return: complete tag of the stream
:rtype: str
"""
if -1 < self.__tag_index < 10:
return self.__tag + str(self.__tag_index)
else:
return self.__tag
def get_as_section(self):
"""Gets stream represented with SectionData structure class.
:return: packed stream as section data
:rtype: io_scs_tools.internals.structure.SectionData
"""
section = _SectionData("Stream")
section.props.append(("Format", self.__format))
if -1 < self.__tag_index < 10:
section.props.append(("Tag", self.__tag + str(self.__tag_index)))
else:
section.props.append(("Tag", self.__tag))
if len(self.__aliases) > 0:
aliases = sorted(self.__aliases.keys())
section.props.append(("AliasCount", len(aliases)))
section.props.append(("Aliases", aliases))
section.data = self.__data
return section
================================================
FILE: addon/io_scs_tools/exp/pim_ef/bones.py
================================================
# ##### BEGIN GPL LICENSE BLOCK #####
#
# This program is free software; you can redistribute it and/or
# modify it under the terms of the GNU General Public License
# as published by the Free Software Foundation; either version 2
# of the License, or (at your option) any later version.
#
# This program is distributed in the hope that it will be useful,
# but WITHOUT ANY WARRANTY; without even the implied warranty of
# MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
# GNU General Public License for more details.
#
# You should have received a copy of the GNU General Public License
# along with this program; if not, write to the Free Software Foundation,
# Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301, USA.
#
# ##### END GPL LICENSE BLOCK #####
# Copyright (C) 2017: SCS Software
from io_scs_tools.exp.pim.bones import Bones
================================================
FILE: addon/io_scs_tools/exp/pim_ef/exporter.py
================================================
# ##### BEGIN GPL LICENSE BLOCK #####
#
# This program is free software; you can redistribute it and/or
# modify it under the terms of the GNU General Public License
# as published by the Free Software Foundation; either version 2
# of the License, or (at your option) any later version.
#
# This program is distributed in the hope that it will be useful,
# but WITHOUT ANY WARRANTY; without even the implied warranty of
# MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
# GNU General Public License for more details.
#
# You should have received a copy of the GNU General Public License
# along with this program; if not, write to the Free Software Foundation,
# Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301, USA.
#
# ##### END GPL LICENSE BLOCK #####
# Copyright (C) 2017-2022: SCS Software
import os
import collections
from re import match
from mathutils import Matrix, Vector, Color
from io_scs_tools.consts import Mesh as _MESH_consts
from io_scs_tools.consts import Operators as _OP_consts
from io_scs_tools.consts import PrefabLocators as _PL_consts
from io_scs_tools.exp.pim_ef.header import Header
from io_scs_tools.exp.pim_ef.globall import Globall
from io_scs_tools.exp.pim_ef.material import Material
from io_scs_tools.exp.pim_ef.piece import Piece
from io_scs_tools.exp.pim_ef.part import Part
from io_scs_tools.exp.pim_ef.locator import Locator
from io_scs_tools.exp.pim_ef.bones import Bones
from io_scs_tools.exp.pim_ef.piece_skin import PieceSkin
from io_scs_tools.exp.pim_ef.piece_skin import PieceSkinStream
from io_scs_tools.internals.containers import pix as _pix_container
from io_scs_tools.utils import mesh as _mesh_utils
from io_scs_tools.utils import name as _name_utils
from io_scs_tools.utils import object as _object_utils
from io_scs_tools.utils import get_scs_globals as _get_scs_globals
from io_scs_tools.utils.convert import change_to_scs_uv_coordinates as _change_to_scs_uv_coordinates
from io_scs_tools.utils.convert import get_scs_transformation_components as _get_scs_transformation_components
from io_scs_tools.utils.convert import scs_to_blend_matrix as _scs_to_blend_matrix
from io_scs_tools.utils.convert import hookup_name_to_hookup_id as _hookup_name_to_hookup_id
from io_scs_tools.utils.printout import lprint
def execute(dirpath, name_suffix, root_object, armature_object, skeleton_filepath, mesh_objects, model_locators,
used_parts, used_materials, used_bones, used_terrain_points):
"""Executes export of PIM file for given data.
:param dirpath: directory path for PIM file
:type dirpath: str
:param name_suffix: file name suffix
:type name_suffix: str
:param root_object: Blender SCS Root empty object
:type root_object: bpy.types.Object
:param armature_object: Blender Aramture object belonging to this SCS game object
:type armature_object: bpy.types.Object
:param skeleton_filepath: relative file path of PIS file
:type skeleton_filepath: str
:param mesh_objects: all the meshes which should be exported for current game object
:type mesh_objects: list of bpy.types.Object
:param model_locators: all Blender empty objecs which represents model locators and should be exported for current game object
:type model_locators: list of bpy.types.Object
:param used_parts: parts transitional structure for storing used parts inside this PIM export
:type used_parts: io_scs_tools.exp.transition_structs.parts.PartsTrans
:param used_materials: materials transitional structure for storing used materials inside this PIM export
:type used_materials: io_scs_tools.exp.transition_structs.materials.MaterialsTrans
:param used_bones: bones transitional structure for storing used bones inside this PIM export
:type used_bones: io_scs_tools.exp.transition_structs.bones.BonesTrans
:param used_terrain_points: terrain points transitional structure for storing used terrain points
:type used_terrain_points: io_scs_tools.exp.transition_structs.terrain_points.TerrainPntsTrans
:return: True if export was successfull; False otherwise
:rtype: bool
"""
print("\n************************************")
print("** SCS PIM.EF Exporter **")
print("** (c)2017 SCS Software **")
print("************************************\n")
scs_globals = _get_scs_globals()
format_version = 1
is_skin_used = (armature_object and root_object.scs_props.scs_root_animated == "anim")
pim_header = Header("", format_version, root_object.name)
pim_global = Globall(used_parts.count(), skeleton_filepath)
pim_materials = collections.OrderedDict() # dict of Material class instances representing used materials
""":type: dict[str, Material]"""
pim_pieces = [] # list of Piece class instances representing mesh pieces
""":type: list[Piece]"""
pim_parts = {} # list of Part class instances representing used parts
""":type: dict[str, Part]"""
pim_locators = [] # list of Locator class instances representing model locators
""":type: list[Locator]"""
pim_piece_skins = []
""":type: dict[str, PieceSkin"""
objects_with_default_material = {} # stores object names which has no material set
missing_mappings_data = {} # indicates if material doesn't have set any uv layer for export
bones = None
if is_skin_used:
# create bones data section
bones = Bones()
for bone in armature_object.data.bones:
bones.add_bone(bone.name)
used_bones.add(bone.name)
# create mesh object data sections
mesh_objects_count = len(mesh_objects)
for mesh_i, mesh_obj in enumerate(mesh_objects):
if mesh_obj.mode != 'OBJECT':
lprint("W Invalid object mode detected on: %r, skipping it on export!", (mesh_obj.name,))
continue
lprint("I Preparing mesh object: %r - %i/%i (%i%%) ...",
(mesh_obj.name, mesh_i + 1, mesh_objects_count, ((mesh_i + 1) / mesh_objects_count * 100)),
immediate_timeout=2.5)
vert_groups = mesh_obj.vertex_groups
# calculate faces flip state from all ancestors of current object
scale_sign = 1
parent = mesh_obj
while parent and parent.scs_props.empty_object_type != "SCS_Root":
for scale_axis in parent.scale:
scale_sign *= scale_axis
for scale_axis in parent.delta_scale:
scale_sign *= scale_axis
parent = parent.parent
winding_order = 1
if scale_sign < 0:
winding_order = -1
# calculate transformation matrix for current object (root object transforms are always subtracted!)
mesh_transf_mat = root_object.matrix_world.inverted() @ mesh_obj.matrix_world
""":type: mathutils.Matrix"""
# calculate vertex position transformation matrix for this object
pos_transf_mat = (Matrix.Scale(scs_globals.export_scale, 4) @
_scs_to_blend_matrix().inverted())
""":type: mathutils.Matrix"""
# calculate vertex normals transformation matrix for this object
# NOTE: as normals will be read from none export prepared mesh we have to add rotation and scale from mesh transformation matrix
_, rot, scale = mesh_transf_mat.decompose()
scale_matrix_x = Matrix.Scale(scale.x, 3, Vector((1, 0, 0))).to_4x4()
scale_matrix_y = Matrix.Scale(scale.y, 3, Vector((0, 1, 0))).to_4x4()
scale_matrix_z = Matrix.Scale(scale.z, 3, Vector((0, 0, 1))).to_4x4()
nor_transf_mat = _scs_to_blend_matrix().inverted() @ rot.to_matrix().to_4x4() @ scale_matrix_x @ scale_matrix_y @ scale_matrix_z
""":type: mathutils.Matrix"""
# get initial mesh and extra copy for normals only
mesh = _object_utils.get_mesh(mesh_obj)
mesh_for_normals = _mesh_utils.get_mesh_for_normals(mesh)
_mesh_utils.bm_prepare_mesh_for_export(mesh, mesh_transf_mat)
# cache terrain points status, to avoid vertex group checking on each vertex if not present
terrain_point_vert_groups_names = set()
for vert_group in vert_groups:
# if vertex group name doesn't match prescribed one ignore this vertex group
if match(_OP_consts.TerrainPoints.vg_name_regex, vert_group.name):
terrain_point_vert_groups_names.add(vert_group.name)
has_terrain_points = len(terrain_point_vert_groups_names) > 0
missing_uv_layers = {} # stores missing uvs specified by materials of this object
missing_vcolor = False # indicates if object is missing vertex color layer
missing_vcolor_a = False # indicates if object is missing vertex color alpha layer
missing_skinned_verts = set() # indicates if object is having only partial skin, which is not allowed in our models
has_unnormalized_skin = False # indicates if object has vertices which bones weight sum is smaller then one
hard_edges = set()
mesh_piece = Piece(len(pim_pieces))
""":type: Piece"""
# create/get skin data section for current piece
if is_skin_used:
skin_stream = PieceSkinStream(PieceSkinStream.Types.POSITION)
piece_skin = PieceSkin(mesh_piece.get_index(), skin_stream)
pim_piece_skins.append(piece_skin)
else:
skin_stream = None
for poly_i, poly in enumerate(mesh.polygons):
mat_index = poly.material_index
# check material existence and decide what material name and effect has to be used
if mat_index >= len(mesh_obj.material_slots) or mesh_obj.material_slots[mat_index].material is None: # no material or invalid index
material = None
pim_mat_name = "_default_material_-_default_settings_"
pim_mat_effect = "eut2.dif"
objects_with_default_material[mesh_obj.name] = 1
else:
material = mesh_obj.material_slots[mat_index].material
pim_mat_name = material.name
pim_mat_effect = material.scs_props.mat_effect_name
# create new pim material if material with that name doesn't yet exists
if pim_mat_name not in pim_materials:
pim_material = Material(len(pim_materials), pim_mat_name, pim_mat_effect, material)
pim_materials[pim_mat_name] = pim_material
used_materials.add(pim_mat_name, material)
piece_vert_indices = []
vert_normals = []
vert_uvs = []
uvs_aliases = []
uvs_names = collections.OrderedDict()
vert_rgbas = []
rgbas_names = collections.OrderedDict()
tex_coord_alias_map = pim_materials[pim_mat_name].get_tex_coord_map()
for loop_i in poly.loop_indices:
loop = mesh.loops[loop_i]
""":type: bpy.types.MeshLoop"""
vert_i = loop.vertex_index
# as we are already looping first find out if edge is hard and put it to set
if mesh.edges[loop.edge_index].use_edge_sharp:
hard_edges.add(loop.edge_index)
# get data of current vertex
# 1. position -> mesh.vertices[loop.vertex_index].co
position = tuple(pos_transf_mat @ mesh.vertices[vert_i].co)
# 2. normal -> loop.normal -> calc_normals_split() has to be called before
if mesh_for_normals.has_custom_normals or poly.use_smooth:
vert_normal = mesh_for_normals.loops[loop_i].normal
else:
vert_normal = mesh_for_normals.polygons[poly_i].normal
normal = tuple((nor_transf_mat @ vert_normal).normalized())
vert_normals.append(normal)
# 3. uvs -> uv_lay = mesh.uv_layers[0].data; uv_lay[loop_i].uv
uvs = []
uvs_aliases = []
if len(tex_coord_alias_map) < 1: # no textures or none uses uv mapping in current material effect
uvs.append((0.0, 0.0))
uvs_names["generated"] = True
uvs_aliases.append(["_TEXCOORD0"])
# report missing mappings only on actual materials with textures using uv mappings
if material and pim_materials[pim_mat_name].uses_textures_with_uv():
if material.name not in missing_mappings_data:
missing_mappings_data[material.name] = {}
if mesh_obj.name not in missing_mappings_data[material.name]:
missing_mappings_data[material.name][mesh_obj.name] = 1
else:
for uv_lay_name in mesh.uv_layers.keys():
uv_lay = mesh.uv_layers[uv_lay_name]
uvs.append(_change_to_scs_uv_coordinates(uv_lay.data[loop_i].uv))
uvs_names[uv_lay_name] = True
aliases = []
if uv_lay_name in tex_coord_alias_map:
for alias_index in tex_coord_alias_map[uv_lay_name]:
aliases.append("_TEXCOORD" + str(alias_index))
uvs_aliases.append(aliases)
vert_uvs.append(uvs)
# 4. vcol -> vcol_lay = mesh.color_attributes[0].data; vcol_lay[loop_i].color
rgbas = []
if _MESH_consts.default_vcol not in mesh.color_attributes: # get RGB component of RGBA
vcol = (1.0,) * 3
missing_vcolor = True
else:
vcolors = mesh.color_attributes[_MESH_consts.default_vcol]
if vcolors.domain == 'POINT':
color = Color(vcolors.data[vert_i].color[:3])
elif vcolors.domain == 'CORNER':
color = Color(vcolors.data[loop_i].color[:3])
else:
raise TypeError("Invalid vertex color domain type!")
color = color.from_scene_linear_to_srgb()
vcol = (color[0] * 2, color[1] * 2, color[2] * 2)
if _MESH_consts.default_vcol + _MESH_consts.vcol_a_suffix not in mesh.color_attributes: # get A component of RGBA
vcol += (1.0,)
missing_vcolor_a = True
else:
vcolors = mesh.color_attributes[_MESH_consts.default_vcol + _MESH_consts.vcol_a_suffix]
if vcolors.domain == 'POINT':
alpha = Color(vcolors.data[vert_i].color[:3])
elif vcolors.domain == 'CORNER':
alpha = Color(vcolors.data[loop_i].color[:3])
else:
raise TypeError("Invalid vertex color domain type!")
alpha = alpha.from_scene_linear_to_srgb()
vcol += ((alpha[0] + alpha[1] + alpha[2]) / 3.0 * 2,) # take avg of colors for alpha
rgbas.append(vcol)
rgbas_names[_MESH_consts.default_vcol] = True
# export rest of the vertex colors too (also multiply with 2 and with vcol multiplicator)
for vcol_layer in mesh.color_attributes:
# we already computed thoose so ignore them
if vcol_layer.name in [_MESH_consts.default_vcol, _MESH_consts.default_vcol + _MESH_consts.vcol_a_suffix]:
continue
color = vcol_layer.data[loop_i].color
vcol = (color[0] * 2, color[1] * 2, color[2] * 2)
rgbas.append(vcol)
rgbas_names[vcol_layer.name] = True
vert_rgbas.append(rgbas)
# save internal vertex index to array to be able to construct triangle afterwards
piece_vert_index = mesh_piece.add_vertex(vert_i, position)
piece_vert_indices.append(piece_vert_index)
if is_skin_used:
# get skinning data for vertex and save it to skin stream
bone_weights = {}
bone_weights_sum = 0
for v_group_entry in mesh.vertices[vert_i].groups:
bone_indx = bones.get_bone_index(vert_groups[v_group_entry.group].name)
bone_weight = v_group_entry.weight
# proceed only if bone exists in our armature
if bone_indx != -1:
bone_weights[bone_indx] = bone_weight
bone_weights_sum += bone_weight
if bone_weights_sum > 0:
skin_entry = PieceSkinStream.Entry(piece_vert_index, position, bone_weights, bone_weights_sum)
skin_stream.add_entry(skin_entry)
else:
# report un-skinned vertices (no bones or zero sum weight) or badly skinned model
missing_skinned_verts.add(vert_i)
if bone_weights_sum < 1:
has_unnormalized_skin = True
# save to terrain points storage if present in correct vertex group
if has_terrain_points:
for group in mesh.vertices[vert_i].groups:
# if current object doesn't have vertex group found in mesh data, then ignore that group
# This can happen if multiple objects are using same mesh and
# some of them have vertex groups, but others not.
if group.group >= len(mesh_obj.vertex_groups):
continue
curr_vg_name = mesh_obj.vertex_groups[group.group].name
# if vertex group name doesn't match prescribed one ignore this vertex group
if curr_vg_name not in terrain_point_vert_groups_names:
continue
# if node index is not in bounds ignore this vertex group
node_index = int(curr_vg_name[-1])
if node_index >= _PL_consts.PREFAB_NODE_COUNT_MAX:
continue
# if no variants defined add globally (without variant block)
if len(root_object.scs_object_variant_inventory) == 0:
used_terrain_points.add(-1, node_index, position, normal)
continue
# finally iterate variant parts entries to find where this part is included
# and add terrain points to transitional structure
#
# NOTE: variant index is donated by direct order of variants in inventory
# so export in PIT has to use the same order otherwise variant
# indices will be misplaced
for variant_i, variant in enumerate(root_object.scs_object_variant_inventory):
used_terrain_points.ensure_entry(variant_i, node_index)
for variant_part in variant.parts:
if variant_part.name == mesh_obj.scs_props.scs_part and variant_part.include:
used_terrain_points.add(variant_i, node_index, position, normal)
break
assert mesh_piece.add_face(pim_materials[pim_mat_name],
tuple(piece_vert_indices[::winding_order * -1]), # invert indices because of conversion to scs system
tuple(vert_normals[::winding_order]),
tuple(vert_uvs[::winding_order]),
list(uvs_names.keys()),
uvs_aliases,
tuple(vert_rgbas[::winding_order]),
list(rgbas_names.keys())
)
# as we captured all hard edges collect them now and put it into Piece
for hard_edge in hard_edges:
(vert1_i, vert2_i) = mesh.edges[hard_edge].vertices
assert mesh_piece.add_edge(vert1_i, vert2_i, blender_mesh_indices=True)
# free normals calculations & remove temporary mesh
_mesh_utils.cleanup_mesh(mesh_for_normals)
mesh_obj.to_mesh_clear()
# create part if it doesn't exists yet
part_name = mesh_obj.scs_props.scs_part
if part_name not in pim_parts:
pim_parts[part_name] = Part(part_name)
# put pieces of current mesh to global list
pim_pieces.append(mesh_piece)
# add pieces of current mesh to part
pim_part = pim_parts[part_name]
pim_part.add_piece(mesh_piece)
# report missing data for each object
if len(missing_uv_layers) > 0:
for uv_lay_name in missing_uv_layers:
lprint("W Object '%s' is missing UV layer '%s' specified by materials: %s\n",
(mesh_obj.name, uv_lay_name, missing_uv_layers[uv_lay_name]))
if missing_vcolor:
lprint("W Object %r is missing vertex color layer with name %r! Default RGB color will be exported (0.5, 0.5, 0.5)!",
(mesh_obj.name, _MESH_consts.default_vcol))
if missing_vcolor_a:
lprint("W Object %r is missing vertex color alpha layer with name %r! Default alpha will be exported (0.5)",
(mesh_obj.name, _MESH_consts.default_vcol + _MESH_consts.vcol_a_suffix))
if len(missing_skinned_verts) > 0:
lprint("E Object %r from SCS Root %r has %s vertices which are not skinned to any bone, expect errors during conversion!",
(
gitextract_a_wlanqb/
├── .gitattributes
├── .gitignore
├── LICENSE
├── README.md
├── addon/
│ └── io_scs_tools/
│ ├── __init__.py
│ ├── consts.py
│ ├── exp/
│ │ ├── __init__.py
│ │ ├── pia.py
│ │ ├── pic.py
│ │ ├── pim/
│ │ │ ├── bones.py
│ │ │ ├── exporter.py
│ │ │ ├── globall.py
│ │ │ ├── header.py
│ │ │ ├── locator.py
│ │ │ ├── material.py
│ │ │ ├── part.py
│ │ │ ├── piece.py
│ │ │ ├── piece_skin.py
│ │ │ ├── piece_skin_stream.py
│ │ │ └── piece_stream.py
│ │ ├── pim_ef/
│ │ │ ├── bones.py
│ │ │ ├── exporter.py
│ │ │ ├── globall.py
│ │ │ ├── header.py
│ │ │ ├── locator.py
│ │ │ ├── material.py
│ │ │ ├── part.py
│ │ │ ├── piece.py
│ │ │ ├── piece_face.py
│ │ │ ├── piece_skin.py
│ │ │ ├── piece_skin_stream.py
│ │ │ └── piece_stream.py
│ │ ├── pip/
│ │ │ ├── curve.py
│ │ │ ├── curve_bezier.py
│ │ │ ├── exporter.py
│ │ │ ├── globall.py
│ │ │ ├── header.py
│ │ │ ├── intersection.py
│ │ │ ├── map_point.py
│ │ │ ├── node.py
│ │ │ ├── node_stream.py
│ │ │ ├── semaphore.py
│ │ │ ├── sign.py
│ │ │ ├── spawn_point.py
│ │ │ └── trigger_point.py
│ │ ├── pis.py
│ │ ├── pit.py
│ │ ├── pit_ef.py
│ │ ├── pix.py
│ │ ├── tobj.py
│ │ └── transition_structs/
│ │ ├── bones.py
│ │ ├── materials.py
│ │ ├── parts.py
│ │ └── terrain_points.py
│ ├── imp/
│ │ ├── __init__.py
│ │ ├── pia.py
│ │ ├── pic.py
│ │ ├── pim.py
│ │ ├── pim_ef.py
│ │ ├── pip.py
│ │ ├── pis.py
│ │ ├── pit.py
│ │ ├── pix.py
│ │ ├── tobj.py
│ │ └── transition_structs/
│ │ └── terrain_points.py
│ ├── internals/
│ │ ├── callbacks/
│ │ │ ├── lighting_east_lock.py
│ │ │ ├── open_gl.py
│ │ │ └── persistent.py
│ │ ├── connections/
│ │ │ ├── collector.py
│ │ │ ├── core.py
│ │ │ └── wrappers/
│ │ │ └── collection.py
│ │ ├── containers/
│ │ │ ├── config.py
│ │ │ ├── mat.py
│ │ │ ├── parsers/
│ │ │ │ ├── mat.py
│ │ │ │ ├── pix.py
│ │ │ │ ├── sii.py
│ │ │ │ └── tobj.py
│ │ │ ├── pix.py
│ │ │ ├── sii.py
│ │ │ ├── tobj.py
│ │ │ └── writers/
│ │ │ ├── pix.py
│ │ │ └── sii.py
│ │ ├── icons/
│ │ │ └── __init__.py
│ │ ├── inventory.py
│ │ ├── looks/
│ │ │ └── __init__.py
│ │ ├── open_gl/
│ │ │ ├── cache.py
│ │ │ ├── core.py
│ │ │ ├── locators/
│ │ │ │ ├── __init__.py
│ │ │ │ ├── collider.py
│ │ │ │ ├── model.py
│ │ │ │ └── prefab.py
│ │ │ ├── primitive.py
│ │ │ ├── shaders/
│ │ │ │ ├── __init__.py
│ │ │ │ ├── smooth_color_clipped_3d_frag.glsl
│ │ │ │ ├── smooth_color_clipped_3d_vert.glsl
│ │ │ │ ├── smooth_color_stipple_clipped_3d_frag.glsl
│ │ │ │ └── smooth_color_stipple_clipped_3d_vert.glsl
│ │ │ └── storage/
│ │ │ └── terrain_points.py
│ │ ├── persistent/
│ │ │ ├── file_load.py
│ │ │ ├── file_save.py
│ │ │ ├── initialization.py
│ │ │ ├── loop_check.py
│ │ │ ├── open_gl.py
│ │ │ └── shaders_update.py
│ │ ├── preview_models/
│ │ │ ├── __init__.py
│ │ │ └── cache.py
│ │ ├── shader_presets/
│ │ │ ├── __init__.py
│ │ │ ├── cache.py
│ │ │ └── ui_shader_preset_item.py
│ │ ├── shaders/
│ │ │ ├── __init__.py
│ │ │ ├── base.py
│ │ │ ├── eut2/
│ │ │ │ ├── __init__.py
│ │ │ │ ├── building/
│ │ │ │ │ ├── add_env_day.py
│ │ │ │ │ ├── day.py
│ │ │ │ │ └── lvcol_day.py
│ │ │ │ ├── decalshadow/
│ │ │ │ │ └── __init__.py
│ │ │ │ ├── dif/
│ │ │ │ │ └── __init__.py
│ │ │ │ ├── dif_anim/
│ │ │ │ │ ├── __init__.py
│ │ │ │ │ └── anim_blend_factor_ng.py
│ │ │ │ ├── dif_lum/
│ │ │ │ │ └── __init__.py
│ │ │ │ ├── dif_lum_spec/
│ │ │ │ │ └── __init__.py
│ │ │ │ ├── dif_spec/
│ │ │ │ │ └── __init__.py
│ │ │ │ ├── dif_spec_add_env/
│ │ │ │ │ ├── __init__.py
│ │ │ │ │ └── nofresnel.py
│ │ │ │ ├── dif_spec_fade_dif_spec/
│ │ │ │ │ ├── __init__.py
│ │ │ │ │ ├── detail_nmap.py
│ │ │ │ │ └── detail_setup_ng.py
│ │ │ │ ├── dif_spec_mult_dif_spec/
│ │ │ │ │ ├── __init__.py
│ │ │ │ │ └── add_env.py
│ │ │ │ ├── dif_spec_mult_dif_spec_iamod_dif_spec/
│ │ │ │ │ └── __init__.py
│ │ │ │ ├── dif_spec_oclu/
│ │ │ │ │ └── __init__.py
│ │ │ │ ├── dif_spec_oclu_add_env/
│ │ │ │ │ └── __init__.py
│ │ │ │ ├── dif_spec_oclu_weight_add_env/
│ │ │ │ │ └── __init__.py
│ │ │ │ ├── dif_spec_over_dif_opac/
│ │ │ │ │ └── __init__.py
│ │ │ │ ├── dif_spec_weight/
│ │ │ │ │ └── __init__.py
│ │ │ │ ├── dif_spec_weight_add_env/
│ │ │ │ │ └── __init__.py
│ │ │ │ ├── dif_spec_weight_mult2/
│ │ │ │ │ └── __init__.py
│ │ │ │ ├── dif_spec_weight_mult2_weight2/
│ │ │ │ │ └── __init__.py
│ │ │ │ ├── dif_spec_weight_weight_dif_spec_weight/
│ │ │ │ │ └── __init__.py
│ │ │ │ ├── dif_weight_dif/
│ │ │ │ │ └── __init__.py
│ │ │ │ ├── fakeshadow/
│ │ │ │ │ └── __init__.py
│ │ │ │ ├── flare/
│ │ │ │ │ └── __init__.py
│ │ │ │ ├── glass/
│ │ │ │ │ └── __init__.py
│ │ │ │ ├── grass/
│ │ │ │ │ └── __init__.py
│ │ │ │ ├── lamp/
│ │ │ │ │ ├── __init__.py
│ │ │ │ │ └── add_env.py
│ │ │ │ ├── light_tex/
│ │ │ │ │ └── __init__.py
│ │ │ │ ├── lightmap/
│ │ │ │ │ └── night.py
│ │ │ │ ├── mlaaweight/
│ │ │ │ │ └── __init__.py
│ │ │ │ ├── none/
│ │ │ │ │ └── __init__.py
│ │ │ │ ├── parameters.py
│ │ │ │ ├── reflective/
│ │ │ │ │ └── __init__.py
│ │ │ │ ├── retroreflective/
│ │ │ │ │ └── __init__.py
│ │ │ │ ├── shadowmap/
│ │ │ │ │ └── __init__.py
│ │ │ │ ├── shadowonly/
│ │ │ │ │ └── __init__.py
│ │ │ │ ├── sign/
│ │ │ │ │ └── __init__.py
│ │ │ │ ├── sky/
│ │ │ │ │ ├── __init__.py
│ │ │ │ │ ├── texture_types.py
│ │ │ │ │ └── uv_rescale_ng.py
│ │ │ │ ├── std_node_groups/
│ │ │ │ │ ├── add_env_ng.py
│ │ │ │ │ ├── alpha_remap_ng.py
│ │ │ │ │ ├── compose_lighting_ng.py
│ │ │ │ │ ├── fresnel_legacy_ng.py
│ │ │ │ │ ├── fresnel_schlick_ng.py
│ │ │ │ │ ├── lampmask_mixer_ng.py
│ │ │ │ │ ├── lighting_evaluator_ng.py
│ │ │ │ │ ├── linear_to_srgb_ng.py
│ │ │ │ │ ├── mult2_mix_ng.py
│ │ │ │ │ ├── refl_normal_ng.py
│ │ │ │ │ ├── scs_uvs_combine_ng.py
│ │ │ │ │ ├── scs_uvs_separate_ng.py
│ │ │ │ │ └── vcolor_input_ng.py
│ │ │ │ ├── std_passes/
│ │ │ │ │ ├── add_env.py
│ │ │ │ │ └── lum.py
│ │ │ │ ├── truckpaint/
│ │ │ │ │ ├── __init__.py
│ │ │ │ │ ├── airbrush.py
│ │ │ │ │ └── colormask.py
│ │ │ │ ├── unlit_tex/
│ │ │ │ │ └── __init__.py
│ │ │ │ ├── unlit_vcol_tex/
│ │ │ │ │ └── __init__.py
│ │ │ │ ├── water/
│ │ │ │ │ ├── __init__.py
│ │ │ │ │ ├── mix_factor_ng.py
│ │ │ │ │ └── water_stream_ng.py
│ │ │ │ └── window/
│ │ │ │ ├── lit.py
│ │ │ │ ├── window_final_uv_ng.py
│ │ │ │ ├── window_offset_factor_ng.py
│ │ │ │ └── window_uv_offset_ng.py
│ │ │ ├── flavors/
│ │ │ │ ├── alpha_test.py
│ │ │ │ ├── asafew.py
│ │ │ │ ├── awhite.py
│ │ │ │ ├── blend_add.py
│ │ │ │ ├── blend_mult.py
│ │ │ │ ├── blend_over.py
│ │ │ │ ├── fadesheet/
│ │ │ │ │ ├── __init__.py
│ │ │ │ │ └── fadesheet_compute_ng.py
│ │ │ │ ├── flipsheet/
│ │ │ │ │ ├── __init__.py
│ │ │ │ │ └── flipsheet_compute_ng.py
│ │ │ │ ├── nmap/
│ │ │ │ │ ├── __init__.py
│ │ │ │ │ ├── dds16_ng.py
│ │ │ │ │ └── scale_ng.py
│ │ │ │ ├── paint.py
│ │ │ │ ├── sky_back.py
│ │ │ │ ├── sky_stars.py
│ │ │ │ ├── tg0.py
│ │ │ │ └── tg1.py
│ │ │ ├── shader.py
│ │ │ └── std_node_groups/
│ │ │ ├── alpha_test_ng.py
│ │ │ ├── animsheet_frame_idx_to_col_row_ng.py
│ │ │ ├── animsheet_frame_ng.py
│ │ │ ├── animsheet_loop_frame_ng.py
│ │ │ ├── animsheet_xfade_ng.py
│ │ │ ├── blend_add_ng.py
│ │ │ ├── blend_mult_ng.py
│ │ │ └── output_shader_ng.py
│ │ └── structure.py
│ ├── operators/
│ │ ├── __init__.py
│ │ ├── bases/
│ │ │ ├── export.py
│ │ │ ├── selection.py
│ │ │ └── view.py
│ │ ├── material.py
│ │ ├── mesh.py
│ │ ├── object.py
│ │ ├── scene.py
│ │ ├── wm.py
│ │ └── world.py
│ ├── properties/
│ │ ├── __init__.py
│ │ ├── action.py
│ │ ├── addon_preferences.py
│ │ ├── dynamic/
│ │ │ ├── __init__.py
│ │ │ ├── object.py
│ │ │ └── scene.py
│ │ ├── material.py
│ │ ├── mesh.py
│ │ ├── object.py
│ │ ├── scene.py
│ │ └── workspace.py
│ ├── shader_presets.txt
│ ├── ui/
│ │ ├── __init__.py
│ │ ├── banners/
│ │ │ ├── .scs_bt_banner.tga
│ │ │ └── .scs_bt_banner_with_ctrls.tga
│ │ ├── material.py
│ │ ├── mesh.py
│ │ ├── object.py
│ │ ├── output.py
│ │ ├── shared.py
│ │ ├── tool_shelf.py
│ │ ├── workspace.py
│ │ └── world.py
│ ├── unused/
│ │ ├── import_pmg.py
│ │ ├── import_pmx.py
│ │ └── pim.py
│ └── utils/
│ ├── __init__.py
│ ├── animation.py
│ ├── collection.py
│ ├── convert.py
│ ├── curve.py
│ ├── info.py
│ ├── material.py
│ ├── math.py
│ ├── mesh.py
│ ├── name.py
│ ├── object.py
│ ├── path.py
│ ├── printout.py
│ ├── property.py
│ └── view3d.py
├── data/
│ ├── sample_base/
│ │ ├── def/
│ │ │ ├── cargo/
│ │ │ │ └── milk/
│ │ │ │ └── food_cistern_sample.sii
│ │ │ ├── climate/
│ │ │ │ └── default/
│ │ │ │ ├── bad.sii
│ │ │ │ └── nice.sii
│ │ │ ├── vehicle/
│ │ │ │ ├── f_rim/
│ │ │ │ │ └── steel_sample.sii
│ │ │ │ ├── f_tire/
│ │ │ │ │ ├── 1_sample.sii
│ │ │ │ │ ├── 2_sample.sii
│ │ │ │ │ └── 3_sample.sii
│ │ │ │ ├── f_wheel/
│ │ │ │ │ └── steel_sample.sii
│ │ │ │ ├── r_rim/
│ │ │ │ │ └── steel_sample.sii
│ │ │ │ ├── r_tire/
│ │ │ │ │ ├── 1_sample.sii
│ │ │ │ │ ├── 2_sample.sii
│ │ │ │ │ └── 3_sample.sii
│ │ │ │ ├── r_wheel/
│ │ │ │ │ └── steel_sample.sii
│ │ │ │ ├── traffic_storage_semi_trailer.sample.sii
│ │ │ │ ├── trailer/
│ │ │ │ │ ├── food_cistern_sample/
│ │ │ │ │ │ └── chassis.sii
│ │ │ │ │ ├── food_cistern_sample.sii
│ │ │ │ │ └── food_cistern_traffic_sample.sii
│ │ │ │ ├── trailer_storage.sample.sii
│ │ │ │ └── truck/
│ │ │ │ └── scania.r/
│ │ │ │ └── accessory/
│ │ │ │ └── f_grill/
│ │ │ │ └── shape_sample.sii
│ │ │ └── world/
│ │ │ ├── model.sample.sii
│ │ │ ├── mover.sample.sii
│ │ │ ├── semaphore_profile.sii
│ │ │ ├── sign.sii
│ │ │ └── traffic_rules.sii
│ │ ├── material/
│ │ │ ├── environment/
│ │ │ │ ├── building_reflection/
│ │ │ │ │ ├── building_ref.tga
│ │ │ │ │ └── building_ref.tobj
│ │ │ │ ├── generic_s.tga
│ │ │ │ └── vehicle_reflection.tobj
│ │ │ └── road/
│ │ │ ├── kerb_tile.tga
│ │ │ ├── kerb_tile.tobj
│ │ │ ├── rough_asphalt.tga
│ │ │ ├── rough_asphalt.tobj
│ │ │ ├── small_block_pavement.tga
│ │ │ ├── small_block_pavement.tobj
│ │ │ ├── small_starblock_pavement.tga
│ │ │ └── small_starblock_pavement.tobj
│ │ ├── model/
│ │ │ ├── building/
│ │ │ │ └── administration/
│ │ │ │ ├── corner_1.tga
│ │ │ │ ├── corner_1.tobj
│ │ │ │ ├── corner_2.tga
│ │ │ │ ├── corner_2.tobj
│ │ │ │ ├── corner_3.tga
│ │ │ │ ├── corner_3.tobj
│ │ │ │ ├── corner_sample.pim
│ │ │ │ └── corner_sample.pit
│ │ │ ├── mover/
│ │ │ │ ├── characters/
│ │ │ │ │ ├── animations/
│ │ │ │ │ │ └── man/
│ │ │ │ │ │ └── walk/
│ │ │ │ │ │ └── walk_sample.pia
│ │ │ │ │ ├── models/
│ │ │ │ │ │ └── generic/
│ │ │ │ │ │ ├── m_vanilla_ice_sample.pim
│ │ │ │ │ │ └── m_vanilla_ice_sample.pit
│ │ │ │ │ ├── skeletons/
│ │ │ │ │ │ └── man_sample.pis
│ │ │ │ │ └── textures/
│ │ │ │ │ ├── body/
│ │ │ │ │ │ ├── man_body_02_lum.tga
│ │ │ │ │ │ ├── man_body_02_lum.tobj
│ │ │ │ │ │ ├── man_body_02_no.tga
│ │ │ │ │ │ ├── man_body_02_no.tobj
│ │ │ │ │ │ ├── wear_str_01.tga
│ │ │ │ │ │ └── wear_str_01.tobj
│ │ │ │ │ └── heads/
│ │ │ │ │ ├── man_vanila_ice.tga
│ │ │ │ │ ├── man_vanila_ice.tobj
│ │ │ │ │ ├── man_vanila_ice_no.tga
│ │ │ │ │ └── man_vanila_ice_no.tobj
│ │ │ │ ├── wind_powerplant.tga
│ │ │ │ ├── wind_powerplant.tobj
│ │ │ │ ├── wind_powerplant_sample.pim
│ │ │ │ ├── wind_powerplant_sample.pis
│ │ │ │ ├── wind_powerplant_sample.pit
│ │ │ │ └── wind_pp_sample.pia
│ │ │ └── village_far/
│ │ │ └── village_cz/
│ │ │ ├── village_cz.tga
│ │ │ ├── village_cz.tobj
│ │ │ ├── village_cz_4_sample.pim
│ │ │ └── village_cz_4_sample.pit
│ │ ├── unit/
│ │ │ └── hookup/
│ │ │ ├── billboard_manager.sii
│ │ │ ├── cutscene_instance.sii
│ │ │ ├── fire2.sii
│ │ │ ├── foto_01.sii
│ │ │ ├── foto_02.sii
│ │ │ ├── foto_03.sii
│ │ │ ├── garage_door.sii
│ │ │ ├── gas_lamp_small.sii
│ │ │ ├── lamp.sii
│ │ │ ├── lamp_scale_2.sii
│ │ │ ├── lamp_small.sii
│ │ │ ├── lamp_verysmall.sii
│ │ │ ├── lamp_verysmall_2.sii
│ │ │ ├── license_plate.sii
│ │ │ ├── license_plate_rear.sii
│ │ │ ├── lights/
│ │ │ │ ├── 2_shaped_lamp_light.sii
│ │ │ │ ├── 2_shaped_lamp_lux_light.sii
│ │ │ │ ├── aberdeen_bridge_light.sii
│ │ │ │ ├── ambient_no_source.sii
│ │ │ │ ├── amsterdam_port_omni_light.sii
│ │ │ │ ├── aquaducts_netherlands_light.sii
│ │ │ │ ├── arlberg_tunnel_light.sii
│ │ │ │ ├── basement_omni_light.sii
│ │ │ │ ├── block_of_flats_omni_light.sii
│ │ │ │ ├── bus_noflare.sii
│ │ │ │ ├── cholupice_tunnel_light.sii
│ │ │ │ ├── city_tunnel_light.sii
│ │ │ │ ├── delaer_int_big.sii
│ │ │ │ ├── exp_garage_door_light.sii
│ │ │ │ ├── exp_garage_interior_omni_light.sii
│ │ │ │ ├── ferry_interior_backlight_north.sii
│ │ │ │ ├── ferry_interior_north.sii
│ │ │ │ ├── garage_door_light.sii
│ │ │ │ ├── garage_interior_omni_light.sii
│ │ │ │ ├── garage_lamp_light.sii
│ │ │ │ ├── gas_ceiling_light.sii
│ │ │ │ ├── gas_light.sii
│ │ │ │ ├── gas_spot_light.sii
│ │ │ │ ├── grimsby_bridge_light.sii
│ │ │ │ ├── heigh10m_nar_light.sii
│ │ │ │ ├── heigh10m_small_light.sii
│ │ │ │ ├── heigh13m_light.sii
│ │ │ │ ├── heigh15m_lamp_light.sii
│ │ │ │ ├── heigh15m_no_flare.sii
│ │ │ │ ├── heigh16m_big_light.sii
│ │ │ │ ├── heigh17m_lamp_light.sii
│ │ │ │ ├── heigh17m_no_flare.sii
│ │ │ │ ├── heigh18m_no_flare.sii
│ │ │ │ ├── heigh19m_cut17m_lamp_no_flare.sii
│ │ │ │ ├── heigh19m_lamp_light.sii
│ │ │ │ ├── heigh21m_no_flare.sii
│ │ │ │ ├── heigh22m_lamp_light.sii
│ │ │ │ ├── heigh25m_no_flare.sii
│ │ │ │ ├── heigh28m_no_flare.sii
│ │ │ │ ├── heigh3m_no_flare.sii
│ │ │ │ ├── heigh6m_no_flare.sii
│ │ │ │ ├── heigh6m_small_light.sii
│ │ │ │ ├── heigh9m_no_flare.sii
│ │ │ │ ├── heigh9m_small_light.sii
│ │ │ │ ├── highway_tunnel_light.sii
│ │ │ │ ├── highway_uk_tunnel_light.sii
│ │ │ │ ├── hotel_const_omni_light.sii
│ │ │ │ ├── hotel_restaurant_omni_light.sii
│ │ │ │ ├── hw2_tunnel_light.sii
│ │ │ │ ├── hw2_tunnel_rounded_light.sii
│ │ │ │ ├── koln_bridge_light.sii
│ │ │ │ ├── lamp_light_20m.sii
│ │ │ │ ├── lamp_nl_light.sii
│ │ │ │ ├── lamp_platform.sii
│ │ │ │ ├── lamp_poland_2hape_light.sii
│ │ │ │ ├── lochkov_single.sii
│ │ │ │ ├── lochkov_tshaped.sii
│ │ │ │ ├── lochkov_tunnel_light.sii
│ │ │ │ ├── mall_omni_light.sii
│ │ │ │ ├── netherl_molo_2_light.sii
│ │ │ │ ├── omni.sii
│ │ │ │ ├── parked_omni_light.sii
│ │ │ │ ├── poor_garage_interior_o_light.sii
│ │ │ │ ├── port_lamp_light.sii
│ │ │ │ ├── quarry_small_light.sii
│ │ │ │ ├── sculpture_omni.sii
│ │ │ │ ├── sellplan_lamp.sii
│ │ │ │ ├── sellplan_lamp_single.sii
│ │ │ │ ├── ship_light.sii
│ │ │ │ ├── sikorskiego_bridge_light.sii
│ │ │ │ ├── small_bl_of_flats_light.sii
│ │ │ │ ├── small_road_tunnel_light.sii
│ │ │ │ ├── small_tunnel_scan.sii
│ │ │ │ ├── stadium_omni_light.sii
│ │ │ │ ├── tollgate_lamp_light.sii
│ │ │ │ ├── train_light.sii
│ │ │ │ ├── truck_dealer_omni_light.sii
│ │ │ │ ├── tunnel_light_3lane_hw1.sii
│ │ │ │ ├── university_omni_light.sii
│ │ │ │ └── warehouse_greu_lamp_light.sii
│ │ │ ├── model_particle_dirt.sii
│ │ │ ├── model_particle_fog1.sii
│ │ │ ├── model_particle_fog2.sii
│ │ │ ├── no_weather_10x36.sii
│ │ │ ├── no_weather_13x11.sii
│ │ │ ├── no_weather_13x19.sii
│ │ │ ├── no_weather_13x50.sii
│ │ │ ├── no_weather_14x90.sii
│ │ │ ├── no_weather_15x34.sii
│ │ │ ├── no_weather_15x43.sii
│ │ │ ├── no_weather_15x75.sii
│ │ │ ├── no_weather_16x110.sii
│ │ │ ├── no_weather_18x30.sii
│ │ │ ├── no_weather_19x55.sii
│ │ │ ├── no_weather_20x21.sii
│ │ │ ├── no_weather_20x25.sii
│ │ │ ├── no_weather_20x30.sii
│ │ │ ├── no_weather_20x40.sii
│ │ │ ├── no_weather_25x47.sii
│ │ │ ├── no_weather_28x11.sii
│ │ │ ├── no_weather_28x13.sii
│ │ │ ├── no_weather_28x32.sii
│ │ │ ├── no_weather_30x150.sii
│ │ │ ├── no_weather_33x52.sii
│ │ │ ├── no_weather_36x70.sii
│ │ │ ├── no_weather_40x24.sii
│ │ │ ├── no_weather_40x30.sii
│ │ │ ├── no_weather_40x40.sii
│ │ │ ├── no_weather_40x70.sii
│ │ │ ├── no_weather_60x36.sii
│ │ │ ├── no_weather_60x64.sii
│ │ │ ├── no_weather_7x18.sii
│ │ │ ├── no_weather_9x90.sii
│ │ │ ├── orange_blinking.sii
│ │ │ ├── parked_car.sii
│ │ │ ├── pedestrians.sii
│ │ │ ├── red.sii
│ │ │ ├── red_blinking.sii
│ │ │ ├── ship_flare.sii
│ │ │ ├── sign_area.sii
│ │ │ ├── sign_city1_b0.sii
│ │ │ ├── sign_city1_b1.sii
│ │ │ ├── sign_city1_b2.sii
│ │ │ ├── sign_city1_small_b0.sii
│ │ │ ├── sign_city1_small_b1.sii
│ │ │ ├── sign_city1_small_b2.sii
│ │ │ ├── sign_city2_b0.sii
│ │ │ ├── sign_city2_b1.sii
│ │ │ ├── sign_city2_b2.sii
│ │ │ ├── sign_city2_small_b0.sii
│ │ │ ├── sign_city2_small_b1.sii
│ │ │ ├── sign_city2_small_b2.sii
│ │ │ ├── sign_flare.sii
│ │ │ ├── sign_road_0.sii
│ │ │ ├── sign_road_1.sii
│ │ │ ├── sign_road_2.sii
│ │ │ ├── sign_road_small_0.sii
│ │ │ ├── sign_road_small_1.sii
│ │ │ ├── sign_road_small_2.sii
│ │ │ ├── speed_camera.sii
│ │ │ ├── tollgate.sii
│ │ │ ├── tr_light_flares.sii
│ │ │ ├── trailer_beacon.sii
│ │ │ ├── tube_smoke.sii
│ │ │ ├── tube_smoke_slow.sii
│ │ │ ├── vehicle_aux_lights.sii
│ │ │ ├── vehicle_beacon.sii
│ │ │ ├── vehicle_bluel.sii
│ │ │ ├── vehicle_brakel.sii
│ │ │ ├── vehicle_halogenl.sii
│ │ │ ├── vehicle_headl.sii
│ │ │ ├── vehicle_high_beam.sii
│ │ │ ├── vehicle_lblinkerl.sii
│ │ │ ├── vehicle_orange_led_l.sii
│ │ │ ├── vehicle_orangel.sii
│ │ │ ├── vehicle_parkl.sii
│ │ │ ├── vehicle_rblinkerl.sii
│ │ │ ├── vehicle_rearl.sii
│ │ │ ├── vehicle_redl.sii
│ │ │ ├── vehicle_reversel.sii
│ │ │ ├── vehicle_white_led_l.sii
│ │ │ ├── vehicle_whitel.sii
│ │ │ ├── wheel_particle_dirt.sii
│ │ │ ├── wheel_particle_rain.sii
│ │ │ ├── wheel_particle_skid.sii
│ │ │ ├── wheel_particle_snow.sii
│ │ │ ├── wheel_particles.sii
│ │ │ └── yell_garage_light.sii
│ │ └── vehicle/
│ │ ├── trailer_eu/
│ │ │ ├── company/
│ │ │ │ ├── empty.tga
│ │ │ │ ├── empty.tobj
│ │ │ │ ├── euroacres.tga
│ │ │ │ ├── euroacres.tobj
│ │ │ │ ├── fcp.tga
│ │ │ │ ├── fcp.tobj
│ │ │ │ ├── trameri.tga
│ │ │ │ └── trameri.tobj
│ │ │ └── food_cistern/
│ │ │ ├── lamp_mask.tga
│ │ │ ├── lamp_mask.tobj
│ │ │ ├── lod_01_sample.pim
│ │ │ ├── lod_01_sample.pit
│ │ │ ├── lod_02_sample.pim
│ │ │ ├── lod_02_sample.pit
│ │ │ ├── plain.tga
│ │ │ ├── plain.tobj
│ │ │ ├── shadow.tga
│ │ │ ├── shadow.tobj
│ │ │ ├── trailer_sample.pic
│ │ │ ├── trailer_sample.pim
│ │ │ ├── trailer_sample.pit
│ │ │ ├── ui_shadow_sample.pim
│ │ │ └── ui_shadow_sample.pit
│ │ ├── truck/
│ │ │ └── upgrade/
│ │ │ ├── frontgrill/
│ │ │ │ └── scania_rcab_2009/
│ │ │ │ ├── frontgrill_09_sample.pim
│ │ │ │ └── frontgrill_09_sample.pit
│ │ │ ├── rim/
│ │ │ │ ├── front_steel_sample.pim
│ │ │ │ ├── front_steel_sample.pit
│ │ │ │ ├── rear_steel_sample.pim
│ │ │ │ └── rear_steel_sample.pit
│ │ │ ├── share/
│ │ │ │ ├── fence_wires.tga
│ │ │ │ ├── fence_wires.tobj
│ │ │ │ ├── upg_chrome.tga
│ │ │ │ ├── upg_chrome.tobj
│ │ │ │ ├── upg_shared.tga
│ │ │ │ └── upg_shared.tobj
│ │ │ ├── tire/
│ │ │ │ ├── front_1_sample.pim
│ │ │ │ ├── front_1_sample.pit
│ │ │ │ ├── rear_1_sample.pim
│ │ │ │ └── rear_1_sample.pit
│ │ │ └── wheel/
│ │ │ ├── front_1.tga
│ │ │ ├── front_1.tobj
│ │ │ ├── front_3.tga
│ │ │ ├── front_3.tobj
│ │ │ ├── front_5.tga
│ │ │ └── front_5.tobj
│ │ └── wheel/
│ │ └── steel/
│ │ ├── front_new.tga
│ │ ├── front_new.tobj
│ │ ├── front_sample.pim
│ │ ├── front_sample.pit
│ │ ├── rear_new_2.tga
│ │ ├── rear_new_2.tobj
│ │ ├── rear_sample.pim
│ │ ├── rear_sample.pit
│ │ ├── rear_trailer_new.tga
│ │ └── rear_trailer_new.tobj
│ ├── sample_prefab_base/
│ │ ├── def/
│ │ │ └── world/
│ │ │ ├── prefab.sample.sii
│ │ │ ├── semaphore_model.sample.sii
│ │ │ ├── semaphore_model.sii
│ │ │ ├── semaphore_profile.sample.sii
│ │ │ ├── semaphore_profile.sii
│ │ │ ├── sign.dlc_north.sii
│ │ │ ├── sign.sii
│ │ │ ├── traffic_rules.sii
│ │ │ └── trigger_action.sii
│ │ ├── material/
│ │ │ ├── environment/
│ │ │ │ └── building_reflection/
│ │ │ │ ├── building_ref.tobj
│ │ │ │ ├── building_ref1.tga
│ │ │ │ ├── building_ref2.tga
│ │ │ │ ├── building_ref3.tga
│ │ │ │ ├── building_ref4.tga
│ │ │ │ ├── building_ref5.tga
│ │ │ │ └── building_ref6.tga
│ │ │ ├── road/
│ │ │ │ ├── asphalt.mat
│ │ │ │ ├── asphalt.tga
│ │ │ │ ├── asphalt.tobj
│ │ │ │ ├── dark_c2.mat
│ │ │ │ ├── dark_c2.tga
│ │ │ │ ├── dark_c2.tobj
│ │ │ │ ├── lines.mat
│ │ │ │ ├── lines.tga
│ │ │ │ ├── lines.tobj
│ │ │ │ ├── road_template/
│ │ │ │ │ └── sc/
│ │ │ │ │ ├── asphalt_def_dk.tga
│ │ │ │ │ ├── asphalt_def_dk.tobj
│ │ │ │ │ ├── asphalt_def_swe.tga
│ │ │ │ │ ├── asphalt_def_swe.tobj
│ │ │ │ │ ├── asphalt_gray_dk.tga
│ │ │ │ │ ├── asphalt_gray_dk.tobj
│ │ │ │ │ ├── asphalt_light_gray.tga
│ │ │ │ │ ├── asphalt_light_gray.tobj
│ │ │ │ │ ├── asphalt_new_sc.tga
│ │ │ │ │ ├── asphalt_new_sc.tobj
│ │ │ │ │ ├── decal_def_dk.mat
│ │ │ │ │ ├── decal_def_dk.tga
│ │ │ │ │ ├── decal_def_dk.tobj
│ │ │ │ │ ├── dirt_def_dk.mat
│ │ │ │ │ ├── dirt_def_dk.tga
│ │ │ │ │ ├── dirt_def_dk.tobj
│ │ │ │ │ ├── dirt_def_swe.mat
│ │ │ │ │ ├── dirt_def_swe.tga
│ │ │ │ │ ├── dirt_def_swe.tobj
│ │ │ │ │ ├── dirt_gray_dk.mat
│ │ │ │ │ ├── dirt_gray_dk.tga
│ │ │ │ │ ├── dirt_gray_dk.tobj
│ │ │ │ │ ├── dirt_light_gray.mat
│ │ │ │ │ ├── dirt_light_gray.tga
│ │ │ │ │ ├── dirt_light_gray.tobj
│ │ │ │ │ ├── dirt_new_sc.mat
│ │ │ │ │ ├── dirt_new_sc.tga
│ │ │ │ │ ├── dirt_new_sc.tobj
│ │ │ │ │ ├── shoulder_01.mat
│ │ │ │ │ ├── shoulder_01.tga
│ │ │ │ │ ├── shoulder_01.tobj
│ │ │ │ │ ├── ter_trans_placeholder.mat
│ │ │ │ │ ├── ter_trans_placeholder.tga
│ │ │ │ │ └── ter_trans_placeholder.tobj
│ │ │ │ ├── rough_asphalt.mat
│ │ │ │ ├── rough_asphalt.tga
│ │ │ │ └── rough_asphalt.tobj
│ │ │ ├── special/
│ │ │ │ ├── cargo_01.dds
│ │ │ │ ├── cargo_01.tobj
│ │ │ │ ├── containers_gs_01.dds
│ │ │ │ ├── containers_gs_01.tobj
│ │ │ │ ├── containers_over_01.dds
│ │ │ │ ├── containers_over_01.tobj
│ │ │ │ ├── decal_ground_01.dds
│ │ │ │ ├── decal_ground_01.tobj
│ │ │ │ ├── decal_light_01.dds
│ │ │ │ ├── decal_light_01.tobj
│ │ │ │ ├── decal_typo_01.dds
│ │ │ │ ├── decal_typo_01.tobj
│ │ │ │ ├── doors_00.dds
│ │ │ │ ├── doors_00.tobj
│ │ │ │ ├── electro_00.dds
│ │ │ │ ├── electro_00.tobj
│ │ │ │ ├── glass_building_01.dds
│ │ │ │ ├── glass_building_01.tobj
│ │ │ │ ├── lights_01.dds
│ │ │ │ ├── lights_01.tobj
│ │ │ │ ├── lines_eu_01.dds
│ │ │ │ ├── lines_eu_01.tobj
│ │ │ │ ├── vegetation_city_01.dds
│ │ │ │ ├── vegetation_city_01.tobj
│ │ │ │ ├── window_frames_01.dds
│ │ │ │ ├── window_frames_01.tobj
│ │ │ │ ├── window_interior_01.dds
│ │ │ │ └── window_interior_01.tobj
│ │ │ ├── terrain/
│ │ │ │ ├── asphalt_tiles_eu_01.dds
│ │ │ │ ├── asphalt_tiles_eu_01.mat
│ │ │ │ ├── asphalt_tiles_eu_01.tobj
│ │ │ │ ├── dirt_2_512.dds
│ │ │ │ ├── dirt_2_512.mat
│ │ │ │ ├── dirt_2_512.tobj
│ │ │ │ ├── dirt_3_512.dds
│ │ │ │ ├── dirt_3_512.mat
│ │ │ │ ├── dirt_3_512.tobj
│ │ │ │ ├── grass_city_main_sc.dds
│ │ │ │ ├── grass_city_main_sc.mat
│ │ │ │ ├── grass_city_main_sc.tobj
│ │ │ │ ├── grass_dusty_main.dds
│ │ │ │ ├── grass_dusty_main.mat
│ │ │ │ ├── grass_dusty_main.tobj
│ │ │ │ ├── grass_ger_main.dds
│ │ │ │ ├── grass_ger_main.mat
│ │ │ │ ├── grass_ger_main.tobj
│ │ │ │ ├── grass_ger_x_semidry_main.dds
│ │ │ │ ├── grass_ger_x_semidry_main.mat
│ │ │ │ ├── grass_ger_x_semidry_main.tobj
│ │ │ │ ├── grass_green_main.dds
│ │ │ │ ├── grass_green_main.mat
│ │ │ │ ├── grass_green_main.tobj
│ │ │ │ ├── grass_light_green_main.dds
│ │ │ │ ├── grass_light_green_main.mat
│ │ │ │ └── grass_light_green_main.tobj
│ │ │ └── tiled/
│ │ │ ├── asphalt_tiles_eu_01.tobj
│ │ │ ├── bricks_gs_01.dds
│ │ │ ├── bricks_gs_01.tobj
│ │ │ ├── bricks_over_01.dds
│ │ │ ├── bricks_over_01.tobj
│ │ │ ├── concrete_gs_01.dds
│ │ │ ├── concrete_gs_01.tobj
│ │ │ ├── concrete_over_01.dds
│ │ │ ├── concrete_over_01.tobj
│ │ │ ├── decal_building_01.dds
│ │ │ ├── decal_building_01.tobj
│ │ │ ├── iamod_building_01.dds
│ │ │ ├── iamod_building_01.tobj
│ │ │ ├── metal_alpha_01.dds
│ │ │ ├── metal_alpha_01.tobj
│ │ │ ├── metal_fences_01.dds
│ │ │ ├── metal_fences_01.tobj
│ │ │ ├── metal_gs_01.dds
│ │ │ ├── metal_gs_01.tobj
│ │ │ ├── metal_over_01.dds
│ │ │ ├── metal_over_01.tobj
│ │ │ ├── metal_plates_gs_01.dds
│ │ │ ├── metal_plates_gs_01.tobj
│ │ │ ├── metal_plates_gs_02.dds
│ │ │ ├── metal_plates_gs_02.tobj
│ │ │ ├── metal_plates_over_02.dds
│ │ │ ├── metal_plates_over_02.tobj
│ │ │ ├── plaster_gs_01.dds
│ │ │ ├── plaster_gs_01.tobj
│ │ │ ├── plaster_over_01.dds
│ │ │ ├── plaster_over_01.tobj
│ │ │ ├── sidewalk_scan_01.dds
│ │ │ ├── sidewalk_scan_01.tobj
│ │ │ ├── stripes_01.dds
│ │ │ ├── stripes_01.tobj
│ │ │ ├── wood_gs_01.dds
│ │ │ ├── wood_gs_01.tobj
│ │ │ ├── wood_over_01.dds
│ │ │ └── wood_over_01.tobj
│ │ ├── prefab/
│ │ │ ├── company/
│ │ │ │ ├── seafood_company_sample.pim
│ │ │ │ ├── seafood_company_sample.pip
│ │ │ │ └── seafood_company_sample.pit
│ │ │ ├── cross/
│ │ │ │ ├── road2_x_road1_sample.pim
│ │ │ │ ├── road2_x_road1_sample.pip
│ │ │ │ └── road2_x_road1_sample.pit
│ │ │ ├── cross_temp/
│ │ │ │ └── sample/
│ │ │ │ ├── r1_x_r1_y_tmpl.pim
│ │ │ │ ├── r1_x_r1_y_tmpl.pip
│ │ │ │ └── r1_x_r1_y_tmpl.pit
│ │ │ ├── gas/
│ │ │ │ ├── gas_small_road_sample.pim
│ │ │ │ ├── gas_small_road_sample.pip
│ │ │ │ └── gas_small_road_sample.pit
│ │ │ └── tollgate/
│ │ │ └── tollgate_sample/
│ │ │ ├── france.tga
│ │ │ ├── france.tobj
│ │ │ ├── italy.tga
│ │ │ ├── italy.tobj
│ │ │ ├── kanal.tga
│ │ │ ├── kanal.tobj
│ │ │ ├── road_decal_001.tga
│ │ │ ├── road_decal_001.tobj
│ │ │ ├── t_small_dwn.pia
│ │ │ ├── t_small_up.pia
│ │ │ ├── toll_small_blue.dds
│ │ │ ├── toll_small_blue.tobj
│ │ │ ├── toll_small_red.dds
│ │ │ ├── toll_small_red.tobj
│ │ │ ├── toll_small_yellow.dds
│ │ │ ├── toll_small_yellow.tobj
│ │ │ ├── tollgate_small.pim
│ │ │ ├── tollgate_small.pip
│ │ │ ├── tollgate_small.pit
│ │ │ ├── tollgate_small_anim.pic
│ │ │ ├── tollgate_small_anim.pim
│ │ │ ├── tollgate_small_anim.pis
│ │ │ ├── tollgate_small_anim.pit
│ │ │ ├── warehouse_orange_fence.tga
│ │ │ └── warehouse_orange_fence.tobj
│ │ └── unit/
│ │ └── hookup/
│ │ ├── billboard_manager.sii
│ │ ├── cutscene_instance.sii
│ │ ├── fire2.sii
│ │ ├── foto_01.sii
│ │ ├── foto_02.sii
│ │ ├── foto_03.sii
│ │ ├── garage_door.sii
│ │ ├── gas_lamp_small.sii
│ │ ├── lamp.sii
│ │ ├── lamp_scale_2.sii
│ │ ├── lamp_small.sii
│ │ ├── lamp_verysmall.sii
│ │ ├── lamp_verysmall_2.sii
│ │ ├── license_plate.sii
│ │ ├── license_plate_rear.sii
│ │ ├── lights/
│ │ │ ├── 2_shaped_lamp_light.sii
│ │ │ ├── 2_shaped_lamp_lux_light.sii
│ │ │ ├── aberdeen_bridge_light.sii
│ │ │ ├── ambient_no_source.sii
│ │ │ ├── amsterdam_port_omni_light.sii
│ │ │ ├── aquaducts_netherlands_light.sii
│ │ │ ├── arlberg_tunnel_light.sii
│ │ │ ├── basement_omni_light.sii
│ │ │ ├── block_of_flats_omni_light.sii
│ │ │ ├── bus_noflare.sii
│ │ │ ├── cholupice_tunnel_light.sii
│ │ │ ├── city_tunnel_light.sii
│ │ │ ├── delaer_int_big.sii
│ │ │ ├── exp_garage_door_light.sii
│ │ │ ├── exp_garage_interior_omni_light.sii
│ │ │ ├── ferry_interior_backlight_north.sii
│ │ │ ├── ferry_interior_north.sii
│ │ │ ├── garage_door_light.sii
│ │ │ ├── garage_interior_omni_light.sii
│ │ │ ├── garage_lamp_light.sii
│ │ │ ├── gas_ceiling_light.sii
│ │ │ ├── gas_light.sii
│ │ │ ├── gas_spot_light.sii
│ │ │ ├── grimsby_bridge_light.sii
│ │ │ ├── heigh10m_nar_light.sii
│ │ │ ├── heigh10m_small_light.sii
│ │ │ ├── heigh13m_light.sii
│ │ │ ├── heigh15m_lamp_light.sii
│ │ │ ├── heigh15m_no_flare.sii
│ │ │ ├── heigh16m_big_light.sii
│ │ │ ├── heigh17m_lamp_light.sii
│ │ │ ├── heigh17m_no_flare.sii
│ │ │ ├── heigh18m_no_flare.sii
│ │ │ ├── heigh19m_cut17m_lamp_no_flare.sii
│ │ │ ├── heigh19m_lamp_light.sii
│ │ │ ├── heigh21m_no_flare.sii
│ │ │ ├── heigh22m_lamp_light.sii
│ │ │ ├── heigh25m_no_flare.sii
│ │ │ ├── heigh28m_no_flare.sii
│ │ │ ├── heigh3m_no_flare.sii
│ │ │ ├── heigh6m_no_flare.sii
│ │ │ ├── heigh6m_small_light.sii
│ │ │ ├── heigh9m_no_flare.sii
│ │ │ ├── heigh9m_small_light.sii
│ │ │ ├── highway_tunnel_light.sii
│ │ │ ├── highway_uk_tunnel_light.sii
│ │ │ ├── hotel_const_omni_light.sii
│ │ │ ├── hotel_restaurant_omni_light.sii
│ │ │ ├── hw2_tunnel_light.sii
│ │ │ ├── hw2_tunnel_rounded_light.sii
│ │ │ ├── koln_bridge_light.sii
│ │ │ ├── lamp_light_20m.sii
│ │ │ ├── lamp_nl_light.sii
│ │ │ ├── lamp_platform.sii
│ │ │ ├── lamp_poland_2hape_light.sii
│ │ │ ├── lochkov_single.sii
│ │ │ ├── lochkov_tshaped.sii
│ │ │ ├── lochkov_tunnel_light.sii
│ │ │ ├── mall_omni_light.sii
│ │ │ ├── netherl_molo_2_light.sii
│ │ │ ├── omni.sii
│ │ │ ├── parked_omni_light.sii
│ │ │ ├── poor_garage_interior_o_light.sii
│ │ │ ├── port_lamp_light.sii
│ │ │ ├── quarry_small_light.sii
│ │ │ ├── sculpture_omni.sii
│ │ │ ├── sellplan_lamp.sii
│ │ │ ├── sellplan_lamp_single.sii
│ │ │ ├── ship_light.sii
│ │ │ ├── sikorskiego_bridge_light.sii
│ │ │ ├── small_bl_of_flats_light.sii
│ │ │ ├── small_road_tunnel_light.sii
│ │ │ ├── small_tunnel_scan.sii
│ │ │ ├── stadium_omni_light.sii
│ │ │ ├── tollgate_lamp_light.sii
│ │ │ ├── train_light.sii
│ │ │ ├── truck_dealer_omni_light.sii
│ │ │ ├── tunnel_light_3lane_hw1.sii
│ │ │ ├── university_omni_light.sii
│ │ │ └── warehouse_greu_lamp_light.sii
│ │ ├── model_particle_dirt.sii
│ │ ├── model_particle_fog1.sii
│ │ ├── model_particle_fog2.sii
│ │ ├── no_weather_10x36.sii
│ │ ├── no_weather_13x11.sii
│ │ ├── no_weather_13x19.sii
│ │ ├── no_weather_13x50.sii
│ │ ├── no_weather_14x90.sii
│ │ ├── no_weather_15x34.sii
│ │ ├── no_weather_15x43.sii
│ │ ├── no_weather_15x75.sii
│ │ ├── no_weather_16x110.sii
│ │ ├── no_weather_18x30.sii
│ │ ├── no_weather_19x55.sii
│ │ ├── no_weather_20x21.sii
│ │ ├── no_weather_20x25.sii
│ │ ├── no_weather_20x30.sii
│ │ ├── no_weather_20x40.sii
│ │ ├── no_weather_25x47.sii
│ │ ├── no_weather_28x11.sii
│ │ ├── no_weather_28x13.sii
│ │ ├── no_weather_28x32.sii
│ │ ├── no_weather_30x150.sii
│ │ ├── no_weather_33x52.sii
│ │ ├── no_weather_36x70.sii
│ │ ├── no_weather_40x24.sii
│ │ ├── no_weather_40x30.sii
│ │ ├── no_weather_40x40.sii
│ │ ├── no_weather_40x70.sii
│ │ ├── no_weather_60x36.sii
│ │ ├── no_weather_60x64.sii
│ │ ├── no_weather_7x18.sii
│ │ ├── no_weather_9x90.sii
│ │ ├── orange_blinking.sii
│ │ ├── parked_car.sii
│ │ ├── pedestrians.sii
│ │ ├── red.sii
│ │ ├── red_blinking.sii
│ │ ├── ship_flare.sii
│ │ ├── sign_area.sii
│ │ ├── sign_city1_b0.sii
│ │ ├── sign_city1_b1.sii
│ │ ├── sign_city1_b2.sii
│ │ ├── sign_city1_small_b0.sii
│ │ ├── sign_city1_small_b1.sii
│ │ ├── sign_city1_small_b2.sii
│ │ ├── sign_city2_b0.sii
│ │ ├── sign_city2_b1.sii
│ │ ├── sign_city2_b2.sii
│ │ ├── sign_city2_small_b0.sii
│ │ ├── sign_city2_small_b1.sii
│ │ ├── sign_city2_small_b2.sii
│ │ ├── sign_flare.sii
│ │ ├── sign_road_0.sii
│ │ ├── sign_road_1.sii
│ │ ├── sign_road_2.sii
│ │ ├── sign_road_small_0.sii
│ │ ├── sign_road_small_1.sii
│ │ ├── sign_road_small_2.sii
│ │ ├── speed_camera.sii
│ │ ├── tollgate.sii
│ │ ├── tr_light_flares.sii
│ │ ├── trailer_beacon.sii
│ │ ├── tube_smoke.sii
│ │ ├── tube_smoke_slow.sii
│ │ ├── vehicle_aux_lights.sii
│ │ ├── vehicle_beacon.sii
│ │ ├── vehicle_bluel.sii
│ │ ├── vehicle_brakel.sii
│ │ ├── vehicle_halogenl.sii
│ │ ├── vehicle_headl.sii
│ │ ├── vehicle_high_beam.sii
│ │ ├── vehicle_lblinkerl.sii
│ │ ├── vehicle_orange_led_l.sii
│ │ ├── vehicle_orangel.sii
│ │ ├── vehicle_parkl.sii
│ │ ├── vehicle_rblinkerl.sii
│ │ ├── vehicle_rearl.sii
│ │ ├── vehicle_redl.sii
│ │ ├── vehicle_reversel.sii
│ │ ├── vehicle_white_led_l.sii
│ │ ├── vehicle_whitel.sii
│ │ ├── wheel_particle_dirt.sii
│ │ ├── wheel_particle_rain.sii
│ │ ├── wheel_particle_skid.sii
│ │ ├── wheel_particle_snow.sii
│ │ ├── wheel_particles.sii
│ │ └── yell_garage_light.sii
│ └── sample_truck_base/
│ ├── def/
│ │ └── vehicle/
│ │ ├── truck/
│ │ │ └── man.tgx.sample/
│ │ │ ├── accessory/
│ │ │ │ ├── b_grill/
│ │ │ │ │ └── shape1.sii
│ │ │ │ ├── beacon/
│ │ │ │ │ └── shape1.sii
│ │ │ │ ├── codrv_plate/
│ │ │ │ │ └── plate.sii
│ │ │ │ ├── curtain_f/
│ │ │ │ │ └── curtain_f.dlc_toys.sii
│ │ │ │ ├── doorhndl/
│ │ │ │ │ └── shape1.sii
│ │ │ │ ├── doorstep/
│ │ │ │ │ └── shape1.sii
│ │ │ │ ├── drv_plate/
│ │ │ │ │ └── plate.sii
│ │ │ │ ├── exhaust_l/
│ │ │ │ │ └── shape1.sii
│ │ │ │ ├── exhaust_r/
│ │ │ │ │ └── shape1.sii
│ │ │ │ ├── f_grill/
│ │ │ │ │ └── shape2.sii
│ │ │ │ ├── f_mirror/
│ │ │ │ │ └── shape2.sii
│ │ │ │ ├── mirror/
│ │ │ │ │ └── shape1.sii
│ │ │ │ ├── r_grill/
│ │ │ │ │ └── shape1_c.sii
│ │ │ │ ├── s_mirror/
│ │ │ │ │ └── shape1.sii
│ │ │ │ ├── set_dashbrd/
│ │ │ │ │ └── set1.dlc_toys.sii
│ │ │ │ ├── set_glass/
│ │ │ │ │ └── set1.dlc_toys.sii
│ │ │ │ ├── set_lglass/
│ │ │ │ │ └── gps.dlc_toys.sii
│ │ │ │ ├── sideskirt/
│ │ │ │ │ └── shape1.sii
│ │ │ │ ├── sunshld/
│ │ │ │ │ └── shape1_c.sii
│ │ │ │ ├── toybig/
│ │ │ │ │ └── coolbox.dlc_toys.sii
│ │ │ │ ├── toyhang/
│ │ │ │ │ └── ball_cue.dlc_toys.sii
│ │ │ │ ├── toyseat/
│ │ │ │ │ └── sportbag.dlc_toys.sii
│ │ │ │ └── toystand/
│ │ │ │ └── cap.dlc_toys.sii
│ │ │ ├── badge/
│ │ │ │ └── 18320.sii
│ │ │ ├── cabin/
│ │ │ │ └── xl_cab.sii
│ │ │ ├── chassis/
│ │ │ │ ├── 4x2.sii
│ │ │ │ └── 6x2_4_midlift.sii
│ │ │ ├── chs_badges/
│ │ │ │ ├── chs_badges_18.sii
│ │ │ │ └── chs_badges_26.sii
│ │ │ ├── data.sii
│ │ │ ├── engine/
│ │ │ │ └── d2066_235.sii
│ │ │ ├── head_light/
│ │ │ │ └── standard.sii
│ │ │ ├── interior/
│ │ │ │ ├── animations.sui
│ │ │ │ ├── animations_uk.sui
│ │ │ │ ├── dashboard_color.sui
│ │ │ │ ├── exclusive_low.sii
│ │ │ │ ├── exclusive_uk_low.sii
│ │ │ │ ├── seat.sui
│ │ │ │ ├── seat_uk.sui
│ │ │ │ ├── standard_low.sii
│ │ │ │ └── standard_uk_low.sii
│ │ │ ├── paint_job/
│ │ │ │ ├── color0.sii
│ │ │ │ ├── color0m.sii
│ │ │ │ └── style2_c.sii
│ │ │ ├── sound/
│ │ │ │ ├── exterior.sii
│ │ │ │ └── interior.sii
│ │ │ └── transmission/
│ │ │ ├── 12_speed.sii
│ │ │ └── 12_speed_ret.sii
│ │ ├── truck_dealer/
│ │ │ └── man/
│ │ │ └── man_0.sii
│ │ ├── truck_dealer_uk/
│ │ │ └── man/
│ │ │ └── man_0.sii
│ │ ├── truck_desktop/
│ │ │ └── man_sample.sii
│ │ └── truck_desktop_uk/
│ │ └── man_sample.sii
│ ├── material/
│ │ ├── environment/
│ │ │ ├── building_reflection/
│ │ │ │ ├── building_ref.tga
│ │ │ │ └── building_ref.tobj
│ │ │ ├── generic_b.tga
│ │ │ ├── generic_reflection.tobj
│ │ │ ├── generic_s.tga
│ │ │ ├── generic_t.tga
│ │ │ ├── interior_reflection.tobj
│ │ │ └── vehicle_reflection.tobj
│ │ └── ui/
│ │ └── accessory/
│ │ └── man_sample.mat
│ ├── unit/
│ │ └── hookup/
│ │ ├── billboard_manager.sii
│ │ ├── cutscene_instance.sii
│ │ ├── fire2.sii
│ │ ├── foto_01.sii
│ │ ├── foto_02.sii
│ │ ├── foto_03.sii
│ │ ├── garage_door.sii
│ │ ├── gas_lamp_small.sii
│ │ ├── lamp.sii
│ │ ├── lamp_scale_2.sii
│ │ ├── lamp_small.sii
│ │ ├── lamp_verysmall.sii
│ │ ├── lamp_verysmall_2.sii
│ │ ├── license_plate.sii
│ │ ├── license_plate_rear.sii
│ │ ├── lights/
│ │ │ ├── 2_shaped_lamp_light.sii
│ │ │ ├── 2_shaped_lamp_lux_light.sii
│ │ │ ├── aberdeen_bridge_light.sii
│ │ │ ├── ambient_no_source.sii
│ │ │ ├── amsterdam_port_omni_light.sii
│ │ │ ├── aquaducts_netherlands_light.sii
│ │ │ ├── arlberg_tunnel_light.sii
│ │ │ ├── basement_omni_light.sii
│ │ │ ├── block_of_flats_omni_light.sii
│ │ │ ├── bus_noflare.sii
│ │ │ ├── cholupice_tunnel_light.sii
│ │ │ ├── city_tunnel_light.sii
│ │ │ ├── delaer_int_big.sii
│ │ │ ├── exp_garage_door_light.sii
│ │ │ ├── exp_garage_interior_omni_light.sii
│ │ │ ├── ferry_interior_backlight_north.sii
│ │ │ ├── ferry_interior_north.sii
│ │ │ ├── garage_door_light.sii
│ │ │ ├── garage_interior_omni_light.sii
│ │ │ ├── garage_lamp_light.sii
│ │ │ ├── gas_ceiling_light.sii
│ │ │ ├── gas_light.sii
│ │ │ ├── gas_spot_light.sii
│ │ │ ├── grimsby_bridge_light.sii
│ │ │ ├── heigh10m_nar_light.sii
│ │ │ ├── heigh10m_small_light.sii
│ │ │ ├── heigh13m_light.sii
│ │ │ ├── heigh15m_lamp_light.sii
│ │ │ ├── heigh15m_no_flare.sii
│ │ │ ├── heigh16m_big_light.sii
│ │ │ ├── heigh17m_lamp_light.sii
│ │ │ ├── heigh17m_no_flare.sii
│ │ │ ├── heigh18m_no_flare.sii
│ │ │ ├── heigh19m_cut17m_lamp_no_flare.sii
│ │ │ ├── heigh19m_lamp_light.sii
│ │ │ ├── heigh21m_no_flare.sii
│ │ │ ├── heigh22m_lamp_light.sii
│ │ │ ├── heigh25m_no_flare.sii
│ │ │ ├── heigh28m_no_flare.sii
│ │ │ ├── heigh3m_no_flare.sii
│ │ │ ├── heigh6m_no_flare.sii
│ │ │ ├── heigh6m_small_light.sii
│ │ │ ├── heigh9m_no_flare.sii
│ │ │ ├── heigh9m_small_light.sii
│ │ │ ├── highway_tunnel_light.sii
│ │ │ ├── highway_uk_tunnel_light.sii
│ │ │ ├── hotel_const_omni_light.sii
│ │ │ ├── hotel_restaurant_omni_light.sii
│ │ │ ├── hw2_tunnel_light.sii
│ │ │ ├── hw2_tunnel_rounded_light.sii
│ │ │ ├── koln_bridge_light.sii
│ │ │ ├── lamp_light_20m.sii
│ │ │ ├── lamp_nl_light.sii
│ │ │ ├── lamp_platform.sii
│ │ │ ├── lamp_poland_2hape_light.sii
│ │ │ ├── lochkov_single.sii
│ │ │ ├── lochkov_tshaped.sii
│ │ │ ├── lochkov_tunnel_light.sii
│ │ │ ├── mall_omni_light.sii
│ │ │ ├── netherl_molo_2_light.sii
│ │ │ ├── omni.sii
│ │ │ ├── parked_omni_light.sii
│ │ │ ├── poor_garage_interior_o_light.sii
│ │ │ ├── port_lamp_light.sii
│ │ │ ├── quarry_small_light.sii
│ │ │ ├── sculpture_omni.sii
│ │ │ ├── sellplan_lamp.sii
│ │ │ ├── sellplan_lamp_single.sii
│ │ │ ├── ship_light.sii
│ │ │ ├── sikorskiego_bridge_light.sii
│ │ │ ├── small_bl_of_flats_light.sii
│ │ │ ├── small_road_tunnel_light.sii
│ │ │ ├── small_tunnel_scan.sii
│ │ │ ├── stadium_omni_light.sii
│ │ │ ├── tollgate_lamp_light.sii
│ │ │ ├── train_light.sii
│ │ │ ├── truck_dealer_omni_light.sii
│ │ │ ├── tunnel_light_3lane_hw1.sii
│ │ │ ├── university_omni_light.sii
│ │ │ └── warehouse_greu_lamp_light.sii
│ │ ├── model_particle_dirt.sii
│ │ ├── model_particle_fog1.sii
│ │ ├── model_particle_fog2.sii
│ │ ├── no_weather_10x36.sii
│ │ ├── no_weather_13x11.sii
│ │ ├── no_weather_13x19.sii
│ │ ├── no_weather_13x50.sii
│ │ ├── no_weather_14x90.sii
│ │ ├── no_weather_15x34.sii
│ │ ├── no_weather_15x43.sii
│ │ ├── no_weather_15x75.sii
│ │ ├── no_weather_16x110.sii
│ │ ├── no_weather_18x30.sii
│ │ ├── no_weather_19x55.sii
│ │ ├── no_weather_20x21.sii
│ │ ├── no_weather_20x25.sii
│ │ ├── no_weather_20x30.sii
│ │ ├── no_weather_20x40.sii
│ │ ├── no_weather_25x47.sii
│ │ ├── no_weather_28x11.sii
│ │ ├── no_weather_28x13.sii
│ │ ├── no_weather_28x32.sii
│ │ ├── no_weather_30x150.sii
│ │ ├── no_weather_33x52.sii
│ │ ├── no_weather_36x70.sii
│ │ ├── no_weather_40x24.sii
│ │ ├── no_weather_40x30.sii
│ │ ├── no_weather_40x40.sii
│ │ ├── no_weather_40x70.sii
│ │ ├── no_weather_60x36.sii
│ │ ├── no_weather_60x64.sii
│ │ ├── no_weather_7x18.sii
│ │ ├── no_weather_9x90.sii
│ │ ├── orange_blinking.sii
│ │ ├── parked_car.sii
│ │ ├── pedestrians.sii
│ │ ├── red.sii
│ │ ├── red_blinking.sii
│ │ ├── ship_flare.sii
│ │ ├── sign_area.sii
│ │ ├── sign_city1_b0.sii
│ │ ├── sign_city1_b1.sii
│ │ ├── sign_city1_b2.sii
│ │ ├── sign_city1_small_b0.sii
│ │ ├── sign_city1_small_b1.sii
│ │ ├── sign_city1_small_b2.sii
│ │ ├── sign_city2_b0.sii
│ │ ├── sign_city2_b1.sii
│ │ ├── sign_city2_b2.sii
│ │ ├── sign_city2_small_b0.sii
│ │ ├── sign_city2_small_b1.sii
│ │ ├── sign_city2_small_b2.sii
│ │ ├── sign_flare.sii
│ │ ├── sign_road_0.sii
│ │ ├── sign_road_1.sii
│ │ ├── sign_road_2.sii
│ │ ├── sign_road_small_0.sii
│ │ ├── sign_road_small_1.sii
│ │ ├── sign_road_small_2.sii
│ │ ├── speed_camera.sii
│ │ ├── tollgate.sii
│ │ ├── tr_light_flares.sii
│ │ ├── trailer_beacon.sii
│ │ ├── tube_smoke.sii
│ │ ├── tube_smoke_slow.sii
│ │ ├── vehicle_aux_lights.sii
│ │ ├── vehicle_beacon.sii
│ │ ├── vehicle_bluel.sii
│ │ ├── vehicle_brakel.sii
│ │ ├── vehicle_halogenl.sii
│ │ ├── vehicle_headl.sii
│ │ ├── vehicle_high_beam.sii
│ │ ├── vehicle_lblinkerl.sii
│ │ ├── vehicle_orange_led_l.sii
│ │ ├── vehicle_orangel.sii
│ │ ├── vehicle_parkl.sii
│ │ ├── vehicle_rblinkerl.sii
│ │ ├── vehicle_rearl.sii
│ │ ├── vehicle_redl.sii
│ │ ├── vehicle_reversel.sii
│ │ ├── vehicle_white_led_l.sii
│ │ ├── vehicle_whitel.sii
│ │ ├── wheel_particle_dirt.sii
│ │ ├── wheel_particle_rain.sii
│ │ ├── wheel_particle_skid.sii
│ │ ├── wheel_particle_snow.sii
│ │ ├── wheel_particles.sii
│ │ └── yell_garage_light.sii
│ └── vehicle/
│ └── truck/
│ ├── man_tgx_sample/
│ │ ├── color.tga
│ │ ├── color.tobj
│ │ ├── interior/
│ │ │ ├── anim.pim
│ │ │ ├── anim.pis
│ │ │ ├── anim.pit
│ │ │ ├── blinker_l.pia
│ │ │ ├── blinker_r.pia
│ │ │ ├── brushed_metal.tga
│ │ │ ├── brushed_metal.tobj
│ │ │ ├── carpet_dark.tga
│ │ │ ├── carpet_dark.tobj
│ │ │ ├── cl_light.pia
│ │ │ ├── cl_light_s.pia
│ │ │ ├── dashboard.tga
│ │ │ ├── dashboard.tobj
│ │ │ ├── f_light.pia
│ │ │ ├── f_light_s.pia
│ │ │ ├── fabric_001.tga
│ │ │ ├── fabric_001.tobj
│ │ │ ├── fabric_002.tga
│ │ │ ├── fabric_002.tobj
│ │ │ ├── fabric_brown.tga
│ │ │ ├── fabric_brown.tobj
│ │ │ ├── fabric_dark.tga
│ │ │ ├── fabric_dark.tobj
│ │ │ ├── fabric_gray.tga
│ │ │ ├── fabric_gray.tobj
│ │ │ ├── fuel.pia
│ │ │ ├── fuel_s.pia
│ │ │ ├── leather_gray.tga
│ │ │ ├── leather_gray.tobj
│ │ │ ├── light.tga
│ │ │ ├── light.tobj
│ │ │ ├── mesh.tga
│ │ │ ├── mesh.tobj
│ │ │ ├── model.pic
│ │ │ ├── model.pim
│ │ │ ├── model.pit
│ │ │ ├── oil_s.pia
│ │ │ ├── parking_s.pia
│ │ │ ├── plastic_black.tga
│ │ │ ├── plastic_black.tobj
│ │ │ ├── plastic_dark_bolts.tga
│ │ │ ├── plastic_dark_bolts.tobj
│ │ │ ├── plastic_dark_bolts2.tga
│ │ │ ├── plastic_dark_bolts2.tobj
│ │ │ ├── plastic_gray.tga
│ │ │ ├── plastic_gray.tobj
│ │ │ ├── plastic_gray_pattern.tga
│ │ │ ├── plastic_gray_pattern.tobj
│ │ │ ├── plastic_leather.tga
│ │ │ ├── plastic_leather.tobj
│ │ │ ├── plastic_pattern.tga
│ │ │ ├── plastic_pattern.tobj
│ │ │ ├── psi.pia
│ │ │ ├── psi_s.pia
│ │ │ ├── retarder_st.pia
│ │ │ ├── rpm.pia
│ │ │ ├── rubber.tga
│ │ │ ├── rubber.tobj
│ │ │ ├── rubber_pattern.tga
│ │ │ ├── rubber_pattern.tobj
│ │ │ ├── s_wheel.pia
│ │ │ ├── speed.pia
│ │ │ ├── swheel_01.tga
│ │ │ ├── swheel_01.tobj
│ │ │ ├── turn_st.pia
│ │ │ ├── uk/
│ │ │ │ ├── anim.pim
│ │ │ │ ├── anim.pis
│ │ │ │ ├── anim.pit
│ │ │ │ ├── blinker_l.pia
│ │ │ │ ├── blinker_r.pia
│ │ │ │ ├── cl_light.pia
│ │ │ │ ├── cl_light_s.pia
│ │ │ │ ├── dashboard.tga
│ │ │ │ ├── dashboard.tobj
│ │ │ │ ├── f_light.pia
│ │ │ │ ├── f_light_s.pia
│ │ │ │ ├── fuel.pia
│ │ │ │ ├── fuel_s.pia
│ │ │ │ ├── model.pic
│ │ │ │ ├── model.pim
│ │ │ │ ├── model.pit
│ │ │ │ ├── oil_s.pia
│ │ │ │ ├── parking_s.pia
│ │ │ │ ├── psi.pia
│ │ │ │ ├── psi_s.pia
│ │ │ │ ├── retarder_st.pia
│ │ │ │ ├── rpm.pia
│ │ │ │ ├── s_wheel.pia
│ │ │ │ ├── speed.pia
│ │ │ │ ├── turn_st.pia
│ │ │ │ ├── water.pia
│ │ │ │ ├── water_s.pia
│ │ │ │ ├── wiper_st.pia
│ │ │ │ └── wipers.pia
│ │ │ ├── water.pia
│ │ │ ├── water_s.pia
│ │ │ ├── wiper_st.pia
│ │ │ └── wipers.pia
│ │ ├── lightmask.tga
│ │ ├── lightmask.tobj
│ │ ├── shadow_4x2.tga
│ │ ├── shadow_4x2.tobj
│ │ ├── shadow_6x2.tga
│ │ ├── shadow_6x2.tobj
│ │ ├── truck.pic
│ │ ├── truck.pim
│ │ ├── truck.pit
│ │ ├── ui_shadow_4x2.pim
│ │ ├── ui_shadow_4x2.pit
│ │ ├── ui_shadow_6x2.pim
│ │ ├── ui_shadow_6x2.pit
│ │ ├── wipers.pia
│ │ ├── wipers.pim
│ │ ├── wipers.pis
│ │ ├── wipers.pit
│ │ ├── wipers_uk.pia
│ │ ├── wipers_uk.pim
│ │ ├── wipers_uk.pis
│ │ └── wipers_uk.pit
│ ├── share/
│ │ ├── dashboard.tga
│ │ ├── dashboard.tobj
│ │ ├── glass.tga
│ │ ├── glass.tobj
│ │ ├── glass_ex.tga
│ │ ├── glass_ex.tobj
│ │ ├── gps.tga
│ │ └── gps.tobj
│ └── upgrade/
│ ├── ext_interior/
│ │ └── man_tgx_sample/
│ │ ├── stock.pim
│ │ ├── stock.pit
│ │ ├── stock_c.tga
│ │ ├── stock_c.tobj
│ │ ├── stock_exclusive_c.tga
│ │ └── stock_exclusive_c.tobj
│ └── paintjob/
│ ├── empty.tga
│ └── empty.tobj
└── test/
└── sikuli/
├── README.md
├── config/
│ ├── META-INF/
│ │ └── MANIFEST.MF
│ ├── README.md
│ ├── install_configurator.sh
│ ├── scs_bt_config.ini
│ ├── scs_bt_configurator/
│ │ ├── __init__.py
│ │ └── scs_bt_configurator.py
│ └── scs_bt_configurator.jar
├── installation/
│ └── README.md
└── tests/
├── README.md
└── unit/
├── 001_reset_blender.sikuli/
│ ├── 001_reset_blender.py
│ └── startup.blend
├── generic/
│ ├── 01_unparent_parent.sikuli/
│ │ ├── 01_unparent_parent.py
│ │ └── startup.blend
│ └── run_tests.sh
├── geometry/
│ ├── common/
│ │ ├── 01_view_only_operators.sikuli/
│ │ │ ├── 01_view_only_operators.py
│ │ │ └── all_objects.blend
│ │ ├── 03_select_operators.sikuli/
│ │ │ ├── 03_select_operators.py
│ │ │ └── all_objects.blend
│ │ └── run_tests.sh
│ └── run_tests.sh
├── import-export/
│ ├── 01_cube_flat.sikuli/
│ │ ├── 01_cube_flat.py
│ │ └── Default_Scene_with_Cube.blend
│ ├── 02_mats_and_triangles.sikuli/
│ │ ├── 02_mats_and_triangles.py
│ │ └── 2_Triangles_2_Materials.blend
│ ├── 03_ico_sphere_2_materials.sikuli/
│ │ ├── 03_ico_sphere_2_materials.py
│ │ └── 3_Ico_Sphere_2_Materials.blend
│ ├── 04_locators_colliders.sikuli/
│ │ ├── 04_locators_colliders.html
│ │ ├── 04_locators_colliders.py
│ │ └── 4_locators_collision.blend
│ ├── 05_locators_models.sikuli/
│ │ ├── 05_locators_models.html
│ │ ├── 05_locators_models.py
│ │ └── 5_locators_model.blend
│ ├── 06_locators_prefabs.sikuli/
│ │ ├── 06_locators_prefabs.html
│ │ ├── 06_locators_prefabs.py
│ │ └── 6_locators_prefab.blend
│ ├── 07_export_with_preview.sikuli/
│ │ ├── 07_export_with_preview.py
│ │ └── startup.blend
│ ├── 08_locators_colliders_2.sikuli/
│ │ ├── 08_locators_colliders_2.py
│ │ └── 8_locators_collision_rotated.blend
│ ├── 09_looks.sikuli/
│ │ ├── 09_looks.py
│ │ └── looks.blend
│ ├── 10_cube_smooth.sikuli/
│ │ ├── 10_cube_smooth.py
│ │ └── Default_Scene_with_Cube.blend
│ ├── 11_cube_custom_normals.sikuli/
│ │ ├── 11_cube_custom_normals.py
│ │ └── Default_Scene_with_Cube.blend
│ ├── 12_animated_cube.sikuli/
│ │ ├── 12_animated_cube.py
│ │ ├── Default_Scene_with_Cube.blend
│ │ └── Default_Scene_with_Cube.blend1
│ └── run_tests.sh
├── locators/
│ ├── collider/
│ │ ├── 01_creating_collider.sikuli/
│ │ │ ├── 01_creating_collider.py
│ │ │ └── startup.blend
│ │ ├── 02_modify_box.sikuli/
│ │ │ ├── 02_modify_box.py
│ │ │ └── collider_box.blend
│ │ ├── 03_modify_sphere.sikuli/
│ │ │ ├── 03_modify_sphere.py
│ │ │ └── collider_sphere.blend
│ │ ├── 04_modify_capsule.sikuli/
│ │ │ ├── 04_modify_capsule.py
│ │ │ └── collider_capsule.blend
│ │ ├── 05_modify_cylinder.sikuli/
│ │ │ ├── 05_modify_cylinder.py
│ │ │ └── collider_cylinder.blend
│ │ ├── 06_modify_convex.sikuli/
│ │ │ ├── 06_modify_convex.py
│ │ │ └── collider_convex.blend
│ │ └── run_tests.sh
│ ├── common/
│ │ ├── 01_view_only_operators.sikuli/
│ │ │ ├── 01_view_only_operators.py
│ │ │ └── all_objects.blend
│ │ ├── 03_select_operators.sikuli/
│ │ │ ├── 03_select_operators.py
│ │ │ └── all_objects.blend
│ │ └── run_tests.sh
│ ├── model/
│ │ ├── 01_creating_model_locator.sikuli/
│ │ │ ├── 01_creating_model_locator.py
│ │ │ └── startup.blend
│ │ ├── 02_modify_values.sikuli/
│ │ │ ├── 02_modify_values.py
│ │ │ └── model_locator.blend
│ │ ├── 03_preview_models.sikuli/
│ │ │ ├── 03_preview_models.py
│ │ │ ├── model_locator.blend
│ │ │ ├── stop.pic
│ │ │ ├── stop.pim
│ │ │ └── stop.pit
│ │ └── run_tests.sh
│ ├── prefab/
│ │ ├── 01_creating_prefab_locator.sikuli/
│ │ │ ├── 01_creating_prefab_locator.py
│ │ │ └── startup.blend
│ │ ├── 02_modify_node.sikuli/
│ │ │ ├── 02_modify_node.py
│ │ │ └── prefab_locator_node.blend
│ │ ├── 03_modify_sign.sikuli/
│ │ │ ├── 03_modify_sign.py
│ │ │ └── prefab_locator_sign.blend
│ │ ├── 04_modify_spawn.sikuli/
│ │ │ ├── 04_modify_spawn.py
│ │ │ └── prefab_locator_spawn.blend
│ │ ├── 05_modify_semaphore.sikuli/
│ │ │ ├── 05_modify_semaphore.py
│ │ │ └── prefab_locator_semaphore.blend
│ │ ├── 06_modify_navigation.sikuli/
│ │ │ ├── 06_modify_navigation.py
│ │ │ └── prefab_locator_navigation.blend
│ │ ├── 07_modify_map_point.sikuli/
│ │ │ ├── 07_modify_map_point.py
│ │ │ └── prefab_locator_map_point.blend
│ │ ├── 08_modify_trigger.sikuli/
│ │ │ ├── 08_modify_trigger.py
│ │ │ └── prefab_locator_trigger.blend
│ │ └── run_tests.sh
│ └── run_tests.sh
├── looks/
│ ├── 01_create.sikuli/
│ │ ├── 01_create.py
│ │ └── looks.blend
│ ├── 02_modify_mats.sikuli/
│ │ ├── 02_modify_mats.py
│ │ └── looks.blend
│ ├── 03_remove.sikuli/
│ │ ├── 03_remove.py
│ │ └── looks.blend
│ └── run_tests.sh
├── materials/
│ ├── 01_switch_materials.sikuli/
│ │ ├── 01_switch_materials.py
│ │ └── startup.blend
│ ├── 02_remove_material.sikuli/
│ │ ├── 02_remove_material.py
│ │ └── startup.blend
│ ├── 03_merge_scs_materials.sikuli/
│ │ ├── 03_merge_scs_materials.py
│ │ └── startup.blend
│ ├── 04_switch_shader_preset.sikuli/
│ │ ├── 04_switch_shader_preset.py
│ │ └── startup.blend
│ └── run_tests.sh
├── part-variant/
│ ├── run_tests.sh
│ └── variants/
│ ├── 01_create_variants.sikuli/
│ │ ├── 01_create_variants.py
│ │ └── scs_game_cubes.blend
│ ├── 02_variant_renaming.sikuli/
│ │ ├── 02_variant_renaming.py
│ │ └── default_3_variants.blend
│ ├── 03_variant_deletion.sikuli/
│ │ ├── 03_variant_deletion.py
│ │ └── default_3_variants_named.blend
│ ├── 04_variant_list_select_operator.sikuli/
│ │ ├── 04_variant_list_select_operator.py
│ │ └── default_3_variants_named.blend
│ ├── 05_variant_list_view_operator.sikuli/
│ │ ├── 05_variant_list_view_operator.py
│ │ └── default_3_variants_named.blend
│ └── run_tests.sh
└── run_tests.sh
Showing preview only (218K chars total). Download the full file or copy to clipboard to get everything.
SYMBOL INDEX (2600 symbols across 255 files)
FILE: addon/io_scs_tools/__init__.py
class SCS_TOOLS_OT_Import (line 50) | class SCS_TOOLS_OT_Import(bpy.types.Operator, ImportHelper):
method check (line 72) | def check(self, context):
method execute (line 80) | def execute(self, context):
method draw (line 147) | def draw(self, context):
class SCS_TOOLS_OT_Export (line 213) | class SCS_TOOLS_OT_Export(bpy.types.Operator, _SCSExportHelper, ExportHe...
method execute (line 225) | def execute(self, context):
method draw (line 234) | def draw(self, context):
class SCS_TOOLS_MT_AddObject (line 247) | class SCS_TOOLS_MT_AddObject(bpy.types.Menu):
method draw (line 251) | def draw(self, context):
class SCS_TOOLS_MT_ObjectsMisc (line 255) | class SCS_TOOLS_MT_ObjectsMisc(bpy.types.Menu):
method draw (line 259) | def draw(self, context):
class SCS_TOOLS_MT_MaterialsMisc (line 263) | class SCS_TOOLS_MT_MaterialsMisc(bpy.types.Menu):
method draw (line 267) | def draw(self, context):
class SCS_TOOLS_MT_MainMenu (line 273) | class SCS_TOOLS_MT_MainMenu(bpy.types.Menu):
method append_sidebar_entry (line 284) | def append_sidebar_entry(menu_item_name, panel_id):
method append_props_entry (line 288) | def append_props_entry(menu_item_name, panel_id):
method append_output_entry (line 292) | def append_output_entry(menu_item_name, panel_id):
method unregister (line 296) | def unregister(cls):
method draw (line 300) | def draw(self, context):
function add_menu_func (line 317) | def add_menu_func(self, context):
function menu_func_import (line 322) | def menu_func_import(self, context):
function menu_func_export (line 327) | def menu_func_export(self, context):
function menu_scs_tools (line 332) | def menu_scs_tools(self, context):
function register (line 349) | def register():
function unregister (line 432) | def unregister():
FILE: addon/io_scs_tools/consts.py
class ConnectionsStorage (line 30) | class ConnectionsStorage:
class Operators (line 40) | class Operators:
class SelectionType (line 41) | class SelectionType:
class ViewType (line 50) | class ViewType:
class TerrainPoints (line 59) | class TerrainPoints:
class View3DReport (line 67) | class View3DReport:
class InventoryMoveType (line 86) | class InventoryMoveType:
class Icons (line 93) | class Icons:
class Types (line 99) | class Types:
method as_list (line 127) | def as_list():
class Part (line 141) | class Part:
class Variant (line 148) | class Variant:
class Look (line 155) | class Look:
class Material (line 164) | class Material:
class Colors (line 177) | class Colors:
class LampTools (line 186) | class LampTools:
class VehicleSides (line 190) | class VehicleSides(Enum):
class VehicleLampTypes (line 199) | class VehicleLampTypes(Enum):
class AuxiliaryLampColors (line 211) | class AuxiliaryLampColors(Enum):
class AuxiliaryLampTypes (line 217) | class AuxiliaryLampTypes(Enum):
class TrafficLightTypes (line 223) | class TrafficLightTypes(Enum):
class VertexColorTools (line 231) | class VertexColorTools:
class WrapType (line 235) | class WrapType:
class ColoringLayersTypes (line 239) | class ColoringLayersTypes:
method as_list (line 249) | def as_list():
class Mesh (line 262) | class Mesh:
class PrefabLocators (line 272) | class PrefabLocators:
class PNCF (line 304) | class PNCF:
class PNLF (line 323) | class PNLF:
class PSP (line 335) | class PSP:
class TST (line 365) | class TST:
class MPVF (line 380) | class MPVF:
class MPNF (line 413) | class MPNF:
class TPF (line 430) | class TPF:
class PIF (line 438) | class PIF:
class Bones (line 448) | class Bones:
class ConvHlpr (line 453) | class ConvHlpr:
class SCSLigthing (line 462) | class SCSLigthing:
class PaintjobTools (line 478) | class PaintjobTools:
class VehicleTypes (line 482) | class VehicleTypes:
class Cache (line 578) | class Cache:
FILE: addon/io_scs_tools/exp/__init__.py
function batch_export (line 35) | def batch_export(operator_instance, init_obj_list, name_suffix="", menu_...
FILE: addon/io_scs_tools/exp/pia.py
function _get_custom_channels (line 34) | def _get_custom_channels(scs_animation, action):
function _get_bone_channels (line 88) | def _get_bone_channels(scs_root_obj, armature, scs_animation, action, ex...
function _fill_header_section (line 259) | def _fill_header_section(anim_name, sign_export):
function _fill_global_section (line 274) | def _fill_global_section(skeleton_file, total_time, bone_channel_cnt, cu...
function _fill_channel_sections (line 285) | def _fill_channel_sections(data_list, channel_type="BoneChannel"):
function export (line 300) | def export(scs_root_obj, armature, scs_animation, dirpath, name_suffix, ...
FILE: addon/io_scs_tools/exp/pic.py
function _fill_header_section (line 33) | def _fill_header_section(file_name, sign_export):
function _fill_global_section (line 49) | def _fill_global_section(vertices, triangles, materials, pieces, parts, ...
function _fill_coll_material_section (line 61) | def _fill_coll_material_section():
function _fill_piece_sections (line 69) | def _fill_piece_sections(convex_coll_locators, export_scale):
function _fill_part_sections (line 115) | def _fill_part_sections(locator_list, used_parts):
function _make_common_part (line 164) | def _make_common_part(item, index, col_type):
function _fill_collision_locator_sections (line 200) | def _fill_collision_locator_sections(collision_locator_list):
function _sort_collision_locators (line 232) | def _sort_collision_locators(collision_locator_list):
function export (line 252) | def export(collision_locator_list, filepath, name_suffix, filename, used...
FILE: addon/io_scs_tools/exp/pim/bones.py
class Bones (line 25) | class Bones:
method reset_counter (line 31) | def reset_counter():
method get_global_bones_count (line 35) | def get_global_bones_count():
method __init__ (line 38) | def __init__(self):
method add_bone (line 43) | def add_bone(self, bone_name):
method get_bone_index (line 59) | def get_bone_index(self, bone_name):
method get_as_section (line 74) | def get_as_section(self):
FILE: addon/io_scs_tools/exp/pim/exporter.py
function execute (line 52) | def execute(dirpath, name_suffix, root_object, armature_object, skeleton...
FILE: addon/io_scs_tools/exp/pim/globall.py
class Globall (line 29) | class Globall:
method __init__ (line 32) | def __init__(self, part_count, skeleton):
method get_as_section (line 49) | def get_as_section(self):
FILE: addon/io_scs_tools/exp/pim/header.py
class Header (line 25) | class Header:
method __init__ (line 31) | def __init__(self, format_type, format_version, name):
method get_as_section (line 45) | def get_as_section(self):
FILE: addon/io_scs_tools/exp/pim/locator.py
class Locator (line 24) | class Locator:
method reset_counter (line 35) | def reset_counter():
method get_global_locator_count (line 39) | def get_global_locator_count():
method __init__ (line 42) | def __init__(self, index, name, hookup):
method set_position (line 58) | def set_position(self, position):
method set_rotation (line 65) | def set_rotation(self, rotation):
method set_scale (line 72) | def set_scale(self, scale):
method get_index (line 79) | def get_index(self):
method get_as_section (line 82) | def get_as_section(self):
FILE: addon/io_scs_tools/exp/pim/material.py
class Material (line 26) | class Material:
method reset_counter (line 34) | def reset_counter():
method get_global_material_count (line 38) | def get_global_material_count():
method __init__ (line 41) | def __init__(self, index, alias, effect, blend_mat):
method uses_textures_with_uv (line 117) | def uses_textures_with_uv(self):
method get_nmap_uv_name (line 124) | def get_nmap_uv_name(self):
method get_tex_coord_map (line 131) | def get_tex_coord_map(self):
method get_index (line 141) | def get_index(self):
method get_as_section (line 148) | def get_as_section(self):
FILE: addon/io_scs_tools/exp/pim/part.py
class Part (line 24) | class Part:
method __init__ (line 32) | def __init__(self, name):
method add_piece (line 43) | def add_piece(self, piece):
method add_locator (line 58) | def add_locator(self, locator):
method get_as_section (line 72) | def get_as_section(self):
FILE: addon/io_scs_tools/exp/pim/piece.py
class Piece (line 27) | class Piece:
method reset_counters (line 44) | def reset_counters():
method get_global_piece_count (line 50) | def get_global_piece_count():
method get_global_vertex_count (line 54) | def get_global_vertex_count():
method get_global_triangle_count (line 58) | def get_global_triangle_count():
method __calc_vertex_hash (line 62) | def __calc_vertex_hash(index, normal, uvs, rgba, tangent):
method __init__ (line 108) | def __init__(self, index, material):
method add_triangle (line 135) | def add_triangle(self, triangle):
method add_vertex (line 158) | def add_vertex(self, vert_index, position, normal, uvs, uvs_aliases, r...
method get_index (line 224) | def get_index(self):
method get_vertex_count (line 227) | def get_vertex_count(self):
method get_as_section (line 230) | def get_as_section(self):
FILE: addon/io_scs_tools/exp/pim/piece_skin.py
class PieceSkin (line 26) | class PieceSkin:
method reset_counter (line 30) | def reset_counter():
method get_global_piece_skin_count (line 34) | def get_global_piece_skin_count():
method __init__ (line 41) | def __init__(self, piece_idx, skin_stream):
method get_skin_stream_by_type (line 56) | def get_skin_stream_by_type(self, stream_type):
method get_as_section (line 71) | def get_as_section(self):
FILE: addon/io_scs_tools/exp/pim/piece_skin_stream.py
class PieceSkinStream (line 25) | class PieceSkinStream:
class Types (line 26) | class Types:
class Entry (line 33) | class Entry:
method __init__ (line 45) | def __init__(self, vertex_index, vertex_pos, bone_weights, bone_weig...
method add_vertex_index (line 70) | def add_vertex_index(self, vertex_index):
method get_first_vertex_index (line 86) | def get_first_vertex_index(self):
method get_hash (line 94) | def get_hash(self):
method get_weight_count (line 109) | def get_weight_count(self):
method get_section_repr (line 118) | def get_section_repr(self):
method __init__ (line 143) | def __init__(self, stream_type):
method add_entry (line 163) | def add_entry(self, skin_entry):
method get_tag (line 180) | def get_tag(self):
method get_as_section (line 187) | def get_as_section(self):
FILE: addon/io_scs_tools/exp/pim/piece_stream.py
class Stream (line 25) | class Stream:
class Types (line 26) | class Types:
method __init__ (line 44) | def __init__(self, stream_type, index):
method add_entry (line 76) | def add_entry(self, value):
method add_alias (line 102) | def add_alias(self, alias):
method get_size (line 118) | def get_size(self):
method get_tag (line 126) | def get_tag(self):
method get_as_section (line 138) | def get_as_section(self):
FILE: addon/io_scs_tools/exp/pim_ef/exporter.py
function execute (line 49) | def execute(dirpath, name_suffix, root_object, armature_object, skeleton...
FILE: addon/io_scs_tools/exp/pim_ef/globall.py
class Globall (line 29) | class Globall:
method __init__ (line 32) | def __init__(self, part_count, skeleton):
method get_as_section (line 49) | def get_as_section(self):
FILE: addon/io_scs_tools/exp/pim_ef/piece.py
class Piece (line 28) | class Piece:
method reset_counters (line 46) | def reset_counters():
method get_global_piece_count (line 52) | def get_global_piece_count():
method get_global_vertex_count (line 56) | def get_global_vertex_count():
method get_global_face_count (line 60) | def get_global_face_count():
method __calc_vertex_hash (line 64) | def __calc_vertex_hash(index, position):
method __init__ (line 82) | def __init__(self, index):
method add_face (line 107) | def add_face(self, material, vert_indicies, vert_normals, vert_uvs, uv...
method add_edge (line 160) | def add_edge(self, vert1_index, vert2_index, blender_mesh_indices=False):
method add_vertex (line 193) | def add_vertex(self, vert_index, position):
method get_index (line 221) | def get_index(self):
method get_as_section (line 224) | def get_as_section(self):
FILE: addon/io_scs_tools/exp/pim_ef/piece_face.py
class Face (line 28) | class Face:
method __init__ (line 34) | def __init__(self, index, material, vert_indicies):
method add_normal (line 49) | def add_normal(self, normal):
method add_uvs (line 64) | def add_uvs(self, uvs, uvs_names, uvs_aliases):
method add_rgbas (line 92) | def add_rgbas(self, rgbas, rgbas_names):
method get_stream_count (line 119) | def get_stream_count(self):
method get_as_section (line 127) | def get_as_section(self):
FILE: addon/io_scs_tools/exp/pim_ef/piece_stream.py
class Stream (line 24) | class Stream(_Stream):
method __init__ (line 27) | def __init__(self, stream_type, index, name=""):
method get_as_section (line 51) | def get_as_section(self):
FILE: addon/io_scs_tools/exp/pip/curve.py
class Curve (line 30) | class Curve:
method reset_counter (line 37) | def reset_counter():
method get_global_curve_count (line 41) | def get_global_curve_count():
method prepare_curves (line 45) | def prepare_curves(curves_l):
method __lt__ (line 88) | def __lt__(self, other):
method __eq__ (line 91) | def __eq__(self, other):
method __init__ (line 94) | def __init__(self, index, name, ui_name):
method set_output_boundaries (line 141) | def set_output_boundaries(self, scs_props):
method set_input_boundaries (line 172) | def set_input_boundaries(self, scs_props):
method set_flags (line 203) | def set_flags(self, scs_props, to_start=False):
method set_length (line 245) | def set_length(self, value):
method set_traffic_rule (line 253) | def set_traffic_rule(self, traffic_rule):
method set_semaphore_id (line 261) | def set_semaphore_id(self, semaphore_id):
method add_next_curve (line 276) | def add_next_curve(self, curve):
method add_prev_curve (line 294) | def add_prev_curve(self, curve):
method set_start (line 312) | def set_start(self, position, rotation):
method set_end (line 322) | def set_end(self, position, rotation):
method get_start (line 332) | def get_start(self, cartes_tang=True):
method get_end (line 350) | def get_end(self, cartes_tang=True):
method get_length (line 368) | def get_length(self):
method get_index (line 376) | def get_index(self):
method get_ui_name (line 384) | def get_ui_name(self):
method get_output_node_index (line 392) | def get_output_node_index(self):
method get_input_node_index (line 400) | def get_input_node_index(self):
method get_output_lane_index (line 408) | def get_output_lane_index(self):
method get_input_lane_index (line 416) | def get_input_lane_index(self):
method get_leads_to_nodes (line 424) | def get_leads_to_nodes(self):
method get_next_prev_curves (line 432) | def get_next_prev_curves(self, next_curves):
method get_all_next_prev_curves (line 445) | def get_all_next_prev_curves(self, next_curves, all_next_prev=None, de...
method get_closest_point (line 474) | def get_closest_point(self, point, iterations=_PL_consts.CURVE_CLOSEST...
method get_curve_tangent_at_position (line 509) | def get_curve_tangent_at_position(self, curve_position):
method is_inbound (line 527) | def is_inbound(self):
method is_valid (line 535) | def is_valid(self):
method calc_leads_to_nodes_forward (line 547) | def calc_leads_to_nodes_forward(self, ancestor_leads_to_nodes, already...
method get_as_section (line 596) | def get_as_section(self):
FILE: addon/io_scs_tools/exp/pip/curve_bezier.py
class Bezier (line 26) | class Bezier:
class BezierPoint (line 27) | class BezierPoint:
method __init__ (line 28) | def __init__(self, position, rotation, is_start=True):
method get_pos_rot (line 42) | def get_pos_rot(self):
method get_as_section (line 50) | def get_as_section(self):
method __init__ (line 63) | def __init__(self):
method set_start (line 70) | def set_start(self, position, rotation):
method set_end (line 80) | def set_end(self, position, rotation):
method get_start (line 90) | def get_start(self):
method get_end (line 98) | def get_end(self):
method get_as_section (line 106) | def get_as_section(self):
FILE: addon/io_scs_tools/exp/pip/exporter.py
function __sort_locators_by_type__ (line 42) | def __sort_locators_by_type__(locator_list):
function __get_curve__ (line 81) | def __get_curve__(pip_curves, index, locator_name):
function __get_map_point__ (line 101) | def __get_map_point__(pip_map_points, locator_name):
function __get_trigger_point__ (line 119) | def __get_trigger_point__(pip_trigger_points, locator_name):
function execute (line 137) | def execute(dirpath, filename, name_suffix, prefab_locator_list, offset_...
FILE: addon/io_scs_tools/exp/pip/globall.py
class Globall (line 32) | class Globall:
method __init__ (line 33) | def __init__(self):
method get_as_section (line 46) | def get_as_section():
FILE: addon/io_scs_tools/exp/pip/header.py
class Header (line 25) | class Header:
method __init__ (line 26) | def __init__(self, format_version, name):
method get_as_section (line 37) | def get_as_section(self):
FILE: addon/io_scs_tools/exp/pip/intersection.py
class Intersection (line 28) | class Intersection:
method reset_counter (line 32) | def reset_counter():
method get_global_intersection_count (line 36) | def get_global_intersection_count():
method have_common_fork (line 40) | def have_common_fork(curve1, curve2):
method have_common_joint (line 64) | def have_common_joint(curve1, curve2):
method get_intersection (line 88) | def get_intersection(curve1, curve2):
method get_intersection_radius (line 118) | def get_intersection_radius(curve1, curve2, curve1_pos_coef, curve2_po...
method __eq__ (line 205) | def __eq__(self, other):
method __init__ (line 209) | def __init__(self, curve_id, curve_ui_name, position):
method __del__ (line 229) | def __del__(self):
method set_flags (line 234) | def set_flags(self, is_start, is_end, is_split_sharp, siblings_increme...
method set_radius (line 264) | def set_radius(self, new_radius):
method get_radius (line 273) | def get_radius(self):
method get_as_section (line 281) | def get_as_section(self):
FILE: addon/io_scs_tools/exp/pip/map_point.py
class MapPoint (line 28) | class MapPoint:
method reset_counter (line 32) | def reset_counter():
method get_global_map_point_count (line 36) | def get_global_map_point_count():
method auto_generate_map_points (line 40) | def auto_generate_map_points(pip_map_points, pip_nodes):
method calc_segment_extensions (line 126) | def calc_segment_extensions(pip_map_points):
method test_map_points (line 166) | def test_map_points(pip_map_points):
method __init__ (line 224) | def __init__(self, index, ui_name):
method set_visual_flag_and (line 244) | def set_visual_flag_and(self, value):
method set_visual_flag_or (line 252) | def set_visual_flag_or(self, value):
method set_visual_flag (line 260) | def set_visual_flag(self, scs_props):
method set_nav_flag (line 290) | def set_nav_flag(self, scs_props):
method set_flags (line 313) | def set_flags(self, scs_props):
method set_autogen_flags (line 323) | def set_autogen_flags(self, node_index, original_points):
method set_autogen_middle_flags (line 351) | def set_autogen_middle_flags(self, auto_gen_points):
method set_position (line 384) | def set_position(self, position):
method add_neighbour (line 400) | def add_neighbour(self, map_point):
method get_index (line 422) | def get_index(self):
method get_position (line 430) | def get_position(self):
method get_nav_flags (line 438) | def get_nav_flags(self):
method get_visual_flags (line 446) | def get_visual_flags(self):
method get_neighbours (line 454) | def get_neighbours(self):
method get_ui_name (line 462) | def get_ui_name(self):
method get_as_section (line 470) | def get_as_section(self):
FILE: addon/io_scs_tools/exp/pip/node.py
class Node (line 31) | class Node:
method reset_counter (line 40) | def reset_counter():
method get_global_node_count (line 46) | def get_global_node_count():
method get_global_tp_count (line 50) | def get_global_tp_count():
method get_global_tp_variant_count (line 54) | def get_global_tp_variant_count():
method __init__ (line 57) | def __init__(self, index, position, direction):
method __prepare_streams__ (line 91) | def __prepare_streams__(self):
method __prepare_terrain_points__ (line 137) | def __prepare_terrain_points__(self):
method set_input_lane (line 157) | def set_input_lane(self, index, curve_index):
method set_output_lane (line 182) | def set_output_lane(self, index, curve_index):
method add_terrain_point (line 207) | def add_terrain_point(self, position, normal, variant_index=-1):
method ensure_variant (line 289) | def ensure_variant(self, variant_index):
method get_position (line 305) | def get_position(self):
method get_as_section (line 313) | def get_as_section(self):
FILE: addon/io_scs_tools/exp/pip/node_stream.py
class Stream (line 24) | class Stream:
class Types (line 25) | class Types:
method __init__ (line 37) | def __init__(self, stream_type):
method add_entry (line 56) | def add_entry(self, value):
method get_size (line 75) | def get_size(self):
method get_tag (line 83) | def get_tag(self):
method get_as_section (line 91) | def get_as_section(self):
FILE: addon/io_scs_tools/exp/pip/semaphore.py
class Semaphore (line 25) | class Semaphore:
method reset_counter (line 29) | def reset_counter():
method get_global_semaphore_count (line 33) | def get_global_semaphore_count():
method __init__ (line 36) | def __init__(self, tsem_type):
method set_position (line 55) | def set_position(self, position):
method set_rotation (line 63) | def set_rotation(self, rotation):
method set_semaphore_id (line 71) | def set_semaphore_id(self, semaphore_id):
method set_intervals (line 86) | def set_intervals(self, intervals):
method set_cycle (line 94) | def set_cycle(self, cycle):
method set_profile (line 102) | def set_profile(self, profile):
method get_as_section (line 110) | def get_as_section(self):
FILE: addon/io_scs_tools/exp/pip/sign.py
class Sign (line 25) | class Sign:
method reset_counter (line 29) | def reset_counter():
method get_global_sign_count (line 33) | def get_global_sign_count():
method __init__ (line 36) | def __init__(self, name, part):
method set_position (line 53) | def set_position(self, position):
method set_rotation (line 61) | def set_rotation(self, rotation):
method set_model (line 69) | def set_model(self, model):
method get_as_section (line 77) | def get_as_section(self):
FILE: addon/io_scs_tools/exp/pip/spawn_point.py
class SpawnPoint (line 25) | class SpawnPoint:
method reset_counter (line 29) | def reset_counter():
method get_global_spawn_point_count (line 33) | def get_global_spawn_point_count():
method __init__ (line 36) | def __init__(self, name):
method set_position (line 50) | def set_position(self, position):
method set_rotation (line 58) | def set_rotation(self, rotation):
method set_type (line 66) | def set_type(self, sp_type):
method get_as_section (line 77) | def get_as_section(self):
FILE: addon/io_scs_tools/exp/pip/trigger_point.py
class TriggerPoint (line 27) | class TriggerPoint:
method reset_counter (line 31) | def reset_counter():
method get_global_trigger_point_count (line 35) | def get_global_trigger_point_count():
method prepare_trigger_points (line 39) | def prepare_trigger_points(triggers_l):
method __init__ (line 84) | def __init__(self, index, ui_name):
method set_trigger_id (line 109) | def set_trigger_id(self, trigger_id):
method set_action (line 117) | def set_action(self, action):
method set_trigger_range (line 125) | def set_trigger_range(self, trigger_range):
method set_reset_delay (line 133) | def set_reset_delay(self, reset_delay):
method set_flags (line 141) | def set_flags(self, scs_props):
method set_position (line 166) | def set_position(self, position):
method add_neighbour (line 174) | def add_neighbour(self, trigger_point):
method get_index (line 192) | def get_index(self):
method get_trigger_id (line 200) | def get_trigger_id(self):
method get_1st_neighbour (line 208) | def get_1st_neighbour(self):
method get_2nd_neighbour (line 220) | def get_2nd_neighbour(self):
method get_ui_name (line 232) | def get_ui_name(self):
method is_flag_set (line 240) | def is_flag_set(self, mask):
method get_as_section (line 250) | def get_as_section(self):
FILE: addon/io_scs_tools/exp/pis.py
function _fill_header_section (line 30) | def _fill_header_section(file_name, sign_export):
function _fill_global_section (line 46) | def _fill_global_section(bone_cnt):
function _fill_bones_sections (line 53) | def _fill_bones_sections(scs_root_obj, armature_obj, used_bones, export_...
function export (line 68) | def export(filepath, scs_root_obj, armature_object, used_bones):
FILE: addon/io_scs_tools/exp/pit.py
function fill_comment_header_section (line 36) | def fill_comment_header_section(look_list, variant_list):
function fill_header_section (line 50) | def fill_header_section(format_version, file_name, sign_export):
function fill_global_section (line 65) | def fill_global_section(looks, variants, parts, materials):
function fill_material_sections (line 75) | def fill_material_sections(materials, material_dict):
function default_material (line 90) | def default_material(alias):
function get_texture_path_from_material (line 127) | def get_texture_path_from_material(material, texture_type, export_path):
function fill_look_sections (line 260) | def fill_look_sections(data_list):
function _fill_atr_section (line 272) | def _fill_atr_section(atr):
function _fill_part_section (line 281) | def _fill_part_section(part):
function fill_variant_sections (line 292) | def fill_variant_sections(data_list):
function fill_part_list (line 305) | def fill_part_list(parts, used_parts_names, all_parts=False):
function export (line 344) | def export(root_object, filepath, name_suffix, used_parts, used_materials):
FILE: addon/io_scs_tools/exp/pit_ef.py
function _get_flavor_types (line 41) | def _get_flavor_types(preset, flavors_str):
function export (line 66) | def export(root_object, filepath, name_suffix, used_parts, used_materials):
FILE: addon/io_scs_tools/exp/pix.py
function _get_objects_by_type (line 41) | def _get_objects_by_type(blender_objects, parts):
function export (line 101) | def export(dirpath, name_suffix, root_object, game_object_list):
FILE: addon/io_scs_tools/exp/tobj.py
function export (line 26) | def export(filepath, texture_name, settings):
FILE: addon/io_scs_tools/exp/transition_structs/bones.py
class BonesTrans (line 25) | class BonesTrans:
method __init__ (line 30) | def __init__(self):
method add (line 36) | def add(self, bone_name):
method are_present (line 44) | def are_present(self):
method get_as_list (line 52) | def get_as_list(self):
FILE: addon/io_scs_tools/exp/transition_structs/materials.py
class MaterialsTrans (line 25) | class MaterialsTrans:
method __init__ (line 30) | def __init__(self):
method add (line 36) | def add(self, material_name, material):
method get_as_pairs (line 48) | def get_as_pairs(self):
FILE: addon/io_scs_tools/exp/transition_structs/parts.py
class PartsTrans (line 26) | class PartsTrans:
method __init__ (line 34) | def __init__(self, part_inventory):
method count (line 55) | def count(self):
method is_present (line 63) | def is_present(self, part_name):
method add_user (line 73) | def add_user(self, obj):
method ensure_part (line 85) | def ensure_part(self, obj, suppress_warning=False):
method get_as_list (line 108) | def get_as_list(self):
FILE: addon/io_scs_tools/exp/transition_structs/terrain_points.py
class TerrainPntsTrans (line 25) | class TerrainPntsTrans:
class Entry (line 30) | class Entry:
method __init__ (line 31) | def __init__(self, position, normal):
method __eq__ (line 35) | def __eq__(self, other):
method __init__ (line 41) | def __init__(self):
method add (line 48) | def add(self, variant_index, node_index, position, normal):
method ensure_entry (line 70) | def ensure_entry(self, variant_index, node_index):
method get (line 85) | def get(self, node_index):
FILE: addon/io_scs_tools/imp/pia.py
function _get_header (line 35) | def _get_header(pia_container):
function _get_globals (line 61) | def _get_globals(pia_container):
function _get_anim_channels (line 83) | def _get_anim_channels(pia_container, section_name="BoneChannel"):
function _create_fcurves (line 127) | def _create_fcurves(anim_action, anim_group, anim_curve, rot_euler=True,...
function _get_delta_matrix (line 173) | def _get_delta_matrix(bone_rest_matrix_scs, parent_bone_rest_matrix_scs,...
function load (line 191) | def load(root_object, pia_files, armature, pis_filepath=None, bones=None):
FILE: addon/io_scs_tools/imp/pic.py
function _get_header (line 30) | def _get_header(pic_container):
function _get_global (line 56) | def _get_global(pic_container):
function _get_material (line 82) | def _get_material(section):
function _get_piece (line 98) | def _get_piece(section):
function _get_locator (line 157) | def _get_locator(section):
function _get_part (line 196) | def _get_part(section):
function _get_locator_part (line 225) | def _get_locator_part(parts, index):
function load (line 235) | def load(filepath):
FILE: addon/io_scs_tools/imp/pim.py
function get_header (line 38) | def get_header(pim_container):
function get_global (line 64) | def get_global(pim_container):
function get_material_properties (line 99) | def get_material_properties(section):
function get_piece_properties (line 117) | def get_piece_properties(section):
function _get_piece_streams (line 139) | def _get_piece_streams(section):
function get_part_properties (line 216) | def get_part_properties(section):
function get_locator_properties (line 239) | def get_locator_properties(section):
function get_bones_properties (line 270) | def get_bones_properties(section, import_pis_file):
function _get_skin_stream (line 289) | def _get_skin_stream(section):
function _get_piece_skin_stream (line 316) | def _get_piece_skin_stream(section):
function get_skin_properties (line 341) | def get_skin_properties(section):
function get_piece_skin_properties (line 362) | def get_piece_skin_properties(section):
function _create_piece (line 384) | def _create_piece(
function load_pim_file (line 679) | def load_pim_file(context, filepath, terrain_points_trans=None, preview_...
function load (line 1074) | def load(context, filepath, terrain_points_trans):
FILE: addon/io_scs_tools/imp/pim_ef.py
function _get_piece_properties (line 45) | def _get_piece_properties(section):
function _get_piece_streams (line 69) | def _get_piece_streams(section):
function _create_piece (line 218) | def _create_piece(
function load_pim_file (line 459) | def load_pim_file(context, filepath, terrain_points_trans=None, preview_...
function load (line 833) | def load(context, filepath, terrain_points_trans):
FILE: addon/io_scs_tools/imp/pip.py
function _print_locator_result (line 33) | def _print_locator_result(loc, loc_type, name):
function _get_header (line 40) | def _get_header(pip_container):
function _get_global (line 66) | def _get_global(pip_container):
function _get_node_properties (line 107) | def _get_node_properties(section):
function _get_sign_properties (line 185) | def _get_sign_properties(section):
function _get_spawn_properties (line 207) | def _get_spawn_properties(section):
function _get_t_light_properties (line 227) | def _get_t_light_properties(section):
function _get_curve_properties (line 263) | def _get_curve_properties(section):
function _get_map_point_properties (line 343) | def _get_map_point_properties(section):
function _get_trigger_point_properties (line 367) | def _get_trigger_point_properties(section):
function _create_node_locator (line 408) | def _create_node_locator(
function _create_sign_locator (line 431) | def _create_sign_locator(
function _create_spawn_locator (line 449) | def _create_spawn_locator(
function _create_traffic_light_locator (line 462) | def _create_traffic_light_locator(
function _create_nav_locator (line 492) | def _create_nav_locator(nav_locator_data):
function _set_nav_locator_props (line 513) | def _set_nav_locator_props(loc, nav_locator_data, is_start):
function _create_map_locator (line 540) | def _create_map_locator(
function _create_trigger_locator (line 593) | def _create_trigger_locator(
function load (line 620) | def load(filepath, terrain_points_trans):
FILE: addon/io_scs_tools/imp/pis.py
function _get_header (line 31) | def _get_header(pis_container):
function _get_global (line 57) | def _get_global(pis_container):
function _get_bones (line 73) | def _get_bones(pis_container):
function load (line 85) | def load(filepath, armature, get_only=False):
FILE: addon/io_scs_tools/imp/pit.py
function _get_header (line 26) | def _get_header(pit_container):
function _get_global (line 52) | def _get_global(pit_container):
function _get_look (line 74) | def _get_look(section):
function _get_variant (line 197) | def _get_variant(section):
function load (line 250) | def load(filepath):
FILE: addon/io_scs_tools/imp/pix.py
function _get_shader_data (line 41) | def _get_shader_data(material_data):
function _are_shader_data_compatible (line 56) | def _are_shader_data_compatible(preset_section, material_attributes, mat...
function _create_scs_root_object (line 145) | def _create_scs_root_object(name, loaded_variants, loaded_looks, mats_in...
function load (line 352) | def load(context, filepath, name_suffix="", suppress_reports=False):
FILE: addon/io_scs_tools/imp/tobj.py
function get_settings_and_type (line 24) | def get_settings_and_type(filepath, as_set=False):
function __get_as_set (line 77) | def __get_as_set(addr, tsnormal, color_space_linear):
FILE: addon/io_scs_tools/imp/transition_structs/terrain_points.py
class TerrainPntsTrans (line 22) | class TerrainPntsTrans:
class Entry (line 27) | class Entry:
method __init__ (line 28) | def __init__(self, variant_i, node_i):
method __eq__ (line 32) | def __eq__(self, other):
method __stringfy_key__ (line 36) | def __stringfy_key__(position):
method __init__ (line 49) | def __init__(self):
method add (line 56) | def add(self, variant_index, node_index, position, normal):
method get (line 82) | def get(self, position):
FILE: addon/io_scs_tools/internals/callbacks/lighting_east_lock.py
function _get_scs_sun (line 35) | def _get_scs_sun():
function _lightning_east_lock_draw_callback (line 49) | def _lightning_east_lock_draw_callback(reset):
function correct_lighting_east (line 95) | def correct_lighting_east():
function set_lighting_east (line 106) | def set_lighting_east():
function enable (line 113) | def enable():
function disable (line 126) | def disable():
FILE: addon/io_scs_tools/internals/callbacks/open_gl.py
function enable (line 29) | def enable(mode="Normal"):
function disable (line 53) | def disable():
FILE: addon/io_scs_tools/internals/callbacks/persistent.py
function enable (line 30) | def enable():
function disable (line 60) | def disable():
FILE: addon/io_scs_tools/internals/connections/collector.py
function collect_nav_curve_data (line 29) | def collect_nav_curve_data(loc0_obj, loc1_obj):
function collect_map_line_data (line 98) | def collect_map_line_data(loc0_obj, loc1_obj):
function collect_trigger_line_data (line 148) | def collect_trigger_line_data(loc0_obj, loc0_conns_count, loc1_obj, loc1...
FILE: addon/io_scs_tools/internals/connections/core.py
function init (line 50) | def init(data_block):
function exists (line 79) | def exists(data_block):
function update_for_redraw (line 127) | def update_for_redraw(data_block, selection):
function gather_connections_upon_selected (line 200) | def gather_connections_upon_selected(data_block, loc_names):
function get_connection (line 247) | def get_connection(data_block, loc0_name, loc1_name):
function get_connections (line 295) | def get_connections(data_block, loc_name):
function create_connection (line 331) | def create_connection(data_block, loc0_obj, loc1_obj):
function delete_connection (line 444) | def delete_connection(data_block, loc0_name, loc1_name):
function rename_locator (line 512) | def rename_locator(data_block, old_name, new_name):
function delete_locator (line 568) | def delete_locator(data_block, loc_name):
function copy_connections (line 635) | def copy_connections(data_block, old_objs, new_objs):
function cleanup_check (line 715) | def cleanup_check(data_block):
function __rename_conns_of_locator__ (line 779) | def __rename_conns_of_locator__(data_block, old_name, new_name):
function __locator_changed__ (line 817) | def __locator_changed__(data_block, loc_obj):
function __np_locator_avaliable__ (line 879) | def __np_locator_avaliable__(data_block, loc_name, out_direction):
function __mp_locator_avaliable__ (line 909) | def __mp_locator_avaliable__(data_block, loc_name):
function __tp_locator_avaliable__ (line 932) | def __tp_locator_avaliable__(data_block, loc_name):
function __create_connection_entry__ (line 955) | def __create_connection_entry__(data_block, loc0_name, loc1_name):
function __recalculate_connection_entry__ (line 985) | def __recalculate_connection_entry__(data_block, conn_key):
function __create_locator_entries__ (line 1017) | def __create_locator_entries__(data_block, loc_obj):
function __delete_locator_if_empty__ (line 1069) | def __delete_locator_if_empty__(data_block, loc_name):
function __extend_array__ (line 1104) | def __extend_array__(data, new_value):
function __shrink_array__ (line 1127) | def __shrink_array__(data, value_to_delete):
FILE: addon/io_scs_tools/internals/connections/wrappers/collection.py
class ConnEntry (line 33) | class ConnEntry:
method __init__ (line 34) | def __init__(self, index, start, end, next_curves, prev_curves):
function init (line 60) | def init():
function create_connection (line 77) | def create_connection(loc0_obj, loc1_obj):
function delete_connection (line 97) | def delete_connection(loc0_name, loc1_name):
function has_connection (line 110) | def has_connection(loc0_obj, loc1_obj):
function delete_locator (line 115) | def delete_locator(loc_name):
function rename_locator (line 127) | def rename_locator(old_name, new_name):
function copy_check (line 141) | def copy_check(old_objs, new_objs):
function cleanup_on_export (line 155) | def cleanup_on_export():
function get_neighbours (line 162) | def get_neighbours(loc_obj):
function get_curves (line 190) | def get_curves(np_locators):
function force_recalculate (line 246) | def force_recalculate(object_list):
function invalidate (line 255) | def invalidate():
function update_for_redraw (line 261) | def update_for_redraw():
function ready_for_draw (line 276) | def ready_for_draw():
function draw (line 282) | def draw(visible_loc_names):
FILE: addon/io_scs_tools/internals/containers/config.py
class _PathsCache (line 43) | class _PathsCache:
method __init__ (line 56) | def __init__(self, inventory_type):
method is_valid (line 64) | def is_valid(self, paths):
method clear (line 105) | def clear(self):
method add_path (line 111) | def add_path(self, path):
class _ContainersCache (line 125) | class _ContainersCache:
method __hashed_path (line 145) | def __hashed_path(path):
method __retrieve_from_cache (line 163) | def __retrieve_from_cache(path):
method __cache_it (line 187) | def __cache_it(path, container):
method retrieve (line 213) | def retrieve(path):
class _ConfigSection (line 238) | class _ConfigSection:
method __init__ (line 241) | def __init__(self, section_type):
method apply_settings (line 245) | def apply_settings(self, settings_to_apply=None):
method fill_from_pix_section (line 266) | def fill_from_pix_section(self, section):
method get_as_pix_section (line 286) | def get_as_pix_section(self):
class Header (line 302) | class Header(_ConfigSection):
method __init__ (line 305) | def __init__(self):
method apply_config_storage_place (line 321) | def apply_config_storage_place(self):
method is_valid (line 325) | def is_valid(self):
method is_applicable (line 333) | def is_applicable(self):
class Paths (line 342) | class Paths(_ConfigSection):
method __init__ (line 345) | def __init__(self):
method apply_paths (line 371) | def apply_paths(self, load_internal=False):
class Import (line 429) | class Import(_ConfigSection):
method __init__ (line 432) | def __init__(self):
class Export (line 457) | class Export(_ConfigSection):
method __init__ (line 460) | def __init__(self):
class GlobalDisplay (line 486) | class GlobalDisplay(_ConfigSection):
method __init__ (line 489) | def __init__(self):
class GlobalColors (line 507) | class GlobalColors(_ConfigSection):
method __init__ (line 510) | def __init__(self):
class ConfigContainer (line 529) | class ConfigContainer:
method __init__ (line 532) | def __init__(self):
method set_property (line 543) | def set_property(self, section_type, prop_name, value):
method apply_settings (line 562) | def apply_settings(self):
method fill_from_pix_container (line 584) | def fill_from_pix_container(self, pix_container):
method get_pix_container (line 603) | def get_pix_container(self):
class AsyncPathsInit (line 618) | class AsyncPathsInit:
method _report_progress (line 642) | def _report_progress(message="", abort=False, hide_controls=False):
method _finish (line 666) | def _finish():
method _process_paths (line 693) | def _process_paths():
method is_running (line 744) | def is_running():
method append_callback (line 753) | def append_callback(callback):
method execute (line 770) | def execute(paths_list):
function update_item_in_file (line 815) | def update_item_in_file(item_pointer, new_value):
function update_scs_project_path (line 854) | def update_scs_project_path(scs_project_path, reload_only=False):
function update_shader_presets_path (line 891) | def update_shader_presets_path(shader_presets_filepath, reload_only=False):
function update_trigger_actions_rel_path (line 1022) | def update_trigger_actions_rel_path(trigger_actions_rel_path, reload_onl...
function update_sign_library_rel_path (line 1079) | def update_sign_library_rel_path(sign_library_rel_path, reload_only=False):
function update_tsem_library_rel_path (line 1149) | def update_tsem_library_rel_path(tsem_library_rel_path, reload_only=False):
function update_traffic_rules_library_rel_path (line 1210) | def update_traffic_rules_library_rel_path(traffic_rules_library_rel_path...
function update_hookup_library_rel_path (line 1269) | def update_hookup_library_rel_path(hookup_library_rel_path, reload_only=...
function update_matsubs_inventory (line 1371) | def update_matsubs_inventory(matsubs_library_rel_path, reload_only=False):
function update_sun_profiles_library_path (line 1429) | def update_sun_profiles_library_path(sun_profiles_library_path, reload_o...
function new_config_file (line 1501) | def new_config_file(filepath):
function get_config_filepath (line 1522) | def get_config_filepath():
function engage_config_lock (line 1543) | def engage_config_lock():
function release_config_lock (line 1555) | def release_config_lock(use_paths_init_callback=False):
function apply_settings (line 1569) | def apply_settings(preload_from_blend=False):
FILE: addon/io_scs_tools/internals/containers/mat.py
class MatContainer (line 27) | class MatContainer:
method __init__ (line 28) | def __init__(self, data_dict, effect):
method get_textures (line 65) | def get_textures(self):
method get_attributes (line 72) | def get_attributes(self):
method get_effect (line 79) | def get_effect(self):
function get_data_from_file (line 87) | def get_data_from_file(filepath):
FILE: addon/io_scs_tools/internals/containers/parsers/mat.py
function read_data (line 7) | def read_data(filepath, print_info=False):
FILE: addon/io_scs_tools/internals/containers/parsers/pix.py
function _get_prop (line 42) | def _get_prop(line):
function _read_matrix (line 140) | def _read_matrix(file, line_split):
function _get_data (line 152) | def _get_data(file, line):
function _read_section (line 254) | def _read_section(file, section_ids):
function next_line (line 313) | def next_line(file):
function read_data (line 362) | def read_data(filepath, ind, print_progress=False, print_info=False):
FILE: addon/io_scs_tools/internals/containers/parsers/sii.py
class _Token (line 28) | class _Token():
method __init__ (line 29) | def __init__(self, data_type, value):
class _Tokenizer (line 34) | class _Tokenizer():
method __init__ (line 35) | def __init__(self, data_input, filepath, include_paths):
method peek_token (line 43) | def peek_token(self):
method consume_token (line 51) | def consume_token(self):
method consume_token_if_of_type (line 57) | def consume_token_if_of_type(self, data_type):
method consume_token_if_match (line 63) | def consume_token_if_match(self, data_type, value):
method parse_token (line 69) | def parse_token(self):
method skip_to_end_of_block_comment (line 154) | def skip_to_end_of_block_comment(self):
function _parse_unit_name (line 175) | def _parse_unit_name(tokenizer):
function _parse_dot_separated_value (line 204) | def _parse_dot_separated_value(tokenizer):
function _parse_property_value (line 229) | def _parse_property_value(tokenizer):
function _parse_unit_property (line 274) | def _parse_unit_property(tokenizer, unit):
function _parse_unit (line 323) | def _parse_unit(tokenizer):
function _parse_bare_file (line 351) | def _parse_bare_file(filepath, print_info=False):
function parse_file (line 373) | def parse_file(filepath, is_sui=False, print_info=False):
FILE: addon/io_scs_tools/internals/containers/parsers/tobj.py
function parse_file (line 25) | def parse_file(filepath, print_info=False):
FILE: addon/io_scs_tools/internals/containers/pix.py
function fast_check_for_pia_skeleton (line 31) | def fast_check_for_pia_skeleton(pia_filepath, skeleton):
function utter_check_for_pia_skeleton (line 57) | def utter_check_for_pia_skeleton(pia_filepath, armature):
function make_triangle_stream (line 99) | def make_triangle_stream(stream_raw):
function make_stream_section (line 112) | def make_stream_section(data, data_tag, aliases):
function make_vertex_stream (line 150) | def make_vertex_stream(stream_raw, name=''):
function get_data_from_file (line 181) | def get_data_from_file(filepath, ind, print_progress=False, print_info=F...
function write_data_to_file (line 212) | def write_data_to_file(container, filepath, ind, print_progress=False, p...
FILE: addon/io_scs_tools/internals/containers/sii.py
function get_data_from_file (line 28) | def get_data_from_file(filepath, is_sui=False):
function write_data_to_file (line 58) | def write_data_to_file(filepath, container, is_sui=False, create_dirs=Fa...
function has_valid_unit_instance (line 86) | def has_valid_unit_instance(container, unit_type, req_props=tuple(), one...
function get_unit_property (line 135) | def get_unit_property(container, prop, unit_instance=0):
function get_direct_unit_property (line 158) | def get_direct_unit_property(unit, prop):
function get_unit_by_id (line 179) | def get_unit_by_id(container, unit_id, unit_type):
FILE: addon/io_scs_tools/internals/containers/tobj.py
class TobjContainer (line 27) | class TobjContainer:
method __init__ (line 35) | def __init__(self):
method validate (line 75) | def validate(self):
method write_data_to_file (line 161) | def write_data_to_file(self, filepath=None):
method read_data_from_file (line 268) | def read_data_from_file(cls, filepath, skip_validation=False):
FILE: addon/io_scs_tools/internals/containers/writers/pix.py
function _format_matrix (line 31) | def _format_matrix(mat, ind, offset):
function _format_bone (line 44) | def _format_bone(data_line, ind):
function _format_data (line 58) | def _format_data(data_line, data_line_type, spaces=5, data_hex=True):
function _write_properties_and_data (line 79) | def _write_properties_and_data(fw, section, ind, print_info):
function _write_section (line 165) | def _write_section(fw, section, ind, orig_ind, print_info):
function write_data (line 179) | def write_data(container, filepath, ind, print_progress, print_info):
FILE: addon/io_scs_tools/internals/containers/writers/sii.py
function _write_raw_value (line 25) | def _write_raw_value(f, value):
function _write_property_value (line 46) | def _write_property_value(f, item):
function _write_unit (line 74) | def _write_unit(f, unit, ind):
function write_data (line 128) | def write_data(filepath, container, ind="\t", is_sui=False, create_dirs=...
FILE: addon/io_scs_tools/internals/icons/__init__.py
function register (line 40) | def register():
function unregister (line 94) | def unregister():
function set_theme (line 105) | def set_theme(theme):
function get_theme_name (line 114) | def get_theme_name(idx):
function get_theme_idx (line 126) | def get_theme_idx(name):
function get_current_theme_idx (line 138) | def get_current_theme_idx():
function get_loaded_themes (line 147) | def get_loaded_themes():
function has_loaded_themes (line 156) | def has_loaded_themes():
function get_icon (line 165) | def get_icon(icon_type):
FILE: addon/io_scs_tools/internals/inventory.py
function remove_items_by_id (line 24) | def remove_items_by_id(inventory, index):
function remove_items_by_name (line 41) | def remove_items_by_name(inventory, name_list):
function has_item (line 56) | def has_item(inventory, item_name):
function get_index (line 66) | def get_index(inventory, item_name):
function get_indices (line 83) | def get_indices(inventory, item_name, starts_with=False):
function add_item (line 108) | def add_item(inventory, new_item_name, conditional=True):
function get_item_name (line 129) | def get_item_name(inventory, data_id, report_errors=False):
function move_up (line 168) | def move_up(inventory, idx):
function move_down (line 191) | def move_down(inventory, idx):
FILE: addon/io_scs_tools/internals/looks/__init__.py
function add_look (line 32) | def add_look(root_obj, look_id):
function remove_look (line 62) | def remove_look(root_obj, look_id):
function apply_active_look (line 81) | def apply_active_look(root_obj, force_apply=False):
function update_look_from_material (line 159) | def update_look_from_material(root_obj, material, preset_change=False):
function write_through (line 259) | def write_through(root_obj, material, prop):
function write_prop_to_look (line 314) | def write_prop_to_look(root_obj, look_id, material, prop):
function add_materials (line 371) | def add_materials(root_obj, mat_list):
function clean_unused (line 406) | def clean_unused(root_obj):
function reassign_material (line 439) | def reassign_material(root_obj, new_mat, old_mat):
function get_material_entries (line 480) | def get_material_entries(root_obj, material):
function get_active_look_data (line 518) | def get_active_look_data(root_obj, material):
function __collect_materials__ (line 552) | def __collect_materials__(root_obj):
function __create_material_entry__ (line 573) | def __create_material_entry__(material):
function __is_texture_locked__ (line 614) | def __is_texture_locked__(material, any_key):
FILE: addon/io_scs_tools/internals/open_gl/cache.py
class LocatorsCache (line 36) | class LocatorsCache:
method __init__ (line 44) | def __init__(self):
method cache_locations_2d (line 56) | def cache_locations_2d(self, objs, region, region_3d):
method cache_infos (line 106) | def cache_infos(self, objs):
method get_valid_locators (line 135) | def get_valid_locators(self, persp_matrix_str):
method get_locator_location_2d (line 150) | def get_locator_location_2d(self, obj, persp_matrix_str):
method get_locator_info (line 167) | def get_locator_info(self, obj):
FILE: addon/io_scs_tools/internals/open_gl/core.py
function _cache_custom_2d_elements (line 41) | def _cache_custom_2d_elements(region, region_3d, space):
function _draw_3dview_report (line 105) | def _draw_3dview_report(window, area, region):
function _draw_3dview_immediate_report (line 288) | def _draw_3dview_immediate_report(region):
function fill_buffers (line 336) | def fill_buffers(object_list):
function _fill_active_buffers (line 416) | def _fill_active_buffers(prefab_locators, model_locators, collision_loca...
function draw_custom_3d_elements (line 449) | def draw_custom_3d_elements(mode):
function draw_custom_2d_elements (line 472) | def draw_custom_2d_elements():
FILE: addon/io_scs_tools/internals/open_gl/locators/collider.py
function draw_shape_box (line 25) | def draw_shape_box(mat, obj_scs_props, scs_globals):
function draw_shape_sphere (line 58) | def draw_shape_sphere(mat, obj_scs_props, scs_globals):
function draw_shape_capsule (line 87) | def draw_shape_capsule(mat, obj_scs_props, scs_globals):
function draw_shape_cylinder (line 133) | def draw_shape_cylinder(mat, obj_scs_props, scs_globals):
function draw_shape_convex (line 177) | def draw_shape_convex(mat, obj_scs_props, scs_globals):
function draw_collision_locator (line 200) | def draw_collision_locator(obj, scs_globals):
function get_collision_locator_comprehensive_info (line 224) | def get_collision_locator_comprehensive_info(obj):
FILE: addon/io_scs_tools/internals/open_gl/locators/model.py
function draw_shape_model_locator (line 25) | def draw_shape_model_locator(mat, scs_globals):
function draw_model_box (line 47) | def draw_model_box(mat, scs_globals):
function draw_model_locator (line 72) | def draw_model_locator(obj, scs_globals):
function get_model_locator_comprehensive_info (line 93) | def get_model_locator_comprehensive_info(obj):
FILE: addon/io_scs_tools/internals/open_gl/locators/prefab.py
function draw_shape_control_node (line 26) | def draw_shape_control_node(mat, scs_globals):
function draw_shape_sign (line 49) | def draw_shape_sign(mat, scs_globals):
function draw_shape_spawn_point (line 76) | def draw_shape_spawn_point(mat, scs_globals):
function draw_shape_traffic_light (line 103) | def draw_shape_traffic_light(mat, scs_globals):
function draw_shape_map_point (line 136) | def draw_shape_map_point(mat, scs_globals):
function draw_shape_trigger_point (line 161) | def draw_shape_trigger_point(mat, mat_orig, radius, scs_globals, draw_ra...
function draw_prefab_locator (line 178) | def draw_prefab_locator(obj, scs_globals):
function get_prefab_locator_comprehensive_info (line 243) | def get_prefab_locator_comprehensive_info(obj):
FILE: addon/io_scs_tools/internals/open_gl/primitive.py
class _Buffer (line 30) | class _Buffer:
class Types (line 33) | class Types:
method __init__ (line 38) | def __init__(self, buffer_type, draw_size, shader_type, attr_names):
method append_attr (line 83) | def append_attr(self, attr_name, value):
method clear (line 94) | def clear(self):
method draw (line 100) | def draw(self, uniforms, space_3d):
method has_entries (line 138) | def has_entries(self):
class _ViewsBufferHandler (line 147) | class _ViewsBufferHandler:
method __get_new_buffers__ (line 151) | def __get_new_buffers__():
method __init__ (line 165) | def __init__(self):
method __get_buffers__ (line 171) | def __get_buffers__(self, space_3d):
method set_current (line 184) | def set_current(self, space_3d):
method append_tris_vertex (line 195) | def append_tris_vertex(self, pos, color):
method append_line_vertex (line 208) | def append_line_vertex(self, pos, color, is_stipple=False):
method append_point_vertex (line 226) | def append_point_vertex(self, pos, color, size):
method clear_buffers (line 246) | def clear_buffers(self):
method draw_buffers (line 261) | def draw_buffers(self, space_3d):
function clear_buffers (line 300) | def clear_buffers():
function draw_buffers (line 306) | def draw_buffers(space_3d):
function set_active_buffers (line 315) | def set_active_buffers(space_3d):
function append_tris_vertex (line 327) | def append_tris_vertex(pos, color):
function append_line_vertex (line 338) | def append_line_vertex(pos, color, is_strip=False, is_stipple=False):
function append_point_vertex (line 356) | def append_point_vertex(pos, color, size):
function get_box_data (line 369) | def get_box_data():
function get_sphere_data (line 388) | def get_sphere_data():
function get_capsule_data (line 448) | def get_capsule_data():
function get_cylinder_data (line 524) | def get_cylinder_data():
function draw_polygon_object (line 556) | def draw_polygon_object(mat, vertices, faces, face_color, draw_faces, dr...
function draw_point (line 666) | def draw_point(vector, color, size):
function draw_circle (line 680) | def draw_circle(radius, steps, mat, scs_globals):
function draw_shape_x_axis (line 708) | def draw_shape_x_axis(mat, size):
function draw_shape_y_axis (line 723) | def draw_shape_y_axis(mat, size):
function draw_shape_y_axis_neg (line 738) | def draw_shape_y_axis_neg(mat, size):
function draw_shape_z_axis (line 750) | def draw_shape_z_axis(mat, size):
function draw_shape_z_axis_neg (line 765) | def draw_shape_z_axis_neg(mat, size):
function draw_shape_line (line 777) | def draw_shape_line(line, stipple, is_map_line, scs_globals):
function draw_shape_curve (line 829) | def draw_shape_curve(curve, stipple, scs_globals):
function draw_text (line 876) | def draw_text(text, font_id, x, y):
function draw_rect_2d (line 897) | def draw_rect_2d(positions, color):
FILE: addon/io_scs_tools/internals/open_gl/shaders/__init__.py
class ShaderTypes (line 25) | class ShaderTypes:
function __get_shader_data__ (line 34) | def __get_shader_data__(shader_filename):
function get_shader (line 50) | def get_shader(shader_type):
FILE: addon/io_scs_tools/internals/open_gl/storage/terrain_points.py
function add (line 24) | def add(position, is_visible):
function clear (line 37) | def clear():
function is_emtpy (line 43) | def is_emtpy():
function get_positions_and_colors (line 52) | def get_positions_and_colors():
FILE: addon/io_scs_tools/internals/persistent/file_load.py
function post_load (line 35) | def post_load(scene):
function _reload_materials (line 66) | def _reload_materials():
function apply_fixes_for_0_6 (line 77) | def apply_fixes_for_0_6():
function apply_fixes_for_1_4 (line 171) | def apply_fixes_for_1_4():
function apply_fixes_for_1_12 (line 211) | def apply_fixes_for_1_12():
function apply_fixes_for_2_0 (line 288) | def apply_fixes_for_2_0():
function apply_fixes_for_2_4 (line 337) | def apply_fixes_for_2_4():
FILE: addon/io_scs_tools/internals/persistent/file_save.py
function pre_save (line 27) | def pre_save(scene):
FILE: addon/io_scs_tools/internals/persistent/initialization.py
function post_load (line 35) | def post_load(scene):
function on_enable (line 45) | def on_enable():
function init_scs_tools (line 58) | def init_scs_tools():
FILE: addon/io_scs_tools/internals/persistent/loop_check.py
class _Timer (line 34) | class _Timer:
method can_execute (line 48) | def can_execute():
method increment_updated_ids (line 62) | def increment_updated_ids(depsgraph):
method get_and_reset_updated_states (line 81) | def get_and_reset_updated_states():
function object_data_check (line 99) | def object_data_check(scene):
function __active_scs_root_change__ (line 288) | def __active_scs_root_change__(new_scs_root_obj):
function __material_assignement__ (line 298) | def __material_assignement__(obj, new_mat_ids, removed_mat_ids):
function __objects_reparent__ (line 323) | def __objects_reparent__(parent, new_objs):
function __objects_copy__ (line 357) | def __objects_copy__(old_objects, new_objects):
function __objects_delete__ (line 377) | def __objects_delete__(unparented_objects):
function __object_rename__ (line 396) | def __object_rename__(old_name, new_name):
function _fix_ex_parent (line 413) | def _fix_ex_parent(obj):
function _fix_children (line 431) | def _fix_children(obj):
FILE: addon/io_scs_tools/internals/persistent/open_gl.py
class _DelayedUpdate (line 37) | class _DelayedUpdate:
method __update_internal__ (line 46) | def __update_internal__():
method schedule (line 65) | def schedule(delay, object_list):
function post_undo (line 85) | def post_undo(scene):
function post_redo (line 95) | def post_redo(scene):
function post_frame_change (line 105) | def post_frame_change(scene):
function post_depsgraph (line 137) | def post_depsgraph(scene):
FILE: addon/io_scs_tools/internals/persistent/shaders_update.py
function post_frame_change (line 27) | def post_frame_change(scene):
FILE: addon/io_scs_tools/internals/preview_models/__init__.py
function init (line 35) | def init():
function rename (line 43) | def rename(old_name, new_name):
function link (line 54) | def link(locator, preview_model):
function unlink (line 91) | def unlink(preview_model):
function load (line 109) | def load(locator, deep_reload=False):
function unload (line 211) | def unload(locator):
function fix_visibilites (line 226) | def fix_visibilites():
function fix_visibility (line 233) | def fix_visibility(locator):
function update (line 271) | def update(force=False):
function _get_model_mesh (line 316) | def _get_model_mesh(locator):
function _get_material (line 329) | def _get_material(reload=False):
FILE: addon/io_scs_tools/internals/preview_models/cache.py
class PrevModelsCache (line 25) | class PrevModelsCache:
method __contains__ (line 33) | def __contains__(self, item):
method get_entry (line 44) | def get_entry(self, loc_name):
method init (line 58) | def init(self):
method rename_entry (line 80) | def rename_entry(self, old_name, new_name):
method add_entry (line 118) | def add_entry(self, locator_name, prem_name):
method delete_entry (line 130) | def delete_entry(self, prem_name):
FILE: addon/io_scs_tools/internals/shader_presets/__init__.py
function is_library_initialized (line 34) | def is_library_initialized(path):
function set_library_initialized (line 45) | def set_library_initialized(path):
function clear (line 54) | def clear():
function add_section (line 65) | def add_section(base_effect, preset_name, flavors_str, section, is_dirty...
function get_section (line 99) | def get_section(preset_name, flavors_str=""):
function find_sections (line 112) | def find_sections(base_effect, flavors_str):
function has_preset (line 138) | def has_preset(preset_name):
function has_effect (line 149) | def has_effect(base_effect):
function has_section (line 160) | def has_section(preset_name, flavors_str=""):
function get_preset_names (line 176) | def get_preset_names(sort=False):
function get_preset_index (line 190) | def get_preset_index(preset_name, default=0):
function get_preset_name (line 206) | def get_preset_name(index):
function get_preset (line 221) | def get_preset(preset_name):
function add_flavor (line 235) | def add_flavor(preset_name):
function add_flavor_variant (line 248) | def add_flavor_variant(preset_name, flavor_variant_type, flavor_variant_...
FILE: addon/io_scs_tools/internals/shader_presets/cache.py
class ShaderPresetsCache (line 26) | class ShaderPresetsCache:
method __init__ (line 27) | def __init__(self):
method clear (line 40) | def clear(self):
method cleanup (line 51) | def cleanup(self):
method add_section (line 66) | def add_section(self, preset_idx, flavors_str, section, is_dirty=False):
method has_section (line 87) | def has_section(self, preset_idx, flavors_str):
method get_section (line 102) | def get_section(self, preset_idx, flavors_str=""):
method set_initialized (line 117) | def set_initialized(self, path):
method is_initialized (line 129) | def is_initialized(self, path):
FILE: addon/io_scs_tools/internals/shader_presets/ui_shader_preset_item.py
class UIShaderPresetItem (line 22) | class UIShaderPresetItem:
method __init__ (line 25) | def __init__(self, the_effect, the_name):
method append_flavor (line 41) | def append_flavor(self):
method append_flavor_variant (line 47) | def append_flavor_variant(self, variant_type, variant_suffix):
class Flavor (line 61) | class Flavor:
method __init__ (line 62) | def __init__(self):
method append_variant (line 70) | def append_variant(self, variant):
class FlavorVariant (line 80) | class FlavorVariant:
method __init__ (line 81) | def __init__(self, the_type, the_suffix):
FILE: addon/io_scs_tools/internals/shaders/__init__.py
function update_shaders (line 29) | def update_shaders(scene):
function set_base_paint_color (line 46) | def set_base_paint_color(node_tree, color):
FILE: addon/io_scs_tools/internals/shaders/base.py
class BaseShader (line 22) | class BaseShader:
method get_name (line 30) | def get_name():
method init (line 35) | def init(node_tree):
method finalize (line 44) | def finalize(node_tree, material):
FILE: addon/io_scs_tools/internals/shaders/eut2/__init__.py
function get_shader (line 22) | def get_shader(effect):
FILE: addon/io_scs_tools/internals/shaders/eut2/building/add_env_day.py
class BuildingAddEnvDay (line 24) | class BuildingAddEnvDay(DifSpecAddEnv):
method get_name (line 26) | def get_name():
method init (line 31) | def init(node_tree):
method set_aux5 (line 42) | def set_aux5(node_tree, aux_property):
FILE: addon/io_scs_tools/internals/shaders/eut2/building/day.py
class BuildingDay (line 24) | class BuildingDay(DifSpec):
method get_name (line 26) | def get_name():
method init (line 31) | def init(node_tree):
method set_aux5 (line 42) | def set_aux5(node_tree, aux_property):
FILE: addon/io_scs_tools/internals/shaders/eut2/building/lvcol_day.py
class BuildingLvcolDay (line 24) | class BuildingLvcolDay(DifSpec):
method get_name (line 26) | def get_name():
method init (line 31) | def init(node_tree):
method set_aux5 (line 42) | def set_aux5(node_tree, aux_property):
FILE: addon/io_scs_tools/internals/shaders/eut2/decalshadow/__init__.py
class Decalshadow (line 24) | class Decalshadow(Shadowmap):
method get_name (line 26) | def get_name():
method init (line 31) | def init(node_tree):
FILE: addon/io_scs_tools/internals/shaders/eut2/dif/__init__.py
class Dif (line 37) | class Dif(BaseShader):
method get_name (line 53) | def get_name():
method init (line 58) | def init(node_tree):
method finalize (line 172) | def finalize(node_tree, material):
method set_add_ambient (line 214) | def set_add_ambient(node_tree, factor):
method set_diffuse (line 226) | def set_diffuse(node_tree, color):
method set_specular (line 240) | def set_specular(node_tree, color):
method set_shininess (line 254) | def set_shininess(node_tree, factor):
method set_reflection (line 266) | def set_reflection(node_tree, value):
method set_shadow_bias (line 278) | def set_shadow_bias(node_tree, value):
method set_queue_bias (line 290) | def set_queue_bias(node_tree, value):
method set_base_texture (line 302) | def set_base_texture(node_tree, image):
method set_base_texture_settings (line 314) | def set_base_texture_settings(node_tree, settings):
method set_base_uv (line 325) | def set_base_uv(node_tree, uv_layer):
method set_alpha_test_flavor (line 340) | def set_alpha_test_flavor(node_tree, switch_on):
method set_blend_over_flavor (line 355) | def set_blend_over_flavor(node_tree, switch_on):
method set_blend_add_flavor (line 370) | def set_blend_add_flavor(node_tree, switch_on):
method set_blend_mult_flavor (line 392) | def set_blend_mult_flavor(node_tree, switch_on):
method set_nmap_flavor (line 418) | def set_nmap_flavor(node_tree, switch_on):
method set_nmap_texture (line 444) | def set_nmap_texture(node_tree, image):
method set_nmap_texture_settings (line 456) | def set_nmap_texture_settings(node_tree, settings):
method set_nmap_uv (line 467) | def set_nmap_uv(node_tree, uv_layer):
method set_tg0_flavor (line 479) | def set_tg0_flavor(node_tree, switch_on):
method set_aux0 (line 503) | def set_aux0(node_tree, aux_property):
method set_flat_flavor (line 517) | def set_flat_flavor(node_tree, switch_on):
method set_paint_flavor (line 534) | def set_paint_flavor(node_tree, switch_on):
FILE: addon/io_scs_tools/internals/shaders/eut2/dif_anim/__init__.py
class DifAnim (line 29) | class DifAnim(Dif):
method get_name (line 38) | def get_name():
method init (line 43) | def init(node_tree):
method finalize (line 116) | def finalize(node_tree, material):
method set_base_texture (line 143) | def set_base_texture(node_tree, image):
method set_base_texture_settings (line 158) | def set_base_texture_settings(node_tree, settings):
method set_base_uv (line 173) | def set_base_uv(node_tree, uv_layer):
method set_over_texture (line 191) | def set_over_texture(node_tree, image):
method set_over_texture_settings (line 207) | def set_over_texture_settings(node_tree, settings):
method set_over_uv (line 223) | def set_over_uv(node_tree, uv_layer):
method set_aux0 (line 242) | def set_aux0(node_tree, aux_property):
method set_aux1 (line 263) | def set_aux1(node_tree, aux_property):
method set_fadesheet_flavor (line 278) | def set_fadesheet_flavor(node_tree, switch_on):
method set_flipsheet_flavor (line 310) | def set_flipsheet_flavor(node_tree, switch_on):
FILE: addon/io_scs_tools/internals/shaders/eut2/dif_anim/anim_blend_factor_ng.py
function get_node_group (line 29) | def get_node_group():
function update_time (line 42) | def update_time(scene):
function __create_node_group__ (line 56) | def __create_node_group__():
FILE: addon/io_scs_tools/internals/shaders/eut2/dif_lum/__init__.py
class DifLum (line 29) | class DifLum(Dif, StdLum):
method get_name (line 32) | def get_name():
method init (line 37) | def init(node_tree):
method finalize (line 59) | def finalize(node_tree, material):
method set_aux5 (line 104) | def set_aux5(node_tree, aux_property):
method set_alpha_test_flavor (line 116) | def set_alpha_test_flavor(node_tree, switch_on):
method set_blend_over_flavor (line 131) | def set_blend_over_flavor(node_tree, switch_on):
method set_blend_add_flavor (line 146) | def set_blend_add_flavor(node_tree, switch_on):
method set_blend_mult_flavor (line 168) | def set_blend_mult_flavor(node_tree, switch_on):
method set_lvcol_flavor (line 198) | def set_lvcol_flavor(node_tree, switch_on):
FILE: addon/io_scs_tools/internals/shaders/eut2/dif_lum_spec/__init__.py
class DifLumSpec (line 29) | class DifLumSpec(DifSpec, StdLum):
method get_name (line 32) | def get_name():
method init (line 37) | def init(node_tree):
method finalize (line 59) | def finalize(node_tree, material):
method set_aux5 (line 104) | def set_aux5(node_tree, aux_property):
method set_alpha_test_flavor (line 116) | def set_alpha_test_flavor(node_tree, switch_on):
method set_blend_over_flavor (line 131) | def set_blend_over_flavor(node_tree, switch_on):
method set_blend_add_flavor (line 146) | def set_blend_add_flavor(node_tree, switch_on):
method set_blend_mult_flavor (line 168) | def set_blend_mult_flavor(node_tree, switch_on):
method set_lvcol_flavor (line 198) | def set_lvcol_flavor(node_tree, switch_on):
FILE: addon/io_scs_tools/internals/shaders/eut2/dif_spec/__init__.py
class DifSpec (line 26) | class DifSpec(Dif):
method get_name (line 31) | def get_name():
method init (line 36) | def init(node_tree):
method init (line 40) | def init(node_tree, disable_remap_alpha=False):
method set_asafew_flavor (line 89) | def set_asafew_flavor(node_tree, switch_on):
FILE: addon/io_scs_tools/internals/shaders/eut2/dif_spec_add_env/__init__.py
class DifSpecAddEnv (line 25) | class DifSpecAddEnv(DifSpec, StdAddEnv):
method get_name (line 27) | def get_name():
method init (line 32) | def init(node_tree):
method set_indenv_flavor (line 49) | def set_indenv_flavor(node_tree, switch_on):
FILE: addon/io_scs_tools/internals/shaders/eut2/dif_spec_add_env/nofresnel.py
class DifSpecAddEnvNoFresnel (line 24) | class DifSpecAddEnvNoFresnel(DifSpecAddEnv):
method get_name (line 26) | def get_name():
method init (line 31) | def init(node_tree):
method set_fresnel (line 45) | def set_fresnel(node_tree, bias_scale):
FILE: addon/io_scs_tools/internals/shaders/eut2/dif_spec_fade_dif_spec/__init__.py
class DifSpecFadeDifSpec (line 27) | class DifSpecFadeDifSpec(DifSpec):
method get_name (line 36) | def get_name():
method init (line 41) | def init(node_tree):
method set_detail_texture (line 119) | def set_detail_texture(node_tree, image):
method set_detail_texture_settings (line 131) | def set_detail_texture_settings(node_tree, settings):
method set_detail_uv (line 142) | def set_detail_uv(node_tree, uv_layer):
method set_nmap_flavor (line 154) | def set_nmap_flavor(node_tree, switch_on):
method set_nmap_texture (line 187) | def set_nmap_texture(node_tree, image):
method set_nmap_texture_settings (line 199) | def set_nmap_texture_settings(node_tree, settings):
method set_nmap_uv (line 210) | def set_nmap_uv(node_tree, uv_layer):
method set_nmap_detail_texture (line 222) | def set_nmap_detail_texture(node_tree, texture):
method set_nmap_detail_texture_settings (line 234) | def set_nmap_detail_texture_settings(node_tree, settings):
method set_nmap_detail_uv (line 245) | def set_nmap_detail_uv(node_tree, uv_layer):
method set_aux5 (line 257) | def set_aux5(node_tree, aux_property):
FILE: addon/io_scs_tools/internals/shaders/eut2/dif_spec_fade_dif_spec/detail_nmap.py
function __create_nodes__ (line 37) | def __create_nodes__(node_tree, location, uv_scale_from, det_nmap_streng...
function init (line 150) | def init(node_tree, location, uv_scale_from, det_nmap_strength_from, nor...
function set_texture (line 172) | def set_texture(node_tree, image):
function set_texture_settings (line 183) | def set_texture_settings(node_tree, settings):
function set_detail_texture (line 194) | def set_detail_texture(node_tree, image):
function set_detail_texture_settings (line 222) | def set_detail_texture_settings(node_tree, settings):
function set_uv (line 233) | def set_uv(node_tree, uv_layer):
function set_detail_uv (line 245) | def set_detail_uv(node_tree, uv_layer):
function delete (line 257) | def delete(node_tree, preserve_node=False):
FILE: addon/io_scs_tools/internals/shaders/eut2/dif_spec_fade_dif_spec/detail_setup_ng.py
function get_node_group (line 27) | def get_node_group():
function __create_group__ (line 43) | def __create_group__():
FILE: addon/io_scs_tools/internals/shaders/eut2/dif_spec_mult_dif_spec/__init__.py
class DifSpecMultDifSpec (line 27) | class DifSpecMultDifSpec(DifSpec):
method get_name (line 34) | def get_name():
method init (line 39) | def init(node_tree):
method set_mult_texture (line 107) | def set_mult_texture(node_tree, image):
method set_mult_texture_settings (line 119) | def set_mult_texture_settings(node_tree, settings):
method set_mult_uv (line 130) | def set_mult_uv(node_tree, uv_layer):
method set_tg1_flavor (line 145) | def set_tg1_flavor(node_tree, switch_on):
method set_aux1 (line 169) | def set_aux1(node_tree, aux_property):
FILE: addon/io_scs_tools/internals/shaders/eut2/dif_spec_mult_dif_spec/add_env.py
class DifSpecMultDifSpecAddEnv (line 25) | class DifSpecMultDifSpecAddEnv(DifSpecMultDifSpec, StdAddEnv):
method get_name (line 27) | def get_name():
method init (line 32) | def init(node_tree):
FILE: addon/io_scs_tools/internals/shaders/eut2/dif_spec_mult_dif_spec_iamod_dif_spec/__init__.py
class DifSpecMultDifSpecIamodDifSpec (line 26) | class DifSpecMultDifSpecIamodDifSpec(DifSpecMultDifSpec):
method get_name (line 35) | def get_name():
method init (line 40) | def init(node_tree):
method set_iamod_texture (line 129) | def set_iamod_texture(node_tree, image):
method set_iamod_texture_settings (line 141) | def set_iamod_texture_settings(node_tree, settings):
method set_iamod_uv (line 152) | def set_iamod_uv(node_tree, uv_layer):
method set_alpha_test_flavor (line 167) | def set_alpha_test_flavor(node_tree, switch_on):
method set_blend_over_flavor (line 179) | def set_blend_over_flavor(node_tree, switch_on):
method set_blend_add_flavor (line 191) | def set_blend_add_flavor(node_tree, switch_on):
method set_blend_mult_flavor (line 203) | def set_blend_mult_flavor(node_tree, switch_on):
FILE: addon/io_scs_tools/internals/shaders/eut2/dif_spec_oclu/__init__.py
class DifSpecOclu (line 26) | class DifSpecOclu(DifSpec):
method get_name (line 34) | def get_name():
method init (line 39) | def init(node_tree):
method set_oclu_texture (line 108) | def set_oclu_texture(node_tree, image):
method set_oclu_texture_settings (line 120) | def set_oclu_texture_settings(node_tree, settings):
method set_oclu_uv (line 131) | def set_oclu_uv(node_tree, uv_layer):
FILE: addon/io_scs_tools/internals/shaders/eut2/dif_spec_oclu_add_env/__init__.py
class DifSpecOcluAddEnv (line 25) | class DifSpecOcluAddEnv(DifSpecOclu, StdAddEnv):
method get_name (line 27) | def get_name():
method init (line 32) | def init(node_tree):
FILE: addon/io_scs_tools/internals/shaders/eut2/dif_spec_oclu_weight_add_env/__init__.py
class DifSpecOcluWeightAddEnv (line 25) | class DifSpecOcluWeightAddEnv(DifSpecOclu, StdAddEnv):
method get_name (line 29) | def get_name():
method init (line 34) | def init(node_tree):
FILE: addon/io_scs_tools/internals/shaders/eut2/dif_spec_over_dif_opac/__init__.py
class DifSpecOverDifOpac (line 27) | class DifSpecOverDifOpac(DifSpec):
method get_name (line 33) | def get_name():
method init (line 38) | def init(node_tree):
method set_aux1 (line 89) | def set_aux1(node_tree, aux_property):
method set_reflection2 (line 103) | def set_reflection2(node_tree, value):
method set_over_texture (line 115) | def set_over_texture(node_tree, image):
method set_over_texture_settings (line 127) | def set_over_texture_settings(node_tree, settings):
method set_over_uv (line 138) | def set_over_uv(node_tree, uv_layer):
method set_tg1_flavor (line 153) | def set_tg1_flavor(node_tree, switch_on):
FILE: addon/io_scs_tools/internals/shaders/eut2/dif_spec_weight/__init__.py
class DifSpecWeight (line 24) | class DifSpecWeight(DifSpec):
method get_name (line 28) | def get_name():
method init (line 33) | def init(node_tree):
FILE: addon/io_scs_tools/internals/shaders/eut2/dif_spec_weight_add_env/__init__.py
class DifSpecWeightAddEnv (line 25) | class DifSpecWeightAddEnv(DifSpecWeight, StdAddEnv):
method get_name (line 27) | def get_name():
method init (line 32) | def init(node_tree):
FILE: addon/io_scs_tools/internals/shaders/eut2/dif_spec_weight_mult2/__init__.py
class DifSpecWeightMult2 (line 27) | class DifSpecWeightMult2(DifSpec):
method get_name (line 34) | def get_name():
method init (line 39) | def init(node_tree):
method set_mult_texture (line 119) | def set_mult_texture(node_tree, image):
method set_mult_texture_settings (line 131) | def set_mult_texture_settings(node_tree, settings):
method set_mult_uv (line 142) | def set_mult_uv(node_tree, uv_layer):
method set_aux5 (line 154) | def set_aux5(node_tree, aux_property):
method set_tg0_flavor (line 167) | def set_tg0_flavor(node_tree, switch_on):
method set_aux0 (line 193) | def set_aux0(node_tree, aux_property):
FILE: addon/io_scs_tools/internals/shaders/eut2/dif_spec_weight_mult2_weight2/__init__.py
class DifSpecWeightMult2Weight2 (line 29) | class DifSpecWeightMult2Weight2(DifSpecWeightMult2):
method get_name (line 41) | def get_name():
method init (line 46) | def init(node_tree):
method set_reflection2 (line 163) | def set_reflection2(node_tree, value):
method set_aux3 (line 176) | def set_aux3(node_tree, aux_property):
method set_aux5 (line 190) | def set_aux5(node_tree, aux_property):
method set_base_uv (line 205) | def set_base_uv(node_tree, uv_layer):
method set_base_1_texture (line 217) | def set_base_1_texture(node_tree, image):
method set_base_1_texture_settings (line 229) | def set_base_1_texture_settings(node_tree, settings):
method set_base_1_uv (line 240) | def set_base_1_uv(node_tree, uv_layer):
method set_mult_1_texture (line 255) | def set_mult_1_texture(node_tree, image):
method set_mult_1_texture_settings (line 267) | def set_mult_1_texture_settings(node_tree, settings):
method set_mult_1_uv (line 278) | def set_mult_1_uv(node_tree, uv_layer):
method set_alpha_test_flavor (line 290) | def set_alpha_test_flavor(node_tree, switch_on):
method set_blend_over_flavor (line 302) | def set_blend_over_flavor(node_tree, switch_on):
method set_blend_add_flavor (line 314) | def set_blend_add_flavor(node_tree, switch_on):
method set_blend_mult_flavor (line 326) | def set_blend_mult_flavor(node_tree, switch_on):
method set_tg1_flavor (line 338) | def set_tg1_flavor(node_tree, switch_on):
method set_aux1 (line 364) | def set_aux1(node_tree, aux_property):
FILE: addon/io_scs_tools/internals/shaders/eut2/dif_spec_weight_weight_dif_spec_weight/__init__.py
class DifSpecWeightWeightDifSpecWeight (line 27) | class DifSpecWeightWeightDifSpecWeight(DifSpec):
method get_name (line 38) | def get_name():
method init (line 43) | def init(node_tree):
method set_shininess (line 153) | def set_shininess(node_tree, factor):
method set_over_texture (line 165) | def set_over_texture(node_tree, image):
method set_over_texture_settings (line 177) | def set_over_texture_settings(node_tree, settings):
method set_over_uv (line 188) | def set_over_uv(node_tree, uv_layer):
method set_aux3 (line 200) | def set_aux3(node_tree, aux_property):
method set_reflection2 (line 216) | def set_reflection2(node_tree, value):
method set_tg1_flavor (line 228) | def set_tg1_flavor(node_tree, switch_on):
method set_aux1 (line 252) | def set_aux1(node_tree, aux_property):
FILE: addon/io_scs_tools/internals/shaders/eut2/dif_weight_dif/__init__.py
class DifWeightDif (line 31) | class DifWeightDif(Dif):
method get_name (line 38) | def get_name():
method init (line 43) | def init(node_tree):
method finalize (line 108) | def finalize(node_tree, material):
method set_reflection2 (line 150) | def set_reflection2(node_tree, value):
method set_over_texture (line 162) | def set_over_texture(node_tree, image):
method set_over_texture_settings (line 174) | def set_over_texture_settings(node_tree, settings):
method set_over_uv (line 185) | def set_over_uv(node_tree, uv_layer):
method set_tg1_flavor (line 200) | def set_tg1_flavor(node_tree, switch_on):
method set_aux1 (line 224) | def set_aux1(node_tree, aux_property):
FILE: addon/io_scs_tools/internals/shaders/eut2/fakeshadow/__init__.py
class Fakeshadow (line 24) | class Fakeshadow(BaseShader):
method get_name (line 30) | def get_name():
method init (line 35) | def init(node_tree):
method set_shadow_bias (line 70) | def set_shadow_bias(node_tree, value):
method finalize (line 82) | def finalize(node_tree, material):
FILE: addon/io_scs_tools/internals/shaders/eut2/flare/__init__.py
class Flare (line 24) | class Flare(UnlitVcolTex):
method get_name (line 26) | def get_name():
method init (line 31) | def init(node_tree):
FILE: addon/io_scs_tools/internals/shaders/eut2/glass/__init__.py
class Glass (line 34) | class Glass(BaseShader):
method get_name (line 95) | def get_name():
method init (line 100) | def init(node_tree):
method finalize (line 363) | def finalize(node_tree, material):
method set_add_ambient (line 376) | def set_add_ambient(node_tree, factor):
method set_diffuse (line 388) | def set_diffuse(node_tree, color):
method set_specular (line 402) | def set_specular(node_tree, color):
method set_shininess (line 416) | def set_shininess(node_tree, factor):
method set_reflection (line 428) | def set_reflection(node_tree, value):
method set_base_texture (line 440) | def set_base_texture(node_tree, image):
method set_base_texture_settings (line 452) | def set_base_texture_settings(node_tree, settings):
method set_base_uv (line 463) | def set_base_uv(node_tree, uv_layer):
method set_reflection_texture (line 478) | def set_reflection_texture(node_tree, image):
method set_reflection_texture_settings (line 490) | def set_reflection_texture_settings(node_tree, settings):
method set_env_factor (line 501) | def set_env_factor(node_tree, color):
method set_fresnel (line 515) | def set_fresnel(node_tree, bias_scale):
method set_tint_opacity (line 530) | def set_tint_opacity(node_tree, opacity):
method set_tint (line 542) | def set_tint(node_tree, color):
FILE: addon/io_scs_tools/internals/shaders/eut2/grass/__init__.py
class Grass (line 24) | class Grass(Dif):
method get_name (line 28) | def get_name():
method init (line 33) | def init(node_tree):
FILE: addon/io_scs_tools/internals/shaders/eut2/lamp/__init__.py
class Lamp (line 28) | class Lamp(DifSpec):
method get_name (line 36) | def get_name():
method init (line 41) | def init(node_tree):
method init (line 50) | def init(node_tree, init_dif_spec=True, start_pos_x=0, start_pos_y=0):
method set_mask_texture (line 117) | def set_mask_texture(node_tree, image):
method set_mask_texture_settings (line 129) | def set_mask_texture_settings(node_tree, settings):
method set_mask_uv (line 143) | def set_mask_uv(node_tree, uv_layer):
FILE: addon/io_scs_tools/internals/shaders/eut2/lamp/add_env.py
class LampAddEnv (line 25) | class LampAddEnv(Lamp, DifSpecAddEnv):
method get_name (line 27) | def get_name():
method init (line 32) | def init(node_tree):
FILE: addon/io_scs_tools/internals/shaders/eut2/light_tex/__init__.py
class LightTex (line 24) | class LightTex(Dif):
method get_name (line 29) | def get_name():
method init (line 34) | def init(node_tree):
method finalize (line 79) | def finalize(node_tree, material):
method set_shininess (line 93) | def set_shininess(node_tree, factor):
method set_alpha_test_flavor (line 105) | def set_alpha_test_flavor(node_tree, switch_on):
method set_blend_over_flavor (line 117) | def set_blend_over_flavor(node_tree, switch_on):
method set_blend_add_flavor (line 129) | def set_blend_add_flavor(node_tree, switch_on):
method set_blend_mult_flavor (line 141) | def set_blend_mult_flavor(node_tree, switch_on):
method set_aux0 (line 153) | def set_aux0(node_tree, aux_property):
FILE: addon/io_scs_tools/internals/shaders/eut2/lightmap/night.py
class LightMapNight (line 24) | class LightMapNight(LightTex):
method get_name (line 26) | def get_name():
method init (line 31) | def init(node_tree):
FILE: addon/io_scs_tools/internals/shaders/eut2/mlaaweight/__init__.py
class MlaaWeight (line 24) | class MlaaWeight(NNone):
method get_name (line 27) | def get_name():
method init (line 32) | def init(node_tree):
FILE: addon/io_scs_tools/internals/shaders/eut2/none/__init__.py
class NNone (line 26) | class NNone(BaseShader):
method get_name (line 32) | def get_name():
method init (line 37) | def init(node_tree):
method finalize (line 67) | def finalize(node_tree, material):
FILE: addon/io_scs_tools/internals/shaders/eut2/parameters.py
function get_material_luminosity (line 24) | def get_material_luminosity(luminance_boost):
function get_fresnel_v1 (line 54) | def get_fresnel_v1(bias, scale, default_bias):
function get_fresnel_glass (line 75) | def get_fresnel_glass(bias, scale):
function get_fresnel_truckpaint (line 89) | def get_fresnel_truckpaint(bias, scale):
function get_fresnel_window (line 103) | def get_fresnel_window(bias, scale):
FILE: addon/io_scs_tools/internals/shaders/eut2/reflective/__init__.py
class Reflective (line 29) | class Reflective(BaseShader):
method get_name (line 42) | def get_name():
method init (line 47) | def init(node_tree):
method finalize (line 130) | def finalize(node_tree, material):
method set_base_texture (line 143) | def set_base_texture(node_tree, image):
method set_base_texture_settings (line 155) | def set_base_texture_settings(node_tree, settings):
method set_base_uv (line 166) | def set_base_uv(node_tree, uv_layer):
FILE: addon/io_scs_tools/internals/shaders/eut2/retroreflective/__init__.py
class Retroreflective (line 25) | class Retroreflective(Dif):
method get_name (line 29) | def get_name():
method init (line 34) | def init(node_tree):
method init (line 38) | def init(node_tree):
method set_retroreflective_decal_flavor (line 77) | def set_retroreflective_decal_flavor(node_tree, switch_on):
FILE: addon/io_scs_tools/internals/shaders/eut2/shadowmap/__init__.py
class Shadowmap (line 27) | class Shadowmap(BaseShader):
method get_name (line 34) | def get_name():
method init (line 39) | def init(node_tree):
method finalize (line 80) | def finalize(node_tree, material):
method set_base_texture (line 93) | def set_base_texture(node_tree, image):
method set_base_texture_settings (line 105) | def set_base_texture_settings(node_tree, settings):
method set_base_uv (line 116) | def set_base_uv(node_tree, uv_layer):
FILE: addon/io_scs_tools/internals/shaders/eut2/shadowonly/__init__.py
class Shadowonly (line 24) | class Shadowonly(BaseShader):
method get_name (line 29) | def get_name():
method init (line 34) | def init(node_tree):
method finalize (line 60) | def finalize(node_tree, material):
method set_shadow_bias (line 73) | def set_shadow_bias(node_tree, value):
FILE: addon/io_scs_tools/internals/shaders/eut2/sign/__init__.py
class Sign (line 24) | class Sign(Dif):
method get_name (line 26) | def get_name():
method init (line 31) | def init(node_tree):
FILE: addon/io_scs_tools/internals/shaders/eut2/sky/__init__.py
class Sky (line 34) | class Sky(BaseShader):
method get_name (line 60) | def get_name():
method init (line 65) | def init(node_tree):
method __create_texel_component_nodes__ (line 220) | def __create_texel_component_nodes__(node_tree, tex_type, location):
method __create_texel_component_links__ (line 260) | def __create_texel_component_links__(node_tree, tex_type, uv_socket):
method finalize (line 288) | def finalize(node_tree, material):
method set_diffuse (line 309) | def set_diffuse(node_tree, color):
method set_sky_weather_base_a_texture (line 323) | def set_sky_weather_base_a_texture(node_tree, image):
method set_sky_weather_base_a_texture_settings (line 335) | def set_sky_weather_base_a_texture_settings(node_tree, settings):
method set_sky_weather_base_a_uv (line 346) | def set_sky_weather_base_a_uv(node_tree, uv_layer):
method set_sky_weather_base_b_texture (line 361) | def set_sky_weather_base_b_texture(node_tree, image):
method set_sky_weather_base_b_texture_settings (line 373) | def set_sky_weather_base_b_texture_settings(node_tree, settings):
method set_sky_weather_base_b_uv (line 384) | def set_sky_weather_base_b_uv(node_tree, uv_layer):
method set_sky_weather_over_a_texture (line 396) | def set_sky_weather_over_a_texture(node_tree, image):
method set_sky_weather_over_a_texture_settings (line 408) | def set_sky_weather_over_a_texture_settings(node_tree, settings):
method set_sky_weather_over_a_uv (line 419) | def set_sky_weather_over_a_uv(node_tree, uv_layer):
method set_sky_weather_over_b_texture (line 431) | def set_sky_weather_over_b_texture(node_tree, image):
method set_sky_weather_over_b_texture_settings (line 443) | def set_sky_weather_over_b_texture_settings(node_tree, settings):
method set_sky_weather_over_b_uv (line 454) | def set_sky_weather_over_b_uv(node_tree, uv_layer):
method set_aux0 (line 466) | def set_aux0(node_tree, aux_property):
method set_aux1 (line 495) | def set_aux1(node_tree, aux_property):
method set_aux2 (line 514) | def set_aux2(node_tree, aux_property):
method set_sky_stars_flavor (line 533) | def set_sky_stars_flavor(node_tree, switch_on):
method set_sky_back_flavor (line 548) | def set_sky_back_flavor(node_tree, switch_on):
FILE: addon/io_scs_tools/internals/shaders/eut2/sky/texture_types.py
function get (line 22) | def get():
function get_base_a (line 31) | def get_base_a():
function get_base_b (line 35) | def get_base_b():
function get_over_a (line 39) | def get_over_a():
function get_over_b (line 43) | def get_over_b():
FILE: addon/io_scs_tools/internals/shaders/eut2/sky/uv_rescale_ng.py
function get_node_group (line 36) | def get_node_group():
function __create_node_group__ (line 49) | def __create_node_group__():
function __init_rescale_component__ (line 107) | def __init_rescale_component__(node_tree, uv_type, location, uv_socket, ...
FILE: addon/io_scs_tools/internals/shaders/eut2/std_node_groups/add_env_ng.py
function get_node_group (line 42) | def get_node_group():
function set_global_env_factor (line 55) | def set_global_env_factor(value):
function reset_lighting_params (line 72) | def reset_lighting_params():
function __group_needs_recreation__ (line 78) | def __group_needs_recreation__():
function __create_node_group__ (line 93) | def __create_node_group__():
FILE: addon/io_scs_tools/internals/shaders/eut2/std_node_groups/alpha_remap_ng.py
function get_node_group (line 30) | def get_node_group():
function __create_node_group__ (line 43) | def __create_node_group__():
FILE: addon/io_scs_tools/internals/shaders/eut2/std_node_groups/compose_lighting_ng.py
function get_node_group (line 39) | def get_node_group():
function set_additional_ambient_col (line 62) | def set_additional_ambient_col(color):
function reset_lighting_params (line 71) | def reset_lighting_params():
function __create_node_group__ (line 77) | def __create_node_group__():
FILE: addon/io_scs_tools/internals/shaders/eut2/std_node_groups/fresnel_legacy_ng.py
function get_node_group (line 27) | def get_node_group():
function __create_fresnel_group__ (line 40) | def __create_fresnel_group__():
FILE: addon/io_scs_tools/internals/shaders/eut2/std_node_groups/fresnel_schlick_ng.py
function get_node_group (line 27) | def get_node_group():
function __create_fresnel_group__ (line 40) | def __create_fresnel_group__():
FILE: addon/io_scs_tools/internals/shaders/eut2/std_node_groups/lampmask_mixer_ng.py
function get_node_group (line 45) | def get_node_group():
function __create_node_group__ (line 58) | def __create_node_group__():
function __init_uv_tile_bounding_nodes__ (line 214) | def __init_uv_tile_bounding_nodes__(node_tree, uv_dot_n, name, pos_x, po...
function __init_vehicle_uv_bounding_nodes__ (line 253) | def __init_vehicle_uv_bounding_nodes__(node_tree, vehicle_side, pos_x, p...
function __init_traffic_light_uv_bounding_nodes__ (line 295) | def __init_traffic_light_uv_bounding_nodes__(node_tree, traffic_light_ty...
function __init_vehicle_switch_nodes__ (line 359) | def __init_vehicle_switch_nodes__(node_tree, a_output, r_output, g_outpu...
function __init_aux_switch_nodes__ (line 473) | def __init_aux_switch_nodes__(node_tree, a_output, r_output, g_output, l...
function __init_traffic_light_switch_nodes__ (line 532) | def __init_traffic_light_switch_nodes__(node_tree, a_output, lamp_type, ...
function __create_merging_node__ (line 571) | def __create_merging_node__(node_tree, node_name, position, output_0, ou...
FILE: addon/io_scs_tools/internals/shaders/eut2/std_node_groups/lighting_evaluator_ng.py
function get_node_group (line 58) | def get_node_group():
function set_light_direction (line 76) | def set_light_direction(sun_obj):
function reset_light_direction (line 94) | def reset_light_direction():
function set_ambient_light (line 107) | def set_ambient_light(color):
function set_diffuse_light (line 116) | def set_diffuse_light(color):
function set_specular_light (line 125) | def set_specular_light(color):
function reset_lighting_params (line 134) | def reset_lighting_params():
function __create_group__ (line 143) | def __create_group__():
FILE: addon/io_scs_tools/internals/shaders/eut2/std_node_groups/linear_to_srgb_ng.py
function get_node_group (line 46) | def get_node_group():
function __create_linear_to_srgb_group__ (line 59) | def __create_linear_to_srgb_group__():
FILE: addon/io_scs_tools/internals/shaders/eut2/std_node_groups/mult2_mix_ng.py
function get_node_group (line 33) | def get_node_group():
function __create_node_group__ (line 46) | def __create_node_group__():
FILE: addon/io_scs_tools/internals/shaders/eut2/std_node_groups/refl_normal_ng.py
function get_node_group (line 27) | def get_node_group():
function __create_refl_normal_group__ (line 40) | def __create_refl_normal_group__():
FILE: addon/io_scs_tools/internals/shaders/eut2/std_node_groups/scs_uvs_combine_ng.py
function get_node_group (line 27) | def get_node_group():
function __create_node_group__ (line 40) | def __create_node_group__():
FILE: addon/io_scs_tools/internals/shaders/eut2/std_node_groups/scs_uvs_separate_ng.py
function get_node_group (line 27) | def get_node_group():
function __create_node_group__ (line 40) | def __create_node_group__():
FILE: addon/io_scs_tools/internals/shaders/eut2/std_node_groups/vcolor_input_ng.py
function get_node_group (line 44) | def get_node_group():
function __create_vcolor_group__ (line 57) | def __create_vcolor_group__():
FILE: addon/io_scs_tools/internals/shaders/eut2/std_passes/add_env.py
class StdAddEnv (line 26) | class StdAddEnv:
method get_name (line 33) | def get_name():
method add (line 38) | def add(node_tree, geom_n_name, spec_col_socket, alpha_socket, final_n...
method set_reflection_texture (line 115) | def set_reflection_texture(node_tree, image):
method set_reflection_texture_settings (line 127) | def set_reflection_texture_settings(node_tree, settings):
method set_env_factor (line 138) | def set_env_factor(node_tree, color):
method set_fresnel (line 152) | def set_fresnel(node_tree, bias_scale):
FILE: addon/io_scs_tools/internals/shaders/eut2/std_passes/lum.py
class StdLum (line 25) | class StdLum:
method get_name (line 36) | def get_name():
method add (line 41) | def add(node_tree, base_texel_socket, base_texel_a_socket, lit_result_...
method set_aux5 (line 130) | def set_aux5(node_tree, aux_property):
FILE: addon/io_scs_tools/internals/shaders/eut2/truckpaint/__init__.py
class Truckpaint (line 29) | class Truckpaint(DifSpecAddEnv):
method get_name (line 56) | def get_name():
method init (line 61) | def init(node_tree):
method init_colormask_or_airbrush (line 169) | def init_colormask_or_airbrush(node_tree):
method set_fresnel (line 281) | def set_fresnel(node_tree, bias_scale):
method set_base_paint_color (line 295) | def set_base_paint_color(node_tree, color):
method set_paintjob_texture (line 311) | def set_paintjob_texture(node_tree, image):
method set_paintjob_texture_settings (line 328) | def set_paintjob_texture_settings(node_tree, settings):
method set_paintjob_uv (line 339) | def set_paintjob_uv(node_tree, uv_layer):
method set_aux8 (line 359) | def set_aux8(node_tree, color):
method set_aux7 (line 376) | def set_aux7(node_tree, color):
method set_aux6 (line 393) | def set_aux6(node_tree, color):
method set_aux5 (line 410) | def set_aux5(node_tree, color):
FILE: addon/io_scs_tools/internals/shaders/eut2/truckpaint/airbrush.py
class TruckpaintAirbrush (line 24) | class TruckpaintAirbrush(Truckpaint):
method get_name (line 26) | def get_name():
method init (line 31) | def init(node_tree):
FILE: addon/io_scs_tools/internals/shaders/eut2/truckpaint/colormask.py
class TruckpaintColormask (line 24) | class TruckpaintColormask(Truckpaint):
method get_name (line 26) | def get_name():
method init (line 31) | def init(node_tree):
FILE: addon/io_scs_tools/internals/shaders/eut2/unlit_tex/__init__.py
class UnlitTex (line 35) | class UnlitTex(BaseShader):
method get_name (line 45) | def get_name():
method init (line 50) | def init(node_tree):
method finalize (line 111) | def finalize(node_tree, material):
method set_diffuse (line 153) | def set_diffuse(node_tree, color):
method set_queue_bias (line 167) | def set_queue_bias(node_tree, value):
method set_aux5 (line 179) | def set_aux5(node_tree, aux_property):
method set_base_texture (line 192) | def set_base_texture(node_tree, image):
method set_base_texture_settings (line 204) | def set_base_texture_settings(node_tree, settings):
method set_base_uv (line 215) | def set_base_uv(node_tree, uv_layer):
method set_alpha_test_flavor (line 230) | def set_alpha_test_flavor(node_tree, switch_on):
method set_blend_over_flavor (line 245) | def set_blend_over_flavor(node_tree, switch_on):
method set_blend_add_flavor (line 260) | def set_blend_add_flavor(node_tree, switch_on):
method set_blend_mult_flavor (line 282) | def set_blend_mult_flavor(node_tree, switch_on):
method set_paint_flavor (line 308) | def set_paint_flavor(node_tree, switch_on):
FILE: addon/io_scs_tools/internals/shaders/eut2/unlit_vcol_tex/__init__.py
class UnlitVcolTex (line 39) | class UnlitVcolTex(BaseShader):
method get_name (line 57) | def get_name():
method init (line 62) | def init(node_tree):
method finalize (line 153) | def finalize(node_tree, material):
method set_diffuse (line 197) | def set_diffuse(node_tree, color):
method set_queue_bias (line 211) | def set_queue_bias(node_tree, value):
method set_aux0 (line 223) | def set_aux0(node_tree, aux_property):
method set_aux1 (line 242) | def set_aux1(node_tree, aux_property):
method set_aux5 (line 257) | def set_aux5(node_tree, aux_property):
method set_base_texture (line 270) | def set_base_texture(node_tree, image):
method set_base_texture_settings (line 291) | def set_base_texture_settings(node_tree, settings):
method set_base_uv (line 302) | def set_base_uv(node_tree, uv_layer):
method set_alpha_test_flavor (line 317) | def set_alpha_test_flavor(node_tree, switch_on):
method set_blend_over_flavor (line 332) | def set_blend_over_flavor(node_tree, switch_on):
method set_blend_add_flavor (line 347) | def set_blend_add_flavor(node_tree, switch_on):
method set_blend_mult_flavor (line 369) | def set_blend_mult_flavor(node_tree, switch_on):
method set_awhite_flavor (line 395) | def set_awhite_flavor(node_tree, switch_on):
method set_paint_flavor (line 419) | def set_paint_flavor(node_tree, switch_on):
method set_fadesheet_flavor (line 444) | def set_fadesheet_flavor(node_tree, switch_on):
method set_flipsheet_flavor (line 500) | def set_flipsheet_flavor(node_tree, switch_on):
FILE: addon/io_scs_tools/internals/shaders/eut2/water/__init__.py
class Water (line 32) | class Water(Dif, StdAddEnv):
method get_name (line 55) | def get_name():
method init (line 60) | def init(node_tree):
method __init_nmap__ (line 206) | def __init_nmap__(node_tree, uid, location, position_from, stream_from...
method set_aux0 (line 278) | def set_aux0(node_tree, aux_property):
method set_aux1 (line 292) | def set_aux1(node_tree, aux_property):
method set_aux2 (line 304) | def set_aux2(node_tree, aux_property):
method set_aux3 (line 316) | def set_aux3(node_tree, aux_property):
method set_aux4 (line 337) | def set_aux4(node_tree, aux_property):
method set_aux5 (line 358) | def set_aux5(node_tree, aux_property):
method set_layer0_texture (line 369) | def set_layer0_texture(node_tree, image):
method set_layer0_texture_settings (line 383) | def set_layer0_texture_settings(node_tree, settings):
method set_layer1_texture (line 397) | def set_layer1_texture(node_tree, image):
method set_layer1_texture_settings (line 411) | def set_layer1_texture_settings(node_tree, settings):
FILE: addon/io_scs_tools/internals/shaders/eut2/water/mix_factor_ng.py
function get_node_group (line 27) | def get_node_group():
function __create_group__ (line 43) | def __create_group__():
FILE: addon/io_scs_tools/internals/shaders/eut2/water/water_stream_ng.py
function get_node_group (line 34) | def get_node_group():
function update_time (line 47) | def update_time(scene):
function __create_node_group__ (line 61) | def __create_node_group__():
FILE: addon/io_scs_tools/internals/shaders/eut2/window/lit.py
class WindowLit (line 29) | class WindowLit(DifSpecAddEnv):
method get_name (line 39) | def get_name():
method init (line 44) | def init(node_tree):
method set_fresnel (line 152) | def set_fresnel(node_tree, bias_scale):
method set_lightmap_texture (line 166) | def set_lightmap_texture(node_tree, image):
method set_lightmap_texture_settings (line 177) | def set_lightmap_texture_settings(node_tree, settings):
method set_lightmap_uv (line 188) | def set_lightmap_uv(node_tree, uv_layer):
FILE: addon/io_scs_tools/internals/shaders/eut2/window/window_final_uv_ng.py
function get_node_group (line 27) | def get_node_group():
function __create_node_group__ (line 41) | def __create_node_group__():
FILE: addon/io_scs_tools/internals/shaders/eut2/window/window_offset_factor_ng.py
function get_node_group (line 27) | def get_node_group():
function __create_node_group__ (line 41) | def __create_node_group__():
FILE: addon/io_scs_tools/internals/shaders/eut2/window/window_uv_offset_ng.py
function get_node_group (line 31) | def get_node_group():
function __create_node_group__ (line 47) | def __create_node_group__():
FILE: addon/io_scs_tools/internals/shaders/flavors/alpha_test.py
function init (line 27) | def init(node_tree):
function delete (line 39) | def delete(node_tree):
function is_set (line 53) | def is_set(node_tree):
function add_pass (line 64) | def add_pass(node_tree, shader_from, alpha_from, shader_to):
FILE: addon/io_scs_tools/internals/shaders/flavors/asafew.py
function init (line 24) | def init(node_tree, alpha_remap_gn):
function delete (line 44) | def delete(node_tree, alpha_remap_gn):
function is_set (line 60) | def is_set(node_tree):
FILE: addon/io_scs_tools/internals/shaders/flavors/awhite.py
function __create_node__ (line 27) | def __create_node__(node_tree):
function init (line 43) | def init(node_tree, location, mix_factor_from, color_from, color_to):
function delete (line 75) | def delete(node_tree):
function is_set (line 89) | def is_set(node_tree):
function get_out_socket (line 100) | def get_out_socket(node_tree):
FILE: addon/io_scs_tools/internals/shaders/flavors/blend_add.py
function init (line 28) | def init(node_tree, location, shader_from, shader_to):
function delete (line 56) | def delete(node_tree):
function is_set (line 70) | def is_set(node_tree):
FILE: addon/io_scs_tools/internals/shaders/flavors/blend_mult.py
function init (line 28) | def init(node_tree, location, shader_from, shader_to):
function delete (line 56) | def delete(node_tree):
function is_set (line 70) | def is_set(node_tree):
FILE: addon/io_scs_tools/internals/shaders/flavors/blend_over.py
function init (line 25) | def init(node_tree):
function delete (line 37) | def delete(node_tree):
function is_set (line 48) | def is_set(node_tree):
FILE: addon/io_scs_tools/internals/shaders/flavors/fadesheet/__init__.py
function __create_node__ (line 27) | def __create_node__(node_tree):
function init (line 38) | def init(node_tree, location, uv_output, base_texture_input, over_textur...
function delete (line 76) | def delete(node_tree):
function get_node (line 90) | def get_node(node_tree):
function is_set (line 101) | def is_set(node_tree):
function set_fps (line 112) | def set_fps(node_tree, fps):
function set_frames_total (line 126) | def set_frames_total(node_tree, frames_total):
function set_frames_row (line 140) | def set_frames_row(node_tree, frames_row):
function set_frame_size (line 154) | def set_frame_size(node_tree, frame_width, frame_height):
FILE: addon/io_scs_tools/internals/shaders/flavors/fadesheet/fadesheet_compute_ng.py
function get_node_group (line 35) | def get_node_group():
function __group_needs_recreation__ (line 48) | def __group_needs_recreation__():
function __create_node_group__ (line 59) | def __create_node_group__():
FILE: addon/io_scs_tools/internals/shaders/flavors/flipsheet/__init__.py
function __create_node__ (line 27) | def __create_node__(node_tree):
function init (line 38) | def init(node_tree, location, uv_output, base_texture_input):
function delete (line 67) | def delete(node_tree):
function get_node (line 81) | def get_node(node_tree):
function is_set (line 92) | def is_set(node_tree):
function set_fps (line 103) | def set_fps(node_tree, fps):
function set_frames_total (line 117) | def set_frames_total(node_tree, frames_total):
function set_frames_row (line 131) | def set_frames_row(node_tree, frames_row):
function set_frame_size (line 145) | def set_frame_size(node_tree, frame_width, frame_height):
FILE: addon/io_scs_tools/internals/shaders/flavors/flipsheet/flipsheet_compute_ng.py
function get_node_group (line 34) | def get_node_group():
function __group_needs_recreation__ (line 47) | def __group_needs_recreation__():
function __create_node_group__ (line 58) | def __create_node_group__():
FILE: addon/io_scs_tools/internals/shaders/flavors/nmap/__init__.py
function __create_nodes__ (line 35) | def __create_nodes__(node_tree, location=None, normal_to=None, normal_fr...
function __check_and_create_dds16_node__ (line 106) | def __check_and_create_dds16_node__(node_tree, image):
function init (line 148) | def init(node_tree, location, normal_to, normal_from):
function set_texture (line 165) | def set_texture(node_tree, image):
function set_texture_settings (line 196) | def set_texture_settings(node_tree, settings):
function set_uv (line 207) | def set_uv(node_tree, uv_layer):
function delete (line 228) | def delete(node_tree, preserve_node=False):
FILE: addon/io_scs_tools/internals/shaders/flavors/nmap/dds16_ng.py
function get_node_group (line 35) | def get_node_group():
function __create_node_group__ (line 48) | def __create_node_group__():
FILE: addon/io_scs_tools/internals/shaders/flavors/nmap/scale_ng.py
function get_node_group (line 37) | def get_node_group():
function __create_nmap_scale_group__ (line 52) | def __create_nmap_scale_group__():
FILE: addon/io_scs_tools/internals/shaders/flavors/paint.py
function __create_node__ (line 28) | def __create_node__(node_tree):
function init (line 42) | def init(node_tree, location, diffuse_from, paint_to):
function delete (line 71) | def delete(node_tree):
function is_set (line 101) | def is_set(node_tree):
function set_color (line 112) | def set_color(node_tree, color):
FILE: addon/io_scs_tools/internals/shaders/flavors/sky_back.py
function init (line 25) | def init(node_tree):
function delete (line 37) | def delete(node_tree):
function is_set (line 48) | def is_set(node_tree):
FILE: addon/io_scs_tools/internals/shaders/flavors/sky_stars.py
function init (line 25) | def init(node_tree):
function delete (line 37) | def delete(node_tree):
function is_set (line 48) | def is_set(node_tree):
FILE: addon/io_scs_tools/internals/shaders/flavors/tg0.py
function __create_node__ (line 26) | def __create_node__(node_tree):
function init (line 39) | def init(node_tree, location, geom_output, texture_input):
function delete (line 68) | def delete(node_tree):
function get_node (line 82) | def get_node(node_tree):
function is_set (line 93) | def is_set(node_tree):
function set_scale (line 104) | def set_scale(node_tree, scale_x, scale_y):
FILE: addon/io_scs_tools/internals/shaders/flavors/tg1.py
function __create_node__ (line 26) | def __create_node__(node_tree):
function init (line 39) | def init(node_tree, location, geom_output, texture_input):
function delete (line 68) | def delete(node_tree):
function get_node (line 82) | def get_node(node_tree):
function is_set (line 93) | def is_set(node_tree):
function set_scale (line 104) | def set_scale(node_tree, scale_x, scale_y):
FILE: addon/io_scs_tools/internals/shaders/shader.py
function setup_nodes (line 25) | def setup_nodes(material, effect, attr_dict, tex_dict, tex_settings_dict...
function set_attribute (line 113) | def set_attribute(material, attr_type, attr_value):
function set_texture (line 126) | def set_texture(material, tex_type, image):
function set_texture_settings (line 139) | def set_texture_settings(material, tex_type, settings):
function set_uv (line 152) | def set_uv(material, tex_type, uv_layer, tex_coord):
function __setup_nodes__ (line 191) | def __setup_nodes__(material, effect, attr_dict, tex_dict, tex_settings_...
function __clean_node_tree__ (line 270) | def __clean_node_tree__(node_tree):
function __get_shader__ (line 285) | def __get_shader__(effect, report_not_found, mat_name):
FILE: addon/io_scs_tools/internals/shaders/std_node_groups/alpha_test_ng.py
function get_node_group (line 32) | def get_node_group():
function __group_needs_recreation__ (line 45) | def __group_needs_recreation__():
function __create_node_group__ (line 56) | def __create_node_group__():
FILE: addon/io_scs_tools/internals/shaders/std_node_groups/animsheet_frame_idx_to_col_row_ng.py
function get_node_group (line 33) | def get_node_group():
function __group_needs_recreation__ (line 46) | def __group_needs_recreation__():
function __create_node_group__ (line 57) | def __create_node_group__():
FILE: addon/io_scs_tools/internals/shaders/std_node_groups/animsheet_frame_ng.py
function get_node_group (line 33) | def get_node_group():
function __group_needs_recreation__ (line 46) | def __group_needs_recreation__():
function __create_node_group__ (line 57) | def __create_node_group__():
FILE: addon/io_scs_tools/internals/shaders/std_node_groups/animsheet_loop_frame_ng.py
function get_node_group (line 34) | def get_node_group():
function __group_needs_recreation__ (line 47) | def __group_needs_recreation__():
function __create_node_group__ (line 58) | def __create_node_group__():
function update_time (line 147) | def update_time(scene):
FILE: addon/io_scs_tools/internals/shaders/std_node_groups/animsheet_xfade_ng.py
function get_node_group (line 38) | def get_node_group():
function __group_needs_recreation__ (line 51) | def __group_needs_recreation__():
function __create_node_group__ (line 62) | def __create_node_group__():
FILE: addon/io_scs_tools/internals/shaders/std_node_groups/blend_add_ng.py
function get_node_group (line 32) | def get_node_group():
function __group_needs_recreation__ (line 45) | def __group_needs_recreation__():
function __create_node_group__ (line 56) | def __create_node_group__():
FILE: addon/io_scs_tools/internals/shaders/std_node_groups/blend_mult_ng.py
function get_node_group (line 32) | def get_node_group():
function __group_needs_recreation__ (line 45) | def __group_needs_recreation__():
function __create_node_group__ (line 56) | def __create_node_group__():
FILE: addon/io_scs_tools/internals/shaders/std_node_groups/output_shader_ng.py
function get_node_group (line 32) | def get_node_group():
function __group_needs_recreation__ (line 45) | def __group_needs_recreation__():
function __create_node_group__ (line 54) | def __create_node_group__():
FILE: addon/io_scs_tools/internals/structure.py
class SectionData (line 26) | class SectionData(object):
method __init__ (line 35) | def __init__(self, data_type):
method get_prop (line 41) | def get_prop(self, prop_key):
method get_section (line 47) | def get_section(self, key):
method get_sections (line 60) | def get_sections(self, key):
method get_prop_value (line 74) | def get_prop_value(self, prop_key):
method set_prop_value (line 80) | def set_prop_value(self, prop_key, value):
method remove_section (line 101) | def remove_section(self, sec_type, sec_prop, regex_str):
class UnitData (line 123) | class UnitData(object):
method __init__ (line 131) | def __init__(self, data_type, data_id, is_headless=False):
method get_prop_as_number (line 137) | def get_prop_as_number(self, prop_name):
method get_prop_as_color (line 160) | def get_prop_as_color(self, prop_name):
method get_prop (line 190) | def get_prop(self, prop_name, default=None):
FILE: addon/io_scs_tools/operators/__init__.py
function register (line 29) | def register():
function unregister (line 38) | def unregister():
FILE: addon/io_scs_tools/operators/bases/export.py
class SCSExportHelper (line 28) | class SCSExportHelper:
method __init__ (line 36) | def __init__(self):
method get_objects_for_export (line 53) | def get_objects_for_export(self):
method init (line 99) | def init(self):
method finish (line 136) | def finish(self):
method execute_export (line 159) | def execute_export(self, context, without_preview, menu_filepath=None):
FILE: addon/io_scs_tools/operators/bases/selection.py
class Selection (line 26) | class Selection:
method get_select_state (line 41) | def get_select_state(self):
method execute (line 63) | def execute(self, context):
method invoke (line 66) | def invoke(self, context, event):
FILE: addon/io_scs_tools/operators/bases/view.py
class View (line 27) | class View:
method get_objects (line 43) | def get_objects(context):
method get_hide_state (line 61) | def get_hide_state(self):
method execute (line 83) | def execute(self, context):
method invoke (line 86) | def invoke(self, context, event):
FILE: addon/io_scs_tools/operators/material.py
class Common (line 37) | class Common:
class SCS_TOOLS_OT_ReloadMaterials (line 42) | class SCS_TOOLS_OT_ReloadMaterials(bpy.types.Operator):
method execute (line 47) | def execute(self, context):
class SCS_TOOLS_OT_SearchShaderPreset (line 136) | class SCS_TOOLS_OT_SearchShaderPreset(bpy.types.Operator):
method execute (line 160) | def execute(self, context):
method invoke (line 164) | def invoke(self, context, event):
class SCS_TOOLS_OT_AdaptColorManagement (line 169) | class SCS_TOOLS_OT_AdaptColorManagement(bpy.types.Operator):
method poll (line 178) | def poll(cls, context):
method draw_popup_menu (line 182) | def draw_popup_menu(self, context):
method execute (line 213) | def execute(self, context):
method invoke (line 237) | def invoke(self, context, event):
class SCS_TOOLS_OT_MergeMaterials (line 247) | class SCS_TOOLS_OT_MergeMaterials(bpy.types.Operator):
method draw (line 280) | def draw(self, context):
method merge_materials (line 289) | def merge_materials(self, mats_to_merge, base_mat_look_entries=None):
method execute (line 376) | def execute(self, context):
method invoke (line 515) | def invoke(self, context, event):
class SCS_TOOLS_OT_MaterialItemExtrasMenu (line 519) | class SCS_TOOLS_OT_MaterialItemExtrasMenu(bpy.types.Operator):
method draw_context_menu (line 535) | def draw_context_menu(self, context):
method execute (line 561) | def execute(self, context):
class CustomMapping (line 569) | class CustomMapping:
class SCS_TOOLS_OT_AddCustomTexCoordMapping (line 574) | class SCS_TOOLS_OT_AddCustomTexCoordMapping(bpy.types.Operator):
method execute (line 580) | def execute(self, context):
class SCS_TOOLS_OT_RemoveCustomTexCoordMapping (line 589) | class SCS_TOOLS_OT_RemoveCustomTexCoordMapping(bpy.types.Operator):
method execute (line 595) | def execute(self, context):
class Looks (line 605) | class Looks:
class SCS_TOOLS_OT_WriteThroughLooks (line 610) | class SCS_TOOLS_OT_WriteThroughLooks(bpy.types.Operator):
method init_control_states (line 638) | def init_control_states(self):
method execute (line 657) | def execute(self, context):
class Tobj (line 729) | class Tobj:
class SCS_TOOLS_ReloadTOBJ (line 734) | class SCS_TOOLS_ReloadTOBJ(bpy.types.Operator):
method execute (line 745) | def execute(self, context):
class SCS_TOOLS_OT_CreateTOBJ (line 755) | class SCS_TOOLS_OT_CreateTOBJ(bpy.types.Operator):
method execute (line 766) | def execute(self, context):
class LampSwitcher (line 789) | class LampSwitcher:
class SCS_TOOLS_OT_SwitchLampmask (line 794) | class SCS_TOOLS_OT_SwitchLampmask(bpy.types.Operator):
method execute (line 805) | def execute(self, context):
class Aliasing (line 829) | class Aliasing:
class SCS_TOOLS_OT_LoadAliasedMaterial (line 834) | class SCS_TOOLS_OT_LoadAliasedMaterial(bpy.types.Operator):
method poll (line 841) | def poll(cls, context):
method execute (line 844) | def execute(self, context):
class Flavors (line 934) | class Flavors:
class SCS_TOOLS_OT_SwitchFlavor (line 939) | class SCS_TOOLS_OT_SwitchFlavor(bpy.types.Operator):
method poll (line 952) | def poll(cls, context):
method execute (line 955) | def execute(self, context):
class Texture (line 1016) | class Texture:
class SCS_TOOLS_OT_SelectTexturePath (line 1021) | class SCS_TOOLS_OT_SelectTexturePath(bpy.types.Operator):
method execute (line 1046) | def execute(self, context):
method invoke (line 1061) | def invoke(self, context, event):
class Attribute (line 1080) | class Attribute:
class SCS_TOOLS_OT_CopyColorAsLinear (line 1085) | class SCS_TOOLS_OT_CopyColorAsLinear(bpy.types.Operator):
method execute (line 1096) | def execute(self, context):
class SCS_TOOLS_OT_PasteColorFromLinear (line 1116) | class SCS_TOOLS_OT_PasteColorFromLinear(bpy.types.Operator):
method execute (line 1127) | def execute(self, context):
function register (line 1192) | def register():
function unregister (line 1197) | def unregister():
FILE: addon/io_scs_tools/operators/mesh.py
class LampTool (line 35) | class LampTool:
class SCS_TOOLS_OT_SetLampmaskUV (line 40) | class SCS_TOOLS_OT_SetLampmaskUV(bpy.types.Operator):
method poll (line 64) | def poll(cls, context):
method execute (line 67) | def execute(self, context):
class VertexColorTools (line 140) | class VertexColorTools:
class SCS_TOOLS_OT_WrapVertexColors (line 145) | class SCS_TOOLS_OT_WrapVertexColors(bpy.types.Operator):
method poll (line 174) | def poll(cls, context):
method __init__ (line 177) | def __init__(self):
method __del__ (line 180) | def __del__(self):
method execute (line 183) | def execute(self, context):
class SCS_TOOLS_OT_PrintVertexColorsStats (line 219) | class SCS_TOOLS_OT_PrintVertexColorsStats(bpy.types.Operator):
method poll (line 226) | def poll(cls, context):
method execute (line 229) | def execute(self, context):
class SCS_TOOLS_OT_AddVertexColorsToActive (line 268) | class SCS_TOOLS_OT_AddVertexColorsToActive(bpy.types.Operator):
method poll (line 275) | def poll(cls, context):
method execute (line 278) | def execute(self, context):
class SCS_TOOLS_OT_AddVertexColorsToAll (line 304) | class SCS_TOOLS_OT_AddVertexColorsToAll(bpy.types.Operator):
method poll (line 311) | def poll(cls, context):
method execute (line 314) | def execute(self, context):
class SCS_TOOLS_OT_StartVColoring (line 357) | class SCS_TOOLS_OT_StartVColoring(bpy.types.Operator):
method __get_active_object__ (line 382) | def __get_active_object__(self):
method initialize (line 390) | def initialize(self, context):
method switch_to_layer (line 444) | def switch_to_layer(self, layer_name):
method abort (line 466) | def abort(cls):
method poll (line 473) | def poll(cls, context):
method modal (line 481) | def modal(self, context, event):
method execute (line 528) | def execute(self, context):
method cancel (line 560) | def cancel(self, context):
class SCS_TOOLS_OT_ExitVColoring (line 591) | class SCS_TOOLS_OT_ExitVColoring(bpy.types.Operator):
method poll (line 598) | def poll(cls, context):
method execute (line 601) | def execute(self, context):
class SCS_TOOLS_OT_RebakeVColoring (line 605) | class SCS_TOOLS_OT_RebakeVColoring(bpy.types.Operator):
method poll (line 612) | def poll(cls, context):
method execute (line 625) | def execute(self, context):
function register (line 671) | def register():
function unregister (line 676) | def unregister():
FILE: addon/io_scs_tools/operators/object.py
class ConvexCollider (line 50) | class ConvexCollider:
class SCS_TOOLS_OT_MakeConvexMesh (line 55) | class SCS_TOOLS_OT_MakeConvexMesh(bpy.types.Operator):
method execute (line 61) | def execute(self, context):
class SCS_TOOLS_OT_ConvertMeshToConvexLocator (line 74) | class SCS_TOOLS_OT_ConvertMeshToConvexLocator(bpy.types.Operator):
method draw (line 104) | def draw(self, context):
method execute (line 113) | def execute(self, context):
method invoke (line 154) | def invoke(self, context, event):
class SCS_TOOLS_OT_ConvertConvexLocatorToMesh (line 160) | class SCS_TOOLS_OT_ConvertConvexLocatorToMesh(bpy.types.Operator):
method execute (line 166) | def execute(self, context):
class Look (line 190) | class Look:
class SCS_TOOLS_OT_AddLook (line 195) | class SCS_TOOLS_OT_AddLook(bpy.types.Operator):
method poll (line 212) | def poll(cls, context):
method execute (line 218) | def execute(self, context):
class SCS_TOOLS_OT_RemoveActiveLook (line 247) | class SCS_TOOLS_OT_RemoveActiveLook(bpy.types.Operator):
method poll (line 254) | def poll(cls, context):
method execute (line 260) | def execute(self, context):
class Part (line 287) | class Part:
class SCS_TOOLS_OT_DeSelectObjectsWithPart (line 292) | class SCS_TOOLS_OT_DeSelectObjectsWithPart(bpy.types.Operator, _BaseSe...
method select_active_parts (line 300) | def select_active_parts(self, objects, active_scs_part, outside_game...
method execute (line 327) | def execute(self, context):
class SCS_TOOLS_OT_SwitchObjectsWithPart (line 349) | class SCS_TOOLS_OT_SwitchObjectsWithPart(bpy.types.Operator, _BaseView...
method view_active_part (line 357) | def view_active_part(self, objects, active_scs_part, outside_game_ob...
method execute (line 381) | def execute(self, context):
class SCS_TOOLS_OT_AddPart (line 402) | class SCS_TOOLS_OT_AddPart(bpy.types.Operator):
method poll (line 409) | def poll(cls, context):
method execute (line 415) | def execute(self, context):
class SCS_TOOLS_OT_RemoveActivePart (line 441) | class SCS_TOOLS_OT_RemoveActivePart(bpy.types.Operator):
method poll (line 448) | def poll(cls, context):
method execute (line 454) | def execute(self, context):
class SCS_TOOLS_OT_MoveActivePart (line 500) | class SCS_TOOLS_OT_MoveActivePart(bpy.types.Operator):
method poll (line 512) | def poll(cls, context):
method execute (line 518) | def execute(self, context):
class SCS_TOOLS_OT_CleanUnusedParts (line 542) | class SCS_TOOLS_OT_CleanUnusedParts(bpy.types.Operator):
method poll (line 549) | def poll(cls, context):
method execute (line 555) | def execute(self, context):
class SCS_TOOLS_OT_AssignPart (line 601) | class SCS_TOOLS_OT_AssignPart(bpy.types.Operator):
method poll (line 608) | def poll(cls, context):
method execute (line 614) | def execute(self, context):
class SCS_TOOLS_OT_PrintParts (line 649) | class SCS_TOOLS_OT_PrintParts(bpy.types.Operator):
method poll (line 656) | def poll(cls, context):
method execute (line 662) | def execute(self, context):
class Variant (line 669) | class Variant:
class SCS_TOOLS_OT_DeSelectObjectsWithVariant (line 674) | class SCS_TOOLS_OT_DeSelectObjectsWithVariant(bpy.types.Operator, _Bas...
method execute (line 682) | def execute(self, context):
class SCS_TOOLS_OT_SwitchObjectsWithVariant (line 716) | class SCS_TOOLS_OT_SwitchObjectsWithVariant(bpy.types.Operator, _BaseV...
method execute (line 724) | def execute(self, context):
class SCS_TOOLS_OT_AddVariant (line 751) | class SCS_TOOLS_OT_AddVariant(bpy.types.Operator):
method poll (line 758) | def poll(cls, context):
method execute (line 764) | def execute(self, context):
class SCS_TOOLS_OT_RemoveActiveVariant (line 787) | class SCS_TOOLS_OT_RemoveActiveVariant(bpy.types.Operator):
method poll (line 794) | def poll(cls, context):
method execute (line 800) | def execute(self, context):
class SCS_TOOLS_OT_MoveActiveVariant (line 821) | class SCS_TOOLS_OT_MoveActiveVariant(bpy.types.Operator):
method poll (line 833) | def poll(cls, context):
method execute (line 839) | def execute(self, context):
class SCS_TOOLS_OT_PrintVariants (line 863) | class SCS_TOOLS_OT_PrintVariants(bpy.types.Operator):
method poll (line 870) | def poll(cls, context):
method execute (line 876) | def execute(self, context):
class ModelObjects (line 891) | class ModelObjects:
class SCS_TOOLS_OT_SelectModelObjects (line 896) | class SCS_TOOLS_OT_SelectModelObjects(bpy.types.Operator):
method execute (line 902) | def execute(self, context):
class SCS_TOOLS_OT_SwitchModelObjects (line 912) | class SCS_TOOLS_OT_SwitchModelObjects(bpy.types.Operator, _BaseViewOpe...
method execute (line 918) | def execute(self, context):
class SCS_TOOLS_OT_SearchDegeneratedPolys (line 940) | class SCS_TOOLS_OT_SearchDegeneratedPolys(bpy.types.Operator):
method poll (line 952) | def poll(cls, context):
method is_triangle_degenerated (line 956) | def is_triangle_degenerated(cls, edge_lengths):
method is_triangle_spiked (line 978) | def is_triangle_spiked(cls, edge_lengths):
method execute (line 999) | def execute(self, context):
class ShadowCasters (line 1063) | class ShadowCasters:
class SCS_TOOLS_OT_SelectShadowCasters (line 1068) | class SCS_TOOLS_OT_SelectShadowCasters(bpy.types.Operator):
method execute (line 1074) | def execute(self, context):
class SCS_TOOL_OT_SwitchShadowCasters (line 1084) | class SCS_TOOL_OT_SwitchShadowCasters(bpy.types.Operator, _BaseViewOpe...
method execute (line 1090) | def execute(self, context):
class SCS_TOOLS_OT_ShowShadowCastersAsWire (line 1116) | class SCS_TOOLS_OT_ShowShadowCastersAsWire(bpy.types.Operator):
method execute (line 1122) | def execute(self, context):
class SCS_TOOLS_OT_ShowShadowCasterAsTextured (line 1131) | class SCS_TOOLS_OT_ShowShadowCasterAsTextured(bpy.types.Operator):
method execute (line 1137) | def execute(self, context):
class Glass (line 1146) | class Glass:
class SCS_TOOLS_OT_SelectGlassObjects (line 1151) | class SCS_TOOLS_OT_SelectGlassObjects(bpy.types.Operator):
method execute (line 1157) | def execute(self, context):
class SCS_TOOLS_OT_SwitchGlassObjects (line 1167) | class SCS_TOOLS_OT_SwitchGlassObjects(bpy.types.Operator, _BaseViewOpe...
method execute (line 1173) | def execute(self, context):
class SCS_TOOLS_OT_ShowGlassObjectsAsWire (line 1195) | class SCS_TOOLS_OT_ShowGlassObjectsAsWire(bpy.types.Operator):
method execute (line 1201) | def execute(self, context):
class SCS_TOOLS_OT_ShowGlassObjectsAsTextured (line 1210) | class SCS_TOOLS_OT_ShowGlassObjectsAsTextured(bpy.types.Operator):
method execute (line 1216) | def execute(self, context):
class Collision (line 1225) | class Collision:
class SCS_TOOLS_OT_SelectStaticCollisionObjects (line 1230) | class SCS_TOOLS_OT_SelectStaticCollisionObjects(bpy.types.Operator):
method execute (line 1236) | def execute(self, context):
class SCS_TOOLS_OT_SwitchStaticCollisionObjects (line 1246) | class SCS_TOOLS_OT_SwitchStaticCollisionObjects(bpy.types.Operator, _B...
method execute (line 1253) | def execute(self, context):
class Locators (line 1276) | class Locators:
class Model (line 1281) | class Model:
class SCS_TOOLS_OT_SelectModelLocators (line 1286) | class SCS_TOOLS_OT_SelectModelLocators(bpy.types.Operator):
method execute (line 1292) | def execute(self, context):
class SCS_TOOLS_OT_SelectModelLocatorsWithSameHookup (line 1301) | class SCS_TOOLS_OT_SelectModelLocatorsWithSameHookup(bpy.types.Opera...
method execute (line 1310) | def execute(self, context):
class SCS_TOOLS_OT_SwitchModelLocators (line 1330) | class SCS_TOOLS_OT_SwitchModelLocators(bpy.types.Operator, _BaseView...
method execute (line 1336) | def execute(self, context):
class SCS_TOOLS_OT_FixModelLocatorHookups (line 1345) | class SCS_TOOLS_OT_FixModelLocatorHookups(bpy.types.Operator):
method execute (line 1351) | def execute(self, context):
class Prefab (line 1386) | class Prefab:
class ControlNodes (line 1391) | class ControlNodes:
class SCS_TOOLS_OT_SelectPrefabNodeLocators (line 1396) | class SCS_TOOLS_OT_SelectPrefabNodeLocators(bpy.types.Operator):
method execute (line 1402) | def execute(self, context):
class SCS_TOOLS_OT_SwitchPrefabNodeLocators (line 1414) | class SCS_TOOLS_OT_SwitchPrefabNodeLocators(bpy.types.Operator, _B...
method execute (line 1420) | def execute(self, context):
class SCS_TOOLS_OT_AssignTerrainPoints (line 1429) | class SCS_TOOLS_OT_AssignTerrainPoints(bpy.types.Operator):
method poll (line 1440) | def poll(cls, context):
method execute (line 1443) | def execute(self, context):
method invoke (line 1472) | def invoke(self, context, event):
class SCS_TOOLS_OT_ClearTerrainPoints (line 1490) | class SCS_TOOLS_OT_ClearTerrainPoints(bpy.types.Operator):
method poll (line 1497) | def poll(cls, context):
method execute (line 1508) | def execute(self, context):
class SCS_TOOLS_OT_PreviewTerrainPoints (line 1552) | class SCS_TOOLS_OT_PreviewTerrainPoints(bpy.types.Operator):
method execute_internal (line 1571) | def execute_internal(self, context):
method poll (line 1627) | def poll(cls, context):
method modal (line 1643) | def modal(self, context, event):
method execute (line 1672) | def execute(self, context):
method cancel (line 1691) | def cancel(self, context):
class SCS_TOOLS_OT_AbortTerrainPointsPreview (line 1709) | class SCS_TOOLS_OT_AbortTerrainPointsPreview(bpy.types.Operator):
method poll (line 1715) | def poll(cls, context):
method execute (line 1718) | def execute(self, context):
class Signs (line 1722) | class Signs:
class SCS_TOOLS_OT_SelectPrefabSignLocators (line 1727) | class SCS_TOOLS_OT_SelectPrefabSignLocators(bpy.types.Operator):
method execute (line 1733) | def execute(self, context):
class SCS_TOOLS_OT_SwitchPrefabSignLocators (line 1745) | class SCS_TOOLS_OT_SwitchPrefabSignLocators(bpy.types.Operator, _B...
method execute (line 1751) | def execute(self, context):
class SpawnPoints (line 1760) | class SpawnPoints:
class SCS_TOOLS_OT_SelectPrefabSpawnLocators (line 1765) | class SCS_TOOLS_OT_SelectPrefabSpawnLocators(bpy.types.Operator):
method execute (line 1771) | def execute(self, context):
class SCS_TOOLS_OT_SwitchPrefabSpawnLocators (line 1783) | class SCS_TOOLS_OT_SwitchPrefabSpawnLocators(bpy.types.Operator, _...
method execute (line 1789) | def execute(self, context):
class TrafficLights (line 1798) | class TrafficLights:
class SCS_TOOLS_OT_SelectPrefabTrafficLocators (line 1803) | class SCS_TOOLS_OT_SelectPrefabTrafficLocators(bpy.types.Operator):
method execute (line 1809) | def execute(self, context):
class SCS_TOOLS_OT_SwitchPrefabTrafficLocators (line 1821) | class SCS_TOOLS_OT_SwitchPrefabTrafficLocators(bpy.types.Operator,...
method execute (line 1827) | def execute(self, context):
class NavigationPoints (line 1836) | class NavigationPoints:
class SCS_TOOLS_OT_SelectPrefabNavLocators (line 1841) | class SCS_TOOLS_OT_SelectPrefabNavLocators(bpy.types.Operator):
method execute (line 1847) | def execute(self, context):
class SCS_TOOLS_OT_SwitchPrefabNavLocators (line 1859) | class SCS_TOOLS_OT_SwitchPrefabNavLocators(bpy.types.Operator, _Ba...
method execute (line 1865) | def execute(self, context):
class MapPoints (line 1874) | class MapPoints:
class SCS_TOOLS_OT_SelectPrefabMapLocators (line 1879) | class SCS_TOOLS_OT_SelectPrefabMapLocators(bpy.types.Operator):
method execute (line 1885) | def execute(self, context):
class SCS_TOOLS_OT_SwitchPrefabMapLocators (line 1897) | class SCS_TOOLS_OT_SwitchPrefabMapLocators(bpy.types.Operator, _Ba...
method execute (line 1903) | def execute(self, context):
class TriggerPoints (line 1912) | class TriggerPoints:
class SCS_TOOLS_OT_SelectPrefabTriggerLocators (line 1917) | class SCS_TOOLS_OT_SelectPrefabTriggerLocators(bpy.types.Operator):
method execute (line 1923) | def execute(self, context):
class SCS_TOOLS_OT_SwitchPrefabTriggerLocators (line 1935) | class SCS_TOOLS_OT_SwitchPrefabTriggerLocators(bpy.types.Operator,...
method execute (line 1941) | def execute(self, context):
class SCS_TOOLS_OT_ConnectPrefabLocators (line 1950) | class SCS_TOOLS_OT_ConnectPrefabLocators(bpy.types.Operator):
method execute (line 1956) | def execute(self, context):
class SCS_TOOLS_OT_DisconnectPrefabLocators (line 1987) | class SCS_TOOLS_OT_DisconnectPrefabLocators(bpy.types.Operator):
method execute (line 1993) | def execute(self, context):
class SCS_TOOLS_OT_SelectPrefabLocators (line 2008) | class SCS_TOOLS_OT_SelectPrefabLocators(bpy.types.Operator):
method execute (line 2014) | def execute(self, context):
class SCS_TOOLS_OT_SwitchPrefabLocators (line 2023) | class SCS_TOOLS_OT_SwitchPrefabLocators(bpy.types.Operator, _BaseVie...
method execute (line 2029) | def execute(self, context):
class Collision (line 2038) | class Collision:
class SCS_TOOLS_OT_SelectCollisionLocators (line 2043) | class SCS_TOOLS_OT_SelectCollisionLocators(bpy.types.Operator):
method execute (line 2049) | def execute(self, context):
class SCS_TOOLS_OT_SwitchCollisionLocators (line 2058) | class SCS_TOOLS_OT_SwitchCollisionLocators(bpy.types.Operator, _Base...
method execute (line 2064) | def execute(self, context):
class SCS_TOOLS_OT_EnableCollisionLocatorsWire (line 2073) | class SCS_TOOLS_OT_EnableCollisionLocatorsWire(bpy.types.Operator):
method execute (line 2079) | def execute(self, context):
class SCS_TOOLS_OT_DisableCollisionLocatorsWire (line 2091) | class SCS_TOOLS_OT_DisableCollisionLocatorsWire(bpy.types.Operator):
method execute (line 2097) | def execute(self, context):
class SCS_TOOLS_OT_EnableCollisionLocatorsFaces (line 2109) | class SCS_TOOLS_OT_EnableCollisionLocatorsFaces(bpy.types.Operator):
method execute (line 2115) | def execute(self, context):
class SCS_TOOLS_OT_DisableCollisionLocatorsFaces (line 2127) | class SCS_TOOLS_OT_DisableCollisionLocatorsFaces(bpy.types.Operator):
method execute (line 2133) | def execute(self, context):
class Commons (line 2145) | class Commons:
class SCS_TOOLS_OT_SelectAllLocators (line 2150) | class SCS_TOOLS_OT_SelectAllLocators(bpy.types.Operator):
method execute (line 2156) | def execute(self, context):
class SCS_TOOLS_OT_SwitchAllLocators (line 2165) | class SCS_TOOLS_OT_SwitchAllLocators(bpy.types.Operator, _BaseViewOp...
method execute (line 2171) | def execute(self, context):
class SCS_TOOLS_OT_SelectPreviewModelPath (line 2192) | class SCS_TOOLS_OT_SelectPreviewModelPath(bpy.types.Operator):
method execute (line 2207) | def execute(self, context):
method invoke (line 2217) | def invoke(self, context, event):
class SCSRoot (line 2223) | class SCSRoot:
class SCS_TOOLS_OT_CreateSCSRoot (line 2228) | class SCS_TOOLS_OT_CreateSCSRoot(bpy.types.Operator):
method draw (line 2239) | def draw(self, context):
method execute (line 2243) | def execute(self, context):
method invoke (line 2344) | def invoke(self, context, event):
class SCS_TOOLS_OT_HideObjectsWithinSCSRoot (line 2350) | class SCS_TOOLS_OT_HideObjectsWithinSCSRoot(bpy.types.Operator):
method execute (line 2355) | def execute(self, context):
class SCS_TOOLS_OT_ViewAllObjectsWithinSCSRoot (line 2367) | class SCS_TOOLS_OT_ViewAllObjectsWithinSCSRoot(bpy.types.Operator):
method poll (line 2374) | def poll(cls, context):
method execute (line 2377) | def execute(self, context):
class SCS_TOOLS_OT_InvertVisibilityWithinSCSRoot (line 2391) | class SCS_TOOLS_OT_InvertVisibilityWithinSCSRoot(bpy.types.Operator):
method poll (line 2398) | def poll(cls, context):
method execute (line 2401) | def execute(self, context):
class SCS_TOOLS_OT_IsolateObjectsWithinSCSRoot (line 2427) | class SCS_TOOLS_OT_IsolateObjectsWithinSCSRoot(bpy.types.Operator):
method poll (line 2434) | def poll(cls, context):
method execute (line 2437) | def execute(self, context):
class SCS_TOOLS_OT_RelocateSCSRoot (line 2459) | class SCS_TOOLS_OT_RelocateSCSRoot(bpy.types.Operator):
method poll (line 2468) | def poll(cls, context):
method execute (line 2471) | def execute(self, context):
class Animation (line 2515) | class Animation:
class SCS_TOOLS_OT_AddAnimation (line 2520) | class SCS_TOOLS_OT_AddAnimation(bpy.types.Operator):
method poll (line 2527) | def poll(cls, context):
method execute (line 2530) | def execute(self, context):
class SCS_TOOLS_OT_RemoveAnimation (line 2542) | class SCS_TOOLS_OT_RemoveAnimation(bpy.types.Operator):
method poll (line 2549) | def poll(cls, context):
method execute (line 2553) | def execute(self, context):
class SCS_TOOLS_OT_AddObject (line 2589) | class SCS_TOOLS_OT_AddObject(bpy.types.Operator):
method new_object_type_items (line 2598) | def new_object_type_items(self, context):
method draw (line 2634) | def draw(self, context):
method execute (line 2650) | def execute(self, context):
method invoke (line 2695) | def invoke(self, context, event):
class SCS_TOOLS_OT_BlankOperator (line 2704) | class SCS_TOOLS_OT_BlankOperator(bpy.types.Operator):
method execute (line 2710) | def execute(self, context):
function register (line 2807) | def register():
function unregister (line 2812) | def unregister():
FILE: addon/io_scs_tools/operators/scene.py
class Import (line 52) | class Import:
class SCS_TOOLS_OT_ImportAnimActions (line 57) | class SCS_TOOLS_OT_ImportAnimActions(bpy.types.Operator):
method poll (line 74) | def poll(cls, context):
method execute (line 78) | def execute(self, context):
method invoke (line 94) | def invoke(self, context, event):
class Export (line 100) | class Export:
class SCS_TOOLS_OT_ExportByScope (line 105) | class SCS_TOOLS_OT_ExportByScope(bpy.types.Operator, _SCSExportHelper):
method __init__ (line 112) | def __init__(self):
method execute_rotation (line 119) | def execute_rotation(rot_direction, angle=0.05):
method execute_zoom (line 139) | def execute_zoom(zoom_change):
method modal (line 149) | def modal(self, context, event):
method invoke (line 187) | def invoke(self, context, event):
class SCS_TOOLS_OT_ExportAnimAction (line 204) | class SCS_TOOLS_OT_ExportAnimAction(bpy.types.Operator):
method poll (line 224) | def poll(cls, context):
method execute (line 228) | def execute(self, context):
method invoke (line 257) | def invoke(self, context, event):
class Paths (line 266) | class Paths:
class SCS_TOOLS_OT_SelectProjectPath (line 271) | class SCS_TOOLS_OT_SelectProjectPath(bpy.types.Operator):
method execute (line 288) | def execute(self, context):
method invoke (line 295) | def invoke(self, context, event):
class SCS_TOOLS_OT_SelectShaderPresetsPath (line 301) | class SCS_TOOLS_OT_SelectShaderPresetsPath(bpy.types.Operator):
method execute (line 318) | def execute(self, context):
method invoke (line 325) | def invoke(self, context, event):
class SCS_TOOLS_OT_SelectTriggerActionsLibPath (line 335) | class SCS_TOOLS_OT_SelectTriggerActionsLibPath(bpy.types.Operator):
method execute (line 352) | def execute(self, context):
method invoke (line 362) | def invoke(self, context, event):
class SCS_TOOLS_OT_SelectSignLibPath (line 369) | class SCS_TOOLS_OT_SelectSignLibPath(bpy.types.Operator):
method execute (line 386) | def execute(self, context):
method invoke (line 396) | def invoke(self, context, event):
class SCS_TOOLS_OT_SelectSemaphoreLibPath (line 403) | class SCS_TOOLS_OT_SelectSemaphoreLibPath(bpy.types.Operator):
method execute (line 420) | def execute(self, context):
method invoke (line 430) | def invoke(self, context, event):
class SCS_TOOLS_OT_SelectTrafficRulesLibPath (line 437) | class SCS_TOOLS_OT_SelectTrafficRulesLibPath(bpy.types.Operator):
method execute (line 454) | def execute(self, context):
method invoke (line 464) | def invoke(self, context, event):
class SCS_TOOLS_OT_SelectHookupLibPath (line 471) | class SCS_TOOLS_OT_SelectHookupLibPath(bpy.types.Operator):
method execute (line 488) | def execute(self, context):
method invoke (line 498) | def invoke(self, context, event):
class SCS_TOOLS_OT_SelectMatSubsLibPath (line 505) | class SCS_TOOLS_OT_SelectMatSubsLibPath(bpy.types.Operator):
method execute (line 522) | def execute(self, context):
method invoke (line 532) | def invoke(self, context, event):
class SCS_TOOLS_OT_SelectSunProfilesLibPath (line 539) | class SCS_TOOLS_OT_SelectSunProfilesLibPath(bpy.types.Operator):
method execute (line 555) | def execute(self, context):
method invoke (line 565) | def invoke(self, context, event):
class SCS_TOOLS_OT_SelectDirInsideBase (line 572) | class SCS_TOOLS_OT_SelectDirInsideBase(bpy.types.Operator):
method execute (line 601) | def execute(self, context):
method invoke (line 627) | def invoke(self, context, event):
class SCS_TOOLS_OT_ReloadLibrary (line 633) | class SCS_TOOLS_OT_ReloadLibrary(bpy.types.Operator):
method execute (line 641) | def execute(self, context):
class SCS_TOOLS_OT_AddPathPreset (line 654) | class SCS_TOOLS_OT_AddPathPreset(bpy.types.Operator, AddPresetBase):
class Animation (line 686) | class Animation:
class SCS_TOOLS_OT_IncreaseAnimationSteps (line 691) | class SCS_TOOLS_OT_IncreaseAnimationSteps(bpy.types.Operator):
method execute (line 697) | def execute(self, context):
class SCS_TOOLS_OT_DecreaseAnimationSteps (line 755) | class SCS_TOOLS_OT_DecreaseAnimationSteps(bpy.types.Operator):
method execute (line 762) | def execute(self, context):
class ConversionHelper (line 821) | class ConversionHelper:
class SCS_TOOLS_OT_CleanConversionRSRC (line 826) | class SCS_TOOLS_OT_CleanConversionRSRC(bpy.types.Operator):
method execute (line 831) | def execute(self, context):
class SCS_TOOLS_OT_AddConversionPath (line 858) | class SCS_TOOLS_OT_AddConversionPath(bpy.types.Operator):
method execute (line 869) | def execute(self, context):
method invoke (line 880) | def invoke(self, context, event):
class SCS_TOOLS_OT_RemoveConversionPath (line 886) | class SCS_TOOLS_OT_RemoveConversionPath(bpy.types.Operator):
method execute (line 891) | def execute(self, context):
class SCS_TOOLS_OT_OrderConversionPath (line 902) | class SCS_TOOLS_OT_OrderConversionPath(bpy.types.Operator):
method execute (line 909) | def execute(self, context):
class SCS_TOOLS_OT_RunConversion (line 932) | class SCS_TOOLS_OT_RunConversion(bpy.types.Operator):
method execute (line 937) | def execute(self, context):
class SCS_TOOLS_OT_ConvertCurrentBase (line 987) | class SCS_TOOLS_OT_ConvertCurrentBase(bpy.types.Operator):
method execute (line 992) | def execute(self, context):
class SCS_TOOLS_OT_ConvertCustomPaths (line 1015) | class SCS_TOOLS_OT_ConvertCustomPaths(bpy.types.Operator):
method poll (line 1025) | def poll(cls, context):
method execute (line 1028) | def execute(self, context):
class SCS_TOOLS_OT_ConvertAllPaths (line 1069) | class SCS_TOOLS_OT_ConvertAllPaths(bpy.types.Operator):
method __init__ (line 1074) | def __init__(self):
method poll (line 1078) | def poll(cls, context):
method execute (line 1081) | def execute(self, context):
class SCS_TOOLS_OT_FindGameModFolder (line 1084) | class SCS_TOOLS_OT_FindGameModFolder(bpy.types.Operator):
method ensure_mod_folder (line 1097) | def ensure_mod_folder(game_home_path):
method get_platform_depended_game_path (line 1113) | def get_platform_depended_game_path():
method execute (line 1151) | def execute(self, context):
method invoke (line 1169) | def invoke(self, context, event):
method draw (line 1172) | def draw(self, context):
class SCS_TOOLS_OT_RunPacking (line 1178) | class SCS_TOOLS_OT_RunPacking(bpy.types.Operator):
method get_zipfile_path (line 1185) | def get_zipfile_path(zipfile_originpath, abs_path):
method poll (line 1200) | def poll(cls, context):
method execute (line 1203) | def execute(self, context):
class Log (line 1325) | class Log:
class SCS_TOOLS_OT_CopyLogToClipboard (line 1330) | class SCS_TOOLS_OT_CopyLogToClipboard(bpy.types.Operator):
method execute (line 1335) | def execute(self, context):
class PaintjobTools (line 1344) | class PaintjobTools:
class SCS_TOOLS_OT_ImportFromDataSII (line 1349) | class SCS_TOOLS_OT_ImportFromDataSII(bpy.types.Operator):
method gather_model_paths (line 1384) | def gather_model_paths(dir_path, unit_type, one_of_props):
method import_and_clean_model (line 1439) | def import_and_clean_model(context, project_path, model_path):
method add_model_to_collection (line 1527) | def add_model_to_collection(scs_root, model_type, model_name, linked...
method update_model_paths_dict (line 1593) | def update_model_paths_dict(models_paths_dict, curr_models):
method initalize (line 1607) | def initalize(self):
method finalize (line 1628) | def finalize(self):
method execute (line 1642) | def execute(self, context):
method invoke (line 1920) | def invoke(self, context, event):
class SCS_TOOLS_OT_ExportPaintjobUVLayoutAndMesh (line 1926) | class SCS_TOOLS_OT_ExportPaintjobUVLayoutAndMesh(bpy.types.Operator):
method is_out_of_uv_bounds (line 1985) | def is_out_of_uv_bounds(uv):
method transform_uvs (line 1989) | def transform_uvs(obj, texture_portion):
method cleanup (line 2024) | def cleanup(*args):
method cleanup_meshes (line 2039) | def cleanup_meshes():
method check (line 2052) | def check(self, context):
method draw (line 2060) | def draw(self, context):
method do_report (line 2078) | def do_report(self, type, message, do_report=False):
method check_and_prepare_uvs (line 2094) | def check_and_prepare_uvs(self, obj, orig_uvs_name_2nd, orig_uvs_nam...
method execute (line 2141) | def execute(self, context):
method invoke (line 2582) | def invoke(self, context, event):
class SCS_TOOLS_OT_GeneratePaintjob (line 2587) | class SCS_TOOLS_OT_GeneratePaintjob(bpy.types.Operator):
class Overrides (line 2593) | class Overrides:
method __generate_props_hash (line 2601) | def __generate_props_hash(props):
method __init__ (line 2609) | def __init__(self):
method __append_to_acc_list (line 2612) | def __append_to_acc_list(self, props_hash, acc_type_id):
method __create_override (line 2627) | def __create_override(self, props_hash, acc_type_id, props):
method add_accessory (line 2648) | def add_accessory(self, acc_type_id, props=OrderedDict()):
method export_to_sii (line 2663) | def export_to_sii(self, op_inst, config_path):
class ColorVariantItem (line 2706) | class ColorVariantItem(bpy.types.PropertyGroup):
method do_report (line 2790) | def do_report(the_type, message, do_report=False):
method initialize_nodes (line 2807) | def initialize_nodes(self, context, img):
method export_texture (line 2855) | def export_texture(self, orig_img, tgas_dir_path, texture_portion):
method export_master_sii (line 3008) | def export_master_sii(self, config_path, pj_token, pj_full_unit_name...
method export_settings_sui (line 3050) | def export_settings_sui(self, settings_sui_path):
method append_prop_if_not_default (line 3085) | def append_prop_if_not_default(self, unit, prop_name, prop_value=None):
method execute (line 3170) | def execute(self, context):
function register (line 3643) | def register():
function unregister (line 3648) | def unregister():
FILE: addon/io_scs_tools/operators/wm.py
class SCS_TOOLS_OT_ShowMessageInPopup (line 30) | class SCS_TOOLS_OT_ShowMessageInPopup(bpy.types.Operator):
method popup_draw (line 46) | def popup_draw(self, context):
method draw (line 51) | def draw(self, context):
method execute_popup (line 64) | def execute_popup(self, context):
method execute (line 68) | def execute(self, context):
method invoke (line 71) | def invoke(self, context, event):
class SCS_TOOLS_OT_Show3DViewReport (line 81) | class SCS_TOOLS_OT_Show3DViewReport(bpy.types.Operator):
method has_lines (line 118) | def has_lines():
method has_controls (line 127) | def has_controls(window):
method get_scs_banner_img_data (line 138) | def get_scs_banner_img_data(window):
method get_lines (line 172) | def get_lines():
method get_title (line 192) | def get_title():
method is_shown (line 201) | def is_shown():
method is_in_btn_area (line 210) | def is_in_btn_area(x, y, btn_area):
method is_scrolled (line 226) | def is_scrolled():
method set_out_of_bounds (line 235) | def set_out_of_bounds(state):
method set_btns_xy_offset (line 244) | def set_btns_xy_offset(x, y):
method discard_drawing_data (line 256) | def discard_drawing_data():
method unregister (line 276) | def unregister(cls):
method fill_drawing_data (line 281) | def fill_drawing_data(self):
method cancel (line 311) | def cancel(self, context):
method modal (line 329) | def modal(self, context, event):
method invoke (line 426) | def invoke(self, context, event):
class SCS_TOOLS_OT_ShowDeveloperErrors (line 459) | class SCS_TOOLS_OT_ShowDeveloperErrors(bpy.types.Operator):
method execute (line 464) | def execute(self, context):
function register (line 479) | def register():
function unregister (line 484) | def unregister():
FILE: addon/io_scs_tools/operators/world.py
class SCS_TOOLS_OT_SetupLighting (line 33) | class SCS_TOOLS_OT_SetupLighting(bpy.types.Operator):
method execute (line 45) | def execute(self, context):
class SCS_TOOLS_OT_DisableLighting (line 118) | class SCS_TOOLS_OT_DisableLighting(bpy.types.Operator):
method execute (line 123) | def execute(self, context):
function register (line 159) | def register():
function unregister (line 164) | def unregister():
FILE: addon/io_scs_tools/properties/__init__.py
function register (line 31) | def register():
function unregister (line 42) | def unregister():
FILE: addon/io_scs_tools/properties/action.py
class ActionSCSTools (line 25) | class ActionSCSTools(bpy.types.PropertyGroup):
function register (line 47) | def register():
function unregister (line 51) | def unregister():
FILE: addon/io_scs_tools/properties/addon_preferences.py
class SCSInventories (line 43) | class SCSInventories(bpy.types.PropertyGroup):
class TriggerActionsInventoryItem (line 45) | class TriggerActionsInventoryItem(bpy.types.PropertyGroup):
class SignModelInventoryItem (line 56) | class SignModelInventoryItem(bpy.types.PropertyGroup):
class TSemProfileInventoryItem (line 72) | class TSemProfileInventoryItem(bpy.types.PropertyGroup):
class TrafficRulesInventoryItem (line 85) | class TrafficRulesInventoryItem(bpy.types.PropertyGroup):
class HookupInventoryItem (line 99) | class HookupInventoryItem(bpy.types.PropertyGroup):
class MatSubsInventoryItem (line 115) | class MatSubsInventoryItem(bpy.types.PropertyGroup):
method retrieve_shader_presets_items (line 127) | def retrieve_shader_presets_items(self, context):
method get_shader_presets_item (line 161) | def get_shader_presets_item(self):
method set_shader_presets_item (line 172) | def set_shader_presets_item(self, value):
class SunProfileInventoryItem (line 214) | class SunProfileInventoryItem(bpy.types.PropertyGroup):
method sun_profile_item_update (line 219) | def sun_profile_item_update(self, context):
class SCSGlobals (line 301) | class SCSGlobals(bpy.types.PropertyGroup):
method on_display_setting_update (line 305) | def on_display_setting_update(context):
method get_writtable_keys (line 316) | def get_writtable_keys(self):
method scs_project_path_update (line 329) | def scs_project_path_update(self, context):
method use_alternative_bases_update (line 339) | def use_alternative_bases_update(self, context):
method shader_presets_filepath_update (line 347) | def shader_presets_filepath_update(self, context):
method shader_presets_use_custom_update (line 352) | def shader_presets_use_custom_update(self, context):
method trigger_actions_rel_path_update (line 360) | def trigger_actions_rel_path_update(self, context):
method trigger_actions_use_infixed_update (line 364) | def trigger_actions_use_infixed_update(self, context):
method sign_library_rel_path_update (line 371) | def sign_library_rel_path_update(self, context):
method sign_library_use_infixed_update (line 375) | def sign_library_use_infixed_update(self, context):
method tsem_library_rel_path_update (line 382) | def tsem_library_rel_path_update(self, context):
method tsem_library_use_infixed_update (line 386) | def tsem_library_use_infixed_update(self, context):
method traffic_rules_library_rel_path_update (line 393) | def traffic_rules_library_rel_path_update(self, context):
method traffic_rules_library_use_infixed_update (line 397) | def traffic_rules_library_use_infixed_update(self, context):
method hookup_library_rel_path_update (line 404) | def hookup_library_rel_path_update(self, context):
method matsubs_library_rel_path_update (line 408) | def matsubs_library_rel_path_update(self, context):
method display_locators_update (line 522) | def display_locators_update(self, context):
method locator_size_update (line 526) | def locator_size_update(self, context):
method locator_empty_size_update (line 530) | def locator_empty_size_update(self, context):
method locator_prefab_wire_color_update (line 534) | def locator_prefab_wire_color_update(self, context):
method locator_model_wire_color_update (line 538) | def locator_model_wire_color_update(self, context):
method locator_coll_wire_color_update (line 542) | def locator_coll_wire_color_update(self, context):
method locator_coll_face_color_update (line 546) | def locator_coll_face_color_update(self, context):
method display_connections_update (line 550) | def display_connections_update(self, context):
method optimized_connections_drawing_update (line 554) | def optimized_connections_drawing_update(self, context):
method curve_segments_update (line 558) | def curve_segments_update(self, context):
method np_curve_color_update (line 562) | def np_curve_color_update(self, context):
method mp_line_color_update (line 566) | def mp_line_color_update(self, context):
method tp_line_color_update (line 570) | def tp_line_color_update(self, context):
method display_info_update (line 574) | def display_info_update(self, context):
method info_text_color_update (line 578) | def info_text_color_update(self, context):
method drawing_mode_update (line 582) | def drawing_mode_update(self, context):
method show_preview_models_update (line 587) | def show_preview_models_update(self, context):
method base_paint_color_update (line 593) | def base_paint_color_update(self, context):
method retrieve_icon_theme_items (line 606) | def retrieve_icon_theme_items(self, context):
method set_icon_theme_item (line 619) | def set_icon_theme_item(self, value):
method get_icon_theme_item (line 637) | def get_icon_theme_item(self):
method import_scale_update (line 825) | def import_scale_update(self, context):
method import_preserve_path_for_export_update (line 829) | def import_preserve_path_for_export_update(self, context):
method import_pim_file_update (line 833) | def import_pim_file_update(self, context):
method import_use_welding_update (line 837) | def import_use_welding_update(self, context):
method import_welding_precision_update (line 841) | def import_welding_precision_update(self, context):
method import_use_normals_update (line 845) | def import_use_normals_update(self, context):
method import_pit_file_update (line 849) | def import_pit_file_update(self, context):
method import_load_textures_update (line 853) | def import_load_textures_update(self, context):
method import_pic_file_update (line 857) | def import_pic_file_update(self, context):
method import_pip_file_update (line 861) | def import_pip_file_update(self, context):
method import_pis_file_update (line 865) | def import_pis_file_update(self, context):
method import_connected_bones_update (line 869) | def import_connected_bones_update(self, context):
method import_bone_scale_update (line 873) | def import_bone_scale_update(self, context):
method import_pia_file_update (line 877) | def import_pia_file_update(self, context):
method import_include_subdirs_for_pia_update (line 881) | def import_include_subdirs_for_pia_update(self, context):
method export_scale_update (line 885) | def export_scale_update(self, context):
method export_apply_modifiers_update (line 889) | def export_apply_modifiers_update(self, context):
method export_exclude_edgesplit_update (line 893) | def export_exclude_edgesplit_update(self, context):
method export_include_edgesplit_update (line 897) | def export_include_edgesplit_update(self, context):
method export_active_uv_only_update (line 901) | def export_active_uv_only_update(self, context):
method export_vertex_groups_update (line 905) | def export_vertex_groups_update(self, context):
method export_vertex_color_update (line 909) | def export_vertex_color_update(self, context):
method export_vertex_color_type_update (line 913) | def export_vertex_color_type_update(self, context):
method export_vertex_color_type_7_update (line 917) | def export_vertex_color_type_7_update(self, context):
method export_pim_file_update (line 933) | def export_pim_file_update(self, context):
method export_output_type_update (line 937) | def export_output_type_update(self, context):
method export_pit_file_update (line 941) | def export_pit_file_update(self, context):
method export_pic_file_update (line 945) | def export_pic_file_update(self, context):
method export_pip_file_update (line 949) | def export_pip_file_update(self, context):
method export_pis_file_update (line 953) | def export_pis_file_update(self, context):
method export_pia_file_update (line 957) | def export_pia_file_update(self, context):
method export_write_signature_update (line 961) | def export_write_signature_update(self, context):
method dump_level_update (line 1196) | def dump_level_update(self, context):
method config_storage_place_update (line 1200) | def config_storage_place_update(self, context):
method conv_hlpr_converters_path_update (line 1251) | def conv_hlpr_converters_path_update(self, context):
class ConvHlprCustomPathInventoryItem (line 1269) | class ConvHlprCustomPathInventoryItem(bpy.types.PropertyGroup):
method path_update (line 1271) | def path_update(self, context):
method use_scs_lighting_update (line 1332) | def use_scs_lighting_update(self, context):
method sun_profiles_path_update (line 1344) | def sun_profiles_path_update(self, context):
method sun_profiles_active_update (line 1370) | def sun_profiles_active_update(self, context):
method lighting_scene_east_direction_update (line 1386) | def lighting_scene_east_direction_update(self, context):
method lighting_east_lock_update (line 1397) | def lighting_east_lock_update(self, context):
class SCSAddonPrefs (line 1413) | class SCSAddonPrefs(bpy.types.AddonPreferences):
function register (line 1447) | def register():
function unregister (line 1452) | def unregister():
FILE: addon/io_scs_tools/properties/dynamic/__init__.py
class DynamicProps (line 27) | class DynamicProps:
class Scopes (line 28) | class Scopes:
method __register_property__ (line 37) | def __register_property__(scope, property_name):
method register (line 58) | def register(scope, property_name, property_type, default):
method get_registered_members (line 122) | def get_registered_members(scope):
function register (line 133) | def register():
function unregister (line 138) | def unregister():
FILE: addon/io_scs_tools/properties/dynamic/object.py
function register (line 24) | def register():
function _get_num_children (line 29) | def _get_num_children(self):
function _set_num_children (line 36) | def _set_num_children(self, value):
function _get_materials_ids (line 40) | def _get_materials_ids(self):
function _set_materials_ids (line 47) | def _set_materials_ids(self, value):
FILE: addon/io_scs_tools/properties/dynamic/scene.py
function register (line 24) | def register():
function _get_num_objects (line 29) | def _get_num_objects(self):
function _set_num_objects (line 36) | def _set_num_objects(self, value):
function _get_active_scs_root (line 40) | def _get_active_scs_root(self):
function _set_active_scs_root (line 54) | def _set_active_scs_root(self, value):
FILE: addon/io_scs_tools/properties/material.py
function __get_texture_settings__ (line 42) | def __get_texture_settings__():
function __update_look__ (line 56) | def __update_look__(self, context):
function __update_shader_attribute__ (line 79) | def __update_shader_attribute__(self, context, attr_type):
function __update_shader_texture_tobj_file__ (line 95) | def __update_shader_texture_tobj_file__(self, context, tex_type):
function __update_shader_texture__ (line 145) | def __update_shader_texture__(self, context, tex_type):
class MaterialSCSTools (line 177) | class MaterialSCSTools(bpy.types.PropertyGroup):
class AuxiliaryItem (line 183) | class AuxiliaryItem(bpy.types.PropertyGroup):
method update_value (line 187) | def update_value(self, context):
class UVMappingItem (line 205) | class UVMappingItem(bpy.types.PropertyGroup):
method update_value (line 209) | def update_value(self, context):
class TexCoordItem (line 241) | class TexCoordItem(bpy.types.PropertyGroup):
method update_name (line 245) | def update_name(self, context):
method get_texture_types (line 268) | def get_texture_types():
method get_id (line 278) | def get_id(self):
method update_active_shader_preset_name (line 316) | def update_active_shader_preset_name(self, context):
method update_shader_attribute_add_ambient (line 321) | def update_shader_attribute_add_ambient(self, context):
method update_shader_attribute_diffuse (line 324) | def update_shader_attribute_diffuse(self, context):
method update_shader_attribute_env_factor (line 327) | def update_shader_attribute_env_factor(self, context):
method update_shader_attribute_fresnel (line 330) | def update_shader_attribute_fresnel(self, context):
method update_shader_attribute_shininess (line 333) | def update_shader_attribute_shininess(self, context):
method update_shader_attribute_specular (line 336) | def update_shader_attribute_specular(self, context):
method update_shader_attribute_tint (line 339) | def update_shader_attribute_tint(self, context):
method update_shader_attribute_tint_opacity (line 342) | def update_shader_attribute_tint_opacity(self, context):
method update_shader_texture_base (line 345) | def update_shader_texture_base(self, context):
method update_shader_texture_base_settings (line 348) | def update_shader_texture_base_settings(self, context):
method update_shader_texture_base_1 (line 351) | def update_shader_texture_base_1(self, context):
method update_shader_texture_base_1_settings (line 354) | def update_shader_texture_base_1_settings(self, context):
method update_shader_texture_detail (line 357) | def update_shader_texture_detail(self, context):
method update_shader_texture_detail_settings (line 360) | def update_shader_texture_detail_settings(self, context):
method update_shader_texture_flakenoise (line 363) | def update_shader_texture_flakenoise(self, context):
method update_shader_texture_flakenoise_settings (line 366) | def update_shader_texture_flakenoise_settings(self, context):
method update_shader_texture_iamod (line 369) | def update_shader_texture_iamod(self, context):
method update_shader_texture_iamod_settings (line 372) | def update_shader_texture_iamod_settings(self, context):
method update_shader_texture_layer0 (line 375) | def update_shader_texture_layer0(self, context):
method update_shader_texture_layer0_settings (line 378) | def update_shader_texture_layer0_settings(self, context):
method update_shader_texture_layer1 (line 381) | def update_shader_texture_layer1(self, context):
method update_shader_texture_layer1_settings (line 384) | def update_shader_texture_layer1_settings(self, context):
method update_shader_texture_lightmap (line 387) | def update_shader_texture_lightmap(self, context):
method update_shader_texture_lightmap_settings (line 390) | def update_shader_texture_lightmap_settings(self, context):
method update_shader_texture_mask (line 393) | def update_shader_texture_mask(self, context):
method update_shader_texture_mask_settings (line 396) | def update_shader_texture_mask_settings(self, context):
method update_shader_texture_mult (line 399) | def update_shader_texture_mult(self, context):
method update_shader_texture_mult_settings (line 402) | def update_shader_texture_mult_settings(self, context):
method update_shader_texture_mult_1 (line 405) | def update_shader_texture_mult_1(self, context):
method update_shader_texture_mult_1_settings (line 408) | def update_shader_texture_mult_1_settings(self, context):
method update_shader_texture_nmap (line 411) | def update_shader_texture_nmap(self, context):
method update_shader_texture_nmap_settings (line 414) | def update_shader_texture_nmap_settings(self, context):
method update_shader_texture_nmap_detail (line 417) | def update_shader_texture_nmap_detail(self, context):
method update_shader_texture_nmap_detail_settings (line 420) | def update_shader_texture_nmap_detail_settings(self, context):
method update_shader_texture_oclu (line 423) | def update_shader_texture_oclu(self, context):
method update_shader_texture_oclu_settings (line 426) | def update_shader_texture_oclu_settings(self, context):
method update_shader_texture_over (line 429) | def update_shader_texture_over(self, context):
method update_shader_texture_over_settings (line 432) | def update_shader_texture_over_settings(self, context):
method update_shader_texture_paintjob (line 435) | def update_shader_texture_paintjob(self, context):
method update_shader_texture_paintjob_settings (line 438) | def update_shader_texture_paintjob_settings(self, context):
method update_shader_texture_reflection (line 441) | def update_shader_texture_reflection(self, context):
method update_shader_texture_reflection_settings (line 444) | def update_shader_texture_reflection_settings(self, context):
method update_shader_texture_sky_weather_base_a (line 447) | def update_shader_texture_sky_weather_base_a(self, context):
method update_shader_texture_sky_weather_base_a_settings (line 450) | def update_shader_texture_sky_weather_base_a_settings(self, context):
method update_shader_texture_sky_weather_base_b (line 453) | def update_shader_texture_sky_weather_base_b(self, context):
method update_shader_texture_sky_weather_base_b_settings (line 456) | def update_shader_texture_sky_weather_base_b_settings(self, context):
method update_shader_texture_sky_weather_over_a (line 459) | def update_shader_texture_sky_weather_over_a(self, context):
method update_shader_texture_sky_weather_over_a_settings (line 462) | def update_shader_texture_sky_weather_over_a_settings(self, context):
method update_shader_texture_sky_weather_over_b (line 465) | def update_shader_texture_sky_weather_over_b(self, context):
method update_shader_texture_sky_weather_over_b_settings (line 468) | def update_shader_texture_sky_weather_over_b_settings(self, context):
function register (line 1810) | def register():
function unregister (line 1815) | def unregister():
FILE: addon/io_scs_tools/properties/mesh.py
class MeshSCSTools (line 25) | class MeshSCSTools(bpy.types.PropertyGroup):
function register (line 44) | def register():
function unregister (line 49) | def unregister():
FILE: addon/io_scs_tools/properties/object.py
class ObjectLooksInventoryItem (line 46) | class ObjectLooksInventoryItem(bpy.types.PropertyGroup):
method name_update (line 47) | def name_update(self, context):
class ObjectPartInventoryItem (line 75) | class ObjectPartInventoryItem(bpy.types.PropertyGroup):
method name_update (line 80) | def name_update(self, context):
class ObjectVariantPartInclusionItem (line 132) | class ObjectVariantPartInclusionItem(bpy.types.PropertyGroup):
class ObjectVariantInventoryItem (line 139) | class ObjectVariantInventoryItem(bpy.types.PropertyGroup):
method name_update (line 144) | def name_update(self, context):
class ObjectAnimationInventoryItem (line 172) | class ObjectAnimationInventoryItem(bpy.types.PropertyGroup):
method length_update (line 177) | def length_update(self, context):
method anim_range_update (line 195) | def anim_range_update(self, context):
method anim_action_update (line 213) | def anim_action_update(self, context):
class ObjectSCSTools (line 269) | class ObjectSCSTools(bpy.types.PropertyGroup):
method empty_object_type_items (line 278) | def empty_object_type_items(self, context):
method update_empty_object_type (line 287) | def update_empty_object_type(self, context):
method active_scs_part_get_direct (line 363) | def active_scs_part_get_direct(self):
method active_scs_part_get (line 376) | def active_scs_part_get(self):
method active_scs_part_set (line 400) | def active_scs_part_set(self, value):
method get_active_scs_look (line 415) | def get_active_scs_look(self):
method set_active_scs_look (line 422) | def set_active_scs_look(self, value):
method active_scs_animation_update (line 451) | def active_scs_animation_update(self, context):
method locator_preview_model_path_update (line 534) | def locator_preview_model_path_update(self, context):
method locator_show_preview_model_update (line 555) | def locator_show_preview_model_update(self, context):
method locator_preview_model_type_update (line 587) | def locator_preview_model_type_update(self, context):
method locator_type_items (line 610) | def locator_type_items(self, context):
method locator_type_update (line 618) | def locator_type_update(self, context):
method locator_collider_type_items (line 679) | def locator_collider_type_items(self, context):
method locator_collider_margin_update (line 775) | def locator_collider_margin_update(self, context):
method locator_prefab_type_items (line 805) | def locator_prefab_type_items(self, context):
method locator_prefab_type_update (line 816) | def locator_prefab_type_update(self, context):
function register (line 1245) | def register():
function unregister (line 1250) | def unregister():
FILE: addon/io_scs_tools/properties/scene.py
class SceneSCSProps (line 25) | class SceneSCSProps(bpy.types.PropertyGroup):
function register (line 46) | def register():
function unregister (line 51) | def unregister():
FILE: addon/io_scs_tools/properties/workspace.py
class WorkspaceSCSProps (line 26) | class WorkspaceSCSProps(bpy.types.PropertyGroup):
function register (line 84) | def register():
function unregister (line 89) | def unregister():
FILE: addon/io_scs_tools/ui/__init__.py
function register (line 31) | def register():
function unregister (line 43) | def unregister():
FILE: addon/io_scs_tools/ui/material.py
class _MaterialPanelBlDefs (line 37) | class _MaterialPanelBlDefs:
method draw_desynced_look (line 44) | def draw_desynced_look(layout, context):
method poll (line 60) | def poll(cls, context):
method get_layout (line 63) | def get_layout(self):
class SCS_TOOLS_UL_MaterialCustomMappingSlot (line 73) | class SCS_TOOLS_UL_MaterialCustomMappingSlot(bpy.types.UIList):
method draw_item (line 78) | def draw_item(self, context, layout, data, item, icon, active_data, ac...
class SCS_TOOLS_PT_Material (line 97) | class SCS_TOOLS_PT_Material(_shared.HeaderIconPanel, _MaterialPanelBlDef...
method poll (line 102) | def poll(cls, context):
method draw_shader_presets (line 112) | def draw_shader_presets(layout, scs_props, scs_globals, scs_inventorie...
method draw_flavors (line 152) | def draw_flavors(layout, mat):
method draw_parameters (line 233) | def draw_parameters(layout, mat, scs_inventories, split_perc, is_impor...
method draw_header_preset (line 343) | def draw_header_preset(self, context):
method draw (line 348) | def draw(self, context):
class SCS_TOOLS_PT_MaterialAttributes (line 385) | class SCS_TOOLS_PT_MaterialAttributes(_MaterialPanelBlDefs, Panel):
method poll (line 391) | def poll(cls, context):
method draw_attribute_item (line 412) | def draw_attribute_item(layout, mat, split_perc, attribute):
method draw (line 523) | def draw(self, context):
class SCS_TOOLS_PT_MaterialTextures (line 539) | class SCS_TOOLS_PT_MaterialTextures(_MaterialPanelBlDefs, Panel):
method poll (line 545) | def poll(cls, context):
method draw_texture_item (line 569) | def draw_texture_item(layout, mat, split_perc, texture, read_only):
method draw (line 740) | def draw(self, context):
class SCS_TOOLS_PT_LooksOnMaterial (line 775) | class SCS_TOOLS_PT_LooksOnMaterial(_shared.HeaderIconPanel, _MaterialPan...
method poll (line 782) | def poll(cls, context):
method draw (line 790) | def draw(self, context):
function register (line 804) | def register():
function unregister (line 812) | def unregister():
FILE: addon/io_scs_tools/ui/mesh.py
class _MeshPanelBlDefs (line 26) | class _MeshPanelBlDefs(_shared.HeaderIconPanel):
method poll (line 32) | def poll(cls, context):
method get_layout (line 35) | def get_layout(self):
class SCS_TOOLS_PT_Mesh (line 45) | class SCS_TOOLS_PT_Mesh(_MeshPanelBlDefs, Panel):
method draw (line 52) | def draw(self, context):
function register (line 75) | def register():
function unregister (line 86) | def unregister():
FILE: addon/io_scs_tools/ui/object.py
class _ObjectPanelBlDefs (line 34) | class _ObjectPanelBlDefs:
method poll (line 40) | def poll(cls, context):
method get_layout (line 43) | def get_layout(self):
class SCS_TOOLS_UL_ObjectPartSlot (line 53) | class SCS_TOOLS_UL_ObjectPartSlot(bpy.types.UIList):
method draw_icon_part_tools (line 57) | def draw_icon_part_tools(layout, index):
method draw_item (line 72) | def draw_item(self, context, layout, data, item, icon, active_data, ac...
class SCS_TOOLS_UL_ObjectVariantSlot (line 87) | class SCS_TOOLS_UL_ObjectVariantSlot(bpy.types.UIList):
method draw_item (line 90) | def draw_item(self, context, layout, data, item, icon, active_data, ac...
class SCS_TOOLS_UL_ObjectAnimationSlot (line 111) | class SCS_TOOLS_UL_ObjectAnimationSlot(bpy.types.UIList):
method draw_item (line 114) | def draw_item(self, context, layout, data, item, icon, active_data, ac...
class SCS_TOOLS_PT_Object (line 138) | class SCS_TOOLS_PT_Object(_shared.HeaderIconPanel, _ObjectPanelBlDefs, P...
method has_any_scs_subpanel (line 145) | def has_any_scs_subpanel(context):
method draw_empty_object_panel (line 157) | def draw_empty_object_panel(layout, obj, enabled=False):
method draw (line 173) | def draw(self, context):
class SCS_TOOLS_PT_RootObject (line 192) | class SCS_TOOLS_PT_RootObject(_ObjectPanelBlDefs, Panel):
method poll (line 199) | def poll(cls, context):
method draw (line 205) | def draw(self, context):
class SCS_TOOLS_PT_Locator (line 248) | class SCS_TOOLS_PT_Locator(_ObjectPanelBlDefs, Panel):
method poll (line 255) | def poll(cls, context):
method draw_model_locator (line 262) | def draw_model_locator(layout, obj):
method draw_collision_locator (line 285) | def draw_collision_locator(layout, obj):
method draw_prefab_control_node (line 322) | def draw_prefab_control_node(layout, context, obj, enabled=True):
method draw_prefab_sign (line 355) | def draw_prefab_sign(layout, obj):
method draw_prefab_spawn_point (line 365) | def draw_prefab_spawn_point(layout, obj):
method draw_prefab_semaphore (line 372) | def draw_prefab_semaphore(layout, obj):
method draw_prefab_navigation_point (line 408) | def draw_prefab_navigation_point(layout, context, obj):
method draw_prefab_map_point (line 471) | def draw_prefab_map_point(layout, context, obj):
method draw_prefab_trigger_point (line 522) | def draw_prefab_trigger_point(layout, context, obj):
method draw (line 565) | def draw(self, context):
class SCS_TOOLS_PT_PreviewModel (line 607) | class SCS_TOOLS_PT_PreviewModel(_ObjectPanelBlDefs, Panel):
method poll (line 614) | def poll(cls, context):
method draw_header (line 620) | def draw_header(self, context):
method draw (line 625) | def draw(self, context):
class SCS_TOOLS_PT_Parts (line 652) | class SCS_TOOLS_PT_Parts(_ObjectPanelBlDefs, Panel):
method poll (line 660) | def poll(cls, context):
method draw_part_list (line 677) | def draw_part_list(layout, root_obj):
method draw (line 707) | def draw(self, context):
class SCS_TOOLS_PT_Variants (line 749) | class SCS_TOOLS_PT_Variants(_ObjectPanelBlDefs, Panel):
method poll (line 757) | def poll(cls, context):
method draw_icon_variant_tools (line 764) | def draw_icon_variant_tools(layout, index):
method draw_icon_variant_tools_line (line 780) | def draw_icon_variant_tools_line(layout, index):
method draw_part_list_for_variant (line 798) | def draw_part_list_for_variant(layout, workspace, variant):
method draw_vertical_variant_block (line 820) | def draw_vertical_variant_block(layout, workspace, variant):
method draw_horizontal_scs_variant_block (line 841) | def draw_horizontal_scs_variant_block(layout, workspace, variant):
method draw_header_preset (line 860) | def draw_header_preset(self, context):
method draw (line 865) | def draw(self, context):
class SCS_TOOLS_PT_LooksOnObject (line 958) | class SCS_TOOLS_PT_LooksOnObject(_ObjectPanelBlDefs, Panel):
method poll (line 966) | def poll(cls, context):
method draw (line 972) | def draw(self, context):
class SCS_TOOLS_PT_Animations (line 979) | class SCS_TOOLS_PT_Animations(_ObjectPanelBlDefs, Panel):
method poll (line 986) | def poll(cls, context):
method draw_animation_section (line 993) | def draw_animation_section(self, layout, active_obj):
method draw (line 1027) | def draw(self, context):
class SCS_TOOLS_PT_AnimPlayer (line 1097) | class SCS_TOOLS_PT_AnimPlayer(_ObjectPanelBlDefs, Panel):
method draw (line 1104) | def draw(self, context):
class SCS_TOOLS_PT_Skeleton (line 1150) | class SCS_TOOLS_PT_Skeleton(_ObjectPanelBlDefs, Panel):
method poll (line 1157) | def poll(cls, context):
method draw (line 1163) | def draw(self, context):
function register (line 1208) | def register():
function unregister (line 1216) | def unregister():
FILE: addon/io_scs_tools/ui/output.py
class _OutputPanelBlDefs (line 29) | class _OutputPanelBlDefs(_shared.HeaderIconPanel):
class SCS_TOOLS_PT_ExportPanel (line 41) | class SCS_TOOLS_PT_ExportPanel(_OutputPanelBlDefs, Panel):
method draw (line 46) | def draw(self, context):
class SCS_TOOLS_UL_ConversionPathsSlot (line 110) | class SCS_TOOLS_UL_ConversionPathsSlot(UIList):
method draw_item (line 115) | def draw_item(self, context, layout, data, item, icon, active_data, ac...
class SCS_TOOLS_PT_ConversionHelper (line 123) | class SCS_TOOLS_PT_ConversionHelper(_OutputPanelBlDefs, Panel):
method draw_header_preset (line 128) | def draw_header_preset(self, context):
method draw (line 133) | def draw(self, context):
function register (line 228) | def register():
function unregister (line 237) | def unregister():
FILE: addon/io_scs_tools/ui/shared.py
class HeaderIconPanel (line 30) | class HeaderIconPanel:
method draw_header (line 37) | def draw_header(self, context):
class SCS_TOOLS_UL_ObjectLookSlots (line 42) | class SCS_TOOLS_UL_ObjectLookSlots(bpy.types.UIList):
method draw_item (line 47) | def draw_item(self, context, layout, data, item, icon, active_data, ac...
function draw_scs_looks_panel (line 55) | def draw_scs_looks_panel(layout, active_object, scs_root_object, without...
function draw_export_panel (line 108) | def draw_export_panel(layout, ignore_extra_boxes=False):
function draw_common_settings (line 171) | def draw_common_settings(layout, log_level_only=False, without_box=False):
function draw_warning_operator (line 199) | def draw_warning_operator(layout, title, message, text="", icon='ERROR'):
function create_row (line 220) | def create_row(layout, align=False, use_split=False, use_decorate=False,...
function get_on_off_icon (line 243) | def get_on_off_icon(is_state_on):
function register (line 259) | def register():
function unregister (line 264) | def unregister():
FILE: addon/io_scs_tools/ui/tool_shelf.py
class _ToolShelfBlDefs (line 34) | class _ToolShelfBlDefs(_shared.HeaderIconPanel):
class SCS_TOOLS_PT_ToolShelf (line 46) | class SCS_TOOLS_PT_ToolShelf(_ToolShelfBlDefs, Panel):
method poll (line 54) | def poll(cls, context):
method draw (line 57) | def draw(self, context):
class SCS_TOOLS_PT_ConvexBlDefs (line 82) | class SCS_TOOLS_PT_ConvexBlDefs(_ToolShelfBlDefs, Panel):
method poll (line 91) | def poll(cls, context):
method draw (line 94) | def draw(self, context):
class SCS_TOOLS_PT_Visibility (line 208) | class SCS_TOOLS_PT_Visibility(_ToolShelfBlDefs, Panel):
method poll (line 216) | def poll(cls, context):
method draw (line 219) | def draw(self, context):
class SCS_TOOLS_PT_DisplayMethods (line 292) | class SCS_TOOLS_PT_DisplayMethods(_ToolShelfBlDefs, Panel):
method poll (line 301) | def poll(cls, context):
method draw (line 304) | def draw(self, context):
class SCS_TOOLS_PT_LampSwitcher (line 342) | class SCS_TOOLS_PT_LampSwitcher(_ToolShelfBlDefs, Panel):
method poll (line 350) | def poll(cls, context):
method get_lampmask_state_icon (line 354) | def get_lampmask_state_icon(lamp_type):
method draw_lamp_type_switch (line 374) | def draw_lamp_type_switch(self, layout, lamp_type, text_override=None):
method draw (line 389) | def draw(self, context):
class SCS_TOOLS_PT_LampTool (line 437) | class SCS_TOOLS_PT_LampTool(_ToolShelfBlDefs, Panel):
method poll (line 445) | def poll(cls, context):
method draw (line 448) | def draw(self, context):
class SCS_TOOLS_PT_VColoring (line 506) | class SCS_TOOLS_PT_VColoring(_ToolShelfBlDefs, Panel):
method poll (line 510) | def poll(cls, context):
method draw (line 513) | def draw(self, context):
class SCS_TOOLS_PT_VertexColorWrapTool (line 544) | class SCS_TOOLS_PT_VertexColorWrapTool(_ToolShelfBlDefs, Panel):
method poll (line 548) | def poll(cls, context):
method draw (line 551) | def draw(self, context):
class SCS_TOOLS_PT_VertexColorStatsTool (line 568) | class SCS_TOOLS_PT_VertexColorStatsTool(_ToolShelfBlDefs, Panel):
method poll (line 572) | def poll(cls, context):
method draw (line 575) | def draw(self, context):
function register (line 599) | def register():
function unregister (line 615) | def unregister():
FILE: addon/io_scs_tools/ui/workspace.py
class _WorkspacePanelBlDefs (line 30) | class _WorkspacePanelBlDefs:
method poll (line 43) | def poll(cls, context):
method get_layout (line 46) | def get_layout(self):
class SCS_TOOLS_PT_GlobalSettings (line 56) | class SCS_TOOLS_PT_GlobalSettings(_shared.HeaderIconPanel, _WorkspacePan...
method draw (line 61) | def draw(self, context):
class SCS_TOOLS_PT_PathSettingsPresets (line 65) | class SCS_TOOLS_PT_PathSettingsPresets(PresetPanel, Panel):
class SCS_TOOLS_PT_PathSettings (line 72) | class SCS_TOOLS_PT_PathSettings(_WorkspacePanelBlDefs, Panel):
method draw_header_preset (line 78) | def draw_header_preset(self, context):
method draw (line 81) | def draw(self, context):
class SCS_TOOLS_PT_DisplaySettings (line 166) | class SCS_TOOLS_PT_DisplaySettings(_WorkspacePanelBlDefs, Panel):
method draw (line 172) | def draw(self, context):
class SCS_TOOLS_PT_LocatorsDisplay (line 192) | class SCS_TOOLS_PT_LocatorsDisplay(_WorkspacePanelBlDefs, Panel):
method draw_header (line 199) | def draw_header(self, context):
method draw (line 206) | def draw(self, context):
class SCS_TOOLS_PT_ConnectionsDisplay (line 225) | class SCS_TOOLS_PT_ConnectionsDisplay(_WorkspacePanelBlDefs, Panel):
method draw_header (line 232) | def draw_header(self, context):
method draw (line 239) | def draw(self, context):
class SCS_TOOLS_PT_OtherSetttings (line 254) | class SCS_TOOLS_PT_OtherSetttings(_WorkspacePanelBlDefs, Panel):
method draw_header (line 260) | def draw_header(self, context):
method draw (line 263) | def draw(self, context):
function register (line 285) | def register():
function unregister (line 293) | def unregister():
FILE: addon/io_scs_tools/ui/world.py
class _WorldPanelBlDefs (line 30) | class _WorldPanelBlDefs:
method poll (line 40) | def poll(cls, context):
method get_layout (line 43) | def get_layout(self):
class SCS_TOOLS_UL_SunProfileSlot (line 53) | class SCS_TOOLS_UL_SunProfileSlot(UIList):
method draw_item (line 58) | def draw_item(self, context, layout, data, item, icon, active_data, ac...
class SCS_TOOLS_PT_Lighting (line 65) | class SCS_TOOLS_PT_Lighting(_shared.HeaderIconPanel, _WorldPanelBlDefs, ...
method draw_header (line 69) | def draw_header(self, context):
method draw (line 76) | def draw(self, context):
class SCS_TOOLS_PT_ActiveSunProfileSettings (line 142) | class SCS_TOOLS_PT_ActiveSunProfileSettings(_WorldPanelBlDefs, Panel):
method poll (line 149) | def poll(cls, context):
method draw (line 152) | def draw(self, context):
function register (line 180) | def register():
function unregister (line 188) | def unregister():
FILE: addon/io_scs_tools/unused/import_pmg.py
function version (line 50) | def version():
function create_material (line 54) | def create_material(
function make_per_vertex_uv_layer (line 70) | def make_per_vertex_uv_layer(mesh, mesh_uv, uv_layer_name):
function make_per_face_uv_layer (line 84) | def make_per_face_uv_layer(mesh, uv_layer, layer_name):
function make_vcolor_layer (line 98) | def make_vcolor_layer(mesh, mesh_rgb, mesh_rgba):
function make_per_face_rgb_layer (line 118) | def make_per_face_rgb_layer(mesh, rgb_layer, layer_name):
function create_5_piece (line 191) | def create_5_piece(
function create_7_piece (line 401) | def create_7_piece(
function create_locator (line 560) | def create_locator( ## NOTE: UNUSED NOW!! Using 'io_utils.create_locator...
function make_posnorm_list (line 598) | def make_posnorm_list(mesh_vertices, mesh_normals):
function make_points_to_weld_list (line 605) | def make_points_to_weld_list(posnorm_list):
function getHeader (line 631) | def getHeader(pmg_container, dump_level):
function getGlobal (line 648) | def getGlobal(pmg_container, dump_level):
function getMaterialProperties (line 669) | def getMaterialProperties(section, dump_level):
function getPieceProperties (line 680) | def getPieceProperties(section, dump_level):
function get_piece_5_streams (line 695) | def get_piece_5_streams(section, dump_level):
function get_piece_7_streams (line 755) | def get_piece_7_streams(section, dump_level):
function getPartProperties (line 848) | def getPartProperties(section, dump_level):
function getLocatorProperties (line 863) | def getLocatorProperties(section, dump_level):
function getBonesProperties (line 879) | def getBonesProperties(section, dump_level):
function getSkinStream (line 889) | def getSkinStream(section, dump_level):
function getSkinProperties (line 910) | def getSkinProperties(section, dump_level):
class PMGHeader (line 927) | class PMGHeader:
method __init__ (line 929) | def __init__(self):
method read_header (line 962) | def read_header(self, f):
class PMG (line 994) | class PMG:
method __init__ (line 996) | def __init__(self, f):
method __read_models (line 1003) | def __read_models(self, f):
method __read_dummies (line 1027) | def __read_dummies(self, f):
method __read_sections (line 1052) | def __read_sections(self, f):
method draw_model (line 1069) | def draw_model(self, name):
function load (line 1086) | def load(
function read_pmg_data (line 1124) | def read_pmg_data(pmg_file, filename, filesize_perc, file_integrity):
function load_pmg_file (line 1172) | def load_pmg_file(filepath):
function process_pmg_data (line 1206) | def process_pmg_data(
FILE: addon/io_scs_tools/unused/import_pmx.py
function version (line 68) | def version():
function create_lod_empty (line 72) | def create_lod_empty(name, objects, locators, armature, skeleton):
function load (line 114) | def load(
FILE: addon/io_scs_tools/unused/pim.py
function _fill_header_section (line 36) | def _fill_header_section(file_name, output_type):
function _fill_global_section (line 61) | def _fill_global_section(file_name, vertex_cnt, face_cnt, edge_cnt, mate...
function _fill_material_sections (line 90) | def _fill_material_sections(used_materials):
function _fill_piece_sections_5 (line 121) | def _fill_piece_sections_5(root_object, object_list, bone_list, scene, u...
function _fill_piece_sections_7 (line 309) | def _fill_piece_sections_7(root_object, object_list, bone_list, scene, v...
function _fill_locator_sections (line 537) | def _fill_locator_sections(model_locator_list):
function _fill_bones_section (line 563) | def _fill_bones_section(bone_list):
function _fill_skin_section (line 575) | def _fill_skin_section(skin_list, skin_weights_cnt, skin_clones_cnt):
function _make_material_dict (line 597) | def _make_material_dict(object_materials):
function _create_index_material_dict (line 614) | def _create_index_material_dict(material_dict):
function _get_vertex_group_index (line 628) | def _get_vertex_group_index(bone_name_list, group_name):
function _get_geometry_dict (line 646) | def _get_geometry_dict(root_object, obj, mesh, offset_matrix, material_d...
function export (line 881) | def export(context, root_object, used_parts, used_materials, object_list...
FILE: addon/io_scs_tools/utils/__init__.py
function __get_world__ (line 24) | def __get_world__():
function __get_addon_prefs__ (line 36) | def __get_addon_prefs__():
function get_scs_globals (line 45) | def get_scs_globals():
function get_scs_inventories (line 54) | def get_scs_inventories():
function save_scs_globals_to_blend (line 63) | def save_scs_globals_to_blend():
function load_scs_globals_from_blend (line 83) | def load_scs_globals_from_blend():
FILE: addon/io_scs_tools/utils/animation.py
function add_animation_to_root (line 25) | def add_animation_to_root(scs_root_object, animation_name):
function set_fps_for_preview (line 37) | def set_fps_for_preview(scene, length, start_frame, end_frame):
function set_frame_range (line 55) | def set_frame_range(scene, start_frame, end_frame):
function get_armature_action (line 71) | def get_armature_action(context):
function apply_euler_filter (line 86) | def apply_euler_filter(fcv):
FILE: addon/io_scs_tools/utils/collection.py
function get_layer_collections (line 22) | def get_layer_collections(view_layer):
FILE: addon/io_scs_tools/utils/convert.py
function __linear_to_srgb (line 36) | def __linear_to_srgb(x):
function __srgb_to_linear (line 50) | def __srgb_to_linear(x):
function linear_to_srgb (line 72) | def linear_to_srgb(value):
function srgb_to_linear (line 88) | def srgb_to_linear(value):
function pre_gamma_corrected_col (line 104) | def pre_gamma_corrected_col(color):
function to_node_color (line 123) | def to_node_color(col
Copy disabled (too large)
Download .json
Condensed preview — 1453 files, each showing path, character count, and a content snippet. Download the .json file for the full structured content (60,211K chars).
[
{
"path": ".gitattributes",
"chars": 27,
"preview": "*.txt\t\teol=lf\n*.py\t\teol=lf\n"
},
{
"path": ".gitignore",
"chars": 763,
"preview": "# Byte-compiled / optimized / DLL files\n__pycache__/\n*.py[cod]\n\n# C extensions\n*.so\n\n# Distribution / packaging\n.Python\n"
},
{
"path": "LICENSE",
"chars": 18027,
"preview": "GNU GENERAL PUBLIC LICENSE\n Version 2, June 1991\n\n Copyright (C) 1989, 1991 Free Software Foundati"
},
{
"path": "README.md",
"chars": 1792,
"preview": "\nSCS Blender Tools\n=================\n\nSCS Blender Tools are official tools for model and asset creation for\ntrucking gam"
},
{
"path": "addon/io_scs_tools/__init__.py",
"chars": 17399,
"preview": "# ##### BEGIN GPL LICENSE BLOCK #####\n#\n# This program is free software; you can redistribute it and/or\n# modify it unde"
},
{
"path": "addon/io_scs_tools/consts.py",
"chars": 18517,
"preview": "# ##### BEGIN GPL LICENSE BLOCK #####\n#\n# This program is free software you can redistribute it and/or\n# modify it under"
},
{
"path": "addon/io_scs_tools/exp/__init__.py",
"chars": 7488,
"preview": "# ##### BEGIN GPL LICENSE BLOCK #####\n#\n# This program is free software; you can redistribute it and/or\n# modify it unde"
},
{
"path": "addon/io_scs_tools/exp/pia.py",
"chars": 15661,
"preview": "# ##### BEGIN GPL LICENSE BLOCK #####\n#\n# This program is free software; you can redistribute it and/or\n# modify it unde"
},
{
"path": "addon/io_scs_tools/exp/pic.py",
"chars": 13006,
"preview": "# ##### BEGIN GPL LICENSE BLOCK #####\n#\n# This program is free software; you can redistribute it and/or\n# modify it unde"
},
{
"path": "addon/io_scs_tools/exp/pim/bones.py",
"chars": 2798,
"preview": "# ##### BEGIN GPL LICENSE BLOCK #####\n#\n# This program is free software; you can redistribute it and/or\n# modify it unde"
},
{
"path": "addon/io_scs_tools/exp/pim/exporter.py",
"chars": 33013,
"preview": "# ##### BEGIN GPL LICENSE BLOCK #####\n#\n# This program is free software; you can redistribute it and/or\n# modify it unde"
},
{
"path": "addon/io_scs_tools/exp/pim/globall.py",
"chars": 2803,
"preview": "# ##### BEGIN GPL LICENSE BLOCK #####\n#\n# This program is free software; you can redistribute it and/or\n# modify it unde"
},
{
"path": "addon/io_scs_tools/exp/pim/header.py",
"chars": 2266,
"preview": "# ##### BEGIN GPL LICENSE BLOCK #####\n#\n# This program is free software; you can redistribute it and/or\n# modify it unde"
},
{
"path": "addon/io_scs_tools/exp/pim/locator.py",
"chars": 3220,
"preview": "# ##### BEGIN GPL LICENSE BLOCK #####\n#\n# This program is free software; you can redistribute it and/or\n# modify it unde"
},
{
"path": "addon/io_scs_tools/exp/pim/material.py",
"chars": 7164,
"preview": "# ##### BEGIN GPL LICENSE BLOCK #####\n#\n# This program is free software; you can redistribute it and/or\n# modify it unde"
},
{
"path": "addon/io_scs_tools/exp/pim/part.py",
"chars": 3325,
"preview": "# ##### BEGIN GPL LICENSE BLOCK #####\n#\n# This program is free software; you can redistribute it and/or\n# modify it unde"
},
{
"path": "addon/io_scs_tools/exp/pim/piece.py",
"chars": 10495,
"preview": "# ##### BEGIN GPL LICENSE BLOCK #####\n#\n# This program is free software; you can redistribute it and/or\n# modify it unde"
},
{
"path": "addon/io_scs_tools/exp/pim/piece_skin.py",
"chars": 3170,
"preview": "# ##### BEGIN GPL LICENSE BLOCK #####\n#\n# This program is free software; you can redistribute it and/or\n# modify it unde"
},
{
"path": "addon/io_scs_tools/exp/pim/piece_skin_stream.py",
"chars": 7800,
"preview": "# ##### BEGIN GPL LICENSE BLOCK #####\n#\n# This program is free software; you can redistribute it and/or\n# modify it unde"
},
{
"path": "addon/io_scs_tools/exp/pim/piece_stream.py",
"chars": 5184,
"preview": "# ##### BEGIN GPL LICENSE BLOCK #####\n#\n# This program is free software; you can redistribute it and/or\n# modify it unde"
},
{
"path": "addon/io_scs_tools/exp/pim_ef/bones.py",
"chars": 865,
"preview": "# ##### BEGIN GPL LICENSE BLOCK #####\n#\n# This program is free software; you can redistribute it and/or\n# modify it unde"
},
{
"path": "addon/io_scs_tools/exp/pim_ef/exporter.py",
"chars": 26245,
"preview": "# ##### BEGIN GPL LICENSE BLOCK #####\n#\n# This program is free software; you can redistribute it and/or\n# modify it unde"
},
{
"path": "addon/io_scs_tools/exp/pim_ef/globall.py",
"chars": 2798,
"preview": "# ##### BEGIN GPL LICENSE BLOCK #####\n#\n# This program is free software; you can redistribute it and/or\n# modify it unde"
},
{
"path": "addon/io_scs_tools/exp/pim_ef/header.py",
"chars": 866,
"preview": "# ##### BEGIN GPL LICENSE BLOCK #####\n#\n# This program is free software; you can redistribute it and/or\n# modify it unde"
},
{
"path": "addon/io_scs_tools/exp/pim_ef/locator.py",
"chars": 868,
"preview": "# ##### BEGIN GPL LICENSE BLOCK #####\n#\n# This program is free software; you can redistribute it and/or\n# modify it unde"
},
{
"path": "addon/io_scs_tools/exp/pim_ef/material.py",
"chars": 870,
"preview": "# ##### BEGIN GPL LICENSE BLOCK #####\n#\n# This program is free software; you can redistribute it and/or\n# modify it unde"
},
{
"path": "addon/io_scs_tools/exp/pim_ef/part.py",
"chars": 862,
"preview": "# ##### BEGIN GPL LICENSE BLOCK #####\n#\n# This program is free software; you can redistribute it and/or\n# modify it unde"
},
{
"path": "addon/io_scs_tools/exp/pim_ef/piece.py",
"chars": 9924,
"preview": "# ##### BEGIN GPL LICENSE BLOCK #####\n#\n# This program is free software; you can redistribute it and/or\n# modify it unde"
},
{
"path": "addon/io_scs_tools/exp/pim_ef/piece_face.py",
"chars": 5980,
"preview": "# ##### BEGIN GPL LICENSE BLOCK #####\n#\n# This program is free software; you can redistribute it and/or\n# modify it unde"
},
{
"path": "addon/io_scs_tools/exp/pim_ef/piece_skin.py",
"chars": 949,
"preview": "# ##### BEGIN GPL LICENSE BLOCK #####\n#\n# This program is free software; you can redistribute it and/or\n# modify it unde"
},
{
"path": "addon/io_scs_tools/exp/pim_ef/piece_skin_stream.py",
"chars": 892,
"preview": "# ##### BEGIN GPL LICENSE BLOCK #####\n#\n# This program is free software; you can redistribute it and/or\n# modify it unde"
},
{
"path": "addon/io_scs_tools/exp/pim_ef/piece_stream.py",
"chars": 2183,
"preview": "# ##### BEGIN GPL LICENSE BLOCK #####\n#\n# This program is free software; you can redistribute it and/or\n# modify it unde"
},
{
"path": "addon/io_scs_tools/exp/pip/curve.py",
"chars": 22871,
"preview": "# ##### BEGIN GPL LICENSE BLOCK #####\n#\n# This program is free software; you can redistribute it and/or\n# modify it unde"
},
{
"path": "addon/io_scs_tools/exp/pip/curve_bezier.py",
"chars": 4360,
"preview": "# ##### BEGIN GPL LICENSE BLOCK #####\n#\n# This program is free software; you can redistribute it and/or\n# modify it unde"
},
{
"path": "addon/io_scs_tools/exp/pip/exporter.py",
"chars": 22631,
"preview": "# ##### BEGIN GPL LICENSE BLOCK #####\n#\n# This program is free software; you can redistribute it and/or\n# modify it unde"
},
{
"path": "addon/io_scs_tools/exp/pip/globall.py",
"chars": 2848,
"preview": "# ##### BEGIN GPL LICENSE BLOCK #####\n#\n# This program is free software; you can redistribute it and/or\n# modify it unde"
},
{
"path": "addon/io_scs_tools/exp/pip/header.py",
"chars": 1871,
"preview": "# ##### BEGIN GPL LICENSE BLOCK #####\n#\n# This program is free software; you can redistribute it and/or\n# modify it unde"
},
{
"path": "addon/io_scs_tools/exp/pip/intersection.py",
"chars": 11648,
"preview": "# ##### BEGIN GPL LICENSE BLOCK #####\n#\n# This program is free software; you can redistribute it and/or\n# modify it unde"
},
{
"path": "addon/io_scs_tools/exp/pip/map_point.py",
"chars": 17939,
"preview": "# ##### BEGIN GPL LICENSE BLOCK #####\n#\n# This program is free software; you can redistribute it and/or\n# modify it unde"
},
{
"path": "addon/io_scs_tools/exp/pip/node.py",
"chars": 13887,
"preview": "# ##### BEGIN GPL LICENSE BLOCK #####\n#\n# This program is free software; you can redistribute it and/or\n# modify it unde"
},
{
"path": "addon/io_scs_tools/exp/pip/node_stream.py",
"chars": 3101,
"preview": "# ##### BEGIN GPL LICENSE BLOCK #####\n#\n# This program is free software; you can redistribute it and/or\n# modify it unde"
},
{
"path": "addon/io_scs_tools/exp/pip/semaphore.py",
"chars": 4012,
"preview": "# ##### BEGIN GPL LICENSE BLOCK #####\n#\n# This program is free software you can redistribute it and/or\n# modify it under"
},
{
"path": "addon/io_scs_tools/exp/pip/sign.py",
"chars": 2787,
"preview": "# ##### BEGIN GPL LICENSE BLOCK #####\n#\n# This program is free software; you can redistribute it and/or\n# modify it unde"
},
{
"path": "addon/io_scs_tools/exp/pip/spawn_point.py",
"chars": 2871,
"preview": "# ##### BEGIN GPL LICENSE BLOCK #####\n#\n# This program is free software you can redistribute it and/or\n# modify it under"
},
{
"path": "addon/io_scs_tools/exp/pip/trigger_point.py",
"chars": 8688,
"preview": "# ##### BEGIN GPL LICENSE BLOCK #####\n#\n# This program is free software; you can redistribute it and/or\n# modify it unde"
},
{
"path": "addon/io_scs_tools/exp/pis.py",
"chars": 3640,
"preview": "# ##### BEGIN GPL LICENSE BLOCK #####\n#\n# This program is free software; you can redistribute it and/or\n# modify it unde"
},
{
"path": "addon/io_scs_tools/exp/pit.py",
"chars": 31361,
"preview": "# ##### BEGIN GPL LICENSE BLOCK #####\n#\n# This program is free software; you can redistribute it and/or\n# modify it unde"
},
{
"path": "addon/io_scs_tools/exp/pit_ef.py",
"chars": 19587,
"preview": "# ##### BEGIN GPL LICENSE BLOCK #####\n#\n# This program is free software; you can redistribute it and/or\n# modify it unde"
},
{
"path": "addon/io_scs_tools/exp/pix.py",
"chars": 10995,
"preview": "# ##### BEGIN GPL LICENSE BLOCK #####\n#\n# This program is free software; you can redistribute it and/or\n# modify it unde"
},
{
"path": "addon/io_scs_tools/exp/tobj.py",
"chars": 2965,
"preview": "# ##### BEGIN GPL LICENSE BLOCK #####\n#\n# This program is free software; you can redistribute it and/or\n# modify it unde"
},
{
"path": "addon/io_scs_tools/exp/transition_structs/bones.py",
"chars": 1845,
"preview": "# ##### BEGIN GPL LICENSE BLOCK #####\n#\n# This program is free software; you can redistribute it and/or\n# modify it unde"
},
{
"path": "addon/io_scs_tools/exp/transition_structs/materials.py",
"chars": 2017,
"preview": "# ##### BEGIN GPL LICENSE BLOCK #####\n#\n# This program is free software; you can redistribute it and/or\n# modify it unde"
},
{
"path": "addon/io_scs_tools/exp/transition_structs/parts.py",
"chars": 4700,
"preview": "# ##### BEGIN GPL LICENSE BLOCK #####\n#\n# This program is free software; you can redistribute it and/or\n# modify it unde"
},
{
"path": "addon/io_scs_tools/exp/transition_structs/terrain_points.py",
"chars": 3491,
"preview": "# ##### BEGIN GPL LICENSE BLOCK #####\n#\n# This program is free software; you can redistribute it and/or\n# modify it unde"
},
{
"path": "addon/io_scs_tools/imp/__init__.py",
"chars": 1059,
"preview": "# ##### BEGIN GPL LICENSE BLOCK #####\n#\n# This program is free software; you can redistribute it and/or\n# modify it unde"
},
{
"path": "addon/io_scs_tools/imp/pia.py",
"chars": 21966,
"preview": "# ##### BEGIN GPL LICENSE BLOCK #####\n#\n# This program is free software; you can redistribute it and/or\n# modify it unde"
},
{
"path": "addon/io_scs_tools/imp/pic.py",
"chars": 14785,
"preview": "# ##### BEGIN GPL LICENSE BLOCK #####\n#\n# This program is free software; you can redistribute it and/or\n# modify it unde"
},
{
"path": "addon/io_scs_tools/imp/pim.py",
"chars": 45658,
"preview": "# ##### BEGIN GPL LICENSE BLOCK #####\n#\n# This program is free software; you can redistribute it and/or\n# modify it unde"
},
{
"path": "addon/io_scs_tools/imp/pim_ef.py",
"chars": 37077,
"preview": "# ##### BEGIN GPL LICENSE BLOCK #####\n#\n# This program is free software; you can redistribute it and/or\n# modify it unde"
},
{
"path": "addon/io_scs_tools/imp/pip.py",
"chars": 45806,
"preview": "# ##### BEGIN GPL LICENSE BLOCK #####\n#\n# This program is free software; you can redistribute it and/or\n# modify it unde"
},
{
"path": "addon/io_scs_tools/imp/pis.py",
"chars": 8732,
"preview": "# ##### BEGIN GPL LICENSE BLOCK #####\n#\n# This program is free software; you can redistribute it and/or\n# modify it unde"
},
{
"path": "addon/io_scs_tools/imp/pit.py",
"chars": 14440,
"preview": "# ##### BEGIN GPL LICENSE BLOCK #####\n#\n# This program is free software; you can redistribute it and/or\n# modify it unde"
},
{
"path": "addon/io_scs_tools/imp/pix.py",
"chars": 23458,
"preview": "# ##### BEGIN GPL LICENSE BLOCK #####\n#\n# This program is free software; you can redistribute it and/or\n# modify it unde"
},
{
"path": "addon/io_scs_tools/imp/tobj.py",
"chars": 3158,
"preview": "# ##### BEGIN GPL LICENSE BLOCK #####\n#\n# This program is free software; you can redistribute it and/or\n# modify it unde"
},
{
"path": "addon/io_scs_tools/imp/transition_structs/terrain_points.py",
"chars": 3470,
"preview": "# ##### BEGIN GPL LICENSE BLOCK #####\n#\n# This program is free software; you can redistribute it and/or\n# modify it unde"
},
{
"path": "addon/io_scs_tools/internals/callbacks/lighting_east_lock.py",
"chars": 4640,
"preview": "# ##### BEGIN GPL LICENSE BLOCK #####\n#\n# This program is free software; you can redistribute it and/or\n# modify it unde"
},
{
"path": "addon/io_scs_tools/internals/callbacks/open_gl.py",
"chars": 2357,
"preview": "# ##### BEGIN GPL LICENSE BLOCK #####\n#\n# This program is free software; you can redistribute it and/or\n# modify it unde"
},
{
"path": "addon/io_scs_tools/internals/callbacks/persistent.py",
"chars": 4146,
"preview": "# ##### BEGIN GPL LICENSE BLOCK #####\n#\n# This program is free software; you can redistribute it and/or\n# modify it unde"
},
{
"path": "addon/io_scs_tools/internals/connections/collector.py",
"chars": 7239,
"preview": "# ##### BEGIN GPL LICENSE BLOCK #####\n#\n# This program is free software; you can redistribute it and/or\n# modify it unde"
},
{
"path": "addon/io_scs_tools/internals/connections/core.py",
"chars": 44520,
"preview": "# ##### BEGIN GPL LICENSE BLOCK #####\n#\n# This program is free software; you can redistribute it and/or\n# modify it unde"
},
{
"path": "addon/io_scs_tools/internals/connections/wrappers/collection.py",
"chars": 11589,
"preview": "# ##### BEGIN GPL LICENSE BLOCK #####\n#\n# This program is free software; you can redistribute it and/or\n# modify it unde"
},
{
"path": "addon/io_scs_tools/internals/containers/config.py",
"chars": 71166,
"preview": "# ##### BEGIN GPL LICENSE BLOCK #####\n#\n# This program is free software; you can redistribute it and/or\n# modify it unde"
},
{
"path": "addon/io_scs_tools/internals/containers/mat.py",
"chars": 3630,
"preview": "# ##### BEGIN GPL LICENSE BLOCK #####\n#\n# This program is free software; you can redistribute it and/or\n# modify it unde"
},
{
"path": "addon/io_scs_tools/internals/containers/parsers/mat.py",
"chars": 2247,
"preview": "from re import compile\nfrom ast import literal_eval\n\nfrom io_scs_tools.utils.printout import lprint\n\n\ndef read_data(file"
},
{
"path": "addon/io_scs_tools/internals/containers/parsers/pix.py",
"chars": 16322,
"preview": "# ##### BEGIN GPL LICENSE BLOCK #####\n#\n# This program is free software; you can redistribute it and/or\n# modify it unde"
},
{
"path": "addon/io_scs_tools/internals/containers/parsers/sii.py",
"chars": 14063,
"preview": "# ##### BEGIN GPL LICENSE BLOCK #####\n#\n# This program is free software; you can redistribute it and/or\n# modify it unde"
},
{
"path": "addon/io_scs_tools/internals/containers/parsers/tobj.py",
"chars": 2262,
"preview": "# ##### BEGIN GPL LICENSE BLOCK #####\n#\n# This program is free software; you can redistribute it and/or\n# modify it unde"
},
{
"path": "addon/io_scs_tools/internals/containers/pix.py",
"chars": 9073,
"preview": "# ##### BEGIN GPL LICENSE BLOCK #####\n#\n# This program is free software; you can redistribute it and/or\n# modify it unde"
},
{
"path": "addon/io_scs_tools/internals/containers/sii.py",
"chars": 7699,
"preview": "# ##### BEGIN GPL LICENSE BLOCK #####\n#\n# This program is free software; you can redistribute it and/or\n# modify it unde"
},
{
"path": "addon/io_scs_tools/internals/containers/tobj.py",
"chars": 14058,
"preview": "# ##### BEGIN GPL LICENSE BLOCK #####\n#\n# This program is free software; you can redistribute it and/or\n# modify it unde"
},
{
"path": "addon/io_scs_tools/internals/containers/writers/pix.py",
"chars": 8974,
"preview": "# ##### BEGIN GPL LICENSE BLOCK #####\n#\n# This program is free software; you can redistribute it and/or\n# modify it unde"
},
{
"path": "addon/io_scs_tools/internals/containers/writers/sii.py",
"chars": 5337,
"preview": "# ##### BEGIN GPL LICENSE BLOCK #####\n#\n# This program is free software; you can redistribute it and/or\n# modify it unde"
},
{
"path": "addon/io_scs_tools/internals/icons/__init__.py",
"chars": 5785,
"preview": "# ##### BEGIN GPL LICENSE BLOCK #####\n#\n# This program is free software; you can redistribute it and/or\n# modify it unde"
},
{
"path": "addon/io_scs_tools/internals/inventory.py",
"chars": 6684,
"preview": "# ##### BEGIN GPL LICENSE BLOCK #####\n#\n# This program is free software; you can redistribute it and/or\n# modify it unde"
},
{
"path": "addon/io_scs_tools/internals/looks/__init__.py",
"chars": 24236,
"preview": "# ##### BEGIN GPL LICENSE BLOCK #####\n#\n# This program is free software; you can redistribute it and/or\n# modify it unde"
},
{
"path": "addon/io_scs_tools/internals/open_gl/cache.py",
"chars": 7336,
"preview": "# ##### BEGIN GPL LICENSE BLOCK #####\n#\n# This program is free software; you can redistribute it and/or\n# modify it unde"
},
{
"path": "addon/io_scs_tools/internals/open_gl/core.py",
"chars": 21169,
"preview": "# ##### BEGIN GPL LICENSE BLOCK #####\n#\n# This program is free software; you can redistribute it and/or\n# modify it unde"
},
{
"path": "addon/io_scs_tools/internals/open_gl/locators/__init__.py",
"chars": 1003,
"preview": "# ##### BEGIN GPL LICENSE BLOCK #####\n#\n# This program is free software; you can redistribute it and/or\n# modify it unde"
},
{
"path": "addon/io_scs_tools/internals/open_gl/locators/collider.py",
"chars": 10231,
"preview": "# ##### BEGIN GPL LICENSE BLOCK #####\n#\n# This program is free software; you can redistribute it and/or\n# modify it unde"
},
{
"path": "addon/io_scs_tools/internals/open_gl/locators/model.py",
"chars": 3988,
"preview": "# ##### BEGIN GPL LICENSE BLOCK #####\n#\n# This program is free software; you can redistribute it and/or\n# modify it unde"
},
{
"path": "addon/io_scs_tools/internals/open_gl/locators/prefab.py",
"chars": 14851,
"preview": "# ##### BEGIN GPL LICENSE BLOCK #####\n#\n# This program is free software; you can redistribute it and/or\n# modify it unde"
},
{
"path": "addon/io_scs_tools/internals/open_gl/primitive.py",
"chars": 44885,
"preview": "# ##### BEGIN GPL LICENSE BLOCK #####\n#\n# This program is free software; you can redistribute it and/or\n# modify it unde"
},
{
"path": "addon/io_scs_tools/internals/open_gl/shaders/__init__.py",
"chars": 2587,
"preview": "# ##### BEGIN GPL LICENSE BLOCK #####\n#\n# This program is free software; you can redistribute it and/or\n# modify it unde"
},
{
"path": "addon/io_scs_tools/internals/open_gl/shaders/smooth_color_clipped_3d_frag.glsl",
"chars": 292,
"preview": "in vec4 finalColor;\nin vec4 vertexPos;\nout vec4 fragColor;\n\nuniform vec4 clip_planes[6];\nuniform int num_clip_planes;\n\nv"
},
{
"path": "addon/io_scs_tools/internals/open_gl/shaders/smooth_color_clipped_3d_vert.glsl",
"chars": 418,
"preview": "uniform mat4 ModelViewProjectionMatrix;\n\n#ifdef USE_WORLD_CLIP_PLANES\nuniform mat4 ModelMatrix;\n#endif\n\nin vec3 pos;\nin "
},
{
"path": "addon/io_scs_tools/internals/open_gl/shaders/smooth_color_stipple_clipped_3d_frag.glsl",
"chars": 407,
"preview": "in vec4 vertexColor;\nflat in vec4 startVertexPos;\nin vec4 vertexPos;\n\nout vec4 fragColor;\n\nuniform vec4 clip_planes[6];\n"
},
{
"path": "addon/io_scs_tools/internals/open_gl/shaders/smooth_color_stipple_clipped_3d_vert.glsl",
"chars": 393,
"preview": "uniform mat4 ModelViewProjectionMatrix;\n\nin vec3 pos;\nin vec4 color;\n\nout vec4 vertexColor;\nflat out vec4 startVertexPos"
},
{
"path": "addon/io_scs_tools/internals/open_gl/storage/terrain_points.py",
"chars": 1827,
"preview": "# ##### BEGIN GPL LICENSE BLOCK #####\n#\n# This program is free software; you can redistribute it and/or\n# modify it unde"
},
{
"path": "addon/io_scs_tools/internals/persistent/file_load.py",
"chars": 14635,
"preview": "# ##### BEGIN GPL LICENSE BLOCK #####\n#\n# This program is free software; you can redistribute it and/or\n# modify it unde"
},
{
"path": "addon/io_scs_tools/internals/persistent/file_save.py",
"chars": 1489,
"preview": "# ##### BEGIN GPL LICENSE BLOCK #####\n#\n# This program is free software; you can redistribute it and/or\n# modify it unde"
},
{
"path": "addon/io_scs_tools/internals/persistent/initialization.py",
"chars": 6852,
"preview": "# ##### BEGIN GPL LICENSE BLOCK #####\n#\n# This program is free software; you can redistribute it and/or\n# modify it unde"
},
{
"path": "addon/io_scs_tools/internals/persistent/loop_check.py",
"chars": 15724,
"preview": "# ##### BEGIN GPL LICENSE BLOCK #####\n#\n# This program is free software; you can redistribute it and/or\n# modify it unde"
},
{
"path": "addon/io_scs_tools/internals/persistent/open_gl.py",
"chars": 7138,
"preview": "# ##### BEGIN GPL LICENSE BLOCK #####\n#\n# This program is free software; you can redistribute it and/or\n# modify it unde"
},
{
"path": "addon/io_scs_tools/internals/persistent/shaders_update.py",
"chars": 1380,
"preview": "# ##### BEGIN GPL LICENSE BLOCK #####\n#\n# This program is free software; you can redistribute it and/or\n# modify it unde"
},
{
"path": "addon/io_scs_tools/internals/preview_models/__init__.py",
"chars": 14218,
"preview": "# ##### BEGIN GPL LICENSE BLOCK #####\n#\n# This program is free software; you can redistribute it and/or\n# modify it unde"
},
{
"path": "addon/io_scs_tools/internals/preview_models/cache.py",
"chars": 5663,
"preview": "# ##### BEGIN GPL LICENSE BLOCK #####\n#\n# This program is free software; you can redistribute it and/or\n# modify it unde"
},
{
"path": "addon/io_scs_tools/internals/shader_presets/__init__.py",
"chars": 9113,
"preview": "# ##### BEGIN GPL LICENSE BLOCK #####\n#\n# This program is free software; you can redistribute it and/or\n# modify it unde"
},
{
"path": "addon/io_scs_tools/internals/shader_presets/cache.py",
"chars": 5652,
"preview": "# ##### BEGIN GPL LICENSE BLOCK #####\n#\n# This program is free software; you can redistribute it and/or\n# modify it unde"
},
{
"path": "addon/io_scs_tools/internals/shader_presets/ui_shader_preset_item.py",
"chars": 3123,
"preview": "# ##### BEGIN GPL LICENSE BLOCK #####\n#\n# This program is free software; you can redistribute it and/or\n# modify it unde"
},
{
"path": "addon/io_scs_tools/internals/shaders/__init__.py",
"chars": 2133,
"preview": "# ##### BEGIN GPL LICENSE BLOCK #####\n#\n# This program is free software; you can redistribute it and/or\n# modify it unde"
},
{
"path": "addon/io_scs_tools/internals/shaders/base.py",
"chars": 2032,
"preview": "# ##### BEGIN GPL LICENSE BLOCK #####\n#\n# This program is free software; you can redistribute it and/or\n# modify it unde"
},
{
"path": "addon/io_scs_tools/internals/shaders/eut2/__init__.py",
"chars": 7969,
"preview": "# ##### BEGIN GPL LICENSE BLOCK #####\n#\n# This program is free software; you can redistribute it and/or\n# modify it unde"
},
{
"path": "addon/io_scs_tools/internals/shaders/eut2/building/add_env_day.py",
"chars": 1820,
"preview": "# ##### BEGIN GPL LICENSE BLOCK #####\n#\n# This program is free software; you can redistribute it and/or\n# modify it unde"
},
{
"path": "addon/io_scs_tools/internals/shaders/eut2/building/day.py",
"chars": 1788,
"preview": "# ##### BEGIN GPL LICENSE BLOCK #####\n#\n# This program is free software; you can redistribute it and/or\n# modify it unde"
},
{
"path": "addon/io_scs_tools/internals/shaders/eut2/building/lvcol_day.py",
"chars": 1793,
"preview": "# ##### BEGIN GPL LICENSE BLOCK #####\n#\n# This program is free software; you can redistribute it and/or\n# modify it unde"
},
{
"path": "addon/io_scs_tools/internals/shaders/eut2/decalshadow/__init__.py",
"chars": 1347,
"preview": "# ##### BEGIN GPL LICENSE BLOCK #####\n#\n# This program is free software; you can redistribute it and/or\n# modify it unde"
},
{
"path": "addon/io_scs_tools/internals/shaders/eut2/dif/__init__.py",
"chars": 21444,
"preview": "# ##### BEGIN GPL LICENSE BLOCK #####\n#\n# This program is free software; you can redistribute it and/or\n# modify it unde"
},
{
"path": "addon/io_scs_tools/internals/shaders/eut2/dif_anim/__init__.py",
"chars": 13492,
"preview": "# ##### BEGIN GPL LICENSE BLOCK #####\n#\n# This program is free software; you can redistribute it and/or\n# modify it unde"
},
{
"path": "addon/io_scs_tools/internals/shaders/eut2/dif_anim/anim_blend_factor_ng.py",
"chars": 5145,
"preview": "# ##### BEGIN GPL LICENSE BLOCK #####\n#\n# This program is free software; you can redistribute it and/or\n# modify it unde"
},
{
"path": "addon/io_scs_tools/internals/shaders/eut2/dif_lum/__init__.py",
"chars": 8714,
"preview": "# ##### BEGIN GPL LICENSE BLOCK #####\n#\n# This program is free software; you can redistribute it and/or\n# modify it unde"
},
{
"path": "addon/io_scs_tools/internals/shaders/eut2/dif_lum_spec/__init__.py",
"chars": 8783,
"preview": "# ##### BEGIN GPL LICENSE BLOCK #####\n#\n# This program is free software; you can redistribute it and/or\n# modify it unde"
},
{
"path": "addon/io_scs_tools/internals/shaders/eut2/dif_spec/__init__.py",
"chars": 4136,
"preview": "# ##### BEGIN GPL LICENSE BLOCK #####\n#\n# This program is free software; you can redistribute it and/or\n# modify it unde"
},
{
"path": "addon/io_scs_tools/internals/shaders/eut2/dif_spec_add_env/__init__.py",
"chars": 2894,
"preview": "# ##### BEGIN GPL LICENSE BLOCK #####\n#\n# This program is free software; you can redistribute it and/or\n# modify it unde"
},
{
"path": "addon/io_scs_tools/internals/shaders/eut2/dif_spec_add_env/nofresnel.py",
"chars": 1931,
"preview": "# ##### BEGIN GPL LICENSE BLOCK #####\n#\n# This program is free software; you can redistribute it and/or\n# modify it unde"
},
{
"path": "addon/io_scs_tools/internals/shaders/eut2/dif_spec_fade_dif_spec/__init__.py",
"chars": 11131,
"preview": "# ##### BEGIN GPL LICENSE BLOCK #####\n#\n# This program is free software; you can redistribute it and/or\n# modify it unde"
},
{
"path": "addon/io_scs_tools/internals/shaders/eut2/dif_spec_fade_dif_spec/detail_nmap.py",
"chars": 11345,
"preview": "# ##### BEGIN GPL LICENSE BLOCK #####\n#\n# This program is free software; you can redistribute it and/or\n# modify it unde"
},
{
"path": "addon/io_scs_tools/internals/shaders/eut2/dif_spec_fade_dif_spec/detail_setup_ng.py",
"chars": 4718,
"preview": "# ##### BEGIN GPL LICENSE BLOCK #####\n#\n# This program is free software; you can redistribute it and/or\n# modify it unde"
},
{
"path": "addon/io_scs_tools/internals/shaders/eut2/dif_spec_mult_dif_spec/__init__.py",
"chars": 7120,
"preview": "# ##### BEGIN GPL LICENSE BLOCK #####\n#\n# This program is free software; you can redistribute it and/or\n# modify it unde"
},
{
"path": "addon/io_scs_tools/internals/shaders/eut2/dif_spec_mult_dif_spec/add_env.py",
"chars": 2215,
"preview": "# ##### BEGIN GPL LICENSE BLOCK #####\n#\n# This program is free software; you can redistribute it and/or\n# modify it unde"
},
{
"path": "addon/io_scs_tools/internals/shaders/eut2/dif_spec_mult_dif_spec_iamod_dif_spec/__init__.py",
"chars": 9285,
"preview": "# ##### BEGIN GPL LICENSE BLOCK #####\n#\n# This program is free software; you can redistribute it and/or\n# modify it unde"
},
{
"path": "addon/io_scs_tools/internals/shaders/eut2/dif_spec_oclu/__init__.py",
"chars": 5510,
"preview": "# ##### BEGIN GPL LICENSE BLOCK #####\n#\n# This program is free software; you can redistribute it and/or\n# modify it unde"
},
{
"path": "addon/io_scs_tools/internals/shaders/eut2/dif_spec_oclu_add_env/__init__.py",
"chars": 2141,
"preview": "# ##### BEGIN GPL LICENSE BLOCK #####\n#\n# This program is free software; you can redistribute it and/or\n# modify it unde"
},
{
"path": "addon/io_scs_tools/internals/shaders/eut2/dif_spec_oclu_weight_add_env/__init__.py",
"chars": 3226,
"preview": "# ##### BEGIN GPL LICENSE BLOCK #####\n#\n# This program is free software; you can redistribute it and/or\n# modify it unde"
},
{
"path": "addon/io_scs_tools/internals/shaders/eut2/dif_spec_over_dif_opac/__init__.py",
"chars": 6413,
"preview": "# ##### BEGIN GPL LICENSE BLOCK #####\n#\n# This program is free software; you can redistribute it and/or\n# modify it unde"
},
{
"path": "addon/io_scs_tools/internals/shaders/eut2/dif_spec_weight/__init__.py",
"chars": 2623,
"preview": "# ##### BEGIN GPL LICENSE BLOCK #####\n#\n# This program is free software; you can redistribute it and/or\n# modify it unde"
},
{
"path": "addon/io_scs_tools/internals/shaders/eut2/dif_spec_weight_add_env/__init__.py",
"chars": 2168,
"preview": "# ##### BEGIN GPL LICENSE BLOCK #####\n#\n# This program is free software; you can redistribute it and/or\n# modify it unde"
},
{
"path": "addon/io_scs_tools/internals/shaders/eut2/dif_spec_weight_mult2/__init__.py",
"chars": 8327,
"preview": "# ##### BEGIN GPL LICENSE BLOCK #####\n#\n# This program is free software; you can redistribute it and/or\n# modify it unde"
},
{
"path": "addon/io_scs_tools/internals/shaders/eut2/dif_spec_weight_mult2_weight2/__init__.py",
"chars": 15847,
"preview": "# ##### BEGIN GPL LICENSE BLOCK #####\n#\n# This program is free software; you can redistribute it and/or\n# modify it unde"
},
{
"path": "addon/io_scs_tools/internals/shaders/eut2/dif_spec_weight_weight_dif_spec_weight/__init__.py",
"chars": 11303,
"preview": "# ##### BEGIN GPL LICENSE BLOCK #####\n#\n# This program is free software; you can redistribute it and/or\n# modify it unde"
},
{
"path": "addon/io_scs_tools/internals/shaders/eut2/dif_weight_dif/__init__.py",
"chars": 9275,
"preview": "# ##### BEGIN GPL LICENSE BLOCK #####\n#\n# This program is free software; you can redistribute it and/or\n# modify it unde"
},
{
"path": "addon/io_scs_tools/internals/shaders/eut2/fakeshadow/__init__.py",
"chars": 3361,
"preview": "# ##### BEGIN GPL LICENSE BLOCK #####\n#\n# This program is free software; you can redistribute it and/or\n# modify it unde"
},
{
"path": "addon/io_scs_tools/internals/shaders/eut2/flare/__init__.py",
"chars": 1450,
"preview": "# ##### BEGIN GPL LICENSE BLOCK #####\n#\n# This program is free software; you can redistribute it and/or\n# modify it unde"
},
{
"path": "addon/io_scs_tools/internals/shaders/eut2/glass/__init__.py",
"chars": 23292,
"preview": "# ##### BEGIN GPL LICENSE BLOCK #####\n#\n# This program is free software; you can redistribute it and/or\n# modify it unde"
},
{
"path": "addon/io_scs_tools/internals/shaders/eut2/grass/__init__.py",
"chars": 2172,
"preview": "# ##### BEGIN GPL LICENSE BLOCK #####\n#\n# This program is free software; you can redistribute it and/or\n# modify it unde"
},
{
"path": "addon/io_scs_tools/internals/shaders/eut2/lamp/__init__.py",
"chars": 6474,
"preview": "# ##### BEGIN GPL LICENSE BLOCK #####\n#\n# This program is free software; you can redistribute it and/or\n# modify it unde"
},
{
"path": "addon/io_scs_tools/internals/shaders/eut2/lamp/add_env.py",
"chars": 1512,
"preview": "# ##### BEGIN GPL LICENSE BLOCK #####\n#\n# This program is free software; you can redistribute it and/or\n# modify it unde"
},
{
"path": "addon/io_scs_tools/internals/shaders/eut2/light_tex/__init__.py",
"chars": 6117,
"preview": "# ##### BEGIN GPL LICENSE BLOCK #####\n#\n# This program is free software; you can redistribute it and/or\n# modify it unde"
},
{
"path": "addon/io_scs_tools/internals/shaders/eut2/lightmap/night.py",
"chars": 1341,
"preview": "# ##### BEGIN GPL LICENSE BLOCK #####\n#\n# This program is free software; you can redistribute it and/or\n# modify it unde"
},
{
"path": "addon/io_scs_tools/internals/shaders/eut2/mlaaweight/__init__.py",
"chars": 1486,
"preview": "# ##### BEGIN GPL LICENSE BLOCK #####\n#\n# This program is free software; you can redistribute it and/or\n# modify it unde"
},
{
"path": "addon/io_scs_tools/internals/shaders/eut2/none/__init__.py",
"chars": 3020,
"preview": "# ##### BEGIN GPL LICENSE BLOCK #####\n#\n# This program is free software; you can redistribute it and/or\n# modify it unde"
},
{
"path": "addon/io_scs_tools/internals/shaders/eut2/parameters.py",
"chars": 3227,
"preview": "# ##### BEGIN GPL LICENSE BLOCK #####\n#\n# This program is free software; you can redistribute it and/or\n# modify it unde"
},
{
"path": "addon/io_scs_tools/internals/shaders/eut2/reflective/__init__.py",
"chars": 7839,
"preview": "# ##### BEGIN GPL LICENSE BLOCK #####\n#\n# This program is free software; you can redistribute it and/or\n# modify it unde"
},
{
"path": "addon/io_scs_tools/internals/shaders/eut2/retroreflective/__init__.py",
"chars": 3432,
"preview": "# ##### BEGIN GPL LICENSE BLOCK #####\n#\n# This program is free software; you can redistribute it and/or\n# modify it unde"
},
{
"path": "addon/io_scs_tools/internals/shaders/eut2/shadowmap/__init__.py",
"chars": 4772,
"preview": "# ##### BEGIN GPL LICENSE BLOCK #####\n#\n# This program is free software; you can redistribute it and/or\n# modify it unde"
},
{
"path": "addon/io_scs_tools/internals/shaders/eut2/shadowonly/__init__.py",
"chars": 2846,
"preview": "# ##### BEGIN GPL LICENSE BLOCK #####\n#\n# This program is free software; you can redistribute it and/or\n# modify it unde"
},
{
"path": "addon/io_scs_tools/internals/shaders/eut2/sign/__init__.py",
"chars": 1477,
"preview": "# ##### BEGIN GPL LICENSE BLOCK #####\n#\n# This program is free software; you can redistribute it and/or\n# modify it unde"
},
{
"path": "addon/io_scs_tools/internals/shaders/eut2/sky/__init__.py",
"chars": 24389,
"preview": "# ##### BEGIN GPL LICENSE BLOCK #####\n#\n# This program is free software; you can redistribute it and/or\n# modify it unde"
},
{
"path": "addon/io_scs_tools/internals/shaders/eut2/sky/texture_types.py",
"chars": 1155,
"preview": "# ##### BEGIN GPL LICENSE BLOCK #####\n#\n# This program is free software; you can redistribute it and/or\n# modify it unde"
},
{
"path": "addon/io_scs_tools/internals/shaders/eut2/sky/uv_rescale_ng.py",
"chars": 7424,
"preview": "# ##### BEGIN GPL LICENSE BLOCK #####\n#\n# This program is free software; you can redistribute it and/or\n# modify it unde"
},
{
"path": "addon/io_scs_tools/internals/shaders/eut2/std_node_groups/add_env_ng.py",
"chars": 11831,
"preview": "# ##### BEGIN GPL LICENSE BLOCK #####\n#\n# This program is free software; you can redistribute it and/or\n# modify it unde"
},
{
"path": "addon/io_scs_tools/internals/shaders/eut2/std_node_groups/alpha_remap_ng.py",
"chars": 2899,
"preview": "# ##### BEGIN GPL LICENSE BLOCK #####\n#\n# This program is free software; you can redistribute it and/or\n# modify it unde"
},
{
"path": "addon/io_scs_tools/internals/shaders/eut2/std_node_groups/compose_lighting_ng.py",
"chars": 7512,
"preview": "# ##### BEGIN GPL LICENSE BLOCK #####\n#\n# This program is free software; you can redistribute it and/or\n# modify it unde"
},
{
"path": "addon/io_scs_tools/internals/shaders/eut2/std_node_groups/fresnel_legacy_ng.py",
"chars": 3590,
"preview": "# ##### BEGIN GPL LICENSE BLOCK #####\n#\n# This program is free software; you can redistribute it and/or\n# modify it unde"
},
{
"path": "addon/io_scs_tools/internals/shaders/eut2/std_node_groups/fresnel_schlick_ng.py",
"chars": 4189,
"preview": "# ##### BEGIN GPL LICENSE BLOCK #####\n#\n# This program is free software; you can redistribute it and/or\n# modify it unde"
},
{
"path": "addon/io_scs_tools/internals/shaders/eut2/std_node_groups/lampmask_mixer_ng.py",
"chars": 24427,
"preview": "# ##### BEGIN GPL LICENSE BLOCK #####\n#\n# This program is free software; you can redistribute it and/or\n# modify it unde"
},
{
"path": "addon/io_scs_tools/internals/shaders/eut2/std_node_groups/lighting_evaluator_ng.py",
"chars": 14972,
"preview": "# ##### BEGIN GPL LICENSE BLOCK #####\n#\n# This program is free software; you can redistribute it and/or\n# modify it unde"
},
{
"path": "addon/io_scs_tools/internals/shaders/eut2/std_node_groups/linear_to_srgb_ng.py",
"chars": 5909,
"preview": "# ##### BEGIN GPL LICENSE BLOCK #####\n#\n# This program is free software; you can redistribute it and/or\n# modify it unde"
},
{
"path": "addon/io_scs_tools/internals/shaders/eut2/std_node_groups/mult2_mix_ng.py",
"chars": 4902,
"preview": "# ##### BEGIN GPL LICENSE BLOCK #####\n#\n# This program is free software; you can redistribute it and/or\n# modify it unde"
},
{
"path": "addon/io_scs_tools/internals/shaders/eut2/std_node_groups/refl_normal_ng.py",
"chars": 4116,
"preview": "# ##### BEGIN GPL LICENSE BLOCK #####\n#\n# This program is free software; you can redistribute it and/or\n# modify it unde"
},
{
"path": "addon/io_scs_tools/internals/shaders/eut2/std_node_groups/scs_uvs_combine_ng.py",
"chars": 3013,
"preview": "# ##### BEGIN GPL LICENSE BLOCK #####\n#\n# This program is free software; you can redistribute it and/or\n# modify it unde"
},
{
"path": "addon/io_scs_tools/internals/shaders/eut2/std_node_groups/scs_uvs_separate_ng.py",
"chars": 2993,
"preview": "# ##### BEGIN GPL LICENSE BLOCK #####\n#\n# This program is free software; you can redistribute it and/or\n# modify it unde"
},
{
"path": "addon/io_scs_tools/internals/shaders/eut2/std_node_groups/vcolor_input_ng.py",
"chars": 5784,
"preview": "# ##### BEGIN GPL LICENSE BLOCK #####\n#\n# This program is free software; you can redistribute it and/or\n# modify it unde"
},
{
"path": "addon/io_scs_tools/internals/shaders/eut2/std_passes/add_env.py",
"chars": 7231,
"preview": "# ##### BEGIN GPL LICENSE BLOCK #####\n#\n# This program is free software; you can redistribute it and/or\n# modify it unde"
},
{
"path": "addon/io_scs_tools/internals/shaders/eut2/std_passes/lum.py",
"chars": 6955,
"preview": "# ##### BEGIN GPL LICENSE BLOCK #####\n#\n# This program is free software; you can redistribute it and/or\n# modify it unde"
},
{
"path": "addon/io_scs_tools/internals/shaders/eut2/truckpaint/__init__.py",
"chars": 19434,
"preview": "# ##### BEGIN GPL LICENSE BLOCK #####\n#\n# This program is free software; you can redistribute it and/or\n# modify it unde"
},
{
"path": "addon/io_scs_tools/internals/shaders/eut2/truckpaint/airbrush.py",
"chars": 1818,
"preview": "# ##### BEGIN GPL LICENSE BLOCK #####\n#\n# This program is free software; you can redistribute it and/or\n# modify it unde"
},
{
"path": "addon/io_scs_tools/internals/shaders/eut2/truckpaint/colormask.py",
"chars": 1819,
"preview": "# ##### BEGIN GPL LICENSE BLOCK #####\n#\n# This program is free software; you can redistribute it and/or\n# modify it unde"
},
{
"path": "addon/io_scs_tools/internals/shaders/eut2/unlit_tex/__init__.py",
"chars": 12791,
"preview": "# ##### BEGIN GPL LICENSE BLOCK #####\n#\n# This program is free software; you can redistribute it and/or\n# modify it unde"
},
{
"path": "addon/io_scs_tools/internals/shaders/eut2/unlit_vcol_tex/__init__.py",
"chars": 21561,
"preview": "# ##### BEGIN GPL LICENSE BLOCK #####\n#\n# This program is free software; you can redistribute it and/or\n# modify it unde"
},
{
"path": "addon/io_scs_tools/internals/shaders/eut2/water/__init__.py",
"chars": 19324,
"preview": "# ##### BEGIN GPL LICENSE BLOCK #####\n#\n# This program is free software; you can redistribute it and/or\n# modify it unde"
},
{
"path": "addon/io_scs_tools/internals/shaders/eut2/water/mix_factor_ng.py",
"chars": 4956,
"preview": "# ##### BEGIN GPL LICENSE BLOCK #####\n#\n# This program is free software; you can redistribute it and/or\n# modify it unde"
},
{
"path": "addon/io_scs_tools/internals/shaders/eut2/water/water_stream_ng.py",
"chars": 5240,
"preview": "# ##### BEGIN GPL LICENSE BLOCK #####\n#\n# This program is free software; you can redistribute it and/or\n# modify it unde"
},
{
"path": "addon/io_scs_tools/internals/shaders/eut2/window/lit.py",
"chars": 8701,
"preview": "# ##### BEGIN GPL LICENSE BLOCK #####\n#\n# This program is free software; you can redistribute it and/or\n# modify it unde"
},
{
"path": "addon/io_scs_tools/internals/shaders/eut2/window/window_final_uv_ng.py",
"chars": 3627,
"preview": "# ##### BEGIN GPL LICENSE BLOCK #####\n#\n# This program is free software; you can redistribute it and/or\n# modify it unde"
},
{
"path": "addon/io_scs_tools/internals/shaders/eut2/window/window_offset_factor_ng.py",
"chars": 4440,
"preview": "# ##### BEGIN GPL LICENSE BLOCK #####\n#\n# This program is free software; you can redistribute it and/or\n# modify it unde"
},
{
"path": "addon/io_scs_tools/internals/shaders/eut2/window/window_uv_offset_ng.py",
"chars": 11297,
"preview": "# ##### BEGIN GPL LICENSE BLOCK #####\n#\n# This program is free software; you can redistribute it and/or\n# modify it unde"
},
{
"path": "addon/io_scs_tools/internals/shaders/flavors/alpha_test.py",
"chars": 3487,
"preview": "# ##### BEGIN GPL LICENSE BLOCK #####\n#\n# This program is free software; you can redistribute it and/or\n# modify it unde"
},
{
"path": "addon/io_scs_tools/internals/shaders/flavors/asafew.py",
"chars": 2337,
"preview": "# ##### BEGIN GPL LICENSE BLOCK #####\n#\n# This program is free software; you can redistribute it and/or\n# modify it unde"
},
{
"path": "addon/io_scs_tools/internals/shaders/flavors/awhite.py",
"chars": 3737,
"preview": "# ##### BEGIN GPL LICENSE BLOCK #####\n#\n# This program is free software; you can redistribute it and/or\n# modify it unde"
},
{
"path": "addon/io_scs_tools/internals/shaders/flavors/blend_add.py",
"chars": 2792,
"preview": "# ##### BEGIN GPL LICENSE BLOCK #####\n#\n# This program is free software; you can redistribute it and/or\n# modify it unde"
},
{
"path": "addon/io_scs_tools/internals/shaders/flavors/blend_mult.py",
"chars": 2825,
"preview": "# ##### BEGIN GPL LICENSE BLOCK #####\n#\n# This program is free software; you can redistribute it and/or\n# modify it unde"
},
{
"path": "addon/io_scs_tools/internals/shaders/flavors/blend_over.py",
"chars": 1809,
"preview": "# ##### BEGIN GPL LICENSE BLOCK #####\n#\n# This program is free software; you can redistribute it and/or\n# modify it unde"
},
{
"path": "addon/io_scs_tools/internals/shaders/flavors/fadesheet/__init__.py",
"chars": 6089,
"preview": "# ##### BEGIN GPL LICENSE BLOCK #####\n#\n# This program is free software; you can redistribute it and/or\n# modify it unde"
},
{
"path": "addon/io_scs_tools/internals/shaders/flavors/fadesheet/fadesheet_compute_ng.py",
"chars": 6765,
"preview": "# ##### BEGIN GPL LICENSE BLOCK #####\n#\n# This program is free software; you can redistribute it and/or\n# modify it unde"
},
{
"path": "addon/io_scs_tools/internals/shaders/flavors/flipsheet/__init__.py",
"chars": 5424,
"preview": "# ##### BEGIN GPL LICENSE BLOCK #####\n#\n# This program is free software; you can redistribute it and/or\n# modify it unde"
},
{
"path": "addon/io_scs_tools/internals/shaders/flavors/flipsheet/flipsheet_compute_ng.py",
"chars": 5721,
"preview": "# ##### BEGIN GPL LICENSE BLOCK #####\n#\n# This program is free software; you can redistribute it and/or\n# modify it unde"
},
{
"path": "addon/io_scs_tools/internals/shaders/flavors/nmap/__init__.py",
"chars": 9693,
"preview": "# ##### BEGIN GPL LICENSE BLOCK #####\n#\n# This program is free software; you can redistribute it and/or\n# modify it unde"
},
{
"path": "addon/io_scs_tools/internals/shaders/flavors/nmap/dds16_ng.py",
"chars": 4843,
"preview": "# ##### BEGIN GPL LICENSE BLOCK #####\n#\n# This program is free software; you can redistribute it and/or\n# modify it unde"
},
{
"path": "addon/io_scs_tools/internals/shaders/flavors/nmap/scale_ng.py",
"chars": 6694,
"preview": "# ##### BEGIN GPL LICENSE BLOCK #####\n#\n# This program is free software; you can redistribute it and/or\n# modify it unde"
},
{
"path": "addon/io_scs_tools/internals/shaders/flavors/paint.py",
"chars": 4255,
"preview": "# ##### BEGIN GPL LICENSE BLOCK #####\n#\n# This program is free software; you can redistribute it and/or\n# modify it unde"
}
]
// ... and 1253 more files (download for full content)
About this extraction
This page contains the full source code of the SCSSoftware/BlenderTools GitHub repository, extracted and formatted as plain text for AI agents and large language models (LLMs). The extraction includes 1453 files (55.9 MB), approximately 14.7M tokens, and a symbol index with 2600 extracted functions, classes, methods, constants, and types. Use this with OpenClaw, Claude, ChatGPT, Cursor, Windsurf, or any other AI tool that accepts text input. You can copy the full output to your clipboard or download it as a .txt file.
Extracted by GitExtract — free GitHub repo to text converter for AI. Built by Nikandr Surkov.