diff --git a/.sconsign.dblite b/.sconsign.dblite index a598324..d9b9af7 100644 Binary files a/.sconsign.dblite and b/.sconsign.dblite differ diff --git a/blender/soup can/soup_can.blend b/blender/soup can/soup_can.blend index 7e782d0..ba241b5 100644 Binary files a/blender/soup can/soup_can.blend and b/blender/soup can/soup_can.blend differ diff --git a/blender/soup can/soup_can.blend1 b/blender/soup can/soup_can.blend1 new file mode 100644 index 0000000..cd61e76 Binary files /dev/null and b/blender/soup can/soup_can.blend1 differ diff --git a/blender/soup can/texture/AORoughMetal.png b/blender/soup can/texture/AORoughMetal.png new file mode 100644 index 0000000..7a29300 Binary files /dev/null and b/blender/soup can/texture/AORoughMetal.png differ diff --git a/blender/soup can/texture/BaseColor.png b/blender/soup can/texture/BaseColor.png new file mode 100644 index 0000000..de82908 Binary files /dev/null and b/blender/soup can/texture/BaseColor.png differ diff --git a/blender/soup can/texture/Normal.png b/blender/soup can/texture/Normal.png new file mode 100644 index 0000000..9109f22 Binary files /dev/null and b/blender/soup can/texture/Normal.png differ diff --git a/demo/addons/func_godot/src/core/entity_assembler.gd b/demo/addons/func_godot/src/core/entity_assembler.gd index 39ce37e..a1b7eeb 100644 --- a/demo/addons/func_godot/src/core/entity_assembler.gd +++ b/demo/addons/func_godot/src/core/entity_assembler.gd @@ -1,451 +1,451 @@ -@icon("res://addons/func_godot/icons/icon_godot_ranger.svg") -class_name FuncGodotEntityAssembler extends RefCounted -## Entity assembly class that is instantiated by a [FuncGodotMap] node. - -const _SIGNATURE: String = "[ENT]" - -# Namespacing -const _GroupData := FuncGodotData.GroupData -const _EntityData := FuncGodotData.EntityData - -# Class members -## [FuncGodotMapSettings] provided by the [FuncGodotMap] during the build process. -var map_settings: FuncGodotMapSettings = null -## [enum FuncGodotMap.BuildFlags] that may affect the build process provided by the [FuncGodotMap]. -var build_flags: int = 0 - -# Signals -## 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. -signal declare_step(step: String) - -func _init(settings: FuncGodotMapSettings) -> void: - map_settings = settings - -## 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: - if ResourceLoader.exists(name_of_class, "Script"): - return load(name_of_class) as Script - for global_class in ProjectSettings.get_global_class_list(): - var found_name_of_class : String = global_class["class"] - var found_path : String = global_class["path"] - if found_name_of_class == name_of_class: - return load(found_path) as Script - return null - -## 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: - var group_node := Node3D.new() - group_node.name = group_data.name - group_data.node = group_node - return group_node - -## 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. -func generate_solid_entity_node(node: Node, node_name: String, data: _EntityData, definition: FuncGodotFGDSolidClass) -> Node: - if definition.spawn_type == FuncGodotFGDSolidClass.SpawnType.MERGE_WORLDSPAWN: - return null - - if definition.node_class != "": - if ClassDB.class_exists(definition.node_class): - node = ClassDB.instantiate(definition.node_class) - else: - var script: Script = get_script_by_class_name(definition.node_class) - if script is GDScript: - node = (script as GDScript).new() - else: - node = Node3D.new() - - node.name = node_name - node_name = node_name.trim_suffix(definition.classname).trim_suffix("_") - var properties: Dictionary = data.properties - - # Mesh Instance generation - if data.mesh: - var mesh_instance := MeshInstance3D.new() - mesh_instance.name = node_name + "_mesh_instance" - mesh_instance.mesh = data.mesh - mesh_instance.gi_mode = GeometryInstance3D.GI_MODE_DISABLED - if definition.global_illumination_mode: - mesh_instance.gi_mode = definition.global_illumination_mode - mesh_instance.cast_shadow = definition.shadow_casting_setting - mesh_instance.layers = definition.render_layers - node.add_child(mesh_instance) - data.mesh_instance = mesh_instance - - # Occluder generation - if definition.build_occlusion and data.mesh: - var verts: PackedVector3Array = [] - var indices: PackedInt32Array = [] - var index: int = 0 - for surf_idx in range(data.mesh.get_surface_count()): - var vert_count: int = verts.size() - var surf_array: Array = data.mesh.surface_get_arrays(surf_idx) - verts.append_array(surf_array[Mesh.ARRAY_VERTEX]) - indices.resize(indices.size() + surf_array[Mesh.ARRAY_INDEX].size()) - for new_index in surf_array[Mesh.ARRAY_INDEX]: - indices[index] = (new_index + vert_count) - index += 1 - - var occluder := ArrayOccluder3D.new() - occluder.set_arrays(verts, indices) - var occluder_instance := OccluderInstance3D.new() - occluder_instance.name = node_name + "_occluder_instance" - occluder_instance.occluder = occluder - node.add_child(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): - mesh_instance.mesh = FuncGodotUtil.smooth_mesh_by_angle(data.mesh, data.get_smoothing_angle(map_settings.entity_smoothing_angle_property)) - - # Collision generation - if data.shapes.size() and node is CollisionObject3D: - node.collision_layer = definition.collision_layer - node.collision_mask = definition.collision_mask - node.collision_priority = definition.collision_priority - - var shape_to_face_array : Array[PackedInt32Array] = [] - if data.mesh_metadata.has('shape_to_face_array'): - shape_to_face_array = data.mesh_metadata['shape_to_face_array'] - data.mesh_metadata.erase('shape_to_face_array') - - # Generate CollisionShape3D nodes and apply shapes - var face_index_metadata : Dictionary[String, PackedInt32Array] = {} - for i in data.shapes.size(): - var shape := data.shapes[i] - var collision_shape := CollisionShape3D.new() - if definition.collision_shape_type == FuncGodotFGDSolidClass.CollisionShapeType.CONCAVE: - collision_shape.name = node_name + "_collision_shape" - else: - collision_shape.name = node_name + "_brush_%s_collision_shape" % i - collision_shape.shape = shape - collision_shape.shape.margin = definition.collision_shape_margin - collision_shape.owner = node.owner - node.add_child(collision_shape) - data.collision_shapes.append(collision_shape) - if shape_to_face_array.size() > i: - face_index_metadata[collision_shape.name] = shape_to_face_array[i] - - if definition.add_collision_shape_to_face_indices_metadata: - data.mesh_metadata['collision_shape_to_face_indices_map'] = face_index_metadata - - if "position" in node: - if node.position is Vector3: - node.position = FuncGodotUtil.id_to_opengl(data.origin) * map_settings.scale_factor - - if not data.mesh_metadata.is_empty(): - node.set_meta("func_godot_mesh_data", data.mesh_metadata) - - return node - -## 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: - var classname: String = properties["classname"] - - if definition.scene_file: - var flag: PackedScene.GenEditState = PackedScene.GEN_EDIT_STATE_DISABLED - if Engine.is_editor_hint(): - flag = PackedScene.GEN_EDIT_STATE_INSTANCE - node = definition.scene_file.instantiate(flag) - elif definition.node_class != "": - if ClassDB.class_exists(definition.node_class): - node = ClassDB.instantiate(definition.node_class) - else: - var script: Script = get_script_by_class_name(definition.node_class) - if script is GDScript: - node = (script as GDScript).new() - else: - node = Node3D.new() - - node.name = node_name - - if "rotation_degrees" in node and definition.apply_rotation_on_map_build: - var angles := Vector3.ZERO - if "angles" in properties or "mangle" in properties: - var key := "angles" if "angles" in properties else "mangle" - var angles_raw = properties[key] - if not angles_raw is Vector3: - angles_raw = angles_raw.split_floats(' ') - if angles_raw.size() > 2: - angles = Vector3(-angles_raw[0], angles_raw[1], -angles_raw[2]) - if key == "mangle": - if definition.classname.begins_with("light"): - angles = Vector3(angles_raw[1], angles_raw[0], -angles_raw[2]) - elif definition.classname == "info_intermission": - angles = Vector3(angles_raw[0], angles_raw[1], -angles_raw[2]) - else: - push_error("Invalid vector format for \"" + key + "\" in entity \"" + classname + "\"") - elif "angle" in properties: - var angle = properties["angle"] - if not angle is float: - angle = float(angle) - angles.y += angle - angles.y += 180 - node.rotation_degrees = angles - - if "scale" in node and definition.apply_scale_on_map_build: - if "scale" in properties: - var scale_prop: Variant = properties["scale"] - if typeof(scale_prop) == TYPE_STRING: - var scale_arr: PackedStringArray = (scale_prop as String).split(" ") - match scale_arr.size(): - 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()) - 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: - node.scale *= scale_prop as float - elif node.scale is Vector3: - if typeof(scale_prop) == TYPE_VECTOR3 or typeof(scale_prop) == TYPE_VECTOR3I: - node.scale *= scale_prop as Vector3 - elif node.scale is Vector2: - if typeof(scale_prop) == TYPE_VECTOR2 or typeof(scale_prop) == TYPE_VECTOR2I: - node.scale *= scale_prop as Vector2 - - if "origin" in properties: - var origin_vec: Vector3 = Vector3.ZERO - var origin_comps: PackedFloat64Array = properties['origin'].split_floats(' ') - if origin_comps.size() > 2: - origin_vec = Vector3(origin_comps[1], origin_comps[2], origin_comps[0]) - else: - push_error("Invalid vector format for \"origin\" in " + node_name) - if "position" in node: - if node.position is Vector3: - node.position = origin_vec * map_settings.scale_factor - elif node.position is Vector2: - node.position = Vector2(origin_vec.z, -origin_vec.y) - - return node - -## 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] -## 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: - var properties: Dictionary = data.properties - - if data.definition: - var def := data.definition - for property in properties: - var prop_string = properties[property] - if property in def.class_properties: - var prop_default: Variant = def.class_properties[property] - - match typeof(prop_default): - TYPE_INT: - properties[property] = prop_string.to_int() - TYPE_FLOAT: - properties[property] = prop_string.to_float() - TYPE_BOOL: - properties[property] = bool(prop_string.to_int()) - TYPE_VECTOR3: - var prop_comps: PackedFloat64Array = prop_string.split_floats(" ") - if prop_comps.size() > 2: - properties[property] = Vector3(prop_comps[0], prop_comps[1], prop_comps[2]) - else: - push_error("Invalid Vector3 format for \'" + property + "\' in entity \'" + def.classname + "\': " + prop_string) - properties[property] = prop_default - TYPE_VECTOR3I: - var prop_vec: Vector3i = prop_default - var prop_comps: PackedStringArray = prop_string.split(" ") - if prop_comps.size() > 2: - for i in 3: - prop_vec[i] = prop_comps[i].to_int() - else: - push_error("Invalid Vector3i format for \'" + property + "\' in entity \'" + def.classname + "\': " + prop_string) - properties[property] = prop_vec - TYPE_COLOR: - var prop_color: Color = prop_default - var prop_comps: PackedStringArray = prop_string.split(" ") - if prop_comps.size() > 2: - prop_color.r8 = prop_comps[0].to_int() - prop_color.g8 = prop_comps[1].to_int() - prop_color.b8 = prop_comps[2].to_int() - prop_color.a = 1.0 - else: - push_error("Invalid Color format for \'" + property + "\' in entity \'" + def.classname + "\': " + prop_string) - properties[property] = prop_color - TYPE_DICTIONARY: - var prop_desc = def.class_property_descriptions[property] - if prop_desc is Array and prop_desc.size() > 1 and prop_desc[1] is int: - properties[property] = prop_string.to_int() - TYPE_ARRAY: - properties[property] = prop_string.to_int() - TYPE_VECTOR2: - var prop_comps: PackedFloat64Array = prop_string.split_floats(" ") - if prop_comps.size() > 1: - properties[property] = Vector2(prop_comps[0], prop_comps[1]) - else: - push_error("Invalid Vector2 format for \'" + property + "\' in entity \'" + def.classname + "\': " + prop_string) - properties[property] = prop_default - TYPE_VECTOR2I: - var prop_vec: Vector2i = prop_default - var prop_comps: PackedStringArray = prop_string.split(" ") - if prop_comps.size() > 1: - for i in 2: - prop_vec[i] = prop_comps[i].to_int() - else: - push_error("Invalid Vector2i format for \'" + property + "\' in entity \'" + def.classname + "\': " + prop_string) - properties[property] = prop_vec - TYPE_VECTOR4: - var prop_comps: PackedFloat64Array = prop_string.split_floats(" ") - if prop_comps.size() > 3: - properties[property] = Vector4(prop_comps[0], prop_comps[1], prop_comps[2], prop_comps[3]) - else: - push_error("Invalid Vector4 format for \'" + property + "\' in entity \'" + def.classname + "\': " + prop_string) - properties[property] = prop_default - TYPE_VECTOR4I: - var prop_vec: Vector4i = prop_default - var prop_comps: PackedStringArray = prop_string.split(" ") - if prop_comps.size() > 3: - for i in 4: - prop_vec[i] = prop_comps[i].to_int() - else: - push_error("Invalid Vector4i format for \'" + property + "\' in entity \'" + def.classname + "\': " + prop_string) - properties[property] = prop_vec - TYPE_STRING_NAME: - properties[property] = StringName(prop_string) - TYPE_NODE_PATH: - properties[property] = prop_string - TYPE_OBJECT: - properties[property] = prop_string - - # Assign properties not defined with defaults from the entity definition - for property in def.class_properties: - if not property in properties: - var prop_default: Variant = def.class_properties[property] - # Flags - if prop_default is Array: - var prop_flags_sum := 0 - for prop_flag in prop_default: - if prop_flag is Array and prop_flag.size() > 2: - if prop_flag[2] and prop_flag[1] is int: - prop_flags_sum += prop_flag[1] - properties[property] = prop_flags_sum - # Choices - elif prop_default is Dictionary: - 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): - properties[property] = prop_desc[1] - elif prop_default.size(): - properties[property] = prop_default[prop_default.keys().front()] - else: - properties[property] = 0 - # Materials, Shaders, and Sounds - elif prop_default is Resource: - properties[property] = prop_default.resource_path - # Target Destination and Target Source - elif prop_default is NodePath or prop_default is Object or prop_default == null: - properties[property] = "" - # Everything else - else: - properties[property] = prop_default - - if def.auto_apply_to_matching_node_properties: - for property in properties: - if property in node: - if typeof(node.get(property)) == typeof(properties[property]): - node.set(property, properties[property]) - else: - push_error("Entity %s property \'%s\' type mismatch with matching generated node property." % [node.name, property]) - - if "func_godot_properties" in node: - node.func_godot_properties = properties - - if node.has_method("_func_godot_apply_properties"): - node.call("_func_godot_apply_properties", properties) - - if node.has_method("_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], -## in the case of [FuncGodotFGDSolidClass] entities with no [FuncGodotData.BrushData] entries. -func generate_entity_node(entity_data: _EntityData, entity_index: int) -> Node: - var node: Node = null - var node_name: String = "entity_%s" % entity_index - var properties: Dictionary = entity_data.properties - var entity_def: FuncGodotFGDEntityClass = entity_data.definition - - if "classname" in entity_data.properties: - var classname: String = properties["classname"] - - node_name += "_" + properties["classname"] - var default_point_def := FuncGodotFGDPointClass.new() - var default_solid_def := FuncGodotFGDSolidClass.new() - default_solid_def.collision_shape_type = FuncGodotFGDSolidClass.CollisionShapeType.NONE - - if entity_def: - var name_prop: String - if entity_def.name_property in properties: - name_prop = str(properties[entity_def.name_property]) - elif map_settings.entity_name_property in properties: - name_prop = str(properties[map_settings.entity_name_property]) - if not name_prop.is_empty(): - node_name = "entity_" + name_prop - - if entity_def is FuncGodotFGDSolidClass: - node = generate_solid_entity_node(node, node_name, entity_data, entity_def) - elif entity_def is FuncGodotFGDPointClass: - node = generate_point_entity_node(node, node_name, properties, entity_def) - else: - 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) - - if node and entity_def.script_class: - node.set_script(entity_def.script_class) - else: - push_error("No entity definition found for \"" + node_name + "\"") - if entity_data.brushes.size(): - node = generate_solid_entity_node(node, node_name, entity_data, default_solid_def) - else: - node = generate_point_entity_node(node, node_name, properties, default_point_def) - - return node - -## 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]. -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 - build_flags = map_node.build_flags - - if map_settings.use_groups_hierarchy: - declare_step.emit("Generating %s groups" % groups.size()) - # Generate group nodes - for group in groups: - group.node = generate_group_node(group) - # Sort hierarchy and add them to the map - for group in groups: - if group.parent_id < 0: - map_node.add_child(group.node) - group.node.owner = scene_root - else: - for parent in groups: - if group.parent_id == parent.id: - parent.node.add_child(group.node) - group.node.owner = scene_root - declare_step.emit("Groups generation and sorting complete") - - declare_step.emit("Assembling %s entities" % entities.size()) - var entity_node: Node = null - for entity_index in entities.size(): - var entity_data : _EntityData = entities[entity_index] - entity_node = generate_entity_node(entity_data, entity_index) - if entity_node: - if not map_settings.use_groups_hierarchy or not entity_data.group: - map_node.add_child(entity_node) - if entity_index == 0: - map_node.move_child(entity_node, 0) - elif map_settings.use_groups_hierarchy: - for group in groups: - if entity_data.group.id == group.id: - group.node.add_child(entity_node) - - entity_node.owner = scene_root - if entity_data.mesh_instance: - entity_data.mesh_instance.owner = scene_root - for shape in entity_data.collision_shapes: - if shape: - shape.owner = scene_root - if entity_data.occluder_instance: - entity_data.occluder_instance.owner = scene_root - - apply_entity_properties(entity_node, entity_data) - declare_step.emit("Entity assembly and property application complete") +@icon("res://addons/func_godot/icons/icon_godot_ranger.svg") +class_name FuncGodotEntityAssembler extends RefCounted +## Entity assembly class that is instantiated by a [FuncGodotMap] node. + +const _SIGNATURE: String = "[ENT]" + +# Namespacing +const _GroupData := FuncGodotData.GroupData +const _EntityData := FuncGodotData.EntityData + +# Class members +## [FuncGodotMapSettings] provided by the [FuncGodotMap] during the build process. +var map_settings: FuncGodotMapSettings = null +## [enum FuncGodotMap.BuildFlags] that may affect the build process provided by the [FuncGodotMap]. +var build_flags: int = 0 + +# Signals +## 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. +signal declare_step(step: String) + +func _init(settings: FuncGodotMapSettings) -> void: + map_settings = settings + +## 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: + if ResourceLoader.exists(name_of_class, "Script"): + return load(name_of_class) as Script + for global_class in ProjectSettings.get_global_class_list(): + var found_name_of_class : String = global_class["class"] + var found_path : String = global_class["path"] + if found_name_of_class == name_of_class: + return load(found_path) as Script + return null + +## 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: + var group_node := Node3D.new() + group_node.name = group_data.name + group_data.node = group_node + return group_node + +## 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. +func generate_solid_entity_node(node: Node, node_name: String, data: _EntityData, definition: FuncGodotFGDSolidClass) -> Node: + if definition.spawn_type == FuncGodotFGDSolidClass.SpawnType.MERGE_WORLDSPAWN: + return null + + if definition.node_class != "": + if ClassDB.class_exists(definition.node_class): + node = ClassDB.instantiate(definition.node_class) + else: + var script: Script = get_script_by_class_name(definition.node_class) + if script is GDScript: + node = (script as GDScript).new() + else: + node = Node3D.new() + + node.name = node_name + node_name = node_name.trim_suffix(definition.classname).trim_suffix("_") + var properties: Dictionary = data.properties + + # Mesh Instance generation + if data.mesh: + var mesh_instance := MeshInstance3D.new() + mesh_instance.name = node_name + "_mesh_instance" + mesh_instance.mesh = data.mesh + mesh_instance.gi_mode = GeometryInstance3D.GI_MODE_DISABLED + if definition.global_illumination_mode: + mesh_instance.gi_mode = definition.global_illumination_mode + mesh_instance.cast_shadow = definition.shadow_casting_setting + mesh_instance.layers = definition.render_layers + node.add_child(mesh_instance) + data.mesh_instance = mesh_instance + + # Occluder generation + if definition.build_occlusion and data.mesh: + var verts: PackedVector3Array = [] + var indices: PackedInt32Array = [] + var index: int = 0 + for surf_idx in range(data.mesh.get_surface_count()): + var vert_count: int = verts.size() + var surf_array: Array = data.mesh.surface_get_arrays(surf_idx) + verts.append_array(surf_array[Mesh.ARRAY_VERTEX]) + indices.resize(indices.size() + surf_array[Mesh.ARRAY_INDEX].size()) + for new_index in surf_array[Mesh.ARRAY_INDEX]: + indices[index] = (new_index + vert_count) + index += 1 + + var occluder := ArrayOccluder3D.new() + occluder.set_arrays(verts, indices) + var occluder_instance := OccluderInstance3D.new() + occluder_instance.name = node_name + "_occluder_instance" + occluder_instance.occluder = occluder + node.add_child(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): + mesh_instance.mesh = FuncGodotUtil.smooth_mesh_by_angle(data.mesh, data.get_smoothing_angle(map_settings.entity_smoothing_angle_property)) + + # Collision generation + if data.shapes.size() and node is CollisionObject3D: + node.collision_layer = definition.collision_layer + node.collision_mask = definition.collision_mask + node.collision_priority = definition.collision_priority + + var shape_to_face_array : Array[PackedInt32Array] = [] + if data.mesh_metadata.has('shape_to_face_array'): + shape_to_face_array = data.mesh_metadata['shape_to_face_array'] + data.mesh_metadata.erase('shape_to_face_array') + + # Generate CollisionShape3D nodes and apply shapes + var face_index_metadata : Dictionary[String, PackedInt32Array] = {} + for i in data.shapes.size(): + var shape := data.shapes[i] + var collision_shape := CollisionShape3D.new() + if definition.collision_shape_type == FuncGodotFGDSolidClass.CollisionShapeType.CONCAVE: + collision_shape.name = node_name + "_collision_shape" + else: + collision_shape.name = node_name + "_brush_%s_collision_shape" % i + collision_shape.shape = shape + collision_shape.shape.margin = definition.collision_shape_margin + collision_shape.owner = node.owner + node.add_child(collision_shape) + data.collision_shapes.append(collision_shape) + if shape_to_face_array.size() > i: + face_index_metadata[collision_shape.name] = shape_to_face_array[i] + + if definition.add_collision_shape_to_face_indices_metadata: + data.mesh_metadata['collision_shape_to_face_indices_map'] = face_index_metadata + + if "position" in node: + if node.position is Vector3: + node.position = FuncGodotUtil.id_to_opengl(data.origin) * map_settings.scale_factor + + if not data.mesh_metadata.is_empty(): + node.set_meta("func_godot_mesh_data", data.mesh_metadata) + + return node + +## 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: + var classname: String = properties["classname"] + + if definition.scene_file: + var flag: PackedScene.GenEditState = PackedScene.GEN_EDIT_STATE_DISABLED + if Engine.is_editor_hint(): + flag = PackedScene.GEN_EDIT_STATE_INSTANCE + node = definition.scene_file.instantiate(flag) + elif definition.node_class != "": + if ClassDB.class_exists(definition.node_class): + node = ClassDB.instantiate(definition.node_class) + else: + var script: Script = get_script_by_class_name(definition.node_class) + if script is GDScript: + node = (script as GDScript).new() + else: + node = Node3D.new() + + node.name = node_name + + if "rotation_degrees" in node and definition.apply_rotation_on_map_build: + var angles := Vector3.ZERO + if "angles" in properties or "mangle" in properties: + var key := "angles" if "angles" in properties else "mangle" + var angles_raw = properties[key] + if not angles_raw is Vector3: + angles_raw = angles_raw.split_floats(' ') + if angles_raw.size() > 2: + angles = Vector3(-angles_raw[0], angles_raw[1], -angles_raw[2]) + if key == "mangle": + if definition.classname.begins_with("light"): + angles = Vector3(angles_raw[1], angles_raw[0], -angles_raw[2]) + elif definition.classname == "info_intermission": + angles = Vector3(angles_raw[0], angles_raw[1], -angles_raw[2]) + else: + push_error("Invalid vector format for \"" + key + "\" in entity \"" + classname + "\"") + elif "angle" in properties: + var angle = properties["angle"] + if not angle is float: + angle = float(angle) + angles.y += angle + angles.y += 180 + node.rotation_degrees = angles + + if "scale" in node and definition.apply_scale_on_map_build: + if "scale" in properties: + var scale_prop: Variant = properties["scale"] + if typeof(scale_prop) == TYPE_STRING: + var scale_arr: PackedStringArray = (scale_prop as String).split(" ") + match scale_arr.size(): + 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()) + 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: + node.scale *= scale_prop as float + elif node.scale is Vector3: + if typeof(scale_prop) == TYPE_VECTOR3 or typeof(scale_prop) == TYPE_VECTOR3I: + node.scale *= scale_prop as Vector3 + elif node.scale is Vector2: + if typeof(scale_prop) == TYPE_VECTOR2 or typeof(scale_prop) == TYPE_VECTOR2I: + node.scale *= scale_prop as Vector2 + + if "origin" in properties: + var origin_vec: Vector3 = Vector3.ZERO + var origin_comps: PackedFloat64Array = properties['origin'].split_floats(' ') + if origin_comps.size() > 2: + origin_vec = Vector3(origin_comps[1], origin_comps[2], origin_comps[0]) + else: + push_error("Invalid vector format for \"origin\" in " + node_name) + if "position" in node: + if node.position is Vector3: + node.position = origin_vec * map_settings.scale_factor + elif node.position is Vector2: + node.position = Vector2(origin_vec.z, -origin_vec.y) + + return node + +## 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] +## 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: + var properties: Dictionary = data.properties + + if data.definition: + var def := data.definition + for property in properties: + var prop_string = properties[property] + if property in def.class_properties: + var prop_default: Variant = def.class_properties[property] + + match typeof(prop_default): + TYPE_INT: + properties[property] = prop_string.to_int() + TYPE_FLOAT: + properties[property] = prop_string.to_float() + TYPE_BOOL: + properties[property] = bool(prop_string.to_int()) + TYPE_VECTOR3: + var prop_comps: PackedFloat64Array = prop_string.split_floats(" ") + if prop_comps.size() > 2: + properties[property] = Vector3(prop_comps[0], prop_comps[1], prop_comps[2]) + else: + push_error("Invalid Vector3 format for \'" + property + "\' in entity \'" + def.classname + "\': " + prop_string) + properties[property] = prop_default + TYPE_VECTOR3I: + var prop_vec: Vector3i = prop_default + var prop_comps: PackedStringArray = prop_string.split(" ") + if prop_comps.size() > 2: + for i in 3: + prop_vec[i] = prop_comps[i].to_int() + else: + push_error("Invalid Vector3i format for \'" + property + "\' in entity \'" + def.classname + "\': " + prop_string) + properties[property] = prop_vec + TYPE_COLOR: + var prop_color: Color = prop_default + var prop_comps: PackedStringArray = prop_string.split(" ") + if prop_comps.size() > 2: + prop_color.r8 = prop_comps[0].to_int() + prop_color.g8 = prop_comps[1].to_int() + prop_color.b8 = prop_comps[2].to_int() + prop_color.a = 1.0 + else: + push_error("Invalid Color format for \'" + property + "\' in entity \'" + def.classname + "\': " + prop_string) + properties[property] = prop_color + TYPE_DICTIONARY: + var prop_desc = def.class_property_descriptions[property] + if prop_desc is Array and prop_desc.size() > 1 and prop_desc[1] is int: + properties[property] = prop_string.to_int() + TYPE_ARRAY: + properties[property] = prop_string.to_int() + TYPE_VECTOR2: + var prop_comps: PackedFloat64Array = prop_string.split_floats(" ") + if prop_comps.size() > 1: + properties[property] = Vector2(prop_comps[0], prop_comps[1]) + else: + push_error("Invalid Vector2 format for \'" + property + "\' in entity \'" + def.classname + "\': " + prop_string) + properties[property] = prop_default + TYPE_VECTOR2I: + var prop_vec: Vector2i = prop_default + var prop_comps: PackedStringArray = prop_string.split(" ") + if prop_comps.size() > 1: + for i in 2: + prop_vec[i] = prop_comps[i].to_int() + else: + push_error("Invalid Vector2i format for \'" + property + "\' in entity \'" + def.classname + "\': " + prop_string) + properties[property] = prop_vec + TYPE_VECTOR4: + var prop_comps: PackedFloat64Array = prop_string.split_floats(" ") + if prop_comps.size() > 3: + properties[property] = Vector4(prop_comps[0], prop_comps[1], prop_comps[2], prop_comps[3]) + else: + push_error("Invalid Vector4 format for \'" + property + "\' in entity \'" + def.classname + "\': " + prop_string) + properties[property] = prop_default + TYPE_VECTOR4I: + var prop_vec: Vector4i = prop_default + var prop_comps: PackedStringArray = prop_string.split(" ") + if prop_comps.size() > 3: + for i in 4: + prop_vec[i] = prop_comps[i].to_int() + else: + push_error("Invalid Vector4i format for \'" + property + "\' in entity \'" + def.classname + "\': " + prop_string) + properties[property] = prop_vec + TYPE_STRING_NAME: + properties[property] = StringName(prop_string) + TYPE_NODE_PATH: + properties[property] = prop_string + TYPE_OBJECT: + properties[property] = prop_string + + # Assign properties not defined with defaults from the entity definition + for property in def.class_properties: + if not property in properties: + var prop_default: Variant = def.class_properties[property] + # Flags + if prop_default is Array: + var prop_flags_sum := 0 + for prop_flag in prop_default: + if prop_flag is Array and prop_flag.size() > 2: + if prop_flag[2] and prop_flag[1] is int: + prop_flags_sum += prop_flag[1] + properties[property] = prop_flags_sum + # Choices + elif prop_default is Dictionary: + 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): + properties[property] = prop_desc[1] + elif prop_default.size(): + properties[property] = prop_default[prop_default.keys().front()] + else: + properties[property] = 0 + # Materials, Shaders, and Sounds + elif prop_default is Resource: + properties[property] = prop_default.resource_path + # Target Destination and Target Source + elif prop_default is NodePath or prop_default is Object or prop_default == null: + properties[property] = "" + # Everything else + else: + properties[property] = prop_default + + if def.auto_apply_to_matching_node_properties: + for property in properties: + if property in node: + if typeof(node.get(property)) == typeof(properties[property]): + node.set(property, properties[property]) + else: + push_error("Entity %s property \'%s\' type mismatch with matching generated node property." % [node.name, property]) + + if "func_godot_properties" in node: + node.func_godot_properties = properties + + if node.has_method("_func_godot_apply_properties"): + node.call("_func_godot_apply_properties", properties) + + if node.has_method("_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], +## in the case of [FuncGodotFGDSolidClass] entities with no [FuncGodotData.BrushData] entries. +func generate_entity_node(entity_data: _EntityData, entity_index: int) -> Node: + var node: Node = null + var node_name: String = "entity_%s" % entity_index + var properties: Dictionary = entity_data.properties + var entity_def: FuncGodotFGDEntityClass = entity_data.definition + + if "classname" in entity_data.properties: + var classname: String = properties["classname"] + + node_name += "_" + properties["classname"] + var default_point_def := FuncGodotFGDPointClass.new() + var default_solid_def := FuncGodotFGDSolidClass.new() + default_solid_def.collision_shape_type = FuncGodotFGDSolidClass.CollisionShapeType.NONE + + if entity_def: + var name_prop: String + if entity_def.name_property in properties: + name_prop = str(properties[entity_def.name_property]) + elif map_settings.entity_name_property in properties: + name_prop = str(properties[map_settings.entity_name_property]) + if not name_prop.is_empty(): + node_name = "entity_" + name_prop + + if entity_def is FuncGodotFGDSolidClass: + node = generate_solid_entity_node(node, node_name, entity_data, entity_def) + elif entity_def is FuncGodotFGDPointClass: + node = generate_point_entity_node(node, node_name, properties, entity_def) + else: + 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) + + if node and entity_def.script_class: + node.set_script(entity_def.script_class) + else: + push_error("No entity definition found for \"" + node_name + "\"") + if entity_data.brushes.size(): + node = generate_solid_entity_node(node, node_name, entity_data, default_solid_def) + else: + node = generate_point_entity_node(node, node_name, properties, default_point_def) + + return node + +## 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]. +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 + build_flags = map_node.build_flags + + if map_settings.use_groups_hierarchy: + declare_step.emit("Generating %s groups" % groups.size()) + # Generate group nodes + for group in groups: + group.node = generate_group_node(group) + # Sort hierarchy and add them to the map + for group in groups: + if group.parent_id < 0: + map_node.add_child(group.node) + group.node.owner = scene_root + else: + for parent in groups: + if group.parent_id == parent.id: + parent.node.add_child(group.node) + group.node.owner = scene_root + declare_step.emit("Groups generation and sorting complete") + + declare_step.emit("Assembling %s entities" % entities.size()) + var entity_node: Node = null + for entity_index in entities.size(): + var entity_data : _EntityData = entities[entity_index] + entity_node = generate_entity_node(entity_data, entity_index) + if entity_node: + if not map_settings.use_groups_hierarchy or not entity_data.group: + map_node.add_child(entity_node) + if entity_index == 0: + map_node.move_child(entity_node, 0) + elif map_settings.use_groups_hierarchy: + for group in groups: + if entity_data.group.id == group.id: + group.node.add_child(entity_node) + + entity_node.owner = scene_root + if entity_data.mesh_instance: + entity_data.mesh_instance.owner = scene_root + for shape in entity_data.collision_shapes: + if shape: + shape.owner = scene_root + if entity_data.occluder_instance: + entity_data.occluder_instance.owner = scene_root + + apply_entity_properties(entity_node, entity_data) + declare_step.emit("Entity assembly and property application complete") diff --git a/demo/addons/func_godot/src/core/geometry_generator.gd b/demo/addons/func_godot/src/core/geometry_generator.gd index 4280ce1..7705c61 100644 --- a/demo/addons/func_godot/src/core/geometry_generator.gd +++ b/demo/addons/func_godot/src/core/geometry_generator.gd @@ -321,6 +321,7 @@ func generate_entity_surfaces(entity_index: int) -> void: var current_metadata_index: int = 0 var texture_names_metadata: Array[StringName] = [] var textures_metadata: PackedInt32Array = [] + var uv_metadata: PackedVector2Array = [] var vertices_metadata: PackedVector3Array = [] var normals_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 var index_offset: int = 0 - for face in faces: # 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)) 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 for i in face.vertices.size(): # 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 if def.add_face_position_metadata: entity.mesh_metadata["positions"] = positions_metadata + entity.mesh_metadata["uvs"] = uv_metadata entity.mesh = mesh diff --git a/demo/assets/models/soup_can/soup_can.glb b/demo/assets/models/soup_can/soup_can.glb new file mode 100644 index 0000000..c9f3cde Binary files /dev/null and b/demo/assets/models/soup_can/soup_can.glb differ diff --git a/demo/assets/models/soup_can/soup_can.glb.import b/demo/assets/models/soup_can/soup_can.glb.import new file mode 100644 index 0000000..b5e1038 --- /dev/null +++ b/demo/assets/models/soup_can/soup_can.glb.import @@ -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 diff --git a/demo/assets/models/soup_can/soup_can_AORoughMetal.png b/demo/assets/models/soup_can/soup_can_AORoughMetal.png new file mode 100644 index 0000000..ee43239 Binary files /dev/null and b/demo/assets/models/soup_can/soup_can_AORoughMetal.png differ diff --git a/demo/assets/models/soup_can/soup_can_AORoughMetal.png.import b/demo/assets/models/soup_can/soup_can_AORoughMetal.png.import new file mode 100644 index 0000000..2f2a49a --- /dev/null +++ b/demo/assets/models/soup_can/soup_can_AORoughMetal.png.import @@ -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 diff --git a/demo/assets/models/soup_can/soup_can_BaseColor.png b/demo/assets/models/soup_can/soup_can_BaseColor.png new file mode 100644 index 0000000..1f61483 Binary files /dev/null and b/demo/assets/models/soup_can/soup_can_BaseColor.png differ diff --git a/demo/assets/models/soup_can/soup_can_BaseColor.png.import b/demo/assets/models/soup_can/soup_can_BaseColor.png.import new file mode 100644 index 0000000..88a4e89 --- /dev/null +++ b/demo/assets/models/soup_can/soup_can_BaseColor.png.import @@ -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 diff --git a/demo/assets/models/soup_can/soup_can_Normal.png b/demo/assets/models/soup_can/soup_can_Normal.png new file mode 100644 index 0000000..5fb684a Binary files /dev/null and b/demo/assets/models/soup_can/soup_can_Normal.png differ diff --git a/demo/assets/models/soup_can/soup_can_Normal.png.import b/demo/assets/models/soup_can/soup_can_Normal.png.import new file mode 100644 index 0000000..f578cdc --- /dev/null +++ b/demo/assets/models/soup_can/soup_can_Normal.png.import @@ -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 diff --git a/demo/assets/scripts/environment/destructable/destructable_wall.gd b/demo/assets/scripts/environment/destructable/destructable_wall.gd index 787f9b1..29c4ce3 100644 --- a/demo/assets/scripts/environment/destructable/destructable_wall.gd +++ b/demo/assets/scripts/environment/destructable/destructable_wall.gd @@ -11,7 +11,9 @@ enum ExtrudeDirection { @export var verts2d: PackedVector2Array @export var meshInstance3d: MeshInstance3D @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 @@ -28,7 +30,6 @@ var static_body: StaticBody3D func _ready() -> void: if Engine.is_editor_hint(): return - parentNode = get_node("..") inner_polygons = Holes.new() inner_rtree = RectangleTree.new() @@ -43,6 +44,9 @@ func _exit_tree() -> void: func _func_godot_apply_properties(entity_properties: Dictionary) -> void: meshInstance3d = _find_mesh_body() 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"] hole_proximity = entity_properties["hole_proximity"] @@ -63,8 +67,6 @@ func _func_godot_apply_properties(entity_properties: Dictionary) -> void: elif d < depth_min: depth_min = d depth = -(abs(depth_min) + abs(depth_max)) - - depth_position_offset = Vector3.BACK * (depth/2) elif extrusion_direction == ExtrudeDirection.RIGHT: for vert in verticies: verts_2d.append(Vector2(vert.z, vert.y)) @@ -76,8 +78,6 @@ func _func_godot_apply_properties(entity_properties: Dictionary) -> void: elif d < depth_min: depth_min = d depth = -(abs(depth_min) + abs(depth_max)) - - depth_position_offset = Vector3.RIGHT * (depth/2) elif extrusion_direction == ExtrudeDirection.UP: for vert in verticies: verts_2d.append(Vector2(vert.x, vert.z)) @@ -89,8 +89,6 @@ func _func_godot_apply_properties(entity_properties: Dictionary) -> void: elif d < depth_min: depth_min = d depth = -(abs(depth_min) + abs(depth_max)) - - depth_position_offset = Vector3.UP * (depth/2) var outer_boudary = Geometry2D.convex_hull(verts_2d) verts2d = outer_boudary @@ -102,12 +100,11 @@ func _draw(): vectors.append_array(outer_polygon) vectors.append_array(inner_polygons.get_hole_verticies()) - 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)) meshGenerator.free() meshInstance3d.mesh = commited_mesh - meshInstance3d.position += depth_position_offset meshInstance3d.create_trimesh_collision() static_body = _find_static_body() @@ -131,7 +128,7 @@ func _deffered_draw(mesh: Mesh, task_id: int): static_body = _find_static_body() func _generate_mesh(vector_indexes: PackedInt32Array, vectors: PackedVector2Array): - 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)) meshGenerator.free() diff --git a/demo/assets/scripts/environment/destructable/faces.gd b/demo/assets/scripts/environment/destructable/faces.gd new file mode 100644 index 0000000..c906db0 --- /dev/null +++ b/demo/assets/scripts/environment/destructable/faces.gd @@ -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 diff --git a/demo/assets/scripts/environment/destructable/faces.gd.uid b/demo/assets/scripts/environment/destructable/faces.gd.uid new file mode 100644 index 0000000..eec622e --- /dev/null +++ b/demo/assets/scripts/environment/destructable/faces.gd.uid @@ -0,0 +1 @@ +uid://bw2u2opw8uy82 diff --git a/demo/assets/scripts/environment/destructable/geometry/geopolymesh.gd b/demo/assets/scripts/environment/destructable/geometry/geopolymesh.gd index ae94037..be8ccf5 100644 --- a/demo/assets/scripts/environment/destructable/geometry/geopolymesh.gd +++ b/demo/assets/scripts/environment/destructable/geometry/geopolymesh.gd @@ -9,6 +9,8 @@ var uvs = PackedVector2Array() var normals = PackedVector3Array() var array_mesh = ArrayMesh.new() +var original_face_data: Faces + var _v_indexes = [] var _v_points = [] @@ -17,24 +19,25 @@ var edges = {} var depth_vector: Vector3 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") surface_array.resize(Mesh.ARRAY_MAX) + original_face_data = Faces.new(original_vectors, original_uvs, original_normals) self._v_indexes = vector_indexes self.extrude_direction = extrude_direction 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 - elif extrude_direction == DestructableWall.ExtrudeDirection.RIGHT: 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)) + 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: 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 @@ -71,6 +74,38 @@ func _pre_process_edges(): else: 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(): var unvisted_edges = self.get_outline_edge() var loops = [] @@ -167,34 +202,16 @@ func _draw_sides(): var n1 = self._calc_triangle_normal(v2, v1, v0) 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]) -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): - 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)]) - 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)]) - 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 + var uv0 = self._new_interpolated_uv_point(v0, normal) + var uv1 = self._new_interpolated_uv_point(v1, normal) + var uv2 = self._new_interpolated_uv_point(v2, normal) - 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 func _draw_mesh(): @@ -204,10 +221,9 @@ func _draw_mesh(): var normal = self._calc_triangle_normal(vector3C, vector3B, vector3A) - self.verts.append_array([vector3A, vector3B, vector3C]) _append_uvs3(vector3A, vector3B, vector3C, normal) - + self.normals.append_array([normal, normal, normal]) # insert each front face into the mesh "clockwise" diff --git a/demo/assets/scripts/environment/destructable/resource/face.gd b/demo/assets/scripts/environment/destructable/resource/face.gd new file mode 100644 index 0000000..9e91bcf --- /dev/null +++ b/demo/assets/scripts/environment/destructable/resource/face.gd @@ -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 diff --git a/demo/assets/scripts/environment/destructable/resource/face.gd.uid b/demo/assets/scripts/environment/destructable/resource/face.gd.uid new file mode 100644 index 0000000..e5fc2fe --- /dev/null +++ b/demo/assets/scripts/environment/destructable/resource/face.gd.uid @@ -0,0 +1 @@ +uid://bto8ov1esykmk diff --git a/demo/assets/textures/t_floormetal1.png b/demo/assets/textures/t_floormetal1.png deleted file mode 100644 index 1a80df8..0000000 Binary files a/demo/assets/textures/t_floormetal1.png and /dev/null differ diff --git a/demo/assets/textures/texture.png b/demo/assets/textures/texture.png deleted file mode 100644 index c2dabff..0000000 Binary files a/demo/assets/textures/texture.png and /dev/null differ diff --git a/demo/bin/libgtriangulation.windows.template_debug.x86_64.dll b/demo/bin/libgtriangulation.windows.template_debug.x86_64.dll new file mode 100644 index 0000000..afc61bb Binary files /dev/null and b/demo/bin/libgtriangulation.windows.template_debug.x86_64.dll differ diff --git a/demo/bin/liblibgtriangulation.windows.template_debug.x86_64.a b/demo/bin/liblibgtriangulation.windows.template_debug.x86_64.a new file mode 100644 index 0000000..4375c86 Binary files /dev/null and b/demo/bin/liblibgtriangulation.windows.template_debug.x86_64.a differ diff --git a/demo/levels/prototype_level.tscn b/demo/levels/prototype_level.tscn index b792f1d..499db94 100644 --- a/demo/levels/prototype_level.tscn +++ b/demo/levels/prototype_level.tscn @@ -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://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://04ag2c3lcicg" path="res://assets/models/soup_can/soup_can.glb" id="4_qd0o6"] [sub_resource type="Animation" id="Animation_q6206"] resource_name = "Camera_Pan" @@ -96,3 +97,6 @@ libraries = { } autoplay = "Camera_Pan" 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) diff --git a/demo/levels/test.tscn b/demo/levels/test.tscn index fa985a2..6c98052 100644 --- a/demo/levels/test.tscn +++ b/demo/levels/test.tscn @@ -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="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 = [{ "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/"), @@ -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////+/") }] -[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) -[sub_resource type="ArrayMesh" id="ArrayMesh_qhvcx"] +[sub_resource type="ArrayMesh" id="ArrayMesh_kqvnf"] _surfaces = [{ "aabb": AABB(-7, -0.50006104, -5.75, 14, 1.0001221, 11.5), "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////+/") }] -[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) -[sub_resource type="ArrayMesh" id="ArrayMesh_eudka"] -_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"] +[sub_resource type="ArrayMesh" id="ArrayMesh_rmkky"] _surfaces = [{ "aabb": AABB(-1.546875, -0.25, -2, 3.09375, 0.5, 4), "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/") }] -[sub_resource type="ArrayMesh" id="ArrayMesh_rmkky"] +[sub_resource type="ArrayMesh" id="ArrayMesh_lqn8c"] _surfaces = [{ "aabb": AABB(-1.046875, -1.5, -0.5, 2.09375, 3, 1), "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/") }] -[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 = [{ "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, "index_count": 36, "index_data": PackedByteArray("AAABAAIAAAACAAMABAAFAAYABAAGAAcACAAJAAoACAAKAAsADAANAA4ADAAOAA8AEAARABIAEAASABMAFAAVABYAFAAWABcA"), @@ -116,38 +93,15 @@ _surfaces = [{ "primitive": 3, "uv_scale": Vector4(0, 0, 0, 0), "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"] -_surfaces = [{ -"aabb": AABB(-1.0000001, -0.50000006, -0.7500305, 2, 1, 1.500061), -"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="ArrayOccluder3D" id="ArrayOccluder3D_u1nm5"] +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) +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="ArrayMesh" id="ArrayMesh_08uri"] -_surfaces = [{ -"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/") -}] +[sub_resource type="ConcavePolygonShape3D" id="ConcavePolygonShape3D_1w0m8"] +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) [node name="Test" type="Node3D"] @@ -159,49 +113,28 @@ metadata/_custom_type_script = "uid://cwu5cf7a0awcd" [node name="entity_0_worldspawn" type="StaticBody3D" parent="FuncGodotMap"] 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"] -mesh = SubResource("ArrayMesh_u45fp") +mesh = SubResource("ArrayMesh_2grjb") [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"] transform = Transform3D(1, 0, 0, 0, 1, 0, 0, 0, 1, 0, -6.1035156e-05, 14.25) 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"] -mesh = SubResource("ArrayMesh_qhvcx") +mesh = SubResource("ArrayMesh_kqvnf") [node name="entity_1_brush_0_collision_shape" type="CollisionShape3D" parent="FuncGodotMap/entity_1_func_movingplatform"] -shape = SubResource("ConvexPolygonShape3D_kqvnf") - -[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) -hole_proximity = 1.0 -edge_non_fracture = 0.01 - -[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") -depth = -0.5 -depth_position_offset = Vector3(-0.25, 0, 0) -extrusion_direction = 1 -hole_proximity = 1.0 -edge_non_fracture = 0.01 - -[node name="entity_3_mesh_instance" type="MeshInstance3D" parent="FuncGodotMap/entity_3_func_destructablewall"] -mesh = SubResource("ArrayMesh_qtvpr") +shape = SubResource("ConvexPolygonShape3D_eudka") [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) @@ -209,64 +142,56 @@ script = ExtResource("6_u45fp") verts2d = PackedVector2Array(-1.546875, -2, 1.546875, -2, 1.546875, 2, -1.546875, 2, -1.546875, -2) meshInstance3d = NodePath("entity_4_mesh_instance") 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"] -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) -hole_proximity = 1.0 -edge_non_fracture = 0.01 - -[node name="entity_5_mesh_instance" type="MeshInstance3D" parent="FuncGodotMap/entity_5_func_destructablewall"] mesh = SubResource("ArrayMesh_rmkky") -[node name="entity_6_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.546875) -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_6_mesh_instance") -depth = -0.5 -depth_position_offset = Vector3(-0.25, 0, 0) -extrusion_direction = 1 -hole_proximity = 1.0 -edge_non_fracture = 0.01 +[node name="entity_6_func_geo" type="StaticBody3D" parent="FuncGodotMap"] +transform = Transform3D(1, 0, 0, 0, 1, 0, 0, 0, 1, 1.953125, 2, 2.5) +collision_mask = 0 +metadata/func_godot_mesh_data = { +"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) +} -[node name="entity_6_mesh_instance" type="MeshInstance3D" parent="FuncGodotMap/entity_6_func_destructablewall"] -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") -depth = -1.0000000596046448 -depth_position_offset = Vector3(0, -0.5, 0) -extrusion_direction = 2 -hole_proximity = 1.0 -edge_non_fracture = 0.01 - -[node name="entity_7_mesh_instance" type="MeshInstance3D" parent="FuncGodotMap/entity_7_func_destructablewall"] +[node name="entity_6_mesh_instance" type="MeshInstance3D" parent="FuncGodotMap/entity_6_func_geo"] mesh = SubResource("ArrayMesh_lqn8c") -[node name="entity_8_func_destructablewall" type="Node3D" parent="FuncGodotMap" node_paths=PackedStringArray("meshInstance3d")] -transform = Transform3D(1, 0, 0, 0, 1, 0, 0, 0, 1, -0.546875, 2, 4.015625) -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) -hole_proximity = 1.0 -edge_non_fracture = 0.01 +[node name="entity_6_occluder_instance" type="OccluderInstance3D" parent="FuncGodotMap/entity_6_func_geo"] +occluder = SubResource("ArrayOccluder3D_08uri") -[node name="entity_8_mesh_instance" type="MeshInstance3D" parent="FuncGodotMap/entity_8_func_destructablewall"] -mesh = SubResource("ArrayMesh_08uri") +[node name="entity_6_collision_shape" type="CollisionShape3D" parent="FuncGodotMap/entity_6_func_geo"] +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 diff --git a/demo/scenes/system/main_scene.tscn b/demo/scenes/system/main_scene.tscn index 082fad9..1678d1d 100644 --- a/demo/scenes/system/main_scene.tscn +++ b/demo/scenes/system/main_scene.tscn @@ -14,5 +14,6 @@ script = ExtResource("1_qoi2i") [node name="CurrentLevel" type="Node3D" parent="."] [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")] diff --git a/demo/trenchbroom/fgd/solid/func_destructable_wall.tres b/demo/trenchbroom/fgd/solid/func_destructable_wall.tres index 9559e92..324d4ab 100644 --- a/demo/trenchbroom/fgd/solid/func_destructable_wall.tres +++ b/demo/trenchbroom/fgd/solid/func_destructable_wall.tres @@ -5,6 +5,9 @@ [resource] script = ExtResource("1_1gpns") +add_textures_metadata = true +add_vertex_metadata = true +add_face_normal_metadata = true script_class = ExtResource("2_7nwkm") classname = "func_destructablewall" description = "Set the brush entity as a destructable. diff --git a/demo/trenchbroom/maps/autosave/test.2.map b/demo/trenchbroom/maps/autosave/test.2.map index 0174837..ed72141 100644 --- a/demo/trenchbroom/maps/autosave/test.2.map +++ b/demo/trenchbroom/maps/autosave/test.2.map @@ -1,176 +1,130 @@ -// Game: demo -// Format: Valve -// entity 0 -{ -"mapversion" "220" -"wad" "" -"classname" "worldspawn" -"_tb_mod" "trenchbroom" -} -// entity 1 -{ -"classname" "func_group" -"_tb_type" "_tb_group" -"_tb_name" "floor" -"_tb_id" "1" -"_tb_linked_group_id" "{fbbc3a97-f5d3-443e-97e2-242861ee6c78}" -"_tb_transformation" "1 0 0 -144 0 1 0 -144 0 0 1 0 0 0 0 1" -// brush 0 -{ -( 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 -( 272 -512 -16 ) ( 274.125 -512 -16 ) ( 272 -510 -16 ) tile191 [ -0.47058823529411775 0 0 0 ] [ 0 -0.5 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 -( 544 -256 16 ) ( 546.125 -256 16 ) ( 544 -256 17 ) tile191 [ -0.47058823529411775 0 0 0 ] [ 0 0 -1 0 ] 0 1 1 -( 544 -256 16 ) ( 544 -256 17 ) ( 544 -254 16 ) tile191 [ 0 0.5 0 0 ] [ 0 0 -1 0 ] 0 1 1 -} -// brush 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 -( 0 -512 -16 ) ( 2.125 -512 -16 ) ( 0 -510 -16 ) tile191 [ -0.47058823529411775 0 0 0 ] [ 0 -0.5 0 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 -( 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 -} -// brush 2 -{ -( -272 -512 -16 ) ( -272 -510 -16 ) ( -272 -512 -15 ) tile191 [ 0 -0.5 0 0 ] [ 0 0 -1 0 ] 90 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 -( -272 -512 -16 ) ( -269.875 -512 -16 ) ( -272 -510 -16 ) tile191 [ -0.47058823529411775 0 0 0 ] [ 0 -0.5 0 0 ] 90 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 -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 -} -// brush 3 -{ -( -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 -( -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 -( -272 -256 16 ) ( -269.875 -256 16 ) ( -272 -256 17 ) tile191 [ -0.47058823529411775 0 0 0 ] [ 0 0 -1 0 ] 90 1 1 -( -272 -256 16 ) ( -272 -256 17 ) ( -272 -254 16 ) tile191 [ 0 0.5 0 0 ] [ 0 0 -1 0 ] 90 1 1 -} -// brush 4 -{ -( -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 -( -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 -( -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 -} -// brush 5 -{ -( -272 -256 -16 ) ( -272 -254 -16 ) ( -272 -256 -15 ) tile191 [ 0 -0.5 0 0 ] [ 0 0 -1 0 ] 270 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 -( -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 -( 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 -} -// brush 6 -{ -( 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 -( 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 -( 272 0 16 ) ( 272 0 17 ) ( 272 2 16 ) tile191 [ 0 0.5 0 0 ] [ 0 0 -1 0 ] 180 1 1 -} -// brush 7 -{ -( 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 -( 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 -( 544 0 16 ) ( 544 0 17 ) ( 544 2 16 ) tile191 [ 0 0.5 0 0 ] [ 0 0 -1 0 ] 180 1 1 -} -// brush 8 -{ -( 0 0 -16 ) ( 0 2 -16 ) ( 0 0 -15 ) tile191 [ 0 -0.5 0 0 ] [ 0 0 -1 0 ] 270 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 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 -( 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 -} -// brush 9 -{ -( -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 -( 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 -( 0 256 16 ) ( 0 256 17 ) ( 0 258 16 ) tile191 [ 0 0.5 0 0 ] [ 0 0 -1 0 ] 270 1 1 -} -// brush 10 -{ -( -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 -( -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 -( -272 256 16 ) ( -272 256 17 ) ( -272 258 16 ) tile191 [ 0 0.5 0 0 ] [ 0 0 -1 0 ] 270 1 1 -} -// brush 11 -{ -( 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 -( 272 0 -16 ) ( 274.125 0 -16 ) ( 272 2 -16 ) tile191 [ -0.47058823529411775 0 0 0 ] [ 0 -0.5 0 0 ] 270 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 -( 544 256 16 ) ( 546.125 256 16 ) ( 544 256 17 ) tile191 [ -0.47058823529411775 0 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 -} -// brush 12 -{ -( 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 -( 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 -} -} +// 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 -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 +( -144 -96 16 ) ( -144 -97 16 ) ( -143 -96 16 ) tile000 [ -1 0 0 0 ] [ -0 -1 -0 0 ] 0 1 1 +( -64 -176 112 ) ( -63 -176 112 ) ( -64 -177 112 ) tile000 [ 1 -0 0 0 ] [ -0 -1 0 0 ] 0 1 1 +( -144 -128 16 ) ( -143 -128 16 ) ( -144 -128 17 ) tile000 [ -1 0 0 0 ] [ 0 0 -1 0 ] 0 1 1 +( -13 -176 32 ) ( -13 -177 32 ) ( -13 -176 33 ) tile000 [ -0 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 +{ +( -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 +} +} diff --git a/demo/trenchbroom/maps/autosave/test.3.map b/demo/trenchbroom/maps/autosave/test.3.map index cf19938..6d2806d 100644 --- a/demo/trenchbroom/maps/autosave/test.3.map +++ b/demo/trenchbroom/maps/autosave/test.3.map @@ -1,153 +1,130 @@ -// Game: demo -// Format: Valve -// entity 0 -{ -"mapversion" "220" -"wad" "" -"classname" "worldspawn" -"_tb_mod" "trenchbroom" -// brush 0 -{ -( 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 -( 272 -512 -16 ) ( 274.125 -512 -16 ) ( 272 -510 -16 ) tile191 [ -0.47058823529411775 0 0 0 ] [ 0 -0.5 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 -( 544 -256 16 ) ( 546.125 -256 16 ) ( 544 -256 17 ) tile191 [ -0.47058823529411775 0 0 0 ] [ 0 0 -1 0 ] 0 1 1 -( 544 -256 16 ) ( 544 -256 17 ) ( 544 -254 16 ) tile191 [ 0 0.5 0 0 ] [ 0 0 -1 0 ] 0 1 1 -} -// brush 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 -( 0 -512 -16 ) ( 2.125 -512 -16 ) ( 0 -510 -16 ) tile191 [ -0.47058823529411775 0 0 0 ] [ 0 -0.5 0 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 -( 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 -} -// brush 2 -{ -( -272 -512 -16 ) ( -272 -510 -16 ) ( -272 -512 -15 ) tile191 [ 0 -0.5 0 0 ] [ 0 0 -1 0 ] 90 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 -( -272 -512 -16 ) ( -269.875 -512 -16 ) ( -272 -510 -16 ) tile191 [ -0.47058823529411775 0 0 0 ] [ 0 -0.5 0 0 ] 90 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 -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 -} -// brush 3 -{ -( -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 -( -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 -( -272 -256 16 ) ( -269.875 -256 16 ) ( -272 -256 17 ) tile191 [ -0.47058823529411775 0 0 0 ] [ 0 0 -1 0 ] 90 1 1 -( -272 -256 16 ) ( -272 -256 17 ) ( -272 -254 16 ) tile191 [ 0 0.5 0 0 ] [ 0 0 -1 0 ] 90 1 1 -} -// brush 4 -{ -( -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 -( -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 -( -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 -} -// brush 5 -{ -( -272 -256 -16 ) ( -272 -254 -16 ) ( -272 -256 -15 ) tile191 [ 0 -0.5 0 0 ] [ 0 0 -1 0 ] 270 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 -( -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 -( 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 -} -// brush 6 -{ -( 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 -( 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 -( 272 0 16 ) ( 272 0 17 ) ( 272 2 16 ) tile191 [ 0 0.5 0 0 ] [ 0 0 -1 0 ] 180 1 1 -} -// brush 7 -{ -( 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 -( 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 -( 544 0 16 ) ( 544 0 17 ) ( 544 2 16 ) tile191 [ 0 0.5 0 0 ] [ 0 0 -1 0 ] 180 1 1 -} -// brush 8 -{ -( 0 0 -16 ) ( 0 2 -16 ) ( 0 0 -15 ) tile191 [ 0 -0.5 0 0 ] [ 0 0 -1 0 ] 270 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 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 -( 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 -} -// brush 9 -{ -( -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 -( 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 -( 0 256 16 ) ( 0 256 17 ) ( 0 258 16 ) tile191 [ 0 0.5 0 0 ] [ 0 0 -1 0 ] 270 1 1 -} -// brush 10 -{ -( -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 -( -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 -( -272 256 16 ) ( -272 256 17 ) ( -272 258 16 ) tile191 [ 0 0.5 0 0 ] [ 0 0 -1 0 ] 270 1 1 -} -// brush 11 -{ -( 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 -( 272 0 -16 ) ( 274.125 0 -16 ) ( 272 2 -16 ) tile191 [ -0.47058823529411775 0 0 0 ] [ 0 -0.5 0 0 ] 270 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 -( 544 256 16 ) ( 546.125 256 16 ) ( 544 256 17 ) tile191 [ -0.47058823529411775 0 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 -} -// brush 12 -{ -( 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 -( 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 -} -} +// 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 -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 +( -144 -96 16 ) ( -144 -97 16 ) ( -143 -96 16 ) "Stone Base/albedo" [ -1 0 0 0 ] [ -0 -1 -0 0 ] 0 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 +( -144 -128 16 ) ( -143 -128 16 ) ( -144 -128 17 ) "Stone Base/albedo" [ -1 0 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 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 +{ +( -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 +} +} diff --git a/demo/trenchbroom/maps/autosave/test.4.map b/demo/trenchbroom/maps/autosave/test.4.map index c2bafbb..b794700 100644 --- a/demo/trenchbroom/maps/autosave/test.4.map +++ b/demo/trenchbroom/maps/autosave/test.4.map @@ -1,31 +1,130 @@ -// 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" -// 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 -} -} +// 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 -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 +} +} diff --git a/demo/trenchbroom/maps/autosave/test.5.map b/demo/trenchbroom/maps/autosave/test.5.map index f2899af..1ba851e 100644 --- a/demo/trenchbroom/maps/autosave/test.5.map +++ b/demo/trenchbroom/maps/autosave/test.5.map @@ -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 ( 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 { @@ -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 } } +// 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 +} +} diff --git a/demo/trenchbroom/maps/autosave/test.6.map b/demo/trenchbroom/maps/autosave/test.6.map deleted file mode 100644 index d294d35..0000000 --- a/demo/trenchbroom/maps/autosave/test.6.map +++ /dev/null @@ -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 -} -} diff --git a/demo/trenchbroom/maps/autosave/test.7.map b/demo/trenchbroom/maps/autosave/test.7.map deleted file mode 100644 index b887228..0000000 --- a/demo/trenchbroom/maps/autosave/test.7.map +++ /dev/null @@ -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 -} -} diff --git a/demo/trenchbroom/maps/autosave/test.8.map b/demo/trenchbroom/maps/autosave/test.8.map deleted file mode 100644 index 2f69698..0000000 --- a/demo/trenchbroom/maps/autosave/test.8.map +++ /dev/null @@ -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 -} -} diff --git a/demo/trenchbroom/maps/test.map b/demo/trenchbroom/maps/test.map index c6faed5..d3f53c6 100644 --- a/demo/trenchbroom/maps/test.map +++ b/demo/trenchbroom/maps/test.map @@ -51,12 +51,12 @@ "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 +( -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 @@ -78,48 +78,6 @@ "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 @@ -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 } } +// 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 +} +} diff --git a/demo/trenchbroom/textures/Concrete Trimsheet/albedo.png b/demo/trenchbroom/textures/Concrete Trimsheet/albedo.png new file mode 100644 index 0000000..6b4dd09 Binary files /dev/null and b/demo/trenchbroom/textures/Concrete Trimsheet/albedo.png differ diff --git a/demo/trenchbroom/textures/Concrete Trimsheet/albedo.png.import b/demo/trenchbroom/textures/Concrete Trimsheet/albedo.png.import new file mode 100644 index 0000000..7a6dcdb --- /dev/null +++ b/demo/trenchbroom/textures/Concrete Trimsheet/albedo.png.import @@ -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 diff --git a/demo/trenchbroom/textures/Concrete Trimsheet/ao.png b/demo/trenchbroom/textures/Concrete Trimsheet/ao.png new file mode 100644 index 0000000..cbeb4cc Binary files /dev/null and b/demo/trenchbroom/textures/Concrete Trimsheet/ao.png differ diff --git a/demo/trenchbroom/textures/Concrete Trimsheet/ao.png.import b/demo/trenchbroom/textures/Concrete Trimsheet/ao.png.import new file mode 100644 index 0000000..ec7e24b --- /dev/null +++ b/demo/trenchbroom/textures/Concrete Trimsheet/ao.png.import @@ -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 diff --git a/demo/trenchbroom/textures/Concrete Trimsheet/displacement.png b/demo/trenchbroom/textures/Concrete Trimsheet/displacement.png new file mode 100644 index 0000000..15cda02 Binary files /dev/null and b/demo/trenchbroom/textures/Concrete Trimsheet/displacement.png differ diff --git a/demo/trenchbroom/textures/Concrete Trimsheet/displacement.png.import b/demo/trenchbroom/textures/Concrete Trimsheet/displacement.png.import new file mode 100644 index 0000000..ee2eff3 --- /dev/null +++ b/demo/trenchbroom/textures/Concrete Trimsheet/displacement.png.import @@ -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 diff --git a/demo/trenchbroom/textures/Concrete Trimsheet/metalness.png b/demo/trenchbroom/textures/Concrete Trimsheet/metalness.png new file mode 100644 index 0000000..0d7469e Binary files /dev/null and b/demo/trenchbroom/textures/Concrete Trimsheet/metalness.png differ diff --git a/demo/trenchbroom/textures/Concrete Trimsheet/metalness.png.import b/demo/trenchbroom/textures/Concrete Trimsheet/metalness.png.import new file mode 100644 index 0000000..adc5f54 --- /dev/null +++ b/demo/trenchbroom/textures/Concrete Trimsheet/metalness.png.import @@ -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 diff --git a/demo/trenchbroom/textures/Concrete Trimsheet/normal.png b/demo/trenchbroom/textures/Concrete Trimsheet/normal.png new file mode 100644 index 0000000..758f5bc Binary files /dev/null and b/demo/trenchbroom/textures/Concrete Trimsheet/normal.png differ diff --git a/demo/trenchbroom/textures/Concrete Trimsheet/normal.png.import b/demo/trenchbroom/textures/Concrete Trimsheet/normal.png.import new file mode 100644 index 0000000..5997eaf --- /dev/null +++ b/demo/trenchbroom/textures/Concrete Trimsheet/normal.png.import @@ -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 diff --git a/demo/trenchbroom/textures/Concrete Trimsheet/roughness.png b/demo/trenchbroom/textures/Concrete Trimsheet/roughness.png new file mode 100644 index 0000000..0b00582 Binary files /dev/null and b/demo/trenchbroom/textures/Concrete Trimsheet/roughness.png differ diff --git a/demo/trenchbroom/textures/Concrete Trimsheet/roughness.png.import b/demo/trenchbroom/textures/Concrete Trimsheet/roughness.png.import new file mode 100644 index 0000000..447d9ce --- /dev/null +++ b/demo/trenchbroom/textures/Concrete Trimsheet/roughness.png.import @@ -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 diff --git a/demo/trenchbroom/textures/Stone Base/albedo.png b/demo/trenchbroom/textures/Stone Base/albedo.png new file mode 100644 index 0000000..cf2d92d Binary files /dev/null and b/demo/trenchbroom/textures/Stone Base/albedo.png differ diff --git a/demo/assets/textures/texture.png.import b/demo/trenchbroom/textures/Stone Base/albedo.png.import similarity index 73% rename from demo/assets/textures/texture.png.import rename to demo/trenchbroom/textures/Stone Base/albedo.png.import index ac6d399..aa7a6f1 100644 --- a/demo/assets/textures/texture.png.import +++ b/demo/trenchbroom/textures/Stone Base/albedo.png.import @@ -2,8 +2,8 @@ importer="texture" type="CompressedTexture2D" -uid="uid://dwhdp7spars2b" -path.s3tc="res://.godot/imported/texture.png-59546a6b6ae00ae598d09228d4c66fd2.s3tc.ctex" +uid="uid://cqtxxrpfvymko" +path.s3tc="res://.godot/imported/albedo.png-94a1bad07a09df0b9c2c6971f6d1a756.s3tc.ctex" metadata={ "imported_formats": ["s3tc_bptc"], "vram_texture": true @@ -11,8 +11,8 @@ metadata={ [deps] -source_file="res://assets/textures/texture.png" -dest_files=["res://.godot/imported/texture.png-59546a6b6ae00ae598d09228d4c66fd2.s3tc.ctex"] +source_file="res://trenchbroom/textures/Stone Base/albedo.png" +dest_files=["res://.godot/imported/albedo.png-94a1bad07a09df0b9c2c6971f6d1a756.s3tc.ctex"] [params] diff --git a/demo/trenchbroom/textures/Stone Base/albedo.tres b/demo/trenchbroom/textures/Stone Base/albedo.tres new file mode 100644 index 0000000..446b859 --- /dev/null +++ b/demo/trenchbroom/textures/Stone Base/albedo.tres @@ -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 diff --git a/demo/trenchbroom/textures/Stone Base/ao.png b/demo/trenchbroom/textures/Stone Base/ao.png new file mode 100644 index 0000000..0b00ae5 Binary files /dev/null and b/demo/trenchbroom/textures/Stone Base/ao.png differ diff --git a/demo/trenchbroom/textures/Stone Base/ao.png.import b/demo/trenchbroom/textures/Stone Base/ao.png.import new file mode 100644 index 0000000..9b08f15 --- /dev/null +++ b/demo/trenchbroom/textures/Stone Base/ao.png.import @@ -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 diff --git a/demo/trenchbroom/textures/Stone Base/displacement.png b/demo/trenchbroom/textures/Stone Base/displacement.png new file mode 100644 index 0000000..3c931c3 Binary files /dev/null and b/demo/trenchbroom/textures/Stone Base/displacement.png differ diff --git a/demo/trenchbroom/textures/Stone Base/displacement.png.import b/demo/trenchbroom/textures/Stone Base/displacement.png.import new file mode 100644 index 0000000..facdb7c --- /dev/null +++ b/demo/trenchbroom/textures/Stone Base/displacement.png.import @@ -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 diff --git a/demo/trenchbroom/textures/Stone Base/metalness.png b/demo/trenchbroom/textures/Stone Base/metalness.png new file mode 100644 index 0000000..81da289 Binary files /dev/null and b/demo/trenchbroom/textures/Stone Base/metalness.png differ diff --git a/demo/assets/textures/t_floormetal1.png.import b/demo/trenchbroom/textures/Stone Base/metalness.png.import similarity index 72% rename from demo/assets/textures/t_floormetal1.png.import rename to demo/trenchbroom/textures/Stone Base/metalness.png.import index 1e0ee6f..d4af6f3 100644 --- a/demo/assets/textures/t_floormetal1.png.import +++ b/demo/trenchbroom/textures/Stone Base/metalness.png.import @@ -2,8 +2,8 @@ importer="texture" type="CompressedTexture2D" -uid="uid://doknmohl75xnp" -path.s3tc="res://.godot/imported/t_floormetal1.png-42986c698f9d8b89446ac25d30252b9c.s3tc.ctex" +uid="uid://d15eqalyirq77" +path.s3tc="res://.godot/imported/metalness.png-4d0f08f876483f872b739098571e4533.s3tc.ctex" metadata={ "imported_formats": ["s3tc_bptc"], "vram_texture": true @@ -11,8 +11,8 @@ metadata={ [deps] -source_file="res://assets/textures/t_floormetal1.png" -dest_files=["res://.godot/imported/t_floormetal1.png-42986c698f9d8b89446ac25d30252b9c.s3tc.ctex"] +source_file="res://trenchbroom/textures/Stone Base/metalness.png" +dest_files=["res://.godot/imported/metalness.png-4d0f08f876483f872b739098571e4533.s3tc.ctex"] [params] diff --git a/demo/trenchbroom/textures/Stone Base/normal.png b/demo/trenchbroom/textures/Stone Base/normal.png new file mode 100644 index 0000000..14ed471 Binary files /dev/null and b/demo/trenchbroom/textures/Stone Base/normal.png differ diff --git a/demo/trenchbroom/textures/Stone Base/normal.png.import b/demo/trenchbroom/textures/Stone Base/normal.png.import new file mode 100644 index 0000000..8db8554 --- /dev/null +++ b/demo/trenchbroom/textures/Stone Base/normal.png.import @@ -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 diff --git a/demo/trenchbroom/textures/Stone Base/roughness.png b/demo/trenchbroom/textures/Stone Base/roughness.png new file mode 100644 index 0000000..4e0911a Binary files /dev/null and b/demo/trenchbroom/textures/Stone Base/roughness.png differ diff --git a/demo/trenchbroom/textures/Stone Base/roughness.png.import b/demo/trenchbroom/textures/Stone Base/roughness.png.import new file mode 100644 index 0000000..a27b7fb --- /dev/null +++ b/demo/trenchbroom/textures/Stone Base/roughness.png.import @@ -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 diff --git a/src/rectangletree.o b/src/rectangletree.o new file mode 100644 index 0000000..3f0f1d7 Binary files /dev/null and b/src/rectangletree.o differ diff --git a/src/rectangletree.os b/src/rectangletree.os deleted file mode 100644 index baec82f..0000000 Binary files a/src/rectangletree.os and /dev/null differ diff --git a/src/register_types.o b/src/register_types.o new file mode 100644 index 0000000..e0b441a Binary files /dev/null and b/src/register_types.o differ diff --git a/src/register_types.os b/src/register_types.os deleted file mode 100644 index 3c7833c..0000000 Binary files a/src/register_types.os and /dev/null differ diff --git a/src/rtree.h b/src/rtree.h index e993850..7f1f82e 100644 --- a/src/rtree.h +++ b/src/rtree.h @@ -1,6 +1,16 @@ #ifndef 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 // on other compilers without modification. diff --git a/src/triangulization.o b/src/triangulization.o new file mode 100644 index 0000000..f76ca70 Binary files /dev/null and b/src/triangulization.o differ diff --git a/src/triangulization.os b/src/triangulization.os index 5cdb11f..2f17852 100644 Binary files a/src/triangulization.os and b/src/triangulization.os differ