Compare commits

..

10 Commits

Author SHA1 Message Date
Relicjamin
5a1c02aa15 UV Mapping for Destructable Walls 2026-01-07 12:53:20 -05:00
933bd98a4f Glock17 Blender Files 2026-01-01 14:04:53 -05:00
f8a0208362 9mm Gen 5 2025-12-02 19:34:53 -05:00
351567fe07 9mm Blender File 2025-11-29 13:34:52 -05:00
32c5e8fa9b Handle Depth In Mesh Generation 2025-11-27 18:39:24 -05:00
1c8e3d7314 Group Holes with Hull Convex 2025-11-26 13:21:05 -05:00
0a3919ce4c Add Center Function on Holes
Calculates the center of the hole.
2025-11-24 20:03:52 -05:00
703285f555 Implemented NN Search on Rtree
Just binded the library to Godot so we can use later to have more
options on how to create holes.
2025-11-23 18:36:41 -05:00
c208d069bb Implemented R-Tree
Would like to switch the identifer of the hole to a random string.
2025-11-23 18:22:00 -05:00
36c648cfe5 Creation of the RTree Godot Class
Basic defintions, we are going to see if it fits the use case.
2025-11-21 20:09:02 -05:00
91 changed files with 2381 additions and 1478 deletions

Binary file not shown.

Binary file not shown.

After

Width:  |  Height:  |  Size: 1.1 MiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 44 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 104 KiB

Binary file not shown.

Binary file not shown.

Binary file not shown.

Binary file not shown.

After

Width:  |  Height:  |  Size: 941 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 427 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 1.5 MiB

View File

@@ -1,451 +1,451 @@
@icon("res://addons/func_godot/icons/icon_godot_ranger.svg") @icon("res://addons/func_godot/icons/icon_godot_ranger.svg")
class_name FuncGodotEntityAssembler extends RefCounted class_name FuncGodotEntityAssembler extends RefCounted
## Entity assembly class that is instantiated by a [FuncGodotMap] node. ## Entity assembly class that is instantiated by a [FuncGodotMap] node.
const _SIGNATURE: String = "[ENT]" const _SIGNATURE: String = "[ENT]"
# Namespacing # Namespacing
const _GroupData := FuncGodotData.GroupData const _GroupData := FuncGodotData.GroupData
const _EntityData := FuncGodotData.EntityData const _EntityData := FuncGodotData.EntityData
# Class members # Class members
## [FuncGodotMapSettings] provided by the [FuncGodotMap] during the build process. ## [FuncGodotMapSettings] provided by the [FuncGodotMap] during the build process.
var map_settings: FuncGodotMapSettings = null var map_settings: FuncGodotMapSettings = null
## [enum FuncGodotMap.BuildFlags] that may affect the build process provided by the [FuncGodotMap]. ## [enum FuncGodotMap.BuildFlags] that may affect the build process provided by the [FuncGodotMap].
var build_flags: int = 0 var build_flags: int = 0
# Signals # Signals
## Emitted when a step in the entity assembly process is completed. ## Emitted when a step in the entity assembly process is completed.
## It is connected to [method FuncGodotUtil.print_profile_info] method if [member FuncGodotMap.build_flags] SHOW_PROFILE_INFO flag is set. ## It is connected to [method FuncGodotUtil.print_profile_info] method if [member FuncGodotMap.build_flags] SHOW_PROFILE_INFO flag is set.
signal declare_step(step: String) signal declare_step(step: String)
func _init(settings: FuncGodotMapSettings) -> void: func _init(settings: FuncGodotMapSettings) -> void:
map_settings = settings map_settings = settings
## Attempts to retrieve a [Script] via class name, to allow for [GDScript] class instantiation. ## Attempts to retrieve a [Script] via class name, to allow for [GDScript] class instantiation.
static func get_script_by_class_name(name_of_class: String) -> Script: static func get_script_by_class_name(name_of_class: String) -> Script:
if ResourceLoader.exists(name_of_class, "Script"): if ResourceLoader.exists(name_of_class, "Script"):
return load(name_of_class) as Script return load(name_of_class) as Script
for global_class in ProjectSettings.get_global_class_list(): for global_class in ProjectSettings.get_global_class_list():
var found_name_of_class : String = global_class["class"] var found_name_of_class : String = global_class["class"]
var found_path : String = global_class["path"] var found_path : String = global_class["path"]
if found_name_of_class == name_of_class: if found_name_of_class == name_of_class:
return load(found_path) as Script return load(found_path) as Script
return null return null
## Generates a [Node3D] for a group's [SceneTree] representation and links the new [Node3D] to that group. ## Generates a [Node3D] for a group's [SceneTree] representation and links the new [Node3D] to that group.
func generate_group_node(group_data: _GroupData) -> Node3D: func generate_group_node(group_data: _GroupData) -> Node3D:
var group_node := Node3D.new() var group_node := Node3D.new()
group_node.name = group_data.name group_node.name = group_data.name
group_data.node = group_node group_data.node = group_node
return group_node return group_node
## Generates and assembles a new [Node] based upon processed [FuncGodotData.EntityData]. Depending upon provided data, ## Generates and assembles a new [Node] based upon processed [FuncGodotData.EntityData]. Depending upon provided data,
## additional [MeshInstance3D], [CollisionShape3D], and [OccluderInstance3D] nodes may also be generated. ## additional [MeshInstance3D], [CollisionShape3D], and [OccluderInstance3D] nodes may also be generated.
func generate_solid_entity_node(node: Node, node_name: String, data: _EntityData, definition: FuncGodotFGDSolidClass) -> Node: func generate_solid_entity_node(node: Node, node_name: String, data: _EntityData, definition: FuncGodotFGDSolidClass) -> Node:
if definition.spawn_type == FuncGodotFGDSolidClass.SpawnType.MERGE_WORLDSPAWN: if definition.spawn_type == FuncGodotFGDSolidClass.SpawnType.MERGE_WORLDSPAWN:
return null return null
if definition.node_class != "": if definition.node_class != "":
if ClassDB.class_exists(definition.node_class): if ClassDB.class_exists(definition.node_class):
node = ClassDB.instantiate(definition.node_class) node = ClassDB.instantiate(definition.node_class)
else: else:
var script: Script = get_script_by_class_name(definition.node_class) var script: Script = get_script_by_class_name(definition.node_class)
if script is GDScript: if script is GDScript:
node = (script as GDScript).new() node = (script as GDScript).new()
else: else:
node = Node3D.new() node = Node3D.new()
node.name = node_name node.name = node_name
node_name = node_name.trim_suffix(definition.classname).trim_suffix("_") node_name = node_name.trim_suffix(definition.classname).trim_suffix("_")
var properties: Dictionary = data.properties var properties: Dictionary = data.properties
# Mesh Instance generation # Mesh Instance generation
if data.mesh: if data.mesh:
var mesh_instance := MeshInstance3D.new() var mesh_instance := MeshInstance3D.new()
mesh_instance.name = node_name + "_mesh_instance" mesh_instance.name = node_name + "_mesh_instance"
mesh_instance.mesh = data.mesh mesh_instance.mesh = data.mesh
mesh_instance.gi_mode = GeometryInstance3D.GI_MODE_DISABLED mesh_instance.gi_mode = GeometryInstance3D.GI_MODE_DISABLED
if definition.global_illumination_mode: if definition.global_illumination_mode:
mesh_instance.gi_mode = definition.global_illumination_mode mesh_instance.gi_mode = definition.global_illumination_mode
mesh_instance.cast_shadow = definition.shadow_casting_setting mesh_instance.cast_shadow = definition.shadow_casting_setting
mesh_instance.layers = definition.render_layers mesh_instance.layers = definition.render_layers
node.add_child(mesh_instance) node.add_child(mesh_instance)
data.mesh_instance = mesh_instance data.mesh_instance = mesh_instance
# Occluder generation # Occluder generation
if definition.build_occlusion and data.mesh: if definition.build_occlusion and data.mesh:
var verts: PackedVector3Array = [] var verts: PackedVector3Array = []
var indices: PackedInt32Array = [] var indices: PackedInt32Array = []
var index: int = 0 var index: int = 0
for surf_idx in range(data.mesh.get_surface_count()): for surf_idx in range(data.mesh.get_surface_count()):
var vert_count: int = verts.size() var vert_count: int = verts.size()
var surf_array: Array = data.mesh.surface_get_arrays(surf_idx) var surf_array: Array = data.mesh.surface_get_arrays(surf_idx)
verts.append_array(surf_array[Mesh.ARRAY_VERTEX]) verts.append_array(surf_array[Mesh.ARRAY_VERTEX])
indices.resize(indices.size() + surf_array[Mesh.ARRAY_INDEX].size()) indices.resize(indices.size() + surf_array[Mesh.ARRAY_INDEX].size())
for new_index in surf_array[Mesh.ARRAY_INDEX]: for new_index in surf_array[Mesh.ARRAY_INDEX]:
indices[index] = (new_index + vert_count) indices[index] = (new_index + vert_count)
index += 1 index += 1
var occluder := ArrayOccluder3D.new() var occluder := ArrayOccluder3D.new()
occluder.set_arrays(verts, indices) occluder.set_arrays(verts, indices)
var occluder_instance := OccluderInstance3D.new() var occluder_instance := OccluderInstance3D.new()
occluder_instance.name = node_name + "_occluder_instance" occluder_instance.name = node_name + "_occluder_instance"
occluder_instance.occluder = occluder occluder_instance.occluder = occluder
node.add_child(occluder_instance) node.add_child(occluder_instance)
data.occluder_instance = occluder_instance data.occluder_instance = occluder_instance
if not (build_flags & FuncGodotMap.BuildFlags.DISABLE_SMOOTHING) and data.is_smooth_shaded(map_settings.entity_smoothing_property): if not (build_flags & FuncGodotMap.BuildFlags.DISABLE_SMOOTHING) and data.is_smooth_shaded(map_settings.entity_smoothing_property):
mesh_instance.mesh = FuncGodotUtil.smooth_mesh_by_angle(data.mesh, data.get_smoothing_angle(map_settings.entity_smoothing_angle_property)) mesh_instance.mesh = FuncGodotUtil.smooth_mesh_by_angle(data.mesh, data.get_smoothing_angle(map_settings.entity_smoothing_angle_property))
# Collision generation # Collision generation
if data.shapes.size() and node is CollisionObject3D: if data.shapes.size() and node is CollisionObject3D:
node.collision_layer = definition.collision_layer node.collision_layer = definition.collision_layer
node.collision_mask = definition.collision_mask node.collision_mask = definition.collision_mask
node.collision_priority = definition.collision_priority node.collision_priority = definition.collision_priority
var shape_to_face_array : Array[PackedInt32Array] = [] var shape_to_face_array : Array[PackedInt32Array] = []
if data.mesh_metadata.has('shape_to_face_array'): if data.mesh_metadata.has('shape_to_face_array'):
shape_to_face_array = data.mesh_metadata['shape_to_face_array'] shape_to_face_array = data.mesh_metadata['shape_to_face_array']
data.mesh_metadata.erase('shape_to_face_array') data.mesh_metadata.erase('shape_to_face_array')
# Generate CollisionShape3D nodes and apply shapes # Generate CollisionShape3D nodes and apply shapes
var face_index_metadata : Dictionary[String, PackedInt32Array] = {} var face_index_metadata : Dictionary[String, PackedInt32Array] = {}
for i in data.shapes.size(): for i in data.shapes.size():
var shape := data.shapes[i] var shape := data.shapes[i]
var collision_shape := CollisionShape3D.new() var collision_shape := CollisionShape3D.new()
if definition.collision_shape_type == FuncGodotFGDSolidClass.CollisionShapeType.CONCAVE: if definition.collision_shape_type == FuncGodotFGDSolidClass.CollisionShapeType.CONCAVE:
collision_shape.name = node_name + "_collision_shape" collision_shape.name = node_name + "_collision_shape"
else: else:
collision_shape.name = node_name + "_brush_%s_collision_shape" % i collision_shape.name = node_name + "_brush_%s_collision_shape" % i
collision_shape.shape = shape collision_shape.shape = shape
collision_shape.shape.margin = definition.collision_shape_margin collision_shape.shape.margin = definition.collision_shape_margin
collision_shape.owner = node.owner collision_shape.owner = node.owner
node.add_child(collision_shape) node.add_child(collision_shape)
data.collision_shapes.append(collision_shape) data.collision_shapes.append(collision_shape)
if shape_to_face_array.size() > i: if shape_to_face_array.size() > i:
face_index_metadata[collision_shape.name] = shape_to_face_array[i] face_index_metadata[collision_shape.name] = shape_to_face_array[i]
if definition.add_collision_shape_to_face_indices_metadata: if definition.add_collision_shape_to_face_indices_metadata:
data.mesh_metadata['collision_shape_to_face_indices_map'] = face_index_metadata data.mesh_metadata['collision_shape_to_face_indices_map'] = face_index_metadata
if "position" in node: if "position" in node:
if node.position is Vector3: if node.position is Vector3:
node.position = FuncGodotUtil.id_to_opengl(data.origin) * map_settings.scale_factor node.position = FuncGodotUtil.id_to_opengl(data.origin) * map_settings.scale_factor
if not data.mesh_metadata.is_empty(): if not data.mesh_metadata.is_empty():
node.set_meta("func_godot_mesh_data", data.mesh_metadata) node.set_meta("func_godot_mesh_data", data.mesh_metadata)
return node return node
## Generates and assembles a new [Node] or [PackedScene] based upon processed [FuncGodotData.EntityData]. ## Generates and assembles a new [Node] or [PackedScene] based upon processed [FuncGodotData.EntityData].
func generate_point_entity_node(node: Node, node_name: String, properties: Dictionary, definition: FuncGodotFGDPointClass) -> Node: func generate_point_entity_node(node: Node, node_name: String, properties: Dictionary, definition: FuncGodotFGDPointClass) -> Node:
var classname: String = properties["classname"] var classname: String = properties["classname"]
if definition.scene_file: if definition.scene_file:
var flag: PackedScene.GenEditState = PackedScene.GEN_EDIT_STATE_DISABLED var flag: PackedScene.GenEditState = PackedScene.GEN_EDIT_STATE_DISABLED
if Engine.is_editor_hint(): if Engine.is_editor_hint():
flag = PackedScene.GEN_EDIT_STATE_INSTANCE flag = PackedScene.GEN_EDIT_STATE_INSTANCE
node = definition.scene_file.instantiate(flag) node = definition.scene_file.instantiate(flag)
elif definition.node_class != "": elif definition.node_class != "":
if ClassDB.class_exists(definition.node_class): if ClassDB.class_exists(definition.node_class):
node = ClassDB.instantiate(definition.node_class) node = ClassDB.instantiate(definition.node_class)
else: else:
var script: Script = get_script_by_class_name(definition.node_class) var script: Script = get_script_by_class_name(definition.node_class)
if script is GDScript: if script is GDScript:
node = (script as GDScript).new() node = (script as GDScript).new()
else: else:
node = Node3D.new() node = Node3D.new()
node.name = node_name node.name = node_name
if "rotation_degrees" in node and definition.apply_rotation_on_map_build: if "rotation_degrees" in node and definition.apply_rotation_on_map_build:
var angles := Vector3.ZERO var angles := Vector3.ZERO
if "angles" in properties or "mangle" in properties: if "angles" in properties or "mangle" in properties:
var key := "angles" if "angles" in properties else "mangle" var key := "angles" if "angles" in properties else "mangle"
var angles_raw = properties[key] var angles_raw = properties[key]
if not angles_raw is Vector3: if not angles_raw is Vector3:
angles_raw = angles_raw.split_floats(' ') angles_raw = angles_raw.split_floats(' ')
if angles_raw.size() > 2: if angles_raw.size() > 2:
angles = Vector3(-angles_raw[0], angles_raw[1], -angles_raw[2]) angles = Vector3(-angles_raw[0], angles_raw[1], -angles_raw[2])
if key == "mangle": if key == "mangle":
if definition.classname.begins_with("light"): if definition.classname.begins_with("light"):
angles = Vector3(angles_raw[1], angles_raw[0], -angles_raw[2]) angles = Vector3(angles_raw[1], angles_raw[0], -angles_raw[2])
elif definition.classname == "info_intermission": elif definition.classname == "info_intermission":
angles = Vector3(angles_raw[0], angles_raw[1], -angles_raw[2]) angles = Vector3(angles_raw[0], angles_raw[1], -angles_raw[2])
else: else:
push_error("Invalid vector format for \"" + key + "\" in entity \"" + classname + "\"") push_error("Invalid vector format for \"" + key + "\" in entity \"" + classname + "\"")
elif "angle" in properties: elif "angle" in properties:
var angle = properties["angle"] var angle = properties["angle"]
if not angle is float: if not angle is float:
angle = float(angle) angle = float(angle)
angles.y += angle angles.y += angle
angles.y += 180 angles.y += 180
node.rotation_degrees = angles node.rotation_degrees = angles
if "scale" in node and definition.apply_scale_on_map_build: if "scale" in node and definition.apply_scale_on_map_build:
if "scale" in properties: if "scale" in properties:
var scale_prop: Variant = properties["scale"] var scale_prop: Variant = properties["scale"]
if typeof(scale_prop) == TYPE_STRING: if typeof(scale_prop) == TYPE_STRING:
var scale_arr: PackedStringArray = (scale_prop as String).split(" ") var scale_arr: PackedStringArray = (scale_prop as String).split(" ")
match scale_arr.size(): match scale_arr.size():
1: scale_prop = scale_arr[0].to_float() 1: scale_prop = scale_arr[0].to_float()
3: scale_prop = Vector3(scale_arr[1].to_float(), scale_arr[2].to_float(), scale_arr[0].to_float()) 3: scale_prop = Vector3(scale_arr[1].to_float(), scale_arr[2].to_float(), scale_arr[0].to_float())
2: scale_prop = Vector2(scale_arr[0].to_float(), scale_arr[0].to_float()) 2: scale_prop = Vector2(scale_arr[0].to_float(), scale_arr[0].to_float())
if typeof(scale_prop) == TYPE_FLOAT or typeof(scale_prop) == TYPE_INT: if typeof(scale_prop) == TYPE_FLOAT or typeof(scale_prop) == TYPE_INT:
node.scale *= scale_prop as float node.scale *= scale_prop as float
elif node.scale is Vector3: elif node.scale is Vector3:
if typeof(scale_prop) == TYPE_VECTOR3 or typeof(scale_prop) == TYPE_VECTOR3I: if typeof(scale_prop) == TYPE_VECTOR3 or typeof(scale_prop) == TYPE_VECTOR3I:
node.scale *= scale_prop as Vector3 node.scale *= scale_prop as Vector3
elif node.scale is Vector2: elif node.scale is Vector2:
if typeof(scale_prop) == TYPE_VECTOR2 or typeof(scale_prop) == TYPE_VECTOR2I: if typeof(scale_prop) == TYPE_VECTOR2 or typeof(scale_prop) == TYPE_VECTOR2I:
node.scale *= scale_prop as Vector2 node.scale *= scale_prop as Vector2
if "origin" in properties: if "origin" in properties:
var origin_vec: Vector3 = Vector3.ZERO var origin_vec: Vector3 = Vector3.ZERO
var origin_comps: PackedFloat64Array = properties['origin'].split_floats(' ') var origin_comps: PackedFloat64Array = properties['origin'].split_floats(' ')
if origin_comps.size() > 2: if origin_comps.size() > 2:
origin_vec = Vector3(origin_comps[1], origin_comps[2], origin_comps[0]) origin_vec = Vector3(origin_comps[1], origin_comps[2], origin_comps[0])
else: else:
push_error("Invalid vector format for \"origin\" in " + node_name) push_error("Invalid vector format for \"origin\" in " + node_name)
if "position" in node: if "position" in node:
if node.position is Vector3: if node.position is Vector3:
node.position = origin_vec * map_settings.scale_factor node.position = origin_vec * map_settings.scale_factor
elif node.position is Vector2: elif node.position is Vector2:
node.position = Vector2(origin_vec.z, -origin_vec.y) node.position = Vector2(origin_vec.z, -origin_vec.y)
return node return node
## Converts the [String] values of the entity data's [code]properties[/code] [Dictionary] to various [Variant] formats ## Converts the [String] values of the entity data's [code]properties[/code] [Dictionary] to various [Variant] formats
## based upon the [FuncGodotFGDEntity]'s class properties, then attempts to send those properties to a [code]func_godot_properties[/code] [Dictionary] ## based upon the [FuncGodotFGDEntity]'s class properties, then attempts to send those properties to a [code]func_godot_properties[/code] [Dictionary]
## and an [code]_func_godot_apply_properties(properties: Dictionary)[/code] method on the node. A deferred call to [code]_func_godot_build_complete()[/code] is also made. ## and an [code]_func_godot_apply_properties(properties: Dictionary)[/code] method on the node. A deferred call to [code]_func_godot_build_complete()[/code] is also made.
func apply_entity_properties(node: Node, data: _EntityData) -> void: func apply_entity_properties(node: Node, data: _EntityData) -> void:
var properties: Dictionary = data.properties var properties: Dictionary = data.properties
if data.definition: if data.definition:
var def := data.definition var def := data.definition
for property in properties: for property in properties:
var prop_string = properties[property] var prop_string = properties[property]
if property in def.class_properties: if property in def.class_properties:
var prop_default: Variant = def.class_properties[property] var prop_default: Variant = def.class_properties[property]
match typeof(prop_default): match typeof(prop_default):
TYPE_INT: TYPE_INT:
properties[property] = prop_string.to_int() properties[property] = prop_string.to_int()
TYPE_FLOAT: TYPE_FLOAT:
properties[property] = prop_string.to_float() properties[property] = prop_string.to_float()
TYPE_BOOL: TYPE_BOOL:
properties[property] = bool(prop_string.to_int()) properties[property] = bool(prop_string.to_int())
TYPE_VECTOR3: TYPE_VECTOR3:
var prop_comps: PackedFloat64Array = prop_string.split_floats(" ") var prop_comps: PackedFloat64Array = prop_string.split_floats(" ")
if prop_comps.size() > 2: if prop_comps.size() > 2:
properties[property] = Vector3(prop_comps[0], prop_comps[1], prop_comps[2]) properties[property] = Vector3(prop_comps[0], prop_comps[1], prop_comps[2])
else: else:
push_error("Invalid Vector3 format for \'" + property + "\' in entity \'" + def.classname + "\': " + prop_string) push_error("Invalid Vector3 format for \'" + property + "\' in entity \'" + def.classname + "\': " + prop_string)
properties[property] = prop_default properties[property] = prop_default
TYPE_VECTOR3I: TYPE_VECTOR3I:
var prop_vec: Vector3i = prop_default var prop_vec: Vector3i = prop_default
var prop_comps: PackedStringArray = prop_string.split(" ") var prop_comps: PackedStringArray = prop_string.split(" ")
if prop_comps.size() > 2: if prop_comps.size() > 2:
for i in 3: for i in 3:
prop_vec[i] = prop_comps[i].to_int() prop_vec[i] = prop_comps[i].to_int()
else: else:
push_error("Invalid Vector3i format for \'" + property + "\' in entity \'" + def.classname + "\': " + prop_string) push_error("Invalid Vector3i format for \'" + property + "\' in entity \'" + def.classname + "\': " + prop_string)
properties[property] = prop_vec properties[property] = prop_vec
TYPE_COLOR: TYPE_COLOR:
var prop_color: Color = prop_default var prop_color: Color = prop_default
var prop_comps: PackedStringArray = prop_string.split(" ") var prop_comps: PackedStringArray = prop_string.split(" ")
if prop_comps.size() > 2: if prop_comps.size() > 2:
prop_color.r8 = prop_comps[0].to_int() prop_color.r8 = prop_comps[0].to_int()
prop_color.g8 = prop_comps[1].to_int() prop_color.g8 = prop_comps[1].to_int()
prop_color.b8 = prop_comps[2].to_int() prop_color.b8 = prop_comps[2].to_int()
prop_color.a = 1.0 prop_color.a = 1.0
else: else:
push_error("Invalid Color format for \'" + property + "\' in entity \'" + def.classname + "\': " + prop_string) push_error("Invalid Color format for \'" + property + "\' in entity \'" + def.classname + "\': " + prop_string)
properties[property] = prop_color properties[property] = prop_color
TYPE_DICTIONARY: TYPE_DICTIONARY:
var prop_desc = def.class_property_descriptions[property] var prop_desc = def.class_property_descriptions[property]
if prop_desc is Array and prop_desc.size() > 1 and prop_desc[1] is int: if prop_desc is Array and prop_desc.size() > 1 and prop_desc[1] is int:
properties[property] = prop_string.to_int() properties[property] = prop_string.to_int()
TYPE_ARRAY: TYPE_ARRAY:
properties[property] = prop_string.to_int() properties[property] = prop_string.to_int()
TYPE_VECTOR2: TYPE_VECTOR2:
var prop_comps: PackedFloat64Array = prop_string.split_floats(" ") var prop_comps: PackedFloat64Array = prop_string.split_floats(" ")
if prop_comps.size() > 1: if prop_comps.size() > 1:
properties[property] = Vector2(prop_comps[0], prop_comps[1]) properties[property] = Vector2(prop_comps[0], prop_comps[1])
else: else:
push_error("Invalid Vector2 format for \'" + property + "\' in entity \'" + def.classname + "\': " + prop_string) push_error("Invalid Vector2 format for \'" + property + "\' in entity \'" + def.classname + "\': " + prop_string)
properties[property] = prop_default properties[property] = prop_default
TYPE_VECTOR2I: TYPE_VECTOR2I:
var prop_vec: Vector2i = prop_default var prop_vec: Vector2i = prop_default
var prop_comps: PackedStringArray = prop_string.split(" ") var prop_comps: PackedStringArray = prop_string.split(" ")
if prop_comps.size() > 1: if prop_comps.size() > 1:
for i in 2: for i in 2:
prop_vec[i] = prop_comps[i].to_int() prop_vec[i] = prop_comps[i].to_int()
else: else:
push_error("Invalid Vector2i format for \'" + property + "\' in entity \'" + def.classname + "\': " + prop_string) push_error("Invalid Vector2i format for \'" + property + "\' in entity \'" + def.classname + "\': " + prop_string)
properties[property] = prop_vec properties[property] = prop_vec
TYPE_VECTOR4: TYPE_VECTOR4:
var prop_comps: PackedFloat64Array = prop_string.split_floats(" ") var prop_comps: PackedFloat64Array = prop_string.split_floats(" ")
if prop_comps.size() > 3: if prop_comps.size() > 3:
properties[property] = Vector4(prop_comps[0], prop_comps[1], prop_comps[2], prop_comps[3]) properties[property] = Vector4(prop_comps[0], prop_comps[1], prop_comps[2], prop_comps[3])
else: else:
push_error("Invalid Vector4 format for \'" + property + "\' in entity \'" + def.classname + "\': " + prop_string) push_error("Invalid Vector4 format for \'" + property + "\' in entity \'" + def.classname + "\': " + prop_string)
properties[property] = prop_default properties[property] = prop_default
TYPE_VECTOR4I: TYPE_VECTOR4I:
var prop_vec: Vector4i = prop_default var prop_vec: Vector4i = prop_default
var prop_comps: PackedStringArray = prop_string.split(" ") var prop_comps: PackedStringArray = prop_string.split(" ")
if prop_comps.size() > 3: if prop_comps.size() > 3:
for i in 4: for i in 4:
prop_vec[i] = prop_comps[i].to_int() prop_vec[i] = prop_comps[i].to_int()
else: else:
push_error("Invalid Vector4i format for \'" + property + "\' in entity \'" + def.classname + "\': " + prop_string) push_error("Invalid Vector4i format for \'" + property + "\' in entity \'" + def.classname + "\': " + prop_string)
properties[property] = prop_vec properties[property] = prop_vec
TYPE_STRING_NAME: TYPE_STRING_NAME:
properties[property] = StringName(prop_string) properties[property] = StringName(prop_string)
TYPE_NODE_PATH: TYPE_NODE_PATH:
properties[property] = prop_string properties[property] = prop_string
TYPE_OBJECT: TYPE_OBJECT:
properties[property] = prop_string properties[property] = prop_string
# Assign properties not defined with defaults from the entity definition # Assign properties not defined with defaults from the entity definition
for property in def.class_properties: for property in def.class_properties:
if not property in properties: if not property in properties:
var prop_default: Variant = def.class_properties[property] var prop_default: Variant = def.class_properties[property]
# Flags # Flags
if prop_default is Array: if prop_default is Array:
var prop_flags_sum := 0 var prop_flags_sum := 0
for prop_flag in prop_default: for prop_flag in prop_default:
if prop_flag is Array and prop_flag.size() > 2: if prop_flag is Array and prop_flag.size() > 2:
if prop_flag[2] and prop_flag[1] is int: if prop_flag[2] and prop_flag[1] is int:
prop_flags_sum += prop_flag[1] prop_flags_sum += prop_flag[1]
properties[property] = prop_flags_sum properties[property] = prop_flags_sum
# Choices # Choices
elif prop_default is Dictionary: elif prop_default is Dictionary:
var prop_desc = def.class_property_descriptions.get(property, "") var prop_desc = def.class_property_descriptions.get(property, "")
if prop_desc is Array and prop_desc.size() > 1 and (prop_desc[1] is int or prop_desc[1] is String): if prop_desc is Array and prop_desc.size() > 1 and (prop_desc[1] is int or prop_desc[1] is String):
properties[property] = prop_desc[1] properties[property] = prop_desc[1]
elif prop_default.size(): elif prop_default.size():
properties[property] = prop_default[prop_default.keys().front()] properties[property] = prop_default[prop_default.keys().front()]
else: else:
properties[property] = 0 properties[property] = 0
# Materials, Shaders, and Sounds # Materials, Shaders, and Sounds
elif prop_default is Resource: elif prop_default is Resource:
properties[property] = prop_default.resource_path properties[property] = prop_default.resource_path
# Target Destination and Target Source # Target Destination and Target Source
elif prop_default is NodePath or prop_default is Object or prop_default == null: elif prop_default is NodePath or prop_default is Object or prop_default == null:
properties[property] = "" properties[property] = ""
# Everything else # Everything else
else: else:
properties[property] = prop_default properties[property] = prop_default
if def.auto_apply_to_matching_node_properties: if def.auto_apply_to_matching_node_properties:
for property in properties: for property in properties:
if property in node: if property in node:
if typeof(node.get(property)) == typeof(properties[property]): if typeof(node.get(property)) == typeof(properties[property]):
node.set(property, properties[property]) node.set(property, properties[property])
else: else:
push_error("Entity %s property \'%s\' type mismatch with matching generated node property." % [node.name, property]) push_error("Entity %s property \'%s\' type mismatch with matching generated node property." % [node.name, property])
if "func_godot_properties" in node: if "func_godot_properties" in node:
node.func_godot_properties = properties node.func_godot_properties = properties
if node.has_method("_func_godot_apply_properties"): if node.has_method("_func_godot_apply_properties"):
node.call("_func_godot_apply_properties", properties) node.call("_func_godot_apply_properties", properties)
if node.has_method("_func_godot_build_complete"): if node.has_method("_func_godot_build_complete"):
node.call_deferred("_func_godot_build_complete") node.call_deferred("_func_godot_build_complete")
## Generate a [Node] from [FuncGodotData.EntityData]. The returned node value can be [code]null[/code], ## Generate a [Node] from [FuncGodotData.EntityData]. The returned node value can be [code]null[/code],
## in the case of [FuncGodotFGDSolidClass] entities with no [FuncGodotData.BrushData] entries. ## in the case of [FuncGodotFGDSolidClass] entities with no [FuncGodotData.BrushData] entries.
func generate_entity_node(entity_data: _EntityData, entity_index: int) -> Node: func generate_entity_node(entity_data: _EntityData, entity_index: int) -> Node:
var node: Node = null var node: Node = null
var node_name: String = "entity_%s" % entity_index var node_name: String = "entity_%s" % entity_index
var properties: Dictionary = entity_data.properties var properties: Dictionary = entity_data.properties
var entity_def: FuncGodotFGDEntityClass = entity_data.definition var entity_def: FuncGodotFGDEntityClass = entity_data.definition
if "classname" in entity_data.properties: if "classname" in entity_data.properties:
var classname: String = properties["classname"] var classname: String = properties["classname"]
node_name += "_" + properties["classname"] node_name += "_" + properties["classname"]
var default_point_def := FuncGodotFGDPointClass.new() var default_point_def := FuncGodotFGDPointClass.new()
var default_solid_def := FuncGodotFGDSolidClass.new() var default_solid_def := FuncGodotFGDSolidClass.new()
default_solid_def.collision_shape_type = FuncGodotFGDSolidClass.CollisionShapeType.NONE default_solid_def.collision_shape_type = FuncGodotFGDSolidClass.CollisionShapeType.NONE
if entity_def: if entity_def:
var name_prop: String var name_prop: String
if entity_def.name_property in properties: if entity_def.name_property in properties:
name_prop = str(properties[entity_def.name_property]) name_prop = str(properties[entity_def.name_property])
elif map_settings.entity_name_property in properties: elif map_settings.entity_name_property in properties:
name_prop = str(properties[map_settings.entity_name_property]) name_prop = str(properties[map_settings.entity_name_property])
if not name_prop.is_empty(): if not name_prop.is_empty():
node_name = "entity_" + name_prop node_name = "entity_" + name_prop
if entity_def is FuncGodotFGDSolidClass: if entity_def is FuncGodotFGDSolidClass:
node = generate_solid_entity_node(node, node_name, entity_data, entity_def) node = generate_solid_entity_node(node, node_name, entity_data, entity_def)
elif entity_def is FuncGodotFGDPointClass: elif entity_def is FuncGodotFGDPointClass:
node = generate_point_entity_node(node, node_name, properties, entity_def) node = generate_point_entity_node(node, node_name, properties, entity_def)
else: else:
push_error("Invalid entity definition for \"" + node_name + "\". Entity definition must be Solid Class or Point Class.") push_error("Invalid entity definition for \"" + node_name + "\". Entity definition must be Solid Class or Point Class.")
node = generate_point_entity_node(node, node_name, properties, default_point_def) node = generate_point_entity_node(node, node_name, properties, default_point_def)
if node and entity_def.script_class: if node and entity_def.script_class:
node.set_script(entity_def.script_class) node.set_script(entity_def.script_class)
else: else:
push_error("No entity definition found for \"" + node_name + "\"") push_error("No entity definition found for \"" + node_name + "\"")
if entity_data.brushes.size(): if entity_data.brushes.size():
node = generate_solid_entity_node(node, node_name, entity_data, default_solid_def) node = generate_solid_entity_node(node, node_name, entity_data, default_solid_def)
else: else:
node = generate_point_entity_node(node, node_name, properties, default_point_def) node = generate_point_entity_node(node, node_name, properties, default_point_def)
return node return node
## Main entity assembly process called by [FuncGodotMap]. Generates and sorts group nodes in the [SceneTree] first, ## Main entity assembly process called by [FuncGodotMap]. Generates and sorts group nodes in the [SceneTree] first,
## then generates and assembles [Node]s based upon the provided [FuncGodotData.EntityData] and adds them to the [SceneTree]. ## then generates and assembles [Node]s based upon the provided [FuncGodotData.EntityData] and adds them to the [SceneTree].
func build(map_node: FuncGodotMap, entities: Array[_EntityData], groups: Array[_GroupData]) -> void: func build(map_node: FuncGodotMap, entities: Array[_EntityData], groups: Array[_GroupData]) -> void:
var scene_root := map_node.get_tree().edited_scene_root if map_node.get_tree() else map_node var scene_root := map_node.get_tree().edited_scene_root if map_node.get_tree() else map_node
build_flags = map_node.build_flags build_flags = map_node.build_flags
if map_settings.use_groups_hierarchy: if map_settings.use_groups_hierarchy:
declare_step.emit("Generating %s groups" % groups.size()) declare_step.emit("Generating %s groups" % groups.size())
# Generate group nodes # Generate group nodes
for group in groups: for group in groups:
group.node = generate_group_node(group) group.node = generate_group_node(group)
# Sort hierarchy and add them to the map # Sort hierarchy and add them to the map
for group in groups: for group in groups:
if group.parent_id < 0: if group.parent_id < 0:
map_node.add_child(group.node) map_node.add_child(group.node)
group.node.owner = scene_root group.node.owner = scene_root
else: else:
for parent in groups: for parent in groups:
if group.parent_id == parent.id: if group.parent_id == parent.id:
parent.node.add_child(group.node) parent.node.add_child(group.node)
group.node.owner = scene_root group.node.owner = scene_root
declare_step.emit("Groups generation and sorting complete") declare_step.emit("Groups generation and sorting complete")
declare_step.emit("Assembling %s entities" % entities.size()) declare_step.emit("Assembling %s entities" % entities.size())
var entity_node: Node = null var entity_node: Node = null
for entity_index in entities.size(): for entity_index in entities.size():
var entity_data : _EntityData = entities[entity_index] var entity_data : _EntityData = entities[entity_index]
entity_node = generate_entity_node(entity_data, entity_index) entity_node = generate_entity_node(entity_data, entity_index)
if entity_node: if entity_node:
if not map_settings.use_groups_hierarchy or not entity_data.group: if not map_settings.use_groups_hierarchy or not entity_data.group:
map_node.add_child(entity_node) map_node.add_child(entity_node)
if entity_index == 0: if entity_index == 0:
map_node.move_child(entity_node, 0) map_node.move_child(entity_node, 0)
elif map_settings.use_groups_hierarchy: elif map_settings.use_groups_hierarchy:
for group in groups: for group in groups:
if entity_data.group.id == group.id: if entity_data.group.id == group.id:
group.node.add_child(entity_node) group.node.add_child(entity_node)
entity_node.owner = scene_root entity_node.owner = scene_root
if entity_data.mesh_instance: if entity_data.mesh_instance:
entity_data.mesh_instance.owner = scene_root entity_data.mesh_instance.owner = scene_root
for shape in entity_data.collision_shapes: for shape in entity_data.collision_shapes:
if shape: if shape:
shape.owner = scene_root shape.owner = scene_root
if entity_data.occluder_instance: if entity_data.occluder_instance:
entity_data.occluder_instance.owner = scene_root entity_data.occluder_instance.owner = scene_root
apply_entity_properties(entity_node, entity_data) apply_entity_properties(entity_node, entity_data)
declare_step.emit("Entity assembly and property application complete") declare_step.emit("Entity assembly and property application complete")

View File

@@ -321,6 +321,7 @@ func generate_entity_surfaces(entity_index: int) -> void:
var current_metadata_index: int = 0 var current_metadata_index: int = 0
var texture_names_metadata: Array[StringName] = [] var texture_names_metadata: Array[StringName] = []
var textures_metadata: PackedInt32Array = [] var textures_metadata: PackedInt32Array = []
var uv_metadata: PackedVector2Array = []
var vertices_metadata: PackedVector3Array = [] var vertices_metadata: PackedVector3Array = []
var normals_metadata: PackedVector3Array = [] var normals_metadata: PackedVector3Array = []
var positions_metadata: PackedVector3Array = [] var positions_metadata: PackedVector3Array = []
@@ -371,7 +372,6 @@ func generate_entity_surfaces(entity_index: int) -> void:
# Begin fresh index offset for this subarray # Begin fresh index offset for this subarray
var index_offset: int = 0 var index_offset: int = 0
for face in faces: for face in faces:
# FACE SCOPE BEGIN # FACE SCOPE BEGIN
@@ -423,6 +423,13 @@ func generate_entity_surfaces(entity_index: int) -> void:
face_index_metadata_map[face] = PackedInt32Array(range(current_metadata_index, current_metadata_index + num_tris)) face_index_metadata_map[face] = PackedInt32Array(range(current_metadata_index, current_metadata_index + num_tris))
current_metadata_index += num_tris current_metadata_index += num_tris
# ADD UV METADATA
for i in face.indices:
var v = face.vertices[i]
var tx_sz: Vector2 = texture_sizes.get(face.texture, Vector2.ONE * map_settings.inverse_scale_factor)
uv_metadata.append(FuncGodotUtil.get_face_vertex_uv(v, face, tx_sz))
print(uv_metadata)
# Append face data to surface array # Append face data to surface array
for i in face.vertices.size(): for i in face.vertices.size():
# TODO: Mesh metadata may be generated here. # TODO: Mesh metadata may be generated here.
@@ -470,6 +477,7 @@ func generate_entity_surfaces(entity_index: int) -> void:
entity.mesh_metadata["normals"] = normals_metadata entity.mesh_metadata["normals"] = normals_metadata
if def.add_face_position_metadata: if def.add_face_position_metadata:
entity.mesh_metadata["positions"] = positions_metadata entity.mesh_metadata["positions"] = positions_metadata
entity.mesh_metadata["uvs"] = uv_metadata
entity.mesh = mesh entity.mesh = mesh

View File

@@ -1,146 +1,146 @@
@tool @tool
@icon("res://addons/func_godot/icons/icon_slipgate3d.svg") @icon("res://addons/func_godot/icons/icon_slipgate3d.svg")
class_name FuncGodotMap extends Node3D class_name FuncGodotMap extends Node3D
## Scene generator node that parses a [QuakeMapFile] according to its [FuncGodotMapSettings]. ## Scene generator node that parses a [QuakeMapFile] according to its [FuncGodotMapSettings].
## ##
## A scene generator node that parses a [QuakeMapFile]. It uses a [FuncGodotMapSettings] ## A scene generator node that parses a [QuakeMapFile]. It uses a [FuncGodotMapSettings]
## and the [FuncGodotFGDFile] contained within in order to determine what is built and how it is built.[br][br] ## and the [FuncGodotFGDFile] contained within in order to determine what is built and how it is built.[br][br]
## If your map is not building correctly, double check your [member map_settings] to make sure you're using ## If your map is not building correctly, double check your [member map_settings] to make sure you're using
## the correct [FuncGodotMapSettings]. ## the correct [FuncGodotMapSettings].
const _SIGNATURE: String = "[MAP]" const _SIGNATURE: String = "[MAP]"
## Bitflag settings that control various aspects of the build process. ## Bitflag settings that control various aspects of the build process.
enum BuildFlags { enum BuildFlags {
UNWRAP_UV2 = 1 << 0, ## Unwrap UV2s during geometry generation for lightmap baking. UNWRAP_UV2 = 1 << 0, ## Unwrap UV2s during geometry generation for lightmap baking.
SHOW_PROFILE_INFO = 1 << 1, ## Print build step information during build process. SHOW_PROFILE_INFO = 1 << 1, ## Print build step information during build process.
DISABLE_SMOOTHING = 1 << 2 ## Force disable processing of vertex normal smooth shading. DISABLE_SMOOTHING = 1 << 2 ## Force disable processing of vertex normal smooth shading.
} }
## Emitted when the build process fails. ## Emitted when the build process fails.
signal build_failed signal build_failed
## Emitted when the build process succesfully completes. ## Emitted when the build process succesfully completes.
signal build_complete signal build_complete
@export_tool_button("Build Map","CollisionShape3D") var _build_func: Callable = build @export_tool_button("Build Map","CollisionShape3D") var _build_func: Callable = build
@export_tool_button("Clear Map","Skeleton3D") var _clear_func: Callable = clear_children @export_tool_button("Clear Map","Skeleton3D") var _clear_func: Callable = clear_children
@export_category("Map") @export_category("Map")
## Local path to MAP or VMF file to build a scene from. ## Local path to MAP or VMF file to build a scene from.
@export_file("*.map","*.vmf") var local_map_file: String = "" @export_file("*.map","*.vmf") var local_map_file: String = ""
## Global path to MAP or VMF file to build a scene from. Overrides [member FuncGodotMap.local_map_file]. ## Global path to MAP or VMF file to build a scene from. Overrides [member FuncGodotMap.local_map_file].
@export_global_file("*.map","*.vmf") var global_map_file: String = "" @export_global_file("*.map","*.vmf") var global_map_file: String = ""
# Map path used by code. Do it this way to support both global and local paths. # Map path used by code. Do it this way to support both global and local paths.
var _map_file_internal: String = "" var _map_file_internal: String = ""
## Map settings resource that defines map build scale, textures location, entity definitions, and more. ## Map settings resource that defines map build scale, textures location, entity definitions, and more.
@export var map_settings: FuncGodotMapSettings = load(ProjectSettings.get_setting("func_godot/default_map_settings", "res://addons/func_godot/func_godot_default_map_settings.tres")) @export var map_settings: FuncGodotMapSettings = load(ProjectSettings.get_setting("func_godot/default_map_settings", "res://addons/func_godot/func_godot_default_map_settings.tres"))
@export_category("Build") @export_category("Build")
## [enum BuildFlags] that can affect certain aspects of the build process. ## [enum BuildFlags] that can affect certain aspects of the build process.
@export_flags("Unwrap UV2:1", "Show Profiling Info:2", "Disable Smooth Shading:4") var build_flags: int = 0 @export_flags("Unwrap UV2:1", "Show Profiling Info:2", "Disable Smooth Shading:4") var build_flags: int = 0
## Map build failure handler. Displays error message and emits [signal build_failed] signal. ## Map build failure handler. Displays error message and emits [signal build_failed] signal.
func fail_build(reason: String, notify: bool = false) -> void: func fail_build(reason: String, notify: bool = false) -> void:
push_error(_SIGNATURE, " ", reason) push_error(_SIGNATURE, " ", reason)
if notify: if notify:
build_failed.emit() build_failed.emit()
## Frees all children of the map node.[br] ## Frees all children of the map node.[br]
## [b][color=yellow]Warning:[/color][/b] This does not distinguish between nodes generated in the FuncGodot build process and other user created nodes. ## [b][color=yellow]Warning:[/color][/b] This does not distinguish between nodes generated in the FuncGodot build process and other user created nodes.
func clear_children() -> void: func clear_children() -> void:
for child in get_children(): for child in get_children():
remove_child(child) remove_child(child)
child.queue_free() child.queue_free()
## Checks if a [QuakeMapFile] for the build process is provided and can be found. ## Checks if a [QuakeMapFile] for the build process is provided and can be found.
func verify() -> Error: func verify() -> Error:
# Prioritize global map file path for building at runtime # Prioritize global map file path for building at runtime
_map_file_internal = global_map_file if global_map_file != "" else local_map_file _map_file_internal = global_map_file if global_map_file != "" else local_map_file
if _map_file_internal.is_empty(): if _map_file_internal.is_empty():
fail_build("Cannot build empty map file.") fail_build("Cannot build empty map file.")
return ERR_INVALID_PARAMETER return ERR_INVALID_PARAMETER
# Retrieve real path if needed # Retrieve real path if needed
if _map_file_internal.begins_with("uid://"): if _map_file_internal.begins_with("uid://"):
var uid := ResourceUID.text_to_id(_map_file_internal) var uid := ResourceUID.text_to_id(_map_file_internal)
if not ResourceUID.has_id(uid): if not ResourceUID.has_id(uid):
fail_build("Error: failed to retrieve path for UID (%s)" % _map_file_internal) fail_build("Error: failed to retrieve path for UID (%s)" % _map_file_internal)
return ERR_DOES_NOT_EXIST return ERR_DOES_NOT_EXIST
_map_file_internal = ResourceUID.get_id_path(uid) _map_file_internal = ResourceUID.get_id_path(uid)
if not FileAccess.file_exists(_map_file_internal): if not FileAccess.file_exists(_map_file_internal):
if not FileAccess.file_exists(_map_file_internal + ".import"): if not FileAccess.file_exists(_map_file_internal + ".import"):
fail_build("Map file %s does not exist." % _map_file_internal) fail_build("Map file %s does not exist." % _map_file_internal)
return ERR_DOES_NOT_EXIST return ERR_DOES_NOT_EXIST
return OK return OK
## Builds the [member global_map_file]. If not set, builds the [member local_map_file]. ## Builds the [member global_map_file]. If not set, builds the [member local_map_file].
## First cleans the map node of any children, then creates a [FuncGodotParser], [FuncGodotGeometryGenerator] ## First cleans the map node of any children, then creates a [FuncGodotParser], [FuncGodotGeometryGenerator]
## and [FuncGodotEntityAssembler] to parse and generate the map. ## and [FuncGodotEntityAssembler] to parse and generate the map.
func build() -> void: func build() -> void:
var time_elapsed: float = Time.get_ticks_msec() var time_elapsed: float = Time.get_ticks_msec()
if build_flags & BuildFlags.SHOW_PROFILE_INFO: if build_flags & BuildFlags.SHOW_PROFILE_INFO:
FuncGodotUtil.print_profile_info("Building...", _SIGNATURE) FuncGodotUtil.print_profile_info("Building...", _SIGNATURE)
clear_children() clear_children()
var verify_err: Error = verify() var verify_err: Error = verify()
if verify_err != OK: if verify_err != OK:
fail_build("Verification failed: %s. Aborting map build" % error_string(verify_err), true) fail_build("Verification failed: %s. Aborting map build" % error_string(verify_err), true)
return return
if not map_settings: if not map_settings:
push_warning("Map assembler does not have a map settings provided and will use default map settings.") push_warning("Map assembler does not have a map settings provided and will use default map settings.")
load(ProjectSettings.get_setting("func_godot/default_map_settings", "res://addons/func_godot/func_godot_default_map_settings.tres")) load(ProjectSettings.get_setting("func_godot/default_map_settings", "res://addons/func_godot/func_godot_default_map_settings.tres"))
# Parse and collect map data # Parse and collect map data
var parser := FuncGodotParser.new() var parser := FuncGodotParser.new()
if build_flags & BuildFlags.SHOW_PROFILE_INFO: if build_flags & BuildFlags.SHOW_PROFILE_INFO:
print("\nPARSER") print("\nPARSER")
parser.declare_step.connect(FuncGodotUtil.print_profile_info.bind(parser._SIGNATURE)) parser.declare_step.connect(FuncGodotUtil.print_profile_info.bind(parser._SIGNATURE))
var parse_data: FuncGodotData.ParseData = parser.parse_map_data(_map_file_internal, map_settings) var parse_data: FuncGodotData.ParseData = parser.parse_map_data(_map_file_internal, map_settings)
if parse_data.entities.is_empty(): if parse_data.entities.is_empty():
return # Already printed failure message in parser, just return here return # Already printed failure message in parser, just return here
var entities: Array[FuncGodotData.EntityData] = parse_data.entities var entities: Array[FuncGodotData.EntityData] = parse_data.entities
var groups: Array[FuncGodotData.GroupData] = parse_data.groups var groups: Array[FuncGodotData.GroupData] = parse_data.groups
# Free up some memory now that we have the data # Free up some memory now that we have the data
parser = null parser = null
# Retrieve geometry # Retrieve geometry
var generator := FuncGodotGeometryGenerator.new(map_settings) var generator := FuncGodotGeometryGenerator.new(map_settings)
if build_flags & BuildFlags.SHOW_PROFILE_INFO: if build_flags & BuildFlags.SHOW_PROFILE_INFO:
print("\nGEOMETRY GENERATOR") print("\nGEOMETRY GENERATOR")
generator.declare_step.connect(FuncGodotUtil.print_profile_info.bind(generator._SIGNATURE)) generator.declare_step.connect(FuncGodotUtil.print_profile_info.bind(generator._SIGNATURE))
# Generate surface and shape data # Generate surface and shape data
var generate_error := generator.build(build_flags, entities) var generate_error := generator.build(build_flags, entities)
if generate_error != OK: if generate_error != OK:
fail_build("Geometry generation failed: %s" % error_string(generate_error)) fail_build("Geometry generation failed: %s" % error_string(generate_error))
return return
# Assemble entities and groups # Assemble entities and groups
var assembler := FuncGodotEntityAssembler.new(map_settings) var assembler := FuncGodotEntityAssembler.new(map_settings)
if build_flags & BuildFlags.SHOW_PROFILE_INFO: if build_flags & BuildFlags.SHOW_PROFILE_INFO:
print("\nENTITY ASSEMBLER") print("\nENTITY ASSEMBLER")
assembler.declare_step.connect(FuncGodotUtil.print_profile_info.bind(assembler._SIGNATURE)) assembler.declare_step.connect(FuncGodotUtil.print_profile_info.bind(assembler._SIGNATURE))
assembler.build(self, entities, groups) assembler.build(self, entities, groups)
time_elapsed = Time.get_ticks_msec() - time_elapsed time_elapsed = Time.get_ticks_msec() - time_elapsed
if build_flags & BuildFlags.SHOW_PROFILE_INFO: if build_flags & BuildFlags.SHOW_PROFILE_INFO:
print("\nCompleted in %s seconds" % (time_elapsed / 1000.0)) print("\nCompleted in %s seconds" % (time_elapsed / 1000.0))
if build_flags & BuildFlags.SHOW_PROFILE_INFO: if build_flags & BuildFlags.SHOW_PROFILE_INFO:
print("") print("")
FuncGodotUtil.print_profile_info("Build complete", _SIGNATURE) FuncGodotUtil.print_profile_info("Build complete", _SIGNATURE)
build_complete.emit() build_complete.emit()

Binary file not shown.

View File

@@ -0,0 +1,42 @@
[remap]
importer="scene"
importer_version=1
type="PackedScene"
uid="uid://dgw06me4h5oxg"
path="res://.godot/imported/9mmbullet.glb-08fa90d0ac9f92cf2f79e93940481a63.scn"
[deps]
source_file="res://assets/models/9mm_bullet/9mmbullet.glb"
dest_files=["res://.godot/imported/9mmbullet.glb-08fa90d0ac9f92cf2f79e93940481a63.scn"]
[params]
nodes/root_type=""
nodes/root_name=""
nodes/root_script=null
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

Binary file not shown.

After

Width:  |  Height:  |  Size: 2.0 MiB

View File

@@ -0,0 +1,44 @@
[remap]
importer="texture"
type="CompressedTexture2D"
uid="uid://cndcfcwu6kc3m"
path.s3tc="res://.godot/imported/9mmbullet_AORoughnessMetal.png-d39a736faebc99b118eacd21e4401fbf.s3tc.ctex"
metadata={
"imported_formats": ["s3tc_bptc"],
"vram_texture": true
}
generator_parameters={
"md5": "c44e0919528fbe67cd51c60bebb57656"
}
[deps]
source_file="res://assets/models/9mm_bullet/9mmbullet_AORoughnessMetal.png"
dest_files=["res://.godot/imported/9mmbullet_AORoughnessMetal.png-d39a736faebc99b118eacd21e4401fbf.s3tc.ctex"]
[params]
compress/mode=2
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=8
roughness/src_normal="res://assets/models/9mm_bullet/9mmbullet_Normal.png"
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=0

Binary file not shown.

After

Width:  |  Height:  |  Size: 515 KiB

View File

@@ -0,0 +1,44 @@
[remap]
importer="texture"
type="CompressedTexture2D"
uid="uid://xi6j7dju4ogx"
path.s3tc="res://.godot/imported/9mmbullet_BaseColor.png-eda905325610325ff7a1e4b3e05065c5.s3tc.ctex"
metadata={
"imported_formats": ["s3tc_bptc"],
"vram_texture": true
}
generator_parameters={
"md5": "a98860476b04dc276cd7a0b40a5e28ef"
}
[deps]
source_file="res://assets/models/9mm_bullet/9mmbullet_BaseColor.png"
dest_files=["res://.godot/imported/9mmbullet_BaseColor.png-eda905325610325ff7a1e4b3e05065c5.s3tc.ctex"]
[params]
compress/mode=2
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=0

Binary file not shown.

After

Width:  |  Height:  |  Size: 371 KiB

View File

@@ -0,0 +1,44 @@
[remap]
importer="texture"
type="CompressedTexture2D"
uid="uid://sjkw4fe2mcvm"
path.s3tc="res://.godot/imported/9mmbullet_Normal.png-0fdb4f7e4b8191fc5d65179f440a90a7.s3tc.ctex"
metadata={
"imported_formats": ["s3tc_bptc"],
"vram_texture": true
}
generator_parameters={
"md5": "c40796455614717c9c461d32f8b4f0a8"
}
[deps]
source_file="res://assets/models/9mm_bullet/9mmbullet_Normal.png"
dest_files=["res://.godot/imported/9mmbullet_Normal.png-0fdb4f7e4b8191fc5d65179f440a90a7.s3tc.ctex"]
[params]
compress/mode=2
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=1
compress/channel_pack=0
mipmaps/generate=true
mipmaps/limit=-1
roughness/mode=1
roughness/src_normal="res://assets/models/9mm_bullet/9mmbullet_Normal.png"
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=0

Binary file not shown.

View File

@@ -0,0 +1,42 @@
[remap]
importer="scene"
importer_version=1
type="PackedScene"
uid="uid://04ag2c3lcicg"
path="res://.godot/imported/soup_can.glb-789b0529ee38a7f623de5835c9b37487.scn"
[deps]
source_file="res://assets/models/soup_can/soup_can.glb"
dest_files=["res://.godot/imported/soup_can.glb-789b0529ee38a7f623de5835c9b37487.scn"]
[params]
nodes/root_type=""
nodes/root_name=""
nodes/root_script=null
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=false
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

Binary file not shown.

After

Width:  |  Height:  |  Size: 707 KiB

View File

@@ -0,0 +1,44 @@
[remap]
importer="texture"
type="CompressedTexture2D"
uid="uid://ck5tahw45mdyg"
path.s3tc="res://.godot/imported/soup_can_AORoughMetal.png-43e2632063d2d19b56c9d0c621da1d76.s3tc.ctex"
metadata={
"imported_formats": ["s3tc_bptc"],
"vram_texture": true
}
generator_parameters={
"md5": "35b96d6af8c926765a1b0dfedb661ac0"
}
[deps]
source_file="res://assets/models/soup_can/soup_can_AORoughMetal.png"
dest_files=["res://.godot/imported/soup_can_AORoughMetal.png-43e2632063d2d19b56c9d0c621da1d76.s3tc.ctex"]
[params]
compress/mode=2
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=0

Binary file not shown.

After

Width:  |  Height:  |  Size: 368 KiB

View File

@@ -0,0 +1,44 @@
[remap]
importer="texture"
type="CompressedTexture2D"
uid="uid://dfacteo6e26uj"
path.s3tc="res://.godot/imported/soup_can_BaseColor.png-6727e8f8d3ac7d832b3d936fe9e3ce00.s3tc.ctex"
metadata={
"imported_formats": ["s3tc_bptc"],
"vram_texture": true
}
generator_parameters={
"md5": "1860f397e89d1e452194ed3fd622504d"
}
[deps]
source_file="res://assets/models/soup_can/soup_can_BaseColor.png"
dest_files=["res://.godot/imported/soup_can_BaseColor.png-6727e8f8d3ac7d832b3d936fe9e3ce00.s3tc.ctex"]
[params]
compress/mode=2
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=0

Binary file not shown.

After

Width:  |  Height:  |  Size: 201 KiB

View File

@@ -0,0 +1,44 @@
[remap]
importer="texture"
type="CompressedTexture2D"
uid="uid://ct7pciueuljsr"
path.s3tc="res://.godot/imported/soup_can_Normal.png-ecfc9a38b9ec7072ea5bc1197d66919c.s3tc.ctex"
metadata={
"imported_formats": ["s3tc_bptc"],
"vram_texture": true
}
generator_parameters={
"md5": "eeb4f586a588a0287b05a6d4499c3676"
}
[deps]
source_file="res://assets/models/soup_can/soup_can_Normal.png"
dest_files=["res://.godot/imported/soup_can_Normal.png-ecfc9a38b9ec7072ea5bc1197d66919c.s3tc.ctex"]
[params]
compress/mode=2
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=1
compress/channel_pack=0
mipmaps/generate=true
mipmaps/limit=-1
roughness/mode=1
roughness/src_normal="res://assets/models/soup_can/soup_can_Normal.png"
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=0

View File

@@ -10,23 +10,47 @@ enum ExtrudeDirection {
@export_category("TrechBroom Generated Values") @export_category("TrechBroom Generated Values")
@export var verts2d: PackedVector2Array @export var verts2d: PackedVector2Array
@export var meshInstance3d: MeshInstance3D @export var meshInstance3d: MeshInstance3D
@export var extrusion_direction: ExtrudeDirection
@export var depth: float = 0.1 @export var depth: float = 0.1
@export var depth_position_offset: Vector3 = Vector3.ZERO @export var original_vertices = PackedVector3Array()
@export var original_normals = PackedVector3Array()
@export var original_uvs = PackedVector2Array()
@export_category("TrechBroom User Values")
@export var extrusion_direction: ExtrudeDirection
@export var hole_proximity: float
@export var edge_non_fracture: float = 0.1 @export var edge_non_fracture: float = 0.1
@onready var parentNode = get_node("..")
var parentNode
var inner_rtree: RectangleTree
var outer_polygon: PackedVector2Array var outer_polygon: PackedVector2Array
var inner_polygons: Array[PackedVector2Array] var inner_polygons: Holes
var static_body: StaticBody3D var static_body: StaticBody3D
func _ready() -> void:
if Engine.is_editor_hint():
return
parentNode = get_node("..")
inner_polygons = Holes.new()
inner_rtree = RectangleTree.new()
outer_polygon = verts2d
_draw()
func _exit_tree() -> void:
if Engine.is_editor_hint():
return
inner_rtree.free()
func _func_godot_apply_properties(entity_properties: Dictionary) -> void: func _func_godot_apply_properties(entity_properties: Dictionary) -> void:
meshInstance3d = _find_mesh_body() meshInstance3d = _find_mesh_body()
var verticies = meshInstance3d.mesh.surface_get_arrays(0)[Mesh.ARRAY_VERTEX] var verticies = meshInstance3d.mesh.surface_get_arrays(0)[Mesh.ARRAY_VERTEX]
original_vertices = self.get_meta("func_godot_mesh_data")["vertices"]
original_normals = self.get_meta("func_godot_mesh_data")["normals"]
original_uvs = self.get_meta("func_godot_mesh_data")["uvs"]
extrusion_direction = entity_properties["extrude_direction"] extrusion_direction = entity_properties["extrude_direction"]
hole_proximity = entity_properties["hole_proximity"]
edge_non_fracture = entity_properties["edge_non_fractured"]
var depth_min: float var depth_min: float
var depth_max: float var depth_max: float
@@ -43,8 +67,6 @@ func _func_godot_apply_properties(entity_properties: Dictionary) -> void:
elif d < depth_min: elif d < depth_min:
depth_min = d depth_min = d
depth = -(abs(depth_min) + abs(depth_max)) depth = -(abs(depth_min) + abs(depth_max))
depth_position_offset = -(Vector3.BACK * (depth/2))
elif extrusion_direction == ExtrudeDirection.RIGHT: elif extrusion_direction == ExtrudeDirection.RIGHT:
for vert in verticies: for vert in verticies:
verts_2d.append(Vector2(vert.z, vert.y)) verts_2d.append(Vector2(vert.z, vert.y))
@@ -56,8 +78,6 @@ func _func_godot_apply_properties(entity_properties: Dictionary) -> void:
elif d < depth_min: elif d < depth_min:
depth_min = d depth_min = d
depth = -(abs(depth_min) + abs(depth_max)) depth = -(abs(depth_min) + abs(depth_max))
depth_position_offset = Vector3.RIGHT * (depth/2)
elif extrusion_direction == ExtrudeDirection.UP: elif extrusion_direction == ExtrudeDirection.UP:
for vert in verticies: for vert in verticies:
verts_2d.append(Vector2(vert.x, vert.z)) verts_2d.append(Vector2(vert.x, vert.z))
@@ -69,57 +89,50 @@ func _func_godot_apply_properties(entity_properties: Dictionary) -> void:
elif d < depth_min: elif d < depth_min:
depth_min = d depth_min = d
depth = -(abs(depth_min) + abs(depth_max)) depth = -(abs(depth_min) + abs(depth_max))
depth_position_offset = (Vector3.UP * (depth/2))
var outer_boudary = Geometry2D.convex_hull(verts_2d) var outer_boudary = Geometry2D.convex_hull(verts_2d)
verts2d = outer_boudary verts2d = outer_boudary
func _ready() -> void:
if Engine.is_editor_hint():
return
outer_polygon = verts2d
_draw()
func _draw(): func _draw():
var vector_indexes = GeoPolyTriangulization.triangulate(outer_polygon, inner_polygons) var vector_indexes = GeoPolyTriangulization.triangulate(outer_polygon, inner_polygons.get_holes())
var vectors = [] var vectors = []
vectors.append_array(outer_polygon) vectors.append_array(outer_polygon)
for ip in inner_polygons: vectors.append_array(inner_polygons.get_hole_verticies())
vectors.append_array(ip)
var meshGenerator = GeoPolyMesh.new(vector_indexes, vectors, extrusion_direction, depth) var meshGenerator = GeoPolyMesh.new(vector_indexes, vectors, extrusion_direction, original_vertices, original_uvs, original_normals, depth)
var commited_mesh = meshGenerator.commit_mesh(meshInstance3d.get_active_material(0)) var commited_mesh = meshGenerator.commit_mesh(meshInstance3d.get_active_material(0))
meshGenerator.free() meshGenerator.free()
meshInstance3d.mesh = commited_mesh meshInstance3d.mesh = commited_mesh
meshInstance3d.position += depth_position_offset
meshInstance3d.create_trimesh_collision() meshInstance3d.create_trimesh_collision()
static_body = _find_static_body() static_body = _find_static_body()
func _re_draw(): func _re_draw():
var vector_indexes = GeoPolyTriangulization.triangulate(outer_polygon, inner_polygons.get_holes())
var vectors = []
vectors.append_array(outer_polygon)
vectors.append_array(inner_polygons.get_hole_verticies())
WorkerThreadPool.add_task(_generate_mesh.bind(vector_indexes, vectors))
func _deffered_draw(mesh: Mesh, task_id: int):
if task_id:
WorkerThreadPool.wait_for_task_completion(task_id)
meshInstance3d.remove_child(static_body) meshInstance3d.remove_child(static_body)
static_body.queue_free() static_body.queue_free()
meshInstance3d.mesh = mesh
var vector_indexes = GeoPolyTriangulization.triangulate(outer_polygon, inner_polygons)
var vectors = []
vectors.append_array(outer_polygon)
for ip in inner_polygons:
vectors.append_array(ip)
var meshGenerator = GeoPolyMesh.new(vector_indexes, vectors, extrusion_direction, depth)
var commited_mesh = meshGenerator.commit_mesh(meshInstance3d.get_active_material(0))
meshGenerator.free()
meshInstance3d.mesh = commited_mesh
meshInstance3d.create_trimesh_collision() meshInstance3d.create_trimesh_collision()
static_body = _find_static_body() static_body = _find_static_body()
func _generate_mesh(vector_indexes: PackedInt32Array, vectors: PackedVector2Array):
var meshGenerator = GeoPolyMesh.new(vector_indexes, vectors, extrusion_direction, original_vertices, original_uvs, original_normals, depth)
var commited_mesh = meshGenerator.commit_mesh(meshInstance3d.get_active_material(0))
meshGenerator.free()
self.call_deferred("_deffered_draw", commited_mesh, WorkerThreadPool.get_caller_task_id())
func hit(position: Vector3): func hit(position: Vector3):
var cutter = Cutter.circleCutter() var cutter = Cutter.circleCutter()
@@ -135,13 +148,18 @@ func hit(position: Vector3):
# translate the cutter # translate the cutter
var hole_vectors = Transform2D(0, hole_vector2_offset) * cutter var hole_vectors = Transform2D(0, hole_vector2_offset) * cutter
var draw = _add_hole(hole_vectors) var draw = _add_hole(hole_vectors)
if draw: if draw:
_re_draw() _re_draw()
func _add_hole(new_hole: PackedVector2Array) -> bool: func _add_hole(new_hole: PackedVector2Array) -> bool:
var values_to_remove = [] var ids_to_remove = []
var holes_id = []
for vector in new_hole:
holes_id.append_array(inner_rtree.query(vector))
# validate that the hole is valid # validate that the hole is valid
var boundary_polygon = Geometry2D.offset_polygon(outer_polygon, -edge_non_fracture) var boundary_polygon = Geometry2D.offset_polygon(outer_polygon, -edge_non_fracture)
@@ -151,24 +169,46 @@ func _add_hole(new_hole: PackedVector2Array) -> bool:
return false return false
var merged: PackedVector2Array = boundary_hole[0] var merged: PackedVector2Array = boundary_hole[0]
for index in range(len(self.inner_polygons)):
var result = Geometry2D.merge_polygons(merged, self.inner_polygons[index]) for id in holes_id:
var result = Geometry2D.merge_polygons(merged, inner_polygons.get_hole(id).vectors)
if len(result) == 1: if len(result) == 1:
merged = result[0] merged = result[0]
values_to_remove.append(self.inner_polygons[index]) ids_to_remove.append(id)
elif len(result) > 1: elif len(result) > 1:
# need to check that they have no overlapping area if they do clip # need to check that they have no overlapping area if they do clip
var overlap = Geometry2D.intersect_polygons(result[0], result[1]) var overlap = Geometry2D.intersect_polygons(result[0], result[1])
if len(overlap) != 0: if len(overlap) != 0:
merged = Geometry2D.clip_polygons(result[0], result[1])[0] merged = Geometry2D.clip_polygons(result[0], result[1])[0]
values_to_remove.append(self.inner_polygons[index]) ids_to_remove.append(id)
for i in values_to_remove: for id in ids_to_remove:
inner_polygons.erase(i) inner_rtree.remove(id)
inner_polygons.remove_hole(id)
inner_polygons.append(merged) var hole = inner_polygons.add_hole(merged)
var bound_rect = UTIL.get_bounding_rect(merged)
inner_rtree.add(bound_rect.position, bound_rect.end, hole.hole_id)
var hole_prox_boundary = bound_rect.grow(hole.area * 4)
var prox_holes_ids = inner_rtree.query_rect(hole_prox_boundary.position, hole_prox_boundary.end)
# any holes that are close in proximity convex hull
if len(prox_holes_ids) <= 1: # needs to be length 2 or more because it will always return the hole just created
return true
var proxmity_hole_vectors = []
for id in prox_holes_ids:
proxmity_hole_vectors.append_array(inner_polygons.get_hole(id).vectors)
inner_rtree.remove(id)
inner_polygons.remove_hole(id)
var convex_vectors = Geometry2D.convex_hull(proxmity_hole_vectors)
hole = inner_polygons.add_hole(convex_vectors)
bound_rect = UTIL.get_bounding_rect(convex_vectors)
inner_rtree.add(bound_rect.position, bound_rect.end, hole.hole_id)
return true return true

View File

@@ -0,0 +1,29 @@
extends RefCounted
class_name Faces
var faces: Array[Face]
func _init(verts: PackedVector3Array, uvs: PackedVector2Array, normals: PackedVector3Array) -> void:
assert(len(verts) == len(uvs), "number of verts vs uvs do not match")
assert(len(normals)*3 == len(verts), "missing normal data")
for i in range(0, len(normals)):
var start_index = i*3
var v0 = verts[start_index]
var v1 = verts[start_index+1]
var v2 = verts[start_index+2]
var varray = PackedVector3Array([v0, v1, v2])
var u0 = uvs[start_index]
var u1 = uvs[start_index+1]
var u2 = uvs[start_index+2]
var uarray = PackedVector2Array([u0, u1, u2])
self.faces.append(Face.new(varray, uarray, normals[i]))
func get_faces() -> Array[Face]:
return faces

View File

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

View File

@@ -9,6 +9,8 @@ var uvs = PackedVector2Array()
var normals = PackedVector3Array() var normals = PackedVector3Array()
var array_mesh = ArrayMesh.new() var array_mesh = ArrayMesh.new()
var original_face_data: Faces
var _v_indexes = [] var _v_indexes = []
var _v_points = [] var _v_points = []
@@ -17,24 +19,25 @@ var edges = {}
var depth_vector: Vector3 var depth_vector: Vector3
var extrude_direction: DestructableWall.ExtrudeDirection var extrude_direction: DestructableWall.ExtrudeDirection
func _init(vector_indexes: PackedInt32Array, vector_points: PackedVector2Array, extrude_direction: DestructableWall.ExtrudeDirection, depth: float = -0.1): func _init(vector_indexes: PackedInt32Array, vector_points: PackedVector2Array, extrude_direction: DestructableWall.ExtrudeDirection, original_vectors: PackedVector3Array, original_uvs: PackedVector2Array, original_normals: PackedVector3Array, depth: float = -0.1):
assert(len(vector_indexes) % 3 == 0 && len(vector_indexes) != 0, "Number of vertex points is not divisible by 3, invalid triangle verticies") assert(len(vector_indexes) % 3 == 0 && len(vector_indexes) != 0, "Number of vertex points is not divisible by 3, invalid triangle verticies")
surface_array.resize(Mesh.ARRAY_MAX) surface_array.resize(Mesh.ARRAY_MAX)
original_face_data = Faces.new(original_vectors, original_uvs, original_normals)
self._v_indexes = vector_indexes self._v_indexes = vector_indexes
self.extrude_direction = extrude_direction self.extrude_direction = extrude_direction
if extrude_direction == DestructableWall.ExtrudeDirection.BACK: if extrude_direction == DestructableWall.ExtrudeDirection.BACK:
for point in vector_points:
self._v_points.append(Vector3(point.x, point.y, 0))
depth_vector = Vector3.BACK * depth depth_vector = Vector3.BACK * depth
elif extrude_direction == DestructableWall.ExtrudeDirection.RIGHT:
for point in vector_points: for point in vector_points:
self._v_points.append(Vector3(0, point.y, point.x)) self._v_points.append(Vector3(point.x, point.y, -depth/2))
depth_vector = -Vector3.RIGHT * depth elif extrude_direction == DestructableWall.ExtrudeDirection.RIGHT:
depth_vector = Vector3.LEFT * depth
for point in vector_points:
self._v_points.append(Vector3(depth/2, point.y, point.x))
elif extrude_direction == DestructableWall.ExtrudeDirection.UP: elif extrude_direction == DestructableWall.ExtrudeDirection.UP:
for point in vector_points: for point in vector_points:
self._v_points.append(Vector3(point.x, 0, point.y)) self._v_points.append(Vector3(point.x, depth/2, point.y))
depth_vector = Vector3.DOWN * depth depth_vector = Vector3.DOWN * depth
@@ -71,6 +74,38 @@ func _pre_process_edges():
else: else:
self.edges[[min_index, max_index]] += 1 self.edges[[min_index, max_index]] += 1
func in_triag(u, v, w):
return u >= 0 and u <= 1 and v >= 0 and v <= 1 and w >= 0 and w <= 1
func _reduce_significance(value: float):
return snapped(value, 0.0001)
func _new_interpolated_uv_point(new_vector: Vector3, normal: Vector3) -> Vector2:
# get faces that have the same normal e.g faces that the point can fall into
var faces = self.original_face_data.get_faces()
var possible_faces: Array[Face] = []
for f in faces:
if normal.dot(f.normal) > 0.99:
possible_faces.append(f)
for ps in possible_faces:
var ps_face_verts = ps.vectors
var b_points = Geometry3D.get_triangle_barycentric_coords(new_vector, ps_face_verts[0], ps_face_verts[1], ps_face_verts[2])
var u = self._reduce_significance(b_points[0])
var v = self._reduce_significance(b_points[1])
var w = self._reduce_significance(b_points[2])
var uv_coords = ps.uvs
if in_triag(u, v, w):
return (uv_coords[0] * u) + (uv_coords[1] * v) + (uv_coords[2] * w)
# for destructable walls, if we couldn't interpolate a uv, this is fine
return Vector2.ZERO
func get_loops(): func get_loops():
var unvisted_edges = self.get_outline_edge() var unvisted_edges = self.get_outline_edge()
var loops = [] var loops = []
@@ -167,34 +202,16 @@ func _draw_sides():
var n1 = self._calc_triangle_normal(v2, v1, v0) var n1 = self._calc_triangle_normal(v2, v1, v0)
self.verts.append_array([v0, v1, v2, v1, v3, v2]) self.verts.append_array([v0, v1, v2, v1, v3, v2])
_append_uvs4(v0, v1, v2, v3, n1) _append_uvs3(v0, v1, v2, n1)
_append_uvs3(v1, v3, v2, n1)
self.normals.append_array([n1, n1, n1, n1, n1, n1]) self.normals.append_array([n1, n1, n1, n1, n1, n1])
func _append_uvs4(v0: Vector3, v1: Vector3, v2: Vector3, v3: Vector3, normal: Vector3):
if normal == Vector3.BACK or normal == Vector3.FORWARD:
self.uvs.append_array([Vector2(-v0.x, -v0.y), Vector2(-v1.x, -v1.y), Vector2(-v2.x, -v2.y), Vector2(-v1.x, -v1.y), Vector2(-v3.x, -v3.y), Vector2(-v2.x, -v2.y)])
return
elif normal == Vector3.RIGHT or normal == Vector3.LEFT:
self.uvs.append_array([Vector2(-v0.z, -v0.y), Vector2(-v1.z, -v1.y), Vector2(-v2.z, -v2.y), Vector2(-v1.z, -v1.y), Vector2(-v3.z, -v3.y), Vector2(-v2.z, -v2.y)])
return
elif normal == Vector3.UP or normal == Vector3.DOWN:
self.uvs.append_array([Vector2(-v0.x, -v0.z), Vector2(-v1.x, -v1.z), Vector2(-v2.x, -v2.z), Vector2(-v1.x, -v1.z), Vector2(-v3.x, -v3.z), Vector2(-v2.x, -v2.z)])
return
self.uvs.append_array([Vector2(-v0.x, -v0.y), Vector2(-v1.x, -v1.y), Vector2(-v2.x, -v2.y), Vector2(-v1.x, -v1.y), Vector2(-v3.x, -v3.y), Vector2(-v2.x, -v2.y)])
func _append_uvs3(v0: Vector3, v1: Vector3, v2: Vector3, normal: Vector3): func _append_uvs3(v0: Vector3, v1: Vector3, v2: Vector3, normal: Vector3):
if normal == Vector3.BACK or normal == Vector3.FORWARD: var uv0 = self._new_interpolated_uv_point(v0, normal)
self.uvs.append_array([Vector2(-v0.x, -v0.y), Vector2(-v1.x, -v1.y), Vector2(-v2.x, -v2.y)]) var uv1 = self._new_interpolated_uv_point(v1, normal)
return var uv2 = self._new_interpolated_uv_point(v2, normal)
elif normal == Vector3.RIGHT or normal == Vector3.LEFT:
self.uvs.append_array([Vector2(-v0.z, -v0.y), Vector2(-v1.z, -v1.y), Vector2(-v2.z, -v2.y)])
return
elif normal == Vector3.UP or normal == Vector3.DOWN:
self.uvs.append_array([Vector2(-v0.x, -v0.z), Vector2(-v1.x, -v1.z), Vector2(-v2.x, -v2.z)])
return
self.uvs.append_array([Vector2(-v0.x, -v0.y), Vector2(-v1.x, -v1.y), Vector2(-v2.x, -v2.y)]) self.uvs.append_array([uv0, uv1, uv2])
# front face # front face
func _draw_mesh(): func _draw_mesh():
@@ -204,10 +221,9 @@ func _draw_mesh():
var normal = self._calc_triangle_normal(vector3C, vector3B, vector3A) var normal = self._calc_triangle_normal(vector3C, vector3B, vector3A)
self.verts.append_array([vector3A, vector3B, vector3C]) self.verts.append_array([vector3A, vector3B, vector3C])
_append_uvs3(vector3A, vector3B, vector3C, normal) _append_uvs3(vector3A, vector3B, vector3C, normal)
self.normals.append_array([normal, normal, normal]) self.normals.append_array([normal, normal, normal])
# insert each front face into the mesh "clockwise" # insert each front face into the mesh "clockwise"

View File

@@ -0,0 +1,34 @@
extends RefCounted
class_name Holes
var holes: Dictionary[int, Hole]
var counter: int = 0
func _init() -> void:
self.holes = {}
func add_hole(vectors: PackedVector2Array) -> Hole:
var hole = Hole.new(counter, vectors)
self.holes[counter] = hole
counter += 1
return hole
func remove_hole(hole_id: int):
self.holes.erase(hole_id)
func get_hole(hole_id: int) -> Hole:
return self.holes[hole_id]
func get_hole_verticies() -> PackedVector2Array:
var return_val: PackedVector2Array = []
for hole in holes.values():
return_val.append_array(hole.vectors)
return return_val
func get_holes() -> Array[PackedVector2Array]:
var return_val: Array[PackedVector2Array] = []
for hole in holes.values():
return_val.append(hole.vectors)
return return_val

View File

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

View File

@@ -0,0 +1,14 @@
extends Resource
class_name Face
var vectors: PackedVector3Array
var uvs: PackedVector2Array
var normal: Vector3
func _init(vectors: PackedVector3Array, uvs: PackedVector2Array, normal: Vector3):
assert(len(vectors) % 3 == 0, "not a face")
assert(len(uvs) == len(vectors), "missing uvs for vectors")
self.vectors = vectors.duplicate()
self.uvs = uvs.duplicate()
self.normal = normal

View File

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

View File

@@ -0,0 +1,22 @@
extends Resource
class_name Hole
var hole_id: int
var vectors: PackedVector2Array # verticies
var area: float
func _init(hole_id: int, vectors: PackedVector2Array):
self.hole_id = hole_id
self.vectors = vectors
self.area = UTIL.get_polygon_area(self.vectors)
func center():
var avg_vert = Vector2.ZERO
for v in vectors:
avg_vert += v
return avg_vert / len(vectors)

View File

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

View File

@@ -14,3 +14,24 @@ static func chunk_array(arr: Array, chunk_size: int) -> Array:
static func vector2_to_vector3(v: Vector2) -> Vector3: static func vector2_to_vector3(v: Vector2) -> Vector3:
return Vector3(v.x, v.y, 0) return Vector3(v.x, v.y, 0)
static func get_bounding_rect(vectors: PackedVector2Array) -> Rect2:
if vectors.is_empty():
return Rect2()
var rect := Rect2(vectors[0], Vector2.ZERO) # Initialize with the first point
for point in vectors:
rect = rect.expand(point)
# The 'position' of the Rect2 will be the minimum corner
return rect
static func get_polygon_area(vectors: PackedVector2Array) -> float:
var result := 0.0
var num_vertices := vectors.size()
for q in range(num_vertices):
var p = (q - 1 + num_vertices) % num_vertices
result += vectors[q].cross(vectors[p])
return abs(result * 0.5)

Binary file not shown.

Before

Width:  |  Height:  |  Size: 7.9 KiB

Binary file not shown.

Before

Width:  |  Height:  |  Size: 11 KiB

View File

@@ -1,8 +1,9 @@
[gd_scene load_steps=7 format=3 uid="uid://yr0ymw4fpseu"] [gd_scene load_steps=8 format=3 uid="uid://yr0ymw4fpseu"]
[ext_resource type="PackedScene" uid="uid://b2sgheexmeisv" path="res://levels/test.tscn" id="1_htrvu"] [ext_resource type="PackedScene" uid="uid://b2sgheexmeisv" path="res://levels/test.tscn" id="1_htrvu"]
[ext_resource type="PackedScene" uid="uid://bm4jq3rokgbn2" path="res://scenes/environment/world_environment.tscn" id="3_qd0o6"] [ext_resource type="PackedScene" uid="uid://bm4jq3rokgbn2" path="res://scenes/environment/world_environment.tscn" id="3_qd0o6"]
[ext_resource type="PackedScene" uid="uid://dh8v00nh02l1" path="res://scenes/player/player_controller.tscn" id="4_6lfjr"] [ext_resource type="PackedScene" uid="uid://dh8v00nh02l1" path="res://scenes/player/player_controller.tscn" id="4_6lfjr"]
[ext_resource type="PackedScene" uid="uid://04ag2c3lcicg" path="res://assets/models/soup_can/soup_can.glb" id="4_qd0o6"]
[sub_resource type="Animation" id="Animation_q6206"] [sub_resource type="Animation" id="Animation_q6206"]
resource_name = "Camera_Pan" resource_name = "Camera_Pan"
@@ -96,3 +97,6 @@ libraries = {
} }
autoplay = "Camera_Pan" autoplay = "Camera_Pan"
speed_scale = 0.5 speed_scale = 0.5
[node name="soup_can" parent="." instance=ExtResource("4_qd0o6")]
transform = Transform3D(1, 0, 0, 0, 1, 0, 0, 0, 1, 0.9325094, 1.736591, -0.044523656)

View File

@@ -8,7 +8,7 @@
[ext_resource type="Script" uid="uid://42cwsrh6jyns" path="res://assets/scripts/environment/destructable/destructable_wall.gd" id="6_u45fp"] [ext_resource type="Script" uid="uid://42cwsrh6jyns" path="res://assets/scripts/environment/destructable/destructable_wall.gd" id="6_u45fp"]
[ext_resource type="Material" uid="uid://ct5j4aamfudvd" path="res://trenchbroom/textures/tile043.tres" id="7_u45fp"] [ext_resource type="Material" uid="uid://ct5j4aamfudvd" path="res://trenchbroom/textures/tile043.tres" id="7_u45fp"]
[sub_resource type="ArrayMesh" id="ArrayMesh_u45fp"] [sub_resource type="ArrayMesh" id="ArrayMesh_2grjb"]
_surfaces = [{ _surfaces = [{
"aabb": AABB(-7, -0.5001221, -5.5, 14, 1.0001221, 11.5), "aabb": AABB(-7, -0.5001221, -5.5, 14, 1.0001221, 11.5),
"attribute_data": PackedByteArray("AABgwQAAgL8AAGBBAACAvwAAYEEACIA/AABgwQAIgD8AAEBBAAiAPwD/L8EACIA/AP8vwQAAgL8AAEBBAACAvwAAQMEAAGBBAABAwQAAYMEA/y9BAABgwQD/L0EAAGBBAABAQQAAYEEA/y/BAABgQQD/L8EAAGDBAABAQQAAYMEAAEDBAACAvwD/L0EAAIC/AP8vQQAIgD8AAEDBAAiAPwAAYEEACIA/AABgwQAIgD8AAGDBAACAvwAAYEEAAIC/"), "attribute_data": PackedByteArray("AABgwQAAgL8AAGBBAACAvwAAYEEACIA/AABgwQAIgD8AAEBBAAiAPwD/L8EACIA/AP8vwQAAgL8AAEBBAACAvwAAQMEAAGBBAABAwQAAYMEA/y9BAABgwQD/L0EAAGBBAABAQQAAYEEA/y/BAABgQQD/L8EAAGDBAABAQQAAYMEAAEDBAACAvwD/L0EAAIC/AP8vQQAIgD8AAEDBAAiAPwAAYEEACIA/AABgwQAIgD8AAGDBAACAvwAAYEEAAIC/"),
@@ -23,10 +23,10 @@ _surfaces = [{
"vertex_data": PackedByteArray("AADgQAAAAD8AALDAAADgwAAAAD8AALDAAADgwAAIAL8AALDAAADgQAAIAL8AALDAAADgwAAIAL8AAMBAAADgwAAIAL8A/6/AAADgwAAAAD8A/6/AAADgwAAAAD8AAMBAAADgwAAAAL8AAMBAAADgQAAAAL8AAMBAAADgQAAAAL8A/6/AAADgwAAAAL8A/6/AAADgwAAAAD8AAMBAAADgwAAAAD8A/6/AAADgQAAAAD8A/6/AAADgQAAAAD8AAMBAAADgQAAAAD8AAMBAAADgQAAAAD8A/6/AAADgQAAIAL8A/6/AAADgQAAIAL8AAMBAAADgQAAIAL8AAMBAAADgwAAIAL8AAMBAAADgwAAAAD8AAMBAAADgQAAAAD8AAMBA/////wAA/7//////AAD/v/////8AAP+//////wAA/78AAP9//3//vwAA/3//f/+/AAD/f/9//78AAP9//3//v/9/AAD//////38AAP//////fwAA//////9/AAD//////3////9//7//f////3//v/9/////f/+//3////9//7////9//////////3//////////f/////////9///////9//3////+//3//f////7//f/9/////v/9//3////+/") "vertex_data": PackedByteArray("AADgQAAAAD8AALDAAADgwAAAAD8AALDAAADgwAAIAL8AALDAAADgQAAIAL8AALDAAADgwAAIAL8AAMBAAADgwAAIAL8A/6/AAADgwAAAAD8A/6/AAADgwAAAAD8AAMBAAADgwAAAAL8AAMBAAADgQAAAAL8AAMBAAADgQAAAAL8A/6/AAADgwAAAAL8A/6/AAADgwAAAAD8AAMBAAADgwAAAAD8A/6/AAADgQAAAAD8A/6/AAADgQAAAAD8AAMBAAADgQAAAAD8AAMBAAADgQAAAAD8A/6/AAADgQAAIAL8A/6/AAADgQAAIAL8AAMBAAADgQAAIAL8AAMBAAADgwAAIAL8AAMBAAADgwAAAAD8AAMBAAADgQAAAAD8AAMBA/////wAA/7//////AAD/v/////8AAP+//////wAA/78AAP9//3//vwAA/3//f/+/AAD/f/9//78AAP9//3//v/9/AAD//////38AAP//////fwAA//////9/AAD//////3////9//7//f////3//v/9/////f/+//3////9//7////9//////////3//////////f/////////9///////9//3////+//3//f////7//f/9/////v/9//3////+/")
}] }]
[sub_resource type="ConvexPolygonShape3D" id="ConvexPolygonShape3D_2grjb"] [sub_resource type="ConvexPolygonShape3D" id="ConvexPolygonShape3D_qhvcx"]
points = PackedVector3Array(7, 0.5, 6, 7, -0.5, 6, -7, 0.5, 6, -7, -0.5, 6, 7, 0.5, -5.5, 7, -0.5, -5.5, -7, 0.5, -5.5, -7, -0.5, -5.5) points = PackedVector3Array(7, 0.5, 6, 7, -0.5, 6, -7, 0.5, 6, -7, -0.5, 6, 7, 0.5, -5.5, 7, -0.5, -5.5, -7, 0.5, -5.5, -7, -0.5, -5.5)
[sub_resource type="ArrayMesh" id="ArrayMesh_qhvcx"] [sub_resource type="ArrayMesh" id="ArrayMesh_kqvnf"]
_surfaces = [{ _surfaces = [{
"aabb": AABB(-7, -0.50006104, -5.75, 14, 1.0001221, 11.5), "aabb": AABB(-7, -0.50006104, -5.75, 14, 1.0001221, 11.5),
"attribute_data": PackedByteArray("AABgwQAAgL8AAGBBAACAvwAAYEEACIA/AABgwQAIgD8AACBCAAiAPwAAiEEACIA/AACIQQAAgL8AACBCAACAvwAAIMIAAGBBAAAgwgAAYMEAAIjBAABgwQAAiMEAAGBBAAAgQgAAYEEAAIhBAABgQQAAiEEAAGDBAAAgQgAAYMEAACDCAACAvwAAiMEAAIC/AACIwQAIgD8AACDCAAiAPwAAYEEACIA/AABgwQAIgD8AAGDBAACAvwAAYEEAAIC/"), "attribute_data": PackedByteArray("AABgwQAAgL8AAGBBAACAvwAAYEEACIA/AABgwQAIgD8AACBCAAiAPwAAiEEACIA/AACIQQAAgL8AACBCAACAvwAAIMIAAGBBAAAgwgAAYMEAAIjBAABgwQAAiMEAAGBBAAAgQgAAYEEAAIhBAABgQQAAiEEAAGDBAAAgQgAAYMEAACDCAACAvwAAiMEAAIC/AACIwQAIgD8AACDCAAiAPwAAYEEACIA/AABgwQAIgD8AAGDBAACAvwAAYEEAAIC/"),
@@ -41,40 +41,10 @@ _surfaces = [{
"vertex_data": PackedByteArray("AADgQAAEAD8AALjAAADgwAAEAD8AALjAAADgwAAEAL8AALjAAADgQAAEAL8AALjAAADgwAAEAL8AALhAAADgwAAEAL8AALjAAADgwAAEAD8AALjAAADgwAAEAD8AALhAAADgwAD4/74AALhAAADgQAD4/74AALhAAADgQAD4/74AALjAAADgwAD4/74AALjAAADgwAAEAD8AALhAAADgwAAEAD8AALjAAADgQAAEAD8AALjAAADgQAAEAD8AALhAAADgQAAEAD8AALhAAADgQAAEAD8AALjAAADgQAAEAL8AALjAAADgQAAEAL8AALhAAADgQAAEAL8AALhAAADgwAAEAL8AALhAAADgwAAEAD8AALhAAADgQAAEAD8AALhA/////wAA/7//////AAD/v/////8AAP+//////wAA/78AAP9//3//vwAA/3//f/+/AAD/f/9//78AAP9//3//v/9/AAD//////38AAP//////fwAA//////9/AAD//////3////9//7//f////3//v/9/////f/+//3////9//7////9//////////3//////////f/////////9///////9//3////+//3//f////7//f/9/////v/9//3////+/") "vertex_data": PackedByteArray("AADgQAAEAD8AALjAAADgwAAEAD8AALjAAADgwAAEAL8AALjAAADgQAAEAL8AALjAAADgwAAEAL8AALhAAADgwAAEAL8AALjAAADgwAAEAD8AALjAAADgwAAEAD8AALhAAADgwAD4/74AALhAAADgQAD4/74AALhAAADgQAD4/74AALjAAADgwAD4/74AALjAAADgwAAEAD8AALhAAADgwAAEAD8AALjAAADgQAAEAD8AALjAAADgQAAEAD8AALhAAADgQAAEAD8AALhAAADgQAAEAD8AALjAAADgQAAEAL8AALjAAADgQAAEAL8AALhAAADgQAAEAL8AALhAAADgwAAEAL8AALhAAADgwAAEAD8AALhAAADgQAAEAD8AALhA/////wAA/7//////AAD/v/////8AAP+//////wAA/78AAP9//3//vwAA/3//f/+/AAD/f/9//78AAP9//3//v/9/AAD//////38AAP//////fwAA//////9/AAD//////3////9//7//f////3//v/9/////f/+//3////9//7////9//////////3//////////f/////////9///////9//3////+//3//f////7//f/9/////v/9//3////+/")
}] }]
[sub_resource type="ConvexPolygonShape3D" id="ConvexPolygonShape3D_kqvnf"] [sub_resource type="ConvexPolygonShape3D" id="ConvexPolygonShape3D_eudka"]
points = PackedVector3Array(7, 0.50006104, 5.75, 7, -0.49993896, 5.75, -7, 0.50006104, 5.75, -7, -0.49993896, 5.75, 7, 0.50006104, -5.75, 7, -0.49993896, -5.75, -7, 0.50006104, -5.75, -7, -0.49993896, -5.75) points = PackedVector3Array(7, 0.50006104, 5.75, 7, -0.49993896, 5.75, -7, 0.50006104, 5.75, -7, -0.49993896, 5.75, 7, 0.50006104, -5.75, 7, -0.49993896, -5.75, -7, 0.50006104, -5.75, -7, -0.49993896, -5.75)
[sub_resource type="ArrayMesh" id="ArrayMesh_eudka"] [sub_resource type="ArrayMesh" id="ArrayMesh_rmkky"]
_surfaces = [{
"aabb": AABB(-1, -1.5, -0.5, 2, 3, 1),
"attribute_data": PackedByteArray("AACAPwAA4MAAAEDAAADgwAAAQMAAAIC/AACAPwAAgL8AAMDAAACAvwAAgMAAAIC/AACAwAAA4MAAAMDAAADgwAAAwMAAAEBAAADAwAAAgL8AAIDAAACAvwAAgMAAAEBAAADAQAAAQEAAAIBAAABAQAAAgEAAAIC/AADAQAAAgL8AAMBAAADgwAAAgEAAAODAAACAQAAAgL8AAMBAAACAvwAAgL8AAIC/AABAQAAAgL8AAEBAAADgwAAAgL8AAODA"),
"format": 34359742487,
"index_count": 36,
"index_data": PackedByteArray("AAABAAIAAAACAAMABAAFAAYABAAGAAcACAAJAAoACAAKAAsADAANAA4ADAAOAA8AEAARABIAEAASABMAFAAVABYAFAAWABcA"),
"material": ExtResource("7_u45fp"),
"name": "tile043",
"primitive": 3,
"uv_scale": Vector4(0, 0, 0, 0),
"vertex_count": 24,
"vertex_data": PackedByteArray("AACAPwAAwD8AAAC/AACAvwAAwD8AAAC/AACAvwAAwL8AAAC/AACAPwAAwL8AAAC/AACAvwAAwL8AAAA/AACAvwAAwL8AAAC/AACAvwAAwD8AAAC/AACAvwAAwD8AAAA/AACAvwAAwL8AAAA/AACAPwAAwL8AAAA/AACAPwAAwL8AAAC/AACAvwAAwL8AAAC/AACAvwAAwD8AAAA/AACAvwAAwD8AAAC/AACAPwAAwD8AAAC/AACAPwAAwD8AAAA/AACAPwAAwD8AAAA/AACAPwAAwD8AAAC/AACAPwAAwL8AAAC/AACAPwAAwL8AAAA/AACAPwAAwL8AAAA/AACAvwAAwL8AAAA/AACAvwAAwD8AAAA/AACAPwAAwD8AAAA//////////z//////////P/////////8//////////z8AAP9///8AAAAA/3///wAAAAD/f///AAAAAP9///8AAP9/AAD//////38AAP//////fwAA//////9/AAD//////3////9//7//f////3//v/9/////f/+//3////9//7////9//3//P////3//f/8/////f/9//z////9//3//P/9//38AAP8//3//fwAA/z//f/9/AAD/P/9//38AAP8/")
}]
[sub_resource type="ArrayMesh" id="ArrayMesh_qtvpr"]
_surfaces = [{
"aabb": AABB(-0.25, -1.5, -2.546875, 0.5, 3, 5.09375),
"attribute_data": PackedByteArray("AADgwAAA4MAA/v/AAADgwAD+/8AAAIC/AADgwAAAgL8AAFA/AACAvwD/L0EAAIC/AP8vQQAA4MAAAFA/AADgwAAAUD8A/v9AAABQPwAA4EAA/y9BAADgQAD/L0EA/v9AAABQvwD+/0AA/y/BAP7/QAD/L8EAAOBAAABQvwAA4EAAAFC/AADgwAD/L8EAAODAAP8vwQAAgL8AAFC/AACAvwAA4EAAAIC/AP7/QAAAgL8A/v9AAADgwAAA4EAAAODA"),
"format": 34359742487,
"index_count": 36,
"index_data": PackedByteArray("AAABAAIAAAACAAMABAAFAAYABAAGAAcACAAJAAoACAAKAAsADAANAA4ADAAOAA8AEAARABIAEAASABMAFAAVABYAFAAWABcA"),
"material": ExtResource("7_u45fp"),
"name": "tile043",
"primitive": 3,
"uv_scale": Vector4(0, 0, 0, 0),
"vertex_count": 24,
"vertex_data": PackedByteArray("AACAPgAAwD8AACPAAOB/vgAAwD8AACPAAOB/vgAAwL8AACPAAACAPgAAwL8AACPAAACAvgAAwL8AACNAAACAvgAAwL8A/iLAAACAvgAAwD8A/iLAAACAvgAAwD8AACNAAOB/vgAAwL8AACNAAACAPgAAwL8AACNAAACAPgAAwL8A/iLAAOB/vgAAwL8A/iLAAOB/vgAAwD8AACNAAOB/vgAAwD8A/iLAAACAPgAAwD8A/iLAAACAPgAAwD8AACNAAACAPgAAwD8AACNAAACAPgAAwD8A/iLAAACAPgAAwL8A/iLAAACAPgAAwL8AACNAAACAPgAAwL8AACNAAOB/vgAAwL8AACNAAOB/vgAAwD8AACNAAACAPgAAwD8AACNA/////////z//////////P/////////8//////////z8AAP9///8AAAAA/3///wAAAAD/f///AAAAAP9///8AAP9/AAD//////38AAP//////fwAA//////9/AAD//////3////9//7//f////3//v/9/////f/+//3////9//7////9//3//P////3//f/8/////f/9//z////9//3//P/9//38AAP8//3//fwAA/z//f/9/AAD/P/9//38AAP8/")
}]
[sub_resource type="ArrayMesh" id="ArrayMesh_drwxn"]
_surfaces = [{ _surfaces = [{
"aabb": AABB(-1.546875, -0.25, -2, 3.09375, 0.5, 4), "aabb": AABB(-1.546875, -0.25, -2, 3.09375, 0.5, 4),
"attribute_data": PackedByteArray("AAC4QQAAAMAAgIZBAAAAwACAhkEAAIC/AAC4QQAAgL8AAKBAAACAvwAAUEEAAIC/AABQQQAAAMAAAKBAAAAAwAAAoEAAgIbBAACgQAAAuMEAAFBBAAC4wQAAUEEAgIbBAACgwACAhsEAAFDBAICGwQAAUMEAALjBAACgwAAAuMEAAKDAAAAAwAAAUMEAAADAAABQwQAAgL8AAKDAAACAvwAAuMEAAIC/AICGwQAAgL8AgIbBAAAAwAAAuMEAAADA"), "attribute_data": PackedByteArray("AAC4QQAAAMAAgIZBAAAAwACAhkEAAIC/AAC4QQAAgL8AAKBAAACAvwAAUEEAAIC/AABQQQAAAMAAAKBAAAAAwAAAoEAAgIbBAACgQAAAuMEAAFBBAAC4wQAAUEEAgIbBAACgwACAhsEAAFDBAICGwQAAUMEAALjBAACgwAAAuMEAAKDAAAAAwAAAUMEAAADAAABQwQAAgL8AAKDAAACAvwAAuMEAAIC/AICGwQAAgL8AgIbBAAAAwAAAuMEAAADA"),
@@ -89,7 +59,7 @@ _surfaces = [{
"vertex_data": PackedByteArray("AADGPwAAgD4AAADAAADGvwAAgD4AAADAAADGvwAAgL4AAADAAADGPwAAgL4AAADAAADGvwAAgL4AAABAAADGvwAAgL4AAADAAADGvwAAgD4AAADAAADGvwAAgD4AAABAAADGvwAAgL4AAABAAADGPwAAgL4AAABAAADGPwAAgL4AAADAAADGvwAAgL4AAADAAADGvwAAgD4AAABAAADGvwAAgD4AAADAAADGPwAAgD4AAADAAADGPwAAgD4AAABAAADGPwAAgD4AAABAAADGPwAAgD4AAADAAADGPwAAgL4AAADAAADGPwAAgL4AAABAAADGPwAAgL4AAABAAADGvwAAgL4AAABAAADGvwAAgD4AAABAAADGPwAAgD4AAABA/////////z//////////P/////////8//////////z8AAP9///8AAAAA/3///wAAAAD/f///AAAAAP9///8AAP9/AAD//////38AAP//////fwAA//////9/AAD//////3////9//7//f////3//v/9/////f/+//3////9//7////9//3//P////3//f/8/////f/9//z////9//3//P/9//38AAP8//3//fwAA/z//f/9/AAD/P/9//38AAP8/") "vertex_data": PackedByteArray("AADGPwAAgD4AAADAAADGvwAAgD4AAADAAADGvwAAgL4AAADAAADGPwAAgL4AAADAAADGvwAAgL4AAABAAADGvwAAgL4AAADAAADGvwAAgD4AAADAAADGvwAAgD4AAABAAADGvwAAgL4AAABAAADGPwAAgL4AAABAAADGPwAAgL4AAADAAADGvwAAgL4AAADAAADGvwAAgD4AAABAAADGvwAAgD4AAADAAADGPwAAgD4AAADAAADGPwAAgD4AAABAAADGPwAAgD4AAABAAADGPwAAgD4AAADAAADGPwAAgL4AAADAAADGPwAAgL4AAABAAADGPwAAgL4AAABAAADGvwAAgL4AAABAAADGvwAAgD4AAABAAADGPwAAgD4AAABA/////////z//////////P/////////8//////////z8AAP9///8AAAAA/3///wAAAAD/f///AAAAAP9///8AAP9/AAD//////38AAP//////fwAA//////9/AAD//////3////9//7//f////3//v/9/////f/+//3////9//7////9//3//P////3//f/8/////f/9//z////9//3//P/9//38AAP8//3//fwAA/z//f/9/AAD/P/9//38AAP8/")
}] }]
[sub_resource type="ArrayMesh" id="ArrayMesh_rmkky"] [sub_resource type="ArrayMesh" id="ArrayMesh_lqn8c"]
_surfaces = [{ _surfaces = [{
"aabb": AABB(-1.046875, -1.5, -0.5, 2.09375, 3, 1), "aabb": AABB(-1.046875, -1.5, -0.5, 2.09375, 3, 1),
"attribute_data": PackedByteArray("AADAQAAA4MAAAOg/AADgwAAA6D8AAIC/AADAQAAAgL8AAMDAAACAvwAAgMAAAIC/AACAwAAA4MAAAMDAAADgwAAAwMAAAOi/AADAwAAAwMAAAIDAAADAwAAAgMAAAOi/AADAQAAA6L8AAIBAAADovwAAgEAAAMDAAADAQAAAwMAAAMBAAADgwAAAgEAAAODAAACAQAAAgL8AAMBAAACAvwAAwMAAAIC/AADovwAAgL8AAOi/AADgwAAAwMAAAODA"), "attribute_data": PackedByteArray("AADAQAAA4MAAAOg/AADgwAAA6D8AAIC/AADAQAAAgL8AAMDAAACAvwAAgMAAAIC/AACAwAAA4MAAAMDAAADgwAAAwMAAAOi/AADAwAAAwMAAAIDAAADAwAAAgMAAAOi/AADAQAAA6L8AAIBAAADovwAAgEAAAMDAAADAQAAAwMAAAMBAAADgwAAAgEAAAODAAACAQAAAgL8AAMBAAACAvwAAwMAAAIC/AADovwAAgL8AAOi/AADgwAAAwMAAAODA"),
@@ -104,10 +74,17 @@ _surfaces = [{
"vertex_data": PackedByteArray("AACGPwAAwD8AAAC/AACGvwAAwD8AAAC/AACGvwAAwL8AAAC/AACGPwAAwL8AAAC/AACGvwAAwL8AAAA/AACGvwAAwL8AAAC/AACGvwAAwD8AAAC/AACGvwAAwD8AAAA/AACGvwAAwL8AAAA/AACGPwAAwL8AAAA/AACGPwAAwL8AAAC/AACGvwAAwL8AAAC/AACGvwAAwD8AAAA/AACGvwAAwD8AAAC/AACGPwAAwD8AAAC/AACGPwAAwD8AAAA/AACGPwAAwD8AAAA/AACGPwAAwD8AAAC/AACGPwAAwL8AAAC/AACGPwAAwL8AAAA/AACGPwAAwL8AAAA/AACGvwAAwL8AAAA/AACGvwAAwD8AAAA/AACGPwAAwD8AAAA//////////z//////////P/////////8//////////z8AAP9///8AAAAA/3///wAAAAD/f///AAAAAP9///8AAP9/AAD//////38AAP//////fwAA//////9/AAD//////3////9//7//f////3//v/9/////f/+//3////9//7////9//3//P////3//f/8/////f/9//z////9//3//P/9//38AAP8//3//fwAA/z//f/9/AAD/P/9//38AAP8/") "vertex_data": PackedByteArray("AACGPwAAwD8AAAC/AACGvwAAwD8AAAC/AACGvwAAwL8AAAC/AACGPwAAwL8AAAC/AACGvwAAwL8AAAA/AACGvwAAwL8AAAC/AACGvwAAwD8AAAC/AACGvwAAwD8AAAA/AACGvwAAwL8AAAA/AACGPwAAwL8AAAA/AACGPwAAwL8AAAC/AACGvwAAwL8AAAC/AACGvwAAwD8AAAA/AACGvwAAwD8AAAC/AACGPwAAwD8AAAC/AACGPwAAwD8AAAA/AACGPwAAwD8AAAA/AACGPwAAwD8AAAC/AACGPwAAwL8AAAC/AACGPwAAwL8AAAA/AACGPwAAwL8AAAA/AACGvwAAwL8AAAA/AACGvwAAwD8AAAA/AACGPwAAwD8AAAA//////////z//////////P/////////8//////////z8AAP9///8AAAAA/3///wAAAAD/f///AAAAAP9///8AAP9/AAD//////38AAP//////fwAA//////9/AAD//////3////9//7//f////3//v/9/////f/+//3////9//7////9//3//P////3//f/8/////f/9//z////9//3//P/9//38AAP8//3//fwAA/z//f/9/AAD/P/9//38AAP8/")
}] }]
[sub_resource type="ArrayMesh" id="ArrayMesh_epu3l"] [sub_resource type="ArrayOccluder3D" id="ArrayOccluder3D_08uri"]
vertices = PackedVector3Array(1.046875, 1.5, -0.5, -1.046875, 1.5, -0.5, -1.046875, -1.5, -0.5, 1.046875, -1.5, -0.5, -1.046875, -1.5, 0.5, -1.046875, -1.5, -0.5, -1.046875, 1.5, -0.5, -1.046875, 1.5, 0.5, -1.046875, -1.5, 0.5, 1.046875, -1.5, 0.5, 1.046875, -1.5, -0.5, -1.046875, -1.5, -0.5, -1.046875, 1.5, 0.5, -1.046875, 1.5, -0.5, 1.046875, 1.5, -0.5, 1.046875, 1.5, 0.5, 1.046875, 1.5, 0.5, 1.046875, 1.5, -0.5, 1.046875, -1.5, -0.5, 1.046875, -1.5, 0.5, 1.046875, -1.5, 0.5, -1.046875, -1.5, 0.5, -1.046875, 1.5, 0.5, 1.046875, 1.5, 0.5)
indices = PackedInt32Array(0, 1, 2, 0, 2, 3, 4, 5, 6, 4, 6, 7, 8, 9, 10, 8, 10, 11, 12, 13, 14, 12, 14, 15, 16, 17, 18, 16, 18, 19, 20, 21, 22, 20, 22, 23)
[sub_resource type="ConcavePolygonShape3D" id="ConcavePolygonShape3D_fivcu"]
data = PackedVector3Array(1.046875, 1.5, -0.5, -1.046875, 1.5, -0.5, -1.046875, -1.5, -0.5, 1.046875, 1.5, -0.5, -1.046875, -1.5, -0.5, 1.046875, -1.5, -0.5, -1.046875, -1.5, 0.5, -1.046875, -1.5, -0.5, -1.046875, 1.5, -0.5, -1.046875, -1.5, 0.5, -1.046875, 1.5, -0.5, -1.046875, 1.5, 0.5, -1.046875, -1.5, 0.5, 1.046875, -1.5, 0.5, 1.046875, -1.5, -0.5, -1.046875, -1.5, 0.5, 1.046875, -1.5, -0.5, -1.046875, -1.5, -0.5, -1.046875, 1.5, 0.5, -1.046875, 1.5, -0.5, 1.046875, 1.5, -0.5, -1.046875, 1.5, 0.5, 1.046875, 1.5, -0.5, 1.046875, 1.5, 0.5, 1.046875, 1.5, 0.5, 1.046875, 1.5, -0.5, 1.046875, -1.5, -0.5, 1.046875, 1.5, 0.5, 1.046875, -1.5, -0.5, 1.046875, -1.5, 0.5, 1.046875, -1.5, 0.5, -1.046875, -1.5, 0.5, -1.046875, 1.5, 0.5, 1.046875, -1.5, 0.5, -1.046875, 1.5, 0.5, 1.046875, 1.5, 0.5)
[sub_resource type="ArrayMesh" id="ArrayMesh_uy2g7"]
_surfaces = [{ _surfaces = [{
"aabb": AABB(-0.25, -1.5, -2.546875, 0.5, 3, 5.09375), "aabb": AABB(-0.25, -1.5, -2.546875, 0.5, 3, 5.09375),
"attribute_data": PackedByteArray("AADgwAAA4MAA/v/AAADgwAD+/8AAAIC/AADgwAAAgL8AACPBAACAvwAAAKcAAIC/AAAApwAA4MAAACPBAADgwAAAI8EA/v9AAAAjwQAA4EAAAAAAAADgQAAAAAAA/v9AAAAjQQD+/0AAAAAAAP7/QAAAAAAAAOBAAAAjQQAA4EAAACNBAADgwAAA4CYAAODAAADgJgAAgL8AACNBAACAvwAA4EAAAIC/AP7/QAAAgL8A/v9AAADgwAAA4EAAAODA"), "attribute_data": PackedByteArray("AAAAwQAA4MAAABDBAADgwAAAEMEAAIC/AAAAwQAAgL8AACPBAACAvwAAEKcAAIC/AAAQpwAA4MAAACPBAADgwAAAI8EAABBBAAAjwQAAAEEAAAAAAAAAQQAAAAAAABBBAAAjQQAAEEEAAAAAAAAQQQAAAAAAAABBAAAjQQAAAEEAACNBAADgwAAAACcAAODAAAAAJwAAgL8AACNBAACAvwAAAEEAAIC/AAAQQQAAgL8AABBBAADgwAAAAEEAAODA"),
"format": 34359742487, "format": 34359742487,
"index_count": 36, "index_count": 36,
"index_data": PackedByteArray("AAABAAIAAAACAAMABAAFAAYABAAGAAcACAAJAAoACAAKAAsADAANAA4ADAAOAA8AEAARABIAEAASABMAFAAVABYAFAAWABcA"), "index_data": PackedByteArray("AAABAAIAAAACAAMABAAFAAYABAAGAAcACAAJAAoACAAKAAsADAANAA4ADAAOAA8AEAARABIAEAASABMAFAAVABYAFAAWABcA"),
@@ -116,38 +93,15 @@ _surfaces = [{
"primitive": 3, "primitive": 3,
"uv_scale": Vector4(0, 0, 0, 0), "uv_scale": Vector4(0, 0, 0, 0),
"vertex_count": 24, "vertex_count": 24,
"vertex_data": PackedByteArray("AACAPgAAwD8AACPAAOB/vgAAwD8AACPAAOB/vgAAwL8AACPAAACAPgAAwL8AACPAAACAvgAAwL8AACNAAACAvgAAwL8AACPAAACAvgAAwD8AACPAAACAvgAAwD8AACNAAOB/vgAAwL8AACNAAACAPgAAwL8AACNAAACAPgAAwL8AACPAAOB/vgAAwL8AACPAAOB/vgAAwD8AACNAAOB/vgAAwD8AACPAAACAPgAAwD8AACPAAACAPgAAwD8AACNAAACAPgAAwD8AACNAAACAPgAAwD8AACPAAACAPgAAwL8AACPAAACAPgAAwL8AACNAAACAPgAAwL8AACNAAOB/vgAAwL8AACNAAOB/vgAAwD8AACNAAACAPgAAwD8AACNA/////////z//////////P/////////8//////////z8AAP9///8AAAAA/3///wAAAAD/f///AAAAAP9///8AAP9/AAD//////38AAP//////fwAA//////9/AAD//////3////9//7//f////3//v/9/////f/+//3////9//7////9//3//P////3//f/8/////f/9//z////9//3//P/9//38AAP8//3//fwAA/z//f/9/AAD/P/9//38AAP8/") "vertex_data": PackedByteArray("AACAPgAAwD8AACPAAACAvgAAwD8AACPAAACAvgAAwL8AACPAAACAPgAAwL8AACPAAACAvgAAwL8AACNAAACAvgAAwL8AACPAAACAvgAAwD8AACPAAACAvgAAwD8AACNAAACAvgAAwL8AACNAAACAPgAAwL8AACNAAACAPgAAwL8AACPAAACAvgAAwL8AACPAAACAvgAAwD8AACNAAACAvgAAwD8AACPAAACAPgAAwD8AACPAAACAPgAAwD8AACNAAACAPgAAwD8AACNAAACAPgAAwD8AACPAAACAPgAAwL8AACPAAACAPgAAwL8AACNAAACAPgAAwL8AACNAAACAvgAAwL8AACNAAACAvgAAwD8AACNAAACAPgAAwD8AACNA/////////z//////////P/////////8//////////z8AAP9///8AAAAA/3///wAAAAD/f///AAAAAP9///8AAP9/AAD//////38AAP//////fwAA//////9/AAD//////3////9//7//f////3//v/9/////f/+//3////9//7////9//3//P////3//f/8/////f/9//z////9//3//P/9//38AAP8//3//fwAA/z//f/9/AAD/P/9//38AAP8/")
}] }]
[sub_resource type="ArrayMesh" id="ArrayMesh_lqn8c"] [sub_resource type="ArrayOccluder3D" id="ArrayOccluder3D_u1nm5"]
_surfaces = [{ vertices = PackedVector3Array(0.25, 1.5, -2.546875, -0.25, 1.5, -2.546875, -0.25, -1.5, -2.546875, 0.25, -1.5, -2.546875, -0.25, -1.5, 2.546875, -0.25, -1.5, -2.546875, -0.25, 1.5, -2.546875, -0.25, 1.5, 2.546875, -0.25, -1.5, 2.546875, 0.25, -1.5, 2.546875, 0.25, -1.5, -2.546875, -0.25, -1.5, -2.546875, -0.25, 1.5, 2.546875, -0.25, 1.5, -2.546875, 0.25, 1.5, -2.546875, 0.25, 1.5, 2.546875, 0.25, 1.5, 2.546875, 0.25, 1.5, -2.546875, 0.25, -1.5, -2.546875, 0.25, -1.5, 2.546875, 0.25, -1.5, 2.546875, -0.25, -1.5, 2.546875, -0.25, 1.5, 2.546875, 0.25, 1.5, 2.546875)
"aabb": AABB(-1.0000001, -0.50000006, -0.7500305, 2, 1, 1.500061), indices = PackedInt32Array(0, 1, 2, 0, 2, 3, 4, 5, 6, 4, 6, 7, 8, 9, 10, 8, 10, 11, 12, 13, 14, 12, 14, 15, 16, 17, 18, 16, 18, 19, 20, 21, 22, 20, 22, 23)
"attribute_data": PackedByteArray("AACAwP7/f78C/v/A/v9/vwAAgMAA/j/AAAAAwQAAQMAAAoDAAABAwAAAAMEABIC/AADAwAAAgL8AABDBAACAvwAAEMEAAEDAAADAwAAAQMAAAMBA//9/wAAAwEAAAADBAAAAQQAAAMHAAABBAP7/wIAAEEH//3/AAADAwAAAgMAAABDBAACAwAAAwMAAAADBAADAQAAAQMAAAABBAACAvwAAwEAAAIC/AAAAQQAAgL8AAIBAAACAvwAAgEAAAEDAVf3/QAAAQMAAAABB//s/wA=="),
"format": 34359742487,
"index_count": 36,
"index_data": PackedByteArray("AAABAAIAAwAEAAUABgAHAAgABgAIAAkACgALAAwACgAMAA0ACgANAA4ADwAQABEAEgATABQAFQAWABcAFQAXABgAFQAYABkA"),
"material": ExtResource("7_u45fp"),
"name": "tile043",
"primitive": 3,
"uv_scale": Vector4(0, 0, 0, 0),
"vertex_count": 26,
"vertex_data": PackedByteArray("AACAvwEAAL8A/j+/CPh/PwEAAL8AAIC+AACAvwD4/z4A/j+/AACAPwAAAD8AAEA/APh/vwAAAD8A+j+/AACAPwD4/74A8H++AACAvwAAAL8AAkA/AACAvwAAAL8A/j+/AACAvwAAAD8A/j+/AACAvwAAAD8AAkA/AQCAvwAAAL8AAkA/AACAPwAAAL8AAkA/AACAPwAAAL8A+H++APh/PwAAAL8ACIC+AQCAvwAAAL8AAkC/AACAvwAAAD8AAkA/AACAvwAAAD8A/j+/AACAPwAAAD8AAkA/AACAPwAAAD8AAkA/AACAPwAAAL8A+H++AACAPwAAAL8AAkA/AACAPwAAAL8AAkA/AACAvwAAAL8AAkA/AACAvwAAAD8AAkA/VPV/PwAAAD8AAkA/AACAP/zv/z4AAkA///9l5gAA/7///2XmAAD/v///ZeYAAP+/c9EW3QAA/79z0RbdAAD/v3PRFt0AAP+/AAD/f/9//78AAP9//3//vwAA/3//f/+/AAD/f/9//7//fwAA//////9/AAD//////38AAP//////fwAA//////9/AAD//////3////9//7//f////3//v/9/////f/+/////f/////////9//////////3///////3//f////7//f/9/////v/9//3////+//3//f////7//f/9/////vw==")
}]
[sub_resource type="ArrayMesh" id="ArrayMesh_08uri"] [sub_resource type="ConcavePolygonShape3D" id="ConcavePolygonShape3D_1w0m8"]
_surfaces = [{ data = PackedVector3Array(0.25, 1.5, -2.546875, -0.25, 1.5, -2.546875, -0.25, -1.5, -2.546875, 0.25, 1.5, -2.546875, -0.25, -1.5, -2.546875, 0.25, -1.5, -2.546875, -0.25, -1.5, 2.546875, -0.25, -1.5, -2.546875, -0.25, 1.5, -2.546875, -0.25, -1.5, 2.546875, -0.25, 1.5, -2.546875, -0.25, 1.5, 2.546875, -0.25, -1.5, 2.546875, 0.25, -1.5, 2.546875, 0.25, -1.5, -2.546875, -0.25, -1.5, 2.546875, 0.25, -1.5, -2.546875, -0.25, -1.5, -2.546875, -0.25, 1.5, 2.546875, -0.25, 1.5, -2.546875, 0.25, 1.5, -2.546875, -0.25, 1.5, 2.546875, 0.25, 1.5, -2.546875, 0.25, 1.5, 2.546875, 0.25, 1.5, 2.546875, 0.25, 1.5, -2.546875, 0.25, -1.5, -2.546875, 0.25, 1.5, 2.546875, 0.25, -1.5, -2.546875, 0.25, -1.5, 2.546875, 0.25, -1.5, 2.546875, -0.25, -1.5, 2.546875, -0.25, 1.5, 2.546875, 0.25, -1.5, 2.546875, -0.25, 1.5, 2.546875, 0.25, 1.5, 2.546875)
"aabb": AABB(-1.046875, -1.5, -0.015625, 2.09375, 3, 0.03125),
"attribute_data": PackedByteArray("AACAPwAA4MAAAEzAAADgwAAATMAAAIC/AACAPwAAgL8AAAHBAACAvwAAAMEAAIC/AAAAwQAA4MAAAAHBAADgwAAAAcEAAExAAAABwQAAgL8AAADBAACAvwAAAMEAAExAAAABQQAATEAAAABBAABMQAAAAEEAAIC/AAABQQAAgL8AAAFBAADgwAAAAEEAAODAAAAAQQAAgL8AAAFBAACAvwAAgL8AAIC/AABMQAAAgL8AAExAAADgwAAAgL8AAODA"),
"format": 34359742487,
"index_count": 36,
"index_data": PackedByteArray("AAABAAIAAAACAAMABAAFAAYABAAGAAcACAAJAAoACAAKAAsADAANAA4ADAAOAA8AEAARABIAEAASABMAFAAVABYAFAAWABcA"),
"material": ExtResource("7_u45fp"),
"name": "tile043",
"primitive": 3,
"uv_scale": Vector4(0, 0, 0, 0),
"vertex_count": 24,
"vertex_data": PackedByteArray("AACGPwAAwD8AAIC8AACGvwAAwD8AAIC8AACGvwAAwL8AAIC8AACGPwAAwL8AAIC8AACGvwAAwL8AAIA8AACGvwAAwL8AAIC8AACGvwAAwD8AAIC8AACGvwAAwD8AAIA8AACGvwAAwL8AAIA8AACGPwAAwL8AAIA8AACGPwAAwL8AAIC8AACGvwAAwL8AAIC8AACGvwAAwD8AAIA8AACGvwAAwD8AAIC8AACGPwAAwD8AAIC8AACGPwAAwD8AAIA8AACGPwAAwD8AAIA8AACGPwAAwD8AAIC8AACGPwAAwL8AAIC8AACGPwAAwL8AAIA8AACGPwAAwL8AAIA8AACGvwAAwL8AAIA8AACGvwAAwD8AAIA8AACGPwAAwD8AAIA8/////////z//////////P/////////8//////////z8AAP9///8AAAAA/3///wAAAAD/f///AAAAAP9///8AAP9/AAD//////38AAP//////fwAA//////9/AAD//////3////9//7//f////3//v/9/////f/+//3////9//7////9//3//P////3//f/8/////f/9//z////9//3//P/9//38AAP8//3//fwAA/z//f/9/AAD/P/9//38AAP8/")
}]
[node name="Test" type="Node3D"] [node name="Test" type="Node3D"]
@@ -159,100 +113,85 @@ metadata/_custom_type_script = "uid://cwu5cf7a0awcd"
[node name="entity_0_worldspawn" type="StaticBody3D" parent="FuncGodotMap"] [node name="entity_0_worldspawn" type="StaticBody3D" parent="FuncGodotMap"]
collision_mask = 0 collision_mask = 0
metadata/func_godot_mesh_data = {
"uvs": PackedVector2Array(-14, -1, 14, -1, 14, 1.0002441, -14, -1, 14, 1.0002441, -14, 1.0002441, 12, 1.0002441, -10.999756, 1.0002441, -10.999756, -1, 12, 1.0002441, -10.999756, -1, 12, -1, -12, 14, -12, -14, 10.999756, -14, -12, 14, 10.999756, -14, 10.999756, 14, 12, 14, -10.999756, 14, -10.999756, -14, 12, 14, -10.999756, -14, 12, -14, -12, -1, 10.999756, -1, 10.999756, 1.0002441, -12, -1, 10.999756, 1.0002441, -12, 1.0002441, 14, 1.0002441, -14, 1.0002441, -14, -1, 14, 1.0002441, -14, -1, 14, -1)
}
[node name="entity_0_mesh_instance" type="MeshInstance3D" parent="FuncGodotMap/entity_0_worldspawn"] [node name="entity_0_mesh_instance" type="MeshInstance3D" parent="FuncGodotMap/entity_0_worldspawn"]
mesh = SubResource("ArrayMesh_u45fp") mesh = SubResource("ArrayMesh_2grjb")
[node name="entity_0_brush_0_collision_shape" type="CollisionShape3D" parent="FuncGodotMap/entity_0_worldspawn"] [node name="entity_0_brush_0_collision_shape" type="CollisionShape3D" parent="FuncGodotMap/entity_0_worldspawn"]
shape = SubResource("ConvexPolygonShape3D_2grjb") shape = SubResource("ConvexPolygonShape3D_qhvcx")
[node name="entity_1_func_movingplatform" type="AnimatableBody3D" parent="FuncGodotMap"] [node name="entity_1_func_movingplatform" type="AnimatableBody3D" parent="FuncGodotMap"]
transform = Transform3D(1, 0, 0, 0, 1, 0, 0, 0, 1, 0, -6.1035156e-05, 14.25) transform = Transform3D(1, 0, 0, 0, 1, 0, 0, 0, 1, 0, -6.1035156e-05, 14.25)
script = ExtResource("4_6g8e2") script = ExtResource("4_6g8e2")
metadata/func_godot_mesh_data = {
"uvs": PackedVector2Array(-14, -1, 14, -1, 14, 1.0002441, -14, -1, 14, 1.0002441, -14, 1.0002441, 40, 1.0002441, 17, 1.0002441, 17, -1, 40, 1.0002441, 17, -1, 40, -1, -40, 14, -40, -14, -17, -14, -40, 14, -17, -14, -17, 14, 40, 14, 17, 14, 17, -14, 40, 14, 17, -14, 40, -14, -40, -1, -17, -1, -17, 1.0002441, -40, -1, -17, 1.0002441, -40, 1.0002441, 14, 1.0002441, -14, 1.0002441, -14, -1, 14, 1.0002441, -14, -1, 14, -1)
}
[node name="entity_1_mesh_instance" type="MeshInstance3D" parent="FuncGodotMap/entity_1_func_movingplatform"] [node name="entity_1_mesh_instance" type="MeshInstance3D" parent="FuncGodotMap/entity_1_func_movingplatform"]
mesh = SubResource("ArrayMesh_qhvcx") mesh = SubResource("ArrayMesh_kqvnf")
[node name="entity_1_brush_0_collision_shape" type="CollisionShape3D" parent="FuncGodotMap/entity_1_func_movingplatform"] [node name="entity_1_brush_0_collision_shape" type="CollisionShape3D" parent="FuncGodotMap/entity_1_func_movingplatform"]
shape = SubResource("ConvexPolygonShape3D_kqvnf") shape = SubResource("ConvexPolygonShape3D_eudka")
[node name="entity_2_func_destructablewall" type="Node3D" parent="FuncGodotMap" node_paths=PackedStringArray("meshInstance3d")]
transform = Transform3D(1, 0, 0, 0, 1, 0, 0, 0, 1, -0.5, 2, 2.5)
script = ExtResource("6_u45fp")
verts2d = PackedVector2Array(-1, -1.5, 1, -1.5, 1, 1.5, -1, 1.5, -1, -1.5)
meshInstance3d = NodePath("entity_2_mesh_instance")
depth = -1.0
depth_position_offset = Vector3(0, 0, 0.5)
[node name="entity_2_mesh_instance" type="MeshInstance3D" parent="FuncGodotMap/entity_2_func_destructablewall"]
mesh = SubResource("ArrayMesh_eudka")
[node name="entity_3_func_destructablewall" type="Node3D" parent="FuncGodotMap" node_paths=PackedStringArray("meshInstance3d")]
transform = Transform3D(1, 0, 0, 0, 1, 0, 0, 0, 1, -3.75, 2, -2.953125)
script = ExtResource("6_u45fp")
verts2d = PackedVector2Array(-2.546875, -1.5, 2.546875, -1.5, 2.546875, 1.5, -2.546875, 1.5, -2.546875, -1.5)
meshInstance3d = NodePath("entity_3_mesh_instance")
extrusion_direction = 1
depth = -0.5
depth_position_offset = Vector3(-0.25, 0, 0)
[node name="entity_3_mesh_instance" type="MeshInstance3D" parent="FuncGodotMap/entity_3_func_destructablewall"]
mesh = SubResource("ArrayMesh_qtvpr")
[node name="entity_4_func_destructablewall" type="Node3D" parent="FuncGodotMap" node_paths=PackedStringArray("meshInstance3d")] [node name="entity_4_func_destructablewall" type="Node3D" parent="FuncGodotMap" node_paths=PackedStringArray("meshInstance3d")]
transform = Transform3D(1, 0, 0, 0, 1, 0, 0, 0, 1, 9.953125, 0.75, -4.5) transform = Transform3D(1, 0, 0, 0, 1, 0, 0, 0, 1, 9.953125, 0.75, -4.5)
script = ExtResource("6_u45fp") script = ExtResource("6_u45fp")
verts2d = PackedVector2Array(-1.546875, -2, 1.546875, -2, 1.546875, 2, -1.546875, 2, -1.546875, -2) verts2d = PackedVector2Array(-1.546875, -2, 1.546875, -2, 1.546875, 2, -1.546875, 2, -1.546875, -2)
meshInstance3d = NodePath("entity_4_mesh_instance") meshInstance3d = NodePath("entity_4_mesh_instance")
extrusion_direction = 2
depth = -0.5 depth = -0.5
depth_position_offset = Vector3(0, -0.25, 0) original_vertices = PackedVector3Array(1.546875, 0.25, -2, -1.546875, 0.25, -2, -1.546875, -0.25, -2, 1.546875, 0.25, -2, -1.546875, -0.25, -2, 1.546875, -0.25, -2, -1.546875, -0.25, 2, -1.546875, -0.25, -2, -1.546875, 0.25, -2, -1.546875, -0.25, 2, -1.546875, 0.25, -2, -1.546875, 0.25, 2, -1.546875, -0.25, 2, 1.546875, -0.25, 2, 1.546875, -0.25, -2, -1.546875, -0.25, 2, 1.546875, -0.25, -2, -1.546875, -0.25, -2, -1.546875, 0.25, 2, -1.546875, 0.25, -2, 1.546875, 0.25, -2, -1.546875, 0.25, 2, 1.546875, 0.25, -2, 1.546875, 0.25, 2, 1.546875, 0.25, 2, 1.546875, 0.25, -2, 1.546875, -0.25, -2, 1.546875, 0.25, 2, 1.546875, -0.25, -2, 1.546875, -0.25, 2, 1.546875, -0.25, 2, -1.546875, -0.25, 2, -1.546875, 0.25, 2, 1.546875, -0.25, 2, -1.546875, 0.25, 2, 1.546875, 0.25, 2)
original_normals = PackedVector3Array(0, 0, -1, 0, 0, -1, -1, 0, 0, -1, 0, 0, 0, -1, 0, 0, -1, 0, 0, 1, 0, 0, 1, 0, 1, 0, 0, 1, 0, 0, 0, 0, 1, 0, 0, 1)
original_uvs = PackedVector2Array(23, -2, 16.8125, -2, 16.8125, -1, 23, -2, 16.8125, -1, 23, -1, 5, -1, 13, -1, 13, -2, 5, -1, 13, -2, 5, -2, 5, -16.8125, 5, -23, 13, -23, 5, -16.8125, 13, -23, 13, -16.8125, -5, -16.8125, -13, -16.8125, -13, -23, -5, -16.8125, -13, -23, -5, -23, -5, -2, -13, -2, -13, -1, -5, -2, -13, -1, -5, -1, -23, -1, -16.8125, -1, -16.8125, -2, -23, -1, -16.8125, -2, -23, -2)
extrusion_direction = 2
hole_proximity = 1.0
edge_non_fracture = 0.01
metadata/func_godot_mesh_data = {
"normals": PackedVector3Array(0, 0, -1, 0, 0, -1, -1, 0, 0, -1, 0, 0, 0, -1, 0, 0, -1, 0, 0, 1, 0, 0, 1, 0, 1, 0, 0, 1, 0, 0, 0, 0, 1, 0, 0, 1),
"texture_names": Array[StringName]([&"tile043"]),
"textures": PackedInt32Array(0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0),
"uvs": PackedVector2Array(23, -2, 16.8125, -2, 16.8125, -1, 23, -2, 16.8125, -1, 23, -1, 5, -1, 13, -1, 13, -2, 5, -1, 13, -2, 5, -2, 5, -16.8125, 5, -23, 13, -23, 5, -16.8125, 13, -23, 13, -16.8125, -5, -16.8125, -13, -16.8125, -13, -23, -5, -16.8125, -13, -23, -5, -23, -5, -2, -13, -2, -13, -1, -5, -2, -13, -1, -5, -1, -23, -1, -16.8125, -1, -16.8125, -2, -23, -1, -16.8125, -2, -23, -2),
"vertices": PackedVector3Array(1.546875, 0.25, -2, -1.546875, 0.25, -2, -1.546875, -0.25, -2, 1.546875, 0.25, -2, -1.546875, -0.25, -2, 1.546875, -0.25, -2, -1.546875, -0.25, 2, -1.546875, -0.25, -2, -1.546875, 0.25, -2, -1.546875, -0.25, 2, -1.546875, 0.25, -2, -1.546875, 0.25, 2, -1.546875, -0.25, 2, 1.546875, -0.25, 2, 1.546875, -0.25, -2, -1.546875, -0.25, 2, 1.546875, -0.25, -2, -1.546875, -0.25, -2, -1.546875, 0.25, 2, -1.546875, 0.25, -2, 1.546875, 0.25, -2, -1.546875, 0.25, 2, 1.546875, 0.25, -2, 1.546875, 0.25, 2, 1.546875, 0.25, 2, 1.546875, 0.25, -2, 1.546875, -0.25, -2, 1.546875, 0.25, 2, 1.546875, -0.25, -2, 1.546875, -0.25, 2, 1.546875, -0.25, 2, -1.546875, -0.25, 2, -1.546875, 0.25, 2, 1.546875, -0.25, 2, -1.546875, 0.25, 2, 1.546875, 0.25, 2)
}
[node name="entity_4_mesh_instance" type="MeshInstance3D" parent="FuncGodotMap/entity_4_func_destructablewall"] [node name="entity_4_mesh_instance" type="MeshInstance3D" parent="FuncGodotMap/entity_4_func_destructablewall"]
mesh = SubResource("ArrayMesh_drwxn")
[node name="entity_5_func_destructablewall" type="Node3D" parent="FuncGodotMap" node_paths=PackedStringArray("meshInstance3d")]
transform = Transform3D(1, 0, 0, 0, 1, 0, 0, 0, 1, 1.953125, 2, 2.5)
script = ExtResource("6_u45fp")
verts2d = PackedVector2Array(-1.046875, -1.5, 1.046875, -1.5, 1.046875, 1.5, -1.046875, 1.5, -1.046875, -1.5)
meshInstance3d = NodePath("entity_5_mesh_instance")
depth = -1.0
depth_position_offset = Vector3(0, 0, 0.5)
[node name="entity_5_mesh_instance" type="MeshInstance3D" parent="FuncGodotMap/entity_5_func_destructablewall"]
mesh = SubResource("ArrayMesh_rmkky") mesh = SubResource("ArrayMesh_rmkky")
[node name="entity_6_func_destructablewall" type="Node3D" parent="FuncGodotMap" node_paths=PackedStringArray("meshInstance3d")] [node name="entity_6_func_geo" type="StaticBody3D" parent="FuncGodotMap"]
transform = Transform3D(1, 0, 0, 0, 1, 0, 0, 0, 1, -3.75, 2, 2.546875) transform = Transform3D(1, 0, 0, 0, 1, 0, 0, 0, 1, 1.953125, 2, 2.5)
script = ExtResource("6_u45fp") collision_mask = 0
verts2d = PackedVector2Array(-2.546875, -1.5, 2.546875, -1.5, 2.546875, 1.5, -2.546875, 1.5, -2.546875, -1.5) metadata/func_godot_mesh_data = {
meshInstance3d = NodePath("entity_6_mesh_instance") "uvs": PackedVector2Array(6, -7, 1.8125, -7, 1.8125, -1, 6, -7, 1.8125, -1, 6, -1, -6, -1, -4, -1, -4, -7, -6, -1, -4, -7, -6, -7, -6, -1.8125, -6, -6, -4, -6, -6, -1.8125, -4, -6, -4, -1.8125, 6, -1.8125, 4, -1.8125, 4, -6, 6, -1.8125, 4, -6, 6, -6, 6, -7, 4, -7, 4, -1, 6, -7, 4, -1, 6, -1, -6, -1, -1.8125, -1, -1.8125, -7, -6, -1, -1.8125, -7, -6, -7)
extrusion_direction = 1 }
depth = -0.5
depth_position_offset = Vector3(-0.25, 0, 0)
[node name="entity_6_mesh_instance" type="MeshInstance3D" parent="FuncGodotMap/entity_6_func_destructablewall"] [node name="entity_6_mesh_instance" type="MeshInstance3D" parent="FuncGodotMap/entity_6_func_geo"]
mesh = SubResource("ArrayMesh_epu3l")
[node name="entity_7_func_destructablewall" type="Node3D" parent="FuncGodotMap" node_paths=PackedStringArray("meshInstance3d")]
transform = Transform3D(1, 0, 0, 0, 1, 0, 0, 0, 1, 3, 1, -3.7500305)
script = ExtResource("6_u45fp")
verts2d = PackedVector2Array(-1.0000001, -0.7500305, 0.9998779, -0.25006104, 1, -0.24996948, 1, 0.7500305, -1.0000001, 0.7500305, -1.0000001, -0.7500305)
meshInstance3d = NodePath("entity_7_mesh_instance")
extrusion_direction = 2
depth = -1.0000000596046448
depth_position_offset = Vector3(0, -0.5, 0)
[node name="entity_7_mesh_instance" type="MeshInstance3D" parent="FuncGodotMap/entity_7_func_destructablewall"]
mesh = SubResource("ArrayMesh_lqn8c") mesh = SubResource("ArrayMesh_lqn8c")
[node name="entity_8_func_destructablewall" type="Node3D" parent="FuncGodotMap" node_paths=PackedStringArray("meshInstance3d")] [node name="entity_6_occluder_instance" type="OccluderInstance3D" parent="FuncGodotMap/entity_6_func_geo"]
transform = Transform3D(1, 0, 0, 0, 1, 0, 0, 0, 1, -0.546875, 2, 4.015625) occluder = SubResource("ArrayOccluder3D_08uri")
script = ExtResource("6_u45fp")
verts2d = PackedVector2Array(-1.046875, -1.5, 1.046875, -1.5, 1.046875, 1.5, -1.046875, 1.5, -1.046875, -1.5)
meshInstance3d = NodePath("entity_8_mesh_instance")
depth = -0.03125
depth_position_offset = Vector3(0, 0, 0.015625)
[node name="entity_8_mesh_instance" type="MeshInstance3D" parent="FuncGodotMap/entity_8_func_destructablewall"] [node name="entity_6_collision_shape" type="CollisionShape3D" parent="FuncGodotMap/entity_6_func_geo"]
mesh = SubResource("ArrayMesh_08uri") shape = SubResource("ConcavePolygonShape3D_fivcu")
[node name="entity_7_func_geo" type="StaticBody3D" parent="FuncGodotMap"]
transform = Transform3D(1, 0, 0, 0, 1, 0, 0, 0, 1, -4.25, 2, 2.546875)
collision_mask = 0
metadata/func_godot_mesh_data = {
"uvs": PackedVector2Array(-8, -7, -9, -7, -9, -1, -8, -7, -9, -1, -8, -1, -10.1875, -1, -1.9984014e-15, -1, -1.9984014e-15, -7, -10.1875, -1, -1.9984014e-15, -7, -10.1875, -7, -10.1875, 9, -10.1875, 8, 0, 8, -10.1875, 9, 0, 8, 0, 9, 10.1875, 9, 0, 9, 0, 8, 10.1875, 9, 0, 8, 10.1875, 8, 10.1875, -7, 1.7763568e-15, -7, 1.7763568e-15, -1, 10.1875, -7, 1.7763568e-15, -1, 10.1875, -1, 8, -1, 9, -1, 9, -7, 8, -1, 9, -7, 8, -7)
}
[node name="entity_7_mesh_instance" type="MeshInstance3D" parent="FuncGodotMap/entity_7_func_geo"]
mesh = SubResource("ArrayMesh_uy2g7")
[node name="entity_7_occluder_instance" type="OccluderInstance3D" parent="FuncGodotMap/entity_7_func_geo"]
occluder = SubResource("ArrayOccluder3D_u1nm5")
[node name="entity_7_collision_shape" type="CollisionShape3D" parent="FuncGodotMap/entity_7_func_geo"]
shape = SubResource("ConcavePolygonShape3D_1w0m8")
[node name="OmniLight3D" type="OmniLight3D" parent="."]
transform = Transform3D(1, 0, 0, 0, 1, 0, 0, 0, 1, -6.6516542, 2.4242716, 0)
light_color = Color(0.68519044, 0.30453056, 0.26691508, 1)
light_energy = 7.369

View File

@@ -14,5 +14,6 @@ script = ExtResource("1_qoi2i")
[node name="CurrentLevel" type="Node3D" parent="."] [node name="CurrentLevel" type="Node3D" parent="."]
[node name="PrototypeLevel" parent="CurrentLevel" instance=ExtResource("1_rtgv3")] [node name="PrototypeLevel" parent="CurrentLevel" instance=ExtResource("1_rtgv3")]
transform = Transform3D(1, 0, 0, 0, 1, 0, 0, 0, 1, 0.0066280365, -0.0119102, 0.014269352)
[node name="UserInterface" parent="." instance=ExtResource("2_mgb3u")] [node name="UserInterface" parent="." instance=ExtResource("2_mgb3u")]

View File

@@ -5,12 +5,17 @@
[resource] [resource]
script = ExtResource("1_1gpns") script = ExtResource("1_1gpns")
add_textures_metadata = true
add_vertex_metadata = true
add_face_normal_metadata = true
script_class = ExtResource("2_7nwkm") script_class = ExtResource("2_7nwkm")
classname = "func_destructablewall" classname = "func_destructablewall"
description = "Set the brush entity as a destructable. description = "Set the brush entity as a destructable.
" "
class_properties = { class_properties = {
"extrude_direction": 0 "edge_non_fractured": 0.01,
"extrude_direction": 0,
"hole_proximity": 1.0
} }
node_class = "Node3D" node_class = "Node3D"
metadata/_custom_type_script = "uid://5cow84q03m6a" metadata/_custom_type_script = "uid://5cow84q03m6a"

View File

@@ -1,176 +1,130 @@
// Game: demo // Game: demo
// Format: Valve // Format: Valve
// entity 0 // entity 0
{ {
"mapversion" "220" "mapversion" "220"
"wad" "" "wad" ""
"classname" "worldspawn" "classname" "worldspawn"
"_tb_mod" "trenchbroom" "_tb_mod" "trenchbroom"
} // brush 0
// entity 1 {
{ ( -176 -64 -16 ) ( -176 -63 -16 ) ( -176 -64 -15 ) tile013 [ 0 -1 0 0 ] [ 0 0 -1 0 ] 180 1 1
"classname" "func_group" ( -64 -224 -16 ) ( -64 -224 -15 ) ( -63 -224 -16 ) tile013 [ 1 0 0 0 ] [ 0 0 -1 0 ] 180 1 1
"_tb_type" "_tb_group" ( -64 -64 -16 ) ( -63 -64 -16 ) ( -64 -63 -16 ) tile013 [ -1 0 0 0 ] [ 0 -1 0 0 ] 0 1 1
"_tb_name" "floor" ( 64 64 16 ) ( 64 65 16 ) ( 65 64 16 ) tile013 [ 1 0 0 0 ] [ 0 -1 0 0 ] 0 1 1
"_tb_id" "1" ( 64 224 16 ) ( 65 224 16 ) ( 64 224 17 ) tile013 [ -1 0 0 0 ] [ 0 0 -1 0 ] 180 1 1
"_tb_linked_group_id" "{fbbc3a97-f5d3-443e-97e2-242861ee6c78}" ( 192 64 16 ) ( 192 64 17 ) ( 192 65 16 ) tile013 [ 0 1 0 0 ] [ 0 0 -1 0 ] 180 1 1
"_tb_transformation" "1 0 0 -144 0 1 0 -144 0 0 1 0 0 0 0 1" }
// brush 0 }
{ // entity 1
( 272 -512 -16 ) ( 272 -510 -16 ) ( 272 -512 -15 ) tile191 [ 0 -0.5 0 0 ] [ 0 0 -1 0 ] 0 1 1 {
( 272 -512 -16 ) ( 272 -512 -15 ) ( 274.125 -512 -16 ) tile191 [ 0.47058823529411775 0 0 0 ] [ 0 0 -1 0 ] 0 1 1 "classname" "func_movingplatform"
( 272 -512 -16 ) ( 274.125 -512 -16 ) ( 272 -510 -16 ) tile191 [ -0.47058823529411775 0 0 0 ] [ 0 -0.5 0 0 ] 0 1 1 "move_distance" "2"
( 544 -256 16 ) ( 544 -254 16 ) ( 546.125 -256 16 ) tile191 [ 0.47058823529411775 0 0 0 ] [ 0 -0.5 0 0 ] 0 1 1 "move_time" "2"
( 544 -256 16 ) ( 546.125 -256 16 ) ( 544 -256 17 ) tile191 [ -0.47058823529411775 0 0 0 ] [ 0 0 -1 0 ] 0 1 1 "move_direction" "0.0 1.0 0.0"
( 544 -256 16 ) ( 544 -256 17 ) ( 544 -254 16 ) tile191 [ 0 0.5 0 0 ] [ 0 0 -1 0 ] 0 1 1 // brush 0
} {
// brush 1 ( 272 -64 -16 ) ( 272 -63 -16 ) ( 272 -64 -15 ) tile002 [ 0 -1 0 0 ] [ 0 0 -1 0 ] 0 1 1
{ ( 384 -224 -16 ) ( 384 -224 -15 ) ( 385 -224 -16 ) tile002 [ 1 0 0 0 ] [ 0 0 -1 0 ] 0 1 1
( 0 -512 -16 ) ( 0 -510 -16 ) ( 0 -512 -15 ) tile191 [ 0 -0.5 0 0 ] [ 0 0 -1 0 ] 0 1 1 ( 384 -64 -16 ) ( 385 -64 -16 ) ( 384 -63 -16 ) tile002 [ -1 0 0 0 ] [ 0 -1 0 0 ] 180 1 1
( 0 -512 -16 ) ( 0 -512 -15 ) ( 2.125 -512 -16 ) tile191 [ 0.47058823529411775 0 0 0 ] [ 0 0 -1 0 ] 0 1 1 ( 512 64 16 ) ( 512 65 16 ) ( 513 64 16 ) tile002 [ 1 0 0 0 ] [ 0 -1 0 0 ] 180 1 1
( 0 -512 -16 ) ( 2.125 -512 -16 ) ( 0 -510 -16 ) tile191 [ -0.47058823529411775 0 0 0 ] [ 0 -0.5 0 0 ] 0 1 1 ( 512 224 16 ) ( 513 224 16 ) ( 512 224 17 ) tile002 [ -1 0 0 0 ] [ 0 0 -1 0 ] 0 1 1
( 272 -256 16 ) ( 272 -254 16 ) ( 274.125 -256 16 ) tile191 [ 0.47058823529411775 0 0 0 ] [ 0 -0.5 0 0 ] 0 1 1 ( 640 64 16 ) ( 640 64 17 ) ( 640 65 16 ) tile002 [ 0 1 0 0 ] [ 0 0 -1 0 ] 0 1 1
( 272 -256 16 ) ( 274.125 -256 16 ) ( 272 -256 17 ) tile191 [ -0.47058823529411775 0 0 0 ] [ 0 0 -1 0 ] 0 1 1 }
( 272 -256 16 ) ( 272 -256 17 ) ( 272 -254 16 ) tile191 [ 0 0.5 0 0 ] [ 0 0 -1 0 ] 0 1 1 }
} // entity 2
// brush 2 {
{ "classname" "func_destructablewall"
( -272 -512 -16 ) ( -272 -510 -16 ) ( -272 -512 -15 ) tile191 [ 0 -0.5 0 0 ] [ 0 0 -1 0 ] 90 1 1 // brush 0
( -272 -512 -16 ) ( -272 -512 -15 ) ( -269.875 -512 -16 ) tile191 [ 0.47058823529411775 0 0 0 ] [ 0 0 -1 0 ] 90 1 1 {
( -272 -512 -16 ) ( -269.875 -512 -16 ) ( -272 -510 -16 ) tile191 [ -0.47058823529411775 0 0 0 ] [ 0 -0.5 0 0 ] 90 1 1 ( 64 0 32 ) ( 64 0 33 ) ( 64 -1 32 ) tile043 [ 0 1 0 0 ] [ 0 0 -1 0 ] 270 1 1
( 0 -256 16 ) ( 0 -254 16 ) ( 2.125 -256 16 ) tile191 [ 0.47058823529411775 0 0 0 ] [ 0 -0.5 0 0 ] 90 1 1 ( 0 -48 32 ) ( -1 -48 32 ) ( 0 -48 33 ) tile043 [ -1 0 0 0 ] [ 0 0 -1 0 ] 0 1 1
( 0 -256 16 ) ( 2.125 -256 16 ) ( 0 -256 17 ) tile191 [ -0.47058823529411775 0 0 0 ] [ 0 0 -1 0 ] 90 1 1 ( 80 80 16 ) ( 79 80 16 ) ( 80 79 16 ) tile043 [ -1 0 0 0 ] [ 0 -1 0 0 ] 0 1 1
( 0 -256 16 ) ( 0 -256 17 ) ( 0 -254 16 ) tile191 [ 0 0.5 0 0 ] [ 0 0 -1 0 ] 90 1 1 ( 0 0 112 ) ( 0 -1 112 ) ( -1 0 112 ) tile043 [ 1 0 0 0 ] [ 0 -1 0 0 ] 270 1 1
} ( 80 16 16 ) ( 80 16 17 ) ( 79 16 16 ) tile043 [ 1 0 0 0 ] [ 0 0 -1 0 ] 0 1 1
// brush 3 ( 96 80 16 ) ( 96 79 16 ) ( 96 80 17 ) tile043 [ 0 -1 0 0 ] [ 0 0 -1 0 ] 0 1 1
{ }
( -544 -512 -16 ) ( -544 -510 -16 ) ( -544 -512 -15 ) tile191 [ 0 -0.5 0 0 ] [ 0 0 -1 0 ] 90 1 1 }
( -544 -512 -16 ) ( -544 -512 -15 ) ( -541.875 -512 -16 ) tile191 [ 0.47058823529411775 0 0 0 ] [ 0 0 -1 0 ] 90 1 1 // entity 3
( -544 -512 -16 ) ( -541.875 -512 -16 ) ( -544 -510 -16 ) tile191 [ -0.47058823529411775 0 0 0 ] [ 0 -0.5 0 0 ] 90 1 1 {
( -272 -256 16 ) ( -272 -254 16 ) ( -269.875 -256 16 ) tile191 [ 0.47058823529411775 0 0 0 ] [ 0 -0.5 0 0 ] 90 1 1 "classname" "func_destructablewall"
( -272 -256 16 ) ( -269.875 -256 16 ) ( -272 -256 17 ) tile191 [ -0.47058823529411775 0 0 0 ] [ 0 0 -1 0 ] 90 1 1 "extrude_direction" "1"
( -272 -256 16 ) ( -272 -256 17 ) ( -272 -254 16 ) tile191 [ 0 0.5 0 0 ] [ 0 0 -1 0 ] 90 1 1 // brush 0
} {
// brush 4 ( -176 -96 16 ) ( -176 -96 17 ) ( -176 -97 16 ) tile000 [ 0 -1 0 0 ] [ -0 -0 -1 0 ] 0 1 1
{ ( -64 -144 32 ) ( -64 -144 33 ) ( -63 -144 32 ) "Stone Base/albedo" [ 1 0 0 0 ] [ 0 0 -1 0 ] 0 1 1
( -544 -256 -16 ) ( -544 -254 -16 ) ( -544 -256 -15 ) tile191 [ 0 -0.5 0 0 ] [ 0 0 -1 0 ] 270 1 1 ( -144 -96 16 ) ( -144 -97 16 ) ( -143 -96 16 ) tile000 [ -1 0 0 0 ] [ -0 -1 -0 0 ] 0 1 1
( -544 -256 -16 ) ( -544 -256 -15 ) ( -541.875 -256 -16 ) tile191 [ 0.47058823529411775 0 0 0 ] [ 0 0 -1 0 ] 270 1 1 ( -64 -176 112 ) ( -63 -176 112 ) ( -64 -177 112 ) tile000 [ 1 -0 0 0 ] [ -0 -1 0 0 ] 0 1 1
( -544 -256 -16 ) ( -541.875 -256 -16 ) ( -544 -254 -16 ) tile191 [ -0.47058823529411775 0 0 0 ] [ 0 -0.5 0 0 ] 270 1 1 ( -144 -128 16 ) ( -143 -128 16 ) ( -144 -128 17 ) tile000 [ -1 0 0 0 ] [ 0 0 -1 0 ] 0 1 1
( -272 0 16 ) ( -272 2 16 ) ( -269.875 0 16 ) tile191 [ 0.47058823529411775 0 0 0 ] [ 0 -0.5 0 0 ] 270 1 1 ( -13 -176 32 ) ( -13 -177 32 ) ( -13 -176 33 ) tile000 [ -0 1 0 0 ] [ -0 0 -1 0 ] 0 1 1
( -272 0 16 ) ( -269.875 0 16 ) ( -272 0 17 ) tile191 [ -0.47058823529411775 0 0 0 ] [ 0 0 -1 0 ] 270 1 1 }
( -272 0 16 ) ( -272 0 17 ) ( -272 2 16 ) tile191 [ 0 0.5 0 0 ] [ 0 0 -1 0 ] 270 1 1 }
} // entity 4
// brush 5 {
{ "classname" "func_destructablewall"
( -272 -256 -16 ) ( -272 -254 -16 ) ( -272 -256 -15 ) tile191 [ 0 -0.5 0 0 ] [ 0 0 -1 0 ] 270 1 1 "extrude_direction" "2"
( -272 -256 -16 ) ( -272 -256 -15 ) ( -269.875 -256 -16 ) tile191 [ 0.47058823529411775 0 0 0 ] [ 0 0 -1 0 ] 270 1 1 // brush 0
( -272 -256 -16 ) ( -269.875 -256 -16 ) ( -272 -254 -16 ) tile191 [ -0.47058823529411775 0 0 0 ] [ 0 -0.5 0 0 ] 270 1 1 {
( 0 0 16 ) ( 0 2 16 ) ( 2.125 0 16 ) tile191 [ 0.47058823529411775 0 0 0 ] [ 0 -0.5 0 0 ] 270 1 1 ( -208 320 32 ) ( -208 320 33 ) ( -208 319 32 ) tile043 [ 0 1 0 0 ] [ 0 0 -1 0 ] 270 1 1
( 0 0 16 ) ( 2.125 0 16 ) ( 0 0 17 ) tile191 [ -0.47058823529411775 0 0 0 ] [ 0 0 -1 0 ] 270 1 1 ( -160 269 32 ) ( -161 269 32 ) ( -160 269 33 ) tile043 [ -1 0 0 0 ] [ 0 0 -1 0 ] 0 1 1
( 0 0 16 ) ( 0 0 17 ) ( 0 2 16 ) tile191 [ 0 0.5 0 0 ] [ 0 0 -1 0 ] 270 1 1 ( -80 400 16 ) ( -81 400 16 ) ( -80 399 16 ) tile043 [ -1 0 0 0 ] [ 0 -1 0 0 ] 0 1 1
} ( -160 320 32 ) ( -160 319 32 ) ( -161 320 32 ) tile043 [ 1 0 0 0 ] [ 0 -1 0 0 ] 270 1 1
// brush 6 ( -80 368 16 ) ( -80 368 17 ) ( -81 368 16 ) tile043 [ 1 0 0 0 ] [ 0 0 -1 0 ] 0 1 1
{ ( -80 400 16 ) ( -80 399 16 ) ( -80 400 17 ) tile043 [ 0 -1 0 0 ] [ 0 0 -1 0 ] 0 1 1
( 0 -256 -16 ) ( 0 -254 -16 ) ( 0 -256 -15 ) tile191 [ 0 -0.5 0 0 ] [ 0 0 -1 0 ] 180 1 1 }
( 0 -256 -16 ) ( 0 -256 -15 ) ( 2.125 -256 -16 ) tile191 [ 0.47058823529411775 0 0 0 ] [ 0 0 -1 0 ] 180 1 1 }
( 0 -256 -16 ) ( 2.125 -256 -16 ) ( 0 -254 -16 ) tile191 [ -0.47058823529411775 0 0 0 ] [ 0 -0.5 0 0 ] 180 1 1 // entity 5
( 272 0 16 ) ( 272 2 16 ) ( 274.125 0 16 ) tile191 [ 0.47058823529411775 0 0 0 ] [ 0 -0.5 0 0 ] 180 1 1 {
( 272 0 16 ) ( 274.125 0 16 ) ( 272 0 17 ) tile191 [ -0.47058823529411775 0 0 0 ] [ 0 0 -1 0 ] 180 1 1 "classname" "func_destructablewall"
( 272 0 16 ) ( 272 0 17 ) ( 272 2 16 ) tile191 [ 0 0.5 0 0 ] [ 0 0 -1 0 ] 180 1 1 // brush 0
} {
// brush 7 ( 64 80 32 ) ( 64 80 33 ) ( 64 79 32 ) tile043 [ 0 1 0 0 ] [ 0 0 -1 0 ] 270 1 1
{ ( 0 29 32 ) ( -1 29 32 ) ( 0 29 33 ) tile043 [ -1 0 0 0 ] [ 0 0 -1 0 ] 0 1 1
( 272 -256 -16 ) ( 272 -254 -16 ) ( 272 -256 -15 ) tile191 [ 0 -0.5 0 0 ] [ 0 0 -1 0 ] 180 1 1 ( 80 160 16 ) ( 79 160 16 ) ( 80 159 16 ) tile043 [ -1 0 0 0 ] [ 0 -1 0 0 ] 0 1 1
( 272 -256 -16 ) ( 272 -256 -15 ) ( 274.125 -256 -16 ) tile191 [ 0.47058823529411775 0 0 0 ] [ 0 0 -1 0 ] 180 1 1 ( 0 80 112 ) ( 0 79 112 ) ( -1 80 112 ) tile043 [ 1 0 0 0 ] [ 0 -1 0 0 ] 270 1 1
( 272 -256 -16 ) ( 274.125 -256 -16 ) ( 272 -254 -16 ) tile191 [ -0.47058823529411775 0 0 0 ] [ 0 -0.5 0 0 ] 180 1 1 ( 80 96 16 ) ( 80 96 17 ) ( 79 96 16 ) tile043 [ 1 0 0 0 ] [ 0 0 -1 0 ] 0 1 1
( 544 0 16 ) ( 544 2 16 ) ( 546.125 0 16 ) tile191 [ 0.47058823529411775 0 0 0 ] [ 0 -0.5 0 0 ] 180 1 1 ( 96 160 16 ) ( 96 159 16 ) ( 96 160 17 ) tile043 [ 0 -1 0 0 ] [ 0 0 -1 0 ] 0 1 1
( 544 0 16 ) ( 546.125 0 16 ) ( 544 0 17 ) tile191 [ -0.47058823529411775 0 0 0 ] [ 0 0 -1 0 ] 180 1 1 }
( 544 0 16 ) ( 544 0 17 ) ( 544 2 16 ) tile191 [ 0 0.5 0 0 ] [ 0 0 -1 0 ] 180 1 1 }
} // entity 6
// brush 8 {
{ "classname" "func_destructablewall"
( 0 0 -16 ) ( 0 2 -16 ) ( 0 0 -15 ) tile191 [ 0 -0.5 0 0 ] [ 0 0 -1 0 ] 270 1 1 "extrude_direction" "1"
( 0 0 -16 ) ( 0 0 -15 ) ( 2.125 0 -16 ) tile191 [ 0.47058823529411775 0 0 0 ] [ 0 0 -1 0 ] 270 1 1 // brush 0
( 0 0 -16 ) ( 2.125 0 -16 ) ( 0 2 -16 ) tile191 [ -0.47058823529411775 0 0 0 ] [ 0 -0.5 0 0 ] 270 1 1 {
( 272 256 16 ) ( 272 258 16 ) ( 274.125 256 16 ) tile191 [ 0.47058823529411775 0 0 0 ] [ 0 -0.5 0 0 ] 270 1 1 ( 0 -80 16 ) ( 0 -80 17 ) ( 0 -81 16 ) tile043 [ 2.220446049250313e-16 1 0 0 ] [ 0 0 -1 0 ] 0 1 1
( 272 256 16 ) ( 274.125 256 16 ) ( 272 256 17 ) tile191 [ -0.47058823529411775 0 0 0 ] [ 0 0 -1 0 ] 270 1 1 ( 112 -128 32 ) ( 112 -128 33 ) ( 113 -128 32 ) tile043 [ -1 2.220446049250313e-16 0 0 ] [ 0 0 -1 0 ] 270 1 1
( 272 256 16 ) ( 272 256 17 ) ( 272 258 16 ) tile191 [ 0 0.5 0 0 ] [ 0 0 -1 0 ] 270 1 1 ( 32 -80 16 ) ( 32 -81 16 ) ( 33 -80 16 ) tile043 [ -1 0 0 0 ] [ 0 -1 0 0 ] 0 1 1
} ( 112 -160 112 ) ( 113 -160 112 ) ( 112 -161 112 ) tile043 [ 1 0 0 0 ] [ 0 -1 0 0 ] 270 1 1
// brush 9 ( 32 -112 16 ) ( 33 -112 16 ) ( 32 -112 17 ) tile043 [ 1 -2.220446049250313e-16 0 0 ] [ 0 0 -1 0 ] 0 1 1
{ ( 163 -160 32 ) ( 163 -161 32 ) ( 163 -160 33 ) tile043 [ -2.220446049250313e-16 -1 0 0 ] [ 0 0 -1 0 ] 0 1 1
( -272 0 -16 ) ( -272 2 -16 ) ( -272 0 -15 ) tile191 [ 0 -0.5 0 0 ] [ 0 0 -1 0 ] 270 1 1 }
( -272 0 -16 ) ( -272 0 -15 ) ( -269.875 0 -16 ) tile191 [ 0.47058823529411775 0 0 0 ] [ 0 0 -1 0 ] 270 1 1 }
( -272 0 -16 ) ( -269.875 0 -16 ) ( -272 2 -16 ) tile191 [ -0.47058823529411775 0 0 0 ] [ 0 -0.5 0 0 ] 270 1 1 // entity 7
( 0 256 16 ) ( 0 258 16 ) ( 2.125 256 16 ) tile191 [ 0.47058823529411775 0 0 0 ] [ 0 -0.5 0 0 ] 270 1 1 {
( 0 256 16 ) ( 2.125 256 16 ) ( 0 256 17 ) tile191 [ -0.47058823529411775 0 0 0 ] [ 0 0 -1 0 ] 270 1 1 "classname" "func_destructablewall"
( 0 256 16 ) ( 0 256 17 ) ( 0 258 16 ) tile191 [ 0 0.5 0 0 ] [ 0 0 -1 0 ] 270 1 1 "extrude_direction" "2"
} // brush 0
// brush 10 {
{ ( -144 64 48 ) ( -144 64 16 ) ( -128 128 16 ) tile043 [ 0 -1 0 0 ] [ 0 0 -1 0 ] 0 1 1
( -544 0 -16 ) ( -544 2 -16 ) ( -544 0 -15 ) tile191 [ 0 -0.5 0 0 ] [ 0 0 -1 0 ] 270 1 1 ( -128 128 16 ) ( -96 128 48 ) ( -144 64 48 ) tile043 [ 0 -1 0 0 ] [ 0 0 -1 0 ] 0 1 1
( -544 0 -16 ) ( -544 0 -15 ) ( -541.875 0 -16 ) tile191 [ 0.47058823529411775 0 0 0 ] [ 0 0 -1 0 ] 270 1 1 ( -144 64 48 ) ( -96 64 48 ) ( -96 64 16 ) tile043 [ 1 0 0 0 ] [ 0 0 -1 0 ] 0 1 1
( -544 0 -16 ) ( -541.875 0 -16 ) ( -544 2 -16 ) tile191 [ -0.47058823529411775 0 0 0 ] [ 0 -0.5 0 0 ] 270 1 1 ( -96 64 16 ) ( -96 128 16 ) ( -128 128 16 ) tile043 [ -1 0 0 0 ] [ 0 -1 0 0 ] 0 1 1
( -272 256 16 ) ( -272 258 16 ) ( -269.875 256 16 ) tile191 [ 0.47058823529411775 0 0 0 ] [ 0 -0.5 0 0 ] 270 1 1 ( -144 64 48 ) ( -96 128 48 ) ( -96 64 48 ) tile043 [ 1 0 0 0 ] [ 0 -1 0 0 ] 0 1 1
( -272 256 16 ) ( -269.875 256 16 ) ( -272 256 17 ) tile191 [ -0.47058823529411775 0 0 0 ] [ 0 0 -1 0 ] 270 1 1 ( -96 128 16 ) ( -96 128 48 ) ( -128 128 16 ) tile043 [ -1 0 0 0 ] [ 0 0 -1 0 ] 0 1 1
( -272 256 16 ) ( -272 256 17 ) ( -272 258 16 ) tile191 [ 0 0.5 0 0 ] [ 0 0 -1 0 ] 270 1 1 ( -96 64 48 ) ( -96 128 48 ) ( -96 128 16 ) tile043 [ 0 1 0 0 ] [ 0 0 -1 0 ] 0 1 1
} }
// brush 11 }
{ // entity 8
( 272 0 -16 ) ( 272 2 -16 ) ( 272 0 -15 ) tile191 [ 0 -0.5 0 0 ] [ 0 0 -1 0 ] 270 1 1 {
( 272 0 -16 ) ( 272 0 -15 ) ( 274.125 0 -16 ) tile191 [ 0.47058823529411775 0 0 0 ] [ 0 0 -1 0 ] 270 1 1 "classname" "func_destructablewall"
( 272 0 -16 ) ( 274.125 0 -16 ) ( 272 2 -16 ) tile191 [ -0.47058823529411775 0 0 0 ] [ 0 -0.5 0 0 ] 270 1 1 // brush 0
( 544 256 16 ) ( 544 258 16 ) ( 546.125 256 16 ) tile191 [ 0.47058823529411775 0 0 0 ] [ 0 -0.5 0 0 ] 270 1 1 {
( 544 256 16 ) ( 546.125 256 16 ) ( 544 256 17 ) tile191 [ -0.47058823529411775 0 0 0 ] [ 0 0 -1 0 ] 270 1 1 ( 128 0 32 ) ( 128 0 33 ) ( 128 -1 32 ) tile043 [ 0 1 0 0 ] [ 0 0 -1 0 ] 270 1 1
( 544 256 16 ) ( 544 256 17 ) ( 544 258 16 ) tile191 [ 0 0.5 0 0 ] [ 0 0 -1 0 ] 270 1 1 ( 64 -51 32 ) ( 63 -51 32 ) ( 64 -51 33 ) tile043 [ -1 0 0 0 ] [ 0 0 -1 0 ] 0 1 1
} ( 144 80 16 ) ( 143 80 16 ) ( 144 79 16 ) tile043 [ -1 0 0 0 ] [ 0 -1 0 0 ] 0 1 1
// brush 12 ( 64 0 112 ) ( 64 -1 112 ) ( 63 0 112 ) tile043 [ 1 0 0 0 ] [ 0 -1 0 0 ] 270 1 1
{ ( 144 16 16 ) ( 144 16 17 ) ( 143 16 16 ) tile043 [ 1 0 0 0 ] [ 0 0 -1 0 ] 0 1 1
( 272 256 -16 ) ( 272 258 -16 ) ( 272 256 -15 ) tile191 [ 0 -0.5 0 0 ] [ 0 0 -1 0 ] 90 1 1 ( 129 80 16 ) ( 129 79 16 ) ( 129 80 17 ) tile043 [ 0 -1 0 0 ] [ 0 0 -1 0 ] 0 1 1
( 272 256 -16 ) ( 272 256 -15 ) ( 274.125 256 -16 ) tile191 [ 0.47058823529411775 0 0 0 ] [ 0 0 -1 0 ] 90 1 1 }
( 272 256 -16 ) ( 274.125 256 -16 ) ( 272 258 -16 ) tile191 [ -0.47058823529411775 0 0 0 ] [ 0 -0.5 0 0 ] 90 1 1 }
( 544 512 16 ) ( 544 514 16 ) ( 546.125 512 16 ) tile191 [ 0.47058823529411775 0 0 0 ] [ 0 -0.5 0 0 ] 90 1 1
( 544 512 16 ) ( 546.125 512 16 ) ( 544 512 17 ) tile191 [ -0.47058823529411775 0 0 0 ] [ 0 0 -1 0 ] 90 1 1
( 544 512 16 ) ( 544 512 17 ) ( 544 514 16 ) tile191 [ 0 0.5 0 0 ] [ 0 0 -1 0 ] 90 1 1
}
// brush 13
{
( 0 256 -16 ) ( 0 258 -16 ) ( 0 256 -15 ) tile191 [ 0 -0.5 0 0 ] [ 0 0 -1 0 ] 90 1 1
( 0 256 -16 ) ( 0 256 -15 ) ( 2.125 256 -16 ) tile191 [ 0.47058823529411775 0 0 0 ] [ 0 0 -1 0 ] 90 1 1
( 0 256 -16 ) ( 2.125 256 -16 ) ( 0 258 -16 ) tile191 [ -0.47058823529411775 0 0 0 ] [ 0 -0.5 0 0 ] 90 1 1
( 272 512 16 ) ( 272 514 16 ) ( 274.125 512 16 ) tile191 [ 0.47058823529411775 0 0 0 ] [ 0 -0.5 0 0 ] 90 1 1
( 272 512 16 ) ( 274.125 512 16 ) ( 272 512 17 ) tile191 [ -0.47058823529411775 0 0 0 ] [ 0 0 -1 0 ] 90 1 1
( 272 512 16 ) ( 272 512 17 ) ( 272 514 16 ) tile191 [ 0 0.5 0 0 ] [ 0 0 -1 0 ] 90 1 1
}
// brush 14
{
( -272 256 -16 ) ( -272 258 -16 ) ( -272 256 -15 ) tile191 [ 0 -0.5 0 0 ] [ 0 0 -1 0 ] 90 1 1
( -272 256 -16 ) ( -272 256 -15 ) ( -269.875 256 -16 ) tile191 [ 0.47058823529411775 0 0 0 ] [ 0 0 -1 0 ] 90 1 1
( -272 256 -16 ) ( -269.875 256 -16 ) ( -272 258 -16 ) tile191 [ -0.47058823529411775 0 0 0 ] [ 0 -0.5 0 0 ] 90 1 1
( 0 512 16 ) ( 0 514 16 ) ( 2.125 512 16 ) tile191 [ 0.47058823529411775 0 0 0 ] [ 0 -0.5 0 0 ] 90 1 1
( 0 512 16 ) ( 2.125 512 16 ) ( 0 512 17 ) tile191 [ -0.47058823529411775 0 0 0 ] [ 0 0 -1 0 ] 90 1 1
( 0 512 16 ) ( 0 512 17 ) ( 0 514 16 ) tile191 [ 0 0.5 0 0 ] [ 0 0 -1 0 ] 90 1 1
}
// brush 15
{
( -544 256 -16 ) ( -544 258 -16 ) ( -544 256 -15 ) tile191 [ 0 -0.5 0 0 ] [ 0 0 -1 0 ] 90 1 1
( -544 256 -16 ) ( -544 256 -15 ) ( -541.875 256 -16 ) tile191 [ 0.47058823529411775 0 0 0 ] [ 0 0 -1 0 ] 90 1 1
( -544 256 -16 ) ( -541.875 256 -16 ) ( -544 258 -16 ) tile191 [ -0.47058823529411775 0 0 0 ] [ 0 -0.5 0 0 ] 90 1 1
( -272 512 16 ) ( -272 514 16 ) ( -269.875 512 16 ) tile191 [ 0.47058823529411775 0 0 0 ] [ 0 -0.5 0 0 ] 90 1 1
( -272 512 16 ) ( -269.875 512 16 ) ( -272 512 17 ) tile191 [ -0.47058823529411775 0 0 0 ] [ 0 0 -1 0 ] 90 1 1
( -272 512 16 ) ( -272 512 17 ) ( -272 514 16 ) tile191 [ 0 0.5 0 0 ] [ 0 0 -1 0 ] 90 1 1
}
}
// entity 2
{
"classname" "func_destructable"
"_tb_group" "1"
// brush 0
{
( 96 -144 -16 ) ( 96 -142 -16 ) ( 96 -144 -15 ) tile017 [ 0 -0.5 0 -8 ] [ 0 0 -1 0 ] 270 1 1
( 96 -144 -16 ) ( 96 -144 -15 ) ( 98.125 -144 -16 ) tile017 [ 0.47058823529411775 0 0 -13.176468 ] [ 0 0 -1 0 ] 270 1 1
( 96 -144 48 ) ( 98.125 -144 48 ) ( 96 -142 48 ) tile017 [ -0.47058823529411775 0 0 13.176468 ] [ 0 -0.5 0 -8 ] 180 1 1
( 368 112 144 ) ( 368 114 144 ) ( 370.125 112 144 ) tile017 [ 0.47058823529411775 0 0 -13.176468 ] [ 0 -0.5 0 -8 ] 90 1 1
( 368 112 16 ) ( 370.125 112 16 ) ( 368 112 17 ) tile017 [ -0.47058823529411775 0 0 13.176468 ] [ 0 0 -1 0 ] 270 1 1
( 112 112 16 ) ( 112 112 17 ) ( 112 114 16 ) tile017 [ 0 0.5 0 8 ] [ 0 0 -1 0 ] 90 1 1
}
}

View File

@@ -1,153 +1,130 @@
// Game: demo // Game: demo
// Format: Valve // Format: Valve
// entity 0 // entity 0
{ {
"mapversion" "220" "mapversion" "220"
"wad" "" "wad" ""
"classname" "worldspawn" "classname" "worldspawn"
"_tb_mod" "trenchbroom" "_tb_mod" "trenchbroom"
// brush 0 // brush 0
{ {
( 272 -512 -16 ) ( 272 -510 -16 ) ( 272 -512 -15 ) tile191 [ 0 -0.5 0 0 ] [ 0 0 -1 0 ] 0 1 1 ( -176 -64 -16 ) ( -176 -63 -16 ) ( -176 -64 -15 ) tile013 [ 0 -1 0 0 ] [ 0 0 -1 0 ] 180 1 1
( 272 -512 -16 ) ( 272 -512 -15 ) ( 274.125 -512 -16 ) tile191 [ 0.47058823529411775 0 0 0 ] [ 0 0 -1 0 ] 0 1 1 ( -64 -224 -16 ) ( -64 -224 -15 ) ( -63 -224 -16 ) tile013 [ 1 0 0 0 ] [ 0 0 -1 0 ] 180 1 1
( 272 -512 -16 ) ( 274.125 -512 -16 ) ( 272 -510 -16 ) tile191 [ -0.47058823529411775 0 0 0 ] [ 0 -0.5 0 0 ] 0 1 1 ( -64 -64 -16 ) ( -63 -64 -16 ) ( -64 -63 -16 ) tile013 [ -1 0 0 0 ] [ 0 -1 0 0 ] 0 1 1
( 544 -256 16 ) ( 544 -254 16 ) ( 546.125 -256 16 ) tile191 [ 0.47058823529411775 0 0 0 ] [ 0 -0.5 0 0 ] 0 1 1 ( 64 64 16 ) ( 64 65 16 ) ( 65 64 16 ) tile013 [ 1 0 0 0 ] [ 0 -1 0 0 ] 0 1 1
( 544 -256 16 ) ( 546.125 -256 16 ) ( 544 -256 17 ) tile191 [ -0.47058823529411775 0 0 0 ] [ 0 0 -1 0 ] 0 1 1 ( 64 224 16 ) ( 65 224 16 ) ( 64 224 17 ) tile013 [ -1 0 0 0 ] [ 0 0 -1 0 ] 180 1 1
( 544 -256 16 ) ( 544 -256 17 ) ( 544 -254 16 ) tile191 [ 0 0.5 0 0 ] [ 0 0 -1 0 ] 0 1 1 ( 192 64 16 ) ( 192 64 17 ) ( 192 65 16 ) tile013 [ 0 1 0 0 ] [ 0 0 -1 0 ] 180 1 1
} }
// brush 1 }
{ // entity 1
( 0 -512 -16 ) ( 0 -510 -16 ) ( 0 -512 -15 ) tile191 [ 0 -0.5 0 0 ] [ 0 0 -1 0 ] 0 1 1 {
( 0 -512 -16 ) ( 0 -512 -15 ) ( 2.125 -512 -16 ) tile191 [ 0.47058823529411775 0 0 0 ] [ 0 0 -1 0 ] 0 1 1 "classname" "func_movingplatform"
( 0 -512 -16 ) ( 2.125 -512 -16 ) ( 0 -510 -16 ) tile191 [ -0.47058823529411775 0 0 0 ] [ 0 -0.5 0 0 ] 0 1 1 "move_distance" "2"
( 272 -256 16 ) ( 272 -254 16 ) ( 274.125 -256 16 ) tile191 [ 0.47058823529411775 0 0 0 ] [ 0 -0.5 0 0 ] 0 1 1 "move_time" "2"
( 272 -256 16 ) ( 274.125 -256 16 ) ( 272 -256 17 ) tile191 [ -0.47058823529411775 0 0 0 ] [ 0 0 -1 0 ] 0 1 1 "move_direction" "0.0 1.0 0.0"
( 272 -256 16 ) ( 272 -256 17 ) ( 272 -254 16 ) tile191 [ 0 0.5 0 0 ] [ 0 0 -1 0 ] 0 1 1 // brush 0
} {
// brush 2 ( 272 -64 -16 ) ( 272 -63 -16 ) ( 272 -64 -15 ) tile002 [ 0 -1 0 0 ] [ 0 0 -1 0 ] 0 1 1
{ ( 384 -224 -16 ) ( 384 -224 -15 ) ( 385 -224 -16 ) tile002 [ 1 0 0 0 ] [ 0 0 -1 0 ] 0 1 1
( -272 -512 -16 ) ( -272 -510 -16 ) ( -272 -512 -15 ) tile191 [ 0 -0.5 0 0 ] [ 0 0 -1 0 ] 90 1 1 ( 384 -64 -16 ) ( 385 -64 -16 ) ( 384 -63 -16 ) tile002 [ -1 0 0 0 ] [ 0 -1 0 0 ] 180 1 1
( -272 -512 -16 ) ( -272 -512 -15 ) ( -269.875 -512 -16 ) tile191 [ 0.47058823529411775 0 0 0 ] [ 0 0 -1 0 ] 90 1 1 ( 512 64 16 ) ( 512 65 16 ) ( 513 64 16 ) tile002 [ 1 0 0 0 ] [ 0 -1 0 0 ] 180 1 1
( -272 -512 -16 ) ( -269.875 -512 -16 ) ( -272 -510 -16 ) tile191 [ -0.47058823529411775 0 0 0 ] [ 0 -0.5 0 0 ] 90 1 1 ( 512 224 16 ) ( 513 224 16 ) ( 512 224 17 ) tile002 [ -1 0 0 0 ] [ 0 0 -1 0 ] 0 1 1
( 0 -256 16 ) ( 0 -254 16 ) ( 2.125 -256 16 ) tile191 [ 0.47058823529411775 0 0 0 ] [ 0 -0.5 0 0 ] 90 1 1 ( 640 64 16 ) ( 640 64 17 ) ( 640 65 16 ) tile002 [ 0 1 0 0 ] [ 0 0 -1 0 ] 0 1 1
( 0 -256 16 ) ( 2.125 -256 16 ) ( 0 -256 17 ) tile191 [ -0.47058823529411775 0 0 0 ] [ 0 0 -1 0 ] 90 1 1 }
( 0 -256 16 ) ( 0 -256 17 ) ( 0 -254 16 ) tile191 [ 0 0.5 0 0 ] [ 0 0 -1 0 ] 90 1 1 }
} // entity 2
// brush 3 {
{ "classname" "func_destructablewall"
( -544 -512 -16 ) ( -544 -510 -16 ) ( -544 -512 -15 ) tile191 [ 0 -0.5 0 0 ] [ 0 0 -1 0 ] 90 1 1 // brush 0
( -544 -512 -16 ) ( -544 -512 -15 ) ( -541.875 -512 -16 ) tile191 [ 0.47058823529411775 0 0 0 ] [ 0 0 -1 0 ] 90 1 1 {
( -544 -512 -16 ) ( -541.875 -512 -16 ) ( -544 -510 -16 ) tile191 [ -0.47058823529411775 0 0 0 ] [ 0 -0.5 0 0 ] 90 1 1 ( 64 0 32 ) ( 64 0 33 ) ( 64 -1 32 ) tile043 [ 0 1 0 0 ] [ 0 0 -1 0 ] 270 1 1
( -272 -256 16 ) ( -272 -254 16 ) ( -269.875 -256 16 ) tile191 [ 0.47058823529411775 0 0 0 ] [ 0 -0.5 0 0 ] 90 1 1 ( 0 -48 32 ) ( -1 -48 32 ) ( 0 -48 33 ) tile043 [ -1 0 0 0 ] [ 0 0 -1 0 ] 0 1 1
( -272 -256 16 ) ( -269.875 -256 16 ) ( -272 -256 17 ) tile191 [ -0.47058823529411775 0 0 0 ] [ 0 0 -1 0 ] 90 1 1 ( 80 80 16 ) ( 79 80 16 ) ( 80 79 16 ) tile043 [ -1 0 0 0 ] [ 0 -1 0 0 ] 0 1 1
( -272 -256 16 ) ( -272 -256 17 ) ( -272 -254 16 ) tile191 [ 0 0.5 0 0 ] [ 0 0 -1 0 ] 90 1 1 ( 0 0 112 ) ( 0 -1 112 ) ( -1 0 112 ) tile043 [ 1 0 0 0 ] [ 0 -1 0 0 ] 270 1 1
} ( 80 16 16 ) ( 80 16 17 ) ( 79 16 16 ) tile043 [ 1 0 0 0 ] [ 0 0 -1 0 ] 0 1 1
// brush 4 ( 96 80 16 ) ( 96 79 16 ) ( 96 80 17 ) tile043 [ 0 -1 0 0 ] [ 0 0 -1 0 ] 0 1 1
{ }
( -544 -256 -16 ) ( -544 -254 -16 ) ( -544 -256 -15 ) tile191 [ 0 -0.5 0 0 ] [ 0 0 -1 0 ] 270 1 1 }
( -544 -256 -16 ) ( -544 -256 -15 ) ( -541.875 -256 -16 ) tile191 [ 0.47058823529411775 0 0 0 ] [ 0 0 -1 0 ] 270 1 1 // entity 3
( -544 -256 -16 ) ( -541.875 -256 -16 ) ( -544 -254 -16 ) tile191 [ -0.47058823529411775 0 0 0 ] [ 0 -0.5 0 0 ] 270 1 1 {
( -272 0 16 ) ( -272 2 16 ) ( -269.875 0 16 ) tile191 [ 0.47058823529411775 0 0 0 ] [ 0 -0.5 0 0 ] 270 1 1 "classname" "func_destructablewall"
( -272 0 16 ) ( -269.875 0 16 ) ( -272 0 17 ) tile191 [ -0.47058823529411775 0 0 0 ] [ 0 0 -1 0 ] 270 1 1 "extrude_direction" "1"
( -272 0 16 ) ( -272 0 17 ) ( -272 2 16 ) tile191 [ 0 0.5 0 0 ] [ 0 0 -1 0 ] 270 1 1 // brush 0
} {
// brush 5 ( -176 -96 16 ) ( -176 -96 17 ) ( -176 -97 16 ) "Stone Base/albedo" [ 0 -1 0 0 ] [ -0 -0 -1 0 ] 0 1 1
{ ( -64 -144 32 ) ( -64 -144 33 ) ( -63 -144 32 ) "Stone Base/albedo" [ 1 0 0 0 ] [ 0 0 -1 320 ] 0 0.05 0.05
( -272 -256 -16 ) ( -272 -254 -16 ) ( -272 -256 -15 ) tile191 [ 0 -0.5 0 0 ] [ 0 0 -1 0 ] 270 1 1 ( -144 -96 16 ) ( -144 -97 16 ) ( -143 -96 16 ) "Stone Base/albedo" [ -1 0 0 0 ] [ -0 -1 -0 0 ] 0 1 1
( -272 -256 -16 ) ( -272 -256 -15 ) ( -269.875 -256 -16 ) tile191 [ 0.47058823529411775 0 0 0 ] [ 0 0 -1 0 ] 270 1 1 ( -64 -176 112 ) ( -63 -176 112 ) ( -64 -177 112 ) "Stone Base/albedo" [ 1 -0 0 0 ] [ -0 -1 0 0 ] 0 1 1
( -272 -256 -16 ) ( -269.875 -256 -16 ) ( -272 -254 -16 ) tile191 [ -0.47058823529411775 0 0 0 ] [ 0 -0.5 0 0 ] 270 1 1 ( -144 -128 16 ) ( -143 -128 16 ) ( -144 -128 17 ) "Stone Base/albedo" [ -1 0 0 0 ] [ 0 0 -1 0 ] 0 1 1
( 0 0 16 ) ( 0 2 16 ) ( 2.125 0 16 ) tile191 [ 0.47058823529411775 0 0 0 ] [ 0 -0.5 0 0 ] 270 1 1 ( -13 -176 32 ) ( -13 -177 32 ) ( -13 -176 33 ) "Stone Base/albedo" [ -0 1 0 0 ] [ -0 0 -1 0 ] 0 1 1
( 0 0 16 ) ( 2.125 0 16 ) ( 0 0 17 ) tile191 [ -0.47058823529411775 0 0 0 ] [ 0 0 -1 0 ] 270 1 1 }
( 0 0 16 ) ( 0 0 17 ) ( 0 2 16 ) tile191 [ 0 0.5 0 0 ] [ 0 0 -1 0 ] 270 1 1 }
} // entity 4
// brush 6 {
{ "classname" "func_destructablewall"
( 0 -256 -16 ) ( 0 -254 -16 ) ( 0 -256 -15 ) tile191 [ 0 -0.5 0 0 ] [ 0 0 -1 0 ] 180 1 1 "extrude_direction" "2"
( 0 -256 -16 ) ( 0 -256 -15 ) ( 2.125 -256 -16 ) tile191 [ 0.47058823529411775 0 0 0 ] [ 0 0 -1 0 ] 180 1 1 // brush 0
( 0 -256 -16 ) ( 2.125 -256 -16 ) ( 0 -254 -16 ) tile191 [ -0.47058823529411775 0 0 0 ] [ 0 -0.5 0 0 ] 180 1 1 {
( 272 0 16 ) ( 272 2 16 ) ( 274.125 0 16 ) tile191 [ 0.47058823529411775 0 0 0 ] [ 0 -0.5 0 0 ] 180 1 1 ( -208 320 32 ) ( -208 320 33 ) ( -208 319 32 ) tile043 [ 0 1 0 0 ] [ 0 0 -1 0 ] 270 1 1
( 272 0 16 ) ( 274.125 0 16 ) ( 272 0 17 ) tile191 [ -0.47058823529411775 0 0 0 ] [ 0 0 -1 0 ] 180 1 1 ( -160 269 32 ) ( -161 269 32 ) ( -160 269 33 ) tile043 [ -1 0 0 0 ] [ 0 0 -1 0 ] 0 1 1
( 272 0 16 ) ( 272 0 17 ) ( 272 2 16 ) tile191 [ 0 0.5 0 0 ] [ 0 0 -1 0 ] 180 1 1 ( -80 400 16 ) ( -81 400 16 ) ( -80 399 16 ) tile043 [ -1 0 0 0 ] [ 0 -1 0 0 ] 0 1 1
} ( -160 320 32 ) ( -160 319 32 ) ( -161 320 32 ) tile043 [ 1 0 0 0 ] [ 0 -1 0 0 ] 270 1 1
// brush 7 ( -80 368 16 ) ( -80 368 17 ) ( -81 368 16 ) tile043 [ 1 0 0 0 ] [ 0 0 -1 0 ] 0 1 1
{ ( -80 400 16 ) ( -80 399 16 ) ( -80 400 17 ) tile043 [ 0 -1 0 0 ] [ 0 0 -1 0 ] 0 1 1
( 272 -256 -16 ) ( 272 -254 -16 ) ( 272 -256 -15 ) tile191 [ 0 -0.5 0 0 ] [ 0 0 -1 0 ] 180 1 1 }
( 272 -256 -16 ) ( 272 -256 -15 ) ( 274.125 -256 -16 ) tile191 [ 0.47058823529411775 0 0 0 ] [ 0 0 -1 0 ] 180 1 1 }
( 272 -256 -16 ) ( 274.125 -256 -16 ) ( 272 -254 -16 ) tile191 [ -0.47058823529411775 0 0 0 ] [ 0 -0.5 0 0 ] 180 1 1 // entity 5
( 544 0 16 ) ( 544 2 16 ) ( 546.125 0 16 ) tile191 [ 0.47058823529411775 0 0 0 ] [ 0 -0.5 0 0 ] 180 1 1 {
( 544 0 16 ) ( 546.125 0 16 ) ( 544 0 17 ) tile191 [ -0.47058823529411775 0 0 0 ] [ 0 0 -1 0 ] 180 1 1 "classname" "func_destructablewall"
( 544 0 16 ) ( 544 0 17 ) ( 544 2 16 ) tile191 [ 0 0.5 0 0 ] [ 0 0 -1 0 ] 180 1 1 // brush 0
} {
// brush 8 ( 64 80 32 ) ( 64 80 33 ) ( 64 79 32 ) tile043 [ 0 1 0 0 ] [ 0 0 -1 0 ] 270 1 1
{ ( 0 29 32 ) ( -1 29 32 ) ( 0 29 33 ) tile043 [ -1 0 0 0 ] [ 0 0 -1 0 ] 0 1 1
( 0 0 -16 ) ( 0 2 -16 ) ( 0 0 -15 ) tile191 [ 0 -0.5 0 0 ] [ 0 0 -1 0 ] 270 1 1 ( 80 160 16 ) ( 79 160 16 ) ( 80 159 16 ) tile043 [ -1 0 0 0 ] [ 0 -1 0 0 ] 0 1 1
( 0 0 -16 ) ( 0 0 -15 ) ( 2.125 0 -16 ) tile191 [ 0.47058823529411775 0 0 0 ] [ 0 0 -1 0 ] 270 1 1 ( 0 80 112 ) ( 0 79 112 ) ( -1 80 112 ) tile043 [ 1 0 0 0 ] [ 0 -1 0 0 ] 270 1 1
( 0 0 -16 ) ( 2.125 0 -16 ) ( 0 2 -16 ) tile191 [ -0.47058823529411775 0 0 0 ] [ 0 -0.5 0 0 ] 270 1 1 ( 80 96 16 ) ( 80 96 17 ) ( 79 96 16 ) tile043 [ 1 0 0 0 ] [ 0 0 -1 0 ] 0 1 1
( 272 256 16 ) ( 272 258 16 ) ( 274.125 256 16 ) tile191 [ 0.47058823529411775 0 0 0 ] [ 0 -0.5 0 0 ] 270 1 1 ( 96 160 16 ) ( 96 159 16 ) ( 96 160 17 ) tile043 [ 0 -1 0 0 ] [ 0 0 -1 0 ] 0 1 1
( 272 256 16 ) ( 274.125 256 16 ) ( 272 256 17 ) tile191 [ -0.47058823529411775 0 0 0 ] [ 0 0 -1 0 ] 270 1 1 }
( 272 256 16 ) ( 272 256 17 ) ( 272 258 16 ) tile191 [ 0 0.5 0 0 ] [ 0 0 -1 0 ] 270 1 1 }
} // entity 6
// brush 9 {
{ "classname" "func_destructablewall"
( -272 0 -16 ) ( -272 2 -16 ) ( -272 0 -15 ) tile191 [ 0 -0.5 0 0 ] [ 0 0 -1 0 ] 270 1 1 "extrude_direction" "1"
( -272 0 -16 ) ( -272 0 -15 ) ( -269.875 0 -16 ) tile191 [ 0.47058823529411775 0 0 0 ] [ 0 0 -1 0 ] 270 1 1 // brush 0
( -272 0 -16 ) ( -269.875 0 -16 ) ( -272 2 -16 ) tile191 [ -0.47058823529411775 0 0 0 ] [ 0 -0.5 0 0 ] 270 1 1 {
( 0 256 16 ) ( 0 258 16 ) ( 2.125 256 16 ) tile191 [ 0.47058823529411775 0 0 0 ] [ 0 -0.5 0 0 ] 270 1 1 ( 0 -80 16 ) ( 0 -80 17 ) ( 0 -81 16 ) tile043 [ 2.220446049250313e-16 1 0 0 ] [ 0 0 -1 0 ] 0 1 1
( 0 256 16 ) ( 2.125 256 16 ) ( 0 256 17 ) tile191 [ -0.47058823529411775 0 0 0 ] [ 0 0 -1 0 ] 270 1 1 ( 112 -128 32 ) ( 112 -128 33 ) ( 113 -128 32 ) tile043 [ -1 2.220446049250313e-16 0 0 ] [ 0 0 -1 0 ] 270 1 1
( 0 256 16 ) ( 0 256 17 ) ( 0 258 16 ) tile191 [ 0 0.5 0 0 ] [ 0 0 -1 0 ] 270 1 1 ( 32 -80 16 ) ( 32 -81 16 ) ( 33 -80 16 ) tile043 [ -1 0 0 0 ] [ 0 -1 0 0 ] 0 1 1
} ( 112 -160 112 ) ( 113 -160 112 ) ( 112 -161 112 ) tile043 [ 1 0 0 0 ] [ 0 -1 0 0 ] 270 1 1
// brush 10 ( 32 -112 16 ) ( 33 -112 16 ) ( 32 -112 17 ) tile043 [ 1 -2.220446049250313e-16 0 0 ] [ 0 0 -1 0 ] 0 1 1
{ ( 163 -160 32 ) ( 163 -161 32 ) ( 163 -160 33 ) tile043 [ -2.220446049250313e-16 -1 0 0 ] [ 0 0 -1 0 ] 0 1 1
( -544 0 -16 ) ( -544 2 -16 ) ( -544 0 -15 ) tile191 [ 0 -0.5 0 0 ] [ 0 0 -1 0 ] 270 1 1 }
( -544 0 -16 ) ( -544 0 -15 ) ( -541.875 0 -16 ) tile191 [ 0.47058823529411775 0 0 0 ] [ 0 0 -1 0 ] 270 1 1 }
( -544 0 -16 ) ( -541.875 0 -16 ) ( -544 2 -16 ) tile191 [ -0.47058823529411775 0 0 0 ] [ 0 -0.5 0 0 ] 270 1 1 // entity 7
( -272 256 16 ) ( -272 258 16 ) ( -269.875 256 16 ) tile191 [ 0.47058823529411775 0 0 0 ] [ 0 -0.5 0 0 ] 270 1 1 {
( -272 256 16 ) ( -269.875 256 16 ) ( -272 256 17 ) tile191 [ -0.47058823529411775 0 0 0 ] [ 0 0 -1 0 ] 270 1 1 "classname" "func_destructablewall"
( -272 256 16 ) ( -272 256 17 ) ( -272 258 16 ) tile191 [ 0 0.5 0 0 ] [ 0 0 -1 0 ] 270 1 1 "extrude_direction" "2"
} // brush 0
// brush 11 {
{ ( -144 64 48 ) ( -144 64 16 ) ( -128 128 16 ) tile043 [ 0 -1 0 0 ] [ 0 0 -1 0 ] 0 1 1
( 272 0 -16 ) ( 272 2 -16 ) ( 272 0 -15 ) tile191 [ 0 -0.5 0 0 ] [ 0 0 -1 0 ] 270 1 1 ( -128 128 16 ) ( -96 128 48 ) ( -144 64 48 ) tile043 [ 0 -1 0 0 ] [ 0 0 -1 0 ] 0 1 1
( 272 0 -16 ) ( 272 0 -15 ) ( 274.125 0 -16 ) tile191 [ 0.47058823529411775 0 0 0 ] [ 0 0 -1 0 ] 270 1 1 ( -144 64 48 ) ( -96 64 48 ) ( -96 64 16 ) tile043 [ 1 0 0 0 ] [ 0 0 -1 0 ] 0 1 1
( 272 0 -16 ) ( 274.125 0 -16 ) ( 272 2 -16 ) tile191 [ -0.47058823529411775 0 0 0 ] [ 0 -0.5 0 0 ] 270 1 1 ( -96 64 16 ) ( -96 128 16 ) ( -128 128 16 ) tile043 [ -1 0 0 0 ] [ 0 -1 0 0 ] 0 1 1
( 544 256 16 ) ( 544 258 16 ) ( 546.125 256 16 ) tile191 [ 0.47058823529411775 0 0 0 ] [ 0 -0.5 0 0 ] 270 1 1 ( -144 64 48 ) ( -96 128 48 ) ( -96 64 48 ) tile043 [ 1 0 0 0 ] [ 0 -1 0 0 ] 0 1 1
( 544 256 16 ) ( 546.125 256 16 ) ( 544 256 17 ) tile191 [ -0.47058823529411775 0 0 0 ] [ 0 0 -1 0 ] 270 1 1 ( -96 128 16 ) ( -96 128 48 ) ( -128 128 16 ) tile043 [ -1 0 0 0 ] [ 0 0 -1 0 ] 0 1 1
( 544 256 16 ) ( 544 256 17 ) ( 544 258 16 ) tile191 [ 0 0.5 0 0 ] [ 0 0 -1 0 ] 270 1 1 ( -96 64 48 ) ( -96 128 48 ) ( -96 128 16 ) tile043 [ 0 1 0 0 ] [ 0 0 -1 0 ] 0 1 1
} }
// brush 12 }
{ // entity 8
( 272 256 -16 ) ( 272 258 -16 ) ( 272 256 -15 ) tile191 [ 0 -0.5 0 0 ] [ 0 0 -1 0 ] 90 1 1 {
( 272 256 -16 ) ( 272 256 -15 ) ( 274.125 256 -16 ) tile191 [ 0.47058823529411775 0 0 0 ] [ 0 0 -1 0 ] 90 1 1 "classname" "func_destructablewall"
( 272 256 -16 ) ( 274.125 256 -16 ) ( 272 258 -16 ) tile191 [ -0.47058823529411775 0 0 0 ] [ 0 -0.5 0 0 ] 90 1 1 // brush 0
( 544 512 16 ) ( 544 514 16 ) ( 546.125 512 16 ) tile191 [ 0.47058823529411775 0 0 0 ] [ 0 -0.5 0 0 ] 90 1 1 {
( 544 512 16 ) ( 546.125 512 16 ) ( 544 512 17 ) tile191 [ -0.47058823529411775 0 0 0 ] [ 0 0 -1 0 ] 90 1 1 ( 128 0 32 ) ( 128 0 33 ) ( 128 -1 32 ) tile043 [ 0 1 0 0 ] [ 0 0 -1 0 ] 270 1 1
( 544 512 16 ) ( 544 512 17 ) ( 544 514 16 ) tile191 [ 0 0.5 0 0 ] [ 0 0 -1 0 ] 90 1 1 ( 64 -51 32 ) ( 63 -51 32 ) ( 64 -51 33 ) tile043 [ -1 0 0 0 ] [ 0 0 -1 0 ] 0 1 1
} ( 144 80 16 ) ( 143 80 16 ) ( 144 79 16 ) tile043 [ -1 0 0 0 ] [ 0 -1 0 0 ] 0 1 1
// brush 13 ( 64 0 112 ) ( 64 -1 112 ) ( 63 0 112 ) tile043 [ 1 0 0 0 ] [ 0 -1 0 0 ] 270 1 1
{ ( 144 16 16 ) ( 144 16 17 ) ( 143 16 16 ) tile043 [ 1 0 0 0 ] [ 0 0 -1 0 ] 0 1 1
( 0 256 -16 ) ( 0 258 -16 ) ( 0 256 -15 ) tile191 [ 0 -0.5 0 0 ] [ 0 0 -1 0 ] 90 1 1 ( 129 80 16 ) ( 129 79 16 ) ( 129 80 17 ) tile043 [ 0 -1 0 0 ] [ 0 0 -1 0 ] 0 1 1
( 0 256 -16 ) ( 0 256 -15 ) ( 2.125 256 -16 ) tile191 [ 0.47058823529411775 0 0 0 ] [ 0 0 -1 0 ] 90 1 1 }
( 0 256 -16 ) ( 2.125 256 -16 ) ( 0 258 -16 ) tile191 [ -0.47058823529411775 0 0 0 ] [ 0 -0.5 0 0 ] 90 1 1 }
( 272 512 16 ) ( 272 514 16 ) ( 274.125 512 16 ) tile191 [ 0.47058823529411775 0 0 0 ] [ 0 -0.5 0 0 ] 90 1 1
( 272 512 16 ) ( 274.125 512 16 ) ( 272 512 17 ) tile191 [ -0.47058823529411775 0 0 0 ] [ 0 0 -1 0 ] 90 1 1
( 272 512 16 ) ( 272 512 17 ) ( 272 514 16 ) tile191 [ 0 0.5 0 0 ] [ 0 0 -1 0 ] 90 1 1
}
// brush 14
{
( -272 256 -16 ) ( -272 258 -16 ) ( -272 256 -15 ) tile191 [ 0 -0.5 0 0 ] [ 0 0 -1 0 ] 90 1 1
( -272 256 -16 ) ( -272 256 -15 ) ( -269.875 256 -16 ) tile191 [ 0.47058823529411775 0 0 0 ] [ 0 0 -1 0 ] 90 1 1
( -272 256 -16 ) ( -269.875 256 -16 ) ( -272 258 -16 ) tile191 [ -0.47058823529411775 0 0 0 ] [ 0 -0.5 0 0 ] 90 1 1
( 0 512 16 ) ( 0 514 16 ) ( 2.125 512 16 ) tile191 [ 0.47058823529411775 0 0 0 ] [ 0 -0.5 0 0 ] 90 1 1
( 0 512 16 ) ( 2.125 512 16 ) ( 0 512 17 ) tile191 [ -0.47058823529411775 0 0 0 ] [ 0 0 -1 0 ] 90 1 1
( 0 512 16 ) ( 0 512 17 ) ( 0 514 16 ) tile191 [ 0 0.5 0 0 ] [ 0 0 -1 0 ] 90 1 1
}
// brush 15
{
( -544 256 -16 ) ( -544 258 -16 ) ( -544 256 -15 ) tile191 [ 0 -0.5 0 0 ] [ 0 0 -1 0 ] 90 1 1
( -544 256 -16 ) ( -544 256 -15 ) ( -541.875 256 -16 ) tile191 [ 0.47058823529411775 0 0 0 ] [ 0 0 -1 0 ] 90 1 1
( -544 256 -16 ) ( -541.875 256 -16 ) ( -544 258 -16 ) tile191 [ -0.47058823529411775 0 0 0 ] [ 0 -0.5 0 0 ] 90 1 1
( -272 512 16 ) ( -272 514 16 ) ( -269.875 512 16 ) tile191 [ 0.47058823529411775 0 0 0 ] [ 0 -0.5 0 0 ] 90 1 1
( -272 512 16 ) ( -269.875 512 16 ) ( -272 512 17 ) tile191 [ -0.47058823529411775 0 0 0 ] [ 0 0 -1 0 ] 90 1 1
( -272 512 16 ) ( -272 512 17 ) ( -272 514 16 ) tile191 [ 0 0.5 0 0 ] [ 0 0 -1 0 ] 90 1 1
}
}

View File

@@ -1,31 +1,130 @@
// Game: demo // Game: demo
// Format: Valve // Format: Valve
// entity 0 // entity 0
{ {
"mapversion" "220" "mapversion" "220"
"wad" "" "wad" ""
"classname" "worldspawn" "classname" "worldspawn"
"_tb_mod" "trenchbroom" "_tb_mod" "trenchbroom"
// brush 0 // brush 0
{ {
( -176 -64 -16 ) ( -176 -63 -16 ) ( -176 -64 -15 ) tile013 [ 0 -1 0 0 ] [ 0 0 -1 0 ] 180 1 1 ( -176 -64 -16 ) ( -176 -63 -16 ) ( -176 -64 -15 ) tile013 [ 0 -1 0 0 ] [ 0 0 -1 0 ] 180 1 1
( -64 -224 -16 ) ( -64 -224 -15 ) ( -63 -224 -16 ) tile013 [ 1 0 0 0 ] [ 0 0 -1 0 ] 180 1 1 ( -64 -224 -16 ) ( -64 -224 -15 ) ( -63 -224 -16 ) tile013 [ 1 0 0 0 ] [ 0 0 -1 0 ] 180 1 1
( -64 -64 -16 ) ( -63 -64 -16 ) ( -64 -63 -16 ) tile013 [ -1 0 0 0 ] [ 0 -1 0 0 ] 0 1 1 ( -64 -64 -16 ) ( -63 -64 -16 ) ( -64 -63 -16 ) tile013 [ -1 0 0 0 ] [ 0 -1 0 0 ] 0 1 1
( 64 64 16 ) ( 64 65 16 ) ( 65 64 16 ) tile013 [ 1 0 0 0 ] [ 0 -1 0 0 ] 0 1 1 ( 64 64 16 ) ( 64 65 16 ) ( 65 64 16 ) tile013 [ 1 0 0 0 ] [ 0 -1 0 0 ] 0 1 1
( 64 224 16 ) ( 65 224 16 ) ( 64 224 17 ) tile013 [ -1 0 0 0 ] [ 0 0 -1 0 ] 180 1 1 ( 64 224 16 ) ( 65 224 16 ) ( 64 224 17 ) tile013 [ -1 0 0 0 ] [ 0 0 -1 0 ] 180 1 1
( 192 64 16 ) ( 192 64 17 ) ( 192 65 16 ) tile013 [ 0 1 0 0 ] [ 0 0 -1 0 ] 180 1 1 ( 192 64 16 ) ( 192 64 17 ) ( 192 65 16 ) tile013 [ 0 1 0 0 ] [ 0 0 -1 0 ] 180 1 1
} }
} }
// entity 1 // entity 1
{ {
"classname" "func_movingplatform" "classname" "func_movingplatform"
// brush 0 "move_distance" "2"
{ "move_time" "2"
( 272 -64 -16 ) ( 272 -63 -16 ) ( 272 -64 -15 ) tile002 [ 0 -1 0 0 ] [ 0 0 -1 0 ] 0 1 1 "move_direction" "0.0 1.0 0.0"
( 384 -224 -16 ) ( 384 -224 -15 ) ( 385 -224 -16 ) tile002 [ 1 0 0 0 ] [ 0 0 -1 0 ] 0 1 1 // brush 0
( 384 -64 -16 ) ( 385 -64 -16 ) ( 384 -63 -16 ) tile002 [ -1 0 0 0 ] [ 0 -1 0 0 ] 180 1 1 {
( 512 64 16 ) ( 512 65 16 ) ( 513 64 16 ) tile002 [ 1 0 0 0 ] [ 0 -1 0 0 ] 180 1 1 ( 272 -64 -16 ) ( 272 -63 -16 ) ( 272 -64 -15 ) tile002 [ 0 -1 0 0 ] [ 0 0 -1 0 ] 0 1 1
( 512 224 16 ) ( 513 224 16 ) ( 512 224 17 ) tile002 [ -1 0 0 0 ] [ 0 0 -1 0 ] 0 1 1 ( 384 -224 -16 ) ( 384 -224 -15 ) ( 385 -224 -16 ) tile002 [ 1 0 0 0 ] [ 0 0 -1 0 ] 0 1 1
( 640 64 16 ) ( 640 64 17 ) ( 640 65 16 ) tile002 [ 0 1 0 0 ] [ 0 0 -1 0 ] 0 1 1 ( 384 -64 -16 ) ( 385 -64 -16 ) ( 384 -63 -16 ) tile002 [ -1 0 0 0 ] [ 0 -1 0 0 ] 180 1 1
} ( 512 64 16 ) ( 512 65 16 ) ( 513 64 16 ) tile002 [ 1 0 0 0 ] [ 0 -1 0 0 ] 180 1 1
} ( 512 224 16 ) ( 513 224 16 ) ( 512 224 17 ) tile002 [ -1 0 0 0 ] [ 0 0 -1 0 ] 0 1 1
( 640 64 16 ) ( 640 64 17 ) ( 640 65 16 ) tile002 [ 0 1 0 0 ] [ 0 0 -1 0 ] 0 1 1
}
}
// entity 2
{
"classname" "func_destructablewall"
// brush 0
{
( 64 0 32 ) ( 64 0 33 ) ( 64 -1 32 ) tile043 [ 0 1 0 0 ] [ 0 0 -1 0 ] 270 1 1
( 0 -48 32 ) ( -1 -48 32 ) ( 0 -48 33 ) tile043 [ -1 0 0 0 ] [ 0 0 -1 0 ] 0 1 1
( 80 80 16 ) ( 79 80 16 ) ( 80 79 16 ) tile043 [ -1 0 0 0 ] [ 0 -1 0 0 ] 0 1 1
( 0 0 112 ) ( 0 -1 112 ) ( -1 0 112 ) tile043 [ 1 0 0 0 ] [ 0 -1 0 0 ] 270 1 1
( 80 16 16 ) ( 80 16 17 ) ( 79 16 16 ) tile043 [ 1 0 0 0 ] [ 0 0 -1 0 ] 0 1 1
( 96 80 16 ) ( 96 79 16 ) ( 96 80 17 ) tile043 [ 0 -1 0 0 ] [ 0 0 -1 0 ] 0 1 1
}
}
// entity 3
{
"classname" "func_destructablewall"
"extrude_direction" "1"
// brush 0
{
( -176 -96 16 ) ( -176 -96 17 ) ( -176 -97 16 ) "Stone Base/albedo" [ 0 -1 0 0 ] [ -0 -0 -1 0 ] 0 0.007 0.007
( -64 -144 32 ) ( -64 -144 33 ) ( -63 -144 32 ) "Stone Base/albedo" [ 1 0 0 0 ] [ 0 0 -1 320 ] 0 0.007 0.007
( -144 -96 16 ) ( -144 -97 16 ) ( -143 -96 16 ) "Stone Base/albedo" [ -1 0 0 0 ] [ -0 -1 -0 0 ] 0 0.007 0.007
( -64 -176 112 ) ( -63 -176 112 ) ( -64 -177 112 ) "Stone Base/albedo" [ 1 -0 0 0 ] [ -0 -1 0 0 ] 0 0.007 0.007
( -144 -128 16 ) ( -143 -128 16 ) ( -144 -128 17 ) "Stone Base/albedo" [ -1 0 0 0 ] [ 0 0 -1 320 ] 0 0.007 0.007
( -13 -176 32 ) ( -13 -177 32 ) ( -13 -176 33 ) "Stone Base/albedo" [ -0 1 0 0 ] [ -0 0 -1 0 ] 0 0.007 0.007
}
}
// entity 4
{
"classname" "func_destructablewall"
"extrude_direction" "2"
// brush 0
{
( -208 320 32 ) ( -208 320 33 ) ( -208 319 32 ) tile043 [ 0 1 0 0 ] [ 0 0 -1 0 ] 270 1 1
( -160 269 32 ) ( -161 269 32 ) ( -160 269 33 ) tile043 [ -1 0 0 0 ] [ 0 0 -1 0 ] 0 1 1
( -80 400 16 ) ( -81 400 16 ) ( -80 399 16 ) tile043 [ -1 0 0 0 ] [ 0 -1 0 0 ] 0 1 1
( -160 320 32 ) ( -160 319 32 ) ( -161 320 32 ) tile043 [ 1 0 0 0 ] [ 0 -1 0 0 ] 270 1 1
( -80 368 16 ) ( -80 368 17 ) ( -81 368 16 ) tile043 [ 1 0 0 0 ] [ 0 0 -1 0 ] 0 1 1
( -80 400 16 ) ( -80 399 16 ) ( -80 400 17 ) tile043 [ 0 -1 0 0 ] [ 0 0 -1 0 ] 0 1 1
}
}
// entity 5
{
"classname" "func_destructablewall"
// brush 0
{
( 64 80 32 ) ( 64 80 33 ) ( 64 79 32 ) tile043 [ 0 1 0 0 ] [ 0 0 -1 0 ] 270 1 1
( 0 29 32 ) ( -1 29 32 ) ( 0 29 33 ) tile043 [ -1 0 0 0 ] [ 0 0 -1 0 ] 0 1 1
( 80 160 16 ) ( 79 160 16 ) ( 80 159 16 ) tile043 [ -1 0 0 0 ] [ 0 -1 0 0 ] 0 1 1
( 0 80 112 ) ( 0 79 112 ) ( -1 80 112 ) tile043 [ 1 0 0 0 ] [ 0 -1 0 0 ] 270 1 1
( 80 96 16 ) ( 80 96 17 ) ( 79 96 16 ) tile043 [ 1 0 0 0 ] [ 0 0 -1 0 ] 0 1 1
( 96 160 16 ) ( 96 159 16 ) ( 96 160 17 ) tile043 [ 0 -1 0 0 ] [ 0 0 -1 0 ] 0 1 1
}
}
// entity 6
{
"classname" "func_destructablewall"
"extrude_direction" "1"
// brush 0
{
( 0 -80 16 ) ( 0 -80 17 ) ( 0 -81 16 ) tile043 [ 2.220446049250313e-16 1 0 0 ] [ 0 0 -1 0 ] 0 1 1
( 112 -128 32 ) ( 112 -128 33 ) ( 113 -128 32 ) tile043 [ -1 2.220446049250313e-16 0 0 ] [ 0 0 -1 0 ] 270 1 1
( 32 -80 16 ) ( 32 -81 16 ) ( 33 -80 16 ) tile043 [ -1 0 0 0 ] [ 0 -1 0 0 ] 0 1 1
( 112 -160 112 ) ( 113 -160 112 ) ( 112 -161 112 ) tile043 [ 1 0 0 0 ] [ 0 -1 0 0 ] 270 1 1
( 32 -112 16 ) ( 33 -112 16 ) ( 32 -112 17 ) tile043 [ 1 -2.220446049250313e-16 0 0 ] [ 0 0 -1 0 ] 0 1 1
( 163 -160 32 ) ( 163 -161 32 ) ( 163 -160 33 ) tile043 [ -2.220446049250313e-16 -1 0 0 ] [ 0 0 -1 0 ] 0 1 1
}
}
// entity 7
{
"classname" "func_destructablewall"
"extrude_direction" "2"
// brush 0
{
( -144 64 48 ) ( -144 64 16 ) ( -128 128 16 ) tile043 [ 0 -1 0 0 ] [ 0 0 -1 0 ] 0 1 1
( -128 128 16 ) ( -96 128 48 ) ( -144 64 48 ) tile043 [ 0 -1 0 0 ] [ 0 0 -1 0 ] 0 1 1
( -144 64 48 ) ( -96 64 48 ) ( -96 64 16 ) tile043 [ 1 0 0 0 ] [ 0 0 -1 0 ] 0 1 1
( -96 64 16 ) ( -96 128 16 ) ( -128 128 16 ) tile043 [ -1 0 0 0 ] [ 0 -1 0 0 ] 0 1 1
( -144 64 48 ) ( -96 128 48 ) ( -96 64 48 ) tile043 [ 1 0 0 0 ] [ 0 -1 0 0 ] 0 1 1
( -96 128 16 ) ( -96 128 48 ) ( -128 128 16 ) tile043 [ -1 0 0 0 ] [ 0 0 -1 0 ] 0 1 1
( -96 64 48 ) ( -96 128 48 ) ( -96 128 16 ) tile043 [ 0 1 0 0 ] [ 0 0 -1 0 ] 0 1 1
}
}
// entity 8
{
"classname" "func_destructablewall"
// brush 0
{
( 128 0 32 ) ( 128 0 33 ) ( 128 -1 32 ) tile043 [ 0 1 0 0 ] [ 0 0 -1 0 ] 270 1 1
( 64 -51 32 ) ( 63 -51 32 ) ( 64 -51 33 ) tile043 [ -1 0 0 0 ] [ 0 0 -1 0 ] 0 1 1
( 144 80 16 ) ( 143 80 16 ) ( 144 79 16 ) tile043 [ -1 0 0 0 ] [ 0 -1 0 0 ] 0 1 1
( 64 0 112 ) ( 64 -1 112 ) ( 63 0 112 ) tile043 [ 1 0 0 0 ] [ 0 -1 0 0 ] 270 1 1
( 144 16 16 ) ( 144 16 17 ) ( 143 16 16 ) tile043 [ 1 0 0 0 ] [ 0 0 -1 0 ] 0 1 1
( 129 80 16 ) ( 129 79 16 ) ( 129 80 17 ) tile043 [ 0 -1 0 0 ] [ 0 0 -1 0 ] 0 1 1
}
}

View File

@@ -15,15 +15,6 @@
( 64 224 16 ) ( 65 224 16 ) ( 64 224 17 ) tile013 [ -1 0 0 0 ] [ 0 0 -1 0 ] 180 1 1 ( 64 224 16 ) ( 65 224 16 ) ( 64 224 17 ) tile013 [ -1 0 0 0 ] [ 0 0 -1 0 ] 180 1 1
( 192 64 16 ) ( 192 64 17 ) ( 192 65 16 ) tile013 [ 0 1 0 0 ] [ 0 0 -1 0 ] 180 1 1 ( 192 64 16 ) ( 192 64 17 ) ( 192 65 16 ) tile013 [ 0 1 0 0 ] [ 0 0 -1 0 ] 180 1 1
} }
// brush 1
{
( -96 -80 16 ) ( -96 -79 16 ) ( -96 -80 17 ) tile043 [ 0 -1 0 0 ] [ 0 0 -1 0 ] 0 1 1
( -96 -80 16 ) ( -96 -80 17 ) ( -95 -80 16 ) tile043 [ 1 0 0 0 ] [ 0 0 -1 0 ] 0 1 1
( -96 -80 16 ) ( -95 -80 16 ) ( -96 -79 16 ) tile043 [ -1 0 0 0 ] [ 0 -1 0 0 ] 0 1 1
( -16 0 112 ) ( -16 1 112 ) ( -15 0 112 ) tile043 [ 1 0 0 0 ] [ 0 -1 0 0 ] 270 1 1
( -16 0 32 ) ( -15 0 32 ) ( -16 0 33 ) tile043 [ -1 0 0 0 ] [ 0 0 -1 0 ] 0 1 1
( -80 0 32 ) ( -80 0 33 ) ( -80 1 32 ) tile043 [ 0 1 0 0 ] [ 0 0 -1 0 ] 270 1 1
}
} }
// entity 1 // entity 1
{ {
@@ -41,3 +32,84 @@
( 640 64 16 ) ( 640 64 17 ) ( 640 65 16 ) tile002 [ 0 1 0 0 ] [ 0 0 -1 0 ] 0 1 1 ( 640 64 16 ) ( 640 64 17 ) ( 640 65 16 ) tile002 [ 0 1 0 0 ] [ 0 0 -1 0 ] 0 1 1
} }
} }
// entity 2
{
"classname" "func_destructablewall"
// brush 0
{
( 64 0 32 ) ( 64 0 33 ) ( 64 -1 32 ) tile043 [ 0 1 0 0 ] [ 0 0 -1 0 ] 270 1 1
( 0 -48 32 ) ( -1 -48 32 ) ( 0 -48 33 ) tile043 [ -1 0 0 0 ] [ 0 0 -1 0 ] 0 1 1
( 80 80 16 ) ( 79 80 16 ) ( 80 79 16 ) tile043 [ -1 0 0 0 ] [ 0 -1 0 0 ] 0 1 1
( 0 0 112 ) ( 0 -1 112 ) ( -1 0 112 ) tile043 [ 1 0 0 0 ] [ 0 -1 0 0 ] 270 1 1
( 80 16 16 ) ( 80 16 17 ) ( 79 16 16 ) tile043 [ 1 0 0 0 ] [ 0 0 -1 0 ] 0 1 1
( 96 80 16 ) ( 96 79 16 ) ( 96 80 17 ) tile043 [ 0 -1 0 0 ] [ 0 0 -1 0 ] 0 1 1
}
}
// entity 3
{
"classname" "func_destructablewall"
"extrude_direction" "1"
// brush 0
{
( -176 -96 16 ) ( -176 -96 17 ) ( -176 -97 16 ) "Stone Base/albedo" [ 0 -1 0 0 ] [ -0 -0 -1 0 ] 0 0.25 0.25
( -64 -144 32 ) ( -64 -144 33 ) ( -63 -144 32 ) "Stone Base/albedo" [ 1 0 -0 1680 ] [ 0 -0 -1 2400 ] 0 0.06 0.06
( -144 -96 16 ) ( -144 -97 16 ) ( -143 -96 16 ) "Stone Base/albedo" [ -1 0 0 0 ] [ -0 -1 -0 0 ] 0 0.25 0.25
( -64 -176 112 ) ( -63 -176 112 ) ( -64 -177 112 ) "Stone Base/albedo" [ 1 -0 0 0 ] [ -0 -1 0 0 ] 0 0.25 0.25
( -144 -128 16 ) ( -143 -128 16 ) ( -144 -128 17 ) "Stone Base/albedo" [ -1 0 0 1680 ] [ 0 0 -1 2400 ] 0 0.06 0.06
( -13 -176 32 ) ( -13 -177 32 ) ( -13 -176 33 ) "Stone Base/albedo" [ -0 1 0 0 ] [ -0 0 -1 0 ] 0 0.25 0.25
}
}
// entity 4
{
"classname" "func_destructablewall"
"extrude_direction" "2"
// brush 0
{
( -208 320 32 ) ( -208 320 33 ) ( -208 319 32 ) tile043 [ 0 1 0 0 ] [ 0 0 -1 0 ] 270 1 1
( -160 269 32 ) ( -161 269 32 ) ( -160 269 33 ) tile043 [ -1 0 0 0 ] [ 0 0 -1 0 ] 0 1 1
( -80 400 16 ) ( -81 400 16 ) ( -80 399 16 ) tile043 [ -1 0 0 0 ] [ 0 -1 0 0 ] 0 1 1
( -160 320 32 ) ( -160 319 32 ) ( -161 320 32 ) tile043 [ 1 0 0 0 ] [ 0 -1 0 0 ] 270 1 1
( -80 368 16 ) ( -80 368 17 ) ( -81 368 16 ) tile043 [ 1 0 0 0 ] [ 0 0 -1 0 ] 0 1 1
( -80 400 16 ) ( -80 399 16 ) ( -80 400 17 ) tile043 [ 0 -1 0 0 ] [ 0 0 -1 0 ] 0 1 1
}
}
// entity 5
{
"classname" "func_destructablewall"
"extrude_direction" "1"
// brush 0
{
( 0 -80 16 ) ( 0 -80 17 ) ( 0 -81 16 ) tile043 [ 2.220446049250313e-16 1 0 0 ] [ 0 0 -1 0 ] 0 1 1
( 112 -128 32 ) ( 112 -128 33 ) ( 113 -128 32 ) tile043 [ -1 2.220446049250313e-16 0 0 ] [ 0 0 -1 0 ] 270 1 1
( 32 -80 16 ) ( 32 -81 16 ) ( 33 -80 16 ) tile043 [ -1 0 0 0 ] [ 0 -1 0 0 ] 0 1 1
( 112 -160 112 ) ( 113 -160 112 ) ( 112 -161 112 ) tile043 [ 1 0 0 0 ] [ 0 -1 0 0 ] 270 1 1
( 32 -112 16 ) ( 33 -112 16 ) ( 32 -112 17 ) tile043 [ 1 -2.220446049250313e-16 0 0 ] [ 0 0 -1 0 ] 0 1 1
( 176 -160 32 ) ( 176 -161 32 ) ( 176 -160 33 ) tile043 [ -2.220446049250313e-16 -1 0 0 ] [ 0 0 -1 0 ] 0 1 1
}
}
// entity 6
{
"classname" "func_destructablewall"
// brush 0
{
( 128 0 32 ) ( 128 0 33 ) ( 128 -1 32 ) tile043 [ 0 1 0 0 ] [ 0 0 -1 0 ] 270 1 1
( 64 -51 32 ) ( 63 -51 32 ) ( 64 -51 33 ) tile043 [ -1 0 0 0 ] [ 0 0 -1 0 ] 0 1 1
( 144 80 16 ) ( 143 80 16 ) ( 144 79 16 ) tile043 [ -1 0 0 0 ] [ 0 -1 0 0 ] 0 1 1
( 64 0 112 ) ( 64 -1 112 ) ( 63 0 112 ) tile043 [ 1 0 0 0 ] [ 0 -1 0 0 ] 270 1 1
( 144 16 16 ) ( 144 16 17 ) ( 143 16 16 ) tile043 [ 1 0 0 0 ] [ 0 0 -1 0 ] 0 1 1
( 129 80 16 ) ( 129 79 16 ) ( 129 80 17 ) tile043 [ 0 -1 0 0 ] [ 0 0 -1 0 ] 0 1 1
}
}
// entity 7
{
"classname" "func_destructablewall"
// brush 0
{
( 64 80 32 ) ( 64 80 33 ) ( 64 79 32 ) tile043 [ 0 1 0 0 ] [ 0 0 -1 0 ] 270 1 1
( 0 29 32 ) ( -1 29 32 ) ( 0 29 33 ) tile043 [ -1 0 0 0 ] [ 0 0 -1 0 ] 0 1 1
( 80 160 16 ) ( 79 160 16 ) ( 80 159 16 ) tile043 [ -1 0 0 0 ] [ 0 -1 0 0 ] 0 1 1
( 0 80 112 ) ( 0 79 112 ) ( -1 80 112 ) tile043 [ 1 0 0 0 ] [ 0 -1 0 0 ] 270 1 1
( 80 96 16 ) ( 80 96 17 ) ( 79 96 16 ) tile043 [ 1 0 0 0 ] [ 0 0 -1 0 ] 0 1 1
( 96 160 16 ) ( 96 159 16 ) ( 96 160 17 ) tile043 [ 0 -1 0 0 ] [ 0 0 -1 0 ] 0 1 1
}
}

View File

@@ -1,60 +0,0 @@
// Game: demo
// Format: Valve
// entity 0
{
"mapversion" "220"
"wad" ""
"classname" "worldspawn"
"_tb_mod" "trenchbroom"
// brush 0
{
( -176 -64 -16 ) ( -176 -63 -16 ) ( -176 -64 -15 ) tile013 [ 0 -1 0 0 ] [ 0 0 -1 0 ] 180 1 1
( -64 -224 -16 ) ( -64 -224 -15 ) ( -63 -224 -16 ) tile013 [ 1 0 0 0 ] [ 0 0 -1 0 ] 180 1 1
( -64 -64 -16 ) ( -63 -64 -16 ) ( -64 -63 -16 ) tile013 [ -1 0 0 0 ] [ 0 -1 0 0 ] 0 1 1
( 64 64 16 ) ( 64 65 16 ) ( 65 64 16 ) tile013 [ 1 0 0 0 ] [ 0 -1 0 0 ] 0 1 1
( 64 224 16 ) ( 65 224 16 ) ( 64 224 17 ) tile013 [ -1 0 0 0 ] [ 0 0 -1 0 ] 180 1 1
( 192 64 16 ) ( 192 64 17 ) ( 192 65 16 ) tile013 [ 0 1 0 0 ] [ 0 0 -1 0 ] 180 1 1
}
}
// entity 1
{
"classname" "func_movingplatform"
"move_distance" "2"
"move_time" "2"
"move_direction" "0.0 1.0 0.0"
// brush 0
{
( 272 -64 -16 ) ( 272 -63 -16 ) ( 272 -64 -15 ) tile002 [ 0 -1 0 0 ] [ 0 0 -1 0 ] 0 1 1
( 384 -224 -16 ) ( 384 -224 -15 ) ( 385 -224 -16 ) tile002 [ 1 0 0 0 ] [ 0 0 -1 0 ] 0 1 1
( 384 -64 -16 ) ( 385 -64 -16 ) ( 384 -63 -16 ) tile002 [ -1 0 0 0 ] [ 0 -1 0 0 ] 180 1 1
( 512 64 16 ) ( 512 65 16 ) ( 513 64 16 ) tile002 [ 1 0 0 0 ] [ 0 -1 0 0 ] 180 1 1
( 512 224 16 ) ( 513 224 16 ) ( 512 224 17 ) tile002 [ -1 0 0 0 ] [ 0 0 -1 0 ] 0 1 1
( 640 64 16 ) ( 640 64 17 ) ( 640 65 16 ) tile002 [ 0 1 0 0 ] [ 0 0 -1 0 ] 0 1 1
}
}
// entity 2
{
"classname" "func_destructablewall"
// brush 0
{
( -96 -80 16 ) ( -96 -79 16 ) ( -96 -80 17 ) tile043 [ 0 -1 0 0 ] [ 0 0 -1 0 ] 0 1 1
( -96 -80 16 ) ( -96 -80 17 ) ( -95 -80 16 ) tile043 [ 1 0 0 0 ] [ 0 0 -1 0 ] 0 1 1
( -96 -80 16 ) ( -95 -80 16 ) ( -96 -79 16 ) tile043 [ -1 0 0 0 ] [ 0 -1 0 0 ] 0 1 1
( -16 0 112 ) ( -16 1 112 ) ( -15 0 112 ) tile043 [ 1 0 0 0 ] [ 0 -1 0 0 ] 270 1 1
( -16 48 32 ) ( -15 48 32 ) ( -16 48 33 ) tile043 [ -1 0 0 0 ] [ 0 0 -1 0 ] 0 1 1
( -80 0 32 ) ( -80 0 33 ) ( -80 1 32 ) tile043 [ 0 1 0 0 ] [ 0 0 -1 0 ] 270 1 1
}
}
// entity 3
{
"classname" "func_destructablewall"
// brush 0
{
( -16 -96 16 ) ( -16 -95 16 ) ( -16 -96 17 ) tile043 [ 0 -1 0 0 ] [ 0 0 -1 0 ] 0 1 1
( -16 -96 16 ) ( -16 -96 17 ) ( -15 -96 16 ) tile043 [ 1 0 0 0 ] [ 0 0 -1 0 ] 0 1 1
( -16 -96 16 ) ( -15 -96 16 ) ( -16 -95 16 ) tile043 [ -1 0 0 0 ] [ 0 -1 0 0 ] 0 1 1
( 64 -16 112 ) ( 64 -15 112 ) ( 65 -16 112 ) tile043 [ 1 0 0 0 ] [ 0 -1 0 0 ] 270 1 1
( 64 32 32 ) ( 65 32 32 ) ( 64 32 33 ) tile043 [ -1 0 0 0 ] [ 0 0 -1 0 ] 0 1 1
( 0 -16 32 ) ( 0 -16 33 ) ( 0 -15 32 ) tile043 [ 0 1 0 0 ] [ 0 0 -1 0 ] 270 1 1
}
}

View File

@@ -1,60 +0,0 @@
// Game: demo
// Format: Valve
// entity 0
{
"mapversion" "220"
"wad" ""
"classname" "worldspawn"
"_tb_mod" "trenchbroom"
// brush 0
{
( -176 -64 -16 ) ( -176 -63 -16 ) ( -176 -64 -15 ) tile013 [ 0 -1 0 0 ] [ 0 0 -1 0 ] 180 1 1
( -64 -224 -16 ) ( -64 -224 -15 ) ( -63 -224 -16 ) tile013 [ 1 0 0 0 ] [ 0 0 -1 0 ] 180 1 1
( -64 -64 -16 ) ( -63 -64 -16 ) ( -64 -63 -16 ) tile013 [ -1 0 0 0 ] [ 0 -1 0 0 ] 0 1 1
( 64 64 16 ) ( 64 65 16 ) ( 65 64 16 ) tile013 [ 1 0 0 0 ] [ 0 -1 0 0 ] 0 1 1
( 64 224 16 ) ( 65 224 16 ) ( 64 224 17 ) tile013 [ -1 0 0 0 ] [ 0 0 -1 0 ] 180 1 1
( 192 64 16 ) ( 192 64 17 ) ( 192 65 16 ) tile013 [ 0 1 0 0 ] [ 0 0 -1 0 ] 180 1 1
}
}
// entity 1
{
"classname" "func_movingplatform"
"move_distance" "2"
"move_time" "2"
"move_direction" "0.0 1.0 0.0"
// brush 0
{
( 272 -64 -16 ) ( 272 -63 -16 ) ( 272 -64 -15 ) tile002 [ 0 -1 0 0 ] [ 0 0 -1 0 ] 0 1 1
( 384 -224 -16 ) ( 384 -224 -15 ) ( 385 -224 -16 ) tile002 [ 1 0 0 0 ] [ 0 0 -1 0 ] 0 1 1
( 384 -64 -16 ) ( 385 -64 -16 ) ( 384 -63 -16 ) tile002 [ -1 0 0 0 ] [ 0 -1 0 0 ] 180 1 1
( 512 64 16 ) ( 512 65 16 ) ( 513 64 16 ) tile002 [ 1 0 0 0 ] [ 0 -1 0 0 ] 180 1 1
( 512 224 16 ) ( 513 224 16 ) ( 512 224 17 ) tile002 [ -1 0 0 0 ] [ 0 0 -1 0 ] 0 1 1
( 640 64 16 ) ( 640 64 17 ) ( 640 65 16 ) tile002 [ 0 1 0 0 ] [ 0 0 -1 0 ] 0 1 1
}
}
// entity 2
{
"classname" "func_destructablewall"
// brush 0
{
( 64 -16 32 ) ( 64 -16 33 ) ( 64 -17 32 ) tile043 [ 0 1 0 0 ] [ 0 0 -1 0 ] 270 1 1
( 0 -67 32 ) ( -1 -67 32 ) ( 0 -67 33 ) tile043 [ -1 0 0 0 ] [ 0 0 -1 0 ] 0 1 1
( 80 64 16 ) ( 79 64 16 ) ( 80 63 16 ) tile043 [ -1 0 0 0 ] [ 0 -1 0 0 ] 0 1 1
( 0 -16 112 ) ( 0 -17 112 ) ( -1 -16 112 ) tile043 [ 1 0 0 0 ] [ 0 -1 0 0 ] 270 1 1
( 80 32 16 ) ( 80 32 17 ) ( 79 32 16 ) tile043 [ 1 0 0 0 ] [ 0 0 -1 0 ] 0 1 1
( 80 64 16 ) ( 80 63 16 ) ( 80 64 17 ) tile043 [ 0 -1 0 0 ] [ 0 0 -1 0 ] 0 1 1
}
}
// entity 3
{
"classname" "func_destructablewall"
// brush 0
{
( -115 -64 32 ) ( -115 -63 32 ) ( -115 -64 33 ) tile043 [ -2.220446049250313e-16 1 0 0 ] [ 0 0 -1 0 ] 0 1 1
( 16 -144 16 ) ( 15 -144 16 ) ( 16 -144 17 ) tile043 [ -1 -2.220446049250313e-16 0 0 ] [ 0 0 -1 0 ] 0 1 1
( 16 -144 16 ) ( 16 -143 16 ) ( 15 -144 16 ) tile043 [ -1 0 0 0 ] [ 0 -1 0 0 ] 0 1 1
( -64 -64 112 ) ( -65 -64 112 ) ( -64 -63 112 ) tile043 [ 1 0 0 0 ] [ 0 -1 0 0 ] 270 1 1
( -64 -128 32 ) ( -64 -128 33 ) ( -65 -128 32 ) tile043 [ 1 2.220446049250313e-16 0 0 ] [ 0 0 -1 0 ] 270 1 1
( -16 -144 16 ) ( -16 -144 17 ) ( -16 -143 16 ) tile043 [ 2.220446049250313e-16 -1 0 0 ] [ 0 0 -1 0 ] 0 1 1
}
}

View File

@@ -1,116 +0,0 @@
// Game: demo
// Format: Valve
// entity 0
{
"mapversion" "220"
"wad" ""
"classname" "worldspawn"
"_tb_mod" "trenchbroom"
// brush 0
{
( -176 -64 -16 ) ( -176 -63 -16 ) ( -176 -64 -15 ) tile013 [ 0 -1 0 0 ] [ 0 0 -1 0 ] 180 1 1
( -64 -224 -16 ) ( -64 -224 -15 ) ( -63 -224 -16 ) tile013 [ 1 0 0 0 ] [ 0 0 -1 0 ] 180 1 1
( -64 -64 -16 ) ( -63 -64 -16 ) ( -64 -63 -16 ) tile013 [ -1 0 0 0 ] [ 0 -1 0 0 ] 0 1 1
( 64 64 16 ) ( 64 65 16 ) ( 65 64 16 ) tile013 [ 1 0 0 0 ] [ 0 -1 0 0 ] 0 1 1
( 64 224 16 ) ( 65 224 16 ) ( 64 224 17 ) tile013 [ -1 0 0 0 ] [ 0 0 -1 0 ] 180 1 1
( 192 64 16 ) ( 192 64 17 ) ( 192 65 16 ) tile013 [ 0 1 0 0 ] [ 0 0 -1 0 ] 180 1 1
}
}
// entity 1
{
"classname" "func_movingplatform"
"move_distance" "2"
"move_time" "2"
"move_direction" "0.0 1.0 0.0"
// brush 0
{
( 272 -64 -16 ) ( 272 -63 -16 ) ( 272 -64 -15 ) tile002 [ 0 -1 0 0 ] [ 0 0 -1 0 ] 0 1 1
( 384 -224 -16 ) ( 384 -224 -15 ) ( 385 -224 -16 ) tile002 [ 1 0 0 0 ] [ 0 0 -1 0 ] 0 1 1
( 384 -64 -16 ) ( 385 -64 -16 ) ( 384 -63 -16 ) tile002 [ -1 0 0 0 ] [ 0 -1 0 0 ] 180 1 1
( 512 64 16 ) ( 512 65 16 ) ( 513 64 16 ) tile002 [ 1 0 0 0 ] [ 0 -1 0 0 ] 180 1 1
( 512 224 16 ) ( 513 224 16 ) ( 512 224 17 ) tile002 [ -1 0 0 0 ] [ 0 0 -1 0 ] 0 1 1
( 640 64 16 ) ( 640 64 17 ) ( 640 65 16 ) tile002 [ 0 1 0 0 ] [ 0 0 -1 0 ] 0 1 1
}
}
// entity 2
{
"classname" "func_destructablewall"
// brush 0
{
( 64 0 32 ) ( 64 0 33 ) ( 64 -1 32 ) tile043 [ 0 1 0 0 ] [ 0 0 -1 0 ] 270 1 1
( 0 -48 32 ) ( -1 -48 32 ) ( 0 -48 33 ) tile043 [ -1 0 0 0 ] [ 0 0 -1 0 ] 0 1 1
( 80 80 16 ) ( 79 80 16 ) ( 80 79 16 ) tile043 [ -1 0 0 0 ] [ 0 -1 0 0 ] 0 1 1
( 0 0 112 ) ( 0 -1 112 ) ( -1 0 112 ) tile043 [ 1 0 0 0 ] [ 0 -1 0 0 ] 270 1 1
( 80 16 16 ) ( 80 16 17 ) ( 79 16 16 ) tile043 [ 1 0 0 0 ] [ 0 0 -1 0 ] 0 1 1
( 96 80 16 ) ( 96 79 16 ) ( 96 80 17 ) tile043 [ 0 -1 0 0 ] [ 0 0 -1 0 ] 0 1 1
}
}
// entity 3
{
"classname" "func_destructablewall"
"extrude_direction" "1"
// brush 0
{
( -176 -80 16 ) ( -176 -80 17 ) ( -176 -81 16 ) tile043 [ 2.220446049250313e-16 1 0 0 ] [ 0 0 -1 0 ] 0 1 1
( -64 -128 32 ) ( -64 -128 33 ) ( -63 -128 32 ) tile043 [ -1 2.220446049250313e-16 0 0 ] [ 0 0 -1 0 ] 270 1 1
( -144 -80 16 ) ( -144 -81 16 ) ( -143 -80 16 ) tile043 [ -1 0 0 0 ] [ 0 -1 0 0 ] 0 1 1
( -64 -160 112 ) ( -63 -160 112 ) ( -64 -161 112 ) tile043 [ 1 0 0 0 ] [ 0 -1 0 0 ] 270 1 1
( -144 -112 16 ) ( -143 -112 16 ) ( -144 -112 17 ) tile043 [ 1 -2.220446049250313e-16 0 0 ] [ 0 0 -1 0 ] 0 1 1
( -13 -160 32 ) ( -13 -161 32 ) ( -13 -160 33 ) tile043 [ -2.220446049250313e-16 -1 0 0 ] [ 0 0 -1 0 ] 0 1 1
}
}
// entity 4
{
"classname" "func_destructablewall"
"extrude_direction" "2"
// brush 0
{
( -208 320 32 ) ( -208 320 33 ) ( -208 319 32 ) tile043 [ 0 1 0 0 ] [ 0 0 -1 0 ] 270 1 1
( -160 269 32 ) ( -161 269 32 ) ( -160 269 33 ) tile043 [ -1 0 0 0 ] [ 0 0 -1 0 ] 0 1 1
( -80 400 16 ) ( -81 400 16 ) ( -80 399 16 ) tile043 [ -1 0 0 0 ] [ 0 -1 0 0 ] 0 1 1
( -160 320 32 ) ( -160 319 32 ) ( -161 320 32 ) tile043 [ 1 0 0 0 ] [ 0 -1 0 0 ] 270 1 1
( -80 368 16 ) ( -80 368 17 ) ( -81 368 16 ) tile043 [ 1 0 0 0 ] [ 0 0 -1 0 ] 0 1 1
( -80 400 16 ) ( -80 399 16 ) ( -80 400 17 ) tile043 [ 0 -1 0 0 ] [ 0 0 -1 0 ] 0 1 1
}
}
// entity 5
{
"classname" "func_destructablewall"
// brush 0
{
( 64 80 32 ) ( 64 80 33 ) ( 64 79 32 ) tile043 [ 0 1 0 0 ] [ 0 0 -1 0 ] 270 1 1
( 0 29 32 ) ( -1 29 32 ) ( 0 29 33 ) tile043 [ -1 0 0 0 ] [ 0 0 -1 0 ] 0 1 1
( 80 160 16 ) ( 79 160 16 ) ( 80 159 16 ) tile043 [ -1 0 0 0 ] [ 0 -1 0 0 ] 0 1 1
( 0 80 112 ) ( 0 79 112 ) ( -1 80 112 ) tile043 [ 1 0 0 0 ] [ 0 -1 0 0 ] 270 1 1
( 80 96 16 ) ( 80 96 17 ) ( 79 96 16 ) tile043 [ 1 0 0 0 ] [ 0 0 -1 0 ] 0 1 1
( 96 160 16 ) ( 96 159 16 ) ( 96 160 17 ) tile043 [ 0 -1 0 0 ] [ 0 0 -1 0 ] 0 1 1
}
}
// entity 6
{
"classname" "func_destructablewall"
"extrude_direction" "1"
// brush 0
{
( 0 -80 16 ) ( 0 -80 17 ) ( 0 -81 16 ) tile043 [ 2.220446049250313e-16 1 0 0 ] [ 0 0 -1 0 ] 0 1 1
( 112 -128 32 ) ( 112 -128 33 ) ( 113 -128 32 ) tile043 [ -1 2.220446049250313e-16 0 0 ] [ 0 0 -1 0 ] 270 1 1
( 32 -80 16 ) ( 32 -81 16 ) ( 33 -80 16 ) tile043 [ -1 0 0 0 ] [ 0 -1 0 0 ] 0 1 1
( 112 -160 112 ) ( 113 -160 112 ) ( 112 -161 112 ) tile043 [ 1 0 0 0 ] [ 0 -1 0 0 ] 270 1 1
( 32 -112 16 ) ( 33 -112 16 ) ( 32 -112 17 ) tile043 [ 1 -2.220446049250313e-16 0 0 ] [ 0 0 -1 0 ] 0 1 1
( 163 -160 32 ) ( 163 -161 32 ) ( 163 -160 33 ) tile043 [ -2.220446049250313e-16 -1 0 0 ] [ 0 0 -1 0 ] 0 1 1
}
}
// entity 7
{
"classname" "func_destructablewall"
"extrude_direction" "2"
// brush 0
{
( -128 112 32 ) ( -144 64 32 ) ( -144 64 16 ) tile043 [ 0 -1 0 0 ] [ 0 0 -1 0 ] 0 1 1
( -96 128 16 ) ( -96 128 32 ) ( -128 112 32 ) tile043 [ -1 0 0 0 ] [ 0 0 -1 0 ] 0 1 1
( -144 64 32 ) ( -96 64 32 ) ( -96 64 16 ) tile043 [ 1 0 0 0 ] [ 0 0 -1 0 ] 0 1 1
( -96 64 16 ) ( -96 128 16 ) ( -128 112 16 ) tile043 [ -1 0 0 0 ] [ 0 -1 0 0 ] 0 1 1
( -128 112 32 ) ( -96 128 32 ) ( -96 64 32 ) tile043 [ 1 0 0 0 ] [ 0 -1 0 0 ] 0 1 1
( -96 64 32 ) ( -96 128 32 ) ( -96 128 16 ) tile043 [ 0 1 0 0 ] [ 0 0 -1 0 ] 0 1 1
}
}

View File

@@ -51,12 +51,12 @@
"extrude_direction" "1" "extrude_direction" "1"
// brush 0 // brush 0
{ {
( -176 -80 16 ) ( -176 -80 17 ) ( -176 -81 16 ) tile043 [ 2.220446049250313e-16 1 0 0 ] [ 0 0 -1 0 ] 0 1 1 ( -176 -96 16 ) ( -176 -96 17 ) ( -176 -97 16 ) "Stone Base/albedo" [ 0 -1 0 0 ] [ -0 -0 -1 0 ] 0 0.25 0.25
( -64 -128 32 ) ( -64 -128 33 ) ( -63 -128 32 ) tile043 [ -1 2.220446049250313e-16 0 0 ] [ 0 0 -1 0 ] 270 1 1 ( -64 -144 32 ) ( -64 -144 33 ) ( -63 -144 32 ) "Stone Base/albedo" [ 1 0 -0 1680 ] [ 0 -0 -1 2400 ] 0 0.06 0.06
( -144 -80 16 ) ( -144 -81 16 ) ( -143 -80 16 ) tile043 [ -1 0 0 0 ] [ 0 -1 0 0 ] 0 1 1 ( -144 -96 16 ) ( -144 -97 16 ) ( -143 -96 16 ) "Stone Base/albedo" [ -1 0 0 0 ] [ -0 -1 -0 0 ] 0 0.25 0.25
( -64 -160 112 ) ( -63 -160 112 ) ( -64 -161 112 ) tile043 [ 1 0 0 0 ] [ 0 -1 0 0 ] 270 1 1 ( -64 -176 112 ) ( -63 -176 112 ) ( -64 -177 112 ) "Stone Base/albedo" [ 1 -0 0 0 ] [ -0 -1 0 0 ] 0 0.25 0.25
( -144 -112 16 ) ( -143 -112 16 ) ( -144 -112 17 ) tile043 [ 1 -2.220446049250313e-16 0 0 ] [ 0 0 -1 0 ] 0 1 1 ( -144 -128 16 ) ( -143 -128 16 ) ( -144 -128 17 ) "Stone Base/albedo" [ -1 0 0 1680 ] [ 0 0 -1 2400 ] 0 0.06 0.06
( -13 -160 32 ) ( -13 -161 32 ) ( -13 -160 33 ) tile043 [ -2.220446049250313e-16 -1 0 0 ] [ 0 0 -1 0 ] 0 1 1 ( -13 -176 32 ) ( -13 -177 32 ) ( -13 -176 33 ) "Stone Base/albedo" [ -0 1 0 0 ] [ -0 0 -1 0 ] 0 0.25 0.25
} }
} }
// entity 4 // entity 4
@@ -78,48 +78,6 @@
"classname" "func_destructablewall" "classname" "func_destructablewall"
// brush 0 // brush 0
{ {
( 64 80 32 ) ( 64 80 33 ) ( 64 79 32 ) tile043 [ 0 1 0 0 ] [ 0 0 -1 0 ] 270 1 1
( 0 29 32 ) ( -1 29 32 ) ( 0 29 33 ) tile043 [ -1 0 0 0 ] [ 0 0 -1 0 ] 0 1 1
( 80 160 16 ) ( 79 160 16 ) ( 80 159 16 ) tile043 [ -1 0 0 0 ] [ 0 -1 0 0 ] 0 1 1
( 0 80 112 ) ( 0 79 112 ) ( -1 80 112 ) tile043 [ 1 0 0 0 ] [ 0 -1 0 0 ] 270 1 1
( 80 96 16 ) ( 80 96 17 ) ( 79 96 16 ) tile043 [ 1 0 0 0 ] [ 0 0 -1 0 ] 0 1 1
( 96 160 16 ) ( 96 159 16 ) ( 96 160 17 ) tile043 [ 0 -1 0 0 ] [ 0 0 -1 0 ] 0 1 1
}
}
// entity 6
{
"classname" "func_destructablewall"
"extrude_direction" "1"
// brush 0
{
( 0 -80 16 ) ( 0 -80 17 ) ( 0 -81 16 ) tile043 [ 2.220446049250313e-16 1 0 0 ] [ 0 0 -1 0 ] 0 1 1
( 112 -128 32 ) ( 112 -128 33 ) ( 113 -128 32 ) tile043 [ -1 2.220446049250313e-16 0 0 ] [ 0 0 -1 0 ] 270 1 1
( 32 -80 16 ) ( 32 -81 16 ) ( 33 -80 16 ) tile043 [ -1 0 0 0 ] [ 0 -1 0 0 ] 0 1 1
( 112 -160 112 ) ( 113 -160 112 ) ( 112 -161 112 ) tile043 [ 1 0 0 0 ] [ 0 -1 0 0 ] 270 1 1
( 32 -112 16 ) ( 33 -112 16 ) ( 32 -112 17 ) tile043 [ 1 -2.220446049250313e-16 0 0 ] [ 0 0 -1 0 ] 0 1 1
( 163 -160 32 ) ( 163 -161 32 ) ( 163 -160 33 ) tile043 [ -2.220446049250313e-16 -1 0 0 ] [ 0 0 -1 0 ] 0 1 1
}
}
// entity 7
{
"classname" "func_destructablewall"
"extrude_direction" "2"
// brush 0
{
( -144 64 48 ) ( -144 64 16 ) ( -128 128 16 ) tile043 [ 0 -1 0 0 ] [ 0 0 -1 0 ] 0 1 1
( -128 128 16 ) ( -96 128 48 ) ( -144 64 48 ) tile043 [ 0 -1 0 0 ] [ 0 0 -1 0 ] 0 1 1
( -144 64 48 ) ( -96 64 48 ) ( -96 64 16 ) tile043 [ 1 0 0 0 ] [ 0 0 -1 0 ] 0 1 1
( -96 64 16 ) ( -96 128 16 ) ( -128 128 16 ) tile043 [ -1 0 0 0 ] [ 0 -1 0 0 ] 0 1 1
( -144 64 48 ) ( -96 128 48 ) ( -96 64 48 ) tile043 [ 1 0 0 0 ] [ 0 -1 0 0 ] 0 1 1
( -96 128 16 ) ( -96 128 48 ) ( -128 128 16 ) tile043 [ -1 0 0 0 ] [ 0 0 -1 0 ] 0 1 1
( -96 64 48 ) ( -96 128 48 ) ( -96 128 16 ) tile043 [ 0 1 0 0 ] [ 0 0 -1 0 ] 0 1 1
}
}
// entity 8
{
"classname" "func_destructablewall"
// brush 0
{
( 128 0 32 ) ( 128 0 33 ) ( 128 -1 32 ) tile043 [ 0 1 0 0 ] [ 0 0 -1 0 ] 270 1 1 ( 128 0 32 ) ( 128 0 33 ) ( 128 -1 32 ) tile043 [ 0 1 0 0 ] [ 0 0 -1 0 ] 270 1 1
( 64 -51 32 ) ( 63 -51 32 ) ( 64 -51 33 ) tile043 [ -1 0 0 0 ] [ 0 0 -1 0 ] 0 1 1 ( 64 -51 32 ) ( 63 -51 32 ) ( 64 -51 33 ) tile043 [ -1 0 0 0 ] [ 0 0 -1 0 ] 0 1 1
( 144 80 16 ) ( 143 80 16 ) ( 144 79 16 ) tile043 [ -1 0 0 0 ] [ 0 -1 0 0 ] 0 1 1 ( 144 80 16 ) ( 143 80 16 ) ( 144 79 16 ) tile043 [ -1 0 0 0 ] [ 0 -1 0 0 ] 0 1 1
@@ -128,3 +86,30 @@
( 129 80 16 ) ( 129 79 16 ) ( 129 80 17 ) tile043 [ 0 -1 0 0 ] [ 0 0 -1 0 ] 0 1 1 ( 129 80 16 ) ( 129 79 16 ) ( 129 80 17 ) tile043 [ 0 -1 0 0 ] [ 0 0 -1 0 ] 0 1 1
} }
} }
// entity 6
{
"classname" "func_geo"
// brush 0
{
( 64 80 32 ) ( 64 80 33 ) ( 64 79 32 ) tile043 [ 0 1 0 0 ] [ 0 0 -1 0 ] 270 1 1
( 0 29 32 ) ( -1 29 32 ) ( 0 29 33 ) tile043 [ -1 0 0 0 ] [ 0 0 -1 0 ] 0 1 1
( 80 160 16 ) ( 79 160 16 ) ( 80 159 16 ) tile043 [ -1 0 0 0 ] [ 0 -1 0 0 ] 0 1 1
( 0 80 112 ) ( 0 79 112 ) ( -1 80 112 ) tile043 [ 1 0 0 0 ] [ 0 -1 0 0 ] 270 1 1
( 80 96 16 ) ( 80 96 17 ) ( 79 96 16 ) tile043 [ 1 0 0 0 ] [ 0 0 -1 0 ] 0 1 1
( 96 160 16 ) ( 96 159 16 ) ( 96 160 17 ) tile043 [ 0 -1 0 0 ] [ 0 0 -1 0 ] 0 1 1
}
}
// entity 7
{
"classname" "func_geo"
"extrude_direction" "1"
// brush 0
{
( 0 -96 16 ) ( 0 -96 17 ) ( 0 -97 16 ) tile043 [ 2.220446049250313e-16 1 0 0 ] [ 0 0 -1 0 ] 0 1 1
( 112 -144 32 ) ( 112 -144 33 ) ( 113 -144 32 ) tile043 [ -1 2.220446049250313e-16 0 0 ] [ 0 0 -1 0 ] 270 1 1
( 32 -96 16 ) ( 32 -97 16 ) ( 33 -96 16 ) tile043 [ -1 0 0 0 ] [ 0 -1 0 0 ] 0 1 1
( 112 -176 112 ) ( 113 -176 112 ) ( 112 -177 112 ) tile043 [ 1 0 0 0 ] [ 0 -1 0 0 ] 270 1 1
( 32 -128 16 ) ( 33 -128 16 ) ( 32 -128 17 ) tile043 [ 1 -2.220446049250313e-16 0 0 ] [ 0 0 -1 0 ] 0 1 1
( 163 -176 32 ) ( 163 -177 32 ) ( 163 -176 33 ) tile043 [ -2.220446049250313e-16 -1 0 0 ] [ 0 0 -1 0 ] 0 1 1
}
}

Binary file not shown.

After

Width:  |  Height:  |  Size: 7.5 MiB

View File

@@ -0,0 +1,40 @@
[remap]
importer="texture"
type="CompressedTexture2D"
uid="uid://cgn5jtjilj4o2"
path="res://.godot/imported/albedo.png-c9467079c2560110d7a406cbf02b588b.ctex"
metadata={
"vram_texture": false
}
[deps]
source_file="res://trenchbroom/textures/Concrete Trimsheet/albedo.png"
dest_files=["res://.godot/imported/albedo.png-c9467079c2560110d7a406cbf02b588b.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.8 MiB

View File

@@ -0,0 +1,40 @@
[remap]
importer="texture"
type="CompressedTexture2D"
uid="uid://b01emixymb3w2"
path="res://.godot/imported/ao.png-cc585abad8c5bdd965c9f768c4972044.ctex"
metadata={
"vram_texture": false
}
[deps]
source_file="res://trenchbroom/textures/Concrete Trimsheet/ao.png"
dest_files=["res://.godot/imported/ao.png-cc585abad8c5bdd965c9f768c4972044.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.1 MiB

View File

@@ -0,0 +1,40 @@
[remap]
importer="texture"
type="CompressedTexture2D"
uid="uid://b5ixgw1r8yv0"
path="res://.godot/imported/displacement.png-f7acd672c788173cc64aba629b031337.ctex"
metadata={
"vram_texture": false
}
[deps]
source_file="res://trenchbroom/textures/Concrete Trimsheet/displacement.png"
dest_files=["res://.godot/imported/displacement.png-f7acd672c788173cc64aba629b031337.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: 103 KiB

View File

@@ -0,0 +1,41 @@
[remap]
importer="texture"
type="CompressedTexture2D"
uid="uid://ddwy3erxcerb1"
path.s3tc="res://.godot/imported/metalness.png-811de7d8398e0f7ac5d420b69ae07b8b.s3tc.ctex"
metadata={
"imported_formats": ["s3tc_bptc"],
"vram_texture": true
}
[deps]
source_file="res://trenchbroom/textures/Concrete Trimsheet/metalness.png"
dest_files=["res://.godot/imported/metalness.png-811de7d8398e0f7ac5d420b69ae07b8b.s3tc.ctex"]
[params]
compress/mode=2
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=0

Binary file not shown.

After

Width:  |  Height:  |  Size: 6.6 MiB

View File

@@ -0,0 +1,40 @@
[remap]
importer="texture"
type="CompressedTexture2D"
uid="uid://2wh1r7d623bj"
path="res://.godot/imported/normal.png-561203e071145348ed337aeb4ea37bbe.ctex"
metadata={
"vram_texture": false
}
[deps]
source_file="res://trenchbroom/textures/Concrete Trimsheet/normal.png"
dest_files=["res://.godot/imported/normal.png-561203e071145348ed337aeb4ea37bbe.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.7 MiB

View File

@@ -0,0 +1,41 @@
[remap]
importer="texture"
type="CompressedTexture2D"
uid="uid://fnabneyexyga"
path.s3tc="res://.godot/imported/roughness.png-366d2753b7f639d68976124291e62a4b.s3tc.ctex"
metadata={
"imported_formats": ["s3tc_bptc"],
"vram_texture": true
}
[deps]
source_file="res://trenchbroom/textures/Concrete Trimsheet/roughness.png"
dest_files=["res://.godot/imported/roughness.png-366d2753b7f639d68976124291e62a4b.s3tc.ctex"]
[params]
compress/mode=2
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=0

Binary file not shown.

After

Width:  |  Height:  |  Size: 7.0 MiB

View File

@@ -2,8 +2,8 @@
importer="texture" importer="texture"
type="CompressedTexture2D" type="CompressedTexture2D"
uid="uid://dwhdp7spars2b" uid="uid://cqtxxrpfvymko"
path.s3tc="res://.godot/imported/texture.png-59546a6b6ae00ae598d09228d4c66fd2.s3tc.ctex" path.s3tc="res://.godot/imported/albedo.png-94a1bad07a09df0b9c2c6971f6d1a756.s3tc.ctex"
metadata={ metadata={
"imported_formats": ["s3tc_bptc"], "imported_formats": ["s3tc_bptc"],
"vram_texture": true "vram_texture": true
@@ -11,8 +11,8 @@ metadata={
[deps] [deps]
source_file="res://assets/textures/texture.png" source_file="res://trenchbroom/textures/Stone Base/albedo.png"
dest_files=["res://.godot/imported/texture.png-59546a6b6ae00ae598d09228d4c66fd2.s3tc.ctex"] dest_files=["res://.godot/imported/albedo.png-94a1bad07a09df0b9c2c6971f6d1a756.s3tc.ctex"]
[params] [params]

View File

@@ -0,0 +1,17 @@
[gd_resource type="StandardMaterial3D" load_steps=6 format=3 uid="uid://bh6w2gaj6r1nf"]
[ext_resource type="Texture2D" uid="uid://cqtxxrpfvymko" path="res://trenchbroom/textures/Stone Base/albedo.png" id="1_bp3ec"]
[ext_resource type="Texture2D" uid="uid://cyk5a2yldx1gj" path="res://trenchbroom/textures/Stone Base/ao.png" id="2_d52id"]
[ext_resource type="Texture2D" uid="uid://ddwy3erxcerb1" path="res://trenchbroom/textures/Concrete Trimsheet/metalness.png" id="3_8wxnd"]
[ext_resource type="Texture2D" uid="uid://bpbj8v704qrnv" path="res://trenchbroom/textures/Stone Base/normal.png" id="4_niemy"]
[ext_resource type="Texture2D" uid="uid://fnabneyexyga" path="res://trenchbroom/textures/Concrete Trimsheet/roughness.png" id="5_a0haq"]
[resource]
albedo_texture = ExtResource("1_bp3ec")
metallic = 1.0
metallic_specular = 0.0
metallic_texture = ExtResource("3_8wxnd")
roughness_texture = ExtResource("5_a0haq")
normal_texture = ExtResource("4_niemy")
ao_texture = ExtResource("2_d52id")
texture_filter = 2

Binary file not shown.

After

Width:  |  Height:  |  Size: 2.1 MiB

View File

@@ -0,0 +1,41 @@
[remap]
importer="texture"
type="CompressedTexture2D"
uid="uid://cyk5a2yldx1gj"
path.s3tc="res://.godot/imported/ao.png-f4bde4f93e17cff49491d998d779f05e.s3tc.ctex"
metadata={
"imported_formats": ["s3tc_bptc"],
"vram_texture": true
}
[deps]
source_file="res://trenchbroom/textures/Stone Base/ao.png"
dest_files=["res://.godot/imported/ao.png-f4bde4f93e17cff49491d998d779f05e.s3tc.ctex"]
[params]
compress/mode=2
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=8
roughness/src_normal="res://trenchbroom/textures/Stone Base/normal.png"
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=0

Binary file not shown.

After

Width:  |  Height:  |  Size: 1.2 MiB

View File

@@ -0,0 +1,41 @@
[remap]
importer="texture"
type="CompressedTexture2D"
uid="uid://bkhltyv2nlja0"
path.s3tc="res://.godot/imported/displacement.png-091d413bff0b611e04185243b1b3c4fc.s3tc.ctex"
metadata={
"imported_formats": ["s3tc_bptc"],
"vram_texture": true
}
[deps]
source_file="res://trenchbroom/textures/Stone Base/displacement.png"
dest_files=["res://.godot/imported/displacement.png-091d413bff0b611e04185243b1b3c4fc.s3tc.ctex"]
[params]
compress/mode=2
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=0

Binary file not shown.

After

Width:  |  Height:  |  Size: 76 KiB

View File

@@ -2,8 +2,8 @@
importer="texture" importer="texture"
type="CompressedTexture2D" type="CompressedTexture2D"
uid="uid://doknmohl75xnp" uid="uid://d15eqalyirq77"
path.s3tc="res://.godot/imported/t_floormetal1.png-42986c698f9d8b89446ac25d30252b9c.s3tc.ctex" path.s3tc="res://.godot/imported/metalness.png-4d0f08f876483f872b739098571e4533.s3tc.ctex"
metadata={ metadata={
"imported_formats": ["s3tc_bptc"], "imported_formats": ["s3tc_bptc"],
"vram_texture": true "vram_texture": true
@@ -11,8 +11,8 @@ metadata={
[deps] [deps]
source_file="res://assets/textures/t_floormetal1.png" source_file="res://trenchbroom/textures/Stone Base/metalness.png"
dest_files=["res://.godot/imported/t_floormetal1.png-42986c698f9d8b89446ac25d30252b9c.s3tc.ctex"] dest_files=["res://.godot/imported/metalness.png-4d0f08f876483f872b739098571e4533.s3tc.ctex"]
[params] [params]

Binary file not shown.

After

Width:  |  Height:  |  Size: 7.3 MiB

View File

@@ -0,0 +1,41 @@
[remap]
importer="texture"
type="CompressedTexture2D"
uid="uid://bpbj8v704qrnv"
path.s3tc="res://.godot/imported/normal.png-6b358cdb8f5db94cc35c6aaf1ca79241.s3tc.ctex"
metadata={
"imported_formats": ["s3tc_bptc"],
"vram_texture": true
}
[deps]
source_file="res://trenchbroom/textures/Stone Base/normal.png"
dest_files=["res://.godot/imported/normal.png-6b358cdb8f5db94cc35c6aaf1ca79241.s3tc.ctex"]
[params]
compress/mode=2
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=1
compress/channel_pack=0
mipmaps/generate=true
mipmaps/limit=-1
roughness/mode=1
roughness/src_normal="res://trenchbroom/textures/Stone Base/normal.png"
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=0

Binary file not shown.

After

Width:  |  Height:  |  Size: 3.4 MiB

View File

@@ -0,0 +1,41 @@
[remap]
importer="texture"
type="CompressedTexture2D"
uid="uid://bst8ahg5ksw7d"
path.s3tc="res://.godot/imported/roughness.png-8db90d670ae678b651ee6728ab1574b5.s3tc.ctex"
metadata={
"imported_formats": ["s3tc_bptc"],
"vram_texture": true
}
[deps]
source_file="res://trenchbroom/textures/Stone Base/roughness.png"
dest_files=["res://.godot/imported/roughness.png-8db90d670ae678b651ee6728ab1574b5.s3tc.ctex"]
[params]
compress/mode=2
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=0

77
src/rectangletree.cpp Normal file
View File

@@ -0,0 +1,77 @@
#include "rectangletree.hpp"
#include "godot_cpp/core/class_db.hpp"
#include "godot_cpp/variant/packed_int32_array.hpp"
#include "godot_cpp/variant/packed_vector2_array.hpp"
#include "godot_cpp/variant/vector2.hpp"
RectangleTree::RectangleTree() {}
void RectangleTree::_bind_methods() {
ClassDB::bind_method(
godot::D_METHOD("add", "min_bound", "max_bound", "polygon_index"),
&RectangleTree::add);
ClassDB::bind_method(godot::D_METHOD("remove", "point"),
&RectangleTree::remove);
ClassDB::bind_method(godot::D_METHOD("query", "point"),
&RectangleTree::query);
ClassDB::bind_method(godot::D_METHOD("nearest", "point", "number"),
&RectangleTree::nearest);
ClassDB::bind_method(godot::D_METHOD("query_rect", "min", "max"),
&RectangleTree::query_rect);
}
void RectangleTree::add(const Vector2 &min_bound, const Vector2 &max_bound,
const int &polygon_index) {
// convert into c++ types from godot types
Rect rect = Rect(min_bound.x, min_bound.y, max_bound.x, max_bound.y);
tree.Insert(rect.min, rect.max, polygon_index);
}
void RectangleTree::remove(const int &polygon_index) {
tree.Remove(polygon_index);
}
PackedInt32Array RectangleTree::query(const Vector2 &point) {
Rect rect = Rect(point.x, point.y, point.x, point.y);
PackedInt32Array return_value;
auto callbackLambda = [&return_value](int index) {
return_value.push_back(index);
return true;
};
tree.Search(rect.min, rect.max, callbackLambda);
return return_value;
}
PackedInt32Array RectangleTree::nearest(const Vector2 &point,
const int &number) {
Rect rect = Rect(point.x, point.y, point.x, point.y);
PackedInt32Array return_value;
auto callbackLambda = [&return_value, &number](int index, float) {
return_value.push_back(index);
return return_value.size() < number;
};
tree.NNSearch(rect.min, rect.max, callbackLambda);
return return_value;
}
PackedInt32Array RectangleTree::query_rect(const Vector2 &min,
const Vector2 &max) {
Rect rect = Rect(min.x, min.y, max.x, max.y);
PackedInt32Array return_value;
auto callbackLambda = [&return_value](int index) {
return_value.push_back(index);
return true;
};
tree.Search(rect.min, rect.max, callbackLambda);
return return_value;
}

55
src/rectangletree.hpp Normal file
View File

@@ -0,0 +1,55 @@
#pragma once
#include "godot_cpp/classes/wrapped.hpp"
#include "godot_cpp/variant/packed_int32_array.hpp"
#include "godot_cpp/variant/packed_vector2_array.hpp"
#include "godot_cpp/variant/vector2.hpp"
#include "rtree.h"
#include <godot_cpp/classes/object.hpp>
#include <godot_cpp/classes/polygon2d.hpp>
using namespace godot;
template <class CoordType = float> struct RectTemplate {
RectTemplate() {}
RectTemplate(CoordType a_minX, CoordType a_minY, CoordType a_maxX,
CoordType a_maxY) {
min[0] = a_minX;
min[1] = a_minY;
max[0] = a_maxX;
max[1] = a_maxY;
}
bool operator==(const RectTemplate &o) const {
return min[0] == o.min[0] && min[1] == o.min[1] && max[0] == o.max[0] &&
max[1] == o.max[1];
}
CoordType min[2];
CoordType max[2];
};
// returns an index, accepts 2 dimension floats
typedef RTree<int, float, 2> RecTree;
typedef RectTemplate<float> Rect;
class RectangleTree : public Object {
GDCLASS(RectangleTree, Object);
protected:
RecTree tree;
static void _bind_methods();
public:
RectangleTree();
void add(const Vector2 &min_bound, const Vector2 &max_bound,
const int &polgon_index);
void remove(const int &polygon_index);
PackedInt32Array query(const Vector2 &point);
PackedInt32Array nearest(const Vector2 &point, const int &number);
PackedInt32Array query_rect(const Vector2 &min, const Vector2 &max);
};

BIN
src/rectangletree.o Normal file

Binary file not shown.

View File

@@ -1,5 +1,6 @@
#include "register_types.h" #include "register_types.h"
#include "godot_cpp/core/class_db.hpp" #include "godot_cpp/core/class_db.hpp"
#include "rectangletree.hpp"
#include "triangulization.hpp" #include "triangulization.hpp"
#include <gdextension_interface.h> #include <gdextension_interface.h>
@@ -13,7 +14,8 @@ void initialize_triangulation_module(ModuleInitializationLevel p_level) {
return; return;
} }
GDREGISTER_CLASS(Triangulization) GDREGISTER_CLASS(Triangulization);
GDREGISTER_CLASS(RectangleTree);
} }
void uninitialize_triangulation_module(ModuleInitializationLevel p_level) { void uninitialize_triangulation_module(ModuleInitializationLevel p_level) {

BIN
src/register_types.o Normal file

Binary file not shown.

Binary file not shown.

View File

@@ -1,6 +1,16 @@
#ifndef RTREE_H #ifndef RTREE_H
#define RTREE_H #define RTREE_H
#define _USE_MATH_DEFINES
#ifndef M_PI
#define M_PI 3.14159265358979323846
#endif
#ifndef M_E
#define M_E 2.71828182845904523536
#endif
// NOTE This file compiles under MSVC 6 SP5 and MSVC .Net 2003 it may not work // NOTE This file compiles under MSVC 6 SP5 and MSVC .Net 2003 it may not work
// on other compilers without modification. // on other compilers without modification.

BIN
src/triangulization.o Normal file

Binary file not shown.

Binary file not shown.