├── screenshots ├── .gdignore ├── icon196x196.png ├── screenshot1.png └── screenshot2.png ├── icon.png ├── assets └── 3d_car_customizable │ ├── assets │ ├── Body.material │ ├── Rims.material │ ├── car_model.glb │ ├── Fenders.material │ ├── Tires.material │ ├── Windows.material │ ├── Headlights.material │ ├── TailLights.material │ ├── AroundTailLights.material │ └── car_model.glb.import │ ├── car.tscn │ ├── scripts │ ├── car.gd │ ├── wheelsettings.gd │ └── settings.gd │ └── scenes │ ├── wheelsettings.tscn │ └── settings.tscn ├── .gitignore ├── README.md └── LICENSE.md /screenshots/.gdignore: -------------------------------------------------------------------------------- 1 | -------------------------------------------------------------------------------- /icon.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/BeytoA/3D-Car-With-Settingspanel/HEAD/icon.png -------------------------------------------------------------------------------- /screenshots/icon196x196.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/BeytoA/3D-Car-With-Settingspanel/HEAD/screenshots/icon196x196.png -------------------------------------------------------------------------------- /screenshots/screenshot1.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/BeytoA/3D-Car-With-Settingspanel/HEAD/screenshots/screenshot1.png -------------------------------------------------------------------------------- /screenshots/screenshot2.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/BeytoA/3D-Car-With-Settingspanel/HEAD/screenshots/screenshot2.png -------------------------------------------------------------------------------- /assets/3d_car_customizable/assets/Body.material: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/BeytoA/3D-Car-With-Settingspanel/HEAD/assets/3d_car_customizable/assets/Body.material -------------------------------------------------------------------------------- /assets/3d_car_customizable/assets/Rims.material: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/BeytoA/3D-Car-With-Settingspanel/HEAD/assets/3d_car_customizable/assets/Rims.material -------------------------------------------------------------------------------- /assets/3d_car_customizable/assets/car_model.glb: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/BeytoA/3D-Car-With-Settingspanel/HEAD/assets/3d_car_customizable/assets/car_model.glb -------------------------------------------------------------------------------- /assets/3d_car_customizable/assets/Fenders.material: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/BeytoA/3D-Car-With-Settingspanel/HEAD/assets/3d_car_customizable/assets/Fenders.material -------------------------------------------------------------------------------- /assets/3d_car_customizable/assets/Tires.material: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/BeytoA/3D-Car-With-Settingspanel/HEAD/assets/3d_car_customizable/assets/Tires.material -------------------------------------------------------------------------------- /assets/3d_car_customizable/assets/Windows.material: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/BeytoA/3D-Car-With-Settingspanel/HEAD/assets/3d_car_customizable/assets/Windows.material -------------------------------------------------------------------------------- /assets/3d_car_customizable/assets/Headlights.material: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/BeytoA/3D-Car-With-Settingspanel/HEAD/assets/3d_car_customizable/assets/Headlights.material -------------------------------------------------------------------------------- /assets/3d_car_customizable/assets/TailLights.material: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/BeytoA/3D-Car-With-Settingspanel/HEAD/assets/3d_car_customizable/assets/TailLights.material -------------------------------------------------------------------------------- /assets/3d_car_customizable/assets/AroundTailLights.material: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/BeytoA/3D-Car-With-Settingspanel/HEAD/assets/3d_car_customizable/assets/AroundTailLights.material -------------------------------------------------------------------------------- /.gitignore: -------------------------------------------------------------------------------- 1 | 2 | # Godot-specific ignores 3 | .import/ 4 | 5 | # Imported translations (automatically generated from CSV files) 6 | *.translation 7 | 8 | # Mono-specific ignores 9 | .mono/ 10 | data_*/ 11 | mono_crash.*.json 12 | 13 | # System/tool-specific ignores 14 | .directory 15 | *~ 16 | 17 | /screenshots 18 | default_env.tres 19 | icon.png 20 | icon.png.import 21 | LICENSE.md 22 | project.godot 23 | README.md 24 | -------------------------------------------------------------------------------- /assets/3d_car_customizable/car.tscn: -------------------------------------------------------------------------------- 1 | [gd_scene load_steps=4 format=2] 2 | 3 | [ext_resource path="res://assets/3d_car_customizable/assets/car_model.glb" type="PackedScene" id=1] 4 | [ext_resource path="res://assets/3d_car_customizable/scripts/car.gd" type="Script" id=2] 5 | 6 | [sub_resource type="BoxShape" id=1] 7 | extents = Vector3( 0.9, 0.64, 2.17 ) 8 | 9 | [node name="Car" index="0" instance=ExtResource( 1 )] 10 | mass = 81.6327 11 | can_sleep = false 12 | script = ExtResource( 2 ) 13 | 14 | [node name="rear_left" parent="." index="1"] 15 | editor/display_folded = true 16 | use_as_steering = true 17 | wheel_radius = 0.32 18 | wheel_friction_slip = 5.0 19 | suspension_travel = 1.0 20 | suspension_stiffness = 35.0 21 | suspension_max_force = 800.0 22 | 23 | [node name="rear_right" parent="." index="2"] 24 | editor/display_folded = true 25 | use_as_steering = true 26 | wheel_radius = 0.32 27 | wheel_friction_slip = 5.0 28 | suspension_travel = 1.0 29 | suspension_stiffness = 35.0 30 | suspension_max_force = 800.0 31 | 32 | [node name="front_right" parent="." index="3"] 33 | editor/display_folded = true 34 | use_as_traction = true 35 | wheel_radius = 0.32 36 | wheel_friction_slip = 5.0 37 | suspension_travel = 1.0 38 | suspension_stiffness = 35.0 39 | suspension_max_force = 800.0 40 | 41 | [node name="front_left" parent="." index="4"] 42 | editor/display_folded = true 43 | use_as_traction = true 44 | wheel_radius = 0.32 45 | wheel_friction_slip = 5.0 46 | suspension_travel = 1.0 47 | suspension_stiffness = 35.0 48 | suspension_max_force = 800.0 49 | 50 | [node name="CollisionShape" type="CollisionShape" parent="." index="5"] 51 | transform = Transform( 1, 0, 0, 0, 1, 0, 0, 0, 1, 0, 0, -0.24 ) 52 | shape = SubResource( 1 ) 53 | -------------------------------------------------------------------------------- /README.md: -------------------------------------------------------------------------------- 1 | ![Asset Thumbnail](screenshots/icon196x196.png?raw=true) 2 | # 3D Car with Settingspanel 3 | 4 | This asset contains a driveable car which you can directly use in your project. All you need to do is to drag and drop the `car.tscn` file into your scene. Once you are done, you could press **`ESC`** to open the `SettingsPanel` to adjust the `VehicleBody` and all the `Wheel` nodes individually. Main focus of this asset is to make a quick start with cars in Godot and save all the vehicle settings you have made for later use. This can be done by the built-in preset system in this asset. 5 | 6 | ## Getting Started 7 | 8 | The car scene is created for common use with a `VehicleBody` as a top node. The body consists a single mesh including the mainframe, windows and lights. For the best performance, `CollisionShape` is a `BoxShape` with approximate size of the body mesh. 9 | 10 | ### How to use 11 | You need to copy the `3d_car_customizable` folder into your project. You are now ready to go. Simply instance the `car.tscn` scene to where you need it and start the project. 12 | 13 | ![Screenshot](screenshots/screenshot2.png?raw=true) 14 | 15 | Simply control the car with the arrow keys and press **`ESC`** to open the `Settingspanel`. Here, you can adjust several settings of the car. `ScriptVariables` and `VehicleBody` are general car settings. After them, you can see `rear_left`, `rear_right`, `front_right` and `front_left` labels presenting each `Wheel` node. Sliders apply the values immediately on the car. You can save these settings by pressing on the `Save Preset` button at the top of the panel. A preset name should be written in the `LineEdit` next to the button. 16 | 17 | A preset is located in the `user://3d_car_customizable/` folder. All the presets in this folder are listed in the `Preset List` on launch. The first preset on this list will be loaded automatically when the node enters the tree. 18 | 19 | #### Asset Settings 20 | 21 | - [x] `Use Camera` attaches a camera on the hood. 22 | - [x] `Use Controls` lets you control the car with arrow keys. 23 | - [x] `Show Settings` will show Settingspanel when **`ESC`** is pressed. *Does not disable preset system* 24 | 25 | ### Car Model 26 | ![Car Model](screenshots/screenshot1.png?raw=true) 27 | 28 | I have modeled a car with Blender for this tutorial. You have the full rights of the car model. If you would like to model your own, it is really easy I would say. Just follow [CGGeek's Low Poly Vehicle Modeling Tutorial here](https://www.youtube.com/watch?v=Zkg7Ol2jEjs). 29 | 30 | ## Features 31 | * Fully working car 32 | * Can be controlled with keyboard (`ui` keymaps) 33 | * A camera placed on the hood 34 | * Turn the camera with mouse movements 35 | * Decent `VehicleBody` and `Wheel` properties applied 36 | * Settingspanel for tuning the car 37 | * **Built-in preset system** 38 | * Bind wheelsettings to each other 39 | * Load first preset on the list automatically on launch 40 | 41 | ## Known Issues 42 | If you instance 2 cars in a single scene and you want to switch between them, you need to code it yourself to control the cars independently. 43 | The idea was to place the camera at the back of the car like the most racing games. I have come across some problems where I was forced to place the camera on the hood. 44 | You can not disable preset system. It will load the first preset on launch if there is one. 45 | 46 | ## Contributing 47 | You are free to make suggestions on this asset. I would love to impletement new features, improve the current ones and make the code more organized. 48 | 49 | ## Licence 50 | This asset is licenced under the CC0 1.0 Universal (CC0 1.0) Public Domain Dedication - see the [LICENSE.md](LICENSE.md) file for details. You could simply use this asset in your projects and not mention anyone or anything. It is completely free to use/change/sell. 51 | -------------------------------------------------------------------------------- /assets/3d_car_customizable/scripts/car.gd: -------------------------------------------------------------------------------- 1 | extends VehicleBody 2 | 3 | var SettingspanelPath = preload("../scenes/settings.tscn") 4 | var mouseDelta = Vector2() 5 | 6 | # Camera variables 7 | 8 | export(bool) var use_camera = true 9 | var lookSensitivity = 0.1 10 | var minLookAngle = -130.0 11 | var maxLookAngle = 25.0 12 | var followCameraAngle = 20 13 | var camera_onoff = true 14 | var cameraTimerSecond = 2 15 | onready var cameraTimer = 0 16 | var cameraOrbit 17 | var followCameraY = 0 18 | 19 | # Car variables 20 | 21 | export(bool) var use_controls = true 22 | export(bool) var show_settings = true 23 | # These become just placeholders if presets are in use 24 | var MAX_ENGINE_FORCE = 100.0 25 | var MAX_BRAKE = 5.0 26 | var MAX_STEERING = 0.5 27 | var STEERING_SPEED = 7 28 | 29 | ################################################ 30 | ################## Car Script ################## 31 | ################################################ 32 | 33 | func _ready(): 34 | # A camera node is attached if `Use Camera is checked 35 | if(use_camera): 36 | cameraOrbit = Spatial.new() 37 | var aCameraNode : Camera = Camera.new() 38 | aCameraNode.translate(Vector3(0, 0, 0)) 39 | aCameraNode.rotation_degrees.y = 180 40 | # You can change the camera position here 41 | # It is currently placed on the hood 42 | cameraOrbit.translate(Vector3(0, 0.6, 0.4)) 43 | cameraOrbit.add_child(aCameraNode) 44 | add_child(cameraOrbit) 45 | 46 | # When the scene starts, the mouse disappeares 47 | Input.set_mouse_mode(Input.MOUSE_MODE_CAPTURED) 48 | 49 | # ..and the Settingspanel gets instanced 50 | var SettingsPanel = SettingspanelPath.instance() 51 | SettingsPanel.visible = false 52 | SettingsPanel.CarNode = self 53 | call_deferred("add_child", SettingsPanel) 54 | 55 | func _physics_process(delta): 56 | # This variable turns the camera when the car turns 57 | followCameraY = 0 58 | # If user wants to control the car 59 | if(!use_controls): 60 | return 61 | var steer_val = 0.0 62 | var throttle_val = 0.0 63 | var brake_val = 0.0 64 | 65 | if Input.is_action_pressed("ui_up"): 66 | throttle_val = 1.0 67 | if Input.is_action_pressed("ui_down"): 68 | throttle_val = -0.5 69 | if Input.is_action_pressed("ui_select"): 70 | brake_val = 1.0 71 | if Input.is_action_pressed("ui_left"): 72 | steer_val = 1.0 73 | if(use_camera): followCameraY = 10 74 | if Input.is_action_pressed("ui_right"): 75 | steer_val = -1.0 76 | if(use_camera): followCameraY = -10 77 | 78 | if Input.is_action_just_pressed("ui_cancel"): 79 | # Show or hide the Settingspanel with pressing ESC 80 | if (show_settings): 81 | if(get_node("Settings").visible): 82 | get_node("Settings").visible = false 83 | camera_onoff = !camera_onoff 84 | else: 85 | get_node("Settings").visible = true 86 | camera_onoff = !camera_onoff 87 | # Show/hide the mouse with pressing ESC if there is a camera attached to the car 88 | if (use_camera): 89 | if(Input.get_mouse_mode() == Input.MOUSE_MODE_VISIBLE): 90 | Input.set_mouse_mode(Input.MOUSE_MODE_CAPTURED) 91 | else: 92 | Input.set_mouse_mode(Input.MOUSE_MODE_VISIBLE) 93 | 94 | engine_force = throttle_val * MAX_ENGINE_FORCE 95 | brake = brake_val * MAX_BRAKE 96 | 97 | # Using lerp for a smooth steering 98 | steering = lerp(steering, steer_val * MAX_STEERING, STEERING_SPEED * delta) 99 | 100 | ################################################ 101 | ################# Camera Script ################ 102 | ################################################ 103 | 104 | func _input(event): 105 | if event is InputEventMouseMotion: 106 | mouseDelta = event.relative 107 | 108 | func _process(delta): 109 | # If user wants to use the car camera 110 | if(!use_camera || !use_controls): 111 | return 112 | 113 | var rot = Vector3(mouseDelta.y, mouseDelta.x, 0) * lookSensitivity 114 | 115 | # Checking if the Settingspanel is active or not 116 | if(camera_onoff): 117 | # If the mouse is moving then camera turns around the car 118 | if(mouseDelta != Vector2()): 119 | cameraOrbit.rotation_degrees.x = clamp(cameraOrbit.rotation_degrees.x, minLookAngle, maxLookAngle) 120 | cameraOrbit.rotation_degrees.x -= rot.x 121 | cameraOrbit.rotation_degrees.y -= rot.y 122 | 123 | # ..and the timer gets activated so that the 124 | # camera doesn't follow the car for the duration of the timer 125 | cameraTimer = cameraTimerSecond 126 | 127 | if(cameraTimer > 0): 128 | cameraTimer -= delta 129 | else: 130 | 131 | # If the timer is up / mouse did not move for the duration of the timer 132 | # The camera smoothly moves to the follow position 133 | cameraOrbit.rotation_degrees.x = lerp(cameraOrbit.rotation_degrees.x, followCameraAngle, delta * 10) 134 | cameraOrbit.rotation_degrees.y = lerp(cameraOrbit.rotation_degrees.y, followCameraY, delta * 10) 135 | 136 | # Recorded mouse positions are being deleted 137 | # so that we can capture the next movement 138 | mouseDelta = Vector2() 139 | -------------------------------------------------------------------------------- /LICENSE.md: -------------------------------------------------------------------------------- 1 | [Visit the website](https://creativecommons.org/publicdomain/zero/1.0/) 2 | ---------------------------- 3 | CC0 1.0 Universal (CC0 1.0) 4 | Public Domain Dedication 5 | ---------------------------- 6 | 7 | ## Statement of Purpose 8 | 9 | The laws of most jurisdictions throughout the world automatically confer exclusive Copyright and Related Rights (defined below) upon the creator and subsequent owner(s) (each and all, an "owner") of an original work of authorship and/or a database (each, a "Work"). 10 | 11 | Certain owners wish to permanently relinquish those rights to a Work for the purpose of contributing to a commons of creative, cultural and scientific works ("Commons") that the public can reliably and without fear of later claims of infringement build upon, modify, incorporate in other works, reuse and redistribute as freely as possible in any form whatsoever and for any purposes, including without limitation commercial purposes. These owners may contribute to the Commons to promote the ideal of a free culture and the further production of creative, cultural and scientific works, or to gain reputation or greater distribution for their Work in part through the use and efforts of others. 12 | 13 | For these and/or other purposes and motivations, and without any expectation of additional consideration or compensation, the person associating CC0 with a Work (the "Affirmer"), to the extent that he or she is an owner of Copyright and Related Rights in the Work, voluntarily elects to apply CC0 to the Work and publicly distribute the Work under its terms, with knowledge of his or her Copyright and Related Rights in the Work and the meaning and intended legal effect of CC0 on those rights. 14 | 15 | **1. Copyright and Related Rights.** A Work made available under CC0 may be protected by copyright and related or neighboring rights ("Copyright and Related Rights"). Copyright and Related Rights include, but are not limited to, the following: 16 | - the right to reproduce, adapt, distribute, perform, display, communicate, and translate a Work; 17 | - moral rights retained by the original author(s) and/or performer(s); 18 | - publicity and privacy rights pertaining to a person's image or likeness depicted in a Work; 19 | - rights protecting against unfair competition in regards to a Work, subject to the limitations in paragraph 4(a), below; 20 | - rights protecting the extraction, dissemination, use and reuse of data in a Work; 21 | - database rights (such as those arising under Directive 96/9/EC of the European Parliament and of the Council of 11 March 1996 on the legal protection of databases, and under any national implementation thereof, including any amended or successor version of such directive); and 22 | - other similar, equivalent or corresponding rights throughout the world based on applicable law or treaty, and any national implementations thereof. 23 | 24 | **2. Waiver.** To the greatest extent permitted by, but not in contravention of, applicable law, Affirmer hereby overtly, fully, permanently, irrevocably and unconditionally waives, abandons, and surrenders all of Affirmer's Copyright and Related Rights and associated claims and causes of action, whether now known or unknown (including existing as well as future claims and causes of action), in the Work (i) in all territories worldwide, (ii) for the maximum duration provided by applicable law or treaty (including future time extensions), (iii) in any current or future medium and for any number of copies, and (iv) for any purpose whatsoever, including without limitation commercial, advertising or promotional purposes (the "Waiver"). Affirmer makes the Waiver for the benefit of each member of the public at large and to the detriment of Affirmer's heirs and successors, fully intending that such Waiver shall not be subject to revocation, rescission, cancellation, termination, or any other legal or equitable action to disrupt the quiet enjoyment of the Work by the public as contemplated by Affirmer's express Statement of Purpose. 25 | 26 | **3. Public License Fallback.** Should any part of the Waiver for any reason be judged legally invalid or ineffective under applicable law, then the Waiver shall be preserved to the maximum extent permitted taking into account Affirmer's express Statement of Purpose. In addition, to the extent the Waiver is so judged Affirmer hereby grants to each affected person a royalty-free, non transferable, non sublicensable, non exclusive, irrevocable and unconditional license to exercise Affirmer's Copyright and Related Rights in the Work (i) in all territories worldwide, (ii) for the maximum duration provided by applicable law or treaty (including future time extensions), (iii) in any current or future medium and for any number of copies, and (iv) for any purpose whatsoever, including without limitation commercial, advertising or promotional purposes (the "License"). The License shall be deemed effective as of the date CC0 was applied by Affirmer to the Work. Should any part of the License for any reason be judged legally invalid or ineffective under applicable law, such partial invalidity or ineffectiveness shall not invalidate the remainder of the License, and in such case Affirmer hereby affirms that he or she will not (i) exercise any of his or her remaining Copyright and Related Rights in the Work or (ii) assert any associated claims and causes of action with respect to the Work, in either case contrary to Affirmer's express Statement of Purpose. 27 | 28 | **4. Limitations and Disclaimers.** 29 | * No trademark or patent rights held by Affirmer are waived, abandoned, surrendered, licensed or otherwise affected by this document. 30 | * Affirmer offers the Work as-is and makes no representations or warranties of any kind concerning the Work, express, implied, statutory or otherwise, including without limitation warranties of title, merchantability, fitness for a particular purpose, non infringement, or the absence of latent or other defects, accuracy, or the present or absence of errors, whether or not discoverable, all to the greatest extent permissible under applicable law. 31 | * Affirmer disclaims responsibility for clearing rights of other persons that may apply to the Work or any use thereof, including without limitation any person's Copyright and Related Rights in the Work. Further, Affirmer disclaims responsibility for obtaining any necessary consents, permissions or other rights required for any use of the Work. 32 | * Affirmer understands and acknowledges that Creative Commons is not a party to this document and has no duty or obligation with respect to this CC0 or use of the Work. 33 | -------------------------------------------------------------------------------- /assets/3d_car_customizable/scripts/wheelsettings.gd: -------------------------------------------------------------------------------- 1 | extends VBoxContainer 2 | 3 | # The dictionary that contains binded Wheel nodes 4 | var WheelNode : Dictionary setget _set_wheel 5 | 6 | var BindedTarget 7 | 8 | func _ready(): 9 | # Apply all values passed from the Settingspanel when being instanced 10 | _on_UseAsTraction_pressed() 11 | _on_UseAsSteering_pressed() 12 | _on_WheelRollInfluence_value_changed(get_node("Wheel/RollInfluence/WheelRollInfluence").value) 13 | _on_WheelRadius_value_changed(get_node("Wheel/WheelRadius/WheelRadius").value) 14 | _on_WheelRestLength_value_changed(get_node("Wheel/RestLength/WheelRestLength").value) 15 | _on_WheelFrictionSlip_value_changed(get_node("Wheel/FrictionSlip/WheelFrictionSlip").value) 16 | _on_SuspensionTravel_value_changed(get_node("Suspension/Travel/SuspensionTravel").value) 17 | _on_SuspensionStiffness_value_changed(get_node("Suspension/Stiffness/SuspensionStiffness").value) 18 | _on_SuspensionMaxForce_value_changed(get_node("Suspension/MaxForce/SuspensionMaxForce").value) 19 | _on_DampingCompression_value_changed(get_node("Damping/Compression/DampingCompression").value) 20 | _on_DampingRelaxation_value_changed(get_node("Damping/Relaxation/DampingRelaxation").value) 21 | 22 | func _set_wheel(value): 23 | WheelNode = value 24 | 25 | func _on_UseAsTraction_pressed(): 26 | for Wheel in WheelNode: WheelNode[Wheel].use_as_traction = get_node("General/UseAsTraction").is_pressed() 27 | 28 | func _on_UseAsSteering_pressed(): 29 | for Wheel in WheelNode: WheelNode[Wheel].use_as_steering = get_node("General/UseAsSteering").is_pressed() 30 | 31 | func _on_WheelRollInfluence_value_changed(value): 32 | get_node("Wheel/RollInfluenceText").text = "Roll Influence = (" + str(value) + ")" 33 | for Wheel in WheelNode: WheelNode[Wheel].wheel_roll_influence = value 34 | 35 | func _on_WheelRadius_value_changed(value): 36 | get_node("Wheel/WheelRadiusText").text = "Radius = (" + str(value) + ")" 37 | for Wheel in WheelNode: WheelNode[Wheel].wheel_radius = value 38 | 39 | func _on_WheelRestLength_value_changed(value): 40 | get_node("Wheel/RestLengthText").text = "Rest Length = (" + str(value) + ")" 41 | for Wheel in WheelNode: WheelNode[Wheel].wheel_rest_length = value 42 | 43 | func _on_WheelFrictionSlip_value_changed(value): 44 | get_node("Wheel/FrictionSlipText").text = "Friction Slip = (" + str(value) + ")" 45 | for Wheel in WheelNode: WheelNode[Wheel].wheel_friction_slip = value 46 | 47 | func _on_SuspensionTravel_value_changed(value): 48 | get_node("Suspension/TravelText").text = "Travel = (" + str(value) + ")" 49 | for Wheel in WheelNode: WheelNode[Wheel].suspension_travel = value 50 | 51 | func _on_SuspensionStiffness_value_changed(value): 52 | get_node("Suspension/StiffnessText").text = "Stiffness = (" + str(value) + ")" 53 | if(get_node("Suspension/Stiffness/SuspensionStiffness").value != value): get_node("Suspension/Stiffness/SuspensionStiffness").value = value 54 | if(get_node("Suspension/Stiffness/SuspensionStiffnessBox").value != value): get_node("Suspension/Stiffness/SuspensionStiffnessBox").value = value 55 | for Wheel in WheelNode: WheelNode[Wheel].suspension_stiffness = value 56 | 57 | func _on_SuspensionMaxForce_value_changed(value): 58 | get_node("Suspension/MaxForceText").text = "Max Force = (" + str(value) + ")" 59 | if(get_node("Suspension/MaxForce/SuspensionMaxForce").value != value): get_node("Suspension/MaxForce/SuspensionMaxForce").value = value 60 | if(get_node("Suspension/MaxForce/SuspensionMaxForceBox").value != value): get_node("Suspension/MaxForce/SuspensionMaxForceBox").value = value 61 | for Wheel in WheelNode: WheelNode[Wheel].suspension_max_force = value 62 | 63 | func _on_DampingCompression_value_changed(value): 64 | get_node("Damping/CompressionText").text = "Compression = (" + str(value) + ")" 65 | for Wheel in WheelNode: WheelNode[Wheel].damping_compression = value 66 | 67 | func _on_DampingRelaxation_value_changed(value): 68 | get_node("Damping/RelaxationText").text = "Relaxation = (" + str(value) + ")" 69 | for Wheel in WheelNode: WheelNode[Wheel].damping_relaxation = value 70 | 71 | func DisableAllNodes(ParentNode): 72 | for ChildNode in ParentNode.get_children(): 73 | if ChildNode.get_child_count() > 0: 74 | DisableAllNodes(ChildNode) 75 | if(ChildNode is HSlider): ChildNode.editable = !ChildNode.editable 76 | if(ChildNode is SpinBox): ChildNode.editable = !ChildNode.editable 77 | if(ChildNode is CheckBox): ChildNode.disabled = !ChildNode.disabled 78 | 79 | func _on_BindedTo_item_selected(ID): 80 | if(ID != 0): 81 | #If the wheel is binded to another one 82 | 83 | #Unhide all items 84 | DisableAllNodes(self) 85 | for child in get_children(): 86 | child.visible = false 87 | if(child.name == "Binding" || child.name == "SettingsTitle"): child.visible = true 88 | 89 | #Add this wheel to the target node 90 | if(BindedTarget != null): 91 | var get_WheelNode = get_parent().get_node(get_node("Binding/BindedTo").get_item_text(BindedTarget)).get("WheelNode") 92 | get_WheelNode.erase(get_node("SettingsTitle").text) 93 | var get_WheelNode = get_parent().get_node(get_node("Binding/BindedTo").get_item_text(ID)).get("WheelNode") 94 | get_WheelNode[get_node("SettingsTitle").text] = WheelNode[get_node("SettingsTitle").text] 95 | BindedTarget = ID 96 | 97 | get_parent().get_node(get_node("Binding/BindedTo").get_item_text(BindedTarget)).set("WheelNode", get_WheelNode) 98 | get_parent().get_node(get_node("Binding/BindedTo").get_item_text(BindedTarget))._ready() 99 | else: 100 | #If none is selected 101 | #and there is a BindedTarget 102 | 103 | if(BindedTarget != null): 104 | #Hide all items 105 | DisableAllNodes(self) 106 | for child in get_children(): 107 | child.visible = true 108 | 109 | #Remove this wheel from the target node 110 | var get_WheelNode = get_parent().get_node(get_node("Binding/BindedTo").get_item_text(BindedTarget)).get("WheelNode") 111 | get_WheelNode.erase(get_node("SettingsTitle").text) 112 | BindedTarget = null 113 | #Load function: Load values from wheels, fill nodes 114 | FillNodesFromWheelInfo() 115 | 116 | func FillNodesFromWheelInfo(): 117 | for Wheel in WheelNode: 118 | get_node("General/UseAsTraction").pressed = WheelNode[Wheel].use_as_traction 119 | get_node("General/UseAsSteering").pressed = WheelNode[Wheel].use_as_steering 120 | get_node("Wheel/RollInfluence/WheelRollInfluence").value = WheelNode[Wheel].wheel_roll_influence 121 | get_node("Wheel/WheelRadius/WheelRadius").value = WheelNode[Wheel].wheel_radius 122 | get_node("Wheel/RestLength/WheelRestLength").value = WheelNode[Wheel].wheel_rest_length 123 | get_node("Wheel/FrictionSlip/WheelFrictionSlip").value = WheelNode[Wheel].wheel_friction_slip 124 | get_node("Suspension/Travel/SuspensionTravel").value = WheelNode[Wheel].suspension_travel 125 | get_node("Suspension/Stiffness/SuspensionStiffness").value = WheelNode[Wheel].suspension_stiffness 126 | get_node("Suspension/MaxForce/SuspensionMaxForce").value = WheelNode[Wheel].suspension_max_force 127 | get_node("Damping/Compression/DampingCompression").value = WheelNode[Wheel].damping_compression 128 | get_node("Damping/Relaxation/DampingRelaxation").value = WheelNode[Wheel].damping_relaxation 129 | 130 | func save(): 131 | var save_dict : Dictionary 132 | for Wheel in WheelNode: 133 | save_dict = { 134 | "name" : WheelNode[Wheel].name, 135 | "use_as_traction" : WheelNode[Wheel].use_as_traction, 136 | "use_as_steering" : WheelNode[Wheel].use_as_steering, 137 | "wheel_roll_influence" : WheelNode[Wheel].wheel_roll_influence, 138 | "wheel_radius" : WheelNode[Wheel].wheel_radius, 139 | "wheel_rest_length" : WheelNode[Wheel].wheel_rest_length, 140 | "wheel_friction_slip" : WheelNode[Wheel].wheel_friction_slip, 141 | "suspension_travel" : WheelNode[Wheel].suspension_travel, 142 | "suspension_stiffness" : WheelNode[Wheel].suspension_stiffness, 143 | "suspension_max_force" : WheelNode[Wheel].suspension_max_force, 144 | "damping_compression" : WheelNode[Wheel].damping_compression, 145 | "damping_relaxation" : WheelNode[Wheel].damping_relaxation, 146 | "bindedto" : BindedTarget 147 | } 148 | return save_dict 149 | 150 | func LoadPreset(value): 151 | $General/UseAsTraction.pressed = value["use_as_traction"] 152 | $General/UseAsSteering.pressed = value["use_as_steering"] 153 | $Wheel/RollInfluence/WheelRollInfluence.value = value["wheel_roll_influence"] 154 | $Wheel/WheelRadius/WheelRadius.value = value["wheel_radius"] 155 | $Wheel/RestLength/WheelRestLength.value = value["wheel_rest_length"] 156 | $Wheel/FrictionSlip/WheelFrictionSlip.value = value["wheel_friction_slip"] 157 | $Suspension/Travel/SuspensionTravel.value = value["suspension_travel"] 158 | $Suspension/Stiffness/SuspensionStiffness.value = value["suspension_stiffness"] 159 | $Suspension/MaxForce/SuspensionMaxForce.value = value["suspension_max_force"] 160 | $Damping/Compression/DampingCompression.value = value["damping_compression"] 161 | $Damping/Relaxation/DampingRelaxation.value = value["damping_relaxation"] 162 | if(value["bindedto"] != null): 163 | $Binding/BindedTo.select(value["bindedto"]) 164 | _on_BindedTo_item_selected(value["bindedto"]) 165 | -------------------------------------------------------------------------------- /assets/3d_car_customizable/scenes/wheelsettings.tscn: -------------------------------------------------------------------------------- 1 | [gd_scene load_steps=2 format=2] 2 | 3 | [ext_resource path="res://assets/3d_car_customizable/scripts/wheelsettings.gd" type="Script" id=1] 4 | 5 | [node name="Wheel" type="VBoxContainer"] 6 | margin_right = 812.0 7 | margin_bottom = 696.0 8 | script = ExtResource( 1 ) 9 | 10 | [node name="SettingsTitle" type="Label" parent="."] 11 | margin_left = 353.0 12 | margin_right = 459.0 13 | margin_bottom = 14.0 14 | size_flags_horizontal = 4 15 | text = "Front Left Wheel" 16 | 17 | [node name="Binding" type="HBoxContainer" parent="."] 18 | margin_left = 309.0 19 | margin_top = 18.0 20 | margin_right = 503.0 21 | margin_bottom = 38.0 22 | size_flags_horizontal = 4 23 | 24 | [node name="BindedToText" type="Label" parent="Binding"] 25 | margin_top = 3.0 26 | margin_right = 70.0 27 | margin_bottom = 17.0 28 | text = "Binded to: " 29 | 30 | [node name="BindedTo" type="OptionButton" parent="Binding"] 31 | margin_left = 74.0 32 | margin_right = 194.0 33 | margin_bottom = 20.0 34 | rect_min_size = Vector2( 120, 0 ) 35 | 36 | [node name="General" type="VBoxContainer" parent="."] 37 | margin_top = 42.0 38 | margin_right = 812.0 39 | margin_bottom = 163.0 40 | 41 | [node name="General" type="Label" parent="General"] 42 | margin_right = 812.0 43 | margin_bottom = 65.0 44 | text = " 45 | 46 | General 47 | " 48 | 49 | [node name="UseAsTraction" type="CheckBox" parent="General" groups=[ 50 | "CanDisable", 51 | ]] 52 | margin_top = 69.0 53 | margin_right = 812.0 54 | margin_bottom = 93.0 55 | text = "Use as traction" 56 | 57 | [node name="UseAsSteering" type="CheckBox" parent="General" groups=[ 58 | "CanDisable", 59 | ]] 60 | margin_top = 97.0 61 | margin_right = 812.0 62 | margin_bottom = 121.0 63 | text = "Use as steering" 64 | 65 | [node name="Wheel" type="VBoxContainer" parent="."] 66 | margin_top = 167.0 67 | margin_right = 300.0 68 | margin_bottom = 384.0 69 | rect_min_size = Vector2( 300, 0 ) 70 | size_flags_horizontal = 0 71 | 72 | [node name="Wheel" type="Label" parent="Wheel"] 73 | margin_right = 300.0 74 | margin_bottom = 65.0 75 | text = " 76 | 77 | Wheel 78 | " 79 | 80 | [node name="RollInfluenceText" type="Label" parent="Wheel"] 81 | margin_top = 69.0 82 | margin_right = 300.0 83 | margin_bottom = 83.0 84 | text = "Roll Influence = (0.1)" 85 | 86 | [node name="RollInfluence" type="HBoxContainer" parent="Wheel"] 87 | margin_top = 87.0 88 | margin_right = 300.0 89 | margin_bottom = 103.0 90 | 91 | [node name="Min" type="Label" parent="Wheel/RollInfluence"] 92 | margin_top = 1.0 93 | margin_right = 20.0 94 | margin_bottom = 15.0 95 | text = "0.0" 96 | 97 | [node name="WheelRollInfluence" type="HSlider" parent="Wheel/RollInfluence" groups=[ 98 | "CanEdit", 99 | ]] 100 | margin_left = 24.0 101 | margin_right = 276.0 102 | margin_bottom = 16.0 103 | size_flags_horizontal = 3 104 | max_value = 1.0 105 | step = 0.1 106 | value = 0.1 107 | scrollable = false 108 | ticks_on_borders = true 109 | 110 | [node name="Max" type="Label" parent="Wheel/RollInfluence"] 111 | margin_left = 280.0 112 | margin_top = 1.0 113 | margin_right = 300.0 114 | margin_bottom = 15.0 115 | text = "1.0" 116 | 117 | [node name="WheelRadiusText" type="Label" parent="Wheel"] 118 | margin_top = 107.0 119 | margin_right = 300.0 120 | margin_bottom = 121.0 121 | text = "Radius = (0.5)" 122 | 123 | [node name="WheelRadius" type="HBoxContainer" parent="Wheel"] 124 | margin_top = 125.0 125 | margin_right = 300.0 126 | margin_bottom = 141.0 127 | 128 | [node name="Min" type="Label" parent="Wheel/WheelRadius"] 129 | margin_top = 1.0 130 | margin_right = 20.0 131 | margin_bottom = 15.0 132 | text = "0.0" 133 | 134 | [node name="WheelRadius" type="HSlider" parent="Wheel/WheelRadius" groups=[ 135 | "CanEdit", 136 | ]] 137 | margin_left = 24.0 138 | margin_right = 276.0 139 | margin_bottom = 16.0 140 | size_flags_horizontal = 3 141 | min_value = 0.01 142 | max_value = 1.0 143 | step = 0.01 144 | value = 0.5 145 | scrollable = false 146 | 147 | [node name="Max" type="Label" parent="Wheel/WheelRadius"] 148 | margin_left = 280.0 149 | margin_top = 1.0 150 | margin_right = 300.0 151 | margin_bottom = 15.0 152 | text = "1.0" 153 | 154 | [node name="RestLengthText" type="Label" parent="Wheel"] 155 | margin_top = 145.0 156 | margin_right = 300.0 157 | margin_bottom = 159.0 158 | text = "Rest Length = (0.15)" 159 | 160 | [node name="RestLength" type="HBoxContainer" parent="Wheel"] 161 | margin_top = 163.0 162 | margin_right = 300.0 163 | margin_bottom = 179.0 164 | 165 | [node name="Min" type="Label" parent="Wheel/RestLength"] 166 | margin_top = 1.0 167 | margin_right = 20.0 168 | margin_bottom = 15.0 169 | text = "0.0" 170 | 171 | [node name="WheelRestLength" type="HSlider" parent="Wheel/RestLength" groups=[ 172 | "CanEdit", 173 | ]] 174 | margin_left = 24.0 175 | margin_right = 276.0 176 | margin_bottom = 16.0 177 | size_flags_horizontal = 3 178 | max_value = 2.0 179 | step = 0.01 180 | value = 0.15 181 | scrollable = false 182 | 183 | [node name="Max" type="Label" parent="Wheel/RestLength"] 184 | margin_left = 280.0 185 | margin_top = 1.0 186 | margin_right = 300.0 187 | margin_bottom = 15.0 188 | text = "2.0" 189 | 190 | [node name="FrictionSlipText" type="Label" parent="Wheel"] 191 | margin_top = 183.0 192 | margin_right = 300.0 193 | margin_bottom = 197.0 194 | text = "Friction Slip = (10.5)" 195 | 196 | [node name="FrictionSlip" type="HBoxContainer" parent="Wheel"] 197 | margin_top = 201.0 198 | margin_right = 300.0 199 | margin_bottom = 217.0 200 | 201 | [node name="Min" type="Label" parent="Wheel/FrictionSlip"] 202 | margin_top = 1.0 203 | margin_right = 8.0 204 | margin_bottom = 15.0 205 | text = "0" 206 | 207 | [node name="WheelFrictionSlip" type="HSlider" parent="Wheel/FrictionSlip" groups=[ 208 | "CanEdit", 209 | ]] 210 | margin_left = 12.0 211 | margin_right = 280.0 212 | margin_bottom = 16.0 213 | size_flags_horizontal = 3 214 | max_value = 12.0 215 | step = 0.1 216 | value = 10.5 217 | scrollable = false 218 | ticks_on_borders = true 219 | 220 | [node name="Max" type="Label" parent="Wheel/FrictionSlip"] 221 | margin_left = 284.0 222 | margin_top = 1.0 223 | margin_right = 300.0 224 | margin_bottom = 15.0 225 | text = "12" 226 | 227 | [node name="Suspension" type="VBoxContainer" parent="."] 228 | margin_top = 388.0 229 | margin_right = 250.0 230 | margin_bottom = 583.0 231 | rect_min_size = Vector2( 250, 0 ) 232 | size_flags_horizontal = 0 233 | 234 | [node name="Suspension" type="Label" parent="Suspension"] 235 | margin_right = 250.0 236 | margin_bottom = 65.0 237 | text = " 238 | 239 | Suspension 240 | " 241 | 242 | [node name="TravelText" type="Label" parent="Suspension"] 243 | margin_top = 69.0 244 | margin_right = 250.0 245 | margin_bottom = 83.0 246 | text = "Travel" 247 | 248 | [node name="Travel" type="HBoxContainer" parent="Suspension"] 249 | margin_top = 87.0 250 | margin_right = 250.0 251 | margin_bottom = 103.0 252 | 253 | [node name="Min" type="Label" parent="Suspension/Travel"] 254 | margin_top = 1.0 255 | margin_right = 20.0 256 | margin_bottom = 15.0 257 | text = "0.0" 258 | 259 | [node name="SuspensionTravel" type="HSlider" parent="Suspension/Travel" groups=[ 260 | "CanEdit", 261 | ]] 262 | margin_left = 24.0 263 | margin_right = 226.0 264 | margin_bottom = 16.0 265 | size_flags_horizontal = 3 266 | max_value = 1.0 267 | step = 0.01 268 | value = 1.0 269 | scrollable = false 270 | 271 | [node name="Max" type="Label" parent="Suspension/Travel"] 272 | margin_left = 230.0 273 | margin_top = 1.0 274 | margin_right = 250.0 275 | margin_bottom = 15.0 276 | text = "1.0" 277 | 278 | [node name="StiffnessText" type="Label" parent="Suspension"] 279 | margin_top = 107.0 280 | margin_right = 250.0 281 | margin_bottom = 121.0 282 | text = "Stiffness = (5.88)" 283 | 284 | [node name="Stiffness" type="HBoxContainer" parent="Suspension"] 285 | margin_top = 125.0 286 | margin_right = 250.0 287 | margin_bottom = 149.0 288 | 289 | [node name="SuspensionStiffness" type="HSlider" parent="Suspension/Stiffness" groups=[ 290 | "CanEdit", 291 | ]] 292 | margin_right = 172.0 293 | margin_bottom = 16.0 294 | size_flags_horizontal = 3 295 | max_value = 300.0 296 | step = 0.01 297 | value = 5.88 298 | scrollable = false 299 | ticks_on_borders = true 300 | 301 | [node name="SuspensionStiffnessBox" type="SpinBox" parent="Suspension/Stiffness" groups=[ 302 | "CanEdit", 303 | ]] 304 | margin_left = 176.0 305 | margin_right = 250.0 306 | margin_bottom = 24.0 307 | max_value = 300.0 308 | step = 0.01 309 | value = 5.88 310 | 311 | [node name="MaxForceText" type="Label" parent="Suspension"] 312 | margin_top = 153.0 313 | margin_right = 250.0 314 | margin_bottom = 167.0 315 | text = "Max Force = (6000.0)" 316 | 317 | [node name="MaxForce" type="HBoxContainer" parent="Suspension"] 318 | margin_top = 171.0 319 | margin_right = 250.0 320 | margin_bottom = 195.0 321 | 322 | [node name="SuspensionMaxForce" type="HSlider" parent="Suspension/MaxForce" groups=[ 323 | "CanEdit", 324 | ]] 325 | margin_right = 172.0 326 | margin_bottom = 16.0 327 | size_flags_horizontal = 3 328 | max_value = 20000.0 329 | step = 0.01 330 | value = 6000.0 331 | scrollable = false 332 | ticks_on_borders = true 333 | 334 | [node name="SuspensionMaxForceBox" type="SpinBox" parent="Suspension/MaxForce" groups=[ 335 | "CanEdit", 336 | ]] 337 | margin_left = 176.0 338 | margin_right = 250.0 339 | margin_bottom = 24.0 340 | max_value = 20000.0 341 | step = 0.01 342 | value = 6000.0 343 | 344 | [node name="Damping" type="VBoxContainer" parent="."] 345 | margin_top = 587.0 346 | margin_right = 300.0 347 | margin_bottom = 728.0 348 | rect_min_size = Vector2( 300, 0 ) 349 | size_flags_horizontal = 0 350 | 351 | [node name="Damping" type="Label" parent="Damping"] 352 | margin_right = 300.0 353 | margin_bottom = 65.0 354 | text = " 355 | 356 | Damping 357 | " 358 | 359 | [node name="CompressionText" type="Label" parent="Damping"] 360 | margin_top = 69.0 361 | margin_right = 300.0 362 | margin_bottom = 83.0 363 | text = "Compression = (0.83)" 364 | 365 | [node name="Compression" type="HBoxContainer" parent="Damping"] 366 | margin_top = 87.0 367 | margin_right = 300.0 368 | margin_bottom = 103.0 369 | 370 | [node name="Min" type="Label" parent="Damping/Compression"] 371 | margin_top = 1.0 372 | margin_right = 20.0 373 | margin_bottom = 15.0 374 | text = "0.0" 375 | 376 | [node name="DampingCompression" type="HSlider" parent="Damping/Compression" groups=[ 377 | "CanEdit", 378 | ]] 379 | margin_left = 24.0 380 | margin_right = 276.0 381 | margin_bottom = 16.0 382 | size_flags_horizontal = 3 383 | max_value = 3.0 384 | step = 0.01 385 | value = 0.83 386 | scrollable = false 387 | ticks_on_borders = true 388 | 389 | [node name="Max" type="Label" parent="Damping/Compression"] 390 | margin_left = 280.0 391 | margin_top = 1.0 392 | margin_right = 300.0 393 | margin_bottom = 15.0 394 | text = "3.0" 395 | 396 | [node name="RelaxationText" type="Label" parent="Damping"] 397 | margin_top = 107.0 398 | margin_right = 300.0 399 | margin_bottom = 121.0 400 | text = "Relaxation = (0.88)" 401 | 402 | [node name="Relaxation" type="HBoxContainer" parent="Damping"] 403 | margin_top = 125.0 404 | margin_right = 300.0 405 | margin_bottom = 141.0 406 | 407 | [node name="Min" type="Label" parent="Damping/Relaxation"] 408 | margin_top = 1.0 409 | margin_right = 20.0 410 | margin_bottom = 15.0 411 | text = "0.0" 412 | 413 | [node name="DampingRelaxation" type="HSlider" parent="Damping/Relaxation" groups=[ 414 | "CanEdit", 415 | ]] 416 | margin_left = 24.0 417 | margin_right = 276.0 418 | margin_bottom = 16.0 419 | size_flags_horizontal = 3 420 | max_value = 3.0 421 | step = 0.01 422 | value = 0.88 423 | scrollable = false 424 | 425 | [node name="Max" type="Label" parent="Damping/Relaxation"] 426 | margin_left = 280.0 427 | margin_top = 1.0 428 | margin_right = 300.0 429 | margin_bottom = 15.0 430 | text = "3.0" 431 | [connection signal="item_selected" from="Binding/BindedTo" to="." method="_on_BindedTo_item_selected"] 432 | [connection signal="pressed" from="General/UseAsTraction" to="." method="_on_UseAsTraction_pressed"] 433 | [connection signal="pressed" from="General/UseAsSteering" to="." method="_on_UseAsSteering_pressed"] 434 | [connection signal="value_changed" from="Wheel/RollInfluence/WheelRollInfluence" to="." method="_on_WheelRollInfluence_value_changed"] 435 | [connection signal="value_changed" from="Wheel/WheelRadius/WheelRadius" to="." method="_on_WheelRadius_value_changed"] 436 | [connection signal="value_changed" from="Wheel/RestLength/WheelRestLength" to="." method="_on_WheelRestLength_value_changed"] 437 | [connection signal="value_changed" from="Wheel/FrictionSlip/WheelFrictionSlip" to="." method="_on_WheelFrictionSlip_value_changed"] 438 | [connection signal="value_changed" from="Suspension/Travel/SuspensionTravel" to="." method="_on_SuspensionTravel_value_changed"] 439 | [connection signal="value_changed" from="Suspension/Stiffness/SuspensionStiffness" to="." method="_on_SuspensionStiffness_value_changed"] 440 | [connection signal="value_changed" from="Suspension/Stiffness/SuspensionStiffnessBox" to="." method="_on_SuspensionStiffness_value_changed"] 441 | [connection signal="value_changed" from="Suspension/MaxForce/SuspensionMaxForce" to="." method="_on_SuspensionMaxForce_value_changed"] 442 | [connection signal="value_changed" from="Suspension/MaxForce/SuspensionMaxForceBox" to="." method="_on_SuspensionMaxForce_value_changed"] 443 | [connection signal="value_changed" from="Damping/Compression/DampingCompression" to="." method="_on_DampingCompression_value_changed"] 444 | [connection signal="value_changed" from="Damping/Relaxation/DampingRelaxation" to="." method="_on_DampingRelaxation_value_changed"] 445 | -------------------------------------------------------------------------------- /assets/3d_car_customizable/scenes/settings.tscn: -------------------------------------------------------------------------------- 1 | [gd_scene load_steps=2 format=2] 2 | 3 | [ext_resource path="res://assets/3d_car_customizable/scripts/settings.gd" type="Script" id=1] 4 | 5 | [node name="Settings" type="MarginContainer"] 6 | show_behind_parent = true 7 | anchor_right = 1.0 8 | anchor_bottom = 1.0 9 | custom_constants/margin_right = 50 10 | custom_constants/margin_top = 50 11 | custom_constants/margin_left = 50 12 | custom_constants/margin_bottom = 50 13 | script = ExtResource( 1 ) 14 | __meta__ = { 15 | "_edit_use_anchors_": false 16 | } 17 | 18 | [node name="ColorRect" type="ColorRect" parent="."] 19 | margin_left = 50.0 20 | margin_top = 50.0 21 | margin_right = 1230.0 22 | margin_bottom = 670.0 23 | color = Color( 0, 0, 0, 0.729412 ) 24 | 25 | [node name="ScrollContainer" type="ScrollContainer" parent="."] 26 | margin_left = 50.0 27 | margin_top = 50.0 28 | margin_right = 1230.0 29 | margin_bottom = 670.0 30 | 31 | [node name="MarginContainer" type="MarginContainer" parent="ScrollContainer"] 32 | margin_right = 1180.0 33 | margin_bottom = 578.0 34 | size_flags_horizontal = 3 35 | custom_constants/margin_right = 50 36 | custom_constants/margin_top = 20 37 | custom_constants/margin_left = 50 38 | custom_constants/margin_bottom = 20 39 | 40 | [node name="List" type="VBoxContainer" parent="ScrollContainer/MarginContainer"] 41 | margin_left = 50.0 42 | margin_top = 20.0 43 | margin_right = 1130.0 44 | margin_bottom = 558.0 45 | 46 | [node name="Car" type="VBoxContainer" parent="ScrollContainer/MarginContainer/List"] 47 | margin_right = 1080.0 48 | margin_bottom = 538.0 49 | 50 | [node name="SettingsTitle" type="Label" parent="ScrollContainer/MarginContainer/List/Car"] 51 | margin_left = 502.0 52 | margin_right = 577.0 53 | margin_bottom = 14.0 54 | size_flags_horizontal = 4 55 | text = "Car Settings" 56 | 57 | [node name="SavePreset" type="HBoxContainer" parent="ScrollContainer/MarginContainer/List/Car"] 58 | margin_left = 387.0 59 | margin_top = 18.0 60 | margin_right = 692.0 61 | margin_bottom = 42.0 62 | size_flags_horizontal = 4 63 | 64 | [node name="PresetText" type="Label" parent="ScrollContainer/MarginContainer/List/Car/SavePreset"] 65 | margin_top = 5.0 66 | margin_right = 91.0 67 | margin_bottom = 19.0 68 | text = "Preset Name: " 69 | 70 | [node name="PresetName" type="LineEdit" parent="ScrollContainer/MarginContainer/List/Car/SavePreset"] 71 | margin_left = 95.0 72 | margin_right = 215.0 73 | margin_bottom = 24.0 74 | rect_min_size = Vector2( 120, 0 ) 75 | __meta__ = { 76 | "_edit_use_anchors_": false 77 | } 78 | 79 | [node name="SavePreset" type="Button" parent="ScrollContainer/MarginContainer/List/Car/SavePreset"] 80 | margin_left = 219.0 81 | margin_right = 305.0 82 | margin_bottom = 24.0 83 | text = "Save Preset" 84 | __meta__ = { 85 | "_edit_use_anchors_": false 86 | } 87 | 88 | [node name="PresetList Text" type="Label" parent="ScrollContainer/MarginContainer/List/Car"] 89 | margin_top = 46.0 90 | margin_right = 1080.0 91 | margin_bottom = 111.0 92 | text = " 93 | 94 | Preset List 95 | " 96 | __meta__ = { 97 | "_edit_use_anchors_": false 98 | } 99 | 100 | [node name="PresetList" type="ItemList" parent="ScrollContainer/MarginContainer/List/Car"] 101 | margin_top = 115.0 102 | margin_right = 1080.0 103 | margin_bottom = 124.0 104 | auto_height = true 105 | 106 | [node name="PresetButtons" type="HBoxContainer" parent="ScrollContainer/MarginContainer/List/Car"] 107 | visible = false 108 | margin_top = 128.0 109 | margin_right = 812.0 110 | margin_bottom = 148.0 111 | alignment = 2 112 | 113 | [node name="LoadPreset" type="Button" parent="ScrollContainer/MarginContainer/List/Car/PresetButtons"] 114 | margin_right = 87.0 115 | margin_bottom = 20.0 116 | disabled = true 117 | text = "Load Preset" 118 | __meta__ = { 119 | "_edit_use_anchors_": false 120 | } 121 | 122 | [node name="Control" type="Control" parent="ScrollContainer/MarginContainer/List/Car/PresetButtons"] 123 | margin_left = 91.0 124 | margin_right = 708.0 125 | margin_bottom = 20.0 126 | size_flags_horizontal = 3 127 | 128 | [node name="DeletePreset" type="Button" parent="ScrollContainer/MarginContainer/List/Car/PresetButtons"] 129 | margin_left = 712.0 130 | margin_right = 812.0 131 | margin_bottom = 20.0 132 | size_flags_horizontal = 9 133 | disabled = true 134 | text = "Delete Preset" 135 | __meta__ = { 136 | "_edit_use_anchors_": false 137 | } 138 | 139 | [node name="ScriptVariables" type="VBoxContainer" parent="ScrollContainer/MarginContainer/List/Car"] 140 | margin_top = 128.0 141 | margin_right = 250.0 142 | margin_bottom = 377.0 143 | rect_min_size = Vector2( 250, 0 ) 144 | size_flags_horizontal = 0 145 | 146 | [node name="ScriptVariables" type="Label" parent="ScrollContainer/MarginContainer/List/Car/ScriptVariables"] 147 | margin_right = 250.0 148 | margin_bottom = 65.0 149 | text = " 150 | 151 | ScriptVariables 152 | " 153 | 154 | [node name="EngineForceText" type="Label" parent="ScrollContainer/MarginContainer/List/Car/ScriptVariables"] 155 | margin_top = 69.0 156 | margin_right = 250.0 157 | margin_bottom = 83.0 158 | text = "Max Engine Force" 159 | 160 | [node name="EngineForce" type="HBoxContainer" parent="ScrollContainer/MarginContainer/List/Car/ScriptVariables"] 161 | margin_top = 87.0 162 | margin_right = 250.0 163 | margin_bottom = 111.0 164 | 165 | [node name="MaxEngineForce" type="HSlider" parent="ScrollContainer/MarginContainer/List/Car/ScriptVariables/EngineForce"] 166 | margin_right = 172.0 167 | margin_bottom = 16.0 168 | size_flags_horizontal = 3 169 | max_value = 1500.0 170 | value = 200.0 171 | scrollable = false 172 | ticks_on_borders = true 173 | 174 | [node name="MaxEngineForceBox" type="SpinBox" parent="ScrollContainer/MarginContainer/List/Car/ScriptVariables/EngineForce"] 175 | margin_left = 176.0 176 | margin_right = 250.0 177 | margin_bottom = 24.0 178 | max_value = 3000.0 179 | value = 200.0 180 | 181 | [node name="BrakeText" type="Label" parent="ScrollContainer/MarginContainer/List/Car/ScriptVariables"] 182 | margin_top = 115.0 183 | margin_right = 250.0 184 | margin_bottom = 129.0 185 | text = "Max Brake" 186 | 187 | [node name="Brake" type="HBoxContainer" parent="ScrollContainer/MarginContainer/List/Car/ScriptVariables"] 188 | margin_top = 133.0 189 | margin_right = 250.0 190 | margin_bottom = 157.0 191 | 192 | [node name="MaxBrake" type="HSlider" parent="ScrollContainer/MarginContainer/List/Car/ScriptVariables/Brake"] 193 | margin_right = 172.0 194 | margin_bottom = 16.0 195 | size_flags_horizontal = 3 196 | max_value = 10.0 197 | step = 0.01 198 | value = 5.0 199 | scrollable = false 200 | ticks_on_borders = true 201 | 202 | [node name="MaxBrakeBox" type="SpinBox" parent="ScrollContainer/MarginContainer/List/Car/ScriptVariables/Brake"] 203 | margin_left = 176.0 204 | margin_right = 250.0 205 | margin_bottom = 24.0 206 | max_value = 10.0 207 | step = 0.01 208 | value = 5.0 209 | 210 | [node name="SteeringText" type="Label" parent="ScrollContainer/MarginContainer/List/Car/ScriptVariables"] 211 | margin_top = 161.0 212 | margin_right = 250.0 213 | margin_bottom = 175.0 214 | text = "Max Steering" 215 | 216 | [node name="Steering" type="HBoxContainer" parent="ScrollContainer/MarginContainer/List/Car/ScriptVariables"] 217 | margin_top = 179.0 218 | margin_right = 250.0 219 | margin_bottom = 203.0 220 | 221 | [node name="MaxSteering" type="HSlider" parent="ScrollContainer/MarginContainer/List/Car/ScriptVariables/Steering"] 222 | margin_right = 172.0 223 | margin_bottom = 16.0 224 | size_flags_horizontal = 3 225 | max_value = 1.0 226 | step = 0.01 227 | value = 0.5 228 | scrollable = false 229 | ticks_on_borders = true 230 | 231 | [node name="MaxSteeringBox" type="SpinBox" parent="ScrollContainer/MarginContainer/List/Car/ScriptVariables/Steering"] 232 | margin_left = 176.0 233 | margin_right = 250.0 234 | margin_bottom = 24.0 235 | max_value = 1.0 236 | step = 0.01 237 | value = 0.5 238 | 239 | [node name="SteeringSpeedText" type="Label" parent="ScrollContainer/MarginContainer/List/Car/ScriptVariables"] 240 | margin_top = 207.0 241 | margin_right = 250.0 242 | margin_bottom = 221.0 243 | text = "Steering Speed" 244 | 245 | [node name="SteeringSpeed" type="HBoxContainer" parent="ScrollContainer/MarginContainer/List/Car/ScriptVariables"] 246 | margin_top = 225.0 247 | margin_right = 250.0 248 | margin_bottom = 249.0 249 | 250 | [node name="SteeringSpeed" type="HSlider" parent="ScrollContainer/MarginContainer/List/Car/ScriptVariables/SteeringSpeed"] 251 | margin_right = 172.0 252 | margin_bottom = 16.0 253 | size_flags_horizontal = 3 254 | max_value = 10.0 255 | step = 0.1 256 | value = 5.0 257 | scrollable = false 258 | ticks_on_borders = true 259 | 260 | [node name="SteeringSpeedBox" type="SpinBox" parent="ScrollContainer/MarginContainer/List/Car/ScriptVariables/SteeringSpeed"] 261 | margin_left = 176.0 262 | margin_right = 250.0 263 | margin_bottom = 24.0 264 | max_value = 10.0 265 | step = 0.1 266 | value = 5.0 267 | 268 | [node name="VehicleBody" type="VBoxContainer" parent="ScrollContainer/MarginContainer/List/Car"] 269 | margin_top = 381.0 270 | margin_right = 300.0 271 | margin_bottom = 538.0 272 | rect_min_size = Vector2( 300, 0 ) 273 | size_flags_horizontal = 0 274 | 275 | [node name="VehicleBody" type="Label" parent="ScrollContainer/MarginContainer/List/Car/VehicleBody"] 276 | margin_right = 300.0 277 | margin_bottom = 65.0 278 | text = " 279 | 280 | VehicleBody 281 | " 282 | 283 | [node name="MassText" type="Label" parent="ScrollContainer/MarginContainer/List/Car/VehicleBody"] 284 | margin_top = 69.0 285 | margin_right = 300.0 286 | margin_bottom = 83.0 287 | text = "Mass" 288 | 289 | [node name="Mass" type="HBoxContainer" parent="ScrollContainer/MarginContainer/List/Car/VehicleBody"] 290 | margin_top = 87.0 291 | margin_right = 300.0 292 | margin_bottom = 111.0 293 | 294 | [node name="Mass" type="HSlider" parent="ScrollContainer/MarginContainer/List/Car/VehicleBody/Mass"] 295 | margin_right = 222.0 296 | margin_bottom = 16.0 297 | size_flags_horizontal = 3 298 | max_value = 3000.0 299 | value = 30.0 300 | scrollable = false 301 | ticks_on_borders = true 302 | 303 | [node name="MassBox" type="SpinBox" parent="ScrollContainer/MarginContainer/List/Car/VehicleBody/Mass"] 304 | margin_left = 226.0 305 | margin_right = 300.0 306 | margin_bottom = 24.0 307 | max_value = 3000.0 308 | value = 30.0 309 | 310 | [node name="WeightText" type="Label" parent="ScrollContainer/MarginContainer/List/Car/VehicleBody"] 311 | margin_top = 115.0 312 | margin_right = 300.0 313 | margin_bottom = 129.0 314 | text = "Weight" 315 | 316 | [node name="Weight" type="HBoxContainer" parent="ScrollContainer/MarginContainer/List/Car/VehicleBody"] 317 | margin_top = 133.0 318 | margin_right = 300.0 319 | margin_bottom = 157.0 320 | 321 | [node name="Weight" type="HSlider" parent="ScrollContainer/MarginContainer/List/Car/VehicleBody/Weight"] 322 | margin_right = 222.0 323 | margin_bottom = 16.0 324 | size_flags_horizontal = 3 325 | max_value = 3000.0 326 | value = 800.0 327 | scrollable = false 328 | ticks_on_borders = true 329 | 330 | [node name="WeightBox" type="SpinBox" parent="ScrollContainer/MarginContainer/List/Car/VehicleBody/Weight"] 331 | margin_left = 226.0 332 | margin_right = 300.0 333 | margin_bottom = 24.0 334 | max_value = 3000.0 335 | value = 800.0 336 | [connection signal="pressed" from="ScrollContainer/MarginContainer/List/Car/SavePreset/SavePreset" to="." method="SavePreset"] 337 | [connection signal="item_selected" from="ScrollContainer/MarginContainer/List/Car/PresetList" to="." method="_on_PresetList_item_selected"] 338 | [connection signal="pressed" from="ScrollContainer/MarginContainer/List/Car/PresetButtons/LoadPreset" to="." method="LoadPreset"] 339 | [connection signal="pressed" from="ScrollContainer/MarginContainer/List/Car/PresetButtons/DeletePreset" to="." method="DeletePreset"] 340 | [connection signal="value_changed" from="ScrollContainer/MarginContainer/List/Car/ScriptVariables/EngineForce/MaxEngineForce" to="." method="_on_MaxEngineForce_value_changed"] 341 | [connection signal="value_changed" from="ScrollContainer/MarginContainer/List/Car/ScriptVariables/EngineForce/MaxEngineForceBox" to="." method="_on_MaxEngineForce_value_changed"] 342 | [connection signal="value_changed" from="ScrollContainer/MarginContainer/List/Car/ScriptVariables/Brake/MaxBrake" to="." method="_on_MaxBrake_value_changed"] 343 | [connection signal="value_changed" from="ScrollContainer/MarginContainer/List/Car/ScriptVariables/Brake/MaxBrakeBox" to="." method="_on_MaxBrake_value_changed"] 344 | [connection signal="value_changed" from="ScrollContainer/MarginContainer/List/Car/ScriptVariables/Steering/MaxSteering" to="." method="_on_MaxSteering_value_changed"] 345 | [connection signal="value_changed" from="ScrollContainer/MarginContainer/List/Car/ScriptVariables/Steering/MaxSteeringBox" to="." method="_on_MaxSteering_value_changed"] 346 | [connection signal="value_changed" from="ScrollContainer/MarginContainer/List/Car/ScriptVariables/SteeringSpeed/SteeringSpeed" to="." method="_on_SteeringSpeed_value_changed"] 347 | [connection signal="value_changed" from="ScrollContainer/MarginContainer/List/Car/ScriptVariables/SteeringSpeed/SteeringSpeedBox" to="." method="_on_SteeringSpeed_value_changed"] 348 | [connection signal="value_changed" from="ScrollContainer/MarginContainer/List/Car/VehicleBody/Mass/Mass" to="." method="_on_Mass_value_changed"] 349 | [connection signal="value_changed" from="ScrollContainer/MarginContainer/List/Car/VehicleBody/Mass/MassBox" to="." method="_on_Mass_value_changed"] 350 | [connection signal="value_changed" from="ScrollContainer/MarginContainer/List/Car/VehicleBody/Weight/Weight" to="." method="_on_Weight_value_changed"] 351 | [connection signal="value_changed" from="ScrollContainer/MarginContainer/List/Car/VehicleBody/Weight/WeightBox" to="." method="_on_Weight_value_changed"] 352 | -------------------------------------------------------------------------------- /assets/3d_car_customizable/scripts/settings.gd: -------------------------------------------------------------------------------- 1 | extends MarginContainer 2 | 3 | var CarNode : VehicleBody 4 | 5 | onready var PresetList = get_node("ScrollContainer/MarginContainer/List/Car/PresetList") 6 | onready var DeleteButton = get_node("ScrollContainer/MarginContainer/List/Car/PresetButtons/DeletePreset") 7 | onready var LoadButton = get_node("ScrollContainer/MarginContainer/List/Car/PresetButtons/LoadPreset") 8 | 9 | func _ready(): 10 | # If there is no CarNode attached, Settingspanel quits the tree 11 | if(CarNode == null): 12 | free() 13 | return 14 | 15 | #Getting the values from the VehicleBody 16 | get_node("ScrollContainer/MarginContainer/List/Car/ScriptVariables/EngineForce/MaxEngineForce").value = CarNode.MAX_ENGINE_FORCE 17 | _on_MaxEngineForce_value_changed(CarNode.MAX_ENGINE_FORCE) 18 | get_node("ScrollContainer/MarginContainer/List/Car/ScriptVariables/Brake/MaxBrake").value = CarNode.MAX_BRAKE 19 | _on_MaxBrake_value_changed(CarNode.MAX_BRAKE) 20 | get_node("ScrollContainer/MarginContainer/List/Car/ScriptVariables/Steering/MaxSteering").value = CarNode.MAX_STEERING 21 | _on_MaxSteering_value_changed(CarNode.MAX_STEERING) 22 | get_node("ScrollContainer/MarginContainer/List/Car/ScriptVariables/SteeringSpeed/SteeringSpeed").value = CarNode.STEERING_SPEED 23 | _on_SteeringSpeed_value_changed(CarNode.STEERING_SPEED) 24 | get_node("ScrollContainer/MarginContainer/List/Car/VehicleBody/Weight/Weight").value = CarNode.weight 25 | _on_Weight_value_changed(CarNode.weight) 26 | # We do not need to get the Mass from the VehicleBody because Weight automatically updates the Mass 27 | #get_node("ScrollContainer/MarginContainer/List/Car/VehicleBody/Mass/Mass").value = CarNode.mass 28 | #_on_Mass_value_changed(CarNode.mass) 29 | 30 | # Each wheel contributes the Wheels dictionary that will later be used twice 31 | var Wheels = {} 32 | for Wheel in CarNode.get_children(): 33 | if(Wheel is VehicleWheel): 34 | Wheels[Wheel.name] = Wheel 35 | 36 | # All wheels are instanced in the Settingspanel 37 | # with their properties from the CarNode 38 | for Items in Wheels: 39 | var Wheel = Wheels[Items] 40 | var ToInstance = preload("../scenes/wheelsettings.tscn").instance() 41 | ToInstance.get_child(0).text = Wheel.name 42 | ToInstance.name = Wheel.name 43 | ToInstance.get_node("Binding/BindedTo").add_item("none") 44 | for items in Wheels: if(Wheels[items].name != Wheel.name): 45 | ToInstance.get_node("Binding/BindedTo").add_item(Wheels[items].name) 46 | ToInstance.set("WheelNode", { Wheel.name : Wheel } ) 47 | ToInstance.get_node("General/UseAsTraction").pressed = Wheel.use_as_traction 48 | ToInstance.get_node("General/UseAsSteering").pressed = Wheel.use_as_steering 49 | ToInstance.get_node("Wheel/RollInfluence/WheelRollInfluence").value = Wheel.wheel_roll_influence 50 | ToInstance.get_node("Wheel/WheelRadius/WheelRadius").value = Wheel.wheel_radius 51 | ToInstance.get_node("Wheel/RestLength/WheelRestLength").value = Wheel.wheel_rest_length 52 | ToInstance.get_node("Wheel/FrictionSlip/WheelFrictionSlip").value = Wheel.wheel_friction_slip 53 | ToInstance.get_node("Suspension/Travel/SuspensionTravel").value = Wheel.suspension_travel 54 | ToInstance.get_node("Suspension/Stiffness/SuspensionStiffness").value = Wheel.suspension_stiffness 55 | ToInstance.get_node("Suspension/MaxForce/SuspensionMaxForce").value = Wheel.suspension_max_force 56 | ToInstance.get_node("Damping/Compression/DampingCompression").value = Wheel.damping_compression 57 | ToInstance.get_node("Damping/Relaxation/DampingRelaxation").value = Wheel.damping_relaxation 58 | get_node("ScrollContainer/MarginContainer/List").add_child(ToInstance) 59 | 60 | # Get presets in user data 61 | GetPresets() 62 | # ..and assign the first preset if it exists 63 | if(PresetList.get_item_count() > 0): 64 | if(PresetList.get_item_text(PresetList.get_item_count() - 1) != "No Presets"): 65 | PresetList.select(0) 66 | _on_PresetList_item_selected(0) 67 | LoadPreset() 68 | 69 | func SavePreset(): 70 | var presetName = $ScrollContainer/MarginContainer/List/Car/SavePreset/PresetName 71 | if (presetName.text.length() < 1): 72 | presetName.text = "Can't be Empty" 73 | return 74 | print("Generating Preset File") 75 | var preset_file = File.new() 76 | var dir = Directory.new() 77 | print("Checking the presets directory") 78 | if (dir.open("user://3d_car_customizable/") != OK): 79 | print("Preset directory doesn't exist") 80 | dir.make_dir("user://3d_car_customizable/") 81 | print("..created a preset directory") 82 | preset_file.open("user://3d_car_customizable/" + presetName.text + ".json", File.WRITE) 83 | print("Writing car settings") 84 | var CarPreset = { 85 | "MAX_ENGINE_FORCE" : CarNode.get("MAX_ENGINE_FORCE"), 86 | "MAX_BRAKE" : CarNode.get("MAX_BRAKE"), 87 | "MAX_STEERING" : CarNode.get("MAX_STEERING"), 88 | "STEERING_SPEED" : CarNode.get("STEERING_SPEED"), 89 | "mass" : CarNode.mass, 90 | "weight" : CarNode.weight, 91 | "wheel_names" : "" 92 | } 93 | for Wheel in CarNode.get_children(): 94 | if(Wheel is VehicleWheel): 95 | CarPreset["wheel_names"] += Wheel.name + "." 96 | CarPreset[Wheel.name] = get_node("ScrollContainer/MarginContainer/List").get_node(Wheel.name).save() 97 | preset_file.store_line(to_json(CarPreset)) 98 | print("Writing file") 99 | preset_file.close() 100 | print("Closing file manager") 101 | GetPresets() 102 | 103 | func GetPresets(): 104 | PresetList.clear() 105 | print("Checking the preset directory") 106 | var dir = Directory.new() 107 | if (dir.open("user://3d_car_customizable/")) == OK: 108 | print("Generating Preset List") 109 | dir.list_dir_begin() 110 | var file_name = dir.get_next() 111 | while (file_name != ""): 112 | if !dir.current_is_dir(): 113 | #If it's not a directory 114 | print("Found preset: " + file_name) 115 | PresetList.add_item(file_name.split(".json")[0]) 116 | PresetList.set_item_tooltip_enabled(PresetList.get_item_count() - 1, false) 117 | # else: 118 | # print("Found directory: " + file_name) 119 | file_name = dir.get_next() 120 | if(PresetList.get_item_count() < 1): 121 | print("No presets found") 122 | PresetList.add_item("No Presets") 123 | PresetList.set_item_tooltip_enabled(PresetList.get_item_count() - 1, false) 124 | else: 125 | print("Preset directory doesn't exist") 126 | PresetList.add_item("No Presets") 127 | PresetList.set_item_tooltip_enabled(PresetList.get_item_count() - 1, false) 128 | 129 | func DeletePreset(): 130 | print("Checking the preset directory") 131 | var dir = Directory.new() 132 | if (dir.open("user://3d_car_customizable/")) == OK: 133 | print("Generating Preset List") 134 | dir.list_dir_begin() 135 | var file_name = dir.get_next() 136 | while (file_name != ""): 137 | if (file_name == PresetList.get_item_text(PresetList.get_selected_items()[0]) + ".json"): 138 | #If it's not a directory 139 | print("Found preset and deleted") 140 | dir.remove("user://3d_car_customizable/" + PresetList.get_item_text(PresetList.get_selected_items()[0]) + ".json") 141 | $ScrollContainer/MarginContainer/List/Car/PresetButtons.visible = false 142 | DeleteButton.disabled = true 143 | DeleteButton.text = "Delete Preset" 144 | LoadButton.disabled = true 145 | LoadButton.text = "Load Preset" 146 | GetPresets() 147 | return 148 | file_name = dir.get_next() 149 | if(PresetList.get_item_count() < 1): 150 | print("No presets found > could not delete") 151 | else: 152 | print("Preset directory doesn't exist") 153 | GetPresets() 154 | 155 | func LoadPreset(): 156 | var preset_file = File.new() 157 | print("Checking the preset file") 158 | if (preset_file.open("user://3d_car_customizable/" + PresetList.get_item_text(PresetList.get_selected_items()[0]) + ".json", File.READ) != OK): 159 | print("Preset doesn't exist") 160 | return 161 | preset_file.open("user://3d_car_customizable/" + PresetList.get_item_text(PresetList.get_selected_items()[0]) + ".json", File.READ) 162 | print("Read car settings") 163 | var CarPreset = parse_json(preset_file.get_line()) 164 | _on_MaxEngineForce_value_changed(CarPreset["MAX_ENGINE_FORCE"]) 165 | _on_MaxBrake_value_changed(CarPreset["MAX_BRAKE"]) 166 | _on_MaxSteering_value_changed(CarPreset["MAX_STEERING"]) 167 | _on_SteeringSpeed_value_changed(CarPreset["STEERING_SPEED"]) 168 | _on_Mass_value_changed(CarPreset["mass"]) 169 | _on_Weight_value_changed(CarPreset["weight"]) 170 | print("Applied the preset for: Car Body") 171 | for WheelName in CarPreset["wheel_names"].split(".", false): 172 | #Assign to CarNode wheels 173 | get_node("ScrollContainer/MarginContainer/List").get_node(WheelName).LoadPreset(CarPreset[WheelName]) 174 | print("Applied the preset for: " + WheelName) 175 | preset_file.close() 176 | print("Closing file manager") 177 | 178 | func _on_MaxEngineForce_value_changed(value): 179 | get_node("ScrollContainer/MarginContainer/List/Car/ScriptVariables/EngineForceText").text = "Max Engine Force = (" + str(value) + ")" 180 | if(get_node("ScrollContainer/MarginContainer/List/Car/ScriptVariables/EngineForce/MaxEngineForce").value != value): get_node("ScrollContainer/MarginContainer/List/Car/ScriptVariables/EngineForce/MaxEngineForce").value = value 181 | if(get_node("ScrollContainer/MarginContainer/List/Car/ScriptVariables/EngineForce/MaxEngineForceBox").value != value): get_node("ScrollContainer/MarginContainer/List/Car/ScriptVariables/EngineForce/MaxEngineForceBox").value = value 182 | CarNode.set("MAX_ENGINE_FORCE", value) 183 | 184 | func _on_MaxBrake_value_changed(value): 185 | get_node("ScrollContainer/MarginContainer/List/Car/ScriptVariables/BrakeText").text = "Max Brake Force = (" + str(value) + ")" 186 | if(get_node("ScrollContainer/MarginContainer/List/Car/ScriptVariables/Brake/MaxBrake").value != value): get_node("ScrollContainer/MarginContainer/List/Car/ScriptVariables/Brake/MaxBrake").value = value 187 | if(get_node("ScrollContainer/MarginContainer/List/Car/ScriptVariables/Brake/MaxBrakeBox").value != value): get_node("ScrollContainer/MarginContainer/List/Car/ScriptVariables/Brake/MaxBrakeBox").value = value 188 | CarNode.set("MAX_BRAKE", value) 189 | 190 | func _on_MaxSteering_value_changed(value): 191 | get_node("ScrollContainer/MarginContainer/List/Car/ScriptVariables/SteeringText").text = "Max Steering Angle = (" + str(value) + ")" 192 | if(get_node("ScrollContainer/MarginContainer/List/Car/ScriptVariables/Steering/MaxSteering").value != value): get_node("ScrollContainer/MarginContainer/List/Car/ScriptVariables/Steering/MaxSteering").value = value 193 | if(get_node("ScrollContainer/MarginContainer/List/Car/ScriptVariables/Steering/MaxSteeringBox").value != value): get_node("ScrollContainer/MarginContainer/List/Car/ScriptVariables/Steering/MaxSteeringBox").value = value 194 | CarNode.set("MAX_STEERING", value) 195 | 196 | func _on_SteeringSpeed_value_changed(value): 197 | get_node("ScrollContainer/MarginContainer/List/Car/ScriptVariables/SteeringSpeedText").text = "Steering Speed = (" + str(value) + ")" 198 | if(get_node("ScrollContainer/MarginContainer/List/Car/ScriptVariables/SteeringSpeed/SteeringSpeed").value != value): get_node("ScrollContainer/MarginContainer/List/Car/ScriptVariables/SteeringSpeed/SteeringSpeed").value = value 199 | if(get_node("ScrollContainer/MarginContainer/List/Car/ScriptVariables/SteeringSpeed/SteeringSpeedBox").value != value): get_node("ScrollContainer/MarginContainer/List/Car/ScriptVariables/SteeringSpeed/SteeringSpeedBox").value = value 200 | CarNode.set("STEERING_SPEED", value) 201 | 202 | func _on_Mass_value_changed(value): 203 | get_node("ScrollContainer/MarginContainer/List/Car/VehicleBody/MassText").text = "Mass = (" + str(value) + ")" 204 | if(get_node("ScrollContainer/MarginContainer/List/Car/VehicleBody/Mass/Mass").value != value): get_node("ScrollContainer/MarginContainer/List/Car/VehicleBody/Mass/Mass").value = value 205 | if(get_node("ScrollContainer/MarginContainer/List/Car/VehicleBody/Mass/MassBox").value != value): get_node("ScrollContainer/MarginContainer/List/Car/VehicleBody/Mass/MassBox").value = value 206 | CarNode.mass = value 207 | get_node("ScrollContainer/MarginContainer/List/Car/VehicleBody/WeightText").text = "Weight = (" + str(CarNode.weight) + ")" 208 | if(get_node("ScrollContainer/MarginContainer/List/Car/VehicleBody/Weight/Weight").value != CarNode.weight): get_node("ScrollContainer/MarginContainer/List/Car/VehicleBody/Weight/Weight").value = CarNode.weight 209 | if(get_node("ScrollContainer/MarginContainer/List/Car/VehicleBody/Weight/WeightBox").value != CarNode.weight): get_node("ScrollContainer/MarginContainer/List/Car/VehicleBody/Weight/WeightBox").value = CarNode.weight 210 | 211 | func _on_Weight_value_changed(value): 212 | get_node("ScrollContainer/MarginContainer/List/Car/VehicleBody/WeightText").text = "Weight = (" + str(value) + ")" 213 | if(get_node("ScrollContainer/MarginContainer/List/Car/VehicleBody/Weight/Weight").value != value): get_node("ScrollContainer/MarginContainer/List/Car/VehicleBody/Weight/Weight").value = value 214 | if(get_node("ScrollContainer/MarginContainer/List/Car/VehicleBody/Weight/WeightBox").value != value): get_node("ScrollContainer/MarginContainer/List/Car/VehicleBody/Weight/WeightBox").value = value 215 | CarNode.weight = value 216 | get_node("ScrollContainer/MarginContainer/List/Car/VehicleBody/MassText").text = "Mass = (" + str(CarNode.mass) + ")" 217 | if(get_node("ScrollContainer/MarginContainer/List/Car/VehicleBody/Mass/Mass").value != CarNode.mass): get_node("ScrollContainer/MarginContainer/List/Car/VehicleBody/Mass/Mass").value = CarNode.mass 218 | if(get_node("ScrollContainer/MarginContainer/List/Car/VehicleBody/Mass/MassBox").value != CarNode.mass): get_node("ScrollContainer/MarginContainer/List/Car/VehicleBody/Mass/MassBox").value = CarNode.mass 219 | 220 | func _on_PresetList_item_selected(index): 221 | if(PresetList.get_item_text(index) == "No Presets"): return 222 | $ScrollContainer/MarginContainer/List/Car/PresetButtons.visible = true 223 | DeleteButton.disabled = false 224 | DeleteButton.text = "Delete Preset: " + PresetList.get_item_text(index) 225 | LoadButton.disabled = false 226 | LoadButton.text = "Load Preset: " + PresetList.get_item_text(index) 227 | $ScrollContainer/MarginContainer/List/Car/SavePreset/PresetName.text = PresetList.get_item_text(index) 228 | -------------------------------------------------------------------------------- /assets/3d_car_customizable/assets/car_model.glb.import: -------------------------------------------------------------------------------- 1 | [remap] 2 | 3 | importer="scene" 4 | type="PackedScene" 5 | path="res://.import/car_model.glb-82bf9ecd5396884e6a2b9576942c932d.scn" 6 | 7 | [deps] 8 | 9 | source_file="res://assets/3d_car_customizable/assets/car_model.glb" 10 | dest_files=[ "res://.import/car_model.glb-82bf9ecd5396884e6a2b9576942c932d.scn" ] 11 | 12 | [params] 13 | 14 | nodes/root_type="VehicleBody" 15 | nodes/root_name="Scene Root" 16 | nodes/root_scale=1.0 17 | nodes/custom_script="" 18 | nodes/storage=0 19 | materials/location=1 20 | materials/storage=1 21 | materials/keep_on_reimport=true 22 | meshes/compress=true 23 | meshes/ensure_tangents=true 24 | meshes/storage=0 25 | meshes/light_baking=0 26 | meshes/lightmap_texel_size=0.1 27 | skins/use_named_skins=true 28 | external_files/store_in_subdir=false 29 | animation/import=true 30 | animation/fps=15 31 | animation/filter_script="" 32 | animation/storage=false 33 | animation/keep_custom_tracks=false 34 | animation/optimizer/enabled=true 35 | animation/optimizer/max_linear_error=0.05 36 | animation/optimizer/max_angular_error=0.01 37 | animation/optimizer/max_angle=22 38 | animation/optimizer/remove_unused_tracks=true 39 | animation/clips/amount=0 40 | animation/clip_1/name="" 41 | animation/clip_1/start_frame=0 42 | animation/clip_1/end_frame=0 43 | animation/clip_1/loops=false 44 | animation/clip_2/name="" 45 | animation/clip_2/start_frame=0 46 | animation/clip_2/end_frame=0 47 | animation/clip_2/loops=false 48 | animation/clip_3/name="" 49 | animation/clip_3/start_frame=0 50 | animation/clip_3/end_frame=0 51 | animation/clip_3/loops=false 52 | animation/clip_4/name="" 53 | animation/clip_4/start_frame=0 54 | animation/clip_4/end_frame=0 55 | animation/clip_4/loops=false 56 | animation/clip_5/name="" 57 | animation/clip_5/start_frame=0 58 | animation/clip_5/end_frame=0 59 | animation/clip_5/loops=false 60 | animation/clip_6/name="" 61 | animation/clip_6/start_frame=0 62 | animation/clip_6/end_frame=0 63 | animation/clip_6/loops=false 64 | animation/clip_7/name="" 65 | animation/clip_7/start_frame=0 66 | animation/clip_7/end_frame=0 67 | animation/clip_7/loops=false 68 | animation/clip_8/name="" 69 | animation/clip_8/start_frame=0 70 | animation/clip_8/end_frame=0 71 | animation/clip_8/loops=false 72 | animation/clip_9/name="" 73 | animation/clip_9/start_frame=0 74 | animation/clip_9/end_frame=0 75 | animation/clip_9/loops=false 76 | animation/clip_10/name="" 77 | animation/clip_10/start_frame=0 78 | animation/clip_10/end_frame=0 79 | animation/clip_10/loops=false 80 | animation/clip_11/name="" 81 | animation/clip_11/start_frame=0 82 | animation/clip_11/end_frame=0 83 | animation/clip_11/loops=false 84 | animation/clip_12/name="" 85 | animation/clip_12/start_frame=0 86 | animation/clip_12/end_frame=0 87 | animation/clip_12/loops=false 88 | animation/clip_13/name="" 89 | animation/clip_13/start_frame=0 90 | animation/clip_13/end_frame=0 91 | animation/clip_13/loops=false 92 | animation/clip_14/name="" 93 | animation/clip_14/start_frame=0 94 | animation/clip_14/end_frame=0 95 | animation/clip_14/loops=false 96 | animation/clip_15/name="" 97 | animation/clip_15/start_frame=0 98 | animation/clip_15/end_frame=0 99 | animation/clip_15/loops=false 100 | animation/clip_16/name="" 101 | animation/clip_16/start_frame=0 102 | animation/clip_16/end_frame=0 103 | animation/clip_16/loops=false 104 | animation/clip_17/name="" 105 | animation/clip_17/start_frame=0 106 | animation/clip_17/end_frame=0 107 | animation/clip_17/loops=false 108 | animation/clip_18/name="" 109 | animation/clip_18/start_frame=0 110 | animation/clip_18/end_frame=0 111 | animation/clip_18/loops=false 112 | animation/clip_19/name="" 113 | animation/clip_19/start_frame=0 114 | animation/clip_19/end_frame=0 115 | animation/clip_19/loops=false 116 | animation/clip_20/name="" 117 | animation/clip_20/start_frame=0 118 | animation/clip_20/end_frame=0 119 | animation/clip_20/loops=false 120 | animation/clip_21/name="" 121 | animation/clip_21/start_frame=0 122 | animation/clip_21/end_frame=0 123 | animation/clip_21/loops=false 124 | animation/clip_22/name="" 125 | animation/clip_22/start_frame=0 126 | animation/clip_22/end_frame=0 127 | animation/clip_22/loops=false 128 | animation/clip_23/name="" 129 | animation/clip_23/start_frame=0 130 | animation/clip_23/end_frame=0 131 | animation/clip_23/loops=false 132 | animation/clip_24/name="" 133 | animation/clip_24/start_frame=0 134 | animation/clip_24/end_frame=0 135 | animation/clip_24/loops=false 136 | animation/clip_25/name="" 137 | animation/clip_25/start_frame=0 138 | animation/clip_25/end_frame=0 139 | animation/clip_25/loops=false 140 | animation/clip_26/name="" 141 | animation/clip_26/start_frame=0 142 | animation/clip_26/end_frame=0 143 | animation/clip_26/loops=false 144 | animation/clip_27/name="" 145 | animation/clip_27/start_frame=0 146 | animation/clip_27/end_frame=0 147 | animation/clip_27/loops=false 148 | animation/clip_28/name="" 149 | animation/clip_28/start_frame=0 150 | animation/clip_28/end_frame=0 151 | animation/clip_28/loops=false 152 | animation/clip_29/name="" 153 | animation/clip_29/start_frame=0 154 | animation/clip_29/end_frame=0 155 | animation/clip_29/loops=false 156 | animation/clip_30/name="" 157 | animation/clip_30/start_frame=0 158 | animation/clip_30/end_frame=0 159 | animation/clip_30/loops=false 160 | animation/clip_31/name="" 161 | animation/clip_31/start_frame=0 162 | animation/clip_31/end_frame=0 163 | animation/clip_31/loops=false 164 | animation/clip_32/name="" 165 | animation/clip_32/start_frame=0 166 | animation/clip_32/end_frame=0 167 | animation/clip_32/loops=false 168 | animation/clip_33/name="" 169 | animation/clip_33/start_frame=0 170 | animation/clip_33/end_frame=0 171 | animation/clip_33/loops=false 172 | animation/clip_34/name="" 173 | animation/clip_34/start_frame=0 174 | animation/clip_34/end_frame=0 175 | animation/clip_34/loops=false 176 | animation/clip_35/name="" 177 | animation/clip_35/start_frame=0 178 | animation/clip_35/end_frame=0 179 | animation/clip_35/loops=false 180 | animation/clip_36/name="" 181 | animation/clip_36/start_frame=0 182 | animation/clip_36/end_frame=0 183 | animation/clip_36/loops=false 184 | animation/clip_37/name="" 185 | animation/clip_37/start_frame=0 186 | animation/clip_37/end_frame=0 187 | animation/clip_37/loops=false 188 | animation/clip_38/name="" 189 | animation/clip_38/start_frame=0 190 | animation/clip_38/end_frame=0 191 | animation/clip_38/loops=false 192 | animation/clip_39/name="" 193 | animation/clip_39/start_frame=0 194 | animation/clip_39/end_frame=0 195 | animation/clip_39/loops=false 196 | animation/clip_40/name="" 197 | animation/clip_40/start_frame=0 198 | animation/clip_40/end_frame=0 199 | animation/clip_40/loops=false 200 | animation/clip_41/name="" 201 | animation/clip_41/start_frame=0 202 | animation/clip_41/end_frame=0 203 | animation/clip_41/loops=false 204 | animation/clip_42/name="" 205 | animation/clip_42/start_frame=0 206 | animation/clip_42/end_frame=0 207 | animation/clip_42/loops=false 208 | animation/clip_43/name="" 209 | animation/clip_43/start_frame=0 210 | animation/clip_43/end_frame=0 211 | animation/clip_43/loops=false 212 | animation/clip_44/name="" 213 | animation/clip_44/start_frame=0 214 | animation/clip_44/end_frame=0 215 | animation/clip_44/loops=false 216 | animation/clip_45/name="" 217 | animation/clip_45/start_frame=0 218 | animation/clip_45/end_frame=0 219 | animation/clip_45/loops=false 220 | animation/clip_46/name="" 221 | animation/clip_46/start_frame=0 222 | animation/clip_46/end_frame=0 223 | animation/clip_46/loops=false 224 | animation/clip_47/name="" 225 | animation/clip_47/start_frame=0 226 | animation/clip_47/end_frame=0 227 | animation/clip_47/loops=false 228 | animation/clip_48/name="" 229 | animation/clip_48/start_frame=0 230 | animation/clip_48/end_frame=0 231 | animation/clip_48/loops=false 232 | animation/clip_49/name="" 233 | animation/clip_49/start_frame=0 234 | animation/clip_49/end_frame=0 235 | animation/clip_49/loops=false 236 | animation/clip_50/name="" 237 | animation/clip_50/start_frame=0 238 | animation/clip_50/end_frame=0 239 | animation/clip_50/loops=false 240 | animation/clip_51/name="" 241 | animation/clip_51/start_frame=0 242 | animation/clip_51/end_frame=0 243 | animation/clip_51/loops=false 244 | animation/clip_52/name="" 245 | animation/clip_52/start_frame=0 246 | animation/clip_52/end_frame=0 247 | animation/clip_52/loops=false 248 | animation/clip_53/name="" 249 | animation/clip_53/start_frame=0 250 | animation/clip_53/end_frame=0 251 | animation/clip_53/loops=false 252 | animation/clip_54/name="" 253 | animation/clip_54/start_frame=0 254 | animation/clip_54/end_frame=0 255 | animation/clip_54/loops=false 256 | animation/clip_55/name="" 257 | animation/clip_55/start_frame=0 258 | animation/clip_55/end_frame=0 259 | animation/clip_55/loops=false 260 | animation/clip_56/name="" 261 | animation/clip_56/start_frame=0 262 | animation/clip_56/end_frame=0 263 | animation/clip_56/loops=false 264 | animation/clip_57/name="" 265 | animation/clip_57/start_frame=0 266 | animation/clip_57/end_frame=0 267 | animation/clip_57/loops=false 268 | animation/clip_58/name="" 269 | animation/clip_58/start_frame=0 270 | animation/clip_58/end_frame=0 271 | animation/clip_58/loops=false 272 | animation/clip_59/name="" 273 | animation/clip_59/start_frame=0 274 | animation/clip_59/end_frame=0 275 | animation/clip_59/loops=false 276 | animation/clip_60/name="" 277 | animation/clip_60/start_frame=0 278 | animation/clip_60/end_frame=0 279 | animation/clip_60/loops=false 280 | animation/clip_61/name="" 281 | animation/clip_61/start_frame=0 282 | animation/clip_61/end_frame=0 283 | animation/clip_61/loops=false 284 | animation/clip_62/name="" 285 | animation/clip_62/start_frame=0 286 | animation/clip_62/end_frame=0 287 | animation/clip_62/loops=false 288 | animation/clip_63/name="" 289 | animation/clip_63/start_frame=0 290 | animation/clip_63/end_frame=0 291 | animation/clip_63/loops=false 292 | animation/clip_64/name="" 293 | animation/clip_64/start_frame=0 294 | animation/clip_64/end_frame=0 295 | animation/clip_64/loops=false 296 | animation/clip_65/name="" 297 | animation/clip_65/start_frame=0 298 | animation/clip_65/end_frame=0 299 | animation/clip_65/loops=false 300 | animation/clip_66/name="" 301 | animation/clip_66/start_frame=0 302 | animation/clip_66/end_frame=0 303 | animation/clip_66/loops=false 304 | animation/clip_67/name="" 305 | animation/clip_67/start_frame=0 306 | animation/clip_67/end_frame=0 307 | animation/clip_67/loops=false 308 | animation/clip_68/name="" 309 | animation/clip_68/start_frame=0 310 | animation/clip_68/end_frame=0 311 | animation/clip_68/loops=false 312 | animation/clip_69/name="" 313 | animation/clip_69/start_frame=0 314 | animation/clip_69/end_frame=0 315 | animation/clip_69/loops=false 316 | animation/clip_70/name="" 317 | animation/clip_70/start_frame=0 318 | animation/clip_70/end_frame=0 319 | animation/clip_70/loops=false 320 | animation/clip_71/name="" 321 | animation/clip_71/start_frame=0 322 | animation/clip_71/end_frame=0 323 | animation/clip_71/loops=false 324 | animation/clip_72/name="" 325 | animation/clip_72/start_frame=0 326 | animation/clip_72/end_frame=0 327 | animation/clip_72/loops=false 328 | animation/clip_73/name="" 329 | animation/clip_73/start_frame=0 330 | animation/clip_73/end_frame=0 331 | animation/clip_73/loops=false 332 | animation/clip_74/name="" 333 | animation/clip_74/start_frame=0 334 | animation/clip_74/end_frame=0 335 | animation/clip_74/loops=false 336 | animation/clip_75/name="" 337 | animation/clip_75/start_frame=0 338 | animation/clip_75/end_frame=0 339 | animation/clip_75/loops=false 340 | animation/clip_76/name="" 341 | animation/clip_76/start_frame=0 342 | animation/clip_76/end_frame=0 343 | animation/clip_76/loops=false 344 | animation/clip_77/name="" 345 | animation/clip_77/start_frame=0 346 | animation/clip_77/end_frame=0 347 | animation/clip_77/loops=false 348 | animation/clip_78/name="" 349 | animation/clip_78/start_frame=0 350 | animation/clip_78/end_frame=0 351 | animation/clip_78/loops=false 352 | animation/clip_79/name="" 353 | animation/clip_79/start_frame=0 354 | animation/clip_79/end_frame=0 355 | animation/clip_79/loops=false 356 | animation/clip_80/name="" 357 | animation/clip_80/start_frame=0 358 | animation/clip_80/end_frame=0 359 | animation/clip_80/loops=false 360 | animation/clip_81/name="" 361 | animation/clip_81/start_frame=0 362 | animation/clip_81/end_frame=0 363 | animation/clip_81/loops=false 364 | animation/clip_82/name="" 365 | animation/clip_82/start_frame=0 366 | animation/clip_82/end_frame=0 367 | animation/clip_82/loops=false 368 | animation/clip_83/name="" 369 | animation/clip_83/start_frame=0 370 | animation/clip_83/end_frame=0 371 | animation/clip_83/loops=false 372 | animation/clip_84/name="" 373 | animation/clip_84/start_frame=0 374 | animation/clip_84/end_frame=0 375 | animation/clip_84/loops=false 376 | animation/clip_85/name="" 377 | animation/clip_85/start_frame=0 378 | animation/clip_85/end_frame=0 379 | animation/clip_85/loops=false 380 | animation/clip_86/name="" 381 | animation/clip_86/start_frame=0 382 | animation/clip_86/end_frame=0 383 | animation/clip_86/loops=false 384 | animation/clip_87/name="" 385 | animation/clip_87/start_frame=0 386 | animation/clip_87/end_frame=0 387 | animation/clip_87/loops=false 388 | animation/clip_88/name="" 389 | animation/clip_88/start_frame=0 390 | animation/clip_88/end_frame=0 391 | animation/clip_88/loops=false 392 | animation/clip_89/name="" 393 | animation/clip_89/start_frame=0 394 | animation/clip_89/end_frame=0 395 | animation/clip_89/loops=false 396 | animation/clip_90/name="" 397 | animation/clip_90/start_frame=0 398 | animation/clip_90/end_frame=0 399 | animation/clip_90/loops=false 400 | animation/clip_91/name="" 401 | animation/clip_91/start_frame=0 402 | animation/clip_91/end_frame=0 403 | animation/clip_91/loops=false 404 | animation/clip_92/name="" 405 | animation/clip_92/start_frame=0 406 | animation/clip_92/end_frame=0 407 | animation/clip_92/loops=false 408 | animation/clip_93/name="" 409 | animation/clip_93/start_frame=0 410 | animation/clip_93/end_frame=0 411 | animation/clip_93/loops=false 412 | animation/clip_94/name="" 413 | animation/clip_94/start_frame=0 414 | animation/clip_94/end_frame=0 415 | animation/clip_94/loops=false 416 | animation/clip_95/name="" 417 | animation/clip_95/start_frame=0 418 | animation/clip_95/end_frame=0 419 | animation/clip_95/loops=false 420 | animation/clip_96/name="" 421 | animation/clip_96/start_frame=0 422 | animation/clip_96/end_frame=0 423 | animation/clip_96/loops=false 424 | animation/clip_97/name="" 425 | animation/clip_97/start_frame=0 426 | animation/clip_97/end_frame=0 427 | animation/clip_97/loops=false 428 | animation/clip_98/name="" 429 | animation/clip_98/start_frame=0 430 | animation/clip_98/end_frame=0 431 | animation/clip_98/loops=false 432 | animation/clip_99/name="" 433 | animation/clip_99/start_frame=0 434 | animation/clip_99/end_frame=0 435 | animation/clip_99/loops=false 436 | animation/clip_100/name="" 437 | animation/clip_100/start_frame=0 438 | animation/clip_100/end_frame=0 439 | animation/clip_100/loops=false 440 | animation/clip_101/name="" 441 | animation/clip_101/start_frame=0 442 | animation/clip_101/end_frame=0 443 | animation/clip_101/loops=false 444 | animation/clip_102/name="" 445 | animation/clip_102/start_frame=0 446 | animation/clip_102/end_frame=0 447 | animation/clip_102/loops=false 448 | animation/clip_103/name="" 449 | animation/clip_103/start_frame=0 450 | animation/clip_103/end_frame=0 451 | animation/clip_103/loops=false 452 | animation/clip_104/name="" 453 | animation/clip_104/start_frame=0 454 | animation/clip_104/end_frame=0 455 | animation/clip_104/loops=false 456 | animation/clip_105/name="" 457 | animation/clip_105/start_frame=0 458 | animation/clip_105/end_frame=0 459 | animation/clip_105/loops=false 460 | animation/clip_106/name="" 461 | animation/clip_106/start_frame=0 462 | animation/clip_106/end_frame=0 463 | animation/clip_106/loops=false 464 | animation/clip_107/name="" 465 | animation/clip_107/start_frame=0 466 | animation/clip_107/end_frame=0 467 | animation/clip_107/loops=false 468 | animation/clip_108/name="" 469 | animation/clip_108/start_frame=0 470 | animation/clip_108/end_frame=0 471 | animation/clip_108/loops=false 472 | animation/clip_109/name="" 473 | animation/clip_109/start_frame=0 474 | animation/clip_109/end_frame=0 475 | animation/clip_109/loops=false 476 | animation/clip_110/name="" 477 | animation/clip_110/start_frame=0 478 | animation/clip_110/end_frame=0 479 | animation/clip_110/loops=false 480 | animation/clip_111/name="" 481 | animation/clip_111/start_frame=0 482 | animation/clip_111/end_frame=0 483 | animation/clip_111/loops=false 484 | animation/clip_112/name="" 485 | animation/clip_112/start_frame=0 486 | animation/clip_112/end_frame=0 487 | animation/clip_112/loops=false 488 | animation/clip_113/name="" 489 | animation/clip_113/start_frame=0 490 | animation/clip_113/end_frame=0 491 | animation/clip_113/loops=false 492 | animation/clip_114/name="" 493 | animation/clip_114/start_frame=0 494 | animation/clip_114/end_frame=0 495 | animation/clip_114/loops=false 496 | animation/clip_115/name="" 497 | animation/clip_115/start_frame=0 498 | animation/clip_115/end_frame=0 499 | animation/clip_115/loops=false 500 | animation/clip_116/name="" 501 | animation/clip_116/start_frame=0 502 | animation/clip_116/end_frame=0 503 | animation/clip_116/loops=false 504 | animation/clip_117/name="" 505 | animation/clip_117/start_frame=0 506 | animation/clip_117/end_frame=0 507 | animation/clip_117/loops=false 508 | animation/clip_118/name="" 509 | animation/clip_118/start_frame=0 510 | animation/clip_118/end_frame=0 511 | animation/clip_118/loops=false 512 | animation/clip_119/name="" 513 | animation/clip_119/start_frame=0 514 | animation/clip_119/end_frame=0 515 | animation/clip_119/loops=false 516 | animation/clip_120/name="" 517 | animation/clip_120/start_frame=0 518 | animation/clip_120/end_frame=0 519 | animation/clip_120/loops=false 520 | animation/clip_121/name="" 521 | animation/clip_121/start_frame=0 522 | animation/clip_121/end_frame=0 523 | animation/clip_121/loops=false 524 | animation/clip_122/name="" 525 | animation/clip_122/start_frame=0 526 | animation/clip_122/end_frame=0 527 | animation/clip_122/loops=false 528 | animation/clip_123/name="" 529 | animation/clip_123/start_frame=0 530 | animation/clip_123/end_frame=0 531 | animation/clip_123/loops=false 532 | animation/clip_124/name="" 533 | animation/clip_124/start_frame=0 534 | animation/clip_124/end_frame=0 535 | animation/clip_124/loops=false 536 | animation/clip_125/name="" 537 | animation/clip_125/start_frame=0 538 | animation/clip_125/end_frame=0 539 | animation/clip_125/loops=false 540 | animation/clip_126/name="" 541 | animation/clip_126/start_frame=0 542 | animation/clip_126/end_frame=0 543 | animation/clip_126/loops=false 544 | animation/clip_127/name="" 545 | animation/clip_127/start_frame=0 546 | animation/clip_127/end_frame=0 547 | animation/clip_127/loops=false 548 | animation/clip_128/name="" 549 | animation/clip_128/start_frame=0 550 | animation/clip_128/end_frame=0 551 | animation/clip_128/loops=false 552 | animation/clip_129/name="" 553 | animation/clip_129/start_frame=0 554 | animation/clip_129/end_frame=0 555 | animation/clip_129/loops=false 556 | animation/clip_130/name="" 557 | animation/clip_130/start_frame=0 558 | animation/clip_130/end_frame=0 559 | animation/clip_130/loops=false 560 | animation/clip_131/name="" 561 | animation/clip_131/start_frame=0 562 | animation/clip_131/end_frame=0 563 | animation/clip_131/loops=false 564 | animation/clip_132/name="" 565 | animation/clip_132/start_frame=0 566 | animation/clip_132/end_frame=0 567 | animation/clip_132/loops=false 568 | animation/clip_133/name="" 569 | animation/clip_133/start_frame=0 570 | animation/clip_133/end_frame=0 571 | animation/clip_133/loops=false 572 | animation/clip_134/name="" 573 | animation/clip_134/start_frame=0 574 | animation/clip_134/end_frame=0 575 | animation/clip_134/loops=false 576 | animation/clip_135/name="" 577 | animation/clip_135/start_frame=0 578 | animation/clip_135/end_frame=0 579 | animation/clip_135/loops=false 580 | animation/clip_136/name="" 581 | animation/clip_136/start_frame=0 582 | animation/clip_136/end_frame=0 583 | animation/clip_136/loops=false 584 | animation/clip_137/name="" 585 | animation/clip_137/start_frame=0 586 | animation/clip_137/end_frame=0 587 | animation/clip_137/loops=false 588 | animation/clip_138/name="" 589 | animation/clip_138/start_frame=0 590 | animation/clip_138/end_frame=0 591 | animation/clip_138/loops=false 592 | animation/clip_139/name="" 593 | animation/clip_139/start_frame=0 594 | animation/clip_139/end_frame=0 595 | animation/clip_139/loops=false 596 | animation/clip_140/name="" 597 | animation/clip_140/start_frame=0 598 | animation/clip_140/end_frame=0 599 | animation/clip_140/loops=false 600 | animation/clip_141/name="" 601 | animation/clip_141/start_frame=0 602 | animation/clip_141/end_frame=0 603 | animation/clip_141/loops=false 604 | animation/clip_142/name="" 605 | animation/clip_142/start_frame=0 606 | animation/clip_142/end_frame=0 607 | animation/clip_142/loops=false 608 | animation/clip_143/name="" 609 | animation/clip_143/start_frame=0 610 | animation/clip_143/end_frame=0 611 | animation/clip_143/loops=false 612 | animation/clip_144/name="" 613 | animation/clip_144/start_frame=0 614 | animation/clip_144/end_frame=0 615 | animation/clip_144/loops=false 616 | animation/clip_145/name="" 617 | animation/clip_145/start_frame=0 618 | animation/clip_145/end_frame=0 619 | animation/clip_145/loops=false 620 | animation/clip_146/name="" 621 | animation/clip_146/start_frame=0 622 | animation/clip_146/end_frame=0 623 | animation/clip_146/loops=false 624 | animation/clip_147/name="" 625 | animation/clip_147/start_frame=0 626 | animation/clip_147/end_frame=0 627 | animation/clip_147/loops=false 628 | animation/clip_148/name="" 629 | animation/clip_148/start_frame=0 630 | animation/clip_148/end_frame=0 631 | animation/clip_148/loops=false 632 | animation/clip_149/name="" 633 | animation/clip_149/start_frame=0 634 | animation/clip_149/end_frame=0 635 | animation/clip_149/loops=false 636 | animation/clip_150/name="" 637 | animation/clip_150/start_frame=0 638 | animation/clip_150/end_frame=0 639 | animation/clip_150/loops=false 640 | animation/clip_151/name="" 641 | animation/clip_151/start_frame=0 642 | animation/clip_151/end_frame=0 643 | animation/clip_151/loops=false 644 | animation/clip_152/name="" 645 | animation/clip_152/start_frame=0 646 | animation/clip_152/end_frame=0 647 | animation/clip_152/loops=false 648 | animation/clip_153/name="" 649 | animation/clip_153/start_frame=0 650 | animation/clip_153/end_frame=0 651 | animation/clip_153/loops=false 652 | animation/clip_154/name="" 653 | animation/clip_154/start_frame=0 654 | animation/clip_154/end_frame=0 655 | animation/clip_154/loops=false 656 | animation/clip_155/name="" 657 | animation/clip_155/start_frame=0 658 | animation/clip_155/end_frame=0 659 | animation/clip_155/loops=false 660 | animation/clip_156/name="" 661 | animation/clip_156/start_frame=0 662 | animation/clip_156/end_frame=0 663 | animation/clip_156/loops=false 664 | animation/clip_157/name="" 665 | animation/clip_157/start_frame=0 666 | animation/clip_157/end_frame=0 667 | animation/clip_157/loops=false 668 | animation/clip_158/name="" 669 | animation/clip_158/start_frame=0 670 | animation/clip_158/end_frame=0 671 | animation/clip_158/loops=false 672 | animation/clip_159/name="" 673 | animation/clip_159/start_frame=0 674 | animation/clip_159/end_frame=0 675 | animation/clip_159/loops=false 676 | animation/clip_160/name="" 677 | animation/clip_160/start_frame=0 678 | animation/clip_160/end_frame=0 679 | animation/clip_160/loops=false 680 | animation/clip_161/name="" 681 | animation/clip_161/start_frame=0 682 | animation/clip_161/end_frame=0 683 | animation/clip_161/loops=false 684 | animation/clip_162/name="" 685 | animation/clip_162/start_frame=0 686 | animation/clip_162/end_frame=0 687 | animation/clip_162/loops=false 688 | animation/clip_163/name="" 689 | animation/clip_163/start_frame=0 690 | animation/clip_163/end_frame=0 691 | animation/clip_163/loops=false 692 | animation/clip_164/name="" 693 | animation/clip_164/start_frame=0 694 | animation/clip_164/end_frame=0 695 | animation/clip_164/loops=false 696 | animation/clip_165/name="" 697 | animation/clip_165/start_frame=0 698 | animation/clip_165/end_frame=0 699 | animation/clip_165/loops=false 700 | animation/clip_166/name="" 701 | animation/clip_166/start_frame=0 702 | animation/clip_166/end_frame=0 703 | animation/clip_166/loops=false 704 | animation/clip_167/name="" 705 | animation/clip_167/start_frame=0 706 | animation/clip_167/end_frame=0 707 | animation/clip_167/loops=false 708 | animation/clip_168/name="" 709 | animation/clip_168/start_frame=0 710 | animation/clip_168/end_frame=0 711 | animation/clip_168/loops=false 712 | animation/clip_169/name="" 713 | animation/clip_169/start_frame=0 714 | animation/clip_169/end_frame=0 715 | animation/clip_169/loops=false 716 | animation/clip_170/name="" 717 | animation/clip_170/start_frame=0 718 | animation/clip_170/end_frame=0 719 | animation/clip_170/loops=false 720 | animation/clip_171/name="" 721 | animation/clip_171/start_frame=0 722 | animation/clip_171/end_frame=0 723 | animation/clip_171/loops=false 724 | animation/clip_172/name="" 725 | animation/clip_172/start_frame=0 726 | animation/clip_172/end_frame=0 727 | animation/clip_172/loops=false 728 | animation/clip_173/name="" 729 | animation/clip_173/start_frame=0 730 | animation/clip_173/end_frame=0 731 | animation/clip_173/loops=false 732 | animation/clip_174/name="" 733 | animation/clip_174/start_frame=0 734 | animation/clip_174/end_frame=0 735 | animation/clip_174/loops=false 736 | animation/clip_175/name="" 737 | animation/clip_175/start_frame=0 738 | animation/clip_175/end_frame=0 739 | animation/clip_175/loops=false 740 | animation/clip_176/name="" 741 | animation/clip_176/start_frame=0 742 | animation/clip_176/end_frame=0 743 | animation/clip_176/loops=false 744 | animation/clip_177/name="" 745 | animation/clip_177/start_frame=0 746 | animation/clip_177/end_frame=0 747 | animation/clip_177/loops=false 748 | animation/clip_178/name="" 749 | animation/clip_178/start_frame=0 750 | animation/clip_178/end_frame=0 751 | animation/clip_178/loops=false 752 | animation/clip_179/name="" 753 | animation/clip_179/start_frame=0 754 | animation/clip_179/end_frame=0 755 | animation/clip_179/loops=false 756 | animation/clip_180/name="" 757 | animation/clip_180/start_frame=0 758 | animation/clip_180/end_frame=0 759 | animation/clip_180/loops=false 760 | animation/clip_181/name="" 761 | animation/clip_181/start_frame=0 762 | animation/clip_181/end_frame=0 763 | animation/clip_181/loops=false 764 | animation/clip_182/name="" 765 | animation/clip_182/start_frame=0 766 | animation/clip_182/end_frame=0 767 | animation/clip_182/loops=false 768 | animation/clip_183/name="" 769 | animation/clip_183/start_frame=0 770 | animation/clip_183/end_frame=0 771 | animation/clip_183/loops=false 772 | animation/clip_184/name="" 773 | animation/clip_184/start_frame=0 774 | animation/clip_184/end_frame=0 775 | animation/clip_184/loops=false 776 | animation/clip_185/name="" 777 | animation/clip_185/start_frame=0 778 | animation/clip_185/end_frame=0 779 | animation/clip_185/loops=false 780 | animation/clip_186/name="" 781 | animation/clip_186/start_frame=0 782 | animation/clip_186/end_frame=0 783 | animation/clip_186/loops=false 784 | animation/clip_187/name="" 785 | animation/clip_187/start_frame=0 786 | animation/clip_187/end_frame=0 787 | animation/clip_187/loops=false 788 | animation/clip_188/name="" 789 | animation/clip_188/start_frame=0 790 | animation/clip_188/end_frame=0 791 | animation/clip_188/loops=false 792 | animation/clip_189/name="" 793 | animation/clip_189/start_frame=0 794 | animation/clip_189/end_frame=0 795 | animation/clip_189/loops=false 796 | animation/clip_190/name="" 797 | animation/clip_190/start_frame=0 798 | animation/clip_190/end_frame=0 799 | animation/clip_190/loops=false 800 | animation/clip_191/name="" 801 | animation/clip_191/start_frame=0 802 | animation/clip_191/end_frame=0 803 | animation/clip_191/loops=false 804 | animation/clip_192/name="" 805 | animation/clip_192/start_frame=0 806 | animation/clip_192/end_frame=0 807 | animation/clip_192/loops=false 808 | animation/clip_193/name="" 809 | animation/clip_193/start_frame=0 810 | animation/clip_193/end_frame=0 811 | animation/clip_193/loops=false 812 | animation/clip_194/name="" 813 | animation/clip_194/start_frame=0 814 | animation/clip_194/end_frame=0 815 | animation/clip_194/loops=false 816 | animation/clip_195/name="" 817 | animation/clip_195/start_frame=0 818 | animation/clip_195/end_frame=0 819 | animation/clip_195/loops=false 820 | animation/clip_196/name="" 821 | animation/clip_196/start_frame=0 822 | animation/clip_196/end_frame=0 823 | animation/clip_196/loops=false 824 | animation/clip_197/name="" 825 | animation/clip_197/start_frame=0 826 | animation/clip_197/end_frame=0 827 | animation/clip_197/loops=false 828 | animation/clip_198/name="" 829 | animation/clip_198/start_frame=0 830 | animation/clip_198/end_frame=0 831 | animation/clip_198/loops=false 832 | animation/clip_199/name="" 833 | animation/clip_199/start_frame=0 834 | animation/clip_199/end_frame=0 835 | animation/clip_199/loops=false 836 | animation/clip_200/name="" 837 | animation/clip_200/start_frame=0 838 | animation/clip_200/end_frame=0 839 | animation/clip_200/loops=false 840 | animation/clip_201/name="" 841 | animation/clip_201/start_frame=0 842 | animation/clip_201/end_frame=0 843 | animation/clip_201/loops=false 844 | animation/clip_202/name="" 845 | animation/clip_202/start_frame=0 846 | animation/clip_202/end_frame=0 847 | animation/clip_202/loops=false 848 | animation/clip_203/name="" 849 | animation/clip_203/start_frame=0 850 | animation/clip_203/end_frame=0 851 | animation/clip_203/loops=false 852 | animation/clip_204/name="" 853 | animation/clip_204/start_frame=0 854 | animation/clip_204/end_frame=0 855 | animation/clip_204/loops=false 856 | animation/clip_205/name="" 857 | animation/clip_205/start_frame=0 858 | animation/clip_205/end_frame=0 859 | animation/clip_205/loops=false 860 | animation/clip_206/name="" 861 | animation/clip_206/start_frame=0 862 | animation/clip_206/end_frame=0 863 | animation/clip_206/loops=false 864 | animation/clip_207/name="" 865 | animation/clip_207/start_frame=0 866 | animation/clip_207/end_frame=0 867 | animation/clip_207/loops=false 868 | animation/clip_208/name="" 869 | animation/clip_208/start_frame=0 870 | animation/clip_208/end_frame=0 871 | animation/clip_208/loops=false 872 | animation/clip_209/name="" 873 | animation/clip_209/start_frame=0 874 | animation/clip_209/end_frame=0 875 | animation/clip_209/loops=false 876 | animation/clip_210/name="" 877 | animation/clip_210/start_frame=0 878 | animation/clip_210/end_frame=0 879 | animation/clip_210/loops=false 880 | animation/clip_211/name="" 881 | animation/clip_211/start_frame=0 882 | animation/clip_211/end_frame=0 883 | animation/clip_211/loops=false 884 | animation/clip_212/name="" 885 | animation/clip_212/start_frame=0 886 | animation/clip_212/end_frame=0 887 | animation/clip_212/loops=false 888 | animation/clip_213/name="" 889 | animation/clip_213/start_frame=0 890 | animation/clip_213/end_frame=0 891 | animation/clip_213/loops=false 892 | animation/clip_214/name="" 893 | animation/clip_214/start_frame=0 894 | animation/clip_214/end_frame=0 895 | animation/clip_214/loops=false 896 | animation/clip_215/name="" 897 | animation/clip_215/start_frame=0 898 | animation/clip_215/end_frame=0 899 | animation/clip_215/loops=false 900 | animation/clip_216/name="" 901 | animation/clip_216/start_frame=0 902 | animation/clip_216/end_frame=0 903 | animation/clip_216/loops=false 904 | animation/clip_217/name="" 905 | animation/clip_217/start_frame=0 906 | animation/clip_217/end_frame=0 907 | animation/clip_217/loops=false 908 | animation/clip_218/name="" 909 | animation/clip_218/start_frame=0 910 | animation/clip_218/end_frame=0 911 | animation/clip_218/loops=false 912 | animation/clip_219/name="" 913 | animation/clip_219/start_frame=0 914 | animation/clip_219/end_frame=0 915 | animation/clip_219/loops=false 916 | animation/clip_220/name="" 917 | animation/clip_220/start_frame=0 918 | animation/clip_220/end_frame=0 919 | animation/clip_220/loops=false 920 | animation/clip_221/name="" 921 | animation/clip_221/start_frame=0 922 | animation/clip_221/end_frame=0 923 | animation/clip_221/loops=false 924 | animation/clip_222/name="" 925 | animation/clip_222/start_frame=0 926 | animation/clip_222/end_frame=0 927 | animation/clip_222/loops=false 928 | animation/clip_223/name="" 929 | animation/clip_223/start_frame=0 930 | animation/clip_223/end_frame=0 931 | animation/clip_223/loops=false 932 | animation/clip_224/name="" 933 | animation/clip_224/start_frame=0 934 | animation/clip_224/end_frame=0 935 | animation/clip_224/loops=false 936 | animation/clip_225/name="" 937 | animation/clip_225/start_frame=0 938 | animation/clip_225/end_frame=0 939 | animation/clip_225/loops=false 940 | animation/clip_226/name="" 941 | animation/clip_226/start_frame=0 942 | animation/clip_226/end_frame=0 943 | animation/clip_226/loops=false 944 | animation/clip_227/name="" 945 | animation/clip_227/start_frame=0 946 | animation/clip_227/end_frame=0 947 | animation/clip_227/loops=false 948 | animation/clip_228/name="" 949 | animation/clip_228/start_frame=0 950 | animation/clip_228/end_frame=0 951 | animation/clip_228/loops=false 952 | animation/clip_229/name="" 953 | animation/clip_229/start_frame=0 954 | animation/clip_229/end_frame=0 955 | animation/clip_229/loops=false 956 | animation/clip_230/name="" 957 | animation/clip_230/start_frame=0 958 | animation/clip_230/end_frame=0 959 | animation/clip_230/loops=false 960 | animation/clip_231/name="" 961 | animation/clip_231/start_frame=0 962 | animation/clip_231/end_frame=0 963 | animation/clip_231/loops=false 964 | animation/clip_232/name="" 965 | animation/clip_232/start_frame=0 966 | animation/clip_232/end_frame=0 967 | animation/clip_232/loops=false 968 | animation/clip_233/name="" 969 | animation/clip_233/start_frame=0 970 | animation/clip_233/end_frame=0 971 | animation/clip_233/loops=false 972 | animation/clip_234/name="" 973 | animation/clip_234/start_frame=0 974 | animation/clip_234/end_frame=0 975 | animation/clip_234/loops=false 976 | animation/clip_235/name="" 977 | animation/clip_235/start_frame=0 978 | animation/clip_235/end_frame=0 979 | animation/clip_235/loops=false 980 | animation/clip_236/name="" 981 | animation/clip_236/start_frame=0 982 | animation/clip_236/end_frame=0 983 | animation/clip_236/loops=false 984 | animation/clip_237/name="" 985 | animation/clip_237/start_frame=0 986 | animation/clip_237/end_frame=0 987 | animation/clip_237/loops=false 988 | animation/clip_238/name="" 989 | animation/clip_238/start_frame=0 990 | animation/clip_238/end_frame=0 991 | animation/clip_238/loops=false 992 | animation/clip_239/name="" 993 | animation/clip_239/start_frame=0 994 | animation/clip_239/end_frame=0 995 | animation/clip_239/loops=false 996 | animation/clip_240/name="" 997 | animation/clip_240/start_frame=0 998 | animation/clip_240/end_frame=0 999 | animation/clip_240/loops=false 1000 | animation/clip_241/name="" 1001 | animation/clip_241/start_frame=0 1002 | animation/clip_241/end_frame=0 1003 | animation/clip_241/loops=false 1004 | animation/clip_242/name="" 1005 | animation/clip_242/start_frame=0 1006 | animation/clip_242/end_frame=0 1007 | animation/clip_242/loops=false 1008 | animation/clip_243/name="" 1009 | animation/clip_243/start_frame=0 1010 | animation/clip_243/end_frame=0 1011 | animation/clip_243/loops=false 1012 | animation/clip_244/name="" 1013 | animation/clip_244/start_frame=0 1014 | animation/clip_244/end_frame=0 1015 | animation/clip_244/loops=false 1016 | animation/clip_245/name="" 1017 | animation/clip_245/start_frame=0 1018 | animation/clip_245/end_frame=0 1019 | animation/clip_245/loops=false 1020 | animation/clip_246/name="" 1021 | animation/clip_246/start_frame=0 1022 | animation/clip_246/end_frame=0 1023 | animation/clip_246/loops=false 1024 | animation/clip_247/name="" 1025 | animation/clip_247/start_frame=0 1026 | animation/clip_247/end_frame=0 1027 | animation/clip_247/loops=false 1028 | animation/clip_248/name="" 1029 | animation/clip_248/start_frame=0 1030 | animation/clip_248/end_frame=0 1031 | animation/clip_248/loops=false 1032 | animation/clip_249/name="" 1033 | animation/clip_249/start_frame=0 1034 | animation/clip_249/end_frame=0 1035 | animation/clip_249/loops=false 1036 | animation/clip_250/name="" 1037 | animation/clip_250/start_frame=0 1038 | animation/clip_250/end_frame=0 1039 | animation/clip_250/loops=false 1040 | animation/clip_251/name="" 1041 | animation/clip_251/start_frame=0 1042 | animation/clip_251/end_frame=0 1043 | animation/clip_251/loops=false 1044 | animation/clip_252/name="" 1045 | animation/clip_252/start_frame=0 1046 | animation/clip_252/end_frame=0 1047 | animation/clip_252/loops=false 1048 | animation/clip_253/name="" 1049 | animation/clip_253/start_frame=0 1050 | animation/clip_253/end_frame=0 1051 | animation/clip_253/loops=false 1052 | animation/clip_254/name="" 1053 | animation/clip_254/start_frame=0 1054 | animation/clip_254/end_frame=0 1055 | animation/clip_254/loops=false 1056 | animation/clip_255/name="" 1057 | animation/clip_255/start_frame=0 1058 | animation/clip_255/end_frame=0 1059 | animation/clip_255/loops=false 1060 | animation/clip_256/name="" 1061 | animation/clip_256/start_frame=0 1062 | animation/clip_256/end_frame=0 1063 | animation/clip_256/loops=false 1064 | --------------------------------------------------------------------------------