Cashies tool library: dealgod photos -> TRELLIS -> shuntable paddock props

The dealgod.pro products database holds ~82k secondhand tool listings
with photos (69k cached on the VPS). This turns the good ones into game
assets: 15 tool classes curated from 45 candidates (socket set, air
compressor, chain block, car ramp, OBD reader, trolley jack, engine
crane, engine stand, toolbox, angle grinder, welder, jerry can, battery
charger, jack stands, grease gun), each run through the MODELBEAST farm
by the new tools/cc_to_glb.py: bg_remove_local cutout, then trellis_mac
image->3D (1024 tier). Retries with backoff after a transient queue 401;
the jerry can made trellis_mac exit 2 on two different photos and went
through hunyuan3d_mlx instead (--operator flag), which ate it happily.

Raw TRELLIS output is ~20MB per prop, so tools/slim_glb.py (headless
Blender) decimates to 18k tris and re-exports with 1024 JPEG textures:
the library lands at 27MB total for 15 props instead of ~300MB.

The Willowbank paddock strews the whole library as RigidBodies --
TOOL_SPECS in dragway.gd gives each class its real-world size (TRELLIS
output is unit-ish; the AABB is measured live and scaled) and an honest
mass, so clipping the 70kg engine crane is a different event to punting
the grease gun. The loader is directory-driven: drop a new GLB into
assets/tools/ and it appears in the paddock next boot.

Textures inherit whatever branding was in the source photos -- fine for
secondhand background clutter, flagged in the README for anything that
gets promoted to hero status. Smoke suite asserts every GLB in the
library spawns as a prop.

Co-Authored-By: Claude Opus 5 <noreply@anthropic.com>
This commit is contained in:
m3ultra 2026-07-31 14:25:48 +10:00
parent e47fecf2a8
commit 324dbdf625
96 changed files with 2322 additions and 0 deletions

View File

@ -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

Binary file not shown.

View File

@ -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

Binary file not shown.

After

Width:  |  Height:  |  Size: 182 KiB

View File

@ -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

Binary file not shown.

After

Width:  |  Height:  |  Size: 158 KiB

View File

@ -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

Binary file not shown.

View File

@ -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

Binary file not shown.

After

Width:  |  Height:  |  Size: 194 KiB

View File

@ -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

Binary file not shown.

After

Width:  |  Height:  |  Size: 142 KiB

View File

@ -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

BIN
assets/tools/car_ramps.glb Normal file

Binary file not shown.

View File

@ -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

Binary file not shown.

After

Width:  |  Height:  |  Size: 149 KiB

View File

@ -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

Binary file not shown.

After

Width:  |  Height:  |  Size: 52 KiB

View File

@ -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

Binary file not shown.

View File

@ -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

Binary file not shown.

After

Width:  |  Height:  |  Size: 2.1 MiB

View File

@ -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

Binary file not shown.

After

Width:  |  Height:  |  Size: 235 KiB

View File

@ -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

BIN
assets/tools/compressor.glb Normal file

Binary file not shown.

View File

@ -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

Binary file not shown.

After

Width:  |  Height:  |  Size: 309 KiB

View File

@ -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

Binary file not shown.

After

Width:  |  Height:  |  Size: 177 KiB

View File

@ -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

Binary file not shown.

View File

@ -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

Binary file not shown.

After

Width:  |  Height:  |  Size: 2.0 MiB

View File

@ -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

Binary file not shown.

After

Width:  |  Height:  |  Size: 239 KiB

View File

@ -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

Binary file not shown.

View File

@ -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

Binary file not shown.

After

Width:  |  Height:  |  Size: 274 KiB

View File

@ -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

Binary file not shown.

After

Width:  |  Height:  |  Size: 162 KiB

View File

@ -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

BIN
assets/tools/grease_gun.glb Normal file

Binary file not shown.

View File

@ -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

Binary file not shown.

After

Width:  |  Height:  |  Size: 2.0 MiB

View File

@ -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

Binary file not shown.

After

Width:  |  Height:  |  Size: 228 KiB

View File

@ -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

Binary file not shown.

View File

@ -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

Binary file not shown.

After

Width:  |  Height:  |  Size: 216 KiB

View File

@ -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

Binary file not shown.

After

Width:  |  Height:  |  Size: 180 KiB

View File

@ -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

BIN
assets/tools/jerry_can.glb Normal file

Binary file not shown.

View File

@ -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

Binary file not shown.

After

Width:  |  Height:  |  Size: 158 KiB

View File

@ -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

Binary file not shown.

After

Width:  |  Height:  |  Size: 138 KiB

View File

@ -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

BIN
assets/tools/obd_reader.glb Normal file

Binary file not shown.

View File

@ -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

Binary file not shown.

After

Width:  |  Height:  |  Size: 251 KiB

View File

@ -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

Binary file not shown.

After

Width:  |  Height:  |  Size: 113 KiB

View File

@ -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

BIN
assets/tools/socket_set.glb Normal file

Binary file not shown.

View File

@ -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

Binary file not shown.

After

Width:  |  Height:  |  Size: 190 KiB

View File

@ -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

Binary file not shown.

After

Width:  |  Height:  |  Size: 212 KiB

View File

@ -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

BIN
assets/tools/toolbox.glb Normal file

Binary file not shown.

View File

@ -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

Binary file not shown.

After

Width:  |  Height:  |  Size: 228 KiB

View File

@ -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

Binary file not shown.

After

Width:  |  Height:  |  Size: 85 KiB

View File

@ -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

Binary file not shown.

View File

@ -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

Binary file not shown.

After

Width:  |  Height:  |  Size: 162 KiB

View File

@ -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

Binary file not shown.

After

Width:  |  Height:  |  Size: 213 KiB

View File

@ -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

BIN
assets/tools/welder.glb Normal file

Binary file not shown.

View File

@ -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

Binary file not shown.

After

Width:  |  Height:  |  Size: 199 KiB

View File

@ -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

Binary file not shown.

After

Width:  |  Height:  |  Size: 20 KiB

View File

@ -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

View File

@ -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()

10
push18.log Normal file
View File

@ -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

View File

@ -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

169
tools/cc_to_glb.py Normal file
View File

@ -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> [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 <out>/<name>.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()

75
tools/slim_glb.py Normal file
View File

@ -0,0 +1,75 @@
"""Slim TRELLIS GLBs to prop grade, in place.
/Applications/Blender.app/Contents/MacOS/Blender -b -P tools/slim_glb.py -- <dir> [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)