diff --git a/README.md b/README.md index b2699d9..1ddd937 100644 --- a/README.md +++ b/README.md @@ -299,6 +299,23 @@ Two things worth knowing before you re-prompt: The builder box-projects UVs at a per-material metres-per-tile scale; facades pick glass/brick/concrete/heritage/sandstone by height, building tag and id hash. +### Cashies tool props (dealgod → TRELLIS) + +`assets/tools/*.glb` are real secondhand-shop stock: photos pulled from the +dealgod.pro products database (~82k tool listings with images), curated one +clean shot per class, then run through the MODELBEAST farm with +[tools/cc_to_glb.py](tools/cc_to_glb.py) — `bg_remove_local` cutout first +(the farm's own docs call that the big quality jump), then `trellis_mac` +image→3D (1024 tier, 1024 texture ≈ prop-grade, a few MB each). The dragway +paddock strews the whole library as shuntable RigidBodies via +`TOOL_SPECS` in [dragway.gd](levels/willowbank_dragway/dragway.gd) — real-world +size per class (TRELLIS output is unit-ish) and honest masses, so clipping the +70 kg engine crane at speed is a different event to punting a grease gun. +The library is deliberately game-agnostic: photo in, scaled GLB out — reusable +for every future project. Textures inherit whatever branding was in the source +photo (they're secondhand listings), which is fine for props but don't promote +one to hero-asset status without checking what's written on it. + `woolies_carpark` is the one level still built in GDScript rather than as a GLB ([carpark.gd](levels/woolies_carpark/carpark.gd)) — its parked shitboxes have to stay shuntable RigidBodies, which a static GLB can't carry. It picks its parked diff --git a/assets/tools/angle_grinder.glb b/assets/tools/angle_grinder.glb new file mode 100644 index 0000000..cb87ca9 Binary files /dev/null and b/assets/tools/angle_grinder.glb differ diff --git a/assets/tools/angle_grinder.glb.import b/assets/tools/angle_grinder.glb.import new file mode 100644 index 0000000..6c4bbd2 --- /dev/null +++ b/assets/tools/angle_grinder.glb.import @@ -0,0 +1,45 @@ +[remap] + +importer="scene" +importer_version=1 +type="PackedScene" +uid="uid://nl02b6k7v026" +path="res://.godot/imported/angle_grinder.glb-55059b4166594232ecf7a3548514d48d.scn" + +[deps] + +source_file="res://assets/tools/angle_grinder.glb" +dest_files=["res://.godot/imported/angle_grinder.glb-55059b4166594232ecf7a3548514d48d.scn"] + +[params] + +nodes/root_type="" +nodes/root_name="" +nodes/root_script=null +mesh_library/use_node_names_as_mesh_names=false +array_mesh/deduplicate_surfaces=true +nodes/apply_root_scale=true +nodes/root_scale=1.0 +nodes/import_as_skeleton_bones=false +nodes/use_name_suffixes=true +nodes/use_node_type_suffixes=true +meshes/ensure_tangents=true +meshes/generate_lods=true +meshes/create_shadow_meshes=true +meshes/light_baking=1 +meshes/lightmap_texel_size=0.2 +meshes/force_disable_compression=false +skins/use_named_skins=true +animation/import=true +animation/fps=30 +animation/trimming=false +animation/remove_immutable_tracks=true +animation/import_rest_as_RESET=false +import_script/path="" +materials/extract=0 +materials/extract_format=0 +materials/extract_path="" +_subresources={} +gltf/naming_version=2 +gltf/embedded_image_handling=1 +gltf/texture_map_mode=1 diff --git a/assets/tools/angle_grinder_Image_0.jpg b/assets/tools/angle_grinder_Image_0.jpg new file mode 100644 index 0000000..cefa151 Binary files /dev/null and b/assets/tools/angle_grinder_Image_0.jpg differ diff --git a/assets/tools/angle_grinder_Image_0.jpg.import b/assets/tools/angle_grinder_Image_0.jpg.import new file mode 100644 index 0000000..4048ce3 --- /dev/null +++ b/assets/tools/angle_grinder_Image_0.jpg.import @@ -0,0 +1,43 @@ +[remap] + +importer="texture" +type="CompressedTexture2D" +uid="uid://bgx7y3c36ld0x" +path="res://.godot/imported/angle_grinder_Image_0.jpg-01d706181e0a16553e17624264d50e4e.ctex" +metadata={ +"vram_texture": false +} +generator_parameters={ +"md5": "3c8d3ff771986047ee9ac1af7c646bbc" +} + +[deps] + +source_file="res://assets/tools/angle_grinder_Image_0.jpg" +dest_files=["res://.godot/imported/angle_grinder_Image_0.jpg-01d706181e0a16553e17624264d50e4e.ctex"] + +[params] + +compress/mode=0 +compress/high_quality=false +compress/lossy_quality=0.7 +compress/uastc_level=0 +compress/rdo_quality_loss=0.0 +compress/hdr_compression=1 +compress/normal_map=0 +compress/channel_pack=0 +mipmaps/generate=true +mipmaps/limit=-1 +roughness/mode=0 +roughness/src_normal="" +process/channel_remap/red=0 +process/channel_remap/green=1 +process/channel_remap/blue=2 +process/channel_remap/alpha=3 +process/fix_alpha_border=true +process/premult_alpha=false +process/normal_map_invert_y=false +process/hdr_as_srgb=false +process/hdr_clamp_exposure=false +process/size_limit=0 +detect_3d/compress_to=1 diff --git a/assets/tools/angle_grinder_Image_1.jpg b/assets/tools/angle_grinder_Image_1.jpg new file mode 100644 index 0000000..32c4bdd Binary files /dev/null and b/assets/tools/angle_grinder_Image_1.jpg differ diff --git a/assets/tools/angle_grinder_Image_1.jpg.import b/assets/tools/angle_grinder_Image_1.jpg.import new file mode 100644 index 0000000..e24cb6e --- /dev/null +++ b/assets/tools/angle_grinder_Image_1.jpg.import @@ -0,0 +1,43 @@ +[remap] + +importer="texture" +type="CompressedTexture2D" +uid="uid://dorfsjgt6yl47" +path="res://.godot/imported/angle_grinder_Image_1.jpg-143b0e4e30c41e14a6234f83dc87d3a3.ctex" +metadata={ +"vram_texture": false +} +generator_parameters={ +"md5": "5b944766a4c6dfe2aa2adbf9c5a582af" +} + +[deps] + +source_file="res://assets/tools/angle_grinder_Image_1.jpg" +dest_files=["res://.godot/imported/angle_grinder_Image_1.jpg-143b0e4e30c41e14a6234f83dc87d3a3.ctex"] + +[params] + +compress/mode=0 +compress/high_quality=false +compress/lossy_quality=0.7 +compress/uastc_level=0 +compress/rdo_quality_loss=0.0 +compress/hdr_compression=1 +compress/normal_map=0 +compress/channel_pack=0 +mipmaps/generate=true +mipmaps/limit=-1 +roughness/mode=0 +roughness/src_normal="" +process/channel_remap/red=0 +process/channel_remap/green=1 +process/channel_remap/blue=2 +process/channel_remap/alpha=3 +process/fix_alpha_border=true +process/premult_alpha=false +process/normal_map_invert_y=false +process/hdr_as_srgb=false +process/hdr_clamp_exposure=false +process/size_limit=0 +detect_3d/compress_to=1 diff --git a/assets/tools/batt_charger.glb b/assets/tools/batt_charger.glb new file mode 100644 index 0000000..56fe4ca Binary files /dev/null and b/assets/tools/batt_charger.glb differ diff --git a/assets/tools/batt_charger.glb.import b/assets/tools/batt_charger.glb.import new file mode 100644 index 0000000..2a4f31a --- /dev/null +++ b/assets/tools/batt_charger.glb.import @@ -0,0 +1,45 @@ +[remap] + +importer="scene" +importer_version=1 +type="PackedScene" +uid="uid://cn7tm7t6j3k4w" +path="res://.godot/imported/batt_charger.glb-4bfc7982feef035e86c27453ef3d96b6.scn" + +[deps] + +source_file="res://assets/tools/batt_charger.glb" +dest_files=["res://.godot/imported/batt_charger.glb-4bfc7982feef035e86c27453ef3d96b6.scn"] + +[params] + +nodes/root_type="" +nodes/root_name="" +nodes/root_script=null +mesh_library/use_node_names_as_mesh_names=false +array_mesh/deduplicate_surfaces=true +nodes/apply_root_scale=true +nodes/root_scale=1.0 +nodes/import_as_skeleton_bones=false +nodes/use_name_suffixes=true +nodes/use_node_type_suffixes=true +meshes/ensure_tangents=true +meshes/generate_lods=true +meshes/create_shadow_meshes=true +meshes/light_baking=1 +meshes/lightmap_texel_size=0.2 +meshes/force_disable_compression=false +skins/use_named_skins=true +animation/import=true +animation/fps=30 +animation/trimming=false +animation/remove_immutable_tracks=true +animation/import_rest_as_RESET=false +import_script/path="" +materials/extract=0 +materials/extract_format=0 +materials/extract_path="" +_subresources={} +gltf/naming_version=2 +gltf/embedded_image_handling=1 +gltf/texture_map_mode=1 diff --git a/assets/tools/batt_charger_Image_0.jpg b/assets/tools/batt_charger_Image_0.jpg new file mode 100644 index 0000000..f7ce7e8 Binary files /dev/null and b/assets/tools/batt_charger_Image_0.jpg differ diff --git a/assets/tools/batt_charger_Image_0.jpg.import b/assets/tools/batt_charger_Image_0.jpg.import new file mode 100644 index 0000000..c0ac173 --- /dev/null +++ b/assets/tools/batt_charger_Image_0.jpg.import @@ -0,0 +1,43 @@ +[remap] + +importer="texture" +type="CompressedTexture2D" +uid="uid://cymxkheiy2rfd" +path="res://.godot/imported/batt_charger_Image_0.jpg-8b4e3e836229345b275629702f6203c6.ctex" +metadata={ +"vram_texture": false +} +generator_parameters={ +"md5": "88575dfbed853e78b667b91487ea2d88" +} + +[deps] + +source_file="res://assets/tools/batt_charger_Image_0.jpg" +dest_files=["res://.godot/imported/batt_charger_Image_0.jpg-8b4e3e836229345b275629702f6203c6.ctex"] + +[params] + +compress/mode=0 +compress/high_quality=false +compress/lossy_quality=0.7 +compress/uastc_level=0 +compress/rdo_quality_loss=0.0 +compress/hdr_compression=1 +compress/normal_map=0 +compress/channel_pack=0 +mipmaps/generate=true +mipmaps/limit=-1 +roughness/mode=0 +roughness/src_normal="" +process/channel_remap/red=0 +process/channel_remap/green=1 +process/channel_remap/blue=2 +process/channel_remap/alpha=3 +process/fix_alpha_border=true +process/premult_alpha=false +process/normal_map_invert_y=false +process/hdr_as_srgb=false +process/hdr_clamp_exposure=false +process/size_limit=0 +detect_3d/compress_to=1 diff --git a/assets/tools/batt_charger_Image_1.jpg b/assets/tools/batt_charger_Image_1.jpg new file mode 100644 index 0000000..2b53bed Binary files /dev/null and b/assets/tools/batt_charger_Image_1.jpg differ diff --git a/assets/tools/batt_charger_Image_1.jpg.import b/assets/tools/batt_charger_Image_1.jpg.import new file mode 100644 index 0000000..439d965 --- /dev/null +++ b/assets/tools/batt_charger_Image_1.jpg.import @@ -0,0 +1,43 @@ +[remap] + +importer="texture" +type="CompressedTexture2D" +uid="uid://bs64ncysdksj" +path="res://.godot/imported/batt_charger_Image_1.jpg-cc7a67f6df02f2a612591b0afe61c1e5.ctex" +metadata={ +"vram_texture": false +} +generator_parameters={ +"md5": "c0b458f5c133c03a4ae5ba6023a759fc" +} + +[deps] + +source_file="res://assets/tools/batt_charger_Image_1.jpg" +dest_files=["res://.godot/imported/batt_charger_Image_1.jpg-cc7a67f6df02f2a612591b0afe61c1e5.ctex"] + +[params] + +compress/mode=0 +compress/high_quality=false +compress/lossy_quality=0.7 +compress/uastc_level=0 +compress/rdo_quality_loss=0.0 +compress/hdr_compression=1 +compress/normal_map=0 +compress/channel_pack=0 +mipmaps/generate=true +mipmaps/limit=-1 +roughness/mode=0 +roughness/src_normal="" +process/channel_remap/red=0 +process/channel_remap/green=1 +process/channel_remap/blue=2 +process/channel_remap/alpha=3 +process/fix_alpha_border=true +process/premult_alpha=false +process/normal_map_invert_y=false +process/hdr_as_srgb=false +process/hdr_clamp_exposure=false +process/size_limit=0 +detect_3d/compress_to=1 diff --git a/assets/tools/car_ramps.glb b/assets/tools/car_ramps.glb new file mode 100644 index 0000000..fb72caa Binary files /dev/null and b/assets/tools/car_ramps.glb differ diff --git a/assets/tools/car_ramps.glb.import b/assets/tools/car_ramps.glb.import new file mode 100644 index 0000000..5a42558 --- /dev/null +++ b/assets/tools/car_ramps.glb.import @@ -0,0 +1,45 @@ +[remap] + +importer="scene" +importer_version=1 +type="PackedScene" +uid="uid://bmxdn8s3yet72" +path="res://.godot/imported/car_ramps.glb-937a6dce99e241509a43a26bd927e6f3.scn" + +[deps] + +source_file="res://assets/tools/car_ramps.glb" +dest_files=["res://.godot/imported/car_ramps.glb-937a6dce99e241509a43a26bd927e6f3.scn"] + +[params] + +nodes/root_type="" +nodes/root_name="" +nodes/root_script=null +mesh_library/use_node_names_as_mesh_names=false +array_mesh/deduplicate_surfaces=true +nodes/apply_root_scale=true +nodes/root_scale=1.0 +nodes/import_as_skeleton_bones=false +nodes/use_name_suffixes=true +nodes/use_node_type_suffixes=true +meshes/ensure_tangents=true +meshes/generate_lods=true +meshes/create_shadow_meshes=true +meshes/light_baking=1 +meshes/lightmap_texel_size=0.2 +meshes/force_disable_compression=false +skins/use_named_skins=true +animation/import=true +animation/fps=30 +animation/trimming=false +animation/remove_immutable_tracks=true +animation/import_rest_as_RESET=false +import_script/path="" +materials/extract=0 +materials/extract_format=0 +materials/extract_path="" +_subresources={} +gltf/naming_version=2 +gltf/embedded_image_handling=1 +gltf/texture_map_mode=1 diff --git a/assets/tools/car_ramps_Image_0.jpg b/assets/tools/car_ramps_Image_0.jpg new file mode 100644 index 0000000..a15ebdc Binary files /dev/null and b/assets/tools/car_ramps_Image_0.jpg differ diff --git a/assets/tools/car_ramps_Image_0.jpg.import b/assets/tools/car_ramps_Image_0.jpg.import new file mode 100644 index 0000000..b10613a --- /dev/null +++ b/assets/tools/car_ramps_Image_0.jpg.import @@ -0,0 +1,43 @@ +[remap] + +importer="texture" +type="CompressedTexture2D" +uid="uid://x5vk1ha30n0u" +path="res://.godot/imported/car_ramps_Image_0.jpg-d7cb5a962164eee0316d8498949fa52e.ctex" +metadata={ +"vram_texture": false +} +generator_parameters={ +"md5": "d456a4fe21c1996b993ee305e8a4565f" +} + +[deps] + +source_file="res://assets/tools/car_ramps_Image_0.jpg" +dest_files=["res://.godot/imported/car_ramps_Image_0.jpg-d7cb5a962164eee0316d8498949fa52e.ctex"] + +[params] + +compress/mode=0 +compress/high_quality=false +compress/lossy_quality=0.7 +compress/uastc_level=0 +compress/rdo_quality_loss=0.0 +compress/hdr_compression=1 +compress/normal_map=0 +compress/channel_pack=0 +mipmaps/generate=true +mipmaps/limit=-1 +roughness/mode=0 +roughness/src_normal="" +process/channel_remap/red=0 +process/channel_remap/green=1 +process/channel_remap/blue=2 +process/channel_remap/alpha=3 +process/fix_alpha_border=true +process/premult_alpha=false +process/normal_map_invert_y=false +process/hdr_as_srgb=false +process/hdr_clamp_exposure=false +process/size_limit=0 +detect_3d/compress_to=1 diff --git a/assets/tools/car_ramps_Image_1.jpg b/assets/tools/car_ramps_Image_1.jpg new file mode 100644 index 0000000..79e66a7 Binary files /dev/null and b/assets/tools/car_ramps_Image_1.jpg differ diff --git a/assets/tools/car_ramps_Image_1.jpg.import b/assets/tools/car_ramps_Image_1.jpg.import new file mode 100644 index 0000000..14089b8 --- /dev/null +++ b/assets/tools/car_ramps_Image_1.jpg.import @@ -0,0 +1,43 @@ +[remap] + +importer="texture" +type="CompressedTexture2D" +uid="uid://b0uflhp2880ar" +path="res://.godot/imported/car_ramps_Image_1.jpg-0bd3ced5f977e6dddce1f1feb8893bd4.ctex" +metadata={ +"vram_texture": false +} +generator_parameters={ +"md5": "10d5274b465c7affc2aacf4ab2ff1845" +} + +[deps] + +source_file="res://assets/tools/car_ramps_Image_1.jpg" +dest_files=["res://.godot/imported/car_ramps_Image_1.jpg-0bd3ced5f977e6dddce1f1feb8893bd4.ctex"] + +[params] + +compress/mode=0 +compress/high_quality=false +compress/lossy_quality=0.7 +compress/uastc_level=0 +compress/rdo_quality_loss=0.0 +compress/hdr_compression=1 +compress/normal_map=0 +compress/channel_pack=0 +mipmaps/generate=true +mipmaps/limit=-1 +roughness/mode=0 +roughness/src_normal="" +process/channel_remap/red=0 +process/channel_remap/green=1 +process/channel_remap/blue=2 +process/channel_remap/alpha=3 +process/fix_alpha_border=true +process/premult_alpha=false +process/normal_map_invert_y=false +process/hdr_as_srgb=false +process/hdr_clamp_exposure=false +process/size_limit=0 +detect_3d/compress_to=1 diff --git a/assets/tools/chain_hoist.glb b/assets/tools/chain_hoist.glb new file mode 100644 index 0000000..4f8e190 Binary files /dev/null and b/assets/tools/chain_hoist.glb differ diff --git a/assets/tools/chain_hoist.glb.import b/assets/tools/chain_hoist.glb.import new file mode 100644 index 0000000..ac00353 --- /dev/null +++ b/assets/tools/chain_hoist.glb.import @@ -0,0 +1,45 @@ +[remap] + +importer="scene" +importer_version=1 +type="PackedScene" +uid="uid://chemjried8rn2" +path="res://.godot/imported/chain_hoist.glb-e21c615a9371afeedd18d42fc9d11cf2.scn" + +[deps] + +source_file="res://assets/tools/chain_hoist.glb" +dest_files=["res://.godot/imported/chain_hoist.glb-e21c615a9371afeedd18d42fc9d11cf2.scn"] + +[params] + +nodes/root_type="" +nodes/root_name="" +nodes/root_script=null +mesh_library/use_node_names_as_mesh_names=false +array_mesh/deduplicate_surfaces=true +nodes/apply_root_scale=true +nodes/root_scale=1.0 +nodes/import_as_skeleton_bones=false +nodes/use_name_suffixes=true +nodes/use_node_type_suffixes=true +meshes/ensure_tangents=true +meshes/generate_lods=true +meshes/create_shadow_meshes=true +meshes/light_baking=1 +meshes/lightmap_texel_size=0.2 +meshes/force_disable_compression=false +skins/use_named_skins=true +animation/import=true +animation/fps=30 +animation/trimming=false +animation/remove_immutable_tracks=true +animation/import_rest_as_RESET=false +import_script/path="" +materials/extract=0 +materials/extract_format=0 +materials/extract_path="" +_subresources={} +gltf/naming_version=2 +gltf/embedded_image_handling=1 +gltf/texture_map_mode=1 diff --git a/assets/tools/chain_hoist_Image_0.png b/assets/tools/chain_hoist_Image_0.png new file mode 100644 index 0000000..4cbe746 Binary files /dev/null and b/assets/tools/chain_hoist_Image_0.png differ diff --git a/assets/tools/chain_hoist_Image_0.png.import b/assets/tools/chain_hoist_Image_0.png.import new file mode 100644 index 0000000..09fb5e2 --- /dev/null +++ b/assets/tools/chain_hoist_Image_0.png.import @@ -0,0 +1,43 @@ +[remap] + +importer="texture" +type="CompressedTexture2D" +uid="uid://dkv4xbobefkqd" +path="res://.godot/imported/chain_hoist_Image_0.png-7653ef3f90c8ecda3ddd581d462b37a7.ctex" +metadata={ +"vram_texture": false +} +generator_parameters={ +"md5": "af73461a51e13d9942cb7157910a70a0" +} + +[deps] + +source_file="res://assets/tools/chain_hoist_Image_0.png" +dest_files=["res://.godot/imported/chain_hoist_Image_0.png-7653ef3f90c8ecda3ddd581d462b37a7.ctex"] + +[params] + +compress/mode=0 +compress/high_quality=false +compress/lossy_quality=0.7 +compress/uastc_level=0 +compress/rdo_quality_loss=0.0 +compress/hdr_compression=1 +compress/normal_map=0 +compress/channel_pack=0 +mipmaps/generate=true +mipmaps/limit=-1 +roughness/mode=0 +roughness/src_normal="" +process/channel_remap/red=0 +process/channel_remap/green=1 +process/channel_remap/blue=2 +process/channel_remap/alpha=3 +process/fix_alpha_border=true +process/premult_alpha=false +process/normal_map_invert_y=false +process/hdr_as_srgb=false +process/hdr_clamp_exposure=false +process/size_limit=0 +detect_3d/compress_to=1 diff --git a/assets/tools/chain_hoist_Image_1.jpg b/assets/tools/chain_hoist_Image_1.jpg new file mode 100644 index 0000000..c695e2b Binary files /dev/null and b/assets/tools/chain_hoist_Image_1.jpg differ diff --git a/assets/tools/chain_hoist_Image_1.jpg.import b/assets/tools/chain_hoist_Image_1.jpg.import new file mode 100644 index 0000000..b52c88e --- /dev/null +++ b/assets/tools/chain_hoist_Image_1.jpg.import @@ -0,0 +1,43 @@ +[remap] + +importer="texture" +type="CompressedTexture2D" +uid="uid://cp8o65ytvyht1" +path="res://.godot/imported/chain_hoist_Image_1.jpg-1bab81e14574a95db05c4b9bd16743a5.ctex" +metadata={ +"vram_texture": false +} +generator_parameters={ +"md5": "027fe5079386eabe89cdbbeb95bf0d5d" +} + +[deps] + +source_file="res://assets/tools/chain_hoist_Image_1.jpg" +dest_files=["res://.godot/imported/chain_hoist_Image_1.jpg-1bab81e14574a95db05c4b9bd16743a5.ctex"] + +[params] + +compress/mode=0 +compress/high_quality=false +compress/lossy_quality=0.7 +compress/uastc_level=0 +compress/rdo_quality_loss=0.0 +compress/hdr_compression=1 +compress/normal_map=0 +compress/channel_pack=0 +mipmaps/generate=true +mipmaps/limit=-1 +roughness/mode=0 +roughness/src_normal="" +process/channel_remap/red=0 +process/channel_remap/green=1 +process/channel_remap/blue=2 +process/channel_remap/alpha=3 +process/fix_alpha_border=true +process/premult_alpha=false +process/normal_map_invert_y=false +process/hdr_as_srgb=false +process/hdr_clamp_exposure=false +process/size_limit=0 +detect_3d/compress_to=1 diff --git a/assets/tools/compressor.glb b/assets/tools/compressor.glb new file mode 100644 index 0000000..6a2bf88 Binary files /dev/null and b/assets/tools/compressor.glb differ diff --git a/assets/tools/compressor.glb.import b/assets/tools/compressor.glb.import new file mode 100644 index 0000000..8f5b7a5 --- /dev/null +++ b/assets/tools/compressor.glb.import @@ -0,0 +1,45 @@ +[remap] + +importer="scene" +importer_version=1 +type="PackedScene" +uid="uid://we30xc0b3ges" +path="res://.godot/imported/compressor.glb-144fa350d613f3d6027156cd8e840d70.scn" + +[deps] + +source_file="res://assets/tools/compressor.glb" +dest_files=["res://.godot/imported/compressor.glb-144fa350d613f3d6027156cd8e840d70.scn"] + +[params] + +nodes/root_type="" +nodes/root_name="" +nodes/root_script=null +mesh_library/use_node_names_as_mesh_names=false +array_mesh/deduplicate_surfaces=true +nodes/apply_root_scale=true +nodes/root_scale=1.0 +nodes/import_as_skeleton_bones=false +nodes/use_name_suffixes=true +nodes/use_node_type_suffixes=true +meshes/ensure_tangents=true +meshes/generate_lods=true +meshes/create_shadow_meshes=true +meshes/light_baking=1 +meshes/lightmap_texel_size=0.2 +meshes/force_disable_compression=false +skins/use_named_skins=true +animation/import=true +animation/fps=30 +animation/trimming=false +animation/remove_immutable_tracks=true +animation/import_rest_as_RESET=false +import_script/path="" +materials/extract=0 +materials/extract_format=0 +materials/extract_path="" +_subresources={} +gltf/naming_version=2 +gltf/embedded_image_handling=1 +gltf/texture_map_mode=1 diff --git a/assets/tools/compressor_Image_0.jpg b/assets/tools/compressor_Image_0.jpg new file mode 100644 index 0000000..82ad9f5 Binary files /dev/null and b/assets/tools/compressor_Image_0.jpg differ diff --git a/assets/tools/compressor_Image_0.jpg.import b/assets/tools/compressor_Image_0.jpg.import new file mode 100644 index 0000000..90745ac --- /dev/null +++ b/assets/tools/compressor_Image_0.jpg.import @@ -0,0 +1,43 @@ +[remap] + +importer="texture" +type="CompressedTexture2D" +uid="uid://bt3kii4185ts0" +path="res://.godot/imported/compressor_Image_0.jpg-ff007f62a391c1897868691c6ba7a03f.ctex" +metadata={ +"vram_texture": false +} +generator_parameters={ +"md5": "515de464d5c773f7bd68ee27b3cf4f37" +} + +[deps] + +source_file="res://assets/tools/compressor_Image_0.jpg" +dest_files=["res://.godot/imported/compressor_Image_0.jpg-ff007f62a391c1897868691c6ba7a03f.ctex"] + +[params] + +compress/mode=0 +compress/high_quality=false +compress/lossy_quality=0.7 +compress/uastc_level=0 +compress/rdo_quality_loss=0.0 +compress/hdr_compression=1 +compress/normal_map=0 +compress/channel_pack=0 +mipmaps/generate=true +mipmaps/limit=-1 +roughness/mode=0 +roughness/src_normal="" +process/channel_remap/red=0 +process/channel_remap/green=1 +process/channel_remap/blue=2 +process/channel_remap/alpha=3 +process/fix_alpha_border=true +process/premult_alpha=false +process/normal_map_invert_y=false +process/hdr_as_srgb=false +process/hdr_clamp_exposure=false +process/size_limit=0 +detect_3d/compress_to=1 diff --git a/assets/tools/compressor_Image_1.jpg b/assets/tools/compressor_Image_1.jpg new file mode 100644 index 0000000..2b714d8 Binary files /dev/null and b/assets/tools/compressor_Image_1.jpg differ diff --git a/assets/tools/compressor_Image_1.jpg.import b/assets/tools/compressor_Image_1.jpg.import new file mode 100644 index 0000000..1e72b15 --- /dev/null +++ b/assets/tools/compressor_Image_1.jpg.import @@ -0,0 +1,43 @@ +[remap] + +importer="texture" +type="CompressedTexture2D" +uid="uid://17rxupgmmobu" +path="res://.godot/imported/compressor_Image_1.jpg-8472be13eb5b4dbb58b0a6b1f5bc5129.ctex" +metadata={ +"vram_texture": false +} +generator_parameters={ +"md5": "a0412a18a0f51c4c3aaecdbee0c2e351" +} + +[deps] + +source_file="res://assets/tools/compressor_Image_1.jpg" +dest_files=["res://.godot/imported/compressor_Image_1.jpg-8472be13eb5b4dbb58b0a6b1f5bc5129.ctex"] + +[params] + +compress/mode=0 +compress/high_quality=false +compress/lossy_quality=0.7 +compress/uastc_level=0 +compress/rdo_quality_loss=0.0 +compress/hdr_compression=1 +compress/normal_map=0 +compress/channel_pack=0 +mipmaps/generate=true +mipmaps/limit=-1 +roughness/mode=0 +roughness/src_normal="" +process/channel_remap/red=0 +process/channel_remap/green=1 +process/channel_remap/blue=2 +process/channel_remap/alpha=3 +process/fix_alpha_border=true +process/premult_alpha=false +process/normal_map_invert_y=false +process/hdr_as_srgb=false +process/hdr_clamp_exposure=false +process/size_limit=0 +detect_3d/compress_to=1 diff --git a/assets/tools/engine_crane.glb b/assets/tools/engine_crane.glb new file mode 100644 index 0000000..ebe640a Binary files /dev/null and b/assets/tools/engine_crane.glb differ diff --git a/assets/tools/engine_crane.glb.import b/assets/tools/engine_crane.glb.import new file mode 100644 index 0000000..e9d4be9 --- /dev/null +++ b/assets/tools/engine_crane.glb.import @@ -0,0 +1,45 @@ +[remap] + +importer="scene" +importer_version=1 +type="PackedScene" +uid="uid://dgqx77jjjqmh6" +path="res://.godot/imported/engine_crane.glb-e5bdc9b3abf4cd563f960dc0732315f9.scn" + +[deps] + +source_file="res://assets/tools/engine_crane.glb" +dest_files=["res://.godot/imported/engine_crane.glb-e5bdc9b3abf4cd563f960dc0732315f9.scn"] + +[params] + +nodes/root_type="" +nodes/root_name="" +nodes/root_script=null +mesh_library/use_node_names_as_mesh_names=false +array_mesh/deduplicate_surfaces=true +nodes/apply_root_scale=true +nodes/root_scale=1.0 +nodes/import_as_skeleton_bones=false +nodes/use_name_suffixes=true +nodes/use_node_type_suffixes=true +meshes/ensure_tangents=true +meshes/generate_lods=true +meshes/create_shadow_meshes=true +meshes/light_baking=1 +meshes/lightmap_texel_size=0.2 +meshes/force_disable_compression=false +skins/use_named_skins=true +animation/import=true +animation/fps=30 +animation/trimming=false +animation/remove_immutable_tracks=true +animation/import_rest_as_RESET=false +import_script/path="" +materials/extract=0 +materials/extract_format=0 +materials/extract_path="" +_subresources={} +gltf/naming_version=2 +gltf/embedded_image_handling=1 +gltf/texture_map_mode=1 diff --git a/assets/tools/engine_crane_Image_0.png b/assets/tools/engine_crane_Image_0.png new file mode 100644 index 0000000..38ad0f3 Binary files /dev/null and b/assets/tools/engine_crane_Image_0.png differ diff --git a/assets/tools/engine_crane_Image_0.png.import b/assets/tools/engine_crane_Image_0.png.import new file mode 100644 index 0000000..dc8f4f7 --- /dev/null +++ b/assets/tools/engine_crane_Image_0.png.import @@ -0,0 +1,43 @@ +[remap] + +importer="texture" +type="CompressedTexture2D" +uid="uid://cg16h5061m0wk" +path="res://.godot/imported/engine_crane_Image_0.png-f43d70b6783298e3dd1c9c8e19cc084f.ctex" +metadata={ +"vram_texture": false +} +generator_parameters={ +"md5": "f0bb13ca2165a52512dbc6a9663a4ed5" +} + +[deps] + +source_file="res://assets/tools/engine_crane_Image_0.png" +dest_files=["res://.godot/imported/engine_crane_Image_0.png-f43d70b6783298e3dd1c9c8e19cc084f.ctex"] + +[params] + +compress/mode=0 +compress/high_quality=false +compress/lossy_quality=0.7 +compress/uastc_level=0 +compress/rdo_quality_loss=0.0 +compress/hdr_compression=1 +compress/normal_map=0 +compress/channel_pack=0 +mipmaps/generate=true +mipmaps/limit=-1 +roughness/mode=0 +roughness/src_normal="" +process/channel_remap/red=0 +process/channel_remap/green=1 +process/channel_remap/blue=2 +process/channel_remap/alpha=3 +process/fix_alpha_border=true +process/premult_alpha=false +process/normal_map_invert_y=false +process/hdr_as_srgb=false +process/hdr_clamp_exposure=false +process/size_limit=0 +detect_3d/compress_to=1 diff --git a/assets/tools/engine_crane_Image_1.jpg b/assets/tools/engine_crane_Image_1.jpg new file mode 100644 index 0000000..679fdd0 Binary files /dev/null and b/assets/tools/engine_crane_Image_1.jpg differ diff --git a/assets/tools/engine_crane_Image_1.jpg.import b/assets/tools/engine_crane_Image_1.jpg.import new file mode 100644 index 0000000..f173100 --- /dev/null +++ b/assets/tools/engine_crane_Image_1.jpg.import @@ -0,0 +1,43 @@ +[remap] + +importer="texture" +type="CompressedTexture2D" +uid="uid://n82efm8h2rt6" +path="res://.godot/imported/engine_crane_Image_1.jpg-80d830c1a9dd74f18c0a9df6bc077966.ctex" +metadata={ +"vram_texture": false +} +generator_parameters={ +"md5": "c772d233045fa35123e85253c0d4b353" +} + +[deps] + +source_file="res://assets/tools/engine_crane_Image_1.jpg" +dest_files=["res://.godot/imported/engine_crane_Image_1.jpg-80d830c1a9dd74f18c0a9df6bc077966.ctex"] + +[params] + +compress/mode=0 +compress/high_quality=false +compress/lossy_quality=0.7 +compress/uastc_level=0 +compress/rdo_quality_loss=0.0 +compress/hdr_compression=1 +compress/normal_map=0 +compress/channel_pack=0 +mipmaps/generate=true +mipmaps/limit=-1 +roughness/mode=0 +roughness/src_normal="" +process/channel_remap/red=0 +process/channel_remap/green=1 +process/channel_remap/blue=2 +process/channel_remap/alpha=3 +process/fix_alpha_border=true +process/premult_alpha=false +process/normal_map_invert_y=false +process/hdr_as_srgb=false +process/hdr_clamp_exposure=false +process/size_limit=0 +detect_3d/compress_to=1 diff --git a/assets/tools/engine_stand.glb b/assets/tools/engine_stand.glb new file mode 100644 index 0000000..99bf504 Binary files /dev/null and b/assets/tools/engine_stand.glb differ diff --git a/assets/tools/engine_stand.glb.import b/assets/tools/engine_stand.glb.import new file mode 100644 index 0000000..73e6a0b --- /dev/null +++ b/assets/tools/engine_stand.glb.import @@ -0,0 +1,45 @@ +[remap] + +importer="scene" +importer_version=1 +type="PackedScene" +uid="uid://c1q6aaao2hhwh" +path="res://.godot/imported/engine_stand.glb-31279a7651ca5f0edf057a974da9462d.scn" + +[deps] + +source_file="res://assets/tools/engine_stand.glb" +dest_files=["res://.godot/imported/engine_stand.glb-31279a7651ca5f0edf057a974da9462d.scn"] + +[params] + +nodes/root_type="" +nodes/root_name="" +nodes/root_script=null +mesh_library/use_node_names_as_mesh_names=false +array_mesh/deduplicate_surfaces=true +nodes/apply_root_scale=true +nodes/root_scale=1.0 +nodes/import_as_skeleton_bones=false +nodes/use_name_suffixes=true +nodes/use_node_type_suffixes=true +meshes/ensure_tangents=true +meshes/generate_lods=true +meshes/create_shadow_meshes=true +meshes/light_baking=1 +meshes/lightmap_texel_size=0.2 +meshes/force_disable_compression=false +skins/use_named_skins=true +animation/import=true +animation/fps=30 +animation/trimming=false +animation/remove_immutable_tracks=true +animation/import_rest_as_RESET=false +import_script/path="" +materials/extract=0 +materials/extract_format=0 +materials/extract_path="" +_subresources={} +gltf/naming_version=2 +gltf/embedded_image_handling=1 +gltf/texture_map_mode=1 diff --git a/assets/tools/engine_stand_Image_0.jpg b/assets/tools/engine_stand_Image_0.jpg new file mode 100644 index 0000000..9a71628 Binary files /dev/null and b/assets/tools/engine_stand_Image_0.jpg differ diff --git a/assets/tools/engine_stand_Image_0.jpg.import b/assets/tools/engine_stand_Image_0.jpg.import new file mode 100644 index 0000000..4e63b8c --- /dev/null +++ b/assets/tools/engine_stand_Image_0.jpg.import @@ -0,0 +1,43 @@ +[remap] + +importer="texture" +type="CompressedTexture2D" +uid="uid://djfxjhgy61kxm" +path="res://.godot/imported/engine_stand_Image_0.jpg-5e424208efb2ed4f9f80bac8fc0eff53.ctex" +metadata={ +"vram_texture": false +} +generator_parameters={ +"md5": "d15f78047a4d9e5debcb167e107b7942" +} + +[deps] + +source_file="res://assets/tools/engine_stand_Image_0.jpg" +dest_files=["res://.godot/imported/engine_stand_Image_0.jpg-5e424208efb2ed4f9f80bac8fc0eff53.ctex"] + +[params] + +compress/mode=0 +compress/high_quality=false +compress/lossy_quality=0.7 +compress/uastc_level=0 +compress/rdo_quality_loss=0.0 +compress/hdr_compression=1 +compress/normal_map=0 +compress/channel_pack=0 +mipmaps/generate=true +mipmaps/limit=-1 +roughness/mode=0 +roughness/src_normal="" +process/channel_remap/red=0 +process/channel_remap/green=1 +process/channel_remap/blue=2 +process/channel_remap/alpha=3 +process/fix_alpha_border=true +process/premult_alpha=false +process/normal_map_invert_y=false +process/hdr_as_srgb=false +process/hdr_clamp_exposure=false +process/size_limit=0 +detect_3d/compress_to=1 diff --git a/assets/tools/engine_stand_Image_1.jpg b/assets/tools/engine_stand_Image_1.jpg new file mode 100644 index 0000000..171da61 Binary files /dev/null and b/assets/tools/engine_stand_Image_1.jpg differ diff --git a/assets/tools/engine_stand_Image_1.jpg.import b/assets/tools/engine_stand_Image_1.jpg.import new file mode 100644 index 0000000..69b01db --- /dev/null +++ b/assets/tools/engine_stand_Image_1.jpg.import @@ -0,0 +1,43 @@ +[remap] + +importer="texture" +type="CompressedTexture2D" +uid="uid://bxcb1dc40t7dy" +path="res://.godot/imported/engine_stand_Image_1.jpg-ca3af820dfcfc11c6fd12a3cf4c71d77.ctex" +metadata={ +"vram_texture": false +} +generator_parameters={ +"md5": "ac85add3b5a8162d956314812c5802d8" +} + +[deps] + +source_file="res://assets/tools/engine_stand_Image_1.jpg" +dest_files=["res://.godot/imported/engine_stand_Image_1.jpg-ca3af820dfcfc11c6fd12a3cf4c71d77.ctex"] + +[params] + +compress/mode=0 +compress/high_quality=false +compress/lossy_quality=0.7 +compress/uastc_level=0 +compress/rdo_quality_loss=0.0 +compress/hdr_compression=1 +compress/normal_map=0 +compress/channel_pack=0 +mipmaps/generate=true +mipmaps/limit=-1 +roughness/mode=0 +roughness/src_normal="" +process/channel_remap/red=0 +process/channel_remap/green=1 +process/channel_remap/blue=2 +process/channel_remap/alpha=3 +process/fix_alpha_border=true +process/premult_alpha=false +process/normal_map_invert_y=false +process/hdr_as_srgb=false +process/hdr_clamp_exposure=false +process/size_limit=0 +detect_3d/compress_to=1 diff --git a/assets/tools/grease_gun.glb b/assets/tools/grease_gun.glb new file mode 100644 index 0000000..b96b663 Binary files /dev/null and b/assets/tools/grease_gun.glb differ diff --git a/assets/tools/grease_gun.glb.import b/assets/tools/grease_gun.glb.import new file mode 100644 index 0000000..7658307 --- /dev/null +++ b/assets/tools/grease_gun.glb.import @@ -0,0 +1,45 @@ +[remap] + +importer="scene" +importer_version=1 +type="PackedScene" +uid="uid://p3ncu7jigxhu" +path="res://.godot/imported/grease_gun.glb-3e19a4633da76389e901beff9da1567b.scn" + +[deps] + +source_file="res://assets/tools/grease_gun.glb" +dest_files=["res://.godot/imported/grease_gun.glb-3e19a4633da76389e901beff9da1567b.scn"] + +[params] + +nodes/root_type="" +nodes/root_name="" +nodes/root_script=null +mesh_library/use_node_names_as_mesh_names=false +array_mesh/deduplicate_surfaces=true +nodes/apply_root_scale=true +nodes/root_scale=1.0 +nodes/import_as_skeleton_bones=false +nodes/use_name_suffixes=true +nodes/use_node_type_suffixes=true +meshes/ensure_tangents=true +meshes/generate_lods=true +meshes/create_shadow_meshes=true +meshes/light_baking=1 +meshes/lightmap_texel_size=0.2 +meshes/force_disable_compression=false +skins/use_named_skins=true +animation/import=true +animation/fps=30 +animation/trimming=false +animation/remove_immutable_tracks=true +animation/import_rest_as_RESET=false +import_script/path="" +materials/extract=0 +materials/extract_format=0 +materials/extract_path="" +_subresources={} +gltf/naming_version=2 +gltf/embedded_image_handling=1 +gltf/texture_map_mode=1 diff --git a/assets/tools/grease_gun_Image_0.png b/assets/tools/grease_gun_Image_0.png new file mode 100644 index 0000000..4890d32 Binary files /dev/null and b/assets/tools/grease_gun_Image_0.png differ diff --git a/assets/tools/grease_gun_Image_0.png.import b/assets/tools/grease_gun_Image_0.png.import new file mode 100644 index 0000000..cb88f51 --- /dev/null +++ b/assets/tools/grease_gun_Image_0.png.import @@ -0,0 +1,43 @@ +[remap] + +importer="texture" +type="CompressedTexture2D" +uid="uid://dki6lxfncbfq4" +path="res://.godot/imported/grease_gun_Image_0.png-4bf0c6a9a837cbcdf929323832fc23e6.ctex" +metadata={ +"vram_texture": false +} +generator_parameters={ +"md5": "ea6cb80364caa61a9f1254705387f2d3" +} + +[deps] + +source_file="res://assets/tools/grease_gun_Image_0.png" +dest_files=["res://.godot/imported/grease_gun_Image_0.png-4bf0c6a9a837cbcdf929323832fc23e6.ctex"] + +[params] + +compress/mode=0 +compress/high_quality=false +compress/lossy_quality=0.7 +compress/uastc_level=0 +compress/rdo_quality_loss=0.0 +compress/hdr_compression=1 +compress/normal_map=0 +compress/channel_pack=0 +mipmaps/generate=true +mipmaps/limit=-1 +roughness/mode=0 +roughness/src_normal="" +process/channel_remap/red=0 +process/channel_remap/green=1 +process/channel_remap/blue=2 +process/channel_remap/alpha=3 +process/fix_alpha_border=true +process/premult_alpha=false +process/normal_map_invert_y=false +process/hdr_as_srgb=false +process/hdr_clamp_exposure=false +process/size_limit=0 +detect_3d/compress_to=1 diff --git a/assets/tools/grease_gun_Image_1.jpg b/assets/tools/grease_gun_Image_1.jpg new file mode 100644 index 0000000..5fafae1 Binary files /dev/null and b/assets/tools/grease_gun_Image_1.jpg differ diff --git a/assets/tools/grease_gun_Image_1.jpg.import b/assets/tools/grease_gun_Image_1.jpg.import new file mode 100644 index 0000000..b3bb57c --- /dev/null +++ b/assets/tools/grease_gun_Image_1.jpg.import @@ -0,0 +1,43 @@ +[remap] + +importer="texture" +type="CompressedTexture2D" +uid="uid://ch4xxps2y7ny2" +path="res://.godot/imported/grease_gun_Image_1.jpg-e1cbeb72b9691e760a4cd6e5c0f1d45d.ctex" +metadata={ +"vram_texture": false +} +generator_parameters={ +"md5": "6a6dec0503e73b8470f5d516d980731c" +} + +[deps] + +source_file="res://assets/tools/grease_gun_Image_1.jpg" +dest_files=["res://.godot/imported/grease_gun_Image_1.jpg-e1cbeb72b9691e760a4cd6e5c0f1d45d.ctex"] + +[params] + +compress/mode=0 +compress/high_quality=false +compress/lossy_quality=0.7 +compress/uastc_level=0 +compress/rdo_quality_loss=0.0 +compress/hdr_compression=1 +compress/normal_map=0 +compress/channel_pack=0 +mipmaps/generate=true +mipmaps/limit=-1 +roughness/mode=0 +roughness/src_normal="" +process/channel_remap/red=0 +process/channel_remap/green=1 +process/channel_remap/blue=2 +process/channel_remap/alpha=3 +process/fix_alpha_border=true +process/premult_alpha=false +process/normal_map_invert_y=false +process/hdr_as_srgb=false +process/hdr_clamp_exposure=false +process/size_limit=0 +detect_3d/compress_to=1 diff --git a/assets/tools/jack_stands.glb b/assets/tools/jack_stands.glb new file mode 100644 index 0000000..753e723 Binary files /dev/null and b/assets/tools/jack_stands.glb differ diff --git a/assets/tools/jack_stands.glb.import b/assets/tools/jack_stands.glb.import new file mode 100644 index 0000000..d816e36 --- /dev/null +++ b/assets/tools/jack_stands.glb.import @@ -0,0 +1,45 @@ +[remap] + +importer="scene" +importer_version=1 +type="PackedScene" +uid="uid://ctci8e71qlci" +path="res://.godot/imported/jack_stands.glb-e26275ee9fbb1ee9ea01434f70b2bdae.scn" + +[deps] + +source_file="res://assets/tools/jack_stands.glb" +dest_files=["res://.godot/imported/jack_stands.glb-e26275ee9fbb1ee9ea01434f70b2bdae.scn"] + +[params] + +nodes/root_type="" +nodes/root_name="" +nodes/root_script=null +mesh_library/use_node_names_as_mesh_names=false +array_mesh/deduplicate_surfaces=true +nodes/apply_root_scale=true +nodes/root_scale=1.0 +nodes/import_as_skeleton_bones=false +nodes/use_name_suffixes=true +nodes/use_node_type_suffixes=true +meshes/ensure_tangents=true +meshes/generate_lods=true +meshes/create_shadow_meshes=true +meshes/light_baking=1 +meshes/lightmap_texel_size=0.2 +meshes/force_disable_compression=false +skins/use_named_skins=true +animation/import=true +animation/fps=30 +animation/trimming=false +animation/remove_immutable_tracks=true +animation/import_rest_as_RESET=false +import_script/path="" +materials/extract=0 +materials/extract_format=0 +materials/extract_path="" +_subresources={} +gltf/naming_version=2 +gltf/embedded_image_handling=1 +gltf/texture_map_mode=1 diff --git a/assets/tools/jack_stands_Image_0.jpg b/assets/tools/jack_stands_Image_0.jpg new file mode 100644 index 0000000..d8e69da Binary files /dev/null and b/assets/tools/jack_stands_Image_0.jpg differ diff --git a/assets/tools/jack_stands_Image_0.jpg.import b/assets/tools/jack_stands_Image_0.jpg.import new file mode 100644 index 0000000..2b2d0f3 --- /dev/null +++ b/assets/tools/jack_stands_Image_0.jpg.import @@ -0,0 +1,43 @@ +[remap] + +importer="texture" +type="CompressedTexture2D" +uid="uid://bxobkifxtk3cm" +path="res://.godot/imported/jack_stands_Image_0.jpg-9ef1102596a984f9f7f1cbfd3930db25.ctex" +metadata={ +"vram_texture": false +} +generator_parameters={ +"md5": "8b2aa8982fc2819407775ecde5128e18" +} + +[deps] + +source_file="res://assets/tools/jack_stands_Image_0.jpg" +dest_files=["res://.godot/imported/jack_stands_Image_0.jpg-9ef1102596a984f9f7f1cbfd3930db25.ctex"] + +[params] + +compress/mode=0 +compress/high_quality=false +compress/lossy_quality=0.7 +compress/uastc_level=0 +compress/rdo_quality_loss=0.0 +compress/hdr_compression=1 +compress/normal_map=0 +compress/channel_pack=0 +mipmaps/generate=true +mipmaps/limit=-1 +roughness/mode=0 +roughness/src_normal="" +process/channel_remap/red=0 +process/channel_remap/green=1 +process/channel_remap/blue=2 +process/channel_remap/alpha=3 +process/fix_alpha_border=true +process/premult_alpha=false +process/normal_map_invert_y=false +process/hdr_as_srgb=false +process/hdr_clamp_exposure=false +process/size_limit=0 +detect_3d/compress_to=1 diff --git a/assets/tools/jack_stands_Image_1.jpg b/assets/tools/jack_stands_Image_1.jpg new file mode 100644 index 0000000..5b135d0 Binary files /dev/null and b/assets/tools/jack_stands_Image_1.jpg differ diff --git a/assets/tools/jack_stands_Image_1.jpg.import b/assets/tools/jack_stands_Image_1.jpg.import new file mode 100644 index 0000000..49a7897 --- /dev/null +++ b/assets/tools/jack_stands_Image_1.jpg.import @@ -0,0 +1,43 @@ +[remap] + +importer="texture" +type="CompressedTexture2D" +uid="uid://dpvc1nw472b2k" +path="res://.godot/imported/jack_stands_Image_1.jpg-9ef9ab8f508c2b6dd7d0b17beca6b9ed.ctex" +metadata={ +"vram_texture": false +} +generator_parameters={ +"md5": "77a462d75f0952c032b15d59c5723e34" +} + +[deps] + +source_file="res://assets/tools/jack_stands_Image_1.jpg" +dest_files=["res://.godot/imported/jack_stands_Image_1.jpg-9ef9ab8f508c2b6dd7d0b17beca6b9ed.ctex"] + +[params] + +compress/mode=0 +compress/high_quality=false +compress/lossy_quality=0.7 +compress/uastc_level=0 +compress/rdo_quality_loss=0.0 +compress/hdr_compression=1 +compress/normal_map=0 +compress/channel_pack=0 +mipmaps/generate=true +mipmaps/limit=-1 +roughness/mode=0 +roughness/src_normal="" +process/channel_remap/red=0 +process/channel_remap/green=1 +process/channel_remap/blue=2 +process/channel_remap/alpha=3 +process/fix_alpha_border=true +process/premult_alpha=false +process/normal_map_invert_y=false +process/hdr_as_srgb=false +process/hdr_clamp_exposure=false +process/size_limit=0 +detect_3d/compress_to=1 diff --git a/assets/tools/jerry_can.glb b/assets/tools/jerry_can.glb new file mode 100644 index 0000000..f2b660c Binary files /dev/null and b/assets/tools/jerry_can.glb differ diff --git a/assets/tools/jerry_can.glb.import b/assets/tools/jerry_can.glb.import new file mode 100644 index 0000000..d36c0e3 --- /dev/null +++ b/assets/tools/jerry_can.glb.import @@ -0,0 +1,45 @@ +[remap] + +importer="scene" +importer_version=1 +type="PackedScene" +uid="uid://cd11yxrypnwm6" +path="res://.godot/imported/jerry_can.glb-499227af7db3e1ce657019c0dba475d1.scn" + +[deps] + +source_file="res://assets/tools/jerry_can.glb" +dest_files=["res://.godot/imported/jerry_can.glb-499227af7db3e1ce657019c0dba475d1.scn"] + +[params] + +nodes/root_type="" +nodes/root_name="" +nodes/root_script=null +mesh_library/use_node_names_as_mesh_names=false +array_mesh/deduplicate_surfaces=true +nodes/apply_root_scale=true +nodes/root_scale=1.0 +nodes/import_as_skeleton_bones=false +nodes/use_name_suffixes=true +nodes/use_node_type_suffixes=true +meshes/ensure_tangents=true +meshes/generate_lods=true +meshes/create_shadow_meshes=true +meshes/light_baking=1 +meshes/lightmap_texel_size=0.2 +meshes/force_disable_compression=false +skins/use_named_skins=true +animation/import=true +animation/fps=30 +animation/trimming=false +animation/remove_immutable_tracks=true +animation/import_rest_as_RESET=false +import_script/path="" +materials/extract=0 +materials/extract_format=0 +materials/extract_path="" +_subresources={} +gltf/naming_version=2 +gltf/embedded_image_handling=1 +gltf/texture_map_mode=1 diff --git a/assets/tools/jerry_can_Image_0.jpg b/assets/tools/jerry_can_Image_0.jpg new file mode 100644 index 0000000..1d6f5b6 Binary files /dev/null and b/assets/tools/jerry_can_Image_0.jpg differ diff --git a/assets/tools/jerry_can_Image_0.jpg.import b/assets/tools/jerry_can_Image_0.jpg.import new file mode 100644 index 0000000..e35f185 --- /dev/null +++ b/assets/tools/jerry_can_Image_0.jpg.import @@ -0,0 +1,43 @@ +[remap] + +importer="texture" +type="CompressedTexture2D" +uid="uid://d0vntu4g1cqqg" +path="res://.godot/imported/jerry_can_Image_0.jpg-dd4838135c2a727153dcb84e0805e5fe.ctex" +metadata={ +"vram_texture": false +} +generator_parameters={ +"md5": "71a8060fe1beb71ea3a3a9a231fd2fa9" +} + +[deps] + +source_file="res://assets/tools/jerry_can_Image_0.jpg" +dest_files=["res://.godot/imported/jerry_can_Image_0.jpg-dd4838135c2a727153dcb84e0805e5fe.ctex"] + +[params] + +compress/mode=0 +compress/high_quality=false +compress/lossy_quality=0.7 +compress/uastc_level=0 +compress/rdo_quality_loss=0.0 +compress/hdr_compression=1 +compress/normal_map=0 +compress/channel_pack=0 +mipmaps/generate=true +mipmaps/limit=-1 +roughness/mode=0 +roughness/src_normal="" +process/channel_remap/red=0 +process/channel_remap/green=1 +process/channel_remap/blue=2 +process/channel_remap/alpha=3 +process/fix_alpha_border=true +process/premult_alpha=false +process/normal_map_invert_y=false +process/hdr_as_srgb=false +process/hdr_clamp_exposure=false +process/size_limit=0 +detect_3d/compress_to=1 diff --git a/assets/tools/jerry_can_Image_1.jpg b/assets/tools/jerry_can_Image_1.jpg new file mode 100644 index 0000000..088a1ca Binary files /dev/null and b/assets/tools/jerry_can_Image_1.jpg differ diff --git a/assets/tools/jerry_can_Image_1.jpg.import b/assets/tools/jerry_can_Image_1.jpg.import new file mode 100644 index 0000000..f50c734 --- /dev/null +++ b/assets/tools/jerry_can_Image_1.jpg.import @@ -0,0 +1,43 @@ +[remap] + +importer="texture" +type="CompressedTexture2D" +uid="uid://bjxbtoo73g2kt" +path="res://.godot/imported/jerry_can_Image_1.jpg-890570ced5ebba20cbeed118fd60742f.ctex" +metadata={ +"vram_texture": false +} +generator_parameters={ +"md5": "912f77677a6030103dc7a08690b36c10" +} + +[deps] + +source_file="res://assets/tools/jerry_can_Image_1.jpg" +dest_files=["res://.godot/imported/jerry_can_Image_1.jpg-890570ced5ebba20cbeed118fd60742f.ctex"] + +[params] + +compress/mode=0 +compress/high_quality=false +compress/lossy_quality=0.7 +compress/uastc_level=0 +compress/rdo_quality_loss=0.0 +compress/hdr_compression=1 +compress/normal_map=0 +compress/channel_pack=0 +mipmaps/generate=true +mipmaps/limit=-1 +roughness/mode=0 +roughness/src_normal="" +process/channel_remap/red=0 +process/channel_remap/green=1 +process/channel_remap/blue=2 +process/channel_remap/alpha=3 +process/fix_alpha_border=true +process/premult_alpha=false +process/normal_map_invert_y=false +process/hdr_as_srgb=false +process/hdr_clamp_exposure=false +process/size_limit=0 +detect_3d/compress_to=1 diff --git a/assets/tools/obd_reader.glb b/assets/tools/obd_reader.glb new file mode 100644 index 0000000..4085465 Binary files /dev/null and b/assets/tools/obd_reader.glb differ diff --git a/assets/tools/obd_reader.glb.import b/assets/tools/obd_reader.glb.import new file mode 100644 index 0000000..a5f0abf --- /dev/null +++ b/assets/tools/obd_reader.glb.import @@ -0,0 +1,45 @@ +[remap] + +importer="scene" +importer_version=1 +type="PackedScene" +uid="uid://bmh6jl16n3od" +path="res://.godot/imported/obd_reader.glb-f7a868a0013f3ddab52cf1fa4ce1909d.scn" + +[deps] + +source_file="res://assets/tools/obd_reader.glb" +dest_files=["res://.godot/imported/obd_reader.glb-f7a868a0013f3ddab52cf1fa4ce1909d.scn"] + +[params] + +nodes/root_type="" +nodes/root_name="" +nodes/root_script=null +mesh_library/use_node_names_as_mesh_names=false +array_mesh/deduplicate_surfaces=true +nodes/apply_root_scale=true +nodes/root_scale=1.0 +nodes/import_as_skeleton_bones=false +nodes/use_name_suffixes=true +nodes/use_node_type_suffixes=true +meshes/ensure_tangents=true +meshes/generate_lods=true +meshes/create_shadow_meshes=true +meshes/light_baking=1 +meshes/lightmap_texel_size=0.2 +meshes/force_disable_compression=false +skins/use_named_skins=true +animation/import=true +animation/fps=30 +animation/trimming=false +animation/remove_immutable_tracks=true +animation/import_rest_as_RESET=false +import_script/path="" +materials/extract=0 +materials/extract_format=0 +materials/extract_path="" +_subresources={} +gltf/naming_version=2 +gltf/embedded_image_handling=1 +gltf/texture_map_mode=1 diff --git a/assets/tools/obd_reader_Image_0.jpg b/assets/tools/obd_reader_Image_0.jpg new file mode 100644 index 0000000..f9c4e30 Binary files /dev/null and b/assets/tools/obd_reader_Image_0.jpg differ diff --git a/assets/tools/obd_reader_Image_0.jpg.import b/assets/tools/obd_reader_Image_0.jpg.import new file mode 100644 index 0000000..b440cbc --- /dev/null +++ b/assets/tools/obd_reader_Image_0.jpg.import @@ -0,0 +1,43 @@ +[remap] + +importer="texture" +type="CompressedTexture2D" +uid="uid://clabcoc0sfyvm" +path="res://.godot/imported/obd_reader_Image_0.jpg-19d2d499dacb352e3aafa443ecc92a64.ctex" +metadata={ +"vram_texture": false +} +generator_parameters={ +"md5": "cd2fd38f31cc5d03778f1c27de640246" +} + +[deps] + +source_file="res://assets/tools/obd_reader_Image_0.jpg" +dest_files=["res://.godot/imported/obd_reader_Image_0.jpg-19d2d499dacb352e3aafa443ecc92a64.ctex"] + +[params] + +compress/mode=0 +compress/high_quality=false +compress/lossy_quality=0.7 +compress/uastc_level=0 +compress/rdo_quality_loss=0.0 +compress/hdr_compression=1 +compress/normal_map=0 +compress/channel_pack=0 +mipmaps/generate=true +mipmaps/limit=-1 +roughness/mode=0 +roughness/src_normal="" +process/channel_remap/red=0 +process/channel_remap/green=1 +process/channel_remap/blue=2 +process/channel_remap/alpha=3 +process/fix_alpha_border=true +process/premult_alpha=false +process/normal_map_invert_y=false +process/hdr_as_srgb=false +process/hdr_clamp_exposure=false +process/size_limit=0 +detect_3d/compress_to=1 diff --git a/assets/tools/obd_reader_Image_1.jpg b/assets/tools/obd_reader_Image_1.jpg new file mode 100644 index 0000000..770886a Binary files /dev/null and b/assets/tools/obd_reader_Image_1.jpg differ diff --git a/assets/tools/obd_reader_Image_1.jpg.import b/assets/tools/obd_reader_Image_1.jpg.import new file mode 100644 index 0000000..bf93599 --- /dev/null +++ b/assets/tools/obd_reader_Image_1.jpg.import @@ -0,0 +1,43 @@ +[remap] + +importer="texture" +type="CompressedTexture2D" +uid="uid://b6mtxrvmfclfw" +path="res://.godot/imported/obd_reader_Image_1.jpg-cc916e9184bb8708e4d5852f294ed702.ctex" +metadata={ +"vram_texture": false +} +generator_parameters={ +"md5": "ece2bf7873618226f2ef3a172633376d" +} + +[deps] + +source_file="res://assets/tools/obd_reader_Image_1.jpg" +dest_files=["res://.godot/imported/obd_reader_Image_1.jpg-cc916e9184bb8708e4d5852f294ed702.ctex"] + +[params] + +compress/mode=0 +compress/high_quality=false +compress/lossy_quality=0.7 +compress/uastc_level=0 +compress/rdo_quality_loss=0.0 +compress/hdr_compression=1 +compress/normal_map=0 +compress/channel_pack=0 +mipmaps/generate=true +mipmaps/limit=-1 +roughness/mode=0 +roughness/src_normal="" +process/channel_remap/red=0 +process/channel_remap/green=1 +process/channel_remap/blue=2 +process/channel_remap/alpha=3 +process/fix_alpha_border=true +process/premult_alpha=false +process/normal_map_invert_y=false +process/hdr_as_srgb=false +process/hdr_clamp_exposure=false +process/size_limit=0 +detect_3d/compress_to=1 diff --git a/assets/tools/socket_set.glb b/assets/tools/socket_set.glb new file mode 100644 index 0000000..f520dc4 Binary files /dev/null and b/assets/tools/socket_set.glb differ diff --git a/assets/tools/socket_set.glb.import b/assets/tools/socket_set.glb.import new file mode 100644 index 0000000..50264ae --- /dev/null +++ b/assets/tools/socket_set.glb.import @@ -0,0 +1,45 @@ +[remap] + +importer="scene" +importer_version=1 +type="PackedScene" +uid="uid://bgoglks48d1kn" +path="res://.godot/imported/socket_set.glb-1075b20f6515439e0f19c61f6b0d67fd.scn" + +[deps] + +source_file="res://assets/tools/socket_set.glb" +dest_files=["res://.godot/imported/socket_set.glb-1075b20f6515439e0f19c61f6b0d67fd.scn"] + +[params] + +nodes/root_type="" +nodes/root_name="" +nodes/root_script=null +mesh_library/use_node_names_as_mesh_names=false +array_mesh/deduplicate_surfaces=true +nodes/apply_root_scale=true +nodes/root_scale=1.0 +nodes/import_as_skeleton_bones=false +nodes/use_name_suffixes=true +nodes/use_node_type_suffixes=true +meshes/ensure_tangents=true +meshes/generate_lods=true +meshes/create_shadow_meshes=true +meshes/light_baking=1 +meshes/lightmap_texel_size=0.2 +meshes/force_disable_compression=false +skins/use_named_skins=true +animation/import=true +animation/fps=30 +animation/trimming=false +animation/remove_immutable_tracks=true +animation/import_rest_as_RESET=false +import_script/path="" +materials/extract=0 +materials/extract_format=0 +materials/extract_path="" +_subresources={} +gltf/naming_version=2 +gltf/embedded_image_handling=1 +gltf/texture_map_mode=1 diff --git a/assets/tools/socket_set_Image_0.jpg b/assets/tools/socket_set_Image_0.jpg new file mode 100644 index 0000000..36e51a7 Binary files /dev/null and b/assets/tools/socket_set_Image_0.jpg differ diff --git a/assets/tools/socket_set_Image_0.jpg.import b/assets/tools/socket_set_Image_0.jpg.import new file mode 100644 index 0000000..a5534f4 --- /dev/null +++ b/assets/tools/socket_set_Image_0.jpg.import @@ -0,0 +1,43 @@ +[remap] + +importer="texture" +type="CompressedTexture2D" +uid="uid://bt5gd0a8c4448" +path="res://.godot/imported/socket_set_Image_0.jpg-58a5cf4dbc573e312a01cd02961254dc.ctex" +metadata={ +"vram_texture": false +} +generator_parameters={ +"md5": "b8cf1b6039bf18c764ac2ff892f3d734" +} + +[deps] + +source_file="res://assets/tools/socket_set_Image_0.jpg" +dest_files=["res://.godot/imported/socket_set_Image_0.jpg-58a5cf4dbc573e312a01cd02961254dc.ctex"] + +[params] + +compress/mode=0 +compress/high_quality=false +compress/lossy_quality=0.7 +compress/uastc_level=0 +compress/rdo_quality_loss=0.0 +compress/hdr_compression=1 +compress/normal_map=0 +compress/channel_pack=0 +mipmaps/generate=true +mipmaps/limit=-1 +roughness/mode=0 +roughness/src_normal="" +process/channel_remap/red=0 +process/channel_remap/green=1 +process/channel_remap/blue=2 +process/channel_remap/alpha=3 +process/fix_alpha_border=true +process/premult_alpha=false +process/normal_map_invert_y=false +process/hdr_as_srgb=false +process/hdr_clamp_exposure=false +process/size_limit=0 +detect_3d/compress_to=1 diff --git a/assets/tools/socket_set_Image_1.jpg b/assets/tools/socket_set_Image_1.jpg new file mode 100644 index 0000000..d761222 Binary files /dev/null and b/assets/tools/socket_set_Image_1.jpg differ diff --git a/assets/tools/socket_set_Image_1.jpg.import b/assets/tools/socket_set_Image_1.jpg.import new file mode 100644 index 0000000..dab1190 --- /dev/null +++ b/assets/tools/socket_set_Image_1.jpg.import @@ -0,0 +1,43 @@ +[remap] + +importer="texture" +type="CompressedTexture2D" +uid="uid://d4ktkmskly7kq" +path="res://.godot/imported/socket_set_Image_1.jpg-0bcba31ea8eab1902fa829cdea74cba2.ctex" +metadata={ +"vram_texture": false +} +generator_parameters={ +"md5": "daffb23cc08459d112a7c445f234e3d4" +} + +[deps] + +source_file="res://assets/tools/socket_set_Image_1.jpg" +dest_files=["res://.godot/imported/socket_set_Image_1.jpg-0bcba31ea8eab1902fa829cdea74cba2.ctex"] + +[params] + +compress/mode=0 +compress/high_quality=false +compress/lossy_quality=0.7 +compress/uastc_level=0 +compress/rdo_quality_loss=0.0 +compress/hdr_compression=1 +compress/normal_map=0 +compress/channel_pack=0 +mipmaps/generate=true +mipmaps/limit=-1 +roughness/mode=0 +roughness/src_normal="" +process/channel_remap/red=0 +process/channel_remap/green=1 +process/channel_remap/blue=2 +process/channel_remap/alpha=3 +process/fix_alpha_border=true +process/premult_alpha=false +process/normal_map_invert_y=false +process/hdr_as_srgb=false +process/hdr_clamp_exposure=false +process/size_limit=0 +detect_3d/compress_to=1 diff --git a/assets/tools/toolbox.glb b/assets/tools/toolbox.glb new file mode 100644 index 0000000..85d61d7 Binary files /dev/null and b/assets/tools/toolbox.glb differ diff --git a/assets/tools/toolbox.glb.import b/assets/tools/toolbox.glb.import new file mode 100644 index 0000000..472ed2f --- /dev/null +++ b/assets/tools/toolbox.glb.import @@ -0,0 +1,45 @@ +[remap] + +importer="scene" +importer_version=1 +type="PackedScene" +uid="uid://crm5hfhikocsu" +path="res://.godot/imported/toolbox.glb-483649963f97f821c79617f72a7bf500.scn" + +[deps] + +source_file="res://assets/tools/toolbox.glb" +dest_files=["res://.godot/imported/toolbox.glb-483649963f97f821c79617f72a7bf500.scn"] + +[params] + +nodes/root_type="" +nodes/root_name="" +nodes/root_script=null +mesh_library/use_node_names_as_mesh_names=false +array_mesh/deduplicate_surfaces=true +nodes/apply_root_scale=true +nodes/root_scale=1.0 +nodes/import_as_skeleton_bones=false +nodes/use_name_suffixes=true +nodes/use_node_type_suffixes=true +meshes/ensure_tangents=true +meshes/generate_lods=true +meshes/create_shadow_meshes=true +meshes/light_baking=1 +meshes/lightmap_texel_size=0.2 +meshes/force_disable_compression=false +skins/use_named_skins=true +animation/import=true +animation/fps=30 +animation/trimming=false +animation/remove_immutable_tracks=true +animation/import_rest_as_RESET=false +import_script/path="" +materials/extract=0 +materials/extract_format=0 +materials/extract_path="" +_subresources={} +gltf/naming_version=2 +gltf/embedded_image_handling=1 +gltf/texture_map_mode=1 diff --git a/assets/tools/toolbox_Image_0.jpg b/assets/tools/toolbox_Image_0.jpg new file mode 100644 index 0000000..bde29e5 Binary files /dev/null and b/assets/tools/toolbox_Image_0.jpg differ diff --git a/assets/tools/toolbox_Image_0.jpg.import b/assets/tools/toolbox_Image_0.jpg.import new file mode 100644 index 0000000..ceb518d --- /dev/null +++ b/assets/tools/toolbox_Image_0.jpg.import @@ -0,0 +1,43 @@ +[remap] + +importer="texture" +type="CompressedTexture2D" +uid="uid://dlvqsohjv4g5t" +path="res://.godot/imported/toolbox_Image_0.jpg-b88e5ae81c1c52d90df3a2645d5d8253.ctex" +metadata={ +"vram_texture": false +} +generator_parameters={ +"md5": "f6cf6fa3f3aac55d15d000995d20a84b" +} + +[deps] + +source_file="res://assets/tools/toolbox_Image_0.jpg" +dest_files=["res://.godot/imported/toolbox_Image_0.jpg-b88e5ae81c1c52d90df3a2645d5d8253.ctex"] + +[params] + +compress/mode=0 +compress/high_quality=false +compress/lossy_quality=0.7 +compress/uastc_level=0 +compress/rdo_quality_loss=0.0 +compress/hdr_compression=1 +compress/normal_map=0 +compress/channel_pack=0 +mipmaps/generate=true +mipmaps/limit=-1 +roughness/mode=0 +roughness/src_normal="" +process/channel_remap/red=0 +process/channel_remap/green=1 +process/channel_remap/blue=2 +process/channel_remap/alpha=3 +process/fix_alpha_border=true +process/premult_alpha=false +process/normal_map_invert_y=false +process/hdr_as_srgb=false +process/hdr_clamp_exposure=false +process/size_limit=0 +detect_3d/compress_to=1 diff --git a/assets/tools/toolbox_Image_1.jpg b/assets/tools/toolbox_Image_1.jpg new file mode 100644 index 0000000..afcf92d Binary files /dev/null and b/assets/tools/toolbox_Image_1.jpg differ diff --git a/assets/tools/toolbox_Image_1.jpg.import b/assets/tools/toolbox_Image_1.jpg.import new file mode 100644 index 0000000..c8cff63 --- /dev/null +++ b/assets/tools/toolbox_Image_1.jpg.import @@ -0,0 +1,43 @@ +[remap] + +importer="texture" +type="CompressedTexture2D" +uid="uid://bm2oocbpub7c4" +path="res://.godot/imported/toolbox_Image_1.jpg-01d3635a9032c3c86c29837c0d9e5cfc.ctex" +metadata={ +"vram_texture": false +} +generator_parameters={ +"md5": "c079412f11fc608e7939054cd1b1bcda" +} + +[deps] + +source_file="res://assets/tools/toolbox_Image_1.jpg" +dest_files=["res://.godot/imported/toolbox_Image_1.jpg-01d3635a9032c3c86c29837c0d9e5cfc.ctex"] + +[params] + +compress/mode=0 +compress/high_quality=false +compress/lossy_quality=0.7 +compress/uastc_level=0 +compress/rdo_quality_loss=0.0 +compress/hdr_compression=1 +compress/normal_map=0 +compress/channel_pack=0 +mipmaps/generate=true +mipmaps/limit=-1 +roughness/mode=0 +roughness/src_normal="" +process/channel_remap/red=0 +process/channel_remap/green=1 +process/channel_remap/blue=2 +process/channel_remap/alpha=3 +process/fix_alpha_border=true +process/premult_alpha=false +process/normal_map_invert_y=false +process/hdr_as_srgb=false +process/hdr_clamp_exposure=false +process/size_limit=0 +detect_3d/compress_to=1 diff --git a/assets/tools/trolley_jack.glb b/assets/tools/trolley_jack.glb new file mode 100644 index 0000000..5833b9f Binary files /dev/null and b/assets/tools/trolley_jack.glb differ diff --git a/assets/tools/trolley_jack.glb.import b/assets/tools/trolley_jack.glb.import new file mode 100644 index 0000000..8f703be --- /dev/null +++ b/assets/tools/trolley_jack.glb.import @@ -0,0 +1,45 @@ +[remap] + +importer="scene" +importer_version=1 +type="PackedScene" +uid="uid://coe4tpykcwpu" +path="res://.godot/imported/trolley_jack.glb-808c7f8d0e225535e497b21ff121d21b.scn" + +[deps] + +source_file="res://assets/tools/trolley_jack.glb" +dest_files=["res://.godot/imported/trolley_jack.glb-808c7f8d0e225535e497b21ff121d21b.scn"] + +[params] + +nodes/root_type="" +nodes/root_name="" +nodes/root_script=null +mesh_library/use_node_names_as_mesh_names=false +array_mesh/deduplicate_surfaces=true +nodes/apply_root_scale=true +nodes/root_scale=1.0 +nodes/import_as_skeleton_bones=false +nodes/use_name_suffixes=true +nodes/use_node_type_suffixes=true +meshes/ensure_tangents=true +meshes/generate_lods=true +meshes/create_shadow_meshes=true +meshes/light_baking=1 +meshes/lightmap_texel_size=0.2 +meshes/force_disable_compression=false +skins/use_named_skins=true +animation/import=true +animation/fps=30 +animation/trimming=false +animation/remove_immutable_tracks=true +animation/import_rest_as_RESET=false +import_script/path="" +materials/extract=0 +materials/extract_format=0 +materials/extract_path="" +_subresources={} +gltf/naming_version=2 +gltf/embedded_image_handling=1 +gltf/texture_map_mode=1 diff --git a/assets/tools/trolley_jack_Image_0.jpg b/assets/tools/trolley_jack_Image_0.jpg new file mode 100644 index 0000000..b6f2ef8 Binary files /dev/null and b/assets/tools/trolley_jack_Image_0.jpg differ diff --git a/assets/tools/trolley_jack_Image_0.jpg.import b/assets/tools/trolley_jack_Image_0.jpg.import new file mode 100644 index 0000000..168f0ad --- /dev/null +++ b/assets/tools/trolley_jack_Image_0.jpg.import @@ -0,0 +1,43 @@ +[remap] + +importer="texture" +type="CompressedTexture2D" +uid="uid://pundlpl3xipt" +path="res://.godot/imported/trolley_jack_Image_0.jpg-e9782c0a42c5249795555a7030843434.ctex" +metadata={ +"vram_texture": false +} +generator_parameters={ +"md5": "21f57150c31bdaa5a703141766c9bea6" +} + +[deps] + +source_file="res://assets/tools/trolley_jack_Image_0.jpg" +dest_files=["res://.godot/imported/trolley_jack_Image_0.jpg-e9782c0a42c5249795555a7030843434.ctex"] + +[params] + +compress/mode=0 +compress/high_quality=false +compress/lossy_quality=0.7 +compress/uastc_level=0 +compress/rdo_quality_loss=0.0 +compress/hdr_compression=1 +compress/normal_map=0 +compress/channel_pack=0 +mipmaps/generate=true +mipmaps/limit=-1 +roughness/mode=0 +roughness/src_normal="" +process/channel_remap/red=0 +process/channel_remap/green=1 +process/channel_remap/blue=2 +process/channel_remap/alpha=3 +process/fix_alpha_border=true +process/premult_alpha=false +process/normal_map_invert_y=false +process/hdr_as_srgb=false +process/hdr_clamp_exposure=false +process/size_limit=0 +detect_3d/compress_to=1 diff --git a/assets/tools/trolley_jack_Image_1.jpg b/assets/tools/trolley_jack_Image_1.jpg new file mode 100644 index 0000000..fd1504a Binary files /dev/null and b/assets/tools/trolley_jack_Image_1.jpg differ diff --git a/assets/tools/trolley_jack_Image_1.jpg.import b/assets/tools/trolley_jack_Image_1.jpg.import new file mode 100644 index 0000000..46e1948 --- /dev/null +++ b/assets/tools/trolley_jack_Image_1.jpg.import @@ -0,0 +1,43 @@ +[remap] + +importer="texture" +type="CompressedTexture2D" +uid="uid://od8g6nv31mio" +path="res://.godot/imported/trolley_jack_Image_1.jpg-723d6e0df7a187ed306d05c3c875ce16.ctex" +metadata={ +"vram_texture": false +} +generator_parameters={ +"md5": "24e69ffd41a715524dd94ad03af85e1f" +} + +[deps] + +source_file="res://assets/tools/trolley_jack_Image_1.jpg" +dest_files=["res://.godot/imported/trolley_jack_Image_1.jpg-723d6e0df7a187ed306d05c3c875ce16.ctex"] + +[params] + +compress/mode=0 +compress/high_quality=false +compress/lossy_quality=0.7 +compress/uastc_level=0 +compress/rdo_quality_loss=0.0 +compress/hdr_compression=1 +compress/normal_map=0 +compress/channel_pack=0 +mipmaps/generate=true +mipmaps/limit=-1 +roughness/mode=0 +roughness/src_normal="" +process/channel_remap/red=0 +process/channel_remap/green=1 +process/channel_remap/blue=2 +process/channel_remap/alpha=3 +process/fix_alpha_border=true +process/premult_alpha=false +process/normal_map_invert_y=false +process/hdr_as_srgb=false +process/hdr_clamp_exposure=false +process/size_limit=0 +detect_3d/compress_to=1 diff --git a/assets/tools/welder.glb b/assets/tools/welder.glb new file mode 100644 index 0000000..445b65a Binary files /dev/null and b/assets/tools/welder.glb differ diff --git a/assets/tools/welder.glb.import b/assets/tools/welder.glb.import new file mode 100644 index 0000000..bea0fb9 --- /dev/null +++ b/assets/tools/welder.glb.import @@ -0,0 +1,45 @@ +[remap] + +importer="scene" +importer_version=1 +type="PackedScene" +uid="uid://dw2ynuvnfm3k2" +path="res://.godot/imported/welder.glb-9b6889ab8a792c988e68c235d9d2cee6.scn" + +[deps] + +source_file="res://assets/tools/welder.glb" +dest_files=["res://.godot/imported/welder.glb-9b6889ab8a792c988e68c235d9d2cee6.scn"] + +[params] + +nodes/root_type="" +nodes/root_name="" +nodes/root_script=null +mesh_library/use_node_names_as_mesh_names=false +array_mesh/deduplicate_surfaces=true +nodes/apply_root_scale=true +nodes/root_scale=1.0 +nodes/import_as_skeleton_bones=false +nodes/use_name_suffixes=true +nodes/use_node_type_suffixes=true +meshes/ensure_tangents=true +meshes/generate_lods=true +meshes/create_shadow_meshes=true +meshes/light_baking=1 +meshes/lightmap_texel_size=0.2 +meshes/force_disable_compression=false +skins/use_named_skins=true +animation/import=true +animation/fps=30 +animation/trimming=false +animation/remove_immutable_tracks=true +animation/import_rest_as_RESET=false +import_script/path="" +materials/extract=0 +materials/extract_format=0 +materials/extract_path="" +_subresources={} +gltf/naming_version=2 +gltf/embedded_image_handling=1 +gltf/texture_map_mode=1 diff --git a/assets/tools/welder_Image_0.jpg b/assets/tools/welder_Image_0.jpg new file mode 100644 index 0000000..a610869 Binary files /dev/null and b/assets/tools/welder_Image_0.jpg differ diff --git a/assets/tools/welder_Image_0.jpg.import b/assets/tools/welder_Image_0.jpg.import new file mode 100644 index 0000000..648f383 --- /dev/null +++ b/assets/tools/welder_Image_0.jpg.import @@ -0,0 +1,43 @@ +[remap] + +importer="texture" +type="CompressedTexture2D" +uid="uid://crh8mxwskqydu" +path="res://.godot/imported/welder_Image_0.jpg-e15c19429fbf0df66b1bd2fe7c6793ef.ctex" +metadata={ +"vram_texture": false +} +generator_parameters={ +"md5": "d06d868e58761075d9a99e7a670a546b" +} + +[deps] + +source_file="res://assets/tools/welder_Image_0.jpg" +dest_files=["res://.godot/imported/welder_Image_0.jpg-e15c19429fbf0df66b1bd2fe7c6793ef.ctex"] + +[params] + +compress/mode=0 +compress/high_quality=false +compress/lossy_quality=0.7 +compress/uastc_level=0 +compress/rdo_quality_loss=0.0 +compress/hdr_compression=1 +compress/normal_map=0 +compress/channel_pack=0 +mipmaps/generate=true +mipmaps/limit=-1 +roughness/mode=0 +roughness/src_normal="" +process/channel_remap/red=0 +process/channel_remap/green=1 +process/channel_remap/blue=2 +process/channel_remap/alpha=3 +process/fix_alpha_border=true +process/premult_alpha=false +process/normal_map_invert_y=false +process/hdr_as_srgb=false +process/hdr_clamp_exposure=false +process/size_limit=0 +detect_3d/compress_to=1 diff --git a/assets/tools/welder_Image_1.jpg b/assets/tools/welder_Image_1.jpg new file mode 100644 index 0000000..f6e9e33 Binary files /dev/null and b/assets/tools/welder_Image_1.jpg differ diff --git a/assets/tools/welder_Image_1.jpg.import b/assets/tools/welder_Image_1.jpg.import new file mode 100644 index 0000000..b89c327 --- /dev/null +++ b/assets/tools/welder_Image_1.jpg.import @@ -0,0 +1,43 @@ +[remap] + +importer="texture" +type="CompressedTexture2D" +uid="uid://dg8m0ngt5axqh" +path="res://.godot/imported/welder_Image_1.jpg-d24b90967117c4c52c9b64dc6296dcbc.ctex" +metadata={ +"vram_texture": false +} +generator_parameters={ +"md5": "441e51a4dbeaa7206080c3ccbafb8067" +} + +[deps] + +source_file="res://assets/tools/welder_Image_1.jpg" +dest_files=["res://.godot/imported/welder_Image_1.jpg-d24b90967117c4c52c9b64dc6296dcbc.ctex"] + +[params] + +compress/mode=0 +compress/high_quality=false +compress/lossy_quality=0.7 +compress/uastc_level=0 +compress/rdo_quality_loss=0.0 +compress/hdr_compression=1 +compress/normal_map=0 +compress/channel_pack=0 +mipmaps/generate=true +mipmaps/limit=-1 +roughness/mode=0 +roughness/src_normal="" +process/channel_remap/red=0 +process/channel_remap/green=1 +process/channel_remap/blue=2 +process/channel_remap/alpha=3 +process/fix_alpha_border=true +process/premult_alpha=false +process/normal_map_invert_y=false +process/hdr_as_srgb=false +process/hdr_clamp_exposure=false +process/size_limit=0 +detect_3d/compress_to=1 diff --git a/levels/willowbank_dragway/dragway.gd b/levels/willowbank_dragway/dragway.gd index 75796b0..ba62300 100644 --- a/levels/willowbank_dragway/dragway.gd +++ b/levels/willowbank_dragway/dragway.gd @@ -14,6 +14,27 @@ const STRIP_HALF := 12.0 # wall-to-wall half width const FINISH := -402.0 const SHUTDOWN_END := -640.0 +## Real Cashies stock, TRELLIS'd into GLBs (tools/cc_to_glb.py). Scale is the +## longest dimension in metres; mass makes clipping an engine crane at 80 +## a different event to punting a grease gun. +const TOOL_SPECS := { + "angle_grinder": {"size": 0.35, "mass": 3.0}, + "batt_charger": {"size": 0.28, "mass": 4.0}, + "car_ramps": {"size": 0.95, "mass": 9.0}, + "chain_hoist": {"size": 0.45, "mass": 12.0}, + "compressor": {"size": 0.55, "mass": 14.0}, + "engine_crane": {"size": 1.6, "mass": 70.0}, + "engine_stand": {"size": 0.95, "mass": 30.0}, + "grease_gun": {"size": 0.4, "mass": 2.0}, + "jack_stands": {"size": 0.45, "mass": 8.0}, + "jerry_can": {"size": 0.48, "mass": 6.0}, + "obd_reader": {"size": 0.22, "mass": 1.0}, + "socket_set": {"size": 0.4, "mass": 5.0}, + "toolbox": {"size": 0.7, "mass": 18.0}, + "trolley_jack": {"size": 0.65, "mass": 20.0}, + "welder": {"size": 0.5, "mass": 16.0}, +} + func _ready() -> void: var rng := RandomNumberGenerator.new() rng.seed = 1320 # a respectable ET @@ -77,6 +98,7 @@ func _ready() -> void: add_child(m) _gums(rng) + _paddock_tools(rng) _race_path() func _mat(tex: String, scale: float, rough := 0.9) -> StandardMaterial3D: @@ -246,6 +268,57 @@ func _gums(rng: RandomNumberGenerator) -> void: crown.position = at + Vector3(0, cm.height + sm.radius * 0.4, 0) add_child(crown) +func _paddock_tools(rng: RandomNumberGenerator) -> void: + ## Strew the paddock with the TRELLIS'd Cashies tool library -- real + ## secondhand clutter, every piece a shuntable RigidBody. Scale comes from + ## TOOL_SPECS (TRELLIS output is unit-ish), base sat on the ground. + var dir := DirAccess.open("res://assets/tools") + if dir == null: + return + var names: Array[String] = [] + for f in dir.get_files(): + if f.ends_with(".glb"): + names.append(f.get_basename()) + names.sort() # deterministic layout + var i := 0 + for n in names: + var scene := load("res://assets/tools/%s.glb" % n) as PackedScene + if scene == null: + continue + var spec: Dictionary = TOOL_SPECS.get(n, {"size": 0.5, "mass": 8.0}) + var model := scene.instantiate() as Node3D + add_child(model) # into the tree first so global AABBs are real + var aabb := AABB() + var first := true + for mi in model.find_children("*", "MeshInstance3D", true, false): + var b: AABB = (mi as MeshInstance3D).global_transform * (mi as MeshInstance3D).get_aabb() + aabb = b if first else aabb.merge(b) + first = false + remove_child(model) + if first: + model.queue_free() + continue + var s: float = float(spec["size"]) / maxf(aabb.size.x, maxf(aabb.size.y, aabb.size.z)) + var body := RigidBody3D.new() + body.mass = float(spec["mass"]) + body.set_meta("cc_tool", n) + var cs := CollisionShape3D.new() + var box := BoxShape3D.new() + box.size = (aabb.size * s).clamp(Vector3.ONE * 0.08, Vector3.ONE * 3.0) + cs.shape = box + cs.position = aabb.get_center() * s + body.add_child(cs) + model.scale = Vector3.ONE * s + body.add_child(model) + add_child(body) + var spot := Vector3(24.0 + (i % 4) * 4.5 + rng.randf_range(-0.8, 0.8), + 0.02 - aabb.position.y * s, + -16.0 - float(i / 4) * 7.0 + rng.randf_range(-0.8, 0.8)) + body.global_position = spot + body.rotate_y(rng.randf() * TAU) + body.sleeping = true + i += 1 + func _race_path() -> void: # loop for cruise traffic: down the strip, back up the return road var path := Path3D.new() diff --git a/push18.log b/push18.log new file mode 100644 index 0000000..3f28e8e --- /dev/null +++ b/push18.log @@ -0,0 +1,10 @@ +Enumerating objects: 21, done. +Counting objects: 4% (1/21) Counting objects: 9% (2/21) Counting objects: 14% (3/21) Counting objects: 19% (4/21) Counting objects: 23% (5/21) Counting objects: 28% (6/21) Counting objects: 33% (7/21) Counting objects: 38% (8/21) Counting objects: 42% (9/21) Counting objects: 47% (10/21) Counting objects: 52% (11/21) Counting objects: 57% (12/21) Counting objects: 61% (13/21) Counting objects: 66% (14/21) Counting objects: 71% (15/21) Counting objects: 76% (16/21) Counting objects: 80% (17/21) Counting objects: 85% (18/21) Counting objects: 90% (19/21) Counting objects: 95% (20/21) Counting objects: 100% (21/21) Counting objects: 100% (21/21), done. +Delta compression using up to 32 threads +Compressing objects: 8% (1/12) Compressing objects: 16% (2/12) Compressing objects: 25% (3/12) Compressing objects: 33% (4/12) Compressing objects: 41% (5/12) Compressing objects: 50% (6/12) Compressing objects: 58% (7/12) Compressing objects: 66% (8/12) Compressing objects: 75% (9/12) Compressing objects: 83% (10/12) Compressing objects: 91% (11/12) Compressing objects: 100% (12/12) Compressing objects: 100% (12/12), done. +Writing objects: 7% (1/13) Writing objects: 15% (2/13) Writing objects: 23% (3/13) Writing objects: 30% (4/13) Writing objects: 38% (5/13) Writing objects: 46% (6/13) Writing objects: 53% (7/13) Writing objects: 61% (8/13) Writing objects: 69% (9/13) Writing objects: 76% (10/13) Writing objects: 84% (11/13) Writing objects: 92% (12/13) Writing objects: 100% (13/13) Writing objects: 100% (13/13), 10.48 KiB | 10.48 MiB/s, done. +Total 13 (delta 8), reused 0 (delta 0), pack-reused 0 (from 0) +remote: . Processing 1 references +remote: Processed 1 references in total +To ssh://100.71.119.27:222/monster/burnoutinfinityshitbox.git + 927b3a9..4f91b34 main -> main diff --git a/tests/smoke.gd b/tests/smoke.gd index b330521..3c7ea9b 100644 --- a/tests/smoke.gd +++ b/tests/smoke.gd @@ -215,6 +215,19 @@ func _run() -> void: _check(game.rivals[0].stats.resource_path.contains("morry"), "rung 0 rival isn't Nanna (%s)" % game.rivals[0].stats.resource_path) _check(game._tree_bulbs.size() == 6, "christmas tree bulbs missing (%d)" % game._tree_bulbs.size()) + # TRELLIS'd cashies tools: once the library exists, the paddock is strewn + var tool_dir := DirAccess.open("res://assets/tools") + if tool_dir != null: + var glbs := 0 + for f in tool_dir.get_files(): + if f.ends_with(".glb"): + glbs += 1 + if glbs > 0: + var strewn := 0 + for n in game.find_children("*", "RigidBody3D", true, false): + if n.has_meta("cc_tool"): + strewn += 1 + _check(strewn == glbs, "tool library has %d GLBs but %d spawned" % [glbs, strewn]) await physics_frame _check(game.rivals[0].power_scale == 0.0, "rival not held at the tree") # burnout in the box: DRIFT+GAS warms the tyres and must NOT roll the beams diff --git a/tools/cc_to_glb.py b/tools/cc_to_glb.py new file mode 100644 index 0000000..9dfe061 --- /dev/null +++ b/tools/cc_to_glb.py @@ -0,0 +1,169 @@ +#!/usr/bin/env python3 +"""Cashies photo -> game prop: bg_remove_local then trellis_mac on MODELBEAST. + +Usage: cc_to_glb.py [name=image ...] [--out DIR] [--workers N] + +For each input image: upload -> bg_remove_local (clean cutout; the op's own +docs call this the big quality jump before image->3D) -> trellis_mac +(1024 tier, 1024 texture: prop-grade, keeps GLBs a few MB) -> download the +GLB to /.glb. Progress lines are grep-friendly: "DONE name" / +"FAIL name reason". Queue + token per ~/.claude/skills/fleet/SKILL.md; the +guest token allows 4 active jobs, so keep --workers at 2 (each worker holds +one job at a time, bg+trellis are sequential per item). + +Job log JSON carries raw control chars -- scrub before json.loads. +""" +import json +import mimetypes +import os +import re +import sys +import threading +import time +import urllib.request +import uuid + +HOST = os.environ.get("MB_HOST", "http://100.89.131.57:8777") +ENVS = ["~/Documents/fluxgod-work/.env", "~/Documents/backnforth/.env"] + + +def token(): + for p in ENVS: + p = os.path.expanduser(p) + if not os.path.exists(p): + continue + for line in open(p): + if line.startswith("MB_TOKEN"): + return line.split("=", 1)[1].strip().strip("'\"") + sys.exit("no MB_TOKEN found on disk") + + +TOK = token() + + +def call(path, data=None, headers=None, raw=False, tries=4): + # the queue occasionally throws a transient 401/5xx mid-batch (seen live: + # one 401 between a working bg job and a working trellis submit) -- retry + # with backoff before declaring an item dead + h = {"Authorization": "Bearer " + TOK} + h.update(headers or {}) + last = None + for attempt in range(tries): + try: + req = urllib.request.Request(HOST + path, data=data, headers=h) + blob = urllib.request.urlopen(req, timeout=180).read() + if raw: + return blob + return json.loads(re.sub(r"[\x00-\x1f]", "", blob.decode("utf-8", "replace"))) + except Exception as e: + last = e + time.sleep(4 * (attempt + 1)) + raise last + + +def upload(path): + boundary = uuid.uuid4().hex + ctype = mimetypes.guess_type(path)[0] or "application/octet-stream" + body = ( + f'--{boundary}\r\nContent-Disposition: form-data; name="file"; ' + f'filename="{os.path.basename(path)}"\r\nContent-Type: {ctype}\r\n\r\n' + ).encode() + open(path, "rb").read() + f"\r\n--{boundary}--\r\n".encode() + a = call("/api/assets", data=body, + headers={"Content-Type": f"multipart/form-data; boundary={boundary}"}) + return a.get("id") or (a.get("items") or [a])[0].get("id") + + +def run_job(operator, asset_id, params, timeout_s): + j = call("/api/jobs", data=json.dumps( + {"operator": operator, "asset_id": asset_id, "params": params}).encode(), + headers={"Content-Type": "application/json"}) + jid = j["id"] + t0 = time.time() + while time.time() - t0 < timeout_s: + time.sleep(10) + st = call("/api/jobs/%s" % jid) + if st.get("status") in ("done", "error", "cancelled"): + if st["status"] != "done": + raise RuntimeError("%s job %s: %s (%s)" % ( + operator, jid, st["status"], str(st.get("error", ""))[:160])) + return jid + raise RuntimeError("%s job %s timed out after %ds" % (operator, jid, timeout_s)) + + +def job_asset(jid, suffix=None): + # jobs don't back-link outputs: list assets, match parent_job (mb_recon contract) + a = call("/api/assets?limit=100") + items = a if isinstance(a, list) else a.get("items", []) + mine = [x for x in items if x.get("parent_job") == jid] + if suffix: + mine = [x for x in mine + if str(x.get("filename", x.get("name", ""))).endswith(suffix)] + if not mine: + raise RuntimeError("job %s produced no %s asset" % (jid, suffix or "")) + return mine[0]["id"] + + +MESH_OP = "trellis_mac" +MESH_PARAMS = { + # jerry cans made trellis_mac exit 2 on two different photos; hunyuan3d_mlx + # chewed the same cutout happily -- keep both dialled in + "trellis_mac": {"pipeline_type": "1024", "texture_size": 1024}, + "hunyuan3d_mlx": {"texture_size": 1024}, +} + + +def one(name, img, outdir): + try: + aid = upload(img) + print("UPLOADED %s -> %s" % (name, aid), flush=True) + bj = run_job("bg_remove_local", aid, {"resolution": 1024}, 600) + cut = job_asset(bj) + print("CUTOUT %s" % name, flush=True) + tj = run_job(MESH_OP, cut, MESH_PARAMS.get(MESH_OP, {}), 3600) + gid = job_asset(tj, ".glb") + out = os.path.join(outdir, name + ".glb") + open(out, "wb").write(call("/api/assets/%s/file" % gid, raw=True)) + print("DONE %s (%dKB)" % (name, os.path.getsize(out) // 1024), flush=True) + except Exception as e: + print("FAIL %s %s" % (name, str(e)[:200]), flush=True) + + +def main(): + args = sys.argv[1:] + outdir = "assets/tools" + workers = 2 + if "--out" in args: + i = args.index("--out") + outdir = args[i + 1] + del args[i:i + 2] + if "--workers" in args: + i = args.index("--workers") + workers = int(args[i + 1]) + del args[i:i + 2] + if "--operator" in args: + i = args.index("--operator") + global MESH_OP + MESH_OP = args[i + 1] + del args[i:i + 2] + os.makedirs(outdir, exist_ok=True) + queue = [a.split("=", 1) for a in args if "=" in a] + lock = threading.Lock() + + def worker(): + while True: + with lock: + if not queue: + return + name, img = queue.pop(0) + one(name, img, outdir) + + threads = [threading.Thread(target=worker) for _ in range(workers)] + for t in threads: + t.start() + for t in threads: + t.join() + print("BATCH_COMPLETE", flush=True) + + +if __name__ == "__main__": + main() diff --git a/tools/slim_glb.py b/tools/slim_glb.py new file mode 100644 index 0000000..a94420c --- /dev/null +++ b/tools/slim_glb.py @@ -0,0 +1,75 @@ +"""Slim TRELLIS GLBs to prop grade, in place. + + /Applications/Blender.app/Contents/MacOS/Blender -b -P tools/slim_glb.py -- [max_tris] [tex_px] + +TRELLIS ships ~200k-face meshes with PNG textures -- 20MB+ per prop, which is +lovely and also insane for background clutter. Per GLB: decimate every mesh +down to max_tris (default 18k), scale every image to tex_px (default 1024), +re-export with JPEG textures. Typical result is a 10x size drop with no +visible cost at prop distance. Prints "SLIM name before->after KB" per file. +""" +import os +import sys + +import bpy + +argv = sys.argv[sys.argv.index("--") + 1:] if "--" in sys.argv else [] +DIR = argv[0] if argv else "assets/tools" +MAX_TRIS = int(argv[1]) if len(argv) > 1 else 18000 +TEX = int(argv[2]) if len(argv) > 2 else 1024 + + +def reset(): + bpy.ops.wm.read_factory_settings(use_empty=True) + + +def tri_count(obj): + m = obj.evaluated_get(bpy.context.evaluated_depsgraph_get()).to_mesh() + n = len(m.loop_triangles) + obj.evaluated_get(bpy.context.evaluated_depsgraph_get()).to_mesh_clear() + return n + + +def slim(path): + reset() + before = os.path.getsize(path) // 1024 + bpy.ops.import_scene.gltf(filepath=path) + meshes = [o for o in bpy.data.objects if o.type == "MESH"] + total = 0 + for o in meshes: + o.data.calc_loop_triangles() + total += len(o.data.loop_triangles) + if total > MAX_TRIS: + ratio = MAX_TRIS / float(total) + for o in meshes: + bpy.context.view_layer.objects.active = o + mod = o.modifiers.new("slim", "DECIMATE") + mod.ratio = ratio + bpy.ops.object.modifier_apply(modifier=mod.name) + for img in bpy.data.images: + if img.size[0] > TEX or img.size[1] > TEX: + img.scale(min(img.size[0], TEX), min(img.size[1], TEX)) + kwargs = { + "filepath": path, + "export_format": "GLB", + "export_image_format": "JPEG", + "export_yup": True, + } + # quality kwarg name moved between Blender versions; feed whichever exists + props = bpy.ops.export_scene.gltf.get_rna_type().properties.keys() + for k in ("export_jpeg_quality", "export_image_quality"): + if k in props: + kwargs[k] = 80 + bpy.ops.export_scene.gltf(**kwargs) + print("SLIM %s %d->%dKB (%d tris)" % ( + os.path.basename(path), before, os.path.getsize(path) // 1024, + min(total, MAX_TRIS)), flush=True) + + +for f in sorted(os.listdir(DIR)): + if f.endswith(".glb"): + try: + slim(os.path.join(DIR, f)) + except Exception as e: # keep the batch alive; one dud mustn't kill it + print("SLIM_FAIL %s %s" % (f, str(e)[:160]), flush=True) +print("SLIM_COMPLETE", flush=True)