D2 (t_33250710): Editor-Bibliothek 83 Objekte + 27 Absperrungs-Thumbs + Renderprobe

- library/objects.json: Editor-Kopie (note behalten), 83 Objekte.
- library/thumbs: 27 neue Thumbs (echte GLB-Meshes), Alt-Thumbs unveraendert.
- tests/probe_d2_barriers_render.gd: Map-Builder-Beweis — 3 Objekte ueber
  map_view_builder platziert, PNG gerendert, Fußpunkt/Groesse gemessen.
This commit is contained in:
Hermes (scopedvr-dev) 2026-10-19 18:06:48 +00:00
parent ebe3dd276b
commit c0d426152e
57 changed files with 1632 additions and 0 deletions

View file

@ -2,6 +2,244 @@
"library_version": 1,
"note": "Editor-Kopie der offiziellen Bibliotheks-Registry (geschlossener Baukasten, PLAN Entscheidung 20). Quelle: scopedvr-match-server library/objects.json — beim Registrieren neuer Objekte DORT zuerst eintragen und hier synchron ziehen. 'poly' = Referenz-Dreieckszahl (Budget-Rechnung, map_format.md §4 V8); 'collision' = Approximation für Platzhalter-Darstellung im Viewport.",
"objects": {
"barrier_001": {
"poly": 72,
"collision": {
"shape": "box",
"size": [
2.325,
0.772,
0.936
]
},
"glb": "res://assets/objekte/military_desert/barriers/barrier_001.glb",
"kategorie": "barriers",
"name_de": "Absperrung 001 (Betonblock)"
},
"barrier_002": {
"poly": 48,
"collision": {
"shape": "box",
"size": [
5.026,
0.241,
0.935
]
},
"glb": "res://assets/objekte/military_desert/barriers/barrier_002.glb",
"kategorie": "barriers",
"name_de": "Absperrung 002 (Sperrbalken)"
},
"barrier_003": {
"poly": 80,
"collision": {
"shape": "box",
"size": [
4.37,
0.966,
0.422
]
},
"glb": "res://assets/objekte/military_desert/barriers/barrier_003.glb",
"kategorie": "barriers",
"name_de": "Absperrung 003 (Drahtsperre)"
},
"barrier_004": {
"poly": 119,
"collision": {
"shape": "box",
"size": [
1.291,
1.319,
1.291
]
},
"glb": "res://assets/objekte/military_desert/barriers/barrier_004.glb",
"kategorie": "barriers",
"name_de": "Absperrung 004 (Betonpoller)"
},
"barrier_005": {
"poly": 119,
"collision": {
"shape": "box",
"size": [
1.291,
1.319,
1.291
]
},
"glb": "res://assets/objekte/military_desert/barriers/barrier_005.glb",
"kategorie": "barriers",
"name_de": "Absperrung 005 (Betonpoller)"
},
"barrier_006": {
"poly": 1560,
"collision": {
"shape": "box",
"size": [
4.953,
1.105,
2.194
]
},
"glb": "res://assets/objekte/military_desert/barriers/barrier_006.glb",
"kategorie": "barriers",
"name_de": "Absperrung 006 (breite Sperre)"
},
"barrier_007": {
"poly": 1320,
"collision": {
"shape": "box",
"size": [
5.863,
1.07,
0.485
]
},
"glb": "res://assets/objekte/military_desert/barriers/barrier_007.glb",
"kategorie": "barriers",
"name_de": "Absperrung 007 (Drahtsperre lang)"
},
"barrier_008": {
"poly": 60,
"collision": {
"shape": "box",
"size": [
0.909,
0.287,
0.445
]
},
"glb": "res://assets/objekte/military_desert/barriers/barrier_008.glb",
"kategorie": "barriers",
"name_de": "Absperrung 008 (Bodensperre)"
},
"barrier_009": {
"poly": 60,
"collision": {
"shape": "box",
"size": [
0.875,
0.283,
0.447
]
},
"glb": "res://assets/objekte/military_desert/barriers/barrier_009.glb",
"kategorie": "barriers",
"name_de": "Absperrung 009 (Bodensperre)"
},
"barrier_010": {
"poly": 1560,
"collision": {
"shape": "box",
"size": [
4.953,
1.105,
2.194
]
},
"glb": "res://assets/objekte/military_desert/barriers/barrier_010.glb",
"kategorie": "barriers",
"name_de": "Absperrung 010 (breite Sperre)"
},
"barrier_011": {
"poly": 60,
"collision": {
"shape": "box",
"size": [
0.909,
0.287,
0.445
]
},
"glb": "res://assets/objekte/military_desert/barriers/barrier_011.glb",
"kategorie": "barriers",
"name_de": "Absperrung 011 (Bodensperre)"
},
"barrier_012": {
"poly": 60,
"collision": {
"shape": "box",
"size": [
0.875,
0.283,
0.447
]
},
"glb": "res://assets/objekte/military_desert/barriers/barrier_012.glb",
"kategorie": "barriers",
"name_de": "Absperrung 012 (Bodensperre)"
},
"barrier_013": {
"poly": 1320,
"collision": {
"shape": "box",
"size": [
5.863,
1.07,
0.485
]
},
"glb": "res://assets/objekte/military_desert/barriers/barrier_013.glb",
"kategorie": "barriers",
"name_de": "Absperrung 013 (Drahtsperre lang)"
},
"barrier_014": {
"poly": 123,
"collision": {
"shape": "box",
"size": [
1.291,
1.284,
1.291
]
},
"glb": "res://assets/objekte/military_desert/barriers/barrier_014.glb",
"kategorie": "barriers",
"name_de": "Absperrung 014 (Betonpoller)"
},
"barrier_015": {
"poly": 123,
"collision": {
"shape": "box",
"size": [
1.291,
1.284,
1.291
]
},
"glb": "res://assets/objekte/military_desert/barriers/barrier_015.glb",
"kategorie": "barriers",
"name_de": "Absperrung 015 (Betonpoller)"
},
"barrier_016": {
"poly": 145,
"collision": {
"shape": "box",
"size": [
1.429,
1.326,
1.433
]
},
"glb": "res://assets/objekte/military_desert/barriers/barrier_016.glb",
"kategorie": "barriers",
"name_de": "Absperrung 016 (Betonblock)"
},
"barrier_017": {
"poly": 145,
"collision": {
"shape": "box",
"size": [
1.429,
1.326,
1.433
]
},
"glb": "res://assets/objekte/military_desert/barriers/barrier_017.glb",
"kategorie": "barriers",
"name_de": "Absperrung 017 (Betonblock)"
},
"barrier_sandbag": {
"poly": 36,
"collision": {
@ -1256,6 +1494,146 @@
]
}
},
"obstacle_001": {
"poly": 276,
"collision": {
"shape": "box",
"size": [
12.936,
0.998,
2.176
]
},
"glb": "res://assets/objekte/military_desert/barriers/obstacle_001.glb",
"kategorie": "barriers",
"name_de": "Hindernis 001 (Hindernisbahn flach)"
},
"obstacle_002": {
"poly": 312,
"collision": {
"shape": "box",
"size": [
12.936,
1.93,
2.176
]
},
"glb": "res://assets/objekte/military_desert/barriers/obstacle_002.glb",
"kategorie": "barriers",
"name_de": "Hindernis 002 (Hindernisbahn mittel)"
},
"obstacle_003": {
"poly": 348,
"collision": {
"shape": "box",
"size": [
12.936,
2.86,
2.176
]
},
"glb": "res://assets/objekte/military_desert/barriers/obstacle_003.glb",
"kategorie": "barriers",
"name_de": "Hindernis 003 (Hindernisbahn hoch)"
},
"obstacle_004": {
"poly": 1032,
"collision": {
"shape": "box",
"size": [
3.87,
1.188,
10.499
]
},
"glb": "res://assets/objekte/military_desert/barriers/obstacle_004.glb",
"kategorie": "barriers",
"name_de": "Hindernis 004 (Drahtzaun)"
},
"obstacle_005": {
"poly": 92,
"collision": {
"shape": "box",
"size": [
1.846,
2.577,
3.105
]
},
"glb": "res://assets/objekte/military_desert/barriers/obstacle_005.glb",
"kategorie": "barriers",
"name_de": "Hindernis 005 (Klettergeruest mit Leiter)"
},
"obstacle_006": {
"poly": 114,
"collision": {
"shape": "box",
"size": [
3.625,
2.887,
4.856
]
},
"glb": "res://assets/objekte/military_desert/barriers/obstacle_006.glb",
"kategorie": "barriers",
"name_de": "Hindernis 006 (Hinderniswand)"
},
"obstacle_007": {
"poly": 240,
"collision": {
"shape": "box",
"size": [
2.214,
2.433,
7.42
]
},
"glb": "res://assets/objekte/military_desert/barriers/obstacle_007.glb",
"kategorie": "barriers",
"name_de": "Hindernis 007 (Balancierbalken mit Leiter)"
},
"obstacle_008": {
"poly": 50,
"collision": {
"shape": "box",
"size": [
3.135,
1.838,
0.303
]
},
"glb": "res://assets/objekte/military_desert/barriers/obstacle_008.glb",
"kategorie": "barriers",
"name_de": "Hindernis 008 (Wand mit Durchschlupf)"
},
"obstacle_009": {
"poly": 48,
"collision": {
"shape": "box",
"size": [
1.458,
1.185,
0.619
]
},
"glb": "res://assets/objekte/military_desert/barriers/obstacle_009.glb",
"kategorie": "barriers",
"name_de": "Hindernis 009 (Hindernistafel)"
},
"obstacle_010": {
"poly": 48,
"collision": {
"shape": "box",
"size": [
1.458,
1.203,
0.619
]
},
"glb": "res://assets/objekte/military_desert/barriers/obstacle_010.glb",
"kategorie": "barriers",
"name_de": "Hindernis 010 (Hindernistafel)"
},
"pflanze_farn": {
"poly": 288,
"collision": {

Binary file not shown.

After

Width:  |  Height:  |  Size: 668 B

View file

@ -0,0 +1,40 @@
[remap]
importer="texture"
type="CompressedTexture2D"
uid="uid://b4bow25wrxsuv"
path="res://.godot/imported/barrier_001.png-f4f9b068e708eb35cf4f0689fd3c6f74.ctex"
metadata={
"vram_texture": false
}
[deps]
source_file="res://library/thumbs/barrier_001.png"
dest_files=["res://.godot/imported/barrier_001.png-f4f9b068e708eb35cf4f0689fd3c6f74.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=false
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: 599 B

View file

@ -0,0 +1,40 @@
[remap]
importer="texture"
type="CompressedTexture2D"
uid="uid://do8u4gsq2vcio"
path="res://.godot/imported/barrier_002.png-226efbbe1880285f86c95e9a1be7518e.ctex"
metadata={
"vram_texture": false
}
[deps]
source_file="res://library/thumbs/barrier_002.png"
dest_files=["res://.godot/imported/barrier_002.png-226efbbe1880285f86c95e9a1be7518e.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=false
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: 571 B

View file

@ -0,0 +1,40 @@
[remap]
importer="texture"
type="CompressedTexture2D"
uid="uid://bdedbakl7ykr8"
path="res://.godot/imported/barrier_003.png-22cd5cdb2ab7396c5afef5360b5067dd.ctex"
metadata={
"vram_texture": false
}
[deps]
source_file="res://library/thumbs/barrier_003.png"
dest_files=["res://.godot/imported/barrier_003.png-22cd5cdb2ab7396c5afef5360b5067dd.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=false
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: 636 B

View file

@ -0,0 +1,40 @@
[remap]
importer="texture"
type="CompressedTexture2D"
uid="uid://iiial467da1e"
path="res://.godot/imported/barrier_004.png-980b996df5a61642aa5a8982d9429ff5.ctex"
metadata={
"vram_texture": false
}
[deps]
source_file="res://library/thumbs/barrier_004.png"
dest_files=["res://.godot/imported/barrier_004.png-980b996df5a61642aa5a8982d9429ff5.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=false
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: 636 B

View file

@ -0,0 +1,40 @@
[remap]
importer="texture"
type="CompressedTexture2D"
uid="uid://b320temoxgo3i"
path="res://.godot/imported/barrier_005.png-9239fc40b7d66072393ec05a176a0899.ctex"
metadata={
"vram_texture": false
}
[deps]
source_file="res://library/thumbs/barrier_005.png"
dest_files=["res://.godot/imported/barrier_005.png-9239fc40b7d66072393ec05a176a0899.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=false
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: 917 B

View file

@ -0,0 +1,40 @@
[remap]
importer="texture"
type="CompressedTexture2D"
uid="uid://bniuittd4da0d"
path="res://.godot/imported/barrier_006.png-a42842c6692537da809bd937c042edfc.ctex"
metadata={
"vram_texture": false
}
[deps]
source_file="res://library/thumbs/barrier_006.png"
dest_files=["res://.godot/imported/barrier_006.png-a42842c6692537da809bd937c042edfc.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=false
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: 1,014 B

View file

@ -0,0 +1,40 @@
[remap]
importer="texture"
type="CompressedTexture2D"
uid="uid://cn3nki1327488"
path="res://.godot/imported/barrier_007.png-18ef1a4c7bc9c8b4fdc1b04d8b91dad1.ctex"
metadata={
"vram_texture": false
}
[deps]
source_file="res://library/thumbs/barrier_007.png"
dest_files=["res://.godot/imported/barrier_007.png-18ef1a4c7bc9c8b4fdc1b04d8b91dad1.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=false
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: 674 B

View file

@ -0,0 +1,40 @@
[remap]
importer="texture"
type="CompressedTexture2D"
uid="uid://des3sd6jq7fjj"
path="res://.godot/imported/barrier_008.png-f615e24e39cbfa5c4030021171d3bcc5.ctex"
metadata={
"vram_texture": false
}
[deps]
source_file="res://library/thumbs/barrier_008.png"
dest_files=["res://.godot/imported/barrier_008.png-f615e24e39cbfa5c4030021171d3bcc5.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=false
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: 730 B

View file

@ -0,0 +1,40 @@
[remap]
importer="texture"
type="CompressedTexture2D"
uid="uid://cgnnvsx4lse64"
path="res://.godot/imported/barrier_009.png-f723a86b81fe9b5d3d1a1ae7a8338df0.ctex"
metadata={
"vram_texture": false
}
[deps]
source_file="res://library/thumbs/barrier_009.png"
dest_files=["res://.godot/imported/barrier_009.png-f723a86b81fe9b5d3d1a1ae7a8338df0.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=false
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: 917 B

View file

@ -0,0 +1,40 @@
[remap]
importer="texture"
type="CompressedTexture2D"
uid="uid://dqp4lh18nyw6g"
path="res://.godot/imported/barrier_010.png-eb2f5f66658412f8d13ad87794ce497c.ctex"
metadata={
"vram_texture": false
}
[deps]
source_file="res://library/thumbs/barrier_010.png"
dest_files=["res://.godot/imported/barrier_010.png-eb2f5f66658412f8d13ad87794ce497c.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=false
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: 674 B

View file

@ -0,0 +1,40 @@
[remap]
importer="texture"
type="CompressedTexture2D"
uid="uid://b0h7q3b4br4tp"
path="res://.godot/imported/barrier_011.png-6f858b9fbbf01e80766f67abd167b690.ctex"
metadata={
"vram_texture": false
}
[deps]
source_file="res://library/thumbs/barrier_011.png"
dest_files=["res://.godot/imported/barrier_011.png-6f858b9fbbf01e80766f67abd167b690.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=false
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: 730 B

View file

@ -0,0 +1,40 @@
[remap]
importer="texture"
type="CompressedTexture2D"
uid="uid://bwtpj0orksf5c"
path="res://.godot/imported/barrier_012.png-977a45ba313cbc8a3475c3b4dd181d97.ctex"
metadata={
"vram_texture": false
}
[deps]
source_file="res://library/thumbs/barrier_012.png"
dest_files=["res://.godot/imported/barrier_012.png-977a45ba313cbc8a3475c3b4dd181d97.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=false
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: 1,014 B

View file

@ -0,0 +1,40 @@
[remap]
importer="texture"
type="CompressedTexture2D"
uid="uid://ce01ak4bydyrk"
path="res://.godot/imported/barrier_013.png-873e6d19995610db66444c98f588223d.ctex"
metadata={
"vram_texture": false
}
[deps]
source_file="res://library/thumbs/barrier_013.png"
dest_files=["res://.godot/imported/barrier_013.png-873e6d19995610db66444c98f588223d.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=false
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: 639 B

View file

@ -0,0 +1,40 @@
[remap]
importer="texture"
type="CompressedTexture2D"
uid="uid://dnw5vmx1alode"
path="res://.godot/imported/barrier_014.png-e442cc785a151929218fc114716542eb.ctex"
metadata={
"vram_texture": false
}
[deps]
source_file="res://library/thumbs/barrier_014.png"
dest_files=["res://.godot/imported/barrier_014.png-e442cc785a151929218fc114716542eb.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=false
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: 639 B

View file

@ -0,0 +1,40 @@
[remap]
importer="texture"
type="CompressedTexture2D"
uid="uid://b4i20qo7fts4j"
path="res://.godot/imported/barrier_015.png-86f147870fb8e12c093ac67292be870c.ctex"
metadata={
"vram_texture": false
}
[deps]
source_file="res://library/thumbs/barrier_015.png"
dest_files=["res://.godot/imported/barrier_015.png-86f147870fb8e12c093ac67292be870c.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=false
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: 803 B

View file

@ -0,0 +1,40 @@
[remap]
importer="texture"
type="CompressedTexture2D"
uid="uid://vxhhg57x3glt"
path="res://.godot/imported/barrier_016.png-3038acd7ed4790ba4581f5f0397bc15d.ctex"
metadata={
"vram_texture": false
}
[deps]
source_file="res://library/thumbs/barrier_016.png"
dest_files=["res://.godot/imported/barrier_016.png-3038acd7ed4790ba4581f5f0397bc15d.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=false
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: 803 B

View file

@ -0,0 +1,40 @@
[remap]
importer="texture"
type="CompressedTexture2D"
uid="uid://cuybgegcb1m21"
path="res://.godot/imported/barrier_017.png-5da73739577e9b74184fd835032bda12.ctex"
metadata={
"vram_texture": false
}
[deps]
source_file="res://library/thumbs/barrier_017.png"
dest_files=["res://.godot/imported/barrier_017.png-5da73739577e9b74184fd835032bda12.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=false
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: 641 B

View file

@ -0,0 +1,40 @@
[remap]
importer="texture"
type="CompressedTexture2D"
uid="uid://cf5fev7c8out3"
path="res://.godot/imported/obstacle_001.png-3021b85a3bac580a2b2e3766a57a66c3.ctex"
metadata={
"vram_texture": false
}
[deps]
source_file="res://library/thumbs/obstacle_001.png"
dest_files=["res://.godot/imported/obstacle_001.png-3021b85a3bac580a2b2e3766a57a66c3.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=false
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: 650 B

View file

@ -0,0 +1,40 @@
[remap]
importer="texture"
type="CompressedTexture2D"
uid="uid://b2dkeowwt4uvr"
path="res://.godot/imported/obstacle_002.png-c4ad31398e160b997446f9f780c6954f.ctex"
metadata={
"vram_texture": false
}
[deps]
source_file="res://library/thumbs/obstacle_002.png"
dest_files=["res://.godot/imported/obstacle_002.png-c4ad31398e160b997446f9f780c6954f.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=false
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: 686 B

View file

@ -0,0 +1,40 @@
[remap]
importer="texture"
type="CompressedTexture2D"
uid="uid://bhhd8qcy2y4l5"
path="res://.godot/imported/obstacle_003.png-dc0c167f635d3846efbce47f1a4d7293.ctex"
metadata={
"vram_texture": false
}
[deps]
source_file="res://library/thumbs/obstacle_003.png"
dest_files=["res://.godot/imported/obstacle_003.png-dc0c167f635d3846efbce47f1a4d7293.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=false
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: 958 B

View file

@ -0,0 +1,40 @@
[remap]
importer="texture"
type="CompressedTexture2D"
uid="uid://d2gvj4dpl7kp4"
path="res://.godot/imported/obstacle_004.png-2d3f262f72281c2fee4b42b5c89c798a.ctex"
metadata={
"vram_texture": false
}
[deps]
source_file="res://library/thumbs/obstacle_004.png"
dest_files=["res://.godot/imported/obstacle_004.png-2d3f262f72281c2fee4b42b5c89c798a.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=false
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: 857 B

View file

@ -0,0 +1,40 @@
[remap]
importer="texture"
type="CompressedTexture2D"
uid="uid://nn2if4w573uc"
path="res://.godot/imported/obstacle_005.png-26c09b94401d6835c5cb54ae56b3777a.ctex"
metadata={
"vram_texture": false
}
[deps]
source_file="res://library/thumbs/obstacle_005.png"
dest_files=["res://.godot/imported/obstacle_005.png-26c09b94401d6835c5cb54ae56b3777a.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=false
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: 656 B

View file

@ -0,0 +1,40 @@
[remap]
importer="texture"
type="CompressedTexture2D"
uid="uid://cnetjbnd4cvnc"
path="res://.godot/imported/obstacle_006.png-5babc26643ec6b2274882f229a5b0bd5.ctex"
metadata={
"vram_texture": false
}
[deps]
source_file="res://library/thumbs/obstacle_006.png"
dest_files=["res://.godot/imported/obstacle_006.png-5babc26643ec6b2274882f229a5b0bd5.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=false
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: 932 B

View file

@ -0,0 +1,40 @@
[remap]
importer="texture"
type="CompressedTexture2D"
uid="uid://b6k7tlyy7gtwi"
path="res://.godot/imported/obstacle_007.png-b43a588a90e749088f048b2f07a766b8.ctex"
metadata={
"vram_texture": false
}
[deps]
source_file="res://library/thumbs/obstacle_007.png"
dest_files=["res://.godot/imported/obstacle_007.png-b43a588a90e749088f048b2f07a766b8.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=false
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: 674 B

View file

@ -0,0 +1,40 @@
[remap]
importer="texture"
type="CompressedTexture2D"
uid="uid://dhguwsrehfxl"
path="res://.godot/imported/obstacle_008.png-7ae4876c971358c1303e82d316d4ffa6.ctex"
metadata={
"vram_texture": false
}
[deps]
source_file="res://library/thumbs/obstacle_008.png"
dest_files=["res://.godot/imported/obstacle_008.png-7ae4876c971358c1303e82d316d4ffa6.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=false
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: 660 B

View file

@ -0,0 +1,40 @@
[remap]
importer="texture"
type="CompressedTexture2D"
uid="uid://dum6niwulhgrg"
path="res://.godot/imported/obstacle_009.png-db55beebf207ae287791f8dbef16af0e.ctex"
metadata={
"vram_texture": false
}
[deps]
source_file="res://library/thumbs/obstacle_009.png"
dest_files=["res://.godot/imported/obstacle_009.png-db55beebf207ae287791f8dbef16af0e.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=false
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: 694 B

View file

@ -0,0 +1,40 @@
[remap]
importer="texture"
type="CompressedTexture2D"
uid="uid://dbvcmlbhgw4dn"
path="res://.godot/imported/obstacle_010.png-3630ea64fc3652f281e6a2d49636427a.ctex"
metadata={
"vram_texture": false
}
[deps]
source_file="res://library/thumbs/obstacle_010.png"
dest_files=["res://.godot/imported/obstacle_010.png-3630ea64fc3652f281e6a2d49636427a.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=false
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

@ -0,0 +1,173 @@
extends SceneTree
## D2-Renderprobe (Karte t_33250710): Map-Builder-Beweis — drei Absperrungen/
## Hindernisse aus dem Military-Pack werden über den ECHTEN Editor-Viewport-Bauer
## (src/viewport/map_view_builder.gd) auf flachem Boden platziert, perspektivisch
## gerendert und als PNG gespeichert (visuelle Prüfung: stehen die Objekte auf
## dem Boden?). Zusätzlich wird je Objekt gemessen: Unterkante vs. Bodenhöhe,
## Mesh-Größe vs. collision.size.
##
## BRAUCHT Rendering (nicht --headless):
## xvfb-run -a /opt/data/home/bin/godot4 --path . --rendering-driver opengl3 \
## -s res://tests/probe_d2_barriers_render.gd
## Ausgabe: PROBE_D2_RENDER_OK / PROBE_D2_RENDER_FAIL
const OUT_DIR := "/opt/data/kanban/workspaces/t_33250710/artifacts"
const OBJEKTE := [
{"id": "barrier_001", "pos": [-7.0, 0.0, 0.0], "rot_y_deg": 0.0, "scale": 1.0},
{"id": "obstacle_004", "pos": [0.0, 0.0, -1.0], "rot_y_deg": 90.0, "scale": 1.0},
{"id": "obstacle_008", "pos": [8.0, 0.0, 1.0], "rot_y_deg": 45.0, "scale": 1.0},
]
const W := 1280
const H := 720
var fehler: Array = []
func _initialize() -> void:
_run()
func _run() -> void:
await process_frame
await process_frame
DirAccess.make_dir_recursive_absolute(OUT_DIR)
var manifest: Dictionary = JSON.parse_string(
FileAccess.get_file_as_string(SvmapIO.MANIFEST_PATH))
if manifest.is_empty():
fehler.append("Bibliothek (library/objects.json) nicht ladbar")
var lib: Dictionary = manifest.get("objects", {})
print("Bibliothek: %d Objekte" % lib.size())
var vp := SubViewport.new()
vp.size = Vector2i(W, H)
vp.own_world_3d = true
vp.render_target_update_mode = SubViewport.UPDATE_ALWAYS
root.add_child(vp)
var builder := Node3D.new()
builder.set_script(load("res://src/viewport/map_view_builder.gd"))
vp.add_child(builder)
builder.call("rebuild", _doku(), manifest)
var cam := Camera3D.new()
vp.add_child(cam)
cam.position = Vector3(0.0, 7.0, 17.0)
cam.look_at(Vector3(0.0, 0.8, 0.0))
cam.current = true
print("fehlende GLBs (Platzhalter): %s" % str(builder.get("fehlende_glbs")))
for o in OBJEKTE:
if not lib.has(o["id"]):
fehler.append("%s fehlt in der Bibliothek" % o["id"])
continue
_pruefe(builder, lib[o["id"]], o)
if not builder.get("fehlende_glbs").is_empty():
fehler.append("Platzhalter statt GLB: %s" % str(builder.get("fehlende_glbs")))
await process_frame
await process_frame
await RenderingServer.frame_post_draw
await process_frame
var img := vp.get_texture().get_image()
var pfad := OUT_DIR + "/d2_barriers_map_builder.png"
img.save_png(pfad)
print("PROBE_SAVED %s (%dx%d)" % [pfad, img.get_width(), img.get_height()])
_check_bild(img)
for f in fehler:
print(" FEHLER: %s" % f)
print("PROBE_D2_RENDER_%s" % ("FAIL" if not fehler.is_empty() else "OK"))
quit(0 if fehler.is_empty() else 1)
func _pruefe(builder: Node, eintrag: Dictionary, obj: Dictionary) -> void:
var oid := str(obj["id"])
var markers: Array = builder.get("object_markers")
var marker: Node3D = null
var idx := -1
for i in OBJEKTE.size():
if str(OBJEKTE[i]["id"]) == oid and i < markers.size():
marker = markers[i]
idx = i
if marker == null:
fehler.append("%s: kein Marker im Viewport-Bauer" % oid)
return
var box := _mesh_aabb(marker, marker)
var col: Dictionary = eintrag.get("collision", {})
var csize: Array = col.get("size", [])
var dmax := 0.0
for k in 3:
dmax = maxf(dmax, absf(box.size[k] - float(csize[k])))
var echt: bool = bool(marker.get_meta("glb", false))
print("--- %s (Marker %d): echtes GLB=%s" % [oid, idx, str(echt)])
print(" Mesh-AABB lokal: pos=%s size=%s" % [str(box.position), str(box.size)])
print(" Unterkante y=%.3f (Boden %.3f, Marker y=%.3f) | size-Abweichung %.3f m"
% [box.position.y, 0.0, marker.position.y, dmax])
if not echt:
fehler.append("%s: Platzhalter statt GLB im Editor" % oid)
if absf(box.position.y) > 0.02:
fehler.append("%s: Unterkante liegt %.3f m neben dem Boden" % [oid, box.position.y])
if dmax > 0.02:
fehler.append("%s: Mesh-Größe weicht %.3f m von collision.size ab" % [oid, dmax])
## Grobe Sichtprüfung im Bild: es muss Struktur (helle Pixel) geben und das
## Objektband in der Bildmitte muss sich vom Himmel/Untergrund unterscheiden.
func _check_bild(img: Image) -> void:
var w := img.get_width()
var h := img.get_height()
var hell := 0
var band := 0
for y in range(0, h, 2):
for x in range(0, w, 2):
var c := img.get_pixel(x, y)
var lum := (c.r + c.g + c.b) / 3.0
if lum > 0.55:
hell += 1
if y > int(h * 0.35) and y < int(h * 0.85):
band += 1
print("Bild: helle Pixel %d, davon im Objektband %d" % [hell, band])
if hell < 200:
fehler.append("Renderbild zeigt fast nichts (helle Pixel %d) — Objekte unsichtbar?" % hell)
if band < 50:
fehler.append("kein Objekt im erwarteten Bildband (helle Pixel %d)" % band)
func _mesh_aabb(n: Node, bezug: Node = null) -> AABB:
var box := AABB()
var erst := true
var basis: Transform3D = Transform3D.IDENTITY if bezug == null else bezug.global_transform.affine_inverse()
for k in n.get_children():
if k is MeshInstance3D and (k as MeshInstance3D).mesh != null:
var aabb: AABB = (k as MeshInstance3D).mesh.get_aabb()
aabb = (basis * (k as MeshInstance3D).global_transform) * aabb
box = aabb if erst else box.merge(aabb)
erst = false
var kind := _mesh_aabb(k, bezug)
if kind.size != Vector3.ZERO:
box = kind if erst else box.merge(kind)
erst = false
return box
## Flaches Bodenfeld (17², 0 m) — Objekte stehen direkt auf y=0.
func _doku() -> Dictionary:
var res := 17
var raw := PackedByteArray()
raw.resize(res * res * 2)
return {
"format_version": 2,
"info": {"name": "D2 Absperrungen", "author": "Tests", "version": 1},
"terrain": {
"type": "heightmap",
"resolution": res,
"size_x_m": 64.0,
"size_z_m": 64.0,
"min_height_m": 0.0,
"max_height_m": 4.0,
"heightmap_r16_b64": Marshalls.raw_to_base64(raw),
},
"weather": "mittag",
"objects": OBJEKTE,
"spawns": [],
}

View file

@ -0,0 +1 @@
uid://c41jvxtxfgern