diff --git a/public/spline-corridor-assets/debris_branch_a.glb b/public/spline-corridor-assets/debris_branch_a.glb new file mode 100644 index 00000000..72830798 Binary files /dev/null and b/public/spline-corridor-assets/debris_branch_a.glb differ diff --git a/public/spline-corridor-assets/debris_branch_b.glb b/public/spline-corridor-assets/debris_branch_b.glb new file mode 100644 index 00000000..becbbf2b Binary files /dev/null and b/public/spline-corridor-assets/debris_branch_b.glb differ diff --git a/public/spline-corridor-assets/debris_leaf_clump_a.glb b/public/spline-corridor-assets/debris_leaf_clump_a.glb new file mode 100644 index 00000000..4440d062 Binary files /dev/null and b/public/spline-corridor-assets/debris_leaf_clump_a.glb differ diff --git a/public/spline-corridor-assets/debris_pebbles_a.glb b/public/spline-corridor-assets/debris_pebbles_a.glb new file mode 100644 index 00000000..4227fe6e Binary files /dev/null and b/public/spline-corridor-assets/debris_pebbles_a.glb differ diff --git a/public/spline-corridor-assets/debris_stump_small.glb b/public/spline-corridor-assets/debris_stump_small.glb new file mode 100644 index 00000000..506a7e20 Binary files /dev/null and b/public/spline-corridor-assets/debris_stump_small.glb differ diff --git a/public/spline-corridor-assets/edge_curb_stone_low_2m.glb b/public/spline-corridor-assets/edge_curb_stone_low_2m.glb new file mode 100644 index 00000000..a7d27ff2 Binary files /dev/null and b/public/spline-corridor-assets/edge_curb_stone_low_2m.glb differ diff --git a/public/spline-corridor-assets/edge_curb_stone_worn_2m.glb b/public/spline-corridor-assets/edge_curb_stone_worn_2m.glb new file mode 100644 index 00000000..a0caae3b Binary files /dev/null and b/public/spline-corridor-assets/edge_curb_stone_worn_2m.glb differ diff --git a/public/spline-corridor-assets/edge_log_border_2m.glb b/public/spline-corridor-assets/edge_log_border_2m.glb new file mode 100644 index 00000000..bd993cf9 Binary files /dev/null and b/public/spline-corridor-assets/edge_log_border_2m.glb differ diff --git a/public/spline-corridor-assets/edge_mossy_bank_2m.glb b/public/spline-corridor-assets/edge_mossy_bank_2m.glb new file mode 100644 index 00000000..a5c6eb2d Binary files /dev/null and b/public/spline-corridor-assets/edge_mossy_bank_2m.glb differ diff --git a/public/spline-corridor-assets/edge_plank_border_2m.glb b/public/spline-corridor-assets/edge_plank_border_2m.glb new file mode 100644 index 00000000..73421fb1 Binary files /dev/null and b/public/spline-corridor-assets/edge_plank_border_2m.glb differ diff --git a/public/spline-corridor-assets/edge_reeds_cluster_a.glb b/public/spline-corridor-assets/edge_reeds_cluster_a.glb new file mode 100644 index 00000000..795f6afa Binary files /dev/null and b/public/spline-corridor-assets/edge_reeds_cluster_a.glb differ diff --git a/public/spline-corridor-assets/edge_reeds_cluster_b.glb b/public/spline-corridor-assets/edge_reeds_cluster_b.glb new file mode 100644 index 00000000..a935f4f5 Binary files /dev/null and b/public/spline-corridor-assets/edge_reeds_cluster_b.glb differ diff --git a/public/spline-corridor-assets/edge_river_bank_rocks_2m.glb b/public/spline-corridor-assets/edge_river_bank_rocks_2m.glb new file mode 100644 index 00000000..e5c468b1 Binary files /dev/null and b/public/spline-corridor-assets/edge_river_bank_rocks_2m.glb differ diff --git a/public/spline-corridor-assets/edge_river_bank_soft_2m.glb b/public/spline-corridor-assets/edge_river_bank_soft_2m.glb new file mode 100644 index 00000000..1dcfcdb6 Binary files /dev/null and b/public/spline-corridor-assets/edge_river_bank_soft_2m.glb differ diff --git a/public/spline-corridor-assets/edge_roots_border_2m.glb b/public/spline-corridor-assets/edge_roots_border_2m.glb new file mode 100644 index 00000000..77ba6746 Binary files /dev/null and b/public/spline-corridor-assets/edge_roots_border_2m.glb differ diff --git a/public/spline-corridor-assets/edge_small_rocks_a_2m.glb b/public/spline-corridor-assets/edge_small_rocks_a_2m.glb new file mode 100644 index 00000000..eebf83c5 Binary files /dev/null and b/public/spline-corridor-assets/edge_small_rocks_a_2m.glb differ diff --git a/public/spline-corridor-assets/edge_small_rocks_b_2m.glb b/public/spline-corridor-assets/edge_small_rocks_b_2m.glb new file mode 100644 index 00000000..3f33be83 Binary files /dev/null and b/public/spline-corridor-assets/edge_small_rocks_b_2m.glb differ diff --git a/public/spline-corridor-assets/fence_post_stone.glb b/public/spline-corridor-assets/fence_post_stone.glb new file mode 100644 index 00000000..41dfd679 Binary files /dev/null and b/public/spline-corridor-assets/fence_post_stone.glb differ diff --git a/public/spline-corridor-assets/fence_post_wood.glb b/public/spline-corridor-assets/fence_post_wood.glb new file mode 100644 index 00000000..fa7ed501 Binary files /dev/null and b/public/spline-corridor-assets/fence_post_wood.glb differ diff --git a/public/spline-corridor-assets/fence_rail_wood_2m.glb b/public/spline-corridor-assets/fence_rail_wood_2m.glb new file mode 100644 index 00000000..b1ca59dc Binary files /dev/null and b/public/spline-corridor-assets/fence_rail_wood_2m.glb differ diff --git a/public/spline-corridor-assets/fence_segment_rope_2m.glb b/public/spline-corridor-assets/fence_segment_rope_2m.glb new file mode 100644 index 00000000..b9616da7 Binary files /dev/null and b/public/spline-corridor-assets/fence_segment_rope_2m.glb differ diff --git a/public/spline-corridor-assets/fence_segment_wood_2m.glb b/public/spline-corridor-assets/fence_segment_wood_2m.glb new file mode 100644 index 00000000..9e1fbab3 Binary files /dev/null and b/public/spline-corridor-assets/fence_segment_wood_2m.glb differ diff --git a/public/spline-corridor-assets/manifest.json b/public/spline-corridor-assets/manifest.json new file mode 100644 index 00000000..4783840b --- /dev/null +++ b/public/spline-corridor-assets/manifest.json @@ -0,0 +1,731 @@ +{ + "name": "spline_corridor_assets", + "unit": "meter", + "created_with": "Blender procedural mesh export via blender-mcp", + "coordinate_convention": "Target/import axes: origin at the ground baseline, centered in width and segment length unless noted; +X is left/right width, +Y is up, +Z is forward/spline direction.", + "export_root": "/Users/giers/blender-mcp/exports/spline_corridor_assets", + "asset_count": 22, + "assets": [ + { + "filename": "edge_curb_stone_low_2m.glb", + "category": "road_curb_edge", + "intended_use": "Clean low curb strip for road and path borders.", + "dimensions_m": { + "width_x": 0.3, + "height_y": 0.187, + "length_z": 2.0 + }, + "bounds_m": { + "min": [ + -0.15, + 0.0, + -1.0 + ], + "max": [ + 0.15, + 0.187, + 1.0 + ] + }, + "origin_convention": "Target/import axes: origin at the ground baseline, centered in width and segment length unless noted; +X is left/right width, +Y is up, +Z is forward/spline direction.", + "materials": [ + "mat_stone_curb", + "mat_stone_light", + "mat_stone_dark" + ], + "vertices": 24, + "triangles": 36, + "file_size_bytes": 4540, + "notes": "2 m segment; simple readable curb with subtle stone seams." + }, + { + "filename": "edge_curb_stone_worn_2m.glb", + "category": "road_curb_edge", + "intended_use": "Worn curb strip for older roads and trampled path edges.", + "dimensions_m": { + "width_x": 0.331, + "height_y": 0.186, + "length_z": 2.0 + }, + "bounds_m": { + "min": [ + -0.156, + 0.0, + -1.0 + ], + "max": [ + 0.175, + 0.186, + 1.0 + ] + }, + "origin_convention": "Target/import axes: origin at the ground baseline, centered in width and segment length unless noted; +X is left/right width, +Y is up, +Z is forward/spline direction.", + "materials": [ + "mat_stone_curb", + "mat_stone_light", + "mat_stone_dark" + ], + "vertices": 140, + "triangles": 236, + "file_size_bytes": 14764, + "notes": "2 m segmented stones with chipped silhouettes and darker cracks." + }, + { + "filename": "edge_log_border_2m.glb", + "category": "road_curb_edge", + "intended_use": "Natural log border for roads, trails, and camps.", + "dimensions_m": { + "width_x": 0.295, + "height_y": 0.229, + "length_z": 2.0 + }, + "bounds_m": { + "min": [ + -0.115, + 0.002, + -1.0 + ], + "max": [ + 0.18, + 0.231, + 1.0 + ] + }, + "origin_convention": "Target/import axes: origin at the ground baseline, centered in width and segment length unless noted; +X is left/right width, +Y is up, +Z is forward/spline direction.", + "materials": [ + "mat_wood_bark", + "mat_wood_cut", + "mat_wood_dark", + "mat_moss_dark" + ], + "vertices": 69, + "triangles": 113, + "file_size_bytes": 8600, + "notes": "2 m log, low-poly round profile, cut ends, small moss patch." + }, + { + "filename": "edge_plank_border_2m.glb", + "category": "road_curb_edge", + "intended_use": "Rough plank border for rustic trail and garden edges.", + "dimensions_m": { + "width_x": 0.24, + "height_y": 0.131, + "length_z": 2.0 + }, + "bounds_m": { + "min": [ + -0.12, + 0.0, + -1.0 + ], + "max": [ + 0.12, + 0.131, + 1.0 + ] + }, + "origin_convention": "Target/import axes: origin at the ground baseline, centered in width and segment length unless noted; +X is left/right width, +Y is up, +Z is forward/spline direction.", + "materials": [ + "mat_wood_bark", + "mat_wood_cut", + "mat_wood_dark" + ], + "vertices": 48, + "triangles": 72, + "file_size_bytes": 6480, + "notes": "2 m plank with dark seams and simple wood-grain strips." + }, + { + "filename": "edge_small_rocks_a_2m.glb", + "category": "trail_forest_edge", + "intended_use": "Loose small rock border for trail edges.", + "dimensions_m": { + "width_x": 0.389, + "height_y": 0.118, + "length_z": 2.067 + }, + "bounds_m": { + "min": [ + -0.236, + 0.0, + -1.031 + ], + "max": [ + 0.153, + 0.118, + 1.036 + ] + }, + "origin_convention": "Target/import axes: origin at the ground baseline, centered in width and segment length unless noted; +X is left/right width, +Y is up, +Z is forward/spline direction.", + "materials": [ + "mat_stone_curb", + "mat_stone_dark", + "mat_stone_warm" + ], + "vertices": 318, + "triangles": 576, + "file_size_bytes": 31560, + "notes": "2 m scatter strip with low profile pebble clusters." + }, + { + "filename": "edge_small_rocks_b_2m.glb", + "category": "trail_forest_edge", + "intended_use": "Alternate loose rock border for trail repetition variation.", + "dimensions_m": { + "width_x": 0.527, + "height_y": 0.153, + "length_z": 2.107 + }, + "bounds_m": { + "min": [ + -0.305, + 0.0, + -1.052 + ], + "max": [ + 0.222, + 0.153, + 1.055 + ] + }, + "origin_convention": "Target/import axes: origin at the ground baseline, centered in width and segment length unless noted; +X is left/right width, +Y is up, +Z is forward/spline direction.", + "materials": [ + "mat_stone_warm", + "mat_stone_curb", + "mat_stone_light", + "mat_stone_dark", + "mat_moss_dark" + ], + "vertices": 241, + "triangles": 425, + "file_size_bytes": 25668, + "notes": "2 m wider scatter strip with warmer stones and a moss patch." + }, + { + "filename": "edge_roots_border_2m.glb", + "category": "trail_forest_edge", + "intended_use": "Exposed root border for forest paths.", + "dimensions_m": { + "width_x": 0.474, + "height_y": 0.103, + "length_z": 2.012 + }, + "bounds_m": { + "min": [ + -0.241, + -0.009, + -1.004 + ], + "max": [ + 0.233, + 0.094, + 1.008 + ] + }, + "origin_convention": "Target/import axes: origin at the ground baseline, centered in width and segment length unless noted; +X is left/right width, +Y is up, +Z is forward/spline direction.", + "materials": [ + "mat_root_dark", + "mat_wood_cut", + "mat_moss" + ], + "vertices": 127, + "triangles": 199, + "file_size_bytes": 11344, + "notes": "2 m tangled roots with branch roots and small moss patches." + }, + { + "filename": "edge_mossy_bank_2m.glb", + "category": "trail_forest_edge", + "intended_use": "Soft mossy raised bank for trail and forest path edges.", + "dimensions_m": { + "width_x": 0.66, + "height_y": 0.22, + "length_z": 2.0 + }, + "bounds_m": { + "min": [ + -0.34, + 0.0, + -1.0 + ], + "max": [ + 0.32, + 0.22, + 1.0 + ] + }, + "origin_convention": "Target/import axes: origin at the ground baseline, centered in width and segment length unless noted; +X is left/right width, +Y is up, +Z is forward/spline direction.", + "materials": [ + "mat_soil", + "mat_moss", + "mat_moss_dark", + "mat_stone_warm" + ], + "vertices": 87, + "triangles": 138, + "file_size_bytes": 10192, + "notes": "2 m sloped bank with moss top, soil side, small embedded rocks." + }, + { + "filename": "edge_river_bank_soft_2m.glb", + "category": "river_ditch_bank", + "intended_use": "Soft river or ditch bank edge.", + "dimensions_m": { + "width_x": 0.76, + "height_y": 0.24, + "length_z": 2.0 + }, + "bounds_m": { + "min": [ + -0.42, + 0.0, + -1.0 + ], + "max": [ + 0.34, + 0.24, + 1.0 + ] + }, + "origin_convention": "Target/import axes: origin at the ground baseline, centered in width and segment length unless noted; +X is left/right width, +Y is up, +Z is forward/spline direction.", + "materials": [ + "mat_wet_soil", + "mat_sandy_bank", + "mat_moss_dark" + ], + "vertices": 37, + "triangles": 39, + "file_size_bytes": 4508, + "notes": "2 m sloped sandy/wet bank with a darker waterline side." + }, + { + "filename": "edge_river_bank_rocks_2m.glb", + "category": "river_ditch_bank", + "intended_use": "Rocky river or ditch bank edge.", + "dimensions_m": { + "width_x": 0.78, + "height_y": 0.2, + "length_z": 2.0 + }, + "bounds_m": { + "min": [ + -0.44, + 0.0, + -1.0 + ], + "max": [ + 0.34, + 0.2, + 1.0 + ] + }, + "origin_convention": "Target/import axes: origin at the ground baseline, centered in width and segment length unless noted; +X is left/right width, +Y is up, +Z is forward/spline direction.", + "materials": [ + "mat_soil", + "mat_wet_soil", + "mat_stone_dark", + "mat_stone_curb", + "mat_stone_warm", + "mat_moss" + ], + "vertices": 238, + "triangles": 418, + "file_size_bytes": 26000, + "notes": "2 m sloped muddy bank with embedded stones." + }, + { + "filename": "edge_reeds_cluster_a.glb", + "category": "river_ditch_bank", + "intended_use": "Small reed cluster for river banks and ditches.", + "dimensions_m": { + "width_x": 0.46, + "height_y": 0.943, + "length_z": 0.621 + }, + "bounds_m": { + "min": [ + -0.226, + -0.001, + -0.301 + ], + "max": [ + 0.234, + 0.943, + 0.32 + ] + }, + "origin_convention": "Target/import axes: origin at the ground baseline, centered in width and segment length unless noted; +X is left/right width, +Y is up, +Z is forward/spline direction.", + "materials": [ + "mat_reed_tan", + "mat_reed_green", + "mat_moss_dark" + ], + "vertices": 302, + "triangles": 282, + "file_size_bytes": 16516, + "notes": "Compact cluster; origin at ground center for scatter placement." + }, + { + "filename": "edge_reeds_cluster_b.glb", + "category": "river_ditch_bank", + "intended_use": "Taller reed cluster variation for river banks and ditches.", + "dimensions_m": { + "width_x": 0.635, + "height_y": 1.215, + "length_z": 0.505 + }, + "bounds_m": { + "min": [ + -0.333, + -0.001, + -0.239 + ], + "max": [ + 0.302, + 1.214, + 0.265 + ] + }, + "origin_convention": "Target/import axes: origin at the ground baseline, centered in width and segment length unless noted; +X is left/right width, +Y is up, +Z is forward/spline direction.", + "materials": [ + "mat_reed_tan", + "mat_reed_green", + "mat_moss_dark" + ], + "vertices": 446, + "triangles": 420, + "file_size_bytes": 23692, + "notes": "Wider and taller compact cluster for scatter variation." + }, + { + "filename": "fence_post_wood.glb", + "category": "fence_repeater", + "intended_use": "Standalone rustic wooden fence post.", + "dimensions_m": { + "width_x": 0.18, + "height_y": 1.16, + "length_z": 0.15 + }, + "bounds_m": { + "min": [ + -0.09, + 0.0, + -0.075 + ], + "max": [ + 0.09, + 1.16, + 0.075 + ] + }, + "origin_convention": "Target/import axes: origin at the ground baseline, centered in width and segment length unless noted; +X is left/right width, +Y is up, +Z is forward/spline direction.", + "materials": [ + "mat_wood_bark", + "mat_wood_cut", + "mat_wood_dark" + ], + "vertices": 44, + "triangles": 72, + "file_size_bytes": 6220, + "notes": "Post origin is bottom center at ground; rail notches align with segment rails." + }, + { + "filename": "fence_rail_wood_2m.glb", + "category": "fence_repeater", + "intended_use": "Standalone 2 m rustic rail for fence repeaters.", + "dimensions_m": { + "width_x": 0.158, + "height_y": 0.107, + "length_z": 2.0 + }, + "bounds_m": { + "min": [ + -0.055, + 0.666, + -1.0 + ], + "max": [ + 0.103, + 0.774, + 1.0 + ] + }, + "origin_convention": "Target/import axes: origin at the ground baseline, centered in width and segment length unless noted; +X is left/right width, +Y is up, +Z is forward/spline direction.", + "materials": [ + "mat_wood_bark", + "mat_wood_cut", + "mat_wood_dark" + ], + "vertices": 28, + "triangles": 48, + "file_size_bytes": 4720, + "notes": "Rail geometry sits at intended fence height while origin remains on the ground baseline." + }, + { + "filename": "fence_segment_wood_2m.glb", + "category": "fence_repeater", + "intended_use": "Complete 2 m wooden fence segment.", + "dimensions_m": { + "width_x": 0.14, + "height_y": 1.13, + "length_z": 2.04 + }, + "bounds_m": { + "min": [ + -0.07, + 0.0, + -1.02 + ], + "max": [ + 0.07, + 1.13, + 1.02 + ] + }, + "origin_convention": "Target/import axes: origin at the ground baseline, centered in width and segment length unless noted; +X is left/right width, +Y is up, +Z is forward/spline direction.", + "materials": [ + "mat_wood_bark", + "mat_wood_cut" + ], + "vertices": 88, + "triangles": 152, + "file_size_bytes": 8884, + "notes": "Two posts and two rails aligned along +Z spline direction." + }, + { + "filename": "fence_segment_rope_2m.glb", + "category": "fence_repeater", + "intended_use": "Complete 2 m rope fence segment.", + "dimensions_m": { + "width_x": 0.136, + "height_y": 1.03, + "length_z": 2.036 + }, + "bounds_m": { + "min": [ + -0.068, + 0.0, + -1.018 + ], + "max": [ + 0.068, + 1.03, + 1.018 + ] + }, + "origin_convention": "Target/import axes: origin at the ground baseline, centered in width and segment length unless noted; +X is left/right width, +Y is up, +Z is forward/spline direction.", + "materials": [ + "mat_wood_bark", + "mat_wood_cut", + "mat_rope" + ], + "vertices": 168, + "triangles": 288, + "file_size_bytes": 15904, + "notes": "Two wooden posts with sagging rope rails along +Z." + }, + { + "filename": "fence_post_stone.glb", + "category": "fence_repeater", + "intended_use": "Standalone stacked stone fence post.", + "dimensions_m": { + "width_x": 0.258, + "height_y": 0.72, + "length_z": 0.261 + }, + "bounds_m": { + "min": [ + -0.133, + 0.0, + -0.133 + ], + "max": [ + 0.124, + 0.72, + 0.129 + ] + }, + "origin_convention": "Target/import axes: origin at the ground baseline, centered in width and segment length unless noted; +X is left/right width, +Y is up, +Z is forward/spline direction.", + "materials": [ + "mat_stone_dark", + "mat_stone_curb", + "mat_stone_warm", + "mat_stone_light" + ], + "vertices": 90, + "triangles": 164, + "file_size_bytes": 11280, + "notes": "Short irregular stone pillar, useful as post or marker." + }, + { + "filename": "debris_branch_a.glb", + "category": "debris_scatter", + "intended_use": "Small fallen branch scatter asset.", + "dimensions_m": { + "width_x": 0.438, + "height_y": 0.073, + "length_z": 0.846 + }, + "bounds_m": { + "min": [ + -0.23, + 0.001, + -0.423 + ], + "max": [ + 0.208, + 0.074, + 0.423 + ] + }, + "origin_convention": "Target/import axes: origin at the ground baseline, centered in width and segment length unless noted; +X is left/right width, +Y is up, +Z is forward/spline direction.", + "materials": [ + "mat_wood_bark", + "mat_wood_cut", + "mat_wood_dark" + ], + "vertices": 40, + "triangles": 68, + "file_size_bytes": 5676, + "notes": "Directional branch roughly aligned to +Z for optional spline-aware placement." + }, + { + "filename": "debris_branch_b.glb", + "category": "debris_scatter", + "intended_use": "Curved fallen branch scatter variation.", + "dimensions_m": { + "width_x": 0.458, + "height_y": 0.065, + "length_z": 0.682 + }, + "bounds_m": { + "min": [ + -0.203, + 0.003, + -0.312 + ], + "max": [ + 0.255, + 0.067, + 0.371 + ] + }, + "origin_convention": "Target/import axes: origin at the ground baseline, centered in width and segment length unless noted; +X is left/right width, +Y is up, +Z is forward/spline direction.", + "materials": [ + "mat_wood_dark", + "mat_wood_cut", + "mat_wood_bark" + ], + "vertices": 54, + "triangles": 92, + "file_size_bytes": 6744, + "notes": "Shorter curved branch with side twig." + }, + { + "filename": "debris_pebbles_a.glb", + "category": "debris_scatter", + "intended_use": "Small pebble cluster for scatter placement.", + "dimensions_m": { + "width_x": 0.495, + "height_y": 0.053, + "length_z": 0.351 + }, + "bounds_m": { + "min": [ + -0.253, + 0.0, + -0.196 + ], + "max": [ + 0.242, + 0.053, + 0.156 + ] + }, + "origin_convention": "Target/import axes: origin at the ground baseline, centered in width and segment length unless noted; +X is left/right width, +Y is up, +Z is forward/spline direction.", + "materials": [ + "mat_stone_dark", + "mat_stone_curb", + "mat_stone_warm", + "mat_stone_light" + ], + "vertices": 321, + "triangles": 578, + "file_size_bytes": 32584, + "notes": "Compact low-profile pebble clump." + }, + { + "filename": "debris_leaf_clump_a.glb", + "category": "debris_scatter", + "intended_use": "Leaf litter clump for forest trail scatter.", + "dimensions_m": { + "width_x": 0.578, + "height_y": 0.021, + "length_z": 0.49 + }, + "bounds_m": { + "min": [ + -0.276, + 0.008, + -0.245 + ], + "max": [ + 0.302, + 0.029, + 0.245 + ] + }, + "origin_convention": "Target/import axes: origin at the ground baseline, centered in width and segment length unless noted; +X is left/right width, +Y is up, +Z is forward/spline direction.", + "materials": [ + "mat_leaf_brown", + "mat_leaf_ochre", + "mat_leaf_dark", + "mat_wood_dark", + "mat_wood_cut" + ], + "vertices": 84, + "triangles": 56, + "file_size_bytes": 6704, + "notes": "Layered low-poly leaf cards plus a small twig; procedural colors only." + }, + { + "filename": "debris_stump_small.glb", + "category": "debris_scatter", + "intended_use": "Small stump scatter asset.", + "dimensions_m": { + "width_x": 0.473, + "height_y": 0.329, + "length_z": 0.436 + }, + "bounds_m": { + "min": [ + -0.193, + -0.006, + -0.232 + ], + "max": [ + 0.281, + 0.323, + 0.204 + ] + }, + "origin_convention": "Target/import axes: origin at the ground baseline, centered in width and segment length unless noted; +X is left/right width, +Y is up, +Z is forward/spline direction.", + "materials": [ + "mat_wood_bark", + "mat_wood_cut", + "mat_wood_dark", + "mat_root_dark", + "mat_moss" + ], + "vertices": 78, + "triangles": 120, + "file_size_bytes": 9420, + "notes": "Low stump with exposed roots and moss accent." + } + ], + "limitations": [ + "Materials are simple procedural Blender materials with no external texture dependencies.", + "Meshes are lightweight starter assets intended for medium-distance readability, not close-up hero props.", + "The standalone rail uses the ground baseline origin for alignment with fence posts, although the rail mesh itself is elevated." + ] +}